summaryrefslogtreecommitdiff
path: root/src/http/static/viz
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/static/viz')
-rw-r--r--src/http/static/viz/1/cljs/core.cljs10762
-rw-r--r--src/http/static/viz/1/cljs/core.js35801
-rw-r--r--src/http/static/viz/1/cljs/core.js.map1
-rw-r--r--src/http/static/viz/1/cljs_deps.js17
-rw-r--r--src/http/static/viz/1/clojure/set.cljs161
-rw-r--r--src/http/static/viz/1/clojure/set.cljs.cache.edn1
-rw-r--r--src/http/static/viz/1/clojure/set.js400
-rw-r--r--src/http/static/viz/1/clojure/set.js.map1
-rw-r--r--src/http/static/viz/1/clojure/string.cljs258
-rw-r--r--src/http/static/viz/1/clojure/string.cljs.cache.edn1
-rw-r--r--src/http/static/viz/1/clojure/string.js505
-rw-r--r--src/http/static/viz/1/clojure/string.js.map1
-rw-r--r--src/http/static/viz/1/goog/array/array.js1665
-rw-r--r--src/http/static/viz/1/goog/asserts/asserts.js369
-rw-r--r--src/http/static/viz/1/goog/base.js2727
-rw-r--r--src/http/static/viz/1/goog/debug/entrypointregistry.js159
-rw-r--r--src/http/static/viz/1/goog/debug/error.js63
-rw-r--r--src/http/static/viz/1/goog/deps.js1508
-rw-r--r--src/http/static/viz/1/goog/disposable/disposable.js308
-rw-r--r--src/http/static/viz/1/goog/disposable/idisposable.js45
-rw-r--r--src/http/static/viz/1/goog/dom/browserfeature.js73
-rw-r--r--src/http/static/viz/1/goog/dom/dom.js2992
-rw-r--r--src/http/static/viz/1/goog/dom/nodetype.js48
-rw-r--r--src/http/static/viz/1/goog/dom/safe.js372
-rw-r--r--src/http/static/viz/1/goog/dom/tagname.js160
-rw-r--r--src/http/static/viz/1/goog/dom/tags.js41
-rw-r--r--src/http/static/viz/1/goog/events/browserevent.js402
-rw-r--r--src/http/static/viz/1/goog/events/browserfeature.js84
-rw-r--r--src/http/static/viz/1/goog/events/event.js145
-rw-r--r--src/http/static/viz/1/goog/events/eventid.js46
-rw-r--r--src/http/static/viz/1/goog/events/events.js989
-rw-r--r--src/http/static/viz/1/goog/events/eventtype.js239
-rw-r--r--src/http/static/viz/1/goog/events/listenable.js338
-rw-r--r--src/http/static/viz/1/goog/events/listener.js131
-rw-r--r--src/http/static/viz/1/goog/events/listenermap.js306
-rw-r--r--src/http/static/viz/1/goog/fs/url.js110
-rw-r--r--src/http/static/viz/1/goog/html/safehtml.js948
-rw-r--r--src/http/static/viz/1/goog/html/safescript.js234
-rw-r--r--src/http/static/viz/1/goog/html/safestyle.js449
-rw-r--r--src/http/static/viz/1/goog/html/safestylesheet.js278
-rw-r--r--src/http/static/viz/1/goog/html/safeurl.js412
-rw-r--r--src/http/static/viz/1/goog/html/trustedresourceurl.js244
-rw-r--r--src/http/static/viz/1/goog/html/uncheckedconversions.js232
-rw-r--r--src/http/static/viz/1/goog/i18n/bidi.js876
-rw-r--r--src/http/static/viz/1/goog/labs/useragent/browser.js338
-rw-r--r--src/http/static/viz/1/goog/labs/useragent/engine.js156
-rw-r--r--src/http/static/viz/1/goog/labs/useragent/platform.js160
-rw-r--r--src/http/static/viz/1/goog/labs/useragent/util.js147
-rw-r--r--src/http/static/viz/1/goog/math/coordinate.js268
-rw-r--r--src/http/static/viz/1/goog/math/integer.js807
-rw-r--r--src/http/static/viz/1/goog/math/long.js843
-rw-r--r--src/http/static/viz/1/goog/math/math.js447
-rw-r--r--src/http/static/viz/1/goog/math/size.js227
-rw-r--r--src/http/static/viz/1/goog/object/object.js705
-rw-r--r--src/http/static/viz/1/goog/reflect/reflect.js138
-rw-r--r--src/http/static/viz/1/goog/string/const.js182
-rw-r--r--src/http/static/viz/1/goog/string/string.js1631
-rw-r--r--src/http/static/viz/1/goog/string/stringbuffer.js103
-rw-r--r--src/http/static/viz/1/goog/string/stringformat.js221
-rw-r--r--src/http/static/viz/1/goog/string/typedstring.js48
-rw-r--r--src/http/static/viz/1/goog/useragent/useragent.js568
-rw-r--r--src/http/static/viz/1/processing.js21796
-rw-r--r--src/http/static/viz/1/quil/core.cljc4993
-rw-r--r--src/http/static/viz/1/quil/core.cljc.cache.edn1
-rw-r--r--src/http/static/viz/1/quil/core.js6643
-rw-r--r--src/http/static/viz/1/quil/core.js.map1
-rw-r--r--src/http/static/viz/1/quil/middleware.cljc144
-rw-r--r--src/http/static/viz/1/quil/middleware.cljc.cache.edn1
-rw-r--r--src/http/static/viz/1/quil/middleware.js118
-rw-r--r--src/http/static/viz/1/quil/middleware.js.map1
-rw-r--r--src/http/static/viz/1/quil/middlewares/deprecated_options.cljc26
-rw-r--r--src/http/static/viz/1/quil/middlewares/deprecated_options.cljc.cache.edn1
-rw-r--r--src/http/static/viz/1/quil/middlewares/deprecated_options.js95
-rw-r--r--src/http/static/viz/1/quil/middlewares/deprecated_options.js.map1
-rw-r--r--src/http/static/viz/1/quil/middlewares/fun_mode.cljc78
-rw-r--r--src/http/static/viz/1/quil/middlewares/fun_mode.cljc.cache.edn1
-rw-r--r--src/http/static/viz/1/quil/middlewares/fun_mode.js155
-rw-r--r--src/http/static/viz/1/quil/middlewares/fun_mode.js.map1
-rw-r--r--src/http/static/viz/1/quil/middlewares/navigation_2d.cljc89
-rw-r--r--src/http/static/viz/1/quil/middlewares/navigation_2d.cljc.cache.edn1
-rw-r--r--src/http/static/viz/1/quil/middlewares/navigation_2d.js116
-rw-r--r--src/http/static/viz/1/quil/middlewares/navigation_2d.js.map1
-rw-r--r--src/http/static/viz/1/quil/middlewares/navigation_3d.cljc188
-rw-r--r--src/http/static/viz/1/quil/middlewares/navigation_3d.cljc.cache.edn1
-rw-r--r--src/http/static/viz/1/quil/middlewares/navigation_3d.js261
-rw-r--r--src/http/static/viz/1/quil/middlewares/navigation_3d.js.map1
-rw-r--r--src/http/static/viz/1/quil/sketch.cljs128
-rw-r--r--src/http/static/viz/1/quil/sketch.cljs.cache.edn1
-rw-r--r--src/http/static/viz/1/quil/sketch.js348
-rw-r--r--src/http/static/viz/1/quil/sketch.js.map1
-rw-r--r--src/http/static/viz/1/quil/util.cljc109
-rw-r--r--src/http/static/viz/1/quil/util.cljc.cache.edn1
-rw-r--r--src/http/static/viz/1/quil/util.js183
-rw-r--r--src/http/static/viz/1/quil/util.js.map1
-rw-r--r--src/http/static/viz/1/viz/core.cljs204
-rw-r--r--src/http/static/viz/1/viz/core.cljs.cache.edn1
-rw-r--r--src/http/static/viz/1/viz/core.js564
-rw-r--r--src/http/static/viz/1/viz/core.js.map1
-rw-r--r--src/http/static/viz/1/viz/forest.cljs96
-rw-r--r--src/http/static/viz/1/viz/forest.cljs.cache.edn1
-rw-r--r--src/http/static/viz/1/viz/forest.js111
-rw-r--r--src/http/static/viz/1/viz/forest.js.map1
-rw-r--r--src/http/static/viz/1/viz/ghost.cljs72
-rw-r--r--src/http/static/viz/1/viz/ghost.cljs.cache.edn1
-rw-r--r--src/http/static/viz/1/viz/ghost.js89
-rw-r--r--src/http/static/viz/1/viz/ghost.js.map1
-rw-r--r--src/http/static/viz/1/viz/grid.cljs63
-rw-r--r--src/http/static/viz/1/viz/grid.cljs.cache.edn1
-rw-r--r--src/http/static/viz/1/viz/grid.js27
-rw-r--r--src/http/static/viz/1/viz/grid.js.map1
-rw-r--r--src/http/static/viz/2/cljs/core.cljs11565
-rw-r--r--src/http/static/viz/2/cljs/core.js37633
-rw-r--r--src/http/static/viz/2/cljs/core.js.map1
-rw-r--r--src/http/static/viz/2/cljs/user/debug9D984AE.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/cljs/user/debug9D984AE.js3
-rw-r--r--src/http/static/viz/2/cljs/user/debug9D984AE.js.map1
-rw-r--r--src/http/static/viz/2/cljs_deps.js19
-rw-r--r--src/http/static/viz/2/cljsc_opts.edn1
-rw-r--r--src/http/static/viz/2/clojure/set.cljs161
-rw-r--r--src/http/static/viz/2/clojure/set.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/clojure/set.js391
-rw-r--r--src/http/static/viz/2/clojure/set.js.map1
-rw-r--r--src/http/static/viz/2/clojure/string.cljs289
-rw-r--r--src/http/static/viz/2/clojure/string.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/clojure/string.js477
-rw-r--r--src/http/static/viz/2/clojure/string.js.map1
-rw-r--r--src/http/static/viz/2/goog/array/array.js1665
-rw-r--r--src/http/static/viz/2/goog/asserts/asserts.js369
-rw-r--r--src/http/static/viz/2/goog/base.js2921
-rw-r--r--src/http/static/viz/2/goog/debug/entrypointregistry.js159
-rw-r--r--src/http/static/viz/2/goog/debug/error.js63
-rw-r--r--src/http/static/viz/2/goog/deps.js1564
-rw-r--r--src/http/static/viz/2/goog/disposable/disposable.js305
-rw-r--r--src/http/static/viz/2/goog/disposable/idisposable.js45
-rw-r--r--src/http/static/viz/2/goog/dom/asserts.js311
-rw-r--r--src/http/static/viz/2/goog/dom/browserfeature.js73
-rw-r--r--src/http/static/viz/2/goog/dom/dom.js3233
-rw-r--r--src/http/static/viz/2/goog/dom/htmlelement.js29
-rw-r--r--src/http/static/viz/2/goog/dom/nodetype.js48
-rw-r--r--src/http/static/viz/2/goog/dom/safe.js458
-rw-r--r--src/http/static/viz/2/goog/dom/tagname.js562
-rw-r--r--src/http/static/viz/2/goog/dom/tags.js41
-rw-r--r--src/http/static/viz/2/goog/events/browserevent.js409
-rw-r--r--src/http/static/viz/2/goog/events/browserfeature.js122
-rw-r--r--src/http/static/viz/2/goog/events/event.js143
-rw-r--r--src/http/static/viz/2/goog/events/eventid.js46
-rw-r--r--src/http/static/viz/2/goog/events/events.js1003
-rw-r--r--src/http/static/viz/2/goog/events/eventtype.js295
-rw-r--r--src/http/static/viz/2/goog/events/listenable.js338
-rw-r--r--src/http/static/viz/2/goog/events/listener.js128
-rw-r--r--src/http/static/viz/2/goog/events/listenermap.js307
-rw-r--r--src/http/static/viz/2/goog/fs/url.js106
-rw-r--r--src/http/static/viz/2/goog/functions/functions.js483
-rw-r--r--src/http/static/viz/2/goog/html/safehtml.js994
-rw-r--r--src/http/static/viz/2/goog/html/safescript.js234
-rw-r--r--src/http/static/viz/2/goog/html/safestyle.js560
-rw-r--r--src/http/static/viz/2/goog/html/safestylesheet.js344
-rw-r--r--src/http/static/viz/2/goog/html/safeurl.js454
-rw-r--r--src/http/static/viz/2/goog/html/trustedresourceurl.js408
-rw-r--r--src/http/static/viz/2/goog/html/uncheckedconversions.js228
-rw-r--r--src/http/static/viz/2/goog/i18n/bidi.js876
-rw-r--r--src/http/static/viz/2/goog/iter/iter.js1284
-rw-r--r--src/http/static/viz/2/goog/labs/useragent/browser.js338
-rw-r--r--src/http/static/viz/2/goog/labs/useragent/engine.js156
-rw-r--r--src/http/static/viz/2/goog/labs/useragent/platform.js160
-rw-r--r--src/http/static/viz/2/goog/labs/useragent/util.js147
-rw-r--r--src/http/static/viz/2/goog/math/coordinate.js279
-rw-r--r--src/http/static/viz/2/goog/math/integer.js808
-rw-r--r--src/http/static/viz/2/goog/math/long.js965
-rw-r--r--src/http/static/viz/2/goog/math/math.js448
-rw-r--r--src/http/static/viz/2/goog/math/size.js227
-rw-r--r--src/http/static/viz/2/goog/object/object.js751
-rw-r--r--src/http/static/viz/2/goog/reflect/reflect.js138
-rw-r--r--src/http/static/viz/2/goog/string/const.js186
-rw-r--r--src/http/static/viz/2/goog/string/string.js1641
-rw-r--r--src/http/static/viz/2/goog/string/stringbuffer.js103
-rw-r--r--src/http/static/viz/2/goog/string/stringformat.js221
-rw-r--r--src/http/static/viz/2/goog/string/typedstring.js48
-rw-r--r--src/http/static/viz/2/goog/structs/map.js458
-rw-r--r--src/http/static/viz/2/goog/structs/structs.js354
-rw-r--r--src/http/static/viz/2/goog/uri/uri.js1547
-rw-r--r--src/http/static/viz/2/goog/uri/utils.js1103
-rw-r--r--src/http/static/viz/2/goog/useragent/useragent.js580
-rw-r--r--src/http/static/viz/2/process/env.cljs12
-rw-r--r--src/http/static/viz/2/process/env.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/process/env.js8
-rw-r--r--src/http/static/viz/2/process/env.js.map1
-rw-r--r--src/http/static/viz/2/processing.js21796
-rw-r--r--src/http/static/viz/2/quil/core.cljc4993
-rw-r--r--src/http/static/viz/2/quil/core.cljc.cache.json1
-rw-r--r--src/http/static/viz/2/quil/core.js5543
-rw-r--r--src/http/static/viz/2/quil/core.js.map1
-rw-r--r--src/http/static/viz/2/quil/middleware.cljc144
-rw-r--r--src/http/static/viz/2/quil/middleware.cljc.cache.json1
-rw-r--r--src/http/static/viz/2/quil/middleware.js118
-rw-r--r--src/http/static/viz/2/quil/middleware.js.map1
-rw-r--r--src/http/static/viz/2/quil/middlewares/deprecated_options.cljc26
-rw-r--r--src/http/static/viz/2/quil/middlewares/deprecated_options.cljc.cache.json1
-rw-r--r--src/http/static/viz/2/quil/middlewares/deprecated_options.js95
-rw-r--r--src/http/static/viz/2/quil/middlewares/deprecated_options.js.map1
-rw-r--r--src/http/static/viz/2/quil/middlewares/fun_mode.cljc78
-rw-r--r--src/http/static/viz/2/quil/middlewares/fun_mode.cljc.cache.json1
-rw-r--r--src/http/static/viz/2/quil/middlewares/fun_mode.js142
-rw-r--r--src/http/static/viz/2/quil/middlewares/fun_mode.js.map1
-rw-r--r--src/http/static/viz/2/quil/middlewares/navigation_2d.cljc89
-rw-r--r--src/http/static/viz/2/quil/middlewares/navigation_2d.cljc.cache.json1
-rw-r--r--src/http/static/viz/2/quil/middlewares/navigation_2d.js116
-rw-r--r--src/http/static/viz/2/quil/middlewares/navigation_2d.js.map1
-rw-r--r--src/http/static/viz/2/quil/middlewares/navigation_3d.cljc188
-rw-r--r--src/http/static/viz/2/quil/middlewares/navigation_3d.cljc.cache.json1
-rw-r--r--src/http/static/viz/2/quil/middlewares/navigation_3d.js261
-rw-r--r--src/http/static/viz/2/quil/middlewares/navigation_3d.js.map1
-rw-r--r--src/http/static/viz/2/quil/sketch.cljs128
-rw-r--r--src/http/static/viz/2/quil/sketch.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/quil/sketch.js341
-rw-r--r--src/http/static/viz/2/quil/sketch.js.map1
-rw-r--r--src/http/static/viz/2/quil/util.cljc109
-rw-r--r--src/http/static/viz/2/quil/util.cljc.cache.json1
-rw-r--r--src/http/static/viz/2/quil/util.js168
-rw-r--r--src/http/static/viz/2/quil/util.js.map1
-rw-r--r--src/http/static/viz/2/viz/core.cljs264
-rw-r--r--src/http/static/viz/2/viz/core.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/viz/core.js753
-rw-r--r--src/http/static/viz/2/viz/core.js.map1
-rw-r--r--src/http/static/viz/2/viz/debug.cljs4
-rw-r--r--src/http/static/viz/2/viz/debug.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/viz/debug.js37
-rw-r--r--src/http/static/viz/2/viz/debug.js.map1
-rw-r--r--src/http/static/viz/2/viz/dial.cljs42
-rw-r--r--src/http/static/viz/2/viz/dial.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/viz/dial.js44
-rw-r--r--src/http/static/viz/2/viz/dial.js.map1
-rw-r--r--src/http/static/viz/2/viz/forest.cljs107
-rw-r--r--src/http/static/viz/2/viz/forest.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/viz/forest.js109
-rw-r--r--src/http/static/viz/2/viz/forest.js.map1
-rw-r--r--src/http/static/viz/2/viz/ghost.cljs49
-rw-r--r--src/http/static/viz/2/viz/ghost.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/viz/ghost.js65
-rw-r--r--src/http/static/viz/2/viz/ghost.js.map1
-rw-r--r--src/http/static/viz/2/viz/grid.cljs63
-rw-r--r--src/http/static/viz/2/viz/grid.cljs.cache.json1
-rw-r--r--src/http/static/viz/2/viz/grid.js27
-rw-r--r--src/http/static/viz/2/viz/grid.js.map1
244 files changed, 226372 insertions, 0 deletions
diff --git a/src/http/static/viz/1/cljs/core.cljs b/src/http/static/viz/1/cljs/core.cljs
new file mode 100644
index 0000000..a87e53b
--- /dev/null
+++ b/src/http/static/viz/1/cljs/core.cljs
@@ -0,0 +1,10762 @@
+; Copyright (c) Rich Hickey. All rights reserved.
+; The use and distribution terms for this software are covered by the
+; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
+; which can be found in the file epl-v10.html at the root of this distribution.
+; By using this software in any fashion, you are agreeing to be bound by
+; the terms of this license.
+; You must not remove this notice, or any other, from this software.
+
+(ns cljs.core
+ (:require goog.math.Long
+ goog.math.Integer
+ [goog.string :as gstring]
+ [goog.object :as gobject]
+ [goog.array :as garray])
+ (:import [goog.string StringBuffer]))
+
+;; next line is auto-generated by the build-script - Do not edit!
+(def *clojurescript-version* "1.9.473")
+
+(def *unchecked-if* false)
+(def *warn-on-infer* false)
+
+(defonce PROTOCOL_SENTINEL #js {})
+
+(goog-define
+ ^{:dynamic true
+ :doc "Var bound to the name value of the compiler build :target option.
+ For example, if the compiler build :target is :nodejs, *target* will be bound
+ to \"nodejs\". *target* is a Google Closure define and can be set by compiler
+ :closure-defines option."}
+ *target* "default")
+
+(def
+ ^{:dynamic true
+ :doc "Var bound to the current namespace. Only used for bootstrapping."
+ :jsdoc ["@type {*}"]}
+ *ns* nil)
+
+(def
+ ^{:dynamic true
+ :jsdoc ["@type {*}"]}
+ *out* nil)
+
+(def
+ ^{:dynamic true}
+ *assert* true)
+
+(defonce
+ ^{:doc "Each runtime environment provides a different way to print output.
+ Whatever function *print-fn* is bound to will be passed any
+ Strings which should be printed." :dynamic true}
+ *print-fn*
+ (fn [_]
+ (throw (js/Error. "No *print-fn* fn set for evaluation environment"))))
+
+(defonce
+ ^{:doc "Each runtime environment provides a different way to print error output.
+ Whatever function *print-err-fn* is bound to will be passed any
+ Strings which should be printed." :dynamic true}
+ *print-err-fn*
+ (fn [_]
+ (throw (js/Error. "No *print-err-fn* fn set for evaluation environment"))))
+
+(defn set-print-fn!
+ "Set *print-fn* to f."
+ [f] (set! *print-fn* f))
+
+(defn set-print-err-fn!
+ "Set *print-err-fn* to f."
+ [f] (set! *print-err-fn* f))
+
+(def
+ ^{:dynamic true
+ :doc "When set to true, output will be flushed whenever a newline is printed.
+
+ Defaults to true."}
+ *flush-on-newline* true)
+
+(def
+ ^{:dynamic true
+ :doc "When set to logical false will drop newlines from printing calls.
+ This is to work around the implicit newlines emitted by standard JavaScript
+ console objects."}
+ *print-newline* true)
+
+(def
+ ^{:dynamic true
+ :doc "When set to logical false, strings and characters will be printed with
+ non-alphanumeric characters converted to the appropriate escape sequences.
+
+ Defaults to true"}
+ *print-readably* true)
+
+(def
+ ^{:dynamic true
+ :doc "If set to logical true, when printing an object, its metadata will also
+ be printed in a form that can be read back by the reader.
+
+ Defaults to false."}
+ *print-meta* false)
+
+(def
+ ^{:dynamic true
+ :doc "When set to logical true, objects will be printed in a way that preserves
+ their type when read in later.
+
+ Defaults to false."}
+ *print-dup* false)
+
+(def
+ ^{:dynamic true
+ :doc "*print-namespace-maps* controls whether the printer will print
+ namespace map literal syntax.
+
+ Defaults to false, but the REPL binds it to true."}
+ *print-namespace-maps* false)
+
+(def
+ ^{:dynamic true
+ :doc "*print-length* controls how many items of each collection the
+ printer will print. If it is bound to logical false, there is no
+ limit. Otherwise, it must be bound to an integer indicating the maximum
+ number of items of each collection to print. If a collection contains
+ more items, the printer will print items up to the limit followed by
+ '...' to represent the remaining items. The root binding is nil
+ indicating no limit."
+ :jsdoc ["@type {null|number}"]}
+ *print-length* nil)
+
+(def
+ ^{:dynamic true
+ :doc "*print-level* controls how many levels deep the printer will
+ print nested objects. If it is bound to logical false, there is no
+ limit. Otherwise, it must be bound to an integer indicating the maximum
+ level to print. Each argument to print is at level 0; if an argument is a
+ collection, its items are at level 1; and so on. If an object is a
+ collection and is at a level greater than or equal to the value bound to
+ *print-level*, the printer prints '#' to represent it. The root binding
+ is nil indicating no limit."
+ :jsdoc ["@type {null|number}"]}
+ *print-level* nil)
+
+(defonce
+ ^{:dynamic true
+ :jsdoc ["@type {*}"]}
+ *loaded-libs* nil)
+
+(defn- pr-opts []
+ {:flush-on-newline *flush-on-newline*
+ :readably *print-readably*
+ :meta *print-meta*
+ :dup *print-dup*
+ :print-length *print-length*})
+
+(declare into-array)
+
+(defn enable-console-print!
+ "Set *print-fn* to console.log"
+ []
+ (set! *print-newline* false)
+ (set! *print-fn*
+ (fn [& args]
+ (.apply (.-log js/console) js/console (into-array args))))
+ (set! *print-err-fn*
+ (fn [& args]
+ (.apply (.-error js/console) js/console (into-array args))))
+ nil)
+
+(def
+ ^{:doc "bound in a repl thread to the most recent value printed"}
+ *1)
+
+(def
+ ^{:doc "bound in a repl thread to the second most recent value printed"}
+ *2)
+
+(def
+ ^{:doc "bound in a repl thread to the third most recent value printed"}
+ *3)
+
+(def
+ ^{:doc "bound in a repl thread to the most recent exception caught by the repl"}
+ *e)
+
+(defn truth_
+ "Internal - do not use!"
+ [x]
+ (cljs.core/truth_ x))
+
+(def not-native nil)
+
+(declare instance? Keyword)
+
+(defn ^boolean identical?
+ "Tests if 2 arguments are the same object"
+ [x y]
+ (cljs.core/identical? x y))
+
+(defn ^boolean nil?
+ "Returns true if x is nil, false otherwise."
+ [x]
+ (coercive-= x nil))
+
+(defn ^boolean array?
+ "Returns true if x is a JavaScript array."
+ [x]
+ (if (identical? *target* "nodejs")
+ (.isArray js/Array x)
+ (instance? js/Array x)))
+
+(defn ^boolean number?
+ "Returns true if x is a JavaScript number."
+ [x]
+ (cljs.core/number? x))
+
+(defn ^boolean not
+ "Returns true if x is logical false, false otherwise."
+ [x]
+ (cond
+ (nil? x) true
+ (false? x) true
+ :else false))
+
+(defn ^boolean some?
+ "Returns true if x is not nil, false otherwise."
+ [x] (not (nil? x)))
+
+(defn ^boolean object?
+ "Returns true if x's constructor is Object"
+ [x]
+ (if-not (nil? x)
+ (identical? (.-constructor x) js/Object)
+ false))
+
+(defn ^boolean string?
+ "Returns true if x is a JavaScript string."
+ [x]
+ (goog/isString x))
+
+(defn ^boolean char?
+ "Returns true if x is a JavaScript string of length one."
+ [x]
+ (and (string? x) (== 1 (.-length x))))
+
+(defn ^boolean any?
+ "Returns true if given any argument."
+ [x] true)
+
+(set! *unchecked-if* true)
+(defn ^boolean native-satisfies?
+ "Internal - do not use!"
+ [p x]
+ (let [x (if (nil? x) nil x)]
+ (cond
+ (aget p (goog/typeOf x)) true
+ (aget p "_") true
+ :else false)))
+(set! *unchecked-if* false)
+
+(defn is_proto_
+ [x]
+ (identical? (.-prototype (.-constructor x)) x))
+
+(def
+ ^{:doc "When compiled for a command-line target, whatever function
+ *main-cli-fn* is set to will be called with the command-line
+ argv as arguments"}
+ *main-cli-fn* nil)
+
+(defn type
+ "Return x's constructor."
+ [x]
+ (when-not (nil? x)
+ (.-constructor x)))
+
+(defn missing-protocol [proto obj]
+ (let [ty (type obj)
+ ty (if (and ty (.-cljs$lang$type ty))
+ (.-cljs$lang$ctorStr ty)
+ (goog/typeOf obj))]
+ (js/Error.
+ (.join (array "No protocol method " proto
+ " defined for type " ty ": " obj) ""))))
+
+(defn type->str [ty]
+ (if-let [s (.-cljs$lang$ctorStr ty)]
+ s
+ (str ty)))
+
+;; INTERNAL - do not use, only for Node.js
+(defn load-file [file]
+ (when-not js/COMPILED
+ (cljs.core/load-file* file)))
+
+(if (and (exists? js/Symbol)
+ (identical? (goog/typeOf js/Symbol) "function"))
+ (def ITER_SYMBOL (.-iterator js/Symbol))
+ (def ITER_SYMBOL "@@iterator"))
+
+(def ^{:jsdoc ["@enum {string}"]}
+ CHAR_MAP
+ #js {"-" "_"
+ ":" "_COLON_"
+ "+" "_PLUS_"
+ ">" "_GT_"
+ "<" "_LT_"
+ "=" "_EQ_"
+ "~" "_TILDE_"
+ "!" "_BANG_"
+ "@" "_CIRCA_"
+ "#" "_SHARP_"
+ "'" "_SINGLEQUOTE_"
+ "\\\"" "_DOUBLEQUOTE_"
+ "%" "_PERCENT_"
+ "^" "_CARET_"
+ "&" "_AMPERSAND_"
+ "*" "_STAR_"
+ "|" "_BAR_"
+ "{" "_LBRACE_"
+ "}" "_RBRACE_"
+ "[" "_LBRACK_"
+ "]" "_RBRACK_"
+ "/" "_SLASH_"
+ "\\\\" "_BSLASH_"
+ "?" "_QMARK_"})
+
+(def ^{:jsdoc ["@enum {string}"]}
+ DEMUNGE_MAP
+ #js {"_" "-"
+ "_COLON_" ":"
+ "_PLUS_" "+"
+ "_GT_" ">"
+ "_LT_" "<"
+ "_EQ_" "="
+ "_TILDE_" "~"
+ "_BANG_" "!"
+ "_CIRCA_" "@"
+ "_SHARP_" "#"
+ "_SINGLEQUOTE_" "'"
+ "_DOUBLEQUOTE_" "\\\""
+ "_PERCENT_" "%"
+ "_CARET_" "^"
+ "_AMPERSAND_" "&"
+ "_STAR_" "*"
+ "_BAR_" "|"
+ "_LBRACE_" "{"
+ "_RBRACE_" "}"
+ "_LBRACK_" "["
+ "_RBRACK_" "]"
+ "_SLASH_" "/"
+ "_BSLASH_" "\\\\"
+ "_QMARK_" "?"})
+
+(def DEMUNGE_PATTERN nil)
+
+(defn system-time
+ "Returns highest resolution time offered by host in milliseconds."
+ []
+ (cond
+ (and (exists? js/performance)
+ (not (nil? (. js/performance -now))))
+ (.now js/performance)
+
+ (and (exists? js/process)
+ (not (nil? (. js/process -hrtime))))
+ (let [t (.hrtime js/process)]
+ (/ (+ (* (aget t 0) 1e9) (aget t 1)) 1e6))
+
+ :else (.getTime (js/Date.))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; arrays ;;;;;;;;;;;;;;;;
+
+(declare apply)
+
+(defn ^array make-array
+ "Construct a JavaScript array of the specified dimensions. Accepts ignored
+ type argument for compatibility with Clojure. Note that there is no efficient
+ way to allocate multi-dimensional arrays in JavaScript; as such, this function
+ will run in polynomial time when called with 3 or more arguments."
+ ([size]
+ (js/Array. size))
+ ([type size]
+ (make-array size))
+ ([type size & more-sizes]
+ (let [dims more-sizes
+ dimarray (make-array size)]
+ (dotimes [i (alength dimarray)]
+ (aset dimarray i (apply make-array nil dims)))
+ dimarray)))
+
+(defn aclone
+ "Returns a javascript array, cloned from the passed in array"
+ [arr]
+ (let [len (alength arr)
+ new-arr (make-array len)]
+ (dotimes [i len]
+ (aset new-arr i (aget arr i)))
+ new-arr))
+
+(defn ^array array
+ "Creates a new javascript array.
+@param {...*} var_args" ;;array is a special case, don't emulate this doc string
+ [var-args] ;; [& items]
+ (let [a (js/Array. (alength (cljs.core/js-arguments)))]
+ (loop [i 0]
+ (if (< i (alength a))
+ (do
+ (aset a i (aget (cljs.core/js-arguments) i))
+ (recur (inc i)))
+ a))))
+
+(defn aget
+ "Returns the value at the index."
+ ([array i]
+ (cljs.core/aget array i))
+ ([array i & idxs]
+ (apply aget (aget array i) idxs)))
+
+(defn aset
+ "Sets the value at the index."
+ ([array i val]
+ (cljs.core/aset array i val))
+ ([array idx idx2 & idxv]
+ (apply aset (aget array idx) idx2 idxv)))
+
+(defn ^number alength
+ "Returns the length of the array. Works on arrays of all types."
+ [array]
+ (cljs.core/alength array))
+
+(declare reduce)
+
+(defn ^array into-array
+ "Returns an array with components set to the values in aseq. Optional type
+ argument accepted for compatibility with Clojure."
+ ([aseq]
+ (into-array nil aseq))
+ ([type aseq]
+ (reduce (fn [a x] (.push a x) a) (array) aseq)))
+
+(defn js-invoke
+ "Invoke JavaScript object method via string. Needed when the
+ string is not a valid unquoted property name."
+ [obj s & args]
+ (.apply (aget obj s) obj (into-array args)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;; core protocols ;;;;;;;;;;;;;
+
+(defprotocol Fn
+ "Marker protocol")
+
+(defprotocol IFn
+ "Protocol for adding the ability to invoke an object as a function.
+ For example, a vector can also be used to look up a value:
+ ([1 2 3 4] 1) => 2"
+ (-invoke
+ [this]
+ [this a]
+ [this a b]
+ [this a b c]
+ [this a b c d]
+ [this a b c d e]
+ [this a b c d e f]
+ [this a b c d e f g]
+ [this a b c d e f g h]
+ [this a b c d e f g h i]
+ [this a b c d e f g h i j]
+ [this a b c d e f g h i j k]
+ [this a b c d e f g h i j k l]
+ [this a b c d e f g h i j k l m]
+ [this a b c d e f g h i j k l m n]
+ [this a b c d e f g h i j k l m n o]
+ [this a b c d e f g h i j k l m n o p]
+ [this a b c d e f g h i j k l m n o p q]
+ [this a b c d e f g h i j k l m n o p q r]
+ [this a b c d e f g h i j k l m n o p q r s]
+ [this a b c d e f g h i j k l m n o p q r s t]
+ [this a b c d e f g h i j k l m n o p q r s t rest]))
+
+(defprotocol ICloneable
+ "Protocol for cloning a value."
+ (^clj -clone [value]
+ "Creates a clone of value."))
+
+(defprotocol ICounted
+ "Protocol for adding the ability to count a collection in constant time."
+ (^number -count [coll]
+ "Calculates the count of coll in constant time. Used by cljs.core/count."))
+
+(defprotocol IEmptyableCollection
+ "Protocol for creating an empty collection."
+ (-empty [coll]
+ "Returns an empty collection of the same category as coll. Used
+ by cljs.core/empty."))
+
+(defprotocol ICollection
+ "Protocol for adding to a collection."
+ (^clj -conj [coll o]
+ "Returns a new collection of coll with o added to it. The new item
+ should be added to the most efficient place, e.g.
+ (conj [1 2 3 4] 5) => [1 2 3 4 5]
+ (conj '(2 3 4 5) 1) => '(1 2 3 4 5)"))
+
+#_(defprotocol IOrdinal
+ (-index [coll]))
+
+(defprotocol IIndexed
+ "Protocol for collections to provide indexed-based access to their items."
+ (-nth [coll n] [coll n not-found]
+ "Returns the value at the index n in the collection coll.
+ Returns not-found if index n is out of bounds and not-found is supplied."))
+
+(defprotocol ASeq
+ "Marker protocol indicating an array sequence.")
+
+(defprotocol ISeq
+ "Protocol for collections to provide access to their items as sequences."
+ (-first [coll]
+ "Returns the first item in the collection coll. Used by cljs.core/first.")
+ (^clj -rest [coll]
+ "Returns a new collection of coll without the first item. It should
+ always return a seq, e.g.
+ (rest []) => ()
+ (rest nil) => ()"))
+
+(defprotocol INext
+ "Protocol for accessing the next items of a collection."
+ (^clj-or-nil -next [coll]
+ "Returns a new collection of coll without the first item. In contrast to
+ rest, it should return nil if there are no more items, e.g.
+ (next []) => nil
+ (next nil) => nil"))
+
+(defprotocol ILookup
+ "Protocol for looking up a value in a data structure."
+ (-lookup [o k] [o k not-found]
+ "Use k to look up a value in o. If not-found is supplied and k is not
+ a valid value that can be used for look up, not-found is returned."))
+
+(defprotocol IAssociative
+ "Protocol for adding associativity to collections."
+ (^boolean -contains-key? [coll k]
+ "Returns true if k is a key in coll.")
+ #_(-entry-at [coll k])
+ (^clj -assoc [coll k v]
+ "Returns a new collection of coll with a mapping from key k to
+ value v added to it."))
+
+(defprotocol IMap
+ "Protocol for adding mapping functionality to collections."
+ #_(-assoc-ex [coll k v])
+ (^clj -dissoc [coll k]
+ "Returns a new collection of coll without the mapping for key k."))
+
+(defprotocol IMapEntry
+ "Protocol for examining a map entry."
+ (-key [coll]
+ "Returns the key of the map entry.")
+ (-val [coll]
+ "Returns the value of the map entry."))
+
+(defprotocol ISet
+ "Protocol for adding set functionality to a collection."
+ (^clj -disjoin [coll v]
+ "Returns a new collection of coll that does not contain v."))
+
+(defprotocol IStack
+ "Protocol for collections to provide access to their items as stacks. The top
+ of the stack should be accessed in the most efficient way for the different
+ data structures."
+ (-peek [coll]
+ "Returns the item from the top of the stack. Is used by cljs.core/peek.")
+ (^clj -pop [coll]
+ "Returns a new stack without the item on top of the stack. Is used
+ by cljs.core/pop."))
+
+(defprotocol IVector
+ "Protocol for adding vector functionality to collections."
+ (^clj -assoc-n [coll n val]
+ "Returns a new vector with value val added at position n."))
+
+(defprotocol IDeref
+ "Protocol for adding dereference functionality to a reference."
+ (-deref [o]
+ "Returns the value of the reference o."))
+
+(defprotocol IDerefWithTimeout
+ (-deref-with-timeout [o msec timeout-val]))
+
+(defprotocol IMeta
+ "Protocol for accessing the metadata of an object."
+ (^clj-or-nil -meta [o]
+ "Returns the metadata of object o."))
+
+(defprotocol IWithMeta
+ "Protocol for adding metadata to an object."
+ (^clj -with-meta [o meta]
+ "Returns a new object with value of o and metadata meta added to it."))
+
+(defprotocol IReduce
+ "Protocol for seq types that can reduce themselves.
+ Called by cljs.core/reduce."
+ (-reduce [coll f] [coll f start]
+ "f should be a function of 2 arguments. If start is not supplied,
+ returns the result of applying f to the first 2 items in coll, then
+ applying f to that result and the 3rd item, etc."))
+
+(defprotocol IKVReduce
+ "Protocol for associative types that can reduce themselves
+ via a function of key and val. Called by cljs.core/reduce-kv."
+ (-kv-reduce [coll f init]
+ "Reduces an associative collection and returns the result. f should be
+ a function that takes three arguments."))
+
+(defprotocol IEquiv
+ "Protocol for adding value comparison functionality to a type."
+ (^boolean -equiv [o other]
+ "Returns true if o and other are equal, false otherwise."))
+
+(defprotocol IHash
+ "Protocol for adding hashing functionality to a type."
+ (-hash [o]
+ "Returns the hash code of o."))
+
+(defprotocol ISeqable
+ "Protocol for adding the ability to a type to be transformed into a sequence."
+ (^clj-or-nil -seq [o]
+ "Returns a seq of o, or nil if o is empty."))
+
+(defprotocol ISequential
+ "Marker interface indicating a persistent collection of sequential items")
+
+(defprotocol IList
+ "Marker interface indicating a persistent list")
+
+(defprotocol IRecord
+ "Marker interface indicating a record object")
+
+(defprotocol IReversible
+ "Protocol for reversing a seq."
+ (^clj -rseq [coll]
+ "Returns a seq of the items in coll in reversed order."))
+
+(defprotocol ISorted
+ "Protocol for a collection which can represent their items
+ in a sorted manner. "
+ (^clj -sorted-seq [coll ascending?]
+ "Returns a sorted seq from coll in either ascending or descending order.")
+ (^clj -sorted-seq-from [coll k ascending?]
+ "Returns a sorted seq from coll in either ascending or descending order.
+ If ascending is true, the result should contain all items which are > or >=
+ than k. If ascending is false, the result should contain all items which
+ are < or <= than k, e.g.
+ (-sorted-seq-from (sorted-set 1 2 3 4 5) 3 true) => (3 4 5)
+ (-sorted-seq-from (sorted-set 1 2 3 4 5) 3 false) => (3 2 1)")
+ (-entry-key [coll entry]
+ "Returns the key for entry.")
+ (-comparator [coll]
+ "Returns the comparator for coll."))
+
+(defprotocol IWriter
+ "Protocol for writing. Currently only implemented by StringBufferWriter."
+ (-write [writer s]
+ "Writes s with writer and returns the result.")
+ (-flush [writer]
+ "Flush writer."))
+
+(defprotocol IPrintWithWriter
+ "The old IPrintable protocol's implementation consisted of building a giant
+ list of strings to concatenate. This involved lots of concat calls,
+ intermediate vectors, and lazy-seqs, and was very slow in some older JS
+ engines. IPrintWithWriter implements printing via the IWriter protocol, so it
+ be implemented efficiently in terms of e.g. a StringBuffer append."
+ (-pr-writer [o writer opts]))
+
+(defprotocol IPending
+ "Protocol for types which can have a deferred realization. Currently only
+ implemented by Delay and LazySeq."
+ (^boolean -realized? [x]
+ "Returns true if a value for x has been produced, false otherwise."))
+
+(defprotocol IWatchable
+ "Protocol for types that can be watched. Currently only implemented by Atom."
+ (-notify-watches [this oldval newval]
+ "Calls all watchers with this, oldval and newval.")
+ (-add-watch [this key f]
+ "Adds a watcher function f to this. Keys must be unique per reference,
+ and can be used to remove the watch with -remove-watch.")
+ (-remove-watch [this key]
+ "Removes watcher that corresponds to key from this."))
+
+(defprotocol IEditableCollection
+ "Protocol for collections which can transformed to transients."
+ (^clj -as-transient [coll]
+ "Returns a new, transient version of the collection, in constant time."))
+
+(defprotocol ITransientCollection
+ "Protocol for adding basic functionality to transient collections."
+ (^clj -conj! [tcoll val]
+ "Adds value val to tcoll and returns tcoll.")
+ (^clj -persistent! [tcoll]
+ "Creates a persistent data structure from tcoll and returns it."))
+
+(defprotocol ITransientAssociative
+ "Protocol for adding associativity to transient collections."
+ (^clj -assoc! [tcoll key val]
+ "Returns a new transient collection of tcoll with a mapping from key to
+ val added to it."))
+
+(defprotocol ITransientMap
+ "Protocol for adding mapping functionality to transient collections."
+ (^clj -dissoc! [tcoll key]
+ "Returns a new transient collection of tcoll without the mapping for key."))
+
+(defprotocol ITransientVector
+ "Protocol for adding vector functionality to transient collections."
+ (^clj -assoc-n! [tcoll n val]
+ "Returns tcoll with value val added at position n.")
+ (^clj -pop! [tcoll]
+ "Returns tcoll with the last item removed from it."))
+
+(defprotocol ITransientSet
+ "Protocol for adding set functionality to a transient collection."
+ (^clj -disjoin! [tcoll v]
+ "Returns tcoll without v."))
+
+(defprotocol IComparable
+ "Protocol for values that can be compared."
+ (^number -compare [x y]
+ "Returns a negative number, zero, or a positive number when x is logically
+ 'less than', 'equal to', or 'greater than' y."))
+
+(defprotocol IChunk
+ "Protocol for accessing the items of a chunk."
+ (-drop-first [coll]
+ "Return a new chunk of coll with the first item removed."))
+
+(defprotocol IChunkedSeq
+ "Protocol for accessing a collection as sequential chunks."
+ (-chunked-first [coll]
+ "Returns the first chunk in coll.")
+ (-chunked-rest [coll]
+ "Return a new collection of coll with the first chunk removed."))
+
+(defprotocol IChunkedNext
+ "Protocol for accessing the chunks of a collection."
+ (-chunked-next [coll]
+ "Returns a new collection of coll without the first chunk."))
+
+(defprotocol INamed
+ "Protocol for adding a name."
+ (^string -name [x]
+ "Returns the name String of x.")
+ (^string -namespace [x]
+ "Returns the namespace String of x."))
+
+(defprotocol IAtom
+ "Marker protocol indicating an atom.")
+
+(defprotocol IReset
+ "Protocol for adding resetting functionality."
+ (-reset! [o new-value]
+ "Sets the value of o to new-value."))
+
+(defprotocol ISwap
+ "Protocol for adding swapping functionality."
+ (-swap! [o f] [o f a] [o f a b] [o f a b xs]
+ "Swaps the value of o to be (apply f current-value-of-atom args)."))
+
+(defprotocol IVolatile
+ "Protocol for adding volatile functionality."
+ (-vreset! [o new-value]
+ "Sets the value of volatile o to new-value without regard for the
+ current value. Returns new-value."))
+
+(defprotocol IIterable
+ "Protocol for iterating over a collection."
+ (-iterator [coll]
+ "Returns an iterator for coll."))
+
+;; Printing support
+
+(deftype StringBufferWriter [sb]
+ IWriter
+ (-write [_ s] (.append sb s))
+ (-flush [_] nil))
+
+(defn pr-str*
+ "Support so that collections can implement toString without
+ loading all the printing machinery."
+ [^not-native obj]
+ (let [sb (StringBuffer.)
+ writer (StringBufferWriter. sb)]
+ (-pr-writer obj writer (pr-opts))
+ (-flush writer)
+ (str sb)))
+
+;;;;;;;;;;;;;;;;;;; Murmur3 ;;;;;;;;;;;;;;;
+
+;;http://hg.openjdk.java.net/jdk7u/jdk7u6/jdk/file/8c2c5d63a17e/src/share/classes/java/lang/Integer.java
+(defn ^number int-rotate-left [x n]
+ (bit-or
+ (bit-shift-left x n)
+ (unsigned-bit-shift-right x (- n))))
+
+;; http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul
+(if (and (exists? Math/imul)
+ (not (zero? (Math/imul 0xffffffff 5))))
+ (defn ^number imul [a b] (Math/imul a b))
+ (defn ^number imul [a b]
+ (let [ah (bit-and (unsigned-bit-shift-right a 16) 0xffff)
+ al (bit-and a 0xffff)
+ bh (bit-and (unsigned-bit-shift-right b 16) 0xffff)
+ bl (bit-and b 0xffff)]
+ (bit-or
+ (+ (* al bl)
+ (unsigned-bit-shift-right
+ (bit-shift-left (+ (* ah bl) (* al bh)) 16) 0)) 0))))
+
+;; http://smhasher.googlecode.com/svn/trunk/MurmurHash3.cpp
+(def m3-seed 0)
+(def m3-C1 (int 0xcc9e2d51))
+(def m3-C2 (int 0x1b873593))
+
+(defn ^number m3-mix-K1 [k1]
+ (-> (int k1) (imul m3-C1) (int-rotate-left 15) (imul m3-C2)))
+
+(defn ^number m3-mix-H1 [h1 k1]
+ (int (-> (int h1) (bit-xor (int k1)) (int-rotate-left 13) (imul 5) (+ (int 0xe6546b64)))))
+
+(defn ^number m3-fmix [h1 len]
+ (as-> (int h1) h1
+ (bit-xor h1 len)
+ (bit-xor h1 (unsigned-bit-shift-right h1 16))
+ (imul h1 (int 0x85ebca6b))
+ (bit-xor h1 (unsigned-bit-shift-right h1 13))
+ (imul h1 (int 0xc2b2ae35))
+ (bit-xor h1 (unsigned-bit-shift-right h1 16))))
+
+(defn ^number m3-hash-int [in]
+ (if (zero? in)
+ in
+ (let [k1 (m3-mix-K1 in)
+ h1 (m3-mix-H1 m3-seed k1)]
+ (m3-fmix h1 4))))
+
+(defn ^number m3-hash-unencoded-chars [in]
+ (let [h1 (loop [i 1 h1 m3-seed]
+ (if (< i (alength in))
+ (recur (+ i 2)
+ (m3-mix-H1 h1
+ (m3-mix-K1
+ (bit-or (.charCodeAt in (dec i))
+ (bit-shift-left (.charCodeAt in i) 16)))))
+ h1))
+ h1 (if (== (bit-and (alength in) 1) 1)
+ (bit-xor h1 (m3-mix-K1 (.charCodeAt in (dec (alength in)))))
+ h1)]
+ (m3-fmix h1 (imul 2 (alength in)))))
+
+;;;;;;;;;;;;;;;;;;; symbols ;;;;;;;;;;;;;;;
+
+(declare list Symbol = compare)
+
+;; Simple caching of string hashcode
+(def string-hash-cache (js-obj))
+(def string-hash-cache-count 0)
+
+;;http://hg.openjdk.java.net/jdk7u/jdk7u6/jdk/file/8c2c5d63a17e/src/share/classes/java/lang/String.java
+(defn hash-string* [s]
+ (if-not (nil? s)
+ (let [len (alength s)]
+ (if (pos? len)
+ (loop [i 0 hash 0]
+ (if (< i len)
+ (recur (inc i) (+ (imul 31 hash) (.charCodeAt s i)))
+ hash))
+ 0))
+ 0))
+
+(defn add-to-string-hash-cache [k]
+ (let [h (hash-string* k)]
+ (aset string-hash-cache k h)
+ (set! string-hash-cache-count (inc string-hash-cache-count))
+ h))
+
+(defn hash-string [k]
+ (when (> string-hash-cache-count 255)
+ (set! string-hash-cache (js-obj))
+ (set! string-hash-cache-count 0))
+ (if (nil? k)
+ 0
+ (let [h (aget string-hash-cache k)]
+ (if (number? h)
+ h
+ (add-to-string-hash-cache k)))))
+
+(defn hash
+ "Returns the hash code of its argument. Note this is the hash code
+ consistent with =."
+ [o]
+ (cond
+ (implements? IHash o)
+ (-hash ^not-native o)
+
+ (number? o)
+ (if (js/isFinite o)
+ (js-mod (Math/floor o) 2147483647)
+ (case o
+ Infinity
+ 2146435072
+ -Infinity
+ -1048576
+ 2146959360))
+
+ ;; note: mirrors Clojure's behavior on the JVM, where the hashCode is
+ ;; 1231 for true and 1237 for false
+ ;; http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html#hashCode%28%29
+ (true? o) 1231
+
+ (false? o) 1237
+
+ (string? o)
+ (m3-hash-int (hash-string o))
+
+ (instance? js/Date o)
+ (.valueOf o)
+
+ (nil? o) 0
+
+ :else
+ (-hash o)))
+
+(defn hash-combine [seed hash]
+ ; a la boost
+ (bit-xor seed
+ (+ hash 0x9e3779b9
+ (bit-shift-left seed 6)
+ (bit-shift-right seed 2))))
+
+(defn ^boolean instance?
+ "Evaluates x and tests if it is an instance of the type
+ c. Returns true or false"
+ [c x]
+ (cljs.core/instance? c x))
+
+(defn ^boolean symbol?
+ "Return true if x is a Symbol"
+ [x]
+ (instance? Symbol x))
+
+(defn- hash-symbol [sym]
+ (hash-combine
+ (m3-hash-unencoded-chars (.-name sym))
+ (hash-string (.-ns sym))))
+
+(defn- compare-symbols [a b]
+ (cond
+ (identical? (.-str a) (.-str b)) 0
+ (and (not (.-ns a)) (.-ns b)) -1
+ (.-ns a) (if-not (.-ns b)
+ 1
+ (let [nsc (garray/defaultCompare (.-ns a) (.-ns b))]
+ (if (== 0 nsc)
+ (garray/defaultCompare (.-name a) (.-name b))
+ nsc)))
+ :default (garray/defaultCompare (.-name a) (.-name b))))
+
+(declare get)
+
+(deftype Symbol [ns name str ^:mutable _hash _meta]
+ Object
+ (toString [_] str)
+ (equiv [this other] (-equiv this other))
+
+ IEquiv
+ (-equiv [_ other]
+ (if (instance? Symbol other)
+ (identical? str (.-str other))
+ false))
+
+ IFn
+ (-invoke [sym coll]
+ (get coll sym))
+ (-invoke [sym coll not-found]
+ (get coll sym not-found))
+
+ IMeta
+ (-meta [_] _meta)
+
+ IWithMeta
+ (-with-meta [_ new-meta] (Symbol. ns name str _hash new-meta))
+
+ IHash
+ (-hash [sym]
+ (caching-hash sym hash-symbol _hash))
+
+ INamed
+ (-name [_] name)
+ (-namespace [_] ns)
+
+ IPrintWithWriter
+ (-pr-writer [o writer _] (-write writer str)))
+
+(defn symbol
+ "Returns a Symbol with the given namespace and name."
+ ([name]
+ (if (symbol? name)
+ name
+ (let [idx (.indexOf name "/")]
+ (if (< idx 1)
+ (symbol nil name)
+ (symbol (.substring name 0 idx)
+ (.substring name (inc idx) (. name -length)))))))
+ ([ns name]
+ (let [sym-str (if-not (nil? ns)
+ (str ns "/" name)
+ name)]
+ (Symbol. ns name sym-str nil nil))))
+
+(deftype Var [val sym _meta]
+ Object
+ (isMacro [_]
+ (. (val) -cljs$lang$macro))
+ (toString [_]
+ (str "#'" sym))
+ IDeref
+ (-deref [_] (val))
+ IMeta
+ (-meta [_] _meta)
+ IWithMeta
+ (-with-meta [_ new-meta]
+ (Var. val sym new-meta))
+ IEquiv
+ (-equiv [this other]
+ (if (instance? Var other)
+ (= (.-sym this) (.-sym other))
+ false))
+ IHash
+ (-hash [_]
+ (hash-symbol sym))
+ Fn
+ IFn
+ (-invoke [_]
+ ((val)))
+ (-invoke [_ a]
+ ((val) a))
+ (-invoke [_ a b]
+ ((val) a b))
+ (-invoke [_ a b c]
+ ((val) a b c))
+ (-invoke [_ a b c d]
+ ((val) a b c d))
+ (-invoke [_ a b c d e]
+ ((val) a b c d e))
+ (-invoke [_ a b c d e f]
+ ((val) a b c d e f))
+ (-invoke [_ a b c d e f g]
+ ((val) a b c d e f g))
+ (-invoke [_ a b c d e f g h]
+ ((val) a b c d e f g h))
+ (-invoke [_ a b c d e f g h i]
+ ((val) a b c d e f g h i))
+ (-invoke [_ a b c d e f g h i j]
+ ((val) a b c d e f g h i j))
+ (-invoke [_ a b c d e f g h i j k]
+ ((val) a b c d e f g h i j k))
+ (-invoke [_ a b c d e f g h i j k l]
+ ((val) a b c d e f g h i j k l))
+ (-invoke [_ a b c d e f g h i j k l m]
+ ((val) a b c d e f g h i j k l m))
+ (-invoke [_ a b c d e f g h i j k l m n]
+ ((val) a b c d e f g h i j k l m n))
+ (-invoke [_ a b c d e f g h i j k l m n o]
+ ((val) a b c d e f g h i j k l m n o))
+ (-invoke [_ a b c d e f g h i j k l m n o p]
+ ((val) a b c d e f g h i j k l m n o p))
+ (-invoke [_ a b c d e f g h i j k l m n o p q]
+ ((val) a b c d e f g h i j k l m n o p q))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r]
+ ((val) a b c d e f g h i j k l m n o p q r))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s]
+ ((val) a b c d e f g h i j k l m n o p q r s))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s t]
+ ((val) a b c d e f g h i j k l m n o p q r s t))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s t rest]
+ (apply (val) a b c d e f g h i j k l m n o p q r s t rest)))
+
+(defn ^boolean var?
+ "Returns true if v is of type cljs.core.Var"
+ [v]
+ (instance? cljs.core.Var v))
+
+;;;;;;;;;;;;;;;;;;; fundamentals ;;;;;;;;;;;;;;;
+
+(declare array-seq prim-seq IndexedSeq)
+
+(defn ^boolean iterable?
+ "Return true if x implements IIterable protocol."
+ [x]
+ (satisfies? IIterable x))
+
+(defn clone
+ "Clone the supplied value which must implement ICloneable."
+ [value]
+ (-clone value))
+
+(defn ^boolean cloneable?
+ "Return true if x implements ICloneable protocol."
+ [value]
+ (satisfies? ICloneable value))
+
+(defn ^seq seq
+ "Returns a seq on the collection. If the collection is
+ empty, returns nil. (seq nil) returns nil. seq also works on
+ Strings."
+ [coll]
+ (when-not (nil? coll)
+ (cond
+ (implements? ISeqable coll)
+ (-seq ^not-native coll)
+
+ (array? coll)
+ (when-not (zero? (alength coll))
+ (IndexedSeq. coll 0 nil))
+
+ (string? coll)
+ (when-not (zero? (alength coll))
+ (IndexedSeq. coll 0 nil))
+
+ (native-satisfies? ISeqable coll)
+ (-seq coll)
+
+ :else (throw (js/Error. (str coll " is not ISeqable"))))))
+
+(defn first
+ "Returns the first item in the collection. Calls seq on its
+ argument. If coll is nil, returns nil."
+ [coll]
+ (when-not (nil? coll)
+ (if (implements? ISeq coll)
+ (-first ^not-native coll)
+ (let [s (seq coll)]
+ (when-not (nil? s)
+ (-first s))))))
+
+(defn ^seq rest
+ "Returns a possibly empty seq of the items after the first. Calls seq on its
+ argument."
+ [coll]
+ (if-not (nil? coll)
+ (if (implements? ISeq coll)
+ (-rest ^not-native coll)
+ (let [s (seq coll)]
+ (if s
+ (-rest ^not-native s)
+ ())))
+ ()))
+
+(defn ^seq next
+ "Returns a seq of the items after the first. Calls seq on its
+ argument. If there are no more items, returns nil"
+ [coll]
+ (when-not (nil? coll)
+ (if (implements? INext coll)
+ (-next ^not-native coll)
+ (seq (rest coll)))))
+
+(defn ^boolean =
+ "Equality. Returns true if x equals y, false if not. Compares
+ numbers and collections in a type-independent manner. Clojure's immutable data
+ structures define -equiv (and thus =) as a value, not an identity,
+ comparison."
+ ([x] true)
+ ([x y]
+ (if (nil? x)
+ (nil? y)
+ (or (identical? x y)
+ ^boolean (-equiv x y))))
+ ([x y & more]
+ (if (= x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (= y (first more)))
+ false)))
+
+;; EXPERIMENTAL: subject to change
+(deftype ES6Iterator [^:mutable s]
+ Object
+ (next [_]
+ (if-not (nil? s)
+ (let [x (first s)]
+ (set! s (next s))
+ #js {:value x :done false})
+ #js {:value nil :done true})))
+
+(defn es6-iterator
+ "EXPERIMENTAL: Return a ES2015 compatible iterator for coll."
+ [coll]
+ (ES6Iterator. (seq coll)))
+
+(declare es6-iterator-seq)
+
+(deftype ES6IteratorSeq [value iter ^:mutable _rest]
+ ISeqable
+ (-seq [this] this)
+ ISeq
+ (-first [_] value)
+ (-rest [_]
+ (when (nil? _rest)
+ (set! _rest (es6-iterator-seq iter)))
+ _rest))
+
+(defn es6-iterator-seq
+ "EXPERIMENTAL: Given an ES2015 compatible iterator return a seq."
+ [iter]
+ (let [v (.next iter)]
+ (if (.-done v)
+ ()
+ (ES6IteratorSeq. (.-value v) iter nil))))
+
+;;;;;;;;;;;;;;;;;;; Murmur3 Helpers ;;;;;;;;;;;;;;;;
+
+(defn ^number mix-collection-hash
+ "Mix final collection hash for ordered or unordered collections.
+ hash-basis is the combined collection hash, count is the number
+ of elements included in the basis. Note this is the hash code
+ consistent with =, different from .hashCode.
+ See http://clojure.org/data_structures#hash for full algorithms."
+ [hash-basis count]
+ (let [h1 m3-seed
+ k1 (m3-mix-K1 hash-basis)
+ h1 (m3-mix-H1 h1 k1)]
+ (m3-fmix h1 count)))
+
+(defn ^number hash-ordered-coll
+ "Returns the hash code, consistent with =, for an external ordered
+ collection implementing Iterable.
+ See http://clojure.org/data_structures#hash for full algorithms."
+ [coll]
+ (loop [n 0 hash-code 1 coll (seq coll)]
+ (if-not (nil? coll)
+ (recur (inc n) (bit-or (+ (imul 31 hash-code) (hash (first coll))) 0)
+ (next coll))
+ (mix-collection-hash hash-code n))))
+
+(def ^:private empty-ordered-hash
+ (mix-collection-hash 1 0))
+
+(defn ^number hash-unordered-coll
+ "Returns the hash code, consistent with =, for an external unordered
+ collection implementing Iterable. For maps, the iterator should
+ return map entries whose hash is computed as
+ (hash-ordered-coll [k v]).
+ See http://clojure.org/data_structures#hash for full algorithms."
+ [coll]
+ (loop [n 0 hash-code 0 coll (seq coll)]
+ (if-not (nil? coll)
+ (recur (inc n) (bit-or (+ hash-code (hash (first coll))) 0) (next coll))
+ (mix-collection-hash hash-code n))))
+
+(def ^:private empty-unordered-hash
+ (mix-collection-hash 0 0))
+
+;;;;;;;;;;;;;;;;;;; protocols on primitives ;;;;;;;;
+(declare hash-map list equiv-sequential)
+
+(extend-type nil
+ ICounted
+ (-count [_] 0))
+
+;; TODO: we should remove this and handle date equality checking
+;; by some other means, probably by adding a new primitive type
+;; case to the hash table lookup - David
+
+(extend-type js/Date
+ IEquiv
+ (-equiv [o other]
+ (and (instance? js/Date other)
+ (== (.valueOf o) (.valueOf other))))
+
+ IComparable
+ (-compare [this other]
+ (if (instance? js/Date other)
+ (garray/defaultCompare (.valueOf this) (.valueOf other))
+ (throw (js/Error. (str "Cannot compare " this " to " other))))))
+
+(defprotocol Inst
+ (inst-ms* [inst]))
+
+(extend-protocol Inst
+ js/Date
+ (inst-ms* [inst] (.getTime inst)))
+
+(defn inst-ms
+ "Return the number of milliseconds since January 1, 1970, 00:00:00 GMT"
+ [inst]
+ (inst-ms* inst))
+
+(defn ^boolean inst?
+ "Return true if x satisfies Inst"
+ [x]
+ (satisfies? Inst x))
+
+(extend-type number
+ IEquiv
+ (-equiv [x o] (identical? x o)))
+
+(declare with-meta)
+
+(extend-type function
+ Fn
+ IMeta
+ (-meta [_] nil))
+
+(extend-type default
+ IHash
+ (-hash [o]
+ (goog/getUid o)))
+
+;;this is primitive because & emits call to array-seq
+(defn inc
+ "Returns a number one greater than num."
+ [x] (cljs.core/+ x 1))
+
+(declare deref)
+
+(deftype Reduced [val]
+ IDeref
+ (-deref [o] val))
+
+(defn reduced
+ "Wraps x in a way such that a reduce will terminate with the value x"
+ [x]
+ (Reduced. x))
+
+(defn ^boolean reduced?
+ "Returns true if x is the result of a call to reduced"
+ [r]
+ (instance? Reduced r))
+
+(defn ensure-reduced
+ "If x is already reduced?, returns it, else returns (reduced x)"
+ [x]
+ (if (reduced? x) x (reduced x)))
+
+(defn unreduced
+ "If x is reduced?, returns (deref x), else returns x"
+ [x]
+ (if (reduced? x) (deref x) x))
+
+;; generic to all refs
+;; (but currently hard-coded to atom!)
+(defn deref
+ "Also reader macro: @var/@atom/@delay. Returns the
+ most-recently-committed value of ref. When applied to a var
+ or atom, returns its current state. When applied to a delay, forces
+ it if not already forced. See also - realized?."
+ [o]
+ (-deref o))
+
+(defn- ci-reduce
+ "Accepts any collection which satisfies the ICount and IIndexed protocols and
+reduces them without incurring seq initialization"
+ ([cicoll f]
+ (let [cnt (-count cicoll)]
+ (if (zero? cnt)
+ (f)
+ (loop [val (-nth cicoll 0), n 1]
+ (if (< n cnt)
+ (let [nval (f val (-nth cicoll n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val)))))
+ ([cicoll f val]
+ (let [cnt (-count cicoll)]
+ (loop [val val, n 0]
+ (if (< n cnt)
+ (let [nval (f val (-nth cicoll n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val))))
+ ([cicoll f val idx]
+ (let [cnt (-count cicoll)]
+ (loop [val val, n idx]
+ (if (< n cnt)
+ (let [nval (f val (-nth cicoll n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val)))))
+
+(defn- array-reduce
+ ([arr f]
+ (let [cnt (alength arr)]
+ (if (zero? (alength arr))
+ (f)
+ (loop [val (aget arr 0), n 1]
+ (if (< n cnt)
+ (let [nval (f val (aget arr n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val)))))
+ ([arr f val]
+ (let [cnt (alength arr)]
+ (loop [val val, n 0]
+ (if (< n cnt)
+ (let [nval (f val (aget arr n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val))))
+ ([arr f val idx]
+ (let [cnt (alength arr)]
+ (loop [val val, n idx]
+ (if (< n cnt)
+ (let [nval (f val (aget arr n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val)))))
+
+(declare hash-coll cons drop count nth RSeq List)
+
+(defn ^boolean counted?
+ "Returns true if coll implements count in constant time"
+ [x] (satisfies? ICounted x))
+
+(defn ^boolean indexed?
+ "Returns true if coll implements nth in constant time"
+ [x] (satisfies? IIndexed x))
+
+(defn- -indexOf
+ ([coll x]
+ (-indexOf coll x 0))
+ ([coll x start]
+ (let [len (count coll)]
+ (if (>= start len)
+ -1
+ (loop [idx (cond
+ (pos? start) start
+ (neg? start) (max 0 (+ start len))
+ :else start)]
+ (if (< idx len)
+ (if (= (nth coll idx) x)
+ idx
+ (recur (inc idx)))
+ -1))))))
+
+(defn- -lastIndexOf
+ ([coll x]
+ (-lastIndexOf coll x (count coll)))
+ ([coll x start]
+ (let [len (count coll)]
+ (if (zero? len)
+ -1
+ (loop [idx (cond
+ (pos? start) (min (dec len) start)
+ (neg? start) (+ len start)
+ :else start)]
+ (if (>= idx 0)
+ (if (= (nth coll idx) x)
+ idx
+ (recur (dec idx)))
+ -1))))))
+
+(deftype IndexedSeqIterator [arr ^:mutable i]
+ Object
+ (hasNext [_]
+ (< i (alength arr)))
+ (next [_]
+ (let [ret (aget arr i)]
+ (set! i (inc i))
+ ret)))
+
+(deftype IndexedSeq [arr i meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [_] (IndexedSeq. arr i meta))
+
+ ISeqable
+ (-seq [this]
+ (when (< i (alength arr))
+ this))
+
+ IMeta
+ (-meta [coll] meta)
+ IWithMeta
+ (-with-meta [coll new-meta]
+ (IndexedSeq. arr i new-meta))
+
+ ASeq
+ ISeq
+ (-first [_] (aget arr i))
+ (-rest [_] (if (< (inc i) (alength arr))
+ (IndexedSeq. arr (inc i) nil)
+ (list)))
+
+ INext
+ (-next [_] (if (< (inc i) (alength arr))
+ (IndexedSeq. arr (inc i) nil)
+ nil))
+
+ ICounted
+ (-count [_]
+ (max 0 (- (alength arr) i)))
+
+ IIndexed
+ (-nth [coll n]
+ (let [i (+ n i)]
+ (if (and (<= 0 i) (< i (alength arr)))
+ (aget arr i)
+ (throw (js/Error. "Index out of bounds")))))
+ (-nth [coll n not-found]
+ (let [i (+ n i)]
+ (if (and (<= 0 i) (< i (alength arr)))
+ (aget arr i)
+ not-found)))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IIterable
+ (-iterator [coll]
+ (IndexedSeqIterator. arr i))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (.-EMPTY List))
+
+ IReduce
+ (-reduce [coll f]
+ (array-reduce arr f (aget arr i) (inc i)))
+ (-reduce [coll f start]
+ (array-reduce arr f start i))
+
+ IHash
+ (-hash [coll] (hash-ordered-coll coll))
+
+ IReversible
+ (-rseq [coll]
+ (let [c (-count coll)]
+ (if (pos? c)
+ (RSeq. coll (dec c) nil)))))
+
+(es6-iterable IndexedSeq)
+
+(defn prim-seq
+ "Create seq from a primitive JavaScript Array-like."
+ ([prim]
+ (prim-seq prim 0))
+ ([prim i]
+ (when (< i (alength prim))
+ (IndexedSeq. prim i nil))))
+
+(defn array-seq
+ "Create a seq from a JavaScript array."
+ ([array]
+ (prim-seq array 0))
+ ([array i]
+ (prim-seq array i)))
+
+(declare with-meta seq-reduce)
+
+(deftype RSeq [ci i meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [_] (RSeq. ci i meta))
+
+ IMeta
+ (-meta [coll] meta)
+ IWithMeta
+ (-with-meta [coll new-meta]
+ (RSeq. ci i new-meta))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ISeq
+ (-first [coll]
+ (-nth ci i))
+ (-rest [coll]
+ (if (pos? i)
+ (RSeq. ci (dec i) nil)
+ ()))
+
+ INext
+ (-next [coll]
+ (when (pos? i)
+ (RSeq. ci (dec i) nil)))
+
+ ICounted
+ (-count [coll] (inc i))
+
+ ICollection
+ (-conj [coll o]
+ (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) meta))
+
+ IHash
+ (-hash [coll] (hash-ordered-coll coll))
+
+ IReduce
+ (-reduce [col f] (seq-reduce f col))
+ (-reduce [col f start] (seq-reduce f start col)))
+
+(es6-iterable RSeq)
+
+(defn second
+ "Same as (first (next x))"
+ [coll]
+ (first (next coll)))
+
+(defn ffirst
+ "Same as (first (first x))"
+ [coll]
+ (first (first coll)))
+
+(defn nfirst
+ "Same as (next (first x))"
+ [coll]
+ (next (first coll)))
+
+(defn fnext
+ "Same as (first (next x))"
+ [coll]
+ (first (next coll)))
+
+(defn nnext
+ "Same as (next (next x))"
+ [coll]
+ (next (next coll)))
+
+(defn last
+ "Return the last item in coll, in linear time"
+ [s]
+ (let [sn (next s)]
+ (if-not (nil? sn)
+ (recur sn)
+ (first s))))
+
+(extend-type default
+ IEquiv
+ (-equiv [x o] (identical? x o)))
+
+(defn conj
+ "conj[oin]. Returns a new collection with the xs
+ 'added'. (conj nil item) returns (item). The 'addition' may
+ happen at different 'places' depending on the concrete type."
+ ([] [])
+ ([coll] coll)
+ ([coll x]
+ (if-not (nil? coll)
+ (-conj coll x)
+ (list x)))
+ ([coll x & xs]
+ (if xs
+ (recur (conj coll x) (first xs) (next xs))
+ (conj coll x))))
+
+(defn empty
+ "Returns an empty collection of the same category as coll, or nil"
+ [coll]
+ (when-not (nil? coll)
+ (-empty coll)))
+
+(defn- accumulating-seq-count [coll]
+ (loop [s (seq coll) acc 0]
+ (if (counted? s) ; assumes nil is counted, which it currently is
+ (+ acc (-count s))
+ (recur (next s) (inc acc)))))
+
+(defn count
+ "Returns the number of items in the collection. (count nil) returns
+ 0. Also works on strings, arrays, and Maps"
+ [coll]
+ (if-not (nil? coll)
+ (cond
+ (implements? ICounted coll)
+ (-count ^not-native coll)
+
+ (array? coll)
+ (alength coll)
+
+ (string? coll)
+ (alength coll)
+
+ (implements? ISeqable coll)
+ (accumulating-seq-count coll)
+
+ :else (-count coll))
+ 0))
+
+(defn- linear-traversal-nth
+ ([coll n]
+ (cond
+ (nil? coll) (throw (js/Error. "Index out of bounds"))
+ (zero? n) (if (seq coll)
+ (first coll)
+ (throw (js/Error. "Index out of bounds")))
+ (indexed? coll) (-nth coll n)
+ (seq coll) (recur (next coll) (dec n))
+ :else (throw (js/Error. "Index out of bounds"))))
+ ([coll n not-found]
+ (cond
+ (nil? coll) not-found
+ (zero? n) (if (seq coll)
+ (first coll)
+ not-found)
+ (indexed? coll) (-nth coll n not-found)
+ (seq coll) (recur (next coll) (dec n) not-found)
+ :else not-found)))
+
+(defn nth
+ "Returns the value at the index. get returns nil if index out of
+ bounds, nth throws an exception unless not-found is supplied. nth
+ also works for strings, arrays, regex Matchers and Lists, and,
+ in O(n) time, for sequences."
+ ([coll n]
+ (cond
+ (not (number? n))
+ (throw (js/Error. "Index argument to nth must be a number"))
+
+ (nil? coll)
+ coll
+
+ (implements? IIndexed coll)
+ (-nth ^not-native coll n)
+
+ (array? coll)
+ (if (and (>= n 0) (< n (.-length coll)))
+ (aget coll n)
+ (throw (js/Error. "Index out of bounds")))
+
+ (string? coll)
+ (if (and (>= n 0) (< n (.-length coll)))
+ (.charAt coll n)
+ (throw (js/Error. "Index out of bounds")))
+
+ (implements? ISeq coll)
+ (linear-traversal-nth coll n)
+
+ (native-satisfies? IIndexed coll)
+ (-nth coll n)
+
+ :else
+ (throw (js/Error. (str "nth not supported on this type "
+ (type->str (type coll)))))))
+ ([coll n not-found]
+ (cond
+ (not (number? n))
+ (throw (js/Error. "Index argument to nth must be a number."))
+
+ (nil? coll)
+ not-found
+
+ (implements? IIndexed coll)
+ (-nth ^not-native coll n not-found)
+
+ (array? coll)
+ (if (and (>= n 0) (< n (.-length coll)))
+ (aget coll n)
+ not-found)
+
+ (string? coll)
+ (if (and (>= n 0) (< n (.-length coll)))
+ (.charAt coll n)
+ not-found)
+
+ (implements? ISeq coll)
+ (linear-traversal-nth coll n not-found)
+
+ (native-satisfies? IIndexed coll)
+ (-nth coll n)
+
+ :else
+ (throw (js/Error. (str "nth not supported on this type "
+ (type->str (type coll))))))))
+
+(defn nthrest
+ "Returns the nth rest of coll, coll when n is 0."
+ [coll n]
+ (loop [n n xs coll]
+ (if (and (pos? n) (seq xs))
+ (recur (dec n) (rest xs))
+ xs)))
+
+(defn get
+ "Returns the value mapped to key, not-found or nil if key not present."
+ ([o k]
+ (when-not (nil? o)
+ (cond
+ (implements? ILookup o)
+ (-lookup ^not-native o k)
+
+ (array? o)
+ (when (and (some? k) (< k (.-length o)))
+ (aget o (int k)))
+
+ (string? o)
+ (when (and (some? k) (< k (.-length o)))
+ (.charAt o (int k)))
+
+ (native-satisfies? ILookup o)
+ (-lookup o k)
+
+ :else nil)))
+ ([o k not-found]
+ (if-not (nil? o)
+ (cond
+ (implements? ILookup o)
+ (-lookup ^not-native o k not-found)
+
+ (array? o)
+ (if (and (some? k) (>= k 0) (< k (.-length o)))
+ (aget o (int k))
+ not-found)
+
+ (string? o)
+ (if (and (some? k) (>= k 0) (< k (.-length o)))
+ (.charAt o (int k))
+ not-found)
+
+ (native-satisfies? ILookup o)
+ (-lookup o k not-found)
+
+ :else not-found)
+ not-found)))
+
+(declare PersistentHashMap)
+
+(defn assoc
+ "assoc[iate]. When applied to a map, returns a new map of the
+ same (hashed/sorted) type, that contains the mapping of key(s) to
+ val(s). When applied to a vector, returns a new vector that
+ contains val at index."
+ ([coll k v]
+ (if-not (nil? coll)
+ (-assoc coll k v)
+ (hash-map k v)))
+ ([coll k v & kvs]
+ (let [ret (assoc coll k v)]
+ (if kvs
+ (recur ret (first kvs) (second kvs) (nnext kvs))
+ ret))))
+
+(defn dissoc
+ "dissoc[iate]. Returns a new map of the same (hashed/sorted) type,
+ that does not contain a mapping for key(s)."
+ ([coll] coll)
+ ([coll k]
+ (when-not (nil? coll)
+ (-dissoc coll k)))
+ ([coll k & ks]
+ (when-not (nil? coll)
+ (let [ret (dissoc coll k)]
+ (if ks
+ (recur ret (first ks) (next ks))
+ ret)))))
+
+(defn ^boolean fn?
+ "Return true if f is a JavaScript function or satisfies the Fn protocol."
+ [f]
+ (or ^boolean (goog/isFunction f) (satisfies? Fn f)))
+
+(deftype MetaFn [afn meta]
+ IMeta
+ (-meta [_] meta)
+ IWithMeta
+ (-with-meta [_ new-meta]
+ (MetaFn. afn new-meta))
+ Fn
+ IFn
+ (-invoke [_]
+ (afn))
+ (-invoke [_ a]
+ (afn a))
+ (-invoke [_ a b]
+ (afn a b))
+ (-invoke [_ a b c]
+ (afn a b c))
+ (-invoke [_ a b c d]
+ (afn a b c d))
+ (-invoke [_ a b c d e]
+ (afn a b c d e))
+ (-invoke [_ a b c d e f]
+ (afn a b c d e f))
+ (-invoke [_ a b c d e f g]
+ (afn a b c d e f g))
+ (-invoke [_ a b c d e f g h]
+ (afn a b c d e f g h))
+ (-invoke [_ a b c d e f g h i]
+ (afn a b c d e f g h i))
+ (-invoke [_ a b c d e f g h i j]
+ (afn a b c d e f g h i j))
+ (-invoke [_ a b c d e f g h i j k]
+ (afn a b c d e f g h i j k))
+ (-invoke [_ a b c d e f g h i j k l]
+ (afn a b c d e f g h i j k l))
+ (-invoke [_ a b c d e f g h i j k l m]
+ (afn a b c d e f g h i j k l m))
+ (-invoke [_ a b c d e f g h i j k l m n]
+ (afn a b c d e f g h i j k l m n))
+ (-invoke [_ a b c d e f g h i j k l m n o]
+ (afn a b c d e f g h i j k l m n o))
+ (-invoke [_ a b c d e f g h i j k l m n o p]
+ (afn a b c d e f g h i j k l m n o p))
+ (-invoke [_ a b c d e f g h i j k l m n o p q]
+ (afn a b c d e f g h i j k l m n o p q))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r]
+ (afn a b c d e f g h i j k l m n o p q r))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s]
+ (afn a b c d e f g h i j k l m n o p q r s))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s t]
+ (afn a b c d e f g h i j k l m n o p q r s t))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s t rest]
+ (apply afn a b c d e f g h i j k l m n o p q r s t rest)))
+
+(defn with-meta
+ "Returns an object of the same type and value as obj, with
+ map m as its metadata."
+ [o meta]
+ (if ^boolean (goog/isFunction o)
+ (MetaFn. o meta)
+ (when-not (nil? o)
+ (-with-meta o meta))))
+
+(defn meta
+ "Returns the metadata of obj, returns nil if there is no metadata."
+ [o]
+ (when (and (not (nil? o))
+ (satisfies? IMeta o))
+ (-meta o)))
+
+(defn peek
+ "For a list or queue, same as first, for a vector, same as, but much
+ more efficient than, last. If the collection is empty, returns nil."
+ [coll]
+ (when-not (nil? coll)
+ (-peek coll)))
+
+(defn pop
+ "For a list or queue, returns a new list/queue without the first
+ item, for a vector, returns a new vector without the last item.
+ Note - not the same as next/butlast."
+ [coll]
+ (when-not (nil? coll)
+ (-pop coll)))
+
+(defn disj
+ "disj[oin]. Returns a new set of the same (hashed/sorted) type, that
+ does not contain key(s)."
+ ([coll] coll)
+ ([coll k]
+ (when-not (nil? coll)
+ (-disjoin coll k)))
+ ([coll k & ks]
+ (when-not (nil? coll)
+ (let [ret (disj coll k)]
+ (if ks
+ (recur ret (first ks) (next ks))
+ ret)))))
+
+(defn ^boolean empty?
+ "Returns true if coll has no items - same as (not (seq coll)).
+ Please use the idiom (seq x) rather than (not (empty? x))"
+ [coll] (or (nil? coll)
+ (not (seq coll))))
+
+(defn ^boolean coll?
+ "Returns true if x satisfies ICollection"
+ [x]
+ (if (nil? x)
+ false
+ (satisfies? ICollection x)))
+
+(defn ^boolean set?
+ "Returns true if x satisfies ISet"
+ [x]
+ (if (nil? x)
+ false
+ (satisfies? ISet x)))
+
+(defn ^boolean associative?
+ "Returns true if coll implements Associative"
+ [x] (satisfies? IAssociative x))
+
+(defn ^boolean sequential?
+ "Returns true if coll satisfies ISequential"
+ [x] (satisfies? ISequential x))
+
+(defn ^boolean sorted?
+ "Returns true if coll satisfies ISorted"
+ [x] (satisfies? ISorted x))
+
+(defn ^boolean reduceable?
+ "Returns true if coll satisfies IReduce"
+ [x] (satisfies? IReduce x))
+
+(defn ^boolean map?
+ "Return true if x satisfies IMap"
+ [x]
+ (if (nil? x)
+ false
+ (satisfies? IMap x)))
+
+(defn ^boolean record?
+ "Return true if x satisfies IRecord"
+ [x]
+ (satisfies? IRecord x))
+
+(defn ^boolean vector?
+ "Return true if x satisfies IVector"
+ [x] (satisfies? IVector x))
+
+(declare ChunkedCons ChunkedSeq)
+
+(defn ^boolean chunked-seq?
+ "Return true if x is satisfies IChunkedSeq."
+ [x] (implements? IChunkedSeq x))
+
+;;;;;;;;;;;;;;;;;;;; js primitives ;;;;;;;;;;;;
+(defn js-obj
+ "Create JavaSript object from an even number arguments representing
+ interleaved keys and values."
+ ([]
+ (cljs.core/js-obj))
+ ([& keyvals]
+ (apply gobject/create keyvals)))
+
+(defn js-keys
+ "Return the JavaScript keys for an object."
+ [obj]
+ (let [keys (array)]
+ (gobject/forEach obj (fn [val key obj] (.push keys key)))
+ keys))
+
+(defn js-delete
+ "Delete a property from a JavaScript object."
+ [obj key]
+ (cljs.core/js-delete obj key))
+
+(defn- array-copy
+ ([from i to j len]
+ (loop [i i j j len len]
+ (if (zero? len)
+ to
+ (do (aset to j (aget from i))
+ (recur (inc i) (inc j) (dec len)))))))
+
+(defn- array-copy-downward
+ ([from i to j len]
+ (loop [i (+ i (dec len)) j (+ j (dec len)) len len]
+ (if (zero? len)
+ to
+ (do (aset to j (aget from i))
+ (recur (dec i) (dec j) (dec len)))))))
+
+;;;;;;;;;;;;;;;; preds ;;;;;;;;;;;;;;;;;;
+
+(def ^:private lookup-sentinel (js-obj))
+
+(defn ^boolean false?
+ "Returns true if x is the value false, false otherwise."
+ [x] (cljs.core/false? x))
+
+(defn ^boolean true?
+ "Returns true if x is the value true, false otherwise."
+ [x] (cljs.core/true? x))
+
+(defn ^boolean boolean?
+ "Return true if x is a Boolean"
+ [x] (or (cljs.core/true? x) (cljs.core/false? x)))
+
+(defn ^boolean undefined?
+ "Returns true if x identical to the JavaScript undefined value."
+ [x]
+ (cljs.core/undefined? x))
+
+(defn ^boolean seq?
+ "Return true if s satisfies ISeq"
+ [s]
+ (if (nil? s)
+ false
+ (satisfies? ISeq s)))
+
+(defn ^boolean seqable?
+ "Return true if the seq function is supported for s"
+ [s]
+ (or
+ (satisfies? ISeqable s)
+ (array? s)
+ (string? s)))
+
+(defn ^boolean boolean
+ "Coerce to boolean"
+ [x]
+ (cond
+ (nil? x) false
+ (false? x) false
+ :else true))
+
+(defn ^boolean ifn?
+ "Returns true if f returns true for fn? or satisfies IFn."
+ [f]
+ (or (fn? f) (satisfies? IFn f)))
+
+(defn ^boolean integer?
+ "Returns true if n is a JavaScript number with no decimal part."
+ [n]
+ (and (number? n)
+ (not ^boolean (js/isNaN n))
+ (not (identical? n js/Infinity))
+ (== (js/parseFloat n) (js/parseInt n 10))))
+
+(defn ^boolean int?
+ "Return true if x satisfies integer? or is an instance of goog.math.Integer
+ or goog.math.Long."
+ [x]
+ (or (integer? x)
+ (instance? goog.math.Integer x)
+ (instance? goog.math.Long x)))
+
+(defn ^boolean pos-int?
+ "Return true if x satisfies int? and is positive."
+ [x]
+ (cond
+ (integer? x) (pos? x)
+
+ (instance? goog.math.Integer x)
+ (and (not (.isNegative x))
+ (not (.isZero x)))
+
+ (instance? goog.math.Long x)
+ (and (not (.isNegative x))
+ (not (.isZero x)))
+
+ :else false))
+
+(defn ^boolean neg-int?
+ "Return true if x satisfies int? and is positive."
+ [x]
+ (cond
+ (integer? x) (neg? x)
+
+ (instance? goog.math.Integer x)
+ (.isNegative x)
+
+ (instance? goog.math.Long x)
+ (.isNegative x)
+
+ :else false))
+
+(defn ^boolean nat-int?
+ "Return true if x satisfies int? and is a natural integer value."
+ [x]
+ (cond
+ (integer? x)
+ (or (not (neg? x)) (zero? x))
+
+ (instance? goog.math.Integer x)
+ (or (not (.isNegative x)) (.isZero x))
+
+ (instance? goog.math.Long x)
+ (or (not (.isNegative x)) (.isZero x))
+
+ :else false))
+
+(defn ^boolean float?
+ "Returns true for JavaScript numbers, false otherwise."
+ [x]
+ (number? x))
+
+(defn ^boolean double?
+ "Returns true for JavaScript numbers, false otherwise."
+ [x]
+ (number? x))
+
+(defn ^boolean infinite?
+ "Returns true for Infinity and -Infinity values."
+ [x]
+ (or (identical? x js/Number.POSITIVE_INFINITY)
+ (identical? x js/Number.NEGATIVE_INFINITY)))
+
+(defn ^boolean contains?
+ "Returns true if key is present in the given collection, otherwise
+ returns false. Note that for numerically indexed collections like
+ vectors and arrays, this tests if the numeric key is within the
+ range of indexes. 'contains?' operates constant or logarithmic time;
+ it will not perform a linear search for a value. See also 'some'."
+ [coll v]
+ (if (identical? (get coll v lookup-sentinel) lookup-sentinel)
+ false
+ true))
+
+(defn find
+ "Returns the map entry for key, or nil if key not present."
+ [coll k]
+ (when (and (not (nil? coll))
+ (associative? coll)
+ (contains? coll k))
+ [k (get coll k)]))
+
+(defn ^boolean distinct?
+ "Returns true if no two of the arguments are ="
+ ([x] true)
+ ([x y] (not (= x y)))
+ ([x y & more]
+ (if (not (= x y))
+ (loop [s #{x y} xs more]
+ (let [x (first xs)
+ etc (next xs)]
+ (if xs
+ (if (contains? s x)
+ false
+ (recur (conj s x) etc))
+ true)))
+ false)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Seq fns ;;;;;;;;;;;;;;;;
+
+(defn ^number compare
+ "Comparator. Returns a negative number, zero, or a positive number
+ when x is logically 'less than', 'equal to', or 'greater than'
+ y. Uses IComparable if available and google.array.defaultCompare for objects
+ of the same type and special-cases nil to be less than any other object."
+ [x y]
+ (cond
+ (identical? x y) 0
+
+ (nil? x) -1
+
+ (nil? y) 1
+
+ (number? x) (if (number? y)
+ (garray/defaultCompare x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y))))
+
+ (satisfies? IComparable x)
+ (-compare x y)
+
+ :else
+ (if (and (or (string? x) (array? x) (true? x) (false? x))
+ (identical? (type x) (type y)))
+ (garray/defaultCompare x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y))))))
+
+(defn ^:private compare-indexed
+ "Compare indexed collection."
+ ([xs ys]
+ (let [xl (count xs)
+ yl (count ys)]
+ (cond
+ (< xl yl) -1
+ (> xl yl) 1
+ (== xl 0) 0
+ :else (compare-indexed xs ys xl 0))))
+ ([xs ys len n]
+ (let [d (compare (nth xs n) (nth ys n))]
+ (if (and (zero? d) (< (+ n 1) len))
+ (recur xs ys len (inc n))
+ d))))
+
+(defn ^:private fn->comparator
+ "Given a fn that might be boolean valued or a comparator,
+ return a fn that is a comparator."
+ [f]
+ (if (= f compare)
+ compare
+ (fn [x y]
+ (let [r (f x y)]
+ (if (number? r)
+ r
+ (if r
+ -1
+ (if (f y x) 1 0)))))))
+
+(declare to-array)
+
+(defn sort
+ "Returns a sorted sequence of the items in coll. Comp can be
+ boolean-valued comparison function, or a -/0/+ valued comparator.
+ Comp defaults to compare."
+ ([coll]
+ (sort compare coll))
+ ([comp coll]
+ (if (seq coll)
+ (let [a (to-array coll)]
+ ;; matching Clojure's stable sort, though docs don't promise it
+ (garray/stableSort a (fn->comparator comp))
+ (seq a))
+ ())))
+
+(defn sort-by
+ "Returns a sorted sequence of the items in coll, where the sort
+ order is determined by comparing (keyfn item). Comp can be
+ boolean-valued comparison funcion, or a -/0/+ valued comparator.
+ Comp defaults to compare."
+ ([keyfn coll]
+ (sort-by keyfn compare coll))
+ ([keyfn comp coll]
+ (sort (fn [x y] ((fn->comparator comp) (keyfn x) (keyfn y))) coll)))
+
+; simple reduce based on seqs, used as default
+(defn- seq-reduce
+ ([f coll]
+ (if-let [s (seq coll)]
+ (reduce f (first s) (next s))
+ (f)))
+ ([f val coll]
+ (loop [val val, coll (seq coll)]
+ (if coll
+ (let [nval (f val (first coll))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (next coll))))
+ val))))
+
+(declare vec)
+
+(defn shuffle
+ "Return a random permutation of coll"
+ [coll]
+ (let [a (to-array coll)]
+ (garray/shuffle a)
+ (vec a)))
+
+(defn reduce
+ "f should be a function of 2 arguments. If val is not supplied,
+ returns the result of applying f to the first 2 items in coll, then
+ applying f to that result and the 3rd item, etc. If coll contains no
+ items, f must accept no arguments as well, and reduce returns the
+ result of calling f with no arguments. If coll has only 1 item, it
+ is returned and f is not called. If val is supplied, returns the
+ result of applying f to val and the first item in coll, then
+ applying f to that result and the 2nd item, etc. If coll contains no
+ items, returns val and f is not called."
+ ([f coll]
+ (cond
+ (implements? IReduce coll)
+ (-reduce ^not-native coll f)
+
+ (array? coll)
+ (array-reduce coll f)
+
+ (string? coll)
+ (array-reduce coll f)
+
+ (native-satisfies? IReduce coll)
+ (-reduce coll f)
+
+ :else
+ (seq-reduce f coll)))
+ ([f val coll]
+ (cond
+ (implements? IReduce coll)
+ (-reduce ^not-native coll f val)
+
+ (array? coll)
+ (array-reduce coll f val)
+
+ (string? coll)
+ (array-reduce coll f val)
+
+ (native-satisfies? IReduce coll)
+ (-reduce coll f val)
+
+ :else
+ (seq-reduce f val coll))))
+
+(defn reduce-kv
+ "Reduces an associative collection. f should be a function of 3
+ arguments. Returns the result of applying f to init, the first key
+ and the first value in coll, then applying f to that result and the
+ 2nd key and value, etc. If coll contains no entries, returns init
+ and f is not called. Note that reduce-kv is supported on vectors,
+ where the keys will be the ordinals."
+ ([f init coll]
+ (if-not (nil? coll)
+ (-kv-reduce coll f init)
+ init)))
+
+(defn identity
+ "Returns its argument."
+ [x] x)
+
+(defn completing
+ "Takes a reducing function f of 2 args and returns a fn suitable for
+ transduce by adding an arity-1 signature that calls cf (default -
+ identity) on the result argument."
+ ([f] (completing f identity))
+ ([f cf]
+ (fn
+ ([] (f))
+ ([x] (cf x))
+ ([x y] (f x y)))))
+
+(defn transduce
+ "reduce with a transformation of f (xf). If init is not
+ supplied, (f) will be called to produce it. f should be a reducing
+ step function that accepts both 1 and 2 arguments, if it accepts
+ only 2 you can add the arity-1 with 'completing'. Returns the result
+ of applying (the transformed) xf to init and the first item in coll,
+ then applying xf to that result and the 2nd item, etc. If coll
+ contains no items, returns init and f is not called. Note that
+ certain transforms may inject or skip items."
+ ([xform f coll] (transduce xform f (f) coll))
+ ([xform f init coll]
+ (let [f (xform f)
+ ret (reduce f init coll)]
+ (f ret))))
+
+;;; Math - variadic forms will not work until the following implemented:
+;;; first, next, reduce
+
+(defn ^number +
+ "Returns the sum of nums. (+) returns 0."
+ ([] 0)
+ ([x] x)
+ ([x y] (cljs.core/+ x y))
+ ([x y & more]
+ (reduce + (cljs.core/+ x y) more)))
+
+(defn ^number -
+ "If no ys are supplied, returns the negation of x, else subtracts
+ the ys from x and returns the result."
+ ([x] (cljs.core/- x))
+ ([x y] (cljs.core/- x y))
+ ([x y & more] (reduce - (cljs.core/- x y) more)))
+
+(defn ^number *
+ "Returns the product of nums. (*) returns 1."
+ ([] 1)
+ ([x] x)
+ ([x y] (cljs.core/* x y))
+ ([x y & more] (reduce * (cljs.core/* x y) more)))
+
+(declare divide)
+
+(defn ^number /
+ "If no denominators are supplied, returns 1/numerator,
+ else returns numerator divided by all of the denominators."
+ ([x] (/ 1 x))
+ ([x y] (cljs.core/divide x y)) ;; FIXME: waiting on cljs.core//
+ ([x y & more] (reduce / (/ x y) more)))
+
+(defn ^boolean <
+ "Returns non-nil if nums are in monotonically increasing order,
+ otherwise false."
+ ([x] true)
+ ([x y] (cljs.core/< x y))
+ ([x y & more]
+ (if (cljs.core/< x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (cljs.core/< y (first more)))
+ false)))
+
+(defn ^boolean <=
+ "Returns non-nil if nums are in monotonically non-decreasing order,
+ otherwise false."
+ ([x] true)
+ ([x y] (cljs.core/<= x y))
+ ([x y & more]
+ (if (cljs.core/<= x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (cljs.core/<= y (first more)))
+ false)))
+
+(defn ^boolean >
+ "Returns non-nil if nums are in monotonically decreasing order,
+ otherwise false."
+ ([x] true)
+ ([x y] (cljs.core/> x y))
+ ([x y & more]
+ (if (cljs.core/> x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (cljs.core/> y (first more)))
+ false)))
+
+(defn ^boolean >=
+ "Returns non-nil if nums are in monotonically non-increasing order,
+ otherwise false."
+ ([x] true)
+ ([x y] (cljs.core/>= x y))
+ ([x y & more]
+ (if (cljs.core/>= x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (cljs.core/>= y (first more)))
+ false)))
+
+(defn dec
+ "Returns a number one less than num."
+ [x] (- x 1))
+
+(defn ^number max
+ "Returns the greatest of the nums."
+ ([x] x)
+ ([x y] (cljs.core/max x y))
+ ([x y & more]
+ (reduce max (cljs.core/max x y) more)))
+
+(defn ^number min
+ "Returns the least of the nums."
+ ([x] x)
+ ([x y] (cljs.core/min x y))
+ ([x y & more]
+ (reduce min (cljs.core/min x y) more)))
+
+(defn ^number byte [x] x)
+
+(defn char
+ "Coerce to char"
+ [x]
+ (cond
+ (number? x) (.fromCharCode js/String x)
+ (and (string? x) (== (.-length x) 1)) x
+ :else (throw (js/Error. "Argument to char must be a character or number"))))
+
+(defn ^number short [x] x)
+(defn ^number float [x] x)
+(defn ^number double [x] x)
+
+(defn ^number unchecked-byte [x] x)
+(defn ^number unchecked-char [x] x)
+(defn ^number unchecked-short [x] x)
+(defn ^number unchecked-float [x] x)
+(defn ^number unchecked-double [x] x)
+
+(defn ^number unchecked-add
+ "Returns the sum of nums. (+) returns 0."
+ ([] 0)
+ ([x] x)
+ ([x y] (cljs.core/unchecked-add x y))
+ ([x y & more] (reduce unchecked-add (cljs.core/unchecked-add x y) more)))
+
+(defn ^number unchecked-add-int
+ "Returns the sum of nums. (+) returns 0."
+ ([] 0)
+ ([x] x)
+ ([x y] (cljs.core/unchecked-add-int x y))
+ ([x y & more] (reduce unchecked-add-int (cljs.core/unchecked-add-int x y) more)))
+
+(defn unchecked-dec
+ "Returns a number one less than x, an int."
+ [x]
+ (cljs.core/unchecked-dec x))
+
+(defn unchecked-dec-int
+ "Returns a number one less than x, an int."
+ [x]
+ (cljs.core/unchecked-dec-int x))
+
+(defn ^number unchecked-divide-int
+ "If no denominators are supplied, returns 1/numerator,
+ else returns numerator divided by all of the denominators."
+ ([x] (unchecked-divide-int 1 x))
+ ([x y] (cljs.core/divide x y)) ;; FIXME: waiting on cljs.core//
+ ([x y & more] (reduce unchecked-divide-int (unchecked-divide-int x y) more)))
+
+(defn unchecked-inc [x]
+ (cljs.core/unchecked-inc x))
+
+(defn unchecked-inc-int [x]
+ (cljs.core/unchecked-inc-int x))
+
+(defn ^number unchecked-multiply
+ "Returns the product of nums. (*) returns 1."
+ ([] 1)
+ ([x] x)
+ ([x y] (cljs.core/unchecked-multiply x y))
+ ([x y & more] (reduce unchecked-multiply (cljs.core/unchecked-multiply x y) more)))
+
+(defn ^number unchecked-multiply-int
+ "Returns the product of nums. (*) returns 1."
+ ([] 1)
+ ([x] x)
+ ([x y] (cljs.core/unchecked-multiply-int x y))
+ ([x y & more] (reduce unchecked-multiply-int (cljs.core/unchecked-multiply-int x y) more)))
+
+(defn unchecked-negate [x]
+ (cljs.core/unchecked-negate x))
+
+(defn unchecked-negate-int [x]
+ (cljs.core/unchecked-negate-int x))
+
+(declare mod)
+
+(defn unchecked-remainder-int [x n]
+ (cljs.core/unchecked-remainder-int x n))
+
+(defn ^number unchecked-subtract
+ "If no ys are supplied, returns the negation of x, else subtracts
+ the ys from x and returns the result."
+ ([x] (cljs.core/unchecked-subtract x))
+ ([x y] (cljs.core/unchecked-subtract x y))
+ ([x y & more] (reduce unchecked-subtract (cljs.core/unchecked-subtract x y) more)))
+
+(defn ^number unchecked-subtract-int
+ "If no ys are supplied, returns the negation of x, else subtracts
+ the ys from x and returns the result."
+ ([x] (cljs.core/unchecked-subtract-int x))
+ ([x y] (cljs.core/unchecked-subtract-int x y))
+ ([x y & more] (reduce unchecked-subtract-int (cljs.core/unchecked-subtract-int x y) more)))
+
+(defn- ^number fix [q]
+ (if (>= q 0)
+ (Math/floor q)
+ (Math/ceil q)))
+
+(defn int
+ "Coerce to int by stripping decimal places."
+ [x]
+ (bit-or x 0))
+
+(defn unchecked-int
+ "Coerce to int by stripping decimal places."
+ [x]
+ (fix x))
+
+(defn long
+ "Coerce to long by stripping decimal places. Identical to `int'."
+ [x]
+ (fix x))
+
+(defn unchecked-long
+ "Coerce to long by stripping decimal places. Identical to `int'."
+ [x]
+ (fix x))
+
+(defn booleans [x] x)
+(defn bytes [x] x)
+(defn chars [x] x)
+(defn shorts [x] x)
+(defn ints [x] x)
+(defn floats [x] x)
+(defn doubles [x] x)
+(defn longs [x] x)
+
+(defn js-mod
+ "Modulus of num and div with original javascript behavior. i.e. bug for negative numbers"
+ [n d]
+ (cljs.core/js-mod n d))
+
+(defn mod
+ "Modulus of num and div. Truncates toward negative infinity."
+ [n d]
+ (js-mod (+ (js-mod n d) d) d))
+
+(defn quot
+ "quot[ient] of dividing numerator by denominator."
+ [n d]
+ (let [rem (js-mod n d)]
+ (fix (/ (- n rem) d))))
+
+(defn rem
+ "remainder of dividing numerator by denominator."
+ [n d]
+ (let [q (quot n d)]
+ (- n (* d q))))
+
+(defn bit-xor
+ "Bitwise exclusive or"
+ ([x y] (cljs.core/bit-xor x y))
+ ([x y & more]
+ (reduce bit-xor (cljs.core/bit-xor x y) more)))
+
+(defn bit-and
+ "Bitwise and"
+ ([x y] (cljs.core/bit-and x y))
+ ([x y & more]
+ (reduce bit-and (cljs.core/bit-and x y) more)))
+
+(defn bit-or
+ "Bitwise or"
+ ([x y] (cljs.core/bit-or x y))
+ ([x y & more]
+ (reduce bit-or (cljs.core/bit-or x y) more)))
+
+(defn bit-and-not
+ "Bitwise and with complement"
+ ([x y] (cljs.core/bit-and-not x y))
+ ([x y & more]
+ (reduce bit-and-not (cljs.core/bit-and-not x y) more)))
+
+(defn bit-clear
+ "Clear bit at index n"
+ [x n]
+ (cljs.core/bit-clear x n))
+
+(defn bit-flip
+ "Flip bit at index n"
+ [x n]
+ (cljs.core/bit-flip x n))
+
+(defn bit-not
+ "Bitwise complement"
+ [x] (cljs.core/bit-not x))
+
+(defn bit-set
+ "Set bit at index n"
+ [x n]
+ (cljs.core/bit-set x n))
+
+(defn ^boolean bit-test
+ "Test bit at index n"
+ [x n]
+ (cljs.core/bit-test x n))
+
+(defn bit-shift-left
+ "Bitwise shift left"
+ [x n] (cljs.core/bit-shift-left x n))
+
+(defn bit-shift-right
+ "Bitwise shift right"
+ [x n] (cljs.core/bit-shift-right x n))
+
+(defn bit-shift-right-zero-fill
+ "DEPRECATED: Bitwise shift right with zero fill"
+ [x n] (cljs.core/bit-shift-right-zero-fill x n))
+
+(defn unsigned-bit-shift-right
+ "Bitwise shift right with zero fill"
+ [x n] (cljs.core/unsigned-bit-shift-right x n))
+
+(defn bit-count
+ "Counts the number of bits set in n"
+ [v]
+ (let [v (- v (bit-and (bit-shift-right v 1) 0x55555555))
+ v (+ (bit-and v 0x33333333) (bit-and (bit-shift-right v 2) 0x33333333))]
+ (bit-shift-right (* (bit-and (+ v (bit-shift-right v 4)) 0xF0F0F0F) 0x1010101) 24)))
+
+(defn ^boolean ==
+ "Returns non-nil if nums all have the equivalent
+ value, otherwise false. Behavior on non nums is
+ undefined."
+ ([x] true)
+ ([x y] (-equiv x y))
+ ([x y & more]
+ (if (== x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (== y (first more)))
+ false)))
+
+(defn ^boolean pos?
+ "Returns true if num is greater than zero, else false"
+ [x] (cljs.core/pos? x))
+
+(defn ^boolean zero?
+ "Returns true if num is zero, else false"
+ [x]
+ (cljs.core/zero? x))
+
+(defn ^boolean neg?
+ "Returns true if num is less than zero, else false"
+ [x] (cljs.core/neg? x))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; protocols for host types ;;;;;;
+
+(defn nthnext
+ "Returns the nth next of coll, (seq coll) when n is 0."
+ [coll n]
+ (loop [n n xs (seq coll)]
+ (if (and xs (pos? n))
+ (recur (dec n) (next xs))
+ xs)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;; basics ;;;;;;;;;;;;;;;;;;
+
+(defn str
+ "With no args, returns the empty string. With one arg x, returns
+ x.toString(). (str nil) returns the empty string. With more than
+ one arg, returns the concatenation of the str values of the args."
+ ([] "")
+ ([x] (if (nil? x)
+ ""
+ (.join #js [x] "")))
+ ([x & ys]
+ (loop [sb (StringBuffer. (str x)) more ys]
+ (if more
+ (recur (. sb (append (str (first more)))) (next more))
+ (.toString sb)))))
+
+(defn subs
+ "Returns the substring of s beginning at start inclusive, and ending
+ at end (defaults to length of string), exclusive."
+ ([s start] (.substring s start))
+ ([s start end] (.substring s start end)))
+
+(declare map name)
+
+(defn- equiv-sequential
+ "Assumes x is sequential. Returns true if x equals y, otherwise
+ returns false."
+ [x y]
+ (boolean
+ (when (sequential? y)
+ (if (and (counted? x) (counted? y)
+ (not (== (count x) (count y))))
+ false
+ (loop [xs (seq x) ys (seq y)]
+ (cond (nil? xs) (nil? ys)
+ (nil? ys) false
+ (= (first xs) (first ys)) (recur (next xs) (next ys))
+ :else false))))))
+
+(defn- hash-coll [coll]
+ (if (seq coll)
+ (loop [res (hash (first coll)) s (next coll)]
+ (if (nil? s)
+ res
+ (recur (hash-combine res (hash (first s))) (next s))))
+ 0))
+
+(declare key val)
+
+(defn- hash-imap [m]
+ ;; a la clojure.lang.APersistentMap
+ (loop [h 0 s (seq m)]
+ (if s
+ (let [e (first s)]
+ (recur (js-mod (+ h (bit-xor (hash (key e)) (hash (val e))))
+ 4503599627370496)
+ (next s)))
+ h)))
+
+(defn- hash-iset [s]
+ ;; a la clojure.lang.APersistentSet
+ (loop [h 0 s (seq s)]
+ (if s
+ (let [e (first s)]
+ (recur (js-mod (+ h (hash e)) 4503599627370496)
+ (next s)))
+ h)))
+
+(declare name chunk-first chunk-rest)
+
+(defn- extend-object!
+ "Takes a JavaScript object and a map of names to functions and
+ attaches said functions as methods on the object. Any references to
+ JavaScript's implicit this (via the this-as macro) will resolve to the
+ object that the function is attached."
+ [obj fn-map]
+ (doseq [[key-name f] fn-map]
+ (let [str-name (name key-name)]
+ (aset obj str-name f)))
+ obj)
+
+;;;;;;;;;;;;;;;; cons ;;;;;;;;;;;;;;;;
+(deftype List [meta first rest count ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x count))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IList
+
+ ICloneable
+ (-clone [_] (List. meta first rest count __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (List. meta first rest count __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ASeq
+ ISeq
+ (-first [coll] first)
+ (-rest [coll]
+ (if (== count 1)
+ ()
+ rest))
+
+ INext
+ (-next [coll]
+ (if (== count 1)
+ nil
+ rest))
+
+ IStack
+ (-peek [coll] first)
+ (-pop [coll] (-rest coll))
+
+ ICollection
+ (-conj [coll o] (List. meta o coll (inc count) nil))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ICounted
+ (-count [coll] count)
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(defn ^boolean list?
+ "Returns true if x implements IList"
+ [x]
+ (satisfies? IList x))
+
+(es6-iterable List)
+
+(deftype EmptyList [meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IList
+
+ ICloneable
+ (-clone [_] (EmptyList. meta))
+
+ IWithMeta
+ (-with-meta [coll meta] (EmptyList. meta))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll] nil)
+ (-rest [coll] ())
+
+ INext
+ (-next [coll] nil)
+
+ IStack
+ (-peek [coll] nil)
+ (-pop [coll] (throw (js/Error. "Can't pop empty list")))
+
+ ICollection
+ (-conj [coll o] (List. meta o nil 1 nil))
+
+ IEmptyableCollection
+ (-empty [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other]
+ (if (or (list? other)
+ (sequential? other))
+ (nil? (seq other))
+ false))
+
+ IHash
+ (-hash [coll] empty-ordered-hash)
+
+ ISeqable
+ (-seq [coll] nil)
+
+ ICounted
+ (-count [coll] 0)
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(set! (.-EMPTY List) (EmptyList. nil))
+
+(es6-iterable EmptyList)
+
+(defn ^boolean reversible?
+ "Returns true if coll satisfies? IReversible."
+ [coll]
+ (satisfies? IReversible coll))
+
+(defn ^seq rseq
+ "Returns, in constant time, a seq of the items in rev (which
+ can be a vector or sorted-map), in reverse order. If rev is empty returns nil"
+ [rev]
+ (-rseq rev))
+
+(defn reverse
+ "Returns a seq of the items in coll in reverse order. Not lazy."
+ [coll]
+ (if (reversible? coll)
+ (rseq coll)
+ (reduce conj () coll)))
+
+(defn list
+ "Creates a new list containing the items."
+ [& xs]
+ (let [arr (if (and (instance? IndexedSeq xs) (zero? (.-i xs)))
+ (.-arr xs)
+ (let [arr (array)]
+ (loop [^not-native xs xs]
+ (if-not (nil? xs)
+ (do
+ (.push arr (-first xs))
+ (recur (-next xs)))
+ arr))))]
+ (loop [i (alength arr) ^not-native r ()]
+ (if (> i 0)
+ (recur (dec i) (-conj r (aget arr (dec i))))
+ r))))
+
+(deftype Cons [meta first rest ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IList
+
+ ICloneable
+ (-clone [_] (Cons. meta first rest __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (Cons. meta first rest __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ASeq
+ ISeq
+ (-first [coll] first)
+ (-rest [coll] (if (nil? rest) () rest))
+
+ INext
+ (-next [coll]
+ (if (nil? rest) nil (seq rest)))
+
+ ICollection
+ (-conj [coll o] (Cons. nil o coll nil))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable Cons)
+
+(defn cons
+ "Returns a new seq where x is the first element and coll is the rest."
+ [x coll]
+ (if (or (nil? coll)
+ (implements? ISeq coll))
+ (Cons. nil x coll nil)
+ (Cons. nil x (seq coll) nil)))
+
+(defn hash-keyword [k]
+ (int (+ (hash-symbol k) 0x9e3779b9)))
+
+(defn- compare-keywords [a b]
+ (cond
+ (identical? (.-fqn a) (.-fqn b)) 0
+ (and (not (.-ns a)) (.-ns b)) -1
+ (.-ns a) (if-not (.-ns b)
+ 1
+ (let [nsc (garray/defaultCompare (.-ns a) (.-ns b))]
+ (if (== 0 nsc)
+ (garray/defaultCompare (.-name a) (.-name b))
+ nsc)))
+ :default (garray/defaultCompare (.-name a) (.-name b))))
+
+(deftype Keyword [ns name fqn ^:mutable _hash]
+ Object
+ (toString [_] (str ":" fqn))
+ (equiv [this other]
+ (-equiv this other))
+
+ IEquiv
+ (-equiv [_ other]
+ (if (instance? Keyword other)
+ (identical? fqn (.-fqn other))
+ false))
+ IFn
+ (-invoke [kw coll]
+ (get coll kw))
+ (-invoke [kw coll not-found]
+ (get coll kw not-found))
+
+ IHash
+ (-hash [this]
+ (caching-hash this hash-keyword _hash))
+
+ INamed
+ (-name [_] name)
+ (-namespace [_] ns)
+
+ IPrintWithWriter
+ (-pr-writer [o writer _] (-write writer (str ":" fqn))))
+
+(defn ^boolean keyword?
+ "Return true if x is a Keyword"
+ [x]
+ (instance? Keyword x))
+
+(defn ^boolean keyword-identical?
+ "Efficient test to determine that two keywords are identical."
+ [x y]
+ (if (identical? x y)
+ true
+ (if (and (keyword? x) (keyword? y))
+ (identical? (.-fqn x) (.-fqn y))
+ false)))
+
+(defn ^boolean symbol-identical?
+ "Efficient test to determine that two symbols are identical."
+ [x y]
+ (if (identical? x y)
+ true
+ (if (and (symbol? x) (symbol? y))
+ (identical? (.-str x) (.-str y))
+ false)))
+
+(defn namespace
+ "Returns the namespace String of a symbol or keyword, or nil if not present."
+ [x]
+ (if (implements? INamed x)
+ (-namespace ^not-native x)
+ (throw (js/Error. (str "Doesn't support namespace: " x)))))
+
+(defn ^boolean ident?
+ "Return true if x is a symbol or keyword"
+ [x] (or (keyword? x) (symbol? x)))
+
+(defn ^boolean simple-ident?
+ "Return true if x is a symbol or keyword without a namespace"
+ [x] (and (ident? x) (nil? (namespace x))))
+
+(defn ^boolean qualified-ident?
+ "Return true if x is a symbol or keyword with a namespace"
+ [x] (and (ident? x) (namespace x) true))
+
+(defn ^boolean simple-symbol?
+ "Return true if x is a symbol without a namespace"
+ [x] (and (symbol? x) (nil? (namespace x))))
+
+(defn ^boolean qualified-symbol?
+ "Return true if x is a symbol with a namespace"
+ [x] (and (symbol? x) (namespace x) true))
+
+(defn ^boolean simple-keyword?
+ "Return true if x is a keyword without a namespace"
+ [x] (and (keyword? x) (nil? (namespace x))))
+
+(defn ^boolean qualified-keyword?
+ "Return true if x is a keyword with a namespace"
+ [x] (and (keyword? x) (namespace x) true))
+
+(defn keyword
+ "Returns a Keyword with the given namespace and name. Do not use :
+ in the keyword strings, it will be added automatically."
+ ([name] (cond
+ (keyword? name) name
+ (symbol? name) (Keyword.
+ (cljs.core/namespace name)
+ (cljs.core/name name) (.-str name) nil)
+ (string? name) (let [parts (.split name "/")]
+ (if (== (alength parts) 2)
+ (Keyword. (aget parts 0) (aget parts 1) name nil)
+ (Keyword. nil (aget parts 0) name nil)))))
+ ([ns name]
+ (let [ns (cond
+ (keyword? ns) (cljs.core/name ns)
+ (symbol? ns) (cljs.core/name ns)
+ :else ns)
+ name (cond
+ (keyword? name) (cljs.core/name name)
+ (symbol? name) (cljs.core/name name)
+ :else name)]
+ (Keyword. ns name (str (when ns (str ns "/")) name) nil))))
+
+
+(deftype LazySeq [meta ^:mutable fn ^:mutable s ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (sval [coll]
+ (if (nil? fn)
+ s
+ (do
+ (set! s (fn))
+ (set! fn nil)
+ s)))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IPending
+ (-realized? [coll]
+ (not fn))
+
+ IWithMeta
+ (-with-meta [coll meta] (LazySeq. meta fn s __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll]
+ (-seq coll)
+ (when-not (nil? s)
+ (first s)))
+ (-rest [coll]
+ (-seq coll)
+ (if-not (nil? s)
+ (rest s)
+ ()))
+
+ INext
+ (-next [coll]
+ (-seq coll)
+ (when-not (nil? s)
+ (next s)))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (.sval coll)
+ (when-not (nil? s)
+ (loop [ls s]
+ (if (instance? LazySeq ls)
+ (recur (.sval ls))
+ (do (set! s ls)
+ (seq s))))))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable LazySeq)
+
+(declare ArrayChunk)
+
+(deftype ChunkBuffer [^:mutable buf ^:mutable end]
+ Object
+ (add [_ o]
+ (aset buf end o)
+ (set! end (inc end)))
+
+ (chunk [_ o]
+ (let [ret (ArrayChunk. buf 0 end)]
+ (set! buf nil)
+ ret))
+
+ ICounted
+ (-count [_] end))
+
+(defn chunk-buffer [capacity]
+ (ChunkBuffer. (make-array capacity) 0))
+
+(deftype ArrayChunk [arr off end]
+ ICounted
+ (-count [_] (- end off))
+
+ IIndexed
+ (-nth [coll i]
+ (aget arr (+ off i)))
+ (-nth [coll i not-found]
+ (if (and (>= i 0) (< i (- end off)))
+ (aget arr (+ off i))
+ not-found))
+
+ IChunk
+ (-drop-first [coll]
+ (if (== off end)
+ (throw (js/Error. "-drop-first of empty chunk"))
+ (ArrayChunk. arr (inc off) end)))
+
+ IReduce
+ (-reduce [coll f]
+ (array-reduce arr f (aget arr off) (inc off)))
+ (-reduce [coll f start]
+ (array-reduce arr f start off)))
+
+(defn array-chunk
+ ([arr]
+ (ArrayChunk. arr 0 (alength arr)))
+ ([arr off]
+ (ArrayChunk. arr off (alength arr)))
+ ([arr off end]
+ (ArrayChunk. arr off end)))
+
+(deftype ChunkedCons [chunk more meta ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IWithMeta
+ (-with-meta [coll m]
+ (ChunkedCons. chunk more m __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ASeq
+ ISeq
+ (-first [coll] (-nth chunk 0))
+ (-rest [coll]
+ (if (> (-count chunk) 1)
+ (ChunkedCons. (-drop-first chunk) more meta nil)
+ (if (nil? more)
+ ()
+ more)))
+
+ INext
+ (-next [coll]
+ (if (> (-count chunk) 1)
+ (ChunkedCons. (-drop-first chunk) more meta nil)
+ (let [more (-seq more)]
+ (when-not (nil? more)
+ more))))
+
+ IChunkedSeq
+ (-chunked-first [coll] chunk)
+ (-chunked-rest [coll]
+ (if (nil? more)
+ ()
+ more))
+
+ IChunkedNext
+ (-chunked-next [coll]
+ (if (nil? more)
+ nil
+ more))
+
+ ICollection
+ (-conj [this o]
+ (cons o this))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) meta))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash)))
+
+(es6-iterable ChunkedCons)
+
+(defn chunk-cons [chunk rest]
+ (if (zero? (-count chunk))
+ rest
+ (ChunkedCons. chunk rest nil nil)))
+
+(defn chunk-append [b x]
+ (.add b x))
+
+(defn chunk [b]
+ (.chunk b))
+
+(defn chunk-first [s]
+ (-chunked-first s))
+
+(defn chunk-rest [s]
+ (-chunked-rest s))
+
+(defn chunk-next [s]
+ (if (implements? IChunkedNext s)
+ (-chunked-next s)
+ (seq (-chunked-rest s))))
+
+;;;;;;;;;;;;;;;;
+
+(defn to-array
+ "Naive impl of to-array as a start."
+ [s]
+ (let [ary (array)]
+ (loop [s s]
+ (if (seq s)
+ (do (. ary push (first s))
+ (recur (next s)))
+ ary))))
+
+(defn to-array-2d
+ "Returns a (potentially-ragged) 2-dimensional array
+ containing the contents of coll."
+ [coll]
+ (let [ret (make-array (count coll))]
+ (loop [i 0 xs (seq coll)]
+ (when xs
+ (aset ret i (to-array (first xs)))
+ (recur (inc i) (next xs))))
+ ret))
+
+(defn int-array
+ "Creates an array of ints. Does not coerce array, provided for compatibility
+ with Clojure."
+ ([size-or-seq]
+ (if (number? size-or-seq)
+ (int-array size-or-seq nil)
+ (into-array size-or-seq)))
+ ([size init-val-or-seq]
+ (let [a (make-array size)]
+ (if (seq? init-val-or-seq)
+ (let [s (seq init-val-or-seq)]
+ (loop [i 0 s s]
+ (if (and s (< i size))
+ (do
+ (aset a i (first s))
+ (recur (inc i) (next s)))
+ a)))
+ (do
+ (dotimes [i size]
+ (aset a i init-val-or-seq))
+ a)))))
+
+(defn long-array
+ "Creates an array of longs. Does not coerce array, provided for compatibility
+ with Clojure."
+ ([size-or-seq]
+ (if (number? size-or-seq)
+ (long-array size-or-seq nil)
+ (into-array size-or-seq)))
+ ([size init-val-or-seq]
+ (let [a (make-array size)]
+ (if (seq? init-val-or-seq)
+ (let [s (seq init-val-or-seq)]
+ (loop [i 0 s s]
+ (if (and s (< i size))
+ (do
+ (aset a i (first s))
+ (recur (inc i) (next s)))
+ a)))
+ (do
+ (dotimes [i size]
+ (aset a i init-val-or-seq))
+ a)))))
+
+(defn double-array
+ "Creates an array of doubles. Does not coerce array, provided for compatibility
+ with Clojure."
+ ([size-or-seq]
+ (if (number? size-or-seq)
+ (double-array size-or-seq nil)
+ (into-array size-or-seq)))
+ ([size init-val-or-seq]
+ (let [a (make-array size)]
+ (if (seq? init-val-or-seq)
+ (let [s (seq init-val-or-seq)]
+ (loop [i 0 s s]
+ (if (and s (< i size))
+ (do
+ (aset a i (first s))
+ (recur (inc i) (next s)))
+ a)))
+ (do
+ (dotimes [i size]
+ (aset a i init-val-or-seq))
+ a)))))
+
+(defn object-array
+ "Creates an array of objects. Does not coerce array, provided for compatibility
+ with Clojure."
+ ([size-or-seq]
+ (if (number? size-or-seq)
+ (object-array size-or-seq nil)
+ (into-array size-or-seq)))
+ ([size init-val-or-seq]
+ (let [a (make-array size)]
+ (if (seq? init-val-or-seq)
+ (let [s (seq init-val-or-seq)]
+ (loop [i 0 s s]
+ (if (and s (< i size))
+ (do
+ (aset a i (first s))
+ (recur (inc i) (next s)))
+ a)))
+ (do
+ (dotimes [i size]
+ (aset a i init-val-or-seq))
+ a)))))
+
+(defn bounded-count
+ "If coll is counted? returns its count, else will count at most the first n
+ elements of coll using its seq"
+ {:added "1.9"}
+ [n coll]
+ (if (counted? coll)
+ (count coll)
+ (loop [i 0 s (seq coll)]
+ (if (and (not (nil? s)) (< i n))
+ (recur (inc i) (next s))
+ i))))
+
+(defn spread
+ [arglist]
+ (cond
+ (nil? arglist) nil
+ (nil? (next arglist)) (seq (first arglist))
+ :else (cons (first arglist)
+ (spread (next arglist)))))
+
+(defn concat
+ "Returns a lazy seq representing the concatenation of the elements in the supplied colls."
+ ([] (lazy-seq nil))
+ ([x] (lazy-seq x))
+ ([x y]
+ (lazy-seq
+ (let [s (seq x)]
+ (if s
+ (if (chunked-seq? s)
+ (chunk-cons (chunk-first s) (concat (chunk-rest s) y))
+ (cons (first s) (concat (rest s) y)))
+ y))))
+ ([x y & zs]
+ (let [cat (fn cat [xys zs]
+ (lazy-seq
+ (let [xys (seq xys)]
+ (if xys
+ (if (chunked-seq? xys)
+ (chunk-cons (chunk-first xys)
+ (cat (chunk-rest xys) zs))
+ (cons (first xys) (cat (rest xys) zs)))
+ (when zs
+ (cat (first zs) (next zs)))))))]
+ (cat (concat x y) zs))))
+
+(defn list*
+ "Creates a new list containing the items prepended to the rest, the
+ last of which will be treated as a sequence."
+ ([args] (seq args))
+ ([a args] (cons a args))
+ ([a b args] (cons a (cons b args)))
+ ([a b c args] (cons a (cons b (cons c args))))
+ ([a b c d & more]
+ (cons a (cons b (cons c (cons d (spread more)))))))
+
+
+;;; Transients
+
+(defn transient
+ "Returns a new, transient version of the collection, in constant time."
+ [coll]
+ (-as-transient coll))
+
+(defn persistent!
+ "Returns a new, persistent version of the transient collection, in
+ constant time. The transient collection cannot be used after this
+ call, any such use will throw an exception."
+ [tcoll]
+ (-persistent! tcoll))
+
+(defn conj!
+ "Adds val to the transient collection, and return tcoll. The 'addition'
+ may happen at different 'places' depending on the concrete type."
+ ([] (transient []))
+ ([tcoll] tcoll)
+ ([tcoll val]
+ (-conj! tcoll val))
+ ([tcoll val & vals]
+ (let [ntcoll (-conj! tcoll val)]
+ (if vals
+ (recur ntcoll (first vals) (next vals))
+ ntcoll))))
+
+(defn assoc!
+ "When applied to a transient map, adds mapping of key(s) to
+ val(s). When applied to a transient vector, sets the val at index.
+ Note - index must be <= (count vector). Returns coll."
+ ([tcoll key val]
+ (-assoc! tcoll key val))
+ ([tcoll key val & kvs]
+ (let [ntcoll (-assoc! tcoll key val)]
+ (if kvs
+ (recur ntcoll (first kvs) (second kvs) (nnext kvs))
+ ntcoll))))
+
+(defn dissoc!
+ "Returns a transient map that doesn't contain a mapping for key(s)."
+ ([tcoll key]
+ (-dissoc! tcoll key))
+ ([tcoll key & ks]
+ (let [ntcoll (-dissoc! tcoll key)]
+ (if ks
+ (recur ntcoll (first ks) (next ks))
+ ntcoll))))
+
+(defn pop!
+ "Removes the last item from a transient vector. If
+ the collection is empty, throws an exception. Returns tcoll"
+ [tcoll]
+ (-pop! tcoll))
+
+(defn disj!
+ "disj[oin]. Returns a transient set of the same (hashed/sorted) type, that
+ does not contain key(s)."
+ ([tcoll val]
+ (-disjoin! tcoll val))
+ ([tcoll val & vals]
+ (let [ntcoll (-disjoin! tcoll val)]
+ (if vals
+ (recur ntcoll (first vals) (next vals))
+ ntcoll))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; apply ;;;;;;;;;;;;;;;;
+
+;; see core.clj
+(gen-apply-to)
+
+(set! *unchecked-if* true)
+(defn apply
+ "Applies fn f to the argument list formed by prepending intervening arguments to args."
+ ([f args]
+ (let [fixed-arity (.-cljs$lang$maxFixedArity f)]
+ (if (.-cljs$lang$applyTo f)
+ (let [bc (bounded-count (inc fixed-arity) args)]
+ (if (<= bc fixed-arity)
+ (apply-to f bc args)
+ (.cljs$lang$applyTo f args)))
+ (.apply f f (to-array args)))))
+ ([f x args]
+ (let [arglist (list* x args)
+ fixed-arity (.-cljs$lang$maxFixedArity f)]
+ (if (.-cljs$lang$applyTo f)
+ (let [bc (bounded-count (inc fixed-arity) arglist)]
+ (if (<= bc fixed-arity)
+ (apply-to f bc arglist)
+ (.cljs$lang$applyTo f arglist)))
+ (.apply f f (to-array arglist)))))
+ ([f x y args]
+ (let [arglist (list* x y args)
+ fixed-arity (.-cljs$lang$maxFixedArity f)]
+ (if (.-cljs$lang$applyTo f)
+ (let [bc (bounded-count (inc fixed-arity) arglist)]
+ (if (<= bc fixed-arity)
+ (apply-to f bc arglist)
+ (.cljs$lang$applyTo f arglist)))
+ (.apply f f (to-array arglist)))))
+ ([f x y z args]
+ (let [arglist (list* x y z args)
+ fixed-arity (.-cljs$lang$maxFixedArity f)]
+ (if (.-cljs$lang$applyTo f)
+ (let [bc (bounded-count (inc fixed-arity) arglist)]
+ (if (<= bc fixed-arity)
+ (apply-to f bc arglist)
+ (.cljs$lang$applyTo f arglist)))
+ (.apply f f (to-array arglist)))))
+ ([f a b c d & args]
+ (let [arglist (cons a (cons b (cons c (cons d (spread args)))))
+ fixed-arity (.-cljs$lang$maxFixedArity f)]
+ (if (.-cljs$lang$applyTo f)
+ (let [bc (bounded-count (inc fixed-arity) arglist)]
+ (if (<= bc fixed-arity)
+ (apply-to f bc arglist)
+ (.cljs$lang$applyTo f arglist)))
+ (.apply f f (to-array arglist))))))
+(set! *unchecked-if* false)
+
+(defn vary-meta
+ "Returns an object of the same type and value as obj, with
+ (apply f (meta obj) args) as its metadata."
+ ([obj f]
+ (with-meta obj (f (meta obj))))
+ ([obj f a]
+ (with-meta obj (f (meta obj) a)))
+ ([obj f a b]
+ (with-meta obj (f (meta obj) a b)))
+ ([obj f a b c]
+ (with-meta obj (f (meta obj) a b c)))
+ ([obj f a b c d]
+ (with-meta obj (f (meta obj) a b c d)))
+ ([obj f a b c d & args]
+ (with-meta obj (apply f (meta obj) a b c d args))))
+
+(defn ^boolean not=
+ "Same as (not (= obj1 obj2))"
+ ([x] false)
+ ([x y] (not (= x y)))
+ ([x y & more]
+ (not (apply = x y more))))
+
+(defn not-empty
+ "If coll is empty, returns nil, else coll"
+ [coll] (when (seq coll) coll))
+
+(defn nil-iter []
+ (reify
+ Object
+ (hasNext [_] false)
+ (next [_] (js/Error. "No such element"))
+ (remove [_] (js/Error. "Unsupported operation"))))
+
+(deftype StringIter [s ^:mutable i]
+ Object
+ (hasNext [_] (< i (alength s)))
+ (next [_]
+ (let [ret (.charAt s i)]
+ (set! i (inc i))
+ ret))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(defn string-iter [x]
+ (StringIter. x 0))
+
+(deftype ArrayIter [arr ^:mutable i]
+ Object
+ (hasNext [_] (< i (alength arr)))
+ (next [_]
+ (let [ret (aget arr i)]
+ (set! i (inc i))
+ ret))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(defn array-iter [x]
+ (ArrayIter. x 0))
+
+(def INIT #js {})
+(def START #js {})
+
+(deftype SeqIter [^:mutable _seq ^:mutable _next]
+ Object
+ (hasNext [_]
+ (if (identical? _seq INIT)
+ (do
+ (set! _seq START)
+ (set! _next (seq _next)))
+ (if (identical? _seq _next)
+ (set! _next (next _seq))))
+ (not (nil? _next)))
+ (next [this]
+ (if-not ^boolean (.hasNext this)
+ (throw (js/Error. "No such element"))
+ (do
+ (set! _seq _next)
+ (first _next))))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(defn seq-iter [coll]
+ (SeqIter. INIT coll))
+
+(defn iter [coll]
+ (cond
+ (nil? coll) (nil-iter)
+ (string? coll) (string-iter coll)
+ (array? coll) (array-iter coll)
+ (iterable? coll) (-iterator coll)
+ (seqable? coll) (seq-iter coll)
+ :else (throw (js/Error. (str "Cannot create iterator from " coll)))))
+
+(declare LazyTransformer)
+
+(defn lazy-transformer [stepper]
+ (LazyTransformer. stepper nil nil nil))
+
+(deftype Stepper [xform iter]
+ Object
+ (step [this lt]
+ (loop []
+ (if (and (not (nil? (.-stepper lt)))
+ (.hasNext iter))
+ (if (reduced? (xform lt (.next iter)))
+ (when-not (nil? (.-rest lt))
+ (set! (.. lt -rest -stepper) nil))
+ (recur))))
+ (when-not (nil? (.-stepper lt))
+ (xform lt))))
+
+(defn stepper [xform iter]
+ (letfn [(stepfn
+ ([result]
+ (let [lt (if (reduced? result)
+ @result
+ result)]
+ (set! (.-stepper lt) nil)
+ result))
+ ([result input]
+ (let [lt result]
+ (set! (.-first lt) input)
+ (set! (.-rest lt) (lazy-transformer (.-stepper lt)))
+ (set! (.-stepper lt) nil)
+ (.-rest lt))))]
+ (Stepper. (xform stepfn) iter)))
+
+(deftype MultiStepper [xform iters nexts]
+ Object
+ (hasNext [_]
+ (loop [iters (seq iters)]
+ (if-not (nil? iters)
+ (let [iter (first iters)]
+ (if-not ^boolean (.hasNext iter)
+ false
+ (recur (next iters))))
+ true)))
+ (next [_]
+ (dotimes [i (alength iters)]
+ (aset nexts i (.next (aget iters i))))
+ (prim-seq nexts 0))
+ (step [this lt]
+ (loop []
+ (if (and (not (nil? (.-stepper lt)))
+ (.hasNext this))
+ (if (reduced? (apply xform (cons lt (.next this))))
+ (when-not (nil? (.-rest lt))
+ (set! (.. lt -rest -stepper) nil))
+ (recur))))
+ (when-not (nil? (.-stepper lt))
+ (xform lt))))
+
+(defn multi-stepper
+ ([xform iters]
+ (multi-stepper xform iters
+ (make-array (alength iters))))
+ ([xform iters nexts]
+ (letfn [(stepfn
+ ([result]
+ (let [lt (if (reduced? result)
+ @result
+ result)]
+ (set! (.-stepper lt) nil)
+ lt))
+ ([result input]
+ (let [lt result]
+ (set! (.-first lt) input)
+ (set! (.-rest lt) (lazy-transformer (.-stepper lt)))
+ (set! (.-stepper lt) nil)
+ (.-rest lt))))]
+ (MultiStepper. (xform stepfn) iters nexts))))
+
+(deftype LazyTransformer [^:mutable stepper ^:mutable first ^:mutable rest meta]
+ Object
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IWithMeta
+ (-with-meta [this new-meta]
+ (LazyTransformer. stepper first rest new-meta))
+
+ IMeta
+ (-meta [this] meta)
+
+ ICollection
+ (-conj [this o]
+ (cons o (-seq this)))
+
+ IEmptyableCollection
+ (-empty [this]
+ ())
+
+ ISequential
+ IEquiv
+ (-equiv [this other]
+ (let [s (-seq this)]
+ (if-not (nil? s)
+ (equiv-sequential this other)
+ (and (sequential? other)
+ (nil? (seq other))))))
+
+ IHash
+ (-hash [this]
+ (hash-ordered-coll this))
+
+ ISeqable
+ (-seq [this]
+ (when-not (nil? stepper)
+ (.step stepper this))
+ (if (nil? rest)
+ nil
+ this))
+
+ ISeq
+ (-first [this]
+ (when-not (nil? stepper)
+ (-seq this))
+ (if (nil? rest)
+ nil
+ first))
+
+ (-rest [this]
+ (when-not (nil? stepper)
+ (-seq this))
+ (if (nil? rest)
+ ()
+ rest))
+
+ INext
+ (-next [this]
+ (when-not (nil? stepper)
+ (-seq this))
+ (if (nil? rest)
+ nil
+ (-seq rest))))
+
+(es6-iterable LazyTransformer)
+
+(set! (.-create LazyTransformer)
+ (fn [xform coll]
+ (LazyTransformer. (stepper xform (iter coll)) nil nil nil)))
+
+(set! (.-createMulti LazyTransformer)
+ (fn [xform colls]
+ (let [iters (array)]
+ (doseq [coll colls]
+ (.push iters (iter coll)))
+ (LazyTransformer.
+ (multi-stepper xform iters (make-array (alength iters)))
+ nil nil nil))))
+
+(defn sequence
+ "Coerces coll to a (possibly empty) sequence, if it is not already
+ one. Will not force a lazy seq. (sequence nil) yields (), When a
+ transducer is supplied, returns a lazy sequence of applications of
+ the transform to the items in coll(s), i.e. to the set of first
+ items of each coll, followed by the set of second
+ items in each coll, until any one of the colls is exhausted. Any
+ remaining items in other colls are ignored. The transform should accept
+ number-of-colls arguments"
+ ([coll]
+ (if (seq? coll)
+ coll
+ (or (seq coll) ())))
+ ([xform coll]
+ (.create LazyTransformer xform coll))
+ ([xform coll & colls]
+ (.createMulti LazyTransformer xform (to-array (cons coll colls)))))
+
+(defn ^boolean every?
+ "Returns true if (pred x) is logical true for every x in coll, else
+ false."
+ [pred coll]
+ (cond
+ (nil? (seq coll)) true
+ (pred (first coll)) (recur pred (next coll))
+ :else false))
+
+(defn ^boolean not-every?
+ "Returns false if (pred x) is logical true for every x in
+ coll, else true."
+ [pred coll] (not (every? pred coll)))
+
+(defn some
+ "Returns the first logical true value of (pred x) for any x in coll,
+ else nil. One common idiom is to use a set as pred, for example
+ this will return :fred if :fred is in the sequence, otherwise nil:
+ (some #{:fred} coll)"
+ [pred coll]
+ (when (seq coll)
+ (or (pred (first coll)) (recur pred (next coll)))))
+
+(defn ^boolean not-any?
+ "Returns false if (pred x) is logical true for any x in coll,
+ else true."
+ [pred coll] (not (some pred coll)))
+
+(defn ^boolean even?
+ "Returns true if n is even, throws an exception if n is not an integer"
+ [n] (if (integer? n)
+ (zero? (bit-and n 1))
+ (throw (js/Error. (str "Argument must be an integer: " n)))))
+
+(defn ^boolean odd?
+ "Returns true if n is odd, throws an exception if n is not an integer"
+ [n] (not (even? n)))
+
+(defn ^boolean complement
+ "Takes a fn f and returns a fn that takes the same arguments as f,
+ has the same effects, if any, and returns the opposite truth value."
+ [f]
+ (fn
+ ([] (not (f)))
+ ([x] (not (f x)))
+ ([x y] (not (f x y)))
+ ([x y & zs] (not (apply f x y zs)))))
+
+(defn constantly
+ "Returns a function that takes any number of arguments and returns x."
+ [x] (fn [& args] x))
+
+(defn comp
+ "Takes a set of functions and returns a fn that is the composition
+ of those fns. The returned fn takes a variable number of args,
+ applies the rightmost of fns to the args, the next
+ fn (right-to-left) to the result, etc."
+ ([] identity)
+ ([f] f)
+ ([f g]
+ (fn
+ ([] (f (g)))
+ ([x] (f (g x)))
+ ([x y] (f (g x y)))
+ ([x y z] (f (g x y z)))
+ ([x y z & args] (f (apply g x y z args)))))
+ ([f g h]
+ (fn
+ ([] (f (g (h))))
+ ([x] (f (g (h x))))
+ ([x y] (f (g (h x y))))
+ ([x y z] (f (g (h x y z))))
+ ([x y z & args] (f (g (apply h x y z args))))))
+ ([f1 f2 f3 & fs]
+ (let [fs (reverse (list* f1 f2 f3 fs))]
+ (fn [& args]
+ (loop [ret (apply (first fs) args) fs (next fs)]
+ (if fs
+ (recur ((first fs) ret) (next fs))
+ ret))))))
+
+(defn partial
+ "Takes a function f and fewer than the normal arguments to f, and
+ returns a fn that takes a variable number of additional args. When
+ called, the returned function calls f with args + additional args."
+ ([f] f)
+ ([f arg1]
+ (fn
+ ([] (f arg1))
+ ([x] (f arg1 x))
+ ([x y] (f arg1 x y))
+ ([x y z] (f arg1 x y z))
+ ([x y z & args] (apply f arg1 x y z args))))
+ ([f arg1 arg2]
+ (fn
+ ([] (f arg1 arg2))
+ ([x] (f arg1 arg2 x))
+ ([x y] (f arg1 arg2 x y))
+ ([x y z] (f arg1 arg2 x y z))
+ ([x y z & args] (apply f arg1 arg2 x y z args))))
+ ([f arg1 arg2 arg3]
+ (fn
+ ([] (f arg1 arg2 arg3))
+ ([x] (f arg1 arg2 arg3 x))
+ ([x y] (f arg1 arg2 arg3 x y))
+ ([x y z] (f arg1 arg2 arg3 x y z))
+ ([x y z & args] (apply f arg1 arg2 arg3 x y z args))))
+ ([f arg1 arg2 arg3 & more]
+ (fn [& args] (apply f arg1 arg2 arg3 (concat more args)))))
+
+(defn fnil
+ "Takes a function f, and returns a function that calls f, replacing
+ a nil first argument to f with the supplied value x. Higher arity
+ versions can replace arguments in the second and third
+ positions (y, z). Note that the function f can take any number of
+ arguments, not just the one(s) being nil-patched."
+ ([f x]
+ (fn
+ ([a] (f (if (nil? a) x a)))
+ ([a b] (f (if (nil? a) x a) b))
+ ([a b c] (f (if (nil? a) x a) b c))
+ ([a b c & ds] (apply f (if (nil? a) x a) b c ds))))
+ ([f x y]
+ (fn
+ ([a b] (f (if (nil? a) x a) (if (nil? b) y b)))
+ ([a b c] (f (if (nil? a) x a) (if (nil? b) y b) c))
+ ([a b c & ds] (apply f (if (nil? a) x a) (if (nil? b) y b) c ds))))
+ ([f x y z]
+ (fn
+ ([a b] (f (if (nil? a) x a) (if (nil? b) y b)))
+ ([a b c] (f (if (nil? a) x a) (if (nil? b) y b) (if (nil? c) z c)))
+ ([a b c & ds] (apply f (if (nil? a) x a) (if (nil? b) y b) (if (nil? c) z c) ds)))))
+
+(declare volatile!)
+
+(defn map-indexed
+ "Returns a lazy sequence consisting of the result of applying f to 0
+ and the first item of coll, followed by applying f to 1 and the second
+ item in coll, etc, until coll is exhausted. Thus function f should
+ accept 2 arguments, index and item. Returns a stateful transducer when
+ no collection is provided."
+ ([f]
+ (fn [rf]
+ (let [i (volatile! -1)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (rf result (f (vswap! i inc) input)))))))
+ ([f coll]
+ (letfn [(mapi [idx coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (if (chunked-seq? s)
+ (let [c (chunk-first s)
+ size (count c)
+ b (chunk-buffer size)]
+ (dotimes [i size]
+ (chunk-append b (f (+ idx i) (-nth c i))))
+ (chunk-cons (chunk b) (mapi (+ idx size) (chunk-rest s))))
+ (cons (f idx (first s)) (mapi (inc idx) (rest s)))))))]
+ (mapi 0 coll))))
+
+(defn keep
+ "Returns a lazy sequence of the non-nil results of (f item). Note,
+ this means false return values will be included. f must be free of
+ side-effects. Returns a transducer when no collection is provided."
+ ([f]
+ (fn [rf]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [v (f input)]
+ (if (nil? v)
+ result
+ (rf result v)))))))
+ ([f coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (if (chunked-seq? s)
+ (let [c (chunk-first s)
+ size (count c)
+ b (chunk-buffer size)]
+ (dotimes [i size]
+ (let [x (f (-nth c i))]
+ (when-not (nil? x)
+ (chunk-append b x))))
+ (chunk-cons (chunk b) (keep f (chunk-rest s))))
+ (let [x (f (first s))]
+ (if (nil? x)
+ (keep f (rest s))
+ (cons x (keep f (rest s))))))))))
+
+;; =============================================================================
+;; Atom
+
+(deftype Atom [state meta validator watches]
+ Object
+ (equiv [this other]
+ (-equiv this other))
+
+ IAtom
+
+ IEquiv
+ (-equiv [o other] (identical? o other))
+
+ IDeref
+ (-deref [_] state)
+
+ IMeta
+ (-meta [_] meta)
+
+ IWatchable
+ (-notify-watches [this oldval newval]
+ (doseq [[key f] watches]
+ (f key this oldval newval)))
+ (-add-watch [this key f]
+ (set! (.-watches this) (assoc watches key f))
+ this)
+ (-remove-watch [this key]
+ (set! (.-watches this) (dissoc watches key)))
+
+ IHash
+ (-hash [this] (goog/getUid this)))
+
+(defn atom
+ "Creates and returns an Atom with an initial value of x and zero or
+ more options (in any order):
+
+ :meta metadata-map
+
+ :validator validate-fn
+
+ If metadata-map is supplied, it will be come the metadata on the
+ atom. validate-fn must be nil or a side-effect-free fn of one
+ argument, which will be passed the intended new state on any state
+ change. If the new state is unacceptable, the validate-fn should
+ return false or throw an Error. If either of these error conditions
+ occur, then the value of the atom will not change."
+ ([x] (Atom. x nil nil nil))
+ ([x & {:keys [meta validator]}] (Atom. x meta validator nil)))
+
+(declare pr-str)
+
+(defn reset!
+ "Sets the value of atom to newval without regard for the
+ current value. Returns new-value."
+ [a new-value]
+ (if (instance? Atom a)
+ (let [validate (.-validator a)]
+ (when-not (nil? validate)
+ (when-not (validate new-value)
+ (throw (js/Error. "Validator rejected reference state"))))
+ (let [old-value (.-state a)]
+ (set! (.-state a) new-value)
+ (when-not (nil? (.-watches a))
+ (-notify-watches a old-value new-value))
+ new-value))
+ (-reset! a new-value)))
+
+(defn swap!
+ "Atomically swaps the value of atom to be:
+ (apply f current-value-of-atom args). Note that f may be called
+ multiple times, and thus should be free of side effects. Returns
+ the value that was swapped in."
+ ([a f]
+ (if (instance? Atom a)
+ (reset! a (f (.-state a)))
+ (-swap! a f)))
+ ([a f x]
+ (if (instance? Atom a)
+ (reset! a (f (.-state a) x))
+ (-swap! a f x)))
+ ([a f x y]
+ (if (instance? Atom a)
+ (reset! a (f (.-state a) x y))
+ (-swap! a f x y)))
+ ([a f x y & more]
+ (if (instance? Atom a)
+ (reset! a (apply f (.-state a) x y more))
+ (-swap! a f x y more))))
+
+(defn compare-and-set!
+ "Atomically sets the value of atom to newval if and only if the
+ current value of the atom is equal to oldval. Returns true if
+ set happened, else false."
+ [^not-native a oldval newval]
+ (if (= (-deref a) oldval)
+ (do (reset! a newval) true)
+ false))
+
+(defn set-validator!
+ "Sets the validator-fn for an atom. validator-fn must be nil or a
+ side-effect-free fn of one argument, which will be passed the intended
+ new state on any state change. If the new state is unacceptable, the
+ validator-fn should return false or throw an Error. If the current state
+ is not acceptable to the new validator, an Error will be thrown and the
+ validator will not be changed."
+ [iref val]
+ (set! (.-validator iref) val))
+
+(defn get-validator
+ "Gets the validator-fn for a var/ref/agent/atom."
+ [iref]
+ (.-validator iref))
+
+(deftype Volatile [^:mutable state]
+ IVolatile
+ (-vreset! [_ new-state]
+ (set! state new-state))
+
+ IDeref
+ (-deref [_] state))
+
+(defn volatile!
+ "Creates and returns a Volatile with an initial value of val."
+ [val]
+ (Volatile. val))
+
+(defn ^boolean volatile?
+ "Returns true if x is a volatile."
+ [x] (instance? Volatile x))
+
+(defn vreset!
+ "Sets the value of volatile to newval without regard for the
+ current value. Returns newval."
+ [vol newval] (-vreset! vol newval))
+
+(defn keep-indexed
+ "Returns a lazy sequence of the non-nil results of (f index item). Note,
+ this means false return values will be included. f must be free of
+ side-effects. Returns a stateful transducer when no collection is
+ provided."
+ ([f]
+ (fn [rf]
+ (let [ia (volatile! -1)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [i (vswap! ia inc)
+ v (f i input)]
+ (if (nil? v)
+ result
+ (rf result v))))))))
+ ([f coll]
+ (letfn [(keepi [idx coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (if (chunked-seq? s)
+ (let [c (chunk-first s)
+ size (count c)
+ b (chunk-buffer size)]
+ (dotimes [i size]
+ (let [x (f (+ idx i) (-nth c i))]
+ (when-not (nil? x)
+ (chunk-append b x))))
+ (chunk-cons (chunk b) (keepi (+ idx size) (chunk-rest s))))
+ (let [x (f idx (first s))]
+ (if (nil? x)
+ (keepi (inc idx) (rest s))
+ (cons x (keepi (inc idx) (rest s)))))))))]
+ (keepi 0 coll))))
+
+(defn every-pred
+ "Takes a set of predicates and returns a function f that returns true if all of its
+ composing predicates return a logical true value against all of its arguments, else it returns
+ false. Note that f is short-circuiting in that it will stop execution on the first
+ argument that triggers a logical false result against the original predicates."
+ ([p]
+ (fn ep1
+ ([] true)
+ ([x] (boolean (p x)))
+ ([x y] (boolean (and (p x) (p y))))
+ ([x y z] (boolean (and (p x) (p y) (p z))))
+ ([x y z & args] (boolean (and (ep1 x y z)
+ (every? p args))))))
+ ([p1 p2]
+ (fn ep2
+ ([] true)
+ ([x] (boolean (and (p1 x) (p2 x))))
+ ([x y] (boolean (and (p1 x) (p1 y) (p2 x) (p2 y))))
+ ([x y z] (boolean (and (p1 x) (p1 y) (p1 z) (p2 x) (p2 y) (p2 z))))
+ ([x y z & args] (boolean (and (ep2 x y z)
+ (every? #(and (p1 %) (p2 %)) args))))))
+ ([p1 p2 p3]
+ (fn ep3
+ ([] true)
+ ([x] (boolean (and (p1 x) (p2 x) (p3 x))))
+ ([x y] (boolean (and (p1 x) (p2 x) (p3 x) (p1 y) (p2 y) (p3 y))))
+ ([x y z] (boolean (and (p1 x) (p2 x) (p3 x) (p1 y) (p2 y) (p3 y) (p1 z) (p2 z) (p3 z))))
+ ([x y z & args] (boolean (and (ep3 x y z)
+ (every? #(and (p1 %) (p2 %) (p3 %)) args))))))
+ ([p1 p2 p3 & ps]
+ (let [ps (list* p1 p2 p3 ps)]
+ (fn epn
+ ([] true)
+ ([x] (every? #(% x) ps))
+ ([x y] (every? #(and (% x) (% y)) ps))
+ ([x y z] (every? #(and (% x) (% y) (% z)) ps))
+ ([x y z & args] (boolean (and (epn x y z)
+ (every? #(every? % args) ps))))))))
+
+(defn some-fn
+ "Takes a set of predicates and returns a function f that returns the first logical true value
+ returned by one of its composing predicates against any of its arguments, else it returns
+ logical false. Note that f is short-circuiting in that it will stop execution on the first
+ argument that triggers a logical true result against the original predicates."
+ ([p]
+ (fn sp1
+ ([] nil)
+ ([x] (p x))
+ ([x y] (or (p x) (p y)))
+ ([x y z] (or (p x) (p y) (p z)))
+ ([x y z & args] (or (sp1 x y z)
+ (some p args)))))
+ ([p1 p2]
+ (fn sp2
+ ([] nil)
+ ([x] (or (p1 x) (p2 x)))
+ ([x y] (or (p1 x) (p1 y) (p2 x) (p2 y)))
+ ([x y z] (or (p1 x) (p1 y) (p1 z) (p2 x) (p2 y) (p2 z)))
+ ([x y z & args] (or (sp2 x y z)
+ (some #(or (p1 %) (p2 %)) args)))))
+ ([p1 p2 p3]
+ (fn sp3
+ ([] nil)
+ ([x] (or (p1 x) (p2 x) (p3 x)))
+ ([x y] (or (p1 x) (p2 x) (p3 x) (p1 y) (p2 y) (p3 y)))
+ ([x y z] (or (p1 x) (p2 x) (p3 x) (p1 y) (p2 y) (p3 y) (p1 z) (p2 z) (p3 z)))
+ ([x y z & args] (or (sp3 x y z)
+ (some #(or (p1 %) (p2 %) (p3 %)) args)))))
+ ([p1 p2 p3 & ps]
+ (let [ps (list* p1 p2 p3 ps)]
+ (fn spn
+ ([] nil)
+ ([x] (some #(% x) ps))
+ ([x y] (some #(or (% x) (% y)) ps))
+ ([x y z] (some #(or (% x) (% y) (% z)) ps))
+ ([x y z & args] (or (spn x y z)
+ (some #(some % args) ps)))))))
+
+(defn map
+ "Returns a lazy sequence consisting of the result of applying f to
+ the set of first items of each coll, followed by applying f to the
+ set of second items in each coll, until any one of the colls is
+ exhausted. Any remaining items in other colls are ignored. Function
+ f should accept number-of-colls arguments. Returns a transducer when
+ no collection is provided."
+ ([f]
+ (fn [rf]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (rf result (f input)))
+ ([result input & inputs]
+ (rf result (apply f input inputs))))))
+ ([f coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (if (chunked-seq? s)
+ (let [c (chunk-first s)
+ size (count c)
+ b (chunk-buffer size)]
+ (dotimes [i size]
+ (chunk-append b (f (-nth c i))))
+ (chunk-cons (chunk b) (map f (chunk-rest s))))
+ (cons (f (first s)) (map f (rest s)))))))
+ ([f c1 c2]
+ (lazy-seq
+ (let [s1 (seq c1) s2 (seq c2)]
+ (when (and s1 s2)
+ (cons (f (first s1) (first s2))
+ (map f (rest s1) (rest s2)))))))
+ ([f c1 c2 c3]
+ (lazy-seq
+ (let [s1 (seq c1) s2 (seq c2) s3 (seq c3)]
+ (when (and s1 s2 s3)
+ (cons (f (first s1) (first s2) (first s3))
+ (map f (rest s1) (rest s2) (rest s3)))))))
+ ([f c1 c2 c3 & colls]
+ (let [step (fn step [cs]
+ (lazy-seq
+ (let [ss (map seq cs)]
+ (when (every? identity ss)
+ (cons (map first ss) (step (map rest ss)))))))]
+ (map #(apply f %) (step (conj colls c3 c2 c1))))))
+
+(defn take
+ "Returns a lazy sequence of the first n items in coll, or all items if
+ there are fewer than n. Returns a stateful transducer when
+ no collection is provided."
+ ([n]
+ {:pre [(number? n)]}
+ (fn [rf]
+ (let [na (volatile! n)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [n @na
+ nn (vswap! na dec)
+ result (if (pos? n)
+ (rf result input)
+ result)]
+ (if (not (pos? nn))
+ (ensure-reduced result)
+ result)))))))
+ ([n coll]
+ {:pre [(number? n)]}
+ (lazy-seq
+ (when (pos? n)
+ (when-let [s (seq coll)]
+ (cons (first s) (take (dec n) (rest s))))))))
+
+(defn drop
+ "Returns a lazy sequence of all but the first n items in coll.
+ Returns a stateful transducer when no collection is provided."
+ ([n]
+ {:pre [(number? n)]}
+ (fn [rf]
+ (let [na (volatile! n)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [n @na]
+ (vswap! na dec)
+ (if (pos? n)
+ result
+ (rf result input))))))))
+ ([n coll]
+ {:pre [(number? n)]}
+ (let [step (fn [n coll]
+ (let [s (seq coll)]
+ (if (and (pos? n) s)
+ (recur (dec n) (rest s))
+ s)))]
+ (lazy-seq (step n coll)))))
+
+(defn drop-last
+ "Return a lazy sequence of all but the last n (default 1) items in coll"
+ ([s] (drop-last 1 s))
+ ([n s] (map (fn [x _] x) s (drop n s))))
+
+(defn take-last
+ "Returns a seq of the last n items in coll. Depending on the type
+ of coll may be no better than linear time. For vectors, see also subvec."
+ [n coll]
+ (loop [s (seq coll), lead (seq (drop n coll))]
+ (if lead
+ (recur (next s) (next lead))
+ s)))
+
+(defn drop-while
+ "Returns a lazy sequence of the items in coll starting from the
+ first item for which (pred item) returns logical false. Returns a
+ stateful transducer when no collection is provided."
+ ([pred]
+ (fn [rf]
+ (let [da (volatile! true)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [drop? @da]
+ (if (and drop? (pred input))
+ result
+ (do
+ (vreset! da nil)
+ (rf result input)))))))))
+ ([pred coll]
+ (let [step (fn [pred coll]
+ (let [s (seq coll)]
+ (if (and s (pred (first s)))
+ (recur pred (rest s))
+ s)))]
+ (lazy-seq (step pred coll)))))
+
+(defn cycle
+ "Returns a lazy (infinite!) sequence of repetitions of the items in coll."
+ [coll] (lazy-seq
+ (when-let [s (seq coll)]
+ (concat s (cycle s)))))
+
+(defn split-at
+ "Returns a vector of [(take n coll) (drop n coll)]"
+ [n coll]
+ [(take n coll) (drop n coll)])
+
+(defn repeat
+ "Returns a lazy (infinite!, or length n if supplied) sequence of xs."
+ ([x] (lazy-seq (cons x (repeat x))))
+ ([n x] (take n (repeat x))))
+
+(defn replicate
+ "DEPRECATED: Use 'repeat' instead.
+ Returns a lazy seq of n xs."
+ [n x] (take n (repeat x)))
+
+(defn repeatedly
+ "Takes a function of no args, presumably with side effects, and
+ returns an infinite (or length n if supplied) lazy sequence of calls
+ to it"
+ ([f] (lazy-seq (cons (f) (repeatedly f))))
+ ([n f] (take n (repeatedly f))))
+
+(defn iterate
+ "Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects"
+ {:added "1.0"}
+ [f x] (cons x (lazy-seq (iterate f (f x)))))
+
+(defn interleave
+ "Returns a lazy seq of the first item in each coll, then the second etc."
+ ([c1 c2]
+ (lazy-seq
+ (let [s1 (seq c1) s2 (seq c2)]
+ (when (and s1 s2)
+ (cons (first s1) (cons (first s2)
+ (interleave (rest s1) (rest s2))))))))
+ ([c1 c2 & colls]
+ (lazy-seq
+ (let [ss (map seq (conj colls c2 c1))]
+ (when (every? identity ss)
+ (concat (map first ss) (apply interleave (map rest ss))))))))
+
+(defn interpose
+ "Returns a lazy seq of the elements of coll separated by sep.
+ Returns a stateful transducer when no collection is provided."
+ ([sep]
+ (fn [rf]
+ (let [started (volatile! false)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (if @started
+ (let [sepr (rf result sep)]
+ (if (reduced? sepr)
+ sepr
+ (rf sepr input)))
+ (do
+ (vreset! started true)
+ (rf result input))))))))
+ ([sep coll] (drop 1 (interleave (repeat sep) coll))))
+
+
+
+(defn- flatten1
+ "Take a collection of collections, and return a lazy seq
+ of items from the inner collection"
+ [colls]
+ (let [cat (fn cat [coll colls]
+ (lazy-seq
+ (if-let [coll (seq coll)]
+ (cons (first coll) (cat (rest coll) colls))
+ (when (seq colls)
+ (cat (first colls) (rest colls))))))]
+ (cat nil colls)))
+
+(declare cat)
+
+(defn mapcat
+ "Returns the result of applying concat to the result of applying map
+ to f and colls. Thus function f should return a collection. Returns
+ a transducer when no collections are provided"
+ {:added "1.0"
+ :static true}
+ ([f] (comp (map f) cat))
+ ([f & colls]
+ (apply concat (apply map f colls))))
+
+(defn filter
+ "Returns a lazy sequence of the items in coll for which
+ (pred item) returns true. pred must be free of side-effects.
+ Returns a transducer when no collection is provided."
+ ([pred]
+ (fn [rf]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (if (pred input)
+ (rf result input)
+ result)))))
+ ([pred coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (if (chunked-seq? s)
+ (let [c (chunk-first s)
+ size (count c)
+ b (chunk-buffer size)]
+ (dotimes [i size]
+ (when (pred (-nth c i))
+ (chunk-append b (-nth c i))))
+ (chunk-cons (chunk b) (filter pred (chunk-rest s))))
+ (let [f (first s) r (rest s)]
+ (if (pred f)
+ (cons f (filter pred r))
+ (filter pred r))))))))
+
+(defn remove
+ "Returns a lazy sequence of the items in coll for which
+ (pred item) returns false. pred must be free of side-effects.
+ Returns a transducer when no collection is provided."
+ ([pred] (filter (complement pred)))
+ ([pred coll]
+ (filter (complement pred) coll)))
+
+(defn tree-seq
+ "Returns a lazy sequence of the nodes in a tree, via a depth-first walk.
+ branch? must be a fn of one arg that returns true if passed a node
+ that can have children (but may not). children must be a fn of one
+ arg that returns a sequence of the children. Will only be called on
+ nodes for which branch? returns true. Root is the root node of the
+ tree."
+ [branch? children root]
+ (let [walk (fn walk [node]
+ (lazy-seq
+ (cons node
+ (when (branch? node)
+ (mapcat walk (children node))))))]
+ (walk root)))
+
+(defn flatten
+ "Takes any nested combination of sequential things (lists, vectors,
+ etc.) and returns their contents as a single, flat sequence.
+ (flatten nil) returns nil."
+ [x]
+ (filter #(not (sequential? %))
+ (rest (tree-seq sequential? seq x))))
+
+(defn into
+ "Returns a new coll consisting of to-coll with all of the items of
+ from-coll conjoined. A transducer may be supplied."
+ ([] [])
+ ([to] to)
+ ([to from]
+ (if-not (nil? to)
+ (if (implements? IEditableCollection to)
+ (with-meta (persistent! (reduce -conj! (transient to) from)) (meta to))
+ (reduce -conj to from))
+ (reduce conj () from)))
+ ([to xform from]
+ (if (implements? IEditableCollection to)
+ (with-meta (persistent! (transduce xform conj! (transient to) from)) (meta to))
+ (transduce xform conj to from))))
+
+(defn mapv
+ "Returns a vector consisting of the result of applying f to the
+ set of first items of each coll, followed by applying f to the set
+ of second items in each coll, until any one of the colls is
+ exhausted. Any remaining items in other colls are ignored. Function
+ f should accept number-of-colls arguments."
+ ([f coll]
+ (-> (reduce (fn [v o] (conj! v (f o))) (transient []) coll)
+ persistent!))
+ ([f c1 c2]
+ (into [] (map f c1 c2)))
+ ([f c1 c2 c3]
+ (into [] (map f c1 c2 c3)))
+ ([f c1 c2 c3 & colls]
+ (into [] (apply map f c1 c2 c3 colls))))
+
+(defn filterv
+ "Returns a vector of the items in coll for which
+ (pred item) returns true. pred must be free of side-effects."
+ [pred coll]
+ (-> (reduce (fn [v o] (if (pred o) (conj! v o) v))
+ (transient [])
+ coll)
+ persistent!))
+
+(defn partition
+ "Returns a lazy sequence of lists of n items each, at offsets step
+ apart. If step is not supplied, defaults to n, i.e. the partitions
+ do not overlap. If a pad collection is supplied, use its elements as
+ necessary to complete last partition up to n items. In case there are
+ not enough padding elements, return a partition with less than n items."
+ ([n coll]
+ (partition n n coll))
+ ([n step coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (let [p (take n s)]
+ (when (== n (count p))
+ (cons p (partition n step (drop step s))))))))
+ ([n step pad coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (let [p (take n s)]
+ (if (== n (count p))
+ (cons p (partition n step pad (drop step s)))
+ (list (take n (concat p pad)))))))))
+
+(defn get-in
+ "Returns the value in a nested associative structure,
+ where ks is a sequence of keys. Returns nil if the key is not present,
+ or the not-found value if supplied."
+ {:added "1.2"
+ :static true}
+ ([m ks]
+ (reduce get m ks))
+ ([m ks not-found]
+ (loop [sentinel lookup-sentinel
+ m m
+ ks (seq ks)]
+ (if-not (nil? ks)
+ (let [m (get m (first ks) sentinel)]
+ (if (identical? sentinel m)
+ not-found
+ (recur sentinel m (next ks))))
+ m))))
+
+(defn assoc-in
+ "Associates a value in a nested associative structure, where ks is a
+ sequence of keys and v is the new value and returns a new nested structure.
+ If any levels do not exist, hash-maps will be created."
+ [m [k & ks] v]
+ (if ks
+ (assoc m k (assoc-in (get m k) ks v))
+ (assoc m k v)))
+
+(defn update-in
+ "'Updates' a value in a nested associative structure, where ks is a
+ sequence of keys and f is a function that will take the old value
+ and any supplied args and return the new value, and returns a new
+ nested structure. If any levels do not exist, hash-maps will be
+ created."
+ ([m [k & ks] f]
+ (if ks
+ (assoc m k (update-in (get m k) ks f))
+ (assoc m k (f (get m k)))))
+ ([m [k & ks] f a]
+ (if ks
+ (assoc m k (update-in (get m k) ks f a))
+ (assoc m k (f (get m k) a))))
+ ([m [k & ks] f a b]
+ (if ks
+ (assoc m k (update-in (get m k) ks f a b))
+ (assoc m k (f (get m k) a b))))
+ ([m [k & ks] f a b c]
+ (if ks
+ (assoc m k (update-in (get m k) ks f a b c))
+ (assoc m k (f (get m k) a b c))))
+ ([m [k & ks] f a b c & args]
+ (if ks
+ (assoc m k (apply update-in (get m k) ks f a b c args))
+ (assoc m k (apply f (get m k) a b c args)))))
+
+(defn update
+ "'Updates' a value in an associative structure, where k is a
+ key and f is a function that will take the old value
+ and any supplied args and return the new value, and returns a new
+ structure. If the key does not exist, nil is passed as the old value."
+ ([m k f]
+ (assoc m k (f (get m k))))
+ ([m k f x]
+ (assoc m k (f (get m k) x)))
+ ([m k f x y]
+ (assoc m k (f (get m k) x y)))
+ ([m k f x y z]
+ (assoc m k (f (get m k) x y z)))
+ ([m k f x y z & more]
+ (assoc m k (apply f (get m k) x y z more))))
+
+;;; PersistentVector
+
+(deftype VectorNode [edit arr])
+
+(defn- pv-fresh-node [edit]
+ (VectorNode. edit (make-array 32)))
+
+(defn- pv-aget [node idx]
+ (aget (.-arr node) idx))
+
+(defn- pv-aset [node idx val]
+ (aset (.-arr node) idx val))
+
+(defn- pv-clone-node [node]
+ (VectorNode. (.-edit node) (aclone (.-arr node))))
+
+(defn- tail-off [pv]
+ (let [cnt (.-cnt pv)]
+ (if (< cnt 32)
+ 0
+ (bit-shift-left (bit-shift-right-zero-fill (dec cnt) 5) 5))))
+
+(defn- new-path [edit level node]
+ (loop [ll level
+ ret node]
+ (if (zero? ll)
+ ret
+ (let [embed ret
+ r (pv-fresh-node edit)
+ _ (pv-aset r 0 embed)]
+ (recur (- ll 5) r)))))
+
+(defn- push-tail [pv level parent tailnode]
+ (let [ret (pv-clone-node parent)
+ subidx (bit-and (bit-shift-right-zero-fill (dec (.-cnt pv)) level) 0x01f)]
+ (if (== 5 level)
+ (do
+ (pv-aset ret subidx tailnode)
+ ret)
+ (let [child (pv-aget parent subidx)]
+ (if-not (nil? child)
+ (let [node-to-insert (push-tail pv (- level 5) child tailnode)]
+ (pv-aset ret subidx node-to-insert)
+ ret)
+ (let [node-to-insert (new-path nil (- level 5) tailnode)]
+ (pv-aset ret subidx node-to-insert)
+ ret))))))
+
+(defn- vector-index-out-of-bounds [i cnt]
+ (throw (js/Error. (str "No item " i " in vector of length " cnt))))
+
+(defn- first-array-for-longvec [pv]
+ ;; invariants: (count pv) > 32.
+ (loop [node (.-root pv)
+ level (.-shift pv)]
+ (if (pos? level)
+ (recur (pv-aget node 0) (- level 5))
+ (.-arr node))))
+
+(defn- unchecked-array-for [pv i]
+ ;; invariant: i is a valid index of pv (use array-for if unknown).
+ (if (>= i (tail-off pv))
+ (.-tail pv)
+ (loop [node (.-root pv)
+ level (.-shift pv)]
+ (if (pos? level)
+ (recur (pv-aget node (bit-and (bit-shift-right-zero-fill i level) 0x01f))
+ (- level 5))
+ (.-arr node)))))
+
+(defn- array-for [pv i]
+ (if (and (<= 0 i) (< i (.-cnt pv)))
+ (unchecked-array-for pv i)
+ (vector-index-out-of-bounds i (.-cnt pv))))
+
+(defn- do-assoc [pv level node i val]
+ (let [ret (pv-clone-node node)]
+ (if (zero? level)
+ (do
+ (pv-aset ret (bit-and i 0x01f) val)
+ ret)
+ (let [subidx (bit-and (bit-shift-right-zero-fill i level) 0x01f)]
+ (pv-aset ret subidx (do-assoc pv (- level 5) (pv-aget node subidx) i val))
+ ret))))
+
+(defn- pop-tail [pv level node]
+ (let [subidx (bit-and (bit-shift-right-zero-fill (- (.-cnt pv) 2) level) 0x01f)]
+ (cond
+ (> level 5) (let [new-child (pop-tail pv (- level 5) (pv-aget node subidx))]
+ (if (and (nil? new-child) (zero? subidx))
+ nil
+ (let [ret (pv-clone-node node)]
+ (pv-aset ret subidx new-child)
+ ret)))
+ (zero? subidx) nil
+ :else (let [ret (pv-clone-node node)]
+ (pv-aset ret subidx nil)
+ ret))))
+
+(deftype RangedIterator [^:mutable i ^:mutable base ^:mutable arr v start end]
+ Object
+ (hasNext [this]
+ (< i end))
+ (next [this]
+ (when (== (- i base) 32)
+ (set! arr (unchecked-array-for v i))
+ (set! base (+ base 32)))
+ (let [ret (aget arr (bit-and i 0x01f))]
+ (set! i (inc i))
+ ret)))
+
+(defn ranged-iterator [v start end]
+ (let [i start]
+ (RangedIterator. i (- i (js-mod i 32))
+ (when (< start (count v))
+ (unchecked-array-for v i))
+ v start end)))
+
+(declare tv-editable-root tv-editable-tail TransientVector deref
+ pr-sequential-writer pr-writer chunked-seq)
+
+(deftype PersistentVector [meta cnt shift root tail ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [_] (PersistentVector. meta cnt shift root tail __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentVector. meta cnt shift root tail __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ IStack
+ (-peek [coll]
+ (when (> cnt 0)
+ (-nth coll (dec cnt))))
+ (-pop [coll]
+ (cond
+ (zero? cnt) (throw (js/Error. "Can't pop empty vector"))
+ (== 1 cnt) (-with-meta (.-EMPTY PersistentVector) meta)
+ (< 1 (- cnt (tail-off coll)))
+ (PersistentVector. meta (dec cnt) shift root (.slice tail 0 -1) nil)
+ :else (let [new-tail (unchecked-array-for coll (- cnt 2))
+ nr (pop-tail coll shift root)
+ new-root (if (nil? nr) (.-EMPTY-NODE PersistentVector) nr)
+ cnt-1 (dec cnt)]
+ (if (and (< 5 shift) (nil? (pv-aget new-root 1)))
+ (PersistentVector. meta cnt-1 (- shift 5) (pv-aget new-root 0) new-tail nil)
+ (PersistentVector. meta cnt-1 shift new-root new-tail nil)))))
+
+ ICollection
+ (-conj [coll o]
+ (if (< (- cnt (tail-off coll)) 32)
+ (let [len (alength tail)
+ new-tail (make-array (inc len))]
+ (dotimes [i len]
+ (aset new-tail i (aget tail i)))
+ (aset new-tail len o)
+ (PersistentVector. meta (inc cnt) shift root new-tail nil))
+ (let [root-overflow? (> (bit-shift-right-zero-fill cnt 5) (bit-shift-left 1 shift))
+ new-shift (if root-overflow? (+ shift 5) shift)
+ new-root (if root-overflow?
+ (let [n-r (pv-fresh-node nil)]
+ (pv-aset n-r 0 root)
+ (pv-aset n-r 1 (new-path nil shift (VectorNode. nil tail)))
+ n-r)
+ (push-tail coll shift root (VectorNode. nil tail)))]
+ (PersistentVector. meta (inc cnt) new-shift new-root (array o) nil))))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY PersistentVector) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other]
+ (if (instance? PersistentVector other)
+ (if (== cnt (count other))
+ (let [me-iter (-iterator coll)
+ you-iter (-iterator other)]
+ (loop []
+ (if ^boolean (.hasNext me-iter)
+ (let [x (.next me-iter)
+ y (.next you-iter)]
+ (if (= x y)
+ (recur)
+ false))
+ true)))
+ false)
+ (equiv-sequential coll other)))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (cond
+ (zero? cnt) nil
+ (<= cnt 32) (IndexedSeq. tail 0 nil)
+ :else (chunked-seq coll (first-array-for-longvec coll) 0 0)))
+
+ ICounted
+ (-count [coll] cnt)
+
+ IIndexed
+ (-nth [coll n]
+ (aget (array-for coll n) (bit-and n 0x01f)))
+ (-nth [coll n not-found]
+ (if (and (<= 0 n) (< n cnt))
+ (aget (unchecked-array-for coll n) (bit-and n 0x01f))
+ not-found))
+
+ ILookup
+ (-lookup [coll k] (-lookup coll k nil))
+ (-lookup [coll k not-found] (if (number? k)
+ (-nth coll k not-found)
+ not-found))
+
+ IMapEntry
+ (-key [coll]
+ (-nth coll 0))
+ (-val [coll]
+ (-nth coll 1))
+
+ IAssociative
+ (-assoc [coll k v]
+ (if (number? k)
+ (-assoc-n coll k v)
+ (throw (js/Error. "Vector's key for assoc must be a number."))))
+
+ IVector
+ (-assoc-n [coll n val]
+ (cond
+ (and (<= 0 n) (< n cnt))
+ (if (<= (tail-off coll) n)
+ (let [new-tail (aclone tail)]
+ (aset new-tail (bit-and n 0x01f) val)
+ (PersistentVector. meta cnt shift root new-tail nil))
+ (PersistentVector. meta cnt shift (do-assoc coll shift root n val) tail nil))
+ (== n cnt) (-conj coll val)
+ :else (throw (js/Error. (str "Index " n " out of bounds [0," cnt "]")))))
+
+ IReduce
+ (-reduce [v f]
+ (ci-reduce v f))
+ (-reduce [v f init]
+ (loop [i 0 init init]
+ (if (< i cnt)
+ (let [arr (unchecked-array-for v i)
+ len (alength arr)
+ init (loop [j 0 init init]
+ (if (< j len)
+ (let [init (f init (aget arr j))]
+ (if (reduced? init)
+ init
+ (recur (inc j) init)))
+ init))]
+ (if (reduced? init)
+ @init
+ (recur (+ i len) init)))
+ init)))
+
+ IKVReduce
+ (-kv-reduce [v f init]
+ (loop [i 0 init init]
+ (if (< i cnt)
+ (let [arr (unchecked-array-for v i)
+ len (alength arr)
+ init (loop [j 0 init init]
+ (if (< j len)
+ (let [init (f init (+ j i) (aget arr j))]
+ (if (reduced? init)
+ init
+ (recur (inc j) init)))
+ init))]
+ (if (reduced? init)
+ @init
+ (recur (+ i len) init)))
+ init)))
+
+ IFn
+ (-invoke [coll k]
+ (-nth coll k))
+ (-invoke [coll k not-found]
+ (-nth coll k not-found))
+
+ IEditableCollection
+ (-as-transient [coll]
+ (TransientVector. cnt shift (tv-editable-root root) (tv-editable-tail tail)))
+
+ IReversible
+ (-rseq [coll]
+ (if (pos? cnt)
+ (RSeq. coll (dec cnt) nil)))
+
+ IIterable
+ (-iterator [this]
+ (ranged-iterator this 0 cnt)))
+
+(set! (.-EMPTY-NODE PersistentVector) (VectorNode. nil (make-array 32)))
+
+(set! (.-EMPTY PersistentVector)
+ (PersistentVector. nil 0 5 (.-EMPTY-NODE PersistentVector) (array) empty-ordered-hash))
+
+(set! (.-fromArray PersistentVector)
+ (fn [xs ^boolean no-clone]
+ (let [l (alength xs)
+ xs (if no-clone xs (aclone xs))]
+ (if (< l 32)
+ (PersistentVector. nil l 5 (.-EMPTY-NODE PersistentVector) xs nil)
+ (let [node (.slice xs 0 32)
+ v (PersistentVector. nil 32 5 (.-EMPTY-NODE PersistentVector) node nil)]
+ (loop [i 32 out (-as-transient v)]
+ (if (< i l)
+ (recur (inc i) (conj! out (aget xs i)))
+ (persistent! out))))))))
+
+(es6-iterable PersistentVector)
+
+(defn vec
+ "Creates a new vector containing the contents of coll. JavaScript arrays
+ will be aliased and should not be modified."
+ [coll]
+ (if (array? coll)
+ (.fromArray PersistentVector coll true)
+ (-persistent!
+ (reduce -conj!
+ (-as-transient (.-EMPTY PersistentVector))
+ coll))))
+
+(defn vector
+ "Creates a new vector containing the args."
+ [& args]
+ (if (and (instance? IndexedSeq args) (zero? (.-i args)))
+ (.fromArray PersistentVector (.-arr args) true)
+ (vec args)))
+
+(declare subvec)
+
+(deftype ChunkedSeq [vec node i off meta ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IWithMeta
+ (-with-meta [coll m]
+ (chunked-seq vec node i off m))
+ IMeta
+ (-meta [coll] meta)
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ASeq
+ ISeq
+ (-first [coll]
+ (aget node off))
+ (-rest [coll]
+ (if (< (inc off) (alength node))
+ (let [s (chunked-seq vec node i (inc off))]
+ (if (nil? s)
+ ()
+ s))
+ (-chunked-rest coll)))
+
+ INext
+ (-next [coll]
+ (if (< (inc off) (alength node))
+ (let [s (chunked-seq vec node i (inc off))]
+ (if (nil? s)
+ nil
+ s))
+ (-chunked-next coll)))
+
+ ICollection
+ (-conj [coll o]
+ (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll]
+ (with-meta (.-EMPTY PersistentVector) meta))
+
+ IChunkedSeq
+ (-chunked-first [coll]
+ (array-chunk node off))
+ (-chunked-rest [coll]
+ (let [end (+ i (alength node))]
+ (if (< end (-count vec))
+ (chunked-seq vec (unchecked-array-for vec end) end 0)
+ ())))
+
+ IChunkedNext
+ (-chunked-next [coll]
+ (let [end (+ i (alength node))]
+ (when (< end (-count vec))
+ (chunked-seq vec (unchecked-array-for vec end) end 0))))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IReduce
+ (-reduce [coll f]
+ (ci-reduce (subvec vec (+ i off) (count vec)) f))
+
+ (-reduce [coll f start]
+ (ci-reduce (subvec vec (+ i off) (count vec)) f start)))
+
+(es6-iterable ChunkedSeq)
+
+(defn chunked-seq
+ ([vec i off] (ChunkedSeq. vec (array-for vec i) i off nil nil))
+ ([vec node i off] (ChunkedSeq. vec node i off nil nil))
+ ([vec node i off meta]
+ (ChunkedSeq. vec node i off meta nil)))
+
+(declare build-subvec)
+
+(deftype Subvec [meta v start end ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [_] (Subvec. meta v start end __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (build-subvec meta v start end __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ IStack
+ (-peek [coll]
+ (-nth v (dec end)))
+ (-pop [coll]
+ (if (== start end)
+ (throw (js/Error. "Can't pop empty vector"))
+ (build-subvec meta v start (dec end) nil)))
+
+ ICollection
+ (-conj [coll o]
+ (build-subvec meta (-assoc-n v end o) start (inc end) nil))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY PersistentVector) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (let [subvec-seq (fn subvec-seq [i]
+ (when-not (== i end)
+ (cons (-nth v i)
+ (lazy-seq
+ (subvec-seq (inc i))))))]
+ (subvec-seq start)))
+
+ IReversible
+ (-rseq [coll]
+ (if-not (== start end)
+ (RSeq. coll (dec (- end start)) nil)))
+
+ ICounted
+ (-count [coll] (- end start))
+
+ IIndexed
+ (-nth [coll n]
+ (if (or (neg? n) (<= end (+ start n)))
+ (vector-index-out-of-bounds n (- end start))
+ (-nth v (+ start n))))
+ (-nth [coll n not-found]
+ (if (or (neg? n) (<= end (+ start n)))
+ not-found
+ (-nth v (+ start n) not-found)))
+
+ ILookup
+ (-lookup [coll k] (-lookup coll k nil))
+ (-lookup [coll k not-found] (if (number? k)
+ (-nth coll k not-found)
+ not-found))
+
+ IAssociative
+ (-assoc [coll key val]
+ (if (number? key)
+ (-assoc-n coll key val)
+ (throw (js/Error. "Subvec's key for assoc must be a number."))))
+
+ IVector
+ (-assoc-n [coll n val]
+ (let [v-pos (+ start n)]
+ (if (or (neg? n) (<= (inc end) v-pos))
+ (throw (js/Error. (str "Index " n " out of bounds [0," (-count coll) "]")))
+ (build-subvec meta (assoc v v-pos val) start (max end (inc v-pos)) nil))))
+
+ IReduce
+ (-reduce [coll f]
+ (ci-reduce coll f))
+ (-reduce [coll f start]
+ (ci-reduce coll f start))
+
+ IKVReduce
+ (-kv-reduce [coll f init]
+ (loop [i start j 0 init init]
+ (if (< i end)
+ (let [init (f init j (-nth v i))]
+ (if (reduced? init)
+ @init
+ (recur (inc i) (inc j) init)))
+ init)))
+
+ IFn
+ (-invoke [coll k]
+ (-nth coll k))
+ (-invoke [coll k not-found]
+ (-nth coll k not-found))
+
+ IIterable
+ (-iterator [coll]
+ (ranged-iterator v start end)))
+
+(es6-iterable Subvec)
+
+(defn- build-subvec [meta v start end __hash]
+ (if (instance? Subvec v)
+ (recur meta (.-v v) (+ (.-start v) start) (+ (.-start v) end) __hash)
+ (let [c (count v)]
+ (when (or (neg? start)
+ (neg? end)
+ (> start c)
+ (> end c))
+ (throw (js/Error. "Index out of bounds")))
+ (Subvec. meta v start end __hash))))
+
+(defn subvec
+ "Returns a persistent vector of the items in vector from
+ start (inclusive) to end (exclusive). If end is not supplied,
+ defaults to (count vector). This operation is O(1) and very fast, as
+ the resulting vector shares structure with the original and no
+ trimming is done."
+ ([v start]
+ (subvec v start (count v)))
+ ([v start end]
+ (build-subvec nil v start end nil)))
+
+(defn- tv-ensure-editable [edit node]
+ (if (identical? edit (.-edit node))
+ node
+ (VectorNode. edit (aclone (.-arr node)))))
+
+(defn- tv-editable-root [node]
+ (VectorNode. (js-obj) (aclone (.-arr node))))
+
+(defn- tv-editable-tail [tl]
+ (let [ret (make-array 32)]
+ (array-copy tl 0 ret 0 (alength tl))
+ ret))
+
+(defn- tv-push-tail [tv level parent tail-node]
+ (let [ret (tv-ensure-editable (.. tv -root -edit) parent)
+ subidx (bit-and (bit-shift-right-zero-fill (dec (.-cnt tv)) level) 0x01f)]
+ (pv-aset ret subidx
+ (if (== level 5)
+ tail-node
+ (let [child (pv-aget ret subidx)]
+ (if-not (nil? child)
+ (tv-push-tail tv (- level 5) child tail-node)
+ (new-path (.. tv -root -edit) (- level 5) tail-node)))))
+ ret))
+
+(defn- tv-pop-tail [tv level node]
+ (let [node (tv-ensure-editable (.. tv -root -edit) node)
+ subidx (bit-and (bit-shift-right-zero-fill (- (.-cnt tv) 2) level) 0x01f)]
+ (cond
+ (> level 5) (let [new-child (tv-pop-tail
+ tv (- level 5) (pv-aget node subidx))]
+ (if (and (nil? new-child) (zero? subidx))
+ nil
+ (do (pv-aset node subidx new-child)
+ node)))
+ (zero? subidx) nil
+ :else (do (pv-aset node subidx nil)
+ node))))
+
+(defn- unchecked-editable-array-for [tv i]
+ ;; invariant: i is a valid index of tv.
+ (if (>= i (tail-off tv))
+ (.-tail tv)
+ (let [root (.-root tv)]
+ (loop [node root
+ level (.-shift tv)]
+ (if (pos? level)
+ (recur (tv-ensure-editable
+ (.-edit root)
+ (pv-aget node
+ (bit-and (bit-shift-right-zero-fill i level)
+ 0x01f)))
+ (- level 5))
+ (.-arr node))))))
+
+(deftype TransientVector [^:mutable cnt
+ ^:mutable shift
+ ^:mutable root
+ ^:mutable tail]
+ ITransientCollection
+ (-conj! [tcoll o]
+ (if ^boolean (.-edit root)
+ (if (< (- cnt (tail-off tcoll)) 32)
+ (do (aset tail (bit-and cnt 0x01f) o)
+ (set! cnt (inc cnt))
+ tcoll)
+ (let [tail-node (VectorNode. (.-edit root) tail)
+ new-tail (make-array 32)]
+ (aset new-tail 0 o)
+ (set! tail new-tail)
+ (if (> (bit-shift-right-zero-fill cnt 5)
+ (bit-shift-left 1 shift))
+ (let [new-root-array (make-array 32)
+ new-shift (+ shift 5)]
+ (aset new-root-array 0 root)
+ (aset new-root-array 1 (new-path (.-edit root) shift tail-node))
+ (set! root (VectorNode. (.-edit root) new-root-array))
+ (set! shift new-shift)
+ (set! cnt (inc cnt))
+ tcoll)
+ (let [new-root (tv-push-tail tcoll shift root tail-node)]
+ (set! root new-root)
+ (set! cnt (inc cnt))
+ tcoll))))
+ (throw (js/Error. "conj! after persistent!"))))
+
+ (-persistent! [tcoll]
+ (if ^boolean (.-edit root)
+ (do (set! (.-edit root) nil)
+ (let [len (- cnt (tail-off tcoll))
+ trimmed-tail (make-array len)]
+ (array-copy tail 0 trimmed-tail 0 len)
+ (PersistentVector. nil cnt shift root trimmed-tail nil)))
+ (throw (js/Error. "persistent! called twice"))))
+
+ ITransientAssociative
+ (-assoc! [tcoll key val]
+ (if (number? key)
+ (-assoc-n! tcoll key val)
+ (throw (js/Error. "TransientVector's key for assoc! must be a number."))))
+
+ ITransientVector
+ (-assoc-n! [tcoll n val]
+ (if ^boolean (.-edit root)
+ (cond
+ (and (<= 0 n) (< n cnt))
+ (if (<= (tail-off tcoll) n)
+ (do (aset tail (bit-and n 0x01f) val)
+ tcoll)
+ (let [new-root
+ ((fn go [level node]
+ (let [node (tv-ensure-editable (.-edit root) node)]
+ (if (zero? level)
+ (do (pv-aset node (bit-and n 0x01f) val)
+ node)
+ (let [subidx (bit-and (bit-shift-right-zero-fill n level)
+ 0x01f)]
+ (pv-aset node subidx
+ (go (- level 5) (pv-aget node subidx)))
+ node))))
+ shift root)]
+ (set! root new-root)
+ tcoll))
+ (== n cnt) (-conj! tcoll val)
+ :else
+ (throw
+ (js/Error.
+ (str "Index " n " out of bounds for TransientVector of length" cnt))))
+ (throw (js/Error. "assoc! after persistent!"))))
+
+ (-pop! [tcoll]
+ (if ^boolean (.-edit root)
+ (cond
+ (zero? cnt) (throw (js/Error. "Can't pop empty vector"))
+ (== 1 cnt) (do (set! cnt 0) tcoll)
+ (pos? (bit-and (dec cnt) 0x01f)) (do (set! cnt (dec cnt)) tcoll)
+ :else
+ (let [new-tail (unchecked-editable-array-for tcoll (- cnt 2))
+ new-root (let [nr (tv-pop-tail tcoll shift root)]
+ (if-not (nil? nr)
+ nr
+ (VectorNode. (.-edit root) (make-array 32))))]
+ (if (and (< 5 shift) (nil? (pv-aget new-root 1)))
+ (let [new-root (tv-ensure-editable (.-edit root) (pv-aget new-root 0))]
+ (set! root new-root)
+ (set! shift (- shift 5))
+ (set! cnt (dec cnt))
+ (set! tail new-tail)
+ tcoll)
+ (do (set! root new-root)
+ (set! cnt (dec cnt))
+ (set! tail new-tail)
+ tcoll))))
+ (throw (js/Error. "pop! after persistent!"))))
+
+ ICounted
+ (-count [coll]
+ (if ^boolean (.-edit root)
+ cnt
+ (throw (js/Error. "count after persistent!"))))
+
+ IIndexed
+ (-nth [coll n]
+ (if ^boolean (.-edit root)
+ (aget (array-for coll n) (bit-and n 0x01f))
+ (throw (js/Error. "nth after persistent!"))))
+
+ (-nth [coll n not-found]
+ (if (and (<= 0 n) (< n cnt))
+ (-nth coll n)
+ not-found))
+
+ ILookup
+ (-lookup [coll k] (-lookup coll k nil))
+
+ (-lookup [coll k not-found] (if (number? k)
+ (-nth coll k not-found)
+ not-found))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found)))
+
+;;; PersistentQueue ;;;
+
+(deftype PersistentQueueIter [^:mutable fseq riter]
+ Object
+ (hasNext [_]
+ (or (and (some? fseq) (seq fseq)) (and (some? riter) (.hasNext riter))))
+ (next [_]
+ (cond
+ (some? fseq)
+ (let [ret (first fseq)]
+ (set! fseq (next fseq))
+ ret)
+ (and (some? riter) ^boolean (.hasNext riter))
+ (.next riter)
+ :else (throw (js/Error. "No such element"))))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(deftype PersistentQueueSeq [meta front rear ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentQueueSeq. meta front rear __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll] (first front))
+ (-rest [coll]
+ (if-let [f1 (next front)]
+ (PersistentQueueSeq. meta f1 rear nil)
+ (if (nil? rear)
+ (-empty coll)
+ (PersistentQueueSeq. meta rear nil nil))))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll] coll))
+
+(es6-iterable PersistentQueueSeq)
+
+(deftype PersistentQueue [meta count front rear ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [coll] (PersistentQueue. meta count front rear __hash))
+
+ IIterable
+ (-iterator [coll]
+ (PersistentQueueIter. front (-iterator rear)))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentQueue. meta count front rear __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll] (first front))
+ (-rest [coll] (rest (seq coll)))
+
+ IStack
+ (-peek [coll] (first front))
+ (-pop [coll]
+ (if front
+ (if-let [f1 (next front)]
+ (PersistentQueue. meta (dec count) f1 rear nil)
+ (PersistentQueue. meta (dec count) (seq rear) [] nil))
+ coll))
+
+ ICollection
+ (-conj [coll o]
+ (if front
+ (PersistentQueue. meta (inc count) front (conj (or rear []) o) nil)
+ (PersistentQueue. meta (inc count) (conj front o) [] nil)))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY PersistentQueue) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (let [rear (seq rear)]
+ (if (or front rear)
+ (PersistentQueueSeq. nil front (seq rear) nil))))
+
+ ICounted
+ (-count [coll] count))
+
+(set! (.-EMPTY PersistentQueue) (PersistentQueue. nil 0 nil [] empty-ordered-hash))
+
+(es6-iterable PersistentQueue)
+
+(deftype NeverEquiv []
+ Object
+ (equiv [this other]
+ (-equiv this other))
+ IEquiv
+ (-equiv [o other] false))
+
+(def ^:private never-equiv (NeverEquiv.))
+
+(defn- ^boolean equiv-map
+ "Assumes y is a map. Returns true if x equals y, otherwise returns
+ false."
+ [x y]
+ (boolean
+ (when (map? y)
+ ; assume all maps are counted
+ (when (== (count x) (count y))
+ (every? (fn [xkv] (= (get y (first xkv) never-equiv)
+ (second xkv)))
+ x)))))
+
+
+(defn- scan-array [incr k array]
+ (let [len (alength array)]
+ (loop [i 0]
+ (when (< i len)
+ (if (identical? k (aget array i))
+ i
+ (recur (+ i incr)))))))
+
+; The keys field is an array of all keys of this map, in no particular
+; order. Any string, keyword, or symbol key is used as a property name
+; to store the value in strobj. If a key is assoc'ed when that same
+; key already exists in strobj, the old value is overwritten. If a
+; non-string key is assoc'ed, return a HashMap object instead.
+
+(defn- obj-map-compare-keys [a b]
+ (let [a (hash a)
+ b (hash b)]
+ (cond
+ (< a b) -1
+ (> a b) 1
+ :else 0)))
+
+(defn- obj-map->hash-map [m k v]
+ (let [ks (.-keys m)
+ len (alength ks)
+ so (.-strobj m)
+ mm (meta m)]
+ (loop [i 0
+ out (transient (.-EMPTY PersistentHashMap))]
+ (if (< i len)
+ (let [k (aget ks i)]
+ (recur (inc i) (assoc! out k (aget so k))))
+ (with-meta (persistent! (assoc! out k v)) mm)))))
+
+;;; ObjMap - DEPRECATED
+
+(defn- obj-clone [obj ks]
+ (let [new-obj (js-obj)
+ l (alength ks)]
+ (loop [i 0]
+ (when (< i l)
+ (let [k (aget ks i)]
+ (aset new-obj k (aget obj k))
+ (recur (inc i)))))
+ new-obj))
+
+(deftype ObjMap [meta keys strobj update-count ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ IWithMeta
+ (-with-meta [coll meta] (ObjMap. meta keys strobj update-count __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll entry]
+ (if (vector? entry)
+ (-assoc coll (-nth entry 0) (-nth entry 1))
+ (reduce -conj
+ coll
+ entry)))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY ObjMap) meta))
+
+ IEquiv
+ (-equiv [coll other] (equiv-map coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (when (pos? (alength keys))
+ (map #(vector % (aget strobj %))
+ (.sort keys obj-map-compare-keys))))
+
+ ICounted
+ (-count [coll] (alength keys))
+
+ ILookup
+ (-lookup [coll k] (-lookup coll k nil))
+ (-lookup [coll k not-found]
+ (if (and ^boolean (goog/isString k)
+ (not (nil? (scan-array 1 k keys))))
+ (aget strobj k)
+ not-found))
+
+ IAssociative
+ (-assoc [coll k v]
+ (if ^boolean (goog/isString k)
+ (if (or (> update-count (.-HASHMAP_THRESHOLD ObjMap))
+ (>= (alength keys) (.-HASHMAP_THRESHOLD ObjMap)))
+ (obj-map->hash-map coll k v)
+ (if-not (nil? (scan-array 1 k keys))
+ (let [new-strobj (obj-clone strobj keys)]
+ (aset new-strobj k v)
+ (ObjMap. meta keys new-strobj (inc update-count) nil)) ; overwrite
+ (let [new-strobj (obj-clone strobj keys) ; append
+ new-keys (aclone keys)]
+ (aset new-strobj k v)
+ (.push new-keys k)
+ (ObjMap. meta new-keys new-strobj (inc update-count) nil))))
+ ;; non-string key. game over.
+ (obj-map->hash-map coll k v)))
+ (-contains-key? [coll k]
+ (if (and ^boolean (goog/isString k)
+ (not (nil? (scan-array 1 k keys))))
+ true
+ false))
+
+ IKVReduce
+ (-kv-reduce [coll f init]
+ (let [len (alength keys)]
+ (loop [keys (.sort keys obj-map-compare-keys)
+ init init]
+ (if (seq keys)
+ (let [k (first keys)
+ init (f init k (aget strobj k))]
+ (if (reduced? init)
+ @init
+ (recur (rest keys) init)))
+ init))))
+
+ IMap
+ (-dissoc [coll k]
+ (if (and ^boolean (goog/isString k)
+ (not (nil? (scan-array 1 k keys))))
+ (let [new-keys (aclone keys)
+ new-strobj (obj-clone strobj keys)]
+ (.splice new-keys (scan-array 1 k new-keys) 1)
+ (js-delete new-strobj k)
+ (ObjMap. meta new-keys new-strobj (inc update-count) nil))
+ coll)) ; key not found, return coll unchanged
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found))
+
+ IEditableCollection
+ (-as-transient [coll]
+ (transient (into (hash-map) coll))))
+
+(set! (.-EMPTY ObjMap) (ObjMap. nil (array) (js-obj) 0 empty-unordered-hash))
+
+(set! (.-HASHMAP_THRESHOLD ObjMap) 8)
+
+(set! (.-fromObject ObjMap) (fn [ks obj] (ObjMap. nil ks obj 0 nil)))
+
+;; Record Iterator
+(deftype RecordIter [^:mutable i record base-count fields ext-map-iter]
+ Object
+ (hasNext [_]
+ (or (< i base-count) (.hasNext ext-map-iter)))
+ (next [_]
+ (if (< i base-count)
+ (let [k (nth fields i)]
+ (set! i (inc i))
+ [k (-lookup record k)])
+ (.next ext-map-iter)))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+;; EXPERIMENTAL: subject to change
+(deftype ES6EntriesIterator [^:mutable s]
+ Object
+ (next [_]
+ (if-not (nil? s)
+ (let [[k v] (first s)]
+ (set! s (next s))
+ #js {:value #js [k v] :done false})
+ #js {:value nil :done true})))
+
+(defn es6-entries-iterator [coll]
+ (ES6EntriesIterator. (seq coll)))
+
+;; EXPERIMENTAL: subject to change
+(deftype ES6SetEntriesIterator [^:mutable s]
+ Object
+ (next [_]
+ (if-not (nil? s)
+ (let [x (first s)]
+ (set! s (next s))
+ #js {:value #js [x x] :done false})
+ #js {:value nil :done true})))
+
+(defn es6-set-entries-iterator [coll]
+ (ES6SetEntriesIterator. (seq coll)))
+
+;;; PersistentArrayMap
+
+(defn- array-index-of-nil? [arr]
+ (let [len (alength arr)]
+ (loop [i 0]
+ (cond
+ (<= len i) -1
+ (nil? (aget arr i)) i
+ :else (recur (+ i 2))))))
+
+(defn- array-index-of-keyword? [arr k]
+ (let [len (alength arr)
+ kstr (.-fqn k)]
+ (loop [i 0]
+ (cond
+ (<= len i) -1
+ (and (keyword? (aget arr i))
+ (identical? kstr (.-fqn (aget arr i)))) i
+ :else (recur (+ i 2))))))
+
+(defn- array-index-of-symbol? [arr k]
+ (let [len (alength arr)
+ kstr (.-str k)]
+ (loop [i 0]
+ (cond
+ (<= len i) -1
+ (and (symbol? (aget arr i))
+ (identical? kstr (.-str (aget arr i)))) i
+ :else (recur (+ i 2))))))
+
+(defn- array-index-of-identical? [arr k]
+ (let [len (alength arr)]
+ (loop [i 0]
+ (cond
+ (<= len i) -1
+ (identical? k (aget arr i)) i
+ :else (recur (+ i 2))))))
+
+(defn- array-index-of-equiv? [arr k]
+ (let [len (alength arr)]
+ (loop [i 0]
+ (cond
+ (<= len i) -1
+ (= k (aget arr i)) i
+ :else (recur (+ i 2))))))
+
+(defn array-index-of [arr k]
+ (cond
+ (keyword? k) (array-index-of-keyword? arr k)
+
+ (or ^boolean (goog/isString k) (number? k))
+ (array-index-of-identical? arr k)
+
+ (symbol? k) (array-index-of-symbol? arr k)
+
+ (nil? k)
+ (array-index-of-nil? arr)
+
+ :else (array-index-of-equiv? arr k)))
+
+(defn- array-map-index-of [m k]
+ (array-index-of (.-arr m) k))
+
+(defn- array-extend-kv [arr k v]
+ (let [l (alength arr)
+ narr (make-array (+ l 2))]
+ (loop [i 0]
+ (when (< i l)
+ (aset narr i (aget arr i))
+ (recur (inc i))))
+ (aset narr l k)
+ (aset narr (inc l) v)
+ narr))
+
+(defn- array-map-extend-kv [m k v]
+ (array-extend-kv (.-arr m) k v))
+
+(declare TransientArrayMap)
+
+(deftype PersistentArrayMapSeq [arr i _meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMeta
+ (-meta [coll] _meta)
+
+ IWithMeta
+ (-with-meta [coll new-meta]
+ (PersistentArrayMapSeq. arr i new-meta))
+
+ ICounted
+ (-count [coll]
+ (/ (- (alength arr) i) 2))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ICollection
+ (-conj [coll o]
+ (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) _meta))
+
+ IHash
+ (-hash [coll] (hash-ordered-coll coll))
+
+ ISeq
+ (-first [coll]
+ [(aget arr i) (aget arr (inc i))])
+
+ (-rest [coll]
+ (if (< i (- (alength arr) 2))
+ (PersistentArrayMapSeq. arr (+ i 2) _meta)
+ ()))
+
+ INext
+ (-next [coll]
+ (when (< i (- (alength arr) 2))
+ (PersistentArrayMapSeq. arr (+ i 2) _meta)))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable PersistentArrayMapSeq)
+
+(defn persistent-array-map-seq [arr i _meta]
+ (when (<= i (- (alength arr) 2))
+ (PersistentArrayMapSeq. arr i _meta)))
+
+(declare keys vals)
+
+(deftype PersistentArrayMapIterator [arr ^:mutable i cnt]
+ Object
+ (hasNext [_]
+ (< i cnt))
+ (next [_]
+ (let [ret [(aget arr i) (aget arr (inc i))]]
+ (set! i (+ i 2))
+ ret)))
+
+(deftype PersistentArrayMap [meta cnt arr ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ ;; EXPERIMENTAL: subject to change
+ (keys [coll]
+ (es6-iterator (keys coll)))
+ (entries [coll]
+ (es6-entries-iterator (seq coll)))
+ (values [coll]
+ (es6-iterator (vals coll)))
+ (has [coll k]
+ (contains? coll k))
+ (get [coll k not-found]
+ (-lookup coll k not-found))
+ (forEach [coll f]
+ (doseq [[k v] coll]
+ (f v k)))
+
+ ICloneable
+ (-clone [_] (PersistentArrayMap. meta cnt arr __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentArrayMap. meta cnt arr __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll entry]
+ (if (vector? entry)
+ (-assoc coll (-nth entry 0) (-nth entry 1))
+ (loop [ret coll es (seq entry)]
+ (if (nil? es)
+ ret
+ (let [e (first es)]
+ (if (vector? e)
+ (recur (-assoc ret (-nth e 0) (-nth e 1))
+ (next es))
+ (throw (js/Error. "conj on a map takes map entries or seqables of map entries"))))))))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY PersistentArrayMap) meta))
+
+ IEquiv
+ (-equiv [coll other]
+ (if (implements? IMap other)
+ (let [alen (alength arr)
+ ^not-native other other]
+ (if (== cnt (-count other))
+ (loop [i 0]
+ (if (< i alen)
+ (let [v (-lookup other (aget arr i) lookup-sentinel)]
+ (if-not (identical? v lookup-sentinel)
+ (if (= (aget arr (inc i)) v)
+ (recur (+ i 2))
+ false)
+ false))
+ true))
+ false))
+ (equiv-map coll other)))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ IIterable
+ (-iterator [this]
+ (PersistentArrayMapIterator. arr 0 (* cnt 2)))
+
+ ISeqable
+ (-seq [coll]
+ (persistent-array-map-seq arr 0 nil))
+
+ ICounted
+ (-count [coll] cnt)
+
+ ILookup
+ (-lookup [coll k]
+ (-lookup coll k nil))
+
+ (-lookup [coll k not-found]
+ (let [idx (array-map-index-of coll k)]
+ (if (== idx -1)
+ not-found
+ (aget arr (inc idx)))))
+
+ IAssociative
+ (-assoc [coll k v]
+ (let [idx (array-map-index-of coll k)]
+ (cond
+ (== idx -1)
+ (if (< cnt (.-HASHMAP-THRESHOLD PersistentArrayMap))
+ (let [arr (array-map-extend-kv coll k v)]
+ (PersistentArrayMap. meta (inc cnt) arr nil))
+ (-> (into (.-EMPTY PersistentHashMap) coll)
+ (-assoc k v)
+ (-with-meta meta)))
+
+ (identical? v (aget arr (inc idx)))
+ coll
+
+ :else
+ (let [arr (doto (aclone arr)
+ (aset (inc idx) v))]
+ (PersistentArrayMap. meta cnt arr nil)))))
+
+ (-contains-key? [coll k]
+ (not (== (array-map-index-of coll k) -1)))
+
+ IMap
+ (-dissoc [coll k]
+ (let [idx (array-map-index-of coll k)]
+ (if (>= idx 0)
+ (let [len (alength arr)
+ new-len (- len 2)]
+ (if (zero? new-len)
+ (-empty coll)
+ (let [new-arr (make-array new-len)]
+ (loop [s 0 d 0]
+ (cond
+ (>= s len) (PersistentArrayMap. meta (dec cnt) new-arr nil)
+ (= k (aget arr s)) (recur (+ s 2) d)
+ :else (do (aset new-arr d (aget arr s))
+ (aset new-arr (inc d) (aget arr (inc s)))
+ (recur (+ s 2) (+ d 2))))))))
+ coll)))
+
+ IKVReduce
+ (-kv-reduce [coll f init]
+ (let [len (alength arr)]
+ (loop [i 0 init init]
+ (if (< i len)
+ (let [init (f init (aget arr i) (aget arr (inc i)))]
+ (if (reduced? init)
+ @init
+ (recur (+ i 2) init)))
+ init))))
+
+ IReduce
+ (-reduce [coll f]
+ (seq-reduce f coll))
+ (-reduce [coll f start]
+ (seq-reduce f start coll))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found))
+
+ IEditableCollection
+ (-as-transient [coll]
+ (TransientArrayMap. (js-obj) (alength arr) (aclone arr))))
+
+(set! (.-EMPTY PersistentArrayMap) (PersistentArrayMap. nil 0 (array) empty-unordered-hash))
+
+(set! (.-HASHMAP-THRESHOLD PersistentArrayMap) 8)
+
+(set! (.-fromArray PersistentArrayMap)
+ (fn [arr ^boolean no-clone ^boolean no-check]
+ (as-> (if no-clone arr (aclone arr)) arr
+ (if no-check
+ arr
+ (let [ret (array)]
+ (loop [i 0]
+ (when (< i (alength arr))
+ (let [k (aget arr i)
+ v (aget arr (inc i))
+ idx (array-index-of ret k)]
+ (when (== idx -1)
+ (.push ret k)
+ (.push ret v)))
+ (recur (+ i 2))))
+ ret))
+ (let [cnt (/ (alength arr) 2)]
+ (PersistentArrayMap. nil cnt arr nil)))))
+
+(set! (.-createWithCheck PersistentArrayMap)
+ (fn [arr]
+ (let [ret (array)]
+ (loop [i 0]
+ (when (< i (alength arr))
+ (let [k (aget arr i)
+ v (aget arr (inc i))
+ idx (array-index-of ret k)]
+ (if (== idx -1)
+ (doto ret (.push k) (.push v))
+ (throw (js/Error. (str "Duplicate key: " k)))))
+ (recur (+ i 2))))
+ (let [cnt (/ (alength arr) 2)]
+ (PersistentArrayMap. nil cnt arr nil)))))
+
+(set! (.-createAsIfByAssoc PersistentArrayMap)
+ (fn [arr]
+ (let [ret (array)]
+ (loop [i 0]
+ (when (< i (alength arr))
+ (let [k (aget arr i)
+ v (aget arr (inc i))
+ idx (array-index-of ret k)]
+ (if (== idx -1)
+ (doto ret (.push k) (.push v))
+ (aset ret (inc idx) v)))
+ (recur (+ i 2))))
+ (PersistentArrayMap. nil (/ (alength ret) 2) ret nil))))
+
+(es6-iterable PersistentArrayMap)
+
+(declare array->transient-hash-map)
+
+(deftype TransientArrayMap [^:mutable editable?
+ ^:mutable len
+ arr]
+ ICounted
+ (-count [tcoll]
+ (if editable?
+ (quot len 2)
+ (throw (js/Error. "count after persistent!"))))
+
+ ILookup
+ (-lookup [tcoll k]
+ (-lookup tcoll k nil))
+
+ (-lookup [tcoll k not-found]
+ (if editable?
+ (let [idx (array-map-index-of tcoll k)]
+ (if (== idx -1)
+ not-found
+ (aget arr (inc idx))))
+ (throw (js/Error. "lookup after persistent!"))))
+
+ ITransientCollection
+ (-conj! [tcoll o]
+ (if editable?
+ (if (satisfies? IMapEntry o)
+ (-assoc! tcoll (key o) (val o))
+ (loop [es (seq o) tcoll tcoll]
+ (if-let [e (first es)]
+ (recur (next es)
+ (-assoc! tcoll (key e) (val e)))
+ tcoll)))
+ (throw (js/Error. "conj! after persistent!"))))
+
+ (-persistent! [tcoll]
+ (if editable?
+ (do (set! editable? false)
+ (PersistentArrayMap. nil (quot len 2) arr nil))
+ (throw (js/Error. "persistent! called twice"))))
+
+ ITransientAssociative
+ (-assoc! [tcoll key val]
+ (if editable?
+ (let [idx (array-map-index-of tcoll key)]
+ (if (== idx -1)
+ (if (<= (+ len 2) (* 2 (.-HASHMAP-THRESHOLD PersistentArrayMap)))
+ (do (set! len (+ len 2))
+ (.push arr key)
+ (.push arr val)
+ tcoll)
+ (assoc! (array->transient-hash-map len arr) key val))
+ (if (identical? val (aget arr (inc idx)))
+ tcoll
+ (do (aset arr (inc idx) val)
+ tcoll))))
+ (throw (js/Error. "assoc! after persistent!"))))
+
+ ITransientMap
+ (-dissoc! [tcoll key]
+ (if editable?
+ (let [idx (array-map-index-of tcoll key)]
+ (when (>= idx 0)
+ (aset arr idx (aget arr (- len 2)))
+ (aset arr (inc idx) (aget arr (dec len)))
+ (doto arr .pop .pop)
+ (set! len (- len 2)))
+ tcoll)
+ (throw (js/Error. "dissoc! after persistent!")))))
+
+(declare TransientHashMap PersistentHashMap)
+
+(defn- array->transient-hash-map [len arr]
+ (loop [out (transient (.-EMPTY PersistentHashMap))
+ i 0]
+ (if (< i len)
+ (recur (assoc! out (aget arr i) (aget arr (inc i))) (+ i 2))
+ out)))
+
+;;; PersistentHashMap
+
+(deftype Box [^:mutable val])
+
+(declare create-inode-seq create-array-node-seq reset! create-node atom deref)
+
+(defn ^boolean key-test [key other]
+ (cond
+ (identical? key other) true
+ (keyword-identical? key other) true
+ :else (= key other)))
+
+(defn- mask [hash shift]
+ (bit-and (bit-shift-right-zero-fill hash shift) 0x01f))
+
+(defn- clone-and-set
+ ([arr i a]
+ (doto (aclone arr)
+ (aset i a)))
+ ([arr i a j b]
+ (doto (aclone arr)
+ (aset i a)
+ (aset j b))))
+
+(defn- remove-pair [arr i]
+ (let [new-arr (make-array (- (alength arr) 2))]
+ (array-copy arr 0 new-arr 0 (* 2 i))
+ (array-copy arr (* 2 (inc i)) new-arr (* 2 i) (- (alength new-arr) (* 2 i)))
+ new-arr))
+
+(defn- bitmap-indexed-node-index [bitmap bit]
+ (bit-count (bit-and bitmap (dec bit))))
+
+(defn- bitpos [hash shift]
+ (bit-shift-left 1 (mask hash shift)))
+
+(defn- edit-and-set
+ ([inode edit i a]
+ (let [editable (.ensure-editable inode edit)]
+ (aset (.-arr editable) i a)
+ editable))
+ ([inode edit i a j b]
+ (let [editable (.ensure-editable inode edit)]
+ (aset (.-arr editable) i a)
+ (aset (.-arr editable) j b)
+ editable)))
+
+(defn- inode-kv-reduce [arr f init]
+ (let [len (alength arr)]
+ (loop [i 0 init init]
+ (if (< i len)
+ (let [init (let [k (aget arr i)]
+ (if-not (nil? k)
+ (f init k (aget arr (inc i)))
+ (let [node (aget arr (inc i))]
+ (if-not (nil? node)
+ (.kv-reduce node f init)
+ init))))]
+ (if (reduced? init)
+ @init
+ (recur (+ i 2) init)))
+ init))))
+
+(declare ArrayNode)
+
+ (deftype NodeIterator [arr ^:mutable i ^:mutable next-entry ^:mutable next-iter]
+ Object
+ (advance [this]
+ (let [len (alength arr)]
+ (loop []
+ (if (< i len)
+ (let [key (aget arr i)
+ node-or-val (aget arr (inc i))
+ ^boolean found
+ (cond (some? key)
+ (set! next-entry [key node-or-val])
+ (some? node-or-val)
+ (let [new-iter (-iterator node-or-val)]
+ (if ^boolean (.hasNext new-iter)
+ (set! next-iter new-iter)
+ false))
+ :else false)]
+ (set! i (+ i 2))
+ (if found true (recur)))
+ false))))
+ (hasNext [this]
+ (or (some? next-entry) (some? next-iter) (.advance this)))
+ (next [this]
+ (cond
+ (some? next-entry)
+ (let [ret next-entry]
+ (set! next-entry nil)
+ ret)
+ (some? next-iter)
+ (let [ret (.next next-iter)]
+ (when-not ^boolean (.hasNext next-iter)
+ (set! next-iter nil))
+ ret)
+ ^boolean (.advance this)
+ (.next this)
+ :else (throw (js/Error. "No such element"))))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(deftype BitmapIndexedNode [edit ^:mutable bitmap ^:mutable arr]
+ Object
+ (inode-assoc [inode shift hash key val added-leaf?]
+ (let [bit (bitpos hash shift)
+ idx (bitmap-indexed-node-index bitmap bit)]
+ (if (zero? (bit-and bitmap bit))
+ (let [n (bit-count bitmap)]
+ (if (>= n 16)
+ (let [nodes (make-array 32)
+ jdx (mask hash shift)]
+ (aset nodes jdx (.inode-assoc (.-EMPTY BitmapIndexedNode) (+ shift 5) hash key val added-leaf?))
+ (loop [i 0 j 0]
+ (if (< i 32)
+ (if (zero? (bit-and (bit-shift-right-zero-fill bitmap i) 1))
+ (recur (inc i) j)
+ (do (aset nodes i
+ (if-not (nil? (aget arr j))
+ (.inode-assoc (.-EMPTY BitmapIndexedNode)
+ (+ shift 5) (cljs.core/hash (aget arr j)) (aget arr j) (aget arr (inc j)) added-leaf?)
+ (aget arr (inc j))))
+ (recur (inc i) (+ j 2))))))
+ (ArrayNode. nil (inc n) nodes))
+ (let [new-arr (make-array (* 2 (inc n)))]
+ (array-copy arr 0 new-arr 0 (* 2 idx))
+ (aset new-arr (* 2 idx) key)
+ (aset new-arr (inc (* 2 idx)) val)
+ (array-copy arr (* 2 idx) new-arr (* 2 (inc idx)) (* 2 (- n idx)))
+ (set! (.-val added-leaf?) true)
+ (BitmapIndexedNode. nil (bit-or bitmap bit) new-arr))))
+ (let [key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil)
+ (let [n (.inode-assoc val-or-node (+ shift 5) hash key val added-leaf?)]
+ (if (identical? n val-or-node)
+ inode
+ (BitmapIndexedNode. nil bitmap (clone-and-set arr (inc (* 2 idx)) n))))
+
+ (key-test key key-or-nil)
+ (if (identical? val val-or-node)
+ inode
+ (BitmapIndexedNode. nil bitmap (clone-and-set arr (inc (* 2 idx)) val)))
+
+ :else
+ (do (set! (.-val added-leaf?) true)
+ (BitmapIndexedNode. nil bitmap
+ (clone-and-set arr (* 2 idx) nil (inc (* 2 idx))
+ (create-node (+ shift 5) key-or-nil val-or-node hash key val)))))))))
+
+ (inode-without [inode shift hash key]
+ (let [bit (bitpos hash shift)]
+ (if (zero? (bit-and bitmap bit))
+ inode
+ (let [idx (bitmap-indexed-node-index bitmap bit)
+ key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil)
+ (let [n (.inode-without val-or-node (+ shift 5) hash key)]
+ (cond (identical? n val-or-node) inode
+ (not (nil? n)) (BitmapIndexedNode. nil bitmap (clone-and-set arr (inc (* 2 idx)) n))
+ (== bitmap bit) nil
+ :else (BitmapIndexedNode. nil (bit-xor bitmap bit) (remove-pair arr idx))))
+ (key-test key key-or-nil)
+ (BitmapIndexedNode. nil (bit-xor bitmap bit) (remove-pair arr idx))
+ :else inode)))))
+
+ (inode-lookup [inode shift hash key not-found]
+ (let [bit (bitpos hash shift)]
+ (if (zero? (bit-and bitmap bit))
+ not-found
+ (let [idx (bitmap-indexed-node-index bitmap bit)
+ key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil) (.inode-lookup val-or-node (+ shift 5) hash key not-found)
+ (key-test key key-or-nil) val-or-node
+ :else not-found)))))
+
+ (inode-find [inode shift hash key not-found]
+ (let [bit (bitpos hash shift)]
+ (if (zero? (bit-and bitmap bit))
+ not-found
+ (let [idx (bitmap-indexed-node-index bitmap bit)
+ key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil) (.inode-find val-or-node (+ shift 5) hash key not-found)
+ (key-test key key-or-nil) [key-or-nil val-or-node]
+ :else not-found)))))
+
+ (inode-seq [inode]
+ (create-inode-seq arr))
+
+ (ensure-editable [inode e]
+ (if (identical? e edit)
+ inode
+ (let [n (bit-count bitmap)
+ new-arr (make-array (if (neg? n) 4 (* 2 (inc n))))]
+ (array-copy arr 0 new-arr 0 (* 2 n))
+ (BitmapIndexedNode. e bitmap new-arr))))
+
+ (edit-and-remove-pair [inode e bit i]
+ (if (== bitmap bit)
+ nil
+ (let [editable (.ensure-editable inode e)
+ earr (.-arr editable)
+ len (alength earr)]
+ (set! (.-bitmap editable) (bit-xor bit (.-bitmap editable)))
+ (array-copy earr (* 2 (inc i))
+ earr (* 2 i)
+ (- len (* 2 (inc i))))
+ (aset earr (- len 2) nil)
+ (aset earr (dec len) nil)
+ editable)))
+
+ (inode-assoc! [inode edit shift hash key val added-leaf?]
+ (let [bit (bitpos hash shift)
+ idx (bitmap-indexed-node-index bitmap bit)]
+ (if (zero? (bit-and bitmap bit))
+ (let [n (bit-count bitmap)]
+ (cond
+ (< (* 2 n) (alength arr))
+ (let [editable (.ensure-editable inode edit)
+ earr (.-arr editable)]
+ (set! (.-val added-leaf?) true)
+ (array-copy-downward earr (* 2 idx)
+ earr (* 2 (inc idx))
+ (* 2 (- n idx)))
+ (aset earr (* 2 idx) key)
+ (aset earr (inc (* 2 idx)) val)
+ (set! (.-bitmap editable) (bit-or (.-bitmap editable) bit))
+ editable)
+
+ (>= n 16)
+ (let [nodes (make-array 32)
+ jdx (mask hash shift)]
+ (aset nodes jdx (.inode-assoc! (.-EMPTY BitmapIndexedNode) edit (+ shift 5) hash key val added-leaf?))
+ (loop [i 0 j 0]
+ (if (< i 32)
+ (if (zero? (bit-and (bit-shift-right-zero-fill bitmap i) 1))
+ (recur (inc i) j)
+ (do (aset nodes i
+ (if-not (nil? (aget arr j))
+ (.inode-assoc! (.-EMPTY BitmapIndexedNode)
+ edit (+ shift 5) (cljs.core/hash (aget arr j)) (aget arr j) (aget arr (inc j)) added-leaf?)
+ (aget arr (inc j))))
+ (recur (inc i) (+ j 2))))))
+ (ArrayNode. edit (inc n) nodes))
+
+ :else
+ (let [new-arr (make-array (* 2 (+ n 4)))]
+ (array-copy arr 0 new-arr 0 (* 2 idx))
+ (aset new-arr (* 2 idx) key)
+ (aset new-arr (inc (* 2 idx)) val)
+ (array-copy arr (* 2 idx) new-arr (* 2 (inc idx)) (* 2 (- n idx)))
+ (set! (.-val added-leaf?) true)
+ (let [editable (.ensure-editable inode edit)]
+ (set! (.-arr editable) new-arr)
+ (set! (.-bitmap editable) (bit-or (.-bitmap editable) bit))
+ editable))))
+ (let [key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil)
+ (let [n (.inode-assoc! val-or-node edit (+ shift 5) hash key val added-leaf?)]
+ (if (identical? n val-or-node)
+ inode
+ (edit-and-set inode edit (inc (* 2 idx)) n)))
+
+ (key-test key key-or-nil)
+ (if (identical? val val-or-node)
+ inode
+ (edit-and-set inode edit (inc (* 2 idx)) val))
+
+ :else
+ (do (set! (.-val added-leaf?) true)
+ (edit-and-set inode edit (* 2 idx) nil (inc (* 2 idx))
+ (create-node edit (+ shift 5) key-or-nil val-or-node hash key val))))))))
+
+ (inode-without! [inode edit shift hash key removed-leaf?]
+ (let [bit (bitpos hash shift)]
+ (if (zero? (bit-and bitmap bit))
+ inode
+ (let [idx (bitmap-indexed-node-index bitmap bit)
+ key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil)
+ (let [n (.inode-without! val-or-node edit (+ shift 5) hash key removed-leaf?)]
+ (cond (identical? n val-or-node) inode
+ (not (nil? n)) (edit-and-set inode edit (inc (* 2 idx)) n)
+ (== bitmap bit) nil
+ :else (.edit-and-remove-pair inode edit bit idx)))
+ (key-test key key-or-nil)
+ (do (aset removed-leaf? 0 true)
+ (.edit-and-remove-pair inode edit bit idx))
+ :else inode)))))
+
+ (kv-reduce [inode f init]
+ (inode-kv-reduce arr f init))
+
+ IIterable
+ (-iterator [coll]
+ (NodeIterator. arr 0 nil nil)))
+
+(set! (.-EMPTY BitmapIndexedNode) (BitmapIndexedNode. nil 0 (make-array 0)))
+
+(defn- pack-array-node [array-node edit idx]
+ (let [arr (.-arr array-node)
+ len (alength arr)
+ new-arr (make-array (* 2 (dec (.-cnt array-node))))]
+ (loop [i 0 j 1 bitmap 0]
+ (if (< i len)
+ (if (and (not (== i idx))
+ (not (nil? (aget arr i))))
+ (do (aset new-arr j (aget arr i))
+ (recur (inc i) (+ j 2) (bit-or bitmap (bit-shift-left 1 i))))
+ (recur (inc i) j bitmap))
+ (BitmapIndexedNode. edit bitmap new-arr)))))
+
+(deftype ArrayNodeIterator [arr ^:mutable i ^:mutable next-iter]
+ Object
+ (hasNext [this]
+ (let [len (alength arr)]
+ (loop []
+ (if-not (and (some? next-iter) ^boolean (.hasNext next-iter))
+ (if (< i len)
+ (let [node (aget arr i)]
+ (set! i (inc i))
+ (when (some? node)
+ (set! next-iter (-iterator node)))
+ (recur))
+ false)
+ true))))
+ (next [this]
+ (if ^boolean (.hasNext this)
+ (.next next-iter)
+ (throw (js/Error. "No such element"))))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(deftype ArrayNode [edit ^:mutable cnt ^:mutable arr]
+ Object
+ (inode-assoc [inode shift hash key val added-leaf?]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if (nil? node)
+ (ArrayNode. nil (inc cnt) (clone-and-set arr idx (.inode-assoc (.-EMPTY BitmapIndexedNode) (+ shift 5) hash key val added-leaf?)))
+ (let [n (.inode-assoc node (+ shift 5) hash key val added-leaf?)]
+ (if (identical? n node)
+ inode
+ (ArrayNode. nil cnt (clone-and-set arr idx n)))))))
+
+ (inode-without [inode shift hash key]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if-not (nil? node)
+ (let [n (.inode-without node (+ shift 5) hash key)]
+ (cond
+ (identical? n node)
+ inode
+
+ (nil? n)
+ (if (<= cnt 8)
+ (pack-array-node inode nil idx)
+ (ArrayNode. nil (dec cnt) (clone-and-set arr idx n)))
+
+ :else
+ (ArrayNode. nil cnt (clone-and-set arr idx n))))
+ inode)))
+
+ (inode-lookup [inode shift hash key not-found]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if-not (nil? node)
+ (.inode-lookup node (+ shift 5) hash key not-found)
+ not-found)))
+
+ (inode-find [inode shift hash key not-found]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if-not (nil? node)
+ (.inode-find node (+ shift 5) hash key not-found)
+ not-found)))
+
+ (inode-seq [inode]
+ (create-array-node-seq arr))
+
+ (ensure-editable [inode e]
+ (if (identical? e edit)
+ inode
+ (ArrayNode. e cnt (aclone arr))))
+
+ (inode-assoc! [inode edit shift hash key val added-leaf?]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if (nil? node)
+ (let [editable (edit-and-set inode edit idx (.inode-assoc! (.-EMPTY BitmapIndexedNode) edit (+ shift 5) hash key val added-leaf?))]
+ (set! (.-cnt editable) (inc (.-cnt editable)))
+ editable)
+ (let [n (.inode-assoc! node edit (+ shift 5) hash key val added-leaf?)]
+ (if (identical? n node)
+ inode
+ (edit-and-set inode edit idx n))))))
+
+ (inode-without! [inode edit shift hash key removed-leaf?]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if (nil? node)
+ inode
+ (let [n (.inode-without! node edit (+ shift 5) hash key removed-leaf?)]
+ (cond
+ (identical? n node)
+ inode
+
+ (nil? n)
+ (if (<= cnt 8)
+ (pack-array-node inode edit idx)
+ (let [editable (edit-and-set inode edit idx n)]
+ (set! (.-cnt editable) (dec (.-cnt editable)))
+ editable))
+
+ :else
+ (edit-and-set inode edit idx n))))))
+
+ (kv-reduce [inode f init]
+ (let [len (alength arr)] ; actually 32
+ (loop [i 0 init init]
+ (if (< i len)
+ (let [node (aget arr i)]
+ (if-not (nil? node)
+ (let [init (.kv-reduce node f init)]
+ (if (reduced? init)
+ @init
+ (recur (inc i) init)))
+ (recur (inc i) init)))
+ init))))
+
+ IIterable
+ (-iterator [coll]
+ (ArrayNodeIterator. arr 0 nil)))
+
+(defn- hash-collision-node-find-index [arr cnt key]
+ (let [lim (* 2 cnt)]
+ (loop [i 0]
+ (if (< i lim)
+ (if (key-test key (aget arr i))
+ i
+ (recur (+ i 2)))
+ -1))))
+
+(deftype HashCollisionNode [edit
+ ^:mutable collision-hash
+ ^:mutable cnt
+ ^:mutable arr]
+ Object
+ (inode-assoc [inode shift hash key val added-leaf?]
+ (if (== hash collision-hash)
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (if (== idx -1)
+ (let [len (* 2 cnt)
+ new-arr (make-array (+ len 2))]
+ (array-copy arr 0 new-arr 0 len)
+ (aset new-arr len key)
+ (aset new-arr (inc len) val)
+ (set! (.-val added-leaf?) true)
+ (HashCollisionNode. nil collision-hash (inc cnt) new-arr))
+ (if (= (aget arr (inc idx)) val)
+ inode
+ (HashCollisionNode. nil collision-hash cnt (clone-and-set arr (inc idx) val)))))
+ (.inode-assoc (BitmapIndexedNode. nil (bitpos collision-hash shift) (array nil inode))
+ shift hash key val added-leaf?)))
+
+ (inode-without [inode shift hash key]
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (cond (== idx -1) inode
+ (== cnt 1) nil
+ :else (HashCollisionNode. nil collision-hash (dec cnt) (remove-pair arr (quot idx 2))))))
+
+ (inode-lookup [inode shift hash key not-found]
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (cond (< idx 0) not-found
+ (key-test key (aget arr idx)) (aget arr (inc idx))
+ :else not-found)))
+
+ (inode-find [inode shift hash key not-found]
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (cond (< idx 0) not-found
+ (key-test key (aget arr idx)) [(aget arr idx) (aget arr (inc idx))]
+ :else not-found)))
+
+ (inode-seq [inode]
+ (create-inode-seq arr))
+
+ (ensure-editable [inode e]
+ (if (identical? e edit)
+ inode
+ (let [new-arr (make-array (* 2 (inc cnt)))]
+ (array-copy arr 0 new-arr 0 (* 2 cnt))
+ (HashCollisionNode. e collision-hash cnt new-arr))))
+
+ (ensure-editable-array [inode e count array]
+ (if (identical? e edit)
+ (do (set! arr array)
+ (set! cnt count)
+ inode)
+ (HashCollisionNode. edit collision-hash count array)))
+
+ (inode-assoc! [inode edit shift hash key val added-leaf?]
+ (if (== hash collision-hash)
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (if (== idx -1)
+ (if (> (alength arr) (* 2 cnt))
+ (let [editable (edit-and-set inode edit (* 2 cnt) key (inc (* 2 cnt)) val)]
+ (set! (.-val added-leaf?) true)
+ (set! (.-cnt editable) (inc (.-cnt editable)))
+ editable)
+ (let [len (alength arr)
+ new-arr (make-array (+ len 2))]
+ (array-copy arr 0 new-arr 0 len)
+ (aset new-arr len key)
+ (aset new-arr (inc len) val)
+ (set! (.-val added-leaf?) true)
+ (.ensure-editable-array inode edit (inc cnt) new-arr)))
+ (if (identical? (aget arr (inc idx)) val)
+ inode
+ (edit-and-set inode edit (inc idx) val))))
+ (.inode-assoc! (BitmapIndexedNode. edit (bitpos collision-hash shift) (array nil inode nil nil))
+ edit shift hash key val added-leaf?)))
+
+ (inode-without! [inode edit shift hash key removed-leaf?]
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (if (== idx -1)
+ inode
+ (do (aset removed-leaf? 0 true)
+ (if (== cnt 1)
+ nil
+ (let [editable (.ensure-editable inode edit)
+ earr (.-arr editable)]
+ (aset earr idx (aget earr (- (* 2 cnt) 2)))
+ (aset earr (inc idx) (aget earr (dec (* 2 cnt))))
+ (aset earr (dec (* 2 cnt)) nil)
+ (aset earr (- (* 2 cnt) 2) nil)
+ (set! (.-cnt editable) (dec (.-cnt editable)))
+ editable))))))
+
+ (kv-reduce [inode f init]
+ (inode-kv-reduce arr f init))
+
+ IIterable
+ (-iterator [coll]
+ (NodeIterator. arr 0 nil nil)))
+
+(defn- create-node
+ ([shift key1 val1 key2hash key2 val2]
+ (let [key1hash (hash key1)]
+ (if (== key1hash key2hash)
+ (HashCollisionNode. nil key1hash 2 (array key1 val1 key2 val2))
+ (let [added-leaf? (Box. false)]
+ (-> (.-EMPTY BitmapIndexedNode)
+ (.inode-assoc shift key1hash key1 val1 added-leaf?)
+ (.inode-assoc shift key2hash key2 val2 added-leaf?))))))
+ ([edit shift key1 val1 key2hash key2 val2]
+ (let [key1hash (hash key1)]
+ (if (== key1hash key2hash)
+ (HashCollisionNode. nil key1hash 2 (array key1 val1 key2 val2))
+ (let [added-leaf? (Box. false)]
+ (-> (.-EMPTY BitmapIndexedNode)
+ (.inode-assoc! edit shift key1hash key1 val1 added-leaf?)
+ (.inode-assoc! edit shift key2hash key2 val2 added-leaf?)))))))
+
+(deftype NodeSeq [meta nodes i s ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMeta
+ (-meta [coll] meta)
+
+ IWithMeta
+ (-with-meta [coll meta] (NodeSeq. meta nodes i s __hash))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) meta))
+
+ ISequential
+ ISeq
+ (-first [coll]
+ (if (nil? s)
+ [(aget nodes i) (aget nodes (inc i))]
+ (first s)))
+
+ (-rest [coll]
+ (let [ret (if (nil? s)
+ (create-inode-seq nodes (+ i 2) nil)
+ (create-inode-seq nodes i (next s)))]
+ (if-not (nil? ret) ret ())))
+
+ ISeqable
+ (-seq [this] this)
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable NodeSeq)
+
+(defn- create-inode-seq
+ ([nodes]
+ (create-inode-seq nodes 0 nil))
+ ([nodes i s]
+ (if (nil? s)
+ (let [len (alength nodes)]
+ (loop [j i]
+ (if (< j len)
+ (if-not (nil? (aget nodes j))
+ (NodeSeq. nil nodes j nil nil)
+ (if-let [node (aget nodes (inc j))]
+ (if-let [node-seq (.inode-seq node)]
+ (NodeSeq. nil nodes (+ j 2) node-seq nil)
+ (recur (+ j 2)))
+ (recur (+ j 2)))))))
+ (NodeSeq. nil nodes i s nil))))
+
+(deftype ArrayNodeSeq [meta nodes i s ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMeta
+ (-meta [coll] meta)
+
+ IWithMeta
+ (-with-meta [coll meta] (ArrayNodeSeq. meta nodes i s __hash))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) meta))
+
+ ISequential
+ ISeq
+ (-first [coll] (first s))
+ (-rest [coll]
+ (let [ret (create-array-node-seq nil nodes i (next s))]
+ (if-not (nil? ret) ret ())))
+
+ ISeqable
+ (-seq [this] this)
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable ArrayNodeSeq)
+
+(defn- create-array-node-seq
+ ([nodes] (create-array-node-seq nil nodes 0 nil))
+ ([meta nodes i s]
+ (if (nil? s)
+ (let [len (alength nodes)]
+ (loop [j i]
+ (if (< j len)
+ (if-let [nj (aget nodes j)]
+ (if-let [ns (.inode-seq nj)]
+ (ArrayNodeSeq. meta nodes (inc j) ns nil)
+ (recur (inc j)))
+ (recur (inc j))))))
+ (ArrayNodeSeq. meta nodes i s nil))))
+
+(declare TransientHashMap)
+
+(deftype HashMapIter [nil-val root-iter ^:mutable seen]
+ Object
+ (hasNext [_]
+ (or (not ^boolean seen) ^boolean (.hasNext root-iter)))
+ (next [_]
+ (if-not ^boolean seen
+ (do
+ (set! seen true)
+ [nil nil-val])
+ (.next root-iter)))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(deftype PersistentHashMap [meta cnt root ^boolean has-nil? nil-val ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ ;; EXPERIMENTAL: subject to change
+ (keys [coll]
+ (es6-iterator (keys coll)))
+ (entries [coll]
+ (es6-entries-iterator (seq coll)))
+ (values [coll]
+ (es6-iterator (vals coll)))
+ (has [coll k]
+ (contains? coll k))
+ (get [coll k not-found]
+ (-lookup coll k not-found))
+ (forEach [coll f]
+ (doseq [[k v] coll]
+ (f v k)))
+
+ ICloneable
+ (-clone [_] (PersistentHashMap. meta cnt root has-nil? nil-val __hash))
+
+ IIterable
+ (-iterator [coll]
+ (let [root-iter (if ^boolean root (-iterator root) (nil-iter))]
+ (if has-nil?
+ (HashMapIter. nil-val root-iter false)
+ root-iter)))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentHashMap. meta cnt root has-nil? nil-val __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll entry]
+ (if (vector? entry)
+ (-assoc coll (-nth entry 0) (-nth entry 1))
+ (loop [ret coll es (seq entry)]
+ (if (nil? es)
+ ret
+ (let [e (first es)]
+ (if (vector? e)
+ (recur (-assoc ret (-nth e 0) (-nth e 1))
+ (next es))
+ (throw (js/Error. "conj on a map takes map entries or seqables of map entries"))))))))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY PersistentHashMap) meta))
+
+ IEquiv
+ (-equiv [coll other] (equiv-map coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (when (pos? cnt)
+ (let [s (if-not (nil? root) (.inode-seq root))]
+ (if has-nil?
+ (cons [nil nil-val] s)
+ s))))
+
+ ICounted
+ (-count [coll] cnt)
+
+ ILookup
+ (-lookup [coll k]
+ (-lookup coll k nil))
+
+ (-lookup [coll k not-found]
+ (cond (nil? k) (if has-nil?
+ nil-val
+ not-found)
+ (nil? root) not-found
+ :else (.inode-lookup root 0 (hash k) k not-found)))
+
+ IAssociative
+ (-assoc [coll k v]
+ (if (nil? k)
+ (if (and has-nil? (identical? v nil-val))
+ coll
+ (PersistentHashMap. meta (if has-nil? cnt (inc cnt)) root true v nil))
+ (let [added-leaf? (Box. false)
+ new-root (-> (if (nil? root)
+ (.-EMPTY BitmapIndexedNode)
+ root)
+ (.inode-assoc 0 (hash k) k v added-leaf?))]
+ (if (identical? new-root root)
+ coll
+ (PersistentHashMap. meta (if ^boolean (.-val added-leaf?) (inc cnt) cnt) new-root has-nil? nil-val nil)))))
+
+ (-contains-key? [coll k]
+ (cond (nil? k) has-nil?
+ (nil? root) false
+ :else (not (identical? (.inode-lookup root 0 (hash k) k lookup-sentinel)
+ lookup-sentinel))))
+
+ IMap
+ (-dissoc [coll k]
+ (cond (nil? k) (if has-nil?
+ (PersistentHashMap. meta (dec cnt) root false nil nil)
+ coll)
+ (nil? root) coll
+ :else
+ (let [new-root (.inode-without root 0 (hash k) k)]
+ (if (identical? new-root root)
+ coll
+ (PersistentHashMap. meta (dec cnt) new-root has-nil? nil-val nil)))))
+
+ IKVReduce
+ (-kv-reduce [coll f init]
+ (let [init (if has-nil? (f init nil nil-val) init)]
+ (cond
+ (reduced? init) @init
+ (not (nil? root)) (.kv-reduce root f init)
+ :else init)))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found))
+
+ IEditableCollection
+ (-as-transient [coll]
+ (TransientHashMap. (js-obj) root cnt has-nil? nil-val)))
+
+(set! (.-EMPTY PersistentHashMap) (PersistentHashMap. nil 0 nil false nil empty-unordered-hash))
+
+(set! (.-fromArray PersistentHashMap)
+ (fn [arr ^boolean no-clone]
+ (let [arr (if no-clone arr (aclone arr))
+ len (alength arr)]
+ (loop [i 0 ret (transient (.-EMPTY PersistentHashMap))]
+ (if (< i len)
+ (recur (+ i 2)
+ (-assoc! ret (aget arr i) (aget arr (inc i))))
+ (-persistent! ret))))))
+
+(set! (.-fromArrays PersistentHashMap)
+ (fn [ks vs]
+ (let [len (alength ks)]
+ (loop [i 0 ^not-native out (transient (.-EMPTY PersistentHashMap))]
+ (if (< i len)
+ (recur (inc i) (-assoc! out (aget ks i) (aget vs i)))
+ (persistent! out))))))
+
+(set! (.-createWithCheck PersistentHashMap)
+ (fn [arr]
+ (let [len (alength arr)
+ ret (transient (.-EMPTY PersistentHashMap))]
+ (loop [i 0]
+ (when (< i len)
+ (-assoc! ret (aget arr i) (aget arr (inc i)))
+ (if (not= (-count ret) (inc (/ i 2)))
+ (throw (js/Error. (str "Duplicate key: " (aget arr i))))
+ (recur (+ i 2)))))
+ (-persistent! ret))))
+
+(es6-iterable PersistentHashMap)
+
+(deftype TransientHashMap [^:mutable ^boolean edit
+ ^:mutable root
+ ^:mutable count
+ ^:mutable ^boolean has-nil?
+ ^:mutable nil-val]
+ Object
+ (conj! [tcoll o]
+ (if edit
+ (if (satisfies? IMapEntry o)
+ (.assoc! tcoll (key o) (val o))
+ (loop [es (seq o) tcoll tcoll]
+ (if-let [e (first es)]
+ (recur (next es)
+ (.assoc! tcoll (key e) (val e)))
+ tcoll)))
+ (throw (js/Error. "conj! after persistent"))))
+
+ (assoc! [tcoll k v]
+ (if edit
+ (if (nil? k)
+ (do (if (identical? nil-val v)
+ nil
+ (set! nil-val v))
+ (if has-nil?
+ nil
+ (do (set! count (inc count))
+ (set! has-nil? true)))
+ tcoll)
+ (let [added-leaf? (Box. false)
+ node (-> (if (nil? root)
+ (.-EMPTY BitmapIndexedNode)
+ root)
+ (.inode-assoc! edit 0 (hash k) k v added-leaf?))]
+ (if (identical? node root)
+ nil
+ (set! root node))
+ (if ^boolean (.-val added-leaf?)
+ (set! count (inc count)))
+ tcoll))
+ (throw (js/Error. "assoc! after persistent!"))))
+
+ (without! [tcoll k]
+ (if edit
+ (if (nil? k)
+ (if has-nil?
+ (do (set! has-nil? false)
+ (set! nil-val nil)
+ (set! count (dec count))
+ tcoll)
+ tcoll)
+ (if (nil? root)
+ tcoll
+ (let [removed-leaf? (Box. false)
+ node (.inode-without! root edit 0 (hash k) k removed-leaf?)]
+ (if (identical? node root)
+ nil
+ (set! root node))
+ (if (aget removed-leaf? 0)
+ (set! count (dec count)))
+ tcoll)))
+ (throw (js/Error. "dissoc! after persistent!"))))
+
+ (persistent! [tcoll]
+ (if edit
+ (do (set! edit nil)
+ (PersistentHashMap. nil count root has-nil? nil-val nil))
+ (throw (js/Error. "persistent! called twice"))))
+
+ ICounted
+ (-count [coll]
+ (if edit
+ count
+ (throw (js/Error. "count after persistent!"))))
+
+ ILookup
+ (-lookup [tcoll k]
+ (if (nil? k)
+ (if has-nil?
+ nil-val)
+ (if (nil? root)
+ nil
+ (.inode-lookup root 0 (hash k) k))))
+
+ (-lookup [tcoll k not-found]
+ (if (nil? k)
+ (if has-nil?
+ nil-val
+ not-found)
+ (if (nil? root)
+ not-found
+ (.inode-lookup root 0 (hash k) k not-found))))
+
+ ITransientCollection
+ (-conj! [tcoll val] (.conj! tcoll val))
+
+ (-persistent! [tcoll] (.persistent! tcoll))
+
+ ITransientAssociative
+ (-assoc! [tcoll key val] (.assoc! tcoll key val))
+
+ ITransientMap
+ (-dissoc! [tcoll key] (.without! tcoll key)))
+
+;;; PersistentTreeMap
+
+(defn- tree-map-seq-push [node stack ^boolean ascending?]
+ (loop [t node stack stack]
+ (if-not (nil? t)
+ (recur (if ascending? (.-left t) (.-right t))
+ (conj stack t))
+ stack)))
+
+(deftype PersistentTreeMapSeq [meta stack ^boolean ascending? cnt ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ISeqable
+ (-seq [this] this)
+
+ ISequential
+ ISeq
+ (-first [this] (peek stack))
+ (-rest [this]
+ (let [t (first stack)
+ next-stack (tree-map-seq-push (if ascending? (.-right t) (.-left t))
+ (next stack)
+ ascending?)]
+ (if-not (nil? next-stack)
+ (PersistentTreeMapSeq. nil next-stack ascending? (dec cnt) nil)
+ ())))
+
+ ICounted
+ (-count [coll]
+ (if (neg? cnt)
+ (inc (count (next coll)))
+ cnt))
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) meta))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ IWithMeta
+ (-with-meta [coll meta]
+ (PersistentTreeMapSeq. meta stack ascending? cnt __hash))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable PersistentTreeMapSeq)
+
+(defn- create-tree-map-seq [tree ascending? cnt]
+ (PersistentTreeMapSeq. nil (tree-map-seq-push tree nil ascending?) ascending? cnt nil))
+
+(declare RedNode BlackNode)
+
+(defn- balance-left [key val ins right]
+ (if (instance? RedNode ins)
+ (cond
+ (instance? RedNode (.-left ins))
+ (RedNode. (.-key ins) (.-val ins)
+ (.blacken (.-left ins))
+ (BlackNode. key val (.-right ins) right nil)
+ nil)
+
+ (instance? RedNode (.-right ins))
+ (RedNode. (.. ins -right -key) (.. ins -right -val)
+ (BlackNode. (.-key ins) (.-val ins)
+ (.-left ins)
+ (.. ins -right -left)
+ nil)
+ (BlackNode. key val
+ (.. ins -right -right)
+ right
+ nil)
+ nil)
+
+ :else
+ (BlackNode. key val ins right nil))
+ (BlackNode. key val ins right nil)))
+
+(defn- balance-right [key val left ins]
+ (if (instance? RedNode ins)
+ (cond
+ (instance? RedNode (.-right ins))
+ (RedNode. (.-key ins) (.-val ins)
+ (BlackNode. key val left (.-left ins) nil)
+ (.blacken (.-right ins))
+ nil)
+
+ (instance? RedNode (.-left ins))
+ (RedNode. (.. ins -left -key) (.. ins -left -val)
+ (BlackNode. key val left (.. ins -left -left) nil)
+ (BlackNode. (.-key ins) (.-val ins)
+ (.. ins -left -right)
+ (.-right ins)
+ nil)
+ nil)
+
+ :else
+ (BlackNode. key val left ins nil))
+ (BlackNode. key val left ins nil)))
+
+(defn- balance-left-del [key val del right]
+ (cond
+ (instance? RedNode del)
+ (RedNode. key val (.blacken del) right nil)
+
+ (instance? BlackNode right)
+ (balance-right key val del (.redden right))
+
+ (and (instance? RedNode right) (instance? BlackNode (.-left right)))
+ (RedNode. (.. right -left -key) (.. right -left -val)
+ (BlackNode. key val del (.. right -left -left) nil)
+ (balance-right (.-key right) (.-val right)
+ (.. right -left -right)
+ (.redden (.-right right)))
+ nil)
+
+ :else
+ (throw (js/Error. "red-black tree invariant violation"))))
+
+(defn- balance-right-del [key val left del]
+ (cond
+ (instance? RedNode del)
+ (RedNode. key val left (.blacken del) nil)
+
+ (instance? BlackNode left)
+ (balance-left key val (.redden left) del)
+
+ (and (instance? RedNode left) (instance? BlackNode (.-right left)))
+ (RedNode. (.. left -right -key) (.. left -right -val)
+ (balance-left (.-key left) (.-val left)
+ (.redden (.-left left))
+ (.. left -right -left))
+ (BlackNode. key val (.. left -right -right) del nil)
+ nil)
+
+ :else
+ (throw (js/Error. "red-black tree invariant violation"))))
+
+(defn- tree-map-kv-reduce [node f init]
+ (let [init (if-not (nil? (.-left node))
+ (tree-map-kv-reduce (.-left node) f init)
+ init)]
+ (if (reduced? init)
+ @init
+ (let [init (f init (.-key node) (.-val node))]
+ (if (reduced? init)
+ @init
+ (let [init (if-not (nil? (.-right node))
+ (tree-map-kv-reduce (.-right node) f init)
+ init)]
+ (if (reduced? init)
+ @init
+ init)))))))
+
+(deftype BlackNode [key val left right ^:mutable __hash]
+ Object
+ (add-left [node ins]
+ (.balance-left ins node))
+
+ (add-right [node ins]
+ (.balance-right ins node))
+
+ (remove-left [node del]
+ (balance-left-del key val del right))
+
+ (remove-right [node del]
+ (balance-right-del key val left del))
+
+ (blacken [node] node)
+
+ (redden [node] (RedNode. key val left right nil))
+
+ (balance-left [node parent]
+ (BlackNode. (.-key parent) (.-val parent) node (.-right parent) nil))
+
+ (balance-right [node parent]
+ (BlackNode. (.-key parent) (.-val parent) (.-left parent) node nil))
+
+ (replace [node key val left right]
+ (BlackNode. key val left right nil))
+
+ (kv-reduce [node f init]
+ (tree-map-kv-reduce node f init))
+
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMapEntry
+ (-key [node] key)
+ (-val [node] val)
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IMeta
+ (-meta [node] nil)
+
+ IWithMeta
+ (-with-meta [node meta]
+ (with-meta [key val] meta))
+
+ IStack
+ (-peek [node] val)
+
+ (-pop [node] [key])
+
+ ICollection
+ (-conj [node o] [key val o])
+
+ IEmptyableCollection
+ (-empty [node] [])
+
+ ISequential
+ ISeqable
+ (-seq [node] (list key val))
+
+ ICounted
+ (-count [node] 2)
+
+ IIndexed
+ (-nth [node n]
+ (cond (== n 0) key
+ (== n 1) val
+ :else nil))
+
+ (-nth [node n not-found]
+ (cond (== n 0) key
+ (== n 1) val
+ :else not-found))
+
+ ILookup
+ (-lookup [node k] (-nth node k nil))
+ (-lookup [node k not-found] (-nth node k not-found))
+
+ IAssociative
+ (-assoc [node k v]
+ (assoc [key val] k v))
+
+ IVector
+ (-assoc-n [node n v]
+ (-assoc-n [key val] n v))
+
+ IReduce
+ (-reduce [node f]
+ (ci-reduce node f))
+
+ (-reduce [node f start]
+ (ci-reduce node f start))
+
+ IFn
+ (-invoke [node k]
+ (-lookup node k))
+
+ (-invoke [node k not-found]
+ (-lookup node k not-found)))
+
+(es6-iterable BlackNode)
+
+(deftype RedNode [key val left right ^:mutable __hash]
+ Object
+ (add-left [node ins]
+ (RedNode. key val ins right nil))
+
+ (add-right [node ins]
+ (RedNode. key val left ins nil))
+
+ (remove-left [node del]
+ (RedNode. key val del right nil))
+
+ (remove-right [node del]
+ (RedNode. key val left del nil))
+
+ (blacken [node]
+ (BlackNode. key val left right nil))
+
+ (redden [node]
+ (throw (js/Error. "red-black tree invariant violation")))
+
+ (balance-left [node parent]
+ (cond
+ (instance? RedNode left)
+ (RedNode. key val
+ (.blacken left)
+ (BlackNode. (.-key parent) (.-val parent) right (.-right parent) nil)
+ nil)
+
+ (instance? RedNode right)
+ (RedNode. (.-key right) (.-val right)
+ (BlackNode. key val left (.-left right) nil)
+ (BlackNode. (.-key parent) (.-val parent)
+ (.-right right)
+ (.-right parent)
+ nil)
+ nil)
+
+ :else
+ (BlackNode. (.-key parent) (.-val parent) node (.-right parent) nil)))
+
+ (balance-right [node parent]
+ (cond
+ (instance? RedNode right)
+ (RedNode. key val
+ (BlackNode. (.-key parent) (.-val parent)
+ (.-left parent)
+ left
+ nil)
+ (.blacken right)
+ nil)
+
+ (instance? RedNode left)
+ (RedNode. (.-key left) (.-val left)
+ (BlackNode. (.-key parent) (.-val parent)
+ (.-left parent)
+ (.-left left)
+ nil)
+ (BlackNode. key val (.-right left) right nil)
+ nil)
+
+ :else
+ (BlackNode. (.-key parent) (.-val parent) (.-left parent) node nil)))
+
+ (replace [node key val left right]
+ (RedNode. key val left right nil))
+
+ (kv-reduce [node f init]
+ (tree-map-kv-reduce node f init))
+
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMapEntry
+ (-key [node] key)
+ (-val [node] val)
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IMeta
+ (-meta [node] nil)
+
+ IWithMeta
+ (-with-meta [node meta]
+ (with-meta [key val] meta))
+
+ IStack
+ (-peek [node] val)
+
+ (-pop [node] [key])
+
+ ICollection
+ (-conj [node o] [key val o])
+
+ IEmptyableCollection
+ (-empty [node] [])
+
+ ISequential
+ ISeqable
+ (-seq [node] (list key val))
+
+ ICounted
+ (-count [node] 2)
+
+ IIndexed
+ (-nth [node n]
+ (cond (== n 0) key
+ (== n 1) val
+ :else nil))
+
+ (-nth [node n not-found]
+ (cond (== n 0) key
+ (== n 1) val
+ :else not-found))
+
+ ILookup
+ (-lookup [node k] (-nth node k nil))
+ (-lookup [node k not-found] (-nth node k not-found))
+
+ IAssociative
+ (-assoc [node k v]
+ (assoc [key val] k v))
+
+ IVector
+ (-assoc-n [node n v]
+ (-assoc-n [key val] n v))
+
+ IReduce
+ (-reduce [node f]
+ (ci-reduce node f))
+
+ (-reduce [node f start]
+ (ci-reduce node f start))
+
+ IFn
+ (-invoke [node k]
+ (-lookup node k))
+
+ (-invoke [node k not-found]
+ (-lookup node k not-found)))
+
+(es6-iterable RedNode)
+
+(defn- tree-map-add [comp tree k v found]
+ (if (nil? tree)
+ (RedNode. k v nil nil nil)
+ (let [c (comp k (.-key tree))]
+ (cond
+ (zero? c)
+ (do (aset found 0 tree)
+ nil)
+
+ (neg? c)
+ (let [ins (tree-map-add comp (.-left tree) k v found)]
+ (if-not (nil? ins)
+ (.add-left tree ins)))
+
+ :else
+ (let [ins (tree-map-add comp (.-right tree) k v found)]
+ (if-not (nil? ins)
+ (.add-right tree ins)))))))
+
+(defn- tree-map-append [left right]
+ (cond
+ (nil? left)
+ right
+
+ (nil? right)
+ left
+
+ (instance? RedNode left)
+ (if (instance? RedNode right)
+ (let [app (tree-map-append (.-right left) (.-left right))]
+ (if (instance? RedNode app)
+ (RedNode. (.-key app) (.-val app)
+ (RedNode. (.-key left) (.-val left)
+ (.-left left)
+ (.-left app)
+ nil)
+ (RedNode. (.-key right) (.-val right)
+ (.-right app)
+ (.-right right)
+ nil)
+ nil)
+ (RedNode. (.-key left) (.-val left)
+ (.-left left)
+ (RedNode. (.-key right) (.-val right) app (.-right right) nil)
+ nil)))
+ (RedNode. (.-key left) (.-val left)
+ (.-left left)
+ (tree-map-append (.-right left) right)
+ nil))
+
+ (instance? RedNode right)
+ (RedNode. (.-key right) (.-val right)
+ (tree-map-append left (.-left right))
+ (.-right right)
+ nil)
+
+ :else
+ (let [app (tree-map-append (.-right left) (.-left right))]
+ (if (instance? RedNode app)
+ (RedNode. (.-key app) (.-val app)
+ (BlackNode. (.-key left) (.-val left)
+ (.-left left)
+ (.-left app)
+ nil)
+ (BlackNode. (.-key right) (.-val right)
+ (.-right app)
+ (.-right right)
+ nil)
+ nil)
+ (balance-left-del (.-key left) (.-val left)
+ (.-left left)
+ (BlackNode. (.-key right) (.-val right)
+ app
+ (.-right right)
+ nil))))))
+
+(defn- tree-map-remove [comp tree k found]
+ (if-not (nil? tree)
+ (let [c (comp k (.-key tree))]
+ (cond
+ (zero? c)
+ (do (aset found 0 tree)
+ (tree-map-append (.-left tree) (.-right tree)))
+
+ (neg? c)
+ (let [del (tree-map-remove comp (.-left tree) k found)]
+ (if (or (not (nil? del)) (not (nil? (aget found 0))))
+ (if (instance? BlackNode (.-left tree))
+ (balance-left-del (.-key tree) (.-val tree) del (.-right tree))
+ (RedNode. (.-key tree) (.-val tree) del (.-right tree) nil))))
+
+ :else
+ (let [del (tree-map-remove comp (.-right tree) k found)]
+ (if (or (not (nil? del)) (not (nil? (aget found 0))))
+ (if (instance? BlackNode (.-right tree))
+ (balance-right-del (.-key tree) (.-val tree) (.-left tree) del)
+ (RedNode. (.-key tree) (.-val tree) (.-left tree) del nil))))))))
+
+(defn- tree-map-replace [comp tree k v]
+ (let [tk (.-key tree)
+ c (comp k tk)]
+ (cond (zero? c) (.replace tree tk v (.-left tree) (.-right tree))
+ (neg? c) (.replace tree tk (.-val tree) (tree-map-replace comp (.-left tree) k v) (.-right tree))
+ :else (.replace tree tk (.-val tree) (.-left tree) (tree-map-replace comp (.-right tree) k v)))))
+
+(declare key)
+
+(deftype PersistentTreeMap [comp tree cnt meta ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ ;; EXPERIMENTAL: subject to change
+ (keys [coll]
+ (es6-iterator (keys coll)))
+ (entries [coll]
+ (es6-entries-iterator (seq coll)))
+ (values [coll]
+ (es6-iterator (vals coll)))
+ (has [coll k]
+ (contains? coll k))
+ (get [coll k not-found]
+ (-lookup coll k not-found))
+ (forEach [coll f]
+ (doseq [[k v] coll]
+ (f v k)))
+
+ (entry-at [coll k]
+ (loop [t tree]
+ (if-not (nil? t)
+ (let [c (comp k (.-key t))]
+ (cond (zero? c) t
+ (neg? c) (recur (.-left t))
+ :else (recur (.-right t)))))))
+
+ ICloneable
+ (-clone [_] (PersistentTreeMap. comp tree cnt meta __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentTreeMap. comp tree cnt meta __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll entry]
+ (if (vector? entry)
+ (-assoc coll (-nth entry 0) (-nth entry 1))
+ (loop [ret coll es (seq entry)]
+ (if (nil? es)
+ ret
+ (let [e (first es)]
+ (if (vector? e)
+ (recur (-assoc ret (-nth e 0) (-nth e 1))
+ (next es))
+ (throw (js/Error. "conj on a map takes map entries or seqables of map entries"))))))))
+
+ IEmptyableCollection
+ (-empty [coll] (PersistentTreeMap. comp nil 0 meta 0))
+
+ IEquiv
+ (-equiv [coll other] (equiv-map coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ ICounted
+ (-count [coll] cnt)
+
+ IKVReduce
+ (-kv-reduce [coll f init]
+ (if-not (nil? tree)
+ (tree-map-kv-reduce tree f init)
+ init))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found))
+
+ ISeqable
+ (-seq [coll]
+ (if (pos? cnt)
+ (create-tree-map-seq tree true cnt)))
+
+ IReversible
+ (-rseq [coll]
+ (if (pos? cnt)
+ (create-tree-map-seq tree false cnt)))
+
+ ILookup
+ (-lookup [coll k]
+ (-lookup coll k nil))
+
+ (-lookup [coll k not-found]
+ (let [n (.entry-at coll k)]
+ (if-not (nil? n)
+ (.-val n)
+ not-found)))
+
+ IAssociative
+ (-assoc [coll k v]
+ (let [found (array nil)
+ t (tree-map-add comp tree k v found)]
+ (if (nil? t)
+ (let [found-node (nth found 0)]
+ (if (= v (.-val found-node))
+ coll
+ (PersistentTreeMap. comp (tree-map-replace comp tree k v) cnt meta nil)))
+ (PersistentTreeMap. comp (.blacken t) (inc cnt) meta nil))))
+
+ (-contains-key? [coll k]
+ (not (nil? (.entry-at coll k))))
+
+ IMap
+ (-dissoc [coll k]
+ (let [found (array nil)
+ t (tree-map-remove comp tree k found)]
+ (if (nil? t)
+ (if (nil? (nth found 0))
+ coll
+ (PersistentTreeMap. comp nil 0 meta nil))
+ (PersistentTreeMap. comp (.blacken t) (dec cnt) meta nil))))
+
+ ISorted
+ (-sorted-seq [coll ascending?]
+ (if (pos? cnt)
+ (create-tree-map-seq tree ascending? cnt)))
+
+ (-sorted-seq-from [coll k ascending?]
+ (if (pos? cnt)
+ (loop [stack nil t tree]
+ (if-not (nil? t)
+ (let [c (comp k (.-key t))]
+ (cond
+ (zero? c) (PersistentTreeMapSeq. nil (conj stack t) ascending? -1 nil)
+ ascending? (if (neg? c)
+ (recur (conj stack t) (.-left t))
+ (recur stack (.-right t)))
+ :else (if (pos? c)
+ (recur (conj stack t) (.-right t))
+ (recur stack (.-left t)))))
+ (when-not (nil? stack)
+ (PersistentTreeMapSeq. nil stack ascending? -1 nil))))))
+
+ (-entry-key [coll entry] (key entry))
+
+ (-comparator [coll] comp))
+
+(set! (.-EMPTY PersistentTreeMap) (PersistentTreeMap. compare nil 0 nil empty-unordered-hash))
+
+(es6-iterable PersistentTreeMap)
+
+(defn hash-map
+ "keyval => key val
+ Returns a new hash map with supplied mappings."
+ [& keyvals]
+ (loop [in (seq keyvals), out (transient (.-EMPTY PersistentHashMap))]
+ (if in
+ (recur (nnext in) (assoc! out (first in) (second in)))
+ (persistent! out))))
+
+(defn array-map
+ "keyval => key val
+ Returns a new array map with supplied mappings."
+ [& keyvals]
+ (let [arr (if (and (instance? IndexedSeq keyvals) (zero? (.-i keyvals)))
+ (.-arr keyvals)
+ (into-array keyvals))]
+ (.createAsIfByAssoc PersistentArrayMap arr true false)))
+
+(defn obj-map
+ "keyval => key val
+ Returns a new object map with supplied mappings."
+ [& keyvals]
+ (let [ks (array)
+ obj (js-obj)]
+ (loop [kvs (seq keyvals)]
+ (if kvs
+ (do (.push ks (first kvs))
+ (aset obj (first kvs) (second kvs))
+ (recur (nnext kvs)))
+ (.fromObject ObjMap ks obj)))))
+
+(defn sorted-map
+ "keyval => key val
+ Returns a new sorted map with supplied mappings."
+ ([& keyvals]
+ (loop [in (seq keyvals) out (.-EMPTY PersistentTreeMap)]
+ (if in
+ (recur (nnext in) (assoc out (first in) (second in)))
+ out))))
+
+(defn sorted-map-by
+ "keyval => key val
+ Returns a new sorted map with supplied mappings, using the supplied comparator."
+ ([comparator & keyvals]
+ (loop [in (seq keyvals)
+ out (PersistentTreeMap. (fn->comparator comparator) nil 0 nil 0)]
+ (if in
+ (recur (nnext in) (assoc out (first in) (second in)))
+ out))))
+
+(deftype KeySeq [^not-native mseq _meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMeta
+ (-meta [coll] _meta)
+
+ IWithMeta
+ (-with-meta [coll new-meta] (KeySeq. mseq new-meta))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ICollection
+ (-conj [coll o]
+ (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) _meta))
+
+ IHash
+ (-hash [coll] (hash-ordered-coll coll))
+
+ ISeq
+ (-first [coll]
+ (let [^not-native me (-first mseq)]
+ (-key me)))
+
+ (-rest [coll]
+ (let [nseq (if (satisfies? INext mseq)
+ (-next mseq)
+ (next mseq))]
+ (if-not (nil? nseq)
+ (KeySeq. nseq _meta)
+ ())))
+
+ INext
+ (-next [coll]
+ (let [nseq (if (satisfies? INext mseq)
+ (-next mseq)
+ (next mseq))]
+ (when-not (nil? nseq)
+ (KeySeq. nseq _meta))))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable KeySeq)
+
+(defn keys
+ "Returns a sequence of the map's keys."
+ [hash-map]
+ (when-let [mseq (seq hash-map)]
+ (KeySeq. mseq nil)))
+
+(defn key
+ "Returns the key of the map entry."
+ [map-entry]
+ (-key map-entry))
+
+(deftype ValSeq [^not-native mseq _meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMeta
+ (-meta [coll] _meta)
+
+ IWithMeta
+ (-with-meta [coll new-meta] (ValSeq. mseq new-meta))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ICollection
+ (-conj [coll o]
+ (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY List) _meta))
+
+ IHash
+ (-hash [coll] (hash-ordered-coll coll))
+
+ ISeq
+ (-first [coll]
+ (let [^not-native me (-first mseq)]
+ (-val me)))
+
+ (-rest [coll]
+ (let [nseq (if (satisfies? INext mseq)
+ (-next mseq)
+ (next mseq))]
+ (if-not (nil? nseq)
+ (ValSeq. nseq _meta)
+ ())))
+
+ INext
+ (-next [coll]
+ (let [nseq (if (satisfies? INext mseq)
+ (-next mseq)
+ (next mseq))]
+ (when-not (nil? nseq)
+ (ValSeq. nseq _meta))))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable ValSeq)
+
+(defn vals
+ "Returns a sequence of the map's values."
+ [hash-map]
+ (when-let [mseq (seq hash-map)]
+ (ValSeq. mseq nil)))
+
+(defn val
+ "Returns the value in the map entry."
+ [map-entry]
+ (-val map-entry))
+
+(defn merge
+ "Returns a map that consists of the rest of the maps conj-ed onto
+ the first. If a key occurs in more than one map, the mapping from
+ the latter (left-to-right) will be the mapping in the result."
+ [& maps]
+ (when (some identity maps)
+ (reduce #(conj (or %1 {}) %2) maps)))
+
+(defn merge-with
+ "Returns a map that consists of the rest of the maps conj-ed onto
+ the first. If a key occurs in more than one map, the mapping(s)
+ from the latter (left-to-right) will be combined with the mapping in
+ the result by calling (f val-in-result val-in-latter)."
+ [f & maps]
+ (when (some identity maps)
+ (let [merge-entry (fn [m e]
+ (let [k (first e) v (second e)]
+ (if (contains? m k)
+ (assoc m k (f (get m k) v))
+ (assoc m k v))))
+ merge2 (fn [m1 m2]
+ (reduce merge-entry (or m1 {}) (seq m2)))]
+ (reduce merge2 maps))))
+
+(defn select-keys
+ "Returns a map containing only those entries in map whose key is in keys"
+ [map keyseq]
+ (loop [ret {} keys (seq keyseq)]
+ (if keys
+ (let [key (first keys)
+ entry (get map key ::not-found)]
+ (recur
+ (if (not= entry ::not-found)
+ (assoc ret key entry)
+ ret)
+ (next keys)))
+ (with-meta ret (meta map)))))
+
+;;; PersistentHashSet
+
+(declare TransientHashSet)
+
+(deftype HashSetIter [iter]
+ Object
+ (hasNext [_]
+ (.hasNext iter))
+ (next [_]
+ (if ^boolean (.hasNext iter)
+ (aget (.-tail (.next iter)) 0)
+ (throw (js/Error. "No such element"))))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(deftype PersistentHashSet [meta hash-map ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ ;; EXPERIMENTAL: subject to change
+ (keys [coll]
+ (es6-iterator (seq coll)))
+ (entries [coll]
+ (es6-set-entries-iterator (seq coll)))
+ (values [coll]
+ (es6-iterator (seq coll)))
+ (has [coll k]
+ (contains? coll k))
+ (forEach [coll f]
+ (doseq [[k v] coll]
+ (f v k)))
+
+ ICloneable
+ (-clone [_] (PersistentHashSet. meta hash-map __hash))
+
+ IIterable
+ (-iterator [coll]
+ (HashSetIter. (-iterator hash-map)))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentHashSet. meta hash-map __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll o]
+ (PersistentHashSet. meta (assoc hash-map o nil) nil))
+
+ IEmptyableCollection
+ (-empty [coll] (with-meta (.-EMPTY PersistentHashSet) meta))
+
+ IEquiv
+ (-equiv [coll other]
+ (and
+ (set? other)
+ (== (count coll) (count other))
+ (every? #(contains? coll %)
+ other)))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ ISeqable
+ (-seq [coll] (keys hash-map))
+
+ ICounted
+ (-count [coll] (-count hash-map))
+
+ ILookup
+ (-lookup [coll v]
+ (-lookup coll v nil))
+ (-lookup [coll v not-found]
+ (if (-contains-key? hash-map v)
+ v
+ not-found))
+
+ ISet
+ (-disjoin [coll v]
+ (PersistentHashSet. meta (-dissoc hash-map v) nil))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found))
+
+ IEditableCollection
+ (-as-transient [coll] (TransientHashSet. (-as-transient hash-map))))
+
+(set! (.-EMPTY PersistentHashSet)
+ (PersistentHashSet. nil (.-EMPTY PersistentArrayMap) empty-unordered-hash))
+
+(set! (.-fromArray PersistentHashSet)
+ (fn [items ^boolean no-clone]
+ (let [len (alength items)]
+ (if (<= len (.-HASHMAP-THRESHOLD PersistentArrayMap))
+ (let [arr (if no-clone items (aclone items))]
+ (loop [i 0
+ out (transient (.-EMPTY PersistentArrayMap))]
+ (if (< i len)
+ (recur (inc i) (-assoc! out (aget items i) nil))
+ (PersistentHashSet. nil (-persistent! out) nil))))
+ (loop [i 0
+ out (transient (.-EMPTY PersistentHashSet))]
+ (if (< i len)
+ (recur (inc i) (-conj! out (aget items i)))
+ (-persistent! out)))))))
+
+(set! (.-createWithCheck PersistentHashSet)
+ (fn [items]
+ (let [len (alength items)
+ t (-as-transient (.-EMPTY PersistentHashSet))]
+ (dotimes [i len]
+ (-conj! t (aget items i))
+ (when-not (= (count t) (inc i))
+ (throw (js/Error. (str "Duplicate key: " (aget items i))))))
+ (-persistent! t))))
+
+(set! (.-createAsIfByAssoc PersistentHashSet)
+ (fn [items]
+ (let [len (alength items)
+ t (-as-transient (.-EMPTY PersistentHashSet))]
+ (dotimes [i len] (-conj! t (aget items i)))
+ (-persistent! t))))
+
+(es6-iterable PersistentHashSet)
+
+(deftype TransientHashSet [^:mutable transient-map]
+ ITransientCollection
+ (-conj! [tcoll o]
+ (set! transient-map (assoc! transient-map o nil))
+ tcoll)
+
+ (-persistent! [tcoll]
+ (PersistentHashSet. nil (persistent! transient-map) nil))
+
+ ITransientSet
+ (-disjoin! [tcoll v]
+ (set! transient-map (dissoc! transient-map v))
+ tcoll)
+
+ ICounted
+ (-count [tcoll] (count transient-map))
+
+ ILookup
+ (-lookup [tcoll v]
+ (-lookup tcoll v nil))
+
+ (-lookup [tcoll v not-found]
+ (if (identical? (-lookup transient-map v lookup-sentinel) lookup-sentinel)
+ not-found
+ v))
+
+ IFn
+ (-invoke [tcoll k]
+ (if (identical? (-lookup transient-map k lookup-sentinel) lookup-sentinel)
+ nil
+ k))
+
+ (-invoke [tcoll k not-found]
+ (if (identical? (-lookup transient-map k lookup-sentinel) lookup-sentinel)
+ not-found
+ k)))
+
+(deftype PersistentTreeSet [meta tree-map ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ ;; EXPERIMENTAL: subject to change
+ (keys [coll]
+ (es6-iterator (seq coll)))
+ (entries [coll]
+ (es6-set-entries-iterator (seq coll)))
+ (values [coll]
+ (es6-iterator (seq coll)))
+ (has [coll k]
+ (contains? coll k))
+ (forEach [coll f]
+ (doseq [[k v] coll]
+ (f v k)))
+
+ ICloneable
+ (-clone [_] (PersistentTreeSet. meta tree-map __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentTreeSet. meta tree-map __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll o]
+ (PersistentTreeSet. meta (assoc tree-map o nil) nil))
+
+ IEmptyableCollection
+ (-empty [coll] (PersistentTreeSet. meta (-empty tree-map) 0))
+
+ IEquiv
+ (-equiv [coll other]
+ (and
+ (set? other)
+ (== (count coll) (count other))
+ (every? #(contains? coll %)
+ other)))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ ISeqable
+ (-seq [coll] (keys tree-map))
+
+ ISorted
+ (-sorted-seq [coll ascending?]
+ (map key (-sorted-seq tree-map ascending?)))
+
+ (-sorted-seq-from [coll k ascending?]
+ (map key (-sorted-seq-from tree-map k ascending?)))
+
+ (-entry-key [coll entry] entry)
+
+ (-comparator [coll] (-comparator tree-map))
+
+ IReversible
+ (-rseq [coll]
+ (if (pos? (count tree-map))
+ (map key (rseq tree-map))))
+
+ ICounted
+ (-count [coll] (count tree-map))
+
+ ILookup
+ (-lookup [coll v]
+ (-lookup coll v nil))
+ (-lookup [coll v not-found]
+ (let [n (.entry-at tree-map v)]
+ (if-not (nil? n)
+ (.-key n)
+ not-found)))
+
+ ISet
+ (-disjoin [coll v]
+ (PersistentTreeSet. meta (dissoc tree-map v) nil))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found)))
+
+(set! (.-EMPTY PersistentTreeSet)
+ (PersistentTreeSet. nil (.-EMPTY PersistentTreeMap) empty-unordered-hash))
+
+(es6-iterable PersistentTreeSet)
+
+(defn set-from-indexed-seq [iseq]
+ (let [arr (.-arr iseq)
+ ret (areduce arr i ^not-native res (-as-transient #{})
+ (-conj! res (aget arr i)))]
+ (-persistent! ^not-native ret)))
+
+(defn set
+ "Returns a set of the distinct elements of coll."
+ [coll]
+ (let [in (seq coll)]
+ (cond
+ (nil? in) #{}
+
+ (and (instance? IndexedSeq in) (zero? (.-i in)))
+ (.createAsIfByAssoc PersistentHashSet (.-arr in))
+
+ :else
+ (loop [^not-native in in
+ ^not-native out (-as-transient #{})]
+ (if-not (nil? in)
+ (recur (next in) (-conj! out (-first in)))
+ (persistent! out))))))
+
+(defn hash-set
+ "Returns a new hash set with supplied keys. Any equal keys are
+ handled as if by repeated uses of conj."
+ ([] #{})
+ ([& keys] (set keys)))
+
+(defn sorted-set
+ "Returns a new sorted set with supplied keys."
+ ([& keys]
+ (reduce -conj (.-EMPTY PersistentTreeSet) keys)))
+
+(defn sorted-set-by
+ "Returns a new sorted set with supplied keys, using the supplied comparator."
+ ([comparator & keys]
+ (reduce -conj
+ (PersistentTreeSet. nil (sorted-map-by comparator) 0)
+ keys)))
+
+(defn replace
+ "Given a map of replacement pairs and a vector/collection, returns a
+ vector/seq with any elements = a key in smap replaced with the
+ corresponding val in smap. Returns a transducer when no collection
+ is provided."
+ ([smap]
+ (map #(if-let [e (find smap %)] (val e) %)))
+ ([smap coll]
+ (if (vector? coll)
+ (let [n (count coll)]
+ (reduce (fn [v i]
+ (if-let [e (find smap (nth v i))]
+ (assoc v i (second e))
+ v))
+ coll (take n (iterate inc 0))))
+ (map #(if-let [e (find smap %)] (second e) %) coll))))
+
+(defn distinct
+ "Returns a lazy sequence of the elements of coll with duplicates removed.
+ Returns a stateful transducer when no collection is provided."
+ ([]
+ (fn [rf]
+ (let [seen (volatile! #{})]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (if (contains? @seen input)
+ result
+ (do (vswap! seen conj input)
+ (rf result input))))))))
+ ([coll]
+ (let [step (fn step [xs seen]
+ (lazy-seq
+ ((fn [[f :as xs] seen]
+ (when-let [s (seq xs)]
+ (if (contains? seen f)
+ (recur (rest s) seen)
+ (cons f (step (rest s) (conj seen f))))))
+ xs seen)))]
+ (step coll #{}))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defn butlast
+ "Return a seq of all but the last item in coll, in linear time"
+ [s]
+ (loop [ret [] s s]
+ (if (next s)
+ (recur (conj ret (first s)) (next s))
+ (seq ret))))
+
+(defn name
+ "Returns the name String of a string, symbol or keyword."
+ [x]
+ (if (implements? INamed x)
+ (-name ^not-native x)
+ (if (string? x)
+ x
+ (throw (js/Error. (str "Doesn't support name: " x))))))
+
+(defn zipmap
+ "Returns a map with the keys mapped to the corresponding vals."
+ [keys vals]
+ (loop [map (transient {})
+ ks (seq keys)
+ vs (seq vals)]
+ (if (and ks vs)
+ (recur (assoc! map (first ks) (first vs))
+ (next ks)
+ (next vs))
+ (persistent! map))))
+
+(defn max-key
+ "Returns the x for which (k x), a number, is greatest."
+ ([k x] x)
+ ([k x y] (if (> (k x) (k y)) x y))
+ ([k x y & more]
+ (reduce #(max-key k %1 %2) (max-key k x y) more)))
+
+(defn min-key
+ "Returns the x for which (k x), a number, is least."
+ ([k x] x)
+ ([k x y] (if (< (k x) (k y)) x y))
+ ([k x y & more]
+ (reduce #(min-key k %1 %2) (min-key k x y) more)))
+
+(deftype ArrayList [^:mutable arr]
+ Object
+ (add [_ x] (.push arr x))
+ (size [_] (alength arr))
+ (clear [_] (set! arr (array)))
+ (isEmpty [_] (zero? (alength arr)))
+ (toArray [_] arr))
+
+(defn array-list []
+ (ArrayList. (array)))
+
+(defn partition-all
+ "Returns a lazy sequence of lists like partition, but may include
+ partitions with fewer than n items at the end. Returns a stateful
+ transducer when no collection is provided."
+ ([n]
+ (fn [rf]
+ (let [a (array-list)]
+ (fn
+ ([] (rf))
+ ([result]
+ (let [result (if (.isEmpty a)
+ result
+ (let [v (vec (.toArray a))]
+ ;;clear first!
+ (.clear a)
+ (unreduced (rf result v))))]
+ (rf result)))
+ ([result input]
+ (.add a input)
+ (if (== n (.size a))
+ (let [v (vec (.toArray a))]
+ (.clear a)
+ (rf result v))
+ result))))))
+ ([n coll]
+ (partition-all n n coll))
+ ([n step coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (cons (take n s) (partition-all n step (drop step s)))))))
+
+(defn take-while
+ "Returns a lazy sequence of successive items from coll while
+ (pred item) returns true. pred must be free of side-effects.
+ Returns a transducer when no collection is provided."
+ ([pred]
+ (fn [rf]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (if (pred input)
+ (rf result input)
+ (reduced result))))))
+ ([pred coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (when (pred (first s))
+ (cons (first s) (take-while pred (rest s))))))))
+
+(defn mk-bound-fn
+ [sc test key]
+ (fn [e]
+ (let [comp (-comparator sc)]
+ (test (comp (-entry-key sc e) key) 0))))
+
+(defn subseq
+ "sc must be a sorted collection, test(s) one of <, <=, > or
+ >=. Returns a seq of those entries with keys ek for
+ which (test (.. sc comparator (compare ek key)) 0) is true"
+ ([sc test key]
+ (let [include (mk-bound-fn sc test key)]
+ (if (#{> >=} test)
+ (when-let [[e :as s] (-sorted-seq-from sc key true)]
+ (if (include e) s (next s)))
+ (take-while include (-sorted-seq sc true)))))
+ ([sc start-test start-key end-test end-key]
+ (when-let [[e :as s] (-sorted-seq-from sc start-key true)]
+ (take-while (mk-bound-fn sc end-test end-key)
+ (if ((mk-bound-fn sc start-test start-key) e) s (next s))))))
+
+(defn rsubseq
+ "sc must be a sorted collection, test(s) one of <, <=, > or
+ >=. Returns a reverse seq of those entries with keys ek for
+ which (test (.. sc comparator (compare ek key)) 0) is true"
+ ([sc test key]
+ (let [include (mk-bound-fn sc test key)]
+ (if (#{< <=} test)
+ (when-let [[e :as s] (-sorted-seq-from sc key false)]
+ (if (include e) s (next s)))
+ (take-while include (-sorted-seq sc false)))))
+ ([sc start-test start-key end-test end-key]
+ (when-let [[e :as s] (-sorted-seq-from sc end-key false)]
+ (take-while (mk-bound-fn sc start-test start-key)
+ (if ((mk-bound-fn sc end-test end-key) e) s (next s))))))
+
+(deftype RangeIterator [^:mutable i end step]
+ Object
+ (hasNext [_]
+ (if (pos? step)
+ (< i end)
+ (> i end)))
+ (next [_]
+ (let [ret i]
+ (set! i (+ i step))
+ ret)))
+
+(deftype Range [meta start end step ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [_] (Range. meta start end step __hash))
+
+ IWithMeta
+ (-with-meta [rng meta] (Range. meta start end step __hash))
+
+ IMeta
+ (-meta [rng] meta)
+
+ ISeqable
+ (-seq [rng]
+ (cond
+ (pos? step) (when (< start end) rng)
+ (neg? step) (when (> start end) rng)
+ :else (when-not (== start end) rng)))
+
+ ISeq
+ (-first [rng]
+ (when-not (nil? (-seq rng)) start))
+ (-rest [rng]
+ (if-not (nil? (-seq rng))
+ (Range. meta (+ start step) end step nil)
+ ()))
+
+ IIterable
+ (-iterator [_]
+ (RangeIterator. start end step))
+
+ INext
+ (-next [rng]
+ (if (pos? step)
+ (when (< (+ start step) end)
+ (Range. meta (+ start step) end step nil))
+ (when (> (+ start step) end)
+ (Range. meta (+ start step) end step nil))))
+
+ ICollection
+ (-conj [rng o] (cons o rng))
+
+ IEmptyableCollection
+ (-empty [rng] (with-meta (.-EMPTY List) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [rng other] (equiv-sequential rng other))
+
+ IHash
+ (-hash [rng] (caching-hash rng hash-ordered-coll __hash))
+
+ ICounted
+ (-count [rng]
+ (if-not (-seq rng)
+ 0
+ (Math/ceil (/ (- end start) step))))
+
+ IIndexed
+ (-nth [rng n]
+ (if (< n (-count rng))
+ (+ start (* n step))
+ (if (and (> start end) (zero? step))
+ start
+ (throw (js/Error. "Index out of bounds")))))
+ (-nth [rng n not-found]
+ (if (< n (-count rng))
+ (+ start (* n step))
+ (if (and (> start end) (zero? step))
+ start
+ not-found)))
+
+ IReduce
+ (-reduce [rng f] (ci-reduce rng f))
+ (-reduce [rng f init]
+ (loop [i start ret init]
+ (if (if (pos? step) (< i end) (> i end))
+ (let [ret (f ret i)]
+ (if (reduced? ret)
+ @ret
+ (recur (+ i step) ret)))
+ ret))))
+
+(es6-iterable Range)
+
+(defn range
+ "Returns a lazy seq of nums from start (inclusive) to end
+ (exclusive), by step, where start defaults to 0, step to 1,
+ and end to infinity."
+ ([] (range 0 (.-MAX_VALUE js/Number) 1))
+ ([end] (range 0 end 1))
+ ([start end] (range start end 1))
+ ([start end step] (Range. nil start end step nil)))
+
+(defn take-nth
+ "Returns a lazy seq of every nth item in coll. Returns a stateful
+ transducer when no collection is provided."
+ ([n]
+ {:pre [(number? n)]}
+ (fn [rf]
+ (let [ia (volatile! -1)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [i (vswap! ia inc)]
+ (if (zero? (rem i n))
+ (rf result input)
+ result)))))))
+ ([n coll]
+ {:pre [(number? n)]}
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (cons (first s) (take-nth n (drop n s)))))))
+
+(defn split-with
+ "Returns a vector of [(take-while pred coll) (drop-while pred coll)]"
+ [pred coll]
+ [(take-while pred coll) (drop-while pred coll)])
+
+(defn partition-by
+ "Applies f to each value in coll, splitting it each time f returns a
+ new value. Returns a lazy seq of partitions. Returns a stateful
+ transducer when no collection is provided."
+ ([f]
+ (fn [rf]
+ (let [a (array-list)
+ pa (volatile! ::none)]
+ (fn
+ ([] (rf))
+ ([result]
+ (let [result (if (.isEmpty a)
+ result
+ (let [v (vec (.toArray a))]
+ ;;clear first!
+ (.clear a)
+ (unreduced (rf result v))))]
+ (rf result)))
+ ([result input]
+ (let [pval @pa
+ val (f input)]
+ (vreset! pa val)
+ (if (or (keyword-identical? pval ::none)
+ (= val pval))
+ (do
+ (.add a input)
+ result)
+ (let [v (vec (.toArray a))]
+ (.clear a)
+ (let [ret (rf result v)]
+ (when-not (reduced? ret)
+ (.add a input))
+ ret)))))))))
+ ([f coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (let [fst (first s)
+ fv (f fst)
+ run (cons fst (take-while #(= fv (f %)) (next s)))]
+ (cons run (partition-by f (seq (drop (count run) s)))))))))
+
+(defn frequencies
+ "Returns a map from distinct items in coll to the number of times
+ they appear."
+ [coll]
+ (persistent!
+ (reduce (fn [counts x]
+ (assoc! counts x (inc (get counts x 0))))
+ (transient {}) coll)))
+
+(defn reductions
+ "Returns a lazy seq of the intermediate values of the reduction (as
+ per reduce) of coll by f, starting with init."
+ ([f coll]
+ (lazy-seq
+ (if-let [s (seq coll)]
+ (reductions f (first s) (rest s))
+ (list (f)))))
+ ([f init coll]
+ (if (reduced? init)
+ (list @init)
+ (cons init
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (reductions f (f init (first s)) (rest s))))))))
+
+(defn juxt
+ "Takes a set of functions and returns a fn that is the juxtaposition
+ of those fns. The returned fn takes a variable number of args, and
+ returns a vector containing the result of applying each fn to the
+ args (left-to-right).
+ ((juxt a b c) x) => [(a x) (b x) (c x)]"
+ ([f]
+ (fn
+ ([] (vector (f)))
+ ([x] (vector (f x)))
+ ([x y] (vector (f x y)))
+ ([x y z] (vector (f x y z)))
+ ([x y z & args] (vector (apply f x y z args)))))
+ ([f g]
+ (fn
+ ([] (vector (f) (g)))
+ ([x] (vector (f x) (g x)))
+ ([x y] (vector (f x y) (g x y)))
+ ([x y z] (vector (f x y z) (g x y z)))
+ ([x y z & args] (vector (apply f x y z args) (apply g x y z args)))))
+ ([f g h]
+ (fn
+ ([] (vector (f) (g) (h)))
+ ([x] (vector (f x) (g x) (h x)))
+ ([x y] (vector (f x y) (g x y) (h x y)))
+ ([x y z] (vector (f x y z) (g x y z) (h x y z)))
+ ([x y z & args] (vector (apply f x y z args) (apply g x y z args) (apply h x y z args)))))
+ ([f g h & fs]
+ (let [fs (list* f g h fs)]
+ (fn
+ ([] (reduce #(conj %1 (%2)) [] fs))
+ ([x] (reduce #(conj %1 (%2 x)) [] fs))
+ ([x y] (reduce #(conj %1 (%2 x y)) [] fs))
+ ([x y z] (reduce #(conj %1 (%2 x y z)) [] fs))
+ ([x y z & args] (reduce #(conj %1 (apply %2 x y z args)) [] fs))))))
+
+(defn dorun
+ "When lazy sequences are produced via functions that have side
+ effects, any effects other than those needed to produce the first
+ element in the seq do not occur until the seq is consumed. dorun can
+ be used to force any effects. Walks through the successive nexts of
+ the seq, does not retain the head and returns nil."
+ ([coll]
+ (when (seq coll)
+ (recur (next coll))))
+ ([n coll]
+ (when (and (seq coll) (pos? n))
+ (recur (dec n) (next coll)))))
+
+(defn doall
+ "When lazy sequences are produced via functions that have side
+ effects, any effects other than those needed to produce the first
+ element in the seq do not occur until the seq is consumed. doall can
+ be used to force any effects. Walks through the successive nexts of
+ the seq, retains the head and returns it, thus causing the entire
+ seq to reside in memory at one time."
+ ([coll]
+ (dorun coll)
+ coll)
+ ([n coll]
+ (dorun n coll)
+ coll))
+
+;;;;;;;;;;;;;;;;;;;;;;;;; Regular Expressions ;;;;;;;;;;
+
+(defn ^boolean regexp?
+ "Returns true if x is a JavaScript RegExp instance."
+ [x]
+ (instance? js/RegExp x))
+
+(defn re-matches
+ "Returns the result of (re-find re s) if re fully matches s."
+ [re s]
+ (if (string? s)
+ (let [matches (.exec re s)]
+ (when (= (first matches) s)
+ (if (== (count matches) 1)
+ (first matches)
+ (vec matches))))
+ (throw (js/TypeError. "re-matches must match against a string."))))
+
+
+(defn re-find
+ "Returns the first regex match, if any, of s to re, using
+ re.exec(s). Returns a vector, containing first the matching
+ substring, then any capturing groups if the regular expression contains
+ capturing groups."
+ [re s]
+ (if (string? s)
+ (let [matches (.exec re s)]
+ (when-not (nil? matches)
+ (if (== (count matches) 1)
+ (first matches)
+ (vec matches))))
+ (throw (js/TypeError. "re-find must match against a string."))))
+
+(defn re-seq
+ "Returns a lazy sequence of successive matches of re in s."
+ [re s]
+ (let [match-data (re-find re s)
+ match-idx (.search s re)
+ match-str (if (coll? match-data) (first match-data) match-data)
+ post-match (subs s (+ match-idx (count match-str)))]
+ (when match-data (lazy-seq (cons match-data (when (seq post-match) (re-seq re post-match)))))))
+
+(defn re-pattern
+ "Returns an instance of RegExp which has compiled the provided string."
+ [s]
+ (if (instance? js/RegExp s)
+ s
+ (let [[prefix flags] (re-find #"^\(\?([idmsux]*)\)" s)
+ pattern (subs s (count prefix))]
+ (js/RegExp. pattern (or flags "")))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Printing ;;;;;;;;;;;;;;;;
+
+(defn pr-sequential-writer [writer print-one begin sep end opts coll]
+ (binding [*print-level* (when-not (nil? *print-level*) (dec *print-level*))]
+ (if (and (not (nil? *print-level*)) (neg? *print-level*))
+ (-write writer "#")
+ (do
+ (-write writer begin)
+ (if (zero? (:print-length opts))
+ (when (seq coll)
+ (-write writer (or (:more-marker opts) "...")))
+ (do
+ (when (seq coll)
+ (print-one (first coll) writer opts))
+ (loop [coll (next coll) n (dec (:print-length opts))]
+ (if (and coll (or (nil? n) (not (zero? n))))
+ (do
+ (-write writer sep)
+ (print-one (first coll) writer opts)
+ (recur (next coll) (dec n)))
+ (when (and (seq coll) (zero? n))
+ (-write writer sep)
+ (-write writer (or (:more-marker opts) "...")))))))
+ (-write writer end)))))
+
+(defn write-all [writer & ss]
+ (doseq [s ss]
+ (-write writer s)))
+
+(defn string-print [x]
+ (*print-fn* x)
+ nil)
+
+(defn flush [] ;stub
+ nil)
+
+(def ^:private char-escapes
+ (js-obj
+ "\"" "\\\""
+ "\\" "\\\\"
+ "\b" "\\b"
+ "\f" "\\f"
+ "\n" "\\n"
+ "\r" "\\r"
+ "\t" "\\t"))
+
+(defn ^:private quote-string
+ [s]
+ (str \"
+ (.replace s (js/RegExp "[\\\\\"\b\f\n\r\t]" "g")
+ (fn [match] (aget char-escapes match)))
+ \"))
+
+(declare print-map)
+
+(defn ^boolean print-meta? [opts obj]
+ (and (boolean (get opts :meta))
+ (implements? IMeta obj)
+ (not (nil? (meta obj)))))
+
+(defn- pr-writer-impl
+ [obj writer opts]
+ (cond
+ (nil? obj) (-write writer "nil")
+ :else
+ (do
+ (when (print-meta? opts obj)
+ (-write writer "^")
+ (pr-writer (meta obj) writer opts)
+ (-write writer " "))
+ (cond
+ ;; handle CLJS ctors
+ ^boolean (.-cljs$lang$type obj)
+ (.cljs$lang$ctorPrWriter obj obj writer opts)
+
+ ; Use the new, more efficient, IPrintWithWriter interface when possible.
+ (implements? IPrintWithWriter obj)
+ (-pr-writer ^not-native obj writer opts)
+
+ (or (true? obj) (false? obj) (number? obj))
+ (-write writer (str obj))
+
+ (object? obj)
+ (do
+ (-write writer "#js ")
+ (print-map
+ (map (fn [k] [(keyword k) (aget obj k)]) (js-keys obj))
+ pr-writer writer opts))
+
+ (array? obj)
+ (pr-sequential-writer writer pr-writer "#js [" " " "]" opts obj)
+
+ ^boolean (goog/isString obj)
+ (if (:readably opts)
+ (-write writer (quote-string obj))
+ (-write writer obj))
+
+ ^boolean (goog/isFunction obj)
+ (let [name (.-name obj)
+ name (if (or (nil? name) (gstring/isEmpty name))
+ "Function"
+ name)]
+ (write-all writer "#object[" name " \"" (str obj) "\"]"))
+
+ (instance? js/Date obj)
+ (let [normalize (fn [n len]
+ (loop [ns (str n)]
+ (if (< (count ns) len)
+ (recur (str "0" ns))
+ ns)))]
+ (write-all writer
+ "#inst \""
+ (str (.getUTCFullYear obj)) "-"
+ (normalize (inc (.getUTCMonth obj)) 2) "-"
+ (normalize (.getUTCDate obj) 2) "T"
+ (normalize (.getUTCHours obj) 2) ":"
+ (normalize (.getUTCMinutes obj) 2) ":"
+ (normalize (.getUTCSeconds obj) 2) "."
+ (normalize (.getUTCMilliseconds obj) 3) "-"
+ "00:00\""))
+
+ (regexp? obj) (write-all writer "#\"" (.-source obj) "\"")
+
+ :else
+ (if (.. obj -constructor -cljs$lang$ctorStr)
+ (write-all writer
+ "#object[" (.replace (.. obj -constructor -cljs$lang$ctorStr)
+ (js/RegExp. "/" "g") ".") "]")
+ (let [name (.. obj -constructor -name)
+ name (if (or (nil? name) (gstring/isEmpty name))
+ "Object"
+ name)]
+ (write-all writer "#object[" name " " (str obj) "]")))))))
+
+(defn- pr-writer
+ "Prefer this to pr-seq, because it makes the printing function
+ configurable, allowing efficient implementations such as appending
+ to a StringBuffer."
+ [obj writer opts]
+ (if-let [alt-impl (:alt-impl opts)]
+ (alt-impl obj writer (assoc opts :fallback-impl pr-writer-impl))
+ (pr-writer-impl obj writer opts)))
+
+(defn pr-seq-writer [objs writer opts]
+ (pr-writer (first objs) writer opts)
+ (doseq [obj (next objs)]
+ (-write writer " ")
+ (pr-writer obj writer opts)))
+
+(defn- pr-sb-with-opts [objs opts]
+ (let [sb (StringBuffer.)
+ writer (StringBufferWriter. sb)]
+ (pr-seq-writer objs writer opts)
+ (-flush writer)
+ sb))
+
+(defn pr-str-with-opts
+ "Prints a sequence of objects to a string, observing all the
+ options given in opts"
+ [objs opts]
+ (if (empty? objs)
+ ""
+ (str (pr-sb-with-opts objs opts))))
+
+(defn prn-str-with-opts
+ "Same as pr-str-with-opts followed by (newline)"
+ [objs opts]
+ (if (empty? objs)
+ "\n"
+ (let [sb (pr-sb-with-opts objs opts)]
+ (.append sb \newline)
+ (str sb))))
+
+(defn- pr-with-opts
+ "Prints a sequence of objects using string-print, observing all
+ the options given in opts"
+ [objs opts]
+ (string-print (pr-str-with-opts objs opts)))
+
+(defn newline
+ "Prints a newline using *print-fn*"
+ ([] (newline nil))
+ ([opts]
+ (string-print "\n")
+ (when (get opts :flush-on-newline)
+ (flush))))
+
+(defn pr-str
+ "pr to a string, returning it. Fundamental entrypoint to IPrintWithWriter."
+ [& objs]
+ (pr-str-with-opts objs (pr-opts)))
+
+(defn prn-str
+ "Same as pr-str followed by (newline)"
+ [& objs]
+ (prn-str-with-opts objs (pr-opts)))
+
+(defn pr
+ "Prints the object(s) using string-print. Prints the
+ object(s), separated by spaces if there is more than one.
+ By default, pr and prn print in a way that objects can be
+ read by the reader"
+ [& objs]
+ (pr-with-opts objs (pr-opts)))
+
+(def ^{:doc
+ "Prints the object(s) using string-print.
+ print and println produce output for human consumption."}
+ print
+ (fn cljs-core-print [& objs]
+ (pr-with-opts objs (assoc (pr-opts) :readably false))))
+
+(defn print-str
+ "print to a string, returning it"
+ [& objs]
+ (pr-str-with-opts objs (assoc (pr-opts) :readably false)))
+
+(defn println
+ "Same as print followed by (newline)"
+ [& objs]
+ (pr-with-opts objs (assoc (pr-opts) :readably false))
+ (when *print-newline*
+ (newline (pr-opts))))
+
+(defn println-str
+ "println to a string, returning it"
+ [& objs]
+ (prn-str-with-opts objs (assoc (pr-opts) :readably false)))
+
+(defn prn
+ "Same as pr followed by (newline)."
+ [& objs]
+ (pr-with-opts objs (pr-opts))
+ (when *print-newline*
+ (newline (pr-opts))))
+
+(defn- strip-ns
+ [named]
+ (if (symbol? named)
+ (symbol nil (name named))
+ (keyword nil (name named))))
+
+(defn- lift-ns
+ "Returns [lifted-ns lifted-map] or nil if m can't be lifted."
+ [m]
+ (when *print-namespace-maps*
+ (loop [ns nil
+ [[k v :as entry] & entries] (seq m)
+ lm (empty m)]
+ (if entry
+ (when (or (keyword? k) (symbol? k))
+ (if ns
+ (when (= ns (namespace k))
+ (recur ns entries (assoc lm (strip-ns k) v)))
+ (when-let [new-ns (namespace k)]
+ (recur new-ns entries (assoc lm (strip-ns k) v)))))
+ [ns lm]))))
+
+(defn print-prefix-map [prefix m print-one writer opts]
+ (pr-sequential-writer
+ writer
+ (fn [e w opts]
+ (do (print-one (key e) w opts)
+ (-write w \space)
+ (print-one (val e) w opts)))
+ (str prefix "{") ", " "}"
+ opts (seq m)))
+
+(defn print-map [m print-one writer opts]
+ (let [[ns lift-map] (lift-ns m)]
+ (if ns
+ (print-prefix-map (str "#:" ns) lift-map print-one writer opts)
+ (print-prefix-map nil m print-one writer opts))))
+
+(extend-protocol IPrintWithWriter
+ LazySeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ LazyTransformer
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ IndexedSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ RSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ PersistentQueue
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "#queue [" " " "]" opts (seq coll)))
+
+ PersistentQueueSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ PersistentTreeMapSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ NodeSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ ArrayNodeSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ List
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ Cons
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ EmptyList
+ (-pr-writer [coll writer opts] (-write writer "()"))
+
+ PersistentVector
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "[" " " "]" opts coll))
+
+ ChunkedCons
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ ChunkedSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ Subvec
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "[" " " "]" opts coll))
+
+ BlackNode
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "[" " " "]" opts coll))
+
+ RedNode
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "[" " " "]" opts coll))
+
+ ObjMap
+ (-pr-writer [coll writer opts]
+ (print-map coll pr-writer writer opts))
+
+ KeySeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ ValSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ PersistentArrayMapSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ PersistentArrayMap
+ (-pr-writer [coll writer opts]
+ (print-map coll pr-writer writer opts))
+
+ PersistentHashMap
+ (-pr-writer [coll writer opts]
+ (print-map coll pr-writer writer opts))
+
+ PersistentTreeMap
+ (-pr-writer [coll writer opts]
+ (print-map coll pr-writer writer opts))
+
+ PersistentHashSet
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "#{" " " "}" opts coll))
+
+ PersistentTreeSet
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "#{" " " "}" opts coll))
+
+ Range
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ ES6IteratorSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ Atom
+ (-pr-writer [a writer opts]
+ (-write writer "#object [cljs.core.Atom ")
+ (pr-writer {:val (.-state a)} writer opts)
+ (-write writer "]"))
+
+ Volatile
+ (-pr-writer [a writer opts]
+ (-write writer "#object [cljs.core.Volatile ")
+ (pr-writer {:val (.-state a)} writer opts)
+ (-write writer "]"))
+
+ Var
+ (-pr-writer [a writer opts]
+ (-write writer "#'")
+ (pr-writer (.-sym a) writer opts)))
+
+;; IComparable
+(extend-protocol IComparable
+ Symbol
+ (-compare [x y]
+ (if (symbol? y)
+ (compare-symbols x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y)))))
+
+ Keyword
+ (-compare [x y]
+ (if (keyword? y)
+ (compare-keywords x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y)))))
+
+ Subvec
+ (-compare [x y]
+ (if (vector? y)
+ (compare-indexed x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y)))))
+
+ PersistentVector
+ (-compare [x y]
+ (if (vector? y)
+ (compare-indexed x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Reference Types ;;;;;;;;;;;;;;;;
+
+(defn alter-meta!
+ "Atomically sets the metadata for a namespace/var/ref/agent/atom to be:
+
+ (apply f its-current-meta args)
+
+ f must be free of side-effects"
+ [iref f & args]
+ (set! (.-meta iref) (apply f (.-meta iref) args)))
+
+(defn reset-meta!
+ "Atomically resets the metadata for an atom"
+ [iref m]
+ (set! (.-meta iref) m))
+
+(defn add-watch
+ "Adds a watch function to an atom reference. The watch fn must be a
+ fn of 4 args: a key, the reference, its old-state, its
+ new-state. Whenever the reference's state might have been changed,
+ any registered watches will have their functions called. The watch
+ fn will be called synchronously. Note that an atom's state
+ may have changed again prior to the fn call, so use old/new-state
+ rather than derefing the reference. Keys must be unique per
+ reference, and can be used to remove the watch with remove-watch,
+ but are otherwise considered opaque by the watch mechanism. Bear in
+ mind that regardless of the result or action of the watch fns the
+ atom's value will change. Example:
+
+ (def a (atom 0))
+ (add-watch a :inc (fn [k r o n] (assert (== 0 n))))
+ (swap! a inc)
+ ;; Assertion Error
+ (deref a)
+ ;=> 1"
+ [iref key f]
+ (-add-watch iref key f)
+ iref)
+
+(defn remove-watch
+ "Removes a watch (set by add-watch) from a reference"
+ [iref key]
+ (-remove-watch iref key)
+ iref)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gensym ;;;;;;;;;;;;;;;;
+;; Internal - do not use!
+(def
+ ^{:jsdoc ["@type {*}"]}
+ gensym_counter nil)
+
+(defn gensym
+ "Returns a new symbol with a unique name. If a prefix string is
+ supplied, the name is prefix# where # is some unique number. If
+ prefix is not supplied, the prefix is 'G__'."
+ ([] (gensym "G__"))
+ ([prefix-string]
+ (when (nil? gensym_counter)
+ (set! gensym_counter (atom 0)))
+ (symbol (str prefix-string (swap! gensym_counter inc)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fixtures ;;;;;;;;;;;;;;;;
+
+(def fixture1 1)
+(def fixture2 2)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Delay ;;;;;;;;;;;;;;;;;;;;
+
+(deftype Delay [^:mutable f ^:mutable value]
+ IDeref
+ (-deref [_]
+ (when f
+ (set! value (f))
+ (set! f nil))
+ value)
+
+ IPending
+ (-realized? [x]
+ (not f)))
+
+(defn ^boolean delay?
+ "returns true if x is a Delay created with delay"
+ [x] (instance? Delay x))
+
+(defn force
+ "If x is a Delay, returns the (possibly cached) value of its expression, else returns x"
+ [x]
+ (if (delay? x)
+ (deref x)
+ x))
+
+(defn ^boolean realized?
+ "Returns true if a value has been produced for a delay or lazy sequence."
+ [x]
+ (-realized? x))
+
+(defn- preserving-reduced
+ [rf]
+ #(let [ret (rf %1 %2)]
+ (if (reduced? ret)
+ (reduced ret)
+ ret)))
+
+(defn cat
+ "A transducer which concatenates the contents of each input, which must be a
+ collection, into the reduction."
+ {:added "1.7"}
+ [rf]
+ (let [rf1 (preserving-reduced rf)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (reduce rf1 result input)))))
+
+(defn halt-when
+ "Returns a transducer that ends transduction when pred returns true
+ for an input. When retf is supplied it must be a fn of 2 arguments -
+ it will be passed the (completed) result so far and the input that
+ triggered the predicate, and its return value (if it does not throw
+ an exception) will be the return value of the transducer. If retf
+ is not supplied, the input that triggered the predicate will be
+ returned. If the predicate never returns true the transduction is
+ unaffected."
+ {:added "1.9"}
+ ([pred] (halt-when pred nil))
+ ([pred retf]
+ (fn [rf]
+ (fn
+ ([] (rf))
+ ([result]
+ (if (and (map? result) (contains? result ::halt))
+ (::halt result)
+ (rf result)))
+ ([result input]
+ (if (pred input)
+ (reduced {::halt (if retf (retf (rf result) input) input)})
+ (rf result input)))))))
+
+(defn dedupe
+ "Returns a lazy sequence removing consecutive duplicates in coll.
+ Returns a transducer when no collection is provided."
+ ([]
+ (fn [rf]
+ (let [pa (volatile! ::none)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [prior @pa]
+ (vreset! pa input)
+ (if (= prior input)
+ result
+ (rf result input))))))))
+ ([coll] (sequence (dedupe) coll)))
+
+(declare rand)
+
+(defn random-sample
+ "Returns items from coll with random probability of prob (0.0 -
+ 1.0). Returns a transducer when no collection is provided."
+ ([prob]
+ (filter (fn [_] (< (rand) prob))))
+ ([prob coll]
+ (filter (fn [_] (< (rand) prob)) coll)))
+
+(deftype Eduction [xform coll]
+ Object
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ISequential
+
+ ISeqable
+ (-seq [_] (seq (sequence xform coll)))
+
+ IReduce
+ (-reduce [_ f] (transduce xform (completing f) coll))
+ (-reduce [_ f init] (transduce xform (completing f) init coll))
+
+ IPrintWithWriter
+ (-pr-writer [coll writer opts]
+ (pr-sequential-writer writer pr-writer "(" " " ")" opts coll)))
+
+(es6-iterable Eduction)
+
+(defn eduction
+ "Returns a reducible/iterable application of the transducers
+ to the items in coll. Transducers are applied in order as if
+ combined with comp. Note that these applications will be
+ performed every time reduce/iterator is called."
+ {:arglists '([xform* coll])}
+ [& xforms]
+ (Eduction. (apply comp (butlast xforms)) (last xforms)))
+
+(defn run!
+ "Runs the supplied procedure (via reduce), for purposes of side
+ effects, on successive items in the collection. Returns nil"
+ [proc coll]
+ (reduce #(proc %2) nil coll)
+ nil)
+
+(defprotocol IEncodeJS
+ (-clj->js [x] "Recursively transforms clj values to JavaScript")
+ (-key->js [x] "Transforms map keys to valid JavaScript keys. Arbitrary keys are
+ encoded to their string representation via (pr-str x)"))
+
+(declare clj->js)
+
+(defn key->js [k]
+ (if (satisfies? IEncodeJS k)
+ (-clj->js k)
+ (if (or (string? k)
+ (number? k)
+ (keyword? k)
+ (symbol? k))
+ (clj->js k)
+ (pr-str k))))
+
+(defn clj->js
+ "Recursively transforms ClojureScript values to JavaScript.
+ sets/vectors/lists become Arrays, Keywords and Symbol become Strings,
+ Maps become Objects. Arbitrary keys are encoded to by key->js."
+ [x]
+ (when-not (nil? x)
+ (if (satisfies? IEncodeJS x)
+ (-clj->js x)
+ (cond
+ (keyword? x) (name x)
+ (symbol? x) (str x)
+ (map? x) (let [m (js-obj)]
+ (doseq [[k v] x]
+ (aset m (key->js k) (clj->js v)))
+ m)
+ (coll? x) (let [arr (array)]
+ (doseq [x (map clj->js x)]
+ (.push arr x))
+ arr)
+ :else x))))
+
+(defprotocol IEncodeClojure
+ (-js->clj [x options] "Transforms JavaScript values to Clojure"))
+
+(defn js->clj
+ "Recursively transforms JavaScript arrays into ClojureScript
+ vectors, and JavaScript objects into ClojureScript maps. With
+ option ':keywordize-keys true' will convert object fields from
+ strings to keywords."
+ ([x] (js->clj x :keywordize-keys false))
+ ([x & opts]
+ (let [{:keys [keywordize-keys]} opts
+ keyfn (if keywordize-keys keyword str)
+ f (fn thisfn [x]
+ (cond
+ (satisfies? IEncodeClojure x)
+ (-js->clj x (apply array-map opts))
+
+ (seq? x)
+ (doall (map thisfn x))
+
+ (coll? x)
+ (into (empty x) (map thisfn x))
+
+ (array? x)
+ (vec (map thisfn x))
+
+ (identical? (type x) js/Object)
+ (into {} (for [k (js-keys x)]
+ [(keyfn k) (thisfn (aget x k))]))
+
+ :else x))]
+ (f x))))
+
+(defn memoize
+ "Returns a memoized version of a referentially transparent function. The
+ memoized version of the function keeps a cache of the mapping from arguments
+ to results and, when calls with the same arguments are repeated often, has
+ higher performance at the expense of higher memory use."
+ [f]
+ (let [mem (atom {})]
+ (fn [& args]
+ (let [v (get @mem args lookup-sentinel)]
+ (if (identical? v lookup-sentinel)
+ (let [ret (apply f args)]
+ (swap! mem assoc args ret)
+ ret)
+ v)))))
+
+(defn trampoline
+ "trampoline can be used to convert algorithms requiring mutual
+ recursion without stack consumption. Calls f with supplied args, if
+ any. If f returns a fn, calls that fn with no arguments, and
+ continues to repeat, until the return value is not a fn, then
+ returns that non-fn value. Note that if you want to return a fn as a
+ final value, you must wrap it in some data structure and unpack it
+ after trampoline returns."
+ ([f]
+ (let [ret (f)]
+ (if (fn? ret)
+ (recur ret)
+ ret)))
+ ([f & args]
+ (trampoline #(apply f args))))
+
+(defn rand
+ "Returns a random floating point number between 0 (inclusive) and
+ n (default 1) (exclusive)."
+ ([] (rand 1))
+ ([n] (* (Math/random) n)))
+
+(defn rand-int
+ "Returns a random integer between 0 (inclusive) and n (exclusive)."
+ [n] (Math/floor (* (Math/random) n)))
+
+(defn rand-nth
+ "Return a random element of the (sequential) collection. Will have
+ the same performance characteristics as nth for the given
+ collection."
+ [coll]
+ (nth coll (rand-int (count coll))))
+
+(defn group-by
+ "Returns a map of the elements of coll keyed by the result of
+ f on each element. The value at each key will be a vector of the
+ corresponding elements, in the order they appeared in coll."
+ [f coll]
+ (persistent!
+ (reduce
+ (fn [ret x]
+ (let [k (f x)]
+ (assoc! ret k (conj (get ret k []) x))))
+ (transient {}) coll)))
+
+(defn make-hierarchy
+ "Creates a hierarchy object for use with derive, isa? etc."
+ [] {:parents {} :descendants {} :ancestors {}})
+
+(def
+ ^{:private true
+ :jsdoc ["@type {*}"]}
+ -global-hierarchy nil)
+
+(defn- get-global-hierarchy []
+ (when (nil? -global-hierarchy)
+ (set! -global-hierarchy (atom (make-hierarchy))))
+ -global-hierarchy)
+
+(defn- swap-global-hierarchy! [f & args]
+ (apply swap! (get-global-hierarchy) f args))
+
+(defn ^boolean isa?
+ "Returns true if (= child parent), or child is directly or indirectly derived from
+ parent, either via a JavaScript type inheritance relationship or a
+ relationship established via derive. h must be a hierarchy obtained
+ from make-hierarchy, if not supplied defaults to the global
+ hierarchy"
+ ([child parent] (isa? @(get-global-hierarchy) child parent))
+ ([h child parent]
+ (or (= child parent)
+ ;; (and (class? parent) (class? child)
+ ;; (. ^Class parent isAssignableFrom child))
+ (contains? ((:ancestors h) child) parent)
+ ;;(and (class? child) (some #(contains? ((:ancestors h) %) parent) (supers child)))
+ (and (vector? parent) (vector? child)
+ (== (count parent) (count child))
+ (loop [ret true i 0]
+ (if (or (not ret) (== i (count parent)))
+ ret
+ (recur (isa? h (child i) (parent i)) (inc i))))))))
+
+(defn parents
+ "Returns the immediate parents of tag, either via a JavaScript type
+ inheritance relationship or a relationship established via derive. h
+ must be a hierarchy obtained from make-hierarchy, if not supplied
+ defaults to the global hierarchy"
+ ([tag] (parents @(get-global-hierarchy) tag))
+ ([h tag] (not-empty (get (:parents h) tag))))
+
+(defn ancestors
+ "Returns the immediate and indirect parents of tag, either via a JavaScript type
+ inheritance relationship or a relationship established via derive. h
+ must be a hierarchy obtained from make-hierarchy, if not supplied
+ defaults to the global hierarchy"
+ ([tag] (ancestors @(get-global-hierarchy) tag))
+ ([h tag] (not-empty (get (:ancestors h) tag))))
+
+(defn descendants
+ "Returns the immediate and indirect children of tag, through a
+ relationship established via derive. h must be a hierarchy obtained
+ from make-hierarchy, if not supplied defaults to the global
+ hierarchy. Note: does not work on JavaScript type inheritance
+ relationships."
+ ([tag] (descendants @(get-global-hierarchy) tag))
+ ([h tag] (not-empty (get (:descendants h) tag))))
+
+(defn derive
+ "Establishes a parent/child relationship between parent and
+ tag. Parent must be a namespace-qualified symbol or keyword and
+ child can be either a namespace-qualified symbol or keyword or a
+ class. h must be a hierarchy obtained from make-hierarchy, if not
+ supplied defaults to, and modifies, the global hierarchy."
+ ([tag parent]
+ (assert (namespace parent))
+ ;; (assert (or (class? tag) (and (instance? cljs.core.Named tag) (namespace tag))))
+ (swap-global-hierarchy! derive tag parent) nil)
+ ([h tag parent]
+ (assert (not= tag parent))
+ ;; (assert (or (class? tag) (instance? clojure.lang.Named tag)))
+ ;; (assert (instance? clojure.lang.INamed tag))
+ ;; (assert (instance? clojure.lang.INamed parent))
+ (let [tp (:parents h)
+ td (:descendants h)
+ ta (:ancestors h)
+ tf (fn [m source sources target targets]
+ (reduce (fn [ret k]
+ (assoc ret k
+ (reduce conj (get targets k #{}) (cons target (targets target)))))
+ m (cons source (sources source))))]
+ (or
+ (when-not (contains? (tp tag) parent)
+ (when (contains? (ta tag) parent)
+ (throw (js/Error. (str tag "already has" parent "as ancestor"))))
+ (when (contains? (ta parent) tag)
+ (throw (js/Error. (str "Cyclic derivation:" parent "has" tag "as ancestor"))))
+ {:parents (assoc (:parents h) tag (conj (get tp tag #{}) parent))
+ :ancestors (tf (:ancestors h) tag td parent ta)
+ :descendants (tf (:descendants h) parent ta tag td)})
+ h))))
+
+(defn underive
+ "Removes a parent/child relationship between parent and
+ tag. h must be a hierarchy obtained from make-hierarchy, if not
+ supplied defaults to, and modifies, the global hierarchy."
+ ([tag parent]
+ (swap-global-hierarchy! underive tag parent)
+ nil)
+ ([h tag parent]
+ (let [parentMap (:parents h)
+ childsParents (if (parentMap tag)
+ (disj (parentMap tag) parent) #{})
+ newParents (if (not-empty childsParents)
+ (assoc parentMap tag childsParents)
+ (dissoc parentMap tag))
+ deriv-seq (flatten (map #(cons (first %) (interpose (first %) (second %)))
+ (seq newParents)))]
+ (if (contains? (parentMap tag) parent)
+ (reduce #(apply derive %1 %2) (make-hierarchy)
+ (partition 2 deriv-seq))
+ h))))
+
+(defn- reset-cache
+ [method-cache method-table cached-hierarchy hierarchy]
+ (swap! method-cache (fn [_] (deref method-table)))
+ (swap! cached-hierarchy (fn [_] (deref hierarchy))))
+
+(defn- prefers*
+ [x y prefer-table]
+ (let [xprefs (@prefer-table x)]
+ (or
+ (when (and xprefs (xprefs y))
+ true)
+ (loop [ps (parents y)]
+ (when (pos? (count ps))
+ (when (prefers* x (first ps) prefer-table)
+ true)
+ (recur (rest ps))))
+ (loop [ps (parents x)]
+ (when (pos? (count ps))
+ (when (prefers* (first ps) y prefer-table)
+ true)
+ (recur (rest ps))))
+ false)))
+
+(defn- dominates
+ [x y prefer-table hierarchy]
+ (or (prefers* x y prefer-table) (isa? hierarchy x y)))
+
+(defn- find-and-cache-best-method
+ [name dispatch-val hierarchy method-table prefer-table method-cache cached-hierarchy]
+ (let [best-entry (reduce (fn [be [k _ :as e]]
+ (if (isa? @hierarchy dispatch-val k)
+ (let [be2 (if (or (nil? be) (dominates k (first be) prefer-table @hierarchy))
+ e
+ be)]
+ (when-not (dominates (first be2) k prefer-table @hierarchy)
+ (throw (js/Error.
+ (str "Multiple methods in multimethod '" name
+ "' match dispatch value: " dispatch-val " -> " k
+ " and " (first be2) ", and neither is preferred"))))
+ be2)
+ be))
+ nil @method-table)]
+ (when best-entry
+ (if (= @cached-hierarchy @hierarchy)
+ (do
+ (swap! method-cache assoc dispatch-val (second best-entry))
+ (second best-entry))
+ (do
+ (reset-cache method-cache method-table cached-hierarchy hierarchy)
+ (find-and-cache-best-method name dispatch-val hierarchy method-table prefer-table
+ method-cache cached-hierarchy))))))
+
+(defprotocol IMultiFn
+ (-reset [mf])
+ (-add-method [mf dispatch-val method])
+ (-remove-method [mf dispatch-val])
+ (-prefer-method [mf dispatch-val dispatch-val-y])
+ (-get-method [mf dispatch-val])
+ (-methods [mf])
+ (-prefers [mf])
+ (-default-dispatch-val [mf])
+ (-dispatch-fn [mf]))
+
+(defn- throw-no-method-error [name dispatch-val]
+ (throw (js/Error. (str "No method in multimethod '" name "' for dispatch value: " dispatch-val))))
+
+(deftype MultiFn [name dispatch-fn default-dispatch-val hierarchy
+ method-table prefer-table method-cache cached-hierarchy]
+ IFn
+ (-invoke [mf]
+ (let [dispatch-val (dispatch-fn)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn)))
+ (-invoke [mf a]
+ (let [dispatch-val (dispatch-fn a)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a)))
+ (-invoke [mf a b]
+ (let [dispatch-val (dispatch-fn a b)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b)))
+ (-invoke [mf a b c]
+ (let [dispatch-val (dispatch-fn a b c)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c)))
+ (-invoke [mf a b c d]
+ (let [dispatch-val (dispatch-fn a b c d)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d)))
+ (-invoke [mf a b c d e]
+ (let [dispatch-val (dispatch-fn a b c d e)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e)))
+ (-invoke [mf a b c d e f]
+ (let [dispatch-val (dispatch-fn a b c d e f)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f)))
+ (-invoke [mf a b c d e f g]
+ (let [dispatch-val (dispatch-fn a b c d e f g)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g)))
+ (-invoke [mf a b c d e f g h]
+ (let [dispatch-val (dispatch-fn a b c d e f g h)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h)))
+ (-invoke [mf a b c d e f g h i]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i)))
+ (-invoke [mf a b c d e f g h i j]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j)))
+ (-invoke [mf a b c d e f g h i j k]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k)))
+ (-invoke [mf a b c d e f g h i j k l]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l)))
+ (-invoke [mf a b c d e f g h i j k l m]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m)))
+ (-invoke [mf a b c d e f g h i j k l m n]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n)))
+ (-invoke [mf a b c d e f g h i j k l m n o]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o)))
+ (-invoke [mf a b c d e f g h i j k l m n o p]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o p)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o p)))
+ (-invoke [mf a b c d e f g h i j k l m n o p q]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o p q)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o p q)))
+ (-invoke [mf a b c d e f g h i j k l m n o p q r]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o p q r)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o p q r)))
+ (-invoke [mf a b c d e f g h i j k l m n o p q r s]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o p q r s)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o p q r s)))
+ (-invoke [mf a b c d e f g h i j k l m n o p q r s t]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o p q r s t)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o p q r s t)))
+ (-invoke [mf a b c d e f g h i j k l m n o p q r s t rest]
+ (let [dispatch-val (apply dispatch-fn a b c d e f g h i j k l m n o p q r s t rest)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (apply target-fn a b c d e f g h i j k l m n o p q r s t rest)))
+
+ IMultiFn
+ (-reset [mf]
+ (swap! method-table (fn [mf] {}))
+ (swap! method-cache (fn [mf] {}))
+ (swap! prefer-table (fn [mf] {}))
+ (swap! cached-hierarchy (fn [mf] nil))
+ mf)
+
+ (-add-method [mf dispatch-val method]
+ (swap! method-table assoc dispatch-val method)
+ (reset-cache method-cache method-table cached-hierarchy hierarchy)
+ mf)
+
+ (-remove-method [mf dispatch-val]
+ (swap! method-table dissoc dispatch-val)
+ (reset-cache method-cache method-table cached-hierarchy hierarchy)
+ mf)
+
+ (-get-method [mf dispatch-val]
+ (when-not (= @cached-hierarchy @hierarchy)
+ (reset-cache method-cache method-table cached-hierarchy hierarchy))
+ (if-let [target-fn (@method-cache dispatch-val)]
+ target-fn
+ (if-let [target-fn (find-and-cache-best-method name dispatch-val hierarchy method-table
+ prefer-table method-cache cached-hierarchy)]
+ target-fn
+ (@method-table default-dispatch-val))))
+
+ (-prefer-method [mf dispatch-val-x dispatch-val-y]
+ (when (prefers* dispatch-val-x dispatch-val-y prefer-table)
+ (throw (js/Error. (str "Preference conflict in multimethod '" name "': " dispatch-val-y
+ " is already preferred to " dispatch-val-x))))
+ (swap! prefer-table
+ (fn [old]
+ (assoc old dispatch-val-x
+ (conj (get old dispatch-val-x #{})
+ dispatch-val-y))))
+ (reset-cache method-cache method-table cached-hierarchy hierarchy))
+
+ (-methods [mf] @method-table)
+ (-prefers [mf] @prefer-table)
+ (-default-dispatch-val [mf] default-dispatch-val)
+ (-dispatch-fn [mf] dispatch-fn)
+
+ INamed
+ (-name [this] (-name name))
+ (-namespace [this] (-namespace name))
+
+ IHash
+ (-hash [this] (goog/getUid this)))
+
+(defn remove-all-methods
+ "Removes all of the methods of multimethod."
+ [multifn]
+ (-reset multifn))
+
+(defn remove-method
+ "Removes the method of multimethod associated with dispatch-value."
+ [multifn dispatch-val]
+ (-remove-method multifn dispatch-val))
+
+(defn prefer-method
+ "Causes the multimethod to prefer matches of dispatch-val-x over dispatch-val-y
+ when there is a conflict"
+ [multifn dispatch-val-x dispatch-val-y]
+ (-prefer-method multifn dispatch-val-x dispatch-val-y))
+
+(defn methods
+ "Given a multimethod, returns a map of dispatch values -> dispatch fns"
+ [multifn] (-methods multifn))
+
+(defn get-method
+ "Given a multimethod and a dispatch value, returns the dispatch fn
+ that would apply to that value, or nil if none apply and no default"
+ [multifn dispatch-val] (-get-method multifn dispatch-val))
+
+(defn prefers
+ "Given a multimethod, returns a map of preferred value -> set of other values"
+ [multifn] (-prefers multifn))
+
+(defn default-dispatch-val
+ "Given a multimethod, return it's default-dispatch-val."
+ [multifn] (-default-dispatch-val multifn))
+
+(defn dispatch-fn
+ "Given a multimethod, return it's dispatch-fn."
+ [multifn] (-dispatch-fn multifn))
+
+;; UUID
+(defprotocol IUUID "A marker protocol for UUIDs")
+
+(deftype UUID [uuid ^:mutable __hash]
+ IUUID
+
+ Object
+ (toString [_] uuid)
+ (equiv [this other]
+ (-equiv this other))
+
+ IEquiv
+ (-equiv [_ other]
+ (and (instance? UUID other) (identical? uuid (.-uuid other))))
+
+ IPrintWithWriter
+ (-pr-writer [_ writer _]
+ (-write writer (str "#uuid \"" uuid "\"")))
+
+ IHash
+ (-hash [this]
+ (when (nil? __hash)
+ (set! __hash (hash uuid)))
+ __hash)
+
+ IComparable
+ (-compare [_ other]
+ (garray/defaultCompare uuid (.-uuid other))))
+
+(defn uuid [s]
+ (UUID. s nil))
+
+(defn random-uuid []
+ (letfn [(hex [] (.toString (rand-int 16) 16))]
+ (let [rhex (.toString (bit-or 0x8 (bit-and 0x3 (rand-int 16))) 16)]
+ (uuid
+ (str (hex) (hex) (hex) (hex)
+ (hex) (hex) (hex) (hex) "-"
+ (hex) (hex) (hex) (hex) "-"
+ "4" (hex) (hex) (hex) "-"
+ rhex (hex) (hex) (hex) "-"
+ (hex) (hex) (hex) (hex)
+ (hex) (hex) (hex) (hex)
+ (hex) (hex) (hex) (hex))))))
+
+(defn ^boolean uuid?
+ [x] (implements? IUUID x))
+
+;;; ExceptionInfo
+
+(defn- pr-writer-ex-info [obj writer opts]
+ (-write writer "#error {:message ")
+ (pr-writer (.-message obj) writer opts)
+ (when (.-data obj)
+ (-write writer ", :data ")
+ (pr-writer (.-data obj) writer opts))
+ (when (.-cause obj)
+ (-write writer ", :cause ")
+ (pr-writer (.-cause obj) writer opts))
+ (-write writer "}"))
+
+(defn ^{:jsdoc ["@constructor"]}
+ ExceptionInfo [message data cause]
+ (let [e (js/Error. message)]
+ (this-as this
+ (set! (.-message this) message)
+ (set! (.-data this) data)
+ (set! (.-cause this) cause)
+ (do
+ (set! (.-name this) (.-name e))
+ ;; non-standard
+ (set! (.-description this) (.-description e))
+ (set! (.-number this) (.-number e))
+ (set! (.-fileName this) (.-fileName e))
+ (set! (.-lineNumber this) (.-lineNumber e))
+ (set! (.-columnNumber this) (.-columnNumber e))
+ (set! (.-stack this) (.-stack e)))
+ this)))
+
+(set! (.. ExceptionInfo -prototype -__proto__) js/Error.prototype)
+
+(extend-type ExceptionInfo
+ IPrintWithWriter
+ (-pr-writer [obj writer opts]
+ (pr-writer-ex-info obj writer opts)))
+
+(set! (.. ExceptionInfo -prototype -toString)
+ (fn []
+ (this-as this (pr-str* this))))
+
+(defn ex-info
+ "Create an instance of ExceptionInfo, an Error type that carries a
+ map of additional data."
+ ([msg data] (ex-info msg data nil))
+ ([msg data cause]
+ (ExceptionInfo. msg data cause)))
+
+(defn ex-data
+ "Returns exception data (a map) if ex is an ExceptionInfo.
+ Otherwise returns nil."
+ [ex]
+ (when (instance? ExceptionInfo ex)
+ (.-data ex)))
+
+(defn ex-message
+ "Returns the message attached to the given Error / ExceptionInfo object.
+ For non-Errors returns nil."
+ [ex]
+ (when (instance? js/Error ex)
+ (.-message ex)))
+
+(defn ex-cause
+ "Returns exception cause (an Error / ExceptionInfo) if ex is an
+ ExceptionInfo.
+ Otherwise returns nil."
+ [ex]
+ (when (instance? ExceptionInfo ex)
+ (.-cause ex)))
+
+(defn comparator
+ "Returns an JavaScript compatible comparator based upon pred."
+ [pred]
+ (fn [x y]
+ (cond (pred x y) -1 (pred y x) 1 :else 0)))
+
+(defn ^boolean special-symbol?
+ "Returns true if x names a special form"
+ [x]
+ (contains?
+ '#{if def fn* do let* loop* letfn* throw try catch finally
+ recur new set! ns deftype* defrecord* . js* & quote var ns*}
+ x))
+
+(defn test
+ "test [v] finds fn at key :test in var metadata and calls it,
+ presuming failure will throw exception"
+ [v]
+ (let [f (.-cljs$lang$test v)]
+ (if f
+ (do (f) :ok)
+ :no-test)))
+
+
+(deftype TaggedLiteral [tag form]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+
+ IEquiv
+ (-equiv [this other]
+ (and (instance? TaggedLiteral other)
+ (= tag (.-tag other))
+ (= form (.-form other))))
+
+ IHash
+ (-hash [this]
+ (+ (* 31 (hash tag))
+ (hash form)))
+
+ ILookup
+ (-lookup [this v]
+ (-lookup this v nil))
+ (-lookup [this v not-found]
+ (case v
+ :tag tag
+ :form form
+ not-found))
+
+ IPrintWithWriter
+ (-pr-writer [o writer opts]
+ (-write writer (str "#" tag " "))
+ (pr-writer form writer opts)))
+
+(defn ^boolean tagged-literal?
+ "Return true if the value is the data representation of a tagged literal"
+ [value]
+ (instance? TaggedLiteral value))
+
+(defn tagged-literal
+ "Construct a data representation of a tagged literal from a
+ tag symbol and a form."
+ [tag form]
+ {:pre [(symbol? tag)]}
+ (TaggedLiteral. tag form))
+
+(def
+ ^{:private true
+ :jsdoc ["@type {*}"]}
+ js-reserved-arr
+ #js ["abstract" "boolean" "break" "byte" "case"
+ "catch" "char" "class" "const" "continue"
+ "debugger" "default" "delete" "do" "double"
+ "else" "enum" "export" "extends" "final"
+ "finally" "float" "for" "function" "goto" "if"
+ "implements" "import" "in" "instanceof" "int"
+ "interface" "let" "long" "native" "new"
+ "package" "private" "protected" "public"
+ "return" "short" "static" "super" "switch"
+ "synchronized" "this" "throw" "throws"
+ "transient" "try" "typeof" "var" "void"
+ "volatile" "while" "with" "yield" "methods"
+ "null"])
+
+(def
+ ^{:jsdoc ["@type {null|Object}"]}
+ js-reserved nil)
+
+(defn- js-reserved? [x]
+ (when (nil? js-reserved)
+ (set! js-reserved
+ (reduce #(do (gobject/set %1 %2 true) %1)
+ #js {} js-reserved-arr)))
+ (.hasOwnProperty js-reserved x))
+
+(defn- demunge-pattern []
+ (when-not DEMUNGE_PATTERN
+ (set! DEMUNGE_PATTERN
+ (let [ks (sort (fn [a b] (- (. b -length) (. a -length)))
+ (js-keys DEMUNGE_MAP))]
+ (loop [ks ks ret ""]
+ (if (seq ks)
+ (recur
+ (next ks)
+ (str
+ (cond-> ret
+ (not (identical? ret "")) (str "|"))
+ (first ks)))
+ (str ret "|\\$"))))))
+ DEMUNGE_PATTERN)
+
+(defn- munge-str [name]
+ (let [sb (StringBuffer.)]
+ (loop [i 0]
+ (if (< i (. name -length))
+ (let [c (.charAt name i)
+ sub (gobject/get CHAR_MAP c)]
+ (if-not (nil? sub)
+ (.append sb sub)
+ (.append sb c))
+ (recur (inc i)))))
+ (.toString sb)))
+
+(defn munge [name]
+ (let [name' (munge-str (str name))
+ name' (cond
+ (identical? name' "..") "_DOT__DOT_"
+ (js-reserved? name') (str name' "$")
+ :else name')]
+ (if (symbol? name)
+ (symbol name')
+ (str name'))))
+
+(defn- demunge-str [munged-name]
+ (let [r (js/RegExp. (demunge-pattern) "g")
+ munged-name (if (gstring/endsWith munged-name "$")
+ (.substring munged-name 0 (dec (. munged-name -length)))
+ munged-name)]
+ (loop [ret "" last-match-end 0]
+ (if-let [match (.exec r munged-name)]
+ (let [[x] match]
+ (recur
+ (str ret
+ (.substring munged-name last-match-end
+ (- (. r -lastIndex) (. x -length)))
+ (if (identical? x "$") "/" (gobject/get DEMUNGE_MAP x)))
+ (. r -lastIndex)))
+ (str ret
+ (.substring munged-name last-match-end (.-length munged-name)))))))
+
+(defn demunge [name]
+ ((if (symbol? name) symbol str)
+ (let [name' (str name)]
+ (if (identical? name' "_DOT__DOT_")
+ ".."
+ (demunge-str (str name))))))
+
+;; -----------------------------------------------------------------------------
+;; Bootstrap helpers - incompatible with advanced compilation
+
+(defn- ns-lookup
+ "Bootstrap only."
+ [ns-obj k]
+ (fn [] (gobject/get ns-obj k)))
+
+;; Bootstrap only
+(deftype Namespace [obj name]
+ Object
+ (findInternedVar [this sym]
+ (let [k (munge (str sym))]
+ (when ^boolean (gobject/containsKey obj k)
+ (let [var-sym (symbol (str name) (str sym))
+ var-meta {:ns this}]
+ (Var. (ns-lookup obj k) var-sym var-meta)))))
+ (getName [_] name)
+ (toString [_]
+ (str name))
+ IEquiv
+ (-equiv [_ other]
+ (if (instance? Namespace other)
+ (= name (.-name other))
+ false))
+ IHash
+ (-hash [_]
+ (hash name)))
+
+(def
+ ^{:doc "Bootstrap only." :jsdoc ["@type {*}"]}
+ NS_CACHE nil)
+
+(defn- find-ns-obj*
+ "Bootstrap only."
+ [ctxt xs]
+ (cond
+ (nil? ctxt) nil
+ (nil? xs) ctxt
+ :else (recur (gobject/get ctxt (first xs)) (next xs))))
+
+(defn find-ns-obj
+ "Bootstrap only."
+ [ns]
+ (let [munged-ns (munge (str ns))
+ segs (.split munged-ns ".")]
+ (case *target*
+ "nodejs" (if ^boolean js/COMPILED
+ ; Under simple optimizations on nodejs, namespaces will be in module
+ ; rather than global scope and must be accessed by a direct call to eval.
+ ; The first segment may refer to an undefined variable, so its evaluation
+ ; may throw ReferenceError.
+ (find-ns-obj*
+ (try
+ (js/eval (first segs))
+ (catch js/ReferenceError e
+ nil))
+ (next segs))
+ (find-ns-obj* js/global segs))
+ "default" (find-ns-obj* goog/global segs)
+ (throw (js/Error. (str "find-ns-obj not supported for target " *target*))))))
+
+(defn ns-interns*
+ "Bootstrap only."
+ [sym]
+ (let [ns-obj (find-ns-obj sym)
+ ns (Namespace. ns-obj sym)]
+ (letfn [(step [ret k]
+ (let [var-sym (symbol (demunge k))]
+ (assoc ret
+ var-sym (Var. #(gobject/get ns-obj k)
+ (symbol (str sym) (str var-sym)) {:ns ns}))))]
+ (reduce step {} (js-keys ns-obj)))))
+
+(defn create-ns
+ "Bootstrap only."
+ ([sym]
+ (create-ns sym (find-ns-obj sym)))
+ ([sym ns-obj]
+ (Namespace. ns-obj sym)))
+
+(defn find-ns
+ "Bootstrap only."
+ [ns]
+ (when (nil? NS_CACHE)
+ (set! NS_CACHE (atom {})))
+ (let [the-ns (get @NS_CACHE ns)]
+ (if-not (nil? the-ns)
+ the-ns
+ (let [ns-obj (find-ns-obj ns)]
+ (when-not (nil? ns-obj)
+ (let [new-ns (create-ns ns ns-obj)]
+ (swap! NS_CACHE assoc ns new-ns)
+ new-ns))))))
+
+(defn find-macros-ns
+ "Bootstrap only."
+ [ns]
+ (when (nil? NS_CACHE)
+ (set! NS_CACHE (atom {})))
+ (let [the-ns (get @NS_CACHE ns)]
+ (if-not (nil? the-ns)
+ the-ns
+ (let [ns-str (str ns)
+ ns (if (not ^boolean (gstring/contains ns-str "$macros"))
+ (symbol (str ns-str "$macros"))
+ ns)
+ ns-obj (find-ns-obj ns)]
+ (when-not (nil? ns-obj)
+ (let [new-ns (create-ns ns ns-obj)]
+ (swap! NS_CACHE assoc ns new-ns)
+ new-ns))))))
+
+(defn ns-name
+ "Bootstrap only."
+ [ns-obj]
+ (.-name ns-obj))
diff --git a/src/http/static/viz/1/cljs/core.js b/src/http/static/viz/1/cljs/core.js
new file mode 100644
index 0000000..6ec0a68
--- /dev/null
+++ b/src/http/static/viz/1/cljs/core.js
@@ -0,0 +1,35801 @@
+// Compiled by ClojureScript 1.9.473 {:static-fns true}
+goog.provide('cljs.core');
+goog.require('goog.math.Long');
+goog.require('goog.math.Integer');
+goog.require('goog.string');
+goog.require('goog.object');
+goog.require('goog.array');
+goog.require('goog.string.StringBuffer');
+cljs.core._STAR_clojurescript_version_STAR_ = "1.9.473";
+cljs.core._STAR_unchecked_if_STAR_ = false;
+cljs.core._STAR_warn_on_infer_STAR_ = false;
+if(typeof cljs.core.PROTOCOL_SENTINEL !== 'undefined'){
+} else {
+cljs.core.PROTOCOL_SENTINEL = ({});
+}
+
+/** @define {string} */
+goog.define("cljs.core._STAR_target_STAR_","default");
+/**
+ * Var bound to the current namespace. Only used for bootstrapping.
+ * @type {*}
+ */
+cljs.core._STAR_ns_STAR_ = null;
+/**
+ * @type {*}
+ */
+cljs.core._STAR_out_STAR_ = null;
+cljs.core._STAR_assert_STAR_ = true;
+if(typeof cljs.core._STAR_print_fn_STAR_ !== 'undefined'){
+} else {
+/**
+ * Each runtime environment provides a different way to print output.
+ * Whatever function *print-fn* is bound to will be passed any
+ * Strings which should be printed.
+ */
+cljs.core._STAR_print_fn_STAR_ = (function cljs$core$_STAR_print_fn_STAR_(_){
+throw (new Error("No *print-fn* fn set for evaluation environment"));
+});
+}
+if(typeof cljs.core._STAR_print_err_fn_STAR_ !== 'undefined'){
+} else {
+/**
+ * Each runtime environment provides a different way to print error output.
+ * Whatever function *print-err-fn* is bound to will be passed any
+ * Strings which should be printed.
+ */
+cljs.core._STAR_print_err_fn_STAR_ = (function cljs$core$_STAR_print_err_fn_STAR_(_){
+throw (new Error("No *print-err-fn* fn set for evaluation environment"));
+});
+}
+/**
+ * Set *print-fn* to f.
+ */
+cljs.core.set_print_fn_BANG_ = (function cljs$core$set_print_fn_BANG_(f){
+return cljs.core._STAR_print_fn_STAR_ = f;
+});
+/**
+ * Set *print-err-fn* to f.
+ */
+cljs.core.set_print_err_fn_BANG_ = (function cljs$core$set_print_err_fn_BANG_(f){
+return cljs.core._STAR_print_err_fn_STAR_ = f;
+});
+/**
+ * When set to true, output will be flushed whenever a newline is printed.
+ *
+ * Defaults to true.
+ */
+cljs.core._STAR_flush_on_newline_STAR_ = true;
+/**
+ * When set to logical false will drop newlines from printing calls.
+ * This is to work around the implicit newlines emitted by standard JavaScript
+ * console objects.
+ */
+cljs.core._STAR_print_newline_STAR_ = true;
+/**
+ * When set to logical false, strings and characters will be printed with
+ * non-alphanumeric characters converted to the appropriate escape sequences.
+ *
+ * Defaults to true
+ */
+cljs.core._STAR_print_readably_STAR_ = true;
+/**
+ * If set to logical true, when printing an object, its metadata will also
+ * be printed in a form that can be read back by the reader.
+ *
+ * Defaults to false.
+ */
+cljs.core._STAR_print_meta_STAR_ = false;
+/**
+ * When set to logical true, objects will be printed in a way that preserves
+ * their type when read in later.
+ *
+ * Defaults to false.
+ */
+cljs.core._STAR_print_dup_STAR_ = false;
+/**
+ * *print-namespace-maps* controls whether the printer will print
+ * namespace map literal syntax.
+ *
+ * Defaults to false, but the REPL binds it to true.
+ */
+cljs.core._STAR_print_namespace_maps_STAR_ = false;
+/**
+ * *print-length* controls how many items of each collection the
+ * printer will print. If it is bound to logical false, there is no
+ * limit. Otherwise, it must be bound to an integer indicating the maximum
+ * number of items of each collection to print. If a collection contains
+ * more items, the printer will print items up to the limit followed by
+ * '...' to represent the remaining items. The root binding is nil
+ * indicating no limit.
+ * @type {null|number}
+ */
+cljs.core._STAR_print_length_STAR_ = null;
+/**
+ * *print-level* controls how many levels deep the printer will
+ * print nested objects. If it is bound to logical false, there is no
+ * limit. Otherwise, it must be bound to an integer indicating the maximum
+ * level to print. Each argument to print is at level 0; if an argument is a
+ * collection, its items are at level 1; and so on. If an object is a
+ * collection and is at a level greater than or equal to the value bound to
+ * *print-level*, the printer prints '#' to represent it. The root binding
+ * is nil indicating no limit.
+ * @type {null|number}
+ */
+cljs.core._STAR_print_level_STAR_ = null;
+if(typeof cljs.core._STAR_loaded_libs_STAR_ !== 'undefined'){
+} else {
+/**
+ * @type {*}
+ */
+cljs.core._STAR_loaded_libs_STAR_ = null;
+}
+cljs.core.pr_opts = (function cljs$core$pr_opts(){
+return new cljs.core.PersistentArrayMap(null, 5, [new cljs.core.Keyword(null,"flush-on-newline","flush-on-newline",-151457939),cljs.core._STAR_flush_on_newline_STAR_,new cljs.core.Keyword(null,"readably","readably",1129599760),cljs.core._STAR_print_readably_STAR_,new cljs.core.Keyword(null,"meta","meta",1499536964),cljs.core._STAR_print_meta_STAR_,new cljs.core.Keyword(null,"dup","dup",556298533),cljs.core._STAR_print_dup_STAR_,new cljs.core.Keyword(null,"print-length","print-length",1931866356),cljs.core._STAR_print_length_STAR_], null);
+});
+/**
+ * Set *print-fn* to console.log
+ */
+cljs.core.enable_console_print_BANG_ = (function cljs$core$enable_console_print_BANG_(){
+cljs.core._STAR_print_newline_STAR_ = false;
+
+cljs.core._STAR_print_fn_STAR_ = (function() {
+var G__8821__delegate = function (args){
+return console.log.apply(console,(cljs.core.into_array.cljs$core$IFn$_invoke$arity$1 ? cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(args) : cljs.core.into_array.call(null,args)));
+};
+var G__8821 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__8822__i = 0, G__8822__a = new Array(arguments.length - 0);
+while (G__8822__i < G__8822__a.length) {G__8822__a[G__8822__i] = arguments[G__8822__i + 0]; ++G__8822__i;}
+ args = new cljs.core.IndexedSeq(G__8822__a,0);
+}
+return G__8821__delegate.call(this,args);};
+G__8821.cljs$lang$maxFixedArity = 0;
+G__8821.cljs$lang$applyTo = (function (arglist__8823){
+var args = cljs.core.seq(arglist__8823);
+return G__8821__delegate(args);
+});
+G__8821.cljs$core$IFn$_invoke$arity$variadic = G__8821__delegate;
+return G__8821;
+})()
+;
+
+cljs.core._STAR_print_err_fn_STAR_ = (function() {
+var G__8824__delegate = function (args){
+return console.error.apply(console,(cljs.core.into_array.cljs$core$IFn$_invoke$arity$1 ? cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(args) : cljs.core.into_array.call(null,args)));
+};
+var G__8824 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__8825__i = 0, G__8825__a = new Array(arguments.length - 0);
+while (G__8825__i < G__8825__a.length) {G__8825__a[G__8825__i] = arguments[G__8825__i + 0]; ++G__8825__i;}
+ args = new cljs.core.IndexedSeq(G__8825__a,0);
+}
+return G__8824__delegate.call(this,args);};
+G__8824.cljs$lang$maxFixedArity = 0;
+G__8824.cljs$lang$applyTo = (function (arglist__8826){
+var args = cljs.core.seq(arglist__8826);
+return G__8824__delegate(args);
+});
+G__8824.cljs$core$IFn$_invoke$arity$variadic = G__8824__delegate;
+return G__8824;
+})()
+;
+
+return null;
+});
+/**
+ * Internal - do not use!
+ */
+cljs.core.truth_ = (function cljs$core$truth_(x){
+return (x != null && x !== false);
+});
+cljs.core.not_native = null;
+
+/**
+ * Tests if 2 arguments are the same object
+ */
+cljs.core.identical_QMARK_ = (function cljs$core$identical_QMARK_(x,y){
+return (x === y);
+});
+/**
+ * Returns true if x is nil, false otherwise.
+ */
+cljs.core.nil_QMARK_ = (function cljs$core$nil_QMARK_(x){
+return (x == null);
+});
+/**
+ * Returns true if x is a JavaScript array.
+ */
+cljs.core.array_QMARK_ = (function cljs$core$array_QMARK_(x){
+if((cljs.core._STAR_target_STAR_ === "nodejs")){
+return Array.isArray(x);
+} else {
+return (x instanceof Array);
+}
+});
+/**
+ * Returns true if x is a JavaScript number.
+ */
+cljs.core.number_QMARK_ = (function cljs$core$number_QMARK_(x){
+return typeof x === 'number';
+});
+/**
+ * Returns true if x is logical false, false otherwise.
+ */
+cljs.core.not = (function cljs$core$not(x){
+if((x == null)){
+return true;
+} else {
+if(x === false){
+return true;
+} else {
+return false;
+
+}
+}
+});
+/**
+ * Returns true if x is not nil, false otherwise.
+ */
+cljs.core.some_QMARK_ = (function cljs$core$some_QMARK_(x){
+return !((x == null));
+});
+/**
+ * Returns true if x's constructor is Object
+ */
+cljs.core.object_QMARK_ = (function cljs$core$object_QMARK_(x){
+if(!((x == null))){
+return (x.constructor === Object);
+} else {
+return false;
+}
+});
+/**
+ * Returns true if x is a JavaScript string.
+ */
+cljs.core.string_QMARK_ = (function cljs$core$string_QMARK_(x){
+return goog.isString(x);
+});
+/**
+ * Returns true if x is a JavaScript string of length one.
+ */
+cljs.core.char_QMARK_ = (function cljs$core$char_QMARK_(x){
+return (typeof x === 'string') && (((1) === x.length));
+});
+/**
+ * Returns true if given any argument.
+ */
+cljs.core.any_QMARK_ = (function cljs$core$any_QMARK_(x){
+return true;
+});
+/**
+ * Internal - do not use!
+ */
+cljs.core.native_satisfies_QMARK_ = (function cljs$core$native_satisfies_QMARK_(p,x){
+var x__$1 = (((x == null))?null:x);
+if((p[goog.typeOf(x__$1)])){
+return true;
+} else {
+if((p["_"])){
+return true;
+} else {
+return false;
+
+}
+}
+});
+cljs.core.is_proto_ = (function cljs$core$is_proto_(x){
+return (x.constructor.prototype === x);
+});
+/**
+ * When compiled for a command-line target, whatever function
+ * *main-cli-fn* is set to will be called with the command-line
+ * argv as arguments
+ */
+cljs.core._STAR_main_cli_fn_STAR_ = null;
+/**
+ * Return x's constructor.
+ */
+cljs.core.type = (function cljs$core$type(x){
+if((x == null)){
+return null;
+} else {
+return x.constructor;
+}
+});
+cljs.core.missing_protocol = (function cljs$core$missing_protocol(proto,obj){
+var ty = cljs.core.type(obj);
+var ty__$1 = (cljs.core.truth_((function (){var and__6500__auto__ = ty;
+if(cljs.core.truth_(and__6500__auto__)){
+return ty.cljs$lang$type;
+} else {
+return and__6500__auto__;
+}
+})())?ty.cljs$lang$ctorStr:goog.typeOf(obj));
+return (new Error(["No protocol method ",proto," defined for type ",ty__$1,": ",obj].join("")));
+});
+cljs.core.type__GT_str = (function cljs$core$type__GT_str(ty){
+var temp__4655__auto__ = ty.cljs$lang$ctorStr;
+if(cljs.core.truth_(temp__4655__auto__)){
+var s = temp__4655__auto__;
+return s;
+} else {
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(ty)].join('');
+}
+});
+cljs.core.load_file = (function cljs$core$load_file(file){
+if(cljs.core.truth_(COMPILED)){
+return null;
+} else {
+return goog.nodeGlobalRequire(file);
+}
+});
+if((typeof Symbol !== 'undefined') && ((goog.typeOf(Symbol) === "function"))){
+cljs.core.ITER_SYMBOL = Symbol.iterator;
+} else {
+cljs.core.ITER_SYMBOL = "@@iterator";
+}
+/**
+ * @enum {string}
+ */
+cljs.core.CHAR_MAP = ({"]": "_RBRACK_", "'": "_SINGLEQUOTE_", "=": "_EQ_", "\"": "_DOUBLEQUOTE_", "!": "_BANG_", "*": "_STAR_", "%": "_PERCENT_", "|": "_BAR_", "~": "_TILDE_", "/": "_SLASH_", "\\": "_BSLASH_", "-": "_", "?": "_QMARK_", "&": "_AMPERSAND_", ":": "_COLON_", "<": "_LT_", "{": "_LBRACE_", "}": "_RBRACE_", "[": "_LBRACK_", "#": "_SHARP_", "^": "_CARET_", "+": "_PLUS_", "@": "_CIRCA_", ">": "_GT_"});
+/**
+ * @enum {string}
+ */
+cljs.core.DEMUNGE_MAP = ({"_RBRACE_": "}", "_COLON_": ":", "_BANG_": "!", "_QMARK_": "?", "_BSLASH_": "\\\\", "_SLASH_": "/", "_PERCENT_": "%", "_PLUS_": "+", "_SHARP_": "#", "_LBRACE_": "{", "_BAR_": "|", "_LBRACK_": "[", "_EQ_": "=", "_": "-", "_TILDE_": "~", "_RBRACK_": "]", "_GT_": ">", "_SINGLEQUOTE_": "'", "_CIRCA_": "@", "_AMPERSAND_": "&", "_DOUBLEQUOTE_": "\\\"", "_CARET_": "^", "_LT_": "<", "_STAR_": "*"});
+cljs.core.DEMUNGE_PATTERN = null;
+/**
+ * Returns highest resolution time offered by host in milliseconds.
+ */
+cljs.core.system_time = (function cljs$core$system_time(){
+if((typeof performance !== 'undefined') && (!((performance.now == null)))){
+return performance.now();
+} else {
+if((typeof process !== 'undefined') && (!((process.hrtime == null)))){
+var t = process.hrtime();
+return ((((t[(0)]) * 1.0E9) + (t[(1)])) / 1000000.0);
+} else {
+return (new Date()).getTime();
+
+}
+}
+});
+/**
+ * Construct a JavaScript array of the specified dimensions. Accepts ignored
+ * type argument for compatibility with Clojure. Note that there is no efficient
+ * way to allocate multi-dimensional arrays in JavaScript; as such, this function
+ * will run in polynomial time when called with 3 or more arguments.
+ */
+cljs.core.make_array = (function cljs$core$make_array(var_args){
+var args8827 = [];
+var len__7625__auto___8833 = arguments.length;
+var i__7626__auto___8834 = (0);
+while(true){
+if((i__7626__auto___8834 < len__7625__auto___8833)){
+args8827.push((arguments[i__7626__auto___8834]));
+
+var G__8835 = (i__7626__auto___8834 + (1));
+i__7626__auto___8834 = G__8835;
+continue;
+} else {
+}
+break;
+}
+
+var G__8832 = args8827.length;
+switch (G__8832) {
+case 1:
+return cljs.core.make_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.make_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args8827.slice((2)),(0),null));
+return cljs.core.make_array.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.make_array.cljs$core$IFn$_invoke$arity$1 = (function (size){
+return (new Array(size));
+});
+
+cljs.core.make_array.cljs$core$IFn$_invoke$arity$2 = (function (type,size){
+return (new Array(size));
+});
+
+cljs.core.make_array.cljs$core$IFn$_invoke$arity$variadic = (function (type,size,more_sizes){
+var dims = more_sizes;
+var dimarray = (new Array(size));
+var n__7435__auto___8837 = dimarray.length;
+var i_8838 = (0);
+while(true){
+if((i_8838 < n__7435__auto___8837)){
+(dimarray[i_8838] = (cljs.core.apply.cljs$core$IFn$_invoke$arity$3 ? cljs.core.apply.cljs$core$IFn$_invoke$arity$3(cljs.core.make_array,null,dims) : cljs.core.apply.call(null,cljs.core.make_array,null,dims)));
+
+var G__8839 = (i_8838 + (1));
+i_8838 = G__8839;
+continue;
+} else {
+}
+break;
+}
+
+return dimarray;
+});
+
+cljs.core.make_array.cljs$lang$applyTo = (function (seq8828){
+var G__8829 = cljs.core.first(seq8828);
+var seq8828__$1 = cljs.core.next(seq8828);
+var G__8830 = cljs.core.first(seq8828__$1);
+var seq8828__$2 = cljs.core.next(seq8828__$1);
+return cljs.core.make_array.cljs$core$IFn$_invoke$arity$variadic(G__8829,G__8830,seq8828__$2);
+});
+
+cljs.core.make_array.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns a javascript array, cloned from the passed in array
+ */
+cljs.core.aclone = (function cljs$core$aclone(arr){
+var len = arr.length;
+var new_arr = (new Array(len));
+var n__7435__auto___8840 = len;
+var i_8841 = (0);
+while(true){
+if((i_8841 < n__7435__auto___8840)){
+(new_arr[i_8841] = (arr[i_8841]));
+
+var G__8842 = (i_8841 + (1));
+i_8841 = G__8842;
+continue;
+} else {
+}
+break;
+}
+
+return new_arr;
+});
+/**
+ * Creates a new javascript array.
+ * @param {...*} var_args
+ */
+cljs.core.array = (function cljs$core$array(var_args){
+var a = (new Array(arguments.length));
+var i = (0);
+while(true){
+if((i < a.length)){
+(a[i] = (arguments[i]));
+
+var G__8843 = (i + (1));
+i = G__8843;
+continue;
+} else {
+return a;
+}
+break;
+}
+});
+/**
+ * Returns the value at the index.
+ */
+cljs.core.aget = (function cljs$core$aget(var_args){
+var args8844 = [];
+var len__7625__auto___8853 = arguments.length;
+var i__7626__auto___8854 = (0);
+while(true){
+if((i__7626__auto___8854 < len__7625__auto___8853)){
+args8844.push((arguments[i__7626__auto___8854]));
+
+var G__8855 = (i__7626__auto___8854 + (1));
+i__7626__auto___8854 = G__8855;
+continue;
+} else {
+}
+break;
+}
+
+var G__8849 = args8844.length;
+switch (G__8849) {
+case 2:
+return cljs.core.aget.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args8844.slice((2)),(0),null));
+return cljs.core.aget.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.aget.cljs$core$IFn$_invoke$arity$2 = (function (array,i){
+return (array[i]);
+});
+
+cljs.core.aget.cljs$core$IFn$_invoke$arity$variadic = (function (array,i,idxs){
+var G__8850 = cljs.core.aget;
+var G__8851 = (array[i]);
+var G__8852 = idxs;
+return (cljs.core.apply.cljs$core$IFn$_invoke$arity$3 ? cljs.core.apply.cljs$core$IFn$_invoke$arity$3(G__8850,G__8851,G__8852) : cljs.core.apply.call(null,G__8850,G__8851,G__8852));
+});
+
+cljs.core.aget.cljs$lang$applyTo = (function (seq8845){
+var G__8846 = cljs.core.first(seq8845);
+var seq8845__$1 = cljs.core.next(seq8845);
+var G__8847 = cljs.core.first(seq8845__$1);
+var seq8845__$2 = cljs.core.next(seq8845__$1);
+return cljs.core.aget.cljs$core$IFn$_invoke$arity$variadic(G__8846,G__8847,seq8845__$2);
+});
+
+cljs.core.aget.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Sets the value at the index.
+ */
+cljs.core.aset = (function cljs$core$aset(var_args){
+var args8857 = [];
+var len__7625__auto___8868 = arguments.length;
+var i__7626__auto___8869 = (0);
+while(true){
+if((i__7626__auto___8869 < len__7625__auto___8868)){
+args8857.push((arguments[i__7626__auto___8869]));
+
+var G__8870 = (i__7626__auto___8869 + (1));
+i__7626__auto___8869 = G__8870;
+continue;
+} else {
+}
+break;
+}
+
+var G__8863 = args8857.length;
+switch (G__8863) {
+case 3:
+return cljs.core.aset.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args8857.slice((3)),(0),null));
+return cljs.core.aset.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.aset.cljs$core$IFn$_invoke$arity$3 = (function (array,i,val){
+return (array[i] = val);
+});
+
+cljs.core.aset.cljs$core$IFn$_invoke$arity$variadic = (function (array,idx,idx2,idxv){
+var G__8864 = cljs.core.aset;
+var G__8865 = (array[idx]);
+var G__8866 = idx2;
+var G__8867 = idxv;
+return (cljs.core.apply.cljs$core$IFn$_invoke$arity$4 ? cljs.core.apply.cljs$core$IFn$_invoke$arity$4(G__8864,G__8865,G__8866,G__8867) : cljs.core.apply.call(null,G__8864,G__8865,G__8866,G__8867));
+});
+
+cljs.core.aset.cljs$lang$applyTo = (function (seq8858){
+var G__8859 = cljs.core.first(seq8858);
+var seq8858__$1 = cljs.core.next(seq8858);
+var G__8860 = cljs.core.first(seq8858__$1);
+var seq8858__$2 = cljs.core.next(seq8858__$1);
+var G__8861 = cljs.core.first(seq8858__$2);
+var seq8858__$3 = cljs.core.next(seq8858__$2);
+return cljs.core.aset.cljs$core$IFn$_invoke$arity$variadic(G__8859,G__8860,G__8861,seq8858__$3);
+});
+
+cljs.core.aset.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Returns the length of the array. Works on arrays of all types.
+ */
+cljs.core.alength = (function cljs$core$alength(array){
+return array.length;
+});
+/**
+ * Returns an array with components set to the values in aseq. Optional type
+ * argument accepted for compatibility with Clojure.
+ */
+cljs.core.into_array = (function cljs$core$into_array(var_args){
+var args8872 = [];
+var len__7625__auto___8878 = arguments.length;
+var i__7626__auto___8879 = (0);
+while(true){
+if((i__7626__auto___8879 < len__7625__auto___8878)){
+args8872.push((arguments[i__7626__auto___8879]));
+
+var G__8880 = (i__7626__auto___8879 + (1));
+i__7626__auto___8879 = G__8880;
+continue;
+} else {
+}
+break;
+}
+
+var G__8874 = args8872.length;
+switch (G__8874) {
+case 1:
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8872.length)].join('')));
+
+}
+});
+
+cljs.core.into_array.cljs$core$IFn$_invoke$arity$1 = (function (aseq){
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$2(null,aseq);
+});
+
+cljs.core.into_array.cljs$core$IFn$_invoke$arity$2 = (function (type,aseq){
+var G__8875 = (function (a,x){
+a.push(x);
+
+return a;
+});
+var G__8876 = [];
+var G__8877 = aseq;
+return (cljs.core.reduce.cljs$core$IFn$_invoke$arity$3 ? cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(G__8875,G__8876,G__8877) : cljs.core.reduce.call(null,G__8875,G__8876,G__8877));
+});
+
+cljs.core.into_array.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Invoke JavaScript object method via string. Needed when the
+ * string is not a valid unquoted property name.
+ */
+cljs.core.js_invoke = (function cljs$core$js_invoke(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___8885 = arguments.length;
+var i__7626__auto___8886 = (0);
+while(true){
+if((i__7626__auto___8886 < len__7625__auto___8885)){
+args__7632__auto__.push((arguments[i__7626__auto___8886]));
+
+var G__8887 = (i__7626__auto___8886 + (1));
+i__7626__auto___8886 = G__8887;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((2) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((2)),(0),null)):null);
+return cljs.core.js_invoke.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7633__auto__);
+});
+
+cljs.core.js_invoke.cljs$core$IFn$_invoke$arity$variadic = (function (obj,s,args){
+return (obj[s]).apply(obj,cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(args));
+});
+
+cljs.core.js_invoke.cljs$lang$maxFixedArity = (2);
+
+cljs.core.js_invoke.cljs$lang$applyTo = (function (seq8882){
+var G__8883 = cljs.core.first(seq8882);
+var seq8882__$1 = cljs.core.next(seq8882);
+var G__8884 = cljs.core.first(seq8882__$1);
+var seq8882__$2 = cljs.core.next(seq8882__$1);
+return cljs.core.js_invoke.cljs$core$IFn$_invoke$arity$variadic(G__8883,G__8884,seq8882__$2);
+});
+
+
+/**
+ * Marker protocol
+ * @interface
+ */
+cljs.core.Fn = function(){};
+
+
+/**
+ * Protocol for adding the ability to invoke an object as a function.
+ * For example, a vector can also be used to look up a value:
+ * ([1 2 3 4] 1) => 2
+ * @interface
+ */
+cljs.core.IFn = function(){};
+
+cljs.core._invoke = (function cljs$core$_invoke(var_args){
+var args8888 = [];
+var len__7625__auto___8891 = arguments.length;
+var i__7626__auto___8892 = (0);
+while(true){
+if((i__7626__auto___8892 < len__7625__auto___8891)){
+args8888.push((arguments[i__7626__auto___8892]));
+
+var G__8893 = (i__7626__auto___8892 + (1));
+i__7626__auto___8892 = G__8893;
+continue;
+} else {
+}
+break;
+}
+
+var G__8890 = args8888.length;
+switch (G__8890) {
+case 1:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 6:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+case 7:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$7((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]));
+
+break;
+case 8:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$8((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]));
+
+break;
+case 9:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$9((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]));
+
+break;
+case 10:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$10((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]));
+
+break;
+case 11:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$11((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]));
+
+break;
+case 12:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$12((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]));
+
+break;
+case 13:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$13((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]));
+
+break;
+case 14:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$14((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]));
+
+break;
+case 15:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$15((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]));
+
+break;
+case 16:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$16((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]));
+
+break;
+case 17:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$17((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]));
+
+break;
+case 18:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$18((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]),(arguments[(17)]));
+
+break;
+case 19:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$19((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]),(arguments[(17)]),(arguments[(18)]));
+
+break;
+case 20:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$20((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]),(arguments[(17)]),(arguments[(18)]),(arguments[(19)]));
+
+break;
+case 21:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$21((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]),(arguments[(17)]),(arguments[(18)]),(arguments[(19)]),(arguments[(20)]));
+
+break;
+case 22:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$22((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]),(arguments[(17)]),(arguments[(18)]),(arguments[(19)]),(arguments[(20)]),(arguments[(21)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8888.length)].join('')));
+
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$1 = (function (this$){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$1 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$1(this$);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(this$) : m__7181__auto__.call(null,this$));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(this$) : m__7181__auto____$1.call(null,this$));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$2 = (function (this$,a){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$2 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$2(this$,a);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(this$,a) : m__7181__auto__.call(null,this$,a));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(this$,a) : m__7181__auto____$1.call(null,this$,a));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$3 = (function (this$,a,b){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$3 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$3(this$,a,b);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(this$,a,b) : m__7181__auto__.call(null,this$,a,b));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(this$,a,b) : m__7181__auto____$1.call(null,this$,a,b));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$4 = (function (this$,a,b,c){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$4 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$4(this$,a,b,c);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$4 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$4(this$,a,b,c) : m__7181__auto__.call(null,this$,a,b,c));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$4 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$4(this$,a,b,c) : m__7181__auto____$1.call(null,this$,a,b,c));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$5 = (function (this$,a,b,c,d){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$5 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$5(this$,a,b,c,d);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$5 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$5(this$,a,b,c,d) : m__7181__auto__.call(null,this$,a,b,c,d));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$5 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$5(this$,a,b,c,d) : m__7181__auto____$1.call(null,this$,a,b,c,d));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$6 = (function (this$,a,b,c,d,e){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$6 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$6(this$,a,b,c,d,e);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$6 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$6(this$,a,b,c,d,e) : m__7181__auto__.call(null,this$,a,b,c,d,e));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$6 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$6(this$,a,b,c,d,e) : m__7181__auto____$1.call(null,this$,a,b,c,d,e));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$7 = (function (this$,a,b,c,d,e,f){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$7 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$7(this$,a,b,c,d,e,f);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$7 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$7(this$,a,b,c,d,e,f) : m__7181__auto__.call(null,this$,a,b,c,d,e,f));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$7 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$7(this$,a,b,c,d,e,f) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$8 = (function (this$,a,b,c,d,e,f,g){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$8 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$8(this$,a,b,c,d,e,f,g);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$8 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$8(this$,a,b,c,d,e,f,g) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$8 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$8(this$,a,b,c,d,e,f,g) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$9 = (function (this$,a,b,c,d,e,f,g,h){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$9 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$9(this$,a,b,c,d,e,f,g,h);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$9 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$9(this$,a,b,c,d,e,f,g,h) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$9 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$9(this$,a,b,c,d,e,f,g,h) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$10 = (function (this$,a,b,c,d,e,f,g,h,i){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$10 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$10(this$,a,b,c,d,e,f,g,h,i);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$10 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$10(this$,a,b,c,d,e,f,g,h,i) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$10 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$10(this$,a,b,c,d,e,f,g,h,i) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$11 = (function (this$,a,b,c,d,e,f,g,h,i,j){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$11 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$11(this$,a,b,c,d,e,f,g,h,i,j);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$11 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$11(this$,a,b,c,d,e,f,g,h,i,j) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$11 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$11(this$,a,b,c,d,e,f,g,h,i,j) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$12 = (function (this$,a,b,c,d,e,f,g,h,i,j,k){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$12 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$12(this$,a,b,c,d,e,f,g,h,i,j,k);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$12 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$12(this$,a,b,c,d,e,f,g,h,i,j,k) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$12 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$12(this$,a,b,c,d,e,f,g,h,i,j,k) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$13 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$13 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$13(this$,a,b,c,d,e,f,g,h,i,j,k,l);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$13 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$13(this$,a,b,c,d,e,f,g,h,i,j,k,l) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$13 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$13(this$,a,b,c,d,e,f,g,h,i,j,k,l) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$14 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$14 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$14(this$,a,b,c,d,e,f,g,h,i,j,k,l,m);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$14 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$14(this$,a,b,c,d,e,f,g,h,i,j,k,l,m) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$14 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$14(this$,a,b,c,d,e,f,g,h,i,j,k,l,m) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$15 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$15 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$15(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$15 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$15(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$15 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$15(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$16 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$16 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$16(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$16 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$16(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$16 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$16(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$17 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$17 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$17(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$17 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$17(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$17 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$17(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$18 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$18 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$18(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$18 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$18(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$18 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$18(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$19 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$19 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$19(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$19 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$19(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$19 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$19(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$20 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$20 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$20(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$20 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$20(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$20 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$20(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$21 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$21 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$21(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$21 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$21(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$21 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$21(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$22 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+if((!((this$ == null))) && (!((this$.cljs$core$IFn$_invoke$arity$22 == null)))){
+return this$.cljs$core$IFn$_invoke$arity$22(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._invoke[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$22 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$22(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest) : m__7181__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest));
+} else {
+var m__7181__auto____$1 = (cljs.core._invoke["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$22 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$22(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest) : m__7181__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$lang$maxFixedArity = 22;
+
+
+
+/**
+ * Protocol for cloning a value.
+ * @interface
+ */
+cljs.core.ICloneable = function(){};
+
+/**
+ * Creates a clone of value.
+ */
+cljs.core._clone = (function cljs$core$_clone(value){
+if((!((value == null))) && (!((value.cljs$core$ICloneable$_clone$arity$1 == null)))){
+return value.cljs$core$ICloneable$_clone$arity$1(value);
+} else {
+var x__7180__auto__ = (((value == null))?null:value);
+var m__7181__auto__ = (cljs.core._clone[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(value) : m__7181__auto__.call(null,value));
+} else {
+var m__7181__auto____$1 = (cljs.core._clone["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(value) : m__7181__auto____$1.call(null,value));
+} else {
+throw cljs.core.missing_protocol("ICloneable.-clone",value);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding the ability to count a collection in constant time.
+ * @interface
+ */
+cljs.core.ICounted = function(){};
+
+/**
+ * Calculates the count of coll in constant time. Used by cljs.core/count.
+ */
+cljs.core._count = (function cljs$core$_count(coll){
+if((!((coll == null))) && (!((coll.cljs$core$ICounted$_count$arity$1 == null)))){
+return coll.cljs$core$ICounted$_count$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._count[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._count["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("ICounted.-count",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for creating an empty collection.
+ * @interface
+ */
+cljs.core.IEmptyableCollection = function(){};
+
+/**
+ * Returns an empty collection of the same category as coll. Used
+ * by cljs.core/empty.
+ */
+cljs.core._empty = (function cljs$core$_empty(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IEmptyableCollection$_empty$arity$1 == null)))){
+return coll.cljs$core$IEmptyableCollection$_empty$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._empty[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._empty["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IEmptyableCollection.-empty",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding to a collection.
+ * @interface
+ */
+cljs.core.ICollection = function(){};
+
+/**
+ * Returns a new collection of coll with o added to it. The new item
+ * should be added to the most efficient place, e.g.
+ * (conj [1 2 3 4] 5) => [1 2 3 4 5]
+ * (conj '(2 3 4 5) 1) => '(1 2 3 4 5)
+ */
+cljs.core._conj = (function cljs$core$_conj(coll,o){
+if((!((coll == null))) && (!((coll.cljs$core$ICollection$_conj$arity$2 == null)))){
+return coll.cljs$core$ICollection$_conj$arity$2(coll,o);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._conj[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(coll,o) : m__7181__auto__.call(null,coll,o));
+} else {
+var m__7181__auto____$1 = (cljs.core._conj["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,o) : m__7181__auto____$1.call(null,coll,o));
+} else {
+throw cljs.core.missing_protocol("ICollection.-conj",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for collections to provide indexed-based access to their items.
+ * @interface
+ */
+cljs.core.IIndexed = function(){};
+
+/**
+ * Returns the value at the index n in the collection coll.
+ * Returns not-found if index n is out of bounds and not-found is supplied.
+ */
+cljs.core._nth = (function cljs$core$_nth(var_args){
+var args8895 = [];
+var len__7625__auto___8898 = arguments.length;
+var i__7626__auto___8899 = (0);
+while(true){
+if((i__7626__auto___8899 < len__7625__auto___8898)){
+args8895.push((arguments[i__7626__auto___8899]));
+
+var G__8900 = (i__7626__auto___8899 + (1));
+i__7626__auto___8899 = G__8900;
+continue;
+} else {
+}
+break;
+}
+
+var G__8897 = args8895.length;
+switch (G__8897) {
+case 2:
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8895.length)].join('')));
+
+}
+});
+
+cljs.core._nth.cljs$core$IFn$_invoke$arity$2 = (function (coll,n){
+if((!((coll == null))) && (!((coll.cljs$core$IIndexed$_nth$arity$2 == null)))){
+return coll.cljs$core$IIndexed$_nth$arity$2(coll,n);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._nth[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(coll,n) : m__7181__auto__.call(null,coll,n));
+} else {
+var m__7181__auto____$1 = (cljs.core._nth["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,n) : m__7181__auto____$1.call(null,coll,n));
+} else {
+throw cljs.core.missing_protocol("IIndexed.-nth",coll);
+}
+}
+}
+});
+
+cljs.core._nth.cljs$core$IFn$_invoke$arity$3 = (function (coll,n,not_found){
+if((!((coll == null))) && (!((coll.cljs$core$IIndexed$_nth$arity$3 == null)))){
+return coll.cljs$core$IIndexed$_nth$arity$3(coll,n,not_found);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._nth[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(coll,n,not_found) : m__7181__auto__.call(null,coll,n,not_found));
+} else {
+var m__7181__auto____$1 = (cljs.core._nth["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,n,not_found) : m__7181__auto____$1.call(null,coll,n,not_found));
+} else {
+throw cljs.core.missing_protocol("IIndexed.-nth",coll);
+}
+}
+}
+});
+
+cljs.core._nth.cljs$lang$maxFixedArity = 3;
+
+
+
+/**
+ * Marker protocol indicating an array sequence.
+ * @interface
+ */
+cljs.core.ASeq = function(){};
+
+
+/**
+ * Protocol for collections to provide access to their items as sequences.
+ * @interface
+ */
+cljs.core.ISeq = function(){};
+
+/**
+ * Returns the first item in the collection coll. Used by cljs.core/first.
+ */
+cljs.core._first = (function cljs$core$_first(coll){
+if((!((coll == null))) && (!((coll.cljs$core$ISeq$_first$arity$1 == null)))){
+return coll.cljs$core$ISeq$_first$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._first[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._first["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("ISeq.-first",coll);
+}
+}
+}
+});
+
+/**
+ * Returns a new collection of coll without the first item. It should
+ * always return a seq, e.g.
+ * (rest []) => ()
+ * (rest nil) => ()
+ */
+cljs.core._rest = (function cljs$core$_rest(coll){
+if((!((coll == null))) && (!((coll.cljs$core$ISeq$_rest$arity$1 == null)))){
+return coll.cljs$core$ISeq$_rest$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._rest[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._rest["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("ISeq.-rest",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for accessing the next items of a collection.
+ * @interface
+ */
+cljs.core.INext = function(){};
+
+/**
+ * Returns a new collection of coll without the first item. In contrast to
+ * rest, it should return nil if there are no more items, e.g.
+ * (next []) => nil
+ * (next nil) => nil
+ */
+cljs.core._next = (function cljs$core$_next(coll){
+if((!((coll == null))) && (!((coll.cljs$core$INext$_next$arity$1 == null)))){
+return coll.cljs$core$INext$_next$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._next[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._next["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("INext.-next",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for looking up a value in a data structure.
+ * @interface
+ */
+cljs.core.ILookup = function(){};
+
+/**
+ * Use k to look up a value in o. If not-found is supplied and k is not
+ * a valid value that can be used for look up, not-found is returned.
+ */
+cljs.core._lookup = (function cljs$core$_lookup(var_args){
+var args8902 = [];
+var len__7625__auto___8905 = arguments.length;
+var i__7626__auto___8906 = (0);
+while(true){
+if((i__7626__auto___8906 < len__7625__auto___8905)){
+args8902.push((arguments[i__7626__auto___8906]));
+
+var G__8907 = (i__7626__auto___8906 + (1));
+i__7626__auto___8906 = G__8907;
+continue;
+} else {
+}
+break;
+}
+
+var G__8904 = args8902.length;
+switch (G__8904) {
+case 2:
+return cljs.core._lookup.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._lookup.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8902.length)].join('')));
+
+}
+});
+
+cljs.core._lookup.cljs$core$IFn$_invoke$arity$2 = (function (o,k){
+if((!((o == null))) && (!((o.cljs$core$ILookup$_lookup$arity$2 == null)))){
+return o.cljs$core$ILookup$_lookup$arity$2(o,k);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._lookup[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(o,k) : m__7181__auto__.call(null,o,k));
+} else {
+var m__7181__auto____$1 = (cljs.core._lookup["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(o,k) : m__7181__auto____$1.call(null,o,k));
+} else {
+throw cljs.core.missing_protocol("ILookup.-lookup",o);
+}
+}
+}
+});
+
+cljs.core._lookup.cljs$core$IFn$_invoke$arity$3 = (function (o,k,not_found){
+if((!((o == null))) && (!((o.cljs$core$ILookup$_lookup$arity$3 == null)))){
+return o.cljs$core$ILookup$_lookup$arity$3(o,k,not_found);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._lookup[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(o,k,not_found) : m__7181__auto__.call(null,o,k,not_found));
+} else {
+var m__7181__auto____$1 = (cljs.core._lookup["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(o,k,not_found) : m__7181__auto____$1.call(null,o,k,not_found));
+} else {
+throw cljs.core.missing_protocol("ILookup.-lookup",o);
+}
+}
+}
+});
+
+cljs.core._lookup.cljs$lang$maxFixedArity = 3;
+
+
+
+/**
+ * Protocol for adding associativity to collections.
+ * @interface
+ */
+cljs.core.IAssociative = function(){};
+
+/**
+ * Returns true if k is a key in coll.
+ */
+cljs.core._contains_key_QMARK_ = (function cljs$core$_contains_key_QMARK_(coll,k){
+if((!((coll == null))) && (!((coll.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 == null)))){
+return coll.cljs$core$IAssociative$_contains_key_QMARK_$arity$2(coll,k);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._contains_key_QMARK_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(coll,k) : m__7181__auto__.call(null,coll,k));
+} else {
+var m__7181__auto____$1 = (cljs.core._contains_key_QMARK_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,k) : m__7181__auto____$1.call(null,coll,k));
+} else {
+throw cljs.core.missing_protocol("IAssociative.-contains-key?",coll);
+}
+}
+}
+});
+
+/**
+ * Returns a new collection of coll with a mapping from key k to
+ * value v added to it.
+ */
+cljs.core._assoc = (function cljs$core$_assoc(coll,k,v){
+if((!((coll == null))) && (!((coll.cljs$core$IAssociative$_assoc$arity$3 == null)))){
+return coll.cljs$core$IAssociative$_assoc$arity$3(coll,k,v);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._assoc[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(coll,k,v) : m__7181__auto__.call(null,coll,k,v));
+} else {
+var m__7181__auto____$1 = (cljs.core._assoc["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,k,v) : m__7181__auto____$1.call(null,coll,k,v));
+} else {
+throw cljs.core.missing_protocol("IAssociative.-assoc",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding mapping functionality to collections.
+ * @interface
+ */
+cljs.core.IMap = function(){};
+
+/**
+ * Returns a new collection of coll without the mapping for key k.
+ */
+cljs.core._dissoc = (function cljs$core$_dissoc(coll,k){
+if((!((coll == null))) && (!((coll.cljs$core$IMap$_dissoc$arity$2 == null)))){
+return coll.cljs$core$IMap$_dissoc$arity$2(coll,k);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._dissoc[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(coll,k) : m__7181__auto__.call(null,coll,k));
+} else {
+var m__7181__auto____$1 = (cljs.core._dissoc["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,k) : m__7181__auto____$1.call(null,coll,k));
+} else {
+throw cljs.core.missing_protocol("IMap.-dissoc",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for examining a map entry.
+ * @interface
+ */
+cljs.core.IMapEntry = function(){};
+
+/**
+ * Returns the key of the map entry.
+ */
+cljs.core._key = (function cljs$core$_key(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IMapEntry$_key$arity$1 == null)))){
+return coll.cljs$core$IMapEntry$_key$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._key[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._key["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IMapEntry.-key",coll);
+}
+}
+}
+});
+
+/**
+ * Returns the value of the map entry.
+ */
+cljs.core._val = (function cljs$core$_val(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IMapEntry$_val$arity$1 == null)))){
+return coll.cljs$core$IMapEntry$_val$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._val[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._val["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IMapEntry.-val",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding set functionality to a collection.
+ * @interface
+ */
+cljs.core.ISet = function(){};
+
+/**
+ * Returns a new collection of coll that does not contain v.
+ */
+cljs.core._disjoin = (function cljs$core$_disjoin(coll,v){
+if((!((coll == null))) && (!((coll.cljs$core$ISet$_disjoin$arity$2 == null)))){
+return coll.cljs$core$ISet$_disjoin$arity$2(coll,v);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._disjoin[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(coll,v) : m__7181__auto__.call(null,coll,v));
+} else {
+var m__7181__auto____$1 = (cljs.core._disjoin["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,v) : m__7181__auto____$1.call(null,coll,v));
+} else {
+throw cljs.core.missing_protocol("ISet.-disjoin",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for collections to provide access to their items as stacks. The top
+ * of the stack should be accessed in the most efficient way for the different
+ * data structures.
+ * @interface
+ */
+cljs.core.IStack = function(){};
+
+/**
+ * Returns the item from the top of the stack. Is used by cljs.core/peek.
+ */
+cljs.core._peek = (function cljs$core$_peek(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IStack$_peek$arity$1 == null)))){
+return coll.cljs$core$IStack$_peek$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._peek[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._peek["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IStack.-peek",coll);
+}
+}
+}
+});
+
+/**
+ * Returns a new stack without the item on top of the stack. Is used
+ * by cljs.core/pop.
+ */
+cljs.core._pop = (function cljs$core$_pop(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IStack$_pop$arity$1 == null)))){
+return coll.cljs$core$IStack$_pop$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._pop[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._pop["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IStack.-pop",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding vector functionality to collections.
+ * @interface
+ */
+cljs.core.IVector = function(){};
+
+/**
+ * Returns a new vector with value val added at position n.
+ */
+cljs.core._assoc_n = (function cljs$core$_assoc_n(coll,n,val){
+if((!((coll == null))) && (!((coll.cljs$core$IVector$_assoc_n$arity$3 == null)))){
+return coll.cljs$core$IVector$_assoc_n$arity$3(coll,n,val);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._assoc_n[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(coll,n,val) : m__7181__auto__.call(null,coll,n,val));
+} else {
+var m__7181__auto____$1 = (cljs.core._assoc_n["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,n,val) : m__7181__auto____$1.call(null,coll,n,val));
+} else {
+throw cljs.core.missing_protocol("IVector.-assoc-n",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding dereference functionality to a reference.
+ * @interface
+ */
+cljs.core.IDeref = function(){};
+
+/**
+ * Returns the value of the reference o.
+ */
+cljs.core._deref = (function cljs$core$_deref(o){
+if((!((o == null))) && (!((o.cljs$core$IDeref$_deref$arity$1 == null)))){
+return o.cljs$core$IDeref$_deref$arity$1(o);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._deref[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(o) : m__7181__auto__.call(null,o));
+} else {
+var m__7181__auto____$1 = (cljs.core._deref["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(o) : m__7181__auto____$1.call(null,o));
+} else {
+throw cljs.core.missing_protocol("IDeref.-deref",o);
+}
+}
+}
+});
+
+
+/**
+ * @interface
+ */
+cljs.core.IDerefWithTimeout = function(){};
+
+cljs.core._deref_with_timeout = (function cljs$core$_deref_with_timeout(o,msec,timeout_val){
+if((!((o == null))) && (!((o.cljs$core$IDerefWithTimeout$_deref_with_timeout$arity$3 == null)))){
+return o.cljs$core$IDerefWithTimeout$_deref_with_timeout$arity$3(o,msec,timeout_val);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._deref_with_timeout[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(o,msec,timeout_val) : m__7181__auto__.call(null,o,msec,timeout_val));
+} else {
+var m__7181__auto____$1 = (cljs.core._deref_with_timeout["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(o,msec,timeout_val) : m__7181__auto____$1.call(null,o,msec,timeout_val));
+} else {
+throw cljs.core.missing_protocol("IDerefWithTimeout.-deref-with-timeout",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for accessing the metadata of an object.
+ * @interface
+ */
+cljs.core.IMeta = function(){};
+
+/**
+ * Returns the metadata of object o.
+ */
+cljs.core._meta = (function cljs$core$_meta(o){
+if((!((o == null))) && (!((o.cljs$core$IMeta$_meta$arity$1 == null)))){
+return o.cljs$core$IMeta$_meta$arity$1(o);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._meta[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(o) : m__7181__auto__.call(null,o));
+} else {
+var m__7181__auto____$1 = (cljs.core._meta["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(o) : m__7181__auto____$1.call(null,o));
+} else {
+throw cljs.core.missing_protocol("IMeta.-meta",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding metadata to an object.
+ * @interface
+ */
+cljs.core.IWithMeta = function(){};
+
+/**
+ * Returns a new object with value of o and metadata meta added to it.
+ */
+cljs.core._with_meta = (function cljs$core$_with_meta(o,meta){
+if((!((o == null))) && (!((o.cljs$core$IWithMeta$_with_meta$arity$2 == null)))){
+return o.cljs$core$IWithMeta$_with_meta$arity$2(o,meta);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._with_meta[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(o,meta) : m__7181__auto__.call(null,o,meta));
+} else {
+var m__7181__auto____$1 = (cljs.core._with_meta["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(o,meta) : m__7181__auto____$1.call(null,o,meta));
+} else {
+throw cljs.core.missing_protocol("IWithMeta.-with-meta",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for seq types that can reduce themselves.
+ * Called by cljs.core/reduce.
+ * @interface
+ */
+cljs.core.IReduce = function(){};
+
+/**
+ * f should be a function of 2 arguments. If start is not supplied,
+ * returns the result of applying f to the first 2 items in coll, then
+ * applying f to that result and the 3rd item, etc.
+ */
+cljs.core._reduce = (function cljs$core$_reduce(var_args){
+var args8909 = [];
+var len__7625__auto___8912 = arguments.length;
+var i__7626__auto___8913 = (0);
+while(true){
+if((i__7626__auto___8913 < len__7625__auto___8912)){
+args8909.push((arguments[i__7626__auto___8913]));
+
+var G__8914 = (i__7626__auto___8913 + (1));
+i__7626__auto___8913 = G__8914;
+continue;
+} else {
+}
+break;
+}
+
+var G__8911 = args8909.length;
+switch (G__8911) {
+case 2:
+return cljs.core._reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8909.length)].join('')));
+
+}
+});
+
+cljs.core._reduce.cljs$core$IFn$_invoke$arity$2 = (function (coll,f){
+if((!((coll == null))) && (!((coll.cljs$core$IReduce$_reduce$arity$2 == null)))){
+return coll.cljs$core$IReduce$_reduce$arity$2(coll,f);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._reduce[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(coll,f) : m__7181__auto__.call(null,coll,f));
+} else {
+var m__7181__auto____$1 = (cljs.core._reduce["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,f) : m__7181__auto____$1.call(null,coll,f));
+} else {
+throw cljs.core.missing_protocol("IReduce.-reduce",coll);
+}
+}
+}
+});
+
+cljs.core._reduce.cljs$core$IFn$_invoke$arity$3 = (function (coll,f,start){
+if((!((coll == null))) && (!((coll.cljs$core$IReduce$_reduce$arity$3 == null)))){
+return coll.cljs$core$IReduce$_reduce$arity$3(coll,f,start);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._reduce[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(coll,f,start) : m__7181__auto__.call(null,coll,f,start));
+} else {
+var m__7181__auto____$1 = (cljs.core._reduce["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,f,start) : m__7181__auto____$1.call(null,coll,f,start));
+} else {
+throw cljs.core.missing_protocol("IReduce.-reduce",coll);
+}
+}
+}
+});
+
+cljs.core._reduce.cljs$lang$maxFixedArity = 3;
+
+
+
+/**
+ * Protocol for associative types that can reduce themselves
+ * via a function of key and val. Called by cljs.core/reduce-kv.
+ * @interface
+ */
+cljs.core.IKVReduce = function(){};
+
+/**
+ * Reduces an associative collection and returns the result. f should be
+ * a function that takes three arguments.
+ */
+cljs.core._kv_reduce = (function cljs$core$_kv_reduce(coll,f,init){
+if((!((coll == null))) && (!((coll.cljs$core$IKVReduce$_kv_reduce$arity$3 == null)))){
+return coll.cljs$core$IKVReduce$_kv_reduce$arity$3(coll,f,init);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._kv_reduce[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(coll,f,init) : m__7181__auto__.call(null,coll,f,init));
+} else {
+var m__7181__auto____$1 = (cljs.core._kv_reduce["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,f,init) : m__7181__auto____$1.call(null,coll,f,init));
+} else {
+throw cljs.core.missing_protocol("IKVReduce.-kv-reduce",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding value comparison functionality to a type.
+ * @interface
+ */
+cljs.core.IEquiv = function(){};
+
+/**
+ * Returns true if o and other are equal, false otherwise.
+ */
+cljs.core._equiv = (function cljs$core$_equiv(o,other){
+if((!((o == null))) && (!((o.cljs$core$IEquiv$_equiv$arity$2 == null)))){
+return o.cljs$core$IEquiv$_equiv$arity$2(o,other);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._equiv[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(o,other) : m__7181__auto__.call(null,o,other));
+} else {
+var m__7181__auto____$1 = (cljs.core._equiv["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(o,other) : m__7181__auto____$1.call(null,o,other));
+} else {
+throw cljs.core.missing_protocol("IEquiv.-equiv",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding hashing functionality to a type.
+ * @interface
+ */
+cljs.core.IHash = function(){};
+
+/**
+ * Returns the hash code of o.
+ */
+cljs.core._hash = (function cljs$core$_hash(o){
+if((!((o == null))) && (!((o.cljs$core$IHash$_hash$arity$1 == null)))){
+return o.cljs$core$IHash$_hash$arity$1(o);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._hash[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(o) : m__7181__auto__.call(null,o));
+} else {
+var m__7181__auto____$1 = (cljs.core._hash["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(o) : m__7181__auto____$1.call(null,o));
+} else {
+throw cljs.core.missing_protocol("IHash.-hash",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding the ability to a type to be transformed into a sequence.
+ * @interface
+ */
+cljs.core.ISeqable = function(){};
+
+/**
+ * Returns a seq of o, or nil if o is empty.
+ */
+cljs.core._seq = (function cljs$core$_seq(o){
+if((!((o == null))) && (!((o.cljs$core$ISeqable$_seq$arity$1 == null)))){
+return o.cljs$core$ISeqable$_seq$arity$1(o);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._seq[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(o) : m__7181__auto__.call(null,o));
+} else {
+var m__7181__auto____$1 = (cljs.core._seq["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(o) : m__7181__auto____$1.call(null,o));
+} else {
+throw cljs.core.missing_protocol("ISeqable.-seq",o);
+}
+}
+}
+});
+
+
+/**
+ * Marker interface indicating a persistent collection of sequential items
+ * @interface
+ */
+cljs.core.ISequential = function(){};
+
+
+/**
+ * Marker interface indicating a persistent list
+ * @interface
+ */
+cljs.core.IList = function(){};
+
+
+/**
+ * Marker interface indicating a record object
+ * @interface
+ */
+cljs.core.IRecord = function(){};
+
+
+/**
+ * Protocol for reversing a seq.
+ * @interface
+ */
+cljs.core.IReversible = function(){};
+
+/**
+ * Returns a seq of the items in coll in reversed order.
+ */
+cljs.core._rseq = (function cljs$core$_rseq(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IReversible$_rseq$arity$1 == null)))){
+return coll.cljs$core$IReversible$_rseq$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._rseq[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._rseq["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IReversible.-rseq",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for a collection which can represent their items
+ * in a sorted manner.
+ * @interface
+ */
+cljs.core.ISorted = function(){};
+
+/**
+ * Returns a sorted seq from coll in either ascending or descending order.
+ */
+cljs.core._sorted_seq = (function cljs$core$_sorted_seq(coll,ascending_QMARK_){
+if((!((coll == null))) && (!((coll.cljs$core$ISorted$_sorted_seq$arity$2 == null)))){
+return coll.cljs$core$ISorted$_sorted_seq$arity$2(coll,ascending_QMARK_);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._sorted_seq[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(coll,ascending_QMARK_) : m__7181__auto__.call(null,coll,ascending_QMARK_));
+} else {
+var m__7181__auto____$1 = (cljs.core._sorted_seq["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,ascending_QMARK_) : m__7181__auto____$1.call(null,coll,ascending_QMARK_));
+} else {
+throw cljs.core.missing_protocol("ISorted.-sorted-seq",coll);
+}
+}
+}
+});
+
+/**
+ * Returns a sorted seq from coll in either ascending or descending order.
+ * If ascending is true, the result should contain all items which are > or >=
+ * than k. If ascending is false, the result should contain all items which
+ * are < or <= than k, e.g.
+ * (-sorted-seq-from (sorted-set 1 2 3 4 5) 3 true) => (3 4 5)
+ * (-sorted-seq-from (sorted-set 1 2 3 4 5) 3 false) => (3 2 1)
+ */
+cljs.core._sorted_seq_from = (function cljs$core$_sorted_seq_from(coll,k,ascending_QMARK_){
+if((!((coll == null))) && (!((coll.cljs$core$ISorted$_sorted_seq_from$arity$3 == null)))){
+return coll.cljs$core$ISorted$_sorted_seq_from$arity$3(coll,k,ascending_QMARK_);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._sorted_seq_from[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(coll,k,ascending_QMARK_) : m__7181__auto__.call(null,coll,k,ascending_QMARK_));
+} else {
+var m__7181__auto____$1 = (cljs.core._sorted_seq_from["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,k,ascending_QMARK_) : m__7181__auto____$1.call(null,coll,k,ascending_QMARK_));
+} else {
+throw cljs.core.missing_protocol("ISorted.-sorted-seq-from",coll);
+}
+}
+}
+});
+
+/**
+ * Returns the key for entry.
+ */
+cljs.core._entry_key = (function cljs$core$_entry_key(coll,entry){
+if((!((coll == null))) && (!((coll.cljs$core$ISorted$_entry_key$arity$2 == null)))){
+return coll.cljs$core$ISorted$_entry_key$arity$2(coll,entry);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._entry_key[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(coll,entry) : m__7181__auto__.call(null,coll,entry));
+} else {
+var m__7181__auto____$1 = (cljs.core._entry_key["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,entry) : m__7181__auto____$1.call(null,coll,entry));
+} else {
+throw cljs.core.missing_protocol("ISorted.-entry-key",coll);
+}
+}
+}
+});
+
+/**
+ * Returns the comparator for coll.
+ */
+cljs.core._comparator = (function cljs$core$_comparator(coll){
+if((!((coll == null))) && (!((coll.cljs$core$ISorted$_comparator$arity$1 == null)))){
+return coll.cljs$core$ISorted$_comparator$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._comparator[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._comparator["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("ISorted.-comparator",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for writing. Currently only implemented by StringBufferWriter.
+ * @interface
+ */
+cljs.core.IWriter = function(){};
+
+/**
+ * Writes s with writer and returns the result.
+ */
+cljs.core._write = (function cljs$core$_write(writer,s){
+if((!((writer == null))) && (!((writer.cljs$core$IWriter$_write$arity$2 == null)))){
+return writer.cljs$core$IWriter$_write$arity$2(writer,s);
+} else {
+var x__7180__auto__ = (((writer == null))?null:writer);
+var m__7181__auto__ = (cljs.core._write[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(writer,s) : m__7181__auto__.call(null,writer,s));
+} else {
+var m__7181__auto____$1 = (cljs.core._write["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(writer,s) : m__7181__auto____$1.call(null,writer,s));
+} else {
+throw cljs.core.missing_protocol("IWriter.-write",writer);
+}
+}
+}
+});
+
+/**
+ * Flush writer.
+ */
+cljs.core._flush = (function cljs$core$_flush(writer){
+if((!((writer == null))) && (!((writer.cljs$core$IWriter$_flush$arity$1 == null)))){
+return writer.cljs$core$IWriter$_flush$arity$1(writer);
+} else {
+var x__7180__auto__ = (((writer == null))?null:writer);
+var m__7181__auto__ = (cljs.core._flush[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(writer) : m__7181__auto__.call(null,writer));
+} else {
+var m__7181__auto____$1 = (cljs.core._flush["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(writer) : m__7181__auto____$1.call(null,writer));
+} else {
+throw cljs.core.missing_protocol("IWriter.-flush",writer);
+}
+}
+}
+});
+
+
+/**
+ * The old IPrintable protocol's implementation consisted of building a giant
+ * list of strings to concatenate. This involved lots of concat calls,
+ * intermediate vectors, and lazy-seqs, and was very slow in some older JS
+ * engines. IPrintWithWriter implements printing via the IWriter protocol, so it
+ * be implemented efficiently in terms of e.g. a StringBuffer append.
+ * @interface
+ */
+cljs.core.IPrintWithWriter = function(){};
+
+cljs.core._pr_writer = (function cljs$core$_pr_writer(o,writer,opts){
+if((!((o == null))) && (!((o.cljs$core$IPrintWithWriter$_pr_writer$arity$3 == null)))){
+return o.cljs$core$IPrintWithWriter$_pr_writer$arity$3(o,writer,opts);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._pr_writer[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(o,writer,opts) : m__7181__auto__.call(null,o,writer,opts));
+} else {
+var m__7181__auto____$1 = (cljs.core._pr_writer["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(o,writer,opts) : m__7181__auto____$1.call(null,o,writer,opts));
+} else {
+throw cljs.core.missing_protocol("IPrintWithWriter.-pr-writer",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for types which can have a deferred realization. Currently only
+ * implemented by Delay and LazySeq.
+ * @interface
+ */
+cljs.core.IPending = function(){};
+
+/**
+ * Returns true if a value for x has been produced, false otherwise.
+ */
+cljs.core._realized_QMARK_ = (function cljs$core$_realized_QMARK_(x){
+if((!((x == null))) && (!((x.cljs$core$IPending$_realized_QMARK_$arity$1 == null)))){
+return x.cljs$core$IPending$_realized_QMARK_$arity$1(x);
+} else {
+var x__7180__auto__ = (((x == null))?null:x);
+var m__7181__auto__ = (cljs.core._realized_QMARK_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(x) : m__7181__auto__.call(null,x));
+} else {
+var m__7181__auto____$1 = (cljs.core._realized_QMARK_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(x) : m__7181__auto____$1.call(null,x));
+} else {
+throw cljs.core.missing_protocol("IPending.-realized?",x);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for types that can be watched. Currently only implemented by Atom.
+ * @interface
+ */
+cljs.core.IWatchable = function(){};
+
+/**
+ * Calls all watchers with this, oldval and newval.
+ */
+cljs.core._notify_watches = (function cljs$core$_notify_watches(this$,oldval,newval){
+if((!((this$ == null))) && (!((this$.cljs$core$IWatchable$_notify_watches$arity$3 == null)))){
+return this$.cljs$core$IWatchable$_notify_watches$arity$3(this$,oldval,newval);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._notify_watches[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(this$,oldval,newval) : m__7181__auto__.call(null,this$,oldval,newval));
+} else {
+var m__7181__auto____$1 = (cljs.core._notify_watches["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(this$,oldval,newval) : m__7181__auto____$1.call(null,this$,oldval,newval));
+} else {
+throw cljs.core.missing_protocol("IWatchable.-notify-watches",this$);
+}
+}
+}
+});
+
+/**
+ * Adds a watcher function f to this. Keys must be unique per reference,
+ * and can be used to remove the watch with -remove-watch.
+ */
+cljs.core._add_watch = (function cljs$core$_add_watch(this$,key,f){
+if((!((this$ == null))) && (!((this$.cljs$core$IWatchable$_add_watch$arity$3 == null)))){
+return this$.cljs$core$IWatchable$_add_watch$arity$3(this$,key,f);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._add_watch[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(this$,key,f) : m__7181__auto__.call(null,this$,key,f));
+} else {
+var m__7181__auto____$1 = (cljs.core._add_watch["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(this$,key,f) : m__7181__auto____$1.call(null,this$,key,f));
+} else {
+throw cljs.core.missing_protocol("IWatchable.-add-watch",this$);
+}
+}
+}
+});
+
+/**
+ * Removes watcher that corresponds to key from this.
+ */
+cljs.core._remove_watch = (function cljs$core$_remove_watch(this$,key){
+if((!((this$ == null))) && (!((this$.cljs$core$IWatchable$_remove_watch$arity$2 == null)))){
+return this$.cljs$core$IWatchable$_remove_watch$arity$2(this$,key);
+} else {
+var x__7180__auto__ = (((this$ == null))?null:this$);
+var m__7181__auto__ = (cljs.core._remove_watch[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(this$,key) : m__7181__auto__.call(null,this$,key));
+} else {
+var m__7181__auto____$1 = (cljs.core._remove_watch["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(this$,key) : m__7181__auto____$1.call(null,this$,key));
+} else {
+throw cljs.core.missing_protocol("IWatchable.-remove-watch",this$);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for collections which can transformed to transients.
+ * @interface
+ */
+cljs.core.IEditableCollection = function(){};
+
+/**
+ * Returns a new, transient version of the collection, in constant time.
+ */
+cljs.core._as_transient = (function cljs$core$_as_transient(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IEditableCollection$_as_transient$arity$1 == null)))){
+return coll.cljs$core$IEditableCollection$_as_transient$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._as_transient[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._as_transient["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IEditableCollection.-as-transient",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding basic functionality to transient collections.
+ * @interface
+ */
+cljs.core.ITransientCollection = function(){};
+
+/**
+ * Adds value val to tcoll and returns tcoll.
+ */
+cljs.core._conj_BANG_ = (function cljs$core$_conj_BANG_(tcoll,val){
+if((!((tcoll == null))) && (!((tcoll.cljs$core$ITransientCollection$_conj_BANG_$arity$2 == null)))){
+return tcoll.cljs$core$ITransientCollection$_conj_BANG_$arity$2(tcoll,val);
+} else {
+var x__7180__auto__ = (((tcoll == null))?null:tcoll);
+var m__7181__auto__ = (cljs.core._conj_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(tcoll,val) : m__7181__auto__.call(null,tcoll,val));
+} else {
+var m__7181__auto____$1 = (cljs.core._conj_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(tcoll,val) : m__7181__auto____$1.call(null,tcoll,val));
+} else {
+throw cljs.core.missing_protocol("ITransientCollection.-conj!",tcoll);
+}
+}
+}
+});
+
+/**
+ * Creates a persistent data structure from tcoll and returns it.
+ */
+cljs.core._persistent_BANG_ = (function cljs$core$_persistent_BANG_(tcoll){
+if((!((tcoll == null))) && (!((tcoll.cljs$core$ITransientCollection$_persistent_BANG_$arity$1 == null)))){
+return tcoll.cljs$core$ITransientCollection$_persistent_BANG_$arity$1(tcoll);
+} else {
+var x__7180__auto__ = (((tcoll == null))?null:tcoll);
+var m__7181__auto__ = (cljs.core._persistent_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(tcoll) : m__7181__auto__.call(null,tcoll));
+} else {
+var m__7181__auto____$1 = (cljs.core._persistent_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(tcoll) : m__7181__auto____$1.call(null,tcoll));
+} else {
+throw cljs.core.missing_protocol("ITransientCollection.-persistent!",tcoll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding associativity to transient collections.
+ * @interface
+ */
+cljs.core.ITransientAssociative = function(){};
+
+/**
+ * Returns a new transient collection of tcoll with a mapping from key to
+ * val added to it.
+ */
+cljs.core._assoc_BANG_ = (function cljs$core$_assoc_BANG_(tcoll,key,val){
+if((!((tcoll == null))) && (!((tcoll.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3 == null)))){
+return tcoll.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3(tcoll,key,val);
+} else {
+var x__7180__auto__ = (((tcoll == null))?null:tcoll);
+var m__7181__auto__ = (cljs.core._assoc_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(tcoll,key,val) : m__7181__auto__.call(null,tcoll,key,val));
+} else {
+var m__7181__auto____$1 = (cljs.core._assoc_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(tcoll,key,val) : m__7181__auto____$1.call(null,tcoll,key,val));
+} else {
+throw cljs.core.missing_protocol("ITransientAssociative.-assoc!",tcoll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding mapping functionality to transient collections.
+ * @interface
+ */
+cljs.core.ITransientMap = function(){};
+
+/**
+ * Returns a new transient collection of tcoll without the mapping for key.
+ */
+cljs.core._dissoc_BANG_ = (function cljs$core$_dissoc_BANG_(tcoll,key){
+if((!((tcoll == null))) && (!((tcoll.cljs$core$ITransientMap$_dissoc_BANG_$arity$2 == null)))){
+return tcoll.cljs$core$ITransientMap$_dissoc_BANG_$arity$2(tcoll,key);
+} else {
+var x__7180__auto__ = (((tcoll == null))?null:tcoll);
+var m__7181__auto__ = (cljs.core._dissoc_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(tcoll,key) : m__7181__auto__.call(null,tcoll,key));
+} else {
+var m__7181__auto____$1 = (cljs.core._dissoc_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(tcoll,key) : m__7181__auto____$1.call(null,tcoll,key));
+} else {
+throw cljs.core.missing_protocol("ITransientMap.-dissoc!",tcoll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding vector functionality to transient collections.
+ * @interface
+ */
+cljs.core.ITransientVector = function(){};
+
+/**
+ * Returns tcoll with value val added at position n.
+ */
+cljs.core._assoc_n_BANG_ = (function cljs$core$_assoc_n_BANG_(tcoll,n,val){
+if((!((tcoll == null))) && (!((tcoll.cljs$core$ITransientVector$_assoc_n_BANG_$arity$3 == null)))){
+return tcoll.cljs$core$ITransientVector$_assoc_n_BANG_$arity$3(tcoll,n,val);
+} else {
+var x__7180__auto__ = (((tcoll == null))?null:tcoll);
+var m__7181__auto__ = (cljs.core._assoc_n_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(tcoll,n,val) : m__7181__auto__.call(null,tcoll,n,val));
+} else {
+var m__7181__auto____$1 = (cljs.core._assoc_n_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(tcoll,n,val) : m__7181__auto____$1.call(null,tcoll,n,val));
+} else {
+throw cljs.core.missing_protocol("ITransientVector.-assoc-n!",tcoll);
+}
+}
+}
+});
+
+/**
+ * Returns tcoll with the last item removed from it.
+ */
+cljs.core._pop_BANG_ = (function cljs$core$_pop_BANG_(tcoll){
+if((!((tcoll == null))) && (!((tcoll.cljs$core$ITransientVector$_pop_BANG_$arity$1 == null)))){
+return tcoll.cljs$core$ITransientVector$_pop_BANG_$arity$1(tcoll);
+} else {
+var x__7180__auto__ = (((tcoll == null))?null:tcoll);
+var m__7181__auto__ = (cljs.core._pop_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(tcoll) : m__7181__auto__.call(null,tcoll));
+} else {
+var m__7181__auto____$1 = (cljs.core._pop_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(tcoll) : m__7181__auto____$1.call(null,tcoll));
+} else {
+throw cljs.core.missing_protocol("ITransientVector.-pop!",tcoll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding set functionality to a transient collection.
+ * @interface
+ */
+cljs.core.ITransientSet = function(){};
+
+/**
+ * Returns tcoll without v.
+ */
+cljs.core._disjoin_BANG_ = (function cljs$core$_disjoin_BANG_(tcoll,v){
+if((!((tcoll == null))) && (!((tcoll.cljs$core$ITransientSet$_disjoin_BANG_$arity$2 == null)))){
+return tcoll.cljs$core$ITransientSet$_disjoin_BANG_$arity$2(tcoll,v);
+} else {
+var x__7180__auto__ = (((tcoll == null))?null:tcoll);
+var m__7181__auto__ = (cljs.core._disjoin_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(tcoll,v) : m__7181__auto__.call(null,tcoll,v));
+} else {
+var m__7181__auto____$1 = (cljs.core._disjoin_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(tcoll,v) : m__7181__auto____$1.call(null,tcoll,v));
+} else {
+throw cljs.core.missing_protocol("ITransientSet.-disjoin!",tcoll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for values that can be compared.
+ * @interface
+ */
+cljs.core.IComparable = function(){};
+
+/**
+ * Returns a negative number, zero, or a positive number when x is logically
+ * 'less than', 'equal to', or 'greater than' y.
+ */
+cljs.core._compare = (function cljs$core$_compare(x,y){
+if((!((x == null))) && (!((x.cljs$core$IComparable$_compare$arity$2 == null)))){
+return x.cljs$core$IComparable$_compare$arity$2(x,y);
+} else {
+var x__7180__auto__ = (((x == null))?null:x);
+var m__7181__auto__ = (cljs.core._compare[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(x,y) : m__7181__auto__.call(null,x,y));
+} else {
+var m__7181__auto____$1 = (cljs.core._compare["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(x,y) : m__7181__auto____$1.call(null,x,y));
+} else {
+throw cljs.core.missing_protocol("IComparable.-compare",x);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for accessing the items of a chunk.
+ * @interface
+ */
+cljs.core.IChunk = function(){};
+
+/**
+ * Return a new chunk of coll with the first item removed.
+ */
+cljs.core._drop_first = (function cljs$core$_drop_first(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IChunk$_drop_first$arity$1 == null)))){
+return coll.cljs$core$IChunk$_drop_first$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._drop_first[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._drop_first["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IChunk.-drop-first",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for accessing a collection as sequential chunks.
+ * @interface
+ */
+cljs.core.IChunkedSeq = function(){};
+
+/**
+ * Returns the first chunk in coll.
+ */
+cljs.core._chunked_first = (function cljs$core$_chunked_first(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IChunkedSeq$_chunked_first$arity$1 == null)))){
+return coll.cljs$core$IChunkedSeq$_chunked_first$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._chunked_first[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._chunked_first["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IChunkedSeq.-chunked-first",coll);
+}
+}
+}
+});
+
+/**
+ * Return a new collection of coll with the first chunk removed.
+ */
+cljs.core._chunked_rest = (function cljs$core$_chunked_rest(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IChunkedSeq$_chunked_rest$arity$1 == null)))){
+return coll.cljs$core$IChunkedSeq$_chunked_rest$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._chunked_rest[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._chunked_rest["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IChunkedSeq.-chunked-rest",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for accessing the chunks of a collection.
+ * @interface
+ */
+cljs.core.IChunkedNext = function(){};
+
+/**
+ * Returns a new collection of coll without the first chunk.
+ */
+cljs.core._chunked_next = (function cljs$core$_chunked_next(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IChunkedNext$_chunked_next$arity$1 == null)))){
+return coll.cljs$core$IChunkedNext$_chunked_next$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._chunked_next[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._chunked_next["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IChunkedNext.-chunked-next",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding a name.
+ * @interface
+ */
+cljs.core.INamed = function(){};
+
+/**
+ * Returns the name String of x.
+ */
+cljs.core._name = (function cljs$core$_name(x){
+if((!((x == null))) && (!((x.cljs$core$INamed$_name$arity$1 == null)))){
+return x.cljs$core$INamed$_name$arity$1(x);
+} else {
+var x__7180__auto__ = (((x == null))?null:x);
+var m__7181__auto__ = (cljs.core._name[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(x) : m__7181__auto__.call(null,x));
+} else {
+var m__7181__auto____$1 = (cljs.core._name["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(x) : m__7181__auto____$1.call(null,x));
+} else {
+throw cljs.core.missing_protocol("INamed.-name",x);
+}
+}
+}
+});
+
+/**
+ * Returns the namespace String of x.
+ */
+cljs.core._namespace = (function cljs$core$_namespace(x){
+if((!((x == null))) && (!((x.cljs$core$INamed$_namespace$arity$1 == null)))){
+return x.cljs$core$INamed$_namespace$arity$1(x);
+} else {
+var x__7180__auto__ = (((x == null))?null:x);
+var m__7181__auto__ = (cljs.core._namespace[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(x) : m__7181__auto__.call(null,x));
+} else {
+var m__7181__auto____$1 = (cljs.core._namespace["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(x) : m__7181__auto____$1.call(null,x));
+} else {
+throw cljs.core.missing_protocol("INamed.-namespace",x);
+}
+}
+}
+});
+
+
+/**
+ * Marker protocol indicating an atom.
+ * @interface
+ */
+cljs.core.IAtom = function(){};
+
+
+/**
+ * Protocol for adding resetting functionality.
+ * @interface
+ */
+cljs.core.IReset = function(){};
+
+/**
+ * Sets the value of o to new-value.
+ */
+cljs.core._reset_BANG_ = (function cljs$core$_reset_BANG_(o,new_value){
+if((!((o == null))) && (!((o.cljs$core$IReset$_reset_BANG_$arity$2 == null)))){
+return o.cljs$core$IReset$_reset_BANG_$arity$2(o,new_value);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._reset_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(o,new_value) : m__7181__auto__.call(null,o,new_value));
+} else {
+var m__7181__auto____$1 = (cljs.core._reset_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(o,new_value) : m__7181__auto____$1.call(null,o,new_value));
+} else {
+throw cljs.core.missing_protocol("IReset.-reset!",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding swapping functionality.
+ * @interface
+ */
+cljs.core.ISwap = function(){};
+
+/**
+ * Swaps the value of o to be (apply f current-value-of-atom args).
+ */
+cljs.core._swap_BANG_ = (function cljs$core$_swap_BANG_(var_args){
+var args8916 = [];
+var len__7625__auto___8919 = arguments.length;
+var i__7626__auto___8920 = (0);
+while(true){
+if((i__7626__auto___8920 < len__7625__auto___8919)){
+args8916.push((arguments[i__7626__auto___8920]));
+
+var G__8921 = (i__7626__auto___8920 + (1));
+i__7626__auto___8920 = G__8921;
+continue;
+} else {
+}
+break;
+}
+
+var G__8918 = args8916.length;
+switch (G__8918) {
+case 2:
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8916.length)].join('')));
+
+}
+});
+
+cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (o,f){
+if((!((o == null))) && (!((o.cljs$core$ISwap$_swap_BANG_$arity$2 == null)))){
+return o.cljs$core$ISwap$_swap_BANG_$arity$2(o,f);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._swap_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(o,f) : m__7181__auto__.call(null,o,f));
+} else {
+var m__7181__auto____$1 = (cljs.core._swap_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(o,f) : m__7181__auto____$1.call(null,o,f));
+} else {
+throw cljs.core.missing_protocol("ISwap.-swap!",o);
+}
+}
+}
+});
+
+cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$3 = (function (o,f,a){
+if((!((o == null))) && (!((o.cljs$core$ISwap$_swap_BANG_$arity$3 == null)))){
+return o.cljs$core$ISwap$_swap_BANG_$arity$3(o,f,a);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._swap_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(o,f,a) : m__7181__auto__.call(null,o,f,a));
+} else {
+var m__7181__auto____$1 = (cljs.core._swap_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(o,f,a) : m__7181__auto____$1.call(null,o,f,a));
+} else {
+throw cljs.core.missing_protocol("ISwap.-swap!",o);
+}
+}
+}
+});
+
+cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$4 = (function (o,f,a,b){
+if((!((o == null))) && (!((o.cljs$core$ISwap$_swap_BANG_$arity$4 == null)))){
+return o.cljs$core$ISwap$_swap_BANG_$arity$4(o,f,a,b);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._swap_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$4 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$4(o,f,a,b) : m__7181__auto__.call(null,o,f,a,b));
+} else {
+var m__7181__auto____$1 = (cljs.core._swap_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$4 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$4(o,f,a,b) : m__7181__auto____$1.call(null,o,f,a,b));
+} else {
+throw cljs.core.missing_protocol("ISwap.-swap!",o);
+}
+}
+}
+});
+
+cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$5 = (function (o,f,a,b,xs){
+if((!((o == null))) && (!((o.cljs$core$ISwap$_swap_BANG_$arity$5 == null)))){
+return o.cljs$core$ISwap$_swap_BANG_$arity$5(o,f,a,b,xs);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._swap_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$5 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$5(o,f,a,b,xs) : m__7181__auto__.call(null,o,f,a,b,xs));
+} else {
+var m__7181__auto____$1 = (cljs.core._swap_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$5 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$5(o,f,a,b,xs) : m__7181__auto____$1.call(null,o,f,a,b,xs));
+} else {
+throw cljs.core.missing_protocol("ISwap.-swap!",o);
+}
+}
+}
+});
+
+cljs.core._swap_BANG_.cljs$lang$maxFixedArity = 5;
+
+
+
+/**
+ * Protocol for adding volatile functionality.
+ * @interface
+ */
+cljs.core.IVolatile = function(){};
+
+/**
+ * Sets the value of volatile o to new-value without regard for the
+ * current value. Returns new-value.
+ */
+cljs.core._vreset_BANG_ = (function cljs$core$_vreset_BANG_(o,new_value){
+if((!((o == null))) && (!((o.cljs$core$IVolatile$_vreset_BANG_$arity$2 == null)))){
+return o.cljs$core$IVolatile$_vreset_BANG_$arity$2(o,new_value);
+} else {
+var x__7180__auto__ = (((o == null))?null:o);
+var m__7181__auto__ = (cljs.core._vreset_BANG_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(o,new_value) : m__7181__auto__.call(null,o,new_value));
+} else {
+var m__7181__auto____$1 = (cljs.core._vreset_BANG_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(o,new_value) : m__7181__auto____$1.call(null,o,new_value));
+} else {
+throw cljs.core.missing_protocol("IVolatile.-vreset!",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for iterating over a collection.
+ * @interface
+ */
+cljs.core.IIterable = function(){};
+
+/**
+ * Returns an iterator for coll.
+ */
+cljs.core._iterator = (function cljs$core$_iterator(coll){
+if((!((coll == null))) && (!((coll.cljs$core$IIterable$_iterator$arity$1 == null)))){
+return coll.cljs$core$IIterable$_iterator$arity$1(coll);
+} else {
+var x__7180__auto__ = (((coll == null))?null:coll);
+var m__7181__auto__ = (cljs.core._iterator[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto__.call(null,coll));
+} else {
+var m__7181__auto____$1 = (cljs.core._iterator["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__7181__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IIterable.-iterator",coll);
+}
+}
+}
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IWriter}
+*/
+cljs.core.StringBufferWriter = (function (sb){
+this.sb = sb;
+this.cljs$lang$protocol_mask$partition0$ = 1073741824;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.StringBufferWriter.prototype.cljs$core$IWriter$_write$arity$2 = (function (_,s){
+var self__ = this;
+var ___$1 = this;
+return self__.sb.append(s);
+});
+
+cljs.core.StringBufferWriter.prototype.cljs$core$IWriter$_flush$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return null;
+});
+
+cljs.core.StringBufferWriter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"sb","sb",-1249746442,null)], null);
+});
+
+cljs.core.StringBufferWriter.cljs$lang$type = true;
+
+cljs.core.StringBufferWriter.cljs$lang$ctorStr = "cljs.core/StringBufferWriter";
+
+cljs.core.StringBufferWriter.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/StringBufferWriter");
+});
+
+cljs.core.__GT_StringBufferWriter = (function cljs$core$__GT_StringBufferWriter(sb){
+return (new cljs.core.StringBufferWriter(sb));
+});
+
+/**
+ * Support so that collections can implement toString without
+ * loading all the printing machinery.
+ */
+cljs.core.pr_str_STAR_ = (function cljs$core$pr_str_STAR_(obj){
+var sb = (new goog.string.StringBuffer());
+var writer = (new cljs.core.StringBufferWriter(sb));
+obj.cljs$core$IPrintWithWriter$_pr_writer$arity$3(null,writer,cljs.core.pr_opts());
+
+writer.cljs$core$IWriter$_flush$arity$1(null);
+
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(sb)].join('');
+});
+cljs.core.int_rotate_left = (function cljs$core$int_rotate_left(x,n){
+return ((x << n) | (x >>> (- n)));
+});
+if((typeof Math.imul !== 'undefined') && (!((Math.imul((4294967295),(5)) === (0))))){
+cljs.core.imul = (function cljs$core$imul(a,b){
+return Math.imul(a,b);
+});
+} else {
+cljs.core.imul = (function cljs$core$imul(a,b){
+var ah = ((a >>> (16)) & (65535));
+var al = (a & (65535));
+var bh = ((b >>> (16)) & (65535));
+var bl = (b & (65535));
+return (((al * bl) + ((((ah * bl) + (al * bh)) << (16)) >>> (0))) | (0));
+});
+}
+cljs.core.m3_seed = (0);
+cljs.core.m3_C1 = ((3432918353) | (0));
+cljs.core.m3_C2 = ((461845907) | (0));
+cljs.core.m3_mix_K1 = (function cljs$core$m3_mix_K1(k1){
+return cljs.core.imul(cljs.core.int_rotate_left(cljs.core.imul((k1 | (0)),cljs.core.m3_C1),(15)),cljs.core.m3_C2);
+});
+cljs.core.m3_mix_H1 = (function cljs$core$m3_mix_H1(h1,k1){
+return ((cljs.core.imul(cljs.core.int_rotate_left(((h1 | (0)) ^ (k1 | (0))),(13)),(5)) + ((3864292196) | (0))) | (0));
+});
+cljs.core.m3_fmix = (function cljs$core$m3_fmix(h1,len){
+var h1__$1 = (h1 | (0));
+var h1__$2 = (h1__$1 ^ len);
+var h1__$3 = (h1__$2 ^ (h1__$2 >>> (16)));
+var h1__$4 = cljs.core.imul(h1__$3,((2246822507) | (0)));
+var h1__$5 = (h1__$4 ^ (h1__$4 >>> (13)));
+var h1__$6 = cljs.core.imul(h1__$5,((3266489909) | (0)));
+return (h1__$6 ^ (h1__$6 >>> (16)));
+});
+cljs.core.m3_hash_int = (function cljs$core$m3_hash_int(in$){
+if((in$ === (0))){
+return in$;
+} else {
+var k1 = cljs.core.m3_mix_K1(in$);
+var h1 = cljs.core.m3_mix_H1(cljs.core.m3_seed,k1);
+return cljs.core.m3_fmix(h1,(4));
+}
+});
+cljs.core.m3_hash_unencoded_chars = (function cljs$core$m3_hash_unencoded_chars(in$){
+var h1 = (function (){var i = (1);
+var h1 = cljs.core.m3_seed;
+while(true){
+if((i < in$.length)){
+var G__8923 = (i + (2));
+var G__8924 = cljs.core.m3_mix_H1(h1,cljs.core.m3_mix_K1((in$.charCodeAt((i - (1))) | (in$.charCodeAt(i) << (16)))));
+i = G__8923;
+h1 = G__8924;
+continue;
+} else {
+return h1;
+}
+break;
+}
+})();
+var h1__$1 = ((((in$.length & (1)) === (1)))?(h1 ^ cljs.core.m3_mix_K1(in$.charCodeAt((in$.length - (1))))):h1);
+return cljs.core.m3_fmix(h1__$1,cljs.core.imul((2),in$.length));
+});
+
+
+
+cljs.core.string_hash_cache = {};
+cljs.core.string_hash_cache_count = (0);
+cljs.core.hash_string_STAR_ = (function cljs$core$hash_string_STAR_(s){
+if(!((s == null))){
+var len = s.length;
+if((len > (0))){
+var i = (0);
+var hash = (0);
+while(true){
+if((i < len)){
+var G__8927 = (i + (1));
+var G__8928 = (cljs.core.imul((31),hash) + s.charCodeAt(i));
+i = G__8927;
+hash = G__8928;
+continue;
+} else {
+return hash;
+}
+break;
+}
+} else {
+return (0);
+}
+} else {
+return (0);
+}
+});
+cljs.core.add_to_string_hash_cache = (function cljs$core$add_to_string_hash_cache(k){
+var h = cljs.core.hash_string_STAR_(k);
+(cljs.core.string_hash_cache[k] = h);
+
+cljs.core.string_hash_cache_count = (cljs.core.string_hash_cache_count + (1));
+
+return h;
+});
+cljs.core.hash_string = (function cljs$core$hash_string(k){
+if((cljs.core.string_hash_cache_count > (255))){
+cljs.core.string_hash_cache = {};
+
+cljs.core.string_hash_cache_count = (0);
+} else {
+}
+
+if((k == null)){
+return (0);
+} else {
+var h = (cljs.core.string_hash_cache[k]);
+if(typeof h === 'number'){
+return h;
+} else {
+return cljs.core.add_to_string_hash_cache(k);
+}
+}
+});
+/**
+ * Returns the hash code of its argument. Note this is the hash code
+ * consistent with =.
+ */
+cljs.core.hash = (function cljs$core$hash(o){
+if(((!((o == null)))?((((o.cljs$lang$protocol_mask$partition0$ & (4194304))) || ((cljs.core.PROTOCOL_SENTINEL === o.cljs$core$IHash$)))?true:false):false)){
+return o.cljs$core$IHash$_hash$arity$1(null);
+} else {
+if(typeof o === 'number'){
+if(cljs.core.truth_(isFinite(o))){
+return (Math.floor(o) % (2147483647));
+} else {
+var G__8936 = o;
+switch (G__8936) {
+case Infinity:
+return (2146435072);
+
+break;
+case -Infinity:
+return (-1048576);
+
+break;
+default:
+return (2146959360);
+
+}
+}
+} else {
+if(o === true){
+return (1231);
+} else {
+if(o === false){
+return (1237);
+} else {
+if(typeof o === 'string'){
+return cljs.core.m3_hash_int(cljs.core.hash_string(o));
+} else {
+if((o instanceof Date)){
+return o.valueOf();
+} else {
+if((o == null)){
+return (0);
+} else {
+return cljs.core._hash(o);
+
+}
+}
+}
+}
+}
+}
+}
+});
+cljs.core.hash_combine = (function cljs$core$hash_combine(seed,hash){
+return (seed ^ (((hash + (2654435769)) + (seed << (6))) + (seed >> (2))));
+});
+/**
+ * Evaluates x and tests if it is an instance of the type
+ * c. Returns true or false
+ */
+cljs.core.instance_QMARK_ = (function cljs$core$instance_QMARK_(c,x){
+return (x instanceof c);
+});
+/**
+ * Return true if x is a Symbol
+ */
+cljs.core.symbol_QMARK_ = (function cljs$core$symbol_QMARK_(x){
+return (x instanceof cljs.core.Symbol);
+});
+cljs.core.hash_symbol = (function cljs$core$hash_symbol(sym){
+return cljs.core.hash_combine(cljs.core.m3_hash_unencoded_chars(sym.name),cljs.core.hash_string(sym.ns));
+});
+cljs.core.compare_symbols = (function cljs$core$compare_symbols(a,b){
+if((a.str === b.str)){
+return (0);
+} else {
+if(cljs.core.truth_((function (){var and__6500__auto__ = cljs.core.not(a.ns);
+if(and__6500__auto__){
+return b.ns;
+} else {
+return and__6500__auto__;
+}
+})())){
+return (-1);
+} else {
+if(cljs.core.truth_(a.ns)){
+if(cljs.core.not(b.ns)){
+return (1);
+} else {
+var nsc = (function (){var G__8944 = a.ns;
+var G__8945 = b.ns;
+return goog.array.defaultCompare(G__8944,G__8945);
+})();
+if(((0) === nsc)){
+var G__8946 = a.name;
+var G__8947 = b.name;
+return goog.array.defaultCompare(G__8946,G__8947);
+} else {
+return nsc;
+}
+}
+} else {
+var G__8948 = a.name;
+var G__8949 = b.name;
+return goog.array.defaultCompare(G__8948,G__8949);
+
+}
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.INamed}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IPrintWithWriter}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.Symbol = (function (ns,name,str,_hash,_meta){
+this.ns = ns;
+this.name = name;
+this.str = str;
+this._hash = _hash;
+this._meta = _meta;
+this.cljs$lang$protocol_mask$partition0$ = 2154168321;
+this.cljs$lang$protocol_mask$partition1$ = 4096;
+})
+cljs.core.Symbol.prototype.toString = (function (){
+var self__ = this;
+var _ = this;
+return self__.str;
+});
+
+cljs.core.Symbol.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Symbol.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (_,other){
+var self__ = this;
+var ___$1 = this;
+if((other instanceof cljs.core.Symbol)){
+return (self__.str === other.str);
+} else {
+return false;
+}
+});
+
+cljs.core.Symbol.prototype.call = (function() {
+var G__8951 = null;
+var G__8951__2 = (function (self__,coll){
+var self__ = this;
+var self____$1 = this;
+var sym = self____$1;
+return (cljs.core.get.cljs$core$IFn$_invoke$arity$2 ? cljs.core.get.cljs$core$IFn$_invoke$arity$2(coll,sym) : cljs.core.get.call(null,coll,sym));
+});
+var G__8951__3 = (function (self__,coll,not_found){
+var self__ = this;
+var self____$1 = this;
+var sym = self____$1;
+return (cljs.core.get.cljs$core$IFn$_invoke$arity$3 ? cljs.core.get.cljs$core$IFn$_invoke$arity$3(coll,sym,not_found) : cljs.core.get.call(null,coll,sym,not_found));
+});
+G__8951 = function(self__,coll,not_found){
+switch(arguments.length){
+case 2:
+return G__8951__2.call(this,self__,coll);
+case 3:
+return G__8951__3.call(this,self__,coll,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__8951.cljs$core$IFn$_invoke$arity$2 = G__8951__2;
+G__8951.cljs$core$IFn$_invoke$arity$3 = G__8951__3;
+return G__8951;
+})()
+;
+
+cljs.core.Symbol.prototype.apply = (function (self__,args8950){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args8950)));
+});
+
+cljs.core.Symbol.prototype.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+var self__ = this;
+var sym = this;
+return (cljs.core.get.cljs$core$IFn$_invoke$arity$2 ? cljs.core.get.cljs$core$IFn$_invoke$arity$2(coll,sym) : cljs.core.get.call(null,coll,sym));
+});
+
+cljs.core.Symbol.prototype.cljs$core$IFn$_invoke$arity$2 = (function (coll,not_found){
+var self__ = this;
+var sym = this;
+return (cljs.core.get.cljs$core$IFn$_invoke$arity$3 ? cljs.core.get.cljs$core$IFn$_invoke$arity$3(coll,sym,not_found) : cljs.core.get.call(null,coll,sym,not_found));
+});
+
+cljs.core.Symbol.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__._meta;
+});
+
+cljs.core.Symbol.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_,new_meta){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.Symbol(self__.ns,self__.name,self__.str,self__._hash,new_meta));
+});
+
+cljs.core.Symbol.prototype.cljs$core$IHash$_hash$arity$1 = (function (sym){
+var self__ = this;
+var sym__$1 = this;
+var h__6952__auto__ = self__._hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_symbol(sym__$1);
+self__._hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.Symbol.prototype.cljs$core$INamed$_name$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.name;
+});
+
+cljs.core.Symbol.prototype.cljs$core$INamed$_namespace$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.ns;
+});
+
+cljs.core.Symbol.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (o,writer,_){
+var self__ = this;
+var o__$1 = this;
+return cljs.core._write(writer,self__.str);
+});
+
+cljs.core.Symbol.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"ns","ns",2082130287,null),new cljs.core.Symbol(null,"name","name",-810760592,null),new cljs.core.Symbol(null,"str","str",-1564826950,null),cljs.core.with_meta(new cljs.core.Symbol(null,"_hash","_hash",-2130838312,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"_meta","_meta",-1716892533,null)], null);
+});
+
+cljs.core.Symbol.cljs$lang$type = true;
+
+cljs.core.Symbol.cljs$lang$ctorStr = "cljs.core/Symbol";
+
+cljs.core.Symbol.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Symbol");
+});
+
+cljs.core.__GT_Symbol = (function cljs$core$__GT_Symbol(ns,name,str,_hash,_meta){
+return (new cljs.core.Symbol(ns,name,str,_hash,_meta));
+});
+
+/**
+ * Returns a Symbol with the given namespace and name.
+ */
+cljs.core.symbol = (function cljs$core$symbol(var_args){
+var args8952 = [];
+var len__7625__auto___8955 = arguments.length;
+var i__7626__auto___8956 = (0);
+while(true){
+if((i__7626__auto___8956 < len__7625__auto___8955)){
+args8952.push((arguments[i__7626__auto___8956]));
+
+var G__8957 = (i__7626__auto___8956 + (1));
+i__7626__auto___8956 = G__8957;
+continue;
+} else {
+}
+break;
+}
+
+var G__8954 = args8952.length;
+switch (G__8954) {
+case 1:
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8952.length)].join('')));
+
+}
+});
+
+cljs.core.symbol.cljs$core$IFn$_invoke$arity$1 = (function (name){
+if((name instanceof cljs.core.Symbol)){
+return name;
+} else {
+var idx = name.indexOf("/");
+if((idx < (1))){
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$2(null,name);
+} else {
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$2(name.substring((0),idx),name.substring((idx + (1)),name.length));
+}
+}
+});
+
+cljs.core.symbol.cljs$core$IFn$_invoke$arity$2 = (function (ns,name){
+var sym_str = ((!((ns == null)))?[cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns),cljs.core.str.cljs$core$IFn$_invoke$arity$1("/"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(name)].join(''):name);
+return (new cljs.core.Symbol(ns,name,sym_str,null,null));
+});
+
+cljs.core.symbol.cljs$lang$maxFixedArity = 2;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.Fn}
+ * @implements {cljs.core.IDeref}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.Var = (function (val,sym,_meta){
+this.val = val;
+this.sym = sym;
+this._meta = _meta;
+this.cljs$lang$protocol_mask$partition0$ = 6717441;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.Var.prototype.isMacro = (function (){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).cljs$lang$macro;
+});
+
+cljs.core.Var.prototype.toString = (function (){
+var self__ = this;
+var _ = this;
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1("#'"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.sym)].join('');
+});
+
+cljs.core.Var.prototype.cljs$core$IDeref$_deref$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+});
+
+cljs.core.Var.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__._meta;
+});
+
+cljs.core.Var.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_,new_meta){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.Var(self__.val,self__.sym,new_meta));
+});
+
+cljs.core.Var.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (this$,other){
+var self__ = this;
+var this$__$1 = this;
+if((other instanceof cljs.core.Var)){
+var G__8960 = this$__$1.sym;
+var G__8961 = other.sym;
+return (cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2 ? cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(G__8960,G__8961) : cljs.core._EQ_.call(null,G__8960,G__8961));
+} else {
+return false;
+}
+});
+
+cljs.core.Var.prototype.cljs$core$IHash$_hash$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.hash_symbol(self__.sym);
+});
+
+cljs.core.Var.prototype.cljs$core$Fn$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Var.prototype.call = (function() {
+var G__9006 = null;
+var G__9006__1 = (function (self__){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null);
+});
+var G__9006__2 = (function (self__,a){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a);
+});
+var G__9006__3 = (function (self__,a,b){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b);
+});
+var G__9006__4 = (function (self__,a,b,c){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c);
+});
+var G__9006__5 = (function (self__,a,b,c,d){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d);
+});
+var G__9006__6 = (function (self__,a,b,c,d,e){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e);
+});
+var G__9006__7 = (function (self__,a,b,c,d,e,f){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f);
+});
+var G__9006__8 = (function (self__,a,b,c,d,e,f,g){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g);
+});
+var G__9006__9 = (function (self__,a,b,c,d,e,f,g,h){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h);
+});
+var G__9006__10 = (function (self__,a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i);
+});
+var G__9006__11 = (function (self__,a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j);
+});
+var G__9006__12 = (function (self__,a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k);
+});
+var G__9006__13 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l);
+});
+var G__9006__14 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m);
+});
+var G__9006__15 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
+});
+var G__9006__16 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o);
+});
+var G__9006__17 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+});
+var G__9006__18 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
+});
+var G__9006__19 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r);
+});
+var G__9006__20 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);
+});
+var G__9006__21 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t);
+});
+var G__9006__22 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var G__8962 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+var G__8963 = a;
+var G__8964 = b;
+var G__8965 = c;
+var G__8966 = d;
+var G__8967 = e;
+var G__8968 = f;
+var G__8969 = g;
+var G__8970 = h;
+var G__8971 = i;
+var G__8972 = j;
+var G__8973 = k;
+var G__8974 = l;
+var G__8975 = m;
+var G__8976 = n;
+var G__8977 = o;
+var G__8978 = p;
+var G__8979 = q;
+var G__8980 = r;
+var G__8981 = s;
+var G__8982 = t;
+var G__8983 = rest;
+return (cljs.core.apply.cljs$core$IFn$_invoke$arity$22 ? cljs.core.apply.cljs$core$IFn$_invoke$arity$22(G__8962,G__8963,G__8964,G__8965,G__8966,G__8967,G__8968,G__8969,G__8970,G__8971,G__8972,G__8973,G__8974,G__8975,G__8976,G__8977,G__8978,G__8979,G__8980,G__8981,G__8982,G__8983) : cljs.core.apply.call(null,G__8962,G__8963,G__8964,G__8965,G__8966,G__8967,G__8968,G__8969,G__8970,G__8971,G__8972,G__8973,G__8974,G__8975,G__8976,G__8977,G__8978,G__8979,G__8980,G__8981,G__8982,G__8983));
+});
+G__9006 = function(self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+switch(arguments.length){
+case 1:
+return G__9006__1.call(this,self__);
+case 2:
+return G__9006__2.call(this,self__,a);
+case 3:
+return G__9006__3.call(this,self__,a,b);
+case 4:
+return G__9006__4.call(this,self__,a,b,c);
+case 5:
+return G__9006__5.call(this,self__,a,b,c,d);
+case 6:
+return G__9006__6.call(this,self__,a,b,c,d,e);
+case 7:
+return G__9006__7.call(this,self__,a,b,c,d,e,f);
+case 8:
+return G__9006__8.call(this,self__,a,b,c,d,e,f,g);
+case 9:
+return G__9006__9.call(this,self__,a,b,c,d,e,f,g,h);
+case 10:
+return G__9006__10.call(this,self__,a,b,c,d,e,f,g,h,i);
+case 11:
+return G__9006__11.call(this,self__,a,b,c,d,e,f,g,h,i,j);
+case 12:
+return G__9006__12.call(this,self__,a,b,c,d,e,f,g,h,i,j,k);
+case 13:
+return G__9006__13.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l);
+case 14:
+return G__9006__14.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m);
+case 15:
+return G__9006__15.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
+case 16:
+return G__9006__16.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o);
+case 17:
+return G__9006__17.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+case 18:
+return G__9006__18.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
+case 19:
+return G__9006__19.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r);
+case 20:
+return G__9006__20.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);
+case 21:
+return G__9006__21.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t);
+case 22:
+return G__9006__22.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9006.cljs$core$IFn$_invoke$arity$1 = G__9006__1;
+G__9006.cljs$core$IFn$_invoke$arity$2 = G__9006__2;
+G__9006.cljs$core$IFn$_invoke$arity$3 = G__9006__3;
+G__9006.cljs$core$IFn$_invoke$arity$4 = G__9006__4;
+G__9006.cljs$core$IFn$_invoke$arity$5 = G__9006__5;
+G__9006.cljs$core$IFn$_invoke$arity$6 = G__9006__6;
+G__9006.cljs$core$IFn$_invoke$arity$7 = G__9006__7;
+G__9006.cljs$core$IFn$_invoke$arity$8 = G__9006__8;
+G__9006.cljs$core$IFn$_invoke$arity$9 = G__9006__9;
+G__9006.cljs$core$IFn$_invoke$arity$10 = G__9006__10;
+G__9006.cljs$core$IFn$_invoke$arity$11 = G__9006__11;
+G__9006.cljs$core$IFn$_invoke$arity$12 = G__9006__12;
+G__9006.cljs$core$IFn$_invoke$arity$13 = G__9006__13;
+G__9006.cljs$core$IFn$_invoke$arity$14 = G__9006__14;
+G__9006.cljs$core$IFn$_invoke$arity$15 = G__9006__15;
+G__9006.cljs$core$IFn$_invoke$arity$16 = G__9006__16;
+G__9006.cljs$core$IFn$_invoke$arity$17 = G__9006__17;
+G__9006.cljs$core$IFn$_invoke$arity$18 = G__9006__18;
+G__9006.cljs$core$IFn$_invoke$arity$19 = G__9006__19;
+G__9006.cljs$core$IFn$_invoke$arity$20 = G__9006__20;
+G__9006.cljs$core$IFn$_invoke$arity$21 = G__9006__21;
+G__9006.cljs$core$IFn$_invoke$arity$22 = G__9006__22;
+return G__9006;
+})()
+;
+
+cljs.core.Var.prototype.apply = (function (self__,args8959){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args8959)));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$0 = (function (){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$1 = (function (a){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$2 = (function (a,b){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$3 = (function (a,b,c){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$4 = (function (a,b,c,d){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$5 = (function (a,b,c,d,e){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$6 = (function (a,b,c,d,e,f){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$7 = (function (a,b,c,d,e,f,g){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$8 = (function (a,b,c,d,e,f,g,h){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$9 = (function (a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$10 = (function (a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$11 = (function (a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$12 = (function (a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$13 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$14 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$15 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$16 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$17 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$18 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$19 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$20 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t);
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$21 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var _ = this;
+var G__8984 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+var G__8985 = a;
+var G__8986 = b;
+var G__8987 = c;
+var G__8988 = d;
+var G__8989 = e;
+var G__8990 = f;
+var G__8991 = g;
+var G__8992 = h;
+var G__8993 = i;
+var G__8994 = j;
+var G__8995 = k;
+var G__8996 = l;
+var G__8997 = m;
+var G__8998 = n;
+var G__8999 = o;
+var G__9000 = p;
+var G__9001 = q;
+var G__9002 = r;
+var G__9003 = s;
+var G__9004 = t;
+var G__9005 = rest;
+return (cljs.core.apply.cljs$core$IFn$_invoke$arity$22 ? cljs.core.apply.cljs$core$IFn$_invoke$arity$22(G__8984,G__8985,G__8986,G__8987,G__8988,G__8989,G__8990,G__8991,G__8992,G__8993,G__8994,G__8995,G__8996,G__8997,G__8998,G__8999,G__9000,G__9001,G__9002,G__9003,G__9004,G__9005) : cljs.core.apply.call(null,G__8984,G__8985,G__8986,G__8987,G__8988,G__8989,G__8990,G__8991,G__8992,G__8993,G__8994,G__8995,G__8996,G__8997,G__8998,G__8999,G__9000,G__9001,G__9002,G__9003,G__9004,G__9005));
+});
+
+cljs.core.Var.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"val","val",1769233139,null),new cljs.core.Symbol(null,"sym","sym",195671222,null),new cljs.core.Symbol(null,"_meta","_meta",-1716892533,null)], null);
+});
+
+cljs.core.Var.cljs$lang$type = true;
+
+cljs.core.Var.cljs$lang$ctorStr = "cljs.core/Var";
+
+cljs.core.Var.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Var");
+});
+
+cljs.core.__GT_Var = (function cljs$core$__GT_Var(val,sym,_meta){
+return (new cljs.core.Var(val,sym,_meta));
+});
+
+/**
+ * Returns true if v is of type cljs.core.Var
+ */
+cljs.core.var_QMARK_ = (function cljs$core$var_QMARK_(v){
+return (v instanceof cljs.core.Var);
+});
+
+
+/**
+ * Return true if x implements IIterable protocol.
+ */
+cljs.core.iterable_QMARK_ = (function cljs$core$iterable_QMARK_(x){
+if(!((x == null))){
+if((false) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IIterable$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IIterable,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IIterable,x);
+}
+});
+/**
+ * Clone the supplied value which must implement ICloneable.
+ */
+cljs.core.clone = (function cljs$core$clone(value){
+return cljs.core._clone(value);
+});
+/**
+ * Return true if x implements ICloneable protocol.
+ */
+cljs.core.cloneable_QMARK_ = (function cljs$core$cloneable_QMARK_(value){
+if(!((value == null))){
+if(((value.cljs$lang$protocol_mask$partition1$ & (8192))) || ((cljs.core.PROTOCOL_SENTINEL === value.cljs$core$ICloneable$))){
+return true;
+} else {
+if((!value.cljs$lang$protocol_mask$partition1$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICloneable,value);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICloneable,value);
+}
+});
+/**
+ * Returns a seq on the collection. If the collection is
+ * empty, returns nil. (seq nil) returns nil. seq also works on
+ * Strings.
+ */
+cljs.core.seq = (function cljs$core$seq(coll){
+if((coll == null)){
+return null;
+} else {
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (8388608))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeqable$)))?true:false):false)){
+return coll.cljs$core$ISeqable$_seq$arity$1(null);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+if((coll.length === (0))){
+return null;
+} else {
+return (new cljs.core.IndexedSeq(coll,(0),null));
+}
+} else {
+if(typeof coll === 'string'){
+if((coll.length === (0))){
+return null;
+} else {
+return (new cljs.core.IndexedSeq(coll,(0),null));
+}
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.ISeqable,coll)){
+return cljs.core._seq(coll);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1(coll),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" is not ISeqable")].join('')));
+
+}
+}
+}
+}
+}
+});
+/**
+ * Returns the first item in the collection. Calls seq on its
+ * argument. If coll is nil, returns nil.
+ */
+cljs.core.first = (function cljs$core$first(coll){
+if((coll == null)){
+return null;
+} else {
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeq$)))?true:false):false)){
+return coll.cljs$core$ISeq$_first$arity$1(null);
+} else {
+var s = cljs.core.seq(coll);
+if((s == null)){
+return null;
+} else {
+return cljs.core._first(s);
+}
+}
+}
+});
+/**
+ * Returns a possibly empty seq of the items after the first. Calls seq on its
+ * argument.
+ */
+cljs.core.rest = (function cljs$core$rest(coll){
+if(!((coll == null))){
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeq$)))?true:false):false)){
+return coll.cljs$core$ISeq$_rest$arity$1(null);
+} else {
+var s = cljs.core.seq(coll);
+if(s){
+return cljs.core._rest(s);
+} else {
+return cljs.core.List.EMPTY;
+}
+}
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+/**
+ * Returns a seq of the items after the first. Calls seq on its
+ * argument. If there are no more items, returns nil
+ */
+cljs.core.next = (function cljs$core$next(coll){
+if((coll == null)){
+return null;
+} else {
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (128))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$INext$)))?true:false):false)){
+return coll.cljs$core$INext$_next$arity$1(null);
+} else {
+return cljs.core.seq(cljs.core.rest(coll));
+}
+}
+});
+/**
+ * Equality. Returns true if x equals y, false if not. Compares
+ * numbers and collections in a type-independent manner. Clojure's immutable data
+ * structures define -equiv (and thus =) as a value, not an identity,
+ * comparison.
+ */
+cljs.core._EQ_ = (function cljs$core$_EQ_(var_args){
+var args9019 = [];
+var len__7625__auto___9025 = arguments.length;
+var i__7626__auto___9026 = (0);
+while(true){
+if((i__7626__auto___9026 < len__7625__auto___9025)){
+args9019.push((arguments[i__7626__auto___9026]));
+
+var G__9027 = (i__7626__auto___9026 + (1));
+i__7626__auto___9026 = G__9027;
+continue;
+} else {
+}
+break;
+}
+
+var G__9024 = args9019.length;
+switch (G__9024) {
+case 1:
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9019.slice((2)),(0),null));
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core._EQ_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+if((x == null)){
+return (y == null);
+} else {
+return ((x === y)) || (cljs.core._equiv(x,y));
+}
+});
+
+cljs.core._EQ_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x,y)){
+if(cljs.core.next(more)){
+var G__9029 = y;
+var G__9030 = cljs.core.first(more);
+var G__9031 = cljs.core.next(more);
+x = G__9029;
+y = G__9030;
+more = G__9031;
+continue;
+} else {
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(y,cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+cljs.core._EQ_.cljs$lang$applyTo = (function (seq9020){
+var G__9021 = cljs.core.first(seq9020);
+var seq9020__$1 = cljs.core.next(seq9020);
+var G__9022 = cljs.core.first(seq9020__$1);
+var seq9020__$2 = cljs.core.next(seq9020__$1);
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$variadic(G__9021,G__9022,seq9020__$2);
+});
+
+cljs.core._EQ_.cljs$lang$maxFixedArity = (2);
+
+
+/**
+* @constructor
+*/
+cljs.core.ES6Iterator = (function (s){
+this.s = s;
+})
+cljs.core.ES6Iterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if(!((self__.s == null))){
+var x = cljs.core.first(self__.s);
+self__.s = cljs.core.next(self__.s);
+
+return ({"value": x, "done": false});
+} else {
+return ({"value": null, "done": true});
+}
+});
+
+cljs.core.ES6Iterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"s","s",-948495851,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ES6Iterator.cljs$lang$type = true;
+
+cljs.core.ES6Iterator.cljs$lang$ctorStr = "cljs.core/ES6Iterator";
+
+cljs.core.ES6Iterator.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ES6Iterator");
+});
+
+cljs.core.__GT_ES6Iterator = (function cljs$core$__GT_ES6Iterator(s){
+return (new cljs.core.ES6Iterator(s));
+});
+
+/**
+ * EXPERIMENTAL: Return a ES2015 compatible iterator for coll.
+ */
+cljs.core.es6_iterator = (function cljs$core$es6_iterator(coll){
+return (new cljs.core.ES6Iterator(cljs.core.seq(coll)));
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.ISeqable}
+*/
+cljs.core.ES6IteratorSeq = (function (value,iter,_rest){
+this.value = value;
+this.iter = iter;
+this._rest = _rest;
+this.cljs$lang$protocol_mask$partition0$ = 8388672;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.ES6IteratorSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1;
+});
+
+cljs.core.ES6IteratorSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.value;
+});
+
+cljs.core.ES6IteratorSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+if((self__._rest == null)){
+self__._rest = (cljs.core.es6_iterator_seq.cljs$core$IFn$_invoke$arity$1 ? cljs.core.es6_iterator_seq.cljs$core$IFn$_invoke$arity$1(self__.iter) : cljs.core.es6_iterator_seq.call(null,self__.iter));
+} else {
+}
+
+return self__._rest;
+});
+
+cljs.core.ES6IteratorSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"value","value",1946509744,null),new cljs.core.Symbol(null,"iter","iter",-1346195486,null),cljs.core.with_meta(new cljs.core.Symbol(null,"_rest","_rest",-2100466189,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ES6IteratorSeq.cljs$lang$type = true;
+
+cljs.core.ES6IteratorSeq.cljs$lang$ctorStr = "cljs.core/ES6IteratorSeq";
+
+cljs.core.ES6IteratorSeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ES6IteratorSeq");
+});
+
+cljs.core.__GT_ES6IteratorSeq = (function cljs$core$__GT_ES6IteratorSeq(value,iter,_rest){
+return (new cljs.core.ES6IteratorSeq(value,iter,_rest));
+});
+
+/**
+ * EXPERIMENTAL: Given an ES2015 compatible iterator return a seq.
+ */
+cljs.core.es6_iterator_seq = (function cljs$core$es6_iterator_seq(iter){
+var v = iter.next();
+if(cljs.core.truth_(v.done)){
+return cljs.core.List.EMPTY;
+} else {
+return (new cljs.core.ES6IteratorSeq(v.value,iter,null));
+}
+});
+/**
+ * Mix final collection hash for ordered or unordered collections.
+ * hash-basis is the combined collection hash, count is the number
+ * of elements included in the basis. Note this is the hash code
+ * consistent with =, different from .hashCode.
+ * See http://clojure.org/data_structures#hash for full algorithms.
+ */
+cljs.core.mix_collection_hash = (function cljs$core$mix_collection_hash(hash_basis,count){
+var h1 = cljs.core.m3_seed;
+var k1 = cljs.core.m3_mix_K1(hash_basis);
+var h1__$1 = cljs.core.m3_mix_H1(h1,k1);
+return cljs.core.m3_fmix(h1__$1,count);
+});
+/**
+ * Returns the hash code, consistent with =, for an external ordered
+ * collection implementing Iterable.
+ * See http://clojure.org/data_structures#hash for full algorithms.
+ */
+cljs.core.hash_ordered_coll = (function cljs$core$hash_ordered_coll(coll){
+var n = (0);
+var hash_code = (1);
+var coll__$1 = cljs.core.seq(coll);
+while(true){
+if(!((coll__$1 == null))){
+var G__9032 = (n + (1));
+var G__9033 = ((cljs.core.imul((31),hash_code) + cljs.core.hash(cljs.core.first(coll__$1))) | (0));
+var G__9034 = cljs.core.next(coll__$1);
+n = G__9032;
+hash_code = G__9033;
+coll__$1 = G__9034;
+continue;
+} else {
+return cljs.core.mix_collection_hash(hash_code,n);
+}
+break;
+}
+});
+cljs.core.empty_ordered_hash = cljs.core.mix_collection_hash((1),(0));
+/**
+ * Returns the hash code, consistent with =, for an external unordered
+ * collection implementing Iterable. For maps, the iterator should
+ * return map entries whose hash is computed as
+ * (hash-ordered-coll [k v]).
+ * See http://clojure.org/data_structures#hash for full algorithms.
+ */
+cljs.core.hash_unordered_coll = (function cljs$core$hash_unordered_coll(coll){
+var n = (0);
+var hash_code = (0);
+var coll__$1 = cljs.core.seq(coll);
+while(true){
+if(!((coll__$1 == null))){
+var G__9035 = (n + (1));
+var G__9036 = ((hash_code + cljs.core.hash(cljs.core.first(coll__$1))) | (0));
+var G__9037 = cljs.core.next(coll__$1);
+n = G__9035;
+hash_code = G__9036;
+coll__$1 = G__9037;
+continue;
+} else {
+return cljs.core.mix_collection_hash(hash_code,n);
+}
+break;
+}
+});
+cljs.core.empty_unordered_hash = cljs.core.mix_collection_hash((0),(0));
+
+
+(cljs.core.ICounted["null"] = true);
+
+(cljs.core._count["null"] = (function (_){
+return (0);
+}));
+Date.prototype.cljs$core$IEquiv$ = cljs.core.PROTOCOL_SENTINEL;
+
+Date.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (o,other){
+var o__$1 = this;
+return ((other instanceof Date)) && ((o__$1.valueOf() === other.valueOf()));
+});
+
+Date.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+Date.prototype.cljs$core$IComparable$_compare$arity$2 = (function (this$,other){
+var this$__$1 = this;
+if((other instanceof Date)){
+var G__9038 = this$__$1.valueOf();
+var G__9039 = other.valueOf();
+return goog.array.defaultCompare(G__9038,G__9039);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Cannot compare "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(this$__$1),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" to "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(other)].join('')));
+}
+});
+
+/**
+ * @interface
+ */
+cljs.core.Inst = function(){};
+
+cljs.core.inst_ms_STAR_ = (function cljs$core$inst_ms_STAR_(inst){
+if((!((inst == null))) && (!((inst.cljs$core$Inst$inst_ms_STAR_$arity$1 == null)))){
+return inst.cljs$core$Inst$inst_ms_STAR_$arity$1(inst);
+} else {
+var x__7180__auto__ = (((inst == null))?null:inst);
+var m__7181__auto__ = (cljs.core.inst_ms_STAR_[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(inst) : m__7181__auto__.call(null,inst));
+} else {
+var m__7181__auto____$1 = (cljs.core.inst_ms_STAR_["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(inst) : m__7181__auto____$1.call(null,inst));
+} else {
+throw cljs.core.missing_protocol("Inst.inst-ms*",inst);
+}
+}
+}
+});
+
+Date.prototype.cljs$core$Inst$ = cljs.core.PROTOCOL_SENTINEL;
+
+Date.prototype.cljs$core$Inst$inst_ms_STAR_$arity$1 = (function (inst){
+var inst__$1 = this;
+return inst__$1.getTime();
+});
+/**
+ * Return the number of milliseconds since January 1, 1970, 00:00:00 GMT
+ */
+cljs.core.inst_ms = (function cljs$core$inst_ms(inst){
+return cljs.core.inst_ms_STAR_(inst);
+});
+/**
+ * Return true if x satisfies Inst
+ */
+cljs.core.inst_QMARK_ = (function cljs$core$inst_QMARK_(x){
+if(!((x == null))){
+if((false) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$Inst$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.Inst,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.Inst,x);
+}
+});
+(cljs.core.IEquiv["number"] = true);
+
+(cljs.core._equiv["number"] = (function (x,o){
+return (x === o);
+}));
+(cljs.core.Fn["function"] = true);
+
+(cljs.core.IMeta["function"] = true);
+
+(cljs.core._meta["function"] = (function (_){
+return null;
+}));
+(cljs.core.IHash["_"] = true);
+
+(cljs.core._hash["_"] = (function (o){
+return goog.getUid(o);
+}));
+/**
+ * Returns a number one greater than num.
+ */
+cljs.core.inc = (function cljs$core$inc(x){
+return (x + (1));
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IDeref}
+*/
+cljs.core.Reduced = (function (val){
+this.val = val;
+this.cljs$lang$protocol_mask$partition0$ = 32768;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.Reduced.prototype.cljs$core$IDeref$_deref$arity$1 = (function (o){
+var self__ = this;
+var o__$1 = this;
+return self__.val;
+});
+
+cljs.core.Reduced.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"val","val",1769233139,null)], null);
+});
+
+cljs.core.Reduced.cljs$lang$type = true;
+
+cljs.core.Reduced.cljs$lang$ctorStr = "cljs.core/Reduced";
+
+cljs.core.Reduced.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Reduced");
+});
+
+cljs.core.__GT_Reduced = (function cljs$core$__GT_Reduced(val){
+return (new cljs.core.Reduced(val));
+});
+
+/**
+ * Wraps x in a way such that a reduce will terminate with the value x
+ */
+cljs.core.reduced = (function cljs$core$reduced(x){
+return (new cljs.core.Reduced(x));
+});
+/**
+ * Returns true if x is the result of a call to reduced
+ */
+cljs.core.reduced_QMARK_ = (function cljs$core$reduced_QMARK_(r){
+return (r instanceof cljs.core.Reduced);
+});
+/**
+ * If x is already reduced?, returns it, else returns (reduced x)
+ */
+cljs.core.ensure_reduced = (function cljs$core$ensure_reduced(x){
+if(cljs.core.reduced_QMARK_(x)){
+return x;
+} else {
+return cljs.core.reduced(x);
+}
+});
+/**
+ * If x is reduced?, returns (deref x), else returns x
+ */
+cljs.core.unreduced = (function cljs$core$unreduced(x){
+if(cljs.core.reduced_QMARK_(x)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(x) : cljs.core.deref.call(null,x));
+} else {
+return x;
+}
+});
+/**
+ * Also reader macro: @var/@atom/@delay. Returns the
+ * most-recently-committed value of ref. When applied to a var
+ * or atom, returns its current state. When applied to a delay, forces
+ * it if not already forced. See also - realized?.
+ */
+cljs.core.deref = (function cljs$core$deref(o){
+return cljs.core._deref(o);
+});
+/**
+ * Accepts any collection which satisfies the ICount and IIndexed protocols and
+ * reduces them without incurring seq initialization
+ */
+cljs.core.ci_reduce = (function cljs$core$ci_reduce(var_args){
+var args9042 = [];
+var len__7625__auto___9051 = arguments.length;
+var i__7626__auto___9052 = (0);
+while(true){
+if((i__7626__auto___9052 < len__7625__auto___9051)){
+args9042.push((arguments[i__7626__auto___9052]));
+
+var G__9053 = (i__7626__auto___9052 + (1));
+i__7626__auto___9052 = G__9053;
+continue;
+} else {
+}
+break;
+}
+
+var G__9044 = args9042.length;
+switch (G__9044) {
+case 2:
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9042.length)].join('')));
+
+}
+});
+
+cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2 = (function (cicoll,f){
+var cnt = cljs.core._count(cicoll);
+if((cnt === (0))){
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+} else {
+var val = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(cicoll,(0));
+var n = (1);
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__9045 = val;
+var G__9046 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(cicoll,n);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__9045,G__9046) : f.call(null,G__9045,G__9046));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__9055 = nval;
+var G__9056 = (n + (1));
+val = G__9055;
+n = G__9056;
+continue;
+}
+} else {
+return val;
+}
+break;
+}
+}
+});
+
+cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3 = (function (cicoll,f,val){
+var cnt = cljs.core._count(cicoll);
+var val__$1 = val;
+var n = (0);
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__9047 = val__$1;
+var G__9048 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(cicoll,n);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__9047,G__9048) : f.call(null,G__9047,G__9048));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__9057 = nval;
+var G__9058 = (n + (1));
+val__$1 = G__9057;
+n = G__9058;
+continue;
+}
+} else {
+return val__$1;
+}
+break;
+}
+});
+
+cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$4 = (function (cicoll,f,val,idx){
+var cnt = cljs.core._count(cicoll);
+var val__$1 = val;
+var n = idx;
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__9049 = val__$1;
+var G__9050 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(cicoll,n);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__9049,G__9050) : f.call(null,G__9049,G__9050));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__9059 = nval;
+var G__9060 = (n + (1));
+val__$1 = G__9059;
+n = G__9060;
+continue;
+}
+} else {
+return val__$1;
+}
+break;
+}
+});
+
+cljs.core.ci_reduce.cljs$lang$maxFixedArity = 4;
+
+cljs.core.array_reduce = (function cljs$core$array_reduce(var_args){
+var args9061 = [];
+var len__7625__auto___9070 = arguments.length;
+var i__7626__auto___9071 = (0);
+while(true){
+if((i__7626__auto___9071 < len__7625__auto___9070)){
+args9061.push((arguments[i__7626__auto___9071]));
+
+var G__9072 = (i__7626__auto___9071 + (1));
+i__7626__auto___9071 = G__9072;
+continue;
+} else {
+}
+break;
+}
+
+var G__9063 = args9061.length;
+switch (G__9063) {
+case 2:
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9061.length)].join('')));
+
+}
+});
+
+cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$2 = (function (arr,f){
+var cnt = arr.length;
+if((arr.length === (0))){
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+} else {
+var val = (arr[(0)]);
+var n = (1);
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__9064 = val;
+var G__9065 = (arr[n]);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__9064,G__9065) : f.call(null,G__9064,G__9065));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__9074 = nval;
+var G__9075 = (n + (1));
+val = G__9074;
+n = G__9075;
+continue;
+}
+} else {
+return val;
+}
+break;
+}
+}
+});
+
+cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$3 = (function (arr,f,val){
+var cnt = arr.length;
+var val__$1 = val;
+var n = (0);
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__9066 = val__$1;
+var G__9067 = (arr[n]);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__9066,G__9067) : f.call(null,G__9066,G__9067));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__9076 = nval;
+var G__9077 = (n + (1));
+val__$1 = G__9076;
+n = G__9077;
+continue;
+}
+} else {
+return val__$1;
+}
+break;
+}
+});
+
+cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4 = (function (arr,f,val,idx){
+var cnt = arr.length;
+var val__$1 = val;
+var n = idx;
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__9068 = val__$1;
+var G__9069 = (arr[n]);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__9068,G__9069) : f.call(null,G__9068,G__9069));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__9078 = nval;
+var G__9079 = (n + (1));
+val__$1 = G__9078;
+n = G__9079;
+continue;
+}
+} else {
+return val__$1;
+}
+break;
+}
+});
+
+cljs.core.array_reduce.cljs$lang$maxFixedArity = 4;
+
+
+
+
+
+
+
+/**
+ * Returns true if coll implements count in constant time
+ */
+cljs.core.counted_QMARK_ = (function cljs$core$counted_QMARK_(x){
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (2))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$ICounted$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICounted,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICounted,x);
+}
+});
+/**
+ * Returns true if coll implements nth in constant time
+ */
+cljs.core.indexed_QMARK_ = (function cljs$core$indexed_QMARK_(x){
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (16))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IIndexed$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IIndexed,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IIndexed,x);
+}
+});
+cljs.core._indexOf = (function cljs$core$_indexOf(var_args){
+var args9084 = [];
+var len__7625__auto___9087 = arguments.length;
+var i__7626__auto___9088 = (0);
+while(true){
+if((i__7626__auto___9088 < len__7625__auto___9087)){
+args9084.push((arguments[i__7626__auto___9088]));
+
+var G__9089 = (i__7626__auto___9088 + (1));
+i__7626__auto___9088 = G__9089;
+continue;
+} else {
+}
+break;
+}
+
+var G__9086 = args9084.length;
+switch (G__9086) {
+case 2:
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9084.length)].join('')));
+
+}
+});
+
+cljs.core._indexOf.cljs$core$IFn$_invoke$arity$2 = (function (coll,x){
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+
+cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3 = (function (coll,x,start){
+var len = (cljs.core.count.cljs$core$IFn$_invoke$arity$1 ? cljs.core.count.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.count.call(null,coll));
+if((start >= len)){
+return (-1);
+} else {
+var idx = (((start > (0)))?start:(((start < (0)))?(function (){var x__6848__auto__ = (0);
+var y__6849__auto__ = (start + len);
+return ((x__6848__auto__ > y__6849__auto__) ? x__6848__auto__ : y__6849__auto__);
+})():start
+));
+while(true){
+if((idx < len)){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2((cljs.core.nth.cljs$core$IFn$_invoke$arity$2 ? cljs.core.nth.cljs$core$IFn$_invoke$arity$2(coll,idx) : cljs.core.nth.call(null,coll,idx)),x)){
+return idx;
+} else {
+var G__9091 = (idx + (1));
+idx = G__9091;
+continue;
+}
+} else {
+return (-1);
+}
+break;
+}
+}
+});
+
+cljs.core._indexOf.cljs$lang$maxFixedArity = 3;
+
+cljs.core._lastIndexOf = (function cljs$core$_lastIndexOf(var_args){
+var args9092 = [];
+var len__7625__auto___9095 = arguments.length;
+var i__7626__auto___9096 = (0);
+while(true){
+if((i__7626__auto___9096 < len__7625__auto___9095)){
+args9092.push((arguments[i__7626__auto___9096]));
+
+var G__9097 = (i__7626__auto___9096 + (1));
+i__7626__auto___9096 = G__9097;
+continue;
+} else {
+}
+break;
+}
+
+var G__9094 = args9092.length;
+switch (G__9094) {
+case 2:
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9092.length)].join('')));
+
+}
+});
+
+cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$2 = (function (coll,x){
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(cljs.core.count.cljs$core$IFn$_invoke$arity$1 ? cljs.core.count.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.count.call(null,coll)));
+});
+
+cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3 = (function (coll,x,start){
+var len = (cljs.core.count.cljs$core$IFn$_invoke$arity$1 ? cljs.core.count.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.count.call(null,coll));
+if((len === (0))){
+return (-1);
+} else {
+var idx = (((start > (0)))?(function (){var x__6855__auto__ = (len - (1));
+var y__6856__auto__ = start;
+return ((x__6855__auto__ < y__6856__auto__) ? x__6855__auto__ : y__6856__auto__);
+})():(((start < (0)))?(len + start):start
+));
+while(true){
+if((idx >= (0))){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2((cljs.core.nth.cljs$core$IFn$_invoke$arity$2 ? cljs.core.nth.cljs$core$IFn$_invoke$arity$2(coll,idx) : cljs.core.nth.call(null,coll,idx)),x)){
+return idx;
+} else {
+var G__9099 = (idx - (1));
+idx = G__9099;
+continue;
+}
+} else {
+return (-1);
+}
+break;
+}
+}
+});
+
+cljs.core._lastIndexOf.cljs$lang$maxFixedArity = 3;
+
+
+/**
+* @constructor
+*/
+cljs.core.IndexedSeqIterator = (function (arr,i){
+this.arr = arr;
+this.i = i;
+})
+cljs.core.IndexedSeqIterator.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return (self__.i < self__.arr.length);
+});
+
+cljs.core.IndexedSeqIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var ret = (self__.arr[self__.i]);
+self__.i = (self__.i + (1));
+
+return ret;
+});
+
+cljs.core.IndexedSeqIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.IndexedSeqIterator.cljs$lang$type = true;
+
+cljs.core.IndexedSeqIterator.cljs$lang$ctorStr = "cljs.core/IndexedSeqIterator";
+
+cljs.core.IndexedSeqIterator.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/IndexedSeqIterator");
+});
+
+cljs.core.__GT_IndexedSeqIterator = (function cljs$core$__GT_IndexedSeqIterator(arr,i){
+return (new cljs.core.IndexedSeqIterator(arr,i));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ASeq}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.IndexedSeq = (function (arr,i,meta){
+this.arr = arr;
+this.i = i;
+this.meta = meta;
+this.cljs$lang$protocol_mask$partition0$ = 166592766;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+})
+cljs.core.IndexedSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.IndexedSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.IndexedSeq.prototype.indexOf = (function() {
+var G__9100 = null;
+var G__9100__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__9100__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9100 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9100__1.call(this,x);
+case 2:
+return G__9100__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9100.cljs$core$IFn$_invoke$arity$1 = G__9100__1;
+G__9100.cljs$core$IFn$_invoke$arity$2 = G__9100__2;
+return G__9100;
+})()
+;
+
+cljs.core.IndexedSeq.prototype.lastIndexOf = (function() {
+var G__9101 = null;
+var G__9101__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(cljs.core.count.cljs$core$IFn$_invoke$arity$1 ? cljs.core.count.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.count.call(null,coll)));
+});
+var G__9101__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9101 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9101__1.call(this,x);
+case 2:
+return G__9101__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9101.cljs$core$IFn$_invoke$arity$1 = G__9101__1;
+G__9101.cljs$core$IFn$_invoke$arity$2 = G__9101__2;
+return G__9101;
+})()
+;
+
+cljs.core.IndexedSeq.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (coll,n){
+var self__ = this;
+var coll__$1 = this;
+var i__$1 = (n + self__.i);
+if((((0) <= i__$1)) && ((i__$1 < self__.arr.length))){
+return (self__.arr[i__$1]);
+} else {
+throw (new Error("Index out of bounds"));
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (coll,n,not_found){
+var self__ = this;
+var coll__$1 = this;
+var i__$1 = (n + self__.i);
+if((((0) <= i__$1)) && ((i__$1 < self__.arr.length))){
+return (self__.arr[i__$1]);
+} else {
+return not_found;
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.IndexedSeq.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.IndexedSeqIterator(self__.arr,self__.i));
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.IndexedSeq(self__.arr,self__.i,self__.meta));
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$INext$_next$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+if(((self__.i + (1)) < self__.arr.length)){
+return (new cljs.core.IndexedSeq(self__.arr,(self__.i + (1)),null));
+} else {
+return null;
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ICounted$_count$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+var x__6848__auto__ = (0);
+var y__6849__auto__ = (self__.arr.length - self__.i);
+return ((x__6848__auto__ > y__6849__auto__) ? x__6848__auto__ : y__6849__auto__);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var c = coll__$1.cljs$core$ICounted$_count$arity$1(null);
+if((c > (0))){
+return (new cljs.core.RSeq(coll__$1,(c - (1)),null));
+} else {
+return null;
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.hash_ordered_coll(coll__$1);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.equiv_sequential.cljs$core$IFn$_invoke$arity$2 ? cljs.core.equiv_sequential.cljs$core$IFn$_invoke$arity$2(coll__$1,other) : cljs.core.equiv_sequential.call(null,coll__$1,other));
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.List.EMPTY;
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4(self__.arr,f,(self__.arr[self__.i]),(self__.i + (1)));
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4(self__.arr,f,start,self__.i);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (self__.arr[self__.i]);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+if(((self__.i + (1)) < self__.arr.length)){
+return (new cljs.core.IndexedSeq(self__.arr,(self__.i + (1)),null));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+if((self__.i < self__.arr.length)){
+return this$__$1;
+} else {
+return null;
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,new_meta){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.IndexedSeq(self__.arr,self__.i,new_meta));
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.cons.cljs$core$IFn$_invoke$arity$2 ? cljs.core.cons.cljs$core$IFn$_invoke$arity$2(o,coll__$1) : cljs.core.cons.call(null,o,coll__$1));
+});
+
+cljs.core.IndexedSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null)], null);
+});
+
+cljs.core.IndexedSeq.cljs$lang$type = true;
+
+cljs.core.IndexedSeq.cljs$lang$ctorStr = "cljs.core/IndexedSeq";
+
+cljs.core.IndexedSeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/IndexedSeq");
+});
+
+cljs.core.__GT_IndexedSeq = (function cljs$core$__GT_IndexedSeq(arr,i,meta){
+return (new cljs.core.IndexedSeq(arr,i,meta));
+});
+
+(cljs.core.IndexedSeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+/**
+ * Create seq from a primitive JavaScript Array-like.
+ */
+cljs.core.prim_seq = (function cljs$core$prim_seq(var_args){
+var args9102 = [];
+var len__7625__auto___9105 = arguments.length;
+var i__7626__auto___9106 = (0);
+while(true){
+if((i__7626__auto___9106 < len__7625__auto___9105)){
+args9102.push((arguments[i__7626__auto___9106]));
+
+var G__9107 = (i__7626__auto___9106 + (1));
+i__7626__auto___9106 = G__9107;
+continue;
+} else {
+}
+break;
+}
+
+var G__9104 = args9102.length;
+switch (G__9104) {
+case 1:
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9102.length)].join('')));
+
+}
+});
+
+cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$1 = (function (prim){
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(prim,(0));
+});
+
+cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2 = (function (prim,i){
+if((i < prim.length)){
+return (new cljs.core.IndexedSeq(prim,i,null));
+} else {
+return null;
+}
+});
+
+cljs.core.prim_seq.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Create a seq from a JavaScript array.
+ */
+cljs.core.array_seq = (function cljs$core$array_seq(var_args){
+var args9109 = [];
+var len__7625__auto___9112 = arguments.length;
+var i__7626__auto___9113 = (0);
+while(true){
+if((i__7626__auto___9113 < len__7625__auto___9112)){
+args9109.push((arguments[i__7626__auto___9113]));
+
+var G__9114 = (i__7626__auto___9113 + (1));
+i__7626__auto___9113 = G__9114;
+continue;
+} else {
+}
+break;
+}
+
+var G__9111 = args9109.length;
+switch (G__9111) {
+case 1:
+return cljs.core.array_seq.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.array_seq.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9109.length)].join('')));
+
+}
+});
+
+cljs.core.array_seq.cljs$core$IFn$_invoke$arity$1 = (function (array){
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(array,(0));
+});
+
+cljs.core.array_seq.cljs$core$IFn$_invoke$arity$2 = (function (array,i){
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(array,i);
+});
+
+cljs.core.array_seq.cljs$lang$maxFixedArity = 2;
+
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.RSeq = (function (ci,i,meta){
+this.ci = ci;
+this.i = i;
+this.meta = meta;
+this.cljs$lang$protocol_mask$partition0$ = 32374990;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+})
+cljs.core.RSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.RSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.RSeq.prototype.indexOf = (function() {
+var G__9118 = null;
+var G__9118__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__9118__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9118 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9118__1.call(this,x);
+case 2:
+return G__9118__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9118.cljs$core$IFn$_invoke$arity$1 = G__9118__1;
+G__9118.cljs$core$IFn$_invoke$arity$2 = G__9118__2;
+return G__9118;
+})()
+;
+
+cljs.core.RSeq.prototype.lastIndexOf = (function() {
+var G__9119 = null;
+var G__9119__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(cljs.core.count.cljs$core$IFn$_invoke$arity$1 ? cljs.core.count.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.count.call(null,coll)));
+});
+var G__9119__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9119 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9119__1.call(this,x);
+case 2:
+return G__9119__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9119.cljs$core$IFn$_invoke$arity$1 = G__9119__1;
+G__9119.cljs$core$IFn$_invoke$arity$2 = G__9119__2;
+return G__9119;
+})()
+;
+
+cljs.core.RSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.RSeq.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.RSeq(self__.ci,self__.i,self__.meta));
+});
+
+cljs.core.RSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.i > (0))){
+return (new cljs.core.RSeq(self__.ci,(self__.i - (1)),null));
+} else {
+return null;
+}
+});
+
+cljs.core.RSeq.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (self__.i + (1));
+});
+
+cljs.core.RSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.hash_ordered_coll(coll__$1);
+});
+
+cljs.core.RSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.equiv_sequential.cljs$core$IFn$_invoke$arity$2 ? cljs.core.equiv_sequential.cljs$core$IFn$_invoke$arity$2(coll__$1,other) : cljs.core.equiv_sequential.call(null,coll__$1,other));
+});
+
+cljs.core.RSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var G__9116 = cljs.core.List.EMPTY;
+var G__9117 = self__.meta;
+return (cljs.core.with_meta.cljs$core$IFn$_invoke$arity$2 ? cljs.core.with_meta.cljs$core$IFn$_invoke$arity$2(G__9116,G__9117) : cljs.core.with_meta.call(null,G__9116,G__9117));
+});
+
+cljs.core.RSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (col,f){
+var self__ = this;
+var col__$1 = this;
+return (cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2 ? cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,col__$1) : cljs.core.seq_reduce.call(null,f,col__$1));
+});
+
+cljs.core.RSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (col,f,start){
+var self__ = this;
+var col__$1 = this;
+return (cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3 ? cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,col__$1) : cljs.core.seq_reduce.call(null,f,start,col__$1));
+});
+
+cljs.core.RSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.ci,self__.i);
+});
+
+cljs.core.RSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.i > (0))){
+return (new cljs.core.RSeq(self__.ci,(self__.i - (1)),null));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.RSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.RSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,new_meta){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.RSeq(self__.ci,self__.i,new_meta));
+});
+
+cljs.core.RSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.cons.cljs$core$IFn$_invoke$arity$2 ? cljs.core.cons.cljs$core$IFn$_invoke$arity$2(o,coll__$1) : cljs.core.cons.call(null,o,coll__$1));
+});
+
+cljs.core.RSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"ci","ci",2049808339,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null)], null);
+});
+
+cljs.core.RSeq.cljs$lang$type = true;
+
+cljs.core.RSeq.cljs$lang$ctorStr = "cljs.core/RSeq";
+
+cljs.core.RSeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/RSeq");
+});
+
+cljs.core.__GT_RSeq = (function cljs$core$__GT_RSeq(ci,i,meta){
+return (new cljs.core.RSeq(ci,i,meta));
+});
+
+(cljs.core.RSeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+/**
+ * Same as (first (next x))
+ */
+cljs.core.second = (function cljs$core$second(coll){
+return cljs.core.first(cljs.core.next(coll));
+});
+/**
+ * Same as (first (first x))
+ */
+cljs.core.ffirst = (function cljs$core$ffirst(coll){
+return cljs.core.first(cljs.core.first(coll));
+});
+/**
+ * Same as (next (first x))
+ */
+cljs.core.nfirst = (function cljs$core$nfirst(coll){
+return cljs.core.next(cljs.core.first(coll));
+});
+/**
+ * Same as (first (next x))
+ */
+cljs.core.fnext = (function cljs$core$fnext(coll){
+return cljs.core.first(cljs.core.next(coll));
+});
+/**
+ * Same as (next (next x))
+ */
+cljs.core.nnext = (function cljs$core$nnext(coll){
+return cljs.core.next(cljs.core.next(coll));
+});
+/**
+ * Return the last item in coll, in linear time
+ */
+cljs.core.last = (function cljs$core$last(s){
+while(true){
+var sn = cljs.core.next(s);
+if(!((sn == null))){
+var G__9120 = sn;
+s = G__9120;
+continue;
+} else {
+return cljs.core.first(s);
+}
+break;
+}
+});
+(cljs.core.IEquiv["_"] = true);
+
+(cljs.core._equiv["_"] = (function (x,o){
+return (x === o);
+}));
+/**
+ * conj[oin]. Returns a new collection with the xs
+ * 'added'. (conj nil item) returns (item). The 'addition' may
+ * happen at different 'places' depending on the concrete type.
+ */
+cljs.core.conj = (function cljs$core$conj(var_args){
+var args9121 = [];
+var len__7625__auto___9127 = arguments.length;
+var i__7626__auto___9128 = (0);
+while(true){
+if((i__7626__auto___9128 < len__7625__auto___9127)){
+args9121.push((arguments[i__7626__auto___9128]));
+
+var G__9129 = (i__7626__auto___9128 + (1));
+i__7626__auto___9128 = G__9129;
+continue;
+} else {
+}
+break;
+}
+
+var G__9126 = args9121.length;
+switch (G__9126) {
+case 0:
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9121.slice((2)),(0),null));
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.conj.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.PersistentVector.EMPTY;
+});
+
+cljs.core.conj.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+return coll;
+});
+
+cljs.core.conj.cljs$core$IFn$_invoke$arity$2 = (function (coll,x){
+if(!((coll == null))){
+return cljs.core._conj(coll,x);
+} else {
+var x__7354__auto__ = x;
+return cljs.core._conj(cljs.core.List.EMPTY,x__7354__auto__);
+}
+});
+
+cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic = (function (coll,x,xs){
+while(true){
+if(cljs.core.truth_(xs)){
+var G__9131 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(coll,x);
+var G__9132 = cljs.core.first(xs);
+var G__9133 = cljs.core.next(xs);
+coll = G__9131;
+x = G__9132;
+xs = G__9133;
+continue;
+} else {
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(coll,x);
+}
+break;
+}
+});
+
+cljs.core.conj.cljs$lang$applyTo = (function (seq9122){
+var G__9123 = cljs.core.first(seq9122);
+var seq9122__$1 = cljs.core.next(seq9122);
+var G__9124 = cljs.core.first(seq9122__$1);
+var seq9122__$2 = cljs.core.next(seq9122__$1);
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic(G__9123,G__9124,seq9122__$2);
+});
+
+cljs.core.conj.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns an empty collection of the same category as coll, or nil
+ */
+cljs.core.empty = (function cljs$core$empty(coll){
+if((coll == null)){
+return null;
+} else {
+return cljs.core._empty(coll);
+}
+});
+cljs.core.accumulating_seq_count = (function cljs$core$accumulating_seq_count(coll){
+var s = cljs.core.seq(coll);
+var acc = (0);
+while(true){
+if(cljs.core.counted_QMARK_(s)){
+return (acc + cljs.core._count(s));
+} else {
+var G__9134 = cljs.core.next(s);
+var G__9135 = (acc + (1));
+s = G__9134;
+acc = G__9135;
+continue;
+}
+break;
+}
+});
+/**
+ * Returns the number of items in the collection. (count nil) returns
+ * 0. Also works on strings, arrays, and Maps
+ */
+cljs.core.count = (function cljs$core$count(coll){
+if(!((coll == null))){
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (2))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ICounted$)))?true:false):false)){
+return coll.cljs$core$ICounted$_count$arity$1(null);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+return coll.length;
+} else {
+if(typeof coll === 'string'){
+return coll.length;
+} else {
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (8388608))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeqable$)))?true:false):false)){
+return cljs.core.accumulating_seq_count(coll);
+} else {
+return cljs.core._count(coll);
+
+}
+}
+}
+}
+} else {
+return (0);
+}
+});
+cljs.core.linear_traversal_nth = (function cljs$core$linear_traversal_nth(var_args){
+var args9140 = [];
+var len__7625__auto___9143 = arguments.length;
+var i__7626__auto___9144 = (0);
+while(true){
+if((i__7626__auto___9144 < len__7625__auto___9143)){
+args9140.push((arguments[i__7626__auto___9144]));
+
+var G__9145 = (i__7626__auto___9144 + (1));
+i__7626__auto___9144 = G__9145;
+continue;
+} else {
+}
+break;
+}
+
+var G__9142 = args9140.length;
+switch (G__9142) {
+case 2:
+return cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9140.length)].join('')));
+
+}
+});
+
+cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$2 = (function (coll,n){
+while(true){
+if((coll == null)){
+throw (new Error("Index out of bounds"));
+} else {
+if((n === (0))){
+if(cljs.core.seq(coll)){
+return cljs.core.first(coll);
+} else {
+throw (new Error("Index out of bounds"));
+}
+} else {
+if(cljs.core.indexed_QMARK_(coll)){
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(coll,n);
+} else {
+if(cljs.core.seq(coll)){
+var G__9147 = cljs.core.next(coll);
+var G__9148 = (n - (1));
+coll = G__9147;
+n = G__9148;
+continue;
+} else {
+throw (new Error("Index out of bounds"));
+
+}
+}
+}
+}
+break;
+}
+});
+
+cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$3 = (function (coll,n,not_found){
+while(true){
+if((coll == null)){
+return not_found;
+} else {
+if((n === (0))){
+if(cljs.core.seq(coll)){
+return cljs.core.first(coll);
+} else {
+return not_found;
+}
+} else {
+if(cljs.core.indexed_QMARK_(coll)){
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$3(coll,n,not_found);
+} else {
+if(cljs.core.seq(coll)){
+var G__9149 = cljs.core.next(coll);
+var G__9150 = (n - (1));
+var G__9151 = not_found;
+coll = G__9149;
+n = G__9150;
+not_found = G__9151;
+continue;
+} else {
+return not_found;
+
+}
+}
+}
+}
+break;
+}
+});
+
+cljs.core.linear_traversal_nth.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns the value at the index. get returns nil if index out of
+ * bounds, nth throws an exception unless not-found is supplied. nth
+ * also works for strings, arrays, regex Matchers and Lists, and,
+ * in O(n) time, for sequences.
+ */
+cljs.core.nth = (function cljs$core$nth(var_args){
+var args9152 = [];
+var len__7625__auto___9159 = arguments.length;
+var i__7626__auto___9160 = (0);
+while(true){
+if((i__7626__auto___9160 < len__7625__auto___9159)){
+args9152.push((arguments[i__7626__auto___9160]));
+
+var G__9161 = (i__7626__auto___9160 + (1));
+i__7626__auto___9160 = G__9161;
+continue;
+} else {
+}
+break;
+}
+
+var G__9154 = args9152.length;
+switch (G__9154) {
+case 2:
+return cljs.core.nth.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.nth.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9152.length)].join('')));
+
+}
+});
+
+cljs.core.nth.cljs$core$IFn$_invoke$arity$2 = (function (coll,n){
+if(!(typeof n === 'number')){
+throw (new Error("Index argument to nth must be a number"));
+} else {
+if((coll == null)){
+return coll;
+} else {
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (16))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$IIndexed$)))?true:false):false)){
+return coll.cljs$core$IIndexed$_nth$arity$2(null,n);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+if(((n >= (0))) && ((n < coll.length))){
+return (coll[n]);
+} else {
+throw (new Error("Index out of bounds"));
+}
+} else {
+if(typeof coll === 'string'){
+if(((n >= (0))) && ((n < coll.length))){
+return coll.charAt(n);
+} else {
+throw (new Error("Index out of bounds"));
+}
+} else {
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeq$)))?true:false):false)){
+return cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$2(coll,n);
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.IIndexed,coll)){
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(coll,n);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("nth not supported on this type "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.type__GT_str(cljs.core.type(coll)))].join('')));
+
+}
+}
+}
+}
+}
+}
+}
+});
+
+cljs.core.nth.cljs$core$IFn$_invoke$arity$3 = (function (coll,n,not_found){
+if(!(typeof n === 'number')){
+throw (new Error("Index argument to nth must be a number."));
+} else {
+if((coll == null)){
+return not_found;
+} else {
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (16))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$IIndexed$)))?true:false):false)){
+return coll.cljs$core$IIndexed$_nth$arity$3(null,n,not_found);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+if(((n >= (0))) && ((n < coll.length))){
+return (coll[n]);
+} else {
+return not_found;
+}
+} else {
+if(typeof coll === 'string'){
+if(((n >= (0))) && ((n < coll.length))){
+return coll.charAt(n);
+} else {
+return not_found;
+}
+} else {
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeq$)))?true:false):false)){
+return cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$3(coll,n,not_found);
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.IIndexed,coll)){
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(coll,n);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("nth not supported on this type "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.type__GT_str(cljs.core.type(coll)))].join('')));
+
+}
+}
+}
+}
+}
+}
+}
+});
+
+cljs.core.nth.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns the nth rest of coll, coll when n is 0.
+ */
+cljs.core.nthrest = (function cljs$core$nthrest(coll,n){
+var n__$1 = n;
+var xs = coll;
+while(true){
+if(((n__$1 > (0))) && (cljs.core.seq(xs))){
+var G__9163 = (n__$1 - (1));
+var G__9164 = cljs.core.rest(xs);
+n__$1 = G__9163;
+xs = G__9164;
+continue;
+} else {
+return xs;
+}
+break;
+}
+});
+/**
+ * Returns the value mapped to key, not-found or nil if key not present.
+ */
+cljs.core.get = (function cljs$core$get(var_args){
+var args9165 = [];
+var len__7625__auto___9170 = arguments.length;
+var i__7626__auto___9171 = (0);
+while(true){
+if((i__7626__auto___9171 < len__7625__auto___9170)){
+args9165.push((arguments[i__7626__auto___9171]));
+
+var G__9172 = (i__7626__auto___9171 + (1));
+i__7626__auto___9171 = G__9172;
+continue;
+} else {
+}
+break;
+}
+
+var G__9167 = args9165.length;
+switch (G__9167) {
+case 2:
+return cljs.core.get.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.get.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9165.length)].join('')));
+
+}
+});
+
+cljs.core.get.cljs$core$IFn$_invoke$arity$2 = (function (o,k){
+if((o == null)){
+return null;
+} else {
+if(((!((o == null)))?((((o.cljs$lang$protocol_mask$partition0$ & (256))) || ((cljs.core.PROTOCOL_SENTINEL === o.cljs$core$ILookup$)))?true:false):false)){
+return o.cljs$core$ILookup$_lookup$arity$2(null,k);
+} else {
+if(cljs.core.array_QMARK_(o)){
+if((!((k == null))) && ((k < o.length))){
+return (o[(k | (0))]);
+} else {
+return null;
+}
+} else {
+if(typeof o === 'string'){
+if((!((k == null))) && ((k < o.length))){
+return o.charAt((k | (0)));
+} else {
+return null;
+}
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.ILookup,o)){
+return cljs.core._lookup.cljs$core$IFn$_invoke$arity$2(o,k);
+} else {
+return null;
+
+}
+}
+}
+}
+}
+});
+
+cljs.core.get.cljs$core$IFn$_invoke$arity$3 = (function (o,k,not_found){
+if(!((o == null))){
+if(((!((o == null)))?((((o.cljs$lang$protocol_mask$partition0$ & (256))) || ((cljs.core.PROTOCOL_SENTINEL === o.cljs$core$ILookup$)))?true:false):false)){
+return o.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+} else {
+if(cljs.core.array_QMARK_(o)){
+if((!((k == null))) && ((k >= (0))) && ((k < o.length))){
+return (o[(k | (0))]);
+} else {
+return not_found;
+}
+} else {
+if(typeof o === 'string'){
+if((!((k == null))) && ((k >= (0))) && ((k < o.length))){
+return o.charAt((k | (0)));
+} else {
+return not_found;
+}
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.ILookup,o)){
+return cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(o,k,not_found);
+} else {
+return not_found;
+
+}
+}
+}
+}
+} else {
+return not_found;
+}
+});
+
+cljs.core.get.cljs$lang$maxFixedArity = 3;
+
+/**
+ * assoc[iate]. When applied to a map, returns a new map of the
+ * same (hashed/sorted) type, that contains the mapping of key(s) to
+ * val(s). When applied to a vector, returns a new vector that
+ * contains val at index.
+ */
+cljs.core.assoc = (function cljs$core$assoc(var_args){
+var args9174 = [];
+var len__7625__auto___9181 = arguments.length;
+var i__7626__auto___9182 = (0);
+while(true){
+if((i__7626__auto___9182 < len__7625__auto___9181)){
+args9174.push((arguments[i__7626__auto___9182]));
+
+var G__9183 = (i__7626__auto___9182 + (1));
+i__7626__auto___9182 = G__9183;
+continue;
+} else {
+}
+break;
+}
+
+var G__9180 = args9174.length;
+switch (G__9180) {
+case 3:
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9174.slice((3)),(0),null));
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.assoc.cljs$core$IFn$_invoke$arity$3 = (function (coll,k,v){
+if(!((coll == null))){
+return cljs.core._assoc(coll,k,v);
+} else {
+return cljs.core.PersistentHashMap.fromArrays([k],[v]);
+}
+});
+
+cljs.core.assoc.cljs$core$IFn$_invoke$arity$variadic = (function (coll,k,v,kvs){
+while(true){
+var ret = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(coll,k,v);
+if(cljs.core.truth_(kvs)){
+var G__9185 = ret;
+var G__9186 = cljs.core.first(kvs);
+var G__9187 = cljs.core.second(kvs);
+var G__9188 = cljs.core.nnext(kvs);
+coll = G__9185;
+k = G__9186;
+v = G__9187;
+kvs = G__9188;
+continue;
+} else {
+return ret;
+}
+break;
+}
+});
+
+cljs.core.assoc.cljs$lang$applyTo = (function (seq9175){
+var G__9176 = cljs.core.first(seq9175);
+var seq9175__$1 = cljs.core.next(seq9175);
+var G__9177 = cljs.core.first(seq9175__$1);
+var seq9175__$2 = cljs.core.next(seq9175__$1);
+var G__9178 = cljs.core.first(seq9175__$2);
+var seq9175__$3 = cljs.core.next(seq9175__$2);
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$variadic(G__9176,G__9177,G__9178,seq9175__$3);
+});
+
+cljs.core.assoc.cljs$lang$maxFixedArity = (3);
+
+/**
+ * dissoc[iate]. Returns a new map of the same (hashed/sorted) type,
+ * that does not contain a mapping for key(s).
+ */
+cljs.core.dissoc = (function cljs$core$dissoc(var_args){
+var args9189 = [];
+var len__7625__auto___9195 = arguments.length;
+var i__7626__auto___9196 = (0);
+while(true){
+if((i__7626__auto___9196 < len__7625__auto___9195)){
+args9189.push((arguments[i__7626__auto___9196]));
+
+var G__9197 = (i__7626__auto___9196 + (1));
+i__7626__auto___9196 = G__9197;
+continue;
+} else {
+}
+break;
+}
+
+var G__9194 = args9189.length;
+switch (G__9194) {
+case 1:
+return cljs.core.dissoc.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9189.slice((2)),(0),null));
+return cljs.core.dissoc.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.dissoc.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+return coll;
+});
+
+cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2 = (function (coll,k){
+if((coll == null)){
+return null;
+} else {
+return cljs.core._dissoc(coll,k);
+}
+});
+
+cljs.core.dissoc.cljs$core$IFn$_invoke$arity$variadic = (function (coll,k,ks){
+while(true){
+if((coll == null)){
+return null;
+} else {
+var ret = cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2(coll,k);
+if(cljs.core.truth_(ks)){
+var G__9199 = ret;
+var G__9200 = cljs.core.first(ks);
+var G__9201 = cljs.core.next(ks);
+coll = G__9199;
+k = G__9200;
+ks = G__9201;
+continue;
+} else {
+return ret;
+}
+}
+break;
+}
+});
+
+cljs.core.dissoc.cljs$lang$applyTo = (function (seq9190){
+var G__9191 = cljs.core.first(seq9190);
+var seq9190__$1 = cljs.core.next(seq9190);
+var G__9192 = cljs.core.first(seq9190__$1);
+var seq9190__$2 = cljs.core.next(seq9190__$1);
+return cljs.core.dissoc.cljs$core$IFn$_invoke$arity$variadic(G__9191,G__9192,seq9190__$2);
+});
+
+cljs.core.dissoc.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Return true if f is a JavaScript function or satisfies the Fn protocol.
+ */
+cljs.core.fn_QMARK_ = (function cljs$core$fn_QMARK_(f){
+var or__6512__auto__ = goog.isFunction(f);
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+if(!((f == null))){
+if((false) || ((cljs.core.PROTOCOL_SENTINEL === f.cljs$core$Fn$))){
+return true;
+} else {
+if((!f.cljs$lang$protocol_mask$partition$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.Fn,f);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.Fn,f);
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.Fn}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.MetaFn = (function (afn,meta){
+this.afn = afn;
+this.meta = meta;
+this.cljs$lang$protocol_mask$partition0$ = 393217;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.MetaFn.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.meta;
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_,new_meta){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.MetaFn(self__.afn,new_meta));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$Fn$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.MetaFn.prototype.call = (function() {
+var G__9207 = null;
+var G__9207__1 = (function (self__){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$0 ? self__.afn.cljs$core$IFn$_invoke$arity$0() : self__.afn.call(null));
+});
+var G__9207__2 = (function (self__,a){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$1 ? self__.afn.cljs$core$IFn$_invoke$arity$1(a) : self__.afn.call(null,a));
+});
+var G__9207__3 = (function (self__,a,b){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$2 ? self__.afn.cljs$core$IFn$_invoke$arity$2(a,b) : self__.afn.call(null,a,b));
+});
+var G__9207__4 = (function (self__,a,b,c){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$3 ? self__.afn.cljs$core$IFn$_invoke$arity$3(a,b,c) : self__.afn.call(null,a,b,c));
+});
+var G__9207__5 = (function (self__,a,b,c,d){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$4 ? self__.afn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : self__.afn.call(null,a,b,c,d));
+});
+var G__9207__6 = (function (self__,a,b,c,d,e){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$5 ? self__.afn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : self__.afn.call(null,a,b,c,d,e));
+});
+var G__9207__7 = (function (self__,a,b,c,d,e,f){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$6 ? self__.afn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : self__.afn.call(null,a,b,c,d,e,f));
+});
+var G__9207__8 = (function (self__,a,b,c,d,e,f,g){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$7 ? self__.afn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : self__.afn.call(null,a,b,c,d,e,f,g));
+});
+var G__9207__9 = (function (self__,a,b,c,d,e,f,g,h){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$8 ? self__.afn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : self__.afn.call(null,a,b,c,d,e,f,g,h));
+});
+var G__9207__10 = (function (self__,a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$9 ? self__.afn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : self__.afn.call(null,a,b,c,d,e,f,g,h,i));
+});
+var G__9207__11 = (function (self__,a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$10 ? self__.afn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j));
+});
+var G__9207__12 = (function (self__,a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$11 ? self__.afn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+});
+var G__9207__13 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$12 ? self__.afn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+});
+var G__9207__14 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$13 ? self__.afn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+});
+var G__9207__15 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$14 ? self__.afn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+});
+var G__9207__16 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$15 ? self__.afn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+});
+var G__9207__17 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$16 ? self__.afn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+});
+var G__9207__18 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$17 ? self__.afn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+});
+var G__9207__19 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$18 ? self__.afn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+});
+var G__9207__20 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$19 ? self__.afn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+});
+var G__9207__21 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$20 ? self__.afn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+});
+var G__9207__22 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (cljs.core.apply.cljs$core$IFn$_invoke$arity$22 ? cljs.core.apply.cljs$core$IFn$_invoke$arity$22(self__.afn,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest) : cljs.core.apply.call(null,self__.afn,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest));
+});
+G__9207 = function(self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+switch(arguments.length){
+case 1:
+return G__9207__1.call(this,self__);
+case 2:
+return G__9207__2.call(this,self__,a);
+case 3:
+return G__9207__3.call(this,self__,a,b);
+case 4:
+return G__9207__4.call(this,self__,a,b,c);
+case 5:
+return G__9207__5.call(this,self__,a,b,c,d);
+case 6:
+return G__9207__6.call(this,self__,a,b,c,d,e);
+case 7:
+return G__9207__7.call(this,self__,a,b,c,d,e,f);
+case 8:
+return G__9207__8.call(this,self__,a,b,c,d,e,f,g);
+case 9:
+return G__9207__9.call(this,self__,a,b,c,d,e,f,g,h);
+case 10:
+return G__9207__10.call(this,self__,a,b,c,d,e,f,g,h,i);
+case 11:
+return G__9207__11.call(this,self__,a,b,c,d,e,f,g,h,i,j);
+case 12:
+return G__9207__12.call(this,self__,a,b,c,d,e,f,g,h,i,j,k);
+case 13:
+return G__9207__13.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l);
+case 14:
+return G__9207__14.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m);
+case 15:
+return G__9207__15.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
+case 16:
+return G__9207__16.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o);
+case 17:
+return G__9207__17.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+case 18:
+return G__9207__18.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
+case 19:
+return G__9207__19.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r);
+case 20:
+return G__9207__20.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);
+case 21:
+return G__9207__21.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t);
+case 22:
+return G__9207__22.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9207.cljs$core$IFn$_invoke$arity$1 = G__9207__1;
+G__9207.cljs$core$IFn$_invoke$arity$2 = G__9207__2;
+G__9207.cljs$core$IFn$_invoke$arity$3 = G__9207__3;
+G__9207.cljs$core$IFn$_invoke$arity$4 = G__9207__4;
+G__9207.cljs$core$IFn$_invoke$arity$5 = G__9207__5;
+G__9207.cljs$core$IFn$_invoke$arity$6 = G__9207__6;
+G__9207.cljs$core$IFn$_invoke$arity$7 = G__9207__7;
+G__9207.cljs$core$IFn$_invoke$arity$8 = G__9207__8;
+G__9207.cljs$core$IFn$_invoke$arity$9 = G__9207__9;
+G__9207.cljs$core$IFn$_invoke$arity$10 = G__9207__10;
+G__9207.cljs$core$IFn$_invoke$arity$11 = G__9207__11;
+G__9207.cljs$core$IFn$_invoke$arity$12 = G__9207__12;
+G__9207.cljs$core$IFn$_invoke$arity$13 = G__9207__13;
+G__9207.cljs$core$IFn$_invoke$arity$14 = G__9207__14;
+G__9207.cljs$core$IFn$_invoke$arity$15 = G__9207__15;
+G__9207.cljs$core$IFn$_invoke$arity$16 = G__9207__16;
+G__9207.cljs$core$IFn$_invoke$arity$17 = G__9207__17;
+G__9207.cljs$core$IFn$_invoke$arity$18 = G__9207__18;
+G__9207.cljs$core$IFn$_invoke$arity$19 = G__9207__19;
+G__9207.cljs$core$IFn$_invoke$arity$20 = G__9207__20;
+G__9207.cljs$core$IFn$_invoke$arity$21 = G__9207__21;
+G__9207.cljs$core$IFn$_invoke$arity$22 = G__9207__22;
+return G__9207;
+})()
+;
+
+cljs.core.MetaFn.prototype.apply = (function (self__,args9206){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args9206)));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$0 = (function (){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$0 ? self__.afn.cljs$core$IFn$_invoke$arity$0() : self__.afn.call(null));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$1 = (function (a){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$1 ? self__.afn.cljs$core$IFn$_invoke$arity$1(a) : self__.afn.call(null,a));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$2 = (function (a,b){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$2 ? self__.afn.cljs$core$IFn$_invoke$arity$2(a,b) : self__.afn.call(null,a,b));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$3 = (function (a,b,c){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$3 ? self__.afn.cljs$core$IFn$_invoke$arity$3(a,b,c) : self__.afn.call(null,a,b,c));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$4 = (function (a,b,c,d){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$4 ? self__.afn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : self__.afn.call(null,a,b,c,d));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$5 = (function (a,b,c,d,e){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$5 ? self__.afn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : self__.afn.call(null,a,b,c,d,e));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$6 = (function (a,b,c,d,e,f){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$6 ? self__.afn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : self__.afn.call(null,a,b,c,d,e,f));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$7 = (function (a,b,c,d,e,f,g){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$7 ? self__.afn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : self__.afn.call(null,a,b,c,d,e,f,g));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$8 = (function (a,b,c,d,e,f,g,h){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$8 ? self__.afn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : self__.afn.call(null,a,b,c,d,e,f,g,h));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$9 = (function (a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$9 ? self__.afn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : self__.afn.call(null,a,b,c,d,e,f,g,h,i));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$10 = (function (a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$10 ? self__.afn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$11 = (function (a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$11 ? self__.afn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$12 = (function (a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$12 ? self__.afn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$13 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$13 ? self__.afn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$14 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$14 ? self__.afn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$15 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$15 ? self__.afn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$16 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$16 ? self__.afn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$17 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$17 ? self__.afn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$18 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$18 ? self__.afn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$19 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$19 ? self__.afn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$20 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$20 ? self__.afn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$21 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var _ = this;
+return (cljs.core.apply.cljs$core$IFn$_invoke$arity$22 ? cljs.core.apply.cljs$core$IFn$_invoke$arity$22(self__.afn,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest) : cljs.core.apply.call(null,self__.afn,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest));
+});
+
+cljs.core.MetaFn.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"afn","afn",216963467,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null)], null);
+});
+
+cljs.core.MetaFn.cljs$lang$type = true;
+
+cljs.core.MetaFn.cljs$lang$ctorStr = "cljs.core/MetaFn";
+
+cljs.core.MetaFn.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/MetaFn");
+});
+
+cljs.core.__GT_MetaFn = (function cljs$core$__GT_MetaFn(afn,meta){
+return (new cljs.core.MetaFn(afn,meta));
+});
+
+/**
+ * Returns an object of the same type and value as obj, with
+ * map m as its metadata.
+ */
+cljs.core.with_meta = (function cljs$core$with_meta(o,meta){
+if(goog.isFunction(o)){
+return (new cljs.core.MetaFn(o,meta));
+} else {
+if((o == null)){
+return null;
+} else {
+return cljs.core._with_meta(o,meta);
+}
+}
+});
+/**
+ * Returns the metadata of obj, returns nil if there is no metadata.
+ */
+cljs.core.meta = (function cljs$core$meta(o){
+if((function (){var and__6500__auto__ = !((o == null));
+if(and__6500__auto__){
+if(!((o == null))){
+if(((o.cljs$lang$protocol_mask$partition0$ & (131072))) || ((cljs.core.PROTOCOL_SENTINEL === o.cljs$core$IMeta$))){
+return true;
+} else {
+if((!o.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IMeta,o);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IMeta,o);
+}
+} else {
+return and__6500__auto__;
+}
+})()){
+return cljs.core._meta(o);
+} else {
+return null;
+}
+});
+/**
+ * For a list or queue, same as first, for a vector, same as, but much
+ * more efficient than, last. If the collection is empty, returns nil.
+ */
+cljs.core.peek = (function cljs$core$peek(coll){
+if((coll == null)){
+return null;
+} else {
+return cljs.core._peek(coll);
+}
+});
+/**
+ * For a list or queue, returns a new list/queue without the first
+ * item, for a vector, returns a new vector without the last item.
+ * Note - not the same as next/butlast.
+ */
+cljs.core.pop = (function cljs$core$pop(coll){
+if((coll == null)){
+return null;
+} else {
+return cljs.core._pop(coll);
+}
+});
+/**
+ * disj[oin]. Returns a new set of the same (hashed/sorted) type, that
+ * does not contain key(s).
+ */
+cljs.core.disj = (function cljs$core$disj(var_args){
+var args9212 = [];
+var len__7625__auto___9218 = arguments.length;
+var i__7626__auto___9219 = (0);
+while(true){
+if((i__7626__auto___9219 < len__7625__auto___9218)){
+args9212.push((arguments[i__7626__auto___9219]));
+
+var G__9220 = (i__7626__auto___9219 + (1));
+i__7626__auto___9219 = G__9220;
+continue;
+} else {
+}
+break;
+}
+
+var G__9217 = args9212.length;
+switch (G__9217) {
+case 1:
+return cljs.core.disj.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.disj.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9212.slice((2)),(0),null));
+return cljs.core.disj.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.disj.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+return coll;
+});
+
+cljs.core.disj.cljs$core$IFn$_invoke$arity$2 = (function (coll,k){
+if((coll == null)){
+return null;
+} else {
+return cljs.core._disjoin(coll,k);
+}
+});
+
+cljs.core.disj.cljs$core$IFn$_invoke$arity$variadic = (function (coll,k,ks){
+while(true){
+if((coll == null)){
+return null;
+} else {
+var ret = cljs.core.disj.cljs$core$IFn$_invoke$arity$2(coll,k);
+if(cljs.core.truth_(ks)){
+var G__9222 = ret;
+var G__9223 = cljs.core.first(ks);
+var G__9224 = cljs.core.next(ks);
+coll = G__9222;
+k = G__9223;
+ks = G__9224;
+continue;
+} else {
+return ret;
+}
+}
+break;
+}
+});
+
+cljs.core.disj.cljs$lang$applyTo = (function (seq9213){
+var G__9214 = cljs.core.first(seq9213);
+var seq9213__$1 = cljs.core.next(seq9213);
+var G__9215 = cljs.core.first(seq9213__$1);
+var seq9213__$2 = cljs.core.next(seq9213__$1);
+return cljs.core.disj.cljs$core$IFn$_invoke$arity$variadic(G__9214,G__9215,seq9213__$2);
+});
+
+cljs.core.disj.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns true if coll has no items - same as (not (seq coll)).
+ * Please use the idiom (seq x) rather than (not (empty? x))
+ */
+cljs.core.empty_QMARK_ = (function cljs$core$empty_QMARK_(coll){
+return ((coll == null)) || (cljs.core.not(cljs.core.seq(coll)));
+});
+/**
+ * Returns true if x satisfies ICollection
+ */
+cljs.core.coll_QMARK_ = (function cljs$core$coll_QMARK_(x){
+if((x == null)){
+return false;
+} else {
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (8))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$ICollection$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICollection,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICollection,x);
+}
+}
+});
+/**
+ * Returns true if x satisfies ISet
+ */
+cljs.core.set_QMARK_ = (function cljs$core$set_QMARK_(x){
+if((x == null)){
+return false;
+} else {
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (4096))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$ISet$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISet,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISet,x);
+}
+}
+});
+/**
+ * Returns true if coll implements Associative
+ */
+cljs.core.associative_QMARK_ = (function cljs$core$associative_QMARK_(x){
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (512))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IAssociative$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IAssociative,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IAssociative,x);
+}
+});
+/**
+ * Returns true if coll satisfies ISequential
+ */
+cljs.core.sequential_QMARK_ = (function cljs$core$sequential_QMARK_(x){
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (16777216))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$ISequential$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISequential,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISequential,x);
+}
+});
+/**
+ * Returns true if coll satisfies ISorted
+ */
+cljs.core.sorted_QMARK_ = (function cljs$core$sorted_QMARK_(x){
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (268435456))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$ISorted$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISorted,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISorted,x);
+}
+});
+/**
+ * Returns true if coll satisfies IReduce
+ */
+cljs.core.reduceable_QMARK_ = (function cljs$core$reduceable_QMARK_(x){
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (524288))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IReduce$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IReduce,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IReduce,x);
+}
+});
+/**
+ * Return true if x satisfies IMap
+ */
+cljs.core.map_QMARK_ = (function cljs$core$map_QMARK_(x){
+if((x == null)){
+return false;
+} else {
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (1024))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IMap$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IMap,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IMap,x);
+}
+}
+});
+/**
+ * Return true if x satisfies IRecord
+ */
+cljs.core.record_QMARK_ = (function cljs$core$record_QMARK_(x){
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (67108864))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IRecord$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IRecord,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IRecord,x);
+}
+});
+/**
+ * Return true if x satisfies IVector
+ */
+cljs.core.vector_QMARK_ = (function cljs$core$vector_QMARK_(x){
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (16384))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IVector$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IVector,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IVector,x);
+}
+});
+
+/**
+ * Return true if x is satisfies IChunkedSeq.
+ */
+cljs.core.chunked_seq_QMARK_ = (function cljs$core$chunked_seq_QMARK_(x){
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition1$ & (512))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IChunkedSeq$))){
+return true;
+} else {
+return false;
+}
+} else {
+return false;
+}
+});
+/**
+ * Create JavaSript object from an even number arguments representing
+ * interleaved keys and values.
+ */
+cljs.core.js_obj = (function cljs$core$js_obj(var_args){
+var args9245 = [];
+var len__7625__auto___9251 = arguments.length;
+var i__7626__auto___9252 = (0);
+while(true){
+if((i__7626__auto___9252 < len__7625__auto___9251)){
+args9245.push((arguments[i__7626__auto___9252]));
+
+var G__9253 = (i__7626__auto___9252 + (1));
+i__7626__auto___9252 = G__9253;
+continue;
+} else {
+}
+break;
+}
+
+var G__9248 = args9245.length;
+switch (G__9248) {
+case 0:
+return cljs.core.js_obj.cljs$core$IFn$_invoke$arity$0();
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9245.slice((0)),(0),null));
+return cljs.core.js_obj.cljs$core$IFn$_invoke$arity$variadic(argseq__7644__auto__);
+
+}
+});
+
+cljs.core.js_obj.cljs$core$IFn$_invoke$arity$0 = (function (){
+return {};
+});
+
+cljs.core.js_obj.cljs$core$IFn$_invoke$arity$variadic = (function (keyvals){
+return (cljs.core.apply.cljs$core$IFn$_invoke$arity$2 ? cljs.core.apply.cljs$core$IFn$_invoke$arity$2(goog.object.create,keyvals) : cljs.core.apply.call(null,goog.object.create,keyvals));
+});
+
+cljs.core.js_obj.cljs$lang$applyTo = (function (seq9246){
+return cljs.core.js_obj.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq9246));
+});
+
+cljs.core.js_obj.cljs$lang$maxFixedArity = (0);
+
+/**
+ * Return the JavaScript keys for an object.
+ */
+cljs.core.js_keys = (function cljs$core$js_keys(obj){
+var keys = [];
+var G__9257_9259 = obj;
+var G__9258_9260 = ((function (G__9257_9259,keys){
+return (function (val,key,obj__$1){
+return keys.push(key);
+});})(G__9257_9259,keys))
+;
+goog.object.forEach(G__9257_9259,G__9258_9260);
+
+return keys;
+});
+/**
+ * Delete a property from a JavaScript object.
+ */
+cljs.core.js_delete = (function cljs$core$js_delete(obj,key){
+return delete obj[key];
+});
+cljs.core.array_copy = (function cljs$core$array_copy(from,i,to,j,len){
+var i__$1 = i;
+var j__$1 = j;
+var len__$1 = len;
+while(true){
+if((len__$1 === (0))){
+return to;
+} else {
+(to[j__$1] = (from[i__$1]));
+
+var G__9261 = (i__$1 + (1));
+var G__9262 = (j__$1 + (1));
+var G__9263 = (len__$1 - (1));
+i__$1 = G__9261;
+j__$1 = G__9262;
+len__$1 = G__9263;
+continue;
+}
+break;
+}
+});
+cljs.core.array_copy_downward = (function cljs$core$array_copy_downward(from,i,to,j,len){
+var i__$1 = (i + (len - (1)));
+var j__$1 = (j + (len - (1)));
+var len__$1 = len;
+while(true){
+if((len__$1 === (0))){
+return to;
+} else {
+(to[j__$1] = (from[i__$1]));
+
+var G__9264 = (i__$1 - (1));
+var G__9265 = (j__$1 - (1));
+var G__9266 = (len__$1 - (1));
+i__$1 = G__9264;
+j__$1 = G__9265;
+len__$1 = G__9266;
+continue;
+}
+break;
+}
+});
+cljs.core.lookup_sentinel = {};
+/**
+ * Returns true if x is the value false, false otherwise.
+ */
+cljs.core.false_QMARK_ = (function cljs$core$false_QMARK_(x){
+return x === false;
+});
+/**
+ * Returns true if x is the value true, false otherwise.
+ */
+cljs.core.true_QMARK_ = (function cljs$core$true_QMARK_(x){
+return x === true;
+});
+/**
+ * Return true if x is a Boolean
+ */
+cljs.core.boolean_QMARK_ = (function cljs$core$boolean_QMARK_(x){
+return (x === true) || (x === false);
+});
+/**
+ * Returns true if x identical to the JavaScript undefined value.
+ */
+cljs.core.undefined_QMARK_ = (function cljs$core$undefined_QMARK_(x){
+return (void 0 === x);
+});
+/**
+ * Return true if s satisfies ISeq
+ */
+cljs.core.seq_QMARK_ = (function cljs$core$seq_QMARK_(s){
+if((s == null)){
+return false;
+} else {
+if(!((s == null))){
+if(((s.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === s.cljs$core$ISeq$))){
+return true;
+} else {
+if((!s.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISeq,s);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISeq,s);
+}
+}
+});
+/**
+ * Return true if the seq function is supported for s
+ */
+cljs.core.seqable_QMARK_ = (function cljs$core$seqable_QMARK_(s){
+var or__6512__auto__ = ((!((s == null)))?((((s.cljs$lang$protocol_mask$partition0$ & (8388608))) || ((cljs.core.PROTOCOL_SENTINEL === s.cljs$core$ISeqable$)))?true:(((!s.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.ISeqable,s):false)):cljs.core.native_satisfies_QMARK_(cljs.core.ISeqable,s));
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+return (cljs.core.array_QMARK_(s)) || (typeof s === 'string');
+}
+});
+/**
+ * Coerce to boolean
+ */
+cljs.core.boolean$ = (function cljs$core$boolean(x){
+if((x == null)){
+return false;
+} else {
+if(x === false){
+return false;
+} else {
+return true;
+
+}
+}
+});
+/**
+ * Returns true if f returns true for fn? or satisfies IFn.
+ */
+cljs.core.ifn_QMARK_ = (function cljs$core$ifn_QMARK_(f){
+var or__6512__auto__ = cljs.core.fn_QMARK_(f);
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+if(!((f == null))){
+if(((f.cljs$lang$protocol_mask$partition0$ & (1))) || ((cljs.core.PROTOCOL_SENTINEL === f.cljs$core$IFn$))){
+return true;
+} else {
+if((!f.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IFn,f);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IFn,f);
+}
+}
+});
+/**
+ * Returns true if n is a JavaScript number with no decimal part.
+ */
+cljs.core.integer_QMARK_ = (function cljs$core$integer_QMARK_(n){
+return (typeof n === 'number') && (!(isNaN(n))) && (!((n === Infinity))) && ((parseFloat(n) === parseInt(n,(10))));
+});
+/**
+ * Return true if x satisfies integer? or is an instance of goog.math.Integer
+ * or goog.math.Long.
+ */
+cljs.core.int_QMARK_ = (function cljs$core$int_QMARK_(x){
+return (cljs.core.integer_QMARK_(x)) || ((x instanceof goog.math.Integer)) || ((x instanceof goog.math.Long));
+});
+/**
+ * Return true if x satisfies int? and is positive.
+ */
+cljs.core.pos_int_QMARK_ = (function cljs$core$pos_int_QMARK_(x){
+if(cljs.core.integer_QMARK_(x)){
+return (x > (0));
+} else {
+if((x instanceof goog.math.Integer)){
+return (cljs.core.not(x.isNegative())) && (cljs.core.not(x.isZero()));
+} else {
+if((x instanceof goog.math.Long)){
+return (cljs.core.not(x.isNegative())) && (cljs.core.not(x.isZero()));
+} else {
+return false;
+
+}
+}
+}
+});
+/**
+ * Return true if x satisfies int? and is positive.
+ */
+cljs.core.neg_int_QMARK_ = (function cljs$core$neg_int_QMARK_(x){
+if(cljs.core.integer_QMARK_(x)){
+return (x < (0));
+} else {
+if((x instanceof goog.math.Integer)){
+return x.isNegative();
+} else {
+if((x instanceof goog.math.Long)){
+return x.isNegative();
+} else {
+return false;
+
+}
+}
+}
+});
+/**
+ * Return true if x satisfies int? and is a natural integer value.
+ */
+cljs.core.nat_int_QMARK_ = (function cljs$core$nat_int_QMARK_(x){
+if(cljs.core.integer_QMARK_(x)){
+return (!((x < (0)))) || ((x === (0)));
+} else {
+if((x instanceof goog.math.Integer)){
+var or__6512__auto__ = cljs.core.not(x.isNegative());
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+return x.isZero();
+}
+} else {
+if((x instanceof goog.math.Long)){
+var or__6512__auto__ = cljs.core.not(x.isNegative());
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+return x.isZero();
+}
+} else {
+return false;
+
+}
+}
+}
+});
+/**
+ * Returns true for JavaScript numbers, false otherwise.
+ */
+cljs.core.float_QMARK_ = (function cljs$core$float_QMARK_(x){
+return typeof x === 'number';
+});
+/**
+ * Returns true for JavaScript numbers, false otherwise.
+ */
+cljs.core.double_QMARK_ = (function cljs$core$double_QMARK_(x){
+return typeof x === 'number';
+});
+/**
+ * Returns true for Infinity and -Infinity values.
+ */
+cljs.core.infinite_QMARK_ = (function cljs$core$infinite_QMARK_(x){
+return ((x === Number.POSITIVE_INFINITY)) || ((x === Number.NEGATIVE_INFINITY));
+});
+/**
+ * Returns true if key is present in the given collection, otherwise
+ * returns false. Note that for numerically indexed collections like
+ * vectors and arrays, this tests if the numeric key is within the
+ * range of indexes. 'contains?' operates constant or logarithmic time;
+ * it will not perform a linear search for a value. See also 'some'.
+ */
+cljs.core.contains_QMARK_ = (function cljs$core$contains_QMARK_(coll,v){
+if((cljs.core.get.cljs$core$IFn$_invoke$arity$3(coll,v,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return false;
+} else {
+return true;
+}
+});
+/**
+ * Returns the map entry for key, or nil if key not present.
+ */
+cljs.core.find = (function cljs$core$find(coll,k){
+if((!((coll == null))) && (cljs.core.associative_QMARK_(coll)) && (cljs.core.contains_QMARK_(coll,k))){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [k,cljs.core.get.cljs$core$IFn$_invoke$arity$2(coll,k)], null);
+} else {
+return null;
+}
+});
+/**
+ * Returns true if no two of the arguments are =
+ */
+cljs.core.distinct_QMARK_ = (function cljs$core$distinct_QMARK_(var_args){
+var args9279 = [];
+var len__7625__auto___9285 = arguments.length;
+var i__7626__auto___9286 = (0);
+while(true){
+if((i__7626__auto___9286 < len__7625__auto___9285)){
+args9279.push((arguments[i__7626__auto___9286]));
+
+var G__9287 = (i__7626__auto___9286 + (1));
+i__7626__auto___9286 = G__9287;
+continue;
+} else {
+}
+break;
+}
+
+var G__9284 = args9279.length;
+switch (G__9284) {
+case 1:
+return cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9279.slice((2)),(0),null));
+return cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return !(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x,y));
+});
+
+cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+if(!(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x,y))){
+var s = cljs.core.PersistentHashSet.createAsIfByAssoc([x,y], true);
+var xs = more;
+while(true){
+var x__$1 = cljs.core.first(xs);
+var etc = cljs.core.next(xs);
+if(cljs.core.truth_(xs)){
+if(cljs.core.contains_QMARK_(s,x__$1)){
+return false;
+} else {
+var G__9289 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(s,x__$1);
+var G__9290 = etc;
+s = G__9289;
+xs = G__9290;
+continue;
+}
+} else {
+return true;
+}
+break;
+}
+} else {
+return false;
+}
+});
+
+cljs.core.distinct_QMARK_.cljs$lang$applyTo = (function (seq9280){
+var G__9281 = cljs.core.first(seq9280);
+var seq9280__$1 = cljs.core.next(seq9280);
+var G__9282 = cljs.core.first(seq9280__$1);
+var seq9280__$2 = cljs.core.next(seq9280__$1);
+return cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$variadic(G__9281,G__9282,seq9280__$2);
+});
+
+cljs.core.distinct_QMARK_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Comparator. Returns a negative number, zero, or a positive number
+ * when x is logically 'less than', 'equal to', or 'greater than'
+ * y. Uses IComparable if available and google.array.defaultCompare for objects
+ * of the same type and special-cases nil to be less than any other object.
+ */
+cljs.core.compare = (function cljs$core$compare(x,y){
+if((x === y)){
+return (0);
+} else {
+if((x == null)){
+return (-1);
+} else {
+if((y == null)){
+return (1);
+} else {
+if(typeof x === 'number'){
+if(typeof y === 'number'){
+return goog.array.defaultCompare(x,y);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Cannot compare "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(x),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" to "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+} else {
+if(((!((x == null)))?((((x.cljs$lang$protocol_mask$partition1$ & (2048))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IComparable$)))?true:(((!x.cljs$lang$protocol_mask$partition1$))?cljs.core.native_satisfies_QMARK_(cljs.core.IComparable,x):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IComparable,x))){
+return cljs.core._compare(x,y);
+} else {
+if(((typeof x === 'string') || (cljs.core.array_QMARK_(x)) || (x === true) || (x === false)) && ((cljs.core.type(x) === cljs.core.type(y)))){
+return goog.array.defaultCompare(x,y);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Cannot compare "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(x),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" to "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+
+}
+}
+}
+}
+}
+});
+/**
+ * Compare indexed collection.
+ */
+cljs.core.compare_indexed = (function cljs$core$compare_indexed(var_args){
+var args9293 = [];
+var len__7625__auto___9296 = arguments.length;
+var i__7626__auto___9297 = (0);
+while(true){
+if((i__7626__auto___9297 < len__7625__auto___9296)){
+args9293.push((arguments[i__7626__auto___9297]));
+
+var G__9298 = (i__7626__auto___9297 + (1));
+i__7626__auto___9297 = G__9298;
+continue;
+} else {
+}
+break;
+}
+
+var G__9295 = args9293.length;
+switch (G__9295) {
+case 2:
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 4:
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9293.length)].join('')));
+
+}
+});
+
+cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2 = (function (xs,ys){
+var xl = cljs.core.count(xs);
+var yl = cljs.core.count(ys);
+if((xl < yl)){
+return (-1);
+} else {
+if((xl > yl)){
+return (1);
+} else {
+if((xl === (0))){
+return (0);
+} else {
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$4(xs,ys,xl,(0));
+
+}
+}
+}
+});
+
+cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$4 = (function (xs,ys,len,n){
+while(true){
+var d = cljs.core.compare(cljs.core.nth.cljs$core$IFn$_invoke$arity$2(xs,n),cljs.core.nth.cljs$core$IFn$_invoke$arity$2(ys,n));
+if(((d === (0))) && (((n + (1)) < len))){
+var G__9300 = xs;
+var G__9301 = ys;
+var G__9302 = len;
+var G__9303 = (n + (1));
+xs = G__9300;
+ys = G__9301;
+len = G__9302;
+n = G__9303;
+continue;
+} else {
+return d;
+}
+break;
+}
+});
+
+cljs.core.compare_indexed.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Given a fn that might be boolean valued or a comparator,
+ * return a fn that is a comparator.
+ */
+cljs.core.fn__GT_comparator = (function cljs$core$fn__GT_comparator(f){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(f,cljs.core.compare)){
+return cljs.core.compare;
+} else {
+return (function (x,y){
+var r = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y));
+if(typeof r === 'number'){
+return r;
+} else {
+if(cljs.core.truth_(r)){
+return (-1);
+} else {
+if(cljs.core.truth_((f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(y,x) : f.call(null,y,x)))){
+return (1);
+} else {
+return (0);
+}
+}
+}
+});
+}
+});
+/**
+ * Returns a sorted sequence of the items in coll. Comp can be
+ * boolean-valued comparison function, or a -/0/+ valued comparator.
+ * Comp defaults to compare.
+ */
+cljs.core.sort = (function cljs$core$sort(var_args){
+var args9304 = [];
+var len__7625__auto___9309 = arguments.length;
+var i__7626__auto___9310 = (0);
+while(true){
+if((i__7626__auto___9310 < len__7625__auto___9309)){
+args9304.push((arguments[i__7626__auto___9310]));
+
+var G__9311 = (i__7626__auto___9310 + (1));
+i__7626__auto___9310 = G__9311;
+continue;
+} else {
+}
+break;
+}
+
+var G__9306 = args9304.length;
+switch (G__9306) {
+case 1:
+return cljs.core.sort.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.sort.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9304.length)].join('')));
+
+}
+});
+
+cljs.core.sort.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+return cljs.core.sort.cljs$core$IFn$_invoke$arity$2(cljs.core.compare,coll);
+});
+
+cljs.core.sort.cljs$core$IFn$_invoke$arity$2 = (function (comp,coll){
+if(cljs.core.seq(coll)){
+var a = (cljs.core.to_array.cljs$core$IFn$_invoke$arity$1 ? cljs.core.to_array.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.to_array.call(null,coll));
+var G__9307_9313 = a;
+var G__9308_9314 = cljs.core.fn__GT_comparator(comp);
+goog.array.stableSort(G__9307_9313,G__9308_9314);
+
+return cljs.core.seq(a);
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.sort.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a sorted sequence of the items in coll, where the sort
+ * order is determined by comparing (keyfn item). Comp can be
+ * boolean-valued comparison funcion, or a -/0/+ valued comparator.
+ * Comp defaults to compare.
+ */
+cljs.core.sort_by = (function cljs$core$sort_by(var_args){
+var args9315 = [];
+var len__7625__auto___9318 = arguments.length;
+var i__7626__auto___9319 = (0);
+while(true){
+if((i__7626__auto___9319 < len__7625__auto___9318)){
+args9315.push((arguments[i__7626__auto___9319]));
+
+var G__9320 = (i__7626__auto___9319 + (1));
+i__7626__auto___9319 = G__9320;
+continue;
+} else {
+}
+break;
+}
+
+var G__9317 = args9315.length;
+switch (G__9317) {
+case 2:
+return cljs.core.sort_by.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.sort_by.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9315.length)].join('')));
+
+}
+});
+
+cljs.core.sort_by.cljs$core$IFn$_invoke$arity$2 = (function (keyfn,coll){
+return cljs.core.sort_by.cljs$core$IFn$_invoke$arity$3(keyfn,cljs.core.compare,coll);
+});
+
+cljs.core.sort_by.cljs$core$IFn$_invoke$arity$3 = (function (keyfn,comp,coll){
+return cljs.core.sort.cljs$core$IFn$_invoke$arity$2((function (x,y){
+return cljs.core.fn__GT_comparator(comp).call(null,(keyfn.cljs$core$IFn$_invoke$arity$1 ? keyfn.cljs$core$IFn$_invoke$arity$1(x) : keyfn.call(null,x)),(keyfn.cljs$core$IFn$_invoke$arity$1 ? keyfn.cljs$core$IFn$_invoke$arity$1(y) : keyfn.call(null,y)));
+}),coll);
+});
+
+cljs.core.sort_by.cljs$lang$maxFixedArity = 3;
+
+cljs.core.seq_reduce = (function cljs$core$seq_reduce(var_args){
+var args9322 = [];
+var len__7625__auto___9330 = arguments.length;
+var i__7626__auto___9331 = (0);
+while(true){
+if((i__7626__auto___9331 < len__7625__auto___9330)){
+args9322.push((arguments[i__7626__auto___9331]));
+
+var G__9332 = (i__7626__auto___9331 + (1));
+i__7626__auto___9331 = G__9332;
+continue;
+} else {
+}
+break;
+}
+
+var G__9324 = args9322.length;
+switch (G__9324) {
+case 2:
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9322.length)].join('')));
+
+}
+});
+
+cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+var temp__4655__auto__ = cljs.core.seq(coll);
+if(temp__4655__auto__){
+var s = temp__4655__auto__;
+var G__9325 = f;
+var G__9326 = cljs.core.first(s);
+var G__9327 = cljs.core.next(s);
+return (cljs.core.reduce.cljs$core$IFn$_invoke$arity$3 ? cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(G__9325,G__9326,G__9327) : cljs.core.reduce.call(null,G__9325,G__9326,G__9327));
+} else {
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+}
+});
+
+cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3 = (function (f,val,coll){
+var val__$1 = val;
+var coll__$1 = cljs.core.seq(coll);
+while(true){
+if(coll__$1){
+var nval = (function (){var G__9328 = val__$1;
+var G__9329 = cljs.core.first(coll__$1);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__9328,G__9329) : f.call(null,G__9328,G__9329));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__9334 = nval;
+var G__9335 = cljs.core.next(coll__$1);
+val__$1 = G__9334;
+coll__$1 = G__9335;
+continue;
+}
+} else {
+return val__$1;
+}
+break;
+}
+});
+
+cljs.core.seq_reduce.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Return a random permutation of coll
+ */
+cljs.core.shuffle = (function cljs$core$shuffle(coll){
+var a = (cljs.core.to_array.cljs$core$IFn$_invoke$arity$1 ? cljs.core.to_array.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.to_array.call(null,coll));
+goog.array.shuffle(a);
+
+return (cljs.core.vec.cljs$core$IFn$_invoke$arity$1 ? cljs.core.vec.cljs$core$IFn$_invoke$arity$1(a) : cljs.core.vec.call(null,a));
+});
+/**
+ * f should be a function of 2 arguments. If val is not supplied,
+ * returns the result of applying f to the first 2 items in coll, then
+ * applying f to that result and the 3rd item, etc. If coll contains no
+ * items, f must accept no arguments as well, and reduce returns the
+ * result of calling f with no arguments. If coll has only 1 item, it
+ * is returned and f is not called. If val is supplied, returns the
+ * result of applying f to val and the first item in coll, then
+ * applying f to that result and the 2nd item, etc. If coll contains no
+ * items, returns val and f is not called.
+ */
+cljs.core.reduce = (function cljs$core$reduce(var_args){
+var args9336 = [];
+var len__7625__auto___9341 = arguments.length;
+var i__7626__auto___9342 = (0);
+while(true){
+if((i__7626__auto___9342 < len__7625__auto___9341)){
+args9336.push((arguments[i__7626__auto___9342]));
+
+var G__9343 = (i__7626__auto___9342 + (1));
+i__7626__auto___9342 = G__9343;
+continue;
+} else {
+}
+break;
+}
+
+var G__9338 = args9336.length;
+switch (G__9338) {
+case 2:
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9336.length)].join('')));
+
+}
+});
+
+cljs.core.reduce.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (524288))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$IReduce$)))?true:false):false)){
+return coll.cljs$core$IReduce$_reduce$arity$2(null,f);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$2(coll,f);
+} else {
+if(typeof coll === 'string'){
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$2(coll,f);
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.IReduce,coll)){
+return cljs.core._reduce.cljs$core$IFn$_invoke$arity$2(coll,f);
+} else {
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll);
+
+}
+}
+}
+}
+});
+
+cljs.core.reduce.cljs$core$IFn$_invoke$arity$3 = (function (f,val,coll){
+if(((!((coll == null)))?((((coll.cljs$lang$protocol_mask$partition0$ & (524288))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$IReduce$)))?true:false):false)){
+return coll.cljs$core$IReduce$_reduce$arity$3(null,f,val);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$3(coll,f,val);
+} else {
+if(typeof coll === 'string'){
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$3(coll,f,val);
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.IReduce,coll)){
+return cljs.core._reduce.cljs$core$IFn$_invoke$arity$3(coll,f,val);
+} else {
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,val,coll);
+
+}
+}
+}
+}
+});
+
+cljs.core.reduce.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Reduces an associative collection. f should be a function of 3
+ * arguments. Returns the result of applying f to init, the first key
+ * and the first value in coll, then applying f to that result and the
+ * 2nd key and value, etc. If coll contains no entries, returns init
+ * and f is not called. Note that reduce-kv is supported on vectors,
+ * where the keys will be the ordinals.
+ */
+cljs.core.reduce_kv = (function cljs$core$reduce_kv(f,init,coll){
+if(!((coll == null))){
+return cljs.core._kv_reduce(coll,f,init);
+} else {
+return init;
+}
+});
+/**
+ * Returns its argument.
+ */
+cljs.core.identity = (function cljs$core$identity(x){
+return x;
+});
+/**
+ * Takes a reducing function f of 2 args and returns a fn suitable for
+ * transduce by adding an arity-1 signature that calls cf (default -
+ * identity) on the result argument.
+ */
+cljs.core.completing = (function cljs$core$completing(var_args){
+var args9345 = [];
+var len__7625__auto___9348 = arguments.length;
+var i__7626__auto___9349 = (0);
+while(true){
+if((i__7626__auto___9349 < len__7625__auto___9348)){
+args9345.push((arguments[i__7626__auto___9349]));
+
+var G__9350 = (i__7626__auto___9349 + (1));
+i__7626__auto___9349 = G__9350;
+continue;
+} else {
+}
+break;
+}
+
+var G__9347 = args9345.length;
+switch (G__9347) {
+case 1:
+return cljs.core.completing.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.completing.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9345.length)].join('')));
+
+}
+});
+
+cljs.core.completing.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return cljs.core.completing.cljs$core$IFn$_invoke$arity$2(f,cljs.core.identity);
+});
+
+cljs.core.completing.cljs$core$IFn$_invoke$arity$2 = (function (f,cf){
+return (function() {
+var G__9352 = null;
+var G__9352__0 = (function (){
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+});
+var G__9352__1 = (function (x){
+return (cf.cljs$core$IFn$_invoke$arity$1 ? cf.cljs$core$IFn$_invoke$arity$1(x) : cf.call(null,x));
+});
+var G__9352__2 = (function (x,y){
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y));
+});
+G__9352 = function(x,y){
+switch(arguments.length){
+case 0:
+return G__9352__0.call(this);
+case 1:
+return G__9352__1.call(this,x);
+case 2:
+return G__9352__2.call(this,x,y);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9352.cljs$core$IFn$_invoke$arity$0 = G__9352__0;
+G__9352.cljs$core$IFn$_invoke$arity$1 = G__9352__1;
+G__9352.cljs$core$IFn$_invoke$arity$2 = G__9352__2;
+return G__9352;
+})()
+});
+
+cljs.core.completing.cljs$lang$maxFixedArity = 2;
+
+/**
+ * reduce with a transformation of f (xf). If init is not
+ * supplied, (f) will be called to produce it. f should be a reducing
+ * step function that accepts both 1 and 2 arguments, if it accepts
+ * only 2 you can add the arity-1 with 'completing'. Returns the result
+ * of applying (the transformed) xf to init and the first item in coll,
+ * then applying xf to that result and the 2nd item, etc. If coll
+ * contains no items, returns init and f is not called. Note that
+ * certain transforms may inject or skip items.
+ */
+cljs.core.transduce = (function cljs$core$transduce(var_args){
+var args9353 = [];
+var len__7625__auto___9356 = arguments.length;
+var i__7626__auto___9357 = (0);
+while(true){
+if((i__7626__auto___9357 < len__7625__auto___9356)){
+args9353.push((arguments[i__7626__auto___9357]));
+
+var G__9358 = (i__7626__auto___9357 + (1));
+i__7626__auto___9357 = G__9358;
+continue;
+} else {
+}
+break;
+}
+
+var G__9355 = args9353.length;
+switch (G__9355) {
+case 3:
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9353.length)].join('')));
+
+}
+});
+
+cljs.core.transduce.cljs$core$IFn$_invoke$arity$3 = (function (xform,f,coll){
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$4(xform,f,(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)),coll);
+});
+
+cljs.core.transduce.cljs$core$IFn$_invoke$arity$4 = (function (xform,f,init,coll){
+var f__$1 = (xform.cljs$core$IFn$_invoke$arity$1 ? xform.cljs$core$IFn$_invoke$arity$1(f) : xform.call(null,f));
+var ret = cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(f__$1,init,coll);
+return (f__$1.cljs$core$IFn$_invoke$arity$1 ? f__$1.cljs$core$IFn$_invoke$arity$1(ret) : f__$1.call(null,ret));
+});
+
+cljs.core.transduce.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Returns the sum of nums. (+) returns 0.
+ */
+cljs.core._PLUS_ = (function cljs$core$_PLUS_(var_args){
+var args9360 = [];
+var len__7625__auto___9366 = arguments.length;
+var i__7626__auto___9367 = (0);
+while(true){
+if((i__7626__auto___9367 < len__7625__auto___9366)){
+args9360.push((arguments[i__7626__auto___9367]));
+
+var G__9368 = (i__7626__auto___9367 + (1));
+i__7626__auto___9367 = G__9368;
+continue;
+} else {
+}
+break;
+}
+
+var G__9365 = args9360.length;
+switch (G__9365) {
+case 0:
+return cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9360.slice((2)),(0),null));
+return cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (0);
+});
+
+cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x + y);
+});
+
+cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._PLUS_,(x + y),more);
+});
+
+cljs.core._PLUS_.cljs$lang$applyTo = (function (seq9361){
+var G__9362 = cljs.core.first(seq9361);
+var seq9361__$1 = cljs.core.next(seq9361);
+var G__9363 = cljs.core.first(seq9361__$1);
+var seq9361__$2 = cljs.core.next(seq9361__$1);
+return cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$variadic(G__9362,G__9363,seq9361__$2);
+});
+
+cljs.core._PLUS_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * If no ys are supplied, returns the negation of x, else subtracts
+ * the ys from x and returns the result.
+ */
+cljs.core._ = (function cljs$core$_(var_args){
+var args9370 = [];
+var len__7625__auto___9376 = arguments.length;
+var i__7626__auto___9377 = (0);
+while(true){
+if((i__7626__auto___9377 < len__7625__auto___9376)){
+args9370.push((arguments[i__7626__auto___9377]));
+
+var G__9378 = (i__7626__auto___9377 + (1));
+i__7626__auto___9377 = G__9378;
+continue;
+} else {
+}
+break;
+}
+
+var G__9375 = args9370.length;
+switch (G__9375) {
+case 1:
+return cljs.core._.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9370.slice((2)),(0),null));
+return cljs.core._.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core._.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (- x);
+});
+
+cljs.core._.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x - y);
+});
+
+cljs.core._.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._,(x - y),more);
+});
+
+cljs.core._.cljs$lang$applyTo = (function (seq9371){
+var G__9372 = cljs.core.first(seq9371);
+var seq9371__$1 = cljs.core.next(seq9371);
+var G__9373 = cljs.core.first(seq9371__$1);
+var seq9371__$2 = cljs.core.next(seq9371__$1);
+return cljs.core._.cljs$core$IFn$_invoke$arity$variadic(G__9372,G__9373,seq9371__$2);
+});
+
+cljs.core._.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns the product of nums. (*) returns 1.
+ */
+cljs.core._STAR_ = (function cljs$core$_STAR_(var_args){
+var args9380 = [];
+var len__7625__auto___9386 = arguments.length;
+var i__7626__auto___9387 = (0);
+while(true){
+if((i__7626__auto___9387 < len__7625__auto___9386)){
+args9380.push((arguments[i__7626__auto___9387]));
+
+var G__9388 = (i__7626__auto___9387 + (1));
+i__7626__auto___9387 = G__9388;
+continue;
+} else {
+}
+break;
+}
+
+var G__9385 = args9380.length;
+switch (G__9385) {
+case 0:
+return cljs.core._STAR_.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core._STAR_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._STAR_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9380.slice((2)),(0),null));
+return cljs.core._STAR_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core._STAR_.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (1);
+});
+
+cljs.core._STAR_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core._STAR_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x * y);
+});
+
+cljs.core._STAR_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._STAR_,(x * y),more);
+});
+
+cljs.core._STAR_.cljs$lang$applyTo = (function (seq9381){
+var G__9382 = cljs.core.first(seq9381);
+var seq9381__$1 = cljs.core.next(seq9381);
+var G__9383 = cljs.core.first(seq9381__$1);
+var seq9381__$2 = cljs.core.next(seq9381__$1);
+return cljs.core._STAR_.cljs$core$IFn$_invoke$arity$variadic(G__9382,G__9383,seq9381__$2);
+});
+
+cljs.core._STAR_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * If no denominators are supplied, returns 1/numerator,
+ * else returns numerator divided by all of the denominators.
+ */
+cljs.core._SLASH_ = (function cljs$core$_SLASH_(var_args){
+var args9390 = [];
+var len__7625__auto___9396 = arguments.length;
+var i__7626__auto___9397 = (0);
+while(true){
+if((i__7626__auto___9397 < len__7625__auto___9396)){
+args9390.push((arguments[i__7626__auto___9397]));
+
+var G__9398 = (i__7626__auto___9397 + (1));
+i__7626__auto___9397 = G__9398;
+continue;
+} else {
+}
+break;
+}
+
+var G__9395 = args9390.length;
+switch (G__9395) {
+case 1:
+return cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9390.slice((2)),(0),null));
+return cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return ((1) / x);
+});
+
+cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x / y);
+});
+
+cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._SLASH_,(x / y),more);
+});
+
+cljs.core._SLASH_.cljs$lang$applyTo = (function (seq9391){
+var G__9392 = cljs.core.first(seq9391);
+var seq9391__$1 = cljs.core.next(seq9391);
+var G__9393 = cljs.core.first(seq9391__$1);
+var seq9391__$2 = cljs.core.next(seq9391__$1);
+return cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$variadic(G__9392,G__9393,seq9391__$2);
+});
+
+cljs.core._SLASH_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns non-nil if nums are in monotonically increasing order,
+ * otherwise false.
+ */
+cljs.core._LT_ = (function cljs$core$_LT_(var_args){
+var args9400 = [];
+var len__7625__auto___9406 = arguments.length;
+var i__7626__auto___9407 = (0);
+while(true){
+if((i__7626__auto___9407 < len__7625__auto___9406)){
+args9400.push((arguments[i__7626__auto___9407]));
+
+var G__9408 = (i__7626__auto___9407 + (1));
+i__7626__auto___9407 = G__9408;
+continue;
+} else {
+}
+break;
+}
+
+var G__9405 = args9400.length;
+switch (G__9405) {
+case 1:
+return cljs.core._LT_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._LT_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9400.slice((2)),(0),null));
+return cljs.core._LT_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core._LT_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._LT_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x < y);
+});
+
+cljs.core._LT_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if((x < y)){
+if(cljs.core.next(more)){
+var G__9410 = y;
+var G__9411 = cljs.core.first(more);
+var G__9412 = cljs.core.next(more);
+x = G__9410;
+y = G__9411;
+more = G__9412;
+continue;
+} else {
+return (y < cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+cljs.core._LT_.cljs$lang$applyTo = (function (seq9401){
+var G__9402 = cljs.core.first(seq9401);
+var seq9401__$1 = cljs.core.next(seq9401);
+var G__9403 = cljs.core.first(seq9401__$1);
+var seq9401__$2 = cljs.core.next(seq9401__$1);
+return cljs.core._LT_.cljs$core$IFn$_invoke$arity$variadic(G__9402,G__9403,seq9401__$2);
+});
+
+cljs.core._LT_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns non-nil if nums are in monotonically non-decreasing order,
+ * otherwise false.
+ */
+cljs.core._LT__EQ_ = (function cljs$core$_LT__EQ_(var_args){
+var args9413 = [];
+var len__7625__auto___9419 = arguments.length;
+var i__7626__auto___9420 = (0);
+while(true){
+if((i__7626__auto___9420 < len__7625__auto___9419)){
+args9413.push((arguments[i__7626__auto___9420]));
+
+var G__9421 = (i__7626__auto___9420 + (1));
+i__7626__auto___9420 = G__9421;
+continue;
+} else {
+}
+break;
+}
+
+var G__9418 = args9413.length;
+switch (G__9418) {
+case 1:
+return cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9413.slice((2)),(0),null));
+return cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x <= y);
+});
+
+cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if((x <= y)){
+if(cljs.core.next(more)){
+var G__9423 = y;
+var G__9424 = cljs.core.first(more);
+var G__9425 = cljs.core.next(more);
+x = G__9423;
+y = G__9424;
+more = G__9425;
+continue;
+} else {
+return (y <= cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+cljs.core._LT__EQ_.cljs$lang$applyTo = (function (seq9414){
+var G__9415 = cljs.core.first(seq9414);
+var seq9414__$1 = cljs.core.next(seq9414);
+var G__9416 = cljs.core.first(seq9414__$1);
+var seq9414__$2 = cljs.core.next(seq9414__$1);
+return cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$variadic(G__9415,G__9416,seq9414__$2);
+});
+
+cljs.core._LT__EQ_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns non-nil if nums are in monotonically decreasing order,
+ * otherwise false.
+ */
+cljs.core._GT_ = (function cljs$core$_GT_(var_args){
+var args9426 = [];
+var len__7625__auto___9432 = arguments.length;
+var i__7626__auto___9433 = (0);
+while(true){
+if((i__7626__auto___9433 < len__7625__auto___9432)){
+args9426.push((arguments[i__7626__auto___9433]));
+
+var G__9434 = (i__7626__auto___9433 + (1));
+i__7626__auto___9433 = G__9434;
+continue;
+} else {
+}
+break;
+}
+
+var G__9431 = args9426.length;
+switch (G__9431) {
+case 1:
+return cljs.core._GT_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._GT_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9426.slice((2)),(0),null));
+return cljs.core._GT_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core._GT_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._GT_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x > y);
+});
+
+cljs.core._GT_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if((x > y)){
+if(cljs.core.next(more)){
+var G__9436 = y;
+var G__9437 = cljs.core.first(more);
+var G__9438 = cljs.core.next(more);
+x = G__9436;
+y = G__9437;
+more = G__9438;
+continue;
+} else {
+return (y > cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+cljs.core._GT_.cljs$lang$applyTo = (function (seq9427){
+var G__9428 = cljs.core.first(seq9427);
+var seq9427__$1 = cljs.core.next(seq9427);
+var G__9429 = cljs.core.first(seq9427__$1);
+var seq9427__$2 = cljs.core.next(seq9427__$1);
+return cljs.core._GT_.cljs$core$IFn$_invoke$arity$variadic(G__9428,G__9429,seq9427__$2);
+});
+
+cljs.core._GT_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns non-nil if nums are in monotonically non-increasing order,
+ * otherwise false.
+ */
+cljs.core._GT__EQ_ = (function cljs$core$_GT__EQ_(var_args){
+var args9439 = [];
+var len__7625__auto___9445 = arguments.length;
+var i__7626__auto___9446 = (0);
+while(true){
+if((i__7626__auto___9446 < len__7625__auto___9445)){
+args9439.push((arguments[i__7626__auto___9446]));
+
+var G__9447 = (i__7626__auto___9446 + (1));
+i__7626__auto___9446 = G__9447;
+continue;
+} else {
+}
+break;
+}
+
+var G__9444 = args9439.length;
+switch (G__9444) {
+case 1:
+return cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9439.slice((2)),(0),null));
+return cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x >= y);
+});
+
+cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if((x >= y)){
+if(cljs.core.next(more)){
+var G__9449 = y;
+var G__9450 = cljs.core.first(more);
+var G__9451 = cljs.core.next(more);
+x = G__9449;
+y = G__9450;
+more = G__9451;
+continue;
+} else {
+return (y >= cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+cljs.core._GT__EQ_.cljs$lang$applyTo = (function (seq9440){
+var G__9441 = cljs.core.first(seq9440);
+var seq9440__$1 = cljs.core.next(seq9440);
+var G__9442 = cljs.core.first(seq9440__$1);
+var seq9440__$2 = cljs.core.next(seq9440__$1);
+return cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$variadic(G__9441,G__9442,seq9440__$2);
+});
+
+cljs.core._GT__EQ_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns a number one less than num.
+ */
+cljs.core.dec = (function cljs$core$dec(x){
+return (x - (1));
+});
+/**
+ * Returns the greatest of the nums.
+ */
+cljs.core.max = (function cljs$core$max(var_args){
+var args9452 = [];
+var len__7625__auto___9458 = arguments.length;
+var i__7626__auto___9459 = (0);
+while(true){
+if((i__7626__auto___9459 < len__7625__auto___9458)){
+args9452.push((arguments[i__7626__auto___9459]));
+
+var G__9460 = (i__7626__auto___9459 + (1));
+i__7626__auto___9459 = G__9460;
+continue;
+} else {
+}
+break;
+}
+
+var G__9457 = args9452.length;
+switch (G__9457) {
+case 1:
+return cljs.core.max.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.max.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9452.slice((2)),(0),null));
+return cljs.core.max.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.max.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.max.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+var x__6848__auto__ = x;
+var y__6849__auto__ = y;
+return ((x__6848__auto__ > y__6849__auto__) ? x__6848__auto__ : y__6849__auto__);
+});
+
+cljs.core.max.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.max,(function (){var x__6848__auto__ = x;
+var y__6849__auto__ = y;
+return ((x__6848__auto__ > y__6849__auto__) ? x__6848__auto__ : y__6849__auto__);
+})(),more);
+});
+
+cljs.core.max.cljs$lang$applyTo = (function (seq9453){
+var G__9454 = cljs.core.first(seq9453);
+var seq9453__$1 = cljs.core.next(seq9453);
+var G__9455 = cljs.core.first(seq9453__$1);
+var seq9453__$2 = cljs.core.next(seq9453__$1);
+return cljs.core.max.cljs$core$IFn$_invoke$arity$variadic(G__9454,G__9455,seq9453__$2);
+});
+
+cljs.core.max.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns the least of the nums.
+ */
+cljs.core.min = (function cljs$core$min(var_args){
+var args9462 = [];
+var len__7625__auto___9468 = arguments.length;
+var i__7626__auto___9469 = (0);
+while(true){
+if((i__7626__auto___9469 < len__7625__auto___9468)){
+args9462.push((arguments[i__7626__auto___9469]));
+
+var G__9470 = (i__7626__auto___9469 + (1));
+i__7626__auto___9469 = G__9470;
+continue;
+} else {
+}
+break;
+}
+
+var G__9467 = args9462.length;
+switch (G__9467) {
+case 1:
+return cljs.core.min.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.min.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9462.slice((2)),(0),null));
+return cljs.core.min.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.min.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.min.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+var x__6855__auto__ = x;
+var y__6856__auto__ = y;
+return ((x__6855__auto__ < y__6856__auto__) ? x__6855__auto__ : y__6856__auto__);
+});
+
+cljs.core.min.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.min,(function (){var x__6855__auto__ = x;
+var y__6856__auto__ = y;
+return ((x__6855__auto__ < y__6856__auto__) ? x__6855__auto__ : y__6856__auto__);
+})(),more);
+});
+
+cljs.core.min.cljs$lang$applyTo = (function (seq9463){
+var G__9464 = cljs.core.first(seq9463);
+var seq9463__$1 = cljs.core.next(seq9463);
+var G__9465 = cljs.core.first(seq9463__$1);
+var seq9463__$2 = cljs.core.next(seq9463__$1);
+return cljs.core.min.cljs$core$IFn$_invoke$arity$variadic(G__9464,G__9465,seq9463__$2);
+});
+
+cljs.core.min.cljs$lang$maxFixedArity = (2);
+
+cljs.core.byte$ = (function cljs$core$byte(x){
+return x;
+});
+/**
+ * Coerce to char
+ */
+cljs.core.char$ = (function cljs$core$char(x){
+if(typeof x === 'number'){
+return String.fromCharCode(x);
+} else {
+if((typeof x === 'string') && ((x.length === (1)))){
+return x;
+} else {
+throw (new Error("Argument to char must be a character or number"));
+
+}
+}
+});
+cljs.core.short$ = (function cljs$core$short(x){
+return x;
+});
+cljs.core.float$ = (function cljs$core$float(x){
+return x;
+});
+cljs.core.double$ = (function cljs$core$double(x){
+return x;
+});
+cljs.core.unchecked_byte = (function cljs$core$unchecked_byte(x){
+return x;
+});
+cljs.core.unchecked_char = (function cljs$core$unchecked_char(x){
+return x;
+});
+cljs.core.unchecked_short = (function cljs$core$unchecked_short(x){
+return x;
+});
+cljs.core.unchecked_float = (function cljs$core$unchecked_float(x){
+return x;
+});
+cljs.core.unchecked_double = (function cljs$core$unchecked_double(x){
+return x;
+});
+/**
+ * Returns the sum of nums. (+) returns 0.
+ */
+cljs.core.unchecked_add = (function cljs$core$unchecked_add(var_args){
+var args9472 = [];
+var len__7625__auto___9478 = arguments.length;
+var i__7626__auto___9479 = (0);
+while(true){
+if((i__7626__auto___9479 < len__7625__auto___9478)){
+args9472.push((arguments[i__7626__auto___9479]));
+
+var G__9480 = (i__7626__auto___9479 + (1));
+i__7626__auto___9479 = G__9480;
+continue;
+} else {
+}
+break;
+}
+
+var G__9477 = args9472.length;
+switch (G__9477) {
+case 0:
+return cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9472.slice((2)),(0),null));
+return cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (0);
+});
+
+cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x + y);
+});
+
+cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_add,(x + y),more);
+});
+
+cljs.core.unchecked_add.cljs$lang$applyTo = (function (seq9473){
+var G__9474 = cljs.core.first(seq9473);
+var seq9473__$1 = cljs.core.next(seq9473);
+var G__9475 = cljs.core.first(seq9473__$1);
+var seq9473__$2 = cljs.core.next(seq9473__$1);
+return cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$variadic(G__9474,G__9475,seq9473__$2);
+});
+
+cljs.core.unchecked_add.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns the sum of nums. (+) returns 0.
+ */
+cljs.core.unchecked_add_int = (function cljs$core$unchecked_add_int(var_args){
+var args9482 = [];
+var len__7625__auto___9488 = arguments.length;
+var i__7626__auto___9489 = (0);
+while(true){
+if((i__7626__auto___9489 < len__7625__auto___9488)){
+args9482.push((arguments[i__7626__auto___9489]));
+
+var G__9490 = (i__7626__auto___9489 + (1));
+i__7626__auto___9489 = G__9490;
+continue;
+} else {
+}
+break;
+}
+
+var G__9487 = args9482.length;
+switch (G__9487) {
+case 0:
+return cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9482.slice((2)),(0),null));
+return cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (0);
+});
+
+cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x + y);
+});
+
+cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_add_int,(x + y),more);
+});
+
+cljs.core.unchecked_add_int.cljs$lang$applyTo = (function (seq9483){
+var G__9484 = cljs.core.first(seq9483);
+var seq9483__$1 = cljs.core.next(seq9483);
+var G__9485 = cljs.core.first(seq9483__$1);
+var seq9483__$2 = cljs.core.next(seq9483__$1);
+return cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$variadic(G__9484,G__9485,seq9483__$2);
+});
+
+cljs.core.unchecked_add_int.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns a number one less than x, an int.
+ */
+cljs.core.unchecked_dec = (function cljs$core$unchecked_dec(x){
+return (x - (1));
+});
+/**
+ * Returns a number one less than x, an int.
+ */
+cljs.core.unchecked_dec_int = (function cljs$core$unchecked_dec_int(x){
+return (x - (1));
+});
+/**
+ * If no denominators are supplied, returns 1/numerator,
+ * else returns numerator divided by all of the denominators.
+ */
+cljs.core.unchecked_divide_int = (function cljs$core$unchecked_divide_int(var_args){
+var args9492 = [];
+var len__7625__auto___9498 = arguments.length;
+var i__7626__auto___9499 = (0);
+while(true){
+if((i__7626__auto___9499 < len__7625__auto___9498)){
+args9492.push((arguments[i__7626__auto___9499]));
+
+var G__9500 = (i__7626__auto___9499 + (1));
+i__7626__auto___9499 = G__9500;
+continue;
+} else {
+}
+break;
+}
+
+var G__9497 = args9492.length;
+switch (G__9497) {
+case 1:
+return cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9492.slice((2)),(0),null));
+return cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return ((1) / x);
+});
+
+cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x / y);
+});
+
+cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_divide_int,(x / y),more);
+});
+
+cljs.core.unchecked_divide_int.cljs$lang$applyTo = (function (seq9493){
+var G__9494 = cljs.core.first(seq9493);
+var seq9493__$1 = cljs.core.next(seq9493);
+var G__9495 = cljs.core.first(seq9493__$1);
+var seq9493__$2 = cljs.core.next(seq9493__$1);
+return cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$variadic(G__9494,G__9495,seq9493__$2);
+});
+
+cljs.core.unchecked_divide_int.cljs$lang$maxFixedArity = (2);
+
+cljs.core.unchecked_inc = (function cljs$core$unchecked_inc(x){
+return (x + (1));
+});
+cljs.core.unchecked_inc_int = (function cljs$core$unchecked_inc_int(x){
+return (x + (1));
+});
+/**
+ * Returns the product of nums. (*) returns 1.
+ */
+cljs.core.unchecked_multiply = (function cljs$core$unchecked_multiply(var_args){
+var args9502 = [];
+var len__7625__auto___9508 = arguments.length;
+var i__7626__auto___9509 = (0);
+while(true){
+if((i__7626__auto___9509 < len__7625__auto___9508)){
+args9502.push((arguments[i__7626__auto___9509]));
+
+var G__9510 = (i__7626__auto___9509 + (1));
+i__7626__auto___9509 = G__9510;
+continue;
+} else {
+}
+break;
+}
+
+var G__9507 = args9502.length;
+switch (G__9507) {
+case 0:
+return cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9502.slice((2)),(0),null));
+return cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (1);
+});
+
+cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x * y);
+});
+
+cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_multiply,(x * y),more);
+});
+
+cljs.core.unchecked_multiply.cljs$lang$applyTo = (function (seq9503){
+var G__9504 = cljs.core.first(seq9503);
+var seq9503__$1 = cljs.core.next(seq9503);
+var G__9505 = cljs.core.first(seq9503__$1);
+var seq9503__$2 = cljs.core.next(seq9503__$1);
+return cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$variadic(G__9504,G__9505,seq9503__$2);
+});
+
+cljs.core.unchecked_multiply.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns the product of nums. (*) returns 1.
+ */
+cljs.core.unchecked_multiply_int = (function cljs$core$unchecked_multiply_int(var_args){
+var args9512 = [];
+var len__7625__auto___9518 = arguments.length;
+var i__7626__auto___9519 = (0);
+while(true){
+if((i__7626__auto___9519 < len__7625__auto___9518)){
+args9512.push((arguments[i__7626__auto___9519]));
+
+var G__9520 = (i__7626__auto___9519 + (1));
+i__7626__auto___9519 = G__9520;
+continue;
+} else {
+}
+break;
+}
+
+var G__9517 = args9512.length;
+switch (G__9517) {
+case 0:
+return cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9512.slice((2)),(0),null));
+return cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (1);
+});
+
+cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x * y);
+});
+
+cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_multiply_int,(x * y),more);
+});
+
+cljs.core.unchecked_multiply_int.cljs$lang$applyTo = (function (seq9513){
+var G__9514 = cljs.core.first(seq9513);
+var seq9513__$1 = cljs.core.next(seq9513);
+var G__9515 = cljs.core.first(seq9513__$1);
+var seq9513__$2 = cljs.core.next(seq9513__$1);
+return cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$variadic(G__9514,G__9515,seq9513__$2);
+});
+
+cljs.core.unchecked_multiply_int.cljs$lang$maxFixedArity = (2);
+
+cljs.core.unchecked_negate = (function cljs$core$unchecked_negate(x){
+return (- x);
+});
+cljs.core.unchecked_negate_int = (function cljs$core$unchecked_negate_int(x){
+return (- x);
+});
+cljs.core.unchecked_remainder_int = (function cljs$core$unchecked_remainder_int(x,n){
+return (cljs.core.mod.cljs$core$IFn$_invoke$arity$2 ? cljs.core.mod.cljs$core$IFn$_invoke$arity$2(x,n) : cljs.core.mod.call(null,x,n));
+});
+/**
+ * If no ys are supplied, returns the negation of x, else subtracts
+ * the ys from x and returns the result.
+ */
+cljs.core.unchecked_subtract = (function cljs$core$unchecked_subtract(var_args){
+var args9522 = [];
+var len__7625__auto___9528 = arguments.length;
+var i__7626__auto___9529 = (0);
+while(true){
+if((i__7626__auto___9529 < len__7625__auto___9528)){
+args9522.push((arguments[i__7626__auto___9529]));
+
+var G__9530 = (i__7626__auto___9529 + (1));
+i__7626__auto___9529 = G__9530;
+continue;
+} else {
+}
+break;
+}
+
+var G__9527 = args9522.length;
+switch (G__9527) {
+case 1:
+return cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9522.slice((2)),(0),null));
+return cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (- x);
+});
+
+cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x - y);
+});
+
+cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_subtract,(x - y),more);
+});
+
+cljs.core.unchecked_subtract.cljs$lang$applyTo = (function (seq9523){
+var G__9524 = cljs.core.first(seq9523);
+var seq9523__$1 = cljs.core.next(seq9523);
+var G__9525 = cljs.core.first(seq9523__$1);
+var seq9523__$2 = cljs.core.next(seq9523__$1);
+return cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$variadic(G__9524,G__9525,seq9523__$2);
+});
+
+cljs.core.unchecked_subtract.cljs$lang$maxFixedArity = (2);
+
+/**
+ * If no ys are supplied, returns the negation of x, else subtracts
+ * the ys from x and returns the result.
+ */
+cljs.core.unchecked_subtract_int = (function cljs$core$unchecked_subtract_int(var_args){
+var args9532 = [];
+var len__7625__auto___9538 = arguments.length;
+var i__7626__auto___9539 = (0);
+while(true){
+if((i__7626__auto___9539 < len__7625__auto___9538)){
+args9532.push((arguments[i__7626__auto___9539]));
+
+var G__9540 = (i__7626__auto___9539 + (1));
+i__7626__auto___9539 = G__9540;
+continue;
+} else {
+}
+break;
+}
+
+var G__9537 = args9532.length;
+switch (G__9537) {
+case 1:
+return cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9532.slice((2)),(0),null));
+return cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (- x);
+});
+
+cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x - y);
+});
+
+cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_subtract_int,(x - y),more);
+});
+
+cljs.core.unchecked_subtract_int.cljs$lang$applyTo = (function (seq9533){
+var G__9534 = cljs.core.first(seq9533);
+var seq9533__$1 = cljs.core.next(seq9533);
+var G__9535 = cljs.core.first(seq9533__$1);
+var seq9533__$2 = cljs.core.next(seq9533__$1);
+return cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$variadic(G__9534,G__9535,seq9533__$2);
+});
+
+cljs.core.unchecked_subtract_int.cljs$lang$maxFixedArity = (2);
+
+cljs.core.fix = (function cljs$core$fix(q){
+if((q >= (0))){
+return Math.floor(q);
+} else {
+return Math.ceil(q);
+}
+});
+/**
+ * Coerce to int by stripping decimal places.
+ */
+cljs.core.int$ = (function cljs$core$int(x){
+return (x | (0));
+});
+/**
+ * Coerce to int by stripping decimal places.
+ */
+cljs.core.unchecked_int = (function cljs$core$unchecked_int(x){
+return cljs.core.fix(x);
+});
+/**
+ * Coerce to long by stripping decimal places. Identical to `int'.
+ */
+cljs.core.long$ = (function cljs$core$long(x){
+return cljs.core.fix(x);
+});
+/**
+ * Coerce to long by stripping decimal places. Identical to `int'.
+ */
+cljs.core.unchecked_long = (function cljs$core$unchecked_long(x){
+return cljs.core.fix(x);
+});
+cljs.core.booleans = (function cljs$core$booleans(x){
+return x;
+});
+cljs.core.bytes = (function cljs$core$bytes(x){
+return x;
+});
+cljs.core.chars = (function cljs$core$chars(x){
+return x;
+});
+cljs.core.shorts = (function cljs$core$shorts(x){
+return x;
+});
+cljs.core.ints = (function cljs$core$ints(x){
+return x;
+});
+cljs.core.floats = (function cljs$core$floats(x){
+return x;
+});
+cljs.core.doubles = (function cljs$core$doubles(x){
+return x;
+});
+cljs.core.longs = (function cljs$core$longs(x){
+return x;
+});
+/**
+ * Modulus of num and div with original javascript behavior. i.e. bug for negative numbers
+ */
+cljs.core.js_mod = (function cljs$core$js_mod(n,d){
+return (n % d);
+});
+/**
+ * Modulus of num and div. Truncates toward negative infinity.
+ */
+cljs.core.mod = (function cljs$core$mod(n,d){
+return (((n % d) + d) % d);
+});
+/**
+ * quot[ient] of dividing numerator by denominator.
+ */
+cljs.core.quot = (function cljs$core$quot(n,d){
+var rem = (n % d);
+return cljs.core.fix(((n - rem) / d));
+});
+/**
+ * remainder of dividing numerator by denominator.
+ */
+cljs.core.rem = (function cljs$core$rem(n,d){
+var q = cljs.core.quot(n,d);
+return (n - (d * q));
+});
+/**
+ * Bitwise exclusive or
+ */
+cljs.core.bit_xor = (function cljs$core$bit_xor(var_args){
+var args9542 = [];
+var len__7625__auto___9548 = arguments.length;
+var i__7626__auto___9549 = (0);
+while(true){
+if((i__7626__auto___9549 < len__7625__auto___9548)){
+args9542.push((arguments[i__7626__auto___9549]));
+
+var G__9550 = (i__7626__auto___9549 + (1));
+i__7626__auto___9549 = G__9550;
+continue;
+} else {
+}
+break;
+}
+
+var G__9547 = args9542.length;
+switch (G__9547) {
+case 2:
+return cljs.core.bit_xor.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9542.slice((2)),(0),null));
+return cljs.core.bit_xor.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.bit_xor.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x ^ y);
+});
+
+cljs.core.bit_xor.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.bit_xor,(x ^ y),more);
+});
+
+cljs.core.bit_xor.cljs$lang$applyTo = (function (seq9543){
+var G__9544 = cljs.core.first(seq9543);
+var seq9543__$1 = cljs.core.next(seq9543);
+var G__9545 = cljs.core.first(seq9543__$1);
+var seq9543__$2 = cljs.core.next(seq9543__$1);
+return cljs.core.bit_xor.cljs$core$IFn$_invoke$arity$variadic(G__9544,G__9545,seq9543__$2);
+});
+
+cljs.core.bit_xor.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Bitwise and
+ */
+cljs.core.bit_and = (function cljs$core$bit_and(var_args){
+var args9552 = [];
+var len__7625__auto___9558 = arguments.length;
+var i__7626__auto___9559 = (0);
+while(true){
+if((i__7626__auto___9559 < len__7625__auto___9558)){
+args9552.push((arguments[i__7626__auto___9559]));
+
+var G__9560 = (i__7626__auto___9559 + (1));
+i__7626__auto___9559 = G__9560;
+continue;
+} else {
+}
+break;
+}
+
+var G__9557 = args9552.length;
+switch (G__9557) {
+case 2:
+return cljs.core.bit_and.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9552.slice((2)),(0),null));
+return cljs.core.bit_and.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.bit_and.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x & y);
+});
+
+cljs.core.bit_and.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.bit_and,(x & y),more);
+});
+
+cljs.core.bit_and.cljs$lang$applyTo = (function (seq9553){
+var G__9554 = cljs.core.first(seq9553);
+var seq9553__$1 = cljs.core.next(seq9553);
+var G__9555 = cljs.core.first(seq9553__$1);
+var seq9553__$2 = cljs.core.next(seq9553__$1);
+return cljs.core.bit_and.cljs$core$IFn$_invoke$arity$variadic(G__9554,G__9555,seq9553__$2);
+});
+
+cljs.core.bit_and.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Bitwise or
+ */
+cljs.core.bit_or = (function cljs$core$bit_or(var_args){
+var args9562 = [];
+var len__7625__auto___9568 = arguments.length;
+var i__7626__auto___9569 = (0);
+while(true){
+if((i__7626__auto___9569 < len__7625__auto___9568)){
+args9562.push((arguments[i__7626__auto___9569]));
+
+var G__9570 = (i__7626__auto___9569 + (1));
+i__7626__auto___9569 = G__9570;
+continue;
+} else {
+}
+break;
+}
+
+var G__9567 = args9562.length;
+switch (G__9567) {
+case 2:
+return cljs.core.bit_or.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9562.slice((2)),(0),null));
+return cljs.core.bit_or.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.bit_or.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x | y);
+});
+
+cljs.core.bit_or.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.bit_or,(x | y),more);
+});
+
+cljs.core.bit_or.cljs$lang$applyTo = (function (seq9563){
+var G__9564 = cljs.core.first(seq9563);
+var seq9563__$1 = cljs.core.next(seq9563);
+var G__9565 = cljs.core.first(seq9563__$1);
+var seq9563__$2 = cljs.core.next(seq9563__$1);
+return cljs.core.bit_or.cljs$core$IFn$_invoke$arity$variadic(G__9564,G__9565,seq9563__$2);
+});
+
+cljs.core.bit_or.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Bitwise and with complement
+ */
+cljs.core.bit_and_not = (function cljs$core$bit_and_not(var_args){
+var args9572 = [];
+var len__7625__auto___9578 = arguments.length;
+var i__7626__auto___9579 = (0);
+while(true){
+if((i__7626__auto___9579 < len__7625__auto___9578)){
+args9572.push((arguments[i__7626__auto___9579]));
+
+var G__9580 = (i__7626__auto___9579 + (1));
+i__7626__auto___9579 = G__9580;
+continue;
+} else {
+}
+break;
+}
+
+var G__9577 = args9572.length;
+switch (G__9577) {
+case 2:
+return cljs.core.bit_and_not.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9572.slice((2)),(0),null));
+return cljs.core.bit_and_not.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.bit_and_not.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x & ~y);
+});
+
+cljs.core.bit_and_not.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.bit_and_not,(x & ~y),more);
+});
+
+cljs.core.bit_and_not.cljs$lang$applyTo = (function (seq9573){
+var G__9574 = cljs.core.first(seq9573);
+var seq9573__$1 = cljs.core.next(seq9573);
+var G__9575 = cljs.core.first(seq9573__$1);
+var seq9573__$2 = cljs.core.next(seq9573__$1);
+return cljs.core.bit_and_not.cljs$core$IFn$_invoke$arity$variadic(G__9574,G__9575,seq9573__$2);
+});
+
+cljs.core.bit_and_not.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Clear bit at index n
+ */
+cljs.core.bit_clear = (function cljs$core$bit_clear(x,n){
+return (x & ~(1 << n));
+});
+/**
+ * Flip bit at index n
+ */
+cljs.core.bit_flip = (function cljs$core$bit_flip(x,n){
+return (x ^ (1 << n));
+});
+/**
+ * Bitwise complement
+ */
+cljs.core.bit_not = (function cljs$core$bit_not(x){
+return (~ x);
+});
+/**
+ * Set bit at index n
+ */
+cljs.core.bit_set = (function cljs$core$bit_set(x,n){
+return (x | (1 << n));
+});
+/**
+ * Test bit at index n
+ */
+cljs.core.bit_test = (function cljs$core$bit_test(x,n){
+return ((x & (1 << n)) != 0);
+});
+/**
+ * Bitwise shift left
+ */
+cljs.core.bit_shift_left = (function cljs$core$bit_shift_left(x,n){
+return (x << n);
+});
+/**
+ * Bitwise shift right
+ */
+cljs.core.bit_shift_right = (function cljs$core$bit_shift_right(x,n){
+return (x >> n);
+});
+/**
+ * DEPRECATED: Bitwise shift right with zero fill
+ */
+cljs.core.bit_shift_right_zero_fill = (function cljs$core$bit_shift_right_zero_fill(x,n){
+return (x >>> n);
+});
+/**
+ * Bitwise shift right with zero fill
+ */
+cljs.core.unsigned_bit_shift_right = (function cljs$core$unsigned_bit_shift_right(x,n){
+return (x >>> n);
+});
+/**
+ * Counts the number of bits set in n
+ */
+cljs.core.bit_count = (function cljs$core$bit_count(v){
+var v__$1 = (v - ((v >> (1)) & (1431655765)));
+var v__$2 = ((v__$1 & (858993459)) + ((v__$1 >> (2)) & (858993459)));
+return ((((v__$2 + (v__$2 >> (4))) & (252645135)) * (16843009)) >> (24));
+});
+/**
+ * Returns non-nil if nums all have the equivalent
+ * value, otherwise false. Behavior on non nums is
+ * undefined.
+ */
+cljs.core._EQ__EQ_ = (function cljs$core$_EQ__EQ_(var_args){
+var args9582 = [];
+var len__7625__auto___9588 = arguments.length;
+var i__7626__auto___9589 = (0);
+while(true){
+if((i__7626__auto___9589 < len__7625__auto___9588)){
+args9582.push((arguments[i__7626__auto___9589]));
+
+var G__9590 = (i__7626__auto___9589 + (1));
+i__7626__auto___9589 = G__9590;
+continue;
+} else {
+}
+break;
+}
+
+var G__9587 = args9582.length;
+switch (G__9587) {
+case 1:
+return cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9582.slice((2)),(0),null));
+return cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return cljs.core._equiv(x,y);
+});
+
+cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if((x === y)){
+if(cljs.core.next(more)){
+var G__9592 = y;
+var G__9593 = cljs.core.first(more);
+var G__9594 = cljs.core.next(more);
+x = G__9592;
+y = G__9593;
+more = G__9594;
+continue;
+} else {
+return (y === cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+cljs.core._EQ__EQ_.cljs$lang$applyTo = (function (seq9583){
+var G__9584 = cljs.core.first(seq9583);
+var seq9583__$1 = cljs.core.next(seq9583);
+var G__9585 = cljs.core.first(seq9583__$1);
+var seq9583__$2 = cljs.core.next(seq9583__$1);
+return cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$variadic(G__9584,G__9585,seq9583__$2);
+});
+
+cljs.core._EQ__EQ_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns true if num is greater than zero, else false
+ */
+cljs.core.pos_QMARK_ = (function cljs$core$pos_QMARK_(x){
+return (x > (0));
+});
+/**
+ * Returns true if num is zero, else false
+ */
+cljs.core.zero_QMARK_ = (function cljs$core$zero_QMARK_(x){
+return (x === (0));
+});
+/**
+ * Returns true if num is less than zero, else false
+ */
+cljs.core.neg_QMARK_ = (function cljs$core$neg_QMARK_(x){
+return (x < (0));
+});
+/**
+ * Returns the nth next of coll, (seq coll) when n is 0.
+ */
+cljs.core.nthnext = (function cljs$core$nthnext(coll,n){
+var n__$1 = n;
+var xs = cljs.core.seq(coll);
+while(true){
+if((xs) && ((n__$1 > (0)))){
+var G__9595 = (n__$1 - (1));
+var G__9596 = cljs.core.next(xs);
+n__$1 = G__9595;
+xs = G__9596;
+continue;
+} else {
+return xs;
+}
+break;
+}
+});
+/**
+ * With no args, returns the empty string. With one arg x, returns
+ * x.toString(). (str nil) returns the empty string. With more than
+ * one arg, returns the concatenation of the str values of the args.
+ */
+cljs.core.str = (function cljs$core$str(var_args){
+var args9597 = [];
+var len__7625__auto___9602 = arguments.length;
+var i__7626__auto___9603 = (0);
+while(true){
+if((i__7626__auto___9603 < len__7625__auto___9602)){
+args9597.push((arguments[i__7626__auto___9603]));
+
+var G__9604 = (i__7626__auto___9603 + (1));
+i__7626__auto___9603 = G__9604;
+continue;
+} else {
+}
+break;
+}
+
+var G__9601 = args9597.length;
+switch (G__9601) {
+case 0:
+return cljs.core.str.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.str.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9597.slice((1)),(0),null));
+return cljs.core.str.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.str.cljs$core$IFn$_invoke$arity$0 = (function (){
+return "";
+});
+
+cljs.core.str.cljs$core$IFn$_invoke$arity$1 = (function (x){
+if((x == null)){
+return "";
+} else {
+return [x].join("");
+}
+});
+
+cljs.core.str.cljs$core$IFn$_invoke$arity$variadic = (function (x,ys){
+var sb = (new goog.string.StringBuffer([cljs.core.str.cljs$core$IFn$_invoke$arity$1(x)].join('')));
+var more = ys;
+while(true){
+if(cljs.core.truth_(more)){
+var G__9606 = sb.append([cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.first(more))].join(''));
+var G__9607 = cljs.core.next(more);
+sb = G__9606;
+more = G__9607;
+continue;
+} else {
+return sb.toString();
+}
+break;
+}
+});
+
+cljs.core.str.cljs$lang$applyTo = (function (seq9598){
+var G__9599 = cljs.core.first(seq9598);
+var seq9598__$1 = cljs.core.next(seq9598);
+return cljs.core.str.cljs$core$IFn$_invoke$arity$variadic(G__9599,seq9598__$1);
+});
+
+cljs.core.str.cljs$lang$maxFixedArity = (1);
+
+/**
+ * Returns the substring of s beginning at start inclusive, and ending
+ * at end (defaults to length of string), exclusive.
+ */
+cljs.core.subs = (function cljs$core$subs(var_args){
+var args9608 = [];
+var len__7625__auto___9611 = arguments.length;
+var i__7626__auto___9612 = (0);
+while(true){
+if((i__7626__auto___9612 < len__7625__auto___9611)){
+args9608.push((arguments[i__7626__auto___9612]));
+
+var G__9613 = (i__7626__auto___9612 + (1));
+i__7626__auto___9612 = G__9613;
+continue;
+} else {
+}
+break;
+}
+
+var G__9610 = args9608.length;
+switch (G__9610) {
+case 2:
+return cljs.core.subs.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.subs.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9608.length)].join('')));
+
+}
+});
+
+cljs.core.subs.cljs$core$IFn$_invoke$arity$2 = (function (s,start){
+return s.substring(start);
+});
+
+cljs.core.subs.cljs$core$IFn$_invoke$arity$3 = (function (s,start,end){
+return s.substring(start,end);
+});
+
+cljs.core.subs.cljs$lang$maxFixedArity = 3;
+
+
+/**
+ * Assumes x is sequential. Returns true if x equals y, otherwise
+ * returns false.
+ */
+cljs.core.equiv_sequential = (function cljs$core$equiv_sequential(x,y){
+return cljs.core.boolean$(((cljs.core.sequential_QMARK_(y))?(((cljs.core.counted_QMARK_(x)) && (cljs.core.counted_QMARK_(y)) && (!((cljs.core.count(x) === cljs.core.count(y)))))?false:(function (){var xs = cljs.core.seq(x);
+var ys = cljs.core.seq(y);
+while(true){
+if((xs == null)){
+return (ys == null);
+} else {
+if((ys == null)){
+return false;
+} else {
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.first(xs),cljs.core.first(ys))){
+var G__9615 = cljs.core.next(xs);
+var G__9616 = cljs.core.next(ys);
+xs = G__9615;
+ys = G__9616;
+continue;
+} else {
+return false;
+
+}
+}
+}
+break;
+}
+})()):null));
+});
+cljs.core.hash_coll = (function cljs$core$hash_coll(coll){
+if(cljs.core.seq(coll)){
+var res = cljs.core.hash(cljs.core.first(coll));
+var s = cljs.core.next(coll);
+while(true){
+if((s == null)){
+return res;
+} else {
+var G__9617 = cljs.core.hash_combine(res,cljs.core.hash(cljs.core.first(s)));
+var G__9618 = cljs.core.next(s);
+res = G__9617;
+s = G__9618;
+continue;
+}
+break;
+}
+} else {
+return (0);
+}
+});
+
+cljs.core.hash_imap = (function cljs$core$hash_imap(m){
+var h = (0);
+var s = cljs.core.seq(m);
+while(true){
+if(s){
+var e = cljs.core.first(s);
+var G__9619 = ((h + (cljs.core.hash((cljs.core.key.cljs$core$IFn$_invoke$arity$1 ? cljs.core.key.cljs$core$IFn$_invoke$arity$1(e) : cljs.core.key.call(null,e))) ^ cljs.core.hash((cljs.core.val.cljs$core$IFn$_invoke$arity$1 ? cljs.core.val.cljs$core$IFn$_invoke$arity$1(e) : cljs.core.val.call(null,e))))) % (4503599627370496));
+var G__9620 = cljs.core.next(s);
+h = G__9619;
+s = G__9620;
+continue;
+} else {
+return h;
+}
+break;
+}
+});
+cljs.core.hash_iset = (function cljs$core$hash_iset(s){
+var h = (0);
+var s__$1 = cljs.core.seq(s);
+while(true){
+if(s__$1){
+var e = cljs.core.first(s__$1);
+var G__9621 = ((h + cljs.core.hash(e)) % (4503599627370496));
+var G__9622 = cljs.core.next(s__$1);
+h = G__9621;
+s__$1 = G__9622;
+continue;
+} else {
+return h;
+}
+break;
+}
+});
+
+
+/**
+ * Takes a JavaScript object and a map of names to functions and
+ * attaches said functions as methods on the object. Any references to
+ * JavaScript's implicit this (via the this-as macro) will resolve to the
+ * object that the function is attached.
+ */
+cljs.core.extend_object_BANG_ = (function cljs$core$extend_object_BANG_(obj,fn_map){
+var seq__9633_9643 = cljs.core.seq(fn_map);
+var chunk__9634_9644 = null;
+var count__9635_9645 = (0);
+var i__9636_9646 = (0);
+while(true){
+if((i__9636_9646 < count__9635_9645)){
+var vec__9637_9647 = chunk__9634_9644.cljs$core$IIndexed$_nth$arity$2(null,i__9636_9646);
+var key_name_9648 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__9637_9647,(0),null);
+var f_9649 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__9637_9647,(1),null);
+var str_name_9650 = (cljs.core.name.cljs$core$IFn$_invoke$arity$1 ? cljs.core.name.cljs$core$IFn$_invoke$arity$1(key_name_9648) : cljs.core.name.call(null,key_name_9648));
+(obj[str_name_9650] = f_9649);
+
+var G__9651 = seq__9633_9643;
+var G__9652 = chunk__9634_9644;
+var G__9653 = count__9635_9645;
+var G__9654 = (i__9636_9646 + (1));
+seq__9633_9643 = G__9651;
+chunk__9634_9644 = G__9652;
+count__9635_9645 = G__9653;
+i__9636_9646 = G__9654;
+continue;
+} else {
+var temp__4657__auto___9655 = cljs.core.seq(seq__9633_9643);
+if(temp__4657__auto___9655){
+var seq__9633_9656__$1 = temp__4657__auto___9655;
+if(cljs.core.chunked_seq_QMARK_(seq__9633_9656__$1)){
+var c__7331__auto___9657 = (cljs.core.chunk_first.cljs$core$IFn$_invoke$arity$1 ? cljs.core.chunk_first.cljs$core$IFn$_invoke$arity$1(seq__9633_9656__$1) : cljs.core.chunk_first.call(null,seq__9633_9656__$1));
+var G__9658 = (cljs.core.chunk_rest.cljs$core$IFn$_invoke$arity$1 ? cljs.core.chunk_rest.cljs$core$IFn$_invoke$arity$1(seq__9633_9656__$1) : cljs.core.chunk_rest.call(null,seq__9633_9656__$1));
+var G__9659 = c__7331__auto___9657;
+var G__9660 = cljs.core.count(c__7331__auto___9657);
+var G__9661 = (0);
+seq__9633_9643 = G__9658;
+chunk__9634_9644 = G__9659;
+count__9635_9645 = G__9660;
+i__9636_9646 = G__9661;
+continue;
+} else {
+var vec__9640_9662 = cljs.core.first(seq__9633_9656__$1);
+var key_name_9663 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__9640_9662,(0),null);
+var f_9664 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__9640_9662,(1),null);
+var str_name_9665 = (cljs.core.name.cljs$core$IFn$_invoke$arity$1 ? cljs.core.name.cljs$core$IFn$_invoke$arity$1(key_name_9663) : cljs.core.name.call(null,key_name_9663));
+(obj[str_name_9665] = f_9664);
+
+var G__9666 = cljs.core.next(seq__9633_9656__$1);
+var G__9667 = null;
+var G__9668 = (0);
+var G__9669 = (0);
+seq__9633_9643 = G__9666;
+chunk__9634_9644 = G__9667;
+count__9635_9645 = G__9668;
+i__9636_9646 = G__9669;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+return obj;
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IList}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ASeq}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.List = (function (meta,first,rest,count,__hash){
+this.meta = meta;
+this.first = first;
+this.rest = rest;
+this.count = count;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 65937646;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+})
+cljs.core.List.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.List.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.List.prototype.indexOf = (function() {
+var G__9670 = null;
+var G__9670__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__9670__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9670 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9670__1.call(this,x);
+case 2:
+return G__9670__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9670.cljs$core$IFn$_invoke$arity$1 = G__9670__1;
+G__9670.cljs$core$IFn$_invoke$arity$2 = G__9670__2;
+return G__9670;
+})()
+;
+
+cljs.core.List.prototype.lastIndexOf = (function() {
+var G__9671 = null;
+var G__9671__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,self__.count);
+});
+var G__9671__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9671 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9671__1.call(this,x);
+case 2:
+return G__9671__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9671.cljs$core$IFn$_invoke$arity$1 = G__9671__1;
+G__9671.cljs$core$IFn$_invoke$arity$2 = G__9671__2;
+return G__9671;
+})()
+;
+
+cljs.core.List.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.List.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.List(self__.meta,self__.first,self__.rest,self__.count,self__.__hash));
+});
+
+cljs.core.List.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.count === (1))){
+return null;
+} else {
+return self__.rest;
+}
+});
+
+cljs.core.List.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.count;
+});
+
+cljs.core.List.prototype.cljs$core$IStack$_peek$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.first;
+});
+
+cljs.core.List.prototype.cljs$core$IStack$_pop$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ISeq$_rest$arity$1(null);
+});
+
+cljs.core.List.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.List.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.List.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.List.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.List.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.List.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.first;
+});
+
+cljs.core.List.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.count === (1))){
+return cljs.core.List.EMPTY;
+} else {
+return self__.rest;
+}
+});
+
+cljs.core.List.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.List.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.List(meta__$1,self__.first,self__.rest,self__.count,self__.__hash));
+});
+
+cljs.core.List.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.List(self__.meta,o,coll__$1,(self__.count + (1)),null));
+});
+
+cljs.core.List.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"first","first",996428481,null),new cljs.core.Symbol(null,"rest","rest",398835108,null),new cljs.core.Symbol(null,"count","count",-514511684,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.List.cljs$lang$type = true;
+
+cljs.core.List.cljs$lang$ctorStr = "cljs.core/List";
+
+cljs.core.List.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/List");
+});
+
+cljs.core.__GT_List = (function cljs$core$__GT_List(meta,first,rest,count,__hash){
+return (new cljs.core.List(meta,first,rest,count,__hash));
+});
+
+/**
+ * Returns true if x implements IList
+ */
+cljs.core.list_QMARK_ = (function cljs$core$list_QMARK_(x){
+if(!((x == null))){
+if(((x.cljs$lang$protocol_mask$partition0$ & (33554432))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IList$))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IList,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IList,x);
+}
+});
+(cljs.core.List.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+
+/**
+* @constructor
+ * @implements {cljs.core.IList}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.EmptyList = (function (meta){
+this.meta = meta;
+this.cljs$lang$protocol_mask$partition0$ = 65937614;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+})
+cljs.core.EmptyList.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.EmptyList.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.EmptyList.prototype.indexOf = (function() {
+var G__9674 = null;
+var G__9674__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__9674__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9674 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9674__1.call(this,x);
+case 2:
+return G__9674__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9674.cljs$core$IFn$_invoke$arity$1 = G__9674__1;
+G__9674.cljs$core$IFn$_invoke$arity$2 = G__9674__2;
+return G__9674;
+})()
+;
+
+cljs.core.EmptyList.prototype.lastIndexOf = (function() {
+var G__9675 = null;
+var G__9675__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__9675__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9675 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9675__1.call(this,x);
+case 2:
+return G__9675__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9675.cljs$core$IFn$_invoke$arity$1 = G__9675__1;
+G__9675.cljs$core$IFn$_invoke$arity$2 = G__9675__2;
+return G__9675;
+})()
+;
+
+cljs.core.EmptyList.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.EmptyList(self__.meta));
+});
+
+cljs.core.EmptyList.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return null;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (0);
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IStack$_peek$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return null;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IStack$_pop$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+throw (new Error("Can't pop empty list"));
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.empty_ordered_hash;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+if((cljs.core.list_QMARK_(other)) || (cljs.core.sequential_QMARK_(other))){
+return (cljs.core.seq(other) == null);
+} else {
+return false;
+}
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return null;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.List.EMPTY;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return null;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.EmptyList(meta__$1));
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.List(self__.meta,o,null,(1),null));
+});
+
+cljs.core.EmptyList.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null)], null);
+});
+
+cljs.core.EmptyList.cljs$lang$type = true;
+
+cljs.core.EmptyList.cljs$lang$ctorStr = "cljs.core/EmptyList";
+
+cljs.core.EmptyList.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/EmptyList");
+});
+
+cljs.core.__GT_EmptyList = (function cljs$core$__GT_EmptyList(meta){
+return (new cljs.core.EmptyList(meta));
+});
+
+cljs.core.List.EMPTY = (new cljs.core.EmptyList(null));
+(cljs.core.EmptyList.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+/**
+ * Returns true if coll satisfies? IReversible.
+ */
+cljs.core.reversible_QMARK_ = (function cljs$core$reversible_QMARK_(coll){
+if(!((coll == null))){
+if(((coll.cljs$lang$protocol_mask$partition0$ & (134217728))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$IReversible$))){
+return true;
+} else {
+if((!coll.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IReversible,coll);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IReversible,coll);
+}
+});
+/**
+ * Returns, in constant time, a seq of the items in rev (which
+ * can be a vector or sorted-map), in reverse order. If rev is empty returns nil
+ */
+cljs.core.rseq = (function cljs$core$rseq(rev){
+return cljs.core._rseq(rev);
+});
+/**
+ * Returns a seq of the items in coll in reverse order. Not lazy.
+ */
+cljs.core.reverse = (function cljs$core$reverse(coll){
+if(cljs.core.reversible_QMARK_(coll)){
+return cljs.core.rseq(coll);
+} else {
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.conj,cljs.core.List.EMPTY,coll);
+}
+});
+/**
+ * Creates a new list containing the items.
+ */
+cljs.core.list = (function cljs$core$list(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___9679 = arguments.length;
+var i__7626__auto___9680 = (0);
+while(true){
+if((i__7626__auto___9680 < len__7625__auto___9679)){
+args__7632__auto__.push((arguments[i__7626__auto___9680]));
+
+var G__9681 = (i__7626__auto___9680 + (1));
+i__7626__auto___9680 = G__9681;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.list.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.list.cljs$core$IFn$_invoke$arity$variadic = (function (xs){
+var arr = ((((xs instanceof cljs.core.IndexedSeq)) && ((xs.i === (0))))?xs.arr:(function (){var arr = [];
+var xs__$1 = xs;
+while(true){
+if(!((xs__$1 == null))){
+arr.push(xs__$1.cljs$core$ISeq$_first$arity$1(null));
+
+var G__9682 = xs__$1.cljs$core$INext$_next$arity$1(null);
+xs__$1 = G__9682;
+continue;
+} else {
+return arr;
+}
+break;
+}
+})());
+var i = arr.length;
+var r = cljs.core.List.EMPTY;
+while(true){
+if((i > (0))){
+var G__9683 = (i - (1));
+var G__9684 = r.cljs$core$ICollection$_conj$arity$2(null,(arr[(i - (1))]));
+i = G__9683;
+r = G__9684;
+continue;
+} else {
+return r;
+}
+break;
+}
+});
+
+cljs.core.list.cljs$lang$maxFixedArity = (0);
+
+cljs.core.list.cljs$lang$applyTo = (function (seq9678){
+return cljs.core.list.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq9678));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IList}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ASeq}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Cons = (function (meta,first,rest,__hash){
+this.meta = meta;
+this.first = first;
+this.rest = rest;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 65929452;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+})
+cljs.core.Cons.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.Cons.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Cons.prototype.indexOf = (function() {
+var G__9685 = null;
+var G__9685__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__9685__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9685 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9685__1.call(this,x);
+case 2:
+return G__9685__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9685.cljs$core$IFn$_invoke$arity$1 = G__9685__1;
+G__9685.cljs$core$IFn$_invoke$arity$2 = G__9685__2;
+return G__9685;
+})()
+;
+
+cljs.core.Cons.prototype.lastIndexOf = (function() {
+var G__9686 = null;
+var G__9686__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__9686__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9686 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9686__1.call(this,x);
+case 2:
+return G__9686__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9686.cljs$core$IFn$_invoke$arity$1 = G__9686__1;
+G__9686.cljs$core$IFn$_invoke$arity$2 = G__9686__2;
+return G__9686;
+})()
+;
+
+cljs.core.Cons.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.Cons.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.Cons(self__.meta,self__.first,self__.rest,self__.__hash));
+});
+
+cljs.core.Cons.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.rest == null)){
+return null;
+} else {
+return cljs.core.seq(self__.rest);
+}
+});
+
+cljs.core.Cons.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.Cons.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.Cons.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.Cons.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.Cons.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.Cons.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.first;
+});
+
+cljs.core.Cons.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.rest == null)){
+return cljs.core.List.EMPTY;
+} else {
+return self__.rest;
+}
+});
+
+cljs.core.Cons.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.Cons.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.Cons(meta__$1,self__.first,self__.rest,self__.__hash));
+});
+
+cljs.core.Cons.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.Cons(null,o,coll__$1,null));
+});
+
+cljs.core.Cons.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"first","first",996428481,null),new cljs.core.Symbol(null,"rest","rest",398835108,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Cons.cljs$lang$type = true;
+
+cljs.core.Cons.cljs$lang$ctorStr = "cljs.core/Cons";
+
+cljs.core.Cons.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Cons");
+});
+
+cljs.core.__GT_Cons = (function cljs$core$__GT_Cons(meta,first,rest,__hash){
+return (new cljs.core.Cons(meta,first,rest,__hash));
+});
+
+(cljs.core.Cons.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+/**
+ * Returns a new seq where x is the first element and coll is the rest.
+ */
+cljs.core.cons = (function cljs$core$cons(x,coll){
+if((function (){var or__6512__auto__ = (coll == null);
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+if(!((coll == null))){
+if(((coll.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeq$))){
+return true;
+} else {
+return false;
+}
+} else {
+return false;
+}
+}
+})()){
+return (new cljs.core.Cons(null,x,coll,null));
+} else {
+return (new cljs.core.Cons(null,x,cljs.core.seq(coll),null));
+}
+});
+cljs.core.hash_keyword = (function cljs$core$hash_keyword(k){
+return ((cljs.core.hash_symbol(k) + (2654435769)) | (0));
+});
+cljs.core.compare_keywords = (function cljs$core$compare_keywords(a,b){
+if((a.fqn === b.fqn)){
+return (0);
+} else {
+if(cljs.core.truth_((function (){var and__6500__auto__ = cljs.core.not(a.ns);
+if(and__6500__auto__){
+return b.ns;
+} else {
+return and__6500__auto__;
+}
+})())){
+return (-1);
+} else {
+if(cljs.core.truth_(a.ns)){
+if(cljs.core.not(b.ns)){
+return (1);
+} else {
+var nsc = (function (){var G__9697 = a.ns;
+var G__9698 = b.ns;
+return goog.array.defaultCompare(G__9697,G__9698);
+})();
+if(((0) === nsc)){
+var G__9699 = a.name;
+var G__9700 = b.name;
+return goog.array.defaultCompare(G__9699,G__9700);
+} else {
+return nsc;
+}
+}
+} else {
+var G__9701 = a.name;
+var G__9702 = b.name;
+return goog.array.defaultCompare(G__9701,G__9702);
+
+}
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.INamed}
+ * @implements {cljs.core.IPrintWithWriter}
+*/
+cljs.core.Keyword = (function (ns,name,fqn,_hash){
+this.ns = ns;
+this.name = name;
+this.fqn = fqn;
+this._hash = _hash;
+this.cljs$lang$protocol_mask$partition0$ = 2153775105;
+this.cljs$lang$protocol_mask$partition1$ = 4096;
+})
+cljs.core.Keyword.prototype.toString = (function (){
+var self__ = this;
+var _ = this;
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(":"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.fqn)].join('');
+});
+
+cljs.core.Keyword.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Keyword.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (_,other){
+var self__ = this;
+var ___$1 = this;
+if((other instanceof cljs.core.Keyword)){
+return (self__.fqn === other.fqn);
+} else {
+return false;
+}
+});
+
+cljs.core.Keyword.prototype.call = (function() {
+var G__9704 = null;
+var G__9704__2 = (function (self__,coll){
+var self__ = this;
+var self____$1 = this;
+var kw = self____$1;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$2(coll,kw);
+});
+var G__9704__3 = (function (self__,coll,not_found){
+var self__ = this;
+var self____$1 = this;
+var kw = self____$1;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$3(coll,kw,not_found);
+});
+G__9704 = function(self__,coll,not_found){
+switch(arguments.length){
+case 2:
+return G__9704__2.call(this,self__,coll);
+case 3:
+return G__9704__3.call(this,self__,coll,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9704.cljs$core$IFn$_invoke$arity$2 = G__9704__2;
+G__9704.cljs$core$IFn$_invoke$arity$3 = G__9704__3;
+return G__9704;
+})()
+;
+
+cljs.core.Keyword.prototype.apply = (function (self__,args9703){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args9703)));
+});
+
+cljs.core.Keyword.prototype.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+var self__ = this;
+var kw = this;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$2(coll,kw);
+});
+
+cljs.core.Keyword.prototype.cljs$core$IFn$_invoke$arity$2 = (function (coll,not_found){
+var self__ = this;
+var kw = this;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$3(coll,kw,not_found);
+});
+
+cljs.core.Keyword.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+var h__6952__auto__ = self__._hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_keyword(this$__$1);
+self__._hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.Keyword.prototype.cljs$core$INamed$_name$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.name;
+});
+
+cljs.core.Keyword.prototype.cljs$core$INamed$_namespace$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.ns;
+});
+
+cljs.core.Keyword.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (o,writer,_){
+var self__ = this;
+var o__$1 = this;
+return cljs.core._write(writer,[cljs.core.str.cljs$core$IFn$_invoke$arity$1(":"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.fqn)].join(''));
+});
+
+cljs.core.Keyword.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"ns","ns",2082130287,null),new cljs.core.Symbol(null,"name","name",-810760592,null),new cljs.core.Symbol(null,"fqn","fqn",-1749334463,null),cljs.core.with_meta(new cljs.core.Symbol(null,"_hash","_hash",-2130838312,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Keyword.cljs$lang$type = true;
+
+cljs.core.Keyword.cljs$lang$ctorStr = "cljs.core/Keyword";
+
+cljs.core.Keyword.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Keyword");
+});
+
+cljs.core.__GT_Keyword = (function cljs$core$__GT_Keyword(ns,name,fqn,_hash){
+return (new cljs.core.Keyword(ns,name,fqn,_hash));
+});
+
+/**
+ * Return true if x is a Keyword
+ */
+cljs.core.keyword_QMARK_ = (function cljs$core$keyword_QMARK_(x){
+return (x instanceof cljs.core.Keyword);
+});
+/**
+ * Efficient test to determine that two keywords are identical.
+ */
+cljs.core.keyword_identical_QMARK_ = (function cljs$core$keyword_identical_QMARK_(x,y){
+if((x === y)){
+return true;
+} else {
+if(((x instanceof cljs.core.Keyword)) && ((y instanceof cljs.core.Keyword))){
+return (x.fqn === y.fqn);
+} else {
+return false;
+}
+}
+});
+/**
+ * Efficient test to determine that two symbols are identical.
+ */
+cljs.core.symbol_identical_QMARK_ = (function cljs$core$symbol_identical_QMARK_(x,y){
+if((x === y)){
+return true;
+} else {
+if(((x instanceof cljs.core.Symbol)) && ((y instanceof cljs.core.Symbol))){
+return (x.str === y.str);
+} else {
+return false;
+}
+}
+});
+/**
+ * Returns the namespace String of a symbol or keyword, or nil if not present.
+ */
+cljs.core.namespace = (function cljs$core$namespace(x){
+if(((!((x == null)))?((((x.cljs$lang$protocol_mask$partition1$ & (4096))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$INamed$)))?true:false):false)){
+return x.cljs$core$INamed$_namespace$arity$1(null);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Doesn't support namespace: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(x)].join('')));
+}
+});
+/**
+ * Return true if x is a symbol or keyword
+ */
+cljs.core.ident_QMARK_ = (function cljs$core$ident_QMARK_(x){
+return ((x instanceof cljs.core.Keyword)) || ((x instanceof cljs.core.Symbol));
+});
+/**
+ * Return true if x is a symbol or keyword without a namespace
+ */
+cljs.core.simple_ident_QMARK_ = (function cljs$core$simple_ident_QMARK_(x){
+return (cljs.core.ident_QMARK_(x)) && ((cljs.core.namespace(x) == null));
+});
+/**
+ * Return true if x is a symbol or keyword with a namespace
+ */
+cljs.core.qualified_ident_QMARK_ = (function cljs$core$qualified_ident_QMARK_(x){
+var and__6500__auto__ = cljs.core.ident_QMARK_(x);
+if(and__6500__auto__){
+var and__6500__auto____$1 = cljs.core.namespace(x);
+if(cljs.core.truth_(and__6500__auto____$1)){
+return true;
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+});
+/**
+ * Return true if x is a symbol without a namespace
+ */
+cljs.core.simple_symbol_QMARK_ = (function cljs$core$simple_symbol_QMARK_(x){
+return ((x instanceof cljs.core.Symbol)) && ((cljs.core.namespace(x) == null));
+});
+/**
+ * Return true if x is a symbol with a namespace
+ */
+cljs.core.qualified_symbol_QMARK_ = (function cljs$core$qualified_symbol_QMARK_(x){
+var and__6500__auto__ = (x instanceof cljs.core.Symbol);
+if(and__6500__auto__){
+var and__6500__auto____$1 = cljs.core.namespace(x);
+if(cljs.core.truth_(and__6500__auto____$1)){
+return true;
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+});
+/**
+ * Return true if x is a keyword without a namespace
+ */
+cljs.core.simple_keyword_QMARK_ = (function cljs$core$simple_keyword_QMARK_(x){
+return ((x instanceof cljs.core.Keyword)) && ((cljs.core.namespace(x) == null));
+});
+/**
+ * Return true if x is a keyword with a namespace
+ */
+cljs.core.qualified_keyword_QMARK_ = (function cljs$core$qualified_keyword_QMARK_(x){
+var and__6500__auto__ = (x instanceof cljs.core.Keyword);
+if(and__6500__auto__){
+var and__6500__auto____$1 = cljs.core.namespace(x);
+if(cljs.core.truth_(and__6500__auto____$1)){
+return true;
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+});
+/**
+ * Returns a Keyword with the given namespace and name. Do not use :
+ * in the keyword strings, it will be added automatically.
+ */
+cljs.core.keyword = (function cljs$core$keyword(var_args){
+var args9707 = [];
+var len__7625__auto___9710 = arguments.length;
+var i__7626__auto___9711 = (0);
+while(true){
+if((i__7626__auto___9711 < len__7625__auto___9710)){
+args9707.push((arguments[i__7626__auto___9711]));
+
+var G__9712 = (i__7626__auto___9711 + (1));
+i__7626__auto___9711 = G__9712;
+continue;
+} else {
+}
+break;
+}
+
+var G__9709 = args9707.length;
+switch (G__9709) {
+case 1:
+return cljs.core.keyword.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.keyword.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9707.length)].join('')));
+
+}
+});
+
+cljs.core.keyword.cljs$core$IFn$_invoke$arity$1 = (function (name){
+if((name instanceof cljs.core.Keyword)){
+return name;
+} else {
+if((name instanceof cljs.core.Symbol)){
+return (new cljs.core.Keyword(cljs.core.namespace(name),(cljs.core.name.cljs$core$IFn$_invoke$arity$1 ? cljs.core.name.cljs$core$IFn$_invoke$arity$1(name) : cljs.core.name.call(null,name)),name.str,null));
+} else {
+if(typeof name === 'string'){
+var parts = name.split("/");
+if((parts.length === (2))){
+return (new cljs.core.Keyword((parts[(0)]),(parts[(1)]),name,null));
+} else {
+return (new cljs.core.Keyword(null,(parts[(0)]),name,null));
+}
+} else {
+return null;
+}
+}
+}
+});
+
+cljs.core.keyword.cljs$core$IFn$_invoke$arity$2 = (function (ns,name){
+var ns__$1 = (((ns instanceof cljs.core.Keyword))?(cljs.core.name.cljs$core$IFn$_invoke$arity$1 ? cljs.core.name.cljs$core$IFn$_invoke$arity$1(ns) : cljs.core.name.call(null,ns)):(((ns instanceof cljs.core.Symbol))?(cljs.core.name.cljs$core$IFn$_invoke$arity$1 ? cljs.core.name.cljs$core$IFn$_invoke$arity$1(ns) : cljs.core.name.call(null,ns)):ns
+));
+var name__$1 = (((name instanceof cljs.core.Keyword))?(cljs.core.name.cljs$core$IFn$_invoke$arity$1 ? cljs.core.name.cljs$core$IFn$_invoke$arity$1(name) : cljs.core.name.call(null,name)):(((name instanceof cljs.core.Symbol))?(cljs.core.name.cljs$core$IFn$_invoke$arity$1 ? cljs.core.name.cljs$core$IFn$_invoke$arity$1(name) : cljs.core.name.call(null,name)):name
+));
+return (new cljs.core.Keyword(ns__$1,name__$1,[cljs.core.str.cljs$core$IFn$_invoke$arity$1((cljs.core.truth_(ns__$1)?[cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns__$1),cljs.core.str.cljs$core$IFn$_invoke$arity$1("/")].join(''):null)),cljs.core.str.cljs$core$IFn$_invoke$arity$1(name__$1)].join(''),null));
+});
+
+cljs.core.keyword.cljs$lang$maxFixedArity = 2;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IPending}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.LazySeq = (function (meta,fn,s,__hash){
+this.meta = meta;
+this.fn = fn;
+this.s = s;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32374988;
+this.cljs$lang$protocol_mask$partition1$ = 1;
+})
+cljs.core.LazySeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.LazySeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.LazySeq.prototype.sval = (function (){
+var self__ = this;
+var coll = this;
+if((self__.fn == null)){
+return self__.s;
+} else {
+self__.s = (self__.fn.cljs$core$IFn$_invoke$arity$0 ? self__.fn.cljs$core$IFn$_invoke$arity$0() : self__.fn.call(null));
+
+self__.fn = null;
+
+return self__.s;
+}
+});
+
+cljs.core.LazySeq.prototype.indexOf = (function() {
+var G__9714 = null;
+var G__9714__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__9714__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9714 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9714__1.call(this,x);
+case 2:
+return G__9714__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9714.cljs$core$IFn$_invoke$arity$1 = G__9714__1;
+G__9714.cljs$core$IFn$_invoke$arity$2 = G__9714__2;
+return G__9714;
+})()
+;
+
+cljs.core.LazySeq.prototype.lastIndexOf = (function() {
+var G__9715 = null;
+var G__9715__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__9715__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9715 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9715__1.call(this,x);
+case 2:
+return G__9715__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9715.cljs$core$IFn$_invoke$arity$1 = G__9715__1;
+G__9715.cljs$core$IFn$_invoke$arity$2 = G__9715__2;
+return G__9715;
+})()
+;
+
+cljs.core.LazySeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.LazySeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+coll__$1.cljs$core$ISeqable$_seq$arity$1(null);
+
+if((self__.s == null)){
+return null;
+} else {
+return cljs.core.next(self__.s);
+}
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IPending$_realized_QMARK_$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.not(self__.fn);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+coll__$1.cljs$core$ISeqable$_seq$arity$1(null);
+
+if((self__.s == null)){
+return null;
+} else {
+return cljs.core.first(self__.s);
+}
+});
+
+cljs.core.LazySeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+coll__$1.cljs$core$ISeqable$_seq$arity$1(null);
+
+if(!((self__.s == null))){
+return cljs.core.rest(self__.s);
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.LazySeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+coll__$1.sval();
+
+if((self__.s == null)){
+return null;
+} else {
+var ls = self__.s;
+while(true){
+if((ls instanceof cljs.core.LazySeq)){
+var G__9716 = ls.sval();
+ls = G__9716;
+continue;
+} else {
+self__.s = ls;
+
+return cljs.core.seq(self__.s);
+}
+break;
+}
+}
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.LazySeq(meta__$1,self__.fn,self__.s,self__.__hash));
+});
+
+cljs.core.LazySeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.LazySeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),cljs.core.with_meta(new cljs.core.Symbol(null,"fn","fn",465265323,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"s","s",-948495851,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.LazySeq.cljs$lang$type = true;
+
+cljs.core.LazySeq.cljs$lang$ctorStr = "cljs.core/LazySeq";
+
+cljs.core.LazySeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/LazySeq");
+});
+
+cljs.core.__GT_LazySeq = (function cljs$core$__GT_LazySeq(meta,fn,s,__hash){
+return (new cljs.core.LazySeq(meta,fn,s,__hash));
+});
+
+(cljs.core.LazySeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+
+/**
+* @constructor
+ * @implements {cljs.core.ICounted}
+*/
+cljs.core.ChunkBuffer = (function (buf,end){
+this.buf = buf;
+this.end = end;
+this.cljs$lang$protocol_mask$partition0$ = 2;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.ChunkBuffer.prototype.add = (function (o){
+var self__ = this;
+var _ = this;
+(self__.buf[self__.end] = o);
+
+return self__.end = (self__.end + (1));
+});
+
+cljs.core.ChunkBuffer.prototype.chunk = (function (o){
+var self__ = this;
+var _ = this;
+var ret = (new cljs.core.ArrayChunk(self__.buf,(0),self__.end));
+self__.buf = null;
+
+return ret;
+});
+
+cljs.core.ChunkBuffer.prototype.cljs$core$ICounted$_count$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.end;
+});
+
+cljs.core.ChunkBuffer.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"buf","buf",1426618187,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"end","end",1372345569,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ChunkBuffer.cljs$lang$type = true;
+
+cljs.core.ChunkBuffer.cljs$lang$ctorStr = "cljs.core/ChunkBuffer";
+
+cljs.core.ChunkBuffer.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ChunkBuffer");
+});
+
+cljs.core.__GT_ChunkBuffer = (function cljs$core$__GT_ChunkBuffer(buf,end){
+return (new cljs.core.ChunkBuffer(buf,end));
+});
+
+cljs.core.chunk_buffer = (function cljs$core$chunk_buffer(capacity){
+return (new cljs.core.ChunkBuffer((new Array(capacity)),(0)));
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.IChunk}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.ArrayChunk = (function (arr,off,end){
+this.arr = arr;
+this.off = off;
+this.end = end;
+this.cljs$lang$protocol_mask$partition0$ = 524306;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.ArrayChunk.prototype.cljs$core$ICounted$_count$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (self__.end - self__.off);
+});
+
+cljs.core.ArrayChunk.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (coll,i){
+var self__ = this;
+var coll__$1 = this;
+return (self__.arr[(self__.off + i)]);
+});
+
+cljs.core.ArrayChunk.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (coll,i,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(((i >= (0))) && ((i < (self__.end - self__.off)))){
+return (self__.arr[(self__.off + i)]);
+} else {
+return not_found;
+}
+});
+
+cljs.core.ArrayChunk.prototype.cljs$core$IChunk$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ArrayChunk.prototype.cljs$core$IChunk$_drop_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.off === self__.end)){
+throw (new Error("-drop-first of empty chunk"));
+} else {
+return (new cljs.core.ArrayChunk(self__.arr,(self__.off + (1)),self__.end));
+}
+});
+
+cljs.core.ArrayChunk.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4(self__.arr,f,(self__.arr[self__.off]),(self__.off + (1)));
+});
+
+cljs.core.ArrayChunk.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4(self__.arr,f,start,self__.off);
+});
+
+cljs.core.ArrayChunk.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.Symbol(null,"off","off",-2047994980,null),new cljs.core.Symbol(null,"end","end",1372345569,null)], null);
+});
+
+cljs.core.ArrayChunk.cljs$lang$type = true;
+
+cljs.core.ArrayChunk.cljs$lang$ctorStr = "cljs.core/ArrayChunk";
+
+cljs.core.ArrayChunk.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ArrayChunk");
+});
+
+cljs.core.__GT_ArrayChunk = (function cljs$core$__GT_ArrayChunk(arr,off,end){
+return (new cljs.core.ArrayChunk(arr,off,end));
+});
+
+cljs.core.array_chunk = (function cljs$core$array_chunk(var_args){
+var args9717 = [];
+var len__7625__auto___9720 = arguments.length;
+var i__7626__auto___9721 = (0);
+while(true){
+if((i__7626__auto___9721 < len__7625__auto___9720)){
+args9717.push((arguments[i__7626__auto___9721]));
+
+var G__9722 = (i__7626__auto___9721 + (1));
+i__7626__auto___9721 = G__9722;
+continue;
+} else {
+}
+break;
+}
+
+var G__9719 = args9717.length;
+switch (G__9719) {
+case 1:
+return cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9717.length)].join('')));
+
+}
+});
+
+cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$1 = (function (arr){
+return (new cljs.core.ArrayChunk(arr,(0),arr.length));
+});
+
+cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$2 = (function (arr,off){
+return (new cljs.core.ArrayChunk(arr,off,arr.length));
+});
+
+cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$3 = (function (arr,off,end){
+return (new cljs.core.ArrayChunk(arr,off,end));
+});
+
+cljs.core.array_chunk.cljs$lang$maxFixedArity = 3;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ASeq}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IChunkedNext}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IChunkedSeq}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.ChunkedCons = (function (chunk,more,meta,__hash){
+this.chunk = chunk;
+this.more = more;
+this.meta = meta;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 31850732;
+this.cljs$lang$protocol_mask$partition1$ = 1536;
+})
+cljs.core.ChunkedCons.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.ChunkedCons.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.ChunkedCons.prototype.indexOf = (function() {
+var G__9724 = null;
+var G__9724__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__9724__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9724 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9724__1.call(this,x);
+case 2:
+return G__9724__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9724.cljs$core$IFn$_invoke$arity$1 = G__9724__1;
+G__9724.cljs$core$IFn$_invoke$arity$2 = G__9724__2;
+return G__9724;
+})()
+;
+
+cljs.core.ChunkedCons.prototype.lastIndexOf = (function() {
+var G__9725 = null;
+var G__9725__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__9725__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9725 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9725__1.call(this,x);
+case 2:
+return G__9725__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9725.cljs$core$IFn$_invoke$arity$1 = G__9725__1;
+G__9725.cljs$core$IFn$_invoke$arity$2 = G__9725__2;
+return G__9725;
+})()
+;
+
+cljs.core.ChunkedCons.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((cljs.core._count(self__.chunk) > (1))){
+return (new cljs.core.ChunkedCons(cljs.core._drop_first(self__.chunk),self__.more,self__.meta,null));
+} else {
+var more__$1 = cljs.core._seq(self__.more);
+if((more__$1 == null)){
+return null;
+} else {
+return more__$1;
+}
+}
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.chunk,(0));
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((cljs.core._count(self__.chunk) > (1))){
+return (new cljs.core.ChunkedCons(cljs.core._drop_first(self__.chunk),self__.more,self__.meta,null));
+} else {
+if((self__.more == null)){
+return cljs.core.List.EMPTY;
+} else {
+return self__.more;
+}
+}
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IChunkedSeq$_chunked_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.chunk;
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IChunkedSeq$_chunked_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.more == null)){
+return cljs.core.List.EMPTY;
+} else {
+return self__.more;
+}
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,m){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.ChunkedCons(self__.chunk,self__.more,m,self__.__hash));
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$ICollection$_conj$arity$2 = (function (this$,o){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core.cons(o,this$__$1);
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IChunkedNext$_chunked_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.more == null)){
+return null;
+} else {
+return self__.more;
+}
+});
+
+cljs.core.ChunkedCons.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"chunk","chunk",449371907,null),new cljs.core.Symbol(null,"more","more",-418290273,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ChunkedCons.cljs$lang$type = true;
+
+cljs.core.ChunkedCons.cljs$lang$ctorStr = "cljs.core/ChunkedCons";
+
+cljs.core.ChunkedCons.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ChunkedCons");
+});
+
+cljs.core.__GT_ChunkedCons = (function cljs$core$__GT_ChunkedCons(chunk,more,meta,__hash){
+return (new cljs.core.ChunkedCons(chunk,more,meta,__hash));
+});
+
+(cljs.core.ChunkedCons.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+cljs.core.chunk_cons = (function cljs$core$chunk_cons(chunk,rest){
+if((cljs.core._count(chunk) === (0))){
+return rest;
+} else {
+return (new cljs.core.ChunkedCons(chunk,rest,null,null));
+}
+});
+cljs.core.chunk_append = (function cljs$core$chunk_append(b,x){
+return b.add(x);
+});
+cljs.core.chunk = (function cljs$core$chunk(b){
+return b.chunk();
+});
+cljs.core.chunk_first = (function cljs$core$chunk_first(s){
+return cljs.core._chunked_first(s);
+});
+cljs.core.chunk_rest = (function cljs$core$chunk_rest(s){
+return cljs.core._chunked_rest(s);
+});
+cljs.core.chunk_next = (function cljs$core$chunk_next(s){
+if(((!((s == null)))?((((s.cljs$lang$protocol_mask$partition1$ & (1024))) || ((cljs.core.PROTOCOL_SENTINEL === s.cljs$core$IChunkedNext$)))?true:false):false)){
+return cljs.core._chunked_next(s);
+} else {
+return cljs.core.seq(cljs.core._chunked_rest(s));
+}
+});
+/**
+ * Naive impl of to-array as a start.
+ */
+cljs.core.to_array = (function cljs$core$to_array(s){
+var ary = [];
+var s__$1 = s;
+while(true){
+if(cljs.core.seq(s__$1)){
+ary.push(cljs.core.first(s__$1));
+
+var G__9728 = cljs.core.next(s__$1);
+s__$1 = G__9728;
+continue;
+} else {
+return ary;
+}
+break;
+}
+});
+/**
+ * Returns a (potentially-ragged) 2-dimensional array
+ * containing the contents of coll.
+ */
+cljs.core.to_array_2d = (function cljs$core$to_array_2d(coll){
+var ret = (new Array(cljs.core.count(coll)));
+var i_9729 = (0);
+var xs_9730 = cljs.core.seq(coll);
+while(true){
+if(xs_9730){
+(ret[i_9729] = cljs.core.to_array(cljs.core.first(xs_9730)));
+
+var G__9731 = (i_9729 + (1));
+var G__9732 = cljs.core.next(xs_9730);
+i_9729 = G__9731;
+xs_9730 = G__9732;
+continue;
+} else {
+}
+break;
+}
+
+return ret;
+});
+/**
+ * Creates an array of ints. Does not coerce array, provided for compatibility
+ * with Clojure.
+ */
+cljs.core.int_array = (function cljs$core$int_array(var_args){
+var args9733 = [];
+var len__7625__auto___9736 = arguments.length;
+var i__7626__auto___9737 = (0);
+while(true){
+if((i__7626__auto___9737 < len__7625__auto___9736)){
+args9733.push((arguments[i__7626__auto___9737]));
+
+var G__9738 = (i__7626__auto___9737 + (1));
+i__7626__auto___9737 = G__9738;
+continue;
+} else {
+}
+break;
+}
+
+var G__9735 = args9733.length;
+switch (G__9735) {
+case 1:
+return cljs.core.int_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.int_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9733.length)].join('')));
+
+}
+});
+
+cljs.core.int_array.cljs$core$IFn$_invoke$arity$1 = (function (size_or_seq){
+if(typeof size_or_seq === 'number'){
+return cljs.core.int_array.cljs$core$IFn$_invoke$arity$2(size_or_seq,null);
+} else {
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(size_or_seq);
+}
+});
+
+cljs.core.int_array.cljs$core$IFn$_invoke$arity$2 = (function (size,init_val_or_seq){
+var a = (new Array(size));
+if(cljs.core.seq_QMARK_(init_val_or_seq)){
+var s = cljs.core.seq(init_val_or_seq);
+var i = (0);
+var s__$1 = s;
+while(true){
+if((s__$1) && ((i < size))){
+(a[i] = cljs.core.first(s__$1));
+
+var G__9740 = (i + (1));
+var G__9741 = cljs.core.next(s__$1);
+i = G__9740;
+s__$1 = G__9741;
+continue;
+} else {
+return a;
+}
+break;
+}
+} else {
+var n__7435__auto___9742 = size;
+var i_9743 = (0);
+while(true){
+if((i_9743 < n__7435__auto___9742)){
+(a[i_9743] = init_val_or_seq);
+
+var G__9744 = (i_9743 + (1));
+i_9743 = G__9744;
+continue;
+} else {
+}
+break;
+}
+
+return a;
+}
+});
+
+cljs.core.int_array.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Creates an array of longs. Does not coerce array, provided for compatibility
+ * with Clojure.
+ */
+cljs.core.long_array = (function cljs$core$long_array(var_args){
+var args9745 = [];
+var len__7625__auto___9748 = arguments.length;
+var i__7626__auto___9749 = (0);
+while(true){
+if((i__7626__auto___9749 < len__7625__auto___9748)){
+args9745.push((arguments[i__7626__auto___9749]));
+
+var G__9750 = (i__7626__auto___9749 + (1));
+i__7626__auto___9749 = G__9750;
+continue;
+} else {
+}
+break;
+}
+
+var G__9747 = args9745.length;
+switch (G__9747) {
+case 1:
+return cljs.core.long_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.long_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9745.length)].join('')));
+
+}
+});
+
+cljs.core.long_array.cljs$core$IFn$_invoke$arity$1 = (function (size_or_seq){
+if(typeof size_or_seq === 'number'){
+return cljs.core.long_array.cljs$core$IFn$_invoke$arity$2(size_or_seq,null);
+} else {
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(size_or_seq);
+}
+});
+
+cljs.core.long_array.cljs$core$IFn$_invoke$arity$2 = (function (size,init_val_or_seq){
+var a = (new Array(size));
+if(cljs.core.seq_QMARK_(init_val_or_seq)){
+var s = cljs.core.seq(init_val_or_seq);
+var i = (0);
+var s__$1 = s;
+while(true){
+if((s__$1) && ((i < size))){
+(a[i] = cljs.core.first(s__$1));
+
+var G__9752 = (i + (1));
+var G__9753 = cljs.core.next(s__$1);
+i = G__9752;
+s__$1 = G__9753;
+continue;
+} else {
+return a;
+}
+break;
+}
+} else {
+var n__7435__auto___9754 = size;
+var i_9755 = (0);
+while(true){
+if((i_9755 < n__7435__auto___9754)){
+(a[i_9755] = init_val_or_seq);
+
+var G__9756 = (i_9755 + (1));
+i_9755 = G__9756;
+continue;
+} else {
+}
+break;
+}
+
+return a;
+}
+});
+
+cljs.core.long_array.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Creates an array of doubles. Does not coerce array, provided for compatibility
+ * with Clojure.
+ */
+cljs.core.double_array = (function cljs$core$double_array(var_args){
+var args9757 = [];
+var len__7625__auto___9760 = arguments.length;
+var i__7626__auto___9761 = (0);
+while(true){
+if((i__7626__auto___9761 < len__7625__auto___9760)){
+args9757.push((arguments[i__7626__auto___9761]));
+
+var G__9762 = (i__7626__auto___9761 + (1));
+i__7626__auto___9761 = G__9762;
+continue;
+} else {
+}
+break;
+}
+
+var G__9759 = args9757.length;
+switch (G__9759) {
+case 1:
+return cljs.core.double_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.double_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9757.length)].join('')));
+
+}
+});
+
+cljs.core.double_array.cljs$core$IFn$_invoke$arity$1 = (function (size_or_seq){
+if(typeof size_or_seq === 'number'){
+return cljs.core.double_array.cljs$core$IFn$_invoke$arity$2(size_or_seq,null);
+} else {
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(size_or_seq);
+}
+});
+
+cljs.core.double_array.cljs$core$IFn$_invoke$arity$2 = (function (size,init_val_or_seq){
+var a = (new Array(size));
+if(cljs.core.seq_QMARK_(init_val_or_seq)){
+var s = cljs.core.seq(init_val_or_seq);
+var i = (0);
+var s__$1 = s;
+while(true){
+if((s__$1) && ((i < size))){
+(a[i] = cljs.core.first(s__$1));
+
+var G__9764 = (i + (1));
+var G__9765 = cljs.core.next(s__$1);
+i = G__9764;
+s__$1 = G__9765;
+continue;
+} else {
+return a;
+}
+break;
+}
+} else {
+var n__7435__auto___9766 = size;
+var i_9767 = (0);
+while(true){
+if((i_9767 < n__7435__auto___9766)){
+(a[i_9767] = init_val_or_seq);
+
+var G__9768 = (i_9767 + (1));
+i_9767 = G__9768;
+continue;
+} else {
+}
+break;
+}
+
+return a;
+}
+});
+
+cljs.core.double_array.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Creates an array of objects. Does not coerce array, provided for compatibility
+ * with Clojure.
+ */
+cljs.core.object_array = (function cljs$core$object_array(var_args){
+var args9769 = [];
+var len__7625__auto___9772 = arguments.length;
+var i__7626__auto___9773 = (0);
+while(true){
+if((i__7626__auto___9773 < len__7625__auto___9772)){
+args9769.push((arguments[i__7626__auto___9773]));
+
+var G__9774 = (i__7626__auto___9773 + (1));
+i__7626__auto___9773 = G__9774;
+continue;
+} else {
+}
+break;
+}
+
+var G__9771 = args9769.length;
+switch (G__9771) {
+case 1:
+return cljs.core.object_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.object_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9769.length)].join('')));
+
+}
+});
+
+cljs.core.object_array.cljs$core$IFn$_invoke$arity$1 = (function (size_or_seq){
+if(typeof size_or_seq === 'number'){
+return cljs.core.object_array.cljs$core$IFn$_invoke$arity$2(size_or_seq,null);
+} else {
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(size_or_seq);
+}
+});
+
+cljs.core.object_array.cljs$core$IFn$_invoke$arity$2 = (function (size,init_val_or_seq){
+var a = (new Array(size));
+if(cljs.core.seq_QMARK_(init_val_or_seq)){
+var s = cljs.core.seq(init_val_or_seq);
+var i = (0);
+var s__$1 = s;
+while(true){
+if((s__$1) && ((i < size))){
+(a[i] = cljs.core.first(s__$1));
+
+var G__9776 = (i + (1));
+var G__9777 = cljs.core.next(s__$1);
+i = G__9776;
+s__$1 = G__9777;
+continue;
+} else {
+return a;
+}
+break;
+}
+} else {
+var n__7435__auto___9778 = size;
+var i_9779 = (0);
+while(true){
+if((i_9779 < n__7435__auto___9778)){
+(a[i_9779] = init_val_or_seq);
+
+var G__9780 = (i_9779 + (1));
+i_9779 = G__9780;
+continue;
+} else {
+}
+break;
+}
+
+return a;
+}
+});
+
+cljs.core.object_array.cljs$lang$maxFixedArity = 2;
+
+/**
+ * If coll is counted? returns its count, else will count at most the first n
+ * elements of coll using its seq
+ */
+cljs.core.bounded_count = (function cljs$core$bounded_count(n,coll){
+if(cljs.core.counted_QMARK_(coll)){
+return cljs.core.count(coll);
+} else {
+var i = (0);
+var s = cljs.core.seq(coll);
+while(true){
+if((!((s == null))) && ((i < n))){
+var G__9781 = (i + (1));
+var G__9782 = cljs.core.next(s);
+i = G__9781;
+s = G__9782;
+continue;
+} else {
+return i;
+}
+break;
+}
+}
+});
+cljs.core.spread = (function cljs$core$spread(arglist){
+if((arglist == null)){
+return null;
+} else {
+if((cljs.core.next(arglist) == null)){
+return cljs.core.seq(cljs.core.first(arglist));
+} else {
+return cljs.core.cons(cljs.core.first(arglist),(function (){var G__9784 = cljs.core.next(arglist);
+return (cljs.core.spread.cljs$core$IFn$_invoke$arity$1 ? cljs.core.spread.cljs$core$IFn$_invoke$arity$1(G__9784) : cljs.core.spread.call(null,G__9784));
+})());
+
+}
+}
+});
+/**
+ * Returns a lazy seq representing the concatenation of the elements in the supplied colls.
+ */
+cljs.core.concat = (function cljs$core$concat(var_args){
+var args9785 = [];
+var len__7625__auto___9797 = arguments.length;
+var i__7626__auto___9798 = (0);
+while(true){
+if((i__7626__auto___9798 < len__7625__auto___9797)){
+args9785.push((arguments[i__7626__auto___9798]));
+
+var G__9799 = (i__7626__auto___9798 + (1));
+i__7626__auto___9798 = G__9799;
+continue;
+} else {
+}
+break;
+}
+
+var G__9790 = args9785.length;
+switch (G__9790) {
+case 0:
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9785.slice((2)),(0),null));
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.concat.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (new cljs.core.LazySeq(null,(function (){
+return null;
+}),null,null));
+});
+
+cljs.core.concat.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (new cljs.core.LazySeq(null,(function (){
+return x;
+}),null,null));
+});
+
+cljs.core.concat.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (new cljs.core.LazySeq(null,(function (){
+var s = cljs.core.seq(x);
+if(s){
+if(cljs.core.chunked_seq_QMARK_(s)){
+return cljs.core.chunk_cons(cljs.core.chunk_first(s),cljs.core.concat.cljs$core$IFn$_invoke$arity$2(cljs.core.chunk_rest(s),y));
+} else {
+return cljs.core.cons(cljs.core.first(s),cljs.core.concat.cljs$core$IFn$_invoke$arity$2(cljs.core.rest(s),y));
+}
+} else {
+return y;
+}
+}),null,null));
+});
+
+cljs.core.concat.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,zs){
+var cat = (function cljs$core$cat(xys,zs__$1){
+return (new cljs.core.LazySeq(null,(function (){
+var xys__$1 = cljs.core.seq(xys);
+if(xys__$1){
+if(cljs.core.chunked_seq_QMARK_(xys__$1)){
+return cljs.core.chunk_cons(cljs.core.chunk_first(xys__$1),cljs$core$cat(cljs.core.chunk_rest(xys__$1),zs__$1));
+} else {
+return cljs.core.cons(cljs.core.first(xys__$1),cljs$core$cat(cljs.core.rest(xys__$1),zs__$1));
+}
+} else {
+if(cljs.core.truth_(zs__$1)){
+return cljs$core$cat(cljs.core.first(zs__$1),cljs.core.next(zs__$1));
+} else {
+return null;
+}
+}
+}),null,null));
+});
+return cat(cljs.core.concat.cljs$core$IFn$_invoke$arity$2(x,y),zs);
+});
+
+cljs.core.concat.cljs$lang$applyTo = (function (seq9786){
+var G__9787 = cljs.core.first(seq9786);
+var seq9786__$1 = cljs.core.next(seq9786);
+var G__9788 = cljs.core.first(seq9786__$1);
+var seq9786__$2 = cljs.core.next(seq9786__$1);
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$variadic(G__9787,G__9788,seq9786__$2);
+});
+
+cljs.core.concat.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Creates a new list containing the items prepended to the rest, the
+ * last of which will be treated as a sequence.
+ */
+cljs.core.list_STAR_ = (function cljs$core$list_STAR_(var_args){
+var args9801 = [];
+var len__7625__auto___9809 = arguments.length;
+var i__7626__auto___9810 = (0);
+while(true){
+if((i__7626__auto___9810 < len__7625__auto___9809)){
+args9801.push((arguments[i__7626__auto___9810]));
+
+var G__9811 = (i__7626__auto___9810 + (1));
+i__7626__auto___9810 = G__9811;
+continue;
+} else {
+}
+break;
+}
+
+var G__9808 = args9801.length;
+switch (G__9808) {
+case 1:
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9801.slice((4)),(0),null));
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$1 = (function (args){
+return cljs.core.seq(args);
+});
+
+cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$2 = (function (a,args){
+return cljs.core.cons(a,args);
+});
+
+cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$3 = (function (a,b,args){
+return cljs.core.cons(a,cljs.core.cons(b,args));
+});
+
+cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4 = (function (a,b,c,args){
+return cljs.core.cons(a,cljs.core.cons(b,cljs.core.cons(c,args)));
+});
+
+cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$variadic = (function (a,b,c,d,more){
+return cljs.core.cons(a,cljs.core.cons(b,cljs.core.cons(c,cljs.core.cons(d,cljs.core.spread(more)))));
+});
+
+cljs.core.list_STAR_.cljs$lang$applyTo = (function (seq9802){
+var G__9803 = cljs.core.first(seq9802);
+var seq9802__$1 = cljs.core.next(seq9802);
+var G__9804 = cljs.core.first(seq9802__$1);
+var seq9802__$2 = cljs.core.next(seq9802__$1);
+var G__9805 = cljs.core.first(seq9802__$2);
+var seq9802__$3 = cljs.core.next(seq9802__$2);
+var G__9806 = cljs.core.first(seq9802__$3);
+var seq9802__$4 = cljs.core.next(seq9802__$3);
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$variadic(G__9803,G__9804,G__9805,G__9806,seq9802__$4);
+});
+
+cljs.core.list_STAR_.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Returns a new, transient version of the collection, in constant time.
+ */
+cljs.core.transient$ = (function cljs$core$transient(coll){
+return cljs.core._as_transient(coll);
+});
+/**
+ * Returns a new, persistent version of the transient collection, in
+ * constant time. The transient collection cannot be used after this
+ * call, any such use will throw an exception.
+ */
+cljs.core.persistent_BANG_ = (function cljs$core$persistent_BANG_(tcoll){
+return cljs.core._persistent_BANG_(tcoll);
+});
+/**
+ * Adds val to the transient collection, and return tcoll. The 'addition'
+ * may happen at different 'places' depending on the concrete type.
+ */
+cljs.core.conj_BANG_ = (function cljs$core$conj_BANG_(var_args){
+var args9813 = [];
+var len__7625__auto___9819 = arguments.length;
+var i__7626__auto___9820 = (0);
+while(true){
+if((i__7626__auto___9820 < len__7625__auto___9819)){
+args9813.push((arguments[i__7626__auto___9820]));
+
+var G__9821 = (i__7626__auto___9820 + (1));
+i__7626__auto___9820 = G__9821;
+continue;
+} else {
+}
+break;
+}
+
+var G__9818 = args9813.length;
+switch (G__9818) {
+case 0:
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9813.slice((2)),(0),null));
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.transient$(cljs.core.PersistentVector.EMPTY);
+});
+
+cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$1 = (function (tcoll){
+return tcoll;
+});
+
+cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (tcoll,val){
+return cljs.core._conj_BANG_(tcoll,val);
+});
+
+cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (tcoll,val,vals){
+while(true){
+var ntcoll = cljs.core._conj_BANG_(tcoll,val);
+if(cljs.core.truth_(vals)){
+var G__9823 = ntcoll;
+var G__9824 = cljs.core.first(vals);
+var G__9825 = cljs.core.next(vals);
+tcoll = G__9823;
+val = G__9824;
+vals = G__9825;
+continue;
+} else {
+return ntcoll;
+}
+break;
+}
+});
+
+cljs.core.conj_BANG_.cljs$lang$applyTo = (function (seq9814){
+var G__9815 = cljs.core.first(seq9814);
+var seq9814__$1 = cljs.core.next(seq9814);
+var G__9816 = cljs.core.first(seq9814__$1);
+var seq9814__$2 = cljs.core.next(seq9814__$1);
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__9815,G__9816,seq9814__$2);
+});
+
+cljs.core.conj_BANG_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * When applied to a transient map, adds mapping of key(s) to
+ * val(s). When applied to a transient vector, sets the val at index.
+ * Note - index must be <= (count vector). Returns coll.
+ */
+cljs.core.assoc_BANG_ = (function cljs$core$assoc_BANG_(var_args){
+var args9826 = [];
+var len__7625__auto___9833 = arguments.length;
+var i__7626__auto___9834 = (0);
+while(true){
+if((i__7626__auto___9834 < len__7625__auto___9833)){
+args9826.push((arguments[i__7626__auto___9834]));
+
+var G__9835 = (i__7626__auto___9834 + (1));
+i__7626__auto___9834 = G__9835;
+continue;
+} else {
+}
+break;
+}
+
+var G__9832 = args9826.length;
+switch (G__9832) {
+case 3:
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9826.slice((3)),(0),null));
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3 = (function (tcoll,key,val){
+return cljs.core._assoc_BANG_(tcoll,key,val);
+});
+
+cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (tcoll,key,val,kvs){
+while(true){
+var ntcoll = cljs.core._assoc_BANG_(tcoll,key,val);
+if(cljs.core.truth_(kvs)){
+var G__9837 = ntcoll;
+var G__9838 = cljs.core.first(kvs);
+var G__9839 = cljs.core.second(kvs);
+var G__9840 = cljs.core.nnext(kvs);
+tcoll = G__9837;
+key = G__9838;
+val = G__9839;
+kvs = G__9840;
+continue;
+} else {
+return ntcoll;
+}
+break;
+}
+});
+
+cljs.core.assoc_BANG_.cljs$lang$applyTo = (function (seq9827){
+var G__9828 = cljs.core.first(seq9827);
+var seq9827__$1 = cljs.core.next(seq9827);
+var G__9829 = cljs.core.first(seq9827__$1);
+var seq9827__$2 = cljs.core.next(seq9827__$1);
+var G__9830 = cljs.core.first(seq9827__$2);
+var seq9827__$3 = cljs.core.next(seq9827__$2);
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__9828,G__9829,G__9830,seq9827__$3);
+});
+
+cljs.core.assoc_BANG_.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Returns a transient map that doesn't contain a mapping for key(s).
+ */
+cljs.core.dissoc_BANG_ = (function cljs$core$dissoc_BANG_(var_args){
+var args9841 = [];
+var len__7625__auto___9847 = arguments.length;
+var i__7626__auto___9848 = (0);
+while(true){
+if((i__7626__auto___9848 < len__7625__auto___9847)){
+args9841.push((arguments[i__7626__auto___9848]));
+
+var G__9849 = (i__7626__auto___9848 + (1));
+i__7626__auto___9848 = G__9849;
+continue;
+} else {
+}
+break;
+}
+
+var G__9846 = args9841.length;
+switch (G__9846) {
+case 2:
+return cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9841.slice((2)),(0),null));
+return cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (tcoll,key){
+return cljs.core._dissoc_BANG_(tcoll,key);
+});
+
+cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (tcoll,key,ks){
+while(true){
+var ntcoll = cljs.core._dissoc_BANG_(tcoll,key);
+if(cljs.core.truth_(ks)){
+var G__9851 = ntcoll;
+var G__9852 = cljs.core.first(ks);
+var G__9853 = cljs.core.next(ks);
+tcoll = G__9851;
+key = G__9852;
+ks = G__9853;
+continue;
+} else {
+return ntcoll;
+}
+break;
+}
+});
+
+cljs.core.dissoc_BANG_.cljs$lang$applyTo = (function (seq9842){
+var G__9843 = cljs.core.first(seq9842);
+var seq9842__$1 = cljs.core.next(seq9842);
+var G__9844 = cljs.core.first(seq9842__$1);
+var seq9842__$2 = cljs.core.next(seq9842__$1);
+return cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__9843,G__9844,seq9842__$2);
+});
+
+cljs.core.dissoc_BANG_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Removes the last item from a transient vector. If
+ * the collection is empty, throws an exception. Returns tcoll
+ */
+cljs.core.pop_BANG_ = (function cljs$core$pop_BANG_(tcoll){
+return cljs.core._pop_BANG_(tcoll);
+});
+/**
+ * disj[oin]. Returns a transient set of the same (hashed/sorted) type, that
+ * does not contain key(s).
+ */
+cljs.core.disj_BANG_ = (function cljs$core$disj_BANG_(var_args){
+var args9854 = [];
+var len__7625__auto___9860 = arguments.length;
+var i__7626__auto___9861 = (0);
+while(true){
+if((i__7626__auto___9861 < len__7625__auto___9860)){
+args9854.push((arguments[i__7626__auto___9861]));
+
+var G__9862 = (i__7626__auto___9861 + (1));
+i__7626__auto___9861 = G__9862;
+continue;
+} else {
+}
+break;
+}
+
+var G__9859 = args9854.length;
+switch (G__9859) {
+case 2:
+return cljs.core.disj_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9854.slice((2)),(0),null));
+return cljs.core.disj_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.disj_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (tcoll,val){
+return cljs.core._disjoin_BANG_(tcoll,val);
+});
+
+cljs.core.disj_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (tcoll,val,vals){
+while(true){
+var ntcoll = cljs.core._disjoin_BANG_(tcoll,val);
+if(cljs.core.truth_(vals)){
+var G__9864 = ntcoll;
+var G__9865 = cljs.core.first(vals);
+var G__9866 = cljs.core.next(vals);
+tcoll = G__9864;
+val = G__9865;
+vals = G__9866;
+continue;
+} else {
+return ntcoll;
+}
+break;
+}
+});
+
+cljs.core.disj_BANG_.cljs$lang$applyTo = (function (seq9855){
+var G__9856 = cljs.core.first(seq9855);
+var seq9855__$1 = cljs.core.next(seq9855);
+var G__9857 = cljs.core.first(seq9855__$1);
+var seq9855__$2 = cljs.core.next(seq9855__$1);
+return cljs.core.disj_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__9856,G__9857,seq9855__$2);
+});
+
+cljs.core.disj_BANG_.cljs$lang$maxFixedArity = (2);
+
+
+cljs.core.apply_to = (function cljs$core$apply_to(f,argc,args){
+var args__$1 = cljs.core.seq(args);
+if((argc === (0))){
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+} else {
+var a7479 = cljs.core._first(args__$1);
+var args__$2 = cljs.core._rest(args__$1);
+if((argc === (1))){
+if(f.cljs$core$IFn$_invoke$arity$1){
+return f.cljs$core$IFn$_invoke$arity$1(a7479);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(a7479) : f.call(null,a7479));
+}
+} else {
+var b7480 = cljs.core._first(args__$2);
+var args__$3 = cljs.core._rest(args__$2);
+if((argc === (2))){
+if(f.cljs$core$IFn$_invoke$arity$2){
+return f.cljs$core$IFn$_invoke$arity$2(a7479,b7480);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(a7479,b7480) : f.call(null,a7479,b7480));
+}
+} else {
+var c7481 = cljs.core._first(args__$3);
+var args__$4 = cljs.core._rest(args__$3);
+if((argc === (3))){
+if(f.cljs$core$IFn$_invoke$arity$3){
+return f.cljs$core$IFn$_invoke$arity$3(a7479,b7480,c7481);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(a7479,b7480,c7481) : f.call(null,a7479,b7480,c7481));
+}
+} else {
+var d7482 = cljs.core._first(args__$4);
+var args__$5 = cljs.core._rest(args__$4);
+if((argc === (4))){
+if(f.cljs$core$IFn$_invoke$arity$4){
+return f.cljs$core$IFn$_invoke$arity$4(a7479,b7480,c7481,d7482);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(a7479,b7480,c7481,d7482) : f.call(null,a7479,b7480,c7481,d7482));
+}
+} else {
+var e7483 = cljs.core._first(args__$5);
+var args__$6 = cljs.core._rest(args__$5);
+if((argc === (5))){
+if(f.cljs$core$IFn$_invoke$arity$5){
+return f.cljs$core$IFn$_invoke$arity$5(a7479,b7480,c7481,d7482,e7483);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$5 ? f.cljs$core$IFn$_invoke$arity$5(a7479,b7480,c7481,d7482,e7483) : f.call(null,a7479,b7480,c7481,d7482,e7483));
+}
+} else {
+var f7484 = cljs.core._first(args__$6);
+var args__$7 = cljs.core._rest(args__$6);
+if((argc === (6))){
+if(f.cljs$core$IFn$_invoke$arity$6){
+return f.cljs$core$IFn$_invoke$arity$6(a7479,b7480,c7481,d7482,e7483,f7484);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$6 ? f.cljs$core$IFn$_invoke$arity$6(a7479,b7480,c7481,d7482,e7483,f7484) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484));
+}
+} else {
+var g7485 = cljs.core._first(args__$7);
+var args__$8 = cljs.core._rest(args__$7);
+if((argc === (7))){
+if(f.cljs$core$IFn$_invoke$arity$7){
+return f.cljs$core$IFn$_invoke$arity$7(a7479,b7480,c7481,d7482,e7483,f7484,g7485);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$7 ? f.cljs$core$IFn$_invoke$arity$7(a7479,b7480,c7481,d7482,e7483,f7484,g7485) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485));
+}
+} else {
+var h7486 = cljs.core._first(args__$8);
+var args__$9 = cljs.core._rest(args__$8);
+if((argc === (8))){
+if(f.cljs$core$IFn$_invoke$arity$8){
+return f.cljs$core$IFn$_invoke$arity$8(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$8 ? f.cljs$core$IFn$_invoke$arity$8(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486));
+}
+} else {
+var i7487 = cljs.core._first(args__$9);
+var args__$10 = cljs.core._rest(args__$9);
+if((argc === (9))){
+if(f.cljs$core$IFn$_invoke$arity$9){
+return f.cljs$core$IFn$_invoke$arity$9(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$9 ? f.cljs$core$IFn$_invoke$arity$9(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487));
+}
+} else {
+var j7488 = cljs.core._first(args__$10);
+var args__$11 = cljs.core._rest(args__$10);
+if((argc === (10))){
+if(f.cljs$core$IFn$_invoke$arity$10){
+return f.cljs$core$IFn$_invoke$arity$10(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$10 ? f.cljs$core$IFn$_invoke$arity$10(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488));
+}
+} else {
+var k7489 = cljs.core._first(args__$11);
+var args__$12 = cljs.core._rest(args__$11);
+if((argc === (11))){
+if(f.cljs$core$IFn$_invoke$arity$11){
+return f.cljs$core$IFn$_invoke$arity$11(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$11 ? f.cljs$core$IFn$_invoke$arity$11(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489));
+}
+} else {
+var l7490 = cljs.core._first(args__$12);
+var args__$13 = cljs.core._rest(args__$12);
+if((argc === (12))){
+if(f.cljs$core$IFn$_invoke$arity$12){
+return f.cljs$core$IFn$_invoke$arity$12(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$12 ? f.cljs$core$IFn$_invoke$arity$12(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490));
+}
+} else {
+var m7491 = cljs.core._first(args__$13);
+var args__$14 = cljs.core._rest(args__$13);
+if((argc === (13))){
+if(f.cljs$core$IFn$_invoke$arity$13){
+return f.cljs$core$IFn$_invoke$arity$13(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$13 ? f.cljs$core$IFn$_invoke$arity$13(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491));
+}
+} else {
+var n7492 = cljs.core._first(args__$14);
+var args__$15 = cljs.core._rest(args__$14);
+if((argc === (14))){
+if(f.cljs$core$IFn$_invoke$arity$14){
+return f.cljs$core$IFn$_invoke$arity$14(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$14 ? f.cljs$core$IFn$_invoke$arity$14(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492));
+}
+} else {
+var o7493 = cljs.core._first(args__$15);
+var args__$16 = cljs.core._rest(args__$15);
+if((argc === (15))){
+if(f.cljs$core$IFn$_invoke$arity$15){
+return f.cljs$core$IFn$_invoke$arity$15(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$15 ? f.cljs$core$IFn$_invoke$arity$15(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493));
+}
+} else {
+var p7494 = cljs.core._first(args__$16);
+var args__$17 = cljs.core._rest(args__$16);
+if((argc === (16))){
+if(f.cljs$core$IFn$_invoke$arity$16){
+return f.cljs$core$IFn$_invoke$arity$16(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$16 ? f.cljs$core$IFn$_invoke$arity$16(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494));
+}
+} else {
+var q7495 = cljs.core._first(args__$17);
+var args__$18 = cljs.core._rest(args__$17);
+if((argc === (17))){
+if(f.cljs$core$IFn$_invoke$arity$17){
+return f.cljs$core$IFn$_invoke$arity$17(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$17 ? f.cljs$core$IFn$_invoke$arity$17(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495));
+}
+} else {
+var r7496 = cljs.core._first(args__$18);
+var args__$19 = cljs.core._rest(args__$18);
+if((argc === (18))){
+if(f.cljs$core$IFn$_invoke$arity$18){
+return f.cljs$core$IFn$_invoke$arity$18(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495,r7496);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$18 ? f.cljs$core$IFn$_invoke$arity$18(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495,r7496) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495,r7496));
+}
+} else {
+var s7497 = cljs.core._first(args__$19);
+var args__$20 = cljs.core._rest(args__$19);
+if((argc === (19))){
+if(f.cljs$core$IFn$_invoke$arity$19){
+return f.cljs$core$IFn$_invoke$arity$19(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495,r7496,s7497);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$19 ? f.cljs$core$IFn$_invoke$arity$19(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495,r7496,s7497) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495,r7496,s7497));
+}
+} else {
+var t7498 = cljs.core._first(args__$20);
+var args__$21 = cljs.core._rest(args__$20);
+if((argc === (20))){
+if(f.cljs$core$IFn$_invoke$arity$20){
+return f.cljs$core$IFn$_invoke$arity$20(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495,r7496,s7497,t7498);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$20 ? f.cljs$core$IFn$_invoke$arity$20(a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495,r7496,s7497,t7498) : f.call(null,a7479,b7480,c7481,d7482,e7483,f7484,g7485,h7486,i7487,j7488,k7489,l7490,m7491,n7492,o7493,p7494,q7495,r7496,s7497,t7498));
+}
+} else {
+throw (new Error("Only up to 20 arguments supported on functions"));
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+});
+
+/**
+ * Applies fn f to the argument list formed by prepending intervening arguments to args.
+ */
+cljs.core.apply = (function cljs$core$apply(var_args){
+var args9867 = [];
+var len__7625__auto___9876 = arguments.length;
+var i__7626__auto___9877 = (0);
+while(true){
+if((i__7626__auto___9877 < len__7625__auto___9876)){
+args9867.push((arguments[i__7626__auto___9877]));
+
+var G__9878 = (i__7626__auto___9877 + (1));
+i__7626__auto___9877 = G__9878;
+continue;
+} else {
+}
+break;
+}
+
+var G__9875 = args9867.length;
+switch (G__9875) {
+case 2:
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9867.slice((5)),(0),null));
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.apply.cljs$core$IFn$_invoke$arity$2 = (function (f,args){
+var fixed_arity = f.cljs$lang$maxFixedArity;
+if(f.cljs$lang$applyTo){
+var bc = cljs.core.bounded_count((fixed_arity + (1)),args);
+if((bc <= fixed_arity)){
+return cljs.core.apply_to(f,bc,args);
+} else {
+return f.cljs$lang$applyTo(args);
+}
+} else {
+return f.apply(f,cljs.core.to_array(args));
+}
+});
+
+cljs.core.apply.cljs$core$IFn$_invoke$arity$3 = (function (f,x,args){
+var arglist = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$2(x,args);
+var fixed_arity = f.cljs$lang$maxFixedArity;
+if(f.cljs$lang$applyTo){
+var bc = cljs.core.bounded_count((fixed_arity + (1)),arglist);
+if((bc <= fixed_arity)){
+return cljs.core.apply_to(f,bc,arglist);
+} else {
+return f.cljs$lang$applyTo(arglist);
+}
+} else {
+return f.apply(f,cljs.core.to_array(arglist));
+}
+});
+
+cljs.core.apply.cljs$core$IFn$_invoke$arity$4 = (function (f,x,y,args){
+var arglist = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$3(x,y,args);
+var fixed_arity = f.cljs$lang$maxFixedArity;
+if(f.cljs$lang$applyTo){
+var bc = cljs.core.bounded_count((fixed_arity + (1)),arglist);
+if((bc <= fixed_arity)){
+return cljs.core.apply_to(f,bc,arglist);
+} else {
+return f.cljs$lang$applyTo(arglist);
+}
+} else {
+return f.apply(f,cljs.core.to_array(arglist));
+}
+});
+
+cljs.core.apply.cljs$core$IFn$_invoke$arity$5 = (function (f,x,y,z,args){
+var arglist = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4(x,y,z,args);
+var fixed_arity = f.cljs$lang$maxFixedArity;
+if(f.cljs$lang$applyTo){
+var bc = cljs.core.bounded_count((fixed_arity + (1)),arglist);
+if((bc <= fixed_arity)){
+return cljs.core.apply_to(f,bc,arglist);
+} else {
+return f.cljs$lang$applyTo(arglist);
+}
+} else {
+return f.apply(f,cljs.core.to_array(arglist));
+}
+});
+
+cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic = (function (f,a,b,c,d,args){
+var arglist = cljs.core.cons(a,cljs.core.cons(b,cljs.core.cons(c,cljs.core.cons(d,cljs.core.spread(args)))));
+var fixed_arity = f.cljs$lang$maxFixedArity;
+if(f.cljs$lang$applyTo){
+var bc = cljs.core.bounded_count((fixed_arity + (1)),arglist);
+if((bc <= fixed_arity)){
+return cljs.core.apply_to(f,bc,arglist);
+} else {
+return f.cljs$lang$applyTo(arglist);
+}
+} else {
+return f.apply(f,cljs.core.to_array(arglist));
+}
+});
+
+cljs.core.apply.cljs$lang$applyTo = (function (seq9868){
+var G__9869 = cljs.core.first(seq9868);
+var seq9868__$1 = cljs.core.next(seq9868);
+var G__9870 = cljs.core.first(seq9868__$1);
+var seq9868__$2 = cljs.core.next(seq9868__$1);
+var G__9871 = cljs.core.first(seq9868__$2);
+var seq9868__$3 = cljs.core.next(seq9868__$2);
+var G__9872 = cljs.core.first(seq9868__$3);
+var seq9868__$4 = cljs.core.next(seq9868__$3);
+var G__9873 = cljs.core.first(seq9868__$4);
+var seq9868__$5 = cljs.core.next(seq9868__$4);
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(G__9869,G__9870,G__9871,G__9872,G__9873,seq9868__$5);
+});
+
+cljs.core.apply.cljs$lang$maxFixedArity = (5);
+
+/**
+ * Returns an object of the same type and value as obj, with
+ * (apply f (meta obj) args) as its metadata.
+ */
+cljs.core.vary_meta = (function cljs$core$vary_meta(var_args){
+var args9880 = [];
+var len__7625__auto___9905 = arguments.length;
+var i__7626__auto___9906 = (0);
+while(true){
+if((i__7626__auto___9906 < len__7625__auto___9905)){
+args9880.push((arguments[i__7626__auto___9906]));
+
+var G__9907 = (i__7626__auto___9906 + (1));
+i__7626__auto___9906 = G__9907;
+continue;
+} else {
+}
+break;
+}
+
+var G__9889 = args9880.length;
+switch (G__9889) {
+case 2:
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 6:
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9880.slice((6)),(0),null));
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$2 = (function (obj,f){
+return cljs.core.with_meta(obj,(function (){var G__9890 = cljs.core.meta(obj);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__9890) : f.call(null,G__9890));
+})());
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$3 = (function (obj,f,a){
+return cljs.core.with_meta(obj,(function (){var G__9891 = cljs.core.meta(obj);
+var G__9892 = a;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__9891,G__9892) : f.call(null,G__9891,G__9892));
+})());
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$4 = (function (obj,f,a,b){
+return cljs.core.with_meta(obj,(function (){var G__9893 = cljs.core.meta(obj);
+var G__9894 = a;
+var G__9895 = b;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__9893,G__9894,G__9895) : f.call(null,G__9893,G__9894,G__9895));
+})());
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$5 = (function (obj,f,a,b,c){
+return cljs.core.with_meta(obj,(function (){var G__9896 = cljs.core.meta(obj);
+var G__9897 = a;
+var G__9898 = b;
+var G__9899 = c;
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(G__9896,G__9897,G__9898,G__9899) : f.call(null,G__9896,G__9897,G__9898,G__9899));
+})());
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$6 = (function (obj,f,a,b,c,d){
+return cljs.core.with_meta(obj,(function (){var G__9900 = cljs.core.meta(obj);
+var G__9901 = a;
+var G__9902 = b;
+var G__9903 = c;
+var G__9904 = d;
+return (f.cljs$core$IFn$_invoke$arity$5 ? f.cljs$core$IFn$_invoke$arity$5(G__9900,G__9901,G__9902,G__9903,G__9904) : f.call(null,G__9900,G__9901,G__9902,G__9903,G__9904));
+})());
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$variadic = (function (obj,f,a,b,c,d,args){
+return cljs.core.with_meta(obj,cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,cljs.core.meta(obj),a,b,c,cljs.core.array_seq([d,args], 0)));
+});
+
+cljs.core.vary_meta.cljs$lang$applyTo = (function (seq9881){
+var G__9882 = cljs.core.first(seq9881);
+var seq9881__$1 = cljs.core.next(seq9881);
+var G__9883 = cljs.core.first(seq9881__$1);
+var seq9881__$2 = cljs.core.next(seq9881__$1);
+var G__9884 = cljs.core.first(seq9881__$2);
+var seq9881__$3 = cljs.core.next(seq9881__$2);
+var G__9885 = cljs.core.first(seq9881__$3);
+var seq9881__$4 = cljs.core.next(seq9881__$3);
+var G__9886 = cljs.core.first(seq9881__$4);
+var seq9881__$5 = cljs.core.next(seq9881__$4);
+var G__9887 = cljs.core.first(seq9881__$5);
+var seq9881__$6 = cljs.core.next(seq9881__$5);
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$variadic(G__9882,G__9883,G__9884,G__9885,G__9886,G__9887,seq9881__$6);
+});
+
+cljs.core.vary_meta.cljs$lang$maxFixedArity = (6);
+
+/**
+ * Same as (not (= obj1 obj2))
+ */
+cljs.core.not_EQ_ = (function cljs$core$not_EQ_(var_args){
+var args9909 = [];
+var len__7625__auto___9915 = arguments.length;
+var i__7626__auto___9916 = (0);
+while(true){
+if((i__7626__auto___9916 < len__7625__auto___9915)){
+args9909.push((arguments[i__7626__auto___9916]));
+
+var G__9917 = (i__7626__auto___9916 + (1));
+i__7626__auto___9916 = G__9917;
+continue;
+} else {
+}
+break;
+}
+
+var G__9914 = args9909.length;
+switch (G__9914) {
+case 1:
+return cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9909.slice((2)),(0),null));
+return cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return false;
+});
+
+cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return !(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x,y));
+});
+
+cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.not(cljs.core.apply.cljs$core$IFn$_invoke$arity$4(cljs.core._EQ_,x,y,more));
+});
+
+cljs.core.not_EQ_.cljs$lang$applyTo = (function (seq9910){
+var G__9911 = cljs.core.first(seq9910);
+var seq9910__$1 = cljs.core.next(seq9910);
+var G__9912 = cljs.core.first(seq9910__$1);
+var seq9910__$2 = cljs.core.next(seq9910__$1);
+return cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$variadic(G__9911,G__9912,seq9910__$2);
+});
+
+cljs.core.not_EQ_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * If coll is empty, returns nil, else coll
+ */
+cljs.core.not_empty = (function cljs$core$not_empty(coll){
+if(cljs.core.seq(coll)){
+return coll;
+} else {
+return null;
+}
+});
+cljs.core.nil_iter = (function cljs$core$nil_iter(){
+if(typeof cljs.core.t_cljs$core9922 !== 'undefined'){
+} else {
+
+/**
+* @constructor
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.t_cljs$core9922 = (function (meta9923){
+this.meta9923 = meta9923;
+this.cljs$lang$protocol_mask$partition0$ = 393216;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.t_cljs$core9922.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_9924,meta9923__$1){
+var self__ = this;
+var _9924__$1 = this;
+return (new cljs.core.t_cljs$core9922(meta9923__$1));
+});
+
+cljs.core.t_cljs$core9922.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_9924){
+var self__ = this;
+var _9924__$1 = this;
+return self__.meta9923;
+});
+
+cljs.core.t_cljs$core9922.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return false;
+});
+
+cljs.core.t_cljs$core9922.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("No such element"));
+});
+
+cljs.core.t_cljs$core9922.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.t_cljs$core9922.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta9923","meta9923",1540659892,null)], null);
+});
+
+cljs.core.t_cljs$core9922.cljs$lang$type = true;
+
+cljs.core.t_cljs$core9922.cljs$lang$ctorStr = "cljs.core/t_cljs$core9922";
+
+cljs.core.t_cljs$core9922.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/t_cljs$core9922");
+});
+
+cljs.core.__GT_t_cljs$core9922 = (function cljs$core$nil_iter_$___GT_t_cljs$core9922(meta9923){
+return (new cljs.core.t_cljs$core9922(meta9923));
+});
+
+}
+
+return (new cljs.core.t_cljs$core9922(cljs.core.PersistentArrayMap.EMPTY));
+});
+
+/**
+* @constructor
+*/
+cljs.core.StringIter = (function (s,i){
+this.s = s;
+this.i = i;
+})
+cljs.core.StringIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return (self__.i < self__.s.length);
+});
+
+cljs.core.StringIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var ret = self__.s.charAt(self__.i);
+self__.i = (self__.i + (1));
+
+return ret;
+});
+
+cljs.core.StringIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.StringIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"s","s",-948495851,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.StringIter.cljs$lang$type = true;
+
+cljs.core.StringIter.cljs$lang$ctorStr = "cljs.core/StringIter";
+
+cljs.core.StringIter.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/StringIter");
+});
+
+cljs.core.__GT_StringIter = (function cljs$core$__GT_StringIter(s,i){
+return (new cljs.core.StringIter(s,i));
+});
+
+cljs.core.string_iter = (function cljs$core$string_iter(x){
+return (new cljs.core.StringIter(x,(0)));
+});
+
+/**
+* @constructor
+*/
+cljs.core.ArrayIter = (function (arr,i){
+this.arr = arr;
+this.i = i;
+})
+cljs.core.ArrayIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return (self__.i < self__.arr.length);
+});
+
+cljs.core.ArrayIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var ret = (self__.arr[self__.i]);
+self__.i = (self__.i + (1));
+
+return ret;
+});
+
+cljs.core.ArrayIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.ArrayIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ArrayIter.cljs$lang$type = true;
+
+cljs.core.ArrayIter.cljs$lang$ctorStr = "cljs.core/ArrayIter";
+
+cljs.core.ArrayIter.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ArrayIter");
+});
+
+cljs.core.__GT_ArrayIter = (function cljs$core$__GT_ArrayIter(arr,i){
+return (new cljs.core.ArrayIter(arr,i));
+});
+
+cljs.core.array_iter = (function cljs$core$array_iter(x){
+return (new cljs.core.ArrayIter(x,(0)));
+});
+cljs.core.INIT = ({});
+cljs.core.START = ({});
+
+/**
+* @constructor
+*/
+cljs.core.SeqIter = (function (_seq,_next){
+this._seq = _seq;
+this._next = _next;
+})
+cljs.core.SeqIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+if((self__._seq === cljs.core.INIT)){
+self__._seq = cljs.core.START;
+
+self__._next = cljs.core.seq(self__._next);
+} else {
+if((self__._seq === self__._next)){
+self__._next = cljs.core.next(self__._seq);
+} else {
+}
+}
+
+return !((self__._next == null));
+});
+
+cljs.core.SeqIter.prototype.next = (function (){
+var self__ = this;
+var this$ = this;
+if(!(this$.hasNext())){
+throw (new Error("No such element"));
+} else {
+self__._seq = self__._next;
+
+return cljs.core.first(self__._next);
+}
+});
+
+cljs.core.SeqIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.SeqIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"_seq","_seq",-449557847,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"_next","_next",101877036,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.SeqIter.cljs$lang$type = true;
+
+cljs.core.SeqIter.cljs$lang$ctorStr = "cljs.core/SeqIter";
+
+cljs.core.SeqIter.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/SeqIter");
+});
+
+cljs.core.__GT_SeqIter = (function cljs$core$__GT_SeqIter(_seq,_next){
+return (new cljs.core.SeqIter(_seq,_next));
+});
+
+cljs.core.seq_iter = (function cljs$core$seq_iter(coll){
+return (new cljs.core.SeqIter(cljs.core.INIT,coll));
+});
+cljs.core.iter = (function cljs$core$iter(coll){
+if((coll == null)){
+return cljs.core.nil_iter();
+} else {
+if(typeof coll === 'string'){
+return cljs.core.string_iter(coll);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+return cljs.core.array_iter(coll);
+} else {
+if(cljs.core.iterable_QMARK_(coll)){
+return cljs.core._iterator(coll);
+} else {
+if(cljs.core.seqable_QMARK_(coll)){
+return cljs.core.seq_iter(coll);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Cannot create iterator from "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(coll)].join('')));
+
+}
+}
+}
+}
+}
+});
+cljs.core.lazy_transformer = (function cljs$core$lazy_transformer(stepper){
+return (new cljs.core.LazyTransformer(stepper,null,null,null));
+});
+
+/**
+* @constructor
+*/
+cljs.core.Stepper = (function (xform,iter){
+this.xform = xform;
+this.iter = iter;
+})
+cljs.core.Stepper.prototype.step = (function (lt){
+var self__ = this;
+var this$ = this;
+while(true){
+if(cljs.core.truth_((function (){var and__6500__auto__ = !((lt.stepper == null));
+if(and__6500__auto__){
+return self__.iter.hasNext();
+} else {
+return and__6500__auto__;
+}
+})())){
+if(cljs.core.reduced_QMARK_((function (){var G__9925 = lt;
+var G__9926 = self__.iter.next();
+return (self__.xform.cljs$core$IFn$_invoke$arity$2 ? self__.xform.cljs$core$IFn$_invoke$arity$2(G__9925,G__9926) : self__.xform.call(null,G__9925,G__9926));
+})())){
+if((lt.rest == null)){
+} else {
+lt.rest.stepper = null;
+}
+} else {
+continue;
+}
+} else {
+}
+break;
+}
+
+if((lt.stepper == null)){
+return null;
+} else {
+return (self__.xform.cljs$core$IFn$_invoke$arity$1 ? self__.xform.cljs$core$IFn$_invoke$arity$1(lt) : self__.xform.call(null,lt));
+}
+});
+
+cljs.core.Stepper.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"xform","xform",-85179481,null),new cljs.core.Symbol(null,"iter","iter",-1346195486,null)], null);
+});
+
+cljs.core.Stepper.cljs$lang$type = true;
+
+cljs.core.Stepper.cljs$lang$ctorStr = "cljs.core/Stepper";
+
+cljs.core.Stepper.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Stepper");
+});
+
+cljs.core.__GT_Stepper = (function cljs$core$__GT_Stepper(xform,iter){
+return (new cljs.core.Stepper(xform,iter));
+});
+
+cljs.core.stepper = (function cljs$core$stepper(xform,iter){
+var stepfn = (function() {
+var cljs$core$stepper_$_stepfn = null;
+var cljs$core$stepper_$_stepfn__1 = (function (result){
+var lt = ((cljs.core.reduced_QMARK_(result))?cljs.core.deref(result):result);
+lt.stepper = null;
+
+return result;
+});
+var cljs$core$stepper_$_stepfn__2 = (function (result,input){
+var lt = result;
+lt.first = input;
+
+lt.rest = cljs.core.lazy_transformer(lt.stepper);
+
+lt.stepper = null;
+
+return lt.rest;
+});
+cljs$core$stepper_$_stepfn = function(result,input){
+switch(arguments.length){
+case 1:
+return cljs$core$stepper_$_stepfn__1.call(this,result);
+case 2:
+return cljs$core$stepper_$_stepfn__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$stepper_$_stepfn.cljs$core$IFn$_invoke$arity$1 = cljs$core$stepper_$_stepfn__1;
+cljs$core$stepper_$_stepfn.cljs$core$IFn$_invoke$arity$2 = cljs$core$stepper_$_stepfn__2;
+return cljs$core$stepper_$_stepfn;
+})()
+;
+return (new cljs.core.Stepper((xform.cljs$core$IFn$_invoke$arity$1 ? xform.cljs$core$IFn$_invoke$arity$1(stepfn) : xform.call(null,stepfn)),iter));
+});
+
+/**
+* @constructor
+*/
+cljs.core.MultiStepper = (function (xform,iters,nexts){
+this.xform = xform;
+this.iters = iters;
+this.nexts = nexts;
+})
+cljs.core.MultiStepper.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+var iters__$1 = cljs.core.seq(self__.iters);
+while(true){
+if(!((iters__$1 == null))){
+var iter = cljs.core.first(iters__$1);
+if(!(iter.hasNext())){
+return false;
+} else {
+var G__9927 = cljs.core.next(iters__$1);
+iters__$1 = G__9927;
+continue;
+}
+} else {
+return true;
+}
+break;
+}
+});
+
+cljs.core.MultiStepper.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var n__7435__auto___9928 = self__.iters.length;
+var i_9929 = (0);
+while(true){
+if((i_9929 < n__7435__auto___9928)){
+(self__.nexts[i_9929] = (self__.iters[i_9929]).next());
+
+var G__9930 = (i_9929 + (1));
+i_9929 = G__9930;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(self__.nexts,(0));
+});
+
+cljs.core.MultiStepper.prototype.step = (function (lt){
+var self__ = this;
+var this$ = this;
+while(true){
+if(cljs.core.truth_((function (){var and__6500__auto__ = !((lt.stepper == null));
+if(and__6500__auto__){
+return this$.hasNext();
+} else {
+return and__6500__auto__;
+}
+})())){
+if(cljs.core.reduced_QMARK_(cljs.core.apply.cljs$core$IFn$_invoke$arity$2(self__.xform,cljs.core.cons(lt,this$.next())))){
+if((lt.rest == null)){
+} else {
+lt.rest.stepper = null;
+}
+} else {
+continue;
+}
+} else {
+}
+break;
+}
+
+if((lt.stepper == null)){
+return null;
+} else {
+return (self__.xform.cljs$core$IFn$_invoke$arity$1 ? self__.xform.cljs$core$IFn$_invoke$arity$1(lt) : self__.xform.call(null,lt));
+}
+});
+
+cljs.core.MultiStepper.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"xform","xform",-85179481,null),new cljs.core.Symbol(null,"iters","iters",719353031,null),new cljs.core.Symbol(null,"nexts","nexts",-1683579407,null)], null);
+});
+
+cljs.core.MultiStepper.cljs$lang$type = true;
+
+cljs.core.MultiStepper.cljs$lang$ctorStr = "cljs.core/MultiStepper";
+
+cljs.core.MultiStepper.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/MultiStepper");
+});
+
+cljs.core.__GT_MultiStepper = (function cljs$core$__GT_MultiStepper(xform,iters,nexts){
+return (new cljs.core.MultiStepper(xform,iters,nexts));
+});
+
+cljs.core.multi_stepper = (function cljs$core$multi_stepper(var_args){
+var args9931 = [];
+var len__7625__auto___9934 = arguments.length;
+var i__7626__auto___9935 = (0);
+while(true){
+if((i__7626__auto___9935 < len__7625__auto___9934)){
+args9931.push((arguments[i__7626__auto___9935]));
+
+var G__9936 = (i__7626__auto___9935 + (1));
+i__7626__auto___9935 = G__9936;
+continue;
+} else {
+}
+break;
+}
+
+var G__9933 = args9931.length;
+switch (G__9933) {
+case 2:
+return cljs.core.multi_stepper.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.multi_stepper.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9931.length)].join('')));
+
+}
+});
+
+cljs.core.multi_stepper.cljs$core$IFn$_invoke$arity$2 = (function (xform,iters){
+return cljs.core.multi_stepper.cljs$core$IFn$_invoke$arity$3(xform,iters,(new Array(iters.length)));
+});
+
+cljs.core.multi_stepper.cljs$core$IFn$_invoke$arity$3 = (function (xform,iters,nexts){
+var stepfn = (function() {
+var cljs$core$stepfn = null;
+var cljs$core$stepfn__1 = (function (result){
+var lt = ((cljs.core.reduced_QMARK_(result))?cljs.core.deref(result):result);
+lt.stepper = null;
+
+return lt;
+});
+var cljs$core$stepfn__2 = (function (result,input){
+var lt = result;
+lt.first = input;
+
+lt.rest = cljs.core.lazy_transformer(lt.stepper);
+
+lt.stepper = null;
+
+return lt.rest;
+});
+cljs$core$stepfn = function(result,input){
+switch(arguments.length){
+case 1:
+return cljs$core$stepfn__1.call(this,result);
+case 2:
+return cljs$core$stepfn__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$stepfn.cljs$core$IFn$_invoke$arity$1 = cljs$core$stepfn__1;
+cljs$core$stepfn.cljs$core$IFn$_invoke$arity$2 = cljs$core$stepfn__2;
+return cljs$core$stepfn;
+})()
+;
+return (new cljs.core.MultiStepper((xform.cljs$core$IFn$_invoke$arity$1 ? xform.cljs$core$IFn$_invoke$arity$1(stepfn) : xform.call(null,stepfn)),iters,nexts));
+});
+
+cljs.core.multi_stepper.cljs$lang$maxFixedArity = 3;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.LazyTransformer = (function (stepper,first,rest,meta){
+this.stepper = stepper;
+this.first = first;
+this.rest = rest;
+this.meta = meta;
+this.cljs$lang$protocol_mask$partition0$ = 31850700;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.LazyTransformer.prototype.indexOf = (function() {
+var G__9938 = null;
+var G__9938__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__9938__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9938 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9938__1.call(this,x);
+case 2:
+return G__9938__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9938.cljs$core$IFn$_invoke$arity$1 = G__9938__1;
+G__9938.cljs$core$IFn$_invoke$arity$2 = G__9938__2;
+return G__9938;
+})()
+;
+
+cljs.core.LazyTransformer.prototype.lastIndexOf = (function() {
+var G__9939 = null;
+var G__9939__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__9939__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__9939 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__9939__1.call(this,x);
+case 2:
+return G__9939__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9939.cljs$core$IFn$_invoke$arity$1 = G__9939__1;
+G__9939.cljs$core$IFn$_invoke$arity$2 = G__9939__2;
+return G__9939;
+})()
+;
+
+cljs.core.LazyTransformer.prototype.cljs$core$IMeta$_meta$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return self__.meta;
+});
+
+cljs.core.LazyTransformer.prototype.cljs$core$INext$_next$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+if((self__.stepper == null)){
+} else {
+this$__$1.cljs$core$ISeqable$_seq$arity$1(null);
+}
+
+if((self__.rest == null)){
+return null;
+} else {
+return cljs.core._seq(self__.rest);
+}
+});
+
+cljs.core.LazyTransformer.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core.hash_ordered_coll(this$__$1);
+});
+
+cljs.core.LazyTransformer.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (this$,other){
+var self__ = this;
+var this$__$1 = this;
+var s = this$__$1.cljs$core$ISeqable$_seq$arity$1(null);
+if(!((s == null))){
+return cljs.core.equiv_sequential(this$__$1,other);
+} else {
+return (cljs.core.sequential_QMARK_(other)) && ((cljs.core.seq(other) == null));
+}
+});
+
+cljs.core.LazyTransformer.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core.List.EMPTY;
+});
+
+cljs.core.LazyTransformer.prototype.cljs$core$ISeq$_first$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+if((self__.stepper == null)){
+} else {
+this$__$1.cljs$core$ISeqable$_seq$arity$1(null);
+}
+
+if((self__.rest == null)){
+return null;
+} else {
+return self__.first;
+}
+});
+
+cljs.core.LazyTransformer.prototype.cljs$core$ISeq$_rest$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+if((self__.stepper == null)){
+} else {
+this$__$1.cljs$core$ISeqable$_seq$arity$1(null);
+}
+
+if((self__.rest == null)){
+return cljs.core.List.EMPTY;
+} else {
+return self__.rest;
+}
+});
+
+cljs.core.LazyTransformer.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+if((self__.stepper == null)){
+} else {
+self__.stepper.step(this$__$1);
+}
+
+if((self__.rest == null)){
+return null;
+} else {
+return this$__$1;
+}
+});
+
+cljs.core.LazyTransformer.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (this$,new_meta){
+var self__ = this;
+var this$__$1 = this;
+return (new cljs.core.LazyTransformer(self__.stepper,self__.first,self__.rest,new_meta));
+});
+
+cljs.core.LazyTransformer.prototype.cljs$core$ICollection$_conj$arity$2 = (function (this$,o){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core.cons(o,this$__$1.cljs$core$ISeqable$_seq$arity$1(null));
+});
+
+cljs.core.LazyTransformer.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"stepper","stepper",1159163296,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"first","first",996428481,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"rest","rest",398835108,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"meta","meta",-1154898805,null)], null);
+});
+
+cljs.core.LazyTransformer.cljs$lang$type = true;
+
+cljs.core.LazyTransformer.cljs$lang$ctorStr = "cljs.core/LazyTransformer";
+
+cljs.core.LazyTransformer.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/LazyTransformer");
+});
+
+cljs.core.__GT_LazyTransformer = (function cljs$core$__GT_LazyTransformer(stepper,first,rest,meta){
+return (new cljs.core.LazyTransformer(stepper,first,rest,meta));
+});
+
+(cljs.core.LazyTransformer.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+cljs.core.LazyTransformer.create = (function (xform,coll){
+return (new cljs.core.LazyTransformer(cljs.core.stepper(xform,cljs.core.iter(coll)),null,null,null));
+});
+cljs.core.LazyTransformer.createMulti = (function (xform,colls){
+var iters = [];
+var seq__9940_9944 = cljs.core.seq(colls);
+var chunk__9941_9945 = null;
+var count__9942_9946 = (0);
+var i__9943_9947 = (0);
+while(true){
+if((i__9943_9947 < count__9942_9946)){
+var coll_9948 = chunk__9941_9945.cljs$core$IIndexed$_nth$arity$2(null,i__9943_9947);
+iters.push(cljs.core.iter(coll_9948));
+
+var G__9949 = seq__9940_9944;
+var G__9950 = chunk__9941_9945;
+var G__9951 = count__9942_9946;
+var G__9952 = (i__9943_9947 + (1));
+seq__9940_9944 = G__9949;
+chunk__9941_9945 = G__9950;
+count__9942_9946 = G__9951;
+i__9943_9947 = G__9952;
+continue;
+} else {
+var temp__4657__auto___9953 = cljs.core.seq(seq__9940_9944);
+if(temp__4657__auto___9953){
+var seq__9940_9954__$1 = temp__4657__auto___9953;
+if(cljs.core.chunked_seq_QMARK_(seq__9940_9954__$1)){
+var c__7331__auto___9955 = cljs.core.chunk_first(seq__9940_9954__$1);
+var G__9956 = cljs.core.chunk_rest(seq__9940_9954__$1);
+var G__9957 = c__7331__auto___9955;
+var G__9958 = cljs.core.count(c__7331__auto___9955);
+var G__9959 = (0);
+seq__9940_9944 = G__9956;
+chunk__9941_9945 = G__9957;
+count__9942_9946 = G__9958;
+i__9943_9947 = G__9959;
+continue;
+} else {
+var coll_9960 = cljs.core.first(seq__9940_9954__$1);
+iters.push(cljs.core.iter(coll_9960));
+
+var G__9961 = cljs.core.next(seq__9940_9954__$1);
+var G__9962 = null;
+var G__9963 = (0);
+var G__9964 = (0);
+seq__9940_9944 = G__9961;
+chunk__9941_9945 = G__9962;
+count__9942_9946 = G__9963;
+i__9943_9947 = G__9964;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+return (new cljs.core.LazyTransformer(cljs.core.multi_stepper.cljs$core$IFn$_invoke$arity$3(xform,iters,(new Array(iters.length))),null,null,null));
+});
+/**
+ * Coerces coll to a (possibly empty) sequence, if it is not already
+ * one. Will not force a lazy seq. (sequence nil) yields (), When a
+ * transducer is supplied, returns a lazy sequence of applications of
+ * the transform to the items in coll(s), i.e. to the set of first
+ * items of each coll, followed by the set of second
+ * items in each coll, until any one of the colls is exhausted. Any
+ * remaining items in other colls are ignored. The transform should accept
+ * number-of-colls arguments
+ */
+cljs.core.sequence = (function cljs$core$sequence(var_args){
+var args9965 = [];
+var len__7625__auto___9971 = arguments.length;
+var i__7626__auto___9972 = (0);
+while(true){
+if((i__7626__auto___9972 < len__7625__auto___9971)){
+args9965.push((arguments[i__7626__auto___9972]));
+
+var G__9973 = (i__7626__auto___9972 + (1));
+i__7626__auto___9972 = G__9973;
+continue;
+} else {
+}
+break;
+}
+
+var G__9970 = args9965.length;
+switch (G__9970) {
+case 1:
+return cljs.core.sequence.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.sequence.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9965.slice((2)),(0),null));
+return cljs.core.sequence.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.sequence.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+if(cljs.core.seq_QMARK_(coll)){
+return coll;
+} else {
+var or__6512__auto__ = cljs.core.seq(coll);
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+return cljs.core.List.EMPTY;
+}
+}
+});
+
+cljs.core.sequence.cljs$core$IFn$_invoke$arity$2 = (function (xform,coll){
+return cljs.core.LazyTransformer.create(xform,coll);
+});
+
+cljs.core.sequence.cljs$core$IFn$_invoke$arity$variadic = (function (xform,coll,colls){
+return cljs.core.LazyTransformer.createMulti(xform,cljs.core.to_array(cljs.core.cons(coll,colls)));
+});
+
+cljs.core.sequence.cljs$lang$applyTo = (function (seq9966){
+var G__9967 = cljs.core.first(seq9966);
+var seq9966__$1 = cljs.core.next(seq9966);
+var G__9968 = cljs.core.first(seq9966__$1);
+var seq9966__$2 = cljs.core.next(seq9966__$1);
+return cljs.core.sequence.cljs$core$IFn$_invoke$arity$variadic(G__9967,G__9968,seq9966__$2);
+});
+
+cljs.core.sequence.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns true if (pred x) is logical true for every x in coll, else
+ * false.
+ */
+cljs.core.every_QMARK_ = (function cljs$core$every_QMARK_(pred,coll){
+while(true){
+if((cljs.core.seq(coll) == null)){
+return true;
+} else {
+if(cljs.core.truth_((function (){var G__9976 = cljs.core.first(coll);
+return (pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(G__9976) : pred.call(null,G__9976));
+})())){
+var G__9977 = pred;
+var G__9978 = cljs.core.next(coll);
+pred = G__9977;
+coll = G__9978;
+continue;
+} else {
+return false;
+
+}
+}
+break;
+}
+});
+/**
+ * Returns false if (pred x) is logical true for every x in
+ * coll, else true.
+ */
+cljs.core.not_every_QMARK_ = (function cljs$core$not_every_QMARK_(pred,coll){
+return !(cljs.core.every_QMARK_(pred,coll));
+});
+/**
+ * Returns the first logical true value of (pred x) for any x in coll,
+ * else nil. One common idiom is to use a set as pred, for example
+ * this will return :fred if :fred is in the sequence, otherwise nil:
+ * (some #{:fred} coll)
+ */
+cljs.core.some = (function cljs$core$some(pred,coll){
+while(true){
+if(cljs.core.seq(coll)){
+var or__6512__auto__ = (function (){var G__9982 = cljs.core.first(coll);
+return (pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(G__9982) : pred.call(null,G__9982));
+})();
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+var G__9983 = pred;
+var G__9984 = cljs.core.next(coll);
+pred = G__9983;
+coll = G__9984;
+continue;
+}
+} else {
+return null;
+}
+break;
+}
+});
+/**
+ * Returns false if (pred x) is logical true for any x in coll,
+ * else true.
+ */
+cljs.core.not_any_QMARK_ = (function cljs$core$not_any_QMARK_(pred,coll){
+return cljs.core.not(cljs.core.some(pred,coll));
+});
+/**
+ * Returns true if n is even, throws an exception if n is not an integer
+ */
+cljs.core.even_QMARK_ = (function cljs$core$even_QMARK_(n){
+if(cljs.core.integer_QMARK_(n)){
+return ((n & (1)) === (0));
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Argument must be an integer: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(n)].join('')));
+}
+});
+/**
+ * Returns true if n is odd, throws an exception if n is not an integer
+ */
+cljs.core.odd_QMARK_ = (function cljs$core$odd_QMARK_(n){
+return !(cljs.core.even_QMARK_(n));
+});
+/**
+ * Takes a fn f and returns a fn that takes the same arguments as f,
+ * has the same effects, if any, and returns the opposite truth value.
+ */
+cljs.core.complement = (function cljs$core$complement(f){
+return (function() {
+var G__9985 = null;
+var G__9985__0 = (function (){
+return cljs.core.not((f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)));
+});
+var G__9985__1 = (function (x){
+return cljs.core.not((f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x)));
+});
+var G__9985__2 = (function (x,y){
+return cljs.core.not((f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y)));
+});
+var G__9985__3 = (function() {
+var G__9986__delegate = function (x,y,zs){
+return cljs.core.not(cljs.core.apply.cljs$core$IFn$_invoke$arity$4(f,x,y,zs));
+};
+var G__9986 = function (x,y,var_args){
+var zs = null;
+if (arguments.length > 2) {
+var G__9987__i = 0, G__9987__a = new Array(arguments.length - 2);
+while (G__9987__i < G__9987__a.length) {G__9987__a[G__9987__i] = arguments[G__9987__i + 2]; ++G__9987__i;}
+ zs = new cljs.core.IndexedSeq(G__9987__a,0);
+}
+return G__9986__delegate.call(this,x,y,zs);};
+G__9986.cljs$lang$maxFixedArity = 2;
+G__9986.cljs$lang$applyTo = (function (arglist__9988){
+var x = cljs.core.first(arglist__9988);
+arglist__9988 = cljs.core.next(arglist__9988);
+var y = cljs.core.first(arglist__9988);
+var zs = cljs.core.rest(arglist__9988);
+return G__9986__delegate(x,y,zs);
+});
+G__9986.cljs$core$IFn$_invoke$arity$variadic = G__9986__delegate;
+return G__9986;
+})()
+;
+G__9985 = function(x,y,var_args){
+var zs = var_args;
+switch(arguments.length){
+case 0:
+return G__9985__0.call(this);
+case 1:
+return G__9985__1.call(this,x);
+case 2:
+return G__9985__2.call(this,x,y);
+default:
+var G__9989 = null;
+if (arguments.length > 2) {
+var G__9990__i = 0, G__9990__a = new Array(arguments.length - 2);
+while (G__9990__i < G__9990__a.length) {G__9990__a[G__9990__i] = arguments[G__9990__i + 2]; ++G__9990__i;}
+G__9989 = new cljs.core.IndexedSeq(G__9990__a,0);
+}
+return G__9985__3.cljs$core$IFn$_invoke$arity$variadic(x,y, G__9989);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__9985.cljs$lang$maxFixedArity = 2;
+G__9985.cljs$lang$applyTo = G__9985__3.cljs$lang$applyTo;
+G__9985.cljs$core$IFn$_invoke$arity$0 = G__9985__0;
+G__9985.cljs$core$IFn$_invoke$arity$1 = G__9985__1;
+G__9985.cljs$core$IFn$_invoke$arity$2 = G__9985__2;
+G__9985.cljs$core$IFn$_invoke$arity$variadic = G__9985__3.cljs$core$IFn$_invoke$arity$variadic;
+return G__9985;
+})()
+});
+/**
+ * Returns a function that takes any number of arguments and returns x.
+ */
+cljs.core.constantly = (function cljs$core$constantly(x){
+return (function() {
+var G__9991__delegate = function (args){
+return x;
+};
+var G__9991 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__9992__i = 0, G__9992__a = new Array(arguments.length - 0);
+while (G__9992__i < G__9992__a.length) {G__9992__a[G__9992__i] = arguments[G__9992__i + 0]; ++G__9992__i;}
+ args = new cljs.core.IndexedSeq(G__9992__a,0);
+}
+return G__9991__delegate.call(this,args);};
+G__9991.cljs$lang$maxFixedArity = 0;
+G__9991.cljs$lang$applyTo = (function (arglist__9993){
+var args = cljs.core.seq(arglist__9993);
+return G__9991__delegate(args);
+});
+G__9991.cljs$core$IFn$_invoke$arity$variadic = G__9991__delegate;
+return G__9991;
+})()
+;
+});
+/**
+ * Takes a set of functions and returns a fn that is the composition
+ * of those fns. The returned fn takes a variable number of args,
+ * applies the rightmost of fns to the args, the next
+ * fn (right-to-left) to the result, etc.
+ */
+cljs.core.comp = (function cljs$core$comp(var_args){
+var args9994 = [];
+var len__7625__auto___10016 = arguments.length;
+var i__7626__auto___10017 = (0);
+while(true){
+if((i__7626__auto___10017 < len__7625__auto___10016)){
+args9994.push((arguments[i__7626__auto___10017]));
+
+var G__10018 = (i__7626__auto___10017 + (1));
+i__7626__auto___10017 = G__10018;
+continue;
+} else {
+}
+break;
+}
+
+var G__10000 = args9994.length;
+switch (G__10000) {
+case 0:
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args9994.slice((3)),(0),null));
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.comp.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.identity;
+});
+
+cljs.core.comp.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return f;
+});
+
+cljs.core.comp.cljs$core$IFn$_invoke$arity$2 = (function (f,g){
+return (function() {
+var G__10020 = null;
+var G__10020__0 = (function (){
+var G__10001 = (g.cljs$core$IFn$_invoke$arity$0 ? g.cljs$core$IFn$_invoke$arity$0() : g.call(null));
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10001) : f.call(null,G__10001));
+});
+var G__10020__1 = (function (x){
+var G__10002 = (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(x) : g.call(null,x));
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10002) : f.call(null,G__10002));
+});
+var G__10020__2 = (function (x,y){
+var G__10003 = (g.cljs$core$IFn$_invoke$arity$2 ? g.cljs$core$IFn$_invoke$arity$2(x,y) : g.call(null,x,y));
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10003) : f.call(null,G__10003));
+});
+var G__10020__3 = (function (x,y,z){
+var G__10004 = (g.cljs$core$IFn$_invoke$arity$3 ? g.cljs$core$IFn$_invoke$arity$3(x,y,z) : g.call(null,x,y,z));
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10004) : f.call(null,G__10004));
+});
+var G__10020__4 = (function() {
+var G__10021__delegate = function (x,y,z,args){
+var G__10005 = cljs.core.apply.cljs$core$IFn$_invoke$arity$5(g,x,y,z,args);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10005) : f.call(null,G__10005));
+};
+var G__10021 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10022__i = 0, G__10022__a = new Array(arguments.length - 3);
+while (G__10022__i < G__10022__a.length) {G__10022__a[G__10022__i] = arguments[G__10022__i + 3]; ++G__10022__i;}
+ args = new cljs.core.IndexedSeq(G__10022__a,0);
+}
+return G__10021__delegate.call(this,x,y,z,args);};
+G__10021.cljs$lang$maxFixedArity = 3;
+G__10021.cljs$lang$applyTo = (function (arglist__10023){
+var x = cljs.core.first(arglist__10023);
+arglist__10023 = cljs.core.next(arglist__10023);
+var y = cljs.core.first(arglist__10023);
+arglist__10023 = cljs.core.next(arglist__10023);
+var z = cljs.core.first(arglist__10023);
+var args = cljs.core.rest(arglist__10023);
+return G__10021__delegate(x,y,z,args);
+});
+G__10021.cljs$core$IFn$_invoke$arity$variadic = G__10021__delegate;
+return G__10021;
+})()
+;
+G__10020 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__10020__0.call(this);
+case 1:
+return G__10020__1.call(this,x);
+case 2:
+return G__10020__2.call(this,x,y);
+case 3:
+return G__10020__3.call(this,x,y,z);
+default:
+var G__10024 = null;
+if (arguments.length > 3) {
+var G__10025__i = 0, G__10025__a = new Array(arguments.length - 3);
+while (G__10025__i < G__10025__a.length) {G__10025__a[G__10025__i] = arguments[G__10025__i + 3]; ++G__10025__i;}
+G__10024 = new cljs.core.IndexedSeq(G__10025__a,0);
+}
+return G__10020__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10024);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10020.cljs$lang$maxFixedArity = 3;
+G__10020.cljs$lang$applyTo = G__10020__4.cljs$lang$applyTo;
+G__10020.cljs$core$IFn$_invoke$arity$0 = G__10020__0;
+G__10020.cljs$core$IFn$_invoke$arity$1 = G__10020__1;
+G__10020.cljs$core$IFn$_invoke$arity$2 = G__10020__2;
+G__10020.cljs$core$IFn$_invoke$arity$3 = G__10020__3;
+G__10020.cljs$core$IFn$_invoke$arity$variadic = G__10020__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__10020;
+})()
+});
+
+cljs.core.comp.cljs$core$IFn$_invoke$arity$3 = (function (f,g,h){
+return (function() {
+var G__10026 = null;
+var G__10026__0 = (function (){
+var G__10006 = (function (){var G__10007 = (h.cljs$core$IFn$_invoke$arity$0 ? h.cljs$core$IFn$_invoke$arity$0() : h.call(null));
+return (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(G__10007) : g.call(null,G__10007));
+})();
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10006) : f.call(null,G__10006));
+});
+var G__10026__1 = (function (x){
+var G__10008 = (function (){var G__10009 = (h.cljs$core$IFn$_invoke$arity$1 ? h.cljs$core$IFn$_invoke$arity$1(x) : h.call(null,x));
+return (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(G__10009) : g.call(null,G__10009));
+})();
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10008) : f.call(null,G__10008));
+});
+var G__10026__2 = (function (x,y){
+var G__10010 = (function (){var G__10011 = (h.cljs$core$IFn$_invoke$arity$2 ? h.cljs$core$IFn$_invoke$arity$2(x,y) : h.call(null,x,y));
+return (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(G__10011) : g.call(null,G__10011));
+})();
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10010) : f.call(null,G__10010));
+});
+var G__10026__3 = (function (x,y,z){
+var G__10012 = (function (){var G__10013 = (h.cljs$core$IFn$_invoke$arity$3 ? h.cljs$core$IFn$_invoke$arity$3(x,y,z) : h.call(null,x,y,z));
+return (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(G__10013) : g.call(null,G__10013));
+})();
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10012) : f.call(null,G__10012));
+});
+var G__10026__4 = (function() {
+var G__10027__delegate = function (x,y,z,args){
+var G__10014 = (function (){var G__10015 = cljs.core.apply.cljs$core$IFn$_invoke$arity$5(h,x,y,z,args);
+return (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(G__10015) : g.call(null,G__10015));
+})();
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10014) : f.call(null,G__10014));
+};
+var G__10027 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10028__i = 0, G__10028__a = new Array(arguments.length - 3);
+while (G__10028__i < G__10028__a.length) {G__10028__a[G__10028__i] = arguments[G__10028__i + 3]; ++G__10028__i;}
+ args = new cljs.core.IndexedSeq(G__10028__a,0);
+}
+return G__10027__delegate.call(this,x,y,z,args);};
+G__10027.cljs$lang$maxFixedArity = 3;
+G__10027.cljs$lang$applyTo = (function (arglist__10029){
+var x = cljs.core.first(arglist__10029);
+arglist__10029 = cljs.core.next(arglist__10029);
+var y = cljs.core.first(arglist__10029);
+arglist__10029 = cljs.core.next(arglist__10029);
+var z = cljs.core.first(arglist__10029);
+var args = cljs.core.rest(arglist__10029);
+return G__10027__delegate(x,y,z,args);
+});
+G__10027.cljs$core$IFn$_invoke$arity$variadic = G__10027__delegate;
+return G__10027;
+})()
+;
+G__10026 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__10026__0.call(this);
+case 1:
+return G__10026__1.call(this,x);
+case 2:
+return G__10026__2.call(this,x,y);
+case 3:
+return G__10026__3.call(this,x,y,z);
+default:
+var G__10030 = null;
+if (arguments.length > 3) {
+var G__10031__i = 0, G__10031__a = new Array(arguments.length - 3);
+while (G__10031__i < G__10031__a.length) {G__10031__a[G__10031__i] = arguments[G__10031__i + 3]; ++G__10031__i;}
+G__10030 = new cljs.core.IndexedSeq(G__10031__a,0);
+}
+return G__10026__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10030);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10026.cljs$lang$maxFixedArity = 3;
+G__10026.cljs$lang$applyTo = G__10026__4.cljs$lang$applyTo;
+G__10026.cljs$core$IFn$_invoke$arity$0 = G__10026__0;
+G__10026.cljs$core$IFn$_invoke$arity$1 = G__10026__1;
+G__10026.cljs$core$IFn$_invoke$arity$2 = G__10026__2;
+G__10026.cljs$core$IFn$_invoke$arity$3 = G__10026__3;
+G__10026.cljs$core$IFn$_invoke$arity$variadic = G__10026__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__10026;
+})()
+});
+
+cljs.core.comp.cljs$core$IFn$_invoke$arity$variadic = (function (f1,f2,f3,fs){
+var fs__$1 = cljs.core.reverse(cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4(f1,f2,f3,fs));
+return ((function (fs__$1){
+return (function() {
+var G__10032__delegate = function (args){
+var ret = cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.first(fs__$1),args);
+var fs__$2 = cljs.core.next(fs__$1);
+while(true){
+if(fs__$2){
+var G__10033 = cljs.core.first(fs__$2).call(null,ret);
+var G__10034 = cljs.core.next(fs__$2);
+ret = G__10033;
+fs__$2 = G__10034;
+continue;
+} else {
+return ret;
+}
+break;
+}
+};
+var G__10032 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__10035__i = 0, G__10035__a = new Array(arguments.length - 0);
+while (G__10035__i < G__10035__a.length) {G__10035__a[G__10035__i] = arguments[G__10035__i + 0]; ++G__10035__i;}
+ args = new cljs.core.IndexedSeq(G__10035__a,0);
+}
+return G__10032__delegate.call(this,args);};
+G__10032.cljs$lang$maxFixedArity = 0;
+G__10032.cljs$lang$applyTo = (function (arglist__10036){
+var args = cljs.core.seq(arglist__10036);
+return G__10032__delegate(args);
+});
+G__10032.cljs$core$IFn$_invoke$arity$variadic = G__10032__delegate;
+return G__10032;
+})()
+;
+;})(fs__$1))
+});
+
+cljs.core.comp.cljs$lang$applyTo = (function (seq9995){
+var G__9996 = cljs.core.first(seq9995);
+var seq9995__$1 = cljs.core.next(seq9995);
+var G__9997 = cljs.core.first(seq9995__$1);
+var seq9995__$2 = cljs.core.next(seq9995__$1);
+var G__9998 = cljs.core.first(seq9995__$2);
+var seq9995__$3 = cljs.core.next(seq9995__$2);
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$variadic(G__9996,G__9997,G__9998,seq9995__$3);
+});
+
+cljs.core.comp.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Takes a function f and fewer than the normal arguments to f, and
+ * returns a fn that takes a variable number of additional args. When
+ * called, the returned function calls f with args + additional args.
+ */
+cljs.core.partial = (function cljs$core$partial(var_args){
+var args10037 = [];
+var len__7625__auto___10045 = arguments.length;
+var i__7626__auto___10046 = (0);
+while(true){
+if((i__7626__auto___10046 < len__7625__auto___10045)){
+args10037.push((arguments[i__7626__auto___10046]));
+
+var G__10047 = (i__7626__auto___10046 + (1));
+i__7626__auto___10046 = G__10047;
+continue;
+} else {
+}
+break;
+}
+
+var G__10044 = args10037.length;
+switch (G__10044) {
+case 1:
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10037.slice((4)),(0),null));
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.partial.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return f;
+});
+
+cljs.core.partial.cljs$core$IFn$_invoke$arity$2 = (function (f,arg1){
+return (function() {
+var G__10049 = null;
+var G__10049__0 = (function (){
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(arg1) : f.call(null,arg1));
+});
+var G__10049__1 = (function (x){
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(arg1,x) : f.call(null,arg1,x));
+});
+var G__10049__2 = (function (x,y){
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(arg1,x,y) : f.call(null,arg1,x,y));
+});
+var G__10049__3 = (function (x,y,z){
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(arg1,x,y,z) : f.call(null,arg1,x,y,z));
+});
+var G__10049__4 = (function() {
+var G__10050__delegate = function (x,y,z,args){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,arg1,x,y,z,cljs.core.array_seq([args], 0));
+};
+var G__10050 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10051__i = 0, G__10051__a = new Array(arguments.length - 3);
+while (G__10051__i < G__10051__a.length) {G__10051__a[G__10051__i] = arguments[G__10051__i + 3]; ++G__10051__i;}
+ args = new cljs.core.IndexedSeq(G__10051__a,0);
+}
+return G__10050__delegate.call(this,x,y,z,args);};
+G__10050.cljs$lang$maxFixedArity = 3;
+G__10050.cljs$lang$applyTo = (function (arglist__10052){
+var x = cljs.core.first(arglist__10052);
+arglist__10052 = cljs.core.next(arglist__10052);
+var y = cljs.core.first(arglist__10052);
+arglist__10052 = cljs.core.next(arglist__10052);
+var z = cljs.core.first(arglist__10052);
+var args = cljs.core.rest(arglist__10052);
+return G__10050__delegate(x,y,z,args);
+});
+G__10050.cljs$core$IFn$_invoke$arity$variadic = G__10050__delegate;
+return G__10050;
+})()
+;
+G__10049 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__10049__0.call(this);
+case 1:
+return G__10049__1.call(this,x);
+case 2:
+return G__10049__2.call(this,x,y);
+case 3:
+return G__10049__3.call(this,x,y,z);
+default:
+var G__10053 = null;
+if (arguments.length > 3) {
+var G__10054__i = 0, G__10054__a = new Array(arguments.length - 3);
+while (G__10054__i < G__10054__a.length) {G__10054__a[G__10054__i] = arguments[G__10054__i + 3]; ++G__10054__i;}
+G__10053 = new cljs.core.IndexedSeq(G__10054__a,0);
+}
+return G__10049__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10053);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10049.cljs$lang$maxFixedArity = 3;
+G__10049.cljs$lang$applyTo = G__10049__4.cljs$lang$applyTo;
+G__10049.cljs$core$IFn$_invoke$arity$0 = G__10049__0;
+G__10049.cljs$core$IFn$_invoke$arity$1 = G__10049__1;
+G__10049.cljs$core$IFn$_invoke$arity$2 = G__10049__2;
+G__10049.cljs$core$IFn$_invoke$arity$3 = G__10049__3;
+G__10049.cljs$core$IFn$_invoke$arity$variadic = G__10049__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__10049;
+})()
+});
+
+cljs.core.partial.cljs$core$IFn$_invoke$arity$3 = (function (f,arg1,arg2){
+return (function() {
+var G__10055 = null;
+var G__10055__0 = (function (){
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(arg1,arg2) : f.call(null,arg1,arg2));
+});
+var G__10055__1 = (function (x){
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(arg1,arg2,x) : f.call(null,arg1,arg2,x));
+});
+var G__10055__2 = (function (x,y){
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(arg1,arg2,x,y) : f.call(null,arg1,arg2,x,y));
+});
+var G__10055__3 = (function (x,y,z){
+return (f.cljs$core$IFn$_invoke$arity$5 ? f.cljs$core$IFn$_invoke$arity$5(arg1,arg2,x,y,z) : f.call(null,arg1,arg2,x,y,z));
+});
+var G__10055__4 = (function() {
+var G__10056__delegate = function (x,y,z,args){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,arg1,arg2,x,y,cljs.core.array_seq([z,args], 0));
+};
+var G__10056 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10057__i = 0, G__10057__a = new Array(arguments.length - 3);
+while (G__10057__i < G__10057__a.length) {G__10057__a[G__10057__i] = arguments[G__10057__i + 3]; ++G__10057__i;}
+ args = new cljs.core.IndexedSeq(G__10057__a,0);
+}
+return G__10056__delegate.call(this,x,y,z,args);};
+G__10056.cljs$lang$maxFixedArity = 3;
+G__10056.cljs$lang$applyTo = (function (arglist__10058){
+var x = cljs.core.first(arglist__10058);
+arglist__10058 = cljs.core.next(arglist__10058);
+var y = cljs.core.first(arglist__10058);
+arglist__10058 = cljs.core.next(arglist__10058);
+var z = cljs.core.first(arglist__10058);
+var args = cljs.core.rest(arglist__10058);
+return G__10056__delegate(x,y,z,args);
+});
+G__10056.cljs$core$IFn$_invoke$arity$variadic = G__10056__delegate;
+return G__10056;
+})()
+;
+G__10055 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__10055__0.call(this);
+case 1:
+return G__10055__1.call(this,x);
+case 2:
+return G__10055__2.call(this,x,y);
+case 3:
+return G__10055__3.call(this,x,y,z);
+default:
+var G__10059 = null;
+if (arguments.length > 3) {
+var G__10060__i = 0, G__10060__a = new Array(arguments.length - 3);
+while (G__10060__i < G__10060__a.length) {G__10060__a[G__10060__i] = arguments[G__10060__i + 3]; ++G__10060__i;}
+G__10059 = new cljs.core.IndexedSeq(G__10060__a,0);
+}
+return G__10055__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10059);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10055.cljs$lang$maxFixedArity = 3;
+G__10055.cljs$lang$applyTo = G__10055__4.cljs$lang$applyTo;
+G__10055.cljs$core$IFn$_invoke$arity$0 = G__10055__0;
+G__10055.cljs$core$IFn$_invoke$arity$1 = G__10055__1;
+G__10055.cljs$core$IFn$_invoke$arity$2 = G__10055__2;
+G__10055.cljs$core$IFn$_invoke$arity$3 = G__10055__3;
+G__10055.cljs$core$IFn$_invoke$arity$variadic = G__10055__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__10055;
+})()
+});
+
+cljs.core.partial.cljs$core$IFn$_invoke$arity$4 = (function (f,arg1,arg2,arg3){
+return (function() {
+var G__10061 = null;
+var G__10061__0 = (function (){
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(arg1,arg2,arg3) : f.call(null,arg1,arg2,arg3));
+});
+var G__10061__1 = (function (x){
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(arg1,arg2,arg3,x) : f.call(null,arg1,arg2,arg3,x));
+});
+var G__10061__2 = (function (x,y){
+return (f.cljs$core$IFn$_invoke$arity$5 ? f.cljs$core$IFn$_invoke$arity$5(arg1,arg2,arg3,x,y) : f.call(null,arg1,arg2,arg3,x,y));
+});
+var G__10061__3 = (function (x,y,z){
+return (f.cljs$core$IFn$_invoke$arity$6 ? f.cljs$core$IFn$_invoke$arity$6(arg1,arg2,arg3,x,y,z) : f.call(null,arg1,arg2,arg3,x,y,z));
+});
+var G__10061__4 = (function() {
+var G__10062__delegate = function (x,y,z,args){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,arg1,arg2,arg3,x,cljs.core.array_seq([y,z,args], 0));
+};
+var G__10062 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10063__i = 0, G__10063__a = new Array(arguments.length - 3);
+while (G__10063__i < G__10063__a.length) {G__10063__a[G__10063__i] = arguments[G__10063__i + 3]; ++G__10063__i;}
+ args = new cljs.core.IndexedSeq(G__10063__a,0);
+}
+return G__10062__delegate.call(this,x,y,z,args);};
+G__10062.cljs$lang$maxFixedArity = 3;
+G__10062.cljs$lang$applyTo = (function (arglist__10064){
+var x = cljs.core.first(arglist__10064);
+arglist__10064 = cljs.core.next(arglist__10064);
+var y = cljs.core.first(arglist__10064);
+arglist__10064 = cljs.core.next(arglist__10064);
+var z = cljs.core.first(arglist__10064);
+var args = cljs.core.rest(arglist__10064);
+return G__10062__delegate(x,y,z,args);
+});
+G__10062.cljs$core$IFn$_invoke$arity$variadic = G__10062__delegate;
+return G__10062;
+})()
+;
+G__10061 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__10061__0.call(this);
+case 1:
+return G__10061__1.call(this,x);
+case 2:
+return G__10061__2.call(this,x,y);
+case 3:
+return G__10061__3.call(this,x,y,z);
+default:
+var G__10065 = null;
+if (arguments.length > 3) {
+var G__10066__i = 0, G__10066__a = new Array(arguments.length - 3);
+while (G__10066__i < G__10066__a.length) {G__10066__a[G__10066__i] = arguments[G__10066__i + 3]; ++G__10066__i;}
+G__10065 = new cljs.core.IndexedSeq(G__10066__a,0);
+}
+return G__10061__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10065);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10061.cljs$lang$maxFixedArity = 3;
+G__10061.cljs$lang$applyTo = G__10061__4.cljs$lang$applyTo;
+G__10061.cljs$core$IFn$_invoke$arity$0 = G__10061__0;
+G__10061.cljs$core$IFn$_invoke$arity$1 = G__10061__1;
+G__10061.cljs$core$IFn$_invoke$arity$2 = G__10061__2;
+G__10061.cljs$core$IFn$_invoke$arity$3 = G__10061__3;
+G__10061.cljs$core$IFn$_invoke$arity$variadic = G__10061__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__10061;
+})()
+});
+
+cljs.core.partial.cljs$core$IFn$_invoke$arity$variadic = (function (f,arg1,arg2,arg3,more){
+return (function() {
+var G__10067__delegate = function (args){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,arg1,arg2,arg3,cljs.core.concat.cljs$core$IFn$_invoke$arity$2(more,args));
+};
+var G__10067 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__10068__i = 0, G__10068__a = new Array(arguments.length - 0);
+while (G__10068__i < G__10068__a.length) {G__10068__a[G__10068__i] = arguments[G__10068__i + 0]; ++G__10068__i;}
+ args = new cljs.core.IndexedSeq(G__10068__a,0);
+}
+return G__10067__delegate.call(this,args);};
+G__10067.cljs$lang$maxFixedArity = 0;
+G__10067.cljs$lang$applyTo = (function (arglist__10069){
+var args = cljs.core.seq(arglist__10069);
+return G__10067__delegate(args);
+});
+G__10067.cljs$core$IFn$_invoke$arity$variadic = G__10067__delegate;
+return G__10067;
+})()
+;
+});
+
+cljs.core.partial.cljs$lang$applyTo = (function (seq10038){
+var G__10039 = cljs.core.first(seq10038);
+var seq10038__$1 = cljs.core.next(seq10038);
+var G__10040 = cljs.core.first(seq10038__$1);
+var seq10038__$2 = cljs.core.next(seq10038__$1);
+var G__10041 = cljs.core.first(seq10038__$2);
+var seq10038__$3 = cljs.core.next(seq10038__$2);
+var G__10042 = cljs.core.first(seq10038__$3);
+var seq10038__$4 = cljs.core.next(seq10038__$3);
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$variadic(G__10039,G__10040,G__10041,G__10042,seq10038__$4);
+});
+
+cljs.core.partial.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Takes a function f, and returns a function that calls f, replacing
+ * a nil first argument to f with the supplied value x. Higher arity
+ * versions can replace arguments in the second and third
+ * positions (y, z). Note that the function f can take any number of
+ * arguments, not just the one(s) being nil-patched.
+ */
+cljs.core.fnil = (function cljs$core$fnil(var_args){
+var args10070 = [];
+var len__7625__auto___10089 = arguments.length;
+var i__7626__auto___10090 = (0);
+while(true){
+if((i__7626__auto___10090 < len__7625__auto___10089)){
+args10070.push((arguments[i__7626__auto___10090]));
+
+var G__10091 = (i__7626__auto___10090 + (1));
+i__7626__auto___10090 = G__10091;
+continue;
+} else {
+}
+break;
+}
+
+var G__10072 = args10070.length;
+switch (G__10072) {
+case 2:
+return cljs.core.fnil.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.fnil.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.fnil.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10070.length)].join('')));
+
+}
+});
+
+cljs.core.fnil.cljs$core$IFn$_invoke$arity$2 = (function (f,x){
+return (function() {
+var G__10093 = null;
+var G__10093__1 = (function (a){
+var G__10073 = (((a == null))?x:a);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10073) : f.call(null,G__10073));
+});
+var G__10093__2 = (function (a,b){
+var G__10074 = (((a == null))?x:a);
+var G__10075 = b;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10074,G__10075) : f.call(null,G__10074,G__10075));
+});
+var G__10093__3 = (function (a,b,c){
+var G__10076 = (((a == null))?x:a);
+var G__10077 = b;
+var G__10078 = c;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10076,G__10077,G__10078) : f.call(null,G__10076,G__10077,G__10078));
+});
+var G__10093__4 = (function() {
+var G__10094__delegate = function (a,b,c,ds){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,(((a == null))?x:a),b,c,ds);
+};
+var G__10094 = function (a,b,c,var_args){
+var ds = null;
+if (arguments.length > 3) {
+var G__10095__i = 0, G__10095__a = new Array(arguments.length - 3);
+while (G__10095__i < G__10095__a.length) {G__10095__a[G__10095__i] = arguments[G__10095__i + 3]; ++G__10095__i;}
+ ds = new cljs.core.IndexedSeq(G__10095__a,0);
+}
+return G__10094__delegate.call(this,a,b,c,ds);};
+G__10094.cljs$lang$maxFixedArity = 3;
+G__10094.cljs$lang$applyTo = (function (arglist__10096){
+var a = cljs.core.first(arglist__10096);
+arglist__10096 = cljs.core.next(arglist__10096);
+var b = cljs.core.first(arglist__10096);
+arglist__10096 = cljs.core.next(arglist__10096);
+var c = cljs.core.first(arglist__10096);
+var ds = cljs.core.rest(arglist__10096);
+return G__10094__delegate(a,b,c,ds);
+});
+G__10094.cljs$core$IFn$_invoke$arity$variadic = G__10094__delegate;
+return G__10094;
+})()
+;
+G__10093 = function(a,b,c,var_args){
+var ds = var_args;
+switch(arguments.length){
+case 1:
+return G__10093__1.call(this,a);
+case 2:
+return G__10093__2.call(this,a,b);
+case 3:
+return G__10093__3.call(this,a,b,c);
+default:
+var G__10097 = null;
+if (arguments.length > 3) {
+var G__10098__i = 0, G__10098__a = new Array(arguments.length - 3);
+while (G__10098__i < G__10098__a.length) {G__10098__a[G__10098__i] = arguments[G__10098__i + 3]; ++G__10098__i;}
+G__10097 = new cljs.core.IndexedSeq(G__10098__a,0);
+}
+return G__10093__4.cljs$core$IFn$_invoke$arity$variadic(a,b,c, G__10097);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10093.cljs$lang$maxFixedArity = 3;
+G__10093.cljs$lang$applyTo = G__10093__4.cljs$lang$applyTo;
+G__10093.cljs$core$IFn$_invoke$arity$1 = G__10093__1;
+G__10093.cljs$core$IFn$_invoke$arity$2 = G__10093__2;
+G__10093.cljs$core$IFn$_invoke$arity$3 = G__10093__3;
+G__10093.cljs$core$IFn$_invoke$arity$variadic = G__10093__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__10093;
+})()
+});
+
+cljs.core.fnil.cljs$core$IFn$_invoke$arity$3 = (function (f,x,y){
+return (function() {
+var G__10099 = null;
+var G__10099__2 = (function (a,b){
+var G__10079 = (((a == null))?x:a);
+var G__10080 = (((b == null))?y:b);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10079,G__10080) : f.call(null,G__10079,G__10080));
+});
+var G__10099__3 = (function (a,b,c){
+var G__10081 = (((a == null))?x:a);
+var G__10082 = (((b == null))?y:b);
+var G__10083 = c;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10081,G__10082,G__10083) : f.call(null,G__10081,G__10082,G__10083));
+});
+var G__10099__4 = (function() {
+var G__10100__delegate = function (a,b,c,ds){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,(((a == null))?x:a),(((b == null))?y:b),c,ds);
+};
+var G__10100 = function (a,b,c,var_args){
+var ds = null;
+if (arguments.length > 3) {
+var G__10101__i = 0, G__10101__a = new Array(arguments.length - 3);
+while (G__10101__i < G__10101__a.length) {G__10101__a[G__10101__i] = arguments[G__10101__i + 3]; ++G__10101__i;}
+ ds = new cljs.core.IndexedSeq(G__10101__a,0);
+}
+return G__10100__delegate.call(this,a,b,c,ds);};
+G__10100.cljs$lang$maxFixedArity = 3;
+G__10100.cljs$lang$applyTo = (function (arglist__10102){
+var a = cljs.core.first(arglist__10102);
+arglist__10102 = cljs.core.next(arglist__10102);
+var b = cljs.core.first(arglist__10102);
+arglist__10102 = cljs.core.next(arglist__10102);
+var c = cljs.core.first(arglist__10102);
+var ds = cljs.core.rest(arglist__10102);
+return G__10100__delegate(a,b,c,ds);
+});
+G__10100.cljs$core$IFn$_invoke$arity$variadic = G__10100__delegate;
+return G__10100;
+})()
+;
+G__10099 = function(a,b,c,var_args){
+var ds = var_args;
+switch(arguments.length){
+case 2:
+return G__10099__2.call(this,a,b);
+case 3:
+return G__10099__3.call(this,a,b,c);
+default:
+var G__10103 = null;
+if (arguments.length > 3) {
+var G__10104__i = 0, G__10104__a = new Array(arguments.length - 3);
+while (G__10104__i < G__10104__a.length) {G__10104__a[G__10104__i] = arguments[G__10104__i + 3]; ++G__10104__i;}
+G__10103 = new cljs.core.IndexedSeq(G__10104__a,0);
+}
+return G__10099__4.cljs$core$IFn$_invoke$arity$variadic(a,b,c, G__10103);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10099.cljs$lang$maxFixedArity = 3;
+G__10099.cljs$lang$applyTo = G__10099__4.cljs$lang$applyTo;
+G__10099.cljs$core$IFn$_invoke$arity$2 = G__10099__2;
+G__10099.cljs$core$IFn$_invoke$arity$3 = G__10099__3;
+G__10099.cljs$core$IFn$_invoke$arity$variadic = G__10099__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__10099;
+})()
+});
+
+cljs.core.fnil.cljs$core$IFn$_invoke$arity$4 = (function (f,x,y,z){
+return (function() {
+var G__10105 = null;
+var G__10105__2 = (function (a,b){
+var G__10084 = (((a == null))?x:a);
+var G__10085 = (((b == null))?y:b);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10084,G__10085) : f.call(null,G__10084,G__10085));
+});
+var G__10105__3 = (function (a,b,c){
+var G__10086 = (((a == null))?x:a);
+var G__10087 = (((b == null))?y:b);
+var G__10088 = (((c == null))?z:c);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10086,G__10087,G__10088) : f.call(null,G__10086,G__10087,G__10088));
+});
+var G__10105__4 = (function() {
+var G__10106__delegate = function (a,b,c,ds){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,(((a == null))?x:a),(((b == null))?y:b),(((c == null))?z:c),ds);
+};
+var G__10106 = function (a,b,c,var_args){
+var ds = null;
+if (arguments.length > 3) {
+var G__10107__i = 0, G__10107__a = new Array(arguments.length - 3);
+while (G__10107__i < G__10107__a.length) {G__10107__a[G__10107__i] = arguments[G__10107__i + 3]; ++G__10107__i;}
+ ds = new cljs.core.IndexedSeq(G__10107__a,0);
+}
+return G__10106__delegate.call(this,a,b,c,ds);};
+G__10106.cljs$lang$maxFixedArity = 3;
+G__10106.cljs$lang$applyTo = (function (arglist__10108){
+var a = cljs.core.first(arglist__10108);
+arglist__10108 = cljs.core.next(arglist__10108);
+var b = cljs.core.first(arglist__10108);
+arglist__10108 = cljs.core.next(arglist__10108);
+var c = cljs.core.first(arglist__10108);
+var ds = cljs.core.rest(arglist__10108);
+return G__10106__delegate(a,b,c,ds);
+});
+G__10106.cljs$core$IFn$_invoke$arity$variadic = G__10106__delegate;
+return G__10106;
+})()
+;
+G__10105 = function(a,b,c,var_args){
+var ds = var_args;
+switch(arguments.length){
+case 2:
+return G__10105__2.call(this,a,b);
+case 3:
+return G__10105__3.call(this,a,b,c);
+default:
+var G__10109 = null;
+if (arguments.length > 3) {
+var G__10110__i = 0, G__10110__a = new Array(arguments.length - 3);
+while (G__10110__i < G__10110__a.length) {G__10110__a[G__10110__i] = arguments[G__10110__i + 3]; ++G__10110__i;}
+G__10109 = new cljs.core.IndexedSeq(G__10110__a,0);
+}
+return G__10105__4.cljs$core$IFn$_invoke$arity$variadic(a,b,c, G__10109);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10105.cljs$lang$maxFixedArity = 3;
+G__10105.cljs$lang$applyTo = G__10105__4.cljs$lang$applyTo;
+G__10105.cljs$core$IFn$_invoke$arity$2 = G__10105__2;
+G__10105.cljs$core$IFn$_invoke$arity$3 = G__10105__3;
+G__10105.cljs$core$IFn$_invoke$arity$variadic = G__10105__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__10105;
+})()
+});
+
+cljs.core.fnil.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Returns a lazy sequence consisting of the result of applying f to 0
+ * and the first item of coll, followed by applying f to 1 and the second
+ * item in coll, etc, until coll is exhausted. Thus function f should
+ * accept 2 arguments, index and item. Returns a stateful transducer when
+ * no collection is provided.
+ */
+cljs.core.map_indexed = (function cljs$core$map_indexed(var_args){
+var args10111 = [];
+var len__7625__auto___10142 = arguments.length;
+var i__7626__auto___10143 = (0);
+while(true){
+if((i__7626__auto___10143 < len__7625__auto___10142)){
+args10111.push((arguments[i__7626__auto___10143]));
+
+var G__10144 = (i__7626__auto___10143 + (1));
+i__7626__auto___10143 = G__10144;
+continue;
+} else {
+}
+break;
+}
+
+var G__10113 = args10111.length;
+switch (G__10113) {
+case 1:
+return cljs.core.map_indexed.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.map_indexed.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10111.length)].join('')));
+
+}
+});
+
+cljs.core.map_indexed.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function (rf){
+var i = (cljs.core.volatile_BANG_.cljs$core$IFn$_invoke$arity$1 ? cljs.core.volatile_BANG_.cljs$core$IFn$_invoke$arity$1((-1)) : cljs.core.volatile_BANG_.call(null,(-1)));
+return ((function (i){
+return (function() {
+var G__10146 = null;
+var G__10146__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__10146__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__10146__2 = (function (result,input){
+var G__10114 = result;
+var G__10115 = (function (){var G__10116 = cljs.core._vreset_BANG_(i,(cljs.core._deref(i) + (1)));
+var G__10117 = input;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10116,G__10117) : f.call(null,G__10116,G__10117));
+})();
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(G__10114,G__10115) : rf.call(null,G__10114,G__10115));
+});
+G__10146 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__10146__0.call(this);
+case 1:
+return G__10146__1.call(this,result);
+case 2:
+return G__10146__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10146.cljs$core$IFn$_invoke$arity$0 = G__10146__0;
+G__10146.cljs$core$IFn$_invoke$arity$1 = G__10146__1;
+G__10146.cljs$core$IFn$_invoke$arity$2 = G__10146__2;
+return G__10146;
+})()
+;})(i))
+});
+});
+
+cljs.core.map_indexed.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+var mapi = (function cljs$core$mapi(idx,coll__$1){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll__$1);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s)){
+var c = cljs.core.chunk_first(s);
+var size = cljs.core.count(c);
+var b = cljs.core.chunk_buffer(size);
+var n__7435__auto___10147 = size;
+var i_10148 = (0);
+while(true){
+if((i_10148 < n__7435__auto___10147)){
+cljs.core.chunk_append(b,(function (){var G__10138 = (idx + i_10148);
+var G__10139 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_10148);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10138,G__10139) : f.call(null,G__10138,G__10139));
+})());
+
+var G__10149 = (i_10148 + (1));
+i_10148 = G__10149;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.chunk_cons(cljs.core.chunk(b),cljs$core$mapi((idx + size),cljs.core.chunk_rest(s)));
+} else {
+return cljs.core.cons((function (){var G__10140 = idx;
+var G__10141 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10140,G__10141) : f.call(null,G__10140,G__10141));
+})(),cljs$core$mapi((idx + (1)),cljs.core.rest(s)));
+}
+} else {
+return null;
+}
+}),null,null));
+});
+return mapi((0),coll);
+});
+
+cljs.core.map_indexed.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of the non-nil results of (f item). Note,
+ * this means false return values will be included. f must be free of
+ * side-effects. Returns a transducer when no collection is provided.
+ */
+cljs.core.keep = (function cljs$core$keep(var_args){
+var args10150 = [];
+var len__7625__auto___10155 = arguments.length;
+var i__7626__auto___10156 = (0);
+while(true){
+if((i__7626__auto___10156 < len__7625__auto___10155)){
+args10150.push((arguments[i__7626__auto___10156]));
+
+var G__10157 = (i__7626__auto___10156 + (1));
+i__7626__auto___10156 = G__10157;
+continue;
+} else {
+}
+break;
+}
+
+var G__10152 = args10150.length;
+switch (G__10152) {
+case 1:
+return cljs.core.keep.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.keep.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10150.length)].join('')));
+
+}
+});
+
+cljs.core.keep.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function (rf){
+return (function() {
+var G__10159 = null;
+var G__10159__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__10159__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__10159__2 = (function (result,input){
+var v = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(input) : f.call(null,input));
+if((v == null)){
+return result;
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v));
+}
+});
+G__10159 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__10159__0.call(this);
+case 1:
+return G__10159__1.call(this,result);
+case 2:
+return G__10159__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10159.cljs$core$IFn$_invoke$arity$0 = G__10159__0;
+G__10159.cljs$core$IFn$_invoke$arity$1 = G__10159__1;
+G__10159.cljs$core$IFn$_invoke$arity$2 = G__10159__2;
+return G__10159;
+})()
+});
+});
+
+cljs.core.keep.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s)){
+var c = cljs.core.chunk_first(s);
+var size = cljs.core.count(c);
+var b = cljs.core.chunk_buffer(size);
+var n__7435__auto___10160 = size;
+var i_10161 = (0);
+while(true){
+if((i_10161 < n__7435__auto___10160)){
+var x_10162 = (function (){var G__10153 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_10161);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10153) : f.call(null,G__10153));
+})();
+if((x_10162 == null)){
+} else {
+cljs.core.chunk_append(b,x_10162);
+}
+
+var G__10163 = (i_10161 + (1));
+i_10161 = G__10163;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.chunk_cons(cljs.core.chunk(b),cljs.core.keep.cljs$core$IFn$_invoke$arity$2(f,cljs.core.chunk_rest(s)));
+} else {
+var x = (function (){var G__10154 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10154) : f.call(null,G__10154));
+})();
+if((x == null)){
+return cljs.core.keep.cljs$core$IFn$_invoke$arity$2(f,cljs.core.rest(s));
+} else {
+return cljs.core.cons(x,cljs.core.keep.cljs$core$IFn$_invoke$arity$2(f,cljs.core.rest(s)));
+}
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.keep.cljs$lang$maxFixedArity = 2;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IWatchable}
+ * @implements {cljs.core.IAtom}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IDeref}
+*/
+cljs.core.Atom = (function (state,meta,validator,watches){
+this.state = state;
+this.meta = meta;
+this.validator = validator;
+this.watches = watches;
+this.cljs$lang$protocol_mask$partition1$ = 16386;
+this.cljs$lang$protocol_mask$partition0$ = 6455296;
+})
+cljs.core.Atom.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Atom.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (o,other){
+var self__ = this;
+var o__$1 = this;
+return (o__$1 === other);
+});
+
+cljs.core.Atom.prototype.cljs$core$IDeref$_deref$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.state;
+});
+
+cljs.core.Atom.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.meta;
+});
+
+cljs.core.Atom.prototype.cljs$core$IWatchable$_notify_watches$arity$3 = (function (this$,oldval,newval){
+var self__ = this;
+var this$__$1 = this;
+var seq__10164 = cljs.core.seq(self__.watches);
+var chunk__10165 = null;
+var count__10166 = (0);
+var i__10167 = (0);
+while(true){
+if((i__10167 < count__10166)){
+var vec__10168 = chunk__10165.cljs$core$IIndexed$_nth$arity$2(null,i__10167);
+var key = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10168,(0),null);
+var f = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10168,(1),null);
+(f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(key,this$__$1,oldval,newval) : f.call(null,key,this$__$1,oldval,newval));
+
+var G__10174 = seq__10164;
+var G__10175 = chunk__10165;
+var G__10176 = count__10166;
+var G__10177 = (i__10167 + (1));
+seq__10164 = G__10174;
+chunk__10165 = G__10175;
+count__10166 = G__10176;
+i__10167 = G__10177;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__10164);
+if(temp__4657__auto__){
+var seq__10164__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__10164__$1)){
+var c__7331__auto__ = cljs.core.chunk_first(seq__10164__$1);
+var G__10178 = cljs.core.chunk_rest(seq__10164__$1);
+var G__10179 = c__7331__auto__;
+var G__10180 = cljs.core.count(c__7331__auto__);
+var G__10181 = (0);
+seq__10164 = G__10178;
+chunk__10165 = G__10179;
+count__10166 = G__10180;
+i__10167 = G__10181;
+continue;
+} else {
+var vec__10171 = cljs.core.first(seq__10164__$1);
+var key = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10171,(0),null);
+var f = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10171,(1),null);
+(f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(key,this$__$1,oldval,newval) : f.call(null,key,this$__$1,oldval,newval));
+
+var G__10182 = cljs.core.next(seq__10164__$1);
+var G__10183 = null;
+var G__10184 = (0);
+var G__10185 = (0);
+seq__10164 = G__10182;
+chunk__10165 = G__10183;
+count__10166 = G__10184;
+i__10167 = G__10185;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.Atom.prototype.cljs$core$IWatchable$_add_watch$arity$3 = (function (this$,key,f){
+var self__ = this;
+var this$__$1 = this;
+this$__$1.watches = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(self__.watches,key,f);
+
+return this$__$1;
+});
+
+cljs.core.Atom.prototype.cljs$core$IWatchable$_remove_watch$arity$2 = (function (this$,key){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1.watches = cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2(self__.watches,key);
+});
+
+cljs.core.Atom.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return goog.getUid(this$__$1);
+});
+
+cljs.core.Atom.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"state","state",-348086572,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"validator","validator",-325659154,null),new cljs.core.Symbol(null,"watches","watches",1367433992,null)], null);
+});
+
+cljs.core.Atom.cljs$lang$type = true;
+
+cljs.core.Atom.cljs$lang$ctorStr = "cljs.core/Atom";
+
+cljs.core.Atom.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Atom");
+});
+
+cljs.core.__GT_Atom = (function cljs$core$__GT_Atom(state,meta,validator,watches){
+return (new cljs.core.Atom(state,meta,validator,watches));
+});
+
+/**
+ * Creates and returns an Atom with an initial value of x and zero or
+ * more options (in any order):
+ *
+ * :meta metadata-map
+ *
+ * :validator validate-fn
+ *
+ * If metadata-map is supplied, it will be come the metadata on the
+ * atom. validate-fn must be nil or a side-effect-free fn of one
+ * argument, which will be passed the intended new state on any state
+ * change. If the new state is unacceptable, the validate-fn should
+ * return false or throw an Error. If either of these error conditions
+ * occur, then the value of the atom will not change.
+ */
+cljs.core.atom = (function cljs$core$atom(var_args){
+var args10186 = [];
+var len__7625__auto___10194 = arguments.length;
+var i__7626__auto___10195 = (0);
+while(true){
+if((i__7626__auto___10195 < len__7625__auto___10194)){
+args10186.push((arguments[i__7626__auto___10195]));
+
+var G__10196 = (i__7626__auto___10195 + (1));
+i__7626__auto___10195 = G__10196;
+continue;
+} else {
+}
+break;
+}
+
+var G__10190 = args10186.length;
+switch (G__10190) {
+case 1:
+return cljs.core.atom.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10186.slice((1)),(0),null));
+return cljs.core.atom.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.atom.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (new cljs.core.Atom(x,null,null,null));
+});
+
+cljs.core.atom.cljs$core$IFn$_invoke$arity$variadic = (function (x,p__10191){
+var map__10192 = p__10191;
+var map__10192__$1 = ((((!((map__10192 == null)))?((((map__10192.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__10192.cljs$core$ISeq$)))?true:false):false))?cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.hash_map,map__10192):map__10192);
+var meta = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__10192__$1,new cljs.core.Keyword(null,"meta","meta",1499536964));
+var validator = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__10192__$1,new cljs.core.Keyword(null,"validator","validator",-1966190681));
+return (new cljs.core.Atom(x,meta,validator,null));
+});
+
+cljs.core.atom.cljs$lang$applyTo = (function (seq10187){
+var G__10188 = cljs.core.first(seq10187);
+var seq10187__$1 = cljs.core.next(seq10187);
+return cljs.core.atom.cljs$core$IFn$_invoke$arity$variadic(G__10188,seq10187__$1);
+});
+
+cljs.core.atom.cljs$lang$maxFixedArity = (1);
+
+/**
+ * Sets the value of atom to newval without regard for the
+ * current value. Returns new-value.
+ */
+cljs.core.reset_BANG_ = (function cljs$core$reset_BANG_(a,new_value){
+if((a instanceof cljs.core.Atom)){
+var validate = a.validator;
+if((validate == null)){
+} else {
+if(cljs.core.truth_((validate.cljs$core$IFn$_invoke$arity$1 ? validate.cljs$core$IFn$_invoke$arity$1(new_value) : validate.call(null,new_value)))){
+} else {
+throw (new Error("Validator rejected reference state"));
+}
+}
+
+var old_value = a.state;
+a.state = new_value;
+
+if((a.watches == null)){
+} else {
+cljs.core._notify_watches(a,old_value,new_value);
+}
+
+return new_value;
+} else {
+return cljs.core._reset_BANG_(a,new_value);
+}
+});
+/**
+ * Atomically swaps the value of atom to be:
+ * (apply f current-value-of-atom args). Note that f may be called
+ * multiple times, and thus should be free of side effects. Returns
+ * the value that was swapped in.
+ */
+cljs.core.swap_BANG_ = (function cljs$core$swap_BANG_(var_args){
+var args10198 = [];
+var len__7625__auto___10212 = arguments.length;
+var i__7626__auto___10213 = (0);
+while(true){
+if((i__7626__auto___10213 < len__7625__auto___10212)){
+args10198.push((arguments[i__7626__auto___10213]));
+
+var G__10214 = (i__7626__auto___10213 + (1));
+i__7626__auto___10213 = G__10214;
+continue;
+} else {
+}
+break;
+}
+
+var G__10205 = args10198.length;
+switch (G__10205) {
+case 2:
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10198.slice((4)),(0),null));
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (a,f){
+if((a instanceof cljs.core.Atom)){
+return cljs.core.reset_BANG_(a,(function (){var G__10206 = a.state;
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10206) : f.call(null,G__10206));
+})());
+} else {
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$2(a,f);
+}
+});
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3 = (function (a,f,x){
+if((a instanceof cljs.core.Atom)){
+return cljs.core.reset_BANG_(a,(function (){var G__10207 = a.state;
+var G__10208 = x;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10207,G__10208) : f.call(null,G__10207,G__10208));
+})());
+} else {
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$3(a,f,x);
+}
+});
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4 = (function (a,f,x,y){
+if((a instanceof cljs.core.Atom)){
+return cljs.core.reset_BANG_(a,(function (){var G__10209 = a.state;
+var G__10210 = x;
+var G__10211 = y;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10209,G__10210,G__10211) : f.call(null,G__10209,G__10210,G__10211));
+})());
+} else {
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$4(a,f,x,y);
+}
+});
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (a,f,x,y,more){
+if((a instanceof cljs.core.Atom)){
+return cljs.core.reset_BANG_(a,cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,a.state,x,y,more));
+} else {
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$5(a,f,x,y,more);
+}
+});
+
+cljs.core.swap_BANG_.cljs$lang$applyTo = (function (seq10199){
+var G__10200 = cljs.core.first(seq10199);
+var seq10199__$1 = cljs.core.next(seq10199);
+var G__10201 = cljs.core.first(seq10199__$1);
+var seq10199__$2 = cljs.core.next(seq10199__$1);
+var G__10202 = cljs.core.first(seq10199__$2);
+var seq10199__$3 = cljs.core.next(seq10199__$2);
+var G__10203 = cljs.core.first(seq10199__$3);
+var seq10199__$4 = cljs.core.next(seq10199__$3);
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__10200,G__10201,G__10202,G__10203,seq10199__$4);
+});
+
+cljs.core.swap_BANG_.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Atomically sets the value of atom to newval if and only if the
+ * current value of the atom is equal to oldval. Returns true if
+ * set happened, else false.
+ */
+cljs.core.compare_and_set_BANG_ = (function cljs$core$compare_and_set_BANG_(a,oldval,newval){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(a.cljs$core$IDeref$_deref$arity$1(null),oldval)){
+cljs.core.reset_BANG_(a,newval);
+
+return true;
+} else {
+return false;
+}
+});
+/**
+ * Sets the validator-fn for an atom. validator-fn must be nil or a
+ * side-effect-free fn of one argument, which will be passed the intended
+ * new state on any state change. If the new state is unacceptable, the
+ * validator-fn should return false or throw an Error. If the current state
+ * is not acceptable to the new validator, an Error will be thrown and the
+ * validator will not be changed.
+ */
+cljs.core.set_validator_BANG_ = (function cljs$core$set_validator_BANG_(iref,val){
+return iref.validator = val;
+});
+/**
+ * Gets the validator-fn for a var/ref/agent/atom.
+ */
+cljs.core.get_validator = (function cljs$core$get_validator(iref){
+return iref.validator;
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IVolatile}
+ * @implements {cljs.core.IDeref}
+*/
+cljs.core.Volatile = (function (state){
+this.state = state;
+this.cljs$lang$protocol_mask$partition0$ = 32768;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.Volatile.prototype.cljs$core$IVolatile$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Volatile.prototype.cljs$core$IVolatile$_vreset_BANG_$arity$2 = (function (_,new_state){
+var self__ = this;
+var ___$1 = this;
+return self__.state = new_state;
+});
+
+cljs.core.Volatile.prototype.cljs$core$IDeref$_deref$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.state;
+});
+
+cljs.core.Volatile.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"state","state",-348086572,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Volatile.cljs$lang$type = true;
+
+cljs.core.Volatile.cljs$lang$ctorStr = "cljs.core/Volatile";
+
+cljs.core.Volatile.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Volatile");
+});
+
+cljs.core.__GT_Volatile = (function cljs$core$__GT_Volatile(state){
+return (new cljs.core.Volatile(state));
+});
+
+/**
+ * Creates and returns a Volatile with an initial value of val.
+ */
+cljs.core.volatile_BANG_ = (function cljs$core$volatile_BANG_(val){
+return (new cljs.core.Volatile(val));
+});
+/**
+ * Returns true if x is a volatile.
+ */
+cljs.core.volatile_QMARK_ = (function cljs$core$volatile_QMARK_(x){
+return (x instanceof cljs.core.Volatile);
+});
+/**
+ * Sets the value of volatile to newval without regard for the
+ * current value. Returns newval.
+ */
+cljs.core.vreset_BANG_ = (function cljs$core$vreset_BANG_(vol,newval){
+return cljs.core._vreset_BANG_(vol,newval);
+});
+/**
+ * Returns a lazy sequence of the non-nil results of (f index item). Note,
+ * this means false return values will be included. f must be free of
+ * side-effects. Returns a stateful transducer when no collection is
+ * provided.
+ */
+cljs.core.keep_indexed = (function cljs$core$keep_indexed(var_args){
+var args10216 = [];
+var len__7625__auto___10247 = arguments.length;
+var i__7626__auto___10248 = (0);
+while(true){
+if((i__7626__auto___10248 < len__7625__auto___10247)){
+args10216.push((arguments[i__7626__auto___10248]));
+
+var G__10249 = (i__7626__auto___10248 + (1));
+i__7626__auto___10248 = G__10249;
+continue;
+} else {
+}
+break;
+}
+
+var G__10218 = args10216.length;
+switch (G__10218) {
+case 1:
+return cljs.core.keep_indexed.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.keep_indexed.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10216.length)].join('')));
+
+}
+});
+
+cljs.core.keep_indexed.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function (rf){
+var ia = cljs.core.volatile_BANG_((-1));
+return ((function (ia){
+return (function() {
+var G__10251 = null;
+var G__10251__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__10251__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__10251__2 = (function (result,input){
+var i = cljs.core._vreset_BANG_(ia,(cljs.core._deref(ia) + (1)));
+var v = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(i,input) : f.call(null,i,input));
+if((v == null)){
+return result;
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v));
+}
+});
+G__10251 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__10251__0.call(this);
+case 1:
+return G__10251__1.call(this,result);
+case 2:
+return G__10251__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10251.cljs$core$IFn$_invoke$arity$0 = G__10251__0;
+G__10251.cljs$core$IFn$_invoke$arity$1 = G__10251__1;
+G__10251.cljs$core$IFn$_invoke$arity$2 = G__10251__2;
+return G__10251;
+})()
+;})(ia))
+});
+});
+
+cljs.core.keep_indexed.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+var keepi = (function cljs$core$keepi(idx,coll__$1){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll__$1);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s)){
+var c = cljs.core.chunk_first(s);
+var size = cljs.core.count(c);
+var b = cljs.core.chunk_buffer(size);
+var n__7435__auto___10252 = size;
+var i_10253 = (0);
+while(true){
+if((i_10253 < n__7435__auto___10252)){
+var x_10254 = (function (){var G__10243 = (idx + i_10253);
+var G__10244 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_10253);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10243,G__10244) : f.call(null,G__10243,G__10244));
+})();
+if((x_10254 == null)){
+} else {
+cljs.core.chunk_append(b,x_10254);
+}
+
+var G__10255 = (i_10253 + (1));
+i_10253 = G__10255;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.chunk_cons(cljs.core.chunk(b),cljs$core$keepi((idx + size),cljs.core.chunk_rest(s)));
+} else {
+var x = (function (){var G__10245 = idx;
+var G__10246 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10245,G__10246) : f.call(null,G__10245,G__10246));
+})();
+if((x == null)){
+return cljs$core$keepi((idx + (1)),cljs.core.rest(s));
+} else {
+return cljs.core.cons(x,cljs$core$keepi((idx + (1)),cljs.core.rest(s)));
+}
+}
+} else {
+return null;
+}
+}),null,null));
+});
+return keepi((0),coll);
+});
+
+cljs.core.keep_indexed.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Takes a set of predicates and returns a function f that returns true if all of its
+ * composing predicates return a logical true value against all of its arguments, else it returns
+ * false. Note that f is short-circuiting in that it will stop execution on the first
+ * argument that triggers a logical false result against the original predicates.
+ */
+cljs.core.every_pred = (function cljs$core$every_pred(var_args){
+var args10262 = [];
+var len__7625__auto___10269 = arguments.length;
+var i__7626__auto___10270 = (0);
+while(true){
+if((i__7626__auto___10270 < len__7625__auto___10269)){
+args10262.push((arguments[i__7626__auto___10270]));
+
+var G__10271 = (i__7626__auto___10270 + (1));
+i__7626__auto___10270 = G__10271;
+continue;
+} else {
+}
+break;
+}
+
+var G__10268 = args10262.length;
+switch (G__10268) {
+case 1:
+return cljs.core.every_pred.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.every_pred.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.every_pred.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10262.slice((3)),(0),null));
+return cljs.core.every_pred.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.every_pred.cljs$core$IFn$_invoke$arity$1 = (function (p){
+return (function() {
+var cljs$core$ep1 = null;
+var cljs$core$ep1__0 = (function (){
+return true;
+});
+var cljs$core$ep1__1 = (function (x){
+return cljs.core.boolean$((p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x)));
+});
+var cljs$core$ep1__2 = (function (x,y){
+return cljs.core.boolean$((function (){var and__6500__auto__ = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x));
+if(cljs.core.truth_(and__6500__auto__)){
+return (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(y) : p.call(null,y));
+} else {
+return and__6500__auto__;
+}
+})());
+});
+var cljs$core$ep1__3 = (function (x,y,z){
+return cljs.core.boolean$((function (){var and__6500__auto__ = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x));
+if(cljs.core.truth_(and__6500__auto__)){
+var and__6500__auto____$1 = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(y) : p.call(null,y));
+if(cljs.core.truth_(and__6500__auto____$1)){
+return (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(z) : p.call(null,z));
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+})());
+});
+var cljs$core$ep1__4 = (function() {
+var G__10273__delegate = function (x,y,z,args){
+return cljs.core.boolean$((function (){var and__6500__auto__ = cljs$core$ep1.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(and__6500__auto__)){
+return cljs.core.every_QMARK_(p,args);
+} else {
+return and__6500__auto__;
+}
+})());
+};
+var G__10273 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10274__i = 0, G__10274__a = new Array(arguments.length - 3);
+while (G__10274__i < G__10274__a.length) {G__10274__a[G__10274__i] = arguments[G__10274__i + 3]; ++G__10274__i;}
+ args = new cljs.core.IndexedSeq(G__10274__a,0);
+}
+return G__10273__delegate.call(this,x,y,z,args);};
+G__10273.cljs$lang$maxFixedArity = 3;
+G__10273.cljs$lang$applyTo = (function (arglist__10275){
+var x = cljs.core.first(arglist__10275);
+arglist__10275 = cljs.core.next(arglist__10275);
+var y = cljs.core.first(arglist__10275);
+arglist__10275 = cljs.core.next(arglist__10275);
+var z = cljs.core.first(arglist__10275);
+var args = cljs.core.rest(arglist__10275);
+return G__10273__delegate(x,y,z,args);
+});
+G__10273.cljs$core$IFn$_invoke$arity$variadic = G__10273__delegate;
+return G__10273;
+})()
+;
+cljs$core$ep1 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$ep1__0.call(this);
+case 1:
+return cljs$core$ep1__1.call(this,x);
+case 2:
+return cljs$core$ep1__2.call(this,x,y);
+case 3:
+return cljs$core$ep1__3.call(this,x,y,z);
+default:
+var G__10276 = null;
+if (arguments.length > 3) {
+var G__10277__i = 0, G__10277__a = new Array(arguments.length - 3);
+while (G__10277__i < G__10277__a.length) {G__10277__a[G__10277__i] = arguments[G__10277__i + 3]; ++G__10277__i;}
+G__10276 = new cljs.core.IndexedSeq(G__10277__a,0);
+}
+return cljs$core$ep1__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10276);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$ep1.cljs$lang$maxFixedArity = 3;
+cljs$core$ep1.cljs$lang$applyTo = cljs$core$ep1__4.cljs$lang$applyTo;
+cljs$core$ep1.cljs$core$IFn$_invoke$arity$0 = cljs$core$ep1__0;
+cljs$core$ep1.cljs$core$IFn$_invoke$arity$1 = cljs$core$ep1__1;
+cljs$core$ep1.cljs$core$IFn$_invoke$arity$2 = cljs$core$ep1__2;
+cljs$core$ep1.cljs$core$IFn$_invoke$arity$3 = cljs$core$ep1__3;
+cljs$core$ep1.cljs$core$IFn$_invoke$arity$variadic = cljs$core$ep1__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$ep1;
+})()
+});
+
+cljs.core.every_pred.cljs$core$IFn$_invoke$arity$2 = (function (p1,p2){
+return (function() {
+var cljs$core$ep2 = null;
+var cljs$core$ep2__0 = (function (){
+return true;
+});
+var cljs$core$ep2__1 = (function (x){
+return cljs.core.boolean$((function (){var and__6500__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__6500__auto__)){
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+} else {
+return and__6500__auto__;
+}
+})());
+});
+var cljs$core$ep2__2 = (function (x,y){
+return cljs.core.boolean$((function (){var and__6500__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__6500__auto__)){
+var and__6500__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(and__6500__auto____$1)){
+var and__6500__auto____$2 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(and__6500__auto____$2)){
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+} else {
+return and__6500__auto____$2;
+}
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+})());
+});
+var cljs$core$ep2__3 = (function (x,y,z){
+return cljs.core.boolean$((function (){var and__6500__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__6500__auto__)){
+var and__6500__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(and__6500__auto____$1)){
+var and__6500__auto____$2 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(z) : p1.call(null,z));
+if(cljs.core.truth_(and__6500__auto____$2)){
+var and__6500__auto____$3 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(and__6500__auto____$3)){
+var and__6500__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(and__6500__auto____$4)){
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(z) : p2.call(null,z));
+} else {
+return and__6500__auto____$4;
+}
+} else {
+return and__6500__auto____$3;
+}
+} else {
+return and__6500__auto____$2;
+}
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+})());
+});
+var cljs$core$ep2__4 = (function() {
+var G__10278__delegate = function (x,y,z,args){
+return cljs.core.boolean$((function (){var and__6500__auto__ = cljs$core$ep2.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(and__6500__auto__)){
+return cljs.core.every_QMARK_(((function (and__6500__auto__){
+return (function (p1__10256_SHARP_){
+var and__6500__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(p1__10256_SHARP_) : p1.call(null,p1__10256_SHARP_));
+if(cljs.core.truth_(and__6500__auto____$1)){
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(p1__10256_SHARP_) : p2.call(null,p1__10256_SHARP_));
+} else {
+return and__6500__auto____$1;
+}
+});})(and__6500__auto__))
+,args);
+} else {
+return and__6500__auto__;
+}
+})());
+};
+var G__10278 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10279__i = 0, G__10279__a = new Array(arguments.length - 3);
+while (G__10279__i < G__10279__a.length) {G__10279__a[G__10279__i] = arguments[G__10279__i + 3]; ++G__10279__i;}
+ args = new cljs.core.IndexedSeq(G__10279__a,0);
+}
+return G__10278__delegate.call(this,x,y,z,args);};
+G__10278.cljs$lang$maxFixedArity = 3;
+G__10278.cljs$lang$applyTo = (function (arglist__10280){
+var x = cljs.core.first(arglist__10280);
+arglist__10280 = cljs.core.next(arglist__10280);
+var y = cljs.core.first(arglist__10280);
+arglist__10280 = cljs.core.next(arglist__10280);
+var z = cljs.core.first(arglist__10280);
+var args = cljs.core.rest(arglist__10280);
+return G__10278__delegate(x,y,z,args);
+});
+G__10278.cljs$core$IFn$_invoke$arity$variadic = G__10278__delegate;
+return G__10278;
+})()
+;
+cljs$core$ep2 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$ep2__0.call(this);
+case 1:
+return cljs$core$ep2__1.call(this,x);
+case 2:
+return cljs$core$ep2__2.call(this,x,y);
+case 3:
+return cljs$core$ep2__3.call(this,x,y,z);
+default:
+var G__10281 = null;
+if (arguments.length > 3) {
+var G__10282__i = 0, G__10282__a = new Array(arguments.length - 3);
+while (G__10282__i < G__10282__a.length) {G__10282__a[G__10282__i] = arguments[G__10282__i + 3]; ++G__10282__i;}
+G__10281 = new cljs.core.IndexedSeq(G__10282__a,0);
+}
+return cljs$core$ep2__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10281);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$ep2.cljs$lang$maxFixedArity = 3;
+cljs$core$ep2.cljs$lang$applyTo = cljs$core$ep2__4.cljs$lang$applyTo;
+cljs$core$ep2.cljs$core$IFn$_invoke$arity$0 = cljs$core$ep2__0;
+cljs$core$ep2.cljs$core$IFn$_invoke$arity$1 = cljs$core$ep2__1;
+cljs$core$ep2.cljs$core$IFn$_invoke$arity$2 = cljs$core$ep2__2;
+cljs$core$ep2.cljs$core$IFn$_invoke$arity$3 = cljs$core$ep2__3;
+cljs$core$ep2.cljs$core$IFn$_invoke$arity$variadic = cljs$core$ep2__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$ep2;
+})()
+});
+
+cljs.core.every_pred.cljs$core$IFn$_invoke$arity$3 = (function (p1,p2,p3){
+return (function() {
+var cljs$core$ep3 = null;
+var cljs$core$ep3__0 = (function (){
+return true;
+});
+var cljs$core$ep3__1 = (function (x){
+return cljs.core.boolean$((function (){var and__6500__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__6500__auto__)){
+var and__6500__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(and__6500__auto____$1)){
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+})());
+});
+var cljs$core$ep3__2 = (function (x,y){
+return cljs.core.boolean$((function (){var and__6500__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__6500__auto__)){
+var and__6500__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(and__6500__auto____$1)){
+var and__6500__auto____$2 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+if(cljs.core.truth_(and__6500__auto____$2)){
+var and__6500__auto____$3 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(and__6500__auto____$3)){
+var and__6500__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(and__6500__auto____$4)){
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(y) : p3.call(null,y));
+} else {
+return and__6500__auto____$4;
+}
+} else {
+return and__6500__auto____$3;
+}
+} else {
+return and__6500__auto____$2;
+}
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+})());
+});
+var cljs$core$ep3__3 = (function (x,y,z){
+return cljs.core.boolean$((function (){var and__6500__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__6500__auto__)){
+var and__6500__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(and__6500__auto____$1)){
+var and__6500__auto____$2 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+if(cljs.core.truth_(and__6500__auto____$2)){
+var and__6500__auto____$3 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(and__6500__auto____$3)){
+var and__6500__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(and__6500__auto____$4)){
+var and__6500__auto____$5 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(y) : p3.call(null,y));
+if(cljs.core.truth_(and__6500__auto____$5)){
+var and__6500__auto____$6 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(z) : p1.call(null,z));
+if(cljs.core.truth_(and__6500__auto____$6)){
+var and__6500__auto____$7 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(z) : p2.call(null,z));
+if(cljs.core.truth_(and__6500__auto____$7)){
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(z) : p3.call(null,z));
+} else {
+return and__6500__auto____$7;
+}
+} else {
+return and__6500__auto____$6;
+}
+} else {
+return and__6500__auto____$5;
+}
+} else {
+return and__6500__auto____$4;
+}
+} else {
+return and__6500__auto____$3;
+}
+} else {
+return and__6500__auto____$2;
+}
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+})());
+});
+var cljs$core$ep3__4 = (function() {
+var G__10283__delegate = function (x,y,z,args){
+return cljs.core.boolean$((function (){var and__6500__auto__ = cljs$core$ep3.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(and__6500__auto__)){
+return cljs.core.every_QMARK_(((function (and__6500__auto__){
+return (function (p1__10257_SHARP_){
+var and__6500__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(p1__10257_SHARP_) : p1.call(null,p1__10257_SHARP_));
+if(cljs.core.truth_(and__6500__auto____$1)){
+var and__6500__auto____$2 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(p1__10257_SHARP_) : p2.call(null,p1__10257_SHARP_));
+if(cljs.core.truth_(and__6500__auto____$2)){
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(p1__10257_SHARP_) : p3.call(null,p1__10257_SHARP_));
+} else {
+return and__6500__auto____$2;
+}
+} else {
+return and__6500__auto____$1;
+}
+});})(and__6500__auto__))
+,args);
+} else {
+return and__6500__auto__;
+}
+})());
+};
+var G__10283 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10284__i = 0, G__10284__a = new Array(arguments.length - 3);
+while (G__10284__i < G__10284__a.length) {G__10284__a[G__10284__i] = arguments[G__10284__i + 3]; ++G__10284__i;}
+ args = new cljs.core.IndexedSeq(G__10284__a,0);
+}
+return G__10283__delegate.call(this,x,y,z,args);};
+G__10283.cljs$lang$maxFixedArity = 3;
+G__10283.cljs$lang$applyTo = (function (arglist__10285){
+var x = cljs.core.first(arglist__10285);
+arglist__10285 = cljs.core.next(arglist__10285);
+var y = cljs.core.first(arglist__10285);
+arglist__10285 = cljs.core.next(arglist__10285);
+var z = cljs.core.first(arglist__10285);
+var args = cljs.core.rest(arglist__10285);
+return G__10283__delegate(x,y,z,args);
+});
+G__10283.cljs$core$IFn$_invoke$arity$variadic = G__10283__delegate;
+return G__10283;
+})()
+;
+cljs$core$ep3 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$ep3__0.call(this);
+case 1:
+return cljs$core$ep3__1.call(this,x);
+case 2:
+return cljs$core$ep3__2.call(this,x,y);
+case 3:
+return cljs$core$ep3__3.call(this,x,y,z);
+default:
+var G__10286 = null;
+if (arguments.length > 3) {
+var G__10287__i = 0, G__10287__a = new Array(arguments.length - 3);
+while (G__10287__i < G__10287__a.length) {G__10287__a[G__10287__i] = arguments[G__10287__i + 3]; ++G__10287__i;}
+G__10286 = new cljs.core.IndexedSeq(G__10287__a,0);
+}
+return cljs$core$ep3__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10286);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$ep3.cljs$lang$maxFixedArity = 3;
+cljs$core$ep3.cljs$lang$applyTo = cljs$core$ep3__4.cljs$lang$applyTo;
+cljs$core$ep3.cljs$core$IFn$_invoke$arity$0 = cljs$core$ep3__0;
+cljs$core$ep3.cljs$core$IFn$_invoke$arity$1 = cljs$core$ep3__1;
+cljs$core$ep3.cljs$core$IFn$_invoke$arity$2 = cljs$core$ep3__2;
+cljs$core$ep3.cljs$core$IFn$_invoke$arity$3 = cljs$core$ep3__3;
+cljs$core$ep3.cljs$core$IFn$_invoke$arity$variadic = cljs$core$ep3__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$ep3;
+})()
+});
+
+cljs.core.every_pred.cljs$core$IFn$_invoke$arity$variadic = (function (p1,p2,p3,ps){
+var ps__$1 = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4(p1,p2,p3,ps);
+return ((function (ps__$1){
+return (function() {
+var cljs$core$epn = null;
+var cljs$core$epn__0 = (function (){
+return true;
+});
+var cljs$core$epn__1 = (function (x){
+return cljs.core.every_QMARK_(((function (ps__$1){
+return (function (p1__10258_SHARP_){
+return (p1__10258_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10258_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__10258_SHARP_.call(null,x));
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$epn__2 = (function (x,y){
+return cljs.core.every_QMARK_(((function (ps__$1){
+return (function (p1__10259_SHARP_){
+var and__6500__auto__ = (p1__10259_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10259_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__10259_SHARP_.call(null,x));
+if(cljs.core.truth_(and__6500__auto__)){
+return (p1__10259_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10259_SHARP_.cljs$core$IFn$_invoke$arity$1(y) : p1__10259_SHARP_.call(null,y));
+} else {
+return and__6500__auto__;
+}
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$epn__3 = (function (x,y,z){
+return cljs.core.every_QMARK_(((function (ps__$1){
+return (function (p1__10260_SHARP_){
+var and__6500__auto__ = (p1__10260_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10260_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__10260_SHARP_.call(null,x));
+if(cljs.core.truth_(and__6500__auto__)){
+var and__6500__auto____$1 = (p1__10260_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10260_SHARP_.cljs$core$IFn$_invoke$arity$1(y) : p1__10260_SHARP_.call(null,y));
+if(cljs.core.truth_(and__6500__auto____$1)){
+return (p1__10260_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10260_SHARP_.cljs$core$IFn$_invoke$arity$1(z) : p1__10260_SHARP_.call(null,z));
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$epn__4 = (function() {
+var G__10288__delegate = function (x,y,z,args){
+return cljs.core.boolean$((function (){var and__6500__auto__ = cljs$core$epn.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(and__6500__auto__)){
+return cljs.core.every_QMARK_(((function (and__6500__auto__,ps__$1){
+return (function (p1__10261_SHARP_){
+return cljs.core.every_QMARK_(p1__10261_SHARP_,args);
+});})(and__6500__auto__,ps__$1))
+,ps__$1);
+} else {
+return and__6500__auto__;
+}
+})());
+};
+var G__10288 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10289__i = 0, G__10289__a = new Array(arguments.length - 3);
+while (G__10289__i < G__10289__a.length) {G__10289__a[G__10289__i] = arguments[G__10289__i + 3]; ++G__10289__i;}
+ args = new cljs.core.IndexedSeq(G__10289__a,0);
+}
+return G__10288__delegate.call(this,x,y,z,args);};
+G__10288.cljs$lang$maxFixedArity = 3;
+G__10288.cljs$lang$applyTo = (function (arglist__10290){
+var x = cljs.core.first(arglist__10290);
+arglist__10290 = cljs.core.next(arglist__10290);
+var y = cljs.core.first(arglist__10290);
+arglist__10290 = cljs.core.next(arglist__10290);
+var z = cljs.core.first(arglist__10290);
+var args = cljs.core.rest(arglist__10290);
+return G__10288__delegate(x,y,z,args);
+});
+G__10288.cljs$core$IFn$_invoke$arity$variadic = G__10288__delegate;
+return G__10288;
+})()
+;
+cljs$core$epn = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$epn__0.call(this);
+case 1:
+return cljs$core$epn__1.call(this,x);
+case 2:
+return cljs$core$epn__2.call(this,x,y);
+case 3:
+return cljs$core$epn__3.call(this,x,y,z);
+default:
+var G__10291 = null;
+if (arguments.length > 3) {
+var G__10292__i = 0, G__10292__a = new Array(arguments.length - 3);
+while (G__10292__i < G__10292__a.length) {G__10292__a[G__10292__i] = arguments[G__10292__i + 3]; ++G__10292__i;}
+G__10291 = new cljs.core.IndexedSeq(G__10292__a,0);
+}
+return cljs$core$epn__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10291);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$epn.cljs$lang$maxFixedArity = 3;
+cljs$core$epn.cljs$lang$applyTo = cljs$core$epn__4.cljs$lang$applyTo;
+cljs$core$epn.cljs$core$IFn$_invoke$arity$0 = cljs$core$epn__0;
+cljs$core$epn.cljs$core$IFn$_invoke$arity$1 = cljs$core$epn__1;
+cljs$core$epn.cljs$core$IFn$_invoke$arity$2 = cljs$core$epn__2;
+cljs$core$epn.cljs$core$IFn$_invoke$arity$3 = cljs$core$epn__3;
+cljs$core$epn.cljs$core$IFn$_invoke$arity$variadic = cljs$core$epn__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$epn;
+})()
+;})(ps__$1))
+});
+
+cljs.core.every_pred.cljs$lang$applyTo = (function (seq10263){
+var G__10264 = cljs.core.first(seq10263);
+var seq10263__$1 = cljs.core.next(seq10263);
+var G__10265 = cljs.core.first(seq10263__$1);
+var seq10263__$2 = cljs.core.next(seq10263__$1);
+var G__10266 = cljs.core.first(seq10263__$2);
+var seq10263__$3 = cljs.core.next(seq10263__$2);
+return cljs.core.every_pred.cljs$core$IFn$_invoke$arity$variadic(G__10264,G__10265,G__10266,seq10263__$3);
+});
+
+cljs.core.every_pred.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Takes a set of predicates and returns a function f that returns the first logical true value
+ * returned by one of its composing predicates against any of its arguments, else it returns
+ * logical false. Note that f is short-circuiting in that it will stop execution on the first
+ * argument that triggers a logical true result against the original predicates.
+ */
+cljs.core.some_fn = (function cljs$core$some_fn(var_args){
+var args10299 = [];
+var len__7625__auto___10306 = arguments.length;
+var i__7626__auto___10307 = (0);
+while(true){
+if((i__7626__auto___10307 < len__7625__auto___10306)){
+args10299.push((arguments[i__7626__auto___10307]));
+
+var G__10308 = (i__7626__auto___10307 + (1));
+i__7626__auto___10307 = G__10308;
+continue;
+} else {
+}
+break;
+}
+
+var G__10305 = args10299.length;
+switch (G__10305) {
+case 1:
+return cljs.core.some_fn.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.some_fn.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.some_fn.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10299.slice((3)),(0),null));
+return cljs.core.some_fn.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.some_fn.cljs$core$IFn$_invoke$arity$1 = (function (p){
+return (function() {
+var cljs$core$sp1 = null;
+var cljs$core$sp1__0 = (function (){
+return null;
+});
+var cljs$core$sp1__1 = (function (x){
+return (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x));
+});
+var cljs$core$sp1__2 = (function (x,y){
+var or__6512__auto__ = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x));
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(y) : p.call(null,y));
+}
+});
+var cljs$core$sp1__3 = (function (x,y,z){
+var or__6512__auto__ = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x));
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+var or__6512__auto____$1 = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(y) : p.call(null,y));
+if(cljs.core.truth_(or__6512__auto____$1)){
+return or__6512__auto____$1;
+} else {
+return (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(z) : p.call(null,z));
+}
+}
+});
+var cljs$core$sp1__4 = (function() {
+var G__10310__delegate = function (x,y,z,args){
+var or__6512__auto__ = cljs$core$sp1.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return cljs.core.some(p,args);
+}
+};
+var G__10310 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10311__i = 0, G__10311__a = new Array(arguments.length - 3);
+while (G__10311__i < G__10311__a.length) {G__10311__a[G__10311__i] = arguments[G__10311__i + 3]; ++G__10311__i;}
+ args = new cljs.core.IndexedSeq(G__10311__a,0);
+}
+return G__10310__delegate.call(this,x,y,z,args);};
+G__10310.cljs$lang$maxFixedArity = 3;
+G__10310.cljs$lang$applyTo = (function (arglist__10312){
+var x = cljs.core.first(arglist__10312);
+arglist__10312 = cljs.core.next(arglist__10312);
+var y = cljs.core.first(arglist__10312);
+arglist__10312 = cljs.core.next(arglist__10312);
+var z = cljs.core.first(arglist__10312);
+var args = cljs.core.rest(arglist__10312);
+return G__10310__delegate(x,y,z,args);
+});
+G__10310.cljs$core$IFn$_invoke$arity$variadic = G__10310__delegate;
+return G__10310;
+})()
+;
+cljs$core$sp1 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$sp1__0.call(this);
+case 1:
+return cljs$core$sp1__1.call(this,x);
+case 2:
+return cljs$core$sp1__2.call(this,x,y);
+case 3:
+return cljs$core$sp1__3.call(this,x,y,z);
+default:
+var G__10313 = null;
+if (arguments.length > 3) {
+var G__10314__i = 0, G__10314__a = new Array(arguments.length - 3);
+while (G__10314__i < G__10314__a.length) {G__10314__a[G__10314__i] = arguments[G__10314__i + 3]; ++G__10314__i;}
+G__10313 = new cljs.core.IndexedSeq(G__10314__a,0);
+}
+return cljs$core$sp1__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10313);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$sp1.cljs$lang$maxFixedArity = 3;
+cljs$core$sp1.cljs$lang$applyTo = cljs$core$sp1__4.cljs$lang$applyTo;
+cljs$core$sp1.cljs$core$IFn$_invoke$arity$0 = cljs$core$sp1__0;
+cljs$core$sp1.cljs$core$IFn$_invoke$arity$1 = cljs$core$sp1__1;
+cljs$core$sp1.cljs$core$IFn$_invoke$arity$2 = cljs$core$sp1__2;
+cljs$core$sp1.cljs$core$IFn$_invoke$arity$3 = cljs$core$sp1__3;
+cljs$core$sp1.cljs$core$IFn$_invoke$arity$variadic = cljs$core$sp1__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$sp1;
+})()
+});
+
+cljs.core.some_fn.cljs$core$IFn$_invoke$arity$2 = (function (p1,p2){
+return (function() {
+var cljs$core$sp2 = null;
+var cljs$core$sp2__0 = (function (){
+return null;
+});
+var cljs$core$sp2__1 = (function (x){
+var or__6512__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+}
+});
+var cljs$core$sp2__2 = (function (x,y){
+var or__6512__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+var or__6512__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(or__6512__auto____$1)){
+return or__6512__auto____$1;
+} else {
+var or__6512__auto____$2 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(or__6512__auto____$2)){
+return or__6512__auto____$2;
+} else {
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+}
+}
+}
+});
+var cljs$core$sp2__3 = (function (x,y,z){
+var or__6512__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+var or__6512__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(or__6512__auto____$1)){
+return or__6512__auto____$1;
+} else {
+var or__6512__auto____$2 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(z) : p1.call(null,z));
+if(cljs.core.truth_(or__6512__auto____$2)){
+return or__6512__auto____$2;
+} else {
+var or__6512__auto____$3 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(or__6512__auto____$3)){
+return or__6512__auto____$3;
+} else {
+var or__6512__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(or__6512__auto____$4)){
+return or__6512__auto____$4;
+} else {
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(z) : p2.call(null,z));
+}
+}
+}
+}
+}
+});
+var cljs$core$sp2__4 = (function() {
+var G__10315__delegate = function (x,y,z,args){
+var or__6512__auto__ = cljs$core$sp2.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return cljs.core.some(((function (or__6512__auto__){
+return (function (p1__10293_SHARP_){
+var or__6512__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(p1__10293_SHARP_) : p1.call(null,p1__10293_SHARP_));
+if(cljs.core.truth_(or__6512__auto____$1)){
+return or__6512__auto____$1;
+} else {
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(p1__10293_SHARP_) : p2.call(null,p1__10293_SHARP_));
+}
+});})(or__6512__auto__))
+,args);
+}
+};
+var G__10315 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10316__i = 0, G__10316__a = new Array(arguments.length - 3);
+while (G__10316__i < G__10316__a.length) {G__10316__a[G__10316__i] = arguments[G__10316__i + 3]; ++G__10316__i;}
+ args = new cljs.core.IndexedSeq(G__10316__a,0);
+}
+return G__10315__delegate.call(this,x,y,z,args);};
+G__10315.cljs$lang$maxFixedArity = 3;
+G__10315.cljs$lang$applyTo = (function (arglist__10317){
+var x = cljs.core.first(arglist__10317);
+arglist__10317 = cljs.core.next(arglist__10317);
+var y = cljs.core.first(arglist__10317);
+arglist__10317 = cljs.core.next(arglist__10317);
+var z = cljs.core.first(arglist__10317);
+var args = cljs.core.rest(arglist__10317);
+return G__10315__delegate(x,y,z,args);
+});
+G__10315.cljs$core$IFn$_invoke$arity$variadic = G__10315__delegate;
+return G__10315;
+})()
+;
+cljs$core$sp2 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$sp2__0.call(this);
+case 1:
+return cljs$core$sp2__1.call(this,x);
+case 2:
+return cljs$core$sp2__2.call(this,x,y);
+case 3:
+return cljs$core$sp2__3.call(this,x,y,z);
+default:
+var G__10318 = null;
+if (arguments.length > 3) {
+var G__10319__i = 0, G__10319__a = new Array(arguments.length - 3);
+while (G__10319__i < G__10319__a.length) {G__10319__a[G__10319__i] = arguments[G__10319__i + 3]; ++G__10319__i;}
+G__10318 = new cljs.core.IndexedSeq(G__10319__a,0);
+}
+return cljs$core$sp2__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10318);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$sp2.cljs$lang$maxFixedArity = 3;
+cljs$core$sp2.cljs$lang$applyTo = cljs$core$sp2__4.cljs$lang$applyTo;
+cljs$core$sp2.cljs$core$IFn$_invoke$arity$0 = cljs$core$sp2__0;
+cljs$core$sp2.cljs$core$IFn$_invoke$arity$1 = cljs$core$sp2__1;
+cljs$core$sp2.cljs$core$IFn$_invoke$arity$2 = cljs$core$sp2__2;
+cljs$core$sp2.cljs$core$IFn$_invoke$arity$3 = cljs$core$sp2__3;
+cljs$core$sp2.cljs$core$IFn$_invoke$arity$variadic = cljs$core$sp2__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$sp2;
+})()
+});
+
+cljs.core.some_fn.cljs$core$IFn$_invoke$arity$3 = (function (p1,p2,p3){
+return (function() {
+var cljs$core$sp3 = null;
+var cljs$core$sp3__0 = (function (){
+return null;
+});
+var cljs$core$sp3__1 = (function (x){
+var or__6512__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+var or__6512__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(or__6512__auto____$1)){
+return or__6512__auto____$1;
+} else {
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+}
+}
+});
+var cljs$core$sp3__2 = (function (x,y){
+var or__6512__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+var or__6512__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(or__6512__auto____$1)){
+return or__6512__auto____$1;
+} else {
+var or__6512__auto____$2 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+if(cljs.core.truth_(or__6512__auto____$2)){
+return or__6512__auto____$2;
+} else {
+var or__6512__auto____$3 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(or__6512__auto____$3)){
+return or__6512__auto____$3;
+} else {
+var or__6512__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(or__6512__auto____$4)){
+return or__6512__auto____$4;
+} else {
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(y) : p3.call(null,y));
+}
+}
+}
+}
+}
+});
+var cljs$core$sp3__3 = (function (x,y,z){
+var or__6512__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+var or__6512__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(or__6512__auto____$1)){
+return or__6512__auto____$1;
+} else {
+var or__6512__auto____$2 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+if(cljs.core.truth_(or__6512__auto____$2)){
+return or__6512__auto____$2;
+} else {
+var or__6512__auto____$3 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(or__6512__auto____$3)){
+return or__6512__auto____$3;
+} else {
+var or__6512__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(or__6512__auto____$4)){
+return or__6512__auto____$4;
+} else {
+var or__6512__auto____$5 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(y) : p3.call(null,y));
+if(cljs.core.truth_(or__6512__auto____$5)){
+return or__6512__auto____$5;
+} else {
+var or__6512__auto____$6 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(z) : p1.call(null,z));
+if(cljs.core.truth_(or__6512__auto____$6)){
+return or__6512__auto____$6;
+} else {
+var or__6512__auto____$7 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(z) : p2.call(null,z));
+if(cljs.core.truth_(or__6512__auto____$7)){
+return or__6512__auto____$7;
+} else {
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(z) : p3.call(null,z));
+}
+}
+}
+}
+}
+}
+}
+}
+});
+var cljs$core$sp3__4 = (function() {
+var G__10320__delegate = function (x,y,z,args){
+var or__6512__auto__ = cljs$core$sp3.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return cljs.core.some(((function (or__6512__auto__){
+return (function (p1__10294_SHARP_){
+var or__6512__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(p1__10294_SHARP_) : p1.call(null,p1__10294_SHARP_));
+if(cljs.core.truth_(or__6512__auto____$1)){
+return or__6512__auto____$1;
+} else {
+var or__6512__auto____$2 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(p1__10294_SHARP_) : p2.call(null,p1__10294_SHARP_));
+if(cljs.core.truth_(or__6512__auto____$2)){
+return or__6512__auto____$2;
+} else {
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(p1__10294_SHARP_) : p3.call(null,p1__10294_SHARP_));
+}
+}
+});})(or__6512__auto__))
+,args);
+}
+};
+var G__10320 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10321__i = 0, G__10321__a = new Array(arguments.length - 3);
+while (G__10321__i < G__10321__a.length) {G__10321__a[G__10321__i] = arguments[G__10321__i + 3]; ++G__10321__i;}
+ args = new cljs.core.IndexedSeq(G__10321__a,0);
+}
+return G__10320__delegate.call(this,x,y,z,args);};
+G__10320.cljs$lang$maxFixedArity = 3;
+G__10320.cljs$lang$applyTo = (function (arglist__10322){
+var x = cljs.core.first(arglist__10322);
+arglist__10322 = cljs.core.next(arglist__10322);
+var y = cljs.core.first(arglist__10322);
+arglist__10322 = cljs.core.next(arglist__10322);
+var z = cljs.core.first(arglist__10322);
+var args = cljs.core.rest(arglist__10322);
+return G__10320__delegate(x,y,z,args);
+});
+G__10320.cljs$core$IFn$_invoke$arity$variadic = G__10320__delegate;
+return G__10320;
+})()
+;
+cljs$core$sp3 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$sp3__0.call(this);
+case 1:
+return cljs$core$sp3__1.call(this,x);
+case 2:
+return cljs$core$sp3__2.call(this,x,y);
+case 3:
+return cljs$core$sp3__3.call(this,x,y,z);
+default:
+var G__10323 = null;
+if (arguments.length > 3) {
+var G__10324__i = 0, G__10324__a = new Array(arguments.length - 3);
+while (G__10324__i < G__10324__a.length) {G__10324__a[G__10324__i] = arguments[G__10324__i + 3]; ++G__10324__i;}
+G__10323 = new cljs.core.IndexedSeq(G__10324__a,0);
+}
+return cljs$core$sp3__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10323);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$sp3.cljs$lang$maxFixedArity = 3;
+cljs$core$sp3.cljs$lang$applyTo = cljs$core$sp3__4.cljs$lang$applyTo;
+cljs$core$sp3.cljs$core$IFn$_invoke$arity$0 = cljs$core$sp3__0;
+cljs$core$sp3.cljs$core$IFn$_invoke$arity$1 = cljs$core$sp3__1;
+cljs$core$sp3.cljs$core$IFn$_invoke$arity$2 = cljs$core$sp3__2;
+cljs$core$sp3.cljs$core$IFn$_invoke$arity$3 = cljs$core$sp3__3;
+cljs$core$sp3.cljs$core$IFn$_invoke$arity$variadic = cljs$core$sp3__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$sp3;
+})()
+});
+
+cljs.core.some_fn.cljs$core$IFn$_invoke$arity$variadic = (function (p1,p2,p3,ps){
+var ps__$1 = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4(p1,p2,p3,ps);
+return ((function (ps__$1){
+return (function() {
+var cljs$core$spn = null;
+var cljs$core$spn__0 = (function (){
+return null;
+});
+var cljs$core$spn__1 = (function (x){
+return cljs.core.some(((function (ps__$1){
+return (function (p1__10295_SHARP_){
+return (p1__10295_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10295_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__10295_SHARP_.call(null,x));
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$spn__2 = (function (x,y){
+return cljs.core.some(((function (ps__$1){
+return (function (p1__10296_SHARP_){
+var or__6512__auto__ = (p1__10296_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10296_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__10296_SHARP_.call(null,x));
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return (p1__10296_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10296_SHARP_.cljs$core$IFn$_invoke$arity$1(y) : p1__10296_SHARP_.call(null,y));
+}
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$spn__3 = (function (x,y,z){
+return cljs.core.some(((function (ps__$1){
+return (function (p1__10297_SHARP_){
+var or__6512__auto__ = (p1__10297_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10297_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__10297_SHARP_.call(null,x));
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+var or__6512__auto____$1 = (p1__10297_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10297_SHARP_.cljs$core$IFn$_invoke$arity$1(y) : p1__10297_SHARP_.call(null,y));
+if(cljs.core.truth_(or__6512__auto____$1)){
+return or__6512__auto____$1;
+} else {
+return (p1__10297_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__10297_SHARP_.cljs$core$IFn$_invoke$arity$1(z) : p1__10297_SHARP_.call(null,z));
+}
+}
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$spn__4 = (function() {
+var G__10325__delegate = function (x,y,z,args){
+var or__6512__auto__ = cljs$core$spn.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return cljs.core.some(((function (or__6512__auto__,ps__$1){
+return (function (p1__10298_SHARP_){
+return cljs.core.some(p1__10298_SHARP_,args);
+});})(or__6512__auto__,ps__$1))
+,ps__$1);
+}
+};
+var G__10325 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__10326__i = 0, G__10326__a = new Array(arguments.length - 3);
+while (G__10326__i < G__10326__a.length) {G__10326__a[G__10326__i] = arguments[G__10326__i + 3]; ++G__10326__i;}
+ args = new cljs.core.IndexedSeq(G__10326__a,0);
+}
+return G__10325__delegate.call(this,x,y,z,args);};
+G__10325.cljs$lang$maxFixedArity = 3;
+G__10325.cljs$lang$applyTo = (function (arglist__10327){
+var x = cljs.core.first(arglist__10327);
+arglist__10327 = cljs.core.next(arglist__10327);
+var y = cljs.core.first(arglist__10327);
+arglist__10327 = cljs.core.next(arglist__10327);
+var z = cljs.core.first(arglist__10327);
+var args = cljs.core.rest(arglist__10327);
+return G__10325__delegate(x,y,z,args);
+});
+G__10325.cljs$core$IFn$_invoke$arity$variadic = G__10325__delegate;
+return G__10325;
+})()
+;
+cljs$core$spn = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$spn__0.call(this);
+case 1:
+return cljs$core$spn__1.call(this,x);
+case 2:
+return cljs$core$spn__2.call(this,x,y);
+case 3:
+return cljs$core$spn__3.call(this,x,y,z);
+default:
+var G__10328 = null;
+if (arguments.length > 3) {
+var G__10329__i = 0, G__10329__a = new Array(arguments.length - 3);
+while (G__10329__i < G__10329__a.length) {G__10329__a[G__10329__i] = arguments[G__10329__i + 3]; ++G__10329__i;}
+G__10328 = new cljs.core.IndexedSeq(G__10329__a,0);
+}
+return cljs$core$spn__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__10328);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$spn.cljs$lang$maxFixedArity = 3;
+cljs$core$spn.cljs$lang$applyTo = cljs$core$spn__4.cljs$lang$applyTo;
+cljs$core$spn.cljs$core$IFn$_invoke$arity$0 = cljs$core$spn__0;
+cljs$core$spn.cljs$core$IFn$_invoke$arity$1 = cljs$core$spn__1;
+cljs$core$spn.cljs$core$IFn$_invoke$arity$2 = cljs$core$spn__2;
+cljs$core$spn.cljs$core$IFn$_invoke$arity$3 = cljs$core$spn__3;
+cljs$core$spn.cljs$core$IFn$_invoke$arity$variadic = cljs$core$spn__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$spn;
+})()
+;})(ps__$1))
+});
+
+cljs.core.some_fn.cljs$lang$applyTo = (function (seq10300){
+var G__10301 = cljs.core.first(seq10300);
+var seq10300__$1 = cljs.core.next(seq10300);
+var G__10302 = cljs.core.first(seq10300__$1);
+var seq10300__$2 = cljs.core.next(seq10300__$1);
+var G__10303 = cljs.core.first(seq10300__$2);
+var seq10300__$3 = cljs.core.next(seq10300__$2);
+return cljs.core.some_fn.cljs$core$IFn$_invoke$arity$variadic(G__10301,G__10302,G__10303,seq10300__$3);
+});
+
+cljs.core.some_fn.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Returns a lazy sequence consisting of the result of applying f to
+ * the set of first items of each coll, followed by applying f to the
+ * set of second items in each coll, until any one of the colls is
+ * exhausted. Any remaining items in other colls are ignored. Function
+ * f should accept number-of-colls arguments. Returns a transducer when
+ * no collection is provided.
+ */
+cljs.core.map = (function cljs$core$map(var_args){
+var args10331 = [];
+var len__7625__auto___10351 = arguments.length;
+var i__7626__auto___10352 = (0);
+while(true){
+if((i__7626__auto___10352 < len__7625__auto___10351)){
+args10331.push((arguments[i__7626__auto___10352]));
+
+var G__10353 = (i__7626__auto___10352 + (1));
+i__7626__auto___10352 = G__10353;
+continue;
+} else {
+}
+break;
+}
+
+var G__10338 = args10331.length;
+switch (G__10338) {
+case 1:
+return cljs.core.map.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.map.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.map.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10331.slice((4)),(0),null));
+return cljs.core.map.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.map.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function (rf){
+return (function() {
+var G__10355 = null;
+var G__10355__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__10355__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__10355__2 = (function (result,input){
+var G__10339 = result;
+var G__10340 = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(input) : f.call(null,input));
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(G__10339,G__10340) : rf.call(null,G__10339,G__10340));
+});
+var G__10355__3 = (function() {
+var G__10356__delegate = function (result,input,inputs){
+var G__10341 = result;
+var G__10342 = cljs.core.apply.cljs$core$IFn$_invoke$arity$3(f,input,inputs);
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(G__10341,G__10342) : rf.call(null,G__10341,G__10342));
+};
+var G__10356 = function (result,input,var_args){
+var inputs = null;
+if (arguments.length > 2) {
+var G__10357__i = 0, G__10357__a = new Array(arguments.length - 2);
+while (G__10357__i < G__10357__a.length) {G__10357__a[G__10357__i] = arguments[G__10357__i + 2]; ++G__10357__i;}
+ inputs = new cljs.core.IndexedSeq(G__10357__a,0);
+}
+return G__10356__delegate.call(this,result,input,inputs);};
+G__10356.cljs$lang$maxFixedArity = 2;
+G__10356.cljs$lang$applyTo = (function (arglist__10358){
+var result = cljs.core.first(arglist__10358);
+arglist__10358 = cljs.core.next(arglist__10358);
+var input = cljs.core.first(arglist__10358);
+var inputs = cljs.core.rest(arglist__10358);
+return G__10356__delegate(result,input,inputs);
+});
+G__10356.cljs$core$IFn$_invoke$arity$variadic = G__10356__delegate;
+return G__10356;
+})()
+;
+G__10355 = function(result,input,var_args){
+var inputs = var_args;
+switch(arguments.length){
+case 0:
+return G__10355__0.call(this);
+case 1:
+return G__10355__1.call(this,result);
+case 2:
+return G__10355__2.call(this,result,input);
+default:
+var G__10359 = null;
+if (arguments.length > 2) {
+var G__10360__i = 0, G__10360__a = new Array(arguments.length - 2);
+while (G__10360__i < G__10360__a.length) {G__10360__a[G__10360__i] = arguments[G__10360__i + 2]; ++G__10360__i;}
+G__10359 = new cljs.core.IndexedSeq(G__10360__a,0);
+}
+return G__10355__3.cljs$core$IFn$_invoke$arity$variadic(result,input, G__10359);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10355.cljs$lang$maxFixedArity = 2;
+G__10355.cljs$lang$applyTo = G__10355__3.cljs$lang$applyTo;
+G__10355.cljs$core$IFn$_invoke$arity$0 = G__10355__0;
+G__10355.cljs$core$IFn$_invoke$arity$1 = G__10355__1;
+G__10355.cljs$core$IFn$_invoke$arity$2 = G__10355__2;
+G__10355.cljs$core$IFn$_invoke$arity$variadic = G__10355__3.cljs$core$IFn$_invoke$arity$variadic;
+return G__10355;
+})()
+});
+});
+
+cljs.core.map.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s)){
+var c = cljs.core.chunk_first(s);
+var size = cljs.core.count(c);
+var b = cljs.core.chunk_buffer(size);
+var n__7435__auto___10361 = size;
+var i_10362 = (0);
+while(true){
+if((i_10362 < n__7435__auto___10361)){
+cljs.core.chunk_append(b,(function (){var G__10343 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_10362);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10343) : f.call(null,G__10343));
+})());
+
+var G__10363 = (i_10362 + (1));
+i_10362 = G__10363;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.chunk_cons(cljs.core.chunk(b),cljs.core.map.cljs$core$IFn$_invoke$arity$2(f,cljs.core.chunk_rest(s)));
+} else {
+return cljs.core.cons((function (){var G__10344 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10344) : f.call(null,G__10344));
+})(),cljs.core.map.cljs$core$IFn$_invoke$arity$2(f,cljs.core.rest(s)));
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.map.cljs$core$IFn$_invoke$arity$3 = (function (f,c1,c2){
+return (new cljs.core.LazySeq(null,(function (){
+var s1 = cljs.core.seq(c1);
+var s2 = cljs.core.seq(c2);
+if((s1) && (s2)){
+return cljs.core.cons((function (){var G__10345 = cljs.core.first(s1);
+var G__10346 = cljs.core.first(s2);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10345,G__10346) : f.call(null,G__10345,G__10346));
+})(),cljs.core.map.cljs$core$IFn$_invoke$arity$3(f,cljs.core.rest(s1),cljs.core.rest(s2)));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.map.cljs$core$IFn$_invoke$arity$4 = (function (f,c1,c2,c3){
+return (new cljs.core.LazySeq(null,(function (){
+var s1 = cljs.core.seq(c1);
+var s2 = cljs.core.seq(c2);
+var s3 = cljs.core.seq(c3);
+if((s1) && (s2) && (s3)){
+return cljs.core.cons((function (){var G__10347 = cljs.core.first(s1);
+var G__10348 = cljs.core.first(s2);
+var G__10349 = cljs.core.first(s3);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10347,G__10348,G__10349) : f.call(null,G__10347,G__10348,G__10349));
+})(),cljs.core.map.cljs$core$IFn$_invoke$arity$4(f,cljs.core.rest(s1),cljs.core.rest(s2),cljs.core.rest(s3)));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.map.cljs$core$IFn$_invoke$arity$variadic = (function (f,c1,c2,c3,colls){
+var step = (function cljs$core$step(cs){
+return (new cljs.core.LazySeq(null,(function (){
+var ss = cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.seq,cs);
+if(cljs.core.every_QMARK_(cljs.core.identity,ss)){
+return cljs.core.cons(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.first,ss),cljs$core$step(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.rest,ss)));
+} else {
+return null;
+}
+}),null,null));
+});
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2(((function (step){
+return (function (p1__10330_SHARP_){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$2(f,p1__10330_SHARP_);
+});})(step))
+,step(cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic(colls,c3,cljs.core.array_seq([c2,c1], 0))));
+});
+
+cljs.core.map.cljs$lang$applyTo = (function (seq10332){
+var G__10333 = cljs.core.first(seq10332);
+var seq10332__$1 = cljs.core.next(seq10332);
+var G__10334 = cljs.core.first(seq10332__$1);
+var seq10332__$2 = cljs.core.next(seq10332__$1);
+var G__10335 = cljs.core.first(seq10332__$2);
+var seq10332__$3 = cljs.core.next(seq10332__$2);
+var G__10336 = cljs.core.first(seq10332__$3);
+var seq10332__$4 = cljs.core.next(seq10332__$3);
+return cljs.core.map.cljs$core$IFn$_invoke$arity$variadic(G__10333,G__10334,G__10335,G__10336,seq10332__$4);
+});
+
+cljs.core.map.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Returns a lazy sequence of the first n items in coll, or all items if
+ * there are fewer than n. Returns a stateful transducer when
+ * no collection is provided.
+ */
+cljs.core.take = (function cljs$core$take(var_args){
+var args10364 = [];
+var len__7625__auto___10367 = arguments.length;
+var i__7626__auto___10368 = (0);
+while(true){
+if((i__7626__auto___10368 < len__7625__auto___10367)){
+args10364.push((arguments[i__7626__auto___10368]));
+
+var G__10369 = (i__7626__auto___10368 + (1));
+i__7626__auto___10368 = G__10369;
+continue;
+} else {
+}
+break;
+}
+
+var G__10366 = args10364.length;
+switch (G__10366) {
+case 1:
+return cljs.core.take.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.take.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10364.length)].join('')));
+
+}
+});
+
+cljs.core.take.cljs$core$IFn$_invoke$arity$1 = (function (n){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+return (function (rf){
+var na = cljs.core.volatile_BANG_(n);
+return ((function (na){
+return (function() {
+var G__10371 = null;
+var G__10371__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__10371__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__10371__2 = (function (result,input){
+var n__$1 = cljs.core.deref(na);
+var nn = cljs.core._vreset_BANG_(na,(cljs.core._deref(na) - (1)));
+var result__$1 = (((n__$1 > (0)))?(rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input)):result);
+if(!((nn > (0)))){
+return cljs.core.ensure_reduced(result__$1);
+} else {
+return result__$1;
+}
+});
+G__10371 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__10371__0.call(this);
+case 1:
+return G__10371__1.call(this,result);
+case 2:
+return G__10371__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10371.cljs$core$IFn$_invoke$arity$0 = G__10371__0;
+G__10371.cljs$core$IFn$_invoke$arity$1 = G__10371__1;
+G__10371.cljs$core$IFn$_invoke$arity$2 = G__10371__2;
+return G__10371;
+})()
+;})(na))
+});
+});
+
+cljs.core.take.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+return (new cljs.core.LazySeq(null,(function (){
+if((n > (0))){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+return cljs.core.cons(cljs.core.first(s),cljs.core.take.cljs$core$IFn$_invoke$arity$2((n - (1)),cljs.core.rest(s)));
+} else {
+return null;
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.take.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of all but the first n items in coll.
+ * Returns a stateful transducer when no collection is provided.
+ */
+cljs.core.drop = (function cljs$core$drop(var_args){
+var args10372 = [];
+var len__7625__auto___10375 = arguments.length;
+var i__7626__auto___10376 = (0);
+while(true){
+if((i__7626__auto___10376 < len__7625__auto___10375)){
+args10372.push((arguments[i__7626__auto___10376]));
+
+var G__10377 = (i__7626__auto___10376 + (1));
+i__7626__auto___10376 = G__10377;
+continue;
+} else {
+}
+break;
+}
+
+var G__10374 = args10372.length;
+switch (G__10374) {
+case 1:
+return cljs.core.drop.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.drop.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10372.length)].join('')));
+
+}
+});
+
+cljs.core.drop.cljs$core$IFn$_invoke$arity$1 = (function (n){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+return (function (rf){
+var na = cljs.core.volatile_BANG_(n);
+return ((function (na){
+return (function() {
+var G__10379 = null;
+var G__10379__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__10379__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__10379__2 = (function (result,input){
+var n__$1 = cljs.core.deref(na);
+cljs.core._vreset_BANG_(na,(cljs.core._deref(na) - (1)));
+
+if((n__$1 > (0))){
+return result;
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__10379 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__10379__0.call(this);
+case 1:
+return G__10379__1.call(this,result);
+case 2:
+return G__10379__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10379.cljs$core$IFn$_invoke$arity$0 = G__10379__0;
+G__10379.cljs$core$IFn$_invoke$arity$1 = G__10379__1;
+G__10379.cljs$core$IFn$_invoke$arity$2 = G__10379__2;
+return G__10379;
+})()
+;})(na))
+});
+});
+
+cljs.core.drop.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+var step = (function (n__$1,coll__$1){
+while(true){
+var s = cljs.core.seq(coll__$1);
+if(((n__$1 > (0))) && (s)){
+var G__10380 = (n__$1 - (1));
+var G__10381 = cljs.core.rest(s);
+n__$1 = G__10380;
+coll__$1 = G__10381;
+continue;
+} else {
+return s;
+}
+break;
+}
+});
+return (new cljs.core.LazySeq(null,((function (step){
+return (function (){
+return step(n,coll);
+});})(step))
+,null,null));
+});
+
+cljs.core.drop.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Return a lazy sequence of all but the last n (default 1) items in coll
+ */
+cljs.core.drop_last = (function cljs$core$drop_last(var_args){
+var args10382 = [];
+var len__7625__auto___10385 = arguments.length;
+var i__7626__auto___10386 = (0);
+while(true){
+if((i__7626__auto___10386 < len__7625__auto___10385)){
+args10382.push((arguments[i__7626__auto___10386]));
+
+var G__10387 = (i__7626__auto___10386 + (1));
+i__7626__auto___10386 = G__10387;
+continue;
+} else {
+}
+break;
+}
+
+var G__10384 = args10382.length;
+switch (G__10384) {
+case 1:
+return cljs.core.drop_last.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.drop_last.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10382.length)].join('')));
+
+}
+});
+
+cljs.core.drop_last.cljs$core$IFn$_invoke$arity$1 = (function (s){
+return cljs.core.drop_last.cljs$core$IFn$_invoke$arity$2((1),s);
+});
+
+cljs.core.drop_last.cljs$core$IFn$_invoke$arity$2 = (function (n,s){
+return cljs.core.map.cljs$core$IFn$_invoke$arity$3((function (x,_){
+return x;
+}),s,cljs.core.drop.cljs$core$IFn$_invoke$arity$2(n,s));
+});
+
+cljs.core.drop_last.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a seq of the last n items in coll. Depending on the type
+ * of coll may be no better than linear time. For vectors, see also subvec.
+ */
+cljs.core.take_last = (function cljs$core$take_last(n,coll){
+var s = cljs.core.seq(coll);
+var lead = cljs.core.seq(cljs.core.drop.cljs$core$IFn$_invoke$arity$2(n,coll));
+while(true){
+if(lead){
+var G__10389 = cljs.core.next(s);
+var G__10390 = cljs.core.next(lead);
+s = G__10389;
+lead = G__10390;
+continue;
+} else {
+return s;
+}
+break;
+}
+});
+/**
+ * Returns a lazy sequence of the items in coll starting from the
+ * first item for which (pred item) returns logical false. Returns a
+ * stateful transducer when no collection is provided.
+ */
+cljs.core.drop_while = (function cljs$core$drop_while(var_args){
+var args10391 = [];
+var len__7625__auto___10396 = arguments.length;
+var i__7626__auto___10397 = (0);
+while(true){
+if((i__7626__auto___10397 < len__7625__auto___10396)){
+args10391.push((arguments[i__7626__auto___10397]));
+
+var G__10398 = (i__7626__auto___10397 + (1));
+i__7626__auto___10397 = G__10398;
+continue;
+} else {
+}
+break;
+}
+
+var G__10393 = args10391.length;
+switch (G__10393) {
+case 1:
+return cljs.core.drop_while.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.drop_while.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10391.length)].join('')));
+
+}
+});
+
+cljs.core.drop_while.cljs$core$IFn$_invoke$arity$1 = (function (pred){
+return (function (rf){
+var da = cljs.core.volatile_BANG_(true);
+return ((function (da){
+return (function() {
+var G__10400 = null;
+var G__10400__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__10400__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__10400__2 = (function (result,input){
+var drop_QMARK_ = cljs.core.deref(da);
+if(cljs.core.truth_((function (){var and__6500__auto__ = drop_QMARK_;
+if(cljs.core.truth_(and__6500__auto__)){
+return (pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(input) : pred.call(null,input));
+} else {
+return and__6500__auto__;
+}
+})())){
+return result;
+} else {
+cljs.core.vreset_BANG_(da,null);
+
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__10400 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__10400__0.call(this);
+case 1:
+return G__10400__1.call(this,result);
+case 2:
+return G__10400__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10400.cljs$core$IFn$_invoke$arity$0 = G__10400__0;
+G__10400.cljs$core$IFn$_invoke$arity$1 = G__10400__1;
+G__10400.cljs$core$IFn$_invoke$arity$2 = G__10400__2;
+return G__10400;
+})()
+;})(da))
+});
+});
+
+cljs.core.drop_while.cljs$core$IFn$_invoke$arity$2 = (function (pred,coll){
+var step = (function (pred__$1,coll__$1){
+while(true){
+var s = cljs.core.seq(coll__$1);
+if(cljs.core.truth_((function (){var and__6500__auto__ = s;
+if(and__6500__auto__){
+var G__10395 = cljs.core.first(s);
+return (pred__$1.cljs$core$IFn$_invoke$arity$1 ? pred__$1.cljs$core$IFn$_invoke$arity$1(G__10395) : pred__$1.call(null,G__10395));
+} else {
+return and__6500__auto__;
+}
+})())){
+var G__10401 = pred__$1;
+var G__10402 = cljs.core.rest(s);
+pred__$1 = G__10401;
+coll__$1 = G__10402;
+continue;
+} else {
+return s;
+}
+break;
+}
+});
+return (new cljs.core.LazySeq(null,((function (step){
+return (function (){
+return step(pred,coll);
+});})(step))
+,null,null));
+});
+
+cljs.core.drop_while.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy (infinite!) sequence of repetitions of the items in coll.
+ */
+cljs.core.cycle = (function cljs$core$cycle(coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$2(s,(cljs.core.cycle.cljs$core$IFn$_invoke$arity$1 ? cljs.core.cycle.cljs$core$IFn$_invoke$arity$1(s) : cljs.core.cycle.call(null,s)));
+} else {
+return null;
+}
+}),null,null));
+});
+/**
+ * Returns a vector of [(take n coll) (drop n coll)]
+ */
+cljs.core.split_at = (function cljs$core$split_at(n,coll){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,coll),cljs.core.drop.cljs$core$IFn$_invoke$arity$2(n,coll)], null);
+});
+/**
+ * Returns a lazy (infinite!, or length n if supplied) sequence of xs.
+ */
+cljs.core.repeat = (function cljs$core$repeat(var_args){
+var args10403 = [];
+var len__7625__auto___10406 = arguments.length;
+var i__7626__auto___10407 = (0);
+while(true){
+if((i__7626__auto___10407 < len__7625__auto___10406)){
+args10403.push((arguments[i__7626__auto___10407]));
+
+var G__10408 = (i__7626__auto___10407 + (1));
+i__7626__auto___10407 = G__10408;
+continue;
+} else {
+}
+break;
+}
+
+var G__10405 = args10403.length;
+switch (G__10405) {
+case 1:
+return cljs.core.repeat.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.repeat.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10403.length)].join('')));
+
+}
+});
+
+cljs.core.repeat.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (new cljs.core.LazySeq(null,(function (){
+return cljs.core.cons(x,cljs.core.repeat.cljs$core$IFn$_invoke$arity$1(x));
+}),null,null));
+});
+
+cljs.core.repeat.cljs$core$IFn$_invoke$arity$2 = (function (n,x){
+return cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,cljs.core.repeat.cljs$core$IFn$_invoke$arity$1(x));
+});
+
+cljs.core.repeat.cljs$lang$maxFixedArity = 2;
+
+/**
+ * DEPRECATED: Use 'repeat' instead.
+ * Returns a lazy seq of n xs.
+ */
+cljs.core.replicate = (function cljs$core$replicate(n,x){
+return cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,cljs.core.repeat.cljs$core$IFn$_invoke$arity$1(x));
+});
+/**
+ * Takes a function of no args, presumably with side effects, and
+ * returns an infinite (or length n if supplied) lazy sequence of calls
+ * to it
+ */
+cljs.core.repeatedly = (function cljs$core$repeatedly(var_args){
+var args10410 = [];
+var len__7625__auto___10413 = arguments.length;
+var i__7626__auto___10414 = (0);
+while(true){
+if((i__7626__auto___10414 < len__7625__auto___10413)){
+args10410.push((arguments[i__7626__auto___10414]));
+
+var G__10415 = (i__7626__auto___10414 + (1));
+i__7626__auto___10414 = G__10415;
+continue;
+} else {
+}
+break;
+}
+
+var G__10412 = args10410.length;
+switch (G__10412) {
+case 1:
+return cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10410.length)].join('')));
+
+}
+});
+
+cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (new cljs.core.LazySeq(null,(function (){
+return cljs.core.cons((f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)),cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$1(f));
+}),null,null));
+});
+
+cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$2 = (function (n,f){
+return cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$1(f));
+});
+
+cljs.core.repeatedly.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects
+ */
+cljs.core.iterate = (function cljs$core$iterate(f,x){
+return cljs.core.cons(x,(new cljs.core.LazySeq(null,(function (){
+var G__10419 = f;
+var G__10420 = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x));
+return (cljs.core.iterate.cljs$core$IFn$_invoke$arity$2 ? cljs.core.iterate.cljs$core$IFn$_invoke$arity$2(G__10419,G__10420) : cljs.core.iterate.call(null,G__10419,G__10420));
+}),null,null)));
+});
+/**
+ * Returns a lazy seq of the first item in each coll, then the second etc.
+ */
+cljs.core.interleave = (function cljs$core$interleave(var_args){
+var args10421 = [];
+var len__7625__auto___10427 = arguments.length;
+var i__7626__auto___10428 = (0);
+while(true){
+if((i__7626__auto___10428 < len__7625__auto___10427)){
+args10421.push((arguments[i__7626__auto___10428]));
+
+var G__10429 = (i__7626__auto___10428 + (1));
+i__7626__auto___10428 = G__10429;
+continue;
+} else {
+}
+break;
+}
+
+var G__10426 = args10421.length;
+switch (G__10426) {
+case 2:
+return cljs.core.interleave.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10421.slice((2)),(0),null));
+return cljs.core.interleave.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.interleave.cljs$core$IFn$_invoke$arity$2 = (function (c1,c2){
+return (new cljs.core.LazySeq(null,(function (){
+var s1 = cljs.core.seq(c1);
+var s2 = cljs.core.seq(c2);
+if((s1) && (s2)){
+return cljs.core.cons(cljs.core.first(s1),cljs.core.cons(cljs.core.first(s2),cljs.core.interleave.cljs$core$IFn$_invoke$arity$2(cljs.core.rest(s1),cljs.core.rest(s2))));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.interleave.cljs$core$IFn$_invoke$arity$variadic = (function (c1,c2,colls){
+return (new cljs.core.LazySeq(null,(function (){
+var ss = cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.seq,cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic(colls,c2,cljs.core.array_seq([c1], 0)));
+if(cljs.core.every_QMARK_(cljs.core.identity,ss)){
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$2(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.first,ss),cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.interleave,cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.rest,ss)));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.interleave.cljs$lang$applyTo = (function (seq10422){
+var G__10423 = cljs.core.first(seq10422);
+var seq10422__$1 = cljs.core.next(seq10422);
+var G__10424 = cljs.core.first(seq10422__$1);
+var seq10422__$2 = cljs.core.next(seq10422__$1);
+return cljs.core.interleave.cljs$core$IFn$_invoke$arity$variadic(G__10423,G__10424,seq10422__$2);
+});
+
+cljs.core.interleave.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns a lazy seq of the elements of coll separated by sep.
+ * Returns a stateful transducer when no collection is provided.
+ */
+cljs.core.interpose = (function cljs$core$interpose(var_args){
+var args10431 = [];
+var len__7625__auto___10434 = arguments.length;
+var i__7626__auto___10435 = (0);
+while(true){
+if((i__7626__auto___10435 < len__7625__auto___10434)){
+args10431.push((arguments[i__7626__auto___10435]));
+
+var G__10436 = (i__7626__auto___10435 + (1));
+i__7626__auto___10435 = G__10436;
+continue;
+} else {
+}
+break;
+}
+
+var G__10433 = args10431.length;
+switch (G__10433) {
+case 1:
+return cljs.core.interpose.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.interpose.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10431.length)].join('')));
+
+}
+});
+
+cljs.core.interpose.cljs$core$IFn$_invoke$arity$1 = (function (sep){
+return (function (rf){
+var started = cljs.core.volatile_BANG_(false);
+return ((function (started){
+return (function() {
+var G__10438 = null;
+var G__10438__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__10438__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__10438__2 = (function (result,input){
+if(cljs.core.truth_(cljs.core.deref(started))){
+var sepr = (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,sep) : rf.call(null,result,sep));
+if(cljs.core.reduced_QMARK_(sepr)){
+return sepr;
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(sepr,input) : rf.call(null,sepr,input));
+}
+} else {
+cljs.core.vreset_BANG_(started,true);
+
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__10438 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__10438__0.call(this);
+case 1:
+return G__10438__1.call(this,result);
+case 2:
+return G__10438__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10438.cljs$core$IFn$_invoke$arity$0 = G__10438__0;
+G__10438.cljs$core$IFn$_invoke$arity$1 = G__10438__1;
+G__10438.cljs$core$IFn$_invoke$arity$2 = G__10438__2;
+return G__10438;
+})()
+;})(started))
+});
+});
+
+cljs.core.interpose.cljs$core$IFn$_invoke$arity$2 = (function (sep,coll){
+return cljs.core.drop.cljs$core$IFn$_invoke$arity$2((1),cljs.core.interleave.cljs$core$IFn$_invoke$arity$2(cljs.core.repeat.cljs$core$IFn$_invoke$arity$1(sep),coll));
+});
+
+cljs.core.interpose.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Take a collection of collections, and return a lazy seq
+ * of items from the inner collection
+ */
+cljs.core.flatten1 = (function cljs$core$flatten1(colls){
+var cat = (function cljs$core$flatten1_$_cat(coll,colls__$1){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4655__auto__ = cljs.core.seq(coll);
+if(temp__4655__auto__){
+var coll__$1 = temp__4655__auto__;
+return cljs.core.cons(cljs.core.first(coll__$1),cljs$core$flatten1_$_cat(cljs.core.rest(coll__$1),colls__$1));
+} else {
+if(cljs.core.seq(colls__$1)){
+return cljs$core$flatten1_$_cat(cljs.core.first(colls__$1),cljs.core.rest(colls__$1));
+} else {
+return null;
+}
+}
+}),null,null));
+});
+return cat(null,colls);
+});
+/**
+ * Returns the result of applying concat to the result of applying map
+ * to f and colls. Thus function f should return a collection. Returns
+ * a transducer when no collections are provided
+ */
+cljs.core.mapcat = (function cljs$core$mapcat(var_args){
+var args10447 = [];
+var len__7625__auto___10452 = arguments.length;
+var i__7626__auto___10453 = (0);
+while(true){
+if((i__7626__auto___10453 < len__7625__auto___10452)){
+args10447.push((arguments[i__7626__auto___10453]));
+
+var G__10454 = (i__7626__auto___10453 + (1));
+i__7626__auto___10453 = G__10454;
+continue;
+} else {
+}
+break;
+}
+
+var G__10451 = args10447.length;
+switch (G__10451) {
+case 1:
+return cljs.core.mapcat.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10447.slice((1)),(0),null));
+return cljs.core.mapcat.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.mapcat.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$2(cljs.core.map.cljs$core$IFn$_invoke$arity$1(f),cljs.core.cat);
+});
+
+cljs.core.mapcat.cljs$core$IFn$_invoke$arity$variadic = (function (f,colls){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.concat,cljs.core.apply.cljs$core$IFn$_invoke$arity$3(cljs.core.map,f,colls));
+});
+
+cljs.core.mapcat.cljs$lang$applyTo = (function (seq10448){
+var G__10449 = cljs.core.first(seq10448);
+var seq10448__$1 = cljs.core.next(seq10448);
+return cljs.core.mapcat.cljs$core$IFn$_invoke$arity$variadic(G__10449,seq10448__$1);
+});
+
+cljs.core.mapcat.cljs$lang$maxFixedArity = (1);
+
+/**
+ * Returns a lazy sequence of the items in coll for which
+ * (pred item) returns true. pred must be free of side-effects.
+ * Returns a transducer when no collection is provided.
+ */
+cljs.core.filter = (function cljs$core$filter(var_args){
+var args10456 = [];
+var len__7625__auto___10460 = arguments.length;
+var i__7626__auto___10461 = (0);
+while(true){
+if((i__7626__auto___10461 < len__7625__auto___10460)){
+args10456.push((arguments[i__7626__auto___10461]));
+
+var G__10462 = (i__7626__auto___10461 + (1));
+i__7626__auto___10461 = G__10462;
+continue;
+} else {
+}
+break;
+}
+
+var G__10458 = args10456.length;
+switch (G__10458) {
+case 1:
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10456.length)].join('')));
+
+}
+});
+
+cljs.core.filter.cljs$core$IFn$_invoke$arity$1 = (function (pred){
+return (function (rf){
+return (function() {
+var G__10464 = null;
+var G__10464__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__10464__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__10464__2 = (function (result,input){
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(input) : pred.call(null,input)))){
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+} else {
+return result;
+}
+});
+G__10464 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__10464__0.call(this);
+case 1:
+return G__10464__1.call(this,result);
+case 2:
+return G__10464__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10464.cljs$core$IFn$_invoke$arity$0 = G__10464__0;
+G__10464.cljs$core$IFn$_invoke$arity$1 = G__10464__1;
+G__10464.cljs$core$IFn$_invoke$arity$2 = G__10464__2;
+return G__10464;
+})()
+});
+});
+
+cljs.core.filter.cljs$core$IFn$_invoke$arity$2 = (function (pred,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s)){
+var c = cljs.core.chunk_first(s);
+var size = cljs.core.count(c);
+var b = cljs.core.chunk_buffer(size);
+var n__7435__auto___10465 = size;
+var i_10466 = (0);
+while(true){
+if((i_10466 < n__7435__auto___10465)){
+if(cljs.core.truth_((function (){var G__10459 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_10466);
+return (pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(G__10459) : pred.call(null,G__10459));
+})())){
+cljs.core.chunk_append(b,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_10466));
+} else {
+}
+
+var G__10467 = (i_10466 + (1));
+i_10466 = G__10467;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.chunk_cons(cljs.core.chunk(b),cljs.core.filter.cljs$core$IFn$_invoke$arity$2(pred,cljs.core.chunk_rest(s)));
+} else {
+var f = cljs.core.first(s);
+var r = cljs.core.rest(s);
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(f) : pred.call(null,f)))){
+return cljs.core.cons(f,cljs.core.filter.cljs$core$IFn$_invoke$arity$2(pred,r));
+} else {
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$2(pred,r);
+}
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.filter.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of the items in coll for which
+ * (pred item) returns false. pred must be free of side-effects.
+ * Returns a transducer when no collection is provided.
+ */
+cljs.core.remove = (function cljs$core$remove(var_args){
+var args10468 = [];
+var len__7625__auto___10471 = arguments.length;
+var i__7626__auto___10472 = (0);
+while(true){
+if((i__7626__auto___10472 < len__7625__auto___10471)){
+args10468.push((arguments[i__7626__auto___10472]));
+
+var G__10473 = (i__7626__auto___10472 + (1));
+i__7626__auto___10472 = G__10473;
+continue;
+} else {
+}
+break;
+}
+
+var G__10470 = args10468.length;
+switch (G__10470) {
+case 1:
+return cljs.core.remove.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.remove.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10468.length)].join('')));
+
+}
+});
+
+cljs.core.remove.cljs$core$IFn$_invoke$arity$1 = (function (pred){
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$1(cljs.core.complement(pred));
+});
+
+cljs.core.remove.cljs$core$IFn$_invoke$arity$2 = (function (pred,coll){
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$2(cljs.core.complement(pred),coll);
+});
+
+cljs.core.remove.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of the nodes in a tree, via a depth-first walk.
+ * branch? must be a fn of one arg that returns true if passed a node
+ * that can have children (but may not). children must be a fn of one
+ * arg that returns a sequence of the children. Will only be called on
+ * nodes for which branch? returns true. Root is the root node of the
+ * tree.
+ */
+cljs.core.tree_seq = (function cljs$core$tree_seq(branch_QMARK_,children,root){
+var walk = (function cljs$core$tree_seq_$_walk(node){
+return (new cljs.core.LazySeq(null,(function (){
+return cljs.core.cons(node,(cljs.core.truth_((branch_QMARK_.cljs$core$IFn$_invoke$arity$1 ? branch_QMARK_.cljs$core$IFn$_invoke$arity$1(node) : branch_QMARK_.call(null,node)))?cljs.core.mapcat.cljs$core$IFn$_invoke$arity$variadic(cljs$core$tree_seq_$_walk,cljs.core.array_seq([(children.cljs$core$IFn$_invoke$arity$1 ? children.cljs$core$IFn$_invoke$arity$1(node) : children.call(null,node))], 0)):null));
+}),null,null));
+});
+return walk(root);
+});
+/**
+ * Takes any nested combination of sequential things (lists, vectors,
+ * etc.) and returns their contents as a single, flat sequence.
+ * (flatten nil) returns nil.
+ */
+cljs.core.flatten = (function cljs$core$flatten(x){
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$2((function (p1__10475_SHARP_){
+return !(cljs.core.sequential_QMARK_(p1__10475_SHARP_));
+}),cljs.core.rest(cljs.core.tree_seq(cljs.core.sequential_QMARK_,cljs.core.seq,x)));
+});
+/**
+ * Returns a new coll consisting of to-coll with all of the items of
+ * from-coll conjoined. A transducer may be supplied.
+ */
+cljs.core.into = (function cljs$core$into(var_args){
+var args10476 = [];
+var len__7625__auto___10481 = arguments.length;
+var i__7626__auto___10482 = (0);
+while(true){
+if((i__7626__auto___10482 < len__7625__auto___10481)){
+args10476.push((arguments[i__7626__auto___10482]));
+
+var G__10483 = (i__7626__auto___10482 + (1));
+i__7626__auto___10482 = G__10483;
+continue;
+} else {
+}
+break;
+}
+
+var G__10478 = args10476.length;
+switch (G__10478) {
+case 0:
+return cljs.core.into.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.into.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.into.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.into.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10476.length)].join('')));
+
+}
+});
+
+cljs.core.into.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.PersistentVector.EMPTY;
+});
+
+cljs.core.into.cljs$core$IFn$_invoke$arity$1 = (function (to){
+return to;
+});
+
+cljs.core.into.cljs$core$IFn$_invoke$arity$2 = (function (to,from){
+if(!((to == null))){
+if(((!((to == null)))?((((to.cljs$lang$protocol_mask$partition1$ & (4))) || ((cljs.core.PROTOCOL_SENTINEL === to.cljs$core$IEditableCollection$)))?true:false):false)){
+return cljs.core.with_meta(cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj_BANG_,cljs.core.transient$(to),from)),cljs.core.meta(to));
+} else {
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj,to,from);
+}
+} else {
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.conj,cljs.core.List.EMPTY,from);
+}
+});
+
+cljs.core.into.cljs$core$IFn$_invoke$arity$3 = (function (to,xform,from){
+if(((!((to == null)))?((((to.cljs$lang$protocol_mask$partition1$ & (4))) || ((cljs.core.PROTOCOL_SENTINEL === to.cljs$core$IEditableCollection$)))?true:false):false)){
+return cljs.core.with_meta(cljs.core.persistent_BANG_(cljs.core.transduce.cljs$core$IFn$_invoke$arity$4(xform,cljs.core.conj_BANG_,cljs.core.transient$(to),from)),cljs.core.meta(to));
+} else {
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$4(xform,cljs.core.conj,to,from);
+}
+});
+
+cljs.core.into.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns a vector consisting of the result of applying f to the
+ * set of first items of each coll, followed by applying f to the set
+ * of second items in each coll, until any one of the colls is
+ * exhausted. Any remaining items in other colls are ignored. Function
+ * f should accept number-of-colls arguments.
+ */
+cljs.core.mapv = (function cljs$core$mapv(var_args){
+var args10485 = [];
+var len__7625__auto___10493 = arguments.length;
+var i__7626__auto___10494 = (0);
+while(true){
+if((i__7626__auto___10494 < len__7625__auto___10493)){
+args10485.push((arguments[i__7626__auto___10494]));
+
+var G__10495 = (i__7626__auto___10494 + (1));
+i__7626__auto___10494 = G__10495;
+continue;
+} else {
+}
+break;
+}
+
+var G__10492 = args10485.length;
+switch (G__10492) {
+case 2:
+return cljs.core.mapv.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.mapv.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.mapv.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10485.slice((4)),(0),null));
+return cljs.core.mapv.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.mapv.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+return cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (v,o){
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2(v,(f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(o) : f.call(null,o)));
+}),cljs.core.transient$(cljs.core.PersistentVector.EMPTY),coll));
+});
+
+cljs.core.mapv.cljs$core$IFn$_invoke$arity$3 = (function (f,c1,c2){
+return cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentVector.EMPTY,cljs.core.map.cljs$core$IFn$_invoke$arity$3(f,c1,c2));
+});
+
+cljs.core.mapv.cljs$core$IFn$_invoke$arity$4 = (function (f,c1,c2,c3){
+return cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentVector.EMPTY,cljs.core.map.cljs$core$IFn$_invoke$arity$4(f,c1,c2,c3));
+});
+
+cljs.core.mapv.cljs$core$IFn$_invoke$arity$variadic = (function (f,c1,c2,c3,colls){
+return cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentVector.EMPTY,cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(cljs.core.map,f,c1,c2,c3,cljs.core.array_seq([colls], 0)));
+});
+
+cljs.core.mapv.cljs$lang$applyTo = (function (seq10486){
+var G__10487 = cljs.core.first(seq10486);
+var seq10486__$1 = cljs.core.next(seq10486);
+var G__10488 = cljs.core.first(seq10486__$1);
+var seq10486__$2 = cljs.core.next(seq10486__$1);
+var G__10489 = cljs.core.first(seq10486__$2);
+var seq10486__$3 = cljs.core.next(seq10486__$2);
+var G__10490 = cljs.core.first(seq10486__$3);
+var seq10486__$4 = cljs.core.next(seq10486__$3);
+return cljs.core.mapv.cljs$core$IFn$_invoke$arity$variadic(G__10487,G__10488,G__10489,G__10490,seq10486__$4);
+});
+
+cljs.core.mapv.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Returns a vector of the items in coll for which
+ * (pred item) returns true. pred must be free of side-effects.
+ */
+cljs.core.filterv = (function cljs$core$filterv(pred,coll){
+return cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (v,o){
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(o) : pred.call(null,o)))){
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2(v,o);
+} else {
+return v;
+}
+}),cljs.core.transient$(cljs.core.PersistentVector.EMPTY),coll));
+});
+/**
+ * Returns a lazy sequence of lists of n items each, at offsets step
+ * apart. If step is not supplied, defaults to n, i.e. the partitions
+ * do not overlap. If a pad collection is supplied, use its elements as
+ * necessary to complete last partition up to n items. In case there are
+ * not enough padding elements, return a partition with less than n items.
+ */
+cljs.core.partition = (function cljs$core$partition(var_args){
+var args10497 = [];
+var len__7625__auto___10500 = arguments.length;
+var i__7626__auto___10501 = (0);
+while(true){
+if((i__7626__auto___10501 < len__7625__auto___10500)){
+args10497.push((arguments[i__7626__auto___10501]));
+
+var G__10502 = (i__7626__auto___10501 + (1));
+i__7626__auto___10501 = G__10502;
+continue;
+} else {
+}
+break;
+}
+
+var G__10499 = args10497.length;
+switch (G__10499) {
+case 2:
+return cljs.core.partition.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.partition.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.partition.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10497.length)].join('')));
+
+}
+});
+
+cljs.core.partition.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+return cljs.core.partition.cljs$core$IFn$_invoke$arity$3(n,n,coll);
+});
+
+cljs.core.partition.cljs$core$IFn$_invoke$arity$3 = (function (n,step,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+var p = cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,s);
+if((n === cljs.core.count(p))){
+return cljs.core.cons(p,cljs.core.partition.cljs$core$IFn$_invoke$arity$3(n,step,cljs.core.drop.cljs$core$IFn$_invoke$arity$2(step,s)));
+} else {
+return null;
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.partition.cljs$core$IFn$_invoke$arity$4 = (function (n,step,pad,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+var p = cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,s);
+if((n === cljs.core.count(p))){
+return cljs.core.cons(p,cljs.core.partition.cljs$core$IFn$_invoke$arity$4(n,step,pad,cljs.core.drop.cljs$core$IFn$_invoke$arity$2(step,s)));
+} else {
+var x__7354__auto__ = cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,cljs.core.concat.cljs$core$IFn$_invoke$arity$2(p,pad));
+return cljs.core._conj(cljs.core.List.EMPTY,x__7354__auto__);
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.partition.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Returns the value in a nested associative structure,
+ * where ks is a sequence of keys. Returns nil if the key is not present,
+ * or the not-found value if supplied.
+ */
+cljs.core.get_in = (function cljs$core$get_in(var_args){
+var args10504 = [];
+var len__7625__auto___10507 = arguments.length;
+var i__7626__auto___10508 = (0);
+while(true){
+if((i__7626__auto___10508 < len__7625__auto___10507)){
+args10504.push((arguments[i__7626__auto___10508]));
+
+var G__10509 = (i__7626__auto___10508 + (1));
+i__7626__auto___10508 = G__10509;
+continue;
+} else {
+}
+break;
+}
+
+var G__10506 = args10504.length;
+switch (G__10506) {
+case 2:
+return cljs.core.get_in.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.get_in.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10504.length)].join('')));
+
+}
+});
+
+cljs.core.get_in.cljs$core$IFn$_invoke$arity$2 = (function (m,ks){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.get,m,ks);
+});
+
+cljs.core.get_in.cljs$core$IFn$_invoke$arity$3 = (function (m,ks,not_found){
+var sentinel = cljs.core.lookup_sentinel;
+var m__$1 = m;
+var ks__$1 = cljs.core.seq(ks);
+while(true){
+if(!((ks__$1 == null))){
+var m__$2 = cljs.core.get.cljs$core$IFn$_invoke$arity$3(m__$1,cljs.core.first(ks__$1),sentinel);
+if((sentinel === m__$2)){
+return not_found;
+} else {
+var G__10511 = sentinel;
+var G__10512 = m__$2;
+var G__10513 = cljs.core.next(ks__$1);
+sentinel = G__10511;
+m__$1 = G__10512;
+ks__$1 = G__10513;
+continue;
+}
+} else {
+return m__$1;
+}
+break;
+}
+});
+
+cljs.core.get_in.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Associates a value in a nested associative structure, where ks is a
+ * sequence of keys and v is the new value and returns a new nested structure.
+ * If any levels do not exist, hash-maps will be created.
+ */
+cljs.core.assoc_in = (function cljs$core$assoc_in(m,p__10514,v){
+var vec__10521 = p__10514;
+var seq__10522 = cljs.core.seq(vec__10521);
+var first__10523 = cljs.core.first(seq__10522);
+var seq__10522__$1 = cljs.core.next(seq__10522);
+var k = first__10523;
+var ks = seq__10522__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__10524 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__10525 = ks;
+var G__10526 = v;
+return (cljs.core.assoc_in.cljs$core$IFn$_invoke$arity$3 ? cljs.core.assoc_in.cljs$core$IFn$_invoke$arity$3(G__10524,G__10525,G__10526) : cljs.core.assoc_in.call(null,G__10524,G__10525,G__10526));
+})());
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,v);
+}
+});
+/**
+ * 'Updates' a value in a nested associative structure, where ks is a
+ * sequence of keys and f is a function that will take the old value
+ * and any supplied args and return the new value, and returns a new
+ * nested structure. If any levels do not exist, hash-maps will be
+ * created.
+ */
+cljs.core.update_in = (function cljs$core$update_in(var_args){
+var args10527 = [];
+var len__7625__auto___10567 = arguments.length;
+var i__7626__auto___10568 = (0);
+while(true){
+if((i__7626__auto___10568 < len__7625__auto___10567)){
+args10527.push((arguments[i__7626__auto___10568]));
+
+var G__10569 = (i__7626__auto___10568 + (1));
+i__7626__auto___10568 = G__10569;
+continue;
+} else {
+}
+break;
+}
+
+var G__10536 = args10527.length;
+switch (G__10536) {
+case 3:
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 6:
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10527.slice((6)),(0),null));
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.update_in.cljs$core$IFn$_invoke$arity$3 = (function (m,p__10537,f){
+var vec__10538 = p__10537;
+var seq__10539 = cljs.core.seq(vec__10538);
+var first__10540 = cljs.core.first(seq__10539);
+var seq__10539__$1 = cljs.core.next(seq__10539);
+var k = first__10540;
+var ks = seq__10539__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.update_in.cljs$core$IFn$_invoke$arity$3(cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),ks,f));
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__10541 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10541) : f.call(null,G__10541));
+})());
+}
+});
+
+cljs.core.update_in.cljs$core$IFn$_invoke$arity$4 = (function (m,p__10542,f,a){
+var vec__10543 = p__10542;
+var seq__10544 = cljs.core.seq(vec__10543);
+var first__10545 = cljs.core.first(seq__10544);
+var seq__10544__$1 = cljs.core.next(seq__10544);
+var k = first__10545;
+var ks = seq__10544__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.update_in.cljs$core$IFn$_invoke$arity$4(cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),ks,f,a));
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__10546 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__10547 = a;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10546,G__10547) : f.call(null,G__10546,G__10547));
+})());
+}
+});
+
+cljs.core.update_in.cljs$core$IFn$_invoke$arity$5 = (function (m,p__10548,f,a,b){
+var vec__10549 = p__10548;
+var seq__10550 = cljs.core.seq(vec__10549);
+var first__10551 = cljs.core.first(seq__10550);
+var seq__10550__$1 = cljs.core.next(seq__10550);
+var k = first__10551;
+var ks = seq__10550__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.update_in.cljs$core$IFn$_invoke$arity$5(cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),ks,f,a,b));
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__10552 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__10553 = a;
+var G__10554 = b;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10552,G__10553,G__10554) : f.call(null,G__10552,G__10553,G__10554));
+})());
+}
+});
+
+cljs.core.update_in.cljs$core$IFn$_invoke$arity$6 = (function (m,p__10555,f,a,b,c){
+var vec__10556 = p__10555;
+var seq__10557 = cljs.core.seq(vec__10556);
+var first__10558 = cljs.core.first(seq__10557);
+var seq__10557__$1 = cljs.core.next(seq__10557);
+var k = first__10558;
+var ks = seq__10557__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.update_in.cljs$core$IFn$_invoke$arity$6(cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),ks,f,a,b,c));
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__10559 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__10560 = a;
+var G__10561 = b;
+var G__10562 = c;
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(G__10559,G__10560,G__10561,G__10562) : f.call(null,G__10559,G__10560,G__10561,G__10562));
+})());
+}
+});
+
+cljs.core.update_in.cljs$core$IFn$_invoke$arity$variadic = (function (m,p__10563,f,a,b,c,args){
+var vec__10564 = p__10563;
+var seq__10565 = cljs.core.seq(vec__10564);
+var first__10566 = cljs.core.first(seq__10565);
+var seq__10565__$1 = cljs.core.next(seq__10565);
+var k = first__10566;
+var ks = seq__10565__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(cljs.core.update_in,cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),ks,f,a,cljs.core.array_seq([b,c,args], 0)));
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),a,b,c,cljs.core.array_seq([args], 0)));
+}
+});
+
+cljs.core.update_in.cljs$lang$applyTo = (function (seq10528){
+var G__10529 = cljs.core.first(seq10528);
+var seq10528__$1 = cljs.core.next(seq10528);
+var G__10530 = cljs.core.first(seq10528__$1);
+var seq10528__$2 = cljs.core.next(seq10528__$1);
+var G__10531 = cljs.core.first(seq10528__$2);
+var seq10528__$3 = cljs.core.next(seq10528__$2);
+var G__10532 = cljs.core.first(seq10528__$3);
+var seq10528__$4 = cljs.core.next(seq10528__$3);
+var G__10533 = cljs.core.first(seq10528__$4);
+var seq10528__$5 = cljs.core.next(seq10528__$4);
+var G__10534 = cljs.core.first(seq10528__$5);
+var seq10528__$6 = cljs.core.next(seq10528__$5);
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$variadic(G__10529,G__10530,G__10531,G__10532,G__10533,G__10534,seq10528__$6);
+});
+
+cljs.core.update_in.cljs$lang$maxFixedArity = (6);
+
+/**
+ * 'Updates' a value in an associative structure, where k is a
+ * key and f is a function that will take the old value
+ * and any supplied args and return the new value, and returns a new
+ * structure. If the key does not exist, nil is passed as the old value.
+ */
+cljs.core.update = (function cljs$core$update(var_args){
+var args10571 = [];
+var len__7625__auto___10591 = arguments.length;
+var i__7626__auto___10592 = (0);
+while(true){
+if((i__7626__auto___10592 < len__7625__auto___10591)){
+args10571.push((arguments[i__7626__auto___10592]));
+
+var G__10593 = (i__7626__auto___10592 + (1));
+i__7626__auto___10592 = G__10593;
+continue;
+} else {
+}
+break;
+}
+
+var G__10580 = args10571.length;
+switch (G__10580) {
+case 3:
+return cljs.core.update.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.update.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.update.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 6:
+return cljs.core.update.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args10571.slice((6)),(0),null));
+return cljs.core.update.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.update.cljs$core$IFn$_invoke$arity$3 = (function (m,k,f){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__10581 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10581) : f.call(null,G__10581));
+})());
+});
+
+cljs.core.update.cljs$core$IFn$_invoke$arity$4 = (function (m,k,f,x){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__10582 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__10583 = x;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10582,G__10583) : f.call(null,G__10582,G__10583));
+})());
+});
+
+cljs.core.update.cljs$core$IFn$_invoke$arity$5 = (function (m,k,f,x,y){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__10584 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__10585 = x;
+var G__10586 = y;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10584,G__10585,G__10586) : f.call(null,G__10584,G__10585,G__10586));
+})());
+});
+
+cljs.core.update.cljs$core$IFn$_invoke$arity$6 = (function (m,k,f,x,y,z){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__10587 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__10588 = x;
+var G__10589 = y;
+var G__10590 = z;
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(G__10587,G__10588,G__10589,G__10590) : f.call(null,G__10587,G__10588,G__10589,G__10590));
+})());
+});
+
+cljs.core.update.cljs$core$IFn$_invoke$arity$variadic = (function (m,k,f,x,y,z,more){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),x,y,z,cljs.core.array_seq([more], 0)));
+});
+
+cljs.core.update.cljs$lang$applyTo = (function (seq10572){
+var G__10573 = cljs.core.first(seq10572);
+var seq10572__$1 = cljs.core.next(seq10572);
+var G__10574 = cljs.core.first(seq10572__$1);
+var seq10572__$2 = cljs.core.next(seq10572__$1);
+var G__10575 = cljs.core.first(seq10572__$2);
+var seq10572__$3 = cljs.core.next(seq10572__$2);
+var G__10576 = cljs.core.first(seq10572__$3);
+var seq10572__$4 = cljs.core.next(seq10572__$3);
+var G__10577 = cljs.core.first(seq10572__$4);
+var seq10572__$5 = cljs.core.next(seq10572__$4);
+var G__10578 = cljs.core.first(seq10572__$5);
+var seq10572__$6 = cljs.core.next(seq10572__$5);
+return cljs.core.update.cljs$core$IFn$_invoke$arity$variadic(G__10573,G__10574,G__10575,G__10576,G__10577,G__10578,seq10572__$6);
+});
+
+cljs.core.update.cljs$lang$maxFixedArity = (6);
+
+
+/**
+* @constructor
+*/
+cljs.core.VectorNode = (function (edit,arr){
+this.edit = edit;
+this.arr = arr;
+})
+
+cljs.core.VectorNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"edit","edit",-1302639,null),new cljs.core.Symbol(null,"arr","arr",2115492975,null)], null);
+});
+
+cljs.core.VectorNode.cljs$lang$type = true;
+
+cljs.core.VectorNode.cljs$lang$ctorStr = "cljs.core/VectorNode";
+
+cljs.core.VectorNode.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/VectorNode");
+});
+
+cljs.core.__GT_VectorNode = (function cljs$core$__GT_VectorNode(edit,arr){
+return (new cljs.core.VectorNode(edit,arr));
+});
+
+cljs.core.pv_fresh_node = (function cljs$core$pv_fresh_node(edit){
+return (new cljs.core.VectorNode(edit,[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]));
+});
+cljs.core.pv_aget = (function cljs$core$pv_aget(node,idx){
+return (node.arr[idx]);
+});
+cljs.core.pv_aset = (function cljs$core$pv_aset(node,idx,val){
+return (node.arr[idx] = val);
+});
+cljs.core.pv_clone_node = (function cljs$core$pv_clone_node(node){
+return (new cljs.core.VectorNode(node.edit,cljs.core.aclone(node.arr)));
+});
+cljs.core.tail_off = (function cljs$core$tail_off(pv){
+var cnt = pv.cnt;
+if((cnt < (32))){
+return (0);
+} else {
+return (((cnt - (1)) >>> (5)) << (5));
+}
+});
+cljs.core.new_path = (function cljs$core$new_path(edit,level,node){
+var ll = level;
+var ret = node;
+while(true){
+if((ll === (0))){
+return ret;
+} else {
+var embed = ret;
+var r = cljs.core.pv_fresh_node(edit);
+var _ = cljs.core.pv_aset(r,(0),embed);
+var G__10595 = (ll - (5));
+var G__10596 = r;
+ll = G__10595;
+ret = G__10596;
+continue;
+}
+break;
+}
+});
+cljs.core.push_tail = (function cljs$core$push_tail(pv,level,parent,tailnode){
+var ret = cljs.core.pv_clone_node(parent);
+var subidx = (((pv.cnt - (1)) >>> level) & (31));
+if(((5) === level)){
+cljs.core.pv_aset(ret,subidx,tailnode);
+
+return ret;
+} else {
+var child = cljs.core.pv_aget(parent,subidx);
+if(!((child == null))){
+var node_to_insert = (function (){var G__10601 = pv;
+var G__10602 = (level - (5));
+var G__10603 = child;
+var G__10604 = tailnode;
+return (cljs.core.push_tail.cljs$core$IFn$_invoke$arity$4 ? cljs.core.push_tail.cljs$core$IFn$_invoke$arity$4(G__10601,G__10602,G__10603,G__10604) : cljs.core.push_tail.call(null,G__10601,G__10602,G__10603,G__10604));
+})();
+cljs.core.pv_aset(ret,subidx,node_to_insert);
+
+return ret;
+} else {
+var node_to_insert = cljs.core.new_path(null,(level - (5)),tailnode);
+cljs.core.pv_aset(ret,subidx,node_to_insert);
+
+return ret;
+}
+}
+});
+cljs.core.vector_index_out_of_bounds = (function cljs$core$vector_index_out_of_bounds(i,cnt){
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("No item "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(i),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" in vector of length "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(cnt)].join('')));
+});
+cljs.core.first_array_for_longvec = (function cljs$core$first_array_for_longvec(pv){
+var node = pv.root;
+var level = pv.shift;
+while(true){
+if((level > (0))){
+var G__10605 = cljs.core.pv_aget(node,(0));
+var G__10606 = (level - (5));
+node = G__10605;
+level = G__10606;
+continue;
+} else {
+return node.arr;
+}
+break;
+}
+});
+cljs.core.unchecked_array_for = (function cljs$core$unchecked_array_for(pv,i){
+if((i >= cljs.core.tail_off(pv))){
+return pv.tail;
+} else {
+var node = pv.root;
+var level = pv.shift;
+while(true){
+if((level > (0))){
+var G__10607 = cljs.core.pv_aget(node,((i >>> level) & (31)));
+var G__10608 = (level - (5));
+node = G__10607;
+level = G__10608;
+continue;
+} else {
+return node.arr;
+}
+break;
+}
+}
+});
+cljs.core.array_for = (function cljs$core$array_for(pv,i){
+if((((0) <= i)) && ((i < pv.cnt))){
+return cljs.core.unchecked_array_for(pv,i);
+} else {
+return cljs.core.vector_index_out_of_bounds(i,pv.cnt);
+}
+});
+cljs.core.do_assoc = (function cljs$core$do_assoc(pv,level,node,i,val){
+var ret = cljs.core.pv_clone_node(node);
+if((level === (0))){
+cljs.core.pv_aset(ret,(i & (31)),val);
+
+return ret;
+} else {
+var subidx = ((i >>> level) & (31));
+cljs.core.pv_aset(ret,subidx,(function (){var G__10614 = pv;
+var G__10615 = (level - (5));
+var G__10616 = cljs.core.pv_aget(node,subidx);
+var G__10617 = i;
+var G__10618 = val;
+return (cljs.core.do_assoc.cljs$core$IFn$_invoke$arity$5 ? cljs.core.do_assoc.cljs$core$IFn$_invoke$arity$5(G__10614,G__10615,G__10616,G__10617,G__10618) : cljs.core.do_assoc.call(null,G__10614,G__10615,G__10616,G__10617,G__10618));
+})());
+
+return ret;
+}
+});
+cljs.core.pop_tail = (function cljs$core$pop_tail(pv,level,node){
+var subidx = (((pv.cnt - (2)) >>> level) & (31));
+if((level > (5))){
+var new_child = (function (){var G__10622 = pv;
+var G__10623 = (level - (5));
+var G__10624 = cljs.core.pv_aget(node,subidx);
+return (cljs.core.pop_tail.cljs$core$IFn$_invoke$arity$3 ? cljs.core.pop_tail.cljs$core$IFn$_invoke$arity$3(G__10622,G__10623,G__10624) : cljs.core.pop_tail.call(null,G__10622,G__10623,G__10624));
+})();
+if(((new_child == null)) && ((subidx === (0)))){
+return null;
+} else {
+var ret = cljs.core.pv_clone_node(node);
+cljs.core.pv_aset(ret,subidx,new_child);
+
+return ret;
+}
+} else {
+if((subidx === (0))){
+return null;
+} else {
+var ret = cljs.core.pv_clone_node(node);
+cljs.core.pv_aset(ret,subidx,null);
+
+return ret;
+
+}
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.RangedIterator = (function (i,base,arr,v,start,end){
+this.i = i;
+this.base = base;
+this.arr = arr;
+this.v = v;
+this.start = start;
+this.end = end;
+})
+cljs.core.RangedIterator.prototype.hasNext = (function (){
+var self__ = this;
+var this$ = this;
+return (self__.i < self__.end);
+});
+
+cljs.core.RangedIterator.prototype.next = (function (){
+var self__ = this;
+var this$ = this;
+if(((self__.i - self__.base) === (32))){
+self__.arr = cljs.core.unchecked_array_for(self__.v,self__.i);
+
+self__.base = (self__.base + (32));
+} else {
+}
+
+var ret = (self__.arr[(self__.i & (31))]);
+self__.i = (self__.i + (1));
+
+return ret;
+});
+
+cljs.core.RangedIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"base","base",1825810849,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"v","v",1661996586,null),new cljs.core.Symbol(null,"start","start",1285322546,null),new cljs.core.Symbol(null,"end","end",1372345569,null)], null);
+});
+
+cljs.core.RangedIterator.cljs$lang$type = true;
+
+cljs.core.RangedIterator.cljs$lang$ctorStr = "cljs.core/RangedIterator";
+
+cljs.core.RangedIterator.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/RangedIterator");
+});
+
+cljs.core.__GT_RangedIterator = (function cljs$core$__GT_RangedIterator(i,base,arr,v,start,end){
+return (new cljs.core.RangedIterator(i,base,arr,v,start,end));
+});
+
+cljs.core.ranged_iterator = (function cljs$core$ranged_iterator(v,start,end){
+var i = start;
+return (new cljs.core.RangedIterator(i,(i - (i % (32))),(((start < cljs.core.count(v)))?cljs.core.unchecked_array_for(v,i):null),v,start,end));
+});
+
+
+
+
+
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IVector}
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEditableCollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IMapEntry}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.PersistentVector = (function (meta,cnt,shift,root,tail,__hash){
+this.meta = meta;
+this.cnt = cnt;
+this.shift = shift;
+this.root = root;
+this.tail = tail;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 167668511;
+this.cljs$lang$protocol_mask$partition1$ = 8196;
+})
+cljs.core.PersistentVector.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentVector.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentVector.prototype.indexOf = (function() {
+var G__10635 = null;
+var G__10635__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10635__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10635 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10635__1.call(this,x);
+case 2:
+return G__10635__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10635.cljs$core$IFn$_invoke$arity$1 = G__10635__1;
+G__10635.cljs$core$IFn$_invoke$arity$2 = G__10635__2;
+return G__10635;
+})()
+;
+
+cljs.core.PersistentVector.prototype.lastIndexOf = (function() {
+var G__10636 = null;
+var G__10636__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10636__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10636 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10636__1.call(this,x);
+case 2:
+return G__10636__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10636.cljs$core$IFn$_invoke$arity$1 = G__10636__1;
+G__10636.cljs$core$IFn$_invoke$arity$2 = G__10636__2;
+return G__10636;
+})()
+;
+
+cljs.core.PersistentVector.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(typeof k === 'number'){
+return coll__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+} else {
+return not_found;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (v,f,init){
+var self__ = this;
+var v__$1 = this;
+var i = (0);
+var init__$1 = init;
+while(true){
+if((i < self__.cnt)){
+var arr = cljs.core.unchecked_array_for(v__$1,i);
+var len = arr.length;
+var init__$2 = (function (){var j = (0);
+var init__$2 = init__$1;
+while(true){
+if((j < len)){
+var init__$3 = (function (){var G__10626 = init__$2;
+var G__10627 = (j + i);
+var G__10628 = (arr[j]);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10626,G__10627,G__10628) : f.call(null,G__10626,G__10627,G__10628));
+})();
+if(cljs.core.reduced_QMARK_(init__$3)){
+return init__$3;
+} else {
+var G__10637 = (j + (1));
+var G__10638 = init__$3;
+j = G__10637;
+init__$2 = G__10638;
+continue;
+}
+} else {
+return init__$2;
+}
+break;
+}
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$2) : cljs.core.deref.call(null,init__$2));
+} else {
+var G__10639 = (i + len);
+var G__10640 = init__$2;
+i = G__10639;
+init__$1 = G__10640;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (coll,n){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.array_for(coll__$1,n)[(n & (31))]);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (coll,n,not_found){
+var self__ = this;
+var coll__$1 = this;
+if((((0) <= n)) && ((n < self__.cnt))){
+return (cljs.core.unchecked_array_for(coll__$1,n)[(n & (31))]);
+} else {
+return not_found;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IVector$_assoc_n$arity$3 = (function (coll,n,val){
+var self__ = this;
+var coll__$1 = this;
+if((((0) <= n)) && ((n < self__.cnt))){
+if((cljs.core.tail_off(coll__$1) <= n)){
+var new_tail = cljs.core.aclone(self__.tail);
+(new_tail[(n & (31))] = val);
+
+return (new cljs.core.PersistentVector(self__.meta,self__.cnt,self__.shift,self__.root,new_tail,null));
+} else {
+return (new cljs.core.PersistentVector(self__.meta,self__.cnt,self__.shift,cljs.core.do_assoc(coll__$1,self__.shift,self__.root,n,val),self__.tail,null));
+}
+} else {
+if((n === self__.cnt)){
+return coll__$1.cljs$core$ICollection$_conj$arity$2(null,val);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Index "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(n),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" out of bounds [0,"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.cnt),cljs.core.str.cljs$core$IFn$_invoke$arity$1("]")].join('')));
+
+}
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentVector.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core.ranged_iterator(this$__$1,(0),self__.cnt);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentVector(self__.meta,self__.cnt,self__.shift,self__.root,self__.tail,self__.__hash));
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.cnt;
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IMapEntry$_key$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$IIndexed$_nth$arity$2(null,(0));
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IMapEntry$_val$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$IIndexed$_nth$arity$2(null,(1));
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IStack$_peek$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+return coll__$1.cljs$core$IIndexed$_nth$arity$2(null,(self__.cnt - (1)));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IStack$_pop$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt === (0))){
+throw (new Error("Can't pop empty vector"));
+} else {
+if(((1) === self__.cnt)){
+return cljs.core._with_meta(cljs.core.PersistentVector.EMPTY,self__.meta);
+} else {
+if(((1) < (self__.cnt - cljs.core.tail_off(coll__$1)))){
+return (new cljs.core.PersistentVector(self__.meta,(self__.cnt - (1)),self__.shift,self__.root,self__.tail.slice((0),(-1)),null));
+} else {
+var new_tail = cljs.core.unchecked_array_for(coll__$1,(self__.cnt - (2)));
+var nr = cljs.core.pop_tail(coll__$1,self__.shift,self__.root);
+var new_root = (((nr == null))?cljs.core.PersistentVector.EMPTY_NODE:nr);
+var cnt_1 = (self__.cnt - (1));
+if((((5) < self__.shift)) && ((cljs.core.pv_aget(new_root,(1)) == null))){
+return (new cljs.core.PersistentVector(self__.meta,cnt_1,(self__.shift - (5)),cljs.core.pv_aget(new_root,(0)),new_tail,null));
+} else {
+return (new cljs.core.PersistentVector(self__.meta,cnt_1,self__.shift,new_root,new_tail,null));
+}
+
+}
+}
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+return (new cljs.core.RSeq(coll__$1,(self__.cnt - (1)),null));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+if((other instanceof cljs.core.PersistentVector)){
+if((self__.cnt === cljs.core.count(other))){
+var me_iter = coll__$1.cljs$core$IIterable$_iterator$arity$1(null);
+var you_iter = cljs.core._iterator(other);
+while(true){
+if(me_iter.hasNext()){
+var x = me_iter.next();
+var y = you_iter.next();
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x,y)){
+continue;
+} else {
+return false;
+}
+} else {
+return true;
+}
+break;
+}
+} else {
+return false;
+}
+} else {
+return cljs.core.equiv_sequential(coll__$1,other);
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IEditableCollection$_as_transient$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.TransientVector(self__.cnt,self__.shift,(cljs.core.tv_editable_root.cljs$core$IFn$_invoke$arity$1 ? cljs.core.tv_editable_root.cljs$core$IFn$_invoke$arity$1(self__.root) : cljs.core.tv_editable_root.call(null,self__.root)),(cljs.core.tv_editable_tail.cljs$core$IFn$_invoke$arity$1 ? cljs.core.tv_editable_tail.cljs$core$IFn$_invoke$arity$1(self__.tail) : cljs.core.tv_editable_tail.call(null,self__.tail))));
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.PersistentVector.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (v,f){
+var self__ = this;
+var v__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2(v__$1,f);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (v,f,init){
+var self__ = this;
+var v__$1 = this;
+var i = (0);
+var init__$1 = init;
+while(true){
+if((i < self__.cnt)){
+var arr = cljs.core.unchecked_array_for(v__$1,i);
+var len = arr.length;
+var init__$2 = (function (){var j = (0);
+var init__$2 = init__$1;
+while(true){
+if((j < len)){
+var init__$3 = (function (){var G__10629 = init__$2;
+var G__10630 = (arr[j]);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10629,G__10630) : f.call(null,G__10629,G__10630));
+})();
+if(cljs.core.reduced_QMARK_(init__$3)){
+return init__$3;
+} else {
+var G__10641 = (j + (1));
+var G__10642 = init__$3;
+j = G__10641;
+init__$2 = G__10642;
+continue;
+}
+} else {
+return init__$2;
+}
+break;
+}
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$2) : cljs.core.deref.call(null,init__$2));
+} else {
+var G__10643 = (i + len);
+var G__10644 = init__$2;
+i = G__10643;
+init__$1 = G__10644;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,k,v){
+var self__ = this;
+var coll__$1 = this;
+if(typeof k === 'number'){
+return coll__$1.cljs$core$IVector$_assoc_n$arity$3(null,k,v);
+} else {
+throw (new Error("Vector's key for assoc must be a number."));
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt === (0))){
+return null;
+} else {
+if((self__.cnt <= (32))){
+return (new cljs.core.IndexedSeq(self__.tail,(0),null));
+} else {
+var G__10631 = coll__$1;
+var G__10632 = cljs.core.first_array_for_longvec(coll__$1);
+var G__10633 = (0);
+var G__10634 = (0);
+return (cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4 ? cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4(G__10631,G__10632,G__10633,G__10634) : cljs.core.chunked_seq.call(null,G__10631,G__10632,G__10633,G__10634));
+
+}
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentVector(meta__$1,self__.cnt,self__.shift,self__.root,self__.tail,self__.__hash));
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+if(((self__.cnt - cljs.core.tail_off(coll__$1)) < (32))){
+var len = self__.tail.length;
+var new_tail = (new Array((len + (1))));
+var n__7435__auto___10645 = len;
+var i_10646 = (0);
+while(true){
+if((i_10646 < n__7435__auto___10645)){
+(new_tail[i_10646] = (self__.tail[i_10646]));
+
+var G__10647 = (i_10646 + (1));
+i_10646 = G__10647;
+continue;
+} else {
+}
+break;
+}
+
+(new_tail[len] = o);
+
+return (new cljs.core.PersistentVector(self__.meta,(self__.cnt + (1)),self__.shift,self__.root,new_tail,null));
+} else {
+var root_overflow_QMARK_ = ((self__.cnt >>> (5)) > ((1) << self__.shift));
+var new_shift = ((root_overflow_QMARK_)?(self__.shift + (5)):self__.shift);
+var new_root = ((root_overflow_QMARK_)?(function (){var n_r = cljs.core.pv_fresh_node(null);
+cljs.core.pv_aset(n_r,(0),self__.root);
+
+cljs.core.pv_aset(n_r,(1),cljs.core.new_path(null,self__.shift,(new cljs.core.VectorNode(null,self__.tail))));
+
+return n_r;
+})():cljs.core.push_tail(coll__$1,self__.shift,self__.root,(new cljs.core.VectorNode(null,self__.tail))));
+return (new cljs.core.PersistentVector(self__.meta,(self__.cnt + (1)),new_shift,new_root,[o],null));
+}
+});
+
+cljs.core.PersistentVector.prototype.call = (function() {
+var G__10648 = null;
+var G__10648__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+var G__10648__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+G__10648 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__10648__2.call(this,self__,k);
+case 3:
+return G__10648__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10648.cljs$core$IFn$_invoke$arity$2 = G__10648__2;
+G__10648.cljs$core$IFn$_invoke$arity$3 = G__10648__3;
+return G__10648;
+})()
+;
+
+cljs.core.PersistentVector.prototype.apply = (function (self__,args10625){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args10625)));
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentVector.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.Symbol(null,"shift","shift",-1657295705,null),new cljs.core.Symbol(null,"root","root",1191874074,null),new cljs.core.Symbol(null,"tail","tail",494507963,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentVector.cljs$lang$type = true;
+
+cljs.core.PersistentVector.cljs$lang$ctorStr = "cljs.core/PersistentVector";
+
+cljs.core.PersistentVector.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentVector");
+});
+
+cljs.core.__GT_PersistentVector = (function cljs$core$__GT_PersistentVector(meta,cnt,shift,root,tail,__hash){
+return (new cljs.core.PersistentVector(meta,cnt,shift,root,tail,__hash));
+});
+
+cljs.core.PersistentVector.EMPTY_NODE = (new cljs.core.VectorNode(null,[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]));
+cljs.core.PersistentVector.EMPTY = (new cljs.core.PersistentVector(null,(0),(5),cljs.core.PersistentVector.EMPTY_NODE,[],cljs.core.empty_ordered_hash));
+cljs.core.PersistentVector.fromArray = (function (xs,no_clone){
+var l = xs.length;
+var xs__$1 = ((no_clone)?xs:cljs.core.aclone(xs));
+if((l < (32))){
+return (new cljs.core.PersistentVector(null,l,(5),cljs.core.PersistentVector.EMPTY_NODE,xs__$1,null));
+} else {
+var node = xs__$1.slice((0),(32));
+var v = (new cljs.core.PersistentVector(null,(32),(5),cljs.core.PersistentVector.EMPTY_NODE,node,null));
+var i = (32);
+var out = v.cljs$core$IEditableCollection$_as_transient$arity$1(null);
+while(true){
+if((i < l)){
+var G__10649 = (i + (1));
+var G__10650 = cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2(out,(xs__$1[i]));
+i = G__10649;
+out = G__10650;
+continue;
+} else {
+return cljs.core.persistent_BANG_(out);
+}
+break;
+}
+}
+});
+(cljs.core.PersistentVector.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+/**
+ * Creates a new vector containing the contents of coll. JavaScript arrays
+ * will be aliased and should not be modified.
+ */
+cljs.core.vec = (function cljs$core$vec(coll){
+if(cljs.core.array_QMARK_(coll)){
+return cljs.core.PersistentVector.fromArray(coll,true);
+} else {
+return cljs.core._persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj_BANG_,cljs.core._as_transient(cljs.core.PersistentVector.EMPTY),coll));
+}
+});
+/**
+ * Creates a new vector containing the args.
+ */
+cljs.core.vector = (function cljs$core$vector(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___10652 = arguments.length;
+var i__7626__auto___10653 = (0);
+while(true){
+if((i__7626__auto___10653 < len__7625__auto___10652)){
+args__7632__auto__.push((arguments[i__7626__auto___10653]));
+
+var G__10654 = (i__7626__auto___10653 + (1));
+i__7626__auto___10653 = G__10654;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.vector.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.vector.cljs$core$IFn$_invoke$arity$variadic = (function (args){
+if(((args instanceof cljs.core.IndexedSeq)) && ((args.i === (0)))){
+return cljs.core.PersistentVector.fromArray(args.arr,true);
+} else {
+return cljs.core.vec(args);
+}
+});
+
+cljs.core.vector.cljs$lang$maxFixedArity = (0);
+
+cljs.core.vector.cljs$lang$applyTo = (function (seq10651){
+return cljs.core.vector.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq10651));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ASeq}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IChunkedNext}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IChunkedSeq}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.ChunkedSeq = (function (vec,node,i,off,meta,__hash){
+this.vec = vec;
+this.node = node;
+this.i = i;
+this.off = off;
+this.meta = meta;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32375020;
+this.cljs$lang$protocol_mask$partition1$ = 1536;
+})
+cljs.core.ChunkedSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.ChunkedSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.ChunkedSeq.prototype.indexOf = (function() {
+var G__10677 = null;
+var G__10677__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10677__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10677 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10677__1.call(this,x);
+case 2:
+return G__10677__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10677.cljs$core$IFn$_invoke$arity$1 = G__10677__1;
+G__10677.cljs$core$IFn$_invoke$arity$2 = G__10677__2;
+return G__10677;
+})()
+;
+
+cljs.core.ChunkedSeq.prototype.lastIndexOf = (function() {
+var G__10678 = null;
+var G__10678__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10678__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10678 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10678__1.call(this,x);
+case 2:
+return G__10678__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10678.cljs$core$IFn$_invoke$arity$1 = G__10678__1;
+G__10678.cljs$core$IFn$_invoke$arity$2 = G__10678__2;
+return G__10678;
+})()
+;
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(((self__.off + (1)) < self__.node.length)){
+var s = (function (){var G__10655 = self__.vec;
+var G__10656 = self__.node;
+var G__10657 = self__.i;
+var G__10658 = (self__.off + (1));
+return (cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4 ? cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4(G__10655,G__10656,G__10657,G__10658) : cljs.core.chunked_seq.call(null,G__10655,G__10656,G__10657,G__10658));
+})();
+if((s == null)){
+return null;
+} else {
+return s;
+}
+} else {
+return coll__$1.cljs$core$IChunkedNext$_chunked_next$arity$1(null);
+}
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.PersistentVector.EMPTY,self__.meta);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2((function (){var G__10659 = self__.vec;
+var G__10660 = (self__.i + self__.off);
+var G__10661 = cljs.core.count(self__.vec);
+return (cljs.core.subvec.cljs$core$IFn$_invoke$arity$3 ? cljs.core.subvec.cljs$core$IFn$_invoke$arity$3(G__10659,G__10660,G__10661) : cljs.core.subvec.call(null,G__10659,G__10660,G__10661));
+})(),f);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3((function (){var G__10662 = self__.vec;
+var G__10663 = (self__.i + self__.off);
+var G__10664 = cljs.core.count(self__.vec);
+return (cljs.core.subvec.cljs$core$IFn$_invoke$arity$3 ? cljs.core.subvec.cljs$core$IFn$_invoke$arity$3(G__10662,G__10663,G__10664) : cljs.core.subvec.call(null,G__10662,G__10663,G__10664));
+})(),f,start);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (self__.node[self__.off]);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(((self__.off + (1)) < self__.node.length)){
+var s = (function (){var G__10665 = self__.vec;
+var G__10666 = self__.node;
+var G__10667 = self__.i;
+var G__10668 = (self__.off + (1));
+return (cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4 ? cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4(G__10665,G__10666,G__10667,G__10668) : cljs.core.chunked_seq.call(null,G__10665,G__10666,G__10667,G__10668));
+})();
+if((s == null)){
+return cljs.core.List.EMPTY;
+} else {
+return s;
+}
+} else {
+return coll__$1.cljs$core$IChunkedSeq$_chunked_rest$arity$1(null);
+}
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IChunkedSeq$_chunked_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$2(self__.node,self__.off);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IChunkedSeq$_chunked_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var end = (self__.i + self__.node.length);
+if((end < cljs.core._count(self__.vec))){
+var G__10669 = self__.vec;
+var G__10670 = cljs.core.unchecked_array_for(self__.vec,end);
+var G__10671 = end;
+var G__10672 = (0);
+return (cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4 ? cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4(G__10669,G__10670,G__10671,G__10672) : cljs.core.chunked_seq.call(null,G__10669,G__10670,G__10671,G__10672));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,m){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$5 ? cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$5(self__.vec,self__.node,self__.i,self__.off,m) : cljs.core.chunked_seq.call(null,self__.vec,self__.node,self__.i,self__.off,m));
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IChunkedNext$_chunked_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var end = (self__.i + self__.node.length);
+if((end < cljs.core._count(self__.vec))){
+var G__10673 = self__.vec;
+var G__10674 = cljs.core.unchecked_array_for(self__.vec,end);
+var G__10675 = end;
+var G__10676 = (0);
+return (cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4 ? cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4(G__10673,G__10674,G__10675,G__10676) : cljs.core.chunked_seq.call(null,G__10673,G__10674,G__10675,G__10676));
+} else {
+return null;
+}
+});
+
+cljs.core.ChunkedSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"vec","vec",982683596,null),new cljs.core.Symbol(null,"node","node",-2073234571,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"off","off",-2047994980,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ChunkedSeq.cljs$lang$type = true;
+
+cljs.core.ChunkedSeq.cljs$lang$ctorStr = "cljs.core/ChunkedSeq";
+
+cljs.core.ChunkedSeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ChunkedSeq");
+});
+
+cljs.core.__GT_ChunkedSeq = (function cljs$core$__GT_ChunkedSeq(vec,node,i,off,meta,__hash){
+return (new cljs.core.ChunkedSeq(vec,node,i,off,meta,__hash));
+});
+
+(cljs.core.ChunkedSeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+cljs.core.chunked_seq = (function cljs$core$chunked_seq(var_args){
+var args10679 = [];
+var len__7625__auto___10682 = arguments.length;
+var i__7626__auto___10683 = (0);
+while(true){
+if((i__7626__auto___10683 < len__7625__auto___10682)){
+args10679.push((arguments[i__7626__auto___10683]));
+
+var G__10684 = (i__7626__auto___10683 + (1));
+i__7626__auto___10683 = G__10684;
+continue;
+} else {
+}
+break;
+}
+
+var G__10681 = args10679.length;
+switch (G__10681) {
+case 3:
+return cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10679.length)].join('')));
+
+}
+});
+
+cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$3 = (function (vec,i,off){
+return (new cljs.core.ChunkedSeq(vec,cljs.core.array_for(vec,i),i,off,null,null));
+});
+
+cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4 = (function (vec,node,i,off){
+return (new cljs.core.ChunkedSeq(vec,node,i,off,null,null));
+});
+
+cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$5 = (function (vec,node,i,off,meta){
+return (new cljs.core.ChunkedSeq(vec,node,i,off,meta,null));
+});
+
+cljs.core.chunked_seq.cljs$lang$maxFixedArity = 5;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IVector}
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Subvec = (function (meta,v,start,end,__hash){
+this.meta = meta;
+this.v = v;
+this.start = start;
+this.end = end;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 167666463;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+})
+cljs.core.Subvec.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.Subvec.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Subvec.prototype.indexOf = (function() {
+var G__10706 = null;
+var G__10706__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10706__2 = (function (x,start__$1){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start__$1);
+});
+G__10706 = function(x,start__$1){
+switch(arguments.length){
+case 1:
+return G__10706__1.call(this,x);
+case 2:
+return G__10706__2.call(this,x,start__$1);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10706.cljs$core$IFn$_invoke$arity$1 = G__10706__1;
+G__10706.cljs$core$IFn$_invoke$arity$2 = G__10706__2;
+return G__10706;
+})()
+;
+
+cljs.core.Subvec.prototype.lastIndexOf = (function() {
+var G__10707 = null;
+var G__10707__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10707__2 = (function (x,start__$1){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start__$1);
+});
+G__10707 = function(x,start__$1){
+switch(arguments.length){
+case 1:
+return G__10707__1.call(this,x);
+case 2:
+return G__10707__2.call(this,x,start__$1);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10707.cljs$core$IFn$_invoke$arity$1 = G__10707__1;
+G__10707.cljs$core$IFn$_invoke$arity$2 = G__10707__2;
+return G__10707;
+})()
+;
+
+cljs.core.Subvec.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.Subvec.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(typeof k === 'number'){
+return coll__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+} else {
+return not_found;
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+var i = self__.start;
+var j = (0);
+var init__$1 = init;
+while(true){
+if((i < self__.end)){
+var init__$2 = (function (){var G__10687 = init__$1;
+var G__10688 = j;
+var G__10689 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.v,i);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10687,G__10688,G__10689) : f.call(null,G__10687,G__10688,G__10689));
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$2) : cljs.core.deref.call(null,init__$2));
+} else {
+var G__10708 = (i + (1));
+var G__10709 = (j + (1));
+var G__10710 = init__$2;
+i = G__10708;
+j = G__10709;
+init__$1 = G__10710;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (coll,n){
+var self__ = this;
+var coll__$1 = this;
+if(((n < (0))) || ((self__.end <= (self__.start + n)))){
+return cljs.core.vector_index_out_of_bounds(n,(self__.end - self__.start));
+} else {
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.v,(self__.start + n));
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (coll,n,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(((n < (0))) || ((self__.end <= (self__.start + n)))){
+return not_found;
+} else {
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$3(self__.v,(self__.start + n),not_found);
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IVector$_assoc_n$arity$3 = (function (coll,n,val){
+var self__ = this;
+var coll__$1 = this;
+var v_pos = (self__.start + n);
+if(((n < (0))) || (((self__.end + (1)) <= v_pos))){
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Index "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(n),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" out of bounds [0,"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(coll__$1.cljs$core$ICounted$_count$arity$1(null)),cljs.core.str.cljs$core$IFn$_invoke$arity$1("]")].join('')));
+} else {
+var G__10690 = self__.meta;
+var G__10691 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(self__.v,v_pos,val);
+var G__10692 = self__.start;
+var G__10693 = (function (){var x__6848__auto__ = self__.end;
+var y__6849__auto__ = (v_pos + (1));
+return ((x__6848__auto__ > y__6849__auto__) ? x__6848__auto__ : y__6849__auto__);
+})();
+var G__10694 = null;
+return (cljs.core.build_subvec.cljs$core$IFn$_invoke$arity$5 ? cljs.core.build_subvec.cljs$core$IFn$_invoke$arity$5(G__10690,G__10691,G__10692,G__10693,G__10694) : cljs.core.build_subvec.call(null,G__10690,G__10691,G__10692,G__10693,G__10694));
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Subvec.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.ranged_iterator(self__.v,self__.start,self__.end);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.Subvec.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.Subvec(self__.meta,self__.v,self__.start,self__.end,self__.__hash));
+});
+
+cljs.core.Subvec.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (self__.end - self__.start);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IStack$_peek$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.v,(self__.end - (1)));
+});
+
+cljs.core.Subvec.prototype.cljs$core$IStack$_pop$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.start === self__.end)){
+throw (new Error("Can't pop empty vector"));
+} else {
+var G__10695 = self__.meta;
+var G__10696 = self__.v;
+var G__10697 = self__.start;
+var G__10698 = (self__.end - (1));
+var G__10699 = null;
+return (cljs.core.build_subvec.cljs$core$IFn$_invoke$arity$5 ? cljs.core.build_subvec.cljs$core$IFn$_invoke$arity$5(G__10695,G__10696,G__10697,G__10698,G__10699) : cljs.core.build_subvec.call(null,G__10695,G__10696,G__10697,G__10698,G__10699));
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(!((self__.start === self__.end))){
+return (new cljs.core.RSeq(coll__$1,((self__.end - self__.start) - (1)),null));
+} else {
+return null;
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.PersistentVector.EMPTY,self__.meta);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2(coll__$1,f);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start__$1){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3(coll__$1,f,start__$1);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,key,val){
+var self__ = this;
+var coll__$1 = this;
+if(typeof key === 'number'){
+return coll__$1.cljs$core$IVector$_assoc_n$arity$3(null,key,val);
+} else {
+throw (new Error("Subvec's key for assoc must be a number."));
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var subvec_seq = ((function (coll__$1){
+return (function cljs$core$subvec_seq(i){
+if((i === self__.end)){
+return null;
+} else {
+return cljs.core.cons(cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.v,i),(new cljs.core.LazySeq(null,((function (coll__$1){
+return (function (){
+return cljs$core$subvec_seq((i + (1)));
+});})(coll__$1))
+,null,null)));
+}
+});})(coll__$1))
+;
+return subvec_seq(self__.start);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.build_subvec.cljs$core$IFn$_invoke$arity$5 ? cljs.core.build_subvec.cljs$core$IFn$_invoke$arity$5(meta__$1,self__.v,self__.start,self__.end,self__.__hash) : cljs.core.build_subvec.call(null,meta__$1,self__.v,self__.start,self__.end,self__.__hash));
+});
+
+cljs.core.Subvec.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+var G__10701 = self__.meta;
+var G__10702 = cljs.core._assoc_n(self__.v,self__.end,o);
+var G__10703 = self__.start;
+var G__10704 = (self__.end + (1));
+var G__10705 = null;
+return (cljs.core.build_subvec.cljs$core$IFn$_invoke$arity$5 ? cljs.core.build_subvec.cljs$core$IFn$_invoke$arity$5(G__10701,G__10702,G__10703,G__10704,G__10705) : cljs.core.build_subvec.call(null,G__10701,G__10702,G__10703,G__10704,G__10705));
+});
+
+cljs.core.Subvec.prototype.call = (function() {
+var G__10711 = null;
+var G__10711__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+var G__10711__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+G__10711 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__10711__2.call(this,self__,k);
+case 3:
+return G__10711__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10711.cljs$core$IFn$_invoke$arity$2 = G__10711__2;
+G__10711.cljs$core$IFn$_invoke$arity$3 = G__10711__3;
+return G__10711;
+})()
+;
+
+cljs.core.Subvec.prototype.apply = (function (self__,args10686){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args10686)));
+});
+
+cljs.core.Subvec.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.Subvec.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"v","v",1661996586,null),new cljs.core.Symbol(null,"start","start",1285322546,null),new cljs.core.Symbol(null,"end","end",1372345569,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Subvec.cljs$lang$type = true;
+
+cljs.core.Subvec.cljs$lang$ctorStr = "cljs.core/Subvec";
+
+cljs.core.Subvec.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Subvec");
+});
+
+cljs.core.__GT_Subvec = (function cljs$core$__GT_Subvec(meta,v,start,end,__hash){
+return (new cljs.core.Subvec(meta,v,start,end,__hash));
+});
+
+(cljs.core.Subvec.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+cljs.core.build_subvec = (function cljs$core$build_subvec(meta,v,start,end,__hash){
+while(true){
+if((v instanceof cljs.core.Subvec)){
+var G__10712 = meta;
+var G__10713 = v.v;
+var G__10714 = (v.start + start);
+var G__10715 = (v.start + end);
+var G__10716 = __hash;
+meta = G__10712;
+v = G__10713;
+start = G__10714;
+end = G__10715;
+__hash = G__10716;
+continue;
+} else {
+var c = cljs.core.count(v);
+if(((start < (0))) || ((end < (0))) || ((start > c)) || ((end > c))){
+throw (new Error("Index out of bounds"));
+} else {
+}
+
+return (new cljs.core.Subvec(meta,v,start,end,__hash));
+}
+break;
+}
+});
+/**
+ * Returns a persistent vector of the items in vector from
+ * start (inclusive) to end (exclusive). If end is not supplied,
+ * defaults to (count vector). This operation is O(1) and very fast, as
+ * the resulting vector shares structure with the original and no
+ * trimming is done.
+ */
+cljs.core.subvec = (function cljs$core$subvec(var_args){
+var args10717 = [];
+var len__7625__auto___10720 = arguments.length;
+var i__7626__auto___10721 = (0);
+while(true){
+if((i__7626__auto___10721 < len__7625__auto___10720)){
+args10717.push((arguments[i__7626__auto___10721]));
+
+var G__10722 = (i__7626__auto___10721 + (1));
+i__7626__auto___10721 = G__10722;
+continue;
+} else {
+}
+break;
+}
+
+var G__10719 = args10717.length;
+switch (G__10719) {
+case 2:
+return cljs.core.subvec.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.subvec.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10717.length)].join('')));
+
+}
+});
+
+cljs.core.subvec.cljs$core$IFn$_invoke$arity$2 = (function (v,start){
+return cljs.core.subvec.cljs$core$IFn$_invoke$arity$3(v,start,cljs.core.count(v));
+});
+
+cljs.core.subvec.cljs$core$IFn$_invoke$arity$3 = (function (v,start,end){
+return cljs.core.build_subvec(null,v,start,end,null);
+});
+
+cljs.core.subvec.cljs$lang$maxFixedArity = 3;
+
+cljs.core.tv_ensure_editable = (function cljs$core$tv_ensure_editable(edit,node){
+if((edit === node.edit)){
+return node;
+} else {
+return (new cljs.core.VectorNode(edit,cljs.core.aclone(node.arr)));
+}
+});
+cljs.core.tv_editable_root = (function cljs$core$tv_editable_root(node){
+return (new cljs.core.VectorNode({},cljs.core.aclone(node.arr)));
+});
+cljs.core.tv_editable_tail = (function cljs$core$tv_editable_tail(tl){
+var ret = [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null];
+cljs.core.array_copy(tl,(0),ret,(0),tl.length);
+
+return ret;
+});
+cljs.core.tv_push_tail = (function cljs$core$tv_push_tail(tv,level,parent,tail_node){
+var ret = cljs.core.tv_ensure_editable(tv.root.edit,parent);
+var subidx = (((tv.cnt - (1)) >>> level) & (31));
+cljs.core.pv_aset(ret,subidx,(((level === (5)))?tail_node:(function (){var child = cljs.core.pv_aget(ret,subidx);
+if(!((child == null))){
+var G__10732 = tv;
+var G__10733 = (level - (5));
+var G__10734 = child;
+var G__10735 = tail_node;
+return (cljs.core.tv_push_tail.cljs$core$IFn$_invoke$arity$4 ? cljs.core.tv_push_tail.cljs$core$IFn$_invoke$arity$4(G__10732,G__10733,G__10734,G__10735) : cljs.core.tv_push_tail.call(null,G__10732,G__10733,G__10734,G__10735));
+} else {
+return cljs.core.new_path(tv.root.edit,(level - (5)),tail_node);
+}
+})()));
+
+return ret;
+});
+cljs.core.tv_pop_tail = (function cljs$core$tv_pop_tail(tv,level,node){
+var node__$1 = cljs.core.tv_ensure_editable(tv.root.edit,node);
+var subidx = (((tv.cnt - (2)) >>> level) & (31));
+if((level > (5))){
+var new_child = (function (){var G__10739 = tv;
+var G__10740 = (level - (5));
+var G__10741 = cljs.core.pv_aget(node__$1,subidx);
+return (cljs.core.tv_pop_tail.cljs$core$IFn$_invoke$arity$3 ? cljs.core.tv_pop_tail.cljs$core$IFn$_invoke$arity$3(G__10739,G__10740,G__10741) : cljs.core.tv_pop_tail.call(null,G__10739,G__10740,G__10741));
+})();
+if(((new_child == null)) && ((subidx === (0)))){
+return null;
+} else {
+cljs.core.pv_aset(node__$1,subidx,new_child);
+
+return node__$1;
+}
+} else {
+if((subidx === (0))){
+return null;
+} else {
+cljs.core.pv_aset(node__$1,subidx,null);
+
+return node__$1;
+
+}
+}
+});
+cljs.core.unchecked_editable_array_for = (function cljs$core$unchecked_editable_array_for(tv,i){
+if((i >= cljs.core.tail_off(tv))){
+return tv.tail;
+} else {
+var root = tv.root;
+var node = root;
+var level = tv.shift;
+while(true){
+if((level > (0))){
+var G__10742 = cljs.core.tv_ensure_editable(root.edit,cljs.core.pv_aget(node,((i >>> level) & (31))));
+var G__10743 = (level - (5));
+node = G__10742;
+level = G__10743;
+continue;
+} else {
+return node.arr;
+}
+break;
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ITransientCollection}
+ * @implements {cljs.core.ITransientVector}
+ * @implements {cljs.core.ITransientAssociative}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.TransientVector = (function (cnt,shift,root,tail){
+this.cnt = cnt;
+this.shift = shift;
+this.root = root;
+this.tail = tail;
+this.cljs$lang$protocol_mask$partition1$ = 88;
+this.cljs$lang$protocol_mask$partition0$ = 275;
+})
+cljs.core.TransientVector.prototype.cljs$core$ITransientCollection$_conj_BANG_$arity$2 = (function (tcoll,o){
+var self__ = this;
+var tcoll__$1 = this;
+if(self__.root.edit){
+if(((self__.cnt - cljs.core.tail_off(tcoll__$1)) < (32))){
+(self__.tail[(self__.cnt & (31))] = o);
+
+self__.cnt = (self__.cnt + (1));
+
+return tcoll__$1;
+} else {
+var tail_node = (new cljs.core.VectorNode(self__.root.edit,self__.tail));
+var new_tail = [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null];
+(new_tail[(0)] = o);
+
+self__.tail = new_tail;
+
+if(((self__.cnt >>> (5)) > ((1) << self__.shift))){
+var new_root_array = [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null];
+var new_shift = (self__.shift + (5));
+(new_root_array[(0)] = self__.root);
+
+(new_root_array[(1)] = cljs.core.new_path(self__.root.edit,self__.shift,tail_node));
+
+self__.root = (new cljs.core.VectorNode(self__.root.edit,new_root_array));
+
+self__.shift = new_shift;
+
+self__.cnt = (self__.cnt + (1));
+
+return tcoll__$1;
+} else {
+var new_root = cljs.core.tv_push_tail(tcoll__$1,self__.shift,self__.root,tail_node);
+self__.root = new_root;
+
+self__.cnt = (self__.cnt + (1));
+
+return tcoll__$1;
+}
+}
+} else {
+throw (new Error("conj! after persistent!"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ITransientCollection$_persistent_BANG_$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+if(self__.root.edit){
+self__.root.edit = null;
+
+var len = (self__.cnt - cljs.core.tail_off(tcoll__$1));
+var trimmed_tail = (new Array(len));
+cljs.core.array_copy(self__.tail,(0),trimmed_tail,(0),len);
+
+return (new cljs.core.PersistentVector(null,self__.cnt,self__.shift,self__.root,trimmed_tail,null));
+} else {
+throw (new Error("persistent! called twice"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3 = (function (tcoll,key,val){
+var self__ = this;
+var tcoll__$1 = this;
+if(typeof key === 'number'){
+return tcoll__$1.cljs$core$ITransientVector$_assoc_n_BANG_$arity$3(null,key,val);
+} else {
+throw (new Error("TransientVector's key for assoc! must be a number."));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ITransientVector$_assoc_n_BANG_$arity$3 = (function (tcoll,n,val){
+var self__ = this;
+var tcoll__$1 = this;
+if(self__.root.edit){
+if((((0) <= n)) && ((n < self__.cnt))){
+if((cljs.core.tail_off(tcoll__$1) <= n)){
+(self__.tail[(n & (31))] = val);
+
+return tcoll__$1;
+} else {
+var new_root = ((function (tcoll__$1){
+return (function cljs$core$go(level,node){
+var node__$1 = cljs.core.tv_ensure_editable(self__.root.edit,node);
+if((level === (0))){
+cljs.core.pv_aset(node__$1,(n & (31)),val);
+
+return node__$1;
+} else {
+var subidx = ((n >>> level) & (31));
+cljs.core.pv_aset(node__$1,subidx,cljs$core$go((level - (5)),cljs.core.pv_aget(node__$1,subidx)));
+
+return node__$1;
+}
+});})(tcoll__$1))
+.call(null,self__.shift,self__.root);
+self__.root = new_root;
+
+return tcoll__$1;
+}
+} else {
+if((n === self__.cnt)){
+return tcoll__$1.cljs$core$ITransientCollection$_conj_BANG_$arity$2(null,val);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Index "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(n),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" out of bounds for TransientVector of length"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.cnt)].join('')));
+
+}
+}
+} else {
+throw (new Error("assoc! after persistent!"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ITransientVector$_pop_BANG_$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+if(self__.root.edit){
+if((self__.cnt === (0))){
+throw (new Error("Can't pop empty vector"));
+} else {
+if(((1) === self__.cnt)){
+self__.cnt = (0);
+
+return tcoll__$1;
+} else {
+if((((self__.cnt - (1)) & (31)) > (0))){
+self__.cnt = (self__.cnt - (1));
+
+return tcoll__$1;
+} else {
+var new_tail = cljs.core.unchecked_editable_array_for(tcoll__$1,(self__.cnt - (2)));
+var new_root = (function (){var nr = cljs.core.tv_pop_tail(tcoll__$1,self__.shift,self__.root);
+if(!((nr == null))){
+return nr;
+} else {
+return (new cljs.core.VectorNode(self__.root.edit,[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]));
+}
+})();
+if((((5) < self__.shift)) && ((cljs.core.pv_aget(new_root,(1)) == null))){
+var new_root__$1 = cljs.core.tv_ensure_editable(self__.root.edit,cljs.core.pv_aget(new_root,(0)));
+self__.root = new_root__$1;
+
+self__.shift = (self__.shift - (5));
+
+self__.cnt = (self__.cnt - (1));
+
+self__.tail = new_tail;
+
+return tcoll__$1;
+} else {
+self__.root = new_root;
+
+self__.cnt = (self__.cnt - (1));
+
+self__.tail = new_tail;
+
+return tcoll__$1;
+}
+
+}
+}
+}
+} else {
+throw (new Error("pop! after persistent!"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(self__.root.edit){
+return self__.cnt;
+} else {
+throw (new Error("count after persistent!"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (coll,n){
+var self__ = this;
+var coll__$1 = this;
+if(self__.root.edit){
+return (cljs.core.array_for(coll__$1,n)[(n & (31))]);
+} else {
+throw (new Error("nth after persistent!"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (coll,n,not_found){
+var self__ = this;
+var coll__$1 = this;
+if((((0) <= n)) && ((n < self__.cnt))){
+return coll__$1.cljs$core$IIndexed$_nth$arity$2(null,n);
+} else {
+return not_found;
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(typeof k === 'number'){
+return coll__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+} else {
+return not_found;
+}
+});
+
+cljs.core.TransientVector.prototype.call = (function() {
+var G__10747 = null;
+var G__10747__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__10747__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__10747 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__10747__2.call(this,self__,k);
+case 3:
+return G__10747__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10747.cljs$core$IFn$_invoke$arity$2 = G__10747__2;
+G__10747.cljs$core$IFn$_invoke$arity$3 = G__10747__3;
+return G__10747;
+})()
+;
+
+cljs.core.TransientVector.prototype.apply = (function (self__,args10744){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args10744)));
+});
+
+cljs.core.TransientVector.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.TransientVector.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.TransientVector.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"shift","shift",-1657295705,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"root","root",1191874074,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"tail","tail",494507963,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.TransientVector.cljs$lang$type = true;
+
+cljs.core.TransientVector.cljs$lang$ctorStr = "cljs.core/TransientVector";
+
+cljs.core.TransientVector.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/TransientVector");
+});
+
+cljs.core.__GT_TransientVector = (function cljs$core$__GT_TransientVector(cnt,shift,root,tail){
+return (new cljs.core.TransientVector(cnt,shift,root,tail));
+});
+
+
+/**
+* @constructor
+*/
+cljs.core.PersistentQueueIter = (function (fseq,riter){
+this.fseq = fseq;
+this.riter = riter;
+})
+cljs.core.PersistentQueueIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+var or__6512__auto__ = (!((self__.fseq == null))) && (cljs.core.seq(self__.fseq));
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+var and__6500__auto__ = !((self__.riter == null));
+if(and__6500__auto__){
+return self__.riter.hasNext();
+} else {
+return and__6500__auto__;
+}
+}
+});
+
+cljs.core.PersistentQueueIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if(!((self__.fseq == null))){
+var ret = cljs.core.first(self__.fseq);
+self__.fseq = cljs.core.next(self__.fseq);
+
+return ret;
+} else {
+if((!((self__.riter == null))) && (self__.riter.hasNext())){
+return self__.riter.next();
+} else {
+throw (new Error("No such element"));
+
+}
+}
+});
+
+cljs.core.PersistentQueueIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.PersistentQueueIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"fseq","fseq",-1466412450,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"riter","riter",-237834262,null)], null);
+});
+
+cljs.core.PersistentQueueIter.cljs$lang$type = true;
+
+cljs.core.PersistentQueueIter.cljs$lang$ctorStr = "cljs.core/PersistentQueueIter";
+
+cljs.core.PersistentQueueIter.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentQueueIter");
+});
+
+cljs.core.__GT_PersistentQueueIter = (function cljs$core$__GT_PersistentQueueIter(fseq,riter){
+return (new cljs.core.PersistentQueueIter(fseq,riter));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.PersistentQueueSeq = (function (meta,front,rear,__hash){
+this.meta = meta;
+this.front = front;
+this.rear = rear;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 31850572;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.PersistentQueueSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentQueueSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentQueueSeq.prototype.indexOf = (function() {
+var G__10748 = null;
+var G__10748__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10748__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10748 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10748__1.call(this,x);
+case 2:
+return G__10748__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10748.cljs$core$IFn$_invoke$arity$1 = G__10748__1;
+G__10748.cljs$core$IFn$_invoke$arity$2 = G__10748__2;
+return G__10748;
+})()
+;
+
+cljs.core.PersistentQueueSeq.prototype.lastIndexOf = (function() {
+var G__10749 = null;
+var G__10749__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10749__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10749 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10749__1.call(this,x);
+case 2:
+return G__10749__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10749.cljs$core$IFn$_invoke$arity$1 = G__10749__1;
+G__10749.cljs$core$IFn$_invoke$arity$2 = G__10749__2;
+return G__10749;
+})()
+;
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.first(self__.front);
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var temp__4655__auto__ = cljs.core.next(self__.front);
+if(temp__4655__auto__){
+var f1 = temp__4655__auto__;
+return (new cljs.core.PersistentQueueSeq(self__.meta,f1,self__.rear,null));
+} else {
+if((self__.rear == null)){
+return coll__$1.cljs$core$IEmptyableCollection$_empty$arity$1(null);
+} else {
+return (new cljs.core.PersistentQueueSeq(self__.meta,self__.rear,null,null));
+}
+}
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentQueueSeq(meta__$1,self__.front,self__.rear,self__.__hash));
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.PersistentQueueSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"front","front",117022539,null),new cljs.core.Symbol(null,"rear","rear",-900164830,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentQueueSeq.cljs$lang$type = true;
+
+cljs.core.PersistentQueueSeq.cljs$lang$ctorStr = "cljs.core/PersistentQueueSeq";
+
+cljs.core.PersistentQueueSeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentQueueSeq");
+});
+
+cljs.core.__GT_PersistentQueueSeq = (function cljs$core$__GT_PersistentQueueSeq(meta,front,rear,__hash){
+return (new cljs.core.PersistentQueueSeq(meta,front,rear,__hash));
+});
+
+(cljs.core.PersistentQueueSeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.PersistentQueue = (function (meta,count,front,rear,__hash){
+this.meta = meta;
+this.count = count;
+this.front = front;
+this.rear = rear;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 31858766;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+})
+cljs.core.PersistentQueue.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentQueue.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentQueue.prototype.indexOf = (function() {
+var G__10750 = null;
+var G__10750__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10750__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10750 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10750__1.call(this,x);
+case 2:
+return G__10750__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10750.cljs$core$IFn$_invoke$arity$1 = G__10750__1;
+G__10750.cljs$core$IFn$_invoke$arity$2 = G__10750__2;
+return G__10750;
+})()
+;
+
+cljs.core.PersistentQueue.prototype.lastIndexOf = (function() {
+var G__10751 = null;
+var G__10751__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(self__.count.cljs$core$IFn$_invoke$arity$1 ? self__.count.cljs$core$IFn$_invoke$arity$1(coll) : self__.count.call(null,coll)));
+});
+var G__10751__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10751 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10751__1.call(this,x);
+case 2:
+return G__10751__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10751.cljs$core$IFn$_invoke$arity$1 = G__10751__1;
+G__10751.cljs$core$IFn$_invoke$arity$2 = G__10751__2;
+return G__10751;
+})()
+;
+
+cljs.core.PersistentQueue.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentQueue.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentQueueIter(self__.front,cljs.core._iterator(self__.rear)));
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentQueue(self__.meta,self__.count,self__.front,self__.rear,self__.__hash));
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.count;
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IStack$_peek$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.first(self__.front);
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IStack$_pop$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.truth_(self__.front)){
+var temp__4655__auto__ = cljs.core.next(self__.front);
+if(temp__4655__auto__){
+var f1 = temp__4655__auto__;
+return (new cljs.core.PersistentQueue(self__.meta,(self__.count - (1)),f1,self__.rear,null));
+} else {
+return (new cljs.core.PersistentQueue(self__.meta,(self__.count - (1)),cljs.core.seq(self__.rear),cljs.core.PersistentVector.EMPTY,null));
+}
+} else {
+return coll__$1;
+}
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.PersistentQueue.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.first(self__.front);
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.rest(cljs.core.seq(coll__$1));
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var rear__$1 = cljs.core.seq(self__.rear);
+if(cljs.core.truth_((function (){var or__6512__auto__ = self__.front;
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return rear__$1;
+}
+})())){
+return (new cljs.core.PersistentQueueSeq(null,self__.front,cljs.core.seq(rear__$1),null));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentQueue(meta__$1,self__.count,self__.front,self__.rear,self__.__hash));
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.truth_(self__.front)){
+return (new cljs.core.PersistentQueue(self__.meta,(self__.count + (1)),self__.front,cljs.core.conj.cljs$core$IFn$_invoke$arity$2((function (){var or__6512__auto__ = self__.rear;
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return cljs.core.PersistentVector.EMPTY;
+}
+})(),o),null));
+} else {
+return (new cljs.core.PersistentQueue(self__.meta,(self__.count + (1)),cljs.core.conj.cljs$core$IFn$_invoke$arity$2(self__.front,o),cljs.core.PersistentVector.EMPTY,null));
+}
+});
+
+cljs.core.PersistentQueue.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"count","count",-514511684,null),new cljs.core.Symbol(null,"front","front",117022539,null),new cljs.core.Symbol(null,"rear","rear",-900164830,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentQueue.cljs$lang$type = true;
+
+cljs.core.PersistentQueue.cljs$lang$ctorStr = "cljs.core/PersistentQueue";
+
+cljs.core.PersistentQueue.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentQueue");
+});
+
+cljs.core.__GT_PersistentQueue = (function cljs$core$__GT_PersistentQueue(meta,count,front,rear,__hash){
+return (new cljs.core.PersistentQueue(meta,count,front,rear,__hash));
+});
+
+cljs.core.PersistentQueue.EMPTY = (new cljs.core.PersistentQueue(null,(0),null,cljs.core.PersistentVector.EMPTY,cljs.core.empty_ordered_hash));
+(cljs.core.PersistentQueue.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+*/
+cljs.core.NeverEquiv = (function (){
+this.cljs$lang$protocol_mask$partition0$ = 2097152;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.NeverEquiv.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.NeverEquiv.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (o,other){
+var self__ = this;
+var o__$1 = this;
+return false;
+});
+
+cljs.core.NeverEquiv.getBasis = (function (){
+return cljs.core.PersistentVector.EMPTY;
+});
+
+cljs.core.NeverEquiv.cljs$lang$type = true;
+
+cljs.core.NeverEquiv.cljs$lang$ctorStr = "cljs.core/NeverEquiv";
+
+cljs.core.NeverEquiv.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/NeverEquiv");
+});
+
+cljs.core.__GT_NeverEquiv = (function cljs$core$__GT_NeverEquiv(){
+return (new cljs.core.NeverEquiv());
+});
+
+cljs.core.never_equiv = (new cljs.core.NeverEquiv());
+/**
+ * Assumes y is a map. Returns true if x equals y, otherwise returns
+ * false.
+ */
+cljs.core.equiv_map = (function cljs$core$equiv_map(x,y){
+return cljs.core.boolean$(((cljs.core.map_QMARK_(y))?(((cljs.core.count(x) === cljs.core.count(y)))?cljs.core.every_QMARK_((function (xkv){
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.get.cljs$core$IFn$_invoke$arity$3(y,cljs.core.first(xkv),cljs.core.never_equiv),cljs.core.second(xkv));
+}),x):null):null));
+});
+cljs.core.scan_array = (function cljs$core$scan_array(incr,k,array){
+var len = array.length;
+var i = (0);
+while(true){
+if((i < len)){
+if((k === (array[i]))){
+return i;
+} else {
+var G__10752 = (i + incr);
+i = G__10752;
+continue;
+}
+} else {
+return null;
+}
+break;
+}
+});
+cljs.core.obj_map_compare_keys = (function cljs$core$obj_map_compare_keys(a,b){
+var a__$1 = cljs.core.hash(a);
+var b__$1 = cljs.core.hash(b);
+if((a__$1 < b__$1)){
+return (-1);
+} else {
+if((a__$1 > b__$1)){
+return (1);
+} else {
+return (0);
+
+}
+}
+});
+cljs.core.obj_map__GT_hash_map = (function cljs$core$obj_map__GT_hash_map(m,k,v){
+var ks = m.keys;
+var len = ks.length;
+var so = m.strobj;
+var mm = cljs.core.meta(m);
+var i = (0);
+var out = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+while(true){
+if((i < len)){
+var k__$1 = (ks[i]);
+var G__10753 = (i + (1));
+var G__10754 = cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(out,k__$1,(so[k__$1]));
+i = G__10753;
+out = G__10754;
+continue;
+} else {
+return cljs.core.with_meta(cljs.core.persistent_BANG_(cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(out,k,v)),mm);
+}
+break;
+}
+});
+cljs.core.obj_clone = (function cljs$core$obj_clone(obj,ks){
+var new_obj = {};
+var l = ks.length;
+var i_10759 = (0);
+while(true){
+if((i_10759 < l)){
+var k_10760 = (ks[i_10759]);
+(new_obj[k_10760] = (obj[k_10760]));
+
+var G__10761 = (i_10759 + (1));
+i_10759 = G__10761;
+continue;
+} else {
+}
+break;
+}
+
+return new_obj;
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEditableCollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.IMap}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.ObjMap = (function (meta,keys,strobj,update_count,__hash){
+this.meta = meta;
+this.keys = keys;
+this.strobj = strobj;
+this.update_count = update_count;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 16123663;
+this.cljs$lang$protocol_mask$partition1$ = 4;
+})
+cljs.core.ObjMap.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.ObjMap.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+if((goog.isString(k)) && (!((cljs.core.scan_array((1),k,self__.keys) == null)))){
+return (self__.strobj[k]);
+} else {
+return not_found;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+var len = self__.keys.length;
+var keys__$1 = self__.keys.sort(cljs.core.obj_map_compare_keys);
+var init__$1 = init;
+while(true){
+if(cljs.core.seq(keys__$1)){
+var k = cljs.core.first(keys__$1);
+var init__$2 = (function (){var G__10764 = init__$1;
+var G__10765 = k;
+var G__10766 = (self__.strobj[k]);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10764,G__10765,G__10766) : f.call(null,G__10764,G__10765,G__10766));
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$2) : cljs.core.deref.call(null,init__$2));
+} else {
+var G__10767 = cljs.core.rest(keys__$1);
+var G__10768 = init__$2;
+keys__$1 = G__10767;
+init__$1 = G__10768;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.ObjMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.keys.length;
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_map(coll__$1,other);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IEditableCollection$_as_transient$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.transient$(cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentHashMap.EMPTY,coll__$1));
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.ObjMap.EMPTY,self__.meta);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IMap$_dissoc$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if((goog.isString(k)) && (!((cljs.core.scan_array((1),k,self__.keys) == null)))){
+var new_keys = cljs.core.aclone(self__.keys);
+var new_strobj = cljs.core.obj_clone(self__.strobj,self__.keys);
+new_keys.splice(cljs.core.scan_array((1),k,new_keys),(1));
+
+delete new_strobj[k];
+
+return (new cljs.core.ObjMap(self__.meta,new_keys,new_strobj,(self__.update_count + (1)),null));
+} else {
+return coll__$1;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,k,v){
+var self__ = this;
+var coll__$1 = this;
+if(goog.isString(k)){
+if(((self__.update_count > cljs.core.ObjMap.HASHMAP_THRESHOLD)) || ((self__.keys.length >= cljs.core.ObjMap.HASHMAP_THRESHOLD))){
+return cljs.core.obj_map__GT_hash_map(coll__$1,k,v);
+} else {
+if(!((cljs.core.scan_array((1),k,self__.keys) == null))){
+var new_strobj = cljs.core.obj_clone(self__.strobj,self__.keys);
+(new_strobj[k] = v);
+
+return (new cljs.core.ObjMap(self__.meta,self__.keys,new_strobj,(self__.update_count + (1)),null));
+} else {
+var new_strobj = cljs.core.obj_clone(self__.strobj,self__.keys);
+var new_keys = cljs.core.aclone(self__.keys);
+(new_strobj[k] = v);
+
+new_keys.push(k);
+
+return (new cljs.core.ObjMap(self__.meta,new_keys,new_strobj,(self__.update_count + (1)),null));
+}
+}
+} else {
+return cljs.core.obj_map__GT_hash_map(coll__$1,k,v);
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if((goog.isString(k)) && (!((cljs.core.scan_array((1),k,self__.keys) == null)))){
+return true;
+} else {
+return false;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.keys.length > (0))){
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2(((function (coll__$1){
+return (function (p1__10762_SHARP_){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[p1__10762_SHARP_,(self__.strobj[p1__10762_SHARP_])],null));
+});})(coll__$1))
+,self__.keys.sort(cljs.core.obj_map_compare_keys));
+} else {
+return null;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.ObjMap(meta__$1,self__.keys,self__.strobj,self__.update_count,self__.__hash));
+});
+
+cljs.core.ObjMap.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.vector_QMARK_(entry)){
+return coll__$1.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(1)));
+} else {
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj,coll__$1,entry);
+}
+});
+
+cljs.core.ObjMap.prototype.call = (function() {
+var G__10769 = null;
+var G__10769__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__10769__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__10769 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__10769__2.call(this,self__,k);
+case 3:
+return G__10769__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10769.cljs$core$IFn$_invoke$arity$2 = G__10769__2;
+G__10769.cljs$core$IFn$_invoke$arity$3 = G__10769__3;
+return G__10769;
+})()
+;
+
+cljs.core.ObjMap.prototype.apply = (function (self__,args10763){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args10763)));
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.ObjMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"keys","keys",-1586012071,null),new cljs.core.Symbol(null,"strobj","strobj",1088091283,null),new cljs.core.Symbol(null,"update-count","update-count",-411982269,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ObjMap.cljs$lang$type = true;
+
+cljs.core.ObjMap.cljs$lang$ctorStr = "cljs.core/ObjMap";
+
+cljs.core.ObjMap.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ObjMap");
+});
+
+cljs.core.__GT_ObjMap = (function cljs$core$__GT_ObjMap(meta,keys,strobj,update_count,__hash){
+return (new cljs.core.ObjMap(meta,keys,strobj,update_count,__hash));
+});
+
+cljs.core.ObjMap.EMPTY = (new cljs.core.ObjMap(null,[],{},(0),cljs.core.empty_unordered_hash));
+cljs.core.ObjMap.HASHMAP_THRESHOLD = (8);
+cljs.core.ObjMap.fromObject = (function (ks,obj){
+return (new cljs.core.ObjMap(null,ks,obj,(0),null));
+});
+
+/**
+* @constructor
+*/
+cljs.core.RecordIter = (function (i,record,base_count,fields,ext_map_iter){
+this.i = i;
+this.record = record;
+this.base_count = base_count;
+this.fields = fields;
+this.ext_map_iter = ext_map_iter;
+})
+cljs.core.RecordIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+var or__6512__auto__ = (self__.i < self__.base_count);
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+return self__.ext_map_iter.hasNext();
+}
+});
+
+cljs.core.RecordIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if((self__.i < self__.base_count)){
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$2(self__.fields,self__.i);
+self__.i = (self__.i + (1));
+
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [k,cljs.core._lookup.cljs$core$IFn$_invoke$arity$2(self__.record,k)], null);
+} else {
+return self__.ext_map_iter.next();
+}
+});
+
+cljs.core.RecordIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.RecordIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"record","record",861424668,null),new cljs.core.Symbol(null,"base-count","base-count",-1180647182,null),new cljs.core.Symbol(null,"fields","fields",-291534703,null),new cljs.core.Symbol(null,"ext-map-iter","ext-map-iter",-1215982757,null)], null);
+});
+
+cljs.core.RecordIter.cljs$lang$type = true;
+
+cljs.core.RecordIter.cljs$lang$ctorStr = "cljs.core/RecordIter";
+
+cljs.core.RecordIter.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/RecordIter");
+});
+
+cljs.core.__GT_RecordIter = (function cljs$core$__GT_RecordIter(i,record,base_count,fields,ext_map_iter){
+return (new cljs.core.RecordIter(i,record,base_count,fields,ext_map_iter));
+});
+
+
+/**
+* @constructor
+*/
+cljs.core.ES6EntriesIterator = (function (s){
+this.s = s;
+})
+cljs.core.ES6EntriesIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if(!((self__.s == null))){
+var vec__10772 = cljs.core.first(self__.s);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10772,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10772,(1),null);
+self__.s = cljs.core.next(self__.s);
+
+return ({"value": [k,v], "done": false});
+} else {
+return ({"value": null, "done": true});
+}
+});
+
+cljs.core.ES6EntriesIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"s","s",-948495851,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ES6EntriesIterator.cljs$lang$type = true;
+
+cljs.core.ES6EntriesIterator.cljs$lang$ctorStr = "cljs.core/ES6EntriesIterator";
+
+cljs.core.ES6EntriesIterator.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ES6EntriesIterator");
+});
+
+cljs.core.__GT_ES6EntriesIterator = (function cljs$core$__GT_ES6EntriesIterator(s){
+return (new cljs.core.ES6EntriesIterator(s));
+});
+
+cljs.core.es6_entries_iterator = (function cljs$core$es6_entries_iterator(coll){
+return (new cljs.core.ES6EntriesIterator(cljs.core.seq(coll)));
+});
+
+/**
+* @constructor
+*/
+cljs.core.ES6SetEntriesIterator = (function (s){
+this.s = s;
+})
+cljs.core.ES6SetEntriesIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if(!((self__.s == null))){
+var x = cljs.core.first(self__.s);
+self__.s = cljs.core.next(self__.s);
+
+return ({"value": [x,x], "done": false});
+} else {
+return ({"value": null, "done": true});
+}
+});
+
+cljs.core.ES6SetEntriesIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"s","s",-948495851,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ES6SetEntriesIterator.cljs$lang$type = true;
+
+cljs.core.ES6SetEntriesIterator.cljs$lang$ctorStr = "cljs.core/ES6SetEntriesIterator";
+
+cljs.core.ES6SetEntriesIterator.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ES6SetEntriesIterator");
+});
+
+cljs.core.__GT_ES6SetEntriesIterator = (function cljs$core$__GT_ES6SetEntriesIterator(s){
+return (new cljs.core.ES6SetEntriesIterator(s));
+});
+
+cljs.core.es6_set_entries_iterator = (function cljs$core$es6_set_entries_iterator(coll){
+return (new cljs.core.ES6SetEntriesIterator(cljs.core.seq(coll)));
+});
+cljs.core.array_index_of_nil_QMARK_ = (function cljs$core$array_index_of_nil_QMARK_(arr){
+var len = arr.length;
+var i = (0);
+while(true){
+if((len <= i)){
+return (-1);
+} else {
+if(((arr[i]) == null)){
+return i;
+} else {
+var G__10775 = (i + (2));
+i = G__10775;
+continue;
+
+}
+}
+break;
+}
+});
+cljs.core.array_index_of_keyword_QMARK_ = (function cljs$core$array_index_of_keyword_QMARK_(arr,k){
+var len = arr.length;
+var kstr = k.fqn;
+var i = (0);
+while(true){
+if((len <= i)){
+return (-1);
+} else {
+if((((arr[i]) instanceof cljs.core.Keyword)) && ((kstr === (arr[i]).fqn))){
+return i;
+} else {
+var G__10776 = (i + (2));
+i = G__10776;
+continue;
+
+}
+}
+break;
+}
+});
+cljs.core.array_index_of_symbol_QMARK_ = (function cljs$core$array_index_of_symbol_QMARK_(arr,k){
+var len = arr.length;
+var kstr = k.str;
+var i = (0);
+while(true){
+if((len <= i)){
+return (-1);
+} else {
+if((((arr[i]) instanceof cljs.core.Symbol)) && ((kstr === (arr[i]).str))){
+return i;
+} else {
+var G__10777 = (i + (2));
+i = G__10777;
+continue;
+
+}
+}
+break;
+}
+});
+cljs.core.array_index_of_identical_QMARK_ = (function cljs$core$array_index_of_identical_QMARK_(arr,k){
+var len = arr.length;
+var i = (0);
+while(true){
+if((len <= i)){
+return (-1);
+} else {
+if((k === (arr[i]))){
+return i;
+} else {
+var G__10778 = (i + (2));
+i = G__10778;
+continue;
+
+}
+}
+break;
+}
+});
+cljs.core.array_index_of_equiv_QMARK_ = (function cljs$core$array_index_of_equiv_QMARK_(arr,k){
+var len = arr.length;
+var i = (0);
+while(true){
+if((len <= i)){
+return (-1);
+} else {
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(k,(arr[i]))){
+return i;
+} else {
+var G__10779 = (i + (2));
+i = G__10779;
+continue;
+
+}
+}
+break;
+}
+});
+cljs.core.array_index_of = (function cljs$core$array_index_of(arr,k){
+if((k instanceof cljs.core.Keyword)){
+return cljs.core.array_index_of_keyword_QMARK_(arr,k);
+} else {
+if((goog.isString(k)) || (typeof k === 'number')){
+return cljs.core.array_index_of_identical_QMARK_(arr,k);
+} else {
+if((k instanceof cljs.core.Symbol)){
+return cljs.core.array_index_of_symbol_QMARK_(arr,k);
+} else {
+if((k == null)){
+return cljs.core.array_index_of_nil_QMARK_(arr);
+} else {
+return cljs.core.array_index_of_equiv_QMARK_(arr,k);
+
+}
+}
+}
+}
+});
+cljs.core.array_map_index_of = (function cljs$core$array_map_index_of(m,k){
+return cljs.core.array_index_of(m.arr,k);
+});
+cljs.core.array_extend_kv = (function cljs$core$array_extend_kv(arr,k,v){
+var l = arr.length;
+var narr = (new Array((l + (2))));
+var i_10780 = (0);
+while(true){
+if((i_10780 < l)){
+(narr[i_10780] = (arr[i_10780]));
+
+var G__10781 = (i_10780 + (1));
+i_10780 = G__10781;
+continue;
+} else {
+}
+break;
+}
+
+(narr[l] = k);
+
+(narr[(l + (1))] = v);
+
+return narr;
+});
+cljs.core.array_map_extend_kv = (function cljs$core$array_map_extend_kv(m,k,v){
+return cljs.core.array_extend_kv(m.arr,k,v);
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.PersistentArrayMapSeq = (function (arr,i,_meta){
+this.arr = arr;
+this.i = i;
+this._meta = _meta;
+this.cljs$lang$protocol_mask$partition0$ = 32374990;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.PersistentArrayMapSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.indexOf = (function() {
+var G__10782 = null;
+var G__10782__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10782__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10782 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10782__1.call(this,x);
+case 2:
+return G__10782__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10782.cljs$core$IFn$_invoke$arity$1 = G__10782__1;
+G__10782.cljs$core$IFn$_invoke$arity$2 = G__10782__2;
+return G__10782;
+})()
+;
+
+cljs.core.PersistentArrayMapSeq.prototype.lastIndexOf = (function() {
+var G__10783 = null;
+var G__10783__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10783__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10783 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10783__1.call(this,x);
+case 2:
+return G__10783__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10783.cljs$core$IFn$_invoke$arity$1 = G__10783__1;
+G__10783.cljs$core$IFn$_invoke$arity$2 = G__10783__2;
+return G__10783;
+})()
+;
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__._meta;
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.i < (self__.arr.length - (2)))){
+return (new cljs.core.PersistentArrayMapSeq(self__.arr,(self__.i + (2)),self__._meta));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return ((self__.arr.length - self__.i) / (2));
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.hash_ordered_coll(coll__$1);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__._meta);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(self__.arr[self__.i]),(self__.arr[(self__.i + (1))])], null);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.i < (self__.arr.length - (2)))){
+return (new cljs.core.PersistentArrayMapSeq(self__.arr,(self__.i + (2)),self__._meta));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,new_meta){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentArrayMapSeq(self__.arr,self__.i,new_meta));
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.PersistentArrayMapSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"_meta","_meta",-1716892533,null)], null);
+});
+
+cljs.core.PersistentArrayMapSeq.cljs$lang$type = true;
+
+cljs.core.PersistentArrayMapSeq.cljs$lang$ctorStr = "cljs.core/PersistentArrayMapSeq";
+
+cljs.core.PersistentArrayMapSeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentArrayMapSeq");
+});
+
+cljs.core.__GT_PersistentArrayMapSeq = (function cljs$core$__GT_PersistentArrayMapSeq(arr,i,_meta){
+return (new cljs.core.PersistentArrayMapSeq(arr,i,_meta));
+});
+
+(cljs.core.PersistentArrayMapSeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+cljs.core.persistent_array_map_seq = (function cljs$core$persistent_array_map_seq(arr,i,_meta){
+if((i <= (arr.length - (2)))){
+return (new cljs.core.PersistentArrayMapSeq(arr,i,_meta));
+} else {
+return null;
+}
+});
+
+
+/**
+* @constructor
+*/
+cljs.core.PersistentArrayMapIterator = (function (arr,i,cnt){
+this.arr = arr;
+this.i = i;
+this.cnt = cnt;
+})
+cljs.core.PersistentArrayMapIterator.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return (self__.i < self__.cnt);
+});
+
+cljs.core.PersistentArrayMapIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var ret = new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(self__.arr[self__.i]),(self__.arr[(self__.i + (1))])], null);
+self__.i = (self__.i + (2));
+
+return ret;
+});
+
+cljs.core.PersistentArrayMapIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null)], null);
+});
+
+cljs.core.PersistentArrayMapIterator.cljs$lang$type = true;
+
+cljs.core.PersistentArrayMapIterator.cljs$lang$ctorStr = "cljs.core/PersistentArrayMapIterator";
+
+cljs.core.PersistentArrayMapIterator.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentArrayMapIterator");
+});
+
+cljs.core.__GT_PersistentArrayMapIterator = (function cljs$core$__GT_PersistentArrayMapIterator(arr,i,cnt){
+return (new cljs.core.PersistentArrayMapIterator(arr,i,cnt));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEditableCollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.IMap}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.PersistentArrayMap = (function (meta,cnt,arr,__hash){
+this.meta = meta;
+this.cnt = cnt;
+this.arr = arr;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 16647951;
+this.cljs$lang$protocol_mask$partition1$ = 8196;
+})
+cljs.core.PersistentArrayMap.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentArrayMap.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentArrayMap.prototype.keys = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator((cljs.core.keys.cljs$core$IFn$_invoke$arity$1 ? cljs.core.keys.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.keys.call(null,coll)));
+});
+
+cljs.core.PersistentArrayMap.prototype.entries = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_entries_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentArrayMap.prototype.values = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator((cljs.core.vals.cljs$core$IFn$_invoke$arity$1 ? cljs.core.vals.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.vals.call(null,coll)));
+});
+
+cljs.core.PersistentArrayMap.prototype.has = (function (k){
+var self__ = this;
+var coll = this;
+return cljs.core.contains_QMARK_(coll,k);
+});
+
+cljs.core.PersistentArrayMap.prototype.get = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentArrayMap.prototype.forEach = (function (f){
+var self__ = this;
+var coll = this;
+var seq__10785 = cljs.core.seq(coll);
+var chunk__10786 = null;
+var count__10787 = (0);
+var i__10788 = (0);
+while(true){
+if((i__10788 < count__10787)){
+var vec__10789 = chunk__10786.cljs$core$IIndexed$_nth$arity$2(null,i__10788);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10789,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10789,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+var G__10802 = seq__10785;
+var G__10803 = chunk__10786;
+var G__10804 = count__10787;
+var G__10805 = (i__10788 + (1));
+seq__10785 = G__10802;
+chunk__10786 = G__10803;
+count__10787 = G__10804;
+i__10788 = G__10805;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__10785);
+if(temp__4657__auto__){
+var seq__10785__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__10785__$1)){
+var c__7331__auto__ = cljs.core.chunk_first(seq__10785__$1);
+var G__10806 = cljs.core.chunk_rest(seq__10785__$1);
+var G__10807 = c__7331__auto__;
+var G__10808 = cljs.core.count(c__7331__auto__);
+var G__10809 = (0);
+seq__10785 = G__10806;
+chunk__10786 = G__10807;
+count__10787 = G__10808;
+i__10788 = G__10809;
+continue;
+} else {
+var vec__10792 = cljs.core.first(seq__10785__$1);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10792,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10792,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+var G__10810 = cljs.core.next(seq__10785__$1);
+var G__10811 = null;
+var G__10812 = (0);
+var G__10813 = (0);
+seq__10785 = G__10810;
+chunk__10786 = G__10811;
+count__10787 = G__10812;
+i__10788 = G__10813;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+var idx = cljs.core.array_map_index_of(coll__$1,k);
+if((idx === (-1))){
+return not_found;
+} else {
+return (self__.arr[(idx + (1))]);
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+var len = self__.arr.length;
+var i = (0);
+var init__$1 = init;
+while(true){
+if((i < len)){
+var init__$2 = (function (){var G__10795 = init__$1;
+var G__10796 = (self__.arr[i]);
+var G__10797 = (self__.arr[(i + (1))]);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10795,G__10796,G__10797) : f.call(null,G__10795,G__10796,G__10797));
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$2) : cljs.core.deref.call(null,init__$2));
+} else {
+var G__10814 = (i + (2));
+var G__10815 = init__$2;
+i = G__10814;
+init__$1 = G__10815;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return (new cljs.core.PersistentArrayMapIterator(self__.arr,(0),(self__.cnt * (2))));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentArrayMap(self__.meta,self__.cnt,self__.arr,self__.__hash));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.cnt;
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+if(((!((other == null)))?((((other.cljs$lang$protocol_mask$partition0$ & (1024))) || ((cljs.core.PROTOCOL_SENTINEL === other.cljs$core$IMap$)))?true:false):false)){
+var alen = self__.arr.length;
+var other__$1 = other;
+if((self__.cnt === other__$1.cljs$core$ICounted$_count$arity$1(null))){
+var i = (0);
+while(true){
+if((i < alen)){
+var v = other__$1.cljs$core$ILookup$_lookup$arity$3(null,(self__.arr[i]),cljs.core.lookup_sentinel);
+if(!((v === cljs.core.lookup_sentinel))){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2((self__.arr[(i + (1))]),v)){
+var G__10816 = (i + (2));
+i = G__10816;
+continue;
+} else {
+return false;
+}
+} else {
+return false;
+}
+} else {
+return true;
+}
+break;
+}
+} else {
+return false;
+}
+} else {
+return cljs.core.equiv_map(coll__$1,other);
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IEditableCollection$_as_transient$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.TransientArrayMap({},self__.arr.length,cljs.core.aclone(self__.arr)));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.PersistentArrayMap.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IMap$_dissoc$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+var idx = cljs.core.array_map_index_of(coll__$1,k);
+if((idx >= (0))){
+var len = self__.arr.length;
+var new_len = (len - (2));
+if((new_len === (0))){
+return coll__$1.cljs$core$IEmptyableCollection$_empty$arity$1(null);
+} else {
+var new_arr = (new Array(new_len));
+var s = (0);
+var d = (0);
+while(true){
+if((s >= len)){
+return (new cljs.core.PersistentArrayMap(self__.meta,(self__.cnt - (1)),new_arr,null));
+} else {
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(k,(self__.arr[s]))){
+var G__10817 = (s + (2));
+var G__10818 = d;
+s = G__10817;
+d = G__10818;
+continue;
+} else {
+(new_arr[d] = (self__.arr[s]));
+
+(new_arr[(d + (1))] = (self__.arr[(s + (1))]));
+
+var G__10819 = (s + (2));
+var G__10820 = (d + (2));
+s = G__10819;
+d = G__10820;
+continue;
+
+}
+}
+break;
+}
+}
+} else {
+return coll__$1;
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,k,v){
+var self__ = this;
+var coll__$1 = this;
+var idx = cljs.core.array_map_index_of(coll__$1,k);
+if((idx === (-1))){
+if((self__.cnt < cljs.core.PersistentArrayMap.HASHMAP_THRESHOLD)){
+var arr__$1 = cljs.core.array_map_extend_kv(coll__$1,k,v);
+return (new cljs.core.PersistentArrayMap(self__.meta,(self__.cnt + (1)),arr__$1,null));
+} else {
+return cljs.core._with_meta(cljs.core._assoc(cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentHashMap.EMPTY,coll__$1),k,v),self__.meta);
+}
+} else {
+if((v === (self__.arr[(idx + (1))]))){
+return coll__$1;
+} else {
+var arr__$1 = (function (){var G__10801 = cljs.core.aclone(self__.arr);
+(G__10801[(idx + (1))] = v);
+
+return G__10801;
+})();
+return (new cljs.core.PersistentArrayMap(self__.meta,self__.cnt,arr__$1,null));
+
+}
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return !((cljs.core.array_map_index_of(coll__$1,k) === (-1)));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.persistent_array_map_seq(self__.arr,(0),null);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentArrayMap(meta__$1,self__.cnt,self__.arr,self__.__hash));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.vector_QMARK_(entry)){
+return coll__$1.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(1)));
+} else {
+var ret = coll__$1;
+var es = cljs.core.seq(entry);
+while(true){
+if((es == null)){
+return ret;
+} else {
+var e = cljs.core.first(es);
+if(cljs.core.vector_QMARK_(e)){
+var G__10821 = ret.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(1)));
+var G__10822 = cljs.core.next(es);
+ret = G__10821;
+es = G__10822;
+continue;
+} else {
+throw (new Error("conj on a map takes map entries or seqables of map entries"));
+}
+}
+break;
+}
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.call = (function() {
+var G__10823 = null;
+var G__10823__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__10823__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__10823 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__10823__2.call(this,self__,k);
+case 3:
+return G__10823__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10823.cljs$core$IFn$_invoke$arity$2 = G__10823__2;
+G__10823.cljs$core$IFn$_invoke$arity$3 = G__10823__3;
+return G__10823;
+})()
+;
+
+cljs.core.PersistentArrayMap.prototype.apply = (function (self__,args10784){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args10784)));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentArrayMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentArrayMap.cljs$lang$type = true;
+
+cljs.core.PersistentArrayMap.cljs$lang$ctorStr = "cljs.core/PersistentArrayMap";
+
+cljs.core.PersistentArrayMap.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentArrayMap");
+});
+
+cljs.core.__GT_PersistentArrayMap = (function cljs$core$__GT_PersistentArrayMap(meta,cnt,arr,__hash){
+return (new cljs.core.PersistentArrayMap(meta,cnt,arr,__hash));
+});
+
+cljs.core.PersistentArrayMap.EMPTY = (new cljs.core.PersistentArrayMap(null,(0),[],cljs.core.empty_unordered_hash));
+cljs.core.PersistentArrayMap.HASHMAP_THRESHOLD = (8);
+cljs.core.PersistentArrayMap.fromArray = (function (arr,no_clone,no_check){
+var arr__$1 = ((no_clone)?arr:cljs.core.aclone(arr));
+var arr__$2 = ((no_check)?arr__$1:(function (){var ret = [];
+var i_10824 = (0);
+while(true){
+if((i_10824 < arr__$1.length)){
+var k_10825 = (arr__$1[i_10824]);
+var v_10826 = (arr__$1[(i_10824 + (1))]);
+var idx_10827 = cljs.core.array_index_of(ret,k_10825);
+if((idx_10827 === (-1))){
+ret.push(k_10825);
+
+ret.push(v_10826);
+} else {
+}
+
+var G__10828 = (i_10824 + (2));
+i_10824 = G__10828;
+continue;
+} else {
+}
+break;
+}
+
+return ret;
+})());
+var cnt = (arr__$2.length / (2));
+return (new cljs.core.PersistentArrayMap(null,cnt,arr__$2,null));
+});
+cljs.core.PersistentArrayMap.createWithCheck = (function (arr){
+var ret = [];
+var i_10830 = (0);
+while(true){
+if((i_10830 < arr.length)){
+var k_10831 = (arr[i_10830]);
+var v_10832 = (arr[(i_10830 + (1))]);
+var idx_10833 = cljs.core.array_index_of(ret,k_10831);
+if((idx_10833 === (-1))){
+var G__10829_10834 = ret;
+G__10829_10834.push(k_10831);
+
+G__10829_10834.push(v_10832);
+
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Duplicate key: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(k_10831)].join('')));
+}
+
+var G__10835 = (i_10830 + (2));
+i_10830 = G__10835;
+continue;
+} else {
+}
+break;
+}
+
+var cnt = (arr.length / (2));
+return (new cljs.core.PersistentArrayMap(null,cnt,arr,null));
+});
+cljs.core.PersistentArrayMap.createAsIfByAssoc = (function (arr){
+var ret = [];
+var i_10837 = (0);
+while(true){
+if((i_10837 < arr.length)){
+var k_10838 = (arr[i_10837]);
+var v_10839 = (arr[(i_10837 + (1))]);
+var idx_10840 = cljs.core.array_index_of(ret,k_10838);
+if((idx_10840 === (-1))){
+var G__10836_10841 = ret;
+G__10836_10841.push(k_10838);
+
+G__10836_10841.push(v_10839);
+
+} else {
+(ret[(idx_10840 + (1))] = v_10839);
+}
+
+var G__10842 = (i_10837 + (2));
+i_10837 = G__10842;
+continue;
+} else {
+}
+break;
+}
+
+return (new cljs.core.PersistentArrayMap(null,(ret.length / (2)),ret,null));
+});
+(cljs.core.PersistentArrayMap.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+
+/**
+* @constructor
+ * @implements {cljs.core.ITransientMap}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ITransientCollection}
+ * @implements {cljs.core.ITransientAssociative}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.TransientArrayMap = (function (editable_QMARK_,len,arr){
+this.editable_QMARK_ = editable_QMARK_;
+this.len = len;
+this.arr = arr;
+this.cljs$lang$protocol_mask$partition0$ = 258;
+this.cljs$lang$protocol_mask$partition1$ = 56;
+})
+cljs.core.TransientArrayMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+return cljs.core.quot(self__.len,(2));
+} else {
+throw (new Error("count after persistent!"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (tcoll,k){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (tcoll,k,not_found){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+var idx = cljs.core.array_map_index_of(tcoll__$1,k);
+if((idx === (-1))){
+return not_found;
+} else {
+return (self__.arr[(idx + (1))]);
+}
+} else {
+throw (new Error("lookup after persistent!"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ITransientCollection$_conj_BANG_$arity$2 = (function (tcoll,o){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+if(((!((o == null)))?((((o.cljs$lang$protocol_mask$partition0$ & (2048))) || ((cljs.core.PROTOCOL_SENTINEL === o.cljs$core$IMapEntry$)))?true:(((!o.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.IMapEntry,o):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IMapEntry,o))){
+return tcoll__$1.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3(null,(cljs.core.key.cljs$core$IFn$_invoke$arity$1 ? cljs.core.key.cljs$core$IFn$_invoke$arity$1(o) : cljs.core.key.call(null,o)),(cljs.core.val.cljs$core$IFn$_invoke$arity$1 ? cljs.core.val.cljs$core$IFn$_invoke$arity$1(o) : cljs.core.val.call(null,o)));
+} else {
+var es = cljs.core.seq(o);
+var tcoll__$2 = tcoll__$1;
+while(true){
+var temp__4655__auto__ = cljs.core.first(es);
+if(cljs.core.truth_(temp__4655__auto__)){
+var e = temp__4655__auto__;
+var G__10845 = cljs.core.next(es);
+var G__10846 = tcoll__$2.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3(null,(cljs.core.key.cljs$core$IFn$_invoke$arity$1 ? cljs.core.key.cljs$core$IFn$_invoke$arity$1(e) : cljs.core.key.call(null,e)),(cljs.core.val.cljs$core$IFn$_invoke$arity$1 ? cljs.core.val.cljs$core$IFn$_invoke$arity$1(e) : cljs.core.val.call(null,e)));
+es = G__10845;
+tcoll__$2 = G__10846;
+continue;
+} else {
+return tcoll__$2;
+}
+break;
+}
+}
+} else {
+throw (new Error("conj! after persistent!"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ITransientCollection$_persistent_BANG_$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+self__.editable_QMARK_ = false;
+
+return (new cljs.core.PersistentArrayMap(null,cljs.core.quot(self__.len,(2)),self__.arr,null));
+} else {
+throw (new Error("persistent! called twice"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3 = (function (tcoll,key,val){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+var idx = cljs.core.array_map_index_of(tcoll__$1,key);
+if((idx === (-1))){
+if(((self__.len + (2)) <= ((2) * cljs.core.PersistentArrayMap.HASHMAP_THRESHOLD))){
+self__.len = (self__.len + (2));
+
+self__.arr.push(key);
+
+self__.arr.push(val);
+
+return tcoll__$1;
+} else {
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3((cljs.core.array__GT_transient_hash_map.cljs$core$IFn$_invoke$arity$2 ? cljs.core.array__GT_transient_hash_map.cljs$core$IFn$_invoke$arity$2(self__.len,self__.arr) : cljs.core.array__GT_transient_hash_map.call(null,self__.len,self__.arr)),key,val);
+}
+} else {
+if((val === (self__.arr[(idx + (1))]))){
+return tcoll__$1;
+} else {
+(self__.arr[(idx + (1))] = val);
+
+return tcoll__$1;
+}
+}
+} else {
+throw (new Error("assoc! after persistent!"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ITransientMap$_dissoc_BANG_$arity$2 = (function (tcoll,key){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+var idx = cljs.core.array_map_index_of(tcoll__$1,key);
+if((idx >= (0))){
+(self__.arr[idx] = (self__.arr[(self__.len - (2))]));
+
+(self__.arr[(idx + (1))] = (self__.arr[(self__.len - (1))]));
+
+var G__10844_10847 = self__.arr;
+G__10844_10847.pop();
+
+G__10844_10847.pop();
+
+
+self__.len = (self__.len - (2));
+} else {
+}
+
+return tcoll__$1;
+} else {
+throw (new Error("dissoc! after persistent!"));
+}
+});
+
+cljs.core.TransientArrayMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"editable?","editable?",-164945806,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"len","len",-1230778691,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"arr","arr",2115492975,null)], null);
+});
+
+cljs.core.TransientArrayMap.cljs$lang$type = true;
+
+cljs.core.TransientArrayMap.cljs$lang$ctorStr = "cljs.core/TransientArrayMap";
+
+cljs.core.TransientArrayMap.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/TransientArrayMap");
+});
+
+cljs.core.__GT_TransientArrayMap = (function cljs$core$__GT_TransientArrayMap(editable_QMARK_,len,arr){
+return (new cljs.core.TransientArrayMap(editable_QMARK_,len,arr));
+});
+
+
+cljs.core.array__GT_transient_hash_map = (function cljs$core$array__GT_transient_hash_map(len,arr){
+var out = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+var i = (0);
+while(true){
+if((i < len)){
+var G__10848 = cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(out,(arr[i]),(arr[(i + (1))]));
+var G__10849 = (i + (2));
+out = G__10848;
+i = G__10849;
+continue;
+} else {
+return out;
+}
+break;
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.Box = (function (val){
+this.val = val;
+})
+
+cljs.core.Box.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"val","val",1769233139,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Box.cljs$lang$type = true;
+
+cljs.core.Box.cljs$lang$ctorStr = "cljs.core/Box";
+
+cljs.core.Box.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Box");
+});
+
+cljs.core.__GT_Box = (function cljs$core$__GT_Box(val){
+return (new cljs.core.Box(val));
+});
+
+
+
+
+
+
+cljs.core.key_test = (function cljs$core$key_test(key,other){
+if((key === other)){
+return true;
+} else {
+if(cljs.core.keyword_identical_QMARK_(key,other)){
+return true;
+} else {
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(key,other);
+
+}
+}
+});
+cljs.core.mask = (function cljs$core$mask(hash,shift){
+return ((hash >>> shift) & (31));
+});
+cljs.core.clone_and_set = (function cljs$core$clone_and_set(var_args){
+var args10850 = [];
+var len__7625__auto___10855 = arguments.length;
+var i__7626__auto___10856 = (0);
+while(true){
+if((i__7626__auto___10856 < len__7625__auto___10855)){
+args10850.push((arguments[i__7626__auto___10856]));
+
+var G__10857 = (i__7626__auto___10856 + (1));
+i__7626__auto___10856 = G__10857;
+continue;
+} else {
+}
+break;
+}
+
+var G__10852 = args10850.length;
+switch (G__10852) {
+case 3:
+return cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 5:
+return cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10850.length)].join('')));
+
+}
+});
+
+cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3 = (function (arr,i,a){
+var G__10853 = cljs.core.aclone(arr);
+(G__10853[i] = a);
+
+return G__10853;
+});
+
+cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$5 = (function (arr,i,a,j,b){
+var G__10854 = cljs.core.aclone(arr);
+(G__10854[i] = a);
+
+(G__10854[j] = b);
+
+return G__10854;
+});
+
+cljs.core.clone_and_set.cljs$lang$maxFixedArity = 5;
+
+cljs.core.remove_pair = (function cljs$core$remove_pair(arr,i){
+var new_arr = (new Array((arr.length - (2))));
+cljs.core.array_copy(arr,(0),new_arr,(0),((2) * i));
+
+cljs.core.array_copy(arr,((2) * (i + (1))),new_arr,((2) * i),(new_arr.length - ((2) * i)));
+
+return new_arr;
+});
+cljs.core.bitmap_indexed_node_index = (function cljs$core$bitmap_indexed_node_index(bitmap,bit){
+return cljs.core.bit_count((bitmap & (bit - (1))));
+});
+cljs.core.bitpos = (function cljs$core$bitpos(hash,shift){
+return ((1) << ((hash >>> shift) & 0x01f));
+});
+cljs.core.edit_and_set = (function cljs$core$edit_and_set(var_args){
+var args10859 = [];
+var len__7625__auto___10862 = arguments.length;
+var i__7626__auto___10863 = (0);
+while(true){
+if((i__7626__auto___10863 < len__7625__auto___10862)){
+args10859.push((arguments[i__7626__auto___10863]));
+
+var G__10864 = (i__7626__auto___10863 + (1));
+i__7626__auto___10863 = G__10864;
+continue;
+} else {
+}
+break;
+}
+
+var G__10861 = args10859.length;
+switch (G__10861) {
+case 4:
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 6:
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10859.length)].join('')));
+
+}
+});
+
+cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4 = (function (inode,edit,i,a){
+var editable = inode.ensure_editable(edit);
+(editable.arr[i] = a);
+
+return editable;
+});
+
+cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$6 = (function (inode,edit,i,a,j,b){
+var editable = inode.ensure_editable(edit);
+(editable.arr[i] = a);
+
+(editable.arr[j] = b);
+
+return editable;
+});
+
+cljs.core.edit_and_set.cljs$lang$maxFixedArity = 6;
+
+cljs.core.inode_kv_reduce = (function cljs$core$inode_kv_reduce(arr,f,init){
+var len = arr.length;
+var i = (0);
+var init__$1 = init;
+while(true){
+if((i < len)){
+var init__$2 = (function (){var k = (arr[i]);
+if(!((k == null))){
+var G__10869 = init__$1;
+var G__10870 = k;
+var G__10871 = (arr[(i + (1))]);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10869,G__10870,G__10871) : f.call(null,G__10869,G__10870,G__10871));
+} else {
+var node = (arr[(i + (1))]);
+if(!((node == null))){
+return node.kv_reduce(f,init__$1);
+} else {
+return init__$1;
+}
+}
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$2) : cljs.core.deref.call(null,init__$2));
+} else {
+var G__10872 = (i + (2));
+var G__10873 = init__$2;
+i = G__10872;
+init__$1 = G__10873;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.NodeIterator = (function (arr,i,next_entry,next_iter){
+this.arr = arr;
+this.i = i;
+this.next_entry = next_entry;
+this.next_iter = next_iter;
+})
+cljs.core.NodeIterator.prototype.advance = (function (){
+var self__ = this;
+var this$ = this;
+var len = self__.arr.length;
+while(true){
+if((self__.i < len)){
+var key = (self__.arr[self__.i]);
+var node_or_val = (self__.arr[(self__.i + (1))]);
+var found = ((!((key == null)))?self__.next_entry = new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [key,node_or_val], null):((!((node_or_val == null)))?(function (){var new_iter = cljs.core._iterator(node_or_val);
+if(new_iter.hasNext()){
+return self__.next_iter = new_iter;
+} else {
+return false;
+}
+})():false
+));
+self__.i = (self__.i + (2));
+
+if(found){
+return true;
+} else {
+continue;
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+cljs.core.NodeIterator.prototype.hasNext = (function (){
+var self__ = this;
+var this$ = this;
+var or__6512__auto__ = !((self__.next_entry == null));
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+var or__6512__auto____$1 = !((self__.next_iter == null));
+if(or__6512__auto____$1){
+return or__6512__auto____$1;
+} else {
+return this$.advance();
+}
+}
+});
+
+cljs.core.NodeIterator.prototype.next = (function (){
+var self__ = this;
+var this$ = this;
+if(!((self__.next_entry == null))){
+var ret = self__.next_entry;
+self__.next_entry = null;
+
+return ret;
+} else {
+if(!((self__.next_iter == null))){
+var ret = self__.next_iter.next();
+if(self__.next_iter.hasNext()){
+} else {
+self__.next_iter = null;
+}
+
+return ret;
+} else {
+if(this$.advance()){
+return this$.next();
+} else {
+throw (new Error("No such element"));
+
+}
+}
+}
+});
+
+cljs.core.NodeIterator.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.NodeIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"next-entry","next-entry",1091342476,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"next-iter","next-iter",1526626239,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.NodeIterator.cljs$lang$type = true;
+
+cljs.core.NodeIterator.cljs$lang$ctorStr = "cljs.core/NodeIterator";
+
+cljs.core.NodeIterator.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/NodeIterator");
+});
+
+cljs.core.__GT_NodeIterator = (function cljs$core$__GT_NodeIterator(arr,i,next_entry,next_iter){
+return (new cljs.core.NodeIterator(arr,i,next_entry,next_iter));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIterable}
+*/
+cljs.core.BitmapIndexedNode = (function (edit,bitmap,arr){
+this.edit = edit;
+this.bitmap = bitmap;
+this.arr = arr;
+})
+cljs.core.BitmapIndexedNode.prototype.ensure_editable = (function (e){
+var self__ = this;
+var inode = this;
+if((e === self__.edit)){
+return inode;
+} else {
+var n = cljs.core.bit_count(self__.bitmap);
+var new_arr = (new Array((((n < (0)))?(4):((2) * (n + (1))))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),((2) * n));
+
+return (new cljs.core.BitmapIndexedNode(e,self__.bitmap,new_arr));
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_without_BANG_ = (function (edit__$1,shift,hash,key,removed_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+if(((self__.bitmap & bit) === (0))){
+return inode;
+} else {
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+var n = val_or_node.inode_without_BANG_(edit__$1,(shift + (5)),hash,key,removed_leaf_QMARK_);
+if((n === val_or_node)){
+return inode;
+} else {
+if(!((n == null))){
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,(((2) * idx) + (1)),n);
+} else {
+if((self__.bitmap === bit)){
+return null;
+} else {
+return inode.edit_and_remove_pair(edit__$1,bit,idx);
+
+}
+}
+}
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+(removed_leaf_QMARK_[(0)] = true);
+
+return inode.edit_and_remove_pair(edit__$1,bit,idx);
+} else {
+return inode;
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.edit_and_remove_pair = (function (e,bit,i){
+var self__ = this;
+var inode = this;
+if((self__.bitmap === bit)){
+return null;
+} else {
+var editable = inode.ensure_editable(e);
+var earr = editable.arr;
+var len = earr.length;
+editable.bitmap = (bit ^ editable.bitmap);
+
+cljs.core.array_copy(earr,((2) * (i + (1))),earr,((2) * i),(len - ((2) * (i + (1)))));
+
+(earr[(len - (2))] = null);
+
+(earr[(len - (1))] = null);
+
+return editable;
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_seq = (function (){
+var self__ = this;
+var inode = this;
+return (cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1 ? cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1(self__.arr) : cljs.core.create_inode_seq.call(null,self__.arr));
+});
+
+cljs.core.BitmapIndexedNode.prototype.kv_reduce = (function (f,init){
+var self__ = this;
+var inode = this;
+return cljs.core.inode_kv_reduce(self__.arr,f,init);
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_lookup = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+if(((self__.bitmap & bit) === (0))){
+return not_found;
+} else {
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+return val_or_node.inode_lookup((shift + (5)),hash,key,not_found);
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+return val_or_node;
+} else {
+return not_found;
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_assoc_BANG_ = (function (edit__$1,shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+if(((self__.bitmap & bit) === (0))){
+var n = cljs.core.bit_count(self__.bitmap);
+if((((2) * n) < self__.arr.length)){
+var editable = inode.ensure_editable(edit__$1);
+var earr = editable.arr;
+added_leaf_QMARK_.val = true;
+
+cljs.core.array_copy_downward(earr,((2) * idx),earr,((2) * (idx + (1))),((2) * (n - idx)));
+
+(earr[((2) * idx)] = key);
+
+(earr[(((2) * idx) + (1))] = val);
+
+editable.bitmap = (editable.bitmap | bit);
+
+return editable;
+} else {
+if((n >= (16))){
+var nodes = [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null];
+var jdx = ((hash >>> shift) & 0x01f);
+(nodes[jdx] = cljs.core.BitmapIndexedNode.EMPTY.inode_assoc_BANG_(edit__$1,(shift + (5)),hash,key,val,added_leaf_QMARK_));
+
+var i_10887 = (0);
+var j_10888 = (0);
+while(true){
+if((i_10887 < (32))){
+if((((self__.bitmap >>> i_10887) & (1)) === (0))){
+var G__10889 = (i_10887 + (1));
+var G__10890 = j_10888;
+i_10887 = G__10889;
+j_10888 = G__10890;
+continue;
+} else {
+(nodes[i_10887] = ((!(((self__.arr[j_10888]) == null)))?cljs.core.BitmapIndexedNode.EMPTY.inode_assoc_BANG_(edit__$1,(shift + (5)),cljs.core.hash((self__.arr[j_10888])),(self__.arr[j_10888]),(self__.arr[(j_10888 + (1))]),added_leaf_QMARK_):(self__.arr[(j_10888 + (1))])));
+
+var G__10891 = (i_10887 + (1));
+var G__10892 = (j_10888 + (2));
+i_10887 = G__10891;
+j_10888 = G__10892;
+continue;
+}
+} else {
+}
+break;
+}
+
+return (new cljs.core.ArrayNode(edit__$1,(n + (1)),nodes));
+} else {
+var new_arr = (new Array(((2) * (n + (4)))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),((2) * idx));
+
+(new_arr[((2) * idx)] = key);
+
+(new_arr[(((2) * idx) + (1))] = val);
+
+cljs.core.array_copy(self__.arr,((2) * idx),new_arr,((2) * (idx + (1))),((2) * (n - idx)));
+
+added_leaf_QMARK_.val = true;
+
+var editable = inode.ensure_editable(edit__$1);
+editable.arr = new_arr;
+
+editable.bitmap = (editable.bitmap | bit);
+
+return editable;
+
+}
+}
+} else {
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+var n = val_or_node.inode_assoc_BANG_(edit__$1,(shift + (5)),hash,key,val,added_leaf_QMARK_);
+if((n === val_or_node)){
+return inode;
+} else {
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,(((2) * idx) + (1)),n);
+}
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+if((val === val_or_node)){
+return inode;
+} else {
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,(((2) * idx) + (1)),val);
+}
+} else {
+added_leaf_QMARK_.val = true;
+
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$6(inode,edit__$1,((2) * idx),null,(((2) * idx) + (1)),(function (){var G__10874 = edit__$1;
+var G__10875 = (shift + (5));
+var G__10876 = key_or_nil;
+var G__10877 = val_or_node;
+var G__10878 = hash;
+var G__10879 = key;
+var G__10880 = val;
+return (cljs.core.create_node.cljs$core$IFn$_invoke$arity$7 ? cljs.core.create_node.cljs$core$IFn$_invoke$arity$7(G__10874,G__10875,G__10876,G__10877,G__10878,G__10879,G__10880) : cljs.core.create_node.call(null,G__10874,G__10875,G__10876,G__10877,G__10878,G__10879,G__10880));
+})());
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_assoc = (function (shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+if(((self__.bitmap & bit) === (0))){
+var n = cljs.core.bit_count(self__.bitmap);
+if((n >= (16))){
+var nodes = [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null];
+var jdx = ((hash >>> shift) & 0x01f);
+(nodes[jdx] = cljs.core.BitmapIndexedNode.EMPTY.inode_assoc((shift + (5)),hash,key,val,added_leaf_QMARK_));
+
+var i_10893 = (0);
+var j_10894 = (0);
+while(true){
+if((i_10893 < (32))){
+if((((self__.bitmap >>> i_10893) & (1)) === (0))){
+var G__10895 = (i_10893 + (1));
+var G__10896 = j_10894;
+i_10893 = G__10895;
+j_10894 = G__10896;
+continue;
+} else {
+(nodes[i_10893] = ((!(((self__.arr[j_10894]) == null)))?cljs.core.BitmapIndexedNode.EMPTY.inode_assoc((shift + (5)),cljs.core.hash((self__.arr[j_10894])),(self__.arr[j_10894]),(self__.arr[(j_10894 + (1))]),added_leaf_QMARK_):(self__.arr[(j_10894 + (1))])));
+
+var G__10897 = (i_10893 + (1));
+var G__10898 = (j_10894 + (2));
+i_10893 = G__10897;
+j_10894 = G__10898;
+continue;
+}
+} else {
+}
+break;
+}
+
+return (new cljs.core.ArrayNode(null,(n + (1)),nodes));
+} else {
+var new_arr = (new Array(((2) * (n + (1)))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),((2) * idx));
+
+(new_arr[((2) * idx)] = key);
+
+(new_arr[(((2) * idx) + (1))] = val);
+
+cljs.core.array_copy(self__.arr,((2) * idx),new_arr,((2) * (idx + (1))),((2) * (n - idx)));
+
+added_leaf_QMARK_.val = true;
+
+return (new cljs.core.BitmapIndexedNode(null,(self__.bitmap | bit),new_arr));
+}
+} else {
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+var n = val_or_node.inode_assoc((shift + (5)),hash,key,val,added_leaf_QMARK_);
+if((n === val_or_node)){
+return inode;
+} else {
+return (new cljs.core.BitmapIndexedNode(null,self__.bitmap,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,(((2) * idx) + (1)),n)));
+}
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+if((val === val_or_node)){
+return inode;
+} else {
+return (new cljs.core.BitmapIndexedNode(null,self__.bitmap,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,(((2) * idx) + (1)),val)));
+}
+} else {
+added_leaf_QMARK_.val = true;
+
+return (new cljs.core.BitmapIndexedNode(null,self__.bitmap,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$5(self__.arr,((2) * idx),null,(((2) * idx) + (1)),(function (){var G__10881 = (shift + (5));
+var G__10882 = key_or_nil;
+var G__10883 = val_or_node;
+var G__10884 = hash;
+var G__10885 = key;
+var G__10886 = val;
+return (cljs.core.create_node.cljs$core$IFn$_invoke$arity$6 ? cljs.core.create_node.cljs$core$IFn$_invoke$arity$6(G__10881,G__10882,G__10883,G__10884,G__10885,G__10886) : cljs.core.create_node.call(null,G__10881,G__10882,G__10883,G__10884,G__10885,G__10886));
+})())));
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_find = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+if(((self__.bitmap & bit) === (0))){
+return not_found;
+} else {
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+return val_or_node.inode_find((shift + (5)),hash,key,not_found);
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [key_or_nil,val_or_node], null);
+} else {
+return not_found;
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_without = (function (shift,hash,key){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+if(((self__.bitmap & bit) === (0))){
+return inode;
+} else {
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+var n = val_or_node.inode_without((shift + (5)),hash,key);
+if((n === val_or_node)){
+return inode;
+} else {
+if(!((n == null))){
+return (new cljs.core.BitmapIndexedNode(null,self__.bitmap,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,(((2) * idx) + (1)),n)));
+} else {
+if((self__.bitmap === bit)){
+return null;
+} else {
+return (new cljs.core.BitmapIndexedNode(null,(self__.bitmap ^ bit),cljs.core.remove_pair(self__.arr,idx)));
+
+}
+}
+}
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+return (new cljs.core.BitmapIndexedNode(null,(self__.bitmap ^ bit),cljs.core.remove_pair(self__.arr,idx)));
+} else {
+return inode;
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.BitmapIndexedNode.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.NodeIterator(self__.arr,(0),null,null));
+});
+
+cljs.core.BitmapIndexedNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"edit","edit",-1302639,null),cljs.core.with_meta(new cljs.core.Symbol(null,"bitmap","bitmap",501334601,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.BitmapIndexedNode.cljs$lang$type = true;
+
+cljs.core.BitmapIndexedNode.cljs$lang$ctorStr = "cljs.core/BitmapIndexedNode";
+
+cljs.core.BitmapIndexedNode.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/BitmapIndexedNode");
+});
+
+cljs.core.__GT_BitmapIndexedNode = (function cljs$core$__GT_BitmapIndexedNode(edit,bitmap,arr){
+return (new cljs.core.BitmapIndexedNode(edit,bitmap,arr));
+});
+
+cljs.core.BitmapIndexedNode.EMPTY = (new cljs.core.BitmapIndexedNode(null,(0),[]));
+cljs.core.pack_array_node = (function cljs$core$pack_array_node(array_node,edit,idx){
+var arr = array_node.arr;
+var len = arr.length;
+var new_arr = (new Array(((2) * (array_node.cnt - (1)))));
+var i = (0);
+var j = (1);
+var bitmap = (0);
+while(true){
+if((i < len)){
+if((!((i === idx))) && (!(((arr[i]) == null)))){
+(new_arr[j] = (arr[i]));
+
+var G__10899 = (i + (1));
+var G__10900 = (j + (2));
+var G__10901 = (bitmap | ((1) << i));
+i = G__10899;
+j = G__10900;
+bitmap = G__10901;
+continue;
+} else {
+var G__10902 = (i + (1));
+var G__10903 = j;
+var G__10904 = bitmap;
+i = G__10902;
+j = G__10903;
+bitmap = G__10904;
+continue;
+}
+} else {
+return (new cljs.core.BitmapIndexedNode(edit,bitmap,new_arr));
+}
+break;
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.ArrayNodeIterator = (function (arr,i,next_iter){
+this.arr = arr;
+this.i = i;
+this.next_iter = next_iter;
+})
+cljs.core.ArrayNodeIterator.prototype.hasNext = (function (){
+var self__ = this;
+var this$ = this;
+var len = self__.arr.length;
+while(true){
+if(!((!((self__.next_iter == null))) && (self__.next_iter.hasNext()))){
+if((self__.i < len)){
+var node = (self__.arr[self__.i]);
+self__.i = (self__.i + (1));
+
+if(!((node == null))){
+self__.next_iter = cljs.core._iterator(node);
+} else {
+}
+
+continue;
+} else {
+return false;
+}
+} else {
+return true;
+}
+break;
+}
+});
+
+cljs.core.ArrayNodeIterator.prototype.next = (function (){
+var self__ = this;
+var this$ = this;
+if(this$.hasNext()){
+return self__.next_iter.next();
+} else {
+throw (new Error("No such element"));
+}
+});
+
+cljs.core.ArrayNodeIterator.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.ArrayNodeIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"next-iter","next-iter",1526626239,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ArrayNodeIterator.cljs$lang$type = true;
+
+cljs.core.ArrayNodeIterator.cljs$lang$ctorStr = "cljs.core/ArrayNodeIterator";
+
+cljs.core.ArrayNodeIterator.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ArrayNodeIterator");
+});
+
+cljs.core.__GT_ArrayNodeIterator = (function cljs$core$__GT_ArrayNodeIterator(arr,i,next_iter){
+return (new cljs.core.ArrayNodeIterator(arr,i,next_iter));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIterable}
+*/
+cljs.core.ArrayNode = (function (edit,cnt,arr){
+this.edit = edit;
+this.cnt = cnt;
+this.arr = arr;
+})
+cljs.core.ArrayNode.prototype.ensure_editable = (function (e){
+var self__ = this;
+var inode = this;
+if((e === self__.edit)){
+return inode;
+} else {
+return (new cljs.core.ArrayNode(e,self__.cnt,cljs.core.aclone(self__.arr)));
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_without_BANG_ = (function (edit__$1,shift,hash,key,removed_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if((node == null)){
+return inode;
+} else {
+var n = node.inode_without_BANG_(edit__$1,(shift + (5)),hash,key,removed_leaf_QMARK_);
+if((n === node)){
+return inode;
+} else {
+if((n == null)){
+if((self__.cnt <= (8))){
+return cljs.core.pack_array_node(inode,edit__$1,idx);
+} else {
+var editable = cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,idx,n);
+editable.cnt = (editable.cnt - (1));
+
+return editable;
+}
+} else {
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,idx,n);
+
+}
+}
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_seq = (function (){
+var self__ = this;
+var inode = this;
+return (cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$1 ? cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$1(self__.arr) : cljs.core.create_array_node_seq.call(null,self__.arr));
+});
+
+cljs.core.ArrayNode.prototype.kv_reduce = (function (f,init){
+var self__ = this;
+var inode = this;
+var len = self__.arr.length;
+var i = (0);
+var init__$1 = init;
+while(true){
+if((i < len)){
+var node = (self__.arr[i]);
+if(!((node == null))){
+var init__$2 = node.kv_reduce(f,init__$1);
+if(cljs.core.reduced_QMARK_(init__$2)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$2) : cljs.core.deref.call(null,init__$2));
+} else {
+var G__10905 = (i + (1));
+var G__10906 = init__$2;
+i = G__10905;
+init__$1 = G__10906;
+continue;
+}
+} else {
+var G__10907 = (i + (1));
+var G__10908 = init__$1;
+i = G__10907;
+init__$1 = G__10908;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_lookup = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if(!((node == null))){
+return node.inode_lookup((shift + (5)),hash,key,not_found);
+} else {
+return not_found;
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_assoc_BANG_ = (function (edit__$1,shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if((node == null)){
+var editable = cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,idx,cljs.core.BitmapIndexedNode.EMPTY.inode_assoc_BANG_(edit__$1,(shift + (5)),hash,key,val,added_leaf_QMARK_));
+editable.cnt = (editable.cnt + (1));
+
+return editable;
+} else {
+var n = node.inode_assoc_BANG_(edit__$1,(shift + (5)),hash,key,val,added_leaf_QMARK_);
+if((n === node)){
+return inode;
+} else {
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,idx,n);
+}
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_assoc = (function (shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if((node == null)){
+return (new cljs.core.ArrayNode(null,(self__.cnt + (1)),cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,idx,cljs.core.BitmapIndexedNode.EMPTY.inode_assoc((shift + (5)),hash,key,val,added_leaf_QMARK_))));
+} else {
+var n = node.inode_assoc((shift + (5)),hash,key,val,added_leaf_QMARK_);
+if((n === node)){
+return inode;
+} else {
+return (new cljs.core.ArrayNode(null,self__.cnt,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,idx,n)));
+}
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_find = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if(!((node == null))){
+return node.inode_find((shift + (5)),hash,key,not_found);
+} else {
+return not_found;
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_without = (function (shift,hash,key){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if(!((node == null))){
+var n = node.inode_without((shift + (5)),hash,key);
+if((n === node)){
+return inode;
+} else {
+if((n == null)){
+if((self__.cnt <= (8))){
+return cljs.core.pack_array_node(inode,null,idx);
+} else {
+return (new cljs.core.ArrayNode(null,(self__.cnt - (1)),cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,idx,n)));
+}
+} else {
+return (new cljs.core.ArrayNode(null,self__.cnt,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,idx,n)));
+
+}
+}
+} else {
+return inode;
+}
+});
+
+cljs.core.ArrayNode.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ArrayNode.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.ArrayNodeIterator(self__.arr,(0),null));
+});
+
+cljs.core.ArrayNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"edit","edit",-1302639,null),cljs.core.with_meta(new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ArrayNode.cljs$lang$type = true;
+
+cljs.core.ArrayNode.cljs$lang$ctorStr = "cljs.core/ArrayNode";
+
+cljs.core.ArrayNode.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ArrayNode");
+});
+
+cljs.core.__GT_ArrayNode = (function cljs$core$__GT_ArrayNode(edit,cnt,arr){
+return (new cljs.core.ArrayNode(edit,cnt,arr));
+});
+
+cljs.core.hash_collision_node_find_index = (function cljs$core$hash_collision_node_find_index(arr,cnt,key){
+var lim = ((2) * cnt);
+var i = (0);
+while(true){
+if((i < lim)){
+if(cljs.core.key_test(key,(arr[i]))){
+return i;
+} else {
+var G__10909 = (i + (2));
+i = G__10909;
+continue;
+}
+} else {
+return (-1);
+}
+break;
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IIterable}
+*/
+cljs.core.HashCollisionNode = (function (edit,collision_hash,cnt,arr){
+this.edit = edit;
+this.collision_hash = collision_hash;
+this.cnt = cnt;
+this.arr = arr;
+})
+cljs.core.HashCollisionNode.prototype.ensure_editable = (function (e){
+var self__ = this;
+var inode = this;
+if((e === self__.edit)){
+return inode;
+} else {
+var new_arr = (new Array(((2) * (self__.cnt + (1)))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),((2) * self__.cnt));
+
+return (new cljs.core.HashCollisionNode(e,self__.collision_hash,self__.cnt,new_arr));
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_without_BANG_ = (function (edit__$1,shift,hash,key,removed_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx === (-1))){
+return inode;
+} else {
+(removed_leaf_QMARK_[(0)] = true);
+
+if((self__.cnt === (1))){
+return null;
+} else {
+var editable = inode.ensure_editable(edit__$1);
+var earr = editable.arr;
+(earr[idx] = (earr[(((2) * self__.cnt) - (2))]));
+
+(earr[(idx + (1))] = (earr[(((2) * self__.cnt) - (1))]));
+
+(earr[(((2) * self__.cnt) - (1))] = null);
+
+(earr[(((2) * self__.cnt) - (2))] = null);
+
+editable.cnt = (editable.cnt - (1));
+
+return editable;
+}
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_seq = (function (){
+var self__ = this;
+var inode = this;
+return (cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1 ? cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1(self__.arr) : cljs.core.create_inode_seq.call(null,self__.arr));
+});
+
+cljs.core.HashCollisionNode.prototype.kv_reduce = (function (f,init){
+var self__ = this;
+var inode = this;
+return cljs.core.inode_kv_reduce(self__.arr,f,init);
+});
+
+cljs.core.HashCollisionNode.prototype.inode_lookup = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx < (0))){
+return not_found;
+} else {
+if(cljs.core.key_test(key,(self__.arr[idx]))){
+return (self__.arr[(idx + (1))]);
+} else {
+return not_found;
+
+}
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_assoc_BANG_ = (function (edit__$1,shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+if((hash === self__.collision_hash)){
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx === (-1))){
+if((self__.arr.length > ((2) * self__.cnt))){
+var editable = cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$6(inode,edit__$1,((2) * self__.cnt),key,(((2) * self__.cnt) + (1)),val);
+added_leaf_QMARK_.val = true;
+
+editable.cnt = (editable.cnt + (1));
+
+return editable;
+} else {
+var len = self__.arr.length;
+var new_arr = (new Array((len + (2))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),len);
+
+(new_arr[len] = key);
+
+(new_arr[(len + (1))] = val);
+
+added_leaf_QMARK_.val = true;
+
+return inode.ensure_editable_array(edit__$1,(self__.cnt + (1)),new_arr);
+}
+} else {
+if(((self__.arr[(idx + (1))]) === val)){
+return inode;
+} else {
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,(idx + (1)),val);
+}
+}
+} else {
+return (new cljs.core.BitmapIndexedNode(edit__$1,(1 << ((self__.collision_hash >>> shift) & 0x01f)),[null,inode,null,null])).inode_assoc_BANG_(edit__$1,shift,hash,key,val,added_leaf_QMARK_);
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_assoc = (function (shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+if((hash === self__.collision_hash)){
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx === (-1))){
+var len = ((2) * self__.cnt);
+var new_arr = (new Array((len + (2))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),len);
+
+(new_arr[len] = key);
+
+(new_arr[(len + (1))] = val);
+
+added_leaf_QMARK_.val = true;
+
+return (new cljs.core.HashCollisionNode(null,self__.collision_hash,(self__.cnt + (1)),new_arr));
+} else {
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2((self__.arr[(idx + (1))]),val)){
+return inode;
+} else {
+return (new cljs.core.HashCollisionNode(null,self__.collision_hash,self__.cnt,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,(idx + (1)),val)));
+}
+}
+} else {
+return (new cljs.core.BitmapIndexedNode(null,(1 << ((self__.collision_hash >>> shift) & 0x01f)),[null,inode])).inode_assoc(shift,hash,key,val,added_leaf_QMARK_);
+}
+});
+
+cljs.core.HashCollisionNode.prototype.ensure_editable_array = (function (e,count,array){
+var self__ = this;
+var inode = this;
+if((e === self__.edit)){
+self__.arr = array;
+
+self__.cnt = count;
+
+return inode;
+} else {
+return (new cljs.core.HashCollisionNode(self__.edit,self__.collision_hash,count,array));
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_find = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx < (0))){
+return not_found;
+} else {
+if(cljs.core.key_test(key,(self__.arr[idx]))){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(self__.arr[idx]),(self__.arr[(idx + (1))])], null);
+} else {
+return not_found;
+
+}
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_without = (function (shift,hash,key){
+var self__ = this;
+var inode = this;
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx === (-1))){
+return inode;
+} else {
+if((self__.cnt === (1))){
+return null;
+} else {
+return (new cljs.core.HashCollisionNode(null,self__.collision_hash,(self__.cnt - (1)),cljs.core.remove_pair(self__.arr,cljs.core.quot(idx,(2)))));
+
+}
+}
+});
+
+cljs.core.HashCollisionNode.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.HashCollisionNode.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.NodeIterator(self__.arr,(0),null,null));
+});
+
+cljs.core.HashCollisionNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"edit","edit",-1302639,null),cljs.core.with_meta(new cljs.core.Symbol(null,"collision-hash","collision-hash",-35831342,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.HashCollisionNode.cljs$lang$type = true;
+
+cljs.core.HashCollisionNode.cljs$lang$ctorStr = "cljs.core/HashCollisionNode";
+
+cljs.core.HashCollisionNode.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/HashCollisionNode");
+});
+
+cljs.core.__GT_HashCollisionNode = (function cljs$core$__GT_HashCollisionNode(edit,collision_hash,cnt,arr){
+return (new cljs.core.HashCollisionNode(edit,collision_hash,cnt,arr));
+});
+
+cljs.core.create_node = (function cljs$core$create_node(var_args){
+var args10910 = [];
+var len__7625__auto___10913 = arguments.length;
+var i__7626__auto___10914 = (0);
+while(true){
+if((i__7626__auto___10914 < len__7625__auto___10913)){
+args10910.push((arguments[i__7626__auto___10914]));
+
+var G__10915 = (i__7626__auto___10914 + (1));
+i__7626__auto___10914 = G__10915;
+continue;
+} else {
+}
+break;
+}
+
+var G__10912 = args10910.length;
+switch (G__10912) {
+case 6:
+return cljs.core.create_node.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+case 7:
+return cljs.core.create_node.cljs$core$IFn$_invoke$arity$7((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10910.length)].join('')));
+
+}
+});
+
+cljs.core.create_node.cljs$core$IFn$_invoke$arity$6 = (function (shift,key1,val1,key2hash,key2,val2){
+var key1hash = cljs.core.hash(key1);
+if((key1hash === key2hash)){
+return (new cljs.core.HashCollisionNode(null,key1hash,(2),[key1,val1,key2,val2]));
+} else {
+var added_leaf_QMARK_ = (new cljs.core.Box(false));
+return cljs.core.BitmapIndexedNode.EMPTY.inode_assoc(shift,key1hash,key1,val1,added_leaf_QMARK_).inode_assoc(shift,key2hash,key2,val2,added_leaf_QMARK_);
+}
+});
+
+cljs.core.create_node.cljs$core$IFn$_invoke$arity$7 = (function (edit,shift,key1,val1,key2hash,key2,val2){
+var key1hash = cljs.core.hash(key1);
+if((key1hash === key2hash)){
+return (new cljs.core.HashCollisionNode(null,key1hash,(2),[key1,val1,key2,val2]));
+} else {
+var added_leaf_QMARK_ = (new cljs.core.Box(false));
+return cljs.core.BitmapIndexedNode.EMPTY.inode_assoc_BANG_(edit,shift,key1hash,key1,val1,added_leaf_QMARK_).inode_assoc_BANG_(edit,shift,key2hash,key2,val2,added_leaf_QMARK_);
+}
+});
+
+cljs.core.create_node.cljs$lang$maxFixedArity = 7;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.NodeSeq = (function (meta,nodes,i,s,__hash){
+this.meta = meta;
+this.nodes = nodes;
+this.i = i;
+this.s = s;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32374860;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.NodeSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.NodeSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.NodeSeq.prototype.indexOf = (function() {
+var G__10923 = null;
+var G__10923__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10923__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10923 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10923__1.call(this,x);
+case 2:
+return G__10923__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10923.cljs$core$IFn$_invoke$arity$1 = G__10923__1;
+G__10923.cljs$core$IFn$_invoke$arity$2 = G__10923__2;
+return G__10923;
+})()
+;
+
+cljs.core.NodeSeq.prototype.lastIndexOf = (function() {
+var G__10924 = null;
+var G__10924__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10924__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10924 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10924__1.call(this,x);
+case 2:
+return G__10924__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10924.cljs$core$IFn$_invoke$arity$1 = G__10924__1;
+G__10924.cljs$core$IFn$_invoke$arity$2 = G__10924__2;
+return G__10924;
+})()
+;
+
+cljs.core.NodeSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.s == null)){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(self__.nodes[self__.i]),(self__.nodes[(self__.i + (1))])], null);
+} else {
+return cljs.core.first(self__.s);
+}
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var ret = (((self__.s == null))?(function (){var G__10917 = self__.nodes;
+var G__10918 = (self__.i + (2));
+var G__10919 = null;
+return (cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3 ? cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3(G__10917,G__10918,G__10919) : cljs.core.create_inode_seq.call(null,G__10917,G__10918,G__10919));
+})():(function (){var G__10920 = self__.nodes;
+var G__10921 = self__.i;
+var G__10922 = cljs.core.next(self__.s);
+return (cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3 ? cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3(G__10920,G__10921,G__10922) : cljs.core.create_inode_seq.call(null,G__10920,G__10921,G__10922));
+})());
+if(!((ret == null))){
+return ret;
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1;
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.NodeSeq(meta__$1,self__.nodes,self__.i,self__.s,self__.__hash));
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.NodeSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"nodes","nodes",-459054278,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"s","s",-948495851,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.NodeSeq.cljs$lang$type = true;
+
+cljs.core.NodeSeq.cljs$lang$ctorStr = "cljs.core/NodeSeq";
+
+cljs.core.NodeSeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/NodeSeq");
+});
+
+cljs.core.__GT_NodeSeq = (function cljs$core$__GT_NodeSeq(meta,nodes,i,s,__hash){
+return (new cljs.core.NodeSeq(meta,nodes,i,s,__hash));
+});
+
+(cljs.core.NodeSeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+cljs.core.create_inode_seq = (function cljs$core$create_inode_seq(var_args){
+var args10925 = [];
+var len__7625__auto___10928 = arguments.length;
+var i__7626__auto___10929 = (0);
+while(true){
+if((i__7626__auto___10929 < len__7625__auto___10928)){
+args10925.push((arguments[i__7626__auto___10929]));
+
+var G__10930 = (i__7626__auto___10929 + (1));
+i__7626__auto___10929 = G__10930;
+continue;
+} else {
+}
+break;
+}
+
+var G__10927 = args10925.length;
+switch (G__10927) {
+case 1:
+return cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10925.length)].join('')));
+
+}
+});
+
+cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1 = (function (nodes){
+return cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3(nodes,(0),null);
+});
+
+cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3 = (function (nodes,i,s){
+if((s == null)){
+var len = nodes.length;
+var j = i;
+while(true){
+if((j < len)){
+if(!(((nodes[j]) == null))){
+return (new cljs.core.NodeSeq(null,nodes,j,null,null));
+} else {
+var temp__4655__auto__ = (nodes[(j + (1))]);
+if(cljs.core.truth_(temp__4655__auto__)){
+var node = temp__4655__auto__;
+var temp__4655__auto____$1 = node.inode_seq();
+if(cljs.core.truth_(temp__4655__auto____$1)){
+var node_seq = temp__4655__auto____$1;
+return (new cljs.core.NodeSeq(null,nodes,(j + (2)),node_seq,null));
+} else {
+var G__10932 = (j + (2));
+j = G__10932;
+continue;
+}
+} else {
+var G__10933 = (j + (2));
+j = G__10933;
+continue;
+}
+}
+} else {
+return null;
+}
+break;
+}
+} else {
+return (new cljs.core.NodeSeq(null,nodes,i,s,null));
+}
+});
+
+cljs.core.create_inode_seq.cljs$lang$maxFixedArity = 3;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.ArrayNodeSeq = (function (meta,nodes,i,s,__hash){
+this.meta = meta;
+this.nodes = nodes;
+this.i = i;
+this.s = s;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32374860;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.ArrayNodeSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.ArrayNodeSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.ArrayNodeSeq.prototype.indexOf = (function() {
+var G__10938 = null;
+var G__10938__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10938__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10938 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10938__1.call(this,x);
+case 2:
+return G__10938__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10938.cljs$core$IFn$_invoke$arity$1 = G__10938__1;
+G__10938.cljs$core$IFn$_invoke$arity$2 = G__10938__2;
+return G__10938;
+})()
+;
+
+cljs.core.ArrayNodeSeq.prototype.lastIndexOf = (function() {
+var G__10939 = null;
+var G__10939__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10939__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10939 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10939__1.call(this,x);
+case 2:
+return G__10939__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10939.cljs$core$IFn$_invoke$arity$1 = G__10939__1;
+G__10939.cljs$core$IFn$_invoke$arity$2 = G__10939__2;
+return G__10939;
+})()
+;
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.first(self__.s);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var ret = (function (){var G__10934 = null;
+var G__10935 = self__.nodes;
+var G__10936 = self__.i;
+var G__10937 = cljs.core.next(self__.s);
+return (cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4 ? cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4(G__10934,G__10935,G__10936,G__10937) : cljs.core.create_array_node_seq.call(null,G__10934,G__10935,G__10936,G__10937));
+})();
+if(!((ret == null))){
+return ret;
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1;
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.ArrayNodeSeq(meta__$1,self__.nodes,self__.i,self__.s,self__.__hash));
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.ArrayNodeSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"nodes","nodes",-459054278,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"s","s",-948495851,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ArrayNodeSeq.cljs$lang$type = true;
+
+cljs.core.ArrayNodeSeq.cljs$lang$ctorStr = "cljs.core/ArrayNodeSeq";
+
+cljs.core.ArrayNodeSeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ArrayNodeSeq");
+});
+
+cljs.core.__GT_ArrayNodeSeq = (function cljs$core$__GT_ArrayNodeSeq(meta,nodes,i,s,__hash){
+return (new cljs.core.ArrayNodeSeq(meta,nodes,i,s,__hash));
+});
+
+(cljs.core.ArrayNodeSeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+cljs.core.create_array_node_seq = (function cljs$core$create_array_node_seq(var_args){
+var args10940 = [];
+var len__7625__auto___10943 = arguments.length;
+var i__7626__auto___10944 = (0);
+while(true){
+if((i__7626__auto___10944 < len__7625__auto___10943)){
+args10940.push((arguments[i__7626__auto___10944]));
+
+var G__10945 = (i__7626__auto___10944 + (1));
+i__7626__auto___10944 = G__10945;
+continue;
+} else {
+}
+break;
+}
+
+var G__10942 = args10940.length;
+switch (G__10942) {
+case 1:
+return cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 4:
+return cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args10940.length)].join('')));
+
+}
+});
+
+cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$1 = (function (nodes){
+return cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4(null,nodes,(0),null);
+});
+
+cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4 = (function (meta,nodes,i,s){
+if((s == null)){
+var len = nodes.length;
+var j = i;
+while(true){
+if((j < len)){
+var temp__4655__auto__ = (nodes[j]);
+if(cljs.core.truth_(temp__4655__auto__)){
+var nj = temp__4655__auto__;
+var temp__4655__auto____$1 = nj.inode_seq();
+if(cljs.core.truth_(temp__4655__auto____$1)){
+var ns = temp__4655__auto____$1;
+return (new cljs.core.ArrayNodeSeq(meta,nodes,(j + (1)),ns,null));
+} else {
+var G__10947 = (j + (1));
+j = G__10947;
+continue;
+}
+} else {
+var G__10948 = (j + (1));
+j = G__10948;
+continue;
+}
+} else {
+return null;
+}
+break;
+}
+} else {
+return (new cljs.core.ArrayNodeSeq(meta,nodes,i,s,null));
+}
+});
+
+cljs.core.create_array_node_seq.cljs$lang$maxFixedArity = 4;
+
+
+/**
+* @constructor
+*/
+cljs.core.HashMapIter = (function (nil_val,root_iter,seen){
+this.nil_val = nil_val;
+this.root_iter = root_iter;
+this.seen = seen;
+})
+cljs.core.HashMapIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return (!(self__.seen)) || (self__.root_iter.hasNext());
+});
+
+cljs.core.HashMapIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if(!(self__.seen)){
+self__.seen = true;
+
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [null,self__.nil_val], null);
+} else {
+return self__.root_iter.next();
+}
+});
+
+cljs.core.HashMapIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.HashMapIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"nil-val","nil-val",-513933559,null),new cljs.core.Symbol(null,"root-iter","root-iter",1974672108,null),cljs.core.with_meta(new cljs.core.Symbol(null,"seen","seen",1121531738,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.HashMapIter.cljs$lang$type = true;
+
+cljs.core.HashMapIter.cljs$lang$ctorStr = "cljs.core/HashMapIter";
+
+cljs.core.HashMapIter.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/HashMapIter");
+});
+
+cljs.core.__GT_HashMapIter = (function cljs$core$__GT_HashMapIter(nil_val,root_iter,seen){
+return (new cljs.core.HashMapIter(nil_val,root_iter,seen));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEditableCollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.IMap}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.PersistentHashMap = (function (meta,cnt,root,has_nil_QMARK_,nil_val,__hash){
+this.meta = meta;
+this.cnt = cnt;
+this.root = root;
+this.has_nil_QMARK_ = has_nil_QMARK_;
+this.nil_val = nil_val;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 16123663;
+this.cljs$lang$protocol_mask$partition1$ = 8196;
+})
+cljs.core.PersistentHashMap.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentHashMap.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentHashMap.prototype.keys = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator((cljs.core.keys.cljs$core$IFn$_invoke$arity$1 ? cljs.core.keys.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.keys.call(null,coll)));
+});
+
+cljs.core.PersistentHashMap.prototype.entries = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_entries_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentHashMap.prototype.values = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator((cljs.core.vals.cljs$core$IFn$_invoke$arity$1 ? cljs.core.vals.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.vals.call(null,coll)));
+});
+
+cljs.core.PersistentHashMap.prototype.has = (function (k){
+var self__ = this;
+var coll = this;
+return cljs.core.contains_QMARK_(coll,k);
+});
+
+cljs.core.PersistentHashMap.prototype.get = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentHashMap.prototype.forEach = (function (f){
+var self__ = this;
+var coll = this;
+var seq__10950 = cljs.core.seq(coll);
+var chunk__10951 = null;
+var count__10952 = (0);
+var i__10953 = (0);
+while(true){
+if((i__10953 < count__10952)){
+var vec__10954 = chunk__10951.cljs$core$IIndexed$_nth$arity$2(null,i__10953);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10954,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10954,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+var G__10962 = seq__10950;
+var G__10963 = chunk__10951;
+var G__10964 = count__10952;
+var G__10965 = (i__10953 + (1));
+seq__10950 = G__10962;
+chunk__10951 = G__10963;
+count__10952 = G__10964;
+i__10953 = G__10965;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__10950);
+if(temp__4657__auto__){
+var seq__10950__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__10950__$1)){
+var c__7331__auto__ = cljs.core.chunk_first(seq__10950__$1);
+var G__10966 = cljs.core.chunk_rest(seq__10950__$1);
+var G__10967 = c__7331__auto__;
+var G__10968 = cljs.core.count(c__7331__auto__);
+var G__10969 = (0);
+seq__10950 = G__10966;
+chunk__10951 = G__10967;
+count__10952 = G__10968;
+i__10953 = G__10969;
+continue;
+} else {
+var vec__10957 = cljs.core.first(seq__10950__$1);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10957,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10957,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+var G__10970 = cljs.core.next(seq__10950__$1);
+var G__10971 = null;
+var G__10972 = (0);
+var G__10973 = (0);
+seq__10950 = G__10970;
+chunk__10951 = G__10971;
+count__10952 = G__10972;
+i__10953 = G__10973;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+if((k == null)){
+if(self__.has_nil_QMARK_){
+return self__.nil_val;
+} else {
+return not_found;
+}
+} else {
+if((self__.root == null)){
+return not_found;
+} else {
+return self__.root.inode_lookup((0),cljs.core.hash(k),k,not_found);
+
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+var init__$1 = ((self__.has_nil_QMARK_)?(f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(init,null,self__.nil_val) : f.call(null,init,null,self__.nil_val)):init);
+if(cljs.core.reduced_QMARK_(init__$1)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$1) : cljs.core.deref.call(null,init__$1));
+} else {
+if(!((self__.root == null))){
+return self__.root.kv_reduce(f,init__$1);
+} else {
+return init__$1;
+
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var root_iter = ((self__.root)?cljs.core._iterator(self__.root):cljs.core.nil_iter());
+if(self__.has_nil_QMARK_){
+return (new cljs.core.HashMapIter(self__.nil_val,root_iter,false));
+} else {
+return root_iter;
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentHashMap(self__.meta,self__.cnt,self__.root,self__.has_nil_QMARK_,self__.nil_val,self__.__hash));
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.cnt;
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_map(coll__$1,other);
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IEditableCollection$_as_transient$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.TransientHashMap({},self__.root,self__.cnt,self__.has_nil_QMARK_,self__.nil_val));
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.PersistentHashMap.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IMap$_dissoc$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if((k == null)){
+if(self__.has_nil_QMARK_){
+return (new cljs.core.PersistentHashMap(self__.meta,(self__.cnt - (1)),self__.root,false,null,null));
+} else {
+return coll__$1;
+}
+} else {
+if((self__.root == null)){
+return coll__$1;
+} else {
+var new_root = self__.root.inode_without((0),cljs.core.hash(k),k);
+if((new_root === self__.root)){
+return coll__$1;
+} else {
+return (new cljs.core.PersistentHashMap(self__.meta,(self__.cnt - (1)),new_root,self__.has_nil_QMARK_,self__.nil_val,null));
+}
+
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,k,v){
+var self__ = this;
+var coll__$1 = this;
+if((k == null)){
+if((self__.has_nil_QMARK_) && ((v === self__.nil_val))){
+return coll__$1;
+} else {
+return (new cljs.core.PersistentHashMap(self__.meta,((self__.has_nil_QMARK_)?self__.cnt:(self__.cnt + (1))),self__.root,true,v,null));
+}
+} else {
+var added_leaf_QMARK_ = (new cljs.core.Box(false));
+var new_root = (((self__.root == null))?cljs.core.BitmapIndexedNode.EMPTY:self__.root).inode_assoc((0),cljs.core.hash(k),k,v,added_leaf_QMARK_);
+if((new_root === self__.root)){
+return coll__$1;
+} else {
+return (new cljs.core.PersistentHashMap(self__.meta,((added_leaf_QMARK_.val)?(self__.cnt + (1)):self__.cnt),new_root,self__.has_nil_QMARK_,self__.nil_val,null));
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if((k == null)){
+return self__.has_nil_QMARK_;
+} else {
+if((self__.root == null)){
+return false;
+} else {
+return !((self__.root.inode_lookup((0),cljs.core.hash(k),k,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel));
+
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+var s = ((!((self__.root == null)))?self__.root.inode_seq():null);
+if(self__.has_nil_QMARK_){
+return cljs.core.cons(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [null,self__.nil_val], null),s);
+} else {
+return s;
+}
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentHashMap(meta__$1,self__.cnt,self__.root,self__.has_nil_QMARK_,self__.nil_val,self__.__hash));
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.vector_QMARK_(entry)){
+return coll__$1.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(1)));
+} else {
+var ret = coll__$1;
+var es = cljs.core.seq(entry);
+while(true){
+if((es == null)){
+return ret;
+} else {
+var e = cljs.core.first(es);
+if(cljs.core.vector_QMARK_(e)){
+var G__10974 = ret.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(1)));
+var G__10975 = cljs.core.next(es);
+ret = G__10974;
+es = G__10975;
+continue;
+} else {
+throw (new Error("conj on a map takes map entries or seqables of map entries"));
+}
+}
+break;
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.call = (function() {
+var G__10976 = null;
+var G__10976__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__10976__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__10976 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__10976__2.call(this,self__,k);
+case 3:
+return G__10976__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10976.cljs$core$IFn$_invoke$arity$2 = G__10976__2;
+G__10976.cljs$core$IFn$_invoke$arity$3 = G__10976__3;
+return G__10976;
+})()
+;
+
+cljs.core.PersistentHashMap.prototype.apply = (function (self__,args10949){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args10949)));
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentHashMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.Symbol(null,"root","root",1191874074,null),cljs.core.with_meta(new cljs.core.Symbol(null,"has-nil?","has-nil?",825886722,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"boolean","boolean",-278886877,null)], null)),new cljs.core.Symbol(null,"nil-val","nil-val",-513933559,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentHashMap.cljs$lang$type = true;
+
+cljs.core.PersistentHashMap.cljs$lang$ctorStr = "cljs.core/PersistentHashMap";
+
+cljs.core.PersistentHashMap.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentHashMap");
+});
+
+cljs.core.__GT_PersistentHashMap = (function cljs$core$__GT_PersistentHashMap(meta,cnt,root,has_nil_QMARK_,nil_val,__hash){
+return (new cljs.core.PersistentHashMap(meta,cnt,root,has_nil_QMARK_,nil_val,__hash));
+});
+
+cljs.core.PersistentHashMap.EMPTY = (new cljs.core.PersistentHashMap(null,(0),null,false,null,cljs.core.empty_unordered_hash));
+cljs.core.PersistentHashMap.fromArray = (function (arr,no_clone){
+var arr__$1 = ((no_clone)?arr:cljs.core.aclone(arr));
+var len = arr__$1.length;
+var i = (0);
+var ret = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+while(true){
+if((i < len)){
+var G__10977 = (i + (2));
+var G__10978 = cljs.core._assoc_BANG_(ret,(arr__$1[i]),(arr__$1[(i + (1))]));
+i = G__10977;
+ret = G__10978;
+continue;
+} else {
+return cljs.core._persistent_BANG_(ret);
+}
+break;
+}
+});
+cljs.core.PersistentHashMap.fromArrays = (function (ks,vs){
+var len = ks.length;
+var i = (0);
+var out = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+while(true){
+if((i < len)){
+var G__10979 = (i + (1));
+var G__10980 = out.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3(null,(ks[i]),(vs[i]));
+i = G__10979;
+out = G__10980;
+continue;
+} else {
+return cljs.core.persistent_BANG_(out);
+}
+break;
+}
+});
+cljs.core.PersistentHashMap.createWithCheck = (function (arr){
+var len = arr.length;
+var ret = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+var i_10981 = (0);
+while(true){
+if((i_10981 < len)){
+cljs.core._assoc_BANG_(ret,(arr[i_10981]),(arr[(i_10981 + (1))]));
+
+if(cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core._count(ret),((i_10981 / (2)) + (1)))){
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Duplicate key: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1((arr[i_10981]))].join('')));
+} else {
+var G__10982 = (i_10981 + (2));
+i_10981 = G__10982;
+continue;
+}
+} else {
+}
+break;
+}
+
+return cljs.core._persistent_BANG_(ret);
+});
+(cljs.core.PersistentHashMap.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+
+/**
+* @constructor
+ * @implements {cljs.core.ITransientMap}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ITransientCollection}
+ * @implements {cljs.core.ITransientAssociative}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.TransientHashMap = (function (edit,root,count,has_nil_QMARK_,nil_val){
+this.edit = edit;
+this.root = root;
+this.count = count;
+this.has_nil_QMARK_ = has_nil_QMARK_;
+this.nil_val = nil_val;
+this.cljs$lang$protocol_mask$partition0$ = 258;
+this.cljs$lang$protocol_mask$partition1$ = 56;
+})
+cljs.core.TransientHashMap.prototype.conj_BANG_ = (function (o){
+var self__ = this;
+var tcoll = this;
+if(self__.edit){
+if(((!((o == null)))?((((o.cljs$lang$protocol_mask$partition0$ & (2048))) || ((cljs.core.PROTOCOL_SENTINEL === o.cljs$core$IMapEntry$)))?true:(((!o.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.IMapEntry,o):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IMapEntry,o))){
+return tcoll.assoc_BANG_((cljs.core.key.cljs$core$IFn$_invoke$arity$1 ? cljs.core.key.cljs$core$IFn$_invoke$arity$1(o) : cljs.core.key.call(null,o)),(cljs.core.val.cljs$core$IFn$_invoke$arity$1 ? cljs.core.val.cljs$core$IFn$_invoke$arity$1(o) : cljs.core.val.call(null,o)));
+} else {
+var es = cljs.core.seq(o);
+var tcoll__$1 = tcoll;
+while(true){
+var temp__4655__auto__ = cljs.core.first(es);
+if(cljs.core.truth_(temp__4655__auto__)){
+var e = temp__4655__auto__;
+var G__10984 = cljs.core.next(es);
+var G__10985 = tcoll__$1.assoc_BANG_((cljs.core.key.cljs$core$IFn$_invoke$arity$1 ? cljs.core.key.cljs$core$IFn$_invoke$arity$1(e) : cljs.core.key.call(null,e)),(cljs.core.val.cljs$core$IFn$_invoke$arity$1 ? cljs.core.val.cljs$core$IFn$_invoke$arity$1(e) : cljs.core.val.call(null,e)));
+es = G__10984;
+tcoll__$1 = G__10985;
+continue;
+} else {
+return tcoll__$1;
+}
+break;
+}
+}
+} else {
+throw (new Error("conj! after persistent"));
+}
+});
+
+cljs.core.TransientHashMap.prototype.assoc_BANG_ = (function (k,v){
+var self__ = this;
+var tcoll = this;
+if(self__.edit){
+if((k == null)){
+if((self__.nil_val === v)){
+} else {
+self__.nil_val = v;
+}
+
+if(self__.has_nil_QMARK_){
+} else {
+self__.count = (self__.count + (1));
+
+self__.has_nil_QMARK_ = true;
+}
+
+return tcoll;
+} else {
+var added_leaf_QMARK_ = (new cljs.core.Box(false));
+var node = (((self__.root == null))?cljs.core.BitmapIndexedNode.EMPTY:self__.root).inode_assoc_BANG_(self__.edit,(0),cljs.core.hash(k),k,v,added_leaf_QMARK_);
+if((node === self__.root)){
+} else {
+self__.root = node;
+}
+
+if(added_leaf_QMARK_.val){
+self__.count = (self__.count + (1));
+} else {
+}
+
+return tcoll;
+}
+} else {
+throw (new Error("assoc! after persistent!"));
+}
+});
+
+cljs.core.TransientHashMap.prototype.without_BANG_ = (function (k){
+var self__ = this;
+var tcoll = this;
+if(self__.edit){
+if((k == null)){
+if(self__.has_nil_QMARK_){
+self__.has_nil_QMARK_ = false;
+
+self__.nil_val = null;
+
+self__.count = (self__.count - (1));
+
+return tcoll;
+} else {
+return tcoll;
+}
+} else {
+if((self__.root == null)){
+return tcoll;
+} else {
+var removed_leaf_QMARK_ = (new cljs.core.Box(false));
+var node = self__.root.inode_without_BANG_(self__.edit,(0),cljs.core.hash(k),k,removed_leaf_QMARK_);
+if((node === self__.root)){
+} else {
+self__.root = node;
+}
+
+if(cljs.core.truth_((removed_leaf_QMARK_[(0)]))){
+self__.count = (self__.count - (1));
+} else {
+}
+
+return tcoll;
+}
+}
+} else {
+throw (new Error("dissoc! after persistent!"));
+}
+});
+
+cljs.core.TransientHashMap.prototype.persistent_BANG_ = (function (){
+var self__ = this;
+var tcoll = this;
+if(self__.edit){
+self__.edit = null;
+
+return (new cljs.core.PersistentHashMap(null,self__.count,self__.root,self__.has_nil_QMARK_,self__.nil_val,null));
+} else {
+throw (new Error("persistent! called twice"));
+}
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(self__.edit){
+return self__.count;
+} else {
+throw (new Error("count after persistent!"));
+}
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (tcoll,k){
+var self__ = this;
+var tcoll__$1 = this;
+if((k == null)){
+if(self__.has_nil_QMARK_){
+return self__.nil_val;
+} else {
+return null;
+}
+} else {
+if((self__.root == null)){
+return null;
+} else {
+return self__.root.inode_lookup((0),cljs.core.hash(k),k);
+}
+}
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (tcoll,k,not_found){
+var self__ = this;
+var tcoll__$1 = this;
+if((k == null)){
+if(self__.has_nil_QMARK_){
+return self__.nil_val;
+} else {
+return not_found;
+}
+} else {
+if((self__.root == null)){
+return not_found;
+} else {
+return self__.root.inode_lookup((0),cljs.core.hash(k),k,not_found);
+}
+}
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ITransientCollection$_conj_BANG_$arity$2 = (function (tcoll,val){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.conj_BANG_(val);
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ITransientCollection$_persistent_BANG_$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.persistent_BANG_();
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3 = (function (tcoll,key,val){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.assoc_BANG_(key,val);
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ITransientMap$_dissoc_BANG_$arity$2 = (function (tcoll,key){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.without_BANG_(key);
+});
+
+cljs.core.TransientHashMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"edit","edit",-1302639,null),new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"boolean","boolean",-278886877,null),new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"root","root",1191874074,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"count","count",-514511684,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"has-nil?","has-nil?",825886722,null),new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"boolean","boolean",-278886877,null),new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"nil-val","nil-val",-513933559,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.TransientHashMap.cljs$lang$type = true;
+
+cljs.core.TransientHashMap.cljs$lang$ctorStr = "cljs.core/TransientHashMap";
+
+cljs.core.TransientHashMap.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/TransientHashMap");
+});
+
+cljs.core.__GT_TransientHashMap = (function cljs$core$__GT_TransientHashMap(edit,root,count,has_nil_QMARK_,nil_val){
+return (new cljs.core.TransientHashMap(edit,root,count,has_nil_QMARK_,nil_val));
+});
+
+cljs.core.tree_map_seq_push = (function cljs$core$tree_map_seq_push(node,stack,ascending_QMARK_){
+var t = node;
+var stack__$1 = stack;
+while(true){
+if(!((t == null))){
+var G__10986 = ((ascending_QMARK_)?t.left:t.right);
+var G__10987 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(stack__$1,t);
+t = G__10986;
+stack__$1 = G__10987;
+continue;
+} else {
+return stack__$1;
+}
+break;
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.PersistentTreeMapSeq = (function (meta,stack,ascending_QMARK_,cnt,__hash){
+this.meta = meta;
+this.stack = stack;
+this.ascending_QMARK_ = ascending_QMARK_;
+this.cnt = cnt;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32374862;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.PersistentTreeMapSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.indexOf = (function() {
+var G__10988 = null;
+var G__10988__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10988__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10988 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10988__1.call(this,x);
+case 2:
+return G__10988__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10988.cljs$core$IFn$_invoke$arity$1 = G__10988__1;
+G__10988.cljs$core$IFn$_invoke$arity$2 = G__10988__2;
+return G__10988;
+})()
+;
+
+cljs.core.PersistentTreeMapSeq.prototype.lastIndexOf = (function() {
+var G__10989 = null;
+var G__10989__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10989__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10989 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10989__1.call(this,x);
+case 2:
+return G__10989__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10989.cljs$core$IFn$_invoke$arity$1 = G__10989__1;
+G__10989.cljs$core$IFn$_invoke$arity$2 = G__10989__2;
+return G__10989;
+})()
+;
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt < (0))){
+return (cljs.core.count(cljs.core.next(coll__$1)) + (1));
+} else {
+return self__.cnt;
+}
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core.peek(self__.stack);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+var t = cljs.core.first(self__.stack);
+var next_stack = cljs.core.tree_map_seq_push(((self__.ascending_QMARK_)?t.right:t.left),cljs.core.next(self__.stack),self__.ascending_QMARK_);
+if(!((next_stack == null))){
+return (new cljs.core.PersistentTreeMapSeq(null,next_stack,self__.ascending_QMARK_,(self__.cnt - (1)),null));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1;
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeMapSeq(meta__$1,self__.stack,self__.ascending_QMARK_,self__.cnt,self__.__hash));
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.PersistentTreeMapSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"stack","stack",847125597,null),cljs.core.with_meta(new cljs.core.Symbol(null,"ascending?","ascending?",-1938452653,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"boolean","boolean",-278886877,null)], null)),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentTreeMapSeq.cljs$lang$type = true;
+
+cljs.core.PersistentTreeMapSeq.cljs$lang$ctorStr = "cljs.core/PersistentTreeMapSeq";
+
+cljs.core.PersistentTreeMapSeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentTreeMapSeq");
+});
+
+cljs.core.__GT_PersistentTreeMapSeq = (function cljs$core$__GT_PersistentTreeMapSeq(meta,stack,ascending_QMARK_,cnt,__hash){
+return (new cljs.core.PersistentTreeMapSeq(meta,stack,ascending_QMARK_,cnt,__hash));
+});
+
+(cljs.core.PersistentTreeMapSeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+cljs.core.create_tree_map_seq = (function cljs$core$create_tree_map_seq(tree,ascending_QMARK_,cnt){
+return (new cljs.core.PersistentTreeMapSeq(null,cljs.core.tree_map_seq_push(tree,null,ascending_QMARK_),ascending_QMARK_,cnt,null));
+});
+
+cljs.core.balance_left = (function cljs$core$balance_left(key,val,ins,right){
+if((ins instanceof cljs.core.RedNode)){
+if((ins.left instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(ins.key,ins.val,ins.left.blacken(),(new cljs.core.BlackNode(key,val,ins.right,right,null)),null));
+} else {
+if((ins.right instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(ins.right.key,ins.right.val,(new cljs.core.BlackNode(ins.key,ins.val,ins.left,ins.right.left,null)),(new cljs.core.BlackNode(key,val,ins.right.right,right,null)),null));
+} else {
+return (new cljs.core.BlackNode(key,val,ins,right,null));
+
+}
+}
+} else {
+return (new cljs.core.BlackNode(key,val,ins,right,null));
+}
+});
+cljs.core.balance_right = (function cljs$core$balance_right(key,val,left,ins){
+if((ins instanceof cljs.core.RedNode)){
+if((ins.right instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(ins.key,ins.val,(new cljs.core.BlackNode(key,val,left,ins.left,null)),ins.right.blacken(),null));
+} else {
+if((ins.left instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(ins.left.key,ins.left.val,(new cljs.core.BlackNode(key,val,left,ins.left.left,null)),(new cljs.core.BlackNode(ins.key,ins.val,ins.left.right,ins.right,null)),null));
+} else {
+return (new cljs.core.BlackNode(key,val,left,ins,null));
+
+}
+}
+} else {
+return (new cljs.core.BlackNode(key,val,left,ins,null));
+}
+});
+cljs.core.balance_left_del = (function cljs$core$balance_left_del(key,val,del,right){
+if((del instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(key,val,del.blacken(),right,null));
+} else {
+if((right instanceof cljs.core.BlackNode)){
+return cljs.core.balance_right(key,val,del,right.redden());
+} else {
+if(((right instanceof cljs.core.RedNode)) && ((right.left instanceof cljs.core.BlackNode))){
+return (new cljs.core.RedNode(right.left.key,right.left.val,(new cljs.core.BlackNode(key,val,del,right.left.left,null)),cljs.core.balance_right(right.key,right.val,right.left.right,right.right.redden()),null));
+} else {
+throw (new Error("red-black tree invariant violation"));
+
+}
+}
+}
+});
+cljs.core.balance_right_del = (function cljs$core$balance_right_del(key,val,left,del){
+if((del instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(key,val,left,del.blacken(),null));
+} else {
+if((left instanceof cljs.core.BlackNode)){
+return cljs.core.balance_left(key,val,left.redden(),del);
+} else {
+if(((left instanceof cljs.core.RedNode)) && ((left.right instanceof cljs.core.BlackNode))){
+return (new cljs.core.RedNode(left.right.key,left.right.val,cljs.core.balance_left(left.key,left.val,left.left.redden(),left.right.left),(new cljs.core.BlackNode(key,val,left.right.right,del,null)),null));
+} else {
+throw (new Error("red-black tree invariant violation"));
+
+}
+}
+}
+});
+cljs.core.tree_map_kv_reduce = (function cljs$core$tree_map_kv_reduce(node,f,init){
+var init__$1 = ((!((node.left == null)))?(function (){var G__10999 = node.left;
+var G__11000 = f;
+var G__11001 = init;
+return (cljs.core.tree_map_kv_reduce.cljs$core$IFn$_invoke$arity$3 ? cljs.core.tree_map_kv_reduce.cljs$core$IFn$_invoke$arity$3(G__10999,G__11000,G__11001) : cljs.core.tree_map_kv_reduce.call(null,G__10999,G__11000,G__11001));
+})():init);
+if(cljs.core.reduced_QMARK_(init__$1)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$1) : cljs.core.deref.call(null,init__$1));
+} else {
+var init__$2 = (function (){var G__11002 = init__$1;
+var G__11003 = node.key;
+var G__11004 = node.val;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11002,G__11003,G__11004) : f.call(null,G__11002,G__11003,G__11004));
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$2) : cljs.core.deref.call(null,init__$2));
+} else {
+var init__$3 = ((!((node.right == null)))?(function (){var G__11005 = node.right;
+var G__11006 = f;
+var G__11007 = init__$2;
+return (cljs.core.tree_map_kv_reduce.cljs$core$IFn$_invoke$arity$3 ? cljs.core.tree_map_kv_reduce.cljs$core$IFn$_invoke$arity$3(G__11005,G__11006,G__11007) : cljs.core.tree_map_kv_reduce.call(null,G__11005,G__11006,G__11007));
+})():init__$2);
+if(cljs.core.reduced_QMARK_(init__$3)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init__$3) : cljs.core.deref.call(null,init__$3));
+} else {
+return init__$3;
+}
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IVector}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IMapEntry}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.BlackNode = (function (key,val,left,right,__hash){
+this.key = key;
+this.val = val;
+this.left = left;
+this.right = right;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32402207;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.BlackNode.prototype.lastIndexOf = (function() {
+var G__11009 = null;
+var G__11009__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11009__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11009 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11009__1.call(this,x);
+case 2:
+return G__11009__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11009.cljs$core$IFn$_invoke$arity$1 = G__11009__1;
+G__11009.cljs$core$IFn$_invoke$arity$2 = G__11009__2;
+return G__11009;
+})()
+;
+
+cljs.core.BlackNode.prototype.indexOf = (function() {
+var G__11010 = null;
+var G__11010__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11010__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11010 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11010__1.call(this,x);
+case 2:
+return G__11010__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11010.cljs$core$IFn$_invoke$arity$1 = G__11010__1;
+G__11010.cljs$core$IFn$_invoke$arity$2 = G__11010__2;
+return G__11010;
+})()
+;
+
+cljs.core.BlackNode.prototype.add_right = (function (ins){
+var self__ = this;
+var node = this;
+return ins.balance_right(node);
+});
+
+cljs.core.BlackNode.prototype.redden = (function (){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(self__.key,self__.val,self__.left,self__.right,null));
+});
+
+cljs.core.BlackNode.prototype.blacken = (function (){
+var self__ = this;
+var node = this;
+return node;
+});
+
+cljs.core.BlackNode.prototype.add_left = (function (ins){
+var self__ = this;
+var node = this;
+return ins.balance_left(node);
+});
+
+cljs.core.BlackNode.prototype.replace = (function (key__$1,val__$1,left__$1,right__$1){
+var self__ = this;
+var node = this;
+return (new cljs.core.BlackNode(key__$1,val__$1,left__$1,right__$1,null));
+});
+
+cljs.core.BlackNode.prototype.balance_left = (function (parent){
+var self__ = this;
+var node = this;
+return (new cljs.core.BlackNode(parent.key,parent.val,node,parent.right,null));
+});
+
+cljs.core.BlackNode.prototype.balance_right = (function (parent){
+var self__ = this;
+var node = this;
+return (new cljs.core.BlackNode(parent.key,parent.val,parent.left,node,null));
+});
+
+cljs.core.BlackNode.prototype.remove_left = (function (del){
+var self__ = this;
+var node = this;
+return cljs.core.balance_left_del(self__.key,self__.val,del,self__.right);
+});
+
+cljs.core.BlackNode.prototype.kv_reduce = (function (f,init){
+var self__ = this;
+var node = this;
+return cljs.core.tree_map_kv_reduce(node,f,init);
+});
+
+cljs.core.BlackNode.prototype.remove_right = (function (del){
+var self__ = this;
+var node = this;
+return cljs.core.balance_right_del(self__.key,self__.val,self__.left,del);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+return node__$1.cljs$core$IIndexed$_nth$arity$3(null,k,null);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (node,k,not_found){
+var self__ = this;
+var node__$1 = this;
+return node__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (node,n){
+var self__ = this;
+var node__$1 = this;
+if((n === (0))){
+return self__.key;
+} else {
+if((n === (1))){
+return self__.val;
+} else {
+return null;
+
+}
+}
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (node,n,not_found){
+var self__ = this;
+var node__$1 = this;
+if((n === (0))){
+return self__.key;
+} else {
+if((n === (1))){
+return self__.val;
+} else {
+return not_found;
+
+}
+}
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IVector$_assoc_n$arity$3 = (function (node,n,v){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null).cljs$core$IVector$_assoc_n$arity$3(null,n,v);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IMeta$_meta$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return null;
+});
+
+cljs.core.BlackNode.prototype.cljs$core$ICounted$_count$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (2);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IMapEntry$_key$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.key;
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IMapEntry$_val$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.val;
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IStack$_peek$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.val;
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IStack$_pop$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key], null);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.PersistentVector.EMPTY;
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (node,f){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2(node__$1,f);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (node,f,start){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3(node__$1,f,start);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (node,k,v){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null),k,v);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+var x__7354__auto__ = self__.key;
+return cljs.core._conj((function (){var x__7354__auto____$1 = self__.val;
+return cljs.core._conj(cljs.core.List.EMPTY,x__7354__auto____$1);
+})(),x__7354__auto__);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (node,meta){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.with_meta(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null),meta);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$ICollection$_conj$arity$2 = (function (node,o){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val,o], null);
+});
+
+cljs.core.BlackNode.prototype.call = (function() {
+var G__11011 = null;
+var G__11011__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var node = self____$1;
+return node.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__11011__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var node = self____$1;
+return node.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__11011 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11011__2.call(this,self__,k);
+case 3:
+return G__11011__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11011.cljs$core$IFn$_invoke$arity$2 = G__11011__2;
+G__11011.cljs$core$IFn$_invoke$arity$3 = G__11011__3;
+return G__11011;
+})()
+;
+
+cljs.core.BlackNode.prototype.apply = (function (self__,args11008){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11008)));
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var node = this;
+return node.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var node = this;
+return node.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.BlackNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"key","key",124488940,null),new cljs.core.Symbol(null,"val","val",1769233139,null),new cljs.core.Symbol(null,"left","left",1241415590,null),new cljs.core.Symbol(null,"right","right",1187949694,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.BlackNode.cljs$lang$type = true;
+
+cljs.core.BlackNode.cljs$lang$ctorStr = "cljs.core/BlackNode";
+
+cljs.core.BlackNode.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/BlackNode");
+});
+
+cljs.core.__GT_BlackNode = (function cljs$core$__GT_BlackNode(key,val,left,right,__hash){
+return (new cljs.core.BlackNode(key,val,left,right,__hash));
+});
+
+(cljs.core.BlackNode.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IVector}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IMapEntry}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.RedNode = (function (key,val,left,right,__hash){
+this.key = key;
+this.val = val;
+this.left = left;
+this.right = right;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32402207;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.RedNode.prototype.lastIndexOf = (function() {
+var G__11013 = null;
+var G__11013__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11013__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11013 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11013__1.call(this,x);
+case 2:
+return G__11013__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11013.cljs$core$IFn$_invoke$arity$1 = G__11013__1;
+G__11013.cljs$core$IFn$_invoke$arity$2 = G__11013__2;
+return G__11013;
+})()
+;
+
+cljs.core.RedNode.prototype.indexOf = (function() {
+var G__11014 = null;
+var G__11014__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11014__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11014 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11014__1.call(this,x);
+case 2:
+return G__11014__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11014.cljs$core$IFn$_invoke$arity$1 = G__11014__1;
+G__11014.cljs$core$IFn$_invoke$arity$2 = G__11014__2;
+return G__11014;
+})()
+;
+
+cljs.core.RedNode.prototype.add_right = (function (ins){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(self__.key,self__.val,self__.left,ins,null));
+});
+
+cljs.core.RedNode.prototype.redden = (function (){
+var self__ = this;
+var node = this;
+throw (new Error("red-black tree invariant violation"));
+});
+
+cljs.core.RedNode.prototype.blacken = (function (){
+var self__ = this;
+var node = this;
+return (new cljs.core.BlackNode(self__.key,self__.val,self__.left,self__.right,null));
+});
+
+cljs.core.RedNode.prototype.add_left = (function (ins){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(self__.key,self__.val,ins,self__.right,null));
+});
+
+cljs.core.RedNode.prototype.replace = (function (key__$1,val__$1,left__$1,right__$1){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(key__$1,val__$1,left__$1,right__$1,null));
+});
+
+cljs.core.RedNode.prototype.balance_left = (function (parent){
+var self__ = this;
+var node = this;
+if((self__.left instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(self__.key,self__.val,self__.left.blacken(),(new cljs.core.BlackNode(parent.key,parent.val,self__.right,parent.right,null)),null));
+} else {
+if((self__.right instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(self__.right.key,self__.right.val,(new cljs.core.BlackNode(self__.key,self__.val,self__.left,self__.right.left,null)),(new cljs.core.BlackNode(parent.key,parent.val,self__.right.right,parent.right,null)),null));
+} else {
+return (new cljs.core.BlackNode(parent.key,parent.val,node,parent.right,null));
+
+}
+}
+});
+
+cljs.core.RedNode.prototype.balance_right = (function (parent){
+var self__ = this;
+var node = this;
+if((self__.right instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(self__.key,self__.val,(new cljs.core.BlackNode(parent.key,parent.val,parent.left,self__.left,null)),self__.right.blacken(),null));
+} else {
+if((self__.left instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(self__.left.key,self__.left.val,(new cljs.core.BlackNode(parent.key,parent.val,parent.left,self__.left.left,null)),(new cljs.core.BlackNode(self__.key,self__.val,self__.left.right,self__.right,null)),null));
+} else {
+return (new cljs.core.BlackNode(parent.key,parent.val,parent.left,node,null));
+
+}
+}
+});
+
+cljs.core.RedNode.prototype.remove_left = (function (del){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(self__.key,self__.val,del,self__.right,null));
+});
+
+cljs.core.RedNode.prototype.kv_reduce = (function (f,init){
+var self__ = this;
+var node = this;
+return cljs.core.tree_map_kv_reduce(node,f,init);
+});
+
+cljs.core.RedNode.prototype.remove_right = (function (del){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(self__.key,self__.val,self__.left,del,null));
+});
+
+cljs.core.RedNode.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+return node__$1.cljs$core$IIndexed$_nth$arity$3(null,k,null);
+});
+
+cljs.core.RedNode.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (node,k,not_found){
+var self__ = this;
+var node__$1 = this;
+return node__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (node,n){
+var self__ = this;
+var node__$1 = this;
+if((n === (0))){
+return self__.key;
+} else {
+if((n === (1))){
+return self__.val;
+} else {
+return null;
+
+}
+}
+});
+
+cljs.core.RedNode.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (node,n,not_found){
+var self__ = this;
+var node__$1 = this;
+if((n === (0))){
+return self__.key;
+} else {
+if((n === (1))){
+return self__.val;
+} else {
+return not_found;
+
+}
+}
+});
+
+cljs.core.RedNode.prototype.cljs$core$IVector$_assoc_n$arity$3 = (function (node,n,v){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null).cljs$core$IVector$_assoc_n$arity$3(null,n,v);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IMeta$_meta$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return null;
+});
+
+cljs.core.RedNode.prototype.cljs$core$ICounted$_count$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (2);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IMapEntry$_key$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.key;
+});
+
+cljs.core.RedNode.prototype.cljs$core$IMapEntry$_val$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.val;
+});
+
+cljs.core.RedNode.prototype.cljs$core$IStack$_peek$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.val;
+});
+
+cljs.core.RedNode.prototype.cljs$core$IStack$_pop$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key], null);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.RedNode.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.PersistentVector.EMPTY;
+});
+
+cljs.core.RedNode.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (node,f){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2(node__$1,f);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (node,f,start){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3(node__$1,f,start);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (node,k,v){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null),k,v);
+});
+
+cljs.core.RedNode.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+var x__7354__auto__ = self__.key;
+return cljs.core._conj((function (){var x__7354__auto____$1 = self__.val;
+return cljs.core._conj(cljs.core.List.EMPTY,x__7354__auto____$1);
+})(),x__7354__auto__);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (node,meta){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.with_meta(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null),meta);
+});
+
+cljs.core.RedNode.prototype.cljs$core$ICollection$_conj$arity$2 = (function (node,o){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val,o], null);
+});
+
+cljs.core.RedNode.prototype.call = (function() {
+var G__11015 = null;
+var G__11015__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var node = self____$1;
+return node.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__11015__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var node = self____$1;
+return node.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__11015 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11015__2.call(this,self__,k);
+case 3:
+return G__11015__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11015.cljs$core$IFn$_invoke$arity$2 = G__11015__2;
+G__11015.cljs$core$IFn$_invoke$arity$3 = G__11015__3;
+return G__11015;
+})()
+;
+
+cljs.core.RedNode.prototype.apply = (function (self__,args11012){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11012)));
+});
+
+cljs.core.RedNode.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var node = this;
+return node.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var node = this;
+return node.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.RedNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"key","key",124488940,null),new cljs.core.Symbol(null,"val","val",1769233139,null),new cljs.core.Symbol(null,"left","left",1241415590,null),new cljs.core.Symbol(null,"right","right",1187949694,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.RedNode.cljs$lang$type = true;
+
+cljs.core.RedNode.cljs$lang$ctorStr = "cljs.core/RedNode";
+
+cljs.core.RedNode.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/RedNode");
+});
+
+cljs.core.__GT_RedNode = (function cljs$core$__GT_RedNode(key,val,left,right,__hash){
+return (new cljs.core.RedNode(key,val,left,right,__hash));
+});
+
+(cljs.core.RedNode.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+cljs.core.tree_map_add = (function cljs$core$tree_map_add(comp,tree,k,v,found){
+if((tree == null)){
+return (new cljs.core.RedNode(k,v,null,null,null));
+} else {
+var c = (function (){var G__11028 = k;
+var G__11029 = tree.key;
+return (comp.cljs$core$IFn$_invoke$arity$2 ? comp.cljs$core$IFn$_invoke$arity$2(G__11028,G__11029) : comp.call(null,G__11028,G__11029));
+})();
+if((c === (0))){
+(found[(0)] = tree);
+
+return null;
+} else {
+if((c < (0))){
+var ins = (function (){var G__11030 = comp;
+var G__11031 = tree.left;
+var G__11032 = k;
+var G__11033 = v;
+var G__11034 = found;
+return (cljs.core.tree_map_add.cljs$core$IFn$_invoke$arity$5 ? cljs.core.tree_map_add.cljs$core$IFn$_invoke$arity$5(G__11030,G__11031,G__11032,G__11033,G__11034) : cljs.core.tree_map_add.call(null,G__11030,G__11031,G__11032,G__11033,G__11034));
+})();
+if(!((ins == null))){
+return tree.add_left(ins);
+} else {
+return null;
+}
+} else {
+var ins = (function (){var G__11035 = comp;
+var G__11036 = tree.right;
+var G__11037 = k;
+var G__11038 = v;
+var G__11039 = found;
+return (cljs.core.tree_map_add.cljs$core$IFn$_invoke$arity$5 ? cljs.core.tree_map_add.cljs$core$IFn$_invoke$arity$5(G__11035,G__11036,G__11037,G__11038,G__11039) : cljs.core.tree_map_add.call(null,G__11035,G__11036,G__11037,G__11038,G__11039));
+})();
+if(!((ins == null))){
+return tree.add_right(ins);
+} else {
+return null;
+}
+
+}
+}
+}
+});
+cljs.core.tree_map_append = (function cljs$core$tree_map_append(left,right){
+if((left == null)){
+return right;
+} else {
+if((right == null)){
+return left;
+} else {
+if((left instanceof cljs.core.RedNode)){
+if((right instanceof cljs.core.RedNode)){
+var app = (function (){var G__11048 = left.right;
+var G__11049 = right.left;
+return (cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2 ? cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2(G__11048,G__11049) : cljs.core.tree_map_append.call(null,G__11048,G__11049));
+})();
+if((app instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(app.key,app.val,(new cljs.core.RedNode(left.key,left.val,left.left,app.left,null)),(new cljs.core.RedNode(right.key,right.val,app.right,right.right,null)),null));
+} else {
+return (new cljs.core.RedNode(left.key,left.val,left.left,(new cljs.core.RedNode(right.key,right.val,app,right.right,null)),null));
+}
+} else {
+return (new cljs.core.RedNode(left.key,left.val,left.left,(function (){var G__11050 = left.right;
+var G__11051 = right;
+return (cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2 ? cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2(G__11050,G__11051) : cljs.core.tree_map_append.call(null,G__11050,G__11051));
+})(),null));
+}
+} else {
+if((right instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(right.key,right.val,(function (){var G__11052 = left;
+var G__11053 = right.left;
+return (cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2 ? cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2(G__11052,G__11053) : cljs.core.tree_map_append.call(null,G__11052,G__11053));
+})(),right.right,null));
+} else {
+var app = (function (){var G__11054 = left.right;
+var G__11055 = right.left;
+return (cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2 ? cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2(G__11054,G__11055) : cljs.core.tree_map_append.call(null,G__11054,G__11055));
+})();
+if((app instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(app.key,app.val,(new cljs.core.BlackNode(left.key,left.val,left.left,app.left,null)),(new cljs.core.BlackNode(right.key,right.val,app.right,right.right,null)),null));
+} else {
+return cljs.core.balance_left_del(left.key,left.val,left.left,(new cljs.core.BlackNode(right.key,right.val,app,right.right,null)));
+}
+
+}
+}
+}
+}
+});
+cljs.core.tree_map_remove = (function cljs$core$tree_map_remove(comp,tree,k,found){
+if(!((tree == null))){
+var c = (function (){var G__11066 = k;
+var G__11067 = tree.key;
+return (comp.cljs$core$IFn$_invoke$arity$2 ? comp.cljs$core$IFn$_invoke$arity$2(G__11066,G__11067) : comp.call(null,G__11066,G__11067));
+})();
+if((c === (0))){
+(found[(0)] = tree);
+
+return cljs.core.tree_map_append(tree.left,tree.right);
+} else {
+if((c < (0))){
+var del = (function (){var G__11068 = comp;
+var G__11069 = tree.left;
+var G__11070 = k;
+var G__11071 = found;
+return (cljs.core.tree_map_remove.cljs$core$IFn$_invoke$arity$4 ? cljs.core.tree_map_remove.cljs$core$IFn$_invoke$arity$4(G__11068,G__11069,G__11070,G__11071) : cljs.core.tree_map_remove.call(null,G__11068,G__11069,G__11070,G__11071));
+})();
+if((!((del == null))) || (!(((found[(0)]) == null)))){
+if((tree.left instanceof cljs.core.BlackNode)){
+return cljs.core.balance_left_del(tree.key,tree.val,del,tree.right);
+} else {
+return (new cljs.core.RedNode(tree.key,tree.val,del,tree.right,null));
+}
+} else {
+return null;
+}
+} else {
+var del = (function (){var G__11072 = comp;
+var G__11073 = tree.right;
+var G__11074 = k;
+var G__11075 = found;
+return (cljs.core.tree_map_remove.cljs$core$IFn$_invoke$arity$4 ? cljs.core.tree_map_remove.cljs$core$IFn$_invoke$arity$4(G__11072,G__11073,G__11074,G__11075) : cljs.core.tree_map_remove.call(null,G__11072,G__11073,G__11074,G__11075));
+})();
+if((!((del == null))) || (!(((found[(0)]) == null)))){
+if((tree.right instanceof cljs.core.BlackNode)){
+return cljs.core.balance_right_del(tree.key,tree.val,tree.left,del);
+} else {
+return (new cljs.core.RedNode(tree.key,tree.val,tree.left,del,null));
+}
+} else {
+return null;
+}
+
+}
+}
+} else {
+return null;
+}
+});
+cljs.core.tree_map_replace = (function cljs$core$tree_map_replace(comp,tree,k,v){
+var tk = tree.key;
+var c = (comp.cljs$core$IFn$_invoke$arity$2 ? comp.cljs$core$IFn$_invoke$arity$2(k,tk) : comp.call(null,k,tk));
+if((c === (0))){
+return tree.replace(tk,v,tree.left,tree.right);
+} else {
+if((c < (0))){
+return tree.replace(tk,tree.val,(function (){var G__11084 = comp;
+var G__11085 = tree.left;
+var G__11086 = k;
+var G__11087 = v;
+return (cljs.core.tree_map_replace.cljs$core$IFn$_invoke$arity$4 ? cljs.core.tree_map_replace.cljs$core$IFn$_invoke$arity$4(G__11084,G__11085,G__11086,G__11087) : cljs.core.tree_map_replace.call(null,G__11084,G__11085,G__11086,G__11087));
+})(),tree.right);
+} else {
+return tree.replace(tk,tree.val,tree.left,(function (){var G__11088 = comp;
+var G__11089 = tree.right;
+var G__11090 = k;
+var G__11091 = v;
+return (cljs.core.tree_map_replace.cljs$core$IFn$_invoke$arity$4 ? cljs.core.tree_map_replace.cljs$core$IFn$_invoke$arity$4(G__11088,G__11089,G__11090,G__11091) : cljs.core.tree_map_replace.call(null,G__11088,G__11089,G__11090,G__11091));
+})());
+
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISorted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.IMap}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.PersistentTreeMap = (function (comp,tree,cnt,meta,__hash){
+this.comp = comp;
+this.tree = tree;
+this.cnt = cnt;
+this.meta = meta;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 418776847;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+})
+cljs.core.PersistentTreeMap.prototype.forEach = (function (f){
+var self__ = this;
+var coll = this;
+var seq__11093 = cljs.core.seq(coll);
+var chunk__11094 = null;
+var count__11095 = (0);
+var i__11096 = (0);
+while(true){
+if((i__11096 < count__11095)){
+var vec__11097 = chunk__11094.cljs$core$IIndexed$_nth$arity$2(null,i__11096);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11097,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11097,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+var G__11107 = seq__11093;
+var G__11108 = chunk__11094;
+var G__11109 = count__11095;
+var G__11110 = (i__11096 + (1));
+seq__11093 = G__11107;
+chunk__11094 = G__11108;
+count__11095 = G__11109;
+i__11096 = G__11110;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__11093);
+if(temp__4657__auto__){
+var seq__11093__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__11093__$1)){
+var c__7331__auto__ = cljs.core.chunk_first(seq__11093__$1);
+var G__11111 = cljs.core.chunk_rest(seq__11093__$1);
+var G__11112 = c__7331__auto__;
+var G__11113 = cljs.core.count(c__7331__auto__);
+var G__11114 = (0);
+seq__11093 = G__11111;
+chunk__11094 = G__11112;
+count__11095 = G__11113;
+i__11096 = G__11114;
+continue;
+} else {
+var vec__11100 = cljs.core.first(seq__11093__$1);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11100,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11100,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+var G__11115 = cljs.core.next(seq__11093__$1);
+var G__11116 = null;
+var G__11117 = (0);
+var G__11118 = (0);
+seq__11093 = G__11115;
+chunk__11094 = G__11116;
+count__11095 = G__11117;
+i__11096 = G__11118;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.get = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentTreeMap.prototype.entries = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_entries_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentTreeMap.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentTreeMap.prototype.keys = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator((cljs.core.keys.cljs$core$IFn$_invoke$arity$1 ? cljs.core.keys.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.keys.call(null,coll)));
+});
+
+cljs.core.PersistentTreeMap.prototype.values = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator((cljs.core.vals.cljs$core$IFn$_invoke$arity$1 ? cljs.core.vals.cljs$core$IFn$_invoke$arity$1(coll) : cljs.core.vals.call(null,coll)));
+});
+
+cljs.core.PersistentTreeMap.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentTreeMap.prototype.entry_at = (function (k){
+var self__ = this;
+var coll = this;
+var t = self__.tree;
+while(true){
+if(!((t == null))){
+var c = (function (){var G__11103 = k;
+var G__11104 = t.key;
+return (self__.comp.cljs$core$IFn$_invoke$arity$2 ? self__.comp.cljs$core$IFn$_invoke$arity$2(G__11103,G__11104) : self__.comp.call(null,G__11103,G__11104));
+})();
+if((c === (0))){
+return t;
+} else {
+if((c < (0))){
+var G__11119 = t.left;
+t = G__11119;
+continue;
+} else {
+var G__11120 = t.right;
+t = G__11120;
+continue;
+
+}
+}
+} else {
+return null;
+}
+break;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.has = (function (k){
+var self__ = this;
+var coll = this;
+return cljs.core.contains_QMARK_(coll,k);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+var n = coll__$1.entry_at(k);
+if(!((n == null))){
+return n.val;
+} else {
+return not_found;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+if(!((self__.tree == null))){
+return cljs.core.tree_map_kv_reduce(self__.tree,f,init);
+} else {
+return init;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentTreeMap(self__.comp,self__.tree,self__.cnt,self__.meta,self__.__hash));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.cnt;
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+return cljs.core.create_tree_map_seq(self__.tree,false,self__.cnt);
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_map(coll__$1,other);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeMap(self__.comp,null,(0),self__.meta,(0)));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IMap$_dissoc$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+var found = [null];
+var t = cljs.core.tree_map_remove(self__.comp,self__.tree,k,found);
+if((t == null)){
+if((cljs.core.nth.cljs$core$IFn$_invoke$arity$2(found,(0)) == null)){
+return coll__$1;
+} else {
+return (new cljs.core.PersistentTreeMap(self__.comp,null,(0),self__.meta,null));
+}
+} else {
+return (new cljs.core.PersistentTreeMap(self__.comp,t.blacken(),(self__.cnt - (1)),self__.meta,null));
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,k,v){
+var self__ = this;
+var coll__$1 = this;
+var found = [null];
+var t = cljs.core.tree_map_add(self__.comp,self__.tree,k,v,found);
+if((t == null)){
+var found_node = cljs.core.nth.cljs$core$IFn$_invoke$arity$2(found,(0));
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(v,found_node.val)){
+return coll__$1;
+} else {
+return (new cljs.core.PersistentTreeMap(self__.comp,cljs.core.tree_map_replace(self__.comp,self__.tree,k,v),self__.cnt,self__.meta,null));
+}
+} else {
+return (new cljs.core.PersistentTreeMap(self__.comp,t.blacken(),(self__.cnt + (1)),self__.meta,null));
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return !((coll__$1.entry_at(k) == null));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+return cljs.core.create_tree_map_seq(self__.tree,true,self__.cnt);
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeMap(self__.comp,self__.tree,self__.cnt,meta__$1,self__.__hash));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.vector_QMARK_(entry)){
+return coll__$1.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(1)));
+} else {
+var ret = coll__$1;
+var es = cljs.core.seq(entry);
+while(true){
+if((es == null)){
+return ret;
+} else {
+var e = cljs.core.first(es);
+if(cljs.core.vector_QMARK_(e)){
+var G__11121 = ret.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(1)));
+var G__11122 = cljs.core.next(es);
+ret = G__11121;
+es = G__11122;
+continue;
+} else {
+throw (new Error("conj on a map takes map entries or seqables of map entries"));
+}
+}
+break;
+}
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.call = (function() {
+var G__11123 = null;
+var G__11123__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__11123__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__11123 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11123__2.call(this,self__,k);
+case 3:
+return G__11123__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11123.cljs$core$IFn$_invoke$arity$2 = G__11123__2;
+G__11123.cljs$core$IFn$_invoke$arity$3 = G__11123__3;
+return G__11123;
+})()
+;
+
+cljs.core.PersistentTreeMap.prototype.apply = (function (self__,args11092){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11092)));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ISorted$_sorted_seq$arity$2 = (function (coll,ascending_QMARK_){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+return cljs.core.create_tree_map_seq(self__.tree,ascending_QMARK_,self__.cnt);
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ISorted$_sorted_seq_from$arity$3 = (function (coll,k,ascending_QMARK_){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+var stack = null;
+var t = self__.tree;
+while(true){
+if(!((t == null))){
+var c = (function (){var G__11105 = k;
+var G__11106 = t.key;
+return (self__.comp.cljs$core$IFn$_invoke$arity$2 ? self__.comp.cljs$core$IFn$_invoke$arity$2(G__11105,G__11106) : self__.comp.call(null,G__11105,G__11106));
+})();
+if((c === (0))){
+return (new cljs.core.PersistentTreeMapSeq(null,cljs.core.conj.cljs$core$IFn$_invoke$arity$2(stack,t),ascending_QMARK_,(-1),null));
+} else {
+if(cljs.core.truth_(ascending_QMARK_)){
+if((c < (0))){
+var G__11124 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(stack,t);
+var G__11125 = t.left;
+stack = G__11124;
+t = G__11125;
+continue;
+} else {
+var G__11126 = stack;
+var G__11127 = t.right;
+stack = G__11126;
+t = G__11127;
+continue;
+}
+} else {
+if((c > (0))){
+var G__11128 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(stack,t);
+var G__11129 = t.right;
+stack = G__11128;
+t = G__11129;
+continue;
+} else {
+var G__11130 = stack;
+var G__11131 = t.left;
+stack = G__11130;
+t = G__11131;
+continue;
+}
+
+}
+}
+} else {
+if((stack == null)){
+return null;
+} else {
+return (new cljs.core.PersistentTreeMapSeq(null,stack,ascending_QMARK_,(-1),null));
+}
+}
+break;
+}
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ISorted$_entry_key$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.key.cljs$core$IFn$_invoke$arity$1 ? cljs.core.key.cljs$core$IFn$_invoke$arity$1(entry) : cljs.core.key.call(null,entry));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ISorted$_comparator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.comp;
+});
+
+cljs.core.PersistentTreeMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"comp","comp",-1462482139,null),new cljs.core.Symbol(null,"tree","tree",1444219499,null),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentTreeMap.cljs$lang$type = true;
+
+cljs.core.PersistentTreeMap.cljs$lang$ctorStr = "cljs.core/PersistentTreeMap";
+
+cljs.core.PersistentTreeMap.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentTreeMap");
+});
+
+cljs.core.__GT_PersistentTreeMap = (function cljs$core$__GT_PersistentTreeMap(comp,tree,cnt,meta,__hash){
+return (new cljs.core.PersistentTreeMap(comp,tree,cnt,meta,__hash));
+});
+
+cljs.core.PersistentTreeMap.EMPTY = (new cljs.core.PersistentTreeMap(cljs.core.compare,null,(0),null,cljs.core.empty_unordered_hash));
+(cljs.core.PersistentTreeMap.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+/**
+ * keyval => key val
+ * Returns a new hash map with supplied mappings.
+ */
+cljs.core.hash_map = (function cljs$core$hash_map(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11133 = arguments.length;
+var i__7626__auto___11134 = (0);
+while(true){
+if((i__7626__auto___11134 < len__7625__auto___11133)){
+args__7632__auto__.push((arguments[i__7626__auto___11134]));
+
+var G__11135 = (i__7626__auto___11134 + (1));
+i__7626__auto___11134 = G__11135;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.hash_map.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.hash_map.cljs$core$IFn$_invoke$arity$variadic = (function (keyvals){
+var in$ = cljs.core.seq(keyvals);
+var out = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+while(true){
+if(in$){
+var G__11136 = cljs.core.nnext(in$);
+var G__11137 = cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(out,cljs.core.first(in$),cljs.core.second(in$));
+in$ = G__11136;
+out = G__11137;
+continue;
+} else {
+return cljs.core.persistent_BANG_(out);
+}
+break;
+}
+});
+
+cljs.core.hash_map.cljs$lang$maxFixedArity = (0);
+
+cljs.core.hash_map.cljs$lang$applyTo = (function (seq11132){
+return cljs.core.hash_map.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11132));
+});
+
+/**
+ * keyval => key val
+ * Returns a new array map with supplied mappings.
+ */
+cljs.core.array_map = (function cljs$core$array_map(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11139 = arguments.length;
+var i__7626__auto___11140 = (0);
+while(true){
+if((i__7626__auto___11140 < len__7625__auto___11139)){
+args__7632__auto__.push((arguments[i__7626__auto___11140]));
+
+var G__11141 = (i__7626__auto___11140 + (1));
+i__7626__auto___11140 = G__11141;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.array_map.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.array_map.cljs$core$IFn$_invoke$arity$variadic = (function (keyvals){
+var arr = ((((keyvals instanceof cljs.core.IndexedSeq)) && ((keyvals.i === (0))))?keyvals.arr:cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(keyvals));
+return cljs.core.PersistentArrayMap.createAsIfByAssoc(arr,true,false);
+});
+
+cljs.core.array_map.cljs$lang$maxFixedArity = (0);
+
+cljs.core.array_map.cljs$lang$applyTo = (function (seq11138){
+return cljs.core.array_map.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11138));
+});
+
+/**
+ * keyval => key val
+ * Returns a new object map with supplied mappings.
+ */
+cljs.core.obj_map = (function cljs$core$obj_map(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11145 = arguments.length;
+var i__7626__auto___11146 = (0);
+while(true){
+if((i__7626__auto___11146 < len__7625__auto___11145)){
+args__7632__auto__.push((arguments[i__7626__auto___11146]));
+
+var G__11147 = (i__7626__auto___11146 + (1));
+i__7626__auto___11146 = G__11147;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.obj_map.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.obj_map.cljs$core$IFn$_invoke$arity$variadic = (function (keyvals){
+var ks = [];
+var obj = {};
+var kvs = cljs.core.seq(keyvals);
+while(true){
+if(kvs){
+ks.push(cljs.core.first(kvs));
+
+(obj[cljs.core.first(kvs)] = cljs.core.second(kvs));
+
+var G__11148 = cljs.core.nnext(kvs);
+kvs = G__11148;
+continue;
+} else {
+return cljs.core.ObjMap.fromObject(ks,obj);
+}
+break;
+}
+});
+
+cljs.core.obj_map.cljs$lang$maxFixedArity = (0);
+
+cljs.core.obj_map.cljs$lang$applyTo = (function (seq11142){
+return cljs.core.obj_map.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11142));
+});
+
+/**
+ * keyval => key val
+ * Returns a new sorted map with supplied mappings.
+ */
+cljs.core.sorted_map = (function cljs$core$sorted_map(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11150 = arguments.length;
+var i__7626__auto___11151 = (0);
+while(true){
+if((i__7626__auto___11151 < len__7625__auto___11150)){
+args__7632__auto__.push((arguments[i__7626__auto___11151]));
+
+var G__11152 = (i__7626__auto___11151 + (1));
+i__7626__auto___11151 = G__11152;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.sorted_map.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.sorted_map.cljs$core$IFn$_invoke$arity$variadic = (function (keyvals){
+var in$ = cljs.core.seq(keyvals);
+var out = cljs.core.PersistentTreeMap.EMPTY;
+while(true){
+if(in$){
+var G__11153 = cljs.core.nnext(in$);
+var G__11154 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(out,cljs.core.first(in$),cljs.core.second(in$));
+in$ = G__11153;
+out = G__11154;
+continue;
+} else {
+return out;
+}
+break;
+}
+});
+
+cljs.core.sorted_map.cljs$lang$maxFixedArity = (0);
+
+cljs.core.sorted_map.cljs$lang$applyTo = (function (seq11149){
+return cljs.core.sorted_map.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11149));
+});
+
+/**
+ * keyval => key val
+ * Returns a new sorted map with supplied mappings, using the supplied comparator.
+ */
+cljs.core.sorted_map_by = (function cljs$core$sorted_map_by(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11157 = arguments.length;
+var i__7626__auto___11158 = (0);
+while(true){
+if((i__7626__auto___11158 < len__7625__auto___11157)){
+args__7632__auto__.push((arguments[i__7626__auto___11158]));
+
+var G__11159 = (i__7626__auto___11158 + (1));
+i__7626__auto___11158 = G__11159;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((1) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((1)),(0),null)):null);
+return cljs.core.sorted_map_by.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7633__auto__);
+});
+
+cljs.core.sorted_map_by.cljs$core$IFn$_invoke$arity$variadic = (function (comparator,keyvals){
+var in$ = cljs.core.seq(keyvals);
+var out = (new cljs.core.PersistentTreeMap(cljs.core.fn__GT_comparator(comparator),null,(0),null,(0)));
+while(true){
+if(in$){
+var G__11160 = cljs.core.nnext(in$);
+var G__11161 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(out,cljs.core.first(in$),cljs.core.second(in$));
+in$ = G__11160;
+out = G__11161;
+continue;
+} else {
+return out;
+}
+break;
+}
+});
+
+cljs.core.sorted_map_by.cljs$lang$maxFixedArity = (1);
+
+cljs.core.sorted_map_by.cljs$lang$applyTo = (function (seq11155){
+var G__11156 = cljs.core.first(seq11155);
+var seq11155__$1 = cljs.core.next(seq11155);
+return cljs.core.sorted_map_by.cljs$core$IFn$_invoke$arity$variadic(G__11156,seq11155__$1);
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.KeySeq = (function (mseq,_meta){
+this.mseq = mseq;
+this._meta = _meta;
+this.cljs$lang$protocol_mask$partition0$ = 32374988;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.KeySeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.KeySeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.KeySeq.prototype.indexOf = (function() {
+var G__11164 = null;
+var G__11164__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11164__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11164 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11164__1.call(this,x);
+case 2:
+return G__11164__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11164.cljs$core$IFn$_invoke$arity$1 = G__11164__1;
+G__11164.cljs$core$IFn$_invoke$arity$2 = G__11164__2;
+return G__11164;
+})()
+;
+
+cljs.core.KeySeq.prototype.lastIndexOf = (function() {
+var G__11165 = null;
+var G__11165__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11165__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11165 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11165__1.call(this,x);
+case 2:
+return G__11165__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11165.cljs$core$IFn$_invoke$arity$1 = G__11165__1;
+G__11165.cljs$core$IFn$_invoke$arity$2 = G__11165__2;
+return G__11165;
+})()
+;
+
+cljs.core.KeySeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__._meta;
+});
+
+cljs.core.KeySeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var nseq = ((((!((self__.mseq == null)))?((((self__.mseq.cljs$lang$protocol_mask$partition0$ & (128))) || ((cljs.core.PROTOCOL_SENTINEL === self__.mseq.cljs$core$INext$)))?true:(((!self__.mseq.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq):false)):cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq)))?self__.mseq.cljs$core$INext$_next$arity$1(null):cljs.core.next(self__.mseq));
+if((nseq == null)){
+return null;
+} else {
+return (new cljs.core.KeySeq(nseq,self__._meta));
+}
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.hash_ordered_coll(coll__$1);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__._meta);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var me = self__.mseq.cljs$core$ISeq$_first$arity$1(null);
+return me.cljs$core$IMapEntry$_key$arity$1(null);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var nseq = ((((!((self__.mseq == null)))?((((self__.mseq.cljs$lang$protocol_mask$partition0$ & (128))) || ((cljs.core.PROTOCOL_SENTINEL === self__.mseq.cljs$core$INext$)))?true:(((!self__.mseq.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq):false)):cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq)))?self__.mseq.cljs$core$INext$_next$arity$1(null):cljs.core.next(self__.mseq));
+if(!((nseq == null))){
+return (new cljs.core.KeySeq(nseq,self__._meta));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.KeySeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,new_meta){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.KeySeq(self__.mseq,new_meta));
+});
+
+cljs.core.KeySeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.KeySeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"mseq","mseq",1602647196,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"not-native","not-native",-236392494,null)], null)),new cljs.core.Symbol(null,"_meta","_meta",-1716892533,null)], null);
+});
+
+cljs.core.KeySeq.cljs$lang$type = true;
+
+cljs.core.KeySeq.cljs$lang$ctorStr = "cljs.core/KeySeq";
+
+cljs.core.KeySeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/KeySeq");
+});
+
+cljs.core.__GT_KeySeq = (function cljs$core$__GT_KeySeq(mseq,_meta){
+return (new cljs.core.KeySeq(mseq,_meta));
+});
+
+(cljs.core.KeySeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+/**
+ * Returns a sequence of the map's keys.
+ */
+cljs.core.keys = (function cljs$core$keys(hash_map){
+var temp__4657__auto__ = cljs.core.seq(hash_map);
+if(temp__4657__auto__){
+var mseq = temp__4657__auto__;
+return (new cljs.core.KeySeq(mseq,null));
+} else {
+return null;
+}
+});
+/**
+ * Returns the key of the map entry.
+ */
+cljs.core.key = (function cljs$core$key(map_entry){
+return cljs.core._key(map_entry);
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.ValSeq = (function (mseq,_meta){
+this.mseq = mseq;
+this._meta = _meta;
+this.cljs$lang$protocol_mask$partition0$ = 32374988;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.ValSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.ValSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.ValSeq.prototype.indexOf = (function() {
+var G__11168 = null;
+var G__11168__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11168__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11168 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11168__1.call(this,x);
+case 2:
+return G__11168__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11168.cljs$core$IFn$_invoke$arity$1 = G__11168__1;
+G__11168.cljs$core$IFn$_invoke$arity$2 = G__11168__2;
+return G__11168;
+})()
+;
+
+cljs.core.ValSeq.prototype.lastIndexOf = (function() {
+var G__11169 = null;
+var G__11169__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11169__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11169 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11169__1.call(this,x);
+case 2:
+return G__11169__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11169.cljs$core$IFn$_invoke$arity$1 = G__11169__1;
+G__11169.cljs$core$IFn$_invoke$arity$2 = G__11169__2;
+return G__11169;
+})()
+;
+
+cljs.core.ValSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__._meta;
+});
+
+cljs.core.ValSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var nseq = ((((!((self__.mseq == null)))?((((self__.mseq.cljs$lang$protocol_mask$partition0$ & (128))) || ((cljs.core.PROTOCOL_SENTINEL === self__.mseq.cljs$core$INext$)))?true:(((!self__.mseq.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq):false)):cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq)))?self__.mseq.cljs$core$INext$_next$arity$1(null):cljs.core.next(self__.mseq));
+if((nseq == null)){
+return null;
+} else {
+return (new cljs.core.ValSeq(nseq,self__._meta));
+}
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.hash_ordered_coll(coll__$1);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__._meta);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var me = self__.mseq.cljs$core$ISeq$_first$arity$1(null);
+return me.cljs$core$IMapEntry$_val$arity$1(null);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var nseq = ((((!((self__.mseq == null)))?((((self__.mseq.cljs$lang$protocol_mask$partition0$ & (128))) || ((cljs.core.PROTOCOL_SENTINEL === self__.mseq.cljs$core$INext$)))?true:(((!self__.mseq.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq):false)):cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq)))?self__.mseq.cljs$core$INext$_next$arity$1(null):cljs.core.next(self__.mseq));
+if(!((nseq == null))){
+return (new cljs.core.ValSeq(nseq,self__._meta));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.ValSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,new_meta){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.ValSeq(self__.mseq,new_meta));
+});
+
+cljs.core.ValSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.ValSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"mseq","mseq",1602647196,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"not-native","not-native",-236392494,null)], null)),new cljs.core.Symbol(null,"_meta","_meta",-1716892533,null)], null);
+});
+
+cljs.core.ValSeq.cljs$lang$type = true;
+
+cljs.core.ValSeq.cljs$lang$ctorStr = "cljs.core/ValSeq";
+
+cljs.core.ValSeq.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ValSeq");
+});
+
+cljs.core.__GT_ValSeq = (function cljs$core$__GT_ValSeq(mseq,_meta){
+return (new cljs.core.ValSeq(mseq,_meta));
+});
+
+(cljs.core.ValSeq.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+/**
+ * Returns a sequence of the map's values.
+ */
+cljs.core.vals = (function cljs$core$vals(hash_map){
+var temp__4657__auto__ = cljs.core.seq(hash_map);
+if(temp__4657__auto__){
+var mseq = temp__4657__auto__;
+return (new cljs.core.ValSeq(mseq,null));
+} else {
+return null;
+}
+});
+/**
+ * Returns the value in the map entry.
+ */
+cljs.core.val = (function cljs$core$val(map_entry){
+return cljs.core._val(map_entry);
+});
+/**
+ * Returns a map that consists of the rest of the maps conj-ed onto
+ * the first. If a key occurs in more than one map, the mapping from
+ * the latter (left-to-right) will be the mapping in the result.
+ */
+cljs.core.merge = (function cljs$core$merge(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11173 = arguments.length;
+var i__7626__auto___11174 = (0);
+while(true){
+if((i__7626__auto___11174 < len__7625__auto___11173)){
+args__7632__auto__.push((arguments[i__7626__auto___11174]));
+
+var G__11175 = (i__7626__auto___11174 + (1));
+i__7626__auto___11174 = G__11175;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.merge.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.merge.cljs$core$IFn$_invoke$arity$variadic = (function (maps){
+if(cljs.core.truth_(cljs.core.some(cljs.core.identity,maps))){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$2((function (p1__11170_SHARP_,p2__11171_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2((function (){var or__6512__auto__ = p1__11170_SHARP_;
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return cljs.core.PersistentArrayMap.EMPTY;
+}
+})(),p2__11171_SHARP_);
+}),maps);
+} else {
+return null;
+}
+});
+
+cljs.core.merge.cljs$lang$maxFixedArity = (0);
+
+cljs.core.merge.cljs$lang$applyTo = (function (seq11172){
+return cljs.core.merge.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11172));
+});
+
+/**
+ * Returns a map that consists of the rest of the maps conj-ed onto
+ * the first. If a key occurs in more than one map, the mapping(s)
+ * from the latter (left-to-right) will be combined with the mapping in
+ * the result by calling (f val-in-result val-in-latter).
+ */
+cljs.core.merge_with = (function cljs$core$merge_with(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11180 = arguments.length;
+var i__7626__auto___11181 = (0);
+while(true){
+if((i__7626__auto___11181 < len__7625__auto___11180)){
+args__7632__auto__.push((arguments[i__7626__auto___11181]));
+
+var G__11182 = (i__7626__auto___11181 + (1));
+i__7626__auto___11181 = G__11182;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((1) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((1)),(0),null)):null);
+return cljs.core.merge_with.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7633__auto__);
+});
+
+cljs.core.merge_with.cljs$core$IFn$_invoke$arity$variadic = (function (f,maps){
+if(cljs.core.truth_(cljs.core.some(cljs.core.identity,maps))){
+var merge_entry = (function (m,e){
+var k = cljs.core.first(e);
+var v = cljs.core.second(e);
+if(cljs.core.contains_QMARK_(m,k)){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__11178 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__11179 = v;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11178,G__11179) : f.call(null,G__11178,G__11179));
+})());
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,v);
+}
+});
+var merge2 = ((function (merge_entry){
+return (function (m1,m2){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(merge_entry,(function (){var or__6512__auto__ = m1;
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return cljs.core.PersistentArrayMap.EMPTY;
+}
+})(),cljs.core.seq(m2));
+});})(merge_entry))
+;
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$2(merge2,maps);
+} else {
+return null;
+}
+});
+
+cljs.core.merge_with.cljs$lang$maxFixedArity = (1);
+
+cljs.core.merge_with.cljs$lang$applyTo = (function (seq11176){
+var G__11177 = cljs.core.first(seq11176);
+var seq11176__$1 = cljs.core.next(seq11176);
+return cljs.core.merge_with.cljs$core$IFn$_invoke$arity$variadic(G__11177,seq11176__$1);
+});
+
+/**
+ * Returns a map containing only those entries in map whose key is in keys
+ */
+cljs.core.select_keys = (function cljs$core$select_keys(map,keyseq){
+var ret = cljs.core.PersistentArrayMap.EMPTY;
+var keys = cljs.core.seq(keyseq);
+while(true){
+if(keys){
+var key = cljs.core.first(keys);
+var entry = cljs.core.get.cljs$core$IFn$_invoke$arity$3(map,key,new cljs.core.Keyword("cljs.core","not-found","cljs.core/not-found",-1572889185));
+var G__11183 = ((cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(entry,new cljs.core.Keyword("cljs.core","not-found","cljs.core/not-found",-1572889185)))?cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(ret,key,entry):ret);
+var G__11184 = cljs.core.next(keys);
+ret = G__11183;
+keys = G__11184;
+continue;
+} else {
+return cljs.core.with_meta(ret,cljs.core.meta(map));
+}
+break;
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.HashSetIter = (function (iter){
+this.iter = iter;
+})
+cljs.core.HashSetIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return self__.iter.hasNext();
+});
+
+cljs.core.HashSetIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if(self__.iter.hasNext()){
+return (self__.iter.next().tail[(0)]);
+} else {
+throw (new Error("No such element"));
+}
+});
+
+cljs.core.HashSetIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.HashSetIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"iter","iter",-1346195486,null)], null);
+});
+
+cljs.core.HashSetIter.cljs$lang$type = true;
+
+cljs.core.HashSetIter.cljs$lang$ctorStr = "cljs.core/HashSetIter";
+
+cljs.core.HashSetIter.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/HashSetIter");
+});
+
+cljs.core.__GT_HashSetIter = (function cljs$core$__GT_HashSetIter(iter){
+return (new cljs.core.HashSetIter(iter));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEditableCollection}
+ * @implements {cljs.core.ISet}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.PersistentHashSet = (function (meta,hash_map,__hash){
+this.meta = meta;
+this.hash_map = hash_map;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 15077647;
+this.cljs$lang$protocol_mask$partition1$ = 8196;
+})
+cljs.core.PersistentHashSet.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentHashSet.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentHashSet.prototype.keys = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentHashSet.prototype.entries = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_set_entries_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentHashSet.prototype.values = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentHashSet.prototype.has = (function (k){
+var self__ = this;
+var coll = this;
+return cljs.core.contains_QMARK_(coll,k);
+});
+
+cljs.core.PersistentHashSet.prototype.forEach = (function (f){
+var self__ = this;
+var coll = this;
+var seq__11187 = cljs.core.seq(coll);
+var chunk__11188 = null;
+var count__11189 = (0);
+var i__11190 = (0);
+while(true){
+if((i__11190 < count__11189)){
+var vec__11191 = chunk__11188.cljs$core$IIndexed$_nth$arity$2(null,i__11190);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11191,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11191,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+var G__11197 = seq__11187;
+var G__11198 = chunk__11188;
+var G__11199 = count__11189;
+var G__11200 = (i__11190 + (1));
+seq__11187 = G__11197;
+chunk__11188 = G__11198;
+count__11189 = G__11199;
+i__11190 = G__11200;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__11187);
+if(temp__4657__auto__){
+var seq__11187__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__11187__$1)){
+var c__7331__auto__ = cljs.core.chunk_first(seq__11187__$1);
+var G__11201 = cljs.core.chunk_rest(seq__11187__$1);
+var G__11202 = c__7331__auto__;
+var G__11203 = cljs.core.count(c__7331__auto__);
+var G__11204 = (0);
+seq__11187 = G__11201;
+chunk__11188 = G__11202;
+count__11189 = G__11203;
+i__11190 = G__11204;
+continue;
+} else {
+var vec__11194 = cljs.core.first(seq__11187__$1);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11194,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11194,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+var G__11205 = cljs.core.next(seq__11187__$1);
+var G__11206 = null;
+var G__11207 = (0);
+var G__11208 = (0);
+seq__11187 = G__11205;
+chunk__11188 = G__11206;
+count__11189 = G__11207;
+i__11190 = G__11208;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,v){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,v,null);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,v,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core._contains_key_QMARK_(self__.hash_map,v)){
+return v;
+} else {
+return not_found;
+}
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.HashSetIter(cljs.core._iterator(self__.hash_map)));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentHashSet(self__.meta,self__.hash_map,self__.__hash));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._count(self__.hash_map);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.set_QMARK_(other)) && ((cljs.core.count(coll__$1) === cljs.core.count(other))) && (cljs.core.every_QMARK_(((function (coll__$1){
+return (function (p1__11185_SHARP_){
+return cljs.core.contains_QMARK_(coll__$1,p1__11185_SHARP_);
+});})(coll__$1))
+,other));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IEditableCollection$_as_transient$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.TransientHashSet(cljs.core._as_transient(self__.hash_map)));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.with_meta(cljs.core.PersistentHashSet.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ISet$_disjoin$arity$2 = (function (coll,v){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentHashSet(self__.meta,cljs.core._dissoc(self__.hash_map,v),null));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.keys(self__.hash_map);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentHashSet(meta__$1,self__.hash_map,self__.__hash));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentHashSet(self__.meta,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(self__.hash_map,o,null),null));
+});
+
+cljs.core.PersistentHashSet.prototype.call = (function() {
+var G__11209 = null;
+var G__11209__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__11209__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__11209 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11209__2.call(this,self__,k);
+case 3:
+return G__11209__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11209.cljs$core$IFn$_invoke$arity$2 = G__11209__2;
+G__11209.cljs$core$IFn$_invoke$arity$3 = G__11209__3;
+return G__11209;
+})()
+;
+
+cljs.core.PersistentHashSet.prototype.apply = (function (self__,args11186){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11186)));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentHashSet.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"hash-map","hash-map",-439030950,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentHashSet.cljs$lang$type = true;
+
+cljs.core.PersistentHashSet.cljs$lang$ctorStr = "cljs.core/PersistentHashSet";
+
+cljs.core.PersistentHashSet.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentHashSet");
+});
+
+cljs.core.__GT_PersistentHashSet = (function cljs$core$__GT_PersistentHashSet(meta,hash_map,__hash){
+return (new cljs.core.PersistentHashSet(meta,hash_map,__hash));
+});
+
+cljs.core.PersistentHashSet.EMPTY = (new cljs.core.PersistentHashSet(null,cljs.core.PersistentArrayMap.EMPTY,cljs.core.empty_unordered_hash));
+cljs.core.PersistentHashSet.fromArray = (function (items,no_clone){
+var len = items.length;
+if((len <= cljs.core.PersistentArrayMap.HASHMAP_THRESHOLD)){
+var arr = ((no_clone)?items:cljs.core.aclone(items));
+var i = (0);
+var out = cljs.core.transient$(cljs.core.PersistentArrayMap.EMPTY);
+while(true){
+if((i < len)){
+var G__11210 = (i + (1));
+var G__11211 = cljs.core._assoc_BANG_(out,(items[i]),null);
+i = G__11210;
+out = G__11211;
+continue;
+} else {
+return (new cljs.core.PersistentHashSet(null,cljs.core._persistent_BANG_(out),null));
+}
+break;
+}
+} else {
+var i = (0);
+var out = cljs.core.transient$(cljs.core.PersistentHashSet.EMPTY);
+while(true){
+if((i < len)){
+var G__11212 = (i + (1));
+var G__11213 = cljs.core._conj_BANG_(out,(items[i]));
+i = G__11212;
+out = G__11213;
+continue;
+} else {
+return cljs.core._persistent_BANG_(out);
+}
+break;
+}
+}
+});
+cljs.core.PersistentHashSet.createWithCheck = (function (items){
+var len = items.length;
+var t = cljs.core._as_transient(cljs.core.PersistentHashSet.EMPTY);
+var n__7435__auto___11214 = len;
+var i_11215 = (0);
+while(true){
+if((i_11215 < n__7435__auto___11214)){
+cljs.core._conj_BANG_(t,(items[i_11215]));
+
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.count(t),(i_11215 + (1)))){
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Duplicate key: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1((items[i_11215]))].join('')));
+}
+
+var G__11216 = (i_11215 + (1));
+i_11215 = G__11216;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core._persistent_BANG_(t);
+});
+cljs.core.PersistentHashSet.createAsIfByAssoc = (function (items){
+var len = items.length;
+var t = cljs.core._as_transient(cljs.core.PersistentHashSet.EMPTY);
+var n__7435__auto___11217 = len;
+var i_11218 = (0);
+while(true){
+if((i_11218 < n__7435__auto___11217)){
+cljs.core._conj_BANG_(t,(items[i_11218]));
+
+var G__11219 = (i_11218 + (1));
+i_11218 = G__11219;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core._persistent_BANG_(t);
+});
+(cljs.core.PersistentHashSet.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+
+/**
+* @constructor
+ * @implements {cljs.core.ITransientSet}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ITransientCollection}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.TransientHashSet = (function (transient_map){
+this.transient_map = transient_map;
+this.cljs$lang$protocol_mask$partition1$ = 136;
+this.cljs$lang$protocol_mask$partition0$ = 259;
+})
+cljs.core.TransientHashSet.prototype.cljs$core$ITransientCollection$_conj_BANG_$arity$2 = (function (tcoll,o){
+var self__ = this;
+var tcoll__$1 = this;
+self__.transient_map = cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(self__.transient_map,o,null);
+
+return tcoll__$1;
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$ITransientCollection$_persistent_BANG_$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+return (new cljs.core.PersistentHashSet(null,cljs.core.persistent_BANG_(self__.transient_map),null));
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$ITransientSet$_disjoin_BANG_$arity$2 = (function (tcoll,v){
+var self__ = this;
+var tcoll__$1 = this;
+self__.transient_map = cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$2(self__.transient_map,v);
+
+return tcoll__$1;
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$ICounted$_count$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+return cljs.core.count(self__.transient_map);
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (tcoll,v){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.cljs$core$ILookup$_lookup$arity$3(null,v,null);
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (tcoll,v,not_found){
+var self__ = this;
+var tcoll__$1 = this;
+if((cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(self__.transient_map,v,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return not_found;
+} else {
+return v;
+}
+});
+
+cljs.core.TransientHashSet.prototype.call = (function() {
+var G__11221 = null;
+var G__11221__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var tcoll = self____$1;
+if((cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(self__.transient_map,k,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return null;
+} else {
+return k;
+}
+});
+var G__11221__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var tcoll = self____$1;
+if((cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(self__.transient_map,k,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return not_found;
+} else {
+return k;
+}
+});
+G__11221 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11221__2.call(this,self__,k);
+case 3:
+return G__11221__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11221.cljs$core$IFn$_invoke$arity$2 = G__11221__2;
+G__11221.cljs$core$IFn$_invoke$arity$3 = G__11221__3;
+return G__11221;
+})()
+;
+
+cljs.core.TransientHashSet.prototype.apply = (function (self__,args11220){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11220)));
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var tcoll = this;
+if((cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(self__.transient_map,k,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return null;
+} else {
+return k;
+}
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var tcoll = this;
+if((cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(self__.transient_map,k,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return not_found;
+} else {
+return k;
+}
+});
+
+cljs.core.TransientHashSet.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"transient-map","transient-map",351764893,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.TransientHashSet.cljs$lang$type = true;
+
+cljs.core.TransientHashSet.cljs$lang$ctorStr = "cljs.core/TransientHashSet";
+
+cljs.core.TransientHashSet.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/TransientHashSet");
+});
+
+cljs.core.__GT_TransientHashSet = (function cljs$core$__GT_TransientHashSet(transient_map){
+return (new cljs.core.TransientHashSet(transient_map));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.ISet}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISorted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.PersistentTreeSet = (function (meta,tree_map,__hash){
+this.meta = meta;
+this.tree_map = tree_map;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 417730831;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+})
+cljs.core.PersistentTreeSet.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentTreeSet.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentTreeSet.prototype.keys = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentTreeSet.prototype.entries = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_set_entries_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentTreeSet.prototype.values = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentTreeSet.prototype.has = (function (k){
+var self__ = this;
+var coll = this;
+return cljs.core.contains_QMARK_(coll,k);
+});
+
+cljs.core.PersistentTreeSet.prototype.forEach = (function (f){
+var self__ = this;
+var coll = this;
+var seq__11224 = cljs.core.seq(coll);
+var chunk__11225 = null;
+var count__11226 = (0);
+var i__11227 = (0);
+while(true){
+if((i__11227 < count__11226)){
+var vec__11228 = chunk__11225.cljs$core$IIndexed$_nth$arity$2(null,i__11227);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11228,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11228,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+var G__11234 = seq__11224;
+var G__11235 = chunk__11225;
+var G__11236 = count__11226;
+var G__11237 = (i__11227 + (1));
+seq__11224 = G__11234;
+chunk__11225 = G__11235;
+count__11226 = G__11236;
+i__11227 = G__11237;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__11224);
+if(temp__4657__auto__){
+var seq__11224__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__11224__$1)){
+var c__7331__auto__ = cljs.core.chunk_first(seq__11224__$1);
+var G__11238 = cljs.core.chunk_rest(seq__11224__$1);
+var G__11239 = c__7331__auto__;
+var G__11240 = cljs.core.count(c__7331__auto__);
+var G__11241 = (0);
+seq__11224 = G__11238;
+chunk__11225 = G__11239;
+count__11226 = G__11240;
+i__11227 = G__11241;
+continue;
+} else {
+var vec__11231 = cljs.core.first(seq__11224__$1);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11231,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11231,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+var G__11242 = cljs.core.next(seq__11224__$1);
+var G__11243 = null;
+var G__11244 = (0);
+var G__11245 = (0);
+seq__11224 = G__11242;
+chunk__11225 = G__11243;
+count__11226 = G__11244;
+i__11227 = G__11245;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,v){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,v,null);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,v,not_found){
+var self__ = this;
+var coll__$1 = this;
+var n = self__.tree_map.entry_at(v);
+if(!((n == null))){
+return n.key;
+} else {
+return not_found;
+}
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentTreeSet(self__.meta,self__.tree_map,self__.__hash));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.count(self__.tree_map);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((cljs.core.count(self__.tree_map) > (0))){
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.key,cljs.core.rseq(self__.tree_map));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.set_QMARK_(other)) && ((cljs.core.count(coll__$1) === cljs.core.count(other))) && (cljs.core.every_QMARK_(((function (coll__$1){
+return (function (p1__11222_SHARP_){
+return cljs.core.contains_QMARK_(coll__$1,p1__11222_SHARP_);
+});})(coll__$1))
+,other));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeSet(self__.meta,cljs.core._empty(self__.tree_map),(0)));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISet$_disjoin$arity$2 = (function (coll,v){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeSet(self__.meta,cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2(self__.tree_map,v),null));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.keys(self__.tree_map);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeSet(meta__$1,self__.tree_map,self__.__hash));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeSet(self__.meta,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(self__.tree_map,o,null),null));
+});
+
+cljs.core.PersistentTreeSet.prototype.call = (function() {
+var G__11246 = null;
+var G__11246__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__11246__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__11246 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11246__2.call(this,self__,k);
+case 3:
+return G__11246__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11246.cljs$core$IFn$_invoke$arity$2 = G__11246__2;
+G__11246.cljs$core$IFn$_invoke$arity$3 = G__11246__3;
+return G__11246;
+})()
+;
+
+cljs.core.PersistentTreeSet.prototype.apply = (function (self__,args11223){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11223)));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISorted$_sorted_seq$arity$2 = (function (coll,ascending_QMARK_){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.key,cljs.core._sorted_seq(self__.tree_map,ascending_QMARK_));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISorted$_sorted_seq_from$arity$3 = (function (coll,k,ascending_QMARK_){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.key,cljs.core._sorted_seq_from(self__.tree_map,k,ascending_QMARK_));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISorted$_entry_key$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+return entry;
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISorted$_comparator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._comparator(self__.tree_map);
+});
+
+cljs.core.PersistentTreeSet.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"tree-map","tree-map",1373073049,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentTreeSet.cljs$lang$type = true;
+
+cljs.core.PersistentTreeSet.cljs$lang$ctorStr = "cljs.core/PersistentTreeSet";
+
+cljs.core.PersistentTreeSet.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/PersistentTreeSet");
+});
+
+cljs.core.__GT_PersistentTreeSet = (function cljs$core$__GT_PersistentTreeSet(meta,tree_map,__hash){
+return (new cljs.core.PersistentTreeSet(meta,tree_map,__hash));
+});
+
+cljs.core.PersistentTreeSet.EMPTY = (new cljs.core.PersistentTreeSet(null,cljs.core.PersistentTreeMap.EMPTY,cljs.core.empty_unordered_hash));
+(cljs.core.PersistentTreeSet.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+cljs.core.set_from_indexed_seq = (function cljs$core$set_from_indexed_seq(iseq){
+var arr = iseq.arr;
+var ret = (function (){var a__7429__auto__ = arr;
+var i = (0);
+var res = cljs.core._as_transient(cljs.core.PersistentHashSet.EMPTY);
+while(true){
+if((i < a__7429__auto__.length)){
+var G__11247 = (i + (1));
+var G__11248 = res.cljs$core$ITransientCollection$_conj_BANG_$arity$2(null,(arr[i]));
+i = G__11247;
+res = G__11248;
+continue;
+} else {
+return res;
+}
+break;
+}
+})();
+return ret.cljs$core$ITransientCollection$_persistent_BANG_$arity$1(null);
+});
+/**
+ * Returns a set of the distinct elements of coll.
+ */
+cljs.core.set = (function cljs$core$set(coll){
+var in$ = cljs.core.seq(coll);
+if((in$ == null)){
+return cljs.core.PersistentHashSet.EMPTY;
+} else {
+if(((in$ instanceof cljs.core.IndexedSeq)) && ((in$.i === (0)))){
+return cljs.core.PersistentHashSet.createAsIfByAssoc(in$.arr);
+} else {
+var in$__$1 = in$;
+var out = cljs.core._as_transient(cljs.core.PersistentHashSet.EMPTY);
+while(true){
+if(!((in$__$1 == null))){
+var G__11249 = cljs.core.next(in$__$1);
+var G__11250 = out.cljs$core$ITransientCollection$_conj_BANG_$arity$2(null,in$__$1.cljs$core$ISeq$_first$arity$1(null));
+in$__$1 = G__11249;
+out = G__11250;
+continue;
+} else {
+return cljs.core.persistent_BANG_(out);
+}
+break;
+}
+
+}
+}
+});
+/**
+ * Returns a new hash set with supplied keys. Any equal keys are
+ * handled as if by repeated uses of conj.
+ */
+cljs.core.hash_set = (function cljs$core$hash_set(var_args){
+var args11251 = [];
+var len__7625__auto___11255 = arguments.length;
+var i__7626__auto___11256 = (0);
+while(true){
+if((i__7626__auto___11256 < len__7625__auto___11255)){
+args11251.push((arguments[i__7626__auto___11256]));
+
+var G__11257 = (i__7626__auto___11256 + (1));
+i__7626__auto___11256 = G__11257;
+continue;
+} else {
+}
+break;
+}
+
+var G__11254 = args11251.length;
+switch (G__11254) {
+case 0:
+return cljs.core.hash_set.cljs$core$IFn$_invoke$arity$0();
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args11251.slice((0)),(0),null));
+return cljs.core.hash_set.cljs$core$IFn$_invoke$arity$variadic(argseq__7644__auto__);
+
+}
+});
+
+cljs.core.hash_set.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.PersistentHashSet.EMPTY;
+});
+
+cljs.core.hash_set.cljs$core$IFn$_invoke$arity$variadic = (function (keys){
+return cljs.core.set(keys);
+});
+
+cljs.core.hash_set.cljs$lang$applyTo = (function (seq11252){
+return cljs.core.hash_set.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11252));
+});
+
+cljs.core.hash_set.cljs$lang$maxFixedArity = (0);
+
+/**
+ * Returns a new sorted set with supplied keys.
+ */
+cljs.core.sorted_set = (function cljs$core$sorted_set(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11260 = arguments.length;
+var i__7626__auto___11261 = (0);
+while(true){
+if((i__7626__auto___11261 < len__7625__auto___11260)){
+args__7632__auto__.push((arguments[i__7626__auto___11261]));
+
+var G__11262 = (i__7626__auto___11261 + (1));
+i__7626__auto___11261 = G__11262;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.sorted_set.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.sorted_set.cljs$core$IFn$_invoke$arity$variadic = (function (keys){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj,cljs.core.PersistentTreeSet.EMPTY,keys);
+});
+
+cljs.core.sorted_set.cljs$lang$maxFixedArity = (0);
+
+cljs.core.sorted_set.cljs$lang$applyTo = (function (seq11259){
+return cljs.core.sorted_set.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11259));
+});
+
+/**
+ * Returns a new sorted set with supplied keys, using the supplied comparator.
+ */
+cljs.core.sorted_set_by = (function cljs$core$sorted_set_by(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11265 = arguments.length;
+var i__7626__auto___11266 = (0);
+while(true){
+if((i__7626__auto___11266 < len__7625__auto___11265)){
+args__7632__auto__.push((arguments[i__7626__auto___11266]));
+
+var G__11267 = (i__7626__auto___11266 + (1));
+i__7626__auto___11266 = G__11267;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((1) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((1)),(0),null)):null);
+return cljs.core.sorted_set_by.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7633__auto__);
+});
+
+cljs.core.sorted_set_by.cljs$core$IFn$_invoke$arity$variadic = (function (comparator,keys){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj,(new cljs.core.PersistentTreeSet(null,cljs.core.sorted_map_by(comparator),(0))),keys);
+});
+
+cljs.core.sorted_set_by.cljs$lang$maxFixedArity = (1);
+
+cljs.core.sorted_set_by.cljs$lang$applyTo = (function (seq11263){
+var G__11264 = cljs.core.first(seq11263);
+var seq11263__$1 = cljs.core.next(seq11263);
+return cljs.core.sorted_set_by.cljs$core$IFn$_invoke$arity$variadic(G__11264,seq11263__$1);
+});
+
+/**
+ * Given a map of replacement pairs and a vector/collection, returns a
+ * vector/seq with any elements = a key in smap replaced with the
+ * corresponding val in smap. Returns a transducer when no collection
+ * is provided.
+ */
+cljs.core.replace = (function cljs$core$replace(var_args){
+var args11270 = [];
+var len__7625__auto___11273 = arguments.length;
+var i__7626__auto___11274 = (0);
+while(true){
+if((i__7626__auto___11274 < len__7625__auto___11273)){
+args11270.push((arguments[i__7626__auto___11274]));
+
+var G__11275 = (i__7626__auto___11274 + (1));
+i__7626__auto___11274 = G__11275;
+continue;
+} else {
+}
+break;
+}
+
+var G__11272 = args11270.length;
+switch (G__11272) {
+case 1:
+return cljs.core.replace.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.replace.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11270.length)].join('')));
+
+}
+});
+
+cljs.core.replace.cljs$core$IFn$_invoke$arity$1 = (function (smap){
+return cljs.core.map.cljs$core$IFn$_invoke$arity$1((function (p1__11268_SHARP_){
+var temp__4655__auto__ = cljs.core.find(smap,p1__11268_SHARP_);
+if(cljs.core.truth_(temp__4655__auto__)){
+var e = temp__4655__auto__;
+return cljs.core.val(e);
+} else {
+return p1__11268_SHARP_;
+}
+}));
+});
+
+cljs.core.replace.cljs$core$IFn$_invoke$arity$2 = (function (smap,coll){
+if(cljs.core.vector_QMARK_(coll)){
+var n = cljs.core.count(coll);
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (n){
+return (function (v,i){
+var temp__4655__auto__ = cljs.core.find(smap,cljs.core.nth.cljs$core$IFn$_invoke$arity$2(v,i));
+if(cljs.core.truth_(temp__4655__auto__)){
+var e = temp__4655__auto__;
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(v,i,cljs.core.second(e));
+} else {
+return v;
+}
+});})(n))
+,coll,cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,cljs.core.iterate(cljs.core.inc,(0))));
+} else {
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2((function (p1__11269_SHARP_){
+var temp__4655__auto__ = cljs.core.find(smap,p1__11269_SHARP_);
+if(cljs.core.truth_(temp__4655__auto__)){
+var e = temp__4655__auto__;
+return cljs.core.second(e);
+} else {
+return p1__11269_SHARP_;
+}
+}),coll);
+}
+});
+
+cljs.core.replace.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of the elements of coll with duplicates removed.
+ * Returns a stateful transducer when no collection is provided.
+ */
+cljs.core.distinct = (function cljs$core$distinct(var_args){
+var args11277 = [];
+var len__7625__auto___11290 = arguments.length;
+var i__7626__auto___11291 = (0);
+while(true){
+if((i__7626__auto___11291 < len__7625__auto___11290)){
+args11277.push((arguments[i__7626__auto___11291]));
+
+var G__11292 = (i__7626__auto___11291 + (1));
+i__7626__auto___11291 = G__11292;
+continue;
+} else {
+}
+break;
+}
+
+var G__11279 = args11277.length;
+switch (G__11279) {
+case 0:
+return cljs.core.distinct.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.distinct.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11277.length)].join('')));
+
+}
+});
+
+cljs.core.distinct.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (function (rf){
+var seen = cljs.core.volatile_BANG_(cljs.core.PersistentHashSet.EMPTY);
+return ((function (seen){
+return (function() {
+var G__11294 = null;
+var G__11294__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11294__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11294__2 = (function (result,input){
+if(cljs.core.contains_QMARK_((cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(seen) : cljs.core.deref.call(null,seen)),input)){
+return result;
+} else {
+cljs.core._vreset_BANG_(seen,cljs.core.conj.cljs$core$IFn$_invoke$arity$2(cljs.core._deref(seen),input));
+
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__11294 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11294__0.call(this);
+case 1:
+return G__11294__1.call(this,result);
+case 2:
+return G__11294__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11294.cljs$core$IFn$_invoke$arity$0 = G__11294__0;
+G__11294.cljs$core$IFn$_invoke$arity$1 = G__11294__1;
+G__11294.cljs$core$IFn$_invoke$arity$2 = G__11294__2;
+return G__11294;
+})()
+;})(seen))
+});
+});
+
+cljs.core.distinct.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+var step = (function cljs$core$step(xs,seen){
+return (new cljs.core.LazySeq(null,(function (){
+return (function (p__11286,seen__$1){
+while(true){
+var vec__11287 = p__11286;
+var f = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11287,(0),null);
+var xs__$1 = vec__11287;
+var temp__4657__auto__ = cljs.core.seq(xs__$1);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.contains_QMARK_(seen__$1,f)){
+var G__11295 = cljs.core.rest(s);
+var G__11296 = seen__$1;
+p__11286 = G__11295;
+seen__$1 = G__11296;
+continue;
+} else {
+return cljs.core.cons(f,cljs$core$step(cljs.core.rest(s),cljs.core.conj.cljs$core$IFn$_invoke$arity$2(seen__$1,f)));
+}
+} else {
+return null;
+}
+break;
+}
+}).call(null,xs,seen);
+}),null,null));
+});
+return step(coll,cljs.core.PersistentHashSet.EMPTY);
+});
+
+cljs.core.distinct.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Return a seq of all but the last item in coll, in linear time
+ */
+cljs.core.butlast = (function cljs$core$butlast(s){
+var ret = cljs.core.PersistentVector.EMPTY;
+var s__$1 = s;
+while(true){
+if(cljs.core.next(s__$1)){
+var G__11297 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(ret,cljs.core.first(s__$1));
+var G__11298 = cljs.core.next(s__$1);
+ret = G__11297;
+s__$1 = G__11298;
+continue;
+} else {
+return cljs.core.seq(ret);
+}
+break;
+}
+});
+/**
+ * Returns the name String of a string, symbol or keyword.
+ */
+cljs.core.name = (function cljs$core$name(x){
+if(((!((x == null)))?((((x.cljs$lang$protocol_mask$partition1$ & (4096))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$INamed$)))?true:false):false)){
+return x.cljs$core$INamed$_name$arity$1(null);
+} else {
+if(typeof x === 'string'){
+return x;
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Doesn't support name: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(x)].join('')));
+}
+}
+});
+/**
+ * Returns a map with the keys mapped to the corresponding vals.
+ */
+cljs.core.zipmap = (function cljs$core$zipmap(keys,vals){
+var map = cljs.core.transient$(cljs.core.PersistentArrayMap.EMPTY);
+var ks = cljs.core.seq(keys);
+var vs = cljs.core.seq(vals);
+while(true){
+if((ks) && (vs)){
+var G__11301 = cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(map,cljs.core.first(ks),cljs.core.first(vs));
+var G__11302 = cljs.core.next(ks);
+var G__11303 = cljs.core.next(vs);
+map = G__11301;
+ks = G__11302;
+vs = G__11303;
+continue;
+} else {
+return cljs.core.persistent_BANG_(map);
+}
+break;
+}
+});
+/**
+ * Returns the x for which (k x), a number, is greatest.
+ */
+cljs.core.max_key = (function cljs$core$max_key(var_args){
+var args11306 = [];
+var len__7625__auto___11313 = arguments.length;
+var i__7626__auto___11314 = (0);
+while(true){
+if((i__7626__auto___11314 < len__7625__auto___11313)){
+args11306.push((arguments[i__7626__auto___11314]));
+
+var G__11315 = (i__7626__auto___11314 + (1));
+i__7626__auto___11314 = G__11315;
+continue;
+} else {
+}
+break;
+}
+
+var G__11312 = args11306.length;
+switch (G__11312) {
+case 2:
+return cljs.core.max_key.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.max_key.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args11306.slice((3)),(0),null));
+return cljs.core.max_key.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.max_key.cljs$core$IFn$_invoke$arity$2 = (function (k,x){
+return x;
+});
+
+cljs.core.max_key.cljs$core$IFn$_invoke$arity$3 = (function (k,x,y){
+if(((k.cljs$core$IFn$_invoke$arity$1 ? k.cljs$core$IFn$_invoke$arity$1(x) : k.call(null,x)) > (k.cljs$core$IFn$_invoke$arity$1 ? k.cljs$core$IFn$_invoke$arity$1(y) : k.call(null,y)))){
+return x;
+} else {
+return y;
+}
+});
+
+cljs.core.max_key.cljs$core$IFn$_invoke$arity$variadic = (function (k,x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (p1__11304_SHARP_,p2__11305_SHARP_){
+return cljs.core.max_key.cljs$core$IFn$_invoke$arity$3(k,p1__11304_SHARP_,p2__11305_SHARP_);
+}),cljs.core.max_key.cljs$core$IFn$_invoke$arity$3(k,x,y),more);
+});
+
+cljs.core.max_key.cljs$lang$applyTo = (function (seq11307){
+var G__11308 = cljs.core.first(seq11307);
+var seq11307__$1 = cljs.core.next(seq11307);
+var G__11309 = cljs.core.first(seq11307__$1);
+var seq11307__$2 = cljs.core.next(seq11307__$1);
+var G__11310 = cljs.core.first(seq11307__$2);
+var seq11307__$3 = cljs.core.next(seq11307__$2);
+return cljs.core.max_key.cljs$core$IFn$_invoke$arity$variadic(G__11308,G__11309,G__11310,seq11307__$3);
+});
+
+cljs.core.max_key.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Returns the x for which (k x), a number, is least.
+ */
+cljs.core.min_key = (function cljs$core$min_key(var_args){
+var args11319 = [];
+var len__7625__auto___11326 = arguments.length;
+var i__7626__auto___11327 = (0);
+while(true){
+if((i__7626__auto___11327 < len__7625__auto___11326)){
+args11319.push((arguments[i__7626__auto___11327]));
+
+var G__11328 = (i__7626__auto___11327 + (1));
+i__7626__auto___11327 = G__11328;
+continue;
+} else {
+}
+break;
+}
+
+var G__11325 = args11319.length;
+switch (G__11325) {
+case 2:
+return cljs.core.min_key.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.min_key.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args11319.slice((3)),(0),null));
+return cljs.core.min_key.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.min_key.cljs$core$IFn$_invoke$arity$2 = (function (k,x){
+return x;
+});
+
+cljs.core.min_key.cljs$core$IFn$_invoke$arity$3 = (function (k,x,y){
+if(((k.cljs$core$IFn$_invoke$arity$1 ? k.cljs$core$IFn$_invoke$arity$1(x) : k.call(null,x)) < (k.cljs$core$IFn$_invoke$arity$1 ? k.cljs$core$IFn$_invoke$arity$1(y) : k.call(null,y)))){
+return x;
+} else {
+return y;
+}
+});
+
+cljs.core.min_key.cljs$core$IFn$_invoke$arity$variadic = (function (k,x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (p1__11317_SHARP_,p2__11318_SHARP_){
+return cljs.core.min_key.cljs$core$IFn$_invoke$arity$3(k,p1__11317_SHARP_,p2__11318_SHARP_);
+}),cljs.core.min_key.cljs$core$IFn$_invoke$arity$3(k,x,y),more);
+});
+
+cljs.core.min_key.cljs$lang$applyTo = (function (seq11320){
+var G__11321 = cljs.core.first(seq11320);
+var seq11320__$1 = cljs.core.next(seq11320);
+var G__11322 = cljs.core.first(seq11320__$1);
+var seq11320__$2 = cljs.core.next(seq11320__$1);
+var G__11323 = cljs.core.first(seq11320__$2);
+var seq11320__$3 = cljs.core.next(seq11320__$2);
+return cljs.core.min_key.cljs$core$IFn$_invoke$arity$variadic(G__11321,G__11322,G__11323,seq11320__$3);
+});
+
+cljs.core.min_key.cljs$lang$maxFixedArity = (3);
+
+
+/**
+* @constructor
+*/
+cljs.core.ArrayList = (function (arr){
+this.arr = arr;
+})
+cljs.core.ArrayList.prototype.add = (function (x){
+var self__ = this;
+var _ = this;
+return self__.arr.push(x);
+});
+
+cljs.core.ArrayList.prototype.size = (function (){
+var self__ = this;
+var _ = this;
+return self__.arr.length;
+});
+
+cljs.core.ArrayList.prototype.clear = (function (){
+var self__ = this;
+var _ = this;
+return self__.arr = [];
+});
+
+cljs.core.ArrayList.prototype.isEmpty = (function (){
+var self__ = this;
+var _ = this;
+return (self__.arr.length === (0));
+});
+
+cljs.core.ArrayList.prototype.toArray = (function (){
+var self__ = this;
+var _ = this;
+return self__.arr;
+});
+
+cljs.core.ArrayList.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ArrayList.cljs$lang$type = true;
+
+cljs.core.ArrayList.cljs$lang$ctorStr = "cljs.core/ArrayList";
+
+cljs.core.ArrayList.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/ArrayList");
+});
+
+cljs.core.__GT_ArrayList = (function cljs$core$__GT_ArrayList(arr){
+return (new cljs.core.ArrayList(arr));
+});
+
+cljs.core.array_list = (function cljs$core$array_list(){
+return (new cljs.core.ArrayList([]));
+});
+/**
+ * Returns a lazy sequence of lists like partition, but may include
+ * partitions with fewer than n items at the end. Returns a stateful
+ * transducer when no collection is provided.
+ */
+cljs.core.partition_all = (function cljs$core$partition_all(var_args){
+var args11330 = [];
+var len__7625__auto___11333 = arguments.length;
+var i__7626__auto___11334 = (0);
+while(true){
+if((i__7626__auto___11334 < len__7625__auto___11333)){
+args11330.push((arguments[i__7626__auto___11334]));
+
+var G__11335 = (i__7626__auto___11334 + (1));
+i__7626__auto___11334 = G__11335;
+continue;
+} else {
+}
+break;
+}
+
+var G__11332 = args11330.length;
+switch (G__11332) {
+case 1:
+return cljs.core.partition_all.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.partition_all.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.partition_all.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11330.length)].join('')));
+
+}
+});
+
+cljs.core.partition_all.cljs$core$IFn$_invoke$arity$1 = (function (n){
+return (function (rf){
+var a = cljs.core.array_list();
+return ((function (a){
+return (function() {
+var G__11337 = null;
+var G__11337__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11337__1 = (function (result){
+var result__$1 = (cljs.core.truth_(a.isEmpty())?result:(function (){var v = cljs.core.vec(a.toArray());
+a.clear();
+
+return cljs.core.unreduced((rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v)));
+})());
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result__$1) : rf.call(null,result__$1));
+});
+var G__11337__2 = (function (result,input){
+a.add(input);
+
+if((n === a.size())){
+var v = cljs.core.vec(a.toArray());
+a.clear();
+
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v));
+} else {
+return result;
+}
+});
+G__11337 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11337__0.call(this);
+case 1:
+return G__11337__1.call(this,result);
+case 2:
+return G__11337__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11337.cljs$core$IFn$_invoke$arity$0 = G__11337__0;
+G__11337.cljs$core$IFn$_invoke$arity$1 = G__11337__1;
+G__11337.cljs$core$IFn$_invoke$arity$2 = G__11337__2;
+return G__11337;
+})()
+;})(a))
+});
+});
+
+cljs.core.partition_all.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+return cljs.core.partition_all.cljs$core$IFn$_invoke$arity$3(n,n,coll);
+});
+
+cljs.core.partition_all.cljs$core$IFn$_invoke$arity$3 = (function (n,step,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+return cljs.core.cons(cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,s),cljs.core.partition_all.cljs$core$IFn$_invoke$arity$3(n,step,cljs.core.drop.cljs$core$IFn$_invoke$arity$2(step,s)));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.partition_all.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns a lazy sequence of successive items from coll while
+ * (pred item) returns true. pred must be free of side-effects.
+ * Returns a transducer when no collection is provided.
+ */
+cljs.core.take_while = (function cljs$core$take_while(var_args){
+var args11338 = [];
+var len__7625__auto___11342 = arguments.length;
+var i__7626__auto___11343 = (0);
+while(true){
+if((i__7626__auto___11343 < len__7625__auto___11342)){
+args11338.push((arguments[i__7626__auto___11343]));
+
+var G__11344 = (i__7626__auto___11343 + (1));
+i__7626__auto___11343 = G__11344;
+continue;
+} else {
+}
+break;
+}
+
+var G__11340 = args11338.length;
+switch (G__11340) {
+case 1:
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11338.length)].join('')));
+
+}
+});
+
+cljs.core.take_while.cljs$core$IFn$_invoke$arity$1 = (function (pred){
+return (function (rf){
+return (function() {
+var G__11346 = null;
+var G__11346__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11346__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11346__2 = (function (result,input){
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(input) : pred.call(null,input)))){
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+} else {
+return cljs.core.reduced(result);
+}
+});
+G__11346 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11346__0.call(this);
+case 1:
+return G__11346__1.call(this,result);
+case 2:
+return G__11346__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11346.cljs$core$IFn$_invoke$arity$0 = G__11346__0;
+G__11346.cljs$core$IFn$_invoke$arity$1 = G__11346__1;
+G__11346.cljs$core$IFn$_invoke$arity$2 = G__11346__2;
+return G__11346;
+})()
+});
+});
+
+cljs.core.take_while.cljs$core$IFn$_invoke$arity$2 = (function (pred,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.truth_((function (){var G__11341 = cljs.core.first(s);
+return (pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(G__11341) : pred.call(null,G__11341));
+})())){
+return cljs.core.cons(cljs.core.first(s),cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(pred,cljs.core.rest(s)));
+} else {
+return null;
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.take_while.cljs$lang$maxFixedArity = 2;
+
+cljs.core.mk_bound_fn = (function cljs$core$mk_bound_fn(sc,test,key){
+return (function (e){
+var comp = cljs.core._comparator(sc);
+var G__11351 = (function (){var G__11353 = cljs.core._entry_key(sc,e);
+var G__11354 = key;
+return (comp.cljs$core$IFn$_invoke$arity$2 ? comp.cljs$core$IFn$_invoke$arity$2(G__11353,G__11354) : comp.call(null,G__11353,G__11354));
+})();
+var G__11352 = (0);
+return (test.cljs$core$IFn$_invoke$arity$2 ? test.cljs$core$IFn$_invoke$arity$2(G__11351,G__11352) : test.call(null,G__11351,G__11352));
+});
+});
+/**
+ * sc must be a sorted collection, test(s) one of <, <=, > or
+ * >=. Returns a seq of those entries with keys ek for
+ * which (test (.. sc comparator (compare ek key)) 0) is true
+ */
+cljs.core.subseq = (function cljs$core$subseq(var_args){
+var args11355 = [];
+var len__7625__auto___11364 = arguments.length;
+var i__7626__auto___11365 = (0);
+while(true){
+if((i__7626__auto___11365 < len__7625__auto___11364)){
+args11355.push((arguments[i__7626__auto___11365]));
+
+var G__11366 = (i__7626__auto___11365 + (1));
+i__7626__auto___11365 = G__11366;
+continue;
+} else {
+}
+break;
+}
+
+var G__11357 = args11355.length;
+switch (G__11357) {
+case 3:
+return cljs.core.subseq.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 5:
+return cljs.core.subseq.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11355.length)].join('')));
+
+}
+});
+
+cljs.core.subseq.cljs$core$IFn$_invoke$arity$3 = (function (sc,test,key){
+var include = cljs.core.mk_bound_fn(sc,test,key);
+if(cljs.core.truth_(cljs.core.PersistentHashSet.createAsIfByAssoc([cljs.core._GT_,cljs.core._GT__EQ_], true).call(null,test))){
+var temp__4657__auto__ = cljs.core._sorted_seq_from(sc,key,true);
+if(cljs.core.truth_(temp__4657__auto__)){
+var vec__11358 = temp__4657__auto__;
+var e = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11358,(0),null);
+var s = vec__11358;
+if(cljs.core.truth_((include.cljs$core$IFn$_invoke$arity$1 ? include.cljs$core$IFn$_invoke$arity$1(e) : include.call(null,e)))){
+return s;
+} else {
+return cljs.core.next(s);
+}
+} else {
+return null;
+}
+} else {
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(include,cljs.core._sorted_seq(sc,true));
+}
+});
+
+cljs.core.subseq.cljs$core$IFn$_invoke$arity$5 = (function (sc,start_test,start_key,end_test,end_key){
+var temp__4657__auto__ = cljs.core._sorted_seq_from(sc,start_key,true);
+if(cljs.core.truth_(temp__4657__auto__)){
+var vec__11361 = temp__4657__auto__;
+var e = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11361,(0),null);
+var s = vec__11361;
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(cljs.core.mk_bound_fn(sc,end_test,end_key),(cljs.core.truth_(cljs.core.mk_bound_fn(sc,start_test,start_key).call(null,e))?s:cljs.core.next(s)));
+} else {
+return null;
+}
+});
+
+cljs.core.subseq.cljs$lang$maxFixedArity = 5;
+
+/**
+ * sc must be a sorted collection, test(s) one of <, <=, > or
+ * >=. Returns a reverse seq of those entries with keys ek for
+ * which (test (.. sc comparator (compare ek key)) 0) is true
+ */
+cljs.core.rsubseq = (function cljs$core$rsubseq(var_args){
+var args11368 = [];
+var len__7625__auto___11377 = arguments.length;
+var i__7626__auto___11378 = (0);
+while(true){
+if((i__7626__auto___11378 < len__7625__auto___11377)){
+args11368.push((arguments[i__7626__auto___11378]));
+
+var G__11379 = (i__7626__auto___11378 + (1));
+i__7626__auto___11378 = G__11379;
+continue;
+} else {
+}
+break;
+}
+
+var G__11370 = args11368.length;
+switch (G__11370) {
+case 3:
+return cljs.core.rsubseq.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 5:
+return cljs.core.rsubseq.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11368.length)].join('')));
+
+}
+});
+
+cljs.core.rsubseq.cljs$core$IFn$_invoke$arity$3 = (function (sc,test,key){
+var include = cljs.core.mk_bound_fn(sc,test,key);
+if(cljs.core.truth_(cljs.core.PersistentHashSet.createAsIfByAssoc([cljs.core._LT_,cljs.core._LT__EQ_], true).call(null,test))){
+var temp__4657__auto__ = cljs.core._sorted_seq_from(sc,key,false);
+if(cljs.core.truth_(temp__4657__auto__)){
+var vec__11371 = temp__4657__auto__;
+var e = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11371,(0),null);
+var s = vec__11371;
+if(cljs.core.truth_((include.cljs$core$IFn$_invoke$arity$1 ? include.cljs$core$IFn$_invoke$arity$1(e) : include.call(null,e)))){
+return s;
+} else {
+return cljs.core.next(s);
+}
+} else {
+return null;
+}
+} else {
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(include,cljs.core._sorted_seq(sc,false));
+}
+});
+
+cljs.core.rsubseq.cljs$core$IFn$_invoke$arity$5 = (function (sc,start_test,start_key,end_test,end_key){
+var temp__4657__auto__ = cljs.core._sorted_seq_from(sc,end_key,false);
+if(cljs.core.truth_(temp__4657__auto__)){
+var vec__11374 = temp__4657__auto__;
+var e = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11374,(0),null);
+var s = vec__11374;
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(cljs.core.mk_bound_fn(sc,start_test,start_key),(cljs.core.truth_(cljs.core.mk_bound_fn(sc,end_test,end_key).call(null,e))?s:cljs.core.next(s)));
+} else {
+return null;
+}
+});
+
+cljs.core.rsubseq.cljs$lang$maxFixedArity = 5;
+
+
+/**
+* @constructor
+*/
+cljs.core.RangeIterator = (function (i,end,step){
+this.i = i;
+this.end = end;
+this.step = step;
+})
+cljs.core.RangeIterator.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+if((self__.step > (0))){
+return (self__.i < self__.end);
+} else {
+return (self__.i > self__.end);
+}
+});
+
+cljs.core.RangeIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var ret = self__.i;
+self__.i = (self__.i + self__.step);
+
+return ret;
+});
+
+cljs.core.RangeIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"end","end",1372345569,null),new cljs.core.Symbol(null,"step","step",-1365547645,null)], null);
+});
+
+cljs.core.RangeIterator.cljs$lang$type = true;
+
+cljs.core.RangeIterator.cljs$lang$ctorStr = "cljs.core/RangeIterator";
+
+cljs.core.RangeIterator.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/RangeIterator");
+});
+
+cljs.core.__GT_RangeIterator = (function cljs$core$__GT_RangeIterator(i,end,step){
+return (new cljs.core.RangeIterator(i,end,step));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Range = (function (meta,start,end,step,__hash){
+this.meta = meta;
+this.start = start;
+this.end = end;
+this.step = step;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32375006;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+})
+cljs.core.Range.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.Range.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Range.prototype.indexOf = (function() {
+var G__11382 = null;
+var G__11382__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11382__2 = (function (x,start__$1){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start__$1);
+});
+G__11382 = function(x,start__$1){
+switch(arguments.length){
+case 1:
+return G__11382__1.call(this,x);
+case 2:
+return G__11382__2.call(this,x,start__$1);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11382.cljs$core$IFn$_invoke$arity$1 = G__11382__1;
+G__11382.cljs$core$IFn$_invoke$arity$2 = G__11382__2;
+return G__11382;
+})()
+;
+
+cljs.core.Range.prototype.lastIndexOf = (function() {
+var G__11383 = null;
+var G__11383__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11383__2 = (function (x,start__$1){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start__$1);
+});
+G__11383 = function(x,start__$1){
+switch(arguments.length){
+case 1:
+return G__11383__1.call(this,x);
+case 2:
+return G__11383__2.call(this,x,start__$1);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11383.cljs$core$IFn$_invoke$arity$1 = G__11383__1;
+G__11383.cljs$core$IFn$_invoke$arity$2 = G__11383__2;
+return G__11383;
+})()
+;
+
+cljs.core.Range.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (rng,n){
+var self__ = this;
+var rng__$1 = this;
+if((n < rng__$1.cljs$core$ICounted$_count$arity$1(null))){
+return (self__.start + (n * self__.step));
+} else {
+if(((self__.start > self__.end)) && ((self__.step === (0)))){
+return self__.start;
+} else {
+throw (new Error("Index out of bounds"));
+}
+}
+});
+
+cljs.core.Range.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (rng,n,not_found){
+var self__ = this;
+var rng__$1 = this;
+if((n < rng__$1.cljs$core$ICounted$_count$arity$1(null))){
+return (self__.start + (n * self__.step));
+} else {
+if(((self__.start > self__.end)) && ((self__.step === (0)))){
+return self__.start;
+} else {
+return not_found;
+}
+}
+});
+
+cljs.core.Range.prototype.cljs$core$IIterable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Range.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.RangeIterator(self__.start,self__.end,self__.step));
+});
+
+cljs.core.Range.prototype.cljs$core$IMeta$_meta$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+return self__.meta;
+});
+
+cljs.core.Range.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.Range(self__.meta,self__.start,self__.end,self__.step,self__.__hash));
+});
+
+cljs.core.Range.prototype.cljs$core$INext$_next$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+if((self__.step > (0))){
+if(((self__.start + self__.step) < self__.end)){
+return (new cljs.core.Range(self__.meta,(self__.start + self__.step),self__.end,self__.step,null));
+} else {
+return null;
+}
+} else {
+if(((self__.start + self__.step) > self__.end)){
+return (new cljs.core.Range(self__.meta,(self__.start + self__.step),self__.end,self__.step,null));
+} else {
+return null;
+}
+}
+});
+
+cljs.core.Range.prototype.cljs$core$ICounted$_count$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+if(cljs.core.not(rng__$1.cljs$core$ISeqable$_seq$arity$1(null))){
+return (0);
+} else {
+var G__11381 = ((self__.end - self__.start) / self__.step);
+return Math.ceil(G__11381);
+}
+});
+
+cljs.core.Range.prototype.cljs$core$IHash$_hash$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+var h__6952__auto__ = self__.__hash;
+if(!((h__6952__auto__ == null))){
+return h__6952__auto__;
+} else {
+var h__6952__auto____$1 = cljs.core.hash_ordered_coll(rng__$1);
+self__.__hash = h__6952__auto____$1;
+
+return h__6952__auto____$1;
+}
+});
+
+cljs.core.Range.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (rng,other){
+var self__ = this;
+var rng__$1 = this;
+return cljs.core.equiv_sequential(rng__$1,other);
+});
+
+cljs.core.Range.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+return cljs.core.with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.Range.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (rng,f){
+var self__ = this;
+var rng__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2(rng__$1,f);
+});
+
+cljs.core.Range.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (rng,f,init){
+var self__ = this;
+var rng__$1 = this;
+var i = self__.start;
+var ret = init;
+while(true){
+if((((self__.step > (0)))?(i < self__.end):(i > self__.end))){
+var ret__$1 = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(ret,i) : f.call(null,ret,i));
+if(cljs.core.reduced_QMARK_(ret__$1)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(ret__$1) : cljs.core.deref.call(null,ret__$1));
+} else {
+var G__11384 = (i + self__.step);
+var G__11385 = ret__$1;
+i = G__11384;
+ret = G__11385;
+continue;
+}
+} else {
+return ret;
+}
+break;
+}
+});
+
+cljs.core.Range.prototype.cljs$core$ISeq$_first$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+if((rng__$1.cljs$core$ISeqable$_seq$arity$1(null) == null)){
+return null;
+} else {
+return self__.start;
+}
+});
+
+cljs.core.Range.prototype.cljs$core$ISeq$_rest$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+if(!((rng__$1.cljs$core$ISeqable$_seq$arity$1(null) == null))){
+return (new cljs.core.Range(self__.meta,(self__.start + self__.step),self__.end,self__.step,null));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.Range.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+if((self__.step > (0))){
+if((self__.start < self__.end)){
+return rng__$1;
+} else {
+return null;
+}
+} else {
+if((self__.step < (0))){
+if((self__.start > self__.end)){
+return rng__$1;
+} else {
+return null;
+}
+} else {
+if((self__.start === self__.end)){
+return null;
+} else {
+return rng__$1;
+}
+
+}
+}
+});
+
+cljs.core.Range.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (rng,meta__$1){
+var self__ = this;
+var rng__$1 = this;
+return (new cljs.core.Range(meta__$1,self__.start,self__.end,self__.step,self__.__hash));
+});
+
+cljs.core.Range.prototype.cljs$core$ICollection$_conj$arity$2 = (function (rng,o){
+var self__ = this;
+var rng__$1 = this;
+return cljs.core.cons(o,rng__$1);
+});
+
+cljs.core.Range.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"start","start",1285322546,null),new cljs.core.Symbol(null,"end","end",1372345569,null),new cljs.core.Symbol(null,"step","step",-1365547645,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Range.cljs$lang$type = true;
+
+cljs.core.Range.cljs$lang$ctorStr = "cljs.core/Range";
+
+cljs.core.Range.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Range");
+});
+
+cljs.core.__GT_Range = (function cljs$core$__GT_Range(meta,start,end,step,__hash){
+return (new cljs.core.Range(meta,start,end,step,__hash));
+});
+
+(cljs.core.Range.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+/**
+ * Returns a lazy seq of nums from start (inclusive) to end
+ * (exclusive), by step, where start defaults to 0, step to 1,
+ * and end to infinity.
+ */
+cljs.core.range = (function cljs$core$range(var_args){
+var args11386 = [];
+var len__7625__auto___11389 = arguments.length;
+var i__7626__auto___11390 = (0);
+while(true){
+if((i__7626__auto___11390 < len__7625__auto___11389)){
+args11386.push((arguments[i__7626__auto___11390]));
+
+var G__11391 = (i__7626__auto___11390 + (1));
+i__7626__auto___11390 = G__11391;
+continue;
+} else {
+}
+break;
+}
+
+var G__11388 = args11386.length;
+switch (G__11388) {
+case 0:
+return cljs.core.range.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.range.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.range.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.range.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11386.length)].join('')));
+
+}
+});
+
+cljs.core.range.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.range.cljs$core$IFn$_invoke$arity$3((0),Number.MAX_VALUE,(1));
+});
+
+cljs.core.range.cljs$core$IFn$_invoke$arity$1 = (function (end){
+return cljs.core.range.cljs$core$IFn$_invoke$arity$3((0),end,(1));
+});
+
+cljs.core.range.cljs$core$IFn$_invoke$arity$2 = (function (start,end){
+return cljs.core.range.cljs$core$IFn$_invoke$arity$3(start,end,(1));
+});
+
+cljs.core.range.cljs$core$IFn$_invoke$arity$3 = (function (start,end,step){
+return (new cljs.core.Range(null,start,end,step,null));
+});
+
+cljs.core.range.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns a lazy seq of every nth item in coll. Returns a stateful
+ * transducer when no collection is provided.
+ */
+cljs.core.take_nth = (function cljs$core$take_nth(var_args){
+var args11393 = [];
+var len__7625__auto___11396 = arguments.length;
+var i__7626__auto___11397 = (0);
+while(true){
+if((i__7626__auto___11397 < len__7625__auto___11396)){
+args11393.push((arguments[i__7626__auto___11397]));
+
+var G__11398 = (i__7626__auto___11397 + (1));
+i__7626__auto___11397 = G__11398;
+continue;
+} else {
+}
+break;
+}
+
+var G__11395 = args11393.length;
+switch (G__11395) {
+case 1:
+return cljs.core.take_nth.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.take_nth.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11393.length)].join('')));
+
+}
+});
+
+cljs.core.take_nth.cljs$core$IFn$_invoke$arity$1 = (function (n){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+return (function (rf){
+var ia = cljs.core.volatile_BANG_((-1));
+return ((function (ia){
+return (function() {
+var G__11400 = null;
+var G__11400__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11400__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11400__2 = (function (result,input){
+var i = cljs.core._vreset_BANG_(ia,(cljs.core._deref(ia) + (1)));
+if((cljs.core.rem(i,n) === (0))){
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+} else {
+return result;
+}
+});
+G__11400 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11400__0.call(this);
+case 1:
+return G__11400__1.call(this,result);
+case 2:
+return G__11400__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11400.cljs$core$IFn$_invoke$arity$0 = G__11400__0;
+G__11400.cljs$core$IFn$_invoke$arity$1 = G__11400__1;
+G__11400.cljs$core$IFn$_invoke$arity$2 = G__11400__2;
+return G__11400;
+})()
+;})(ia))
+});
+});
+
+cljs.core.take_nth.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+return cljs.core.cons(cljs.core.first(s),cljs.core.take_nth.cljs$core$IFn$_invoke$arity$2(n,cljs.core.drop.cljs$core$IFn$_invoke$arity$2(n,s)));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.take_nth.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a vector of [(take-while pred coll) (drop-while pred coll)]
+ */
+cljs.core.split_with = (function cljs$core$split_with(pred,coll){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(pred,coll),cljs.core.drop_while.cljs$core$IFn$_invoke$arity$2(pred,coll)], null);
+});
+/**
+ * Applies f to each value in coll, splitting it each time f returns a
+ * new value. Returns a lazy seq of partitions. Returns a stateful
+ * transducer when no collection is provided.
+ */
+cljs.core.partition_by = (function cljs$core$partition_by(var_args){
+var args11402 = [];
+var len__7625__auto___11405 = arguments.length;
+var i__7626__auto___11406 = (0);
+while(true){
+if((i__7626__auto___11406 < len__7625__auto___11405)){
+args11402.push((arguments[i__7626__auto___11406]));
+
+var G__11407 = (i__7626__auto___11406 + (1));
+i__7626__auto___11406 = G__11407;
+continue;
+} else {
+}
+break;
+}
+
+var G__11404 = args11402.length;
+switch (G__11404) {
+case 1:
+return cljs.core.partition_by.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.partition_by.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11402.length)].join('')));
+
+}
+});
+
+cljs.core.partition_by.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function (rf){
+var a = cljs.core.array_list();
+var pa = cljs.core.volatile_BANG_(new cljs.core.Keyword("cljs.core","none","cljs.core/none",926646439));
+return ((function (a,pa){
+return (function() {
+var G__11409 = null;
+var G__11409__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11409__1 = (function (result){
+var result__$1 = (cljs.core.truth_(a.isEmpty())?result:(function (){var v = cljs.core.vec(a.toArray());
+a.clear();
+
+return cljs.core.unreduced((rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v)));
+})());
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result__$1) : rf.call(null,result__$1));
+});
+var G__11409__2 = (function (result,input){
+var pval = (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(pa) : cljs.core.deref.call(null,pa));
+var val = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(input) : f.call(null,input));
+cljs.core.vreset_BANG_(pa,val);
+
+if((cljs.core.keyword_identical_QMARK_(pval,new cljs.core.Keyword("cljs.core","none","cljs.core/none",926646439))) || (cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(val,pval))){
+a.add(input);
+
+return result;
+} else {
+var v = cljs.core.vec(a.toArray());
+a.clear();
+
+var ret = (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v));
+if(cljs.core.reduced_QMARK_(ret)){
+} else {
+a.add(input);
+}
+
+return ret;
+}
+});
+G__11409 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11409__0.call(this);
+case 1:
+return G__11409__1.call(this,result);
+case 2:
+return G__11409__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11409.cljs$core$IFn$_invoke$arity$0 = G__11409__0;
+G__11409.cljs$core$IFn$_invoke$arity$1 = G__11409__1;
+G__11409.cljs$core$IFn$_invoke$arity$2 = G__11409__2;
+return G__11409;
+})()
+;})(a,pa))
+});
+});
+
+cljs.core.partition_by.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+var fst = cljs.core.first(s);
+var fv = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(fst) : f.call(null,fst));
+var run = cljs.core.cons(fst,cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(((function (fst,fv,s,temp__4657__auto__){
+return (function (p1__11401_SHARP_){
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(fv,(f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(p1__11401_SHARP_) : f.call(null,p1__11401_SHARP_)));
+});})(fst,fv,s,temp__4657__auto__))
+,cljs.core.next(s)));
+return cljs.core.cons(run,cljs.core.partition_by.cljs$core$IFn$_invoke$arity$2(f,cljs.core.seq(cljs.core.drop.cljs$core$IFn$_invoke$arity$2(cljs.core.count(run),s))));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.partition_by.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a map from distinct items in coll to the number of times
+ * they appear.
+ */
+cljs.core.frequencies = (function cljs$core$frequencies(coll){
+return cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (counts,x){
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(counts,x,(cljs.core.get.cljs$core$IFn$_invoke$arity$3(counts,x,(0)) + (1)));
+}),cljs.core.transient$(cljs.core.PersistentArrayMap.EMPTY),coll));
+});
+/**
+ * Returns a lazy seq of the intermediate values of the reduction (as
+ * per reduce) of coll by f, starting with init.
+ */
+cljs.core.reductions = (function cljs$core$reductions(var_args){
+var args11410 = [];
+var len__7625__auto___11415 = arguments.length;
+var i__7626__auto___11416 = (0);
+while(true){
+if((i__7626__auto___11416 < len__7625__auto___11415)){
+args11410.push((arguments[i__7626__auto___11416]));
+
+var G__11417 = (i__7626__auto___11416 + (1));
+i__7626__auto___11416 = G__11417;
+continue;
+} else {
+}
+break;
+}
+
+var G__11412 = args11410.length;
+switch (G__11412) {
+case 2:
+return cljs.core.reductions.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.reductions.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11410.length)].join('')));
+
+}
+});
+
+cljs.core.reductions.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4655__auto__ = cljs.core.seq(coll);
+if(temp__4655__auto__){
+var s = temp__4655__auto__;
+return cljs.core.reductions.cljs$core$IFn$_invoke$arity$3(f,cljs.core.first(s),cljs.core.rest(s));
+} else {
+var x__7354__auto__ = (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+return cljs.core._conj(cljs.core.List.EMPTY,x__7354__auto__);
+}
+}),null,null));
+});
+
+cljs.core.reductions.cljs$core$IFn$_invoke$arity$3 = (function (f,init,coll){
+if(cljs.core.reduced_QMARK_(init)){
+var x__7354__auto__ = (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(init) : cljs.core.deref.call(null,init));
+return cljs.core._conj(cljs.core.List.EMPTY,x__7354__auto__);
+} else {
+return cljs.core.cons(init,(new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+return cljs.core.reductions.cljs$core$IFn$_invoke$arity$3(f,(function (){var G__11413 = init;
+var G__11414 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11413,G__11414) : f.call(null,G__11413,G__11414));
+})(),cljs.core.rest(s));
+} else {
+return null;
+}
+}),null,null)));
+}
+});
+
+cljs.core.reductions.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Takes a set of functions and returns a fn that is the juxtaposition
+ * of those fns. The returned fn takes a variable number of args, and
+ * returns a vector containing the result of applying each fn to the
+ * args (left-to-right).
+ * ((juxt a b c) x) => [(a x) (b x) (c x)]
+ */
+cljs.core.juxt = (function cljs$core$juxt(var_args){
+var args11429 = [];
+var len__7625__auto___11436 = arguments.length;
+var i__7626__auto___11437 = (0);
+while(true){
+if((i__7626__auto___11437 < len__7625__auto___11436)){
+args11429.push((arguments[i__7626__auto___11437]));
+
+var G__11438 = (i__7626__auto___11437 + (1));
+i__7626__auto___11437 = G__11438;
+continue;
+} else {
+}
+break;
+}
+
+var G__11435 = args11429.length;
+switch (G__11435) {
+case 1:
+return cljs.core.juxt.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.juxt.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.juxt.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args11429.slice((3)),(0),null));
+return cljs.core.juxt.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.juxt.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function() {
+var G__11440 = null;
+var G__11440__0 = (function (){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null))],null));
+});
+var G__11440__1 = (function (x){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x))],null));
+});
+var G__11440__2 = (function (x,y){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y))],null));
+});
+var G__11440__3 = (function (x,y,z){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(x,y,z) : f.call(null,x,y,z))],null));
+});
+var G__11440__4 = (function() {
+var G__11441__delegate = function (x,y,z,args){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,x,y,z,args)],null));
+};
+var G__11441 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11442__i = 0, G__11442__a = new Array(arguments.length - 3);
+while (G__11442__i < G__11442__a.length) {G__11442__a[G__11442__i] = arguments[G__11442__i + 3]; ++G__11442__i;}
+ args = new cljs.core.IndexedSeq(G__11442__a,0);
+}
+return G__11441__delegate.call(this,x,y,z,args);};
+G__11441.cljs$lang$maxFixedArity = 3;
+G__11441.cljs$lang$applyTo = (function (arglist__11443){
+var x = cljs.core.first(arglist__11443);
+arglist__11443 = cljs.core.next(arglist__11443);
+var y = cljs.core.first(arglist__11443);
+arglist__11443 = cljs.core.next(arglist__11443);
+var z = cljs.core.first(arglist__11443);
+var args = cljs.core.rest(arglist__11443);
+return G__11441__delegate(x,y,z,args);
+});
+G__11441.cljs$core$IFn$_invoke$arity$variadic = G__11441__delegate;
+return G__11441;
+})()
+;
+G__11440 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__11440__0.call(this);
+case 1:
+return G__11440__1.call(this,x);
+case 2:
+return G__11440__2.call(this,x,y);
+case 3:
+return G__11440__3.call(this,x,y,z);
+default:
+var G__11444 = null;
+if (arguments.length > 3) {
+var G__11445__i = 0, G__11445__a = new Array(arguments.length - 3);
+while (G__11445__i < G__11445__a.length) {G__11445__a[G__11445__i] = arguments[G__11445__i + 3]; ++G__11445__i;}
+G__11444 = new cljs.core.IndexedSeq(G__11445__a,0);
+}
+return G__11440__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11444);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11440.cljs$lang$maxFixedArity = 3;
+G__11440.cljs$lang$applyTo = G__11440__4.cljs$lang$applyTo;
+G__11440.cljs$core$IFn$_invoke$arity$0 = G__11440__0;
+G__11440.cljs$core$IFn$_invoke$arity$1 = G__11440__1;
+G__11440.cljs$core$IFn$_invoke$arity$2 = G__11440__2;
+G__11440.cljs$core$IFn$_invoke$arity$3 = G__11440__3;
+G__11440.cljs$core$IFn$_invoke$arity$variadic = G__11440__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11440;
+})()
+});
+
+cljs.core.juxt.cljs$core$IFn$_invoke$arity$2 = (function (f,g){
+return (function() {
+var G__11446 = null;
+var G__11446__0 = (function (){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)),(g.cljs$core$IFn$_invoke$arity$0 ? g.cljs$core$IFn$_invoke$arity$0() : g.call(null))],null));
+});
+var G__11446__1 = (function (x){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x)),(g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(x) : g.call(null,x))],null));
+});
+var G__11446__2 = (function (x,y){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y)),(g.cljs$core$IFn$_invoke$arity$2 ? g.cljs$core$IFn$_invoke$arity$2(x,y) : g.call(null,x,y))],null));
+});
+var G__11446__3 = (function (x,y,z){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(x,y,z) : f.call(null,x,y,z)),(g.cljs$core$IFn$_invoke$arity$3 ? g.cljs$core$IFn$_invoke$arity$3(x,y,z) : g.call(null,x,y,z))],null));
+});
+var G__11446__4 = (function() {
+var G__11447__delegate = function (x,y,z,args){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,x,y,z,args),cljs.core.apply.cljs$core$IFn$_invoke$arity$5(g,x,y,z,args)],null));
+};
+var G__11447 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11448__i = 0, G__11448__a = new Array(arguments.length - 3);
+while (G__11448__i < G__11448__a.length) {G__11448__a[G__11448__i] = arguments[G__11448__i + 3]; ++G__11448__i;}
+ args = new cljs.core.IndexedSeq(G__11448__a,0);
+}
+return G__11447__delegate.call(this,x,y,z,args);};
+G__11447.cljs$lang$maxFixedArity = 3;
+G__11447.cljs$lang$applyTo = (function (arglist__11449){
+var x = cljs.core.first(arglist__11449);
+arglist__11449 = cljs.core.next(arglist__11449);
+var y = cljs.core.first(arglist__11449);
+arglist__11449 = cljs.core.next(arglist__11449);
+var z = cljs.core.first(arglist__11449);
+var args = cljs.core.rest(arglist__11449);
+return G__11447__delegate(x,y,z,args);
+});
+G__11447.cljs$core$IFn$_invoke$arity$variadic = G__11447__delegate;
+return G__11447;
+})()
+;
+G__11446 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__11446__0.call(this);
+case 1:
+return G__11446__1.call(this,x);
+case 2:
+return G__11446__2.call(this,x,y);
+case 3:
+return G__11446__3.call(this,x,y,z);
+default:
+var G__11450 = null;
+if (arguments.length > 3) {
+var G__11451__i = 0, G__11451__a = new Array(arguments.length - 3);
+while (G__11451__i < G__11451__a.length) {G__11451__a[G__11451__i] = arguments[G__11451__i + 3]; ++G__11451__i;}
+G__11450 = new cljs.core.IndexedSeq(G__11451__a,0);
+}
+return G__11446__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11450);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11446.cljs$lang$maxFixedArity = 3;
+G__11446.cljs$lang$applyTo = G__11446__4.cljs$lang$applyTo;
+G__11446.cljs$core$IFn$_invoke$arity$0 = G__11446__0;
+G__11446.cljs$core$IFn$_invoke$arity$1 = G__11446__1;
+G__11446.cljs$core$IFn$_invoke$arity$2 = G__11446__2;
+G__11446.cljs$core$IFn$_invoke$arity$3 = G__11446__3;
+G__11446.cljs$core$IFn$_invoke$arity$variadic = G__11446__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11446;
+})()
+});
+
+cljs.core.juxt.cljs$core$IFn$_invoke$arity$3 = (function (f,g,h){
+return (function() {
+var G__11452 = null;
+var G__11452__0 = (function (){
+return (new cljs.core.PersistentVector(null,3,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)),(g.cljs$core$IFn$_invoke$arity$0 ? g.cljs$core$IFn$_invoke$arity$0() : g.call(null)),(h.cljs$core$IFn$_invoke$arity$0 ? h.cljs$core$IFn$_invoke$arity$0() : h.call(null))],null));
+});
+var G__11452__1 = (function (x){
+return (new cljs.core.PersistentVector(null,3,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x)),(g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(x) : g.call(null,x)),(h.cljs$core$IFn$_invoke$arity$1 ? h.cljs$core$IFn$_invoke$arity$1(x) : h.call(null,x))],null));
+});
+var G__11452__2 = (function (x,y){
+return (new cljs.core.PersistentVector(null,3,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y)),(g.cljs$core$IFn$_invoke$arity$2 ? g.cljs$core$IFn$_invoke$arity$2(x,y) : g.call(null,x,y)),(h.cljs$core$IFn$_invoke$arity$2 ? h.cljs$core$IFn$_invoke$arity$2(x,y) : h.call(null,x,y))],null));
+});
+var G__11452__3 = (function (x,y,z){
+return (new cljs.core.PersistentVector(null,3,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(x,y,z) : f.call(null,x,y,z)),(g.cljs$core$IFn$_invoke$arity$3 ? g.cljs$core$IFn$_invoke$arity$3(x,y,z) : g.call(null,x,y,z)),(h.cljs$core$IFn$_invoke$arity$3 ? h.cljs$core$IFn$_invoke$arity$3(x,y,z) : h.call(null,x,y,z))],null));
+});
+var G__11452__4 = (function() {
+var G__11453__delegate = function (x,y,z,args){
+return (new cljs.core.PersistentVector(null,3,(5),cljs.core.PersistentVector.EMPTY_NODE,[cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,x,y,z,args),cljs.core.apply.cljs$core$IFn$_invoke$arity$5(g,x,y,z,args),cljs.core.apply.cljs$core$IFn$_invoke$arity$5(h,x,y,z,args)],null));
+};
+var G__11453 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11454__i = 0, G__11454__a = new Array(arguments.length - 3);
+while (G__11454__i < G__11454__a.length) {G__11454__a[G__11454__i] = arguments[G__11454__i + 3]; ++G__11454__i;}
+ args = new cljs.core.IndexedSeq(G__11454__a,0);
+}
+return G__11453__delegate.call(this,x,y,z,args);};
+G__11453.cljs$lang$maxFixedArity = 3;
+G__11453.cljs$lang$applyTo = (function (arglist__11455){
+var x = cljs.core.first(arglist__11455);
+arglist__11455 = cljs.core.next(arglist__11455);
+var y = cljs.core.first(arglist__11455);
+arglist__11455 = cljs.core.next(arglist__11455);
+var z = cljs.core.first(arglist__11455);
+var args = cljs.core.rest(arglist__11455);
+return G__11453__delegate(x,y,z,args);
+});
+G__11453.cljs$core$IFn$_invoke$arity$variadic = G__11453__delegate;
+return G__11453;
+})()
+;
+G__11452 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__11452__0.call(this);
+case 1:
+return G__11452__1.call(this,x);
+case 2:
+return G__11452__2.call(this,x,y);
+case 3:
+return G__11452__3.call(this,x,y,z);
+default:
+var G__11456 = null;
+if (arguments.length > 3) {
+var G__11457__i = 0, G__11457__a = new Array(arguments.length - 3);
+while (G__11457__i < G__11457__a.length) {G__11457__a[G__11457__i] = arguments[G__11457__i + 3]; ++G__11457__i;}
+G__11456 = new cljs.core.IndexedSeq(G__11457__a,0);
+}
+return G__11452__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11456);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11452.cljs$lang$maxFixedArity = 3;
+G__11452.cljs$lang$applyTo = G__11452__4.cljs$lang$applyTo;
+G__11452.cljs$core$IFn$_invoke$arity$0 = G__11452__0;
+G__11452.cljs$core$IFn$_invoke$arity$1 = G__11452__1;
+G__11452.cljs$core$IFn$_invoke$arity$2 = G__11452__2;
+G__11452.cljs$core$IFn$_invoke$arity$3 = G__11452__3;
+G__11452.cljs$core$IFn$_invoke$arity$variadic = G__11452__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11452;
+})()
+});
+
+cljs.core.juxt.cljs$core$IFn$_invoke$arity$variadic = (function (f,g,h,fs){
+var fs__$1 = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4(f,g,h,fs);
+return ((function (fs__$1){
+return (function() {
+var G__11458 = null;
+var G__11458__0 = (function (){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (fs__$1){
+return (function (p1__11419_SHARP_,p2__11420_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(p1__11419_SHARP_,(p2__11420_SHARP_.cljs$core$IFn$_invoke$arity$0 ? p2__11420_SHARP_.cljs$core$IFn$_invoke$arity$0() : p2__11420_SHARP_.call(null)));
+});})(fs__$1))
+,cljs.core.PersistentVector.EMPTY,fs__$1);
+});
+var G__11458__1 = (function (x){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (fs__$1){
+return (function (p1__11421_SHARP_,p2__11422_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(p1__11421_SHARP_,(p2__11422_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p2__11422_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p2__11422_SHARP_.call(null,x)));
+});})(fs__$1))
+,cljs.core.PersistentVector.EMPTY,fs__$1);
+});
+var G__11458__2 = (function (x,y){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (fs__$1){
+return (function (p1__11423_SHARP_,p2__11424_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(p1__11423_SHARP_,(p2__11424_SHARP_.cljs$core$IFn$_invoke$arity$2 ? p2__11424_SHARP_.cljs$core$IFn$_invoke$arity$2(x,y) : p2__11424_SHARP_.call(null,x,y)));
+});})(fs__$1))
+,cljs.core.PersistentVector.EMPTY,fs__$1);
+});
+var G__11458__3 = (function (x,y,z){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (fs__$1){
+return (function (p1__11425_SHARP_,p2__11426_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(p1__11425_SHARP_,(p2__11426_SHARP_.cljs$core$IFn$_invoke$arity$3 ? p2__11426_SHARP_.cljs$core$IFn$_invoke$arity$3(x,y,z) : p2__11426_SHARP_.call(null,x,y,z)));
+});})(fs__$1))
+,cljs.core.PersistentVector.EMPTY,fs__$1);
+});
+var G__11458__4 = (function() {
+var G__11459__delegate = function (x,y,z,args){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (fs__$1){
+return (function (p1__11427_SHARP_,p2__11428_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(p1__11427_SHARP_,cljs.core.apply.cljs$core$IFn$_invoke$arity$5(p2__11428_SHARP_,x,y,z,args));
+});})(fs__$1))
+,cljs.core.PersistentVector.EMPTY,fs__$1);
+};
+var G__11459 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11460__i = 0, G__11460__a = new Array(arguments.length - 3);
+while (G__11460__i < G__11460__a.length) {G__11460__a[G__11460__i] = arguments[G__11460__i + 3]; ++G__11460__i;}
+ args = new cljs.core.IndexedSeq(G__11460__a,0);
+}
+return G__11459__delegate.call(this,x,y,z,args);};
+G__11459.cljs$lang$maxFixedArity = 3;
+G__11459.cljs$lang$applyTo = (function (arglist__11461){
+var x = cljs.core.first(arglist__11461);
+arglist__11461 = cljs.core.next(arglist__11461);
+var y = cljs.core.first(arglist__11461);
+arglist__11461 = cljs.core.next(arglist__11461);
+var z = cljs.core.first(arglist__11461);
+var args = cljs.core.rest(arglist__11461);
+return G__11459__delegate(x,y,z,args);
+});
+G__11459.cljs$core$IFn$_invoke$arity$variadic = G__11459__delegate;
+return G__11459;
+})()
+;
+G__11458 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__11458__0.call(this);
+case 1:
+return G__11458__1.call(this,x);
+case 2:
+return G__11458__2.call(this,x,y);
+case 3:
+return G__11458__3.call(this,x,y,z);
+default:
+var G__11462 = null;
+if (arguments.length > 3) {
+var G__11463__i = 0, G__11463__a = new Array(arguments.length - 3);
+while (G__11463__i < G__11463__a.length) {G__11463__a[G__11463__i] = arguments[G__11463__i + 3]; ++G__11463__i;}
+G__11462 = new cljs.core.IndexedSeq(G__11463__a,0);
+}
+return G__11458__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11462);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11458.cljs$lang$maxFixedArity = 3;
+G__11458.cljs$lang$applyTo = G__11458__4.cljs$lang$applyTo;
+G__11458.cljs$core$IFn$_invoke$arity$0 = G__11458__0;
+G__11458.cljs$core$IFn$_invoke$arity$1 = G__11458__1;
+G__11458.cljs$core$IFn$_invoke$arity$2 = G__11458__2;
+G__11458.cljs$core$IFn$_invoke$arity$3 = G__11458__3;
+G__11458.cljs$core$IFn$_invoke$arity$variadic = G__11458__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11458;
+})()
+;})(fs__$1))
+});
+
+cljs.core.juxt.cljs$lang$applyTo = (function (seq11430){
+var G__11431 = cljs.core.first(seq11430);
+var seq11430__$1 = cljs.core.next(seq11430);
+var G__11432 = cljs.core.first(seq11430__$1);
+var seq11430__$2 = cljs.core.next(seq11430__$1);
+var G__11433 = cljs.core.first(seq11430__$2);
+var seq11430__$3 = cljs.core.next(seq11430__$2);
+return cljs.core.juxt.cljs$core$IFn$_invoke$arity$variadic(G__11431,G__11432,G__11433,seq11430__$3);
+});
+
+cljs.core.juxt.cljs$lang$maxFixedArity = (3);
+
+/**
+ * When lazy sequences are produced via functions that have side
+ * effects, any effects other than those needed to produce the first
+ * element in the seq do not occur until the seq is consumed. dorun can
+ * be used to force any effects. Walks through the successive nexts of
+ * the seq, does not retain the head and returns nil.
+ */
+cljs.core.dorun = (function cljs$core$dorun(var_args){
+var args11464 = [];
+var len__7625__auto___11467 = arguments.length;
+var i__7626__auto___11468 = (0);
+while(true){
+if((i__7626__auto___11468 < len__7625__auto___11467)){
+args11464.push((arguments[i__7626__auto___11468]));
+
+var G__11469 = (i__7626__auto___11468 + (1));
+i__7626__auto___11468 = G__11469;
+continue;
+} else {
+}
+break;
+}
+
+var G__11466 = args11464.length;
+switch (G__11466) {
+case 1:
+return cljs.core.dorun.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.dorun.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11464.length)].join('')));
+
+}
+});
+
+cljs.core.dorun.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+while(true){
+if(cljs.core.seq(coll)){
+var G__11471 = cljs.core.next(coll);
+coll = G__11471;
+continue;
+} else {
+return null;
+}
+break;
+}
+});
+
+cljs.core.dorun.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+while(true){
+if((cljs.core.seq(coll)) && ((n > (0)))){
+var G__11472 = (n - (1));
+var G__11473 = cljs.core.next(coll);
+n = G__11472;
+coll = G__11473;
+continue;
+} else {
+return null;
+}
+break;
+}
+});
+
+cljs.core.dorun.cljs$lang$maxFixedArity = 2;
+
+/**
+ * When lazy sequences are produced via functions that have side
+ * effects, any effects other than those needed to produce the first
+ * element in the seq do not occur until the seq is consumed. doall can
+ * be used to force any effects. Walks through the successive nexts of
+ * the seq, retains the head and returns it, thus causing the entire
+ * seq to reside in memory at one time.
+ */
+cljs.core.doall = (function cljs$core$doall(var_args){
+var args11474 = [];
+var len__7625__auto___11477 = arguments.length;
+var i__7626__auto___11478 = (0);
+while(true){
+if((i__7626__auto___11478 < len__7625__auto___11477)){
+args11474.push((arguments[i__7626__auto___11478]));
+
+var G__11479 = (i__7626__auto___11478 + (1));
+i__7626__auto___11478 = G__11479;
+continue;
+} else {
+}
+break;
+}
+
+var G__11476 = args11474.length;
+switch (G__11476) {
+case 1:
+return cljs.core.doall.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.doall.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11474.length)].join('')));
+
+}
+});
+
+cljs.core.doall.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+cljs.core.dorun.cljs$core$IFn$_invoke$arity$1(coll);
+
+return coll;
+});
+
+cljs.core.doall.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+cljs.core.dorun.cljs$core$IFn$_invoke$arity$2(n,coll);
+
+return coll;
+});
+
+cljs.core.doall.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns true if x is a JavaScript RegExp instance.
+ */
+cljs.core.regexp_QMARK_ = (function cljs$core$regexp_QMARK_(x){
+return (x instanceof RegExp);
+});
+/**
+ * Returns the result of (re-find re s) if re fully matches s.
+ */
+cljs.core.re_matches = (function cljs$core$re_matches(re,s){
+if(typeof s === 'string'){
+var matches = re.exec(s);
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.first(matches),s)){
+if((cljs.core.count(matches) === (1))){
+return cljs.core.first(matches);
+} else {
+return cljs.core.vec(matches);
+}
+} else {
+return null;
+}
+} else {
+throw (new TypeError("re-matches must match against a string."));
+}
+});
+/**
+ * Returns the first regex match, if any, of s to re, using
+ * re.exec(s). Returns a vector, containing first the matching
+ * substring, then any capturing groups if the regular expression contains
+ * capturing groups.
+ */
+cljs.core.re_find = (function cljs$core$re_find(re,s){
+if(typeof s === 'string'){
+var matches = re.exec(s);
+if((matches == null)){
+return null;
+} else {
+if((cljs.core.count(matches) === (1))){
+return cljs.core.first(matches);
+} else {
+return cljs.core.vec(matches);
+}
+}
+} else {
+throw (new TypeError("re-find must match against a string."));
+}
+});
+/**
+ * Returns a lazy sequence of successive matches of re in s.
+ */
+cljs.core.re_seq = (function cljs$core$re_seq(re,s){
+var match_data = cljs.core.re_find(re,s);
+var match_idx = s.search(re);
+var match_str = ((cljs.core.coll_QMARK_(match_data))?cljs.core.first(match_data):match_data);
+var post_match = cljs.core.subs.cljs$core$IFn$_invoke$arity$2(s,(match_idx + cljs.core.count(match_str)));
+if(cljs.core.truth_(match_data)){
+return (new cljs.core.LazySeq(null,((function (match_data,match_idx,match_str,post_match){
+return (function (){
+return cljs.core.cons(match_data,((cljs.core.seq(post_match))?(cljs.core.re_seq.cljs$core$IFn$_invoke$arity$2 ? cljs.core.re_seq.cljs$core$IFn$_invoke$arity$2(re,post_match) : cljs.core.re_seq.call(null,re,post_match)):null));
+});})(match_data,match_idx,match_str,post_match))
+,null,null));
+} else {
+return null;
+}
+});
+/**
+ * Returns an instance of RegExp which has compiled the provided string.
+ */
+cljs.core.re_pattern = (function cljs$core$re_pattern(s){
+if((s instanceof RegExp)){
+return s;
+} else {
+var vec__11484 = cljs.core.re_find(/^\(\?([idmsux]*)\)/,s);
+var prefix = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11484,(0),null);
+var flags = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11484,(1),null);
+var pattern = cljs.core.subs.cljs$core$IFn$_invoke$arity$2(s,cljs.core.count(prefix));
+return (new RegExp(pattern,(function (){var or__6512__auto__ = flags;
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return "";
+}
+})()));
+}
+});
+cljs.core.pr_sequential_writer = (function cljs$core$pr_sequential_writer(writer,print_one,begin,sep,end,opts,coll){
+var _STAR_print_level_STAR_11494 = cljs.core._STAR_print_level_STAR_;
+cljs.core._STAR_print_level_STAR_ = (((cljs.core._STAR_print_level_STAR_ == null))?null:(cljs.core._STAR_print_level_STAR_ - (1)));
+
+try{if((!((cljs.core._STAR_print_level_STAR_ == null))) && ((cljs.core._STAR_print_level_STAR_ < (0)))){
+return cljs.core._write(writer,"#");
+} else {
+cljs.core._write(writer,begin);
+
+if((new cljs.core.Keyword(null,"print-length","print-length",1931866356).cljs$core$IFn$_invoke$arity$1(opts) === (0))){
+if(cljs.core.seq(coll)){
+cljs.core._write(writer,(function (){var or__6512__auto__ = new cljs.core.Keyword(null,"more-marker","more-marker",-14717935).cljs$core$IFn$_invoke$arity$1(opts);
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return "...";
+}
+})());
+} else {
+}
+} else {
+if(cljs.core.seq(coll)){
+var G__11495_11501 = cljs.core.first(coll);
+var G__11496_11502 = writer;
+var G__11497_11503 = opts;
+(print_one.cljs$core$IFn$_invoke$arity$3 ? print_one.cljs$core$IFn$_invoke$arity$3(G__11495_11501,G__11496_11502,G__11497_11503) : print_one.call(null,G__11495_11501,G__11496_11502,G__11497_11503));
+} else {
+}
+
+var coll_11504__$1 = cljs.core.next(coll);
+var n_11505 = (new cljs.core.Keyword(null,"print-length","print-length",1931866356).cljs$core$IFn$_invoke$arity$1(opts) - (1));
+while(true){
+if((coll_11504__$1) && (((n_11505 == null)) || (!((n_11505 === (0)))))){
+cljs.core._write(writer,sep);
+
+var G__11498_11506 = cljs.core.first(coll_11504__$1);
+var G__11499_11507 = writer;
+var G__11500_11508 = opts;
+(print_one.cljs$core$IFn$_invoke$arity$3 ? print_one.cljs$core$IFn$_invoke$arity$3(G__11498_11506,G__11499_11507,G__11500_11508) : print_one.call(null,G__11498_11506,G__11499_11507,G__11500_11508));
+
+var G__11509 = cljs.core.next(coll_11504__$1);
+var G__11510 = (n_11505 - (1));
+coll_11504__$1 = G__11509;
+n_11505 = G__11510;
+continue;
+} else {
+if((cljs.core.seq(coll_11504__$1)) && ((n_11505 === (0)))){
+cljs.core._write(writer,sep);
+
+cljs.core._write(writer,(function (){var or__6512__auto__ = new cljs.core.Keyword(null,"more-marker","more-marker",-14717935).cljs$core$IFn$_invoke$arity$1(opts);
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return "...";
+}
+})());
+} else {
+}
+}
+break;
+}
+}
+
+return cljs.core._write(writer,end);
+}
+}finally {cljs.core._STAR_print_level_STAR_ = _STAR_print_level_STAR_11494;
+}});
+cljs.core.write_all = (function cljs$core$write_all(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11517 = arguments.length;
+var i__7626__auto___11518 = (0);
+while(true){
+if((i__7626__auto___11518 < len__7625__auto___11517)){
+args__7632__auto__.push((arguments[i__7626__auto___11518]));
+
+var G__11519 = (i__7626__auto___11518 + (1));
+i__7626__auto___11518 = G__11519;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((1) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((1)),(0),null)):null);
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7633__auto__);
+});
+
+cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic = (function (writer,ss){
+var seq__11513 = cljs.core.seq(ss);
+var chunk__11514 = null;
+var count__11515 = (0);
+var i__11516 = (0);
+while(true){
+if((i__11516 < count__11515)){
+var s = chunk__11514.cljs$core$IIndexed$_nth$arity$2(null,i__11516);
+cljs.core._write(writer,s);
+
+var G__11520 = seq__11513;
+var G__11521 = chunk__11514;
+var G__11522 = count__11515;
+var G__11523 = (i__11516 + (1));
+seq__11513 = G__11520;
+chunk__11514 = G__11521;
+count__11515 = G__11522;
+i__11516 = G__11523;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__11513);
+if(temp__4657__auto__){
+var seq__11513__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__11513__$1)){
+var c__7331__auto__ = cljs.core.chunk_first(seq__11513__$1);
+var G__11524 = cljs.core.chunk_rest(seq__11513__$1);
+var G__11525 = c__7331__auto__;
+var G__11526 = cljs.core.count(c__7331__auto__);
+var G__11527 = (0);
+seq__11513 = G__11524;
+chunk__11514 = G__11525;
+count__11515 = G__11526;
+i__11516 = G__11527;
+continue;
+} else {
+var s = cljs.core.first(seq__11513__$1);
+cljs.core._write(writer,s);
+
+var G__11528 = cljs.core.next(seq__11513__$1);
+var G__11529 = null;
+var G__11530 = (0);
+var G__11531 = (0);
+seq__11513 = G__11528;
+chunk__11514 = G__11529;
+count__11515 = G__11530;
+i__11516 = G__11531;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.write_all.cljs$lang$maxFixedArity = (1);
+
+cljs.core.write_all.cljs$lang$applyTo = (function (seq11511){
+var G__11512 = cljs.core.first(seq11511);
+var seq11511__$1 = cljs.core.next(seq11511);
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(G__11512,seq11511__$1);
+});
+
+cljs.core.string_print = (function cljs$core$string_print(x){
+(cljs.core._STAR_print_fn_STAR_.cljs$core$IFn$_invoke$arity$1 ? cljs.core._STAR_print_fn_STAR_.cljs$core$IFn$_invoke$arity$1(x) : cljs.core._STAR_print_fn_STAR_.call(null,x));
+
+return null;
+});
+cljs.core.flush = (function cljs$core$flush(){
+return null;
+});
+cljs.core.char_escapes = (function (){var obj11533 = {"\"":"\\\"","\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t"};
+return obj11533;
+})();
+cljs.core.quote_string = (function cljs$core$quote_string(s){
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1("\""),cljs.core.str.cljs$core$IFn$_invoke$arity$1(s.replace(RegExp("[\\\\\"\b\f\n\r\t]","g"),(function (match){
+return (cljs.core.char_escapes[match]);
+}))),cljs.core.str.cljs$core$IFn$_invoke$arity$1("\"")].join('');
+});
+cljs.core.print_meta_QMARK_ = (function cljs$core$print_meta_QMARK_(opts,obj){
+var and__6500__auto__ = cljs.core.boolean$(cljs.core.get.cljs$core$IFn$_invoke$arity$2(opts,new cljs.core.Keyword(null,"meta","meta",1499536964)));
+if(and__6500__auto__){
+var and__6500__auto____$1 = ((!((obj == null)))?((((obj.cljs$lang$protocol_mask$partition0$ & (131072))) || ((cljs.core.PROTOCOL_SENTINEL === obj.cljs$core$IMeta$)))?true:false):false);
+if(and__6500__auto____$1){
+return !((cljs.core.meta(obj) == null));
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+});
+cljs.core.pr_writer_impl = (function cljs$core$pr_writer_impl(obj,writer,opts){
+if((obj == null)){
+return cljs.core._write(writer,"nil");
+} else {
+if(cljs.core.print_meta_QMARK_(opts,obj)){
+cljs.core._write(writer,"^");
+
+var G__11548_11556 = cljs.core.meta(obj);
+var G__11549_11557 = writer;
+var G__11550_11558 = opts;
+(cljs.core.pr_writer.cljs$core$IFn$_invoke$arity$3 ? cljs.core.pr_writer.cljs$core$IFn$_invoke$arity$3(G__11548_11556,G__11549_11557,G__11550_11558) : cljs.core.pr_writer.call(null,G__11548_11556,G__11549_11557,G__11550_11558));
+
+cljs.core._write(writer," ");
+} else {
+}
+
+if(obj.cljs$lang$type){
+return obj.cljs$lang$ctorPrWriter(obj,writer,opts);
+} else {
+if(((!((obj == null)))?((((obj.cljs$lang$protocol_mask$partition0$ & (2147483648))) || ((cljs.core.PROTOCOL_SENTINEL === obj.cljs$core$IPrintWithWriter$)))?true:false):false)){
+return obj.cljs$core$IPrintWithWriter$_pr_writer$arity$3(null,writer,opts);
+} else {
+if((obj === true) || (obj === false) || (typeof obj === 'number')){
+return cljs.core._write(writer,[cljs.core.str.cljs$core$IFn$_invoke$arity$1(obj)].join(''));
+} else {
+if(cljs.core.object_QMARK_(obj)){
+cljs.core._write(writer,"#js ");
+
+var G__11552 = cljs.core.map.cljs$core$IFn$_invoke$arity$2((function (k){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.keyword.cljs$core$IFn$_invoke$arity$1(k),(obj[k])], null);
+}),cljs.core.js_keys(obj));
+var G__11553 = cljs.core.pr_writer;
+var G__11554 = writer;
+var G__11555 = opts;
+return (cljs.core.print_map.cljs$core$IFn$_invoke$arity$4 ? cljs.core.print_map.cljs$core$IFn$_invoke$arity$4(G__11552,G__11553,G__11554,G__11555) : cljs.core.print_map.call(null,G__11552,G__11553,G__11554,G__11555));
+} else {
+if(cljs.core.array_QMARK_(obj)){
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"#js ["," ","]",opts,obj);
+} else {
+if(goog.isString(obj)){
+if(cljs.core.truth_(new cljs.core.Keyword(null,"readably","readably",1129599760).cljs$core$IFn$_invoke$arity$1(opts))){
+return cljs.core._write(writer,cljs.core.quote_string(obj));
+} else {
+return cljs.core._write(writer,obj);
+}
+} else {
+if(goog.isFunction(obj)){
+var name = obj.name;
+var name__$1 = (cljs.core.truth_((function (){var or__6512__auto__ = (name == null);
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+return goog.string.isEmpty(name);
+}
+})())?"Function":name);
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.array_seq(["#object[",name__$1," \"",[cljs.core.str.cljs$core$IFn$_invoke$arity$1(obj)].join(''),"\"]"], 0));
+} else {
+if((obj instanceof Date)){
+var normalize = (function (n,len){
+var ns = [cljs.core.str.cljs$core$IFn$_invoke$arity$1(n)].join('');
+while(true){
+if((cljs.core.count(ns) < len)){
+var G__11559 = [cljs.core.str.cljs$core$IFn$_invoke$arity$1("0"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns)].join('');
+ns = G__11559;
+continue;
+} else {
+return ns;
+}
+break;
+}
+});
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.array_seq(["#inst \"",[cljs.core.str.cljs$core$IFn$_invoke$arity$1(obj.getUTCFullYear())].join(''),"-",normalize((obj.getUTCMonth() + (1)),(2)),"-",normalize(obj.getUTCDate(),(2)),"T",normalize(obj.getUTCHours(),(2)),":",normalize(obj.getUTCMinutes(),(2)),":",normalize(obj.getUTCSeconds(),(2)),".",normalize(obj.getUTCMilliseconds(),(3)),"-","00:00\""], 0));
+} else {
+if(cljs.core.regexp_QMARK_(obj)){
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.array_seq(["#\"",obj.source,"\""], 0));
+} else {
+if(cljs.core.truth_(obj.constructor.cljs$lang$ctorStr)){
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.array_seq(["#object[",obj.constructor.cljs$lang$ctorStr.replace((new RegExp("/","g")),"."),"]"], 0));
+} else {
+var name = obj.constructor.name;
+var name__$1 = (cljs.core.truth_((function (){var or__6512__auto__ = (name == null);
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+return goog.string.isEmpty(name);
+}
+})())?"Object":name);
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.array_seq(["#object[",name__$1," ",[cljs.core.str.cljs$core$IFn$_invoke$arity$1(obj)].join(''),"]"], 0));
+}
+
+}
+}
+}
+}
+}
+}
+}
+}
+}
+
+}
+});
+/**
+ * Prefer this to pr-seq, because it makes the printing function
+ * configurable, allowing efficient implementations such as appending
+ * to a StringBuffer.
+ */
+cljs.core.pr_writer = (function cljs$core$pr_writer(obj,writer,opts){
+var temp__4655__auto__ = new cljs.core.Keyword(null,"alt-impl","alt-impl",670969595).cljs$core$IFn$_invoke$arity$1(opts);
+if(cljs.core.truth_(temp__4655__auto__)){
+var alt_impl = temp__4655__auto__;
+var G__11563 = obj;
+var G__11564 = writer;
+var G__11565 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(opts,new cljs.core.Keyword(null,"fallback-impl","fallback-impl",-1501286995),cljs.core.pr_writer_impl);
+return (alt_impl.cljs$core$IFn$_invoke$arity$3 ? alt_impl.cljs$core$IFn$_invoke$arity$3(G__11563,G__11564,G__11565) : alt_impl.call(null,G__11563,G__11564,G__11565));
+} else {
+return cljs.core.pr_writer_impl(obj,writer,opts);
+}
+});
+cljs.core.pr_seq_writer = (function cljs$core$pr_seq_writer(objs,writer,opts){
+cljs.core.pr_writer(cljs.core.first(objs),writer,opts);
+
+var seq__11570 = cljs.core.seq(cljs.core.next(objs));
+var chunk__11571 = null;
+var count__11572 = (0);
+var i__11573 = (0);
+while(true){
+if((i__11573 < count__11572)){
+var obj = chunk__11571.cljs$core$IIndexed$_nth$arity$2(null,i__11573);
+cljs.core._write(writer," ");
+
+cljs.core.pr_writer(obj,writer,opts);
+
+var G__11574 = seq__11570;
+var G__11575 = chunk__11571;
+var G__11576 = count__11572;
+var G__11577 = (i__11573 + (1));
+seq__11570 = G__11574;
+chunk__11571 = G__11575;
+count__11572 = G__11576;
+i__11573 = G__11577;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__11570);
+if(temp__4657__auto__){
+var seq__11570__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__11570__$1)){
+var c__7331__auto__ = cljs.core.chunk_first(seq__11570__$1);
+var G__11578 = cljs.core.chunk_rest(seq__11570__$1);
+var G__11579 = c__7331__auto__;
+var G__11580 = cljs.core.count(c__7331__auto__);
+var G__11581 = (0);
+seq__11570 = G__11578;
+chunk__11571 = G__11579;
+count__11572 = G__11580;
+i__11573 = G__11581;
+continue;
+} else {
+var obj = cljs.core.first(seq__11570__$1);
+cljs.core._write(writer," ");
+
+cljs.core.pr_writer(obj,writer,opts);
+
+var G__11582 = cljs.core.next(seq__11570__$1);
+var G__11583 = null;
+var G__11584 = (0);
+var G__11585 = (0);
+seq__11570 = G__11582;
+chunk__11571 = G__11583;
+count__11572 = G__11584;
+i__11573 = G__11585;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+cljs.core.pr_sb_with_opts = (function cljs$core$pr_sb_with_opts(objs,opts){
+var sb = (new goog.string.StringBuffer());
+var writer = (new cljs.core.StringBufferWriter(sb));
+cljs.core.pr_seq_writer(objs,writer,opts);
+
+writer.cljs$core$IWriter$_flush$arity$1(null);
+
+return sb;
+});
+/**
+ * Prints a sequence of objects to a string, observing all the
+ * options given in opts
+ */
+cljs.core.pr_str_with_opts = (function cljs$core$pr_str_with_opts(objs,opts){
+if(cljs.core.empty_QMARK_(objs)){
+return "";
+} else {
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.pr_sb_with_opts(objs,opts))].join('');
+}
+});
+/**
+ * Same as pr-str-with-opts followed by (newline)
+ */
+cljs.core.prn_str_with_opts = (function cljs$core$prn_str_with_opts(objs,opts){
+if(cljs.core.empty_QMARK_(objs)){
+return "\n";
+} else {
+var sb = cljs.core.pr_sb_with_opts(objs,opts);
+sb.append("\n");
+
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(sb)].join('');
+}
+});
+/**
+ * Prints a sequence of objects using string-print, observing all
+ * the options given in opts
+ */
+cljs.core.pr_with_opts = (function cljs$core$pr_with_opts(objs,opts){
+return cljs.core.string_print(cljs.core.pr_str_with_opts(objs,opts));
+});
+/**
+ * Prints a newline using *print-fn*
+ */
+cljs.core.newline = (function cljs$core$newline(var_args){
+var args11586 = [];
+var len__7625__auto___11589 = arguments.length;
+var i__7626__auto___11590 = (0);
+while(true){
+if((i__7626__auto___11590 < len__7625__auto___11589)){
+args11586.push((arguments[i__7626__auto___11590]));
+
+var G__11591 = (i__7626__auto___11590 + (1));
+i__7626__auto___11590 = G__11591;
+continue;
+} else {
+}
+break;
+}
+
+var G__11588 = args11586.length;
+switch (G__11588) {
+case 0:
+return cljs.core.newline.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.newline.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11586.length)].join('')));
+
+}
+});
+
+cljs.core.newline.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.newline.cljs$core$IFn$_invoke$arity$1(null);
+});
+
+cljs.core.newline.cljs$core$IFn$_invoke$arity$1 = (function (opts){
+cljs.core.string_print("\n");
+
+if(cljs.core.truth_(cljs.core.get.cljs$core$IFn$_invoke$arity$2(opts,new cljs.core.Keyword(null,"flush-on-newline","flush-on-newline",-151457939)))){
+return cljs.core.flush();
+} else {
+return null;
+}
+});
+
+cljs.core.newline.cljs$lang$maxFixedArity = 1;
+
+/**
+ * pr to a string, returning it. Fundamental entrypoint to IPrintWithWriter.
+ */
+cljs.core.pr_str = (function cljs$core$pr_str(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11594 = arguments.length;
+var i__7626__auto___11595 = (0);
+while(true){
+if((i__7626__auto___11595 < len__7625__auto___11594)){
+args__7632__auto__.push((arguments[i__7626__auto___11595]));
+
+var G__11596 = (i__7626__auto___11595 + (1));
+i__7626__auto___11595 = G__11596;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.pr_str.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.pr_str.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+return cljs.core.pr_str_with_opts(objs,cljs.core.pr_opts());
+});
+
+cljs.core.pr_str.cljs$lang$maxFixedArity = (0);
+
+cljs.core.pr_str.cljs$lang$applyTo = (function (seq11593){
+return cljs.core.pr_str.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11593));
+});
+
+/**
+ * Same as pr-str followed by (newline)
+ */
+cljs.core.prn_str = (function cljs$core$prn_str(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11598 = arguments.length;
+var i__7626__auto___11599 = (0);
+while(true){
+if((i__7626__auto___11599 < len__7625__auto___11598)){
+args__7632__auto__.push((arguments[i__7626__auto___11599]));
+
+var G__11600 = (i__7626__auto___11599 + (1));
+i__7626__auto___11599 = G__11600;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.prn_str.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.prn_str.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+return cljs.core.prn_str_with_opts(objs,cljs.core.pr_opts());
+});
+
+cljs.core.prn_str.cljs$lang$maxFixedArity = (0);
+
+cljs.core.prn_str.cljs$lang$applyTo = (function (seq11597){
+return cljs.core.prn_str.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11597));
+});
+
+/**
+ * Prints the object(s) using string-print. Prints the
+ * object(s), separated by spaces if there is more than one.
+ * By default, pr and prn print in a way that objects can be
+ * read by the reader
+ */
+cljs.core.pr = (function cljs$core$pr(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11602 = arguments.length;
+var i__7626__auto___11603 = (0);
+while(true){
+if((i__7626__auto___11603 < len__7625__auto___11602)){
+args__7632__auto__.push((arguments[i__7626__auto___11603]));
+
+var G__11604 = (i__7626__auto___11603 + (1));
+i__7626__auto___11603 = G__11604;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.pr.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.pr.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+return cljs.core.pr_with_opts(objs,cljs.core.pr_opts());
+});
+
+cljs.core.pr.cljs$lang$maxFixedArity = (0);
+
+cljs.core.pr.cljs$lang$applyTo = (function (seq11601){
+return cljs.core.pr.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11601));
+});
+
+/**
+ * Prints the object(s) using string-print.
+ * print and println produce output for human consumption.
+ * @param {...*} var_args
+ */
+cljs.core.print = (function() {
+var cljs$core$cljs_core_print__delegate = function (objs){
+return cljs.core.pr_with_opts(objs,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(cljs.core.pr_opts(),new cljs.core.Keyword(null,"readably","readably",1129599760),false));
+};
+var cljs$core$cljs_core_print = function (var_args){
+var objs = null;
+if (arguments.length > 0) {
+var G__11605__i = 0, G__11605__a = new Array(arguments.length - 0);
+while (G__11605__i < G__11605__a.length) {G__11605__a[G__11605__i] = arguments[G__11605__i + 0]; ++G__11605__i;}
+ objs = new cljs.core.IndexedSeq(G__11605__a,0);
+}
+return cljs$core$cljs_core_print__delegate.call(this,objs);};
+cljs$core$cljs_core_print.cljs$lang$maxFixedArity = 0;
+cljs$core$cljs_core_print.cljs$lang$applyTo = (function (arglist__11606){
+var objs = cljs.core.seq(arglist__11606);
+return cljs$core$cljs_core_print__delegate(objs);
+});
+cljs$core$cljs_core_print.cljs$core$IFn$_invoke$arity$variadic = cljs$core$cljs_core_print__delegate;
+return cljs$core$cljs_core_print;
+})()
+;
+/**
+ * print to a string, returning it
+ */
+cljs.core.print_str = (function cljs$core$print_str(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11608 = arguments.length;
+var i__7626__auto___11609 = (0);
+while(true){
+if((i__7626__auto___11609 < len__7625__auto___11608)){
+args__7632__auto__.push((arguments[i__7626__auto___11609]));
+
+var G__11610 = (i__7626__auto___11609 + (1));
+i__7626__auto___11609 = G__11610;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.print_str.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.print_str.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+return cljs.core.pr_str_with_opts(objs,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(cljs.core.pr_opts(),new cljs.core.Keyword(null,"readably","readably",1129599760),false));
+});
+
+cljs.core.print_str.cljs$lang$maxFixedArity = (0);
+
+cljs.core.print_str.cljs$lang$applyTo = (function (seq11607){
+return cljs.core.print_str.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11607));
+});
+
+/**
+ * Same as print followed by (newline)
+ */
+cljs.core.println = (function cljs$core$println(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11612 = arguments.length;
+var i__7626__auto___11613 = (0);
+while(true){
+if((i__7626__auto___11613 < len__7625__auto___11612)){
+args__7632__auto__.push((arguments[i__7626__auto___11613]));
+
+var G__11614 = (i__7626__auto___11613 + (1));
+i__7626__auto___11613 = G__11614;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.println.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.println.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+cljs.core.pr_with_opts(objs,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(cljs.core.pr_opts(),new cljs.core.Keyword(null,"readably","readably",1129599760),false));
+
+if(cljs.core._STAR_print_newline_STAR_){
+return cljs.core.newline.cljs$core$IFn$_invoke$arity$1(cljs.core.pr_opts());
+} else {
+return null;
+}
+});
+
+cljs.core.println.cljs$lang$maxFixedArity = (0);
+
+cljs.core.println.cljs$lang$applyTo = (function (seq11611){
+return cljs.core.println.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11611));
+});
+
+/**
+ * println to a string, returning it
+ */
+cljs.core.println_str = (function cljs$core$println_str(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11616 = arguments.length;
+var i__7626__auto___11617 = (0);
+while(true){
+if((i__7626__auto___11617 < len__7625__auto___11616)){
+args__7632__auto__.push((arguments[i__7626__auto___11617]));
+
+var G__11618 = (i__7626__auto___11617 + (1));
+i__7626__auto___11617 = G__11618;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.println_str.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.println_str.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+return cljs.core.prn_str_with_opts(objs,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(cljs.core.pr_opts(),new cljs.core.Keyword(null,"readably","readably",1129599760),false));
+});
+
+cljs.core.println_str.cljs$lang$maxFixedArity = (0);
+
+cljs.core.println_str.cljs$lang$applyTo = (function (seq11615){
+return cljs.core.println_str.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11615));
+});
+
+/**
+ * Same as pr followed by (newline).
+ */
+cljs.core.prn = (function cljs$core$prn(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11620 = arguments.length;
+var i__7626__auto___11621 = (0);
+while(true){
+if((i__7626__auto___11621 < len__7625__auto___11620)){
+args__7632__auto__.push((arguments[i__7626__auto___11621]));
+
+var G__11622 = (i__7626__auto___11621 + (1));
+i__7626__auto___11621 = G__11622;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.prn.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.prn.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+cljs.core.pr_with_opts(objs,cljs.core.pr_opts());
+
+if(cljs.core._STAR_print_newline_STAR_){
+return cljs.core.newline.cljs$core$IFn$_invoke$arity$1(cljs.core.pr_opts());
+} else {
+return null;
+}
+});
+
+cljs.core.prn.cljs$lang$maxFixedArity = (0);
+
+cljs.core.prn.cljs$lang$applyTo = (function (seq11619){
+return cljs.core.prn.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11619));
+});
+
+cljs.core.strip_ns = (function cljs$core$strip_ns(named){
+if((named instanceof cljs.core.Symbol)){
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$2(null,cljs.core.name(named));
+} else {
+return cljs.core.keyword.cljs$core$IFn$_invoke$arity$2(null,cljs.core.name(named));
+}
+});
+/**
+ * Returns [lifted-ns lifted-map] or nil if m can't be lifted.
+ */
+cljs.core.lift_ns = (function cljs$core$lift_ns(m){
+if(cljs.core._STAR_print_namespace_maps_STAR_){
+var ns = null;
+var G__11648 = cljs.core.seq(m);
+var vec__11649 = G__11648;
+var seq__11650 = cljs.core.seq(vec__11649);
+var first__11651 = cljs.core.first(seq__11650);
+var seq__11650__$1 = cljs.core.next(seq__11650);
+var vec__11652 = first__11651;
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11652,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11652,(1),null);
+var entry = vec__11652;
+var entries = seq__11650__$1;
+var lm = cljs.core.empty(m);
+var ns__$1 = ns;
+var G__11648__$1 = G__11648;
+var lm__$1 = lm;
+while(true){
+var ns__$2 = ns__$1;
+var vec__11655 = G__11648__$1;
+var seq__11656 = cljs.core.seq(vec__11655);
+var first__11657 = cljs.core.first(seq__11656);
+var seq__11656__$1 = cljs.core.next(seq__11656);
+var vec__11658 = first__11657;
+var k__$1 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11658,(0),null);
+var v__$1 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11658,(1),null);
+var entry__$1 = vec__11658;
+var entries__$1 = seq__11656__$1;
+var lm__$2 = lm__$1;
+if(cljs.core.truth_(entry__$1)){
+if(((k__$1 instanceof cljs.core.Keyword)) || ((k__$1 instanceof cljs.core.Symbol))){
+if(cljs.core.truth_(ns__$2)){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(ns__$2,cljs.core.namespace(k__$1))){
+var G__11661 = ns__$2;
+var G__11662 = entries__$1;
+var G__11663 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(lm__$2,cljs.core.strip_ns(k__$1),v__$1);
+ns__$1 = G__11661;
+G__11648__$1 = G__11662;
+lm__$1 = G__11663;
+continue;
+} else {
+return null;
+}
+} else {
+var temp__4657__auto__ = cljs.core.namespace(k__$1);
+if(cljs.core.truth_(temp__4657__auto__)){
+var new_ns = temp__4657__auto__;
+var G__11664 = new_ns;
+var G__11665 = entries__$1;
+var G__11666 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(lm__$2,cljs.core.strip_ns(k__$1),v__$1);
+ns__$1 = G__11664;
+G__11648__$1 = G__11665;
+lm__$1 = G__11666;
+continue;
+} else {
+return null;
+}
+}
+} else {
+return null;
+}
+} else {
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [ns__$2,lm__$2], null);
+}
+break;
+}
+} else {
+return null;
+}
+});
+cljs.core.print_prefix_map = (function cljs$core$print_prefix_map(prefix,m,print_one,writer,opts){
+return cljs.core.pr_sequential_writer(writer,(function (e,w,opts__$1){
+var G__11673_11679 = cljs.core.key(e);
+var G__11674_11680 = w;
+var G__11675_11681 = opts__$1;
+(print_one.cljs$core$IFn$_invoke$arity$3 ? print_one.cljs$core$IFn$_invoke$arity$3(G__11673_11679,G__11674_11680,G__11675_11681) : print_one.call(null,G__11673_11679,G__11674_11680,G__11675_11681));
+
+cljs.core._write(w," ");
+
+var G__11676 = cljs.core.val(e);
+var G__11677 = w;
+var G__11678 = opts__$1;
+return (print_one.cljs$core$IFn$_invoke$arity$3 ? print_one.cljs$core$IFn$_invoke$arity$3(G__11676,G__11677,G__11678) : print_one.call(null,G__11676,G__11677,G__11678));
+}),[cljs.core.str.cljs$core$IFn$_invoke$arity$1(prefix),cljs.core.str.cljs$core$IFn$_invoke$arity$1("{")].join(''),", ","}",opts,cljs.core.seq(m));
+});
+cljs.core.print_map = (function cljs$core$print_map(m,print_one,writer,opts){
+var vec__11685 = cljs.core.lift_ns(m);
+var ns = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11685,(0),null);
+var lift_map = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11685,(1),null);
+if(cljs.core.truth_(ns)){
+return cljs.core.print_prefix_map([cljs.core.str.cljs$core$IFn$_invoke$arity$1("#:"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns)].join(''),lift_map,print_one,writer,opts);
+} else {
+return cljs.core.print_prefix_map(null,m,print_one,writer,opts);
+}
+});
+cljs.core.Volatile.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Volatile.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (a,writer,opts){
+var a__$1 = this;
+cljs.core._write(writer,"#object [cljs.core.Volatile ");
+
+cljs.core.pr_writer(new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"val","val",128701612),a__$1.state], null),writer,opts);
+
+return cljs.core._write(writer,"]");
+});
+
+cljs.core.Var.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Var.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (a,writer,opts){
+var a__$1 = this;
+cljs.core._write(writer,"#'");
+
+return cljs.core.pr_writer(a__$1.sym,writer,opts);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.IndexedSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.LazySeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.NodeSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.BlackNode.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"["," ","]",opts,coll__$1);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.ES6IteratorSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ES6IteratorSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"#{"," ","}",opts,coll__$1);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ObjMap.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.print_map(coll__$1,cljs.core.pr_writer,writer,opts);
+});
+
+cljs.core.Cons.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Cons.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.RSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.RSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.print_map(coll__$1,cljs.core.pr_writer,writer,opts);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Subvec.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"["," ","]",opts,coll__$1);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.print_map(coll__$1,cljs.core.pr_writer,writer,opts);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"#{"," ","}",opts,coll__$1);
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ChunkedCons.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.Atom.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Atom.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (a,writer,opts){
+var a__$1 = this;
+cljs.core._write(writer,"#object [cljs.core.Atom ");
+
+cljs.core.pr_writer(new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"val","val",128701612),a__$1.state], null),writer,opts);
+
+return cljs.core._write(writer,"]");
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ValSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.RedNode.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"["," ","]",opts,coll__$1);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentVector.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"["," ","]",opts,coll__$1);
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.EmptyList.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core._write(writer,"()");
+});
+
+cljs.core.LazyTransformer.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.LazyTransformer.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentQueue.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"#queue ["," ","]",opts,cljs.core.seq(coll__$1));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.print_map(coll__$1,cljs.core.pr_writer,writer,opts);
+});
+
+cljs.core.Range.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Range.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.KeySeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.List.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.List.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+cljs.core.Symbol.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Symbol.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if((y instanceof cljs.core.Symbol)){
+return cljs.core.compare_symbols(x__$1,y);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Cannot compare "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" to "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+
+cljs.core.Keyword.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Keyword.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if((y instanceof cljs.core.Keyword)){
+return cljs.core.compare_keywords(x__$1,y);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Cannot compare "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" to "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Subvec.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if(cljs.core.vector_QMARK_(y)){
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2(x__$1,y);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Cannot compare "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" to "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentVector.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if(cljs.core.vector_QMARK_(y)){
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2(x__$1,y);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Cannot compare "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" to "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+/**
+ * Atomically sets the metadata for a namespace/var/ref/agent/atom to be:
+ *
+ * (apply f its-current-meta args)
+ *
+ * f must be free of side-effects
+ */
+cljs.core.alter_meta_BANG_ = (function cljs$core$alter_meta_BANG_(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11691 = arguments.length;
+var i__7626__auto___11692 = (0);
+while(true){
+if((i__7626__auto___11692 < len__7625__auto___11691)){
+args__7632__auto__.push((arguments[i__7626__auto___11692]));
+
+var G__11693 = (i__7626__auto___11692 + (1));
+i__7626__auto___11692 = G__11693;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((2) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((2)),(0),null)):null);
+return cljs.core.alter_meta_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7633__auto__);
+});
+
+cljs.core.alter_meta_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (iref,f,args){
+return iref.meta = cljs.core.apply.cljs$core$IFn$_invoke$arity$3(f,iref.meta,args);
+});
+
+cljs.core.alter_meta_BANG_.cljs$lang$maxFixedArity = (2);
+
+cljs.core.alter_meta_BANG_.cljs$lang$applyTo = (function (seq11688){
+var G__11689 = cljs.core.first(seq11688);
+var seq11688__$1 = cljs.core.next(seq11688);
+var G__11690 = cljs.core.first(seq11688__$1);
+var seq11688__$2 = cljs.core.next(seq11688__$1);
+return cljs.core.alter_meta_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__11689,G__11690,seq11688__$2);
+});
+
+/**
+ * Atomically resets the metadata for an atom
+ */
+cljs.core.reset_meta_BANG_ = (function cljs$core$reset_meta_BANG_(iref,m){
+return iref.meta = m;
+});
+/**
+ * Adds a watch function to an atom reference. The watch fn must be a
+ * fn of 4 args: a key, the reference, its old-state, its
+ * new-state. Whenever the reference's state might have been changed,
+ * any registered watches will have their functions called. The watch
+ * fn will be called synchronously. Note that an atom's state
+ * may have changed again prior to the fn call, so use old/new-state
+ * rather than derefing the reference. Keys must be unique per
+ * reference, and can be used to remove the watch with remove-watch,
+ * but are otherwise considered opaque by the watch mechanism. Bear in
+ * mind that regardless of the result or action of the watch fns the
+ * atom's value will change. Example:
+ *
+ * (def a (atom 0))
+ * (add-watch a :inc (fn [k r o n] (assert (== 0 n))))
+ * (swap! a inc)
+ * ;; Assertion Error
+ * (deref a)
+ * ;=> 1
+ */
+cljs.core.add_watch = (function cljs$core$add_watch(iref,key,f){
+cljs.core._add_watch(iref,key,f);
+
+return iref;
+});
+/**
+ * Removes a watch (set by add-watch) from a reference
+ */
+cljs.core.remove_watch = (function cljs$core$remove_watch(iref,key){
+cljs.core._remove_watch(iref,key);
+
+return iref;
+});
+/**
+ * @type {*}
+ */
+cljs.core.gensym_counter = null;
+/**
+ * Returns a new symbol with a unique name. If a prefix string is
+ * supplied, the name is prefix# where # is some unique number. If
+ * prefix is not supplied, the prefix is 'G__'.
+ */
+cljs.core.gensym = (function cljs$core$gensym(var_args){
+var args11694 = [];
+var len__7625__auto___11697 = arguments.length;
+var i__7626__auto___11698 = (0);
+while(true){
+if((i__7626__auto___11698 < len__7625__auto___11697)){
+args11694.push((arguments[i__7626__auto___11698]));
+
+var G__11699 = (i__7626__auto___11698 + (1));
+i__7626__auto___11698 = G__11699;
+continue;
+} else {
+}
+break;
+}
+
+var G__11696 = args11694.length;
+switch (G__11696) {
+case 0:
+return cljs.core.gensym.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.gensym.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11694.length)].join('')));
+
+}
+});
+
+cljs.core.gensym.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.gensym.cljs$core$IFn$_invoke$arity$1("G__");
+});
+
+cljs.core.gensym.cljs$core$IFn$_invoke$arity$1 = (function (prefix_string){
+if((cljs.core.gensym_counter == null)){
+cljs.core.gensym_counter = (cljs.core.atom.cljs$core$IFn$_invoke$arity$1 ? cljs.core.atom.cljs$core$IFn$_invoke$arity$1((0)) : cljs.core.atom.call(null,(0)));
+} else {
+}
+
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$1([cljs.core.str.cljs$core$IFn$_invoke$arity$1(prefix_string),cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(cljs.core.gensym_counter,cljs.core.inc))].join(''));
+});
+
+cljs.core.gensym.cljs$lang$maxFixedArity = 1;
+
+cljs.core.fixture1 = (1);
+cljs.core.fixture2 = (2);
+
+/**
+* @constructor
+ * @implements {cljs.core.IPending}
+ * @implements {cljs.core.IDeref}
+*/
+cljs.core.Delay = (function (f,value){
+this.f = f;
+this.value = value;
+this.cljs$lang$protocol_mask$partition0$ = 32768;
+this.cljs$lang$protocol_mask$partition1$ = 1;
+})
+cljs.core.Delay.prototype.cljs$core$IDeref$_deref$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+if(cljs.core.truth_(self__.f)){
+self__.value = (self__.f.cljs$core$IFn$_invoke$arity$0 ? self__.f.cljs$core$IFn$_invoke$arity$0() : self__.f.call(null));
+
+self__.f = null;
+} else {
+}
+
+return self__.value;
+});
+
+cljs.core.Delay.prototype.cljs$core$IPending$_realized_QMARK_$arity$1 = (function (x){
+var self__ = this;
+var x__$1 = this;
+return cljs.core.not(self__.f);
+});
+
+cljs.core.Delay.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"f","f",43394975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"value","value",1946509744,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Delay.cljs$lang$type = true;
+
+cljs.core.Delay.cljs$lang$ctorStr = "cljs.core/Delay";
+
+cljs.core.Delay.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Delay");
+});
+
+cljs.core.__GT_Delay = (function cljs$core$__GT_Delay(f,value){
+return (new cljs.core.Delay(f,value));
+});
+
+/**
+ * returns true if x is a Delay created with delay
+ */
+cljs.core.delay_QMARK_ = (function cljs$core$delay_QMARK_(x){
+return (x instanceof cljs.core.Delay);
+});
+/**
+ * If x is a Delay, returns the (possibly cached) value of its expression, else returns x
+ */
+cljs.core.force = (function cljs$core$force(x){
+if(cljs.core.delay_QMARK_(x)){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(x) : cljs.core.deref.call(null,x));
+} else {
+return x;
+}
+});
+/**
+ * Returns true if a value has been produced for a delay or lazy sequence.
+ */
+cljs.core.realized_QMARK_ = (function cljs$core$realized_QMARK_(x){
+return cljs.core._realized_QMARK_(x);
+});
+cljs.core.preserving_reduced = (function cljs$core$preserving_reduced(rf){
+return (function (p1__11701_SHARP_,p2__11702_SHARP_){
+var ret = (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(p1__11701_SHARP_,p2__11702_SHARP_) : rf.call(null,p1__11701_SHARP_,p2__11702_SHARP_));
+if(cljs.core.reduced_QMARK_(ret)){
+return cljs.core.reduced(ret);
+} else {
+return ret;
+}
+});
+});
+/**
+ * A transducer which concatenates the contents of each input, which must be a
+ * collection, into the reduction.
+ */
+cljs.core.cat = (function cljs$core$cat(rf){
+var rf1 = cljs.core.preserving_reduced(rf);
+return ((function (rf1){
+return (function() {
+var G__11703 = null;
+var G__11703__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11703__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11703__2 = (function (result,input){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(rf1,result,input);
+});
+G__11703 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11703__0.call(this);
+case 1:
+return G__11703__1.call(this,result);
+case 2:
+return G__11703__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11703.cljs$core$IFn$_invoke$arity$0 = G__11703__0;
+G__11703.cljs$core$IFn$_invoke$arity$1 = G__11703__1;
+G__11703.cljs$core$IFn$_invoke$arity$2 = G__11703__2;
+return G__11703;
+})()
+;})(rf1))
+});
+/**
+ * Returns a transducer that ends transduction when pred returns true
+ * for an input. When retf is supplied it must be a fn of 2 arguments -
+ * it will be passed the (completed) result so far and the input that
+ * triggered the predicate, and its return value (if it does not throw
+ * an exception) will be the return value of the transducer. If retf
+ * is not supplied, the input that triggered the predicate will be
+ * returned. If the predicate never returns true the transduction is
+ * unaffected.
+ */
+cljs.core.halt_when = (function cljs$core$halt_when(var_args){
+var args11704 = [];
+var len__7625__auto___11709 = arguments.length;
+var i__7626__auto___11710 = (0);
+while(true){
+if((i__7626__auto___11710 < len__7625__auto___11709)){
+args11704.push((arguments[i__7626__auto___11710]));
+
+var G__11711 = (i__7626__auto___11710 + (1));
+i__7626__auto___11710 = G__11711;
+continue;
+} else {
+}
+break;
+}
+
+var G__11706 = args11704.length;
+switch (G__11706) {
+case 1:
+return cljs.core.halt_when.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.halt_when.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11704.length)].join('')));
+
+}
+});
+
+cljs.core.halt_when.cljs$core$IFn$_invoke$arity$1 = (function (pred){
+return cljs.core.halt_when.cljs$core$IFn$_invoke$arity$2(pred,null);
+});
+
+cljs.core.halt_when.cljs$core$IFn$_invoke$arity$2 = (function (pred,retf){
+return (function (rf){
+return (function() {
+var G__11713 = null;
+var G__11713__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11713__1 = (function (result){
+if((cljs.core.map_QMARK_(result)) && (cljs.core.contains_QMARK_(result,new cljs.core.Keyword("cljs.core","halt","cljs.core/halt",-1049036715)))){
+return new cljs.core.Keyword("cljs.core","halt","cljs.core/halt",-1049036715).cljs$core$IFn$_invoke$arity$1(result);
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+}
+});
+var G__11713__2 = (function (result,input){
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(input) : pred.call(null,input)))){
+return cljs.core.reduced(new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("cljs.core","halt","cljs.core/halt",-1049036715),(cljs.core.truth_(retf)?(function (){var G__11707 = (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+var G__11708 = input;
+return (retf.cljs$core$IFn$_invoke$arity$2 ? retf.cljs$core$IFn$_invoke$arity$2(G__11707,G__11708) : retf.call(null,G__11707,G__11708));
+})():input)], null));
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__11713 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11713__0.call(this);
+case 1:
+return G__11713__1.call(this,result);
+case 2:
+return G__11713__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11713.cljs$core$IFn$_invoke$arity$0 = G__11713__0;
+G__11713.cljs$core$IFn$_invoke$arity$1 = G__11713__1;
+G__11713.cljs$core$IFn$_invoke$arity$2 = G__11713__2;
+return G__11713;
+})()
+});
+});
+
+cljs.core.halt_when.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence removing consecutive duplicates in coll.
+ * Returns a transducer when no collection is provided.
+ */
+cljs.core.dedupe = (function cljs$core$dedupe(var_args){
+var args11714 = [];
+var len__7625__auto___11717 = arguments.length;
+var i__7626__auto___11718 = (0);
+while(true){
+if((i__7626__auto___11718 < len__7625__auto___11717)){
+args11714.push((arguments[i__7626__auto___11718]));
+
+var G__11719 = (i__7626__auto___11718 + (1));
+i__7626__auto___11718 = G__11719;
+continue;
+} else {
+}
+break;
+}
+
+var G__11716 = args11714.length;
+switch (G__11716) {
+case 0:
+return cljs.core.dedupe.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.dedupe.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11714.length)].join('')));
+
+}
+});
+
+cljs.core.dedupe.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (function (rf){
+var pa = cljs.core.volatile_BANG_(new cljs.core.Keyword("cljs.core","none","cljs.core/none",926646439));
+return ((function (pa){
+return (function() {
+var G__11721 = null;
+var G__11721__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11721__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11721__2 = (function (result,input){
+var prior = (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(pa) : cljs.core.deref.call(null,pa));
+cljs.core.vreset_BANG_(pa,input);
+
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(prior,input)){
+return result;
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__11721 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11721__0.call(this);
+case 1:
+return G__11721__1.call(this,result);
+case 2:
+return G__11721__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11721.cljs$core$IFn$_invoke$arity$0 = G__11721__0;
+G__11721.cljs$core$IFn$_invoke$arity$1 = G__11721__1;
+G__11721.cljs$core$IFn$_invoke$arity$2 = G__11721__2;
+return G__11721;
+})()
+;})(pa))
+});
+});
+
+cljs.core.dedupe.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+return cljs.core.sequence.cljs$core$IFn$_invoke$arity$2(cljs.core.dedupe.cljs$core$IFn$_invoke$arity$0(),coll);
+});
+
+cljs.core.dedupe.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Returns items from coll with random probability of prob (0.0 -
+ * 1.0). Returns a transducer when no collection is provided.
+ */
+cljs.core.random_sample = (function cljs$core$random_sample(var_args){
+var args11722 = [];
+var len__7625__auto___11725 = arguments.length;
+var i__7626__auto___11726 = (0);
+while(true){
+if((i__7626__auto___11726 < len__7625__auto___11725)){
+args11722.push((arguments[i__7626__auto___11726]));
+
+var G__11727 = (i__7626__auto___11726 + (1));
+i__7626__auto___11726 = G__11727;
+continue;
+} else {
+}
+break;
+}
+
+var G__11724 = args11722.length;
+switch (G__11724) {
+case 1:
+return cljs.core.random_sample.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.random_sample.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11722.length)].join('')));
+
+}
+});
+
+cljs.core.random_sample.cljs$core$IFn$_invoke$arity$1 = (function (prob){
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$1((function (_){
+return ((cljs.core.rand.cljs$core$IFn$_invoke$arity$0 ? cljs.core.rand.cljs$core$IFn$_invoke$arity$0() : cljs.core.rand.call(null)) < prob);
+}));
+});
+
+cljs.core.random_sample.cljs$core$IFn$_invoke$arity$2 = (function (prob,coll){
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$2((function (_){
+return ((cljs.core.rand.cljs$core$IFn$_invoke$arity$0 ? cljs.core.rand.cljs$core$IFn$_invoke$arity$0() : cljs.core.rand.call(null)) < prob);
+}),coll);
+});
+
+cljs.core.random_sample.cljs$lang$maxFixedArity = 2;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IPrintWithWriter}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Eduction = (function (xform,coll){
+this.xform = xform;
+this.coll = coll;
+this.cljs$lang$protocol_mask$partition0$ = 2173173760;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.Eduction.prototype.indexOf = (function() {
+var G__11729 = null;
+var G__11729__1 = (function (x){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll__$1,x,(0));
+});
+var G__11729__2 = (function (x,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll__$1,x,start);
+});
+G__11729 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11729__1.call(this,x);
+case 2:
+return G__11729__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11729.cljs$core$IFn$_invoke$arity$1 = G__11729__1;
+G__11729.cljs$core$IFn$_invoke$arity$2 = G__11729__2;
+return G__11729;
+})()
+;
+
+cljs.core.Eduction.prototype.lastIndexOf = (function() {
+var G__11730 = null;
+var G__11730__1 = (function (x){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll__$1,x,cljs.core.count(coll__$1));
+});
+var G__11730__2 = (function (x,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll__$1,x,start);
+});
+G__11730 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11730__1.call(this,x);
+case 2:
+return G__11730__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11730.cljs$core$IFn$_invoke$arity$1 = G__11730__1;
+G__11730.cljs$core$IFn$_invoke$arity$2 = G__11730__2;
+return G__11730;
+})()
+;
+
+cljs.core.Eduction.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.seq(cljs.core.sequence.cljs$core$IFn$_invoke$arity$2(self__.xform,self__.coll));
+});
+
+cljs.core.Eduction.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (_,f){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$3(self__.xform,cljs.core.completing.cljs$core$IFn$_invoke$arity$1(f),self__.coll);
+});
+
+cljs.core.Eduction.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (_,f,init){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$4(self__.xform,cljs.core.completing.cljs$core$IFn$_invoke$arity$1(f),init,self__.coll);
+});
+
+cljs.core.Eduction.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll__$1,writer,opts){
+var self__ = this;
+var coll__$2 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$2);
+});
+
+cljs.core.Eduction.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"xform","xform",-85179481,null),new cljs.core.Symbol(null,"coll","coll",-1006698606,null)], null);
+});
+
+cljs.core.Eduction.cljs$lang$type = true;
+
+cljs.core.Eduction.cljs$lang$ctorStr = "cljs.core/Eduction";
+
+cljs.core.Eduction.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Eduction");
+});
+
+cljs.core.__GT_Eduction = (function cljs$core$__GT_Eduction(xform,coll){
+return (new cljs.core.Eduction(xform,coll));
+});
+
+(cljs.core.Eduction.prototype[cljs.core.ITER_SYMBOL] = (function (){
+var this__7526__auto__ = this;
+return cljs.core.es6_iterator(this__7526__auto__);
+}));
+/**
+ * Returns a reducible/iterable application of the transducers
+ * to the items in coll. Transducers are applied in order as if
+ * combined with comp. Note that these applications will be
+ * performed every time reduce/iterator is called.
+ */
+cljs.core.eduction = (function cljs$core$eduction(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11732 = arguments.length;
+var i__7626__auto___11733 = (0);
+while(true){
+if((i__7626__auto___11733 < len__7625__auto___11732)){
+args__7632__auto__.push((arguments[i__7626__auto___11733]));
+
+var G__11734 = (i__7626__auto___11733 + (1));
+i__7626__auto___11733 = G__11734;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((0) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((0)),(0),null)):null);
+return cljs.core.eduction.cljs$core$IFn$_invoke$arity$variadic(argseq__7633__auto__);
+});
+
+cljs.core.eduction.cljs$core$IFn$_invoke$arity$variadic = (function (xforms){
+return (new cljs.core.Eduction(cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.comp,cljs.core.butlast(xforms)),cljs.core.last(xforms)));
+});
+
+cljs.core.eduction.cljs$lang$maxFixedArity = (0);
+
+cljs.core.eduction.cljs$lang$applyTo = (function (seq11731){
+return cljs.core.eduction.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11731));
+});
+
+/**
+ * Runs the supplied procedure (via reduce), for purposes of side
+ * effects, on successive items in the collection. Returns nil
+ */
+cljs.core.run_BANG_ = (function cljs$core$run_BANG_(proc,coll){
+cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (p1__11736_SHARP_,p2__11735_SHARP_){
+return (proc.cljs$core$IFn$_invoke$arity$1 ? proc.cljs$core$IFn$_invoke$arity$1(p2__11735_SHARP_) : proc.call(null,p2__11735_SHARP_));
+}),null,coll);
+
+return null;
+});
+
+/**
+ * @interface
+ */
+cljs.core.IEncodeJS = function(){};
+
+/**
+ * Recursively transforms clj values to JavaScript
+ */
+cljs.core._clj__GT_js = (function cljs$core$_clj__GT_js(x){
+if((!((x == null))) && (!((x.cljs$core$IEncodeJS$_clj__GT_js$arity$1 == null)))){
+return x.cljs$core$IEncodeJS$_clj__GT_js$arity$1(x);
+} else {
+var x__7180__auto__ = (((x == null))?null:x);
+var m__7181__auto__ = (cljs.core._clj__GT_js[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(x) : m__7181__auto__.call(null,x));
+} else {
+var m__7181__auto____$1 = (cljs.core._clj__GT_js["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(x) : m__7181__auto____$1.call(null,x));
+} else {
+throw cljs.core.missing_protocol("IEncodeJS.-clj->js",x);
+}
+}
+}
+});
+
+/**
+ * Transforms map keys to valid JavaScript keys. Arbitrary keys are
+ * encoded to their string representation via (pr-str x)
+ */
+cljs.core._key__GT_js = (function cljs$core$_key__GT_js(x){
+if((!((x == null))) && (!((x.cljs$core$IEncodeJS$_key__GT_js$arity$1 == null)))){
+return x.cljs$core$IEncodeJS$_key__GT_js$arity$1(x);
+} else {
+var x__7180__auto__ = (((x == null))?null:x);
+var m__7181__auto__ = (cljs.core._key__GT_js[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(x) : m__7181__auto__.call(null,x));
+} else {
+var m__7181__auto____$1 = (cljs.core._key__GT_js["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(x) : m__7181__auto____$1.call(null,x));
+} else {
+throw cljs.core.missing_protocol("IEncodeJS.-key->js",x);
+}
+}
+}
+});
+
+cljs.core.key__GT_js = (function cljs$core$key__GT_js(k){
+if(((!((k == null)))?(((false) || ((cljs.core.PROTOCOL_SENTINEL === k.cljs$core$IEncodeJS$)))?true:(((!k.cljs$lang$protocol_mask$partition$))?cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeJS,k):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeJS,k))){
+return cljs.core._clj__GT_js(k);
+} else {
+if((typeof k === 'string') || (typeof k === 'number') || ((k instanceof cljs.core.Keyword)) || ((k instanceof cljs.core.Symbol))){
+return (cljs.core.clj__GT_js.cljs$core$IFn$_invoke$arity$1 ? cljs.core.clj__GT_js.cljs$core$IFn$_invoke$arity$1(k) : cljs.core.clj__GT_js.call(null,k));
+} else {
+return cljs.core.pr_str.cljs$core$IFn$_invoke$arity$variadic(cljs.core.array_seq([k], 0));
+}
+}
+});
+/**
+ * Recursively transforms ClojureScript values to JavaScript.
+ * sets/vectors/lists become Arrays, Keywords and Symbol become Strings,
+ * Maps become Objects. Arbitrary keys are encoded to by key->js.
+ */
+cljs.core.clj__GT_js = (function cljs$core$clj__GT_js(x){
+if((x == null)){
+return null;
+} else {
+if(((!((x == null)))?(((false) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IEncodeJS$)))?true:(((!x.cljs$lang$protocol_mask$partition$))?cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeJS,x):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeJS,x))){
+return cljs.core._clj__GT_js(x);
+} else {
+if((x instanceof cljs.core.Keyword)){
+return cljs.core.name(x);
+} else {
+if((x instanceof cljs.core.Symbol)){
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(x)].join('');
+} else {
+if(cljs.core.map_QMARK_(x)){
+var m = {};
+var seq__11759_11773 = cljs.core.seq(x);
+var chunk__11760_11774 = null;
+var count__11761_11775 = (0);
+var i__11762_11776 = (0);
+while(true){
+if((i__11762_11776 < count__11761_11775)){
+var vec__11763_11777 = chunk__11760_11774.cljs$core$IIndexed$_nth$arity$2(null,i__11762_11776);
+var k_11778 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11763_11777,(0),null);
+var v_11779 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11763_11777,(1),null);
+(m[cljs.core.key__GT_js(k_11778)] = (cljs.core.clj__GT_js.cljs$core$IFn$_invoke$arity$1 ? cljs.core.clj__GT_js.cljs$core$IFn$_invoke$arity$1(v_11779) : cljs.core.clj__GT_js.call(null,v_11779)));
+
+var G__11780 = seq__11759_11773;
+var G__11781 = chunk__11760_11774;
+var G__11782 = count__11761_11775;
+var G__11783 = (i__11762_11776 + (1));
+seq__11759_11773 = G__11780;
+chunk__11760_11774 = G__11781;
+count__11761_11775 = G__11782;
+i__11762_11776 = G__11783;
+continue;
+} else {
+var temp__4657__auto___11784 = cljs.core.seq(seq__11759_11773);
+if(temp__4657__auto___11784){
+var seq__11759_11785__$1 = temp__4657__auto___11784;
+if(cljs.core.chunked_seq_QMARK_(seq__11759_11785__$1)){
+var c__7331__auto___11786 = cljs.core.chunk_first(seq__11759_11785__$1);
+var G__11787 = cljs.core.chunk_rest(seq__11759_11785__$1);
+var G__11788 = c__7331__auto___11786;
+var G__11789 = cljs.core.count(c__7331__auto___11786);
+var G__11790 = (0);
+seq__11759_11773 = G__11787;
+chunk__11760_11774 = G__11788;
+count__11761_11775 = G__11789;
+i__11762_11776 = G__11790;
+continue;
+} else {
+var vec__11766_11791 = cljs.core.first(seq__11759_11785__$1);
+var k_11792 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11766_11791,(0),null);
+var v_11793 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11766_11791,(1),null);
+(m[cljs.core.key__GT_js(k_11792)] = (cljs.core.clj__GT_js.cljs$core$IFn$_invoke$arity$1 ? cljs.core.clj__GT_js.cljs$core$IFn$_invoke$arity$1(v_11793) : cljs.core.clj__GT_js.call(null,v_11793)));
+
+var G__11794 = cljs.core.next(seq__11759_11785__$1);
+var G__11795 = null;
+var G__11796 = (0);
+var G__11797 = (0);
+seq__11759_11773 = G__11794;
+chunk__11760_11774 = G__11795;
+count__11761_11775 = G__11796;
+i__11762_11776 = G__11797;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+return m;
+} else {
+if(cljs.core.coll_QMARK_(x)){
+var arr = [];
+var seq__11769_11798 = cljs.core.seq(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.clj__GT_js,x));
+var chunk__11770_11799 = null;
+var count__11771_11800 = (0);
+var i__11772_11801 = (0);
+while(true){
+if((i__11772_11801 < count__11771_11800)){
+var x_11802__$1 = chunk__11770_11799.cljs$core$IIndexed$_nth$arity$2(null,i__11772_11801);
+arr.push(x_11802__$1);
+
+var G__11803 = seq__11769_11798;
+var G__11804 = chunk__11770_11799;
+var G__11805 = count__11771_11800;
+var G__11806 = (i__11772_11801 + (1));
+seq__11769_11798 = G__11803;
+chunk__11770_11799 = G__11804;
+count__11771_11800 = G__11805;
+i__11772_11801 = G__11806;
+continue;
+} else {
+var temp__4657__auto___11807 = cljs.core.seq(seq__11769_11798);
+if(temp__4657__auto___11807){
+var seq__11769_11808__$1 = temp__4657__auto___11807;
+if(cljs.core.chunked_seq_QMARK_(seq__11769_11808__$1)){
+var c__7331__auto___11809 = cljs.core.chunk_first(seq__11769_11808__$1);
+var G__11810 = cljs.core.chunk_rest(seq__11769_11808__$1);
+var G__11811 = c__7331__auto___11809;
+var G__11812 = cljs.core.count(c__7331__auto___11809);
+var G__11813 = (0);
+seq__11769_11798 = G__11810;
+chunk__11770_11799 = G__11811;
+count__11771_11800 = G__11812;
+i__11772_11801 = G__11813;
+continue;
+} else {
+var x_11814__$1 = cljs.core.first(seq__11769_11808__$1);
+arr.push(x_11814__$1);
+
+var G__11815 = cljs.core.next(seq__11769_11808__$1);
+var G__11816 = null;
+var G__11817 = (0);
+var G__11818 = (0);
+seq__11769_11798 = G__11815;
+chunk__11770_11799 = G__11816;
+count__11771_11800 = G__11817;
+i__11772_11801 = G__11818;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+return arr;
+} else {
+return x;
+
+}
+}
+}
+}
+}
+}
+});
+
+/**
+ * @interface
+ */
+cljs.core.IEncodeClojure = function(){};
+
+/**
+ * Transforms JavaScript values to Clojure
+ */
+cljs.core._js__GT_clj = (function cljs$core$_js__GT_clj(x,options){
+if((!((x == null))) && (!((x.cljs$core$IEncodeClojure$_js__GT_clj$arity$2 == null)))){
+return x.cljs$core$IEncodeClojure$_js__GT_clj$arity$2(x,options);
+} else {
+var x__7180__auto__ = (((x == null))?null:x);
+var m__7181__auto__ = (cljs.core._js__GT_clj[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(x,options) : m__7181__auto__.call(null,x,options));
+} else {
+var m__7181__auto____$1 = (cljs.core._js__GT_clj["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(x,options) : m__7181__auto____$1.call(null,x,options));
+} else {
+throw cljs.core.missing_protocol("IEncodeClojure.-js->clj",x);
+}
+}
+}
+});
+
+/**
+ * Recursively transforms JavaScript arrays into ClojureScript
+ * vectors, and JavaScript objects into ClojureScript maps. With
+ * option ':keywordize-keys true' will convert object fields from
+ * strings to keywords.
+ */
+cljs.core.js__GT_clj = (function cljs$core$js__GT_clj(var_args){
+var args11819 = [];
+var len__7625__auto___11844 = arguments.length;
+var i__7626__auto___11845 = (0);
+while(true){
+if((i__7626__auto___11845 < len__7625__auto___11844)){
+args11819.push((arguments[i__7626__auto___11845]));
+
+var G__11846 = (i__7626__auto___11845 + (1));
+i__7626__auto___11845 = G__11846;
+continue;
+} else {
+}
+break;
+}
+
+var G__11823 = args11819.length;
+switch (G__11823) {
+case 1:
+return cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args11819.slice((1)),(0),null));
+return cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic(x,cljs.core.array_seq([new cljs.core.Keyword(null,"keywordize-keys","keywordize-keys",1310784252),false], 0));
+});
+
+cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic = (function (x,opts){
+var map__11824 = opts;
+var map__11824__$1 = ((((!((map__11824 == null)))?((((map__11824.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__11824.cljs$core$ISeq$)))?true:false):false))?cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.hash_map,map__11824):map__11824);
+var keywordize_keys = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__11824__$1,new cljs.core.Keyword(null,"keywordize-keys","keywordize-keys",1310784252));
+var keyfn = (cljs.core.truth_(keywordize_keys)?cljs.core.keyword:cljs.core.str);
+var f = ((function (map__11824,map__11824__$1,keywordize_keys,keyfn){
+return (function cljs$core$thisfn(x__$1){
+if(((!((x__$1 == null)))?(((false) || ((cljs.core.PROTOCOL_SENTINEL === x__$1.cljs$core$IEncodeClojure$)))?true:(((!x__$1.cljs$lang$protocol_mask$partition$))?cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeClojure,x__$1):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeClojure,x__$1))){
+return cljs.core._js__GT_clj(x__$1,cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.array_map,opts));
+} else {
+if(cljs.core.seq_QMARK_(x__$1)){
+return cljs.core.doall.cljs$core$IFn$_invoke$arity$1(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs$core$thisfn,x__$1));
+} else {
+if(cljs.core.coll_QMARK_(x__$1)){
+return cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.empty(x__$1),cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs$core$thisfn,x__$1));
+} else {
+if(cljs.core.array_QMARK_(x__$1)){
+return cljs.core.vec(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs$core$thisfn,x__$1));
+} else {
+if((cljs.core.type(x__$1) === Object)){
+return cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentArrayMap.EMPTY,(function (){var iter__7300__auto__ = ((function (map__11824,map__11824__$1,keywordize_keys,keyfn){
+return (function cljs$core$thisfn_$_iter__11838(s__11839){
+return (new cljs.core.LazySeq(null,((function (map__11824,map__11824__$1,keywordize_keys,keyfn){
+return (function (){
+var s__11839__$1 = s__11839;
+while(true){
+var temp__4657__auto__ = cljs.core.seq(s__11839__$1);
+if(temp__4657__auto__){
+var s__11839__$2 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s__11839__$2)){
+var c__7298__auto__ = cljs.core.chunk_first(s__11839__$2);
+var size__7299__auto__ = cljs.core.count(c__7298__auto__);
+var b__11841 = cljs.core.chunk_buffer(size__7299__auto__);
+if((function (){var i__11840 = (0);
+while(true){
+if((i__11840 < size__7299__auto__)){
+var k = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c__7298__auto__,i__11840);
+cljs.core.chunk_append(b__11841,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(keyfn.cljs$core$IFn$_invoke$arity$1 ? keyfn.cljs$core$IFn$_invoke$arity$1(k) : keyfn.call(null,k)),cljs$core$thisfn((x__$1[k]))], null));
+
+var G__11848 = (i__11840 + (1));
+i__11840 = G__11848;
+continue;
+} else {
+return true;
+}
+break;
+}
+})()){
+return cljs.core.chunk_cons(cljs.core.chunk(b__11841),cljs$core$thisfn_$_iter__11838(cljs.core.chunk_rest(s__11839__$2)));
+} else {
+return cljs.core.chunk_cons(cljs.core.chunk(b__11841),null);
+}
+} else {
+var k = cljs.core.first(s__11839__$2);
+return cljs.core.cons(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(keyfn.cljs$core$IFn$_invoke$arity$1 ? keyfn.cljs$core$IFn$_invoke$arity$1(k) : keyfn.call(null,k)),cljs$core$thisfn((x__$1[k]))], null),cljs$core$thisfn_$_iter__11838(cljs.core.rest(s__11839__$2)));
+}
+} else {
+return null;
+}
+break;
+}
+});})(map__11824,map__11824__$1,keywordize_keys,keyfn))
+,null,null));
+});})(map__11824,map__11824__$1,keywordize_keys,keyfn))
+;
+return iter__7300__auto__(cljs.core.js_keys(x__$1));
+})());
+} else {
+return x__$1;
+
+}
+}
+}
+}
+}
+});})(map__11824,map__11824__$1,keywordize_keys,keyfn))
+;
+return f(x);
+});
+
+cljs.core.js__GT_clj.cljs$lang$applyTo = (function (seq11820){
+var G__11821 = cljs.core.first(seq11820);
+var seq11820__$1 = cljs.core.next(seq11820);
+return cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic(G__11821,seq11820__$1);
+});
+
+cljs.core.js__GT_clj.cljs$lang$maxFixedArity = (1);
+
+/**
+ * Returns a memoized version of a referentially transparent function. The
+ * memoized version of the function keeps a cache of the mapping from arguments
+ * to results and, when calls with the same arguments are repeated often, has
+ * higher performance at the expense of higher memory use.
+ */
+cljs.core.memoize = (function cljs$core$memoize(f){
+var mem = (function (){var G__11850 = cljs.core.PersistentArrayMap.EMPTY;
+return (cljs.core.atom.cljs$core$IFn$_invoke$arity$1 ? cljs.core.atom.cljs$core$IFn$_invoke$arity$1(G__11850) : cljs.core.atom.call(null,G__11850));
+})();
+return ((function (mem){
+return (function() {
+var G__11851__delegate = function (args){
+var v = cljs.core.get.cljs$core$IFn$_invoke$arity$3((cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(mem) : cljs.core.deref.call(null,mem)),args,cljs.core.lookup_sentinel);
+if((v === cljs.core.lookup_sentinel)){
+var ret = cljs.core.apply.cljs$core$IFn$_invoke$arity$2(f,args);
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(mem,cljs.core.assoc,args,ret);
+
+return ret;
+} else {
+return v;
+}
+};
+var G__11851 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__11852__i = 0, G__11852__a = new Array(arguments.length - 0);
+while (G__11852__i < G__11852__a.length) {G__11852__a[G__11852__i] = arguments[G__11852__i + 0]; ++G__11852__i;}
+ args = new cljs.core.IndexedSeq(G__11852__a,0);
+}
+return G__11851__delegate.call(this,args);};
+G__11851.cljs$lang$maxFixedArity = 0;
+G__11851.cljs$lang$applyTo = (function (arglist__11853){
+var args = cljs.core.seq(arglist__11853);
+return G__11851__delegate(args);
+});
+G__11851.cljs$core$IFn$_invoke$arity$variadic = G__11851__delegate;
+return G__11851;
+})()
+;
+;})(mem))
+});
+/**
+ * trampoline can be used to convert algorithms requiring mutual
+ * recursion without stack consumption. Calls f with supplied args, if
+ * any. If f returns a fn, calls that fn with no arguments, and
+ * continues to repeat, until the return value is not a fn, then
+ * returns that non-fn value. Note that if you want to return a fn as a
+ * final value, you must wrap it in some data structure and unpack it
+ * after trampoline returns.
+ */
+cljs.core.trampoline = (function cljs$core$trampoline(var_args){
+var args11854 = [];
+var len__7625__auto___11859 = arguments.length;
+var i__7626__auto___11860 = (0);
+while(true){
+if((i__7626__auto___11860 < len__7625__auto___11859)){
+args11854.push((arguments[i__7626__auto___11860]));
+
+var G__11861 = (i__7626__auto___11860 + (1));
+i__7626__auto___11860 = G__11861;
+continue;
+} else {
+}
+break;
+}
+
+var G__11858 = args11854.length;
+switch (G__11858) {
+case 1:
+return cljs.core.trampoline.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+var argseq__7644__auto__ = (new cljs.core.IndexedSeq(args11854.slice((1)),(0),null));
+return cljs.core.trampoline.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7644__auto__);
+
+}
+});
+
+cljs.core.trampoline.cljs$core$IFn$_invoke$arity$1 = (function (f){
+while(true){
+var ret = (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+if(cljs.core.fn_QMARK_(ret)){
+var G__11863 = ret;
+f = G__11863;
+continue;
+} else {
+return ret;
+}
+break;
+}
+});
+
+cljs.core.trampoline.cljs$core$IFn$_invoke$arity$variadic = (function (f,args){
+return cljs.core.trampoline.cljs$core$IFn$_invoke$arity$1((function (){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$2(f,args);
+}));
+});
+
+cljs.core.trampoline.cljs$lang$applyTo = (function (seq11855){
+var G__11856 = cljs.core.first(seq11855);
+var seq11855__$1 = cljs.core.next(seq11855);
+return cljs.core.trampoline.cljs$core$IFn$_invoke$arity$variadic(G__11856,seq11855__$1);
+});
+
+cljs.core.trampoline.cljs$lang$maxFixedArity = (1);
+
+/**
+ * Returns a random floating point number between 0 (inclusive) and
+ * n (default 1) (exclusive).
+ */
+cljs.core.rand = (function cljs$core$rand(var_args){
+var args11864 = [];
+var len__7625__auto___11867 = arguments.length;
+var i__7626__auto___11868 = (0);
+while(true){
+if((i__7626__auto___11868 < len__7625__auto___11867)){
+args11864.push((arguments[i__7626__auto___11868]));
+
+var G__11869 = (i__7626__auto___11868 + (1));
+i__7626__auto___11868 = G__11869;
+continue;
+} else {
+}
+break;
+}
+
+var G__11866 = args11864.length;
+switch (G__11866) {
+case 0:
+return cljs.core.rand.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.rand.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11864.length)].join('')));
+
+}
+});
+
+cljs.core.rand.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.rand.cljs$core$IFn$_invoke$arity$1((1));
+});
+
+cljs.core.rand.cljs$core$IFn$_invoke$arity$1 = (function (n){
+return (Math.random() * n);
+});
+
+cljs.core.rand.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Returns a random integer between 0 (inclusive) and n (exclusive).
+ */
+cljs.core.rand_int = (function cljs$core$rand_int(n){
+var G__11872 = (Math.random() * n);
+return Math.floor(G__11872);
+});
+/**
+ * Return a random element of the (sequential) collection. Will have
+ * the same performance characteristics as nth for the given
+ * collection.
+ */
+cljs.core.rand_nth = (function cljs$core$rand_nth(coll){
+return cljs.core.nth.cljs$core$IFn$_invoke$arity$2(coll,cljs.core.rand_int(cljs.core.count(coll)));
+});
+/**
+ * Returns a map of the elements of coll keyed by the result of
+ * f on each element. The value at each key will be a vector of the
+ * corresponding elements, in the order they appeared in coll.
+ */
+cljs.core.group_by = (function cljs$core$group_by(f,coll){
+return cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (ret,x){
+var k = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x));
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(ret,k,cljs.core.conj.cljs$core$IFn$_invoke$arity$2(cljs.core.get.cljs$core$IFn$_invoke$arity$3(ret,k,cljs.core.PersistentVector.EMPTY),x));
+}),cljs.core.transient$(cljs.core.PersistentArrayMap.EMPTY),coll));
+});
+/**
+ * Creates a hierarchy object for use with derive, isa? etc.
+ */
+cljs.core.make_hierarchy = (function cljs$core$make_hierarchy(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"parents","parents",-2027538891),cljs.core.PersistentArrayMap.EMPTY,new cljs.core.Keyword(null,"descendants","descendants",1824886031),cljs.core.PersistentArrayMap.EMPTY,new cljs.core.Keyword(null,"ancestors","ancestors",-776045424),cljs.core.PersistentArrayMap.EMPTY], null);
+});
+/**
+ * @type {*}
+ */
+cljs.core._global_hierarchy = null;
+cljs.core.get_global_hierarchy = (function cljs$core$get_global_hierarchy(){
+if((cljs.core._global_hierarchy == null)){
+cljs.core._global_hierarchy = (function (){var G__11874 = cljs.core.make_hierarchy();
+return (cljs.core.atom.cljs$core$IFn$_invoke$arity$1 ? cljs.core.atom.cljs$core$IFn$_invoke$arity$1(G__11874) : cljs.core.atom.call(null,G__11874));
+})();
+} else {
+}
+
+return cljs.core._global_hierarchy;
+});
+cljs.core.swap_global_hierarchy_BANG_ = (function cljs$core$swap_global_hierarchy_BANG_(var_args){
+var args__7632__auto__ = [];
+var len__7625__auto___11877 = arguments.length;
+var i__7626__auto___11878 = (0);
+while(true){
+if((i__7626__auto___11878 < len__7625__auto___11877)){
+args__7632__auto__.push((arguments[i__7626__auto___11878]));
+
+var G__11879 = (i__7626__auto___11878 + (1));
+i__7626__auto___11878 = G__11879;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7633__auto__ = ((((1) < args__7632__auto__.length))?(new cljs.core.IndexedSeq(args__7632__auto__.slice((1)),(0),null)):null);
+return cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7633__auto__);
+});
+
+cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (f,args){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$4(cljs.core.swap_BANG_,cljs.core.get_global_hierarchy(),f,args);
+});
+
+cljs.core.swap_global_hierarchy_BANG_.cljs$lang$maxFixedArity = (1);
+
+cljs.core.swap_global_hierarchy_BANG_.cljs$lang$applyTo = (function (seq11875){
+var G__11876 = cljs.core.first(seq11875);
+var seq11875__$1 = cljs.core.next(seq11875);
+return cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic(G__11876,seq11875__$1);
+});
+
+/**
+ * Returns true if (= child parent), or child is directly or indirectly derived from
+ * parent, either via a JavaScript type inheritance relationship or a
+ * relationship established via derive. h must be a hierarchy obtained
+ * from make-hierarchy, if not supplied defaults to the global
+ * hierarchy
+ */
+cljs.core.isa_QMARK_ = (function cljs$core$isa_QMARK_(var_args){
+var args11880 = [];
+var len__7625__auto___11884 = arguments.length;
+var i__7626__auto___11885 = (0);
+while(true){
+if((i__7626__auto___11885 < len__7625__auto___11884)){
+args11880.push((arguments[i__7626__auto___11885]));
+
+var G__11886 = (i__7626__auto___11885 + (1));
+i__7626__auto___11885 = G__11886;
+continue;
+} else {
+}
+break;
+}
+
+var G__11882 = args11880.length;
+switch (G__11882) {
+case 2:
+return cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11880.length)].join('')));
+
+}
+});
+
+cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$2 = (function (child,parent){
+return cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3((function (){var G__11883 = cljs.core.get_global_hierarchy();
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(G__11883) : cljs.core.deref.call(null,G__11883));
+})(),child,parent);
+});
+
+cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3 = (function (h,child,parent){
+var or__6512__auto__ = cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(child,parent);
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+var or__6512__auto____$1 = cljs.core.contains_QMARK_(new cljs.core.Keyword(null,"ancestors","ancestors",-776045424).cljs$core$IFn$_invoke$arity$1(h).call(null,child),parent);
+if(or__6512__auto____$1){
+return or__6512__auto____$1;
+} else {
+var and__6500__auto__ = cljs.core.vector_QMARK_(parent);
+if(and__6500__auto__){
+var and__6500__auto____$1 = cljs.core.vector_QMARK_(child);
+if(and__6500__auto____$1){
+var and__6500__auto____$2 = (cljs.core.count(parent) === cljs.core.count(child));
+if(and__6500__auto____$2){
+var ret = true;
+var i = (0);
+while(true){
+if((!(ret)) || ((i === cljs.core.count(parent)))){
+return ret;
+} else {
+var G__11888 = cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3(h,(child.cljs$core$IFn$_invoke$arity$1 ? child.cljs$core$IFn$_invoke$arity$1(i) : child.call(null,i)),(parent.cljs$core$IFn$_invoke$arity$1 ? parent.cljs$core$IFn$_invoke$arity$1(i) : parent.call(null,i)));
+var G__11889 = (i + (1));
+ret = G__11888;
+i = G__11889;
+continue;
+}
+break;
+}
+} else {
+return and__6500__auto____$2;
+}
+} else {
+return and__6500__auto____$1;
+}
+} else {
+return and__6500__auto__;
+}
+}
+}
+});
+
+cljs.core.isa_QMARK_.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns the immediate parents of tag, either via a JavaScript type
+ * inheritance relationship or a relationship established via derive. h
+ * must be a hierarchy obtained from make-hierarchy, if not supplied
+ * defaults to the global hierarchy
+ */
+cljs.core.parents = (function cljs$core$parents(var_args){
+var args11890 = [];
+var len__7625__auto___11894 = arguments.length;
+var i__7626__auto___11895 = (0);
+while(true){
+if((i__7626__auto___11895 < len__7625__auto___11894)){
+args11890.push((arguments[i__7626__auto___11895]));
+
+var G__11896 = (i__7626__auto___11895 + (1));
+i__7626__auto___11895 = G__11896;
+continue;
+} else {
+}
+break;
+}
+
+var G__11892 = args11890.length;
+switch (G__11892) {
+case 1:
+return cljs.core.parents.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.parents.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11890.length)].join('')));
+
+}
+});
+
+cljs.core.parents.cljs$core$IFn$_invoke$arity$1 = (function (tag){
+return cljs.core.parents.cljs$core$IFn$_invoke$arity$2((function (){var G__11893 = cljs.core.get_global_hierarchy();
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(G__11893) : cljs.core.deref.call(null,G__11893));
+})(),tag);
+});
+
+cljs.core.parents.cljs$core$IFn$_invoke$arity$2 = (function (h,tag){
+return cljs.core.not_empty(cljs.core.get.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"parents","parents",-2027538891).cljs$core$IFn$_invoke$arity$1(h),tag));
+});
+
+cljs.core.parents.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns the immediate and indirect parents of tag, either via a JavaScript type
+ * inheritance relationship or a relationship established via derive. h
+ * must be a hierarchy obtained from make-hierarchy, if not supplied
+ * defaults to the global hierarchy
+ */
+cljs.core.ancestors = (function cljs$core$ancestors(var_args){
+var args11898 = [];
+var len__7625__auto___11902 = arguments.length;
+var i__7626__auto___11903 = (0);
+while(true){
+if((i__7626__auto___11903 < len__7625__auto___11902)){
+args11898.push((arguments[i__7626__auto___11903]));
+
+var G__11904 = (i__7626__auto___11903 + (1));
+i__7626__auto___11903 = G__11904;
+continue;
+} else {
+}
+break;
+}
+
+var G__11900 = args11898.length;
+switch (G__11900) {
+case 1:
+return cljs.core.ancestors.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.ancestors.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11898.length)].join('')));
+
+}
+});
+
+cljs.core.ancestors.cljs$core$IFn$_invoke$arity$1 = (function (tag){
+return cljs.core.ancestors.cljs$core$IFn$_invoke$arity$2((function (){var G__11901 = cljs.core.get_global_hierarchy();
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(G__11901) : cljs.core.deref.call(null,G__11901));
+})(),tag);
+});
+
+cljs.core.ancestors.cljs$core$IFn$_invoke$arity$2 = (function (h,tag){
+return cljs.core.not_empty(cljs.core.get.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"ancestors","ancestors",-776045424).cljs$core$IFn$_invoke$arity$1(h),tag));
+});
+
+cljs.core.ancestors.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns the immediate and indirect children of tag, through a
+ * relationship established via derive. h must be a hierarchy obtained
+ * from make-hierarchy, if not supplied defaults to the global
+ * hierarchy. Note: does not work on JavaScript type inheritance
+ * relationships.
+ */
+cljs.core.descendants = (function cljs$core$descendants(var_args){
+var args11906 = [];
+var len__7625__auto___11910 = arguments.length;
+var i__7626__auto___11911 = (0);
+while(true){
+if((i__7626__auto___11911 < len__7625__auto___11910)){
+args11906.push((arguments[i__7626__auto___11911]));
+
+var G__11912 = (i__7626__auto___11911 + (1));
+i__7626__auto___11911 = G__11912;
+continue;
+} else {
+}
+break;
+}
+
+var G__11908 = args11906.length;
+switch (G__11908) {
+case 1:
+return cljs.core.descendants.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.descendants.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11906.length)].join('')));
+
+}
+});
+
+cljs.core.descendants.cljs$core$IFn$_invoke$arity$1 = (function (tag){
+return cljs.core.descendants.cljs$core$IFn$_invoke$arity$2((function (){var G__11909 = cljs.core.get_global_hierarchy();
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(G__11909) : cljs.core.deref.call(null,G__11909));
+})(),tag);
+});
+
+cljs.core.descendants.cljs$core$IFn$_invoke$arity$2 = (function (h,tag){
+return cljs.core.not_empty(cljs.core.get.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"descendants","descendants",1824886031).cljs$core$IFn$_invoke$arity$1(h),tag));
+});
+
+cljs.core.descendants.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Establishes a parent/child relationship between parent and
+ * tag. Parent must be a namespace-qualified symbol or keyword and
+ * child can be either a namespace-qualified symbol or keyword or a
+ * class. h must be a hierarchy obtained from make-hierarchy, if not
+ * supplied defaults to, and modifies, the global hierarchy.
+ */
+cljs.core.derive = (function cljs$core$derive(var_args){
+var args11914 = [];
+var len__7625__auto___11917 = arguments.length;
+var i__7626__auto___11918 = (0);
+while(true){
+if((i__7626__auto___11918 < len__7625__auto___11917)){
+args11914.push((arguments[i__7626__auto___11918]));
+
+var G__11919 = (i__7626__auto___11918 + (1));
+i__7626__auto___11918 = G__11919;
+continue;
+} else {
+}
+break;
+}
+
+var G__11916 = args11914.length;
+switch (G__11916) {
+case 2:
+return cljs.core.derive.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.derive.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11914.length)].join('')));
+
+}
+});
+
+cljs.core.derive.cljs$core$IFn$_invoke$arity$2 = (function (tag,parent){
+if(cljs.core.truth_(cljs.core.namespace(parent))){
+} else {
+throw (new Error("Assert failed: (namespace parent)"));
+}
+
+cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic(cljs.core.derive,cljs.core.array_seq([tag,parent], 0));
+
+return null;
+});
+
+cljs.core.derive.cljs$core$IFn$_invoke$arity$3 = (function (h,tag,parent){
+if(cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(tag,parent)){
+} else {
+throw (new Error("Assert failed: (not= tag parent)"));
+}
+
+var tp = new cljs.core.Keyword(null,"parents","parents",-2027538891).cljs$core$IFn$_invoke$arity$1(h);
+var td = new cljs.core.Keyword(null,"descendants","descendants",1824886031).cljs$core$IFn$_invoke$arity$1(h);
+var ta = new cljs.core.Keyword(null,"ancestors","ancestors",-776045424).cljs$core$IFn$_invoke$arity$1(h);
+var tf = ((function (tp,td,ta){
+return (function (m,source,sources,target,targets){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (tp,td,ta){
+return (function (ret,k){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(ret,k,cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.conj,cljs.core.get.cljs$core$IFn$_invoke$arity$3(targets,k,cljs.core.PersistentHashSet.EMPTY),cljs.core.cons(target,(targets.cljs$core$IFn$_invoke$arity$1 ? targets.cljs$core$IFn$_invoke$arity$1(target) : targets.call(null,target)))));
+});})(tp,td,ta))
+,m,cljs.core.cons(source,(sources.cljs$core$IFn$_invoke$arity$1 ? sources.cljs$core$IFn$_invoke$arity$1(source) : sources.call(null,source))));
+});})(tp,td,ta))
+;
+var or__6512__auto__ = ((cljs.core.contains_QMARK_((tp.cljs$core$IFn$_invoke$arity$1 ? tp.cljs$core$IFn$_invoke$arity$1(tag) : tp.call(null,tag)),parent))?null:(function (){
+if(cljs.core.contains_QMARK_((ta.cljs$core$IFn$_invoke$arity$1 ? ta.cljs$core$IFn$_invoke$arity$1(tag) : ta.call(null,tag)),parent)){
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1(tag),cljs.core.str.cljs$core$IFn$_invoke$arity$1("already has"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(parent),cljs.core.str.cljs$core$IFn$_invoke$arity$1("as ancestor")].join('')));
+} else {
+}
+
+if(cljs.core.contains_QMARK_((ta.cljs$core$IFn$_invoke$arity$1 ? ta.cljs$core$IFn$_invoke$arity$1(parent) : ta.call(null,parent)),tag)){
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Cyclic derivation:"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(parent),cljs.core.str.cljs$core$IFn$_invoke$arity$1("has"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(tag),cljs.core.str.cljs$core$IFn$_invoke$arity$1("as ancestor")].join('')));
+} else {
+}
+
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"parents","parents",-2027538891),cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(new cljs.core.Keyword(null,"parents","parents",-2027538891).cljs$core$IFn$_invoke$arity$1(h),tag,cljs.core.conj.cljs$core$IFn$_invoke$arity$2(cljs.core.get.cljs$core$IFn$_invoke$arity$3(tp,tag,cljs.core.PersistentHashSet.EMPTY),parent)),new cljs.core.Keyword(null,"ancestors","ancestors",-776045424),tf(new cljs.core.Keyword(null,"ancestors","ancestors",-776045424).cljs$core$IFn$_invoke$arity$1(h),tag,td,parent,ta),new cljs.core.Keyword(null,"descendants","descendants",1824886031),tf(new cljs.core.Keyword(null,"descendants","descendants",1824886031).cljs$core$IFn$_invoke$arity$1(h),parent,ta,tag,td)], null);
+})()
+);
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return h;
+}
+});
+
+cljs.core.derive.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Removes a parent/child relationship between parent and
+ * tag. h must be a hierarchy obtained from make-hierarchy, if not
+ * supplied defaults to, and modifies, the global hierarchy.
+ */
+cljs.core.underive = (function cljs$core$underive(var_args){
+var args11924 = [];
+var len__7625__auto___11927 = arguments.length;
+var i__7626__auto___11928 = (0);
+while(true){
+if((i__7626__auto___11928 < len__7625__auto___11927)){
+args11924.push((arguments[i__7626__auto___11928]));
+
+var G__11929 = (i__7626__auto___11928 + (1));
+i__7626__auto___11928 = G__11929;
+continue;
+} else {
+}
+break;
+}
+
+var G__11926 = args11924.length;
+switch (G__11926) {
+case 2:
+return cljs.core.underive.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.underive.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11924.length)].join('')));
+
+}
+});
+
+cljs.core.underive.cljs$core$IFn$_invoke$arity$2 = (function (tag,parent){
+cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic(cljs.core.underive,cljs.core.array_seq([tag,parent], 0));
+
+return null;
+});
+
+cljs.core.underive.cljs$core$IFn$_invoke$arity$3 = (function (h,tag,parent){
+var parentMap = new cljs.core.Keyword(null,"parents","parents",-2027538891).cljs$core$IFn$_invoke$arity$1(h);
+var childsParents = (cljs.core.truth_((parentMap.cljs$core$IFn$_invoke$arity$1 ? parentMap.cljs$core$IFn$_invoke$arity$1(tag) : parentMap.call(null,tag)))?cljs.core.disj.cljs$core$IFn$_invoke$arity$2((parentMap.cljs$core$IFn$_invoke$arity$1 ? parentMap.cljs$core$IFn$_invoke$arity$1(tag) : parentMap.call(null,tag)),parent):cljs.core.PersistentHashSet.EMPTY);
+var newParents = (cljs.core.truth_(cljs.core.not_empty(childsParents))?cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(parentMap,tag,childsParents):cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2(parentMap,tag));
+var deriv_seq = cljs.core.flatten(cljs.core.map.cljs$core$IFn$_invoke$arity$2(((function (parentMap,childsParents,newParents){
+return (function (p1__11921_SHARP_){
+return cljs.core.cons(cljs.core.first(p1__11921_SHARP_),cljs.core.interpose.cljs$core$IFn$_invoke$arity$2(cljs.core.first(p1__11921_SHARP_),cljs.core.second(p1__11921_SHARP_)));
+});})(parentMap,childsParents,newParents))
+,cljs.core.seq(newParents)));
+if(cljs.core.contains_QMARK_((parentMap.cljs$core$IFn$_invoke$arity$1 ? parentMap.cljs$core$IFn$_invoke$arity$1(tag) : parentMap.call(null,tag)),parent)){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (parentMap,childsParents,newParents,deriv_seq){
+return (function (p1__11922_SHARP_,p2__11923_SHARP_){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$3(cljs.core.derive,p1__11922_SHARP_,p2__11923_SHARP_);
+});})(parentMap,childsParents,newParents,deriv_seq))
+,cljs.core.make_hierarchy(),cljs.core.partition.cljs$core$IFn$_invoke$arity$2((2),deriv_seq));
+} else {
+return h;
+}
+});
+
+cljs.core.underive.cljs$lang$maxFixedArity = 3;
+
+cljs.core.reset_cache = (function cljs$core$reset_cache(method_cache,method_table,cached_hierarchy,hierarchy){
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(method_cache,(function (_){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(method_table) : cljs.core.deref.call(null,method_table));
+}));
+
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(cached_hierarchy,(function (_){
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(hierarchy) : cljs.core.deref.call(null,hierarchy));
+}));
+});
+cljs.core.prefers_STAR_ = (function cljs$core$prefers_STAR_(x,y,prefer_table){
+var xprefs = (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(prefer_table) : cljs.core.deref.call(null,prefer_table)).call(null,x);
+var or__6512__auto__ = (cljs.core.truth_((function (){var and__6500__auto__ = xprefs;
+if(cljs.core.truth_(and__6500__auto__)){
+return (xprefs.cljs$core$IFn$_invoke$arity$1 ? xprefs.cljs$core$IFn$_invoke$arity$1(y) : xprefs.call(null,y));
+} else {
+return and__6500__auto__;
+}
+})())?true:null);
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+var or__6512__auto____$1 = (function (){var ps = cljs.core.parents.cljs$core$IFn$_invoke$arity$1(y);
+while(true){
+if((cljs.core.count(ps) > (0))){
+if(cljs.core.truth_((function (){var G__11946 = x;
+var G__11947 = cljs.core.first(ps);
+var G__11948 = prefer_table;
+return (cljs.core.prefers_STAR_.cljs$core$IFn$_invoke$arity$3 ? cljs.core.prefers_STAR_.cljs$core$IFn$_invoke$arity$3(G__11946,G__11947,G__11948) : cljs.core.prefers_STAR_.call(null,G__11946,G__11947,G__11948));
+})())){
+} else {
+}
+
+var G__11955 = cljs.core.rest(ps);
+ps = G__11955;
+continue;
+} else {
+return null;
+}
+break;
+}
+})();
+if(cljs.core.truth_(or__6512__auto____$1)){
+return or__6512__auto____$1;
+} else {
+var or__6512__auto____$2 = (function (){var ps = cljs.core.parents.cljs$core$IFn$_invoke$arity$1(x);
+while(true){
+if((cljs.core.count(ps) > (0))){
+if(cljs.core.truth_((function (){var G__11952 = cljs.core.first(ps);
+var G__11953 = y;
+var G__11954 = prefer_table;
+return (cljs.core.prefers_STAR_.cljs$core$IFn$_invoke$arity$3 ? cljs.core.prefers_STAR_.cljs$core$IFn$_invoke$arity$3(G__11952,G__11953,G__11954) : cljs.core.prefers_STAR_.call(null,G__11952,G__11953,G__11954));
+})())){
+} else {
+}
+
+var G__11956 = cljs.core.rest(ps);
+ps = G__11956;
+continue;
+} else {
+return null;
+}
+break;
+}
+})();
+if(cljs.core.truth_(or__6512__auto____$2)){
+return or__6512__auto____$2;
+} else {
+return false;
+}
+}
+}
+});
+cljs.core.dominates = (function cljs$core$dominates(x,y,prefer_table,hierarchy){
+var or__6512__auto__ = cljs.core.prefers_STAR_(x,y,prefer_table);
+if(cljs.core.truth_(or__6512__auto__)){
+return or__6512__auto__;
+} else {
+return cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3(hierarchy,x,y);
+}
+});
+cljs.core.find_and_cache_best_method = (function cljs$core$find_and_cache_best_method(name,dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy){
+var best_entry = cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (be,p__11961){
+var vec__11962 = p__11961;
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11962,(0),null);
+var _ = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11962,(1),null);
+var e = vec__11962;
+if(cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3((cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(hierarchy) : cljs.core.deref.call(null,hierarchy)),dispatch_val,k)){
+var be2 = (cljs.core.truth_((function (){var or__6512__auto__ = (be == null);
+if(or__6512__auto__){
+return or__6512__auto__;
+} else {
+return cljs.core.dominates(k,cljs.core.first(be),prefer_table,(cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(hierarchy) : cljs.core.deref.call(null,hierarchy)));
+}
+})())?e:be);
+if(cljs.core.truth_(cljs.core.dominates(cljs.core.first(be2),k,prefer_table,(cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(hierarchy) : cljs.core.deref.call(null,hierarchy))))){
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Multiple methods in multimethod '"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(name),cljs.core.str.cljs$core$IFn$_invoke$arity$1("' match dispatch value: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(dispatch_val),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" -> "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(k),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" and "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.first(be2)),cljs.core.str.cljs$core$IFn$_invoke$arity$1(", and neither is preferred")].join('')));
+}
+
+return be2;
+} else {
+return be;
+}
+}),null,(cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(method_table) : cljs.core.deref.call(null,method_table)));
+if(cljs.core.truth_(best_entry)){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2((cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(cached_hierarchy) : cljs.core.deref.call(null,cached_hierarchy)),(cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(hierarchy) : cljs.core.deref.call(null,hierarchy)))){
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(method_cache,cljs.core.assoc,dispatch_val,cljs.core.second(best_entry));
+
+return cljs.core.second(best_entry);
+} else {
+cljs.core.reset_cache(method_cache,method_table,cached_hierarchy,hierarchy);
+
+return (cljs.core.find_and_cache_best_method.cljs$core$IFn$_invoke$arity$7 ? cljs.core.find_and_cache_best_method.cljs$core$IFn$_invoke$arity$7(name,dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy) : cljs.core.find_and_cache_best_method.call(null,name,dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy));
+}
+} else {
+return null;
+}
+});
+
+/**
+ * @interface
+ */
+cljs.core.IMultiFn = function(){};
+
+cljs.core._reset = (function cljs$core$_reset(mf){
+if((!((mf == null))) && (!((mf.cljs$core$IMultiFn$_reset$arity$1 == null)))){
+return mf.cljs$core$IMultiFn$_reset$arity$1(mf);
+} else {
+var x__7180__auto__ = (((mf == null))?null:mf);
+var m__7181__auto__ = (cljs.core._reset[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(mf) : m__7181__auto__.call(null,mf));
+} else {
+var m__7181__auto____$1 = (cljs.core._reset["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(mf) : m__7181__auto____$1.call(null,mf));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-reset",mf);
+}
+}
+}
+});
+
+cljs.core._add_method = (function cljs$core$_add_method(mf,dispatch_val,method){
+if((!((mf == null))) && (!((mf.cljs$core$IMultiFn$_add_method$arity$3 == null)))){
+return mf.cljs$core$IMultiFn$_add_method$arity$3(mf,dispatch_val,method);
+} else {
+var x__7180__auto__ = (((mf == null))?null:mf);
+var m__7181__auto__ = (cljs.core._add_method[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(mf,dispatch_val,method) : m__7181__auto__.call(null,mf,dispatch_val,method));
+} else {
+var m__7181__auto____$1 = (cljs.core._add_method["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(mf,dispatch_val,method) : m__7181__auto____$1.call(null,mf,dispatch_val,method));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-add-method",mf);
+}
+}
+}
+});
+
+cljs.core._remove_method = (function cljs$core$_remove_method(mf,dispatch_val){
+if((!((mf == null))) && (!((mf.cljs$core$IMultiFn$_remove_method$arity$2 == null)))){
+return mf.cljs$core$IMultiFn$_remove_method$arity$2(mf,dispatch_val);
+} else {
+var x__7180__auto__ = (((mf == null))?null:mf);
+var m__7181__auto__ = (cljs.core._remove_method[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(mf,dispatch_val) : m__7181__auto__.call(null,mf,dispatch_val));
+} else {
+var m__7181__auto____$1 = (cljs.core._remove_method["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(mf,dispatch_val) : m__7181__auto____$1.call(null,mf,dispatch_val));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-remove-method",mf);
+}
+}
+}
+});
+
+cljs.core._prefer_method = (function cljs$core$_prefer_method(mf,dispatch_val,dispatch_val_y){
+if((!((mf == null))) && (!((mf.cljs$core$IMultiFn$_prefer_method$arity$3 == null)))){
+return mf.cljs$core$IMultiFn$_prefer_method$arity$3(mf,dispatch_val,dispatch_val_y);
+} else {
+var x__7180__auto__ = (((mf == null))?null:mf);
+var m__7181__auto__ = (cljs.core._prefer_method[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$3(mf,dispatch_val,dispatch_val_y) : m__7181__auto__.call(null,mf,dispatch_val,dispatch_val_y));
+} else {
+var m__7181__auto____$1 = (cljs.core._prefer_method["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$3(mf,dispatch_val,dispatch_val_y) : m__7181__auto____$1.call(null,mf,dispatch_val,dispatch_val_y));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-prefer-method",mf);
+}
+}
+}
+});
+
+cljs.core._get_method = (function cljs$core$_get_method(mf,dispatch_val){
+if((!((mf == null))) && (!((mf.cljs$core$IMultiFn$_get_method$arity$2 == null)))){
+return mf.cljs$core$IMultiFn$_get_method$arity$2(mf,dispatch_val);
+} else {
+var x__7180__auto__ = (((mf == null))?null:mf);
+var m__7181__auto__ = (cljs.core._get_method[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$2(mf,dispatch_val) : m__7181__auto__.call(null,mf,dispatch_val));
+} else {
+var m__7181__auto____$1 = (cljs.core._get_method["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$2(mf,dispatch_val) : m__7181__auto____$1.call(null,mf,dispatch_val));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-get-method",mf);
+}
+}
+}
+});
+
+cljs.core._methods = (function cljs$core$_methods(mf){
+if((!((mf == null))) && (!((mf.cljs$core$IMultiFn$_methods$arity$1 == null)))){
+return mf.cljs$core$IMultiFn$_methods$arity$1(mf);
+} else {
+var x__7180__auto__ = (((mf == null))?null:mf);
+var m__7181__auto__ = (cljs.core._methods[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(mf) : m__7181__auto__.call(null,mf));
+} else {
+var m__7181__auto____$1 = (cljs.core._methods["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(mf) : m__7181__auto____$1.call(null,mf));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-methods",mf);
+}
+}
+}
+});
+
+cljs.core._prefers = (function cljs$core$_prefers(mf){
+if((!((mf == null))) && (!((mf.cljs$core$IMultiFn$_prefers$arity$1 == null)))){
+return mf.cljs$core$IMultiFn$_prefers$arity$1(mf);
+} else {
+var x__7180__auto__ = (((mf == null))?null:mf);
+var m__7181__auto__ = (cljs.core._prefers[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(mf) : m__7181__auto__.call(null,mf));
+} else {
+var m__7181__auto____$1 = (cljs.core._prefers["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(mf) : m__7181__auto____$1.call(null,mf));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-prefers",mf);
+}
+}
+}
+});
+
+cljs.core._default_dispatch_val = (function cljs$core$_default_dispatch_val(mf){
+if((!((mf == null))) && (!((mf.cljs$core$IMultiFn$_default_dispatch_val$arity$1 == null)))){
+return mf.cljs$core$IMultiFn$_default_dispatch_val$arity$1(mf);
+} else {
+var x__7180__auto__ = (((mf == null))?null:mf);
+var m__7181__auto__ = (cljs.core._default_dispatch_val[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(mf) : m__7181__auto__.call(null,mf));
+} else {
+var m__7181__auto____$1 = (cljs.core._default_dispatch_val["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(mf) : m__7181__auto____$1.call(null,mf));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-default-dispatch-val",mf);
+}
+}
+}
+});
+
+cljs.core._dispatch_fn = (function cljs$core$_dispatch_fn(mf){
+if((!((mf == null))) && (!((mf.cljs$core$IMultiFn$_dispatch_fn$arity$1 == null)))){
+return mf.cljs$core$IMultiFn$_dispatch_fn$arity$1(mf);
+} else {
+var x__7180__auto__ = (((mf == null))?null:mf);
+var m__7181__auto__ = (cljs.core._dispatch_fn[goog.typeOf(x__7180__auto__)]);
+if(!((m__7181__auto__ == null))){
+return (m__7181__auto__.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto__.cljs$core$IFn$_invoke$arity$1(mf) : m__7181__auto__.call(null,mf));
+} else {
+var m__7181__auto____$1 = (cljs.core._dispatch_fn["_"]);
+if(!((m__7181__auto____$1 == null))){
+return (m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__7181__auto____$1.cljs$core$IFn$_invoke$arity$1(mf) : m__7181__auto____$1.call(null,mf));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-dispatch-fn",mf);
+}
+}
+}
+});
+
+cljs.core.throw_no_method_error = (function cljs$core$throw_no_method_error(name,dispatch_val){
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("No method in multimethod '"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(name),cljs.core.str.cljs$core$IFn$_invoke$arity$1("' for dispatch value: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(dispatch_val)].join('')));
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.IMultiFn}
+ * @implements {cljs.core.INamed}
+*/
+cljs.core.MultiFn = (function (name,dispatch_fn,default_dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy){
+this.name = name;
+this.dispatch_fn = dispatch_fn;
+this.default_dispatch_val = default_dispatch_val;
+this.hierarchy = hierarchy;
+this.method_table = method_table;
+this.prefer_table = prefer_table;
+this.method_cache = method_cache;
+this.cached_hierarchy = cached_hierarchy;
+this.cljs$lang$protocol_mask$partition0$ = 4194305;
+this.cljs$lang$protocol_mask$partition1$ = 4352;
+})
+cljs.core.MultiFn.prototype.call = (function() {
+var G__11966 = null;
+var G__11966__1 = (function (self__){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$0 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$0() : self__.dispatch_fn.call(null));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$0 ? target_fn.cljs$core$IFn$_invoke$arity$0() : target_fn.call(null));
+});
+var G__11966__2 = (function (self__,a){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$1 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$1(a) : self__.dispatch_fn.call(null,a));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$1 ? target_fn.cljs$core$IFn$_invoke$arity$1(a) : target_fn.call(null,a));
+});
+var G__11966__3 = (function (self__,a,b){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$2 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$2(a,b) : self__.dispatch_fn.call(null,a,b));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$2 ? target_fn.cljs$core$IFn$_invoke$arity$2(a,b) : target_fn.call(null,a,b));
+});
+var G__11966__4 = (function (self__,a,b,c){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$3 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$3(a,b,c) : self__.dispatch_fn.call(null,a,b,c));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$3 ? target_fn.cljs$core$IFn$_invoke$arity$3(a,b,c) : target_fn.call(null,a,b,c));
+});
+var G__11966__5 = (function (self__,a,b,c,d){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$4 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : self__.dispatch_fn.call(null,a,b,c,d));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$4 ? target_fn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : target_fn.call(null,a,b,c,d));
+});
+var G__11966__6 = (function (self__,a,b,c,d,e){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$5 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : self__.dispatch_fn.call(null,a,b,c,d,e));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$5 ? target_fn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : target_fn.call(null,a,b,c,d,e));
+});
+var G__11966__7 = (function (self__,a,b,c,d,e,f){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$6 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : self__.dispatch_fn.call(null,a,b,c,d,e,f));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$6 ? target_fn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : target_fn.call(null,a,b,c,d,e,f));
+});
+var G__11966__8 = (function (self__,a,b,c,d,e,f,g){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$7 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$7 ? target_fn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : target_fn.call(null,a,b,c,d,e,f,g));
+});
+var G__11966__9 = (function (self__,a,b,c,d,e,f,g,h){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$8 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$8 ? target_fn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : target_fn.call(null,a,b,c,d,e,f,g,h));
+});
+var G__11966__10 = (function (self__,a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$9 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$9 ? target_fn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : target_fn.call(null,a,b,c,d,e,f,g,h,i));
+});
+var G__11966__11 = (function (self__,a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$10 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$10 ? target_fn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j));
+});
+var G__11966__12 = (function (self__,a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$11 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$11 ? target_fn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+});
+var G__11966__13 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$12 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$12 ? target_fn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+});
+var G__11966__14 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$13 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$13 ? target_fn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+});
+var G__11966__15 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$14 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$14 ? target_fn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+});
+var G__11966__16 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$15 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$15 ? target_fn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+});
+var G__11966__17 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$16 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$16 ? target_fn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+});
+var G__11966__18 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$17 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$17 ? target_fn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+});
+var G__11966__19 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$18 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$18 ? target_fn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+});
+var G__11966__20 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$19 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$19 ? target_fn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+});
+var G__11966__21 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$20 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$20 ? target_fn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+});
+var G__11966__22 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(self__.dispatch_fn,a,b,c,d,cljs.core.array_seq([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(target_fn,a,b,c,d,cljs.core.array_seq([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+});
+G__11966 = function(self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+switch(arguments.length){
+case 1:
+return G__11966__1.call(this,self__);
+case 2:
+return G__11966__2.call(this,self__,a);
+case 3:
+return G__11966__3.call(this,self__,a,b);
+case 4:
+return G__11966__4.call(this,self__,a,b,c);
+case 5:
+return G__11966__5.call(this,self__,a,b,c,d);
+case 6:
+return G__11966__6.call(this,self__,a,b,c,d,e);
+case 7:
+return G__11966__7.call(this,self__,a,b,c,d,e,f);
+case 8:
+return G__11966__8.call(this,self__,a,b,c,d,e,f,g);
+case 9:
+return G__11966__9.call(this,self__,a,b,c,d,e,f,g,h);
+case 10:
+return G__11966__10.call(this,self__,a,b,c,d,e,f,g,h,i);
+case 11:
+return G__11966__11.call(this,self__,a,b,c,d,e,f,g,h,i,j);
+case 12:
+return G__11966__12.call(this,self__,a,b,c,d,e,f,g,h,i,j,k);
+case 13:
+return G__11966__13.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l);
+case 14:
+return G__11966__14.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m);
+case 15:
+return G__11966__15.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
+case 16:
+return G__11966__16.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o);
+case 17:
+return G__11966__17.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+case 18:
+return G__11966__18.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
+case 19:
+return G__11966__19.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r);
+case 20:
+return G__11966__20.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);
+case 21:
+return G__11966__21.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t);
+case 22:
+return G__11966__22.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11966.cljs$core$IFn$_invoke$arity$1 = G__11966__1;
+G__11966.cljs$core$IFn$_invoke$arity$2 = G__11966__2;
+G__11966.cljs$core$IFn$_invoke$arity$3 = G__11966__3;
+G__11966.cljs$core$IFn$_invoke$arity$4 = G__11966__4;
+G__11966.cljs$core$IFn$_invoke$arity$5 = G__11966__5;
+G__11966.cljs$core$IFn$_invoke$arity$6 = G__11966__6;
+G__11966.cljs$core$IFn$_invoke$arity$7 = G__11966__7;
+G__11966.cljs$core$IFn$_invoke$arity$8 = G__11966__8;
+G__11966.cljs$core$IFn$_invoke$arity$9 = G__11966__9;
+G__11966.cljs$core$IFn$_invoke$arity$10 = G__11966__10;
+G__11966.cljs$core$IFn$_invoke$arity$11 = G__11966__11;
+G__11966.cljs$core$IFn$_invoke$arity$12 = G__11966__12;
+G__11966.cljs$core$IFn$_invoke$arity$13 = G__11966__13;
+G__11966.cljs$core$IFn$_invoke$arity$14 = G__11966__14;
+G__11966.cljs$core$IFn$_invoke$arity$15 = G__11966__15;
+G__11966.cljs$core$IFn$_invoke$arity$16 = G__11966__16;
+G__11966.cljs$core$IFn$_invoke$arity$17 = G__11966__17;
+G__11966.cljs$core$IFn$_invoke$arity$18 = G__11966__18;
+G__11966.cljs$core$IFn$_invoke$arity$19 = G__11966__19;
+G__11966.cljs$core$IFn$_invoke$arity$20 = G__11966__20;
+G__11966.cljs$core$IFn$_invoke$arity$21 = G__11966__21;
+G__11966.cljs$core$IFn$_invoke$arity$22 = G__11966__22;
+return G__11966;
+})()
+;
+
+cljs.core.MultiFn.prototype.apply = (function (self__,args11965){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11965)));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$0 = (function (){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$0 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$0() : self__.dispatch_fn.call(null));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$0 ? target_fn.cljs$core$IFn$_invoke$arity$0() : target_fn.call(null));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$1 = (function (a){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$1 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$1(a) : self__.dispatch_fn.call(null,a));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$1 ? target_fn.cljs$core$IFn$_invoke$arity$1(a) : target_fn.call(null,a));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$2 = (function (a,b){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$2 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$2(a,b) : self__.dispatch_fn.call(null,a,b));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$2 ? target_fn.cljs$core$IFn$_invoke$arity$2(a,b) : target_fn.call(null,a,b));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$3 = (function (a,b,c){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$3 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$3(a,b,c) : self__.dispatch_fn.call(null,a,b,c));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$3 ? target_fn.cljs$core$IFn$_invoke$arity$3(a,b,c) : target_fn.call(null,a,b,c));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$4 = (function (a,b,c,d){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$4 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : self__.dispatch_fn.call(null,a,b,c,d));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$4 ? target_fn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : target_fn.call(null,a,b,c,d));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$5 = (function (a,b,c,d,e){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$5 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : self__.dispatch_fn.call(null,a,b,c,d,e));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$5 ? target_fn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : target_fn.call(null,a,b,c,d,e));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$6 = (function (a,b,c,d,e,f){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$6 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : self__.dispatch_fn.call(null,a,b,c,d,e,f));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$6 ? target_fn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : target_fn.call(null,a,b,c,d,e,f));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$7 = (function (a,b,c,d,e,f,g){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$7 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$7 ? target_fn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : target_fn.call(null,a,b,c,d,e,f,g));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$8 = (function (a,b,c,d,e,f,g,h){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$8 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$8 ? target_fn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : target_fn.call(null,a,b,c,d,e,f,g,h));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$9 = (function (a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$9 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$9 ? target_fn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : target_fn.call(null,a,b,c,d,e,f,g,h,i));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$10 = (function (a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$10 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$10 ? target_fn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$11 = (function (a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$11 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$11 ? target_fn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$12 = (function (a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$12 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$12 ? target_fn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$13 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$13 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$13 ? target_fn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$14 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$14 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$14 ? target_fn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$15 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$15 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$15 ? target_fn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$16 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$16 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$16 ? target_fn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$17 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$17 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$17 ? target_fn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$18 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$18 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$18 ? target_fn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$19 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$19 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$19 ? target_fn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$20 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$20 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$20 ? target_fn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$21 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var mf = this;
+var dispatch_val = cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(self__.dispatch_fn,a,b,c,d,cljs.core.array_seq([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(target_fn,a,b,c,d,cljs.core.array_seq([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_prefer_method$arity$3 = (function (mf,dispatch_val_x,dispatch_val_y){
+var self__ = this;
+var mf__$1 = this;
+if(cljs.core.truth_(cljs.core.prefers_STAR_(dispatch_val_x,dispatch_val_y,self__.prefer_table))){
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Preference conflict in multimethod '"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.name),cljs.core.str.cljs$core$IFn$_invoke$arity$1("': "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(dispatch_val_y),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" is already preferred to "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(dispatch_val_x)].join('')));
+} else {
+}
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(self__.prefer_table,((function (mf__$1){
+return (function (old){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(old,dispatch_val_x,cljs.core.conj.cljs$core$IFn$_invoke$arity$2(cljs.core.get.cljs$core$IFn$_invoke$arity$3(old,dispatch_val_x,cljs.core.PersistentHashSet.EMPTY),dispatch_val_y));
+});})(mf__$1))
+);
+
+return cljs.core.reset_cache(self__.method_cache,self__.method_table,self__.cached_hierarchy,self__.hierarchy);
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_default_dispatch_val$arity$1 = (function (mf){
+var self__ = this;
+var mf__$1 = this;
+return self__.default_dispatch_val;
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_remove_method$arity$2 = (function (mf,dispatch_val){
+var self__ = this;
+var mf__$1 = this;
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3(self__.method_table,cljs.core.dissoc,dispatch_val);
+
+cljs.core.reset_cache(self__.method_cache,self__.method_table,self__.cached_hierarchy,self__.hierarchy);
+
+return mf__$1;
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_methods$arity$1 = (function (mf){
+var self__ = this;
+var mf__$1 = this;
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(self__.method_table) : cljs.core.deref.call(null,self__.method_table));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_prefers$arity$1 = (function (mf){
+var self__ = this;
+var mf__$1 = this;
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(self__.prefer_table) : cljs.core.deref.call(null,self__.prefer_table));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_dispatch_fn$arity$1 = (function (mf){
+var self__ = this;
+var mf__$1 = this;
+return self__.dispatch_fn;
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_add_method$arity$3 = (function (mf,dispatch_val,method){
+var self__ = this;
+var mf__$1 = this;
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(self__.method_table,cljs.core.assoc,dispatch_val,method);
+
+cljs.core.reset_cache(self__.method_cache,self__.method_table,self__.cached_hierarchy,self__.hierarchy);
+
+return mf__$1;
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_reset$arity$1 = (function (mf){
+var self__ = this;
+var mf__$1 = this;
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(self__.method_table,((function (mf__$1){
+return (function (mf__$2){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(mf__$1))
+);
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(self__.method_cache,((function (mf__$1){
+return (function (mf__$2){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(mf__$1))
+);
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(self__.prefer_table,((function (mf__$1){
+return (function (mf__$2){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(mf__$1))
+);
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(self__.cached_hierarchy,((function (mf__$1){
+return (function (mf__$2){
+return null;
+});})(mf__$1))
+);
+
+return mf__$1;
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_get_method$arity$2 = (function (mf,dispatch_val){
+var self__ = this;
+var mf__$1 = this;
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2((cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(self__.cached_hierarchy) : cljs.core.deref.call(null,self__.cached_hierarchy)),(cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(self__.hierarchy) : cljs.core.deref.call(null,self__.hierarchy)))){
+} else {
+cljs.core.reset_cache(self__.method_cache,self__.method_table,self__.cached_hierarchy,self__.hierarchy);
+}
+
+var temp__4655__auto__ = (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(self__.method_cache) : cljs.core.deref.call(null,self__.method_cache)).call(null,dispatch_val);
+if(cljs.core.truth_(temp__4655__auto__)){
+var target_fn = temp__4655__auto__;
+return target_fn;
+} else {
+var temp__4655__auto____$1 = cljs.core.find_and_cache_best_method(self__.name,dispatch_val,self__.hierarchy,self__.method_table,self__.prefer_table,self__.method_cache,self__.cached_hierarchy);
+if(cljs.core.truth_(temp__4655__auto____$1)){
+var target_fn = temp__4655__auto____$1;
+return target_fn;
+} else {
+return (cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(self__.method_table) : cljs.core.deref.call(null,self__.method_table)).call(null,self__.default_dispatch_val);
+}
+}
+});
+
+cljs.core.MultiFn.prototype.cljs$core$INamed$_name$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core._name(self__.name);
+});
+
+cljs.core.MultiFn.prototype.cljs$core$INamed$_namespace$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core._namespace(self__.name);
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return goog.getUid(this$__$1);
+});
+
+cljs.core.MultiFn.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 8, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"name","name",-810760592,null),new cljs.core.Symbol(null,"dispatch-fn","dispatch-fn",-1401088155,null),new cljs.core.Symbol(null,"default-dispatch-val","default-dispatch-val",-1231201266,null),new cljs.core.Symbol(null,"hierarchy","hierarchy",587061186,null),new cljs.core.Symbol(null,"method-table","method-table",-1878263165,null),new cljs.core.Symbol(null,"prefer-table","prefer-table",462168584,null),new cljs.core.Symbol(null,"method-cache","method-cache",1230193905,null),new cljs.core.Symbol(null,"cached-hierarchy","cached-hierarchy",-1085460203,null)], null);
+});
+
+cljs.core.MultiFn.cljs$lang$type = true;
+
+cljs.core.MultiFn.cljs$lang$ctorStr = "cljs.core/MultiFn";
+
+cljs.core.MultiFn.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/MultiFn");
+});
+
+cljs.core.__GT_MultiFn = (function cljs$core$__GT_MultiFn(name,dispatch_fn,default_dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy){
+return (new cljs.core.MultiFn(name,dispatch_fn,default_dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy));
+});
+
+/**
+ * Removes all of the methods of multimethod.
+ */
+cljs.core.remove_all_methods = (function cljs$core$remove_all_methods(multifn){
+return cljs.core._reset(multifn);
+});
+/**
+ * Removes the method of multimethod associated with dispatch-value.
+ */
+cljs.core.remove_method = (function cljs$core$remove_method(multifn,dispatch_val){
+return cljs.core._remove_method(multifn,dispatch_val);
+});
+/**
+ * Causes the multimethod to prefer matches of dispatch-val-x over dispatch-val-y
+ * when there is a conflict
+ */
+cljs.core.prefer_method = (function cljs$core$prefer_method(multifn,dispatch_val_x,dispatch_val_y){
+return cljs.core._prefer_method(multifn,dispatch_val_x,dispatch_val_y);
+});
+/**
+ * Given a multimethod, returns a map of dispatch values -> dispatch fns
+ */
+cljs.core.methods$ = (function cljs$core$methods(multifn){
+return cljs.core._methods(multifn);
+});
+/**
+ * Given a multimethod and a dispatch value, returns the dispatch fn
+ * that would apply to that value, or nil if none apply and no default
+ */
+cljs.core.get_method = (function cljs$core$get_method(multifn,dispatch_val){
+return cljs.core._get_method(multifn,dispatch_val);
+});
+/**
+ * Given a multimethod, returns a map of preferred value -> set of other values
+ */
+cljs.core.prefers = (function cljs$core$prefers(multifn){
+return cljs.core._prefers(multifn);
+});
+/**
+ * Given a multimethod, return it's default-dispatch-val.
+ */
+cljs.core.default_dispatch_val = (function cljs$core$default_dispatch_val(multifn){
+return cljs.core._default_dispatch_val(multifn);
+});
+/**
+ * Given a multimethod, return it's dispatch-fn.
+ */
+cljs.core.dispatch_fn = (function cljs$core$dispatch_fn(multifn){
+return cljs.core._dispatch_fn(multifn);
+});
+
+/**
+ * A marker protocol for UUIDs
+ * @interface
+ */
+cljs.core.IUUID = function(){};
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IPrintWithWriter}
+ * @implements {cljs.core.IComparable}
+ * @implements {cljs.core.IUUID}
+*/
+cljs.core.UUID = (function (uuid,__hash){
+this.uuid = uuid;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 2153775104;
+this.cljs$lang$protocol_mask$partition1$ = 2048;
+})
+cljs.core.UUID.prototype.cljs$core$IUUID$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.UUID.prototype.toString = (function (){
+var self__ = this;
+var _ = this;
+return self__.uuid;
+});
+
+cljs.core.UUID.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.UUID.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (_,other){
+var self__ = this;
+var ___$1 = this;
+return ((other instanceof cljs.core.UUID)) && ((self__.uuid === other.uuid));
+});
+
+cljs.core.UUID.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (_,writer,___$1){
+var self__ = this;
+var ___$2 = this;
+return cljs.core._write(writer,[cljs.core.str.cljs$core$IFn$_invoke$arity$1("#uuid \""),cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.uuid),cljs.core.str.cljs$core$IFn$_invoke$arity$1("\"")].join(''));
+});
+
+cljs.core.UUID.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+if((self__.__hash == null)){
+self__.__hash = cljs.core.hash(self__.uuid);
+} else {
+}
+
+return self__.__hash;
+});
+
+cljs.core.UUID.prototype.cljs$core$IComparable$_compare$arity$2 = (function (_,other){
+var self__ = this;
+var ___$1 = this;
+var G__11967 = self__.uuid;
+var G__11968 = other.uuid;
+return goog.array.defaultCompare(G__11967,G__11968);
+});
+
+cljs.core.UUID.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"uuid","uuid",-504564192,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.UUID.cljs$lang$type = true;
+
+cljs.core.UUID.cljs$lang$ctorStr = "cljs.core/UUID";
+
+cljs.core.UUID.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/UUID");
+});
+
+cljs.core.__GT_UUID = (function cljs$core$__GT_UUID(uuid,__hash){
+return (new cljs.core.UUID(uuid,__hash));
+});
+
+cljs.core.uuid = (function cljs$core$uuid(s){
+return (new cljs.core.UUID(s,null));
+});
+cljs.core.random_uuid = (function cljs$core$random_uuid(){
+var hex = (function cljs$core$random_uuid_$_hex(){
+return cljs.core.rand_int((16)).toString((16));
+});
+var rhex = ((8) | ((3) & cljs.core.rand_int((16)))).toString((16));
+return cljs.core.uuid([cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1("-"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1("-"),cljs.core.str.cljs$core$IFn$_invoke$arity$1("4"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1("-"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(rhex),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1("-"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex())].join(''));
+});
+cljs.core.uuid_QMARK_ = (function cljs$core$uuid_QMARK_(x){
+if(!((x == null))){
+if((false) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IUUID$))){
+return true;
+} else {
+return false;
+}
+} else {
+return false;
+}
+});
+cljs.core.pr_writer_ex_info = (function cljs$core$pr_writer_ex_info(obj,writer,opts){
+cljs.core._write(writer,"#error {:message ");
+
+cljs.core.pr_writer(obj.message,writer,opts);
+
+if(cljs.core.truth_(obj.data)){
+cljs.core._write(writer,", :data ");
+
+cljs.core.pr_writer(obj.data,writer,opts);
+} else {
+}
+
+if(cljs.core.truth_(obj.cause)){
+cljs.core._write(writer,", :cause ");
+
+cljs.core.pr_writer(obj.cause,writer,opts);
+} else {
+}
+
+return cljs.core._write(writer,"}");
+});
+/**
+ * @constructor
+ */
+cljs.core.ExceptionInfo = (function cljs$core$ExceptionInfo(message,data,cause){
+var e = (new Error(message));
+var this$ = this;
+this$.message = message;
+
+this$.data = data;
+
+this$.cause = cause;
+
+this$.name = e.name;
+
+this$.description = e.description;
+
+this$.number = e.number;
+
+this$.fileName = e.fileName;
+
+this$.lineNumber = e.lineNumber;
+
+this$.columnNumber = e.columnNumber;
+
+this$.stack = e.stack;
+
+return this$;
+});
+cljs.core.ExceptionInfo.prototype.__proto__ = Error.prototype;
+cljs.core.ExceptionInfo.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ExceptionInfo.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (obj,writer,opts){
+var obj__$1 = this;
+return cljs.core.pr_writer_ex_info(obj__$1,writer,opts);
+});
+cljs.core.ExceptionInfo.prototype.toString = (function (){
+var this$ = this;
+return cljs.core.pr_str_STAR_(this$);
+});
+/**
+ * Create an instance of ExceptionInfo, an Error type that carries a
+ * map of additional data.
+ */
+cljs.core.ex_info = (function cljs$core$ex_info(var_args){
+var args11971 = [];
+var len__7625__auto___11974 = arguments.length;
+var i__7626__auto___11975 = (0);
+while(true){
+if((i__7626__auto___11975 < len__7625__auto___11974)){
+args11971.push((arguments[i__7626__auto___11975]));
+
+var G__11976 = (i__7626__auto___11975 + (1));
+i__7626__auto___11975 = G__11976;
+continue;
+} else {
+}
+break;
+}
+
+var G__11973 = args11971.length;
+switch (G__11973) {
+case 2:
+return cljs.core.ex_info.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args11971.length)].join('')));
+
+}
+});
+
+cljs.core.ex_info.cljs$core$IFn$_invoke$arity$2 = (function (msg,data){
+return cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3(msg,data,null);
+});
+
+cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3 = (function (msg,data,cause){
+return (new cljs.core.ExceptionInfo(msg,data,cause));
+});
+
+cljs.core.ex_info.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns exception data (a map) if ex is an ExceptionInfo.
+ * Otherwise returns nil.
+ */
+cljs.core.ex_data = (function cljs$core$ex_data(ex){
+if((ex instanceof cljs.core.ExceptionInfo)){
+return ex.data;
+} else {
+return null;
+}
+});
+/**
+ * Returns the message attached to the given Error / ExceptionInfo object.
+ * For non-Errors returns nil.
+ */
+cljs.core.ex_message = (function cljs$core$ex_message(ex){
+if((ex instanceof Error)){
+return ex.message;
+} else {
+return null;
+}
+});
+/**
+ * Returns exception cause (an Error / ExceptionInfo) if ex is an
+ * ExceptionInfo.
+ * Otherwise returns nil.
+ */
+cljs.core.ex_cause = (function cljs$core$ex_cause(ex){
+if((ex instanceof cljs.core.ExceptionInfo)){
+return ex.cause;
+} else {
+return null;
+}
+});
+/**
+ * Returns an JavaScript compatible comparator based upon pred.
+ */
+cljs.core.comparator = (function cljs$core$comparator(pred){
+return (function (x,y){
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$2 ? pred.cljs$core$IFn$_invoke$arity$2(x,y) : pred.call(null,x,y)))){
+return (-1);
+} else {
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$2 ? pred.cljs$core$IFn$_invoke$arity$2(y,x) : pred.call(null,y,x)))){
+return (1);
+} else {
+return (0);
+
+}
+}
+});
+});
+/**
+ * Returns true if x names a special form
+ */
+cljs.core.special_symbol_QMARK_ = (function cljs$core$special_symbol_QMARK_(x){
+return cljs.core.contains_QMARK_(new cljs.core.PersistentHashSet(null, new cljs.core.PersistentArrayMap(null, 23, [new cljs.core.Symbol(null,"&","&",-2144855648,null),null,new cljs.core.Symbol(null,"defrecord*","defrecord*",-1936366207,null),null,new cljs.core.Symbol(null,"try","try",-1273693247,null),null,new cljs.core.Symbol(null,"ns*","ns*",1840949383,null),null,new cljs.core.Symbol(null,"finally","finally",-1065347064,null),null,new cljs.core.Symbol(null,"loop*","loop*",615029416,null),null,new cljs.core.Symbol(null,"do","do",1686842252,null),null,new cljs.core.Symbol(null,"letfn*","letfn*",-110097810,null),null,new cljs.core.Symbol(null,"if","if",1181717262,null),null,new cljs.core.Symbol(null,"new","new",-444906321,null),null,new cljs.core.Symbol(null,"ns","ns",2082130287,null),null,new cljs.core.Symbol(null,"deftype*","deftype*",962659890,null),null,new cljs.core.Symbol(null,"let*","let*",1920721458,null),null,new cljs.core.Symbol(null,"js*","js*",-1134233646,null),null,new cljs.core.Symbol(null,"fn*","fn*",-752876845,null),null,new cljs.core.Symbol(null,"recur","recur",1202958259,null),null,new cljs.core.Symbol(null,"set!","set!",250714521,null),null,new cljs.core.Symbol(null,".",".",1975675962,null),null,new cljs.core.Symbol(null,"var","var",870848730,null),null,new cljs.core.Symbol(null,"quote","quote",1377916282,null),null,new cljs.core.Symbol(null,"catch","catch",-1616370245,null),null,new cljs.core.Symbol(null,"throw","throw",595905694,null),null,new cljs.core.Symbol(null,"def","def",597100991,null),null], null), null),x);
+});
+/**
+ * test [v] finds fn at key :test in var metadata and calls it,
+ * presuming failure will throw exception
+ */
+cljs.core.test = (function cljs$core$test(v){
+var f = v.cljs$lang$test;
+if(cljs.core.truth_(f)){
+(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+
+return new cljs.core.Keyword(null,"ok","ok",967785236);
+} else {
+return new cljs.core.Keyword(null,"no-test","no-test",-1679482642);
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IPrintWithWriter}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.TaggedLiteral = (function (tag,form){
+this.tag = tag;
+this.form = form;
+this.cljs$lang$protocol_mask$partition0$ = 2153775360;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.TaggedLiteral.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.TaggedLiteral.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (this$,other){
+var self__ = this;
+var this$__$1 = this;
+return ((other instanceof cljs.core.TaggedLiteral)) && (cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(self__.tag,other.tag)) && (cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(self__.form,other.form));
+});
+
+cljs.core.TaggedLiteral.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return (((31) * cljs.core.hash(self__.tag)) + cljs.core.hash(self__.form));
+});
+
+cljs.core.TaggedLiteral.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (this$,v){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1.cljs$core$ILookup$_lookup$arity$3(null,v,null);
+});
+
+cljs.core.TaggedLiteral.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (this$,v,not_found){
+var self__ = this;
+var this$__$1 = this;
+var G__11978 = (((v instanceof cljs.core.Keyword))?v.fqn:null);
+switch (G__11978) {
+case "tag":
+return self__.tag;
+
+break;
+case "form":
+return self__.form;
+
+break;
+default:
+return not_found;
+
+}
+});
+
+cljs.core.TaggedLiteral.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (o,writer,opts){
+var self__ = this;
+var o__$1 = this;
+cljs.core._write(writer,[cljs.core.str.cljs$core$IFn$_invoke$arity$1("#"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.tag),cljs.core.str.cljs$core$IFn$_invoke$arity$1(" ")].join(''));
+
+return cljs.core.pr_writer(self__.form,writer,opts);
+});
+
+cljs.core.TaggedLiteral.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"tag","tag",350170304,null),new cljs.core.Symbol(null,"form","form",16469056,null)], null);
+});
+
+cljs.core.TaggedLiteral.cljs$lang$type = true;
+
+cljs.core.TaggedLiteral.cljs$lang$ctorStr = "cljs.core/TaggedLiteral";
+
+cljs.core.TaggedLiteral.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/TaggedLiteral");
+});
+
+cljs.core.__GT_TaggedLiteral = (function cljs$core$__GT_TaggedLiteral(tag,form){
+return (new cljs.core.TaggedLiteral(tag,form));
+});
+
+/**
+ * Return true if the value is the data representation of a tagged literal
+ */
+cljs.core.tagged_literal_QMARK_ = (function cljs$core$tagged_literal_QMARK_(value){
+return (value instanceof cljs.core.TaggedLiteral);
+});
+/**
+ * Construct a data representation of a tagged literal from a
+ * tag symbol and a form.
+ */
+cljs.core.tagged_literal = (function cljs$core$tagged_literal(tag,form){
+if((tag instanceof cljs.core.Symbol)){
+} else {
+throw (new Error("Assert failed: (symbol? tag)"));
+}
+
+return (new cljs.core.TaggedLiteral(tag,form));
+});
+/**
+ * @type {*}
+ */
+cljs.core.js_reserved_arr = ["abstract","boolean","break","byte","case","catch","char","class","const","continue","debugger","default","delete","do","double","else","enum","export","extends","final","finally","float","for","function","goto","if","implements","import","in","instanceof","int","interface","let","long","native","new","package","private","protected","public","return","short","static","super","switch","synchronized","this","throw","throws","transient","try","typeof","var","void","volatile","while","with","yield","methods","null"];
+/**
+ * @type {null|Object}
+ */
+cljs.core.js_reserved = null;
+cljs.core.js_reserved_QMARK_ = (function cljs$core$js_reserved_QMARK_(x){
+if((cljs.core.js_reserved == null)){
+cljs.core.js_reserved = cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (p1__11980_SHARP_,p2__11981_SHARP_){
+goog.object.set(p1__11980_SHARP_,p2__11981_SHARP_,true);
+
+return p1__11980_SHARP_;
+}),({}),cljs.core.js_reserved_arr);
+} else {
+}
+
+return cljs.core.js_reserved.hasOwnProperty(x);
+});
+cljs.core.demunge_pattern = (function cljs$core$demunge_pattern(){
+if(cljs.core.truth_(cljs.core.DEMUNGE_PATTERN)){
+} else {
+cljs.core.DEMUNGE_PATTERN = (function (){var ks = cljs.core.sort.cljs$core$IFn$_invoke$arity$2((function (a,b){
+return (b.length - a.length);
+}),cljs.core.js_keys(cljs.core.DEMUNGE_MAP));
+var ks__$1 = ks;
+var ret = "";
+while(true){
+if(cljs.core.seq(ks__$1)){
+var G__11984 = cljs.core.next(ks__$1);
+var G__11985 = [cljs.core.str.cljs$core$IFn$_invoke$arity$1((function (){var G__11983 = ret;
+if(!((ret === ""))){
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(G__11983),cljs.core.str.cljs$core$IFn$_invoke$arity$1("|")].join('');
+} else {
+return G__11983;
+}
+})()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.first(ks__$1))].join('');
+ks__$1 = G__11984;
+ret = G__11985;
+continue;
+} else {
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(ret),cljs.core.str.cljs$core$IFn$_invoke$arity$1("|\\$")].join('');
+}
+break;
+}
+})();
+}
+
+return cljs.core.DEMUNGE_PATTERN;
+});
+cljs.core.munge_str = (function cljs$core$munge_str(name){
+var sb = (new goog.string.StringBuffer());
+var i_11986 = (0);
+while(true){
+if((i_11986 < name.length)){
+var c_11987 = name.charAt(i_11986);
+var sub_11988 = goog.object.get(cljs.core.CHAR_MAP,c_11987);
+if(!((sub_11988 == null))){
+sb.append(sub_11988);
+} else {
+sb.append(c_11987);
+}
+
+var G__11989 = (i_11986 + (1));
+i_11986 = G__11989;
+continue;
+} else {
+}
+break;
+}
+
+return sb.toString();
+});
+cljs.core.munge = (function cljs$core$munge(name){
+var name_SINGLEQUOTE_ = cljs.core.munge_str([cljs.core.str.cljs$core$IFn$_invoke$arity$1(name)].join(''));
+var name_SINGLEQUOTE___$1 = (((name_SINGLEQUOTE_ === ".."))?"_DOT__DOT_":(cljs.core.truth_(cljs.core.js_reserved_QMARK_(name_SINGLEQUOTE_))?[cljs.core.str.cljs$core$IFn$_invoke$arity$1(name_SINGLEQUOTE_),cljs.core.str.cljs$core$IFn$_invoke$arity$1("$")].join(''):name_SINGLEQUOTE_
+));
+if((name instanceof cljs.core.Symbol)){
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$1(name_SINGLEQUOTE___$1);
+} else {
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(name_SINGLEQUOTE___$1)].join('');
+}
+});
+cljs.core.demunge_str = (function cljs$core$demunge_str(munged_name){
+var r = (new RegExp(cljs.core.demunge_pattern(),"g"));
+var munged_name__$1 = (cljs.core.truth_(goog.string.endsWith(munged_name,"$"))?munged_name.substring((0),(munged_name.length - (1))):munged_name);
+var ret = "";
+var last_match_end = (0);
+while(true){
+var temp__4655__auto__ = r.exec(munged_name__$1);
+if(cljs.core.truth_(temp__4655__auto__)){
+var match = temp__4655__auto__;
+var vec__11993 = match;
+var x = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11993,(0),null);
+var G__11996 = [cljs.core.str.cljs$core$IFn$_invoke$arity$1(ret),cljs.core.str.cljs$core$IFn$_invoke$arity$1(munged_name__$1.substring(last_match_end,(r.lastIndex - x.length))),cljs.core.str.cljs$core$IFn$_invoke$arity$1((((x === "$"))?"/":goog.object.get(cljs.core.DEMUNGE_MAP,x)))].join('');
+var G__11997 = r.lastIndex;
+ret = G__11996;
+last_match_end = G__11997;
+continue;
+} else {
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(ret),cljs.core.str.cljs$core$IFn$_invoke$arity$1(munged_name__$1.substring(last_match_end,munged_name__$1.length))].join('');
+}
+break;
+}
+});
+cljs.core.demunge = (function cljs$core$demunge(name){
+return (((name instanceof cljs.core.Symbol))?cljs.core.symbol:cljs.core.str).call(null,(function (){var name_SINGLEQUOTE_ = [cljs.core.str.cljs$core$IFn$_invoke$arity$1(name)].join('');
+if((name_SINGLEQUOTE_ === "_DOT__DOT_")){
+return "..";
+} else {
+return cljs.core.demunge_str([cljs.core.str.cljs$core$IFn$_invoke$arity$1(name)].join(''));
+}
+})());
+});
+/**
+ * Bootstrap only.
+ */
+cljs.core.ns_lookup = (function cljs$core$ns_lookup(ns_obj,k){
+return (function (){
+return goog.object.get(ns_obj,k);
+});
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+*/
+cljs.core.Namespace = (function (obj,name){
+this.obj = obj;
+this.name = name;
+this.cljs$lang$protocol_mask$partition0$ = 6291456;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+})
+cljs.core.Namespace.prototype.findInternedVar = (function (sym){
+var self__ = this;
+var this$ = this;
+var k = cljs.core.munge([cljs.core.str.cljs$core$IFn$_invoke$arity$1(sym)].join(''));
+if(goog.object.containsKey(self__.obj,k)){
+var var_sym = cljs.core.symbol.cljs$core$IFn$_invoke$arity$2([cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.name)].join(''),[cljs.core.str.cljs$core$IFn$_invoke$arity$1(sym)].join(''));
+var var_meta = new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"ns","ns",441598760),this$], null);
+return (new cljs.core.Var(cljs.core.ns_lookup(self__.obj,k),var_sym,var_meta));
+} else {
+return null;
+}
+});
+
+cljs.core.Namespace.prototype.getName = (function (){
+var self__ = this;
+var _ = this;
+return self__.name;
+});
+
+cljs.core.Namespace.prototype.toString = (function (){
+var self__ = this;
+var _ = this;
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.name)].join('');
+});
+
+cljs.core.Namespace.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (_,other){
+var self__ = this;
+var ___$1 = this;
+if((other instanceof cljs.core.Namespace)){
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(self__.name,other.name);
+} else {
+return false;
+}
+});
+
+cljs.core.Namespace.prototype.cljs$core$IHash$_hash$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.hash(self__.name);
+});
+
+cljs.core.Namespace.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"obj","obj",-1672671807,null),new cljs.core.Symbol(null,"name","name",-810760592,null)], null);
+});
+
+cljs.core.Namespace.cljs$lang$type = true;
+
+cljs.core.Namespace.cljs$lang$ctorStr = "cljs.core/Namespace";
+
+cljs.core.Namespace.cljs$lang$ctorPrWriter = (function (this__7123__auto__,writer__7124__auto__,opt__7125__auto__){
+return cljs.core._write(writer__7124__auto__,"cljs.core/Namespace");
+});
+
+cljs.core.__GT_Namespace = (function cljs$core$__GT_Namespace(obj,name){
+return (new cljs.core.Namespace(obj,name));
+});
+
+/**
+ * Bootstrap only.
+ * @type {*}
+ */
+cljs.core.NS_CACHE = null;
+/**
+ * Bootstrap only.
+ */
+cljs.core.find_ns_obj_STAR_ = (function cljs$core$find_ns_obj_STAR_(ctxt,xs){
+while(true){
+if((ctxt == null)){
+return null;
+} else {
+if((xs == null)){
+return ctxt;
+} else {
+var G__12002 = (function (){var G__12000 = ctxt;
+var G__12001 = cljs.core.first(xs);
+return goog.object.get(G__12000,G__12001);
+})();
+var G__12003 = cljs.core.next(xs);
+ctxt = G__12002;
+xs = G__12003;
+continue;
+
+}
+}
+break;
+}
+});
+/**
+ * Bootstrap only.
+ */
+cljs.core.find_ns_obj = (function cljs$core$find_ns_obj(ns){
+var munged_ns = cljs.core.munge([cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns)].join(''));
+var segs = munged_ns.split(".");
+var G__12007 = cljs.core._STAR_target_STAR_;
+switch (G__12007) {
+case "nodejs":
+if(cljs.core.truth_(COMPILED)){
+return cljs.core.find_ns_obj_STAR_((function (){try{var G__12009 = cljs.core.first(segs);
+return eval(G__12009);
+}catch (e12008){if((e12008 instanceof ReferenceError)){
+var e = e12008;
+return null;
+} else {
+throw e12008;
+
+}
+}})(),cljs.core.next(segs));
+} else {
+return cljs.core.find_ns_obj_STAR_(global,segs);
+}
+
+break;
+case "default":
+return cljs.core.find_ns_obj_STAR_(goog.global,segs);
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("find-ns-obj not supported for target "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core._STAR_target_STAR_)].join('')));
+
+}
+});
+/**
+ * Bootstrap only.
+ */
+cljs.core.ns_interns_STAR_ = (function cljs$core$ns_interns_STAR_(sym){
+var ns_obj = cljs.core.find_ns_obj(sym);
+var ns = (new cljs.core.Namespace(ns_obj,sym));
+var step = ((function (ns_obj,ns){
+return (function cljs$core$ns_interns_STAR__$_step(ret,k){
+var var_sym = cljs.core.symbol.cljs$core$IFn$_invoke$arity$1(cljs.core.demunge(k));
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(ret,var_sym,(new cljs.core.Var(((function (var_sym,ns_obj,ns){
+return (function (){
+return goog.object.get(ns_obj,k);
+});})(var_sym,ns_obj,ns))
+,cljs.core.symbol.cljs$core$IFn$_invoke$arity$2([cljs.core.str.cljs$core$IFn$_invoke$arity$1(sym)].join(''),[cljs.core.str.cljs$core$IFn$_invoke$arity$1(var_sym)].join('')),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"ns","ns",441598760),ns], null))));
+});})(ns_obj,ns))
+;
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(step,cljs.core.PersistentArrayMap.EMPTY,cljs.core.js_keys(ns_obj));
+});
+/**
+ * Bootstrap only.
+ */
+cljs.core.create_ns = (function cljs$core$create_ns(var_args){
+var args12011 = [];
+var len__7625__auto___12014 = arguments.length;
+var i__7626__auto___12015 = (0);
+while(true){
+if((i__7626__auto___12015 < len__7625__auto___12014)){
+args12011.push((arguments[i__7626__auto___12015]));
+
+var G__12016 = (i__7626__auto___12015 + (1));
+i__7626__auto___12015 = G__12016;
+continue;
+} else {
+}
+break;
+}
+
+var G__12013 = args12011.length;
+switch (G__12013) {
+case 1:
+return cljs.core.create_ns.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args12011.length)].join('')));
+
+}
+});
+
+cljs.core.create_ns.cljs$core$IFn$_invoke$arity$1 = (function (sym){
+return cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2(sym,cljs.core.find_ns_obj(sym));
+});
+
+cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2 = (function (sym,ns_obj){
+return (new cljs.core.Namespace(ns_obj,sym));
+});
+
+cljs.core.create_ns.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Bootstrap only.
+ */
+cljs.core.find_ns = (function cljs$core$find_ns(ns){
+if((cljs.core.NS_CACHE == null)){
+cljs.core.NS_CACHE = (function (){var G__12019 = cljs.core.PersistentArrayMap.EMPTY;
+return (cljs.core.atom.cljs$core$IFn$_invoke$arity$1 ? cljs.core.atom.cljs$core$IFn$_invoke$arity$1(G__12019) : cljs.core.atom.call(null,G__12019));
+})();
+} else {
+}
+
+var the_ns = cljs.core.get.cljs$core$IFn$_invoke$arity$2((cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(cljs.core.NS_CACHE) : cljs.core.deref.call(null,cljs.core.NS_CACHE)),ns);
+if(!((the_ns == null))){
+return the_ns;
+} else {
+var ns_obj = cljs.core.find_ns_obj(ns);
+if((ns_obj == null)){
+return null;
+} else {
+var new_ns = cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2(ns,ns_obj);
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(cljs.core.NS_CACHE,cljs.core.assoc,ns,new_ns);
+
+return new_ns;
+}
+}
+});
+/**
+ * Bootstrap only.
+ */
+cljs.core.find_macros_ns = (function cljs$core$find_macros_ns(ns){
+if((cljs.core.NS_CACHE == null)){
+cljs.core.NS_CACHE = (function (){var G__12021 = cljs.core.PersistentArrayMap.EMPTY;
+return (cljs.core.atom.cljs$core$IFn$_invoke$arity$1 ? cljs.core.atom.cljs$core$IFn$_invoke$arity$1(G__12021) : cljs.core.atom.call(null,G__12021));
+})();
+} else {
+}
+
+var the_ns = cljs.core.get.cljs$core$IFn$_invoke$arity$2((cljs.core.deref.cljs$core$IFn$_invoke$arity$1 ? cljs.core.deref.cljs$core$IFn$_invoke$arity$1(cljs.core.NS_CACHE) : cljs.core.deref.call(null,cljs.core.NS_CACHE)),ns);
+if(!((the_ns == null))){
+return the_ns;
+} else {
+var ns_str = [cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns)].join('');
+var ns__$1 = ((!(goog.string.contains(ns_str,"$macros")))?cljs.core.symbol.cljs$core$IFn$_invoke$arity$1([cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns_str),cljs.core.str.cljs$core$IFn$_invoke$arity$1("$macros")].join('')):ns);
+var ns_obj = cljs.core.find_ns_obj(ns__$1);
+if((ns_obj == null)){
+return null;
+} else {
+var new_ns = cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2(ns__$1,ns_obj);
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(cljs.core.NS_CACHE,cljs.core.assoc,ns__$1,new_ns);
+
+return new_ns;
+}
+}
+});
+/**
+ * Bootstrap only.
+ */
+cljs.core.ns_name = (function cljs$core$ns_name(ns_obj){
+return ns_obj.name;
+});
+
+//# sourceMappingURL=core.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/cljs/core.js.map b/src/http/static/viz/1/cljs/core.js.map
new file mode 100644
index 0000000..89c76ee
--- /dev/null
+++ b/src/http/static/viz/1/cljs/core.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"out\/cljs\/core.js","sources":["core.cljs"],"lineCount":35801,"mappings":"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A,UAAA;;;KAAA;AAAA,OAAAA,gDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,gDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,gDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,gDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,gDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,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\/CAAEoD,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA;;AAVlB,MAAA,AAAAxG,2BAAA,cAUKoG;;;;;;AAVL,AAAA,kDAAA,lDAIGL,6DAOEK,MAAKnD,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ;AAXpB,AAAA,GAAA,CAAA,EAAA,UAAA,YAAA,EAAA,CAAA,uCAAA,\/DAWK4I,wBAAAA;AAXL,OAWKA,oCAAAA,MAAKnD,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ;;AAXpB,IAAAwI,kBAAA,EAAA,UAAA,OAAA,hBAWKI,qBAAAA;IAXLH,kBAAA,CAAAC,kBAAA,AAAAtG,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,mEAAAA,rBAWKG,+CAAAA,zCAAKnD,+CAAAA,7CAAEoD,+CAAAA,7CAAEC,+CAAAA,7CAAEC,+CAAAA,7CAAEC,+CAAAA,7CAAEhJ,+CAAAA;;AAXpB,IAAAyI,sBAAA,CAAAC,kBAAA;AAAA,AAAA,GAAA,EAAA,CAAAD,uBAAA;AAAA,QAAAA,oDAAAA,uEAAAA,rBAWKG,mDAAAA,7CAAKnD,mDAAAA,jDAAEoD,mDAAAA,jDAAEC,mDAAAA,jDAAEC,mDAAAA,jDAAEC,mDAAAA,jDAAEhJ,mDAAAA;;AAXpB,MAAA,AAAAwC,2BAAA,cAWKoG;;;;;;AAXL,AAAA,kDAAA,lDAIGL,6DAQEK,MAAKnD,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ;AAZtB,AAAA,GAAA,CAAA,EAAA,UAAA,YAAA,EAAA,CAAA,uCAAA,\/DAYKL,wBAAAA;AAZL,OAYKA,oCAAAA,MAAKnD,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ;;AAZtB,IAAAT,kBAAA,EAAA,UAAA,OAAA,hBAYKI,qBAAAA;IAZLH,kBAAA,CAAAC,kBAAA,AAAAtG,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,qEAAAA,vBAYKG,iDAAAA,3CAAKnD,iDAAAA,\/CAAEoD,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEhJ,iDAAAA,\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\/DAAEoD,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEhJ,iEAAAA,\/DAAEiJ,iEAAAA,\/DAAEC,iEAAAA,\/DAAEjE,iEAAAA,\/DAAEkE,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA;;AAlBlC,MAAA,AAAA9G,2BAAA,cAkBKoG;;;;;;AAlBL,AAAA,mDAAA,nDAIGL,8DAeEK,MAAKnD,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE,EAAEkE,EAAEC,EAAEC,EAAEC,EAAEC;AAnBpC,AAAA,GAAA,CAAA,EAAA,UAAA,YAAA,EAAA,CAAA,wCAAA,hEAmBKX,wBAAAA;AAnBL,OAmBKA,qCAAAA,MAAKnD,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE,EAAEkE,EAAEC,EAAEC,EAAEC,EAAEC;;AAnBpC,IAAAf,kBAAA,EAAA,UAAA,OAAA,hBAmBKI,qBAAAA;IAnBLH,kBAAA,CAAAC,kBAAA,AAAAtG,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,iDAAAA,oFAAAA,rCAmBKG,+DAAAA,zDAAKnD,+DAAAA,7DAAEoD,+DAAAA,7DAAEC,+DAAAA,7DAAEC,+DAAAA,7DAAEC,+DAAAA,7DAAEhJ,+DAAAA,7DAAEiJ,+DAAAA,7DAAEC,+DAAAA,7DAAEjE,+DAAAA,7DAAEkE,+DAAAA,7DAAEC,+DAAAA,7DAAEC,+DAAAA,7DAAEC,+DAAAA,7DAAEC,+DAAAA;;AAnBpC,IAAAd,sBAAA,CAAAC,kBAAA;AAAA,AAAA,GAAA,EAAA,CAAAD,uBAAA;AAAA,QAAAA,qDAAAA,wFAAAA,rCAmBKG,mEAAAA,7DAAKnD,mEAAAA,jEAAEoD,mEAAAA,jEAAEC,mEAAAA,jEAAEC,mEAAAA,jEAAEC,mEAAAA,jEAAEhJ,mEAAAA,jEAAEiJ,mEAAAA,jEAAEC,mEAAAA,jEAAEjE,mEAAAA,jEAAEkE,mEAAAA,jEAAEC,mEAAAA,jEAAEC,mEAAAA,jEAAEC,mEAAAA,jEAAEC,mEAAAA;;AAnBpC,MAAA,AAAA\/G,2BAAA,cAmBKoG;;;;;;AAnBL,AAAA,mDAAA,nDAIGL,8DAgBEK,MAAKnD,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE,EAAEkE,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC;AApBtC,AAAA,GAAA,CAAA,EAAA,UAAA,YAAA,EAAA,CAAA,wCAAA,hEAoBKZ,wBAAAA;AApBL,OAoBKA,qCAAAA,MAAKnD,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE,EAAEkE,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC;;AApBtC,IAAAhB,kBAAA,EAAA,UAAA,OAAA,hBAoBKI,qBAAAA;IApBLH,kBAAA,CAAAC,kBAAA,AAAAtG,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,iDAAAA,sFAAAA,vCAoBKG,iEAAAA,3DAAKnD,iEAAAA,\/DAAEoD,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEhJ,iEAAAA,\/DAAEiJ,iEAAAA,\/DAAEC,iEAAAA,\/DAAEjE,iEAAAA,\/DAAEkE,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\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\/G,2BAAA,gBAES2H;;;;;;AAFT,AAAA,+CAAA,\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\/CAAKC,oDAAAA;;AAD\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\/V;IAA7BgW,UAA+B9R;IAA\/B+R,UAAiC9R;IAAjC+R,UAAmC9R;IAAnC+R,UAAqC9R;IAArC+R,UAAuC9R;IAAvC+R,UAAyC9R;IAAzC+R,UAA2CpZ;IAA3CqZ,UAA6C\/R;IAA7CgS,UAA+C\/R;IAA\/CgS,UAAiD3Y;IAAjD4Y,UAAmD\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\/BpB,AAAA,QAAA,JA+BYnJ;AA\/BZ,AAgCI,OAAC,CAACgH,2CAAAA,6CAAAA,iCAAKnB,EAAEoD,EAAEC,EAAEC;;;AAhCjB,AAAA,AAAA,wDAAA,xDAASmR,mEAiCKzU,EAAEoD,EAAEC,EAAEC,EAAEC;;AAjCtB,AAAA,QAAA,JAiCYpJ;AAjCZ,AAkCI,OAAC,CAACgH,2CAAAA,6CAAAA,iCAAKnB,EAAEoD,EAAEC,EAAEC,EAAEC;;;AAlCnB,AAAA,AAAA,wDAAA,xDAASkR,mEAmCKzU,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ;;AAnCxB,AAAA,QAAA,JAmCYJ;AAnCZ,AAoCI,OAAC,CAACgH,2CAAAA,6CAAAA,iCAAKnB,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ;;;AApCrB,AAAA,AAAA,wDAAA,xDAASka,mEAqCKzU,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ;;AArC1B,AAAA,QAAA,JAqCYrJ;AArCZ,AAsCI,OAAC,CAACgH,2CAAAA,6CAAAA,iCAAKnB,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ;;;AAtCvB,AAAA,AAAA,wDAAA,xDAASiR,mEAuCKzU,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC;;AAvC5B,AAAA,QAAA,JAuCYtJ;AAvCZ,AAwCI,OAAC,CAACgH,2CAAAA,6CAAAA,iCAAKnB,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC;;;AAxCzB,AAAA,AAAA,wDAAA,xDAASgR,mEAyCKzU,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE;;AAzC9B,AAAA,QAAA,JAyCYrF;AAzCZ,AA0CI,OAAC,CAACgH,2CAAAA,6CAAAA,iCAAKnB,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE;;;AA1C3B,AAAA,AAAA,yDAAA,zDAASiV,oEA2CKzU,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE,EAAEkE;;AA3ChC,AAAA,QAAA,JA2CYvJ;AA3CZ,AA4CI,OAAC,CAACgH,2CAAAA,6CAAAA,iCAAKnB,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE,EAAEkE;;;AA5C7B,AAAA,AAAA,yDAAA,zDAAS+Q,oEA6CKzU,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE,EAAEkE,EAAEC;;AA7ClC,AAAA,QAAA,JA6CYxJ;AA7CZ,AA8CI,OAAC,CAACgH,2CAAAA,6CAAAA,iCAAKnB,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE,EAAEkE,EAAEC;;;AA9C\/B,AAAA,AAAA,yDAAA,zDAAS8Q,oEA+CKzU,EAAEoD,EAAEC,EAAEC,EAAEC,EAAEhJ,EAAEiJ,EAAEC,EAAEjE,EAAEkE,EAAEC,EAAEC;;AA\/CpC,AAAA,QAAA,JA+CYzJ;AA\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\/DpD,AAAA,QAAA,JA+DYhE;AA\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\/D7B,AAAA,AAAA,+DAAA,\/DAASZ,0EAwBC8F;;AAxBV,AAAA,eAAA,XAwBUA;AAxBV,AAwBgBkE;;;AAxBhB,AAAA,AAAA,qEAAA,rEAAShK,gFAgBEzE;;AAhBX,AAAA,YAAA,RAgBWA;AAhBX,AAgBc,YAAAyE,qBAAae,WAAIH,SAAEoJ;;;AAhBjC,AAAA,AAAA,+DAAA,\/DAAShK,0EAqCCzE;;AArCV,AAAA,YAAA,RAqCUA;AArCV,AAqCa,GAAI,CAAG,YAAA,XAAKqF,kBAAG,AAASG;AACtB,YAAAf,iDAAA,5BAAae,WAAI,YAAA,XAAKH;;AADxB;;;;AArCb,AAAA,AAAA,mEAAA,nEAASZ,8EA0CEzE;;AA1CX,AAAA,YAAA,RA0CWA;AA1CX,AA2CI,IAAAmiB,kBAAA;IAAAC,kBAAO,CAAG,AAAS5c,oBAAKH;AAAxB,AAAA,SAAA8c,kBAAAC,mBAAAD,kBAAAC;;;AA3CJ,AAAA,AAAA,qEAAA,rEAAS3d,gFAiFC8F;;AAjFV,AAAA,eAAA,XAiFUA;AAjFV,AAkFI,IAAMrB,IAAE,AAAQqB;AAAhB,AACE,GAAI,KAAA,JAAMrB;AACR,YAAAka,kCAAA,nBAAO7Y,SAAK,KAAA,JAAKrB;;AADnB;;;;AAnFN,AAAA,AAAA,+DAAA,\/DAASzE,0EA8EC8F;;AA9EV,AAAA,eAAA,XA8EUA;AA9EV,AA8EgB,OAACyU,4BAAkBzU;;;AA9EnC,AAAA,AAAA,iEAAA,jEAAS9F,4EA2DE8F,KAAKgF;;AA3DhB,AAAA,eAAA,XA2DWhF;AA3DX,AA2DuB,QAACyY,2DAAAA,2EAAAA,lBAAiBzY,uDAAAA,9CAAKgF,uDAAAA;;;AA3D9C,AAAA,AAAA,+EAAA,\/EAAS9K,0FAqEE8F;;AArEX,AAAA,eAAA,XAqEWA;AArEX,AAqEiB,OAAS2Y;;;AArE1B,AAAA,AAAA,mEAAA,nEAASze,8EAwEG8F,KAAKnK;;AAxEjB,AAAA,eAAA,XAwEYmK;AAxEZ,AAyEI,OAAC4Y,qDAAa3d,WAAIpF,EAAE,CAAMoF,WAAIH,WAAG,YAAA,XAAKA;;;AAzE1C,AAAA,AAAA,mEAAA,nEAASZ,8EA0EG8F,KAAKnK,EAAE2O;;AA1EnB,AAAA,eAAA,XA0EYxE;AA1EZ,AA2EI,OAAC4Y,qDAAa3d,WAAIpF,EAAE2O,MAAM1J;;;AA3E9B,AAAA,AAAA,+DAAA,\/DAASZ,0EA+BEzE;;AA\/BX,AAAA,YAAA,RA+BWA;AA\/BX,AA+Bc,QAAMwF,WAAIH;;;AA\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\/CAAMsgB;AAAN,AAAA;;;AAAA,AAAA,+CAAA,\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\/BAAI\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\/BAAI\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\/K;;AAAzB;;;;AAAA,OAAAiB,kCAAY8J,uBAAa\/K;;;AAE\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\/L,GAAG,AAACmjB,4CAAIJ,GAAG\/iB;AAApC,AACE,GAAI,CAAK,OAAA,NAAOR,gBAAG,CAAG,KAAA,JAAGQ,WAAKlE;AAC5B,cAAOiQ;cAAGgX;cAAGjnB;cAAI,KAAA,JAAKkE;;;;;;;AACtBR;;;;;;AAdT,AAAA,oDAAA,pDAAgBsjB;;AAAhB,AAgBA;;;;8BAAA,9BAAgBM,oEAGb3sB;AAHH,AAIE,GAAI,AAACge,6CAAEhe,EAAEksB;AACPA;;AACA,kBAAKjrB,EAAEG;AAAP,AACE,IAAMsI,IAAE,CAAC1J,kCAAAA,uCAAAA,PAAEiB,mBAAAA,jBAAEG,mBAAAA;AAAb,AACE,GAAI,OAASsI;AACXA;;AACA,oBAAIA;AAAJ;;AAEE,oBAAI,CAAC1J,kCAAAA,uCAAAA,PAAEoB,mBAAAA,jBAAEH,mBAAAA;AAAT;;AAAA;;;;;;;AAEZ,AAAA,AAEA,AAAA;;;;;iBAAA,yBAAA6C,1CAAMgpB;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA5oB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA4oB,cAAA,CAAA,UAAA3oB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA4oB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,6CAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAjtB,MAAA,6CAAA,+DAAA,AAAA+sB;;;;;AAAA,AAAA,+CAAA,\/CAAME,0DAIF3iB;AAJJ,AAKG,OAAC4iB,6CAAKb,kBAAQ\/hB;;;AALjB,AAAA,+CAAA,\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\/yB;AAA\/B,AAAkCA;;AAClC,4BAAA,5BAAcgzB,gEAAiBhzB;AAA\/B,AAAkCA;;AAClC,6BAAA,7BAAcizB,kEAAkBjzB;AAAhC,AAAmCA;;AAEnC,AAAA;;;0BAAA,kCAAA6C,5DAAcuwB;AAAd,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAnwB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAmwB,cAAA,CAAA,UAAAlwB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAmwB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC;;;KAAA;AAAA,OAAAA,sDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAAjwB,uBAAA,KAAAC,qBAAA,AAAA8vB,eAAA,KAAA,IAAA;AAAA,AAAA,OAAAE,6DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAjwB;;;;;AAAA,AAAA,wDAAA,xDAAciwB;AAAd,AAAA;;;AAAA,AAAA,wDAAA,xDAAcA,mEAGVpzB;AAHJ,AAGOA;;;AAHP,AAAA,wDAAA,xDAAcozB,mEAIVpzB,EAAEG;AAJN,AAIS,QAAyBH,IAAEG;;;AAJpC,AAAA,AAAA,+DAAA,\/DAAcizB,0EAKVpzB,EAAEG,EAAI2c;AALV,AAKgB,OAAC2R,+CAAO2E,wBAAc,CAAyBpzB,IAAEG,GAAG2c;;;AALpE,AAAA,4CAAA,WAAAuW,vDAAcD;AAAd,AAAA,IAAAE,UAAA,AAAA\/vB,gBAAA8vB;IAAAA,cAAA,AAAA7vB,eAAA6vB;IAAAE,UAAA,AAAAhwB,gBAAA8vB;IAAAA,cAAA,AAAA7vB,eAAA6vB;AAAA,AAAA,oEAAAC,QAAAC,QAAAF,7EAAcD;;;AAAd,AAAA,kDAAA,lDAAcA;;AAAd,AAOA,AAAA;;;8BAAA,sCAAAvwB,pEAAc6wB;AAAd,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAzwB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAywB,cAAA,CAAA,UAAAxwB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAywB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC;;;KAAA;AAAA,OAAAA,0DAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,0DAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAAvwB,uBAAA,KAAAC,qBAAA,AAAAowB,eAAA,KAAA,IAAA;AAAA,AAAA,OAAAE,iEAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAvwB;;;;;AAAA,AAAA,4DAAA,5DAAcuwB;AAAd,AAAA;;;AAAA,AAAA,4DAAA,5DAAcA,uEAGV1zB;AAHJ,AAGOA;;;AAHP,AAAA,4DAAA,5DAAc0zB,uEAIV1zB,EAAEG;AAJN,AAIS,QAA6BH,IAAEG;;;AAJxC,AAAA,AAAA,mEAAA,nEAAcuzB,8EAKV1zB,EAAEG,EAAI2c;AALV,AAKgB,OAAC2R,+CAAOiF,4BAAkB,CAA6B1zB,IAAEG,GAAG2c;;;AAL5E,AAAA,gDAAA,WAAA6W,3DAAcD;AAAd,AAAA,IAAAE,UAAA,AAAArwB,gBAAAowB;IAAAA,cAAA,AAAAnwB,eAAAmwB;IAAAE,UAAA,AAAAtwB,gBAAAowB;IAAAA,cAAA,AAAAnwB,eAAAmwB;AAAA,AAAA,wEAAAC,QAAAC,QAAAF,jFAAcD;;;AAAd,AAAA,sDAAA,tDAAcA;;AAAd,AAOA;;;0BAAA,1BAAMI,4DAEH9zB;AAFH,AAGE,YAAA,JAAyBA;;AAE3B;;;8BAAA,9BAAM+zB,oEAEH\/zB;AAFH,AAGE,YAAA,JAA6BA;;AAE\/B,AAAA;;;;iCAAA,yCAAA6C,1EAAcqxB;AAAd,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAjxB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAixB,cAAA,CAAA,UAAAhxB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAixB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,6DAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6DAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAA\/wB,uBAAA,KAAAC,qBAAA,AAAA4wB,eAAA,KAAA,IAAA;AAAA,AAAA,OAAAE,oEAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA\/wB;;;;;AAAA,AAAA,+DAAA,\/DAAc+wB,0EAGVl0B;AAHJ,AAGO,QAAA,MAAwBA;;;AAH\/B,AAAA,+DAAA,\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\/BV,AAAA,eAAA,XA+BUA;AA\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\/B,MAAA,6CAAA,+DAAA,AAAA0\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\/DT,AAAA,eAAA,XA+DSA;AA\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\/BX,AAAA,eAAA,XA+BWA;AA\/BX,AA+BiB,iEAAA,1DAACoW,6CAAKqgB;;;AA\/BvB,AAAA,AAAA,+DAAA,\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\/B;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAn\/B,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAm\/B,cAAA,CAAA,UAAAl\/B;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAm\/B,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,mDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAAj\/B,uBAAA,KAAAC,qBAAA,AAAA8+B,eAAA,KAAA,IAAA;AAAA,AAAA,OAAAE,0DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAj\/B;;;;;AAAA,AAAA,qDAAA,rDAAMi\/B,gEAGFxiC;AAHJ,AAGU,OAAC2c,cAAI3c;;;AAHf,AAAA,qDAAA,rDAAMwiC,gEAIF59B,EAAE5E;AAJN,AAIY,OAACgiB,eAAKpd,EAAE5E;;;AAJpB,AAAA,qDAAA,rDAAMwiC,gEAKF59B,EAAEoD,EAAEhI;AALR,AAKc,OAACgiB,eAAKpd,EAAE,AAACod,eAAKha,EAAEhI;;;AAL9B,AAAA,qDAAA,rDAAMwiC,gEAMF59B,EAAEoD,EAAEC,EAAEjI;AANV,AAMgB,OAACgiB,eAAKpd,EAAE,AAACod,eAAKha,EAAE,AAACga,eAAK\/Z,EAAEjI;;;AANxC,AAAA,AAAA,4DAAA,5DAAMwiC,uEAOF59B,EAAEoD,EAAEC,EAAEC,EAAIgV;AAPd,AAQK,OAAC8E,eAAKpd,EAAE,AAACod,eAAKha,EAAE,AAACga,eAAK\/Z,EAAE,AAAC+Z,eAAK9Z,EAAE,AAACu5B,iBAAOvkB;;;AAR7C,AAAA,yCAAA,WAAAulB,pDAAMD;AAAN,AAAA,IAAAE,UAAA,AAAA\/+B,gBAAA8+B;IAAAA,cAAA,AAAA7+B,eAAA6+B;IAAAE,UAAA,AAAAh\/B,gBAAA8+B;IAAAA,cAAA,AAAA7+B,eAAA6+B;IAAAG,UAAA,AAAAj\/B,gBAAA8+B;IAAAA,cAAA,AAAA7+B,eAAA6+B;IAAAI,UAAA,AAAAl\/B,gBAAA8+B;IAAAA,cAAA,AAAA7+B,eAAA6+B;AAAA,AAAA,iEAAAC,QAAAC,QAAAC,QAAAC,QAAAJ,1FAAMD;;;AAAN,AAAA,+CAAA,\/CAAMA;;AAAN,AAaA;;;uBAAA,vBAAMM,qDAEHx5B;AAFH,AAGE,OAACiI,wBAAcjI;;AAEjB;;;;;6BAAA,7BAAMy5B,kEAIHnxB;AAJH,AAKE,OAACC,4BAAaD;;AAEhB,AAAA;;;;uBAAA,+BAAA3O,tDAAMigC;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA7\/B,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA6\/B,cAAA,CAAA,UAAA5\/B;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA6\/B,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAA3\/B,uBAAA,KAAAC,qBAAA,AAAAw\/B,eAAA,KAAA,IAAA;AAAA,AAAA,OAAAE,0DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA3\/B;;;;;AAAA,AAAA,qDAAA,rDAAM2\/B;AAAN,AAGM,4BAAA,rBAACJ;;;AAHP,AAAA,qDAAA,rDAAMI,gEAIFtxB;AAJJ,AAIWA;;;AAJX,AAAA,qDAAA,rDAAMsxB,gEAKFtxB,MAAM7L;AALV,AAMI,OAAC4L,sBAAOC,MAAM7L;;;AANlB,AAAA,AAAA,4DAAA,5DAAMm9B,uEAOFtxB,MAAM7L,IAAMu9B;;AAPhB,AAQI,IAAMC,SAAO,AAAC5xB,sBAAOC,MAAM7L;AAA3B,AACE,oBAAIu9B;AACF,cAAOC;cAAO,AAAC5\/B,gBAAM2\/B;cAAM,AAAC1\/B,eAAK0\/B;;;;;;AACjCC;;;;;;AAXR,AAAA,yCAAA,WAAAJ,pDAAMD;AAAN,AAAA,IAAAE,UAAA,AAAAz\/B,gBAAAw\/B;IAAAA,cAAA,AAAAv\/B,eAAAu\/B;IAAAE,UAAA,AAAA1\/B,gBAAAw\/B;IAAAA,cAAA,AAAAv\/B,eAAAu\/B;AAAA,AAAA,iEAAAC,QAAAC,QAAAF,1EAAMD;;;AAAN,AAAA,+CAAA,\/CAAMA;;AAAN,AAaA,AAAA;;;;;wBAAA,gCAAAjgC,xDAAMygC;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAArgC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAqgC,cAAA,CAAA,UAAApgC;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAqgC,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,oDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAAngC,uBAAA,KAAAC,qBAAA,AAAAggC,eAAA,KAAA,IAAA;AAAA,AAAA,OAAAE,2DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAngC;;;;;AAAA,AAAA,sDAAA,tDAAMmgC,iEAIF9xB,MAAMT,IAAIpL;AAJd,AAKI,OAACiM,uBAAQJ,MAAMT,IAAIpL;;;AALvB,AAAA,AAAA,6DAAA,7DAAM29B,wEAMF9xB,MAAMT,IAAIpL,IAAM4f;;AANpB,AAOI,IAAM4d,SAAO,AAACvxB,uBAAQJ,MAAMT,IAAIpL;AAAhC,AACE,oBAAI4f;AACF,cAAO4d;cAAO,AAAC5\/B,gBAAMgiB;cAAK,AAACvC,iBAAOuC;cAAK,AAACnC,gBAAMmC;;;;;;;AAC9C4d;;;;;;AAVR,AAAA,0CAAA,WAAAI,rDAAMD;AAAN,AAAA,IAAAE,UAAA,AAAAjgC,gBAAAggC;IAAAA,cAAA,AAAA\/\/B,eAAA+\/B;IAAAE,UAAA,AAAAlgC,gBAAAggC;IAAAA,cAAA,AAAA\/\/B,eAAA+\/B;IAAAG,UAAA,AAAAngC,gBAAAggC;IAAAA,cAAA,AAAA\/\/B,eAAA+\/B;AAAA,AAAA,kEAAAC,QAAAC,QAAAC,QAAAH,nFAAMD;;;AAAN,AAAA,gDAAA,hDAAMA;;AAAN,AAYA,AAAA;;;yBAAA,iCAAAzgC,1DAAMghC;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA5gC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA4gC,cAAA,CAAA,UAAA3gC;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA4gC,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,qDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAA1gC,uBAAA,KAAAC,qBAAA,AAAAugC,eAAA,KAAA,IAAA;AAAA,AAAA,OAAAE,4DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA1gC;;;;;AAAA,AAAA,uDAAA,vDAAM0gC,kEAEFryB,MAAMT;AAFV,AAGI,OAACgB,wBAASP,MAAMT;;;AAHpB,AAAA,AAAA,8DAAA,9DAAM8yB,yEAIFryB,MAAMT,IAAMgV;;AAJhB,AAKI,IAAMod,SAAO,AAACpxB,wBAASP,MAAMT;AAA7B,AACE,oBAAIgV;AACF,cAAOod;cAAO,AAAC5\/B,gBAAMwiB;cAAI,AAACviB,eAAKuiB;;;;;;AAC\/Bod;;;;;;AARR,AAAA,2CAAA,WAAAW,tDAAMD;AAAN,AAAA,IAAAE,UAAA,AAAAxgC,gBAAAugC;IAAAA,cAAA,AAAAtgC,eAAAsgC;IAAAE,UAAA,AAAAzgC,gBAAAugC;IAAAA,cAAA,AAAAtgC,eAAAsgC;AAAA,AAAA,mEAAAC,QAAAC,QAAAF,5EAAMD;;;AAAN,AAAA,iDAAA,jDAAMA;;AAAN,AAUA;;;;sBAAA,tBAAMI,oDAGHzyB;AAHH,AAIE,OAACY,qBAAMZ;;AAET,AAAA;;;;uBAAA,+BAAA3O,tDAAMuhC;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAnhC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAmhC,cAAA,CAAA,UAAAlhC;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAmhC,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAAjhC,uBAAA,KAAAC,qBAAA,AAAA8gC,eAAA,KAAA,IAAA;AAAA,AAAA,OAAAE,0DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAjhC;;;;;AAAA,AAAA,qDAAA,rDAAMihC,gEAGF5yB,MAAM7L;AAHV,AAII,OAAC4M,yBAAUf,MAAM7L;;;AAJrB,AAAA,AAAA,4DAAA,5DAAMy+B,uEAKF5yB,MAAM7L,IAAMu9B;;AALhB,AAMI,IAAMC,SAAO,AAAC5wB,yBAAUf,MAAM7L;AAA9B,AACE,oBAAIu9B;AACF,cAAOC;cAAO,AAAC5\/B,gBAAM2\/B;cAAM,AAAC1\/B,eAAK0\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\/B,AAAA,oCAAA,WAAA0E,\/CAAM\/hC;AAAN,AAAA,IAAAgiC,UAAA,AAAA1iC,gBAAAyiC;IAAAA,cAAA,AAAAxiC,eAAAwiC;IAAAE,UAAA,AAAA3iC,gBAAAyiC;IAAAA,cAAA,AAAAxiC,eAAAwiC;IAAAG,UAAA,AAAA5iC,gBAAAyiC;IAAAA,cAAA,AAAAxiC,eAAAwiC;IAAAI,UAAA,AAAA7iC,gBAAAyiC;IAAAA,cAAA,AAAAxiC,eAAAwiC;IAAAK,UAAA,AAAA9iC,gBAAAyiC;IAAAA,cAAA,AAAAxiC,eAAAwiC;AAAA,AAAA,4DAAAC,QAAAC,QAAAC,QAAAC,QAAAC,QAAAL,7FAAM\/hC;;;AAAN,AAAA,0CAAA,1CAAMA;;AAAN,AA8CA,AAEA,AAAA;;;;sBAAA,8BAAApB,pDAAMikC;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA7jC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA6jC,cAAA,CAAA,UAAA5jC;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA6jC,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAA3jC,uBAAA,KAAAC,qBAAA,AAAAwjC,eAAA,KAAA,IAAA;AAAA,AAAA,OAAAE,yDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA3jC;;;;;AAAA,AAAA,oDAAA,pDAAM2jC,+DAGFrlC,IAAI1C;AAHR,AAIG,OAAC8jB,oBAAUphB,IAAI,iBAAA6lC,UAAG,AAAC9gB,eAAK\/kB;AAAT,AAAA,0EAAA6lC,uBAAAA,zFAACvoC,kCAAAA,2CAAAA;;;;AAJnB,AAAA,oDAAA,pDAAM+nC,+DAKFrlC,IAAI1C,EAAEyF;AALV,AAMG,OAACqe,oBAAUphB,IAAI,iBAAA8lC,UAAG,AAAC\/gB,eAAK\/kB;IAAT+lC,UAAchjC;AAAd,AAAA,0EAAA+iC,QAAAC,uBAAAD,QAAAC,zGAACzoC,kCAAAA,mDAAAA;;;;AANnB,AAAA,oDAAA,pDAAM+nC,+DAOFrlC,IAAI1C,EAAEyF,EAAEoD;AAPZ,AAQG,OAACib,oBAAUphB,IAAI,iBAAAgmC,UAAG,AAACjhB,eAAK\/kB;IAATimC,UAAcljC;IAAdmjC,UAAgB\/\/B;AAAhB,AAAA,0EAAA6\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\/B;;AADf,GAEE,OAAS5\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\/DV,AAAA,gBAAA,ZA+DUA;AA\/DV,AAgEI,GAAU,mBAAA,lBAAMuiC;AAAhB;AAAA,AACE,AAAMviC;;;AACR,GAAI,gBAAA,fAAMe;AAAV;;AAEE,OAAC8F,eAAK9F;;;;AApEZ,AAAA,AAAA,oEAAA,pEAASyhC,+EAoCCxiC;;AApCV,AAAA,gBAAA,ZAoCUA;AApCV,AAqCI,OAACgW,4BAAkBhW;;;AArCvB,AAAA,AAAA,sEAAA,tEAASwiC,iFA4BExiC,MAAKuG;;AA5BhB,AAAA,gBAAA,ZA4BWvG;AA5BX,AA6BI,IAAM7F,IAAE,AAAM6F;AAAd,AACE,GAAA,EAAQ,MAAA,LAAM7F;AACZ,OAAC6f,2BAAiBha,UAAKuG;;AACvB,QAAK,AAACoZ,4BAAYpZ,YACb,yBAAA,xBAAM,AAACqO,cAAIrO;;;;AAjCxB,AAAA,AAAA,oFAAA,pFAASi8B,+FAuBExiC;;AAvBX,AAAA,gBAAA,ZAuBWA;AAvBX,AAAA;;;AAAA,AAAA,AAAA,oEAAA,pEAASwiC,+EAgDExiC;;AAhDX,AAAA,gBAAA,ZAgDWA;AAhDX,AAiDI,GAAU,mBAAA,lBAAMuiC;AAAhB;AAAA,AACE,AAAMviC;;;AACR,GAAI,gBAAA,fAAMe;AAAV;;AAEEuzB;;;;AArDN,AAAA,AAAA,mEAAA,nEAASkO,8EAuDCxiC;;AAvDV,AAAA,gBAAA,ZAuDUA;AAvDV,AAwDI,GAAU,mBAAA,lBAAMuiC;AAAhB;AAAA,AACE,AAAMviC;;;AACR,GAAI,gBAAA,fAAMe;AAAV;;AAEEA;;;;AA5DN,AAAA,AAAA,sEAAA,tEAASyhC,iFAwCAxiC;;AAxCT,AAAA,gBAAA,ZAwCSA;AAxCT,AAyCI,GAAU,mBAAA,lBAAMuiC;AAAhB;AAAA,AACE,AAAOA,oBAAQviC;;;AACjB,GAAI,gBAAA,fAAMe;AAAV;;AAEEf;;;;AA7CN,AAAA,AAAA,6EAAA,7EAASwiC,wFAYMxiC,MAAK8Q;;AAZpB,AAAA,gBAAA,ZAYe9Q;AAZf,AAaI,YAAAwiC,0BAAkBD,eAAQjO,aAAMvzB,YAAK+P;;;AAbzC,AAAA,AAAA,0EAAA,1EAAS0xB,qFAmBCxiC,MAAKY;;AAnBf,AAAA,gBAAA,ZAmBUZ;AAnBV,AAoBI,OAACia,eAAKrZ,EAAE,AAAMZ;;;AApBlB,AAAA,qCAAA,rCAASwiC;AAAT,AAAA,0FAAA,oBAAA,+DAAA,2CAAA,0DAAA,cAAA,oBAAA,0DAAA,2CAAA,0DAAA,cAAA,oBAAA,wDAAA,2CAAA,0DAAA,cAAA;;;AAAA,AAAA,2CAAA,3CAASA;;AAAT,AAAA,8CAAA,9CAASA;;AAAT,AAAA,mDAAA,WAAAv1B,mBAAAC,qBAAAC,tGAASq1B;AAAT,AAAA,OAAAt6B,iBAAAgF,qBAAA;;;AAAA,iCAAA,jCAASy2B,0EAA2BpB,QAAkBjO,MAAgBvzB,KAAK0E;AAA3E,AAAA,YAAA+8B,0BAAoCD,QAAkBjO,MAAgBvzB,KAAK0E;;;AAAlE+8B,AAsET,CAAA,oCAAA\/nC,yBAAA,7DAAc+nC;AAAd,AAAA,IAAAnoB,qBAAA;AAAA,AAAA,OAAA9E,uBAAA8E;;AAEA,AAAM,AAAUmoB,mCACd,WAAK5b,MAAMrlB;AAAX,AACE,YAAAihC,wEAAA,KAAA,KAAA,xDAAkB,AAACM,kBAAQlc,MAAM,AAACyb,eAAK9gC;;AAE3C,AAAM,AAAeihC,wCACnB,WAAK5b,MAAMgd;AAAX,AACE,IAAMR,QAAM;AAAZ,AACE,IAAAS,iBAAA,AAAAjvB,cAAagvB;IAAbE,mBAAA;IAAAC,mBAAA;IAAAC,eAAA;;AAAA,AAAA,GAAA,AAAA,CAAAA,eAAAD;AAAA,gBAAA,AAAAD,sDAAAE,lEAAQziC;AAAR,AAAA,AACE,AAAO6hC,WAAM,AAACf,eAAK9gC;;AADrB,cAAAsiC;cAAAC;cAAAC;cAAA,CAAAC,eAAA;;;;;;;AAAA,IAAAlQ,0BAAA,AAAAlf,cAAAivB;AAAA,AAAA,GAAA\/P;AAAA,AAAA,IAAA+P,qBAAA\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\/hC,EAAEG;IAAI4hC;;;;EAAAA;;mCAAN\/hC,EAAEG,EAAI4hC;;;IAAN\/hC;;IAAEG;IAAI4hC;yBAAN\/hC,EAAEG,EAAI4hC;;;;;;mBAAN\/hC,EAAEG;IAAI4hC;;;;;4BAAN\/hC;;4BAAAA,EAAEG;;;;;;;;uDAAFH,EAAEG;;;;;;;;;;;;;AAER;;;uBAAA,vBAAMysC,sDAEH5sC;AAFH,AAEM;kCAAOJ;AAAP,AAAaI;;;IAANJ;;;;EAAAA;;mCAAAA;;;IAAAA;yBAAAA;;;;;;;AAEb,AAAA;;;;;;iBAAA,yBAAAiD,1CAAMkqC;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA9pC,0BAAA,AAAA;AAAA,AAAA,IAAAC,wBAAA;;AAAA,AAAA,GAAA,CAAAA,wBAAAD;AAAA,AAAA,AAAA8pC,cAAA,CAAA,UAAA7pC;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA8pC,WAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAA5pC,uBAAA,KAAAC,qBAAA,AAAAypC,eAAA,KAAA,IAAA;AAAA,AAAA,OAAAE,oDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA5pC;;;;;AAAA,AAAA,+CAAA,\/CAAM4pC;AAAN,AAKMjf;;;AALN,AAAA,+CAAA,\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\/BAAKC,oCAAAA,\/BAAKC,oCAAAA,\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\/B;AACRw\/B;;AACA,QAACgG,mCAAAA,6CAAAA,ZAAGhG,yBAAAA,lBAAOx\/B,yBAAAA;;;oBAJhBw\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\/B;;;AAC\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\/B,mBAAAC,qBAAAC,\/FAASy\/B;AAAT,AAAA,OAAA1kC,iBAAAgF,qBAAA;;;AAAA,0BAAA,1BAAS2\/B,4DAAoB3C;AAA7B,AAAA,YAAA0C,mBAA6B1C;;;AAApB0C,AAQT;;;2BAAA,3BAAM5D,8DAEHhrC;AAFH,AAGE,YAAA4uC,mBAAW5uC;;AAEb;;;4BAAA,5BAAe+uC,gEAEZ10C;AAFH,AAEM,qBAAWu0C,bAASv0C;;AAE1B;;;;yBAAA,zBAAM20C,0DAGHC,IAAI\/jC;AAHP,AAGgB,OAAC2D,wBAASogC,IAAI\/jC;;AAE9B,AAAA;;;;;;yBAAA,iCAAAhO,1DAAMkyC;AAAN,AAAA,IAAAF,YAAA;AAAA,AAAA,IAAA9xC,0BAAA,AAAA;AAAA,AAAA,IAAAC,wBAAA;;AAAA,AAAA,GAAA,CAAAA,wBAAAD;AAAA,AAAA,AAAA8xC,eAAA,CAAA,UAAA7xC;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA8xC,WAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,qDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,qDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAn2C,MAAA,6CAAA,+DAAA,AAAAi2C;;;;;AAAA,AAAA,uDAAA,vDAAME,kEAKFh2C;AALJ,AAMG,kBAAK2xC;AAAL,AACE,IAAMsE,KAAG,yBAAA,zBAACrE;AAAV,AACE;;;;AAAA,AACM,QAACD,mCAAAA,qCAAAA;;6BACHhG;AAFJ,AAEY,QAACgG,mCAAAA,2CAAAA,VAAGhG,uBAAAA;;6BACZA,OAAOC;AAHX,AAIK,IAAM3mC,IAAE,AAAAwQ,2BAAA,CAAA,AAAAhI,uBAAA,3BAAQwoC,qBAAAA;IACV9pC,IAAE,CAACnM,kCAAAA,2CAAAA,XAAEiF,uBAAAA,rBAAE2mC,uBAAAA;AADb,AAEE,GAAI,MAAA,LAAMz\/B;AACRw\/B;;AACA,QAACgG,mCAAAA,6CAAAA,ZAAGhG,yBAAAA,lBAAOx\/B,yBAAAA;;;oBALhBw\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\/8C;AAJJ,AAIO,YAAA2\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\/C,MAAA,6CAAA,+DAAA,AAAAk\/C;;;;;AAAA,AAAA,iDAAA,jDAAME,4DAIF7R;AAJJ,AAIU,OAAC8R,+CAAO,AAACtR,qBAAWR;;;AAJ9B,AAAA,iDAAA,jDAAM6R,4DAKF7R,KAAKjjC;AALT,AAMK,OAAC20C,+CAAO,AAAClR,qBAAWR,MAAMjjC;;;AAN\/B,AAAA,2CAAA,3CAAM80C;;AAAN,AAQA;;;;;;;;qBAAA,rBAAME,kDAOFC,cAAQC,SAASC;AAPrB,AAQG,IAAMC,OAAK,oCAAUC;AAAV,AACE,YAAA7f,kBAAA,KAAA;AAAA,AACC,OAAC9c,eAAK28B,KACL,qJAAA,8NAAA,jWAAM,CAACJ,8CAAAA,oDAAAA,RAAQI,gCAAAA,QACb,AAACC,sDAAOF,+CAAK,CAACF,yCAAAA,+CAAAA,RAASG,2BAAAA;GAH3B,KAAA;;AADb,AAKE,OAACD,KAAKD;;AAEX;;;;;oBAAA,pBAAMI,gDAIHz+C;AAJH,AAKE,sDAAA,WAAA0+C,1DAACb;AAAD,AAAS,SAAK,4BAAAa,5BAACp3B;GACP,AAAC9K,eAAK,AAAC0hC,mBAAS52B,4BAAY\/K,cAAIvc;;AAE1C,AAAA;;;;iBAAA,yBAAA6C,1CAAMg8C;AAAN,AAAA,IAAAF,YAAA;AAAA,AAAA,IAAA57C,0BAAA,AAAA;AAAA,AAAA,IAAAC,wBAAA;;AAAA,AAAA,GAAA,CAAAA,wBAAAD;AAAA,AAAA,AAAA47C,eAAA,CAAA,UAAA37C;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA47C,WAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAjgD,MAAA,6CAAA,+DAAA,AAAA+\/C;;;;;AAAA,AAAA,+CAAA,\/CAAME;AAAN,AAAA;;;AAAA,AAAA,+CAAA,\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\/1C,EAAE3C,KAAK8hD;;;AANxE,GAOG,CAAIn\/C,MAAE+W;AAAK,OAAOnW,kDAAKvD;;AAP1B,AAQS,MAAO,KAAA\/G,MAAW,6CAAA,qGAAA,2HAAA,1KAAc0J,kHAAwB+W;;;;;;AAnIrE,AAAA,AAAA,4DAAAhhB,5DAASipD;;AAAT,AAAA,AAAA,6EAAA,7EAASA,wFA2LK3\/C;;AA3Ld,AAAA,gBAAA,ZA2LcA;AA3Ld,AA4LI,2CAAA,pCAACy\/C,0BAAgBz\/C,cAAO0X;;;AA5L5B,AAAA,AAAA,qEAAA,rEAASioC,gFAsBCp+C;;AAtBV,AAAA,eAAA,XAsBUA;AAtBV,AAsBgBkE;;;AAtBhB,AAAA,AAAA,2EAAA,3EAASk6C,sFAgBE3oD;;AAhBX,AAAA,YAAA,RAgBWA;AAhBX,AAgBc,YAAA2oD,2BAAmBl6C,YAAKiS,WAAImoC,aAAMnJ,YAAKoJ,YAAKvrB;;;AAhB1D,AAAA,AAAA,yEAAA,zEAASorB,oFA6FEp+C;;AA7FX,AAAA,eAAA,XA6FWA;AA7FX,AA6FiBmW;;;AA7FjB,AAAA,AAAA,wEAAA,xEAASioC,mFA8GAp+C;;AA9GT,AAAA,eAAA,XA8GSA;AA9GT,AA+GI,qDAAA,9CAAMA;;;AA\/GV,AAAA,AAAA,wEAAA,xEAASo+C,mFAgHAp+C;;AAhHT,AAAA,eAAA,XAgHSA;AAhHT,AAiHI,qDAAA,9CAAMA;;;AAjHV,AAAA,AAAA,sEAAA,tEAASo+C,iFAyBCp+C;;AAzBV,AAAA,eAAA,XAyBUA;AAzBV,AA0BI,GAAM,cAAA,bAAGmW;AAAT,AACE,OAAMnW,8CAAK,cAAA,bAAKmW;;AADlB;;;;AA1BJ,AAAA,AAAA,qEAAA,rEAASioC,gFA4BAp+C;;AA5BT,AAAA,eAAA,XA4BSA;AA5BT,AA6BI,GACC,gBAAA,fAAOmW;AAAK,MAAO,KAAAzgB,MAAA;;AADpB,GAEC,CAAA,QAAMygB;AAAK,OAAClS,qBAAW,AAASm6C,iCAAkBl6C;;AAFnD,GAGC,CAAA,MAAK,CAAGiS,aAAI,AAAC6lC,mBAASh8C;AACrB,YAAAo+C,+GAAA,pFAAmBl6C,YAAK,cAAA,bAAKiS,kBAAKmoC,aAAMnJ,YAAK,kBAAA,IAAA,tBAAQoJ;;AAJvD,AAKQ,IAAMC,WAAS,AAACtB,8BAAoBl9C,SAAK,cAAA,bAAGmW;IACtCsoC,KAAG,AAACf,mBAAS19C,SAAKs+C,aAAMnJ;IACxBuJ,WAAS,EAAI,OAAA,NAAMD,aAAI,AAAcL,sCAAkBK;IACvDE,QAAM,cAAA,bAAKxoC;AAHjB,AAIE,GAAI,CAAK,CAAA,MAAKmoC,mBAAO,oCAAA,nCAAM,2BAAA,3BAACzC,kBAAQ6C;AAClC,YAAAN,2GAAA,hFAAmBl6C,YAAKy6C,MAAM,gBAAA,fAAGL,oBAAS,2BAAA,3BAACzC,kBAAQ6C,cAAYF;;AAC\/D,YAAAJ,4EAAA,jDAAmBl6C,YAAKy6C,MAAML,aAAMI,SAASF;;;;;;;;AAxC7D,AAAA,AAAA,2EAAA,3EAASJ,sFAsLCp+C;;AAtLV,AAAA,eAAA,XAsLUA;AAtLV,AAuLI,GAAI,cAAA,bAAMmW;AACR,YAAA0C,2CAAA,5BAAO7Y,SAAK,cAAA,bAAKmW;;AADnB;;;;AAvLJ,AAAA,AAAA,qEAAA,rEAASioC,gFAmFCp+C;;AAnFV,AAAA,eAAA,XAmFUA;AAnFV,AAmFgB,IAAAwP,kBAAqCwjB;AAArC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,4BAAcxP,5BAAKyU;AAAnB,AAAA,gBAAAjF,hBAAqCwjB;;AAArCxjB;;;;AAnFhB,AAAA,AAAA,uEAAA,vEAAS4uC,kFAkEEp+C,KAAKgF;;AAlEhB,AAAA,eAAA,XAkEWhF;AAlEX,AAmEI,GAAI,kBAAWo+C,jBAAiBp5C;AAC9B,GAAI,CAAImR,eAAI,AAACwB,gBAAM3S;AACjB,IAAM+5C,UAAS,AAAW\/+C;IACpBg\/C,WAAS,AAACvzC,oBAAUzG;AAD1B,AAEE;AAAA,AACE,GAAI,AAAmB+5C;AACrB,IAAMjoD,IAAE,AAAOioD;IACT9nD,IAAE,AAAO+nD;AADf,AAEE,GAAI,AAACnrC,6CAAE\/c,EAAEG;AACP;;AADF;;;AAHJ;;;;;AAJN;;;AAYA,OAACwhB,2BAAiBzY,SAAKgF;;;;AAhF7B,AAAA,AAAA,2FAAA,3FAASo5C,sGAkLSp+C;;AAlLlB,AAAA,eAAA,XAkLkBA;AAlLlB,AAmLI,YAAA4\/C,0BAAkBzpC,WAAImoC,aAAM,CAACuB,2DAAAA,wEAAAA,fAAiB1K,oDAAAA,cAAM,CAAC2K,2DAAAA,wEAAAA,fAAiBvB,oDAAAA;;;AAnL1E,AAAA,AAAA,qFAAA,rFAASH,gGA8DEp+C;;AA9DX,AAAA,eAAA,XA8DWA;AA9DX,AA8DiB,OAAC2Z,oBAAU,AAASykC,iCAAkBl6C;;;AA9DvD,AAAA,AAAA,yEAAA,zEAASk6C,oFAsIGp8C,EAAEnM;;AAtId,AAAA,YAAA,RAsIYmM;AAtIZ,AAuII,OAACs9C,kDAAUt9C,MAAEnM;;;AAvIjB,AAAA,AAAA,yEAAA,zEAASuoD,oFAwIGp8C,EAAEnM,EAAE+O;;AAxIhB,AAAA,YAAA,RAwIY5C;AAxIZ,AAyII,QAAA,JAAOlH;IAAI8J,WAAKA;;AAAhB,AACE,GAAI,CAAG9J,IAAEqb;AACP,IAAMlb,MAAK,AAACiiD,8BAAoBl7C,MAAElH;IAC5BI,MAAK,AAASD;IACd2J,WAAK,qBAAA,JAAO5F;IAAI4F,WAAKA;;AAAhB,AACE,GAAI,CAAG5F,IAAE9D;AACP,IAAM0J,WAAK,iBAAA26C,WAAG36C;IAAH46C,WAAQ,CAAMvkD,IAAI+D;AAAlB,AAAA,0EAAAugD,SAAAC,wBAAAD,SAAAC,5GAAC3pD,kCAAAA,qDAAAA;;AAAZ,AACE,GAAI,AAAC8f,yBAAS\/Q;AACZA;;AACA,eAAO,KAAA,JAAK5F;eAAG4F;;;;;;AACnBA;;;;;AARf,AASE,GAAI,AAAC+Q,yBAAS\/Q;AAAd,QAAAkR,gDAAAA,0DAAAA,ZACGlR,sCAAAA;;AACD,eAAO,CAAG9J,IAAEI;eAAK0J;;;;;;AACrBA;;;;;;AAvJR,AAAA,AAAA,6EAAA,7EAASw5C,wFAoHEp+C,KAAKf,EAAE+C;;AApHlB,AAAA,eAAA,XAoHWhC;AApHX,AAqHI,GAAI,OAASf;AACX,OAAUe,iDAAKf,EAAE+C;;AACjB,MAAO,KAAAtM,MAAA;;;;AAvHb,AAAA,AAAA,uEAAA,vEAAS0oD,kFAsFAp+C;;AAtFT,AAAA,eAAA,XAsFSA;AAtFT,AAuFI,GACE,gBAAA,fAAOmW;AADT;;AAAA,GAEE,eAAA,dAAIA;AAAQ,YAAAjc,iCAAA,IAAA,hBAAaqkD;;AAF3B,AAGQ,IAAAU,WAAaj\/C;IAAbk\/C,WAAkB,AAACjC,kCAAwBj9C;IAA3Cm\/C,WAAA;IAAAC,WAAA;AAAA,AAAA,kHAAAH,SAAAC,SAAAC,SAAAC,4CAAAH,SAAAC,SAAAC,SAAAC,5MAACC,sDAAAA,2FAAAA;;;;;;AA1Fb,AAAA,AAAA,8EAAA,9EAASjB,yFAmBMp+C,KAAKkE;;AAnBpB,AAAA,eAAA,XAmBelE;AAnBf,AAmB0B,YAAAo+C,2BAAmBl6C,SAAKiS,WAAImoC,aAAMnJ,YAAKoJ,YAAKvrB;;;AAnBtE,AAAA,AAAA,2EAAA,3EAASorB,sFA2CCp+C,KAAKX;;AA3Cf,AAAA,eAAA,XA2CUW;AA3CV,AA4CI,GAAI,+CAAA,9CAAG,CAAGmW,aAAI,AAAC6lC,mBAASh8C;AACtB,IAAM9E,MAAI,AAASqjD;IACbC,WAAS,KAAAnnD,MAAY,OAAA,NAAK6D;AADhC,AAEE,IAAAL,wBAAYK;AAAZ,AAAA,cAAA,VAAUJ;;AAAV,AAAA,GAAA,WAAAD,VAAUC;AAAV,AACE,CAAM0jD,SAAS1jD,WAAE,CAAMyjD,YAAKzjD;;AAD9B,eAAA,WAAA,VAAUA;;;;AAAV;;;;AAEA,CAAM0jD,SAAStjD,OAAImE;;AACnB,YAAA++C,4FAAA,jEAAmBl6C,YAAK,cAAA,bAAKiS,kBAAKmoC,aAAMnJ,YAAKqJ;;AAC\/C,IAAMI,uBAAe,CAAG,gBAAA,fAA2BzoC,sBAAO,CAAA,OAAkBmoC;IACtEO,YAAU,EAAID,sBAAe,gBAAA,fAAGN,oBAASA;IACzCI,WAAS,EAAIE,sBACF,iBAAME,MAAI,wBAAA,xBAAClD;AAAX,AACI,sBAAA,tBAACE,kBAAQgD,QAAM3J;;AACf,sBAAA,tBAAC2G,kBAAQgD,QAAM,mBAAA,nBAAC5C,wBAAaoC,aAAM,KAAA7C,qBAAA,KAAiB8C;;AACpDO;KACJ,AAACxC,oBAAUt8C,SAAKs+C,aAAMnJ,YAAK,KAAAsG,qBAAA,KAAiB8C;AAP7D,AAQE,YAAAH,iFAAA,tDAAmBl6C,YAAK,cAAA,bAAKiS,kBAAK0oC,UAAUH,SAAS,CAAOr\/C;;;;AA3DpE,AAAA,AAAA,4CAAA,5CAAS++C;;6BAATtvC,OA4KiB7P;;AA5KjB,AAAA,IAAA6P,aAAA;AAAA,AAAA,WAAAA,PA4KY9O;AA5KZ,AA6KI,OAAMA,0CAAKf;;6BA7Kf6P,OA8KiB7P,EAAE2B;;AA9KnB,AAAA,IAAAkO,aAAA;AAAA,AAAA,WAAAA,PA8KY9O;AA9KZ,AA+KI,OAAMA,0CAAKf,EAAE2B;;oBA\/KjBkO,OA8KiB7P,EAAE2B;;;6BA9KnBkO,OA8KiB7P;;6BA9KjB6P,OA8KiB7P,EAAE2B;;;;;;;;;;AA9KnB,AAAA,AAAA,6CAAA,WAAAkO,OAAAqvC,\/DAASC;;AAAT,AAAA,IAAAtvC,aAAA;AAAA,AAAA,OAAA,AAAAA,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAA9T,iBAAAmjD;;;AAAA,AAAA,AAAA,qEAAA,rEAASC,gFA4KQn\/C;;AA5KjB,AAAA,WAAA,PA4KYe;AA5KZ,AA6KI,OAAMA,0CAAKf;;;AA7Kf,AAAA,AAAA,qEAAA,rEAASm\/C,gFA8KQn\/C,EAAE2B;;AA9KnB,AAAA,WAAA,PA8KYZ;AA9KZ,AA+KI,OAAMA,0CAAKf,EAAE2B;;;AA\/KjB,AAAA,sCAAA,tCAASw9C;AAAT,AAAA,0FAAA,0DAAA,uDAAA,4DAAA,yDAAA,wDAAA,oBAAA,8DAAA,2CAAA,0DAAA;;;AAAA,AAAA,4CAAA,5CAASA;;AAAT,AAAA,+CAAA,\/CAASA;;AAAT,AAAA,oDAAA,WAAA1yC,mBAAAC,qBAAAC,vGAASwyC;AAAT,AAAA,OAAAz3C,iBAAAgF,qBAAA;;;AAAA,kCAAA,lCAAS0yC,4EAAkBn6C,KAAKiS,IAAImoC,MAAMnJ,KAAKoJ,KAAevrB;AAA9D,AAAA,YAAAorB,2BAA2Bl6C,KAAKiS,IAAImoC,MAAMnJ,KAAKoJ,KAAevrB;;;AAArDorB,AA8LT,AAAM,AAAcA,wCAAkB,KAAA3C,qBAAA,KAAiB,CAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA;AAEvD,AAAM,AAAS2C,mCACb,KAAAA,2BAAA,KAAA,IAAA,IAA2B,AAAcA,sCAAkB,GAAQzpC;AAErE,AAAM,AAAaypC,uCACjB,WAAKjzC,GAAY40C;AAAjB,AACE,IAAM7gD,IAAE,AAASiM;IACXA,SAAG,EAAI40C,UAAS50C,GAAG,AAACnQ,iBAAOmQ;AADjC,AAEE,GAAI,KAAA,JAAGjM;AACL,YAAAk\/C,2BAAA,OAAA,iDAAA,nDAAuBl\/C,MAAI,AAAck\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\/CrB,AAAA,AAAA,+DAAA,\/DAASmgD,0EAyECngD;;AAzEV,AAAA,eAAA,XAyEUA;AAzEV,AAyEgB,IAAAwP,kBAAqCwjB;AAArC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,4BAAcxP,5BAAKyU;AAAnB,AAAA,gBAAAjF,hBAAqCwjB;;AAArCxjB;;;;AAzEhB,AAAA,AAAA,iEAAA,jEAAS2wC,4EA0BEngD,KAAKgF;;AA1BhB,AAAA,eAAA,XA0BWhF;AA1BX,AA0BuB,OAACyY,2BAAiBzY,SAAKgF;;;AA1B9C,AAAA,AAAA,+EAAA,\/EAASm7C,0FAsDEngD;;AAtDX,AAAA,eAAA,XAsDWA;AAtDX,AAuDI,OAAC2Z,oBAAU,AAASykC,iCAAkBl6C;;;AAvD1C,AAAA,AAAA,mEAAA,nEAASi8C,8EA4EGngD,KAAKnK;;AA5EjB,AAAA,eAAA,XA4EYmK;AA5EZ,AA6EI,OAACs\/C,kDAAU,iBAAAiC,WAAQlB;IAARmB,WAAY,CAAG1mD,WAAEq7B;IAAjBsrB,WAAsB,AAAC9pC,gBAAM0oC;AAA7B,AAAA,wGAAAkB,SAAAC,SAAAC,uCAAAF,SAAAC,SAAAC,3KAACC,iDAAAA,6EAAAA;KAAkC7rD;;;AA7ElD,AAAA,AAAA,mEAAA,nEAASsqD,8EA+EGngD,KAAKnK,EAAE2O;;AA\/EnB,AAAA,eAAA,XA+EYxE;AA\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\/MAAc0J,iHAAuB,AAAQY;;AAC\/D,IAAAijD,WAAc\/+C;IAAdg\/C,WAAmB,AAAC5mC,8CAAMta,SAAEghD,MAAMvmD;IAAlC0mD,WAAuC3+C;IAAvC4+C,WAA6C,iBAAAxrC,kBAAK4Z;IAAL3Z,kBAAS,SAAA,RAAKmrC;AAAd,AAAA,SAAAprC,kBAAAC,mBAAAD,kBAAAC;;IAA7CwrC,WAAA;AAAA,AAAA,oHAAAJ,SAAAC,SAAAC,SAAAC,SAAAC,6CAAAJ,SAAAC,SAAAC,SAAAC,SAAAC,jOAACjB,uDAAAA,qGAAAA;;;;AA1FT,AAAA,AAAA,kDAAAjtD,lDAAS+sD;;AAAT,AAAA,AAAA,mEAAA,nEAASA,8EAmHKliD;;AAnHd,AAAA,eAAA,XAmHcA;AAnHd,AAoHI,OAACk+C,0BAAgBl8C,SAAEwC,aAAMgtB;;;AApH7B,AAAA,AAAA,2DAAA,3DAAS0wB,sEAsBCliD;;AAtBV,AAAA,eAAA,XAsBUA;AAtBV,AAsBgBkE;;;AAtBhB,AAAA,AAAA,iEAAA,jEAASg+C,4EAgBEzsD;;AAhBX,AAAA,YAAA,RAgBWA;AAhBX,AAgBc,YAAAysD,iBAASh+C,YAAKlC,SAAEwC,aAAMgtB,WAAIwB;;;AAhBxC,AAAA,AAAA,+DAAA,\/DAASkvB,0EA6DEliD;;AA7DX,AAAA,eAAA,XA6DWA;AA7DX,AA6DiB,QAAGwxB,aAAIhtB;;;AA7DxB,AAAA,AAAA,4DAAA,5DAAS09C,uEAyBCliD;;AAzBV,AAAA,eAAA,XAyBUA;AAzBV,AA0BI,OAACoW,6CAAKpU,SAAE,cAAA,bAAKwvB;;;AA1BjB,AAAA,AAAA,2DAAA,3DAAS0wB,sEA2BAliD;;AA3BT,AAAA,eAAA,XA2BSA;AA3BT,AA4BI,GAAI,CAAIwE,iBAAMgtB;AACZ,MAAO,KAAA97B,MAAA;;AACP,IAAA2sD,WAAcn+C;IAAdo+C,WAAmBtgD;IAAnBugD,WAAqB\/9C;IAArBg+C,WAA2B,cAAA,bAAKhxB;IAAhCixB,WAAA;AAAA,AAAA,oHAAAJ,SAAAC,SAAAC,SAAAC,SAAAC,6CAAAJ,SAAAC,SAAAC,SAAAC,SAAAC,jOAACL,uDAAAA,qGAAAA;;;;AA9BP,AAAA,AAAA,iEAAA,jEAASF,4EAwDCliD;;AAxDV,AAAA,eAAA,XAwDUA;AAxDV,AAyDI,GAAA,EAAQ,CAAIwE,iBAAMgtB;AAChB,YAAA3Y,4DAAA,7CAAO7Y,SAAK,+BAAA,9BAAK,CAAGwxB,aAAIhtB;;AAD1B;;;;AAzDJ,AAAA,AAAA,2DAAA,3DAAS09C,sEA4CCliD;;AA5CV,AAAA,eAAA,XA4CUA;AA5CV,AA4CgB,IAAAwP,kBAAqCwjB;AAArC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,4BAAcxP,5BAAKyU;AAAnB,AAAA,gBAAAjF,hBAAqCwjB;;AAArCxjB;;;;AA5ChB,AAAA,AAAA,6DAAA,7DAAS0yC,wEAyCEliD,KAAKgF;;AAzChB,AAAA,eAAA,XAyCWhF;AAzCX,AAyCuB,OAACyY,2BAAiBzY,SAAKgF;;;AAzC9C,AAAA,AAAA,2EAAA,3EAASk9C,sFAqCEliD;;AArCX,AAAA,eAAA,XAqCWA;AArCX,AAqCiB,OAAC2Z,oBAAU,AAASykC,iCAAkBl6C;;;AArCvD,AAAA,AAAA,+DAAA,\/DAASg+C,0EA6FGliD,KAAKnK;;AA7FjB,AAAA,eAAA,XA6FYmK;AA7FZ,AA8FI,OAACs\/C,kDAAUt\/C,SAAKnK;;;AA9FpB,AAAA,AAAA,+DAAA,\/DAASqsD,0EA+FGliD,KAAKnK,EAAE2O;;AA\/FnB,AAAA,eAAA,XA+FYxE;AA\/FZ,AAgGI,OAAC2hD,kDAAU3hD,SAAKnK,EAAE2O;;;AAhGtB,AAAA,AAAA,mEAAA,nEAAS09C,8EAgFEliD,KAAK6H,IAAIpL;;AAhFpB,AAAA,eAAA,XAgFWuD;AAhFX,AAiFI,GAAI,OAAS6H;AACX,OAAU7H,iDAAK6H,IAAIpL;;AACnB,MAAO,KAAA\/G,MAAA;;;;AAnFb,AAAA,AAAA,6DAAA,7DAASwsD,wEA+CAliD;;AA\/CT,AAAA,eAAA,XA+CSA;AA\/CT,AAgDI,IAAM+iD,aAAW;sCAAgBjoD;AAAhB,AACE,GAAU,CAAIA,MAAE02B;AAAhB;;AAAA,AACE,OAAC9Y,eAAK,AAACtC,6CAAKpU,SAAElH,GACR,KAAA06B,kBAAA,KAAA;;AAAA,AACC,OAACutB,qBAAW,KAAA,JAAKjoD;;CADlB,KAAA;;;;AAH3B,AAKE,OAACioD,WAAWv+C;;;AArDlB,AAAA,AAAA,oEAAA,pEAAS09C,+EAmBMliD,KAAKkE;;AAnBpB,AAAA,eAAA,XAmBelE;AAnBf,AAmB0B,QAACoiD,uDAAAA,gHAAAA,3DAAal+C,4FAAAA,nFAAKlC,4FAAAA,nFAAEwC,4FAAAA,\/EAAMgtB,4FAAAA,jFAAIwB,4FAAAA;;;AAnBzD,AAAA,AAAA,iEAAA,jEAASkvB,4EAiCCliD,KAAKX;;AAjCf,AAAA,eAAA,XAiCUW;AAjCV,AAkCI,IAAA0iD,WAAcx+C;IAAdy+C,WAAmB,AAACx\/C,mBAASnB,SAAEwvB,WAAInyB;IAAnCujD,WAAsCp+C;IAAtCq+C,WAA4C,cAAA,bAAKrxB;IAAjDsxB,WAAA;AAAA,AAAA,oHAAAJ,SAAAC,SAAAC,SAAAC,SAAAC,6CAAAJ,SAAAC,SAAAC,SAAAC,SAAAC,jOAACV,uDAAAA,qGAAAA;;;AAlCL,AAAA,AAAA,kCAAA,lCAASF;;6BAATpzC,OA6GiB7P;;AA7GjB,AAAA,IAAA6P,aAAA;AAAA,AAAA,WAAAA,PA6GY9O;AA7GZ,AA8GI,OAAMA,0CAAKf;;6BA9Gf6P,OA+GiB7P,EAAE2B;;AA\/GnB,AAAA,IAAAkO,aAAA;AAAA,AAAA,WAAAA,PA+GY9O;AA\/GZ,AAgHI,OAAMA,0CAAKf,EAAE2B;;oBAhHjBkO,OA+GiB7P,EAAE2B;;;6BA\/GnBkO,OA+GiB7P;;6BA\/GjB6P,OA+GiB7P,EAAE2B;;;;;;;;;;AA\/GnB,AAAA,AAAA,mCAAA,WAAAkO,OAAAmzC,rDAASC;;AAAT,AAAA,IAAApzC,aAAA;AAAA,AAAA,OAAA,AAAAA,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAA9T,iBAAAinD;;;AAAA,AAAA,AAAA,2DAAA,3DAASC,sEA6GQjjD;;AA7GjB,AAAA,WAAA,PA6GYe;AA7GZ,AA8GI,OAAMA,0CAAKf;;;AA9Gf,AAAA,AAAA,2DAAA,3DAASijD,sEA+GQjjD,EAAE2B;;AA\/GnB,AAAA,WAAA,PA+GYZ;AA\/GZ,AAgHI,OAAMA,0CAAKf,EAAE2B;;;AAhHjB,AAAA,4BAAA,5BAASshD;AAAT,AAAA,0FAAA,0DAAA,mDAAA,2DAAA,uDAAA,oBAAA,8DAAA,2CAAA,0DAAA;;;AAAA,AAAA,kCAAA,lCAASA;;AAAT,AAAA,qCAAA,rCAASA;;AAAT,AAAA,0CAAA,WAAAx2C,mBAAAC,qBAAAC,7FAASs2C;AAAT,AAAA,OAAAv7C,iBAAAgF,qBAAA;;;AAAA,wBAAA,xBAASw2C,wDAAQj+C,KAAKlC,EAAEwC,MAAMgtB,IAAcwB;AAA5C,AAAA,YAAAkvB,iBAAiBh+C,KAAKlC,EAAEwC,MAAMgtB,IAAcwB;;;AAAnCkvB,AAsHT,CAAA,2BAAAhpD,yBAAA,pDAAcgpD;AAAd,AAAA,IAAAppC,qBAAA;AAAA,AAAA,OAAA9E,uBAAA8E;;AAEA,yBAAA,zBAAOspC,0DAAcl+C,KAAKlC,EAAEwC,MAAMgtB,IAAIwB;;AAAtC,AACE,GAAI,cAAWkvB,bAAOlgD;AACpB,eAAOkC;eAAK,AAAKlC;eAAG,CAAG,AAASA,UAAGwC;eAAO,CAAG,AAASxC,UAAGwvB;eAAKwB;;;;;;;;AAC9D,IAAMr0B,IAAE,AAACgZ,gBAAM3V;AAAf,AACE,GAAM,CAAI,SAAA,RAAMwC,kBACN,OAAA,NAAMgtB,gBACN,CAAGhtB,QAAM7F,QACT,CAAG6yB,MAAI7yB;AAHjB,AAIE,MAAO,KAAAjJ,MAAA;;AAJT;;AAKA,YAAAwsD,iBAASh+C,KAAKlC,EAAEwC,MAAMgtB,IAAIwB;;;;;AAEhC,AAAA;;;;;;;mBAAA,2BAAAr5B,9CAAM+nD;AAAN,AAAA,IAAA+B,YAAA;AAAA,AAAA,IAAA5pD,0BAAA,AAAA;AAAA,AAAA,IAAAC,wBAAA;;AAAA,AAAA,GAAA,CAAAA,wBAAAD;AAAA,AAAA,AAAA4pD,eAAA,CAAA,UAAA3pD;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA4pD,WAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAhC,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAhsD,MAAA,6CAAA,+DAAA,AAAA+tD;;;;;AAAA,AAAA,iDAAA,jDAAM\/B,4DAMF1\/C,EAAEwC;AANN,AAOK,OAACm\/C,+CAAO3hD,EAAEwC,MAAM,AAACmT,gBAAM3V;;;AAP5B,AAAA,iDAAA,jDAAM0\/C,4DAQF1\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\/CAAG,CAAGh\/B,aAAI,AAAC6lC,mBAAS1zC;AACtB,AAAI,CAAMi2C,YAAK,cAAA,bAASpoC,sBAAW9W;;AAC\/B,AAAM8W,aAAI,cAAA,bAAKA;;AACf7N;;AACJ,IAAM07C,YAAU,KAAAvI,qBAAa,AAAQtG,iBAAMoJ;IACrCC,WAAU,CAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA;AADhB,AAEE,UAAA,TAAMA,gBAAWn\/C;;AACjB,AAAMk\/C,cAAKC;;AACX,GAAI,CAAG,gBAAA,fAA2BroC,sBAC3B,CAAA,OAAkBmoC;AACvB,IAAMsG,iBAAe,CAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA;IACf\/F,YAAe,gBAAA,fAAGP;AADxB,AAEE,gBAAA,fAAMsG,sBAAiBzP;;AACvB,gBAAA,fAAMyP,sBAAiB,AAAC1I,mBAAS,AAAQ\/G,iBAAMmJ,aAAM0F;;AACrD,AAAM7O,cAAM,KAAAsG,qBAAa,AAAQtG,iBAAMyP;;AACvC,AAAMtG,eAAMO;;AACZ,AAAM1oC,aAAM,cAAA,bAAKA;;AACjB7N;;AACF,IAAMo2C,WAAS,AAACoF,uBAAax7C,UAAMg2C,aAAMnJ,YAAK6O;AAA9C,AACE,AAAM7O,cAAKuJ;;AACX,AAAMvoC,aAAK,cAAA,bAAKA;;AAChB7N;;;;AACR,MAAO,KAAA5S,MAAA;;;;AA7Bb,AAAA,AAAA,+FAAA,\/FAASkqD,0GA+BQt3C;;AA\/BjB,AAAA,gBAAA,ZA+BiBA;AA\/BjB,AAgCI,GAAI,AAAiB6sC;AACnB,AAAI,mBAAA,nBAAM,AAAQA;;AACd,IAAMj6C,MAAI,CAAGib,aAAI,AAAC6lC,mBAAS1zC;IACrBu8C,eAAa,KAAAxtD,MAAY6D;AAD\/B,AAEE,iCAAA,iBAAA,lDAACqkB,qBAAWg\/B,gBAAOsG,iBAAe3pD;;AAClC,YAAAkjD,2BAAA,sDAAA,jDAAuBjoC,WAAImoC,aAAMnJ,YAAK0P;;AAC5C,MAAO,KAAAnvD,MAAA;;;;AAtCb,AAAA,AAAA,2FAAA,3FAASkqD,sGAyCGt3C,MAAMT,IAAIpL;;AAzCtB,AAAA,gBAAA,ZAyCY6L;AAzCZ,AA0CI,GAAI,OAAST;AACX,OAAWS,iEAAMT,IAAIpL;;AACrB,MAAO,KAAA\/G,MAAA;;;;AA5Cb,AAAA,AAAA,wFAAA,xFAASkqD,mGA+CKt3C,MAAMlJ,EAAE3C;;AA\/CtB,AAAA,gBAAA,ZA+Cc6L;AA\/Cd,AAgDI,GAAI,AAAiB6sC;AACnB,GACE,CAAK,CAAA,OAAM\/1C,QAAG,CAAGA,IAAE+W;AACnB,GAAI,CAAI,AAAC6lC,mBAAS1zC,cAAOlJ;AACvB,AAAI,CAAMm\/C,YAAK,KAAA,JAASn\/C,aAAS3C;;AAC7B6L;;AACJ,IAAMo2C,WACA,AAAC;8BAAQvC,MAAM9G;AAAd,AACE,IAAMA,WAAK,AAACuO,6BAAmB,AAAQzO,iBAAME;AAA7C,AACE,GAAI,WAAA,VAAO8G;AACT,AAAI,AAACL,kBAAQzG,SAAK,KAAA,JAASj2C,UAAS3C;;AAChC44C;;AACJ,IAAMoH,SAAO,iBAAA,hBAAS,CAA2Br9C,MAAE+8C;AAAnD,AAEE,AAACL,kBAAQzG,SAAKoH,OACL,AAACqI,aAAG,SAAA,RAAG3I,aAAS,AAACN,kBAAQxG,SAAKoH;;AACvCpH;;;WACRiJ,aAAMnJ;AAXb,AAYE,AAAMA,cAAKuJ;;AACXp2C;;;AAlBN,GAmBE,CAAIlJ,MAAE+W;AAAK,OAAQ7N,kEAAM7L;;AAnB3B,AAqBE,MACC,KAAA\/G,MACC,6CAAA,qGAAA,\/CAAc0J,2IAAiD+W;;;;;AACnE,MAAO,KAAAzgB,MAAA;;;;AAzEb,AAAA,AAAA,oFAAA,pFAASkqD,+FA2ECt3C;;AA3EV,AAAA,gBAAA,ZA2EUA;AA3EV,AA4EI,GAAI,AAAiB6sC;AACnB,GACE,gBAAA,fAAOh\/B;AAAK,MAAO,KAAAzgB,MAAA;;AADrB,GAEE,CAAA,QAAMygB;AAA2B,AAAI,aAAA,bAAMA;;AAAO7N;;AAFpD,GAGE,+BAAA,9BAAM,sBAAA,rBAAS,cAAA,bAAK6N;AAAa,AAAI,AAAMA,aAAI,cAAA,bAAKA;;AAAM7N;;AAH5D,AAKE,IAAMk2C,WAAS,AAACiG,uCAA6Bn8C,UAAM,cAAA,bAAG6N;IAChDuoC,WAAS,iBAAMD,KAAG,AAAC4F,sBAAY\/7C,UAAMg2C,aAAMnJ;AAAlC,AACE,GAAA,EAAQ,OAAA,NAAMsJ;AACZA;;AACA,YAAAhD,qBAAa,AAAQtG,iBAAM,CAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA;;;AAJ9C,AAKE,GAAI,CAAK,CAAA,MAAKmJ,mBAAO,oCAAA,nCAAM,2BAAA,3BAACzC,kBAAQ6C;AAClC,IAAMA,eAAS,AAACkF,6BAAmB,AAAQzO,iBAAM,2BAAA,3BAAC0G,kBAAQ6C;AAA1D,AACE,AAAMvJ,cAAMuJ;;AACZ,AAAMJ,eAAM,gBAAA,fAAGA;;AACf,AAAMnoC,aAAM,cAAA,bAAKA;;AACjB,AAAMooC,cAAMC;;AACZl2C;;AACF,AAAI,AAAM6sC,cAAKuJ;;AACX,AAAMvoC,aAAK,cAAA,bAAKA;;AAChB,AAAMooC,cAAKC;;AACXl2C;;;;;;;AACV,MAAO,KAAA5S,MAAA;;;;AAlGb,AAAA,AAAA,wEAAA,xEAASkqD,mFAqGE5\/C;;AArGX,AAAA,eAAA,XAqGWA;AArGX,AAsGI,GAAI,AAAiBm1C;AACnBh\/B;;AACA,MAAO,KAAAzgB,MAAA;;;;AAxGb,AAAA,AAAA,sEAAA,tEAASkqD,iFA2GA5\/C,KAAKZ;;AA3Gd,AAAA,eAAA,XA2GSY;AA3GT,AA4GI,GAAI,AAAiBm1C;AACnB,QAAM,AAACgI,oBAAUn9C,SAAKZ,GAAG,KAAA,JAASA;;AAClC,MAAO,KAAA1J,MAAA;;;;AA9Gb,AAAA,AAAA,sEAAA,tEAASkqD,iFAgHA5\/C,KAAKZ,EAAEwB;;AAhHhB,AAAA,eAAA,XAgHSZ;AAhHT,AAiHI,GAAI,CAAK,CAAA,OAAMZ,QAAG,CAAGA,IAAE+W;AACrB,OAAMnW,8CAAKZ;;AACXwB;;;;AAnHN,AAAA,AAAA,wEAAA,xEAASg\/C,mFAsHG5\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\/Bf,AAAA,eAAA,XA+BUW;AA\/BV,AA+BkB,OAAC0Y,eAAKrZ,EAAEW;;;AA\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\/C,HAA4D3d;;AAC5D,YAAAkmD,wHAAA,iCAAA,\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\/BT,AAAA,eAAA,XA+BSA;AA\/BT,AAgCI,GAAM,sBAAA,rBAAM,AAASkf;AAArB,AACE,mDAAA,5CAACuwB;kBAADmX;AAAA,AAAM,YAAAxI,2BAAA,KAAA,EAAA,IAAA,AAAAA,sCAAA,CAAAwI,oDAAA,nCAAU,eAAAA,dAAMF;;CACjB,AAAOxnC,iBAAK8mC;;AAFnB;;;;AAhCJ,AAAA,AAAA,oEAAA,pEAASQ,+EAQMxmD,KAAKkE;;AARpB,AAAA,eAAA,XAQelE;AARf,AAQ0B,YAAAwmD,iBAAStiD,SAAKgb,YAAKwnC,cAAOC,oBAAa3zB;;;AARjE,AAAA,AAAA,iEAAA,jEAASwzB,4EAcCxmD,KAAKsG;;AAdf,AAAA,eAAA,XAcUtG;AAdV,AAeI,GAAI,AAACye,wBAAQnY;AACX,OAAQtG,oDAAK,mDAAA,nDAACoW,6CAAK9P,WAAS,mDAAA,nDAAC8P,6CAAK9P;;AAClC,OAACif,+CAAOjlB,gBACAN,SACAsG;;;;AAnBd,AAAA,AAAA,kCAAA,lCAASkgD;;6BAAT13C,OA+FiB7P;;AA\/FjB,AAAA,IAAA6P,aAAA;AAAA,AAAA,WAAAA,PA+FY9O;AA\/FZ,AAgGI,OAASA,4CAAKf;;6BAhGlB6P,OAiGiB7P,EAAE2B;;AAjGnB,AAAA,IAAAkO,aAAA;AAAA,AAAA,WAAAA,PAiGY9O;AAjGZ,AAkGI,OAASA,4CAAKf,EAAE2B;;oBAlGpBkO,OAiGiB7P,EAAE2B;;;6BAjGnBkO,OAiGiB7P;;6BAjGjB6P,OAiGiB7P,EAAE2B;;;;;;;;;;AAjGnB,AAAA,AAAA,mCAAA,WAAAkO,OAAAy3C,rDAASC;;AAAT,AAAA,IAAA13C,aAAA;AAAA,AAAA,OAAA,AAAAA,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAA9T,iBAAAurD;;;AAAA,AAAA,AAAA,2DAAA,3DAASC,sEA+FQvnD;;AA\/FjB,AAAA,WAAA,PA+FYe;AA\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\/sD,IAAIgE;AAApC,AACE,IAAM\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\/BhB,AAAA,eAAA,XA+BWhF;AA\/BX,AA+BuB,OAACyY,2BAAiBzY,SAAKgF;;;AA\/B9C,AAAA,AAAA,0FAAA,1FAAS0jD,qGAsCE1oD;;AAtCX,AAAA,eAAA,XAsCWA;AAtCX,AAsCiB,OAAC2Z,oBAAU,AAAShB,qBAAMtJ;;;AAtC3C,AAAA,AAAA,8EAAA,9EAASq5C,yFA0DG1oD,KAAKnK;;AA1DjB,AAAA,eAAA,XA0DYmK;AA1DZ,AA0DoB,OAACukB,mDAAW1uB,EAAEmK;;;AA1DlC,AAAA,AAAA,8EAAA,9EAAS0oD,yFA2DG1oD,KAAKnK,EAAE2O;;AA3DnB,AAAA,eAAA,XA2DYxE;AA3DZ,AA2D0B,OAAC0kB,mDAAW7uB,EAAE2O,MAAMxE;;;AA3D9C,AAAA,AAAA,0EAAA,1EAAS0oD,qFA4CE1oD;;AA5CX,AAAA,eAAA,XA4CWA;AA5CX,AAAA,0FA6CK,CAAM\/E,WAAIH,WAAG,CAAMG,WAAI,YAAA,XAAKH;;;AA7CjC,AAAA,AAAA,yEAAA,zEAAS4tD,oFA+CC1oD;;AA\/CV,AAAA,eAAA,XA+CUA;AA\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\/CAACnC,6CAAKvX,OAAK,+CAAA,\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\/6B,eAAK\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\/9C,KAAK+wC;AAApB,AACE,QAAA,OAAkB,EAAM\/wC,SAAK+wC;;AAE\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\/wC,KAAK1F,IAAIsmD;;AA\/K7C,AAAA,YAAA,RA+KmBzC;AA\/KnB,AAgLI,IAAML,MAAI,MAAA,EAAQ99C,SAAK+wC;AAAvB,AACE,GAAI,2BAAA,1BAAO,CAAS8M,gBAAOC;AACzBK;;AACA,IAAMhvD,MAAY,AAACyuD,oCAA0BC,cAAOC;IAC9CwB,aAAY,CAAM5xD,WAAI,CAAA,MAAKyB;IAC3BowD,cAAY,CAAM7xD,WAAI,eAAA,dAAK,CAAA,MAAKyB;AAFtC,AAGE,GAAM,eAAA,dAAMmwD;AACN,IAAMztD,IAAE,AAAiB0tD,gCAAYnR,SAAK,SAAA,RAAG2C,aAAS\/wC,KAAK1F,IAAIsmD;AAA\/D,AACE,GAAM,CAAY\/uD,MAAE0tD;AAAapB;;AAAjC,GACM,EAAK,MAAA,LAAMtsD;AAAI,OAACsuD,qDAAahC,MAAM\/P,SAAK,eAAA,dAAK,CAAA,MAAKj\/C,YAAM0C;;AAD9D,GAEM,CAAIgsD,kBAAOC;AAFjB;;AAAA,AAGY,OAAuBK,2BAAM\/P,SAAK0P,IAAI3uD;;;;;;AAL1D,GAMM,AAACiuD,mBAAS9iD,IAAIglD;AACd,AAAI,qBAAA,OAAA,3BAAMsB;;AACN,OAAuBzC,2BAAM\/P,SAAK0P,IAAI3uD;;AARhD,AASYgvD;;;;;;;AA\/LtB,AAAA,AAAA,6DAAA,7DAASa,wEAkGsB1tD,EAAEwsD,IAAIvwD;;AAlGrC,AAAA,YAAA,RAkGyB4wD;AAlGzB,AAmGI,GAAI,CAAIN,kBAAOC;AAAf;;AAEE,IAAMM,WAAS,AAAkBD,sBAAM7sD;IACjC4uD,OAAS,AAAO9B;IAChBzwD,MAAS,AAASuyD;AAFxB,AAGE,AAAM,AAAU9B,kBAAU,CAASN,MAAI,AAAUM;;AACjD,AAACpsC,qBAAWkuC,KAAK,CAAA,MAAK,KAAA,JAAK3yD,UACf2yD,KAAK,CAAA,MAAK3yD,GACV,CAAGI,MAAI,CAAA,MAAK,KAAA,JAAKJ;;AAC7B,qBAAA,pBAAM2yD,KAAK,OAAA,NAAGvyD;;AACd,qBAAA,pBAAMuyD,KAAK,OAAA,NAAKvyD;;AAChBywD;;;;AA9GR,AAAA,AAAA,kDAAA,lDAASY;;AAAT,AAAA,YAAA,RAuFcb;AAvFd,AAwFI,QAAC8B,2DAAAA,uEAAAA,dAAiBvyD,mDAAAA;;;AAxFtB,AAAA,AAAA,kDAAA,lDAASsxD,6DAiMW12D,EAAE+O;;AAjMtB,AAAA,YAAA,RAiMc8mD;AAjMd,AAkMI,OAACE,0BAAgB3wD,WAAIpF,EAAE+O;;;AAlM3B,AAAA,AAAA,qDAAA,rDAAS2nD,gEAiEcjO,MAAM\/wC,KAAK1F,IAAIjH;;AAjEtC,AAAA,YAAA,RAiEiB8qD;AAjEjB,AAkEI,IAAML,MAAI,MAAA,EAAQ99C,SAAK+wC;AAAvB,AACE,GAAI,2BAAA,1BAAO,CAAS8M,gBAAOC;AACzBzqD;;AACA,IAAMlE,MAAY,AAACyuD,oCAA0BC,cAAOC;IAC9CwB,aAAY,CAAM5xD,WAAI,CAAA,MAAKyB;IAC3BowD,cAAY,CAAM7xD,WAAI,eAAA,dAAK,CAAA,MAAKyB;AAFtC,AAGE,GAAM,eAAA,dAAMmwD;AAAa,OAAeC,yBAAY,SAAA,RAAGxO,aAAS\/wC,KAAK1F,IAAIjH;;AAAzE,GACM,AAAC+pD,mBAAS9iD,IAAIglD;AAAYC;;AADhC,AAEYlsD;;;;;;;AA1EtB,AAAA,AAAA,0DAAA,1DAAS2rD,qEAgHc5Q,SAAK2C,MAAM\/wC,KAAK1F,IAAIpL,IAAIgwD;;AAhH\/C,AAAA,YAAA,RAgHiBf;AAhHjB,AAiHI,IAAML,MAAI,MAAA,EAAQ99C,SAAK+wC;IACjB5hD,MAAI,AAACyuD,oCAA0BC,cAAOC;AAD5C,AAEE,GAAI,2BAAA,1BAAO,CAASD,gBAAOC;AACzB,IAAMjsD,IAAE,AAACixB,oBAAU+6B;AAAnB,AACE,GACE,CAAG,CAAA,MAAKhsD,KAAG,AAASnE;AACpB,IAAM0wD,WAAS,AAAkBD,sBAAM\/P;IACjC8R,OAAS,AAAO9B;AADtB,AAEE,wBAAA,xBAAM,AAAOc;;AACb,AAAC\/sC,8BAAoB+tC,KAAK,CAAA,MAAK\/wD,KACV+wD,KAAK,CAAA,MAAK,OAAA,NAAK\/wD,YACf,CAAA,MAAK,CAAG0C,IAAE1C;;AAC\/B,CAAM+wD,KAAK,CAAA,MAAK\/wD,QAAKmL;;AACrB,CAAM4lD,KAAK,eAAA,dAAK,CAAA,MAAK\/wD,eAAMD;;AAC3B,AAAM,AAAUkvD,kBAAU,CAAQ,AAAUA,kBAAUN;;AACtDM;;AAXJ,GAaE,MAAA,LAAIvsD;AACJ,IAAMstD,QAAM,CAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA;IACNC,MAAM,EAAMp\/C,SAAK+wC;AADvB,AAEE,CAAMoO,MAAMC,OAAI,AAAe,AAASJ,oDAAmB5Q,SAAK,SAAA,RAAG2C,aAAS\/wC,KAAK1F,IAAIpL,IAAIgwD;;AACzF,cAAA,VAAO3xD;cAAP,VAAWkE;;AAAX,AACE,GAAI,WAAA,VAAGlE;AACL,GAAI,yCAAA,xCAAO,+BAAA,9BAAS,CAA2BswD,kBAAOtwD;AACpD,eAAO,WAAA,VAAKA;eAAGkE;;;;;AACf,AAAI,CAAM0tD,MAAM5xD,WACN,EAAA,EAAQ,0BAAA,zBAAM,CAAMG,WAAI+D,qBACtB,AAAe,AAASutD,oDACT5Q,SAAK,SAAA,RAAG2C,aAAS,AAAC5wC,eAAe,CAAMzS,WAAI+D,WAAI,CAAM\/D,WAAI+D,UAAG,CAAM\/D,WAAI,WAAA,VAAK+D,iBAAIytD,mBAC9F,CAAMxxD,WAAI,WAAA,VAAK+D;;AACvB,eAAO,WAAA,VAAKlE;eAAG,WAAA,VAAGkE;;;;;;AAR1B;;;;AASF,YAAA4tD,oBAAYjR,SAAK,KAAA,JAAKv8C,SAAGstD;;AA3B7B,AA8BE,IAAMvxD,UAAQ,KAAA9D,MAAY,CAAA,MAAK,KAAA,JAAG+H;AAAlC,AACE,gCAAA,YAAA,5CAACmgB,qBAAWtkB,eAAME,YAAU,CAAA,MAAKuB;;AACjC,CAAMvB,QAAQ,CAAA,MAAKuB,QAAKmL;;AACxB,CAAM1M,QAAQ,eAAA,dAAK,CAAA,MAAKuB,eAAMD;;AAC9B,AAAC8iB,qBAAWtkB,WAAI,CAAA,MAAKyB,KAAKvB,QAAQ,CAAA,MAAK,OAAA,NAAKuB,YAAM,CAAA,MAAK,CAAG0C,IAAE1C;;AAC5D,wBAAA,xBAAM,AAAO+vD;;AACb,IAAMd,WAAS,AAAkBD,sBAAM\/P;AAAvC,AACE,AAAM,AAAOgQ,eAAUxwD;;AACvB,AAAM,AAAUwwD,kBAAU,CAAQ,AAAUA,kBAAUN;;AACtDM;;;;;AACR,IAAMkB,aAAY,CAAM5xD,WAAI,CAAA,MAAKyB;IAC3BowD,cAAY,CAAM7xD,WAAI,eAAA,dAAK,CAAA,MAAKyB;AADtC,AAEE,GAAM,eAAA,dAAMmwD;AACN,IAAMztD,IAAE,AAAe0tD,8BAAYnR,SAAK,SAAA,RAAG2C,aAAS\/wC,KAAK1F,IAAIpL,IAAIgwD;AAAjE,AACE,GAAI,CAAYrtD,MAAE0tD;AAChBpB;;AACA,OAACgC,qDAAahC,MAAM\/P,SAAK,eAAA,dAAK,CAAA,MAAKj\/C,YAAM0C;;;AAJnD,GAMM,AAACurD,mBAAS9iD,IAAIglD;AACd,GAAI,CAAYpwD,QAAIqwD;AAClBpB;;AACA,OAACgC,qDAAahC,MAAM\/P,SAAK,eAAA,dAAK,CAAA,MAAKj\/C,YAAMD;;;AATjD,AAYM,AAAI,wBAAA,xBAAM,AAAOgwD;;AACb,uFAAA,hFAACkB,qDAAajC,MAAM\/P,SAAK,CAAA,MAAKj\/C,UAAS,eAAA,dAAK,CAAA,MAAKA,YACnC,iBAAAkxD,WAAajS;IAAbkS,WAAkB,SAAA,RAAGvP;IAArBwP,WAA8BjB;IAA9BkB,WAAyCjB;IAAzCkB,WAAqDzgD;IAArD0gD,WAA0DpmD;IAA1DqmD,WAA8DzxD;AAA9D,AAAA,kHAAAmxD,SAAAC,SAAAC,SAAAC,SAAAC,SAAAC,SAAAC,4CAAAN,SAAAC,SAAAC,SAAAC,SAAAC,SAAAC,SAAAC,lQAACX,sDAAAA,sHAAAA;;;;;;;;AA7KnC,AAAA,AAAA,oDAAA,pDAAShB,+DAEajO,MAAM\/wC,KAAK1F,IAAIpL,IAAIgwD;;AAFzC,AAAA,YAAA,RAEgBf;AAFhB,AAGI,IAAML,MAAI,MAAA,EAAQ99C,SAAK+wC;IACjB5hD,MAAI,AAACyuD,oCAA0BC,cAAOC;AAD5C,AAEE,GAAI,2BAAA,1BAAO,CAASD,gBAAOC;AACzB,IAAMjsD,IAAE,AAACixB,oBAAU+6B;AAAnB,AACE,GAAI,MAAA,LAAIhsD;AACN,IAAMstD,QAAM,CAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA,KAAA;IACNC,MAAM,EAAMp\/C,SAAK+wC;AADvB,AAEE,CAAMoO,MAAMC,OAAI,AAAc,AAASJ,8CAAmB,SAAA,RAAGjO,aAAS\/wC,KAAK1F,IAAIpL,IAAIgwD;;AACnF,cAAA,VAAO3xD;cAAP,VAAWkE;;AAAX,AACE,GAAI,WAAA,VAAGlE;AACL,GAAI,yCAAA,xCAAO,+BAAA,9BAAS,CAA2BswD,kBAAOtwD;AACpD,eAAO,WAAA,VAAKA;eAAGkE;;;;;AACf,AAAI,CAAM0tD,MAAM5xD,WACN,EAAA,EAAQ,0BAAA,zBAAM,CAAMG,WAAI+D,qBACtB,AAAc,AAASutD,8CACT,SAAA,RAAGjO,aAAS,AAAC5wC,eAAe,CAAMzS,WAAI+D,WAAI,CAAM\/D,WAAI+D,UAAG,CAAM\/D,WAAI,WAAA,VAAK+D,iBAAIytD,mBACxF,CAAMxxD,WAAI,WAAA,VAAK+D;;AACvB,eAAO,WAAA,VAAKlE;eAAG,WAAA,VAAGkE;;;;;;AAR1B;;;;AASF,YAAA4tD,oBAAA,KAAgB,KAAA,JAAKxtD,SAAGstD;;AAC1B,IAAMvxD,UAAQ,KAAA9D,MAAY,CAAA,MAAK,KAAA,JAAK+H;AAApC,AACE,gCAAA,YAAA,5CAACmgB,qBAAWtkB,eAAME,YAAU,CAAA,MAAKuB;;AACjC,CAAMvB,QAAQ,CAAA,MAAKuB,QAAKmL;;AACxB,CAAM1M,QAAQ,eAAA,dAAK,CAAA,MAAKuB,eAAMD;;AAC9B,AAAC8iB,qBAAWtkB,WAAI,CAAA,MAAKyB,KAAKvB,QAAQ,CAAA,MAAK,OAAA,NAAKuB,YAAM,CAAA,MAAK,CAAG0C,IAAE1C;;AAC5D,wBAAA,xBAAM,AAAO+vD;;AACb,YAAAF,4BAAA,KAAwB,CAAQnB,gBAAOC,KAAKlwD;;;AAClD,IAAM0xD,aAAY,CAAM5xD,WAAI,CAAA,MAAKyB;IAC3BowD,cAAY,CAAM7xD,WAAI,eAAA,dAAK,CAAA,MAAKyB;AADtC,AAEE,GAAM,eAAA,dAAMmwD;AACN,IAAMztD,IAAE,AAAc0tD,wBAAY,SAAA,RAAGxO,aAAS\/wC,KAAK1F,IAAIpL,IAAIgwD;AAA3D,AACE,GAAI,CAAYrtD,MAAE0tD;AAChBpB;;AACA,YAAAa,4BAAA,KAAwBnB,cAAO,AAAC2B,sDAAc9xD,WAAI,eAAA,dAAK,CAAA,MAAKyB,YAAM0C;;;AAJ5E,GAMM,AAACurD,mBAAS9iD,IAAIglD;AACd,GAAI,CAAYpwD,QAAIqwD;AAClBpB;;AACA,YAAAa,4BAAA,KAAwBnB,cAAO,AAAC2B,sDAAc9xD,WAAI,eAAA,dAAK,CAAA,MAAKyB,YAAMD;;;AAT1E,AAYM,AAAI,wBAAA,xBAAM,AAAOgwD;;AACb,YAAAF,4BAAA,KAAwBnB,cACJ,6EAAA,7EAAC4B,sDAAc\/xD,WAAI,CAAA,MAAKyB,UAAS,eAAA,dAAK,CAAA,MAAKA,YAC5B,iBAAAuwD,WAAa,SAAA,RAAG3O;IAAhB4O,WAAyBL;IAAzBM,WAAoCL;IAApCM,WAAgD7\/C;IAAhD8\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\/tD;;AA\/C1B,AAAA,YAAA,RA+CoB6sD;AA\/CpB,AAgDI,GAAI,CAAY7sD,MAAE88C;AAChB+P;;AACA,YAAAkB,oBAAY\/tD,EAAEsX,WAAI,AAACnb,iBAAOC;;;;AAlDhC,AAAA,AAAA,oDAAA,pDAAS2xD,+DAgEgBjR,SAAK2C,MAAM\/wC,KAAK1F,IAAIsmD;;AAhE7C,AAAA,YAAA,RAgEmBzC;AAhEnB,AAiEI,IAAMhvD,MAAK,EAAM6Q,SAAK+wC;IAChBjJ,OAAK,CAAMp6C,WAAIyB;AADrB,AAEE,GAAI,SAAA,RAAM24C;AACRqW;;AACA,IAAMtsD,IAAE,AAAiBi2C,yBAAKsG,SAAK,SAAA,RAAG2C,aAAS\/wC,KAAK1F,IAAIsmD;AAAxD,AACE,GACE,CAAY\/uD,MAAEi2C;AACdqW;;AAFF,GAIE,MAAA,LAAMtsD;AACN,GAAI,eAAA,dAAI+W;AACN,OAACi4C,0BAAgB1C,MAAM\/P,SAAKj\/C;;AAC5B,IAAMivD,WAAS,AAAC+B,qDAAahC,MAAM\/P,SAAKj\/C,IAAI0C;AAA5C,AACE,AAAM,AAAOusD,eAAU,gBAAA,fAAK,AAAOA;;AACnCA;;;AATN,AAYE,OAAC+B,qDAAahC,MAAM\/P,SAAKj\/C,IAAI0C;;;;;;;AAlFzC,AAAA,AAAA,0CAAA,1CAASwtD;;AAAT,AAAA,YAAA,RA4CclB;AA5Cd,AA6CI,QAAC+C,gEAAAA,4EAAAA,dAAsBxzD,wDAAAA;;;AA7C3B,AAAA,AAAA,0CAAA,1CAAS2xD,qDAoFW\/2D,EAAE+O;;AApFtB,AAAA,YAAA,RAoFc8mD;AApFd,AAqFI,IAAMxwD,MAAI,AAASD;AAAnB,AACE,QAAA,JAAOH;IAAI8J,WAAKA;;AAAhB,AACE,GAAI,CAAG9J,IAAEI;AACP,IAAMm6C,OAAK,CAAMp6C,WAAIH;AAArB,AACE,GAAA,EAAQ,SAAA,RAAMu6C;AACZ,IAAMzwC,WAAK,AAAYywC,eAAKx\/C,EAAE+O;AAA9B,AACE,GAAI,AAAC+Q,yBAAS\/Q;AAAd,QAAAkR,gDAAAA,0DAAAA,ZACGlR,sCAAAA;;AACD,eAAO,KAAA,JAAK9J;eAAG8J;;;;;;AACnB,eAAO,KAAA,JAAK9J;eAAG8J;;;;;;AACnBA;;;;;;AA\/FV,AAAA,AAAA,6CAAA,7CAASgoD,wDA8BctO,MAAM\/wC,KAAK1F,IAAIjH;;AA9BtC,AAAA,YAAA,RA8BiB8qD;AA9BjB,AA+BI,IAAMhvD,MAAK,EAAM6Q,SAAK+wC;IAChBjJ,OAAK,CAAMp6C,WAAIyB;AADrB,AAEE,GAAA,EAAQ,SAAA,RAAM24C;AACZ,OAAeA,kBAAK,SAAA,RAAGiJ,aAAS\/wC,KAAK1F,IAAIjH;;AACzCA;;;;AAnCR,AAAA,AAAA,kDAAA,lDAASgsD,6DAoDcjR,SAAK2C,MAAM\/wC,KAAK1F,IAAIpL,IAAIgwD;;AApD\/C,AAAA,YAAA,RAoDiBf;AApDjB,AAqDI,IAAMhvD,MAAK,EAAM6Q,SAAK+wC;IAChBjJ,OAAK,CAAMp6C,WAAIyB;AADrB,AAEE,GAAI,SAAA,RAAM24C;AACR,IAAMsW,WAAS,AAAC+B,qDAAahC,MAAM\/P,SAAKj\/C,IAAI,AAAe,AAAS6vD,oDAAmB5Q,SAAK,SAAA,RAAG2C,aAAS\/wC,KAAK1F,IAAIpL,IAAIgwD;AAArH,AACE,AAAM,AAAOd,eAAU,gBAAA,fAAK,AAAOA;;AACnCA;;AACF,IAAMvsD,IAAE,AAAei2C,uBAAKsG,SAAK,SAAA,RAAG2C,aAAS\/wC,KAAK1F,IAAIpL,IAAIgwD;AAA1D,AACE,GAAI,CAAYrtD,MAAEi2C;AAChBqW;;AACA,OAACgC,qDAAahC,MAAM\/P,SAAKj\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\/wC,KAAK1F,IAAIsmD;;AA\/E7C,AAAA,YAAA,RA+EmBzC;AA\/EnB,AAgFI,IAAMhvD,MAAI,AAACgyD,yCAA+BzzD,WAAIkb,WAAItO;AAAlD,AACE,GAAI,SAAA,RAAInL;AACNgvD;;AACA,AAAI,qBAAA,OAAA,3BAAMyC;;AACN,GAAI,gBAAA,fAAIh4C;AAAR;;AAEE,IAAMw1C,WAAS,AAAkBD,sBAAM\/P;IACjC8R,OAAS,AAAO9B;AADtB,AAEE,CAAM8B,KAAK\/wD,OAAI,CAAM+wD,KAAK,sBAAA,rBAAG,CAAA,MAAKt3C;;AAClC,CAAMs3C,KAAK,OAAA,NAAK\/wD,cAAK,CAAM+wD,KAAK,sBAAA,rBAAK,CAAA,MAAKt3C;;AAC1C,oCAAA,nCAAMs3C,KAAK,sBAAA,rBAAK,CAAA,MAAKt3C;;AACrB,oCAAA,nCAAMs3C,KAAK,sBAAA,rBAAG,CAAA,MAAKt3C;;AACnB,AAAM,AAAOw1C,eAAU,gBAAA,fAAK,AAAOA;;AACnCA;;;;;AA7FhB,AAAA,AAAA,kDAAA,lDAASiD;;AAAT,AAAA,YAAA,RAwCclD;AAxCd,AAyCI,QAAC8B,2DAAAA,uEAAAA,dAAiBvyD,mDAAAA;;;AAzCtB,AAAA,AAAA,kDAAA,lDAAS2zD,6DA+FW\/4D,EAAE+O;;AA\/FtB,AAAA,YAAA,RA+Fc8mD;AA\/Fd,AAgGI,OAACE,0BAAgB3wD,WAAIpF,EAAE+O;;;AAhG3B,AAAA,AAAA,qDAAA,rDAASgqD,gEA4BctQ,MAAM\/wC,KAAK1F,IAAIjH;;AA5BtC,AAAA,YAAA,RA4BiB8qD;AA5BjB,AA6BI,IAAMhvD,MAAI,AAACgyD,yCAA+BzzD,WAAIkb,WAAItO;AAAlD,AACE,GAAM,OAAA,NAAGnL;AAAoBkE;;AAA7B,GACM,AAAC+pD,mBAAS9iD,IAAI,CAAM5M,WAAIyB;AAAM,QAAMzB,WAAI,OAAA,NAAKyB;;AADnD,AAE6BkE;;;;;;AAhCnC,AAAA,AAAA,0DAAA,1DAASguD,qEAyDcjT,SAAK2C,MAAM\/wC,KAAK1F,IAAIpL,IAAIgwD;;AAzD\/C,AAAA,YAAA,RAyDiBf;AAzDjB,AA0DI,GAAI,CAAIn+C,SAAKuhD;AACX,IAAMpyD,MAAI,AAACgyD,yCAA+BzzD,WAAIkb,WAAItO;AAAlD,AACE,GAAI,SAAA,RAAInL;AACN,GAAI,CAAG,AAASzB,oBAAK,CAAA,MAAKkb;AACxB,IAAMw1C,WAAS,AAACgC,qDAAajC,MAAM\/P,SAAK,CAAA,MAAKxlC,YAAKtO,IAAI,sBAAA,rBAAK,CAAA,MAAKsO,mBAAM1Z;AAAtE,AACE,wBAAA,xBAAM,AAAOgwD;;AACb,AAAM,AAAOd,eAAU,gBAAA,fAAK,AAAOA;;AACnCA;;AACF,IAAMzwD,MAAQ,AAASD;IACjBE,UAAQ,KAAA9D,MAAY,OAAA,NAAG6D;AAD7B,AAEE,gCAAA,YAAA,5CAACqkB,qBAAWtkB,eAAME,YAAUD;;AAC5B,CAAMC,QAAQD,OAAI2M;;AAClB,CAAM1M,QAAQ,OAAA,NAAKD,cAAKuB;;AACxB,wBAAA,xBAAM,AAAOgwD;;AACb,OAAwBf,4BAAM\/P,SAAK,cAAA,bAAKxlC,kBAAKhb;;;AACjD,GAAI,CAAY,CAAMF,WAAI,OAAA,NAAKyB,iBAAMD;AACnCivD;;AACA,OAACgC,qDAAahC,MAAM\/P,SAAK,OAAA,NAAKj\/C,WAAKD;;;;AACzC,OAAe,KAAA8vD,4BAAoB5Q,SAAK,MAAA,EAAQmT,0BAAexQ,iBAAO,CAAA,WAAA,KAAA,XAAWoN,qCAClE\/P,SAAK2C,MAAM\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\/CV,AAAA,eAAA,XA+CUA;AA\/CV,AA+CgB,IAAAwP,kBAAqCwjB;AAArC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,4BAAcxP,5BAAKyU;AAAnB,AAAA,gBAAAjF,hBAAqCwjB;;AAArCxjB;;;;AA\/ChB,AAAA,AAAA,8DAAA,9DAAS+\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\/B,AAAA,AAAA,+CAAA,\/CAASoc;;AAAT,AAAA,WAAA,PAYWpc;AAZX,AAaI,OAACgU,uBAAa,CAACm1C,+CAAAA,qDAAAA,RAAKnpD,iCAAAA;;;AAbxB,AAAA,AAAA,4CAAA,5CAASoc,uDAcInd;;AAdb,AAAA,WAAA,PAcQe;AAdR,AAeI,OAACohB,0BAAUphB,KAAKf;;;AAfpB,AAAA,AAAA,4CAAA,5CAASmd,uDAgBInd,EAAE2B;;AAhBf,AAAA,WAAA,PAgBQZ;AAhBR,AAiBI,OAASA,4CAAKf,EAAE2B;;;AAjBpB,AAAA,AAAA,gDAAA,hDAASwb,2DAkBQvmB;;AAlBjB,AAAA,WAAA,PAkBYmK;AAlBZ,AAmBI,IAAAqxD,aAAA,AAAAh+C,cAAcrT;IAAdsxD,eAAA;IAAAC,eAAA;IAAAC,WAAA;;AAAA,AAAA,GAAA,AAAA,CAAAA,WAAAD;AAAA,IAAAE,aAAA,AAAAH,kDAAAE;QAAA,AAAAl\/B,4CAAAm\/B,WAAA,IAAA,\/DAASxyD;QAAT,AAAAqzB,4CAAAm\/B,WAAA,IAAA,\/DAAWzvD;AAAX,AAAA,AACE,CAACnM,kCAAAA,uCAAAA,PAAEmM,mBAAAA,jBAAE\/C,mBAAAA;;AADP,eAAAoyD;eAAAC;eAAAC;eAAA,CAAAC,WAAA;;;;;;;AAAA,IAAAj\/B,qBAAA,AAAAlf,cAAAg+C;AAAA,AAAA,GAAA9+B;AAAA,AAAA,IAAA8+B,iBAAA9+B;AAAA,AAAA,GAAA,AAAA7T,6BAAA2yC;AAAA,IAAA7+B,kBAAA,AAAAtP,sBAAAmuC;AAAA,AAAA,eAAA,AAAA5+B,qBAAA4+B;eAAA7+B;eAAA,AAAA7a,gBAAA6a;eAAA;;;;;;;AAAA,IAAAk\/B,aAAA,AAAAr3D,gBAAAg3D;QAAA,AAAA\/+B,4CAAAo\/B,WAAA,IAAA,\/DAASzyD;QAAT,AAAAqzB,4CAAAo\/B,WAAA,IAAA,\/DAAW1vD;AAAX,AAAA,AACE,CAACnM,kCAAAA,uCAAAA,PAAEmM,mBAAAA,jBAAE\/C,mBAAAA;;AADP,eAAA,AAAA3E,eAAA+2D;eAAA;eAAA;eAAA;;;;;;;;AAAA;;;;;;;AAnBJ,AAAA,AAAA,0EAAA,1EAASj1C,qFAwEGpc,KAAKf;;AAxEjB,AAAA,eAAA,XAwEYe;AAxEZ,AAyEI,yDAAA,lDAASA,gDAAKf;;;AAzElB,AAAA,AAAA,0EAAA,1EAASmd,qFA2EGpc,KAAKf,EAAE2B;;AA3EnB,AAAA,eAAA,XA2EYZ;AA3EZ,AA4EI,GAAM,MAAA,LAAMf;AAAM,GAAImyD;AACFL;;AACAnwD;;;AAFpB,GAGM,gBAAA,fAAMu0C;AAAMv0C;;AAHlB,AAIkB,gCAAA,zBAAeu0C,6BAAO,AAACznC,eAAKzO,GAAGA,EAAE2B;;;;;;AAhFvD,AAAA,AAAA,+EAAA,\/EAASwb,0FAoHMpc,KAAKnK,EAAE+O;;AApHtB,AAAA,eAAA,XAoHe5E;AApHf,AAqHI,IAAM4E,WAAK,EAAIwsD,uBAAS,wEAAA,wCAAA,\/GAACv7D,kCAAAA,4DAAAA,5BAAE+O,wCAAAA,9BAASmsD,wCAAAA,iBAASnsD;AAA7C,AACE,GACE,AAAC+Q,yBAAS\/Q;AADZ,QAAAkR,gDAAAA,0DAAAA,ZAC4BlR,sCAAAA;;AAD5B,GAEE,EAAK,gBAAA,fAAMuwC;AAAO,OAAYA,sBAAKt\/C,EAAE+O;;AAFvC,AAG2BA;;;;;;AAzHjC,AAAA,AAAA,6DAAAzP,7DAASinB;;AAAT,AAAA,AAAA,8EAAA,9EAASA,yFA0BKpc;;AA1Bd,AAAA,eAAA,XA0BcA;AA1Bd,AA2BI,IAAMgxD,YAAU,EAAa7b,aAAK,AAAC1pC,oBAAU0pC,aAAM,AAACvV;AAApD,AACE,GAAIwxB;AACF,YAAAP,+CAAA,zBAAcE,eAAQC;;AACtBA;;;;AA9BR,AAAA,AAAA,sEAAA,tEAAS50C,iFAoCCpc;;AApCV,AAAA,eAAA,XAoCUA;AApCV,AAoCgBkE;;;AApChB,AAAA,AAAA,4EAAA,5EAASkY,uFAuBE3mB;;AAvBX,AAAA,YAAA,RAuBWA;AAvBX,AAuBc,YAAA2mB,4BAAoBlY,YAAKiS,WAAIg\/B,YAAKic,sBAASL,eAAQ\/9B;;;AAvBjE,AAAA,AAAA,0EAAA,1EAAS5W,qFAqEEpc;;AArEX,AAAA,eAAA,XAqEWA;AArEX,AAqEiBmW;;;AArEjB,AAAA,AAAA,sEAAA,tEAASiG,iFA0DCpc;;AA1DV,AAAA,eAAA,XA0DUA;AA1DV,AA0DgB,IAAAwP,kBAAuCwjB;AAAvC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,8BAAcxP,9BAAK4U;AAAnB,AAAA,gBAAApF,hBAAuCwjB;;AAAvCxjB;;;;AA1DhB,AAAA,AAAA,wEAAA,xEAAS4M,mFAuDEpc,KAAKgF;;AAvDhB,AAAA,eAAA,XAuDWhF;AAvDX,AAuDuB,OAAC4lD,oBAAU5lD,SAAKgF;;;AAvDvC,AAAA,AAAA,4FAAA,5FAASoX,uGAmISpc;;AAnIlB,AAAA,eAAA,XAmIkBA;AAnIlB,AAoII,YAAA2xD,2BAAmB,GAASxc,YAAKh\/B,WAAIi7C,sBAASL;;;AApIlD,AAAA,AAAA,sFAAA,tFAAS30C,iGAoDEpc;;AApDX,AAAA,eAAA,XAoDWA;AApDX,AAoDiB,OAACiE,qBAAW,AAASmY,kCAAmBlY;;;AApDzD,AAAA,AAAA,uEAAA,vEAASkY,kFAwGGpc,KAAKf;;AAxGjB,AAAA,eAAA,XAwGYe;AAxGZ,AAyGI,GAAM,MAAA,LAAMf;AAAM,GAAImyD;AACF,YAAAh1C,uEAAA,MAAA,KAAA,tDAAoBlY,YAAK,cAAA,bAAKiS,kBAAKg\/B;;AACnCn1C;;;AAFpB,GAGM,gBAAA,fAAMm1C;AAAMn1C;;AAHlB,AAKM,IAAM0+C,WAAS,0BAAA,1BAAgBvJ,8BAAO,AAACznC,eAAKzO,GAAGA;AAA\/C,AACE,GAAI,CAAYy\/C,aAASvJ;AACvBn1C;;AACA,YAAAoc,yGAAA,7EAAoBlY,YAAK,cAAA,bAAKiS,kBAAKuoC,SAAS0S,sBAASL;;;;;;;AAjHnE,AAAA,AAAA,8EAAA,9EAAS30C,yFAmFEpc,KAAKf,EAAE+C;;AAnFlB,AAAA,eAAA,XAmFWhC;AAnFX,AAoFI,GAAI,MAAA,LAAMf;AACR,GAAI,CAAKmyD,2BAAS,CAAYpvD,MAAE+uD;AAC9B\/wD;;AACA,YAAAoc,4GAAA,OAAA,vFAAoBlY,YAAK,EAAIktD,uBAASj7C,WAAI,cAAA,bAAKA,mBAAMg\/B,iBAAUnzC;;;AACjE,IAAMyqD,oBAAY,KAAAhC,cAAA;IACZ\/L,WAAgB,EAAI,gBAAA,fAAMvJ,sBACR,AAASoX,kCACTpX,3DACF,oFAAA,IAAgB,AAACznC,eAAKzO,GAAGA,EAAE+C,EAAEyqD;AAJnD,AAKE,GAAI,CAAY\/N,aAASvJ;AACvBn1C;;AACA,YAAAoc,8IAAA,lHAAoBlY,YAAK,EAAI,AAAgBuoD,uBAAa,cAAA,bAAKt2C,kBAAKA,YAAKuoC,SAAS0S,sBAASL;;;;;AA\/FrG,AAAA,AAAA,4FAAA,5FAAS30C,uGAiGUpc,KAAKf;;AAjGxB,AAAA,eAAA,XAiGmBe;AAjGnB,AAkGI,GAAM,MAAA,LAAMf;AAAMmyD;;AAAlB,GACM,gBAAA,fAAMjc;AADZ;;AAAA,AAEkB,SAAK,CAAY,yBAAA,zBAAeA,6BAAO,AAACznC,eAAKzO,GAAGA,EAAE0gB,+BACjCA;;;;;;AArGvC,AAAA,AAAA,wEAAA,xEAASvD,mFA6DApc;;AA7DT,AAAA,eAAA,XA6DSA;AA7DT,AA8DI,GAAM,cAAA,bAAMmW;AAAZ,AACE,IAAMvd,IAAE,EAAA,kDAAA,hDAAQ,gBAAA,fAAMu8C,uBAAM,AAAYA;AAAxC,AACE,GAAIic;AACF,sBAAA,mFAAA,lGAAC14C,uGAAUq4C,uBAASn4D;;AACpBA;;;AAJN;;;;AA9DJ,AAAA,AAAA,+EAAA,\/EAASwjB,0FAiCMpc,KAAKkE;;AAjCpB,AAAA,eAAA,XAiCelE;AAjCf,AAiC0B,YAAAoc,4BAAoBlY,SAAKiS,WAAIg\/B,YAAKic,sBAASL,eAAQ\/9B;;;AAjC7E,AAAA,AAAA,4EAAA,5EAAS5W,uFAuCCpc,KAAKsG;;AAvCf,AAAA,eAAA,XAuCUtG;AAvCV,AAwCI,GAAI,AAACye,wBAAQnY;AACX,OAAQtG,oDAAK,mDAAA,nDAACoW,6CAAK9P,WAAS,mDAAA,nDAAC8P,6CAAK9P;;AAClC,IAAOiS,MAAIvY;IAAK0pD,KAAG,AAACr2C,cAAI\/M;;AAAxB,AACE,GAAI,OAAA,NAAMojD;AACRnxC;;AACA,IAAM1Z,IAAE,AAACxE,gBAAMqvD;AAAf,AACE,GAAI,AAACjrC,wBAAQ5f;AACX,eAAO,AAAQ0Z,+CAAI,+CAAA,\/CAACnC,6CAAKvX,OAAK,+CAAA,\/CAACuX,6CAAKvX;eAC7B,AAACvE,eAAKovD;;;;;AACb,MAAO,KAAAh0D,MAAA;;;;;;;;AAjDrB,AAAA,AAAA,6CAAA,7CAAS0mB;;6BAATtN,OA4HiB7P;;AA5HjB,AAAA,IAAA6P,aAAA;AAAA,AAAA,WAAAA,PA4HY9O;AA5HZ,AA6HI,OAASA,4CAAKf;;6BA7HlB6P,OA+HiB7P,EAAE2B;;AA\/HnB,AAAA,IAAAkO,aAAA;AAAA,AAAA,WAAAA,PA+HY9O;AA\/HZ,AAgII,OAASA,4CAAKf,EAAE2B;;oBAhIpBkO,OA+HiB7P,EAAE2B;;;6BA\/HnBkO,OA+HiB7P;;6BA\/HjB6P,OA+HiB7P,EAAE2B;;;;;;;;;;AA\/HnB,AAAA,AAAA,8CAAA,WAAAkO,OAAAoiD,hEAAS90C;;AAAT,AAAA,IAAAtN,aAAA;AAAA,AAAA,OAAA,AAAAA,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAA9T,iBAAAk2D;;;AAAA,AAAA,AAAA,sEAAA,tEAAS90C,iFA4HQnd;;AA5HjB,AAAA,WAAA,PA4HYe;AA5HZ,AA6HI,OAASA,4CAAKf;;;AA7HlB,AAAA,AAAA,sEAAA,tEAASmd,iFA+HQnd,EAAE2B;;AA\/HnB,AAAA,WAAA,PA+HYZ;AA\/HZ,AAgII,OAASA,4CAAKf,EAAE2B;;;AAhIpB,AAAA,uCAAA,vCAASwb;AAAT,AAAA,0FAAA,0DAAA,uDAAA,yDAAA,oBAAA,gEAAA,2CAAA,oDAAA,wEAAA,+DAAA,oBAAA,8DAAA,2CAAA,0DAAA;;;AAAA,AAAA,6CAAA,7CAASA;;AAAT,AAAA,gDAAA,hDAASA;;AAAT,AAAA,qDAAA,WAAA1Q,mBAAAC,qBAAAC,xGAASwQ;AAAT,AAAA,OAAAzV,iBAAAgF,qBAAA;;;AAAA,mCAAA,nCAASwlD,8EAAmBjtD,KAAKiS,IAAIg\/B,KAAcic,eAASL,QAAkB\/9B;AAA9E,AAAA,YAAA5W,4BAA4BlY,KAAKiS,IAAIg\/B,KAAcic,eAASL,QAAkB\/9B;;;AAArE5W,AAsIT,AAAM,AAASA,oCAAmB,KAAAA,4BAAA,KAAA,IAAA,KAAA,MAAA,KAAwCvH;AAE1E,AAAM,AAAauH,wCACjB,WAAKnhB,IAAa8kD;AAAlB,AACE,IAAM9kD,UAAI,EAAI8kD,UAAS9kD,IAAI,AAACD,iBAAOC;IAC7BC,MAAI,AAASD;AADnB,AAEE,QAAA,JAAOH;IAAIyd,MAAI,AAACihB,qBAAU,AAASpd;;AAAnC,AACE,GAAI,CAAGthB,IAAEI;AACP,eAAO,KAAA,JAAGJ;eACR,AAAC4N,uBAAQ6P,IAAI,CAAMtd,QAAIH,IAAG,CAAMG,QAAI,KAAA,JAAKH;;;;;AAC3C,OAACyN,4BAAagQ;;;;;AAExB,AAAM,AAAc6D,yCAClB,WAAKS,GAAG+0C;AAAR,AACE,IAAM12D,MAAI,AAAS2hB;AAAnB,AACE,QAAA,JAAO\/hB;IAAgBklD,MAAI,AAACxmB,qBAAU,AAASpd;;AAA\/C,AACE,GAAI,CAAGthB,IAAEI;AACP,eAAO,KAAA,JAAKJ;eAAG,AAASklD,8DAAI,CAAMnjC,GAAG\/hB,IAAG,CAAM82D,GAAG92D;;;;;AACjD,OAAC2+B,2BAAYumB;;;;;AAEvB,AAAM,AAAmB5jC,8CACvB,WAAKnhB;AAAL,AACE,IAAMC,MAAI,AAASD;IACbsd,MAAI,AAACihB,qBAAU,AAASpd;AAD9B,AAEE,cAAA,VAAOthB;;AAAP,AACE,GAAM,CAAGA,UAAEI;AAAX,AACE,AAACwN,uBAAQ6P,IAAI,CAAMtd,IAAIH,UAAG,CAAMG,IAAI,WAAA,VAAKH;;AACzC,GAAI,AAAC+2D,gDAAK,AAAC9xD,iBAAOwY,KAAK,mBAAA,lBAAK,WAAA,VAAGzd;AAC7B,MAAO,KAAApF,MAAW,6CAAA,+DAAuB,CAAMuF,IAAIH;;AACnD,eAAO,WAAA,VAAGA;;;;;AAJd;;;;AAKF,OAACyN,4BAAagQ;;AAEpB,CAAA,sCAAArf,yBAAA,\/DAAckjB;AAAd,AAAA,IAAAtD,qBAAA;AAAA,AAAA,OAAA9E,uBAAA8E;;AAEA,AAAA;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,kDAAA,lDAAS64C,6DAMOtyD;;AANhB,AAAA,YAAA,RAMUiJ;AANV,AAOI,GAAIqzC;AACF,GAAI,EAAA,EAAA,MAAA,QAAA,EAAA,CAAA,CAAA,wCAAA,aAAA,CAAAxmD,gCAAA,0BAAA,KAAA,EAAA,EAAA,wCAAA,AAAA4C,yDAAA,QAAA,AAAAA,\/BAAYuK,iEAAAA,rRAAUjD,iBAAAA,sFAAAA,mCAAAA,8FAAAA,iEAAAA;AACxB,OAASiJ,kBAAM,CAACspB,8CAAAA,iDAAAA,LAAIvyB,6BAAAA,IAAG,CAACwyB,8CAAAA,iDAAAA,LAAIxyB,6BAAAA;;AAC5B,IAAOqqD,KAAG,AAACr2C,cAAIhU;IAAGiJ,YAAMA;;AAAxB,AACE,IAAA3P,qBAAW,AAAC0B,gBAAMqvD;AAAlB,AAAA,oBAAA\/wD;AAAA,QAAAA,JAASkG;AAAT,AACE,eAAO,AAACvE,eAAKovD;eACN,AAASphD,sBAAM,CAACspB,8CAAAA,iDAAAA,LAAI\/yB,6BAAAA,IAAG,CAACgzB,8CAAAA,iDAAAA,LAAIhzB,6BAAAA;;;;;AACnCyJ;;;;;;AACN,MAAO,KAAA5S,MAAA;;;;AAfb,AAAA,AAAA,mDAAA,nDAASi8D,8DAiBQ1yD,EAAE+C;;AAjBnB,AAAA,YAAA,RAiBWsG;AAjBX,AAkBI,GAAIqzC;AACF,GAAI,MAAA,LAAM18C;AACR,AAAI,GAAI,CAAY8xD,mBAAQ\/uD;AAAxB;AAEE,AAAM+uD,iBAAQ\/uD;;;AAChB,GAAIovD;AAAJ;AAEE,AAAI,AAAM58C,eAAM,gBAAA,fAAKA;;AACjB,wBAAA,xBAAM48C;;;AACZ9oD;;AACJ,IAAMmkD,oBAAY,KAAAhC,cAAA;IACZpV,OAAgB,EAAI,gBAAA,fAAMF,sBACR,AAASoX,kCACTpX,3DACF,sGAAA,ZAAewG,gBAAO,AAACjuC,eAAKzO,GAAGA,EAAE+C,EAAEyqD;AAJzD,AAKE,GAAI,CAAYpX,SAAKF;AAArB;AAEE,AAAMA,cAAKE;;;AACb,GAAI,AAAgBoX;AAClB,AAAMj4C,eAAM,gBAAA,fAAKA;;AADnB;;AAEAlM;;;AACJ,MAAO,KAAA5S,MAAA;;;;AAvCb,AAAA,AAAA,qDAAA,rDAASi8D,gEAyCU1yD;;AAzCnB,AAAA,YAAA,RAyCaqJ;AAzCb,AA0CI,GAAIqzC;AACF,GAAI,MAAA,LAAM18C;AACR,GAAImyD;AACF,AAAI,wBAAA,xBAAMA;;AACN,iBAAA,jBAAML;;AACN,AAAMv8C,eAAM,gBAAA,fAAKA;;AACjBlM;;AACJA;;;AACF,GAAI,gBAAA,fAAM6sC;AACR7sC;;AACA,IAAM6lD,sBAAc,KAAA1D,cAAA;IACdpV,OAAK,4CAAA,5CAAiBF,gCAAKwG,gBAAO,AAACjuC,eAAKzO,GAAGA,EAAEkvD;AADnD,AAEE,GAAI,CAAY9Y,SAAKF;AAArB;AAEE,AAAMA,cAAKE;;;AACb,oBAAI,qBAAA,pBAAM8Y;AACR,AAAM35C,eAAM,gBAAA,fAAKA;;AADnB;;AAEAlM;;;;AACN,MAAO,KAAA5S,MAAA;;;;AA5Db,AAAA,AAAA,wDAAA,xDAASi8D;;AAAT,AAAA,YAAA,RA8DgBrpD;AA9DhB,AA+DI,GAAIqzC;AACF,AAAI,cAAA,dAAMA;;AACN,YAAAv\/B,4BAAA,mEAAA,9DAAwB5H,aAAM2gC,YAAKic,sBAASL;;AAChD,MAAO,KAAAr7D,MAAA;;;;AAlEb,AAAA,AAAA,yEAAA,zEAASi8D,oFAqEE3xD;;AArEX,AAAA,eAAA,XAqEWA;AArEX,AAsEI,GAAI27C;AACFnnC;;AACA,MAAO,KAAA9e,MAAA;;;;AAxEb,AAAA,AAAA,yEAAA,zEAASi8D,oFA2EGrpD,MAAMrJ;;AA3ElB,AAAA,gBAAA,ZA2EYqJ;AA3EZ,AA4EI,GAAI,MAAA,LAAMrJ;AACR,GAAImyD;AACFL;;AADF;;;AAEA,GAAI,gBAAA,fAAM5b;AAAV;;AAEE,gCAAA,zBAAeA,6BAAO,AAACznC,eAAKzO,GAAGA;;;;;AAjFvC,AAAA,AAAA,yEAAA,zEAAS0yD,oFAmFGrpD,MAAMrJ,EAAE2B;;AAnFpB,AAAA,gBAAA,ZAmFY0H;AAnFZ,AAoFI,GAAI,MAAA,LAAMrJ;AACR,GAAImyD;AACFL;;AACAnwD;;;AACF,GAAI,gBAAA,fAAMu0C;AACRv0C;;AACA,gCAAA,zBAAeu0C,6BAAO,AAACznC,eAAKzO,GAAGA,EAAE2B;;;;;AA1FzC,AAAA,AAAA,0FAAA,1FAAS+wD,qGA6FErpD,MAAM7L;;AA7FjB,AAAA,gBAAA,ZA6FW6L;AA7FX,AA6FsB,OAAQA,qBAAM7L;;;AA7FpC,AAAA,AAAA,gGAAA,hGAASk1D,2GA+FQrpD;;AA\/FjB,AAAA,gBAAA,ZA+FiBA;AA\/FjB,AA+FwB,OAAcA;;;AA\/FtC,AAAA,AAAA,4FAAA,5FAASqpD,uGAkGGrpD,MAAMT,IAAIpL;;AAlGtB,AAAA,gBAAA,ZAkGY6L;AAlGZ,AAkG2B,OAASA,sBAAMT,IAAIpL;;;AAlG9C,AAAA,AAAA,qFAAA,rFAASk1D,gGAqGIrpD,MAAMT;;AArGnB,AAAA,gBAAA,ZAqGaS;AArGb,AAqGwB,OAAWA,wBAAMT;;;AArGzC,AAAA,sCAAA,tCAAS8pD;AAAT,AAAA,0FAAA,oBAAA,uDAAA,2CAAA,oDAAA,+DAAA,0DAAA,cAAA,oBAAA,yDAAA,2CAAA,0DAAA,cAAA,oBAAA,2DAAA,2CAAA,0DAAA,cAAA,oBAAA,gEAAA,2CAAA,oDAAA,+DAAA,0DAAA,cAAA,oBAAA,+DAAA,2CAAA,0DAAA;;;AAAA,AAAA,4CAAA,5CAASA;;AAAT,AAAA,+CAAA,\/CAASA;;AAAT,AAAA,oDAAA,WAAAjmD,mBAAAC,qBAAAC,vGAAS+lD;AAAT,AAAA,OAAAhrD,iBAAAgF,qBAAA;;;AAAA,kCAAA,lCAASmmD,4EAAqCnW,KACTxG,KACA3gC,MACS48C,eACTL;AAJrC,AAAA,YAAAY,2BAA8ChW,KACTxG,KACA3gC,MACS48C,eACTL;;;AAJ5BY,AAyGT,8BAAA,9BAAOI,oEAAmB1c,KAAK2c,MAAe7rD;AAA9C,AACE,IAAO1M,IAAE47C;IAAK2c,YAAMA;;AAApB,AACE,GAAA,EAAQ,MAAA,LAAMv4D;AACZ,eAAO,EAAI0M,kBAAW,AAAQ1M,OAAG,AAASA;eACnC,AAACmhB,6CAAKo3C,UAAMv4D;;;;;AACnBu4D;;;;;AAEN,AAAA;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,oDAAA,pDAASC;;AAAT,AAAA,WAAA,PAEajyD;AAFb,AAGI,OAACgM,uBAAQhM;;;AAHb,AAAA,AAAA,iDAAA,jDAASiyD,4DAIMjtD;;AAJf,AAAA,YAAA,RAIUvG;AAJV,AAKI,OAAQA,2CAAKuG;;;AALjB,AAAA,AAAA,mDAAA,nDAASitD;;6BAMQn7D;;AANjB,AAAA,WAAA,PAMYkJ;AANZ,AAOI,+DAAA,xDAAC0X,iDAAS1X,KAAKlJ;;6BACFA,EAAE0N;;AARnB,AAAA,WAAA,PAQYxE;AARZ,AASI,OAAC0X,iDAAS1X,KAAKlJ,EAAE0N;;oBADJ1N,EAAE0N;;;6BAAF1N;;6BAAAA,EAAE0N;;;;;;;;;;AARnB,AAAA,AAAA,uDAAA,vDAASytD;;6BAUYn7D;;AAVrB,AAAA,WAAA,PAUgBkJ;AAVhB,AAWI,OAACkY,qDAAalY,KAAKlJ,EAAE,AAAC6gB,gBAAM3X;;6BACXlJ,EAAE0N;;AAZvB,AAAA,WAAA,PAYgBxE;AAZhB,AAaI,OAACkY,qDAAalY,KAAKlJ,EAAE0N;;oBADJ1N,EAAE0N;;;6BAAF1N;;6BAAAA,EAAE0N;;;;;;;;;;AAZvB,AAAA,AAAA,yEAAA,zEAASytD,oFAiDCjyD;;AAjDV,AAAA,eAAA,XAiDUA;AAjDV,AAiDgBkE;;;AAjDhB,AAAA,AAAA,6EAAA,7EAAS+tD,wFA+BEjyD;;AA\/BX,AAAA,eAAA,XA+BWA;AA\/BX,AAgCI,GAAI,cAAA,bAAMmW;AACR,oDAAA,5CAAK,AAACwB,gBAAM,AAACrd,eAAK0F;;AAClBmW;;;;AAlCN,AAAA,AAAA,yEAAA,zEAAS87C,oFA8CCjyD;;AA9CV,AAAA,eAAA,XA8CUA;AA9CV,AA8CgB,IAAAwP,kBAAqCwjB;AAArC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,4BAAcxP,5BAAKyU;AAAnB,AAAA,gBAAAjF,hBAAqCwjB;;AAArCxjB;;;;AA9ChB,AAAA,AAAA,2EAAA,3EAASyiD,sFAqCEjyD,KAAKgF;;AArChB,AAAA,eAAA,XAqCWhF;AArCX,AAqCuB,OAACyY,2BAAiBzY,SAAKgF;;;AArC9C,AAAA,AAAA,yFAAA,zFAASitD,oGA2CEjyD;;AA3CX,AAAA,eAAA,XA2CWA;AA3CX,AA2CiB,OAAC2Z,oBAAU,AAAShB,qBAAMzU;;;AA3C3C,AAAA,AAAA,6EAAA,7EAAS+tD,wFAwDGjyD,KAAKnK;;AAxDjB,AAAA,eAAA,XAwDYmK;AAxDZ,AAwDoB,OAACukB,mDAAW1uB,EAAEmK;;;AAxDlC,AAAA,AAAA,6EAAA,7EAASiyD,wFAyDGjyD,KAAKnK,EAAE2O;;AAzDnB,AAAA,eAAA,XAyDYxE;AAzDZ,AAyD0B,OAAC0kB,mDAAW7uB,EAAE2O,MAAMxE;;;AAzD9C,AAAA,AAAA,yEAAA,zEAASiyD,oFAoBExzD;;AApBX,AAAA,gBAAA,ZAoBWA;AApBX,AAoBiB,OAAC8e,eAAKy0C;;;AApBvB,AAAA,AAAA,wEAAA,xEAASC,mFAqBCxzD;;AArBV,AAAA,gBAAA,ZAqBUA;AArBV,AAsBI,IAAMhF,IAAE,AAACY,gBAAM23D;IACTG,aAAW,AAACJ,4BAAkB,EAAI5rD,yBAAW,AAAS1M,QAAG,AAAQA,QACnC,AAACa,eAAK03D,cACN7rD;AAHpC,AAIE,GAAA,EAAQ,eAAA,dAAMgsD;AACZ,YAAAF,+BAAA,2DAAA,tDAA2BE,WAAWhsD,wBAAW,cAAA,bAAKgQ;;AADxD;;;;AA1BN,AAAA,AAAA,2EAAA,3EAAS87C,sFAgBAxzD;;AAhBT,AAAA,gBAAA,ZAgBSA;AAhBT,AAgBeA;;;AAhBf,AAAA,AAAA,kFAAA,lFAASwzD,6FAoDMjyD,KAAKkE;;AApDpB,AAAA,eAAA,XAoDelE;AApDf,AAqDI,YAAAiyD,+BAAuB\/tD,SAAK8tD,aAAM7rD,wBAAWgQ,WAAI6c;;;AArDrD,AAAA,AAAA,+EAAA,\/EAASi\/B,0FAwCCjyD,KAAKX;;AAxCf,AAAA,eAAA,XAwCUW;AAxCV,AAwCkB,OAAC0Y,eAAKrZ,EAAEW;;;AAxC1B,AAAA,0CAAA,1CAASiyD;AAAT,AAAA,0FAAA,0DAAA,0DAAA,oBAAA,sEAAA,2CAAA,oDAAA,wEAAA,uDAAA,oBAAA,8DAAA,2CAAA,0DAAA;;;AAAA,AAAA,gDAAA,hDAASA;;AAAT,AAAA,mDAAA,nDAASA;;AAAT,AAAA,wDAAA,WAAAvmD,mBAAAC,qBAAAC,3GAASqmD;AAAT,AAAA,OAAAtrD,iBAAAgF,qBAAA;;;AAAA,sCAAA,tCAASumD,oFAAsBhuD,KAAK8tD,MAAe7rD,iBAAWgQ,IAAc6c;AAA5E,AAAA,YAAAi\/B,+BAA+B\/tD,KAAK8tD,MAAe7rD,iBAAWgQ,IAAc6c;;;AAAnEi\/B,AA2DT,CAAA,yCAAA\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\/BAAOs9D,sEAAoB3d,KAAKx\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\/C,EAAE+O;;;AA5B\/B,AAAA,AAAA,6CAAA,7CAAS8tD,wDAWaI;;AAXtB,AAAA,WAAA,PAWiBzd;AAXjB,AAYI,OAAC0d,4BAAkBlrD,WAAIpL,WAAIm2D,YAAKE;;;AAZpC,AAAA,AAAA,kEAAA,lEAASJ,6EAsFGrd,KAAKp2C;;AAtFjB,AAAA,eAAA,XAsFYo2C;AAtFZ,AAsFoB,uDAAA,hDAAMA,8CAAKp2C;;;AAtF\/B,AAAA,AAAA,kEAAA,lEAASyzD,6EAuFGrd,KAAKp2C,EAAE2B;;AAvFnB,AAAA,eAAA,XAuFYy0C;AAvFZ,AAuF8B,OAAMA,8CAAKp2C,EAAE2B;;;AAvF3C,AAAA,AAAA,gEAAA,hEAAS8xD,2EA2EArd,KAAKj2C;;AA3Ed,AAAA,eAAA,XA2ESi2C;AA3ET,AA4EI,GAAM,OAAA,NAAIj2C;AAAKyI;;AAAf,GACM,OAAA,NAAIzI;AAAK3C;;AADf,AAAA;;;;;;AA5EJ,AAAA,AAAA,gEAAA,hEAASi2D,2EAgFArd,KAAKj2C,EAAEwB;;AAhFhB,AAAA,eAAA,XAgFSy0C;AAhFT,AAiFI,GAAM,OAAA,NAAIj2C;AAAKyI;;AAAf,GACM,OAAA,NAAIzI;AAAK3C;;AADf,AAEemE;;;;;;AAnFnB,AAAA,AAAA,mEAAA,nEAAS8xD,8EA8FIrd,KAAKj2C,EAAE4C;;AA9FpB,AAAA,eAAA,XA8FaqzC;AA9Fb,AA+FI,OAAA,mFAAWxtC,WAAIpL,2DAAK2C,EAAE4C;;;AA\/F1B,AAAA,AAAA,8DAAA,9DAAS0wD,yEAkDCrd;;AAlDV,AAAA,eAAA,XAkDUA;AAlDV,AAAA;;;AAAA,AAAA,AAAA,kEAAA,lEAASqd,6EAwEErd;;AAxEX,AAAA,eAAA,XAwEWA;AAxEX,AAAA;;;AAAA,AAAA,AAAA,iEAAA,jEAASqd,4EAwCArd;;AAxCT,AAAA,eAAA,XAwCSA;AAxCT,AAwCextC;;;AAxCf,AAAA,AAAA,iEAAA,jEAAS6qD,4EAyCArd;;AAzCT,AAAA,eAAA,XAyCSA;AAzCT,AAyCe54C;;;AAzCf,AAAA,AAAA,+DAAA,\/DAASi2D,0EAyDCrd;;AAzDV,AAAA,eAAA,XAyDUA;AAzDV,AAyDgB54C;;;AAzDhB,AAAA,AAAA,8DAAA,9DAASi2D,yEA2DArd;;AA3DT,AAAA,eAAA,XA2DSA;AA3DT,AAAA,0FA2DgBxtC;;;AA3DhB,AAAA,AAAA,8DAAA,9DAAS6qD,yEA4CC1yD;;AA5CV,AAAA,eAAA,XA4CUA;AA5CV,AA4CgB,IAAAwP,kBAAqCwjB;AAArC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,4BAAcxP,5BAAKyU;AAAnB,AAAA,gBAAAjF,hBAAqCwjB;;AAArCxjB;;;;AA5ChB,AAAA,AAAA,gEAAA,hEAASkjD,2EA+CE1yD,KAAKgF;;AA\/ChB,AAAA,eAAA,XA+CWhF;AA\/CX,AA+CuB,OAACyY,2BAAiBzY,SAAKgF;;;AA\/C9C,AAAA,AAAA,8EAAA,9EAAS0tD,yFAiEErd;;AAjEX,AAAA,eAAA,XAiEWA;AAjEX,AAAA;;;AAAA,AAAA,AAAA,kEAAA,lEAASqd,6EAkGGrd,KAAKx\/C;;AAlGjB,AAAA,eAAA,XAkGYw\/C;AAlGZ,AAmGI,OAACiK,kDAAUjK,SAAKx\/C;;;AAnGpB,AAAA,AAAA,kEAAA,lEAAS68D,6EAqGGrd,KAAKx\/C,EAAE2O;;AArGnB,AAAA,eAAA,XAqGY6wC;AArGZ,AAsGI,OAACsM,kDAAUtM,SAAKx\/C,EAAE2O;;;AAtGtB,AAAA,AAAA,sEAAA,tEAASkuD,iFA0FErd,KAAKp2C,EAAE+C;;AA1FlB,AAAA,eAAA,XA0FWqzC;AA1FX,AA2FI,qDAAA,9CAAC\/4B,iIAAOzU,WAAIpL,mBAAKwC,EAAE+C;;;AA3FvB,AAAA,AAAA,gEAAA,hEAAS0wD,2EAqEArd;;AArET,AAAA,eAAA,XAqESA;AArET,AAqEe,IAAA16B,kBAAM9S;AAAN,AAAA,OAAAvH,gBAAA,iBAAAqa,sBAAUle;uBAnqKrB,AAAAkc,vBAmqKW,AAAA,OAAArY,qCAAAqa;KAAAA;;;AArEf,AAAA,AAAA,uEAAA,vEAAS+3C,kFAqDMrd,KAAKnxC;;AArDpB,AAAA,eAAA,XAqDemxC;AArDf,AAsDI,2BAAA,pBAAC17B,uGAAW9R,WAAIpL,mBAAKyH;;;AAtDzB,AAAA,AAAA,oEAAA,pEAASwuD,+EA8DCrd,KAAKh2C;;AA9Df,AAAA,eAAA,XA8DUg2C;AA9DV,AAAA,0FA8DmBxtC,WAAIpL,WAAI4C;;;AA9D3B,AAAA,AAAA,qCAAA,rCAASqzD;;6BAAT5jD,OAyGiB7P;;AAzGjB,AAAA,IAAA6P,aAAA;AAAA,AAAA,WAAAA,PAyGYumC;AAzGZ,AA0GI,OAASA,4CAAKp2C;;6BA1GlB6P,OA4GiB7P,EAAE2B;;AA5GnB,AAAA,IAAAkO,aAAA;AAAA,AAAA,WAAAA,PA4GYumC;AA5GZ,AA6GI,OAASA,4CAAKp2C,EAAE2B;;oBA7GpBkO,OA4GiB7P,EAAE2B;;;6BA5GnBkO,OA4GiB7P;;6BA5GjB6P,OA4GiB7P,EAAE2B;;;;;;;;;;AA5GnB,AAAA,AAAA,sCAAA,WAAAkO,OAAA4kD,xDAAShB;;AAAT,AAAA,IAAA5jD,aAAA;AAAA,AAAA,OAAA,AAAAA,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAA9T,iBAAA04D;;;AAAA,AAAA,AAAA,8DAAA,9DAAShB,yEAyGQzzD;;AAzGjB,AAAA,WAAA,PAyGYo2C;AAzGZ,AA0GI,OAASA,4CAAKp2C;;;AA1GlB,AAAA,AAAA,8DAAA,9DAASyzD,yEA4GQzzD,EAAE2B;;AA5GnB,AAAA,WAAA,PA4GYy0C;AA5GZ,AA6GI,OAASA,4CAAKp2C,EAAE2B;;;AA7GpB,AAAA,+BAAA,\/BAAS8xD;AAAT,AAAA,0FAAA,sDAAA,uDAAA,yDAAA,2DAAA,oBAAA,8DAAA,2CAAA,0DAAA;;;AAAA,AAAA,qCAAA,rCAASA;;AAAT,AAAA,wCAAA,xCAASA;;AAAT,AAAA,6CAAA,WAAAhnD,mBAAAC,qBAAAC,hGAAS8mD;AAAT,AAAA,OAAA\/rD,iBAAAgF,qBAAA;;;AAAA,2BAAA,3BAASgoD,8DAAW9rD,IAAIpL,IAAIm2D,KAAKJ,MAAgBx\/B;AAAjD,AAAA,YAAA0\/B,oBAAoB7qD,IAAIpL,IAAIm2D,KAAKJ,MAAgBx\/B;;;AAAxC0\/B,AA+GT,CAAA,8BAAAx5D,yBAAA,vDAAcw5D;AAAd,AAAA,IAAA55C,qBAAA;AAAA,AAAA,OAAA9E,uBAAA8E;;AAEA,AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,0CAAA,1CAAS25C;;6BAyEY37D;;AAzErB,AAAA,WAAA,PAyEgBkJ;AAzEhB,AA0EI,OAACkY,qDAAalY,KAAKlJ,EAAE,AAAC6gB,gBAAM3X;;6BACXlJ,EAAE0N;;AA3EvB,AAAA,WAAA,PA2EgBxE;AA3EhB,AA4EI,OAACkY,qDAAalY,KAAKlJ,EAAE0N;;oBADJ1N,EAAE0N;;;6BAAF1N;;6BAAAA,EAAE0N;;;;;;;;;;AA3EvB,AAAA,AAAA,sCAAA,tCAASiuD;;6BAqEQ37D;;AArEjB,AAAA,WAAA,PAqEYkJ;AArEZ,AAsEI,+DAAA,xDAAC0X,iDAAS1X,KAAKlJ;;6BACFA,EAAE0N;;AAvEnB,AAAA,WAAA,PAuEYxE;AAvEZ,AAwEI,OAAC0X,iDAAS1X,KAAKlJ,EAAE0N;;oBADJ1N,EAAE0N;;;6BAAF1N;;6BAAAA,EAAE0N;;;;;;;;;;AAvEnB,AAAA,AAAA,wCAAA,xCAASiuD,mDAKUF;;AALnB,AAAA,WAAA,PAKcld;AALd,AAMI,YAAAod,wDAAA,tCAAU5qD,WAAIpL,WAAIm2D,YAAKL;;;AAN3B,AAAA,AAAA,qCAAA,rCAASE;;AAAT,AAAA,WAAA,PAiBWpd;AAjBX,AAkBI,MAAO,KAAA3\/C,MAAA;;;AAlBX,AAAA,AAAA,sCAAA,tCAAS+8D;;AAAT,AAAA,WAAA,PAcYpd;AAdZ,AAeI,YAAAqd,mEAAA,\/CAAY7qD,WAAIpL,WAAIm2D,YAAKJ;;;AAf7B,AAAA,AAAA,uCAAA,vCAASC,kDAESF;;AAFlB,AAAA,WAAA,PAEald;AAFb,AAGI,YAAAod,yDAAA,vCAAU5qD,WAAIpL,WAAI81D,IAAIC;;;AAH1B,AAAA,AAAA,sCAAA,tCAASC,iDA+DQ5qD,QAAIpL,QAAIm2D,SAAKJ;;AA\/D9B,AAAA,WAAA,PA+DYnd;AA\/DZ,AAgEI,YAAAod,qDAAA,nCAAU5qD,QAAIpL,QAAIm2D,SAAKJ;;;AAhE3B,AAAA,AAAA,2CAAA,3CAASC,sDAoBalW;;AApBtB,AAAA,WAAA,PAoBiBlH;AApBjB,AAqBI,GACE,wBAAWod,vBAAQG;AACnB,YAAAH,8IAAA,5HAAU5qD,WAAIpL,WACJ,AAAUm2D,sBACV,KAAAF,oEAAA,hDAAY,AAAOnW,WAAQ,AAAOA,WAAQiW,aAAM,AAASjW;;AAJrE,GAOE,yBAAWkW,xBAAQD;AACnB,YAAAC,8NAAA,5MAAU,AAAOD,iBAAO,AAAOA,iBACrB,KAAAE,wEAAA,pDAAY7qD,WAAIpL,WAAIm2D,YAAK,AAAQJ,yBACjC,KAAAE,0EAAA,tDAAY,AAAOnW,WAAQ,AAAOA,WACtB,AAASiW,mBACT,AAASjW;;AAZjC,AAiBE,YAAAmW,4DAAA,xCAAY,AAAOnW,WAAQ,AAAOA,WAAQlH,KAAK,AAASkH;;;;;;AAtC9D,AAAA,AAAA,4CAAA,5CAASkW,uDAwCclW;;AAxCvB,AAAA,WAAA,PAwCkBlH;AAxClB,AAyCI,GACE,yBAAWod,xBAAQD;AACnB,YAAAC,6IAAA,3HAAU5qD,WAAIpL,WACJ,KAAAi2D,kEAAA,9CAAY,AAAOnW,WAAQ,AAAOA,WACtB,AAAQA,YACRqW,mBAEZ,AAAUJ;;AAPtB,GAUE,wBAAWC,vBAAQG;AACnB,YAAAH,0NAAA,xMAAU,AAAOG,gBAAM,AAAOA,gBACpB,KAAAF,uEAAA,nDAAY,AAAOnW,WAAQ,AAAOA,WACtB,AAAQA,YACR,AAAQqW,wBAEpB,KAAAF,yEAAA,rDAAY7qD,WAAIpL,WAAI,AAASm2D,kBAAMJ;;AAhB\/C,AAoBE,YAAAE,2DAAA,vCAAY,AAAOnW,WAAQ,AAAOA,WAAQ,AAAQA,YAAQlH;;;;;;AA7DhE,AAAA,AAAA,0CAAA,1CAASod,qDAQYK;;AARrB,AAAA,WAAA,PAQgBzd;AARhB,AASI,YAAAod,yDAAA,vCAAU5qD,WAAIpL,WAAIq2D,IAAIN;;;AAT1B,AAAA,AAAA,wCAAA,xCAASC,mDAkEU58D,EAAE+O;;AAlErB,AAAA,WAAA,PAkEcywC;AAlEd,AAmEI,OAAC2d,6BAAmB3d,KAAKx\/C,EAAE+O;;;AAnE\/B,AAAA,AAAA,2CAAA,3CAAS6tD,sDAWaK;;AAXtB,AAAA,WAAA,PAWiBzd;AAXjB,AAYI,YAAAod,wDAAA,tCAAU5qD,WAAIpL,WAAIm2D,YAAKE;;;AAZ3B,AAAA,AAAA,gEAAA,hEAASL,2EA6HGpd,KAAKp2C;;AA7HjB,AAAA,eAAA,XA6HYo2C;AA7HZ,AA6HoB,uDAAA,hDAAMA,8CAAKp2C;;;AA7H\/B,AAAA,AAAA,gEAAA,hEAASwzD,2EA8HGpd,KAAKp2C,EAAE2B;;AA9HnB,AAAA,eAAA,XA8HYy0C;AA9HZ,AA8H8B,OAAMA,8CAAKp2C,EAAE2B;;;AA9H3C,AAAA,AAAA,8DAAA,9DAAS6xD,yEAkHApd,KAAKj2C;;AAlHd,AAAA,eAAA,XAkHSi2C;AAlHT,AAmHI,GAAM,OAAA,NAAIj2C;AAAKyI;;AAAf,GACM,OAAA,NAAIzI;AAAK3C;;AADf,AAAA;;;;;;AAnHJ,AAAA,AAAA,8DAAA,9DAASg2D,yEAuHApd,KAAKj2C,EAAEwB;;AAvHhB,AAAA,eAAA,XAuHSy0C;AAvHT,AAwHI,GAAM,OAAA,NAAIj2C;AAAKyI;;AAAf,GACM,OAAA,NAAIzI;AAAK3C;;AADf,AAEemE;;;;;;AA1HnB,AAAA,AAAA,iEAAA,jEAAS6xD,4EAqIIpd,KAAKj2C,EAAE4C;;AArIpB,AAAA,eAAA,XAqIaqzC;AArIb,AAsII,OAAA,mFAAWxtC,WAAIpL,2DAAK2C,EAAE4C;;;AAtI1B,AAAA,AAAA,4DAAA,5DAASywD,uEAyFCpd;;AAzFV,AAAA,eAAA,XAyFUA;AAzFV,AAAA;;;AAAA,AAAA,AAAA,gEAAA,hEAASod,2EA+GEpd;;AA\/GX,AAAA,eAAA,XA+GWA;AA\/GX,AAAA;;;AAAA,AAAA,AAAA,+DAAA,\/DAASod,0EA+EApd;;AA\/ET,AAAA,eAAA,XA+ESA;AA\/ET,AA+EextC;;;AA\/Ef,AAAA,AAAA,+DAAA,\/DAAS4qD,0EAgFApd;;AAhFT,AAAA,eAAA,XAgFSA;AAhFT,AAgFe54C;;;AAhFf,AAAA,AAAA,6DAAA,7DAASg2D,wEAgGCpd;;AAhGV,AAAA,eAAA,XAgGUA;AAhGV,AAgGgB54C;;;AAhGhB,AAAA,AAAA,4DAAA,5DAASg2D,uEAkGApd;;AAlGT,AAAA,eAAA,XAkGSA;AAlGT,AAAA,0FAkGgBxtC;;;AAlGhB,AAAA,AAAA,4DAAA,5DAAS4qD,uEAmFCzyD;;AAnFV,AAAA,eAAA,XAmFUA;AAnFV,AAmFgB,IAAAwP,kBAAqCwjB;AAArC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,4BAAcxP,5BAAKyU;AAAnB,AAAA,gBAAAjF,hBAAqCwjB;;AAArCxjB;;;;AAnFhB,AAAA,AAAA,8DAAA,9DAASijD,yEAsFEzyD,KAAKgF;;AAtFhB,AAAA,eAAA,XAsFWhF;AAtFX,AAsFuB,OAACyY,2BAAiBzY,SAAKgF;;;AAtF9C,AAAA,AAAA,4EAAA,5EAASytD,uFAwGEpd;;AAxGX,AAAA,eAAA,XAwGWA;AAxGX,AAAA;;;AAAA,AAAA,AAAA,gEAAA,hEAASod,2EAyIGpd,KAAKx\/C;;AAzIjB,AAAA,eAAA,XAyIYw\/C;AAzIZ,AA0II,OAACiK,kDAAUjK,SAAKx\/C;;;AA1IpB,AAAA,AAAA,gEAAA,hEAAS48D,2EA4IGpd,KAAKx\/C,EAAE2O;;AA5InB,AAAA,eAAA,XA4IY6wC;AA5IZ,AA6II,OAACsM,kDAAUtM,SAAKx\/C,EAAE2O;;;AA7ItB,AAAA,AAAA,oEAAA,pEAASiuD,+EAiIEpd,KAAKp2C,EAAE+C;;AAjIlB,AAAA,eAAA,XAiIWqzC;AAjIX,AAkII,qDAAA,9CAAC\/4B,iIAAOzU,WAAIpL,mBAAKwC,EAAE+C;;;AAlIvB,AAAA,AAAA,8DAAA,9DAASywD,yEA4GApd;;AA5GT,AAAA,eAAA,XA4GSA;AA5GT,AA4Ge,IAAA16B,kBAAM9S;AAAN,AAAA,OAAAvH,gBAAA,iBAAAqa,sBAAUle;uBA3zKrB,AAAAkc,vBA2zKW,AAAA,OAAArY,qCAAAqa;KAAAA;;;AA5Gf,AAAA,AAAA,qEAAA,rEAAS83C,gFA4FMpd,KAAKnxC;;AA5FpB,AAAA,eAAA,XA4FemxC;AA5Ff,AA6FI,2BAAA,pBAAC17B,uGAAW9R,WAAIpL,mBAAKyH;;;AA7FzB,AAAA,AAAA,kEAAA,lEAASuuD,6EAqGCpd,KAAKh2C;;AArGf,AAAA,eAAA,XAqGUg2C;AArGV,AAAA,0FAqGmBxtC,WAAIpL,WAAI4C;;;AArG3B,AAAA,AAAA,mCAAA,nCAASozD;;6BAAT3jD,OAgJiB7P;;AAhJjB,AAAA,IAAA6P,aAAA;AAAA,AAAA,WAAAA,PAgJYumC;AAhJZ,AAiJI,OAASA,4CAAKp2C;;6BAjJlB6P,OAmJiB7P,EAAE2B;;AAnJnB,AAAA,IAAAkO,aAAA;AAAA,AAAA,WAAAA,PAmJYumC;AAnJZ,AAoJI,OAASA,4CAAKp2C,EAAE2B;;oBApJpBkO,OAmJiB7P,EAAE2B;;;6BAnJnBkO,OAmJiB7P;;6BAnJjB6P,OAmJiB7P,EAAE2B;;;;;;;;;;AAnJnB,AAAA,AAAA,oCAAA,WAAAkO,OAAA8kD,tDAASnB;;AAAT,AAAA,IAAA3jD,aAAA;AAAA,AAAA,OAAA,AAAAA,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAA9T,iBAAA44D;;;AAAA,AAAA,AAAA,4DAAA,5DAASnB,uEAgJQxzD;;AAhJjB,AAAA,WAAA,PAgJYo2C;AAhJZ,AAiJI,OAASA,4CAAKp2C;;;AAjJlB,AAAA,AAAA,4DAAA,5DAASwzD,uEAmJQxzD,EAAE2B;;AAnJnB,AAAA,WAAA,PAmJYy0C;AAnJZ,AAoJI,OAASA,4CAAKp2C,EAAE2B;;;AApJpB,AAAA,6BAAA,7BAAS6xD;AAAT,AAAA,0FAAA,sDAAA,uDAAA,yDAAA,2DAAA,oBAAA,8DAAA,2CAAA,0DAAA;;;AAAA,AAAA,mCAAA,nCAASA;;AAAT,AAAA,sCAAA,tCAASA;;AAAT,AAAA,2CAAA,WAAA\/mD,mBAAAC,qBAAAC,9FAAS6mD;AAAT,AAAA,OAAA9rD,iBAAAgF,qBAAA;;;AAAA,yBAAA,zBAASkoD,0DAAShsD,IAAIpL,IAAIm2D,KAAKJ,MAAgBx\/B;AAA\/C,AAAA,YAAAy\/B,kBAAkB5qD,IAAIpL,IAAIm2D,KAAKJ,MAAgBx\/B;;;AAAtCy\/B,AAsJT,CAAA,4BAAAv5D,yBAAA,rDAAcu5D;AAAd,AAAA,IAAA35C,qBAAA;AAAA,AAAA,OAAA9E,uBAAA8E;;AAEA,yBAAA,zBAAOg7C,0DAAcjxC,KAAKwvC,KAAKpzD,EAAE+C,EAAEqqD;AAAnC,AACE,GAAI,SAAA,RAAMgG;AACR,YAAAI,sBAAA,KAAA,KAAA,dAAUxzD,EAAE+C;;AACZ,IAAMrD,IAAE,iBAAAo1D,WAAM90D;IAAN+0D,WAAQ,AAAO3B;AAAf,AAAA,gFAAA0B,SAAAC,2BAAAD,SAAAC,rHAACnxC,qCAAAA,wDAAAA;;AAAT,AACE,GACE,OAAA,NAAOlkB;AACP,AAAI,OAAA,NAAM0tD,aAAQgG;;AAAlB;;AAFF,GAKE,KAAA,JAAM1zD;AACN,IAAM4zD,MAAI,iBAAA0B,WAAcpxC;IAAdqxC,WAAmB,AAAQ7B;IAA3B8B,WAAiCl1D;IAAjCm1D,WAAmCpyD;IAAnCqyD,WAAqChI;AAArC,AAAA,oHAAA4H,SAAAC,SAAAC,SAAAC,SAAAC,6CAAAJ,SAAAC,SAAAC,SAAAC,SAAAC,jOAACP,uDAAAA,qGAAAA;;AAAX,AACE,GAAA,EAAQ,QAAA,PAAMvB;AACZ,OAAWF,cAAKE;;AADlB;;;AAPJ,AAWE,IAAMA,MAAI,iBAAA+B,WAAczxC;IAAd0xC,WAAmB,AAASlC;IAA5BmC,WAAkCv1D;IAAlCw1D,WAAoCzyD;IAApC0yD,WAAsCrI;AAAtC,AAAA,oHAAAiI,SAAAC,SAAAC,SAAAC,SAAAC,6CAAAJ,SAAAC,SAAAC,SAAAC,SAAAC,jOAACZ,uDAAAA,qGAAAA;;AAAX,AACE,GAAA,EAAQ,QAAA,PAAMvB;AACZ,OAAYF,eAAKE;;AADnB;;;;;;;AAGV,4BAAA,5BAAOoC,gEAAiB\/B,KAAKJ;AAA7B,AACE,GACE,SAAA,RAAMI;AACNJ;;AAFF,GAIE,UAAA,TAAMA;AACNI;;AALF,GAOE,iBAAWH,hBAAQG;AACnB,GAAI,kBAAWH,jBAAQD;AACrB,IAAMoC,MAAI,iBAAAC,WAAiB,AAASjC;IAA1BkC,WAAgC,AAAQtC;AAAxC,AAAA,0HAAAqC,SAAAC,gDAAAD,SAAAC,pLAACH,0DAAAA,6EAAAA;;AAAX,AACE,GAAI,gBAAWlC,fAAQmC;AACrB,YAAAnC,6KAAA,3JAAU,AAAOmC,QAAK,AAAOA,QACnB,KAAAnC,uDAAA,rCAAU,AAAOG,SAAM,AAAOA,SACpB,AAAQA,UACR,AAAQgC,gBAElB,KAAAnC,4DAAA,1CAAU,AAAOD,UAAO,AAAOA,UACrB,AAASoC,UACT,AAASpC;;AAG7B,YAAAC,gHAAA,9FAAU,AAAOG,SAAM,AAAOA,SACpB,AAAQA,UACR,KAAAH,sDAAA,pCAAU,AAAOD,UAAO,AAAOA,UAAOoC,IAAI,AAASpC;;;AAEjE,YAAAC,kBAAU,AAAOG,SAAM,AAAOA,SACpB,AAAQA,UACR,iBAAAmC,WAAiB,AAASnC;IAA1BoC,WAAgCxC;AAAhC,AAAA,0HAAAuC,SAAAC,gDAAAD,SAAAC,pLAACL,0DAAAA,6EAAAA;KAFX;;;AAzBJ,GA8BE,kBAAWlC,jBAAQD;AACnB,YAAAC,kBAAU,AAAOD,UAAO,AAAOA,UACrB,iBAAAyC,WAAiBrC;IAAjBsC,WAAsB,AAAQ1C;AAA9B,AAAA,0HAAAyC,SAAAC,gDAAAD,SAAAC,pLAACP,0DAAAA,6EAAAA;iBADX,ZAEU,AAASnC;;AAjCrB,AAqCE,IAAMoC,MAAI,iBAAAO,WAAiB,AAASvC;IAA1BwC,WAAgC,AAAQ5C;AAAxC,AAAA,0HAAA2C,SAAAC,gDAAAD,SAAAC,pLAACT,0DAAAA,6EAAAA;;AAAX,AACE,GAAI,gBAAWlC,fAAQmC;AACrB,YAAAnC,iLAAA,\/JAAU,AAAOmC,QAAK,AAAOA,QACnB,KAAAlC,yDAAA,rCAAY,AAAOE,SAAM,AAAOA,SACpB,AAAQA,UACR,AAAQgC,gBAEpB,KAAAlC,8DAAA,1CAAY,AAAOF,UAAO,AAAOA,UACrB,AAASoC,UACT,AAASpC;;AAG\/B,OAACK,2BAAiB,AAAOD,SAAM,AAAOA,SACpB,AAAQA,UACR,KAAAF,wDAAA,pCAAY,AAAOF,UAAO,AAAOA,UACrBoC,IACA,AAASpC;;;;;;;;AAG\/C,4BAAA,5BAAO6C,gEAAiBxyC,KAAKwvC,KAAKpzD,EAAEotD;AAApC,AACE,GAAA,EAAQ,SAAA,RAAMgG;AACZ,IAAM1zD,IAAE,iBAAA22D,WAAMr2D;IAANs2D,WAAQ,AAAOlD;AAAf,AAAA,gFAAAiD,SAAAC,2BAAAD,SAAAC,rHAAC1yC,qCAAAA,wDAAAA;;AAAT,AACE,GACE,OAAA,NAAOlkB;AACP,AAAI,OAAA,NAAM0tD,aAAQgG;;AACd,OAACsC,0BAAgB,AAAQtC,UAAM,AAASA;;AAH9C,GAKE,KAAA,JAAM1zD;AACN,IAAMm0D,MAAI,iBAAA0C,WAAiB3yC;IAAjB4yC,WAAsB,AAAQpD;IAA9BqD,WAAoCz2D;IAApC02D,WAAsCtJ;AAAtC,AAAA,0HAAAmJ,SAAAC,SAAAC,SAAAC,gDAAAH,SAAAC,SAAAC,SAAAC,xNAACN,0DAAAA,+FAAAA;;AAAX,AACE,GAAI,CAAI,EAAK,QAAA,PAAMvC,mBAAM,EAAK,iBAAA,hBAAM,OAAA,NAAMzG;AACxC,GAAI,sBAAWqG,rBAAU,AAAQL;AAC\/B,OAACQ,2BAAiB,AAAOR,SAAM,AAAOA,SAAMS,IAAI,AAAST;;AACzD,YAAAI,mDAAA,jCAAU,AAAOJ,SAAM,AAAOA,SAAMS,IAAI,AAAST;;;AAHrD;;;AAPJ,AAaE,IAAMS,MAAI,iBAAA8C,WAAiB\/yC;IAAjBgzC,WAAsB,AAASxD;IAA\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\/FR,AAAA,AAAA,+EAAA,\/EAAS+1D,0FAiEM32D,KAAKnK,EAAE+O;;AAjEtB,AAAA,eAAA,XAiEe5E;AAjEf,AAkEI,GAAA,EAAQ,gBAAA,fAAMqyD;AACZ,OAACW,6BAAmBX,YAAKx8D,EAAE+O;;AAC3BA;;;;AApEN,AAAA,AAAA,sEAAA,tEAAS+xD,iFAqCC32D;;AArCV,AAAA,eAAA,XAqCUA;AArCV,AAqCgBkE;;;AArChB,AAAA,AAAA,4EAAA,5EAASyyD,uFA+BElhE;;AA\/BX,AAAA,YAAA,RA+BWA;AA\/BX,AA+Bc,YAAAkhE,4BAAoB9zC,YAAKwvC,YAAKl8C,WAAIjS,YAAK8uB;;;AA\/BrD,AAAA,AAAA,0EAAA,1EAAS2jC,qFA8DE32D;;AA9DX,AAAA,eAAA,XA8DWA;AA9DX,AA8DiBmW;;;AA9DjB,AAAA,AAAA,4EAAA,5EAASwgD,uFAmFC32D;;AAnFV,AAAA,eAAA,XAmFUA;AAnFV,AAoFI,GAAI,cAAA,bAAMmW;AACR,iDAAA,1CAACi8C,8BAAoBC,kBAAWl8C;;AADlC;;;;AApFJ,AAAA,AAAA,sEAAA,tEAASwgD,iFA2DC32D;;AA3DV,AAAA,eAAA,XA2DUA;AA3DV,AA2DgB,IAAAwP,kBAAuCwjB;AAAvC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,8BAAcxP,9BAAK4U;AAAnB,AAAA,gBAAApF,hBAAuCwjB;;AAAvCxjB;;;;AA3DhB,AAAA,AAAA,wEAAA,xEAASmnD,mFAwDE32D,KAAKgF;;AAxDhB,AAAA,eAAA,XAwDWhF;AAxDX,AAwDuB,OAAC4lD,oBAAU5lD,SAAKgF;;;AAxDvC,AAAA,AAAA,sFAAA,tFAAS2xD,iGAqDE32D;;AArDX,AAAA,eAAA,XAqDWA;AArDX,AAqDiB,YAAA22D,wCAAA,KAAA,gBAAA,jCAAoB9zC,qBAAW3e;;;AArDhD,AAAA,AAAA,uEAAA,vEAASyyD,kFAgHG32D,KAAKf;;AAhHjB,AAAA,eAAA,XAgHYe;AAhHZ,AAiHI,IAAMqsD,QAAM,CAAA;IACN5yD,IAAM,AAAC47D,0BAAgBxyC,YAAKwvC,YAAKpzD,EAAEotD;AADzC,AAEE,GAAI,MAAA,LAAM5yD;AACR,GAAI,2DAAA,1DAAM,kDAAA,lDAAC8oB,4CAAI8pC;AACbrsD;;AACA,YAAA22D,wCAAA,KAAA,gBAAA,jCAAoB9zC,qBAAW3e;;;AACjC,YAAAyyD,mFAAA,vDAAoB9zC,YAAK,AAAUppB,YAAG,cAAA,bAAK0c,kBAAKjS;;;;AAvHxD,AAAA,AAAA,8EAAA,9EAASyyD,yFAkGE32D,KAAKf,EAAE+C;;AAlGlB,AAAA,eAAA,XAkGWhC;AAlGX,AAmGI,IAAMqsD,QAAM,CAAA;IACN5yD,IAAM,AAACq6D,uBAAajxC,YAAKwvC,YAAKpzD,EAAE+C,EAAEqqD;AADxC,AAEE,GAAI,MAAA,LAAM5yD;AACR,IAAM49D,aAAW,kDAAA,lDAAC90C,4CAAI8pC;AAAtB,AACE,GAAI,AAACx4C,6CAAE7R,EAAE,AAAOq1D;AACdr3D;;AACA,YAAA22D,uHAAA,3FAAoB9zC,YAAK,AAACmzC,2BAAiBnzC,YAAKwvC,YAAKpzD,EAAE+C,GAAGmU,WAAIjS;;;AAClE,YAAAyyD,mFAAA,vDAAoB9zC,YAAK,AAAUppB,YAAG,cAAA,bAAK0c,kBAAKjS;;;;AA1GxD,AAAA,AAAA,4FAAA,5FAASyyD,uGA4GU32D,KAAKf;;AA5GxB,AAAA,eAAA,XA4GmBe;AA5GnB,AA6GI,SAAK,yBAAA,xBAAM,AAAWA,kBAAKf;;;AA7G\/B,AAAA,AAAA,wEAAA,xEAAS03D,mFA8EA32D;;AA9ET,AAAA,eAAA,XA8ESA;AA9ET,AA+EI,GAAI,cAAA,bAAMmW;AACR,iDAAA,1CAACi8C,8BAAoBC,iBAAUl8C;;AADjC;;;;AA\/EJ,AAAA,AAAA,+EAAA,\/EAASwgD,0FAkCM32D,KAAKkE;;AAlCpB,AAAA,eAAA,XAkCelE;AAlCf,AAkC0B,YAAA22D,4BAAoB9zC,YAAKwvC,YAAKl8C,WAAIjS,SAAK8uB;;;AAlCjE,AAAA,AAAA,4EAAA,5EAAS2jC,uFAwCC32D,KAAKsG;;AAxCf,AAAA,eAAA,XAwCUtG;AAxCV,AAyCI,GAAI,AAACye,wBAAQnY;AACX,OAAQtG,oDAAK,mDAAA,nDAACoW,6CAAK9P,WAAS,mDAAA,nDAAC8P,6CAAK9P;;AAClC,IAAOiS,MAAIvY;IAAK0pD,KAAG,AAACr2C,cAAI\/M;;AAAxB,AACE,GAAI,OAAA,NAAMojD;AACRnxC;;AACA,IAAM1Z,IAAE,AAACxE,gBAAMqvD;AAAf,AACE,GAAI,AAACjrC,wBAAQ5f;AACX,eAAO,AAAQ0Z,+CAAI,+CAAA,\/CAACnC,6CAAKvX,OAAK,+CAAA,\/CAACuX,6CAAKvX;eAC7B,AAACvE,eAAKovD;;;;;AACb,MAAO,KAAAh0D,MAAA;;;;;;;;AAlDrB,AAAA,AAAA,6CAAA,7CAASihE;;6BAAT7nD,OAuEiB7P;;AAvEjB,AAAA,IAAA6P,aAAA;AAAA,AAAA,WAAAA,PAuEY9O;AAvEZ,AAwEI,OAASA,4CAAKf;;6BAxElB6P,OA0EiB7P,EAAE2B;;AA1EnB,AAAA,IAAAkO,aAAA;AAAA,AAAA,WAAAA,PA0EY9O;AA1EZ,AA2EI,OAASA,4CAAKf,EAAE2B;;oBA3EpBkO,OA0EiB7P,EAAE2B;;;6BA1EnBkO,OA0EiB7P;;6BA1EjB6P,OA0EiB7P,EAAE2B;;;;;;;;;;AA1EnB,AAAA,AAAA,8CAAA,WAAAkO,OAAA4nD,hEAASC;;AAAT,AAAA,IAAA7nD,aAAA;AAAA,AAAA,OAAA,AAAAA,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAA9T,iBAAA07D;;;AAAA,AAAA,AAAA,sEAAA,tEAASC,iFAuEQ13D;;AAvEjB,AAAA,WAAA,PAuEYe;AAvEZ,AAwEI,OAASA,4CAAKf;;;AAxElB,AAAA,AAAA,sEAAA,tEAAS03D,iFA0EQ13D,EAAE2B;;AA1EnB,AAAA,WAAA,PA0EYZ;AA1EZ,AA2EI,OAASA,4CAAKf,EAAE2B;;;AA3EpB,AAAA,AAAA,8EAAA,9EAAS+1D,yFA0HO32D,KAAKmG;;AA1HrB,AAAA,eAAA,XA0HgBnG;AA1HhB,AA2HI,GAAI,cAAA,bAAMmW;AACR,OAACi8C,8BAAoBC,YAAKlsD,iBAAWgQ;;AADvC;;;;AA3HJ,AAAA,AAAA,mFAAA,nFAASwgD,8FA8HY32D,KAAKf,EAAEkH;;AA9H5B,AAAA,eAAA,XA8HqBnG;AA9HrB,AA+HI,GAAI,cAAA,bAAMmW;AACR,YAAA,RAAO67C;IAAUv4D,IAAE44D;;AAAnB,AACE,GAAA,EAAQ,MAAA,LAAM54D;AACZ,IAAMkF,IAAE,iBAAA24D,WAAMr4D;IAANs4D,WAAQ,AAAO99D;AAAf,AAAA,8FAAA69D,SAAAC,kCAAAD,SAAAC,1IAAC10C,4CAAAA,+DAAAA;;AAAT,AACE,GACE,OAAA,NAAOlkB;AAAI,YAAAszD,+BAAA,4EAAA,KAAA,5EAA2B,AAACr3C,6CAAKo3C,MAAMv4D,GAAG0M;;AADvD,oBAEEA;AAAW,GAAI,KAAA,JAAMxH;AACR,eAAO,AAACic,6CAAKo3C,MAAMv4D;eAAG,AAAQA;;;;;AAC9B,eAAOu4D;eAAe,AAASv4D;;;;;;AAJ9C,AAKa,GAAI,KAAA,JAAMkF;AACR,eAAO,AAACic,6CAAKo3C,MAAMv4D;eAAG,AAASA;;;;;AAC\/B,eAAOu4D;eAAe,AAAQv4D;;;;;;;;;AAC\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\/B,AAAA,AAAAo\/D,4CAAA;;AAAA,AAAA,AAAAA,sCAAA,WAAAC;AAAA,AAAA,OAAAD,uDAAA,AAAAtkD,cAAAukD;;;AAAA,AAaA,AAAA;;;;uBAAA,+BAAAj+D,tDAAMk+D;AAAN,AAAA,IAAAn6D,qBAAA;AAAA,AAAA,IAAA7D,0BAAA,AAAA;AAAA,AAAA,IAAAC,wBAAA;;AAAA,AAAA,GAAA,CAAAA,wBAAAD;AAAA,AAAA,AAAA6D,wBAAA,CAAA,UAAA5D;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA6D,uBAAA,EAAA,CAAA,MAAA,AAAAD,4BAAA,AAAA,KAAAxD,qBAAA,AAAAwD,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAm6D,0DAAAl6D;;;AAAA,AAAA,AAAA,AAAAk6D,4DAAA,WAGM94C;AAHN,AAIK,IAAO7R,MAAG,AAACmG,cAAI0L;IAASihC,MAAI,AAAS2W;;AAArC,AACE,GAAIzpD;AACF,eAAO,AAACgN,gBAAMhN;eAAI,AAACoP,8CAAM0jC,IAAI,AAAC3lD,gBAAM6S,KAAI,AAAC4M,iBAAO5M;;;;;AAChD8yC;;;;;;AAPT,AAAA,AAAA6X,+CAAA;;AAAA,AAAA,AAAAA,yCAAA,WAAAC;AAAA,AAAA,OAAAD,0DAAA,AAAAxkD,cAAAykD;;;AAAA,AASA,AAAA;;;;0BAAA,kCAAAn+D,5DAAMo+D;AAAN,AAAA,IAAAr6D,qBAAA;AAAA,AAAA,IAAA7D,0BAAA,AAAA;AAAA,AAAA,IAAAC,wBAAA;;AAAA,AAAA,GAAA,CAAAA,wBAAAD;AAAA,AAAA,AAAA6D,wBAAA,CAAA,UAAA5D;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA6D,uBAAA,EAAA,CAAA,MAAA,AAAAD,4BAAA,AAAA,KAAAxD,qBAAA,AAAAwD,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAq6D,6DAAA,CAAA,UAAA,MAAAp6D;;;AAAA,AAAA,AAAA,AAAAo6D,+DAAA,WAGIG,WAAan5C;AAHjB,AAIK,IAAO7R,MAAG,AAACmG,cAAI0L;IACRihC,MAAI,KAAA2W,oEAAA,KAAA,IAAA,KAAA,tDAAoB,AAACn0C,4BAAe01C;;AAD\/C,AAEE,GAAIhrD;AACF,eAAO,AAACgN,gBAAMhN;eAAI,AAACoP,8CAAM0jC,IAAI,AAAC3lD,gBAAM6S,KAAI,AAAC4M,iBAAO5M;;;;;AAChD8yC;;;;;;AART,AAAA,AAAA+X,kDAAA;;AAAA,AAAA,AAAAA,4CAAA,WAAAC;AAAA,AAAA,IAAAC,WAAA,AAAA59D,gBAAA29D;IAAAA,eAAA,AAAA19D,eAAA09D;AAAA,AAAA,OAAAD,6DAAAE,SAAAD;;;AAAA,AAUA,AAAA;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,sCAAA,tCAASG;;AAAT,AAAA,WAAA,PAEan4D;AAFb,AAGI,OAACgM,uBAAQhM;;;AAHb,AAAA,AAAA,mCAAA,nCAASm4D,8CAIMnzD;;AAJf,AAAA,YAAA,RAIUvG;AAJV,AAKI,OAAQA,2CAAKuG;;;AALjB,AAAA,AAAA,qCAAA,rCAASmzD;;6BAMQrhE;;AANjB,AAAA,WAAA,PAMYkJ;AANZ,AAOI,+DAAA,xDAAC0X,iDAAS1X,KAAKlJ;;6BACFA,EAAE0N;;AARnB,AAAA,WAAA,PAQYxE;AARZ,AASI,OAAC0X,iDAAS1X,KAAKlJ,EAAE0N;;oBADJ1N,EAAE0N;;;6BAAF1N;;6BAAAA,EAAE0N;;;;;;;;;;AARnB,AAAA,AAAA,yCAAA,zCAAS2zD;;6BAUYrhE;;AAVrB,AAAA,WAAA,PAUgBkJ;AAVhB,AAWI,OAACkY,qDAAalY,KAAKlJ,EAAE,AAAC6gB,gBAAM3X;;6BACXlJ,EAAE0N;;AAZvB,AAAA,WAAA,PAYgBxE;AAZhB,AAaI,OAACkY,qDAAalY,KAAKlJ,EAAE0N;;oBADJ1N,EAAE0N;;;6BAAF1N;;6BAAAA,EAAE0N;;;;;;;;;;AAZvB,AAAA,AAAA,2DAAA,3DAAS2zD,sEAgBCn4D;;AAhBV,AAAA,eAAA,XAgBUA;AAhBV,AAgBgBqP;;;AAhBhB,AAAA,AAAA,2DAAA,3DAAS8oD,sEAoDCn4D;;AApDV,AAAA,eAAA,XAoDUA;AApDV,AAqDI,IAAMu4D,OAAK,EAAI,EAAA,EAAA,gBAAA,QAAA,EAAA,CAAA,CAAA,kDAAA,YAAA,CAAApjE,gCAAA,gCAAA,KAAA,EAAA,EAAA,kDAAA,AAAA4C,+DAAA,QAAA,AAAAA,rCAAYqJ,uEAAAA,9TAAMi3D,2BAAAA,+FAAAA,yCAAAA,oGAAAA,uEAAAA,eACpB,AAAOA,gDACP,AAAC\/9D,eAAK+9D;AAFnB,AAGE,GAAU,SAAA,RAAME;AAAhB;;AAAA,AACE,YAAAJ,iBAASI,KAAKlpD;;;;AAzDtB,AAAA,AAAA,2DAAA,3DAAS8oD,sEAoCCn4D;;AApCV,AAAA,eAAA,XAoCUA;AApCV,AAoCgB,OAACyU,4BAAkBzU;;;AApCnC,AAAA,AAAA,6DAAA,7DAASm4D,wEA0BEn4D,KAAKgF;;AA1BhB,AAAA,eAAA,XA0BWhF;AA1BX,AA0BuB,OAACyY,2BAAiBzY,SAAKgF;;;AA1B9C,AAAA,AAAA,2EAAA,3EAASmzD,sFAiCEn4D;;AAjCX,AAAA,eAAA,XAiCWA;AAjCX,AAiCiB,OAAC2Z,oBAAU,AAAShB,qBAAMtJ;;;AAjC3C,AAAA,AAAA,+DAAA,\/DAAS8oD,0EA4DGn4D,KAAKnK;;AA5DjB,AAAA,eAAA,XA4DYmK;AA5DZ,AA4DoB,OAACukB,mDAAW1uB,EAAEmK;;;AA5DlC,AAAA,AAAA,+DAAA,\/DAASm4D,0EA6DGn4D,KAAKnK,EAAE2O;;AA7DnB,AAAA,eAAA,XA6DYxE;AA7DZ,AA6D0B,OAAC0kB,mDAAW7uB,EAAE2O,MAAMxE;;;AA7D9C,AAAA,AAAA,2DAAA,3DAASm4D,sEAuCEn4D;;AAvCX,AAAA,eAAA,XAuCWA;AAvCX,AAwCI,IAAkBs4D,KAAG,AAAQD;AAA7B,AACE,OAAMC;;;AAzCZ,AAAA,AAAA,0DAAA,1DAASH,qEA2CCn4D;;AA3CV,AAAA,eAAA,XA2CUA;AA3CV,AA4CI,IAAMu4D,OAAK,EAAI,EAAA,EAAA,gBAAA,QAAA,EAAA,CAAA,CAAA,kDAAA,YAAA,CAAApjE,gCAAA,gCAAA,KAAA,EAAA,EAAA,kDAAA,AAAA4C,+DAAA,QAAA,AAAAA,rCAAYqJ,uEAAAA,9TAAMi3D,2BAAAA,+FAAAA,yCAAAA,oGAAAA,uEAAAA,eACpB,AAAOA,gDACP,AAAC\/9D,eAAK+9D;AAFnB,AAGE,GAAA,EAAQ,SAAA,RAAME;AACZ,YAAAJ,iBAASI,KAAKlpD;;AADhB;;;;AA\/CN,AAAA,AAAA,6DAAA,7DAAS8oD,wEAsBAn4D;;AAtBT,AAAA,eAAA,XAsBSA;AAtBT,AAsBeA;;;AAtBf,AAAA,AAAA,oEAAA,pEAASm4D,+EAmBMn4D,KAAKuP;;AAnBpB,AAAA,eAAA,XAmBevP;AAnBf,AAmB8B,YAAAm4D,iBAASE,YAAK9oD;;;AAnB5C,AAAA,AAAA,iEAAA,jEAAS4oD,4EA6BCn4D,KAAKX;;AA7Bf,AAAA,eAAA,XA6BUW;AA7BV,AA8BI,OAAC0Y,eAAKrZ,EAAEW;;;AA9BZ,AAAA,4BAAA,5BAASm4D;AAAT,AAAA,0FAAA,oBAAA,yDAAA,2CAAA,oDAAA,8EAAA;;;AAAA,AAAA,kCAAA,lCAASA;;AAAT,AAAA,qCAAA,rCAASA;;AAAT,AAAA,0CAAA,WAAAzsD,mBAAAC,qBAAAC,7FAASusD;AAAT,AAAA,OAAAxxD,iBAAAgF,qBAAA;;;AAAA,wBAAA,xBAASysD,wDAAoBC,KAAKhpD;AAAlC,AAAA,YAAA8oD,iBAA6BE,KAAKhpD;;;AAAzB8oD,AA+DT,CAAA,2BAAAj\/D,yBAAA,pDAAci\/D;AAAd,AAAA,IAAAr\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\/D,yBAAA,pDAAcw\/D;AAAd,AAAA,IAAA5\/C,qBAAA;AAAA,AAAA,OAAA9E,uBAAA8E;;AAEA;;;iBAAA,jBAAMqwC,0CAEHqP;AAFH,AAGE,IAAAjmC,qBAAgB,AAAClf,cAAImlD;AAArB,AAAA,GAAAjmC;AAAA,AAAA,WAAAA,PAAW8lC;AAAX,AACE,YAAAK,sBAAA,LAASL;;AADX;;;AAGF;;;gBAAA,hBAAMxmC,wCAEH4mC;AAFH,AAGE,OAACj2D,eAAKi2D;;AAER,AAAA;;;;;kBAAA,0BAAA9+D,5CAAMi\/D;AAAN,AAAA,IAAAl7D,qBAAA;AAAA,AAAA,IAAA7D,0BAAA,AAAA;AAAA,AAAA,IAAAC,wBAAA;;AAAA,AAAA,GAAA,CAAAA,wBAAAD;AAAA,AAAA,AAAA6D,wBAAA,CAAA,UAAA5D;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA6D,uBAAA,EAAA,CAAA,MAAA,AAAAD,4BAAA,AAAA,KAAAxD,qBAAA,AAAAwD,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAk7D,qDAAAj7D;;;AAAA,AAAA,AAAA,AAAAi7D,uDAAA,WAIKE;AAJL,AAKE,oBAAM,AAAC11B,eAAKxe,mBAASk0C;AAArB,AACE,sDAAA,WAAAC,iBAAAC,3EAACC;AAAD,AAAS,OAACr+C,6CAAK,iBAAAoC,mBAAA+7C;AAAA,AAAA,oBAAA\/7C;AAAAA;;AAAA;;KAANg8C;GAAqBF;;AADhC;;;;AALF,AAAA,AAAAF,0CAAA;;AAAA,AAAA,AAAAA,oCAAA,WAAAC;AAAA,AAAA,OAAAD,qDAAA,AAAAvlD,cAAAwlD;;;AAAA,AAQA,AAAA;;;;;;uBAAA,+BAAAl\/D,tDAAMu\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\/D;QAAA,AAAA7nC,4CAAAkoC,WAAA,IAAA,\/DAASv7D;QAAT,AAAAqzB,4CAAAkoC,WAAA,IAAA,\/DAAWx4D;AAAX,AAAA,AACE,CAACnM,kCAAAA,uCAAAA,PAAEmM,mBAAAA,jBAAE\/C,mBAAAA;;AADP,eAAA,AAAA3E,eAAA6\/D;eAAA;eAAA;eAAA;;;;;;;;AAAA;;;;;;;AAjBJ,AAAA,AAAA,0EAAA,1EAASF,qFA0DGj6D,KAAKgC;;AA1DjB,AAAA,eAAA,XA0DYhC;AA1DZ,AA2DI,yDAAA,lDAASA,gDAAKgC;;;AA3DlB,AAAA,AAAA,0EAAA,1EAASi4D,qFA4DGj6D,KAAKgC,EAAEpB;;AA5DnB,AAAA,eAAA,XA4DYZ;AA5DZ,AA6DI,GAAI,AAAC8B,+BAAe02D,gBAASx2D;AAC3BA;;AACApB;;;;AA\/DN,AAAA,AAAA,6DAAAzL,7DAAS8kE;;AAAT,AAAA,AAAA,8EAAA,9EAASA,yFAwBKj6D;;AAxBd,AAAA,eAAA,XAwBcA;AAxBd,AAyBI,YAAA85D,sBAAc,AAACruD,oBAAU+sD;;;AAzB7B,AAAA,AAAA,sEAAA,tEAASyB,iFA+BCj6D;;AA\/BV,AAAA,eAAA,XA+BUA;AA\/BV,AA+BgBkE;;;AA\/BhB,AAAA,AAAA,4EAAA,5EAAS+1D,uFAqBExkE;;AArBX,AAAA,YAAA,RAqBWA;AArBX,AAqBc,YAAAwkE,4BAAoB\/1D,YAAKs0D,gBAASxlC;;;AArBhD,AAAA,AAAA,0EAAA,1EAASinC,qFAuDEj6D;;AAvDX,AAAA,eAAA,XAuDWA;AAvDX,AAuDiB,OAACD,iBAAOy4D;;;AAvDzB,AAAA,AAAA,sEAAA,tEAASyB,iFAiDCj6D;;AAjDV,AAAA,eAAA,XAiDUA;AAjDV,AAiDgB,IAAAwP,kBAAuCwjB;AAAvC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,8BAAcxP,9BAAK4U;AAAnB,AAAA,gBAAApF,hBAAuCwjB;;AAAvCxjB;;;;AAjDhB,AAAA,AAAA,wEAAA,xEAASyqD,mFAyCEj6D,KAAKgF;;AAzChB,AAAA,eAAA,XAyCWhF;AAzCX,AA0CI,QACC,AAACke,qBAAKlZ,YACN,CAAI,AAAC2S,gBAAM3X,cAAM,AAAC2X,gBAAM3S,aACxB,uBAAA,vBAACg+B;kBAADy3B;AAAA,AAAS,0CAAAA,nCAACr5C,0BAAUphB;;CACZgF;;;AA9Cb,AAAA,AAAA,4FAAA,5FAASi1D,uGA4ESj6D;;AA5ElB,AAAA,eAAA,XA4EkBA;AA5ElB,AA4EwB,YAAA06D,2BAAmB,AAACzyD,wBAAcuwD;;;AA5E1D,AAAA,AAAA,sFAAA,tFAASyB,iGAsCEj6D;;AAtCX,AAAA,eAAA,XAsCWA;AAtCX,AAsCiB,OAAC2Z,oBAAU,AAASsgD,kCAAmB\/1D;;;AAtCxD,AAAA,AAAA,wEAAA,xEAAS+1D,mFAkEIj6D,KAAKgC;;AAlElB,AAAA,eAAA,XAkEahC;AAlEb,AAmEI,YAAAi6D,6EAAA,jDAAoB\/1D,YAAK,AAAC\/B,kBAAQq2D,gBAASx2D;;;AAnE\/C,AAAA,AAAA,wEAAA,xEAASi4D,mFAoDAj6D;;AApDT,AAAA,eAAA,XAoDSA;AApDT,AAoDe,OAACkpD,eAAKsP;;;AApDrB,AAAA,AAAA,+EAAA,\/EAASyB,0FA4BMj6D,KAAKkE;;AA5BpB,AAAA,eAAA,XA4BelE;AA5Bf,AA4B0B,YAAAi6D,4BAAoB\/1D,SAAKs0D,gBAASxlC;;;AA5B5D,AAAA,AAAA,4EAAA,5EAASinC,uFAkCCj6D,KAAKX;;AAlCf,AAAA,eAAA,XAkCUW;AAlCV,AAmCI,YAAAi6D,8GAAA,lFAAoB\/1D,YAAK,gEAAA,hEAACoY,8CAAMk8C,gBAASn5D;;;AAnC7C,AAAA,AAAA,6CAAA,7CAAS46D;;6BAATnrD,OAsEiB7P;;AAtEjB,AAAA,IAAA6P,aAAA;AAAA,AAAA,WAAAA,PAsEY9O;AAtEZ,AAuEI,OAASA,4CAAKf;;6BAvElB6P,OAwEiB7P,EAAE2B;;AAxEnB,AAAA,IAAAkO,aAAA;AAAA,AAAA,WAAAA,PAwEY9O;AAxEZ,AAyEI,OAASA,4CAAKf,EAAE2B;;oBAzEpBkO,OAwEiB7P,EAAE2B;;;6BAxEnBkO,OAwEiB7P;;6BAxEjB6P,OAwEiB7P,EAAE2B;;;;;;;;;;AAxEnB,AAAA,AAAA,8CAAA,WAAAkO,OAAAkrD,hEAASC;;AAAT,AAAA,IAAAnrD,aAAA;AAAA,AAAA,OAAA,AAAAA,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAA9T,iBAAAg\/D;;;AAAA,AAAA,AAAA,sEAAA,tEAASC,iFAsEQh7D;;AAtEjB,AAAA,WAAA,PAsEYe;AAtEZ,AAuEI,OAASA,4CAAKf;;;AAvElB,AAAA,AAAA,sEAAA,tEAASg7D,iFAwEQh7D,EAAE2B;;AAxEnB,AAAA,WAAA,PAwEYZ;AAxEZ,AAyEI,OAASA,4CAAKf,EAAE2B;;;AAzEpB,AAAA,uCAAA,vCAASq5D;AAAT,AAAA,0FAAA,0DAAA,iEAAA,oBAAA,8DAAA,2CAAA,0DAAA;;;AAAA,AAAA,6CAAA,7CAASA;;AAAT,AAAA,gDAAA,hDAASA;;AAAT,AAAA,qDAAA,WAAAvuD,mBAAAC,qBAAAC,xGAASquD;AAAT,AAAA,OAAAtzD,iBAAAgF,qBAAA;;;AAAA,mCAAA,nCAASuuD,8EAAmBh2D,KAAKs0D,SAAmBxlC;AAApD,AAAA,YAAAinC,4BAA4B\/1D,KAAKs0D,SAAmBxlC;;;AAA3CinC,AA8ET,AAAM,AAASA,oCACb,KAAAA,4BAAA,KAAwB,AAASjR,mCAAoBn0C;AAEvD,AAAM,AAAaolD,wCACjB,WAAKU,MAAe5a;AAApB,AACE,IAAM7kD,MAAI,AAASy\/D;AAAnB,AACE,GAAI,CAAIz\/D,OAAI,AAAqB8tD;AAC\/B,IAAM\/tD,MAAI,EAAI8kD,UAAS4a,MAAM,AAAC3\/D,iBAAO2\/D;AAArC,AACE,QAAA,JAAO7\/D;IACAklD,MAAI,AAACxmB,qBAAU,AAASwvB;;AAD\/B,AAEE,GAAI,CAAGluD,IAAEI;AACP,eAAO,KAAA,JAAKJ;eAAG,sCAAA,tCAAC4N,uBAAQs3C,IAAI,CAAM2a,MAAM7\/D;;;;;AACxC,YAAAm\/D,4BAAA,sCAAA,jCAAwB,AAAC1xD,4BAAay3C;;;;;AAC7C,QAAA,JAAOllD;IACAklD,MAAI,AAACxmB,qBAAU,AAASygC;;AAD\/B,AAEE,GAAI,CAAGn\/D,IAAEI;AACP,eAAO,KAAA,JAAKJ;eAAG,AAACuN,sBAAO23C,IAAI,CAAM2a,MAAM7\/D;;;;;AACvC,OAACyN,4BAAay3C;;;;;;AAEzB,AAAM,AAAmBia,8CACnB,WAAKU;AAAL,AACE,IAAMz\/D,MAAI,AAASy\/D;IACblhE,IAAE,AAACwO,wBAAc,AAASgyD;AADhC,AAEE,IAAAp\/D,wBAAYK;AAAZ,AAAA,cAAA,VAAUJ;;AAAV,AAAA,GAAA,WAAAD,VAAUC;AAAV,AACE,AAACuN,sBAAO5O,EAAE,CAAMkhE,MAAM7\/D;;AACtB,GAAU,AAAC+Y,6CAAE,AAAC8D,gBAAMle,GAAG,WAAA,VAAKqB;AAA5B;AAAA,AACE,MAAO,KAAApF,MAAW,6CAAA,+DAAuB,CAAMilE,MAAM7\/D;;;AAHzD,eAAA,WAAA,VAAUA;;;;AAAV;;;;AAIA,OAACyN,4BAAa9O;;AAExB,AAAM,AAAqBwgE,gDACrB,WAAKU;AAAL,AACE,IAAMz\/D,MAAI,AAASy\/D;IACblhE,IAAE,AAACwO,wBAAc,AAASgyD;AADhC,AAEE,IAAAp\/D,wBAAYK;AAAZ,AAAA,cAAA,VAAUJ;;AAAV,AAAA,GAAA,WAAAD,VAAUC;AAAV,AAAiB,AAACuN,sBAAO5O,EAAE,CAAMkhE,MAAM7\/D;;AAAvC,eAAA,WAAA,VAAUA;;;;AAAV;;;;AACA,OAACyN,4BAAa9O;;AAExB,CAAA,sCAAAP,yBAAA,\/DAAc+gE;AAAd,AAAA,IAAAnhD,qBAAA;AAAA,AAAA,OAAA9E,uBAAA8E;;AAEA,AAAA;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,0FAAA,1FAAS4hD,qGAEEpyD,MAAMjJ;;AAFjB,AAAA,gBAAA,ZAEWiJ;AAFX,AAGI,AAAMwyD,uBAAc,2EAAA,3EAAC1U,oDAAO0U,qBAAcz7D;;AAC1CiJ;;;AAJJ,AAAA,AAAA,gGAAA,hGAASoyD,2GAMQpyD;;AANjB,AAAA,gBAAA,ZAMiBA;AANjB,AAOI,YAAA2xD,4BAAA,sDAAA,jDAAwB,AAACxgC,2BAAYqhC;;;AAPzC,AAAA,AAAA,sFAAA,tFAASJ,iGAUKpyD,MAAMtG;;AAVpB,AAAA,gBAAA,ZAUcsG;AAVd,AAWI,AAAMwyD,uBAAc,AAACC,qDAAQD,qBAAc94D;;AAC3CsG;;;AAZJ,AAAA,AAAA,yEAAA,zEAASoyD,oFAeEpyD;;AAfX,AAAA,gBAAA,ZAeWA;AAfX,AAekB,OAACqP,gBAAMmjD;;;AAfzB,AAAA,AAAA,yEAAA,zEAASJ,oFAkBGpyD,MAAMtG;;AAlBlB,AAAA,gBAAA,ZAkBYsG;AAlBZ,AAmBI,0DAAA,nDAASA,iDAAMtG;;;AAnBnB,AAAA,AAAA,yEAAA,zEAAS04D,oFAqBGpyD,MAAMtG,EAAEpB;;AArBpB,AAAA,gBAAA,ZAqBY0H;AArBZ,AAsBI,GAAI,CAAY,AAACsT,gDAAQk\/C,qBAAc94D,EAAE2d,+BAAiBA;AACxD\/e;;AACAoB;;;;AAxBN,AAAA,AAAA,4CAAA,5CAAS04D;;6BAAT5rD,OA2BkB7P;;AA3BlB,AAAA,IAAA6P,aAAA;AAAA,AAAA,YAAAA,RA2BYxG;AA3BZ,AA4BI,GAAI,CAAY,AAACsT,gDAAQk\/C,qBAAc77D,EAAE0gB,+BAAiBA;AAA1D;;AAEE1gB;;;6BA9BN6P,OAgCkB7P,EAAE2B;;AAhCpB,AAAA,IAAAkO,aAAA;AAAA,AAAA,YAAAA,RAgCYxG;AAhCZ,AAiCI,GAAI,CAAY,AAACsT,gDAAQk\/C,qBAAc77D,EAAE0gB,+BAAiBA;AACxD\/e;;AACA3B;;;oBAnCN6P,OAgCkB7P,EAAE2B;;;6BAhCpBkO,OAgCkB7P;;6BAhClB6P,OAgCkB7P,EAAE2B;;;;;;;;;;AAhCpB,AAAA,AAAA,6CAAA,WAAAkO,OAAA8rD,\/DAASF;;AAAT,AAAA,IAAA5rD,aAAA;AAAA,AAAA,OAAA,AAAAA,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAA9T,iBAAA4\/D;;;AAAA,AAAA,AAAA,qEAAA,rEAASF,gFA2BSz7D;;AA3BlB,AAAA,YAAA,RA2BYqJ;AA3BZ,AA4BI,GAAI,CAAY,AAACsT,gDAAQk\/C,qBAAc77D,EAAE0gB,+BAAiBA;AAA1D;;AAEE1gB;;;;AA9BN,AAAA,AAAA,qEAAA,rEAASy7D,gFAgCSz7D,EAAE2B;;AAhCpB,AAAA,YAAA,RAgCY0H;AAhCZ,AAiCI,GAAI,CAAY,AAACsT,gDAAQk\/C,qBAAc77D,EAAE0gB,+BAAiBA;AACxD\/e;;AACA3B;;;;AAnCN,AAAA,sCAAA,tCAASy7D;AAAT,AAAA,0FAAA,oBAAA,0EAAA,2CAAA,0DAAA;;;AAAA,AAAA,4CAAA,5CAASA;;AAAT,AAAA,+CAAA,\/CAASA;;AAAT,AAAA,oDAAA,WAAAhvD,mBAAAC,qBAAAC,vGAAS8uD;AAAT,AAAA,OAAA\/zD,iBAAAgF,qBAAA;;;AAAA,kCAAA,lCAASkvD,4EAA4BC;AAArC,AAAA,YAAAJ,2BAAqCI;;;AAA5BJ,AAqCT,AAAA;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,iDAAA,jDAASO;;AAAT,AAAA,WAAA,PAEaj7D;AAFb,AAGI,OAACgM,uBAAQhM;;;AAHb,AAAA,AAAA,8CAAA,9CAASi7D,yDAIMj2D;;AAJf,AAAA,YAAA,RAIUvG;AAJV,AAKI,OAAQA,2CAAKuG;;;AALjB,AAAA,AAAA,6CAAA,7CAASi2D;;AAAT,AAAA,WAAA,PAQSj7D;AART,AASI,OAACgU,uBAAa,AAACX,cAAIrT;;;AATvB,AAAA,AAAA,gDAAA,hDAASi7D;;AAAT,AAAA,WAAA,PAUYj7D;AAVZ,AAWI,OAAC8nD,mCAAyB,AAACz0C,cAAIrT;;;AAXnC,AAAA,AAAA,+CAAA,\/CAASi7D;;AAAT,AAAA,WAAA,PAYWj7D;AAZX,AAaI,OAACgU,uBAAa,AAACX,cAAIrT;;;AAbvB,AAAA,AAAA,4CAAA,5CAASi7D,uDAcIh8D;;AAdb,AAAA,WAAA,PAcQe;AAdR,AAeI,OAACohB,0BAAUphB,KAAKf;;;AAfpB,AAAA,AAAA,gDAAA,hDAASg8D,2DAgBQplE;;AAhBjB,AAAA,WAAA,PAgBYmK;AAhBZ,AAiBI,IAAAo7D,aAAA,AAAA\/nD,cAAcrT;IAAdq7D,eAAA;IAAAC,eAAA;IAAAC,WAAA;;AAAA,AAAA,GAAA,AAAA,CAAAA,WAAAD;AAAA,IAAAE,aAAA,AAAAH,kDAAAE;QAAA,AAAAjpC,4CAAAkpC,WAAA,IAAA,\/DAASv8D;QAAT,AAAAqzB,4CAAAkpC,WAAA,IAAA,\/DAAWx5D;AAAX,AAAA,AACE,CAACnM,kCAAAA,uCAAAA,PAAEmM,mBAAAA,jBAAE\/C,mBAAAA;;AADP,eAAAm8D;eAAAC;eAAAC;eAAA,CAAAC,WAAA;;;;;;;AAAA,IAAAhpC,qBAAA,AAAAlf,cAAA+nD;AAAA,AAAA,GAAA7oC;AAAA,AAAA,IAAA6oC,iBAAA7oC;AAAA,AAAA,GAAA,AAAA7T,6BAAA08C;AAAA,IAAA5oC,kBAAA,AAAAtP,sBAAAk4C;AAAA,AAAA,eAAA,AAAA3oC,qBAAA2oC;eAAA5oC;eAAA,AAAA7a,gBAAA6a;eAAA;;;;;;;AAAA,IAAAipC,aAAA,AAAAphE,gBAAA+gE;QAAA,AAAA9oC,4CAAAmpC,WAAA,IAAA,\/DAASx8D;QAAT,AAAAqzB,4CAAAmpC,WAAA,IAAA,\/DAAWz5D;AAAX,AAAA,AACE,CAACnM,kCAAAA,uCAAAA,PAAEmM,mBAAAA,jBAAE\/C,mBAAAA;;AADP,eAAA,AAAA3E,eAAA8gE;eAAA;eAAA;eAAA;;;;;;;;AAAA;;;;;;;AAjBJ,AAAA,AAAA,0EAAA,1EAASH,qFAsEGj7D,KAAKgC;;AAtEjB,AAAA,eAAA,XAsEYhC;AAtEZ,AAuEI,yDAAA,lDAASA,gDAAKgC;;;AAvElB,AAAA,AAAA,0EAAA,1EAASi5D,qFAwEGj7D,KAAKgC,EAAEpB;;AAxEnB,AAAA,eAAA,XAwEYZ;AAxEZ,AAyEI,IAAMZ,IAAE,AAAW+7D,yBAASn5D;AAA5B,AACE,GAAA,EAAQ,MAAA,LAAM5C;AACZ,OAAOA;;AACPwB;;;;AA5ER,AAAA,AAAA,sEAAA,tEAASq6D,iFA2BCj7D;;AA3BV,AAAA,eAAA,XA2BUA;AA3BV,AA2BgBkE;;;AA3BhB,AAAA,AAAA,4EAAA,5EAAS+2D,uFAqBExlE;;AArBX,AAAA,YAAA,RAqBWA;AArBX,AAqBc,YAAAwlE,4BAAoB\/2D,YAAKi3D,gBAASnoC;;;AArBhD,AAAA,AAAA,0EAAA,1EAASioC,qFAmEEj7D;;AAnEX,AAAA,eAAA,XAmEWA;AAnEX,AAmEiB,OAAC2X,gBAAMwjD;;;AAnExB,AAAA,AAAA,4EAAA,5EAASF,uFA8DCj7D;;AA9DV,AAAA,eAAA,XA8DUA;AA9DV,AA+DI,GAAI,oCAAA,nCAAM,AAAC2X,gBAAMwjD;AACf,OAAC1rB,4CAAI7d,cAAI,AAACyB,eAAK8nC;;AADjB;;;;AA\/DJ,AAAA,AAAA,sEAAA,tEAASF,iFA6CCj7D;;AA7CV,AAAA,eAAA,XA6CUA;AA7CV,AA6CgB,IAAAwP,kBAAuCwjB;AAAvC,AAAA,GAAA,EAAA,CAAAxjB,mBAAA;AAAAA;;AAAA,IAAAA,sBAAA,8BAAcxP,9BAAK4U;AAAnB,AAAA,gBAAApF,hBAAuCwjB;;AAAvCxjB;;;;AA7ChB,AAAA,AAAA,wEAAA,xEAASyrD,mFAqCEj7D,KAAKgF;;AArChB,AAAA,eAAA,XAqCWhF;AArCX,AAsCI,QACC,AAACke,qBAAKlZ,YACN,CAAI,AAAC2S,gBAAM3X,cAAM,AAAC2X,gBAAM3S,aACxB,uBAAA,vBAACg+B;kBAAD04B;AAAA,AAAS,0CAAAA,nCAACt6C,0BAAUphB;;CACZgF;;;AA1Cb,AAAA,AAAA,sFAAA,tFAASi2D,iGAkCEj7D;;AAlCX,AAAA,eAAA,XAkCWA;AAlCX,AAkCiB,YAAAi7D,0EAAA,9CAAoB\/2D,YAAK,AAAC\/D,iBAAOg7D;;;AAlClD,AAAA,AAAA,wEAAA,xEAASF,mFA+EIj7D,KAAKgC;;AA\/ElB,AAAA,eAAA,XA+EahC;AA\/Eb,AAgFI,YAAAi7D,0GAAA,9EAAoB\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\/sD;;AAJ\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\/DAAMrnE;aAANqnE,TAAY\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\/D;GAAS,AAACu\/D,gDAAQv\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\/B,yBAAAA;;AACbw\/B;;;oBANHA,OAAOC;;;;;6BAAPD;;6BAAAA,OAAOC;;;;;;;;;;;;;AAjBlB,AAAA,wDAAA,xDAAMq9B,mEAwBF1\/D,EAAEY;AAxBN,AAyBK,OAAC++D,sDAAc3\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\/oE;;;;;AAAA,AAAA,+CAAA,\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\/D;IAAxBm\/D,iBAA+B9+D;AAA\/B,AAAA,mFAAA4+D,eAAAC,eAAAC,sCAAAF,eAAAC,eAAAC,pLAACL,0CAAAA,wFAAAA;;AADH;;AAEA,IAAO1lE,iBAAK,AAAC1F,eAAK0F;IAAMZ,UAAE,4GAAA,3GAAK,AAAA,mGAAe6H;;AAA9C,AACE,GAAI,CAAKjH,oBAAK,CAAI,YAAA,XAAMZ,sBAAG,EAAK,aAAA,ZAAOA;AACrC,AACE,AAACuH,iBAAOC,OAAO+sC;;AACf,IAAAqyB,iBAAW,AAAC3rE,gBAAM2F;IAAlBimE,iBAAwBr\/D;IAAxBs\/D,iBAA+Bj\/D;AAA\/B,AAAA,mFAAA++D,eAAAC,eAAAC,sCAAAF,eAAAC,eAAAC,pLAACR,0CAAAA,wFAAAA;;AACD,eAAO,AAACprE,eAAK0F;eAAM,WAAA,VAAKZ;;;;;AAC1B,GAAM,CAAK,AAACiU,cAAIrT,qBAAM,aAAA,ZAAOZ;AAA7B,AACE,AAACuH,iBAAOC,OAAO+sC;;AACf,AAAChtC,iBAAOC,OAAO,iBAAAoW,mBAAI,AAAA,gGAAc\/V;AAAlB,AAAA,oBAAA+V;AAAAA;;AAAA;;;;AAFjB;;;;;;AAGR,OAACrW,iBAAOC,OAAO4qB;;UApBrB,AAAA,oCAAAo0C,pCAAUtvE;;AAsBZ,AAAA,sBAAA,8BAAAqD,pDAAMwsE;AAAN,AAAA,IAAAzoE,qBAAA;AAAA,AAAA,IAAA7D,0BAAA,AAAA;AAAA,AAAA,IAAAC,wBAAA;;AAAA,AAAA,GAAA,CAAAA,wBAAAD;AAAA,AAAA,AAAA6D,wBAAA,CAAA,UAAA5D;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA6D,uBAAA,EAAA,CAAA,MAAA,AAAAD,4BAAA,AAAA,KAAAxD,qBAAA,AAAAwD,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAyoE,yDAAA,CAAA,UAAA,MAAAxoE;;;AAAA,AAAA,AAAA,AAAAwoE,2DAAA,WAAiBv\/D,OAAS8pC;AAA1B,AACE,IAAA41B,aAAA,AAAAjzD,cAAUq9B;IAAV61B,eAAA;IAAAC,eAAA;IAAAC,WAAA;;AAAA,AAAA,GAAA,AAAA,CAAAA,WAAAD;AAAA,QAAA,AAAAD,kDAAAE,tDAAQ7tE;AAAR,AAAA,AACE,AAAC+N,iBAAOC,OAAOhO;;AADjB,eAAA0tE;eAAAC;eAAAC;eAAA,CAAAC,WAAA;;;;;;;AAAA,IAAAl0C,qBAAA,AAAAlf,cAAAizD;AAAA,AAAA,GAAA\/zC;AAAA,AAAA,IAAA+zC,iBAAA\/zC;AAAA,AAAA,GAAA,AAAA7T,6BAAA4nD;AAAA,IAAA9zC,kBAAA,AAAAtP,sBAAAojD;AAAA,AAAA,eAAA,AAAA7zC,qBAAA6zC;eAAA9zC;eAAA,AAAA7a,gBAAA6a;eAAA;;;;;;;AAAA,QAAA,AAAAn4B,gBAAAisE,pBAAQ1tE;AAAR,AAAA,AACE,AAAC+N,iBAAOC,OAAOhO;;AADjB,eAAA,AAAA0B,eAAAgsE;eAAA;eAAA;eAAA;;;;;;;;AAAA;;;;;;;AADF,AAAA,AAAAH,8CAAA;;AAAA,AAAA,AAAAA,wCAAA,WAAAC;AAAA,AAAA,IAAAC,WAAA,AAAAhsE,gBAAA+rE;IAAAA,eAAA,AAAA9rE,eAAA8rE;AAAA,AAAA,OAAAD,yDAAAE,SAAAD;;;AAAA,AAIA,yBAAA,zBAAMM,0DAAc5vE;AAApB,AACE,CAACtB,+DAAAA,kEAAAA,LAAWsB,8CAAAA;;AADd;;AAIA,kBAAA,lBAAM6vE;AAAN,AAAA;;AAGA,AAAeC,yBACb,iBAAAC,WAAA,CAAA,KAAA,OAAA,KAAA,OAAA,KAAA,MAAA,KAAA,MAAA,KAAA,MAAA,KAAA,MAAA,KAAA;AAAA,AAAAA;;AASF,yBAAA,zBAAgBC,0DACbluE;AADH,AAEE,oDAAA,kDACK,AAAUA,UAAE,OAAA,qBAAA,5BAAC4rE,iCACX,WAAKuC;AAAL,AAAY,QAAMH,uBAAaG;iDAFtC;;AAKF,AAAA,AAEA,8BAAA,9BAAeC,oEAAa\/\/D,KAAK1O;AAAjC,AACE,IAAAE,oBAAK,AAACynB,mBAAQ,iDAAA,jDAACqB,4CAAIta;AAAnB,AAAA,GAAAxO;AAAA,IAAAA,wBACK,EAAA,EAAA,QAAA,QAAA,EAAA,CAAA,CAAA,0CAAA,eAAA,CAAAtD,gCAAA,wBAAA,KAAA,OAAA,jJAAmBoD,mBAAAA,0FAAAA;AADxB,AAAA,GAAAE;AAEK,SAAK,wBAAA,vBAAM,AAAC6kB,eAAK\/kB;;AAFtBE;;;AAAAA;;;AAIF,2BAAA,3BAAOwuE,8DACJ1uE,IAAIqO,OAAOK;AADd,AAEE,GACE,QAAA,PAAM1O;AAAK,+BAAA,xBAACoO,iBAAOC;;AADrB,AAGE,AACE,GAAM,AAACogE,4BAAY\/\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\/B,IAAAohE,aAAA,AAAAh1D,cAAY,AAAC\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\/7D,jBAAS+7D;AACX,sDAAA,\/CAACr6D,oDAAW,AAACijB,eAAKo3C;;AAClB,uDAAA,hDAACC,qDAAY,AAACr3C,eAAKo3C;;;AAEvB;;;oBAAA,pBAAOE,gDAEJhrE;AAFH,AAGE,GAAM\/I;AAAN,AACE,SAAA,LAAO6Y;IAAPm7D,WACmC,AAAC\/2D,cAAIlU;IADxCkrE,aAAAD;IAAAE,aAAA,AAAAj3D,cAAAg3D;IAAAE,eAAA,AAAAlwE,gBAAAiwE;IAAAA,iBAAA,AAAAhwE,eAAAgwE;IAAAE,aAAAD;QAAA,AAAAj4C,4CAAAk4C,WAAA,IAAA,\/DACSvrE;QADT,AAAAqzB,4CAAAk4C,WAAA,IAAA,\/DACWxoE;YADXwoE,RACiBlkE;cADjBgkE,VAC0BO;IACnBC,KAAG,AAACjwD,gBAAM1b;AAFjB,AAAA,IAAO8P,SAAAA;IAAPm7D,eAAAA;IAEOU,SAAAA;;AAFP,AAAA,IAAO77D,SAAAA;IAAPw7D,aAAAL;IAAAM,aAAA,AAAAr3D,cAAAo3D;IAAAE,eAAA,AAAAtwE,gBAAAqwE;IAAAA,iBAAA,AAAApwE,eAAAowE;IAAAE,aAAAD;YAAA,AAAAr4C,4CAAAs4C,WAAA,IAAA,nEACS3rE;YADT,AAAAqzB,4CAAAs4C,WAAA,IAAA,nEACW5oE;gBADX4oE,ZACiBtkE;kBADjBokE,dAC0BG;IACnBC,SAAAA;AAFP,AAGE,oBAAIxkE;AACF,GAAM,CAAI,kBAAA+tB,jBAAUp1B,yCAAG,kBAAAiP,jBAASjP;AAAhC,AACE,oBAAIgQ;AACF,GAAM,AAAC4E,6CAAE5E,OAAG,AAAC2lB,oBAAU31B;AAAvB,AACE,eAAOgQ;eAAG47D;eAAQ,AAACvuD,8CAAMwuD,OAAG,AAACd,mBAAS\/qE,OAAG+C;;;;;;AAD3C;;;AAEA,IAAAuwB,qBAAkB,AAACqC,oBAAU31B;AAA7B,AAAA,oBAAAszB;AAAA,AAAA,aAAAA,TAAWw4C;AAAX,AACE,eAAOA;eAAOF;eAAQ,AAACvuD,8CAAMwuD,OAAG,AAACd,mBAAS\/qE,OAAG+C;;;;;;AAD\/C;;;;AAJJ;;;AADF,0FAOGiN,OAAG67D;;;;;AAXV;;;AAaF,6BAAA,7BAAME,kEAAkB1F,OAAOnmE,EAAEumE,UAAU9+D,OAAOK;AAAlD,AACE,OAACw+D,+BACC7+D,OACA,WAAK\/H,EAAEosE,EAAEhkE;AAAT,AACE,AAAI,IAAAikE,iBAAW,AAACt5C,cAAI\/yB;IAAhBssE,iBAAmBF;IAAnBG,iBAAqBnkE;AAArB,AAAA,mFAAAikE,eAAAC,eAAAC,sCAAAF,eAAAC,eAAAC,pLAAC1F,0CAAAA,wFAAAA;;AACD,mBAAA,nBAAC\/+D,iBAAOskE;;AACR,IAAAI,WAAW,AAACx5C,cAAIhzB;IAAhBysE,WAAmBL;IAAnBM,WAAqBtkE;AAArB,AAAA,0FAAAokE,SAAAC,SAAAC,gCAAAF,SAAAC,SAAAC,tJAAC7F,0CAAAA,sEAAAA;mHALT,KAAA,rHAME,iGAAA,pDAAKJ,4EACLr+D,KAAK,AAACoM,cAAIlU;;AAEd,sBAAA,tBAAMuoE,oDAAWvoE,EAAEumE,UAAU9+D,OAAOK;AAApC,AACE,IAAAukE,aAAoB,AAACrB,kBAAQhrE;SAA7B,AAAAmzB,4CAAAk5C,WAAA,IAAA,hEAAOv8D;eAAP,AAAAqjB,4CAAAk5C,WAAA,IAAA,tEAAUC;AAAV,AACE,oBAAIx8D;AACF,OAAC+7D,2BAAiB,6CAAA,kDAAU\/7D,cAAIw8D,SAAS\/F,UAAU9+D,OAAOK;;AAC1D,kCAAA,3BAAC+jE,gCAAqB7rE,EAAEumE,UAAU9+D,OAAOK;;;AAE\/C,AAAA,AAAA,AAAA,AAAA,2DAAA9R,3DAkGEk2C;;AAlGF,AAAA,AAAA,AAkGEA,6EACA,WAAa\/vC,EAAEsL,OAAOK;AAAtB,AAAA,YAAA,RAAa3L;AAAb,AACE,wBAAA,xBAACqL,iBAAOC;;AACR,oBAAA,2CAAA,\/DAACygE,iHAAgB,AAAS\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\/DAACygE,iHAAgB,AAAS\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\/C,6CAAK,AAACx7B,gBAAM\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\/E,MAAA,6CAAA,+DAAA,AAAAw\/E;;;;;AAAA,AAAA,mDAAA,nDAAME,8DAIF3B,IAAIl3B;AAJR,AAKI,AAACk4B,2EAAuBW,wCAAS3B,IAAIl3B;;AALzC;;;AAAA,AAAA,mDAAA,nDAAM64B,8DAOFr2E,EAAE00E,IAAIl3B;AAPV,AAQI,IAAM84B,YAAU,AAAA,0FAAUt2E;IACpBu2E,gBAAc,gTAAA,9RAAI,CAACD,0CAAAA,+CAAAA,PAAU5B,2BAAAA,OACb,AAAC11D,6CAAK,CAACs3D,0CAAAA,+CAAAA,PAAU5B,2BAAAA,MAAKl3B;IACtCg5B,aAAW,kBAAI,AAAC51C,oBAAU21C,gBACd,AAACh5D,8CAAM+4D,UAAU5B,IAAI6B,eACrB,AAACx4D,+CAAOu4D,UAAU5B;IAC9B+B,YAAU,AAACjgC,kBAAQ,4CAAA,5CAAC9F;kBAADgmC;AAAA,AAAM,OAAC\/8D,eAAK,gBAAA+8D,hBAACp7E,kCAAS,AAACq7E,kDAAU,gBAAAD,hBAACp7E,kCAAS,iBAAAo7E,jBAAC37D;;CACvC,AAACzG,cAAIkiE;AAPnC,AAQE,GAAI,AAACn0D,0BAAU,CAACi0D,0CAAAA,+CAAAA,PAAU5B,2BAAAA,MAAKl3B;AAC7B,sDAAA,\/CAACh3B;kBAADowD,iBAAAC;AAAA,AAAS,sEAAAD,iBAAAC,hFAACrmC,8CAAMilC;;CAAc,AAAC9B,2BACvB,kDAAA,lDAACmD,sDAAYL;;AACrBz2E;;;;AAnBR,AAAA,6CAAA,7CAAMq2E;;AAAN,AAqBA,wBAAA,xBAAOU,wDACJC,aAAaC,aAAaC,iBAAiBC;AAD9C,AAEE,AAACzJ,mDAAMsJ,aAAa,WAAKtgF;AAAL,AAAQ,QAACqgB,gDAAAA,8DAAAA,hBAAMkgE,0CAAAA;;;AACnC,OAACvJ,mDAAMwJ,iBAAiB,WAAKxgF;AAAL,AAAQ,QAACqgB,gDAAAA,2DAAAA,bAAMogE,uCAAAA;;;AAEzC,0BAAA,1BAAOC,4DACJr\/E,EAAEG,EAAEm\/E;AADP,AAEE,IAAMC,SAAO,AAAA,CAAAvgE,gDAAAA,8DAAAA,hBAAEsgE,0CAAAA,yBAAat\/E;AAA5B,AACE,IAAAkmB,mBACC,kBAAM,iBAAAvkB,oBAAK49E;AAAL,AAAA,oBAAA59E;AAAY,QAAC49E,uCAAAA,0CAAAA,LAAOp\/E,sBAAAA;;AAApBwB;;MAAN,AAAA,KAAA;AADD,AAAA,oBAAAukB;AAAAA;;AAAA,IAAAA,uBAGC,iBAAOmwB,KAAG,AAACmpC,gDAAQr\/E;;AAAnB,AACE,GAAM,uBAAA,tBAAM,AAAC0gB,gBAAMw1B;AAAnB,AACE,oBAAM,iBAAAopC,WAAUz\/E;IAAV0\/E,WAAY,AAACn8E,gBAAM8yC;IAAnBspC,WAAuBL;AAAvB,AAAA,sHAAAG,SAAAC,SAAAC,8CAAAF,SAAAC,SAAAC,hMAACN,wDAAAA,oFAAAA;;AAAP,AAAA;AAAA;;AAEA,eAAO,AAAC7iE,eAAK65B;;;;AAHf;;;;;AAJH,AAAA,oBAAAnwB;AAAAA;;AAAA,IAAAA,uBAQC,iBAAOmwB,KAAG,AAACmpC,gDAAQx\/E;;AAAnB,AACE,GAAM,uBAAA,tBAAM,AAAC6gB,gBAAMw1B;AAAnB,AACE,oBAAM,iBAAAupC,WAAU,AAACr8E,gBAAM8yC;IAAjBwpC,WAAqB1\/E;IAArB2\/E,WAAuBR;AAAvB,AAAA,sHAAAM,SAAAC,SAAAC,8CAAAF,SAAAC,SAAAC,hMAACT,wDAAAA,oFAAAA;;AAAP,AAAA;AAAA;;AAEA,eAAO,AAAC7iE,eAAK65B;;;;AAHf;;;;;AATH,AAAA,oBAAAnwB;AAAAA;;AAAA;;;;;AAeJ,sBAAA,tBAAO65D,oDACJ\/\/E,EAAEG,EAAEm\/E,aAAaF;AADpB,AAEE,IAAAl5D,mBAAI,AAACm5D,wBAASr\/E,EAAEG,EAAEm\/E;AAAlB,AAAA,oBAAAp5D;AAAAA;;AAAgC,OAACq2D,mDAAK6C,UAAUp\/E,EAAEG;;;AAEpD,uCAAA,vCAAO6\/E,sFACJ5nE,KAAK6nE,aAAab,UAAUF,aAAaI,aAAaL,aAAaE;AADtE,AAEE,IAAMe,aAAW,AAACzxD,+CAAO,cAAA0xD,HAAKE;AAAL,AAAA,IAAAD,aAAAD;QAAA,AAAA3kD,4CAAA4kD,WAAA,IAAA,\/DAASj4E;QAAT,AAAAqzB,4CAAA4kD,WAAA,IAAA,\/DAAWzhF;QAAXyhF,JAAiBr4E;AAAjB,AACE,GAAI,mDAAA,CAAAiX,gDAAAA,2DAAAA,\/JAACu9D,kJAAM6C,uCAAAA,YAAUa,aAAa93E;AAChC,IAAMm4E,MAAI,kBAAI,iBAAAp6D,mBAAI,OAAA,NAAMm6D;AAAV,AAAA,GAAAn6D;AAAAA;;AAAc,8DAAA,CAAAlH,gDAAAA,2DAAAA,nKAAC+gE,oBAAU53E,EAAE,AAAC5E,gBAAM88E,IAAIf,4GAAcF,uCAAAA;;MACtDr3E,EACAs4E;AAFZ,AAGE,oBAAU,wDAAA,CAAArhE,gDAAAA,2DAAAA,pKAAC+gE,oBAAU,AAACx8E,gBAAM+8E,KAAKn4E,EAAEm3E,4GAAcF,uCAAAA;AAAjD;AAAA,AACE,MAAO,KAAAxgF,MACC,6CAAA,mIAAA,kIAAA,mGAAA,uHAAA,9YAAyCwZ,0HACT6nE,8GAAoB93E,oGACvC,AAAC5E,gBAAM+8E;;;AAC9BA;;AACFD;;GAXZ,KAAA,CAAArhE,gDAAAA,8DAAAA,hBAYakgE,0CAAAA;AAZ9B,AAaE,oBAAMgB;AAAN,AACE,GAAI,6CAAA,CAAAlhE,gDAAAA,kEAAAA,6CAAA,CAAAA,gDAAAA,2DAAAA,zTAACjC,4IAAGoiE,8CAAAA,kHAAkBC,uCAAAA;AACxB,AACE,AAACvE,mDAAMoE,aAAah6D,gBAAMg7D,aAAa,AAACj9D,iBAAOk9D;;AAC\/C,OAACl9D,iBAAOk9D;;AACV,AACE,AAAClB,sBAAYC,aAAaC,aAAaC,iBAAiBC;;AACxD,QAACY,qEAAAA,0JAAAA,vFAA2B5nE,sIAAAA,jIAAK6nE,sIAAAA,zHAAab,sIAAAA,5HAAUF,sIAAAA,zHAAaI,sIAAAA,zHACzCL,sIAAAA,zHAAaE,sIAAAA;;;AAR\/C;;;AAUJ,AAAA;AAAA;;;qBAAA,rBAAa6B;;AAAb,mBAAA,nBACGC,8CAAQC;AADX,AAAA,GAAA,CAAA,EAAA,OAAA,YAAA,EAAA,CAAA,wCAAA,7DACWA,qBAAAA;AADX,OACWA,qCAAAA;;AADX,IAAA35E,kBAAA,EAAA,OAAA,OAAA,bACW25E,kBAAAA;IADX15E,kBAAA,CAAA+4E,iBAAA,AAAAp\/E,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,oDAAAA,NACW05E,gCAAAA;;AADX,IAAA15E,sBAAA,CAAA+4E,iBAAA;AAAA,AAAA,GAAA,EAAA,CAAA\/4E,uBAAA;AAAA,QAAAA,oDAAAA,wDAAAA,NACW05E,oCAAAA;;AADX,MAAA,AAAA3\/E,2BAAA,kBACW2\/E;;;;;;AADX,wBAAA,xBAEGC,wDAAaD,GAAGjB,aAAamB;AAFhC,AAAA,GAAA,CAAA,EAAA,OAAA,YAAA,EAAA,CAAA,6CAAA,lEAEgBF,qBAAAA;AAFhB,OAEgBA,0CAAAA,GAAGjB,aAAamB;;AAFhC,IAAA75E,kBAAA,EAAA,OAAA,OAAA,bAEgB25E,kBAAAA;IAFhB15E,kBAAA,CAAAg5E,sBAAA,AAAAr\/E,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,wEAAAA,1BAEgB05E,oDAAAA,jDAAGjB,oDAAAA,vCAAamB,oDAAAA;;AAFhC,IAAA55E,sBAAA,CAAAg5E,sBAAA;AAAA,AAAA,GAAA,EAAA,CAAAh5E,uBAAA;AAAA,QAAAA,oDAAAA,4EAAAA,1BAEgB05E,wDAAAA,rDAAGjB,wDAAAA,3CAAamB,wDAAAA;;AAFhC,MAAA,AAAA7\/E,2BAAA,uBAEgB2\/E;;;;;;AAFhB,2BAAA,3BAGGG,8DAAgBH,GAAGjB;AAHtB,AAAA,GAAA,CAAA,EAAA,OAAA,YAAA,EAAA,CAAA,gDAAA,rEAGmBiB,qBAAAA;AAHnB,OAGmBA,6CAAAA,GAAGjB;;AAHtB,IAAA14E,kBAAA,EAAA,OAAA,OAAA,bAGmB25E,kBAAAA;IAHnB15E,kBAAA,CAAAi5E,yBAAA,AAAAt\/E,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,iEAAAA,nBAGmB05E,6CAAAA,1CAAGjB,6CAAAA;;AAHtB,IAAAz4E,sBAAA,CAAAi5E,yBAAA;AAAA,AAAA,GAAA,EAAA,CAAAj5E,uBAAA;AAAA,QAAAA,oDAAAA,qEAAAA,nBAGmB05E,iDAAAA,9CAAGjB,iDAAAA;;AAHtB,MAAA,AAAA1+E,2BAAA,0BAGmB2\/E;;;;;;AAHnB,2BAAA,3BAIGI,8DAAgBJ,GAAGjB,aAAasB;AAJnC,AAAA,GAAA,CAAA,EAAA,OAAA,YAAA,EAAA,CAAA,gDAAA,rEAImBL,qBAAAA;AAJnB,OAImBA,6CAAAA,GAAGjB,aAAasB;;AAJnC,IAAAh6E,kBAAA,EAAA,OAAA,OAAA,bAImB25E,kBAAAA;IAJnB15E,kBAAA,CAAAk5E,yBAAA,AAAAv\/E,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,gFAAAA,lCAImB05E,4DAAAA,zDAAGjB,4DAAAA,\/CAAasB,4DAAAA;;AAJnC,IAAA\/5E,sBAAA,CAAAk5E,yBAAA;AAAA,AAAA,GAAA,EAAA,CAAAl5E,uBAAA;AAAA,QAAAA,oDAAAA,oFAAAA,lCAImB05E,gEAAAA,7DAAGjB,gEAAAA,nDAAasB,gEAAAA;;AAJnC,MAAA,AAAAhgF,2BAAA,0BAImB2\/E;;;;;;AAJnB,wBAAA,xBAKGM,wDAAaN,GAAGjB;AALnB,AAAA,GAAA,CAAA,EAAA,OAAA,YAAA,EAAA,CAAA,6CAAA,lEAKgBiB,qBAAAA;AALhB,OAKgBA,0CAAAA,GAAGjB;;AALnB,IAAA14E,kBAAA,EAAA,OAAA,OAAA,bAKgB25E,kBAAAA;IALhB15E,kBAAA,CAAAm5E,sBAAA,AAAAx\/E,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,iEAAAA,nBAKgB05E,6CAAAA,1CAAGjB,6CAAAA;;AALnB,IAAAz4E,sBAAA,CAAAm5E,sBAAA;AAAA,AAAA,GAAA,EAAA,CAAAn5E,uBAAA;AAAA,QAAAA,oDAAAA,qEAAAA,nBAKgB05E,iDAAAA,9CAAGjB,iDAAAA;;AALnB,MAAA,AAAA1+E,2BAAA,uBAKgB2\/E;;;;;;AALhB,qBAAA,rBAMGO,kDAAUP;AANb,AAAA,GAAA,CAAA,EAAA,OAAA,YAAA,EAAA,CAAA,0CAAA,\/DAMaA,qBAAAA;AANb,OAMaA,uCAAAA;;AANb,IAAA35E,kBAAA,EAAA,OAAA,OAAA,bAMa25E,kBAAAA;IANb15E,kBAAA,CAAAo5E,mBAAA,AAAAz\/E,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,oDAAAA,NAMa05E,gCAAAA;;AANb,IAAA15E,sBAAA,CAAAo5E,mBAAA;AAAA,AAAA,GAAA,EAAA,CAAAp5E,uBAAA;AAAA,QAAAA,oDAAAA,wDAAAA,NAMa05E,oCAAAA;;AANb,MAAA,AAAA3\/E,2BAAA,oBAMa2\/E;;;;;;AANb,qBAAA,rBAOGQ,kDAAUR;AAPb,AAAA,GAAA,CAAA,EAAA,OAAA,YAAA,EAAA,CAAA,0CAAA,\/DAOaA,qBAAAA;AAPb,OAOaA,uCAAAA;;AAPb,IAAA35E,kBAAA,EAAA,OAAA,OAAA,bAOa25E,kBAAAA;IAPb15E,kBAAA,CAAAq5E,mBAAA,AAAA1\/E,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,oDAAAA,NAOa05E,gCAAAA;;AAPb,IAAA15E,sBAAA,CAAAq5E,mBAAA;AAAA,AAAA,GAAA,EAAA,CAAAr5E,uBAAA;AAAA,QAAAA,oDAAAA,wDAAAA,NAOa05E,oCAAAA;;AAPb,MAAA,AAAA3\/E,2BAAA,oBAOa2\/E;;;;;;AAPb,kCAAA,lCAQGS,4EAAuBT;AAR1B,AAAA,GAAA,CAAA,EAAA,OAAA,YAAA,EAAA,CAAA,uDAAA,5EAQ0BA,qBAAAA;AAR1B,OAQ0BA,oDAAAA;;AAR1B,IAAA35E,kBAAA,EAAA,OAAA,OAAA,bAQ0B25E,kBAAAA;IAR1B15E,kBAAA,CAAAs5E,gCAAA,AAAA3\/E,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,oDAAAA,NAQ0B05E,gCAAAA;;AAR1B,IAAA15E,sBAAA,CAAAs5E,gCAAA;AAAA,AAAA,GAAA,EAAA,CAAAt5E,uBAAA;AAAA,QAAAA,oDAAAA,wDAAAA,NAQ0B05E,oCAAAA;;AAR1B,MAAA,AAAA3\/E,2BAAA,iCAQ0B2\/E;;;;;;AAR1B,yBAAA,zBASGU,0DAAcV;AATjB,AAAA,GAAA,CAAA,EAAA,OAAA,YAAA,EAAA,CAAA,8CAAA,nEASiBA,qBAAAA;AATjB,OASiBA,2CAAAA;;AATjB,IAAA35E,kBAAA,EAAA,OAAA,OAAA,bASiB25E,kBAAAA;IATjB15E,kBAAA,CAAAu5E,uBAAA,AAAA5\/E,YAAAoG;AAAA,AAAA,GAAA,EAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,oDAAAA,NASiB05E,gCAAAA;;AATjB,IAAA15E,sBAAA,CAAAu5E,uBAAA;AAAA,AAAA,GAAA,EAAA,CAAAv5E,uBAAA;AAAA,QAAAA,oDAAAA,wDAAAA,NASiB05E,oCAAAA;;AATjB,MAAA,AAAA3\/E,2BAAA,wBASiB2\/E;;;;;;AATjB,AAWA,kCAAA,lCAAOW,4EAAuBzpE,KAAK6nE;AAAnC,AACE,MAAO,KAAArhF,MAAW,6CAAA,4HAAA,lDAAkCwZ,wHAA8B6nE;;AAEpF,AAAA;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,mCAAA,nCAAS8B;;6BAAT\/pE;;AAAA,AAAA,IAAAA,aAAA;AAAA,AAAA,SAAAA,LAGYkpE;AAHZ,AAII,IAAMjB,eAAa,CAACgC,mDAAAA,qDAAAA;IACdE,YAAU,AAAajB,+CAAGjB;AADhC,AAEE,oBAAUkC;AAAV;AAAA,AACE,AAACN,gCAAsBzpE,YAAK6nE;;;AAC9B,QAACkC,0CAAAA,4CAAAA;;6BARPnqE,OASexT;;AATf,AAAA,IAAAwT,aAAA;AAAA,AAAA,SAAAA,LASYkpE;AATZ,AAUI,IAAMjB,eAAa,CAACgC,mDAAAA,sDAAAA,LAAYz9E,kCAAAA;IAC1B29E,YAAU,AAAajB,+CAAGjB;AADhC,AAEE,oBAAUkC;AAAV;AAAA,AACE,AAACN,gCAAsBzpE,YAAK6nE;;;AAC9B,QAACkC,0CAAAA,6CAAAA,LAAU39E,yBAAAA;;6BAdjBwT,OAeexT,EAAEoD;;AAfjB,AAAA,IAAAoQ,aAAA;AAAA,AAAA,SAAAA,LAeYkpE;AAfZ,AAgBI,IAAMjB,eAAa,CAACgC,mDAAAA,wDAAAA,PAAYz9E,oCAAAA,lCAAEoD,oCAAAA;IAC5Bu6E,YAAU,AAAajB,+CAAGjB;AADhC,AAEE,oBAAUkC;AAAV;AAAA,AACE,AAACN,gCAAsBzpE,YAAK6nE;;;AAC9B,QAACkC,0CAAAA,+CAAAA,PAAU39E,2BAAAA,zBAAEoD,2BAAAA;;6BApBnBoQ,OAqBexT,EAAEoD,EAAEC;;AArBnB,AAAA,IAAAmQ,aAAA;AAAA,AAAA,SAAAA,LAqBYkpE;AArBZ,AAsBI,IAAMjB,eAAa,CAACgC,mDAAAA,0DAAAA,TAAYz9E,sCAAAA,pCAAEoD,sCAAAA,pCAAEC,sCAAAA;IAC9Bs6E,YAAU,AAAajB,+CAAGjB;AADhC,AAEE,oBAAUkC;AAAV;AAAA,AACE,AAACN,gCAAsBzpE,YAAK6nE;;;AAC9B,QAACkC,0CAAAA,iDAAAA,TAAU39E,6BAAAA,3BAAEoD,6BAAAA,3BAAEC,6BAAAA;;6BA1BrBmQ,OA2BexT,EAAEoD,EAAEC,EAAEC;;AA3BrB,AAAA,IAAAkQ,aAAA;AAAA,AAAA,SAAAA,LA2BYkpE;AA3BZ,AA4BI,IAAMjB,eAAa,CAACgC,mDAAAA,4DAAAA,XAAYz9E,wCAAAA,tCAAEoD,wCAAAA,tCAAEC,wCAAAA,tCAAEC,wCAAAA;IAChCq6E,YAAU,AAAajB,+CAAGjB;AADhC,AAEE,oBAAUkC;AAAV;AAAA,AACE,AAACN,gCAAsBzpE,YAAK6nE;;;AAC9B,QAACkC,0CAAAA,mDAAAA,XAAU39E,+BAAAA,7BAAEoD,+BAAAA,7BAAEC,+BAAAA,7BAAEC,+BAAAA;;6BAhCvBkQ,OAiCexT,EAAEoD,EAAEC,EAAEC,EAAEC;;AAjCvB,AAAA,IAAAiQ,aAAA;AAAA,AAAA,SAAAA,LAiCYkpE;AAjCZ,AAkCI,IAAMjB,eAAa,CAACgC,mDAAAA,8DAAAA,bAAYz9E,0CAAAA,xCAAEoD,0CAAAA,xCAAEC,0CAAAA,xCAAEC,0CAAAA,xCAAEC,0CAAAA;IAClCo6E,YAAU,AAAajB,+CAAGjB;AADhC,AAEE,oBAAUkC;AAAV;AAAA,AACE,AAACN,gCAAsBzpE,YAAK6nE;;;AAC9B,QAACkC,0CAAAA,qDAAAA,bAAU39E,iCAAAA,\/BAAEoD,iCAAAA,\/BAAEC,iCAAAA,\/BAAEC,iCAAAA,\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\/CAAEoD,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEhJ,iDAAAA,\/CAAEiJ,iDAAAA,\/CAAEC,iDAAAA,\/CAAEjE,iDAAAA,\/CAAEkE,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\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\/BAAEoD,iCAAAA,\/BAAEC,iCAAAA,\/BAAEC,iCAAAA,\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\/DjC,AAAA,SAAA,LA+DYg5E;AA\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\/CAAEoD,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEhJ,iDAAAA,\/CAAEiJ,iDAAAA,\/CAAEC,iDAAAA,\/CAAEjE,iDAAAA,\/CAAEkE,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\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\/GjD,AAAA,SAAA,LA+GYy4E;AA\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\/Kb,AAAA,aAAA,TA+KaA;AA\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\/E;AAF3B,AAAA;;AAAA,AAAA,MAAAu\/E;;;MAIA,AAAC9jF,eAAK4jF;;AACR,OAACN,4BAAaY,OAAUN;;;;KAZtC;AAaY,OAACN,4BAAaa,YAAYP;;;;AACpC,MAAO,KAAAxoF,MAAW,6CAAA,qFAA6C0B;;;;AAErE;;;6BAAA,7BAAMsnF,kEAEHtwE;AAFH,AAGE,IAAMivE,SAAO,AAACW,sBAAY5vE;IACpBa,KAAO,KAAAquE,oBAAYD,OAAOjvE;AADhC,AAEE,WAAA;mDAAemK,IAAItZ;AAAnB,AACU,IAAMw+E,UAAQ,AAACjR,+CAAO,AAAC2Q,kBAAQl+E;AAA\/B,AACE,OAACqd,8CAAM\/D,IACLklE,QAAQ,KAAA1tE,cAAA;;AAAA,AAAO,OAAC4sE,gBAAYU,OAAOp+E;;6KAA3B,2CAAA,vNACE,AAAC2Q,+CAAO,6CAAKxB,eAAK,6CAAKqvE,+GAAexuE;;;AAJ9D,AAKE,2DAAA,pDAACsW,+CAAOirB,wCAAQ,AAACvxB,kBAAQo+D;;AAE\/B,AAAA;;;sBAAA,8BAAA1jF,pDAAMklF;AAAN,AAAA,IAAAF,YAAA;AAAA,AAAA,IAAA9kF,0BAAA,AAAA;AAAA,AAAA,IAAAC,wBAAA;;AAAA,AAAA,GAAA,CAAAA,wBAAAD;AAAA,AAAA,AAAA8kF,eAAA,CAAA,UAAA7kF;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA8kF,WAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,kDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAnpF,MAAA,6CAAA,+DAAA,AAAAipF;;;;;AAAA,AAAA,oDAAA,pDAAME,+DAEFzwE;AAFJ,AAGG,OAAC0wE,kDAAU1wE,IAAI,AAAC4vE,sBAAY5vE;;;AAH\/B,AAAA,oDAAA,pDAAMywE,+DAIFzwE,IAAIivE;AAJR,AAKG,YAAAC,oBAAYD,OAAOjvE;;;AALtB,AAAA,8CAAA,9CAAMywE;;AAAN,AAOA;;;oBAAA,pBAAME,gDAEH9vE;AAFH,AAGE,GAAM,uBAAA,tBAAM0uE;AAAZ,AACE,AAAMA,qBAAS,iBAAAqB,WAAA;AAAA,AAAA,oGAAAA,qCAAAA,jIAAC11C,+CAAAA,yDAAAA;;;AADlB;;AAEA,IAAM21C,SAAO,4CAAA,CAAAnpE,gDAAAA,oEAAAA,jKAACyL,2IAAKo8D,gDAAAA,qBAAS1uE;AAA5B,AACE,GAAA,EAAQ,WAAA,VAAMgwE;AACZA;;AACA,IAAM5B,SAAO,AAACW,sBAAY\/uE;AAA1B,AACE,GAAU,WAAA,VAAMouE;AAAhB;;AAAA,AACE,IAAMtS,SAAO,AAAC+T,kDAAU7vE,GAAGouE;AAA3B,AACE,AAAC1L,mDAAMgM,mBAAS5hE,gBAAM9M,GAAG87D;;AACzBA;;;;AAEZ;;;2BAAA,3BAAMmU,8DAEHjwE;AAFH,AAGE,GAAM,uBAAA,tBAAM0uE;AAAZ,AACE,AAAMA,qBAAS,iBAAAwB,WAAA;AAAA,AAAA,oGAAAA,qCAAAA,jIAAC71C,+CAAAA,yDAAAA;;;AADlB;;AAEA,IAAM21C,SAAO,4CAAA,CAAAnpE,gDAAAA,oEAAAA,jKAACyL,2IAAKo8D,gDAAAA,qBAAS1uE;AAA5B,AACE,GAAA,EAAQ,WAAA,VAAMgwE;AACZA;;AACA,IAAMG,SAAO,6CAAKnwE;IACbA,SAAG,EAAI,EAAK,4BAAA,5BAAUowE,qBAAiBD,oBAClC,AAAC5S,+CAAO,iGAAA,pDAAK4S,0EACbnwE;IACLouE,SAAO,AAACW,sBAAY\/uE;AAJzB,AAKC,GAAU,WAAA,VAAMouE;AAAhB;;AAAA,AACE,IAAMtS,SAAO,AAAC+T,kDAAU7vE,OAAGouE;AAA3B,AACE,AAAC1L,mDAAMgM,mBAAS5hE,gBAAM9M,OAAG87D;;AACzBA;;;;AAEX;;;oBAAA,pBAAMuU,gDAEHjC;AAFH,AAGE,OAAQA","names":["cljs.core\/*clojurescript-version*","cljs.core\/*unchecked-if*","cljs.core\/*warn-on-infer*","cljs.core\/PROTOCOL_SENTINEL","goog\/define","cljs.core\/*ns*","cljs.core\/*out*","cljs.core\/*assert*","cljs.core\/*print-fn*","_","js\/Error","cljs.core\/*print-err-fn*","cljs.core\/set-print-fn!","f","cljs.core\/set-print-err-fn!","cljs.core\/*flush-on-newline*","cljs.core\/*print-newline*","cljs.core\/*print-readably*","cljs.core\/*print-meta*","cljs.core\/*print-dup*","cljs.core\/*print-namespace-maps*","cljs.core\/*print-length*","cljs.core\/*print-level*","cljs.core\/*loaded-libs*","cljs.core\/pr-opts","cljs.core\/enable-console-print!","args","js\/console","cljs.core\/into-array","cljs.core\/truth_","x","cljs.core\/not-native","cljs.core\/identical?","y","cljs.core\/nil?","cljs.core\/array?","cljs.core\/*target*","js\/Array","cljs.core\/number?","cljs.core\/not","cljs.core\/some?","cljs.core\/object?","js\/Object","cljs.core\/string?","goog\/isString","cljs.core\/char?","cljs.core\/any?","cljs.core\/native-satisfies?","p","goog\/typeOf","cljs.core\/is_proto_","cljs.core\/*main-cli-fn*","cljs.core\/type","cljs.core\/missing-protocol","proto","obj","ty","and__6500__auto__","cljs.core\/type->str","temp__4655__auto__","s","cljs.core\/load-file","file","js\/COMPILED","js\/goog","js\/Symbol","cljs.core\/ITER_SYMBOL","cljs.core\/CHAR_MAP","cljs.core\/DEMUNGE_MAP","cljs.core\/DEMUNGE_PATTERN","cljs.core\/system-time","js\/performance","js\/process","t","js\/Date","var_args","args8827","len__7625__auto__","i__7626__auto__","G__8832","cljs.core\/make-array","argseq__7644__auto__","cljs.core\/IndexedSeq","seq8828","G__8829","cljs.core\/first","cljs.core\/next","G__8830","size","type","more-sizes","dims","dimarray","n__7435__auto__","i","cljs.core\/apply","cljs.core\/aclone","arr","len","new-arr","cljs.core\/array","var-args","a","args8844","G__8849","cljs.core\/aget","seq8845","G__8846","G__8847","array","idxs","G__8850","G__8851","G__8852","args8857","G__8863","cljs.core\/aset","seq8858","G__8859","G__8860","G__8861","val","idx","idx2","idxv","G__8864","G__8865","G__8866","G__8867","cljs.core\/alength","args8872","G__8874","aseq","cljs.core.into_array.cljs$core$IFn$_invoke$arity$2","G__8875","G__8876","G__8877","cljs.core\/reduce","args__7632__auto__","argseq__7633__auto__","cljs.core\/js-invoke","seq8882","G__8883","G__8884","cljs.core.into_array.cljs$core$IFn$_invoke$arity$1","cljs.core\/Fn","args8888","G__8890","cljs.core\/-invoke","x__7180__auto__","m__7181__auto__","cljs\/core.-invoke","cljs.core\/IFn","this","b","c","d","e","g","h","j","k","l","m","n","o","q","r","rest","cljs\/core.-clone","cljs.core\/ICloneable","cljs.core\/-clone","value","cljs\/core.-count","cljs.core\/ICounted","cljs.core\/-count","coll","cljs\/core.-empty","cljs.core\/IEmptyableCollection","cljs.core\/-empty","cljs\/core.-conj","cljs.core\/ICollection","cljs.core\/-conj","args8895","G__8897","cljs.core\/-nth","cljs\/core.-nth","cljs.core\/IIndexed","not-found","cljs.core\/ASeq","cljs\/core.-first","cljs\/core.-rest","cljs.core\/ISeq","cljs.core\/-first","cljs.core\/-rest","cljs\/core.-next","cljs.core\/INext","cljs.core\/-next","args8902","G__8904","cljs.core\/-lookup","cljs\/core.-lookup","cljs.core\/ILookup","cljs\/core.-contains-key?","cljs\/core.-assoc","cljs.core\/IAssociative","cljs.core\/-contains-key?","cljs.core\/-assoc","v","cljs\/core.-dissoc","cljs.core\/IMap","cljs.core\/-dissoc","cljs\/core.-key","cljs\/core.-val","cljs.core\/IMapEntry","cljs.core\/-key","cljs.core\/-val","cljs\/core.-disjoin","cljs.core\/ISet","cljs.core\/-disjoin","cljs\/core.-peek","cljs\/core.-pop","cljs.core\/IStack","cljs.core\/-peek","cljs.core\/-pop","cljs\/core.-assoc-n","cljs.core\/IVector","cljs.core\/-assoc-n","cljs\/core.-deref","cljs.core\/IDeref","cljs.core\/-deref","cljs\/core.-deref-with-timeout","cljs.core\/IDerefWithTimeout","cljs.core\/-deref-with-timeout","msec","timeout-val","cljs\/core.-meta","cljs.core\/IMeta","cljs.core\/-meta","cljs\/core.-with-meta","cljs.core\/IWithMeta","cljs.core\/-with-meta","meta","args8909","G__8911","cljs.core\/-reduce","cljs\/core.-reduce","cljs.core\/IReduce","start","cljs\/core.-kv-reduce","cljs.core\/IKVReduce","cljs.core\/-kv-reduce","init","cljs\/core.-equiv","cljs.core\/IEquiv","cljs.core\/-equiv","other","cljs\/core.-hash","cljs.core\/IHash","cljs.core\/-hash","cljs\/core.-seq","cljs.core\/ISeqable","cljs.core\/-seq","cljs.core\/ISequential","cljs.core\/IList","cljs.core\/IRecord","cljs\/core.-rseq","cljs.core\/IReversible","cljs.core\/-rseq","cljs\/core.-sorted-seq","cljs\/core.-sorted-seq-from","cljs\/core.-entry-key","cljs\/core.-comparator","cljs.core\/ISorted","cljs.core\/-sorted-seq","ascending?","cljs.core\/-sorted-seq-from","cljs.core\/-entry-key","entry","cljs.core\/-comparator","cljs\/core.-write","cljs\/core.-flush","cljs.core\/IWriter","cljs.core\/-write","writer","cljs.core\/-flush","cljs\/core.-pr-writer","cljs.core\/IPrintWithWriter","cljs.core\/-pr-writer","opts","cljs\/core.-realized?","cljs.core\/IPending","cljs.core\/-realized?","cljs\/core.-notify-watches","cljs\/core.-add-watch","cljs\/core.-remove-watch","cljs.core\/IWatchable","cljs.core\/-notify-watches","oldval","newval","cljs.core\/-add-watch","key","cljs.core\/-remove-watch","cljs\/core.-as-transient","cljs.core\/IEditableCollection","cljs.core\/-as-transient","cljs\/core.-conj!","cljs\/core.-persistent!","cljs.core\/ITransientCollection","cljs.core\/-conj!","tcoll","cljs.core\/-persistent!","cljs\/core.-assoc!","cljs.core\/ITransientAssociative","cljs.core\/-assoc!","cljs\/core.-dissoc!","cljs.core\/ITransientMap","cljs.core\/-dissoc!","cljs\/core.-assoc-n!","cljs\/core.-pop!","cljs.core\/ITransientVector","cljs.core\/-assoc-n!","cljs.core\/-pop!","cljs\/core.-disjoin!","cljs.core\/ITransientSet","cljs.core\/-disjoin!","cljs\/core.-compare","cljs.core\/IComparable","cljs.core\/-compare","cljs\/core.-drop-first","cljs.core\/IChunk","cljs.core\/-drop-first","cljs\/core.-chunked-first","cljs\/core.-chunked-rest","cljs.core\/IChunkedSeq","cljs.core\/-chunked-first","cljs.core\/-chunked-rest","cljs\/core.-chunked-next","cljs.core\/IChunkedNext","cljs.core\/-chunked-next","cljs\/core.-name","cljs\/core.-namespace","cljs.core\/INamed","cljs.core\/-name","cljs.core\/-namespace","cljs.core\/IAtom","cljs\/core.-reset!","cljs.core\/IReset","cljs.core\/-reset!","new-value","args8916","G__8918","cljs.core\/-swap!","cljs\/core.-swap!","cljs.core\/ISwap","xs","cljs\/core.-vreset!","cljs.core\/IVolatile","cljs.core\/-vreset!","cljs\/core.-iterator","cljs.core\/IIterable","cljs.core\/-iterator","this__7123__auto__","writer__7124__auto__","opt__7125__auto__","cljs.core\/StringBufferWriter","cljs.core\/->StringBufferWriter","sb","cljs.core\/pr-str*","goog\/string.StringBuffer","cljs.core\/int-rotate-left","Math\/imul","cljs.core\/imul","ah","al","bh","bl","cljs.core\/m3-seed","cljs.core\/m3-C1","cljs.core\/m3-C2","cljs.core\/m3-mix-K1","k1","cljs.core\/m3-mix-H1","h1","cljs.core\/m3-fmix","cljs.core\/m3-hash-int","in","cljs.core\/m3-hash-unencoded-chars","cljs.core\/string-hash-cache","cljs.core\/string-hash-cache-count","cljs.core\/hash-string*","hash","cljs.core\/add-to-string-hash-cache","cljs.core\/hash-string","cljs.core\/hash","js\/isFinite","Math\/floor","G__8936","cljs.core\/hash-combine","seed","cljs.core\/instance?","cljs.core\/symbol?","cljs.core\/Symbol","cljs.core\/hash-symbol","sym","cljs.core\/compare-symbols","nsc","G__8944","G__8945","goog.array\/defaultCompare","G__8946","G__8947","G__8948","G__8949","self__","args8950","cljs.core\/->Symbol","ns","name","str","_hash","_meta","cljs.core\/get","new-meta","h__6952__auto__","args8952","G__8954","cljs.core\/symbol","cljs.core.symbol.cljs$core$IFn$_invoke$arity$2","sym-str","args8959","cljs.core\/Var","cljs.core\/->Var","G__8960","G__8961","cljs.core\/=","G__8962","G__8963","G__8964","G__8965","G__8966","G__8967","G__8968","G__8969","G__8970","G__8971","G__8972","G__8973","G__8974","G__8975","G__8976","G__8977","G__8978","G__8979","G__8980","G__8981","G__8982","G__8983","G__8984","G__8985","G__8986","G__8987","G__8988","G__8989","G__8990","G__8991","G__8992","G__8993","G__8994","G__8995","G__8996","G__8997","G__8998","G__8999","G__9000","G__9001","G__9002","G__9003","G__9004","G__9005","cljs.core\/var?","cljs\/core.Var","cljs.core\/iterable?","cljs.core\/clone","cljs.core\/cloneable?","cljs.core\/seq","cljs.core\/rest","args9019","G__9024","seq9020","G__9021","G__9022","more","cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2","cljs.core\/ES6Iterator","cljs.core\/->ES6Iterator","cljs.core\/es6-iterator","cljs.core\/ES6IteratorSeq","cljs.core\/->ES6IteratorSeq","iter","_rest","cljs.core\/es6-iterator-seq","cljs.core\/mix-collection-hash","hash-basis","count","cljs.core\/hash-ordered-coll","hash-code","cljs.core\/empty-ordered-hash","cljs.core\/hash-unordered-coll","cljs.core\/empty-unordered-hash","G__9038","G__9039","cljs\/core.inst-ms*","cljs.core\/Inst","cljs.core\/inst-ms*","inst","cljs.core\/inst-ms","cljs.core\/inst?","goog\/getUid","cljs.core\/inc","cljs.core\/Reduced","cljs.core\/->Reduced","cljs.core\/reduced","cljs.core\/reduced?","cljs.core\/ensure-reduced","cljs.core\/unreduced","cljs.core\/deref","args9042","G__9044","cljs.core\/ci-reduce","cicoll","cnt","cljs.core._nth.cljs$core$IFn$_invoke$arity$2","nval","G__9045","G__9046","G__9047","G__9048","G__9049","G__9050","args9061","G__9063","cljs.core\/array-reduce","G__9064","G__9065","G__9066","G__9067","G__9068","G__9069","cljs.core\/counted?","cljs.core\/indexed?","args9084","G__9086","cljs.core\/-indexOf","cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3","cljs.core\/count","x__6848__auto__","y__6849__auto__","cljs.core\/nth","args9092","G__9094","cljs.core\/-lastIndexOf","cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3","x__6855__auto__","y__6856__auto__","cljs.core\/IndexedSeqIterator","cljs.core\/->IndexedSeqIterator","ret","cljs.core\/->IndexedSeq","cljs.core\/equiv-sequential","cljs.core\/cons","cljs.core\/List","cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4","cljs.core\/RSeq","this__7526__auto__","args9102","G__9104","cljs.core\/prim-seq","prim","cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2","args9109","G__9111","cljs.core\/array-seq","cljs.core\/->RSeq","ci","G__9116","G__9117","cljs.core\/with-meta","col","cljs.core\/seq-reduce","cljs.core\/second","cljs.core\/ffirst","cljs.core\/nfirst","cljs.core\/fnext","cljs.core\/nnext","cljs.core\/last","sn","args9121","G__9126","cljs.core\/conj","seq9122","G__9123","G__9124","x__7354__auto__","cljs.core.conj.cljs$core$IFn$_invoke$arity$2","cljs.core\/empty","cljs.core\/accumulating-seq-count","acc","args9140","G__9142","cljs.core\/linear-traversal-nth","cljs.core._nth.cljs$core$IFn$_invoke$arity$3","args9152","G__9154","cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$2","cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$3","cljs.core\/nthrest","args9165","G__9167","cljs.core._lookup.cljs$core$IFn$_invoke$arity$2","cljs.core._lookup.cljs$core$IFn$_invoke$arity$3","args9174","G__9180","cljs.core\/assoc","seq9175","G__9176","G__9177","G__9178","cljs.core\/PersistentHashMap","kvs","cljs.core.assoc.cljs$core$IFn$_invoke$arity$3","args9189","G__9194","cljs.core\/dissoc","seq9190","G__9191","G__9192","ks","cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2","cljs.core\/fn?","or__6512__auto__","goog\/isFunction","args9206","cljs.core\/MetaFn","cljs.core\/->MetaFn","afn","cljs.core\/meta","cljs.core\/peek","cljs.core\/pop","args9212","G__9217","cljs.core\/disj","seq9213","G__9214","G__9215","cljs.core.disj.cljs$core$IFn$_invoke$arity$2","cljs.core\/empty?","cljs.core\/coll?","cljs.core\/set?","cljs.core\/associative?","cljs.core\/sequential?","cljs.core\/sorted?","cljs.core\/reduceable?","cljs.core\/map?","cljs.core\/record?","cljs.core\/vector?","cljs.core\/chunked-seq?","args9245","G__9248","cljs.core\/js-obj","seq9246","keyvals","goog.object\/create","cljs.core\/js-keys","keys","G__9257","G__9258","goog.object\/forEach","cljs.core\/js-delete","cljs.core\/array-copy","from","to","cljs.core\/array-copy-downward","cljs.core\/lookup-sentinel","cljs.core\/false?","cljs.core\/true?","cljs.core\/boolean?","cljs.core\/undefined?","cljs.core\/seq?","cljs.core\/seqable?","cljs.core\/boolean","cljs.core\/ifn?","cljs.core\/integer?","js\/isNaN","js\/Infinity","js\/parseFloat","js\/parseInt","cljs.core\/int?","goog\/math.Integer","goog\/math.Long","cljs.core\/pos-int?","cljs.core\/neg-int?","cljs.core\/nat-int?","cljs.core\/float?","cljs.core\/double?","cljs.core\/infinite?","js\/Number.POSITIVE_INFINITY","js\/Number.NEGATIVE_INFINITY","cljs.core\/contains?","cljs.core.get.cljs$core$IFn$_invoke$arity$3","cljs.core\/find","cljs.core.get.cljs$core$IFn$_invoke$arity$2","args9279","G__9284","cljs.core\/distinct?","seq9280","G__9281","G__9282","etc","cljs.core\/compare","args9293","G__9295","cljs.core\/compare-indexed","ys","xl","yl","cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$4","cljs.core.nth.cljs$core$IFn$_invoke$arity$2","cljs.core\/fn->comparator","args9304","G__9306","cljs.core\/sort","cljs.core.sort.cljs$core$IFn$_invoke$arity$2","comp","cljs.core\/to-array","G__9307","G__9308","goog.array\/stableSort","cljs.core\/chunk-first","s__11839","args9315","G__9317","cljs.core\/sort-by","keyfn","cljs.core.sort_by.cljs$core$IFn$_invoke$arity$3","args9322","G__9324","G__9325","G__9326","G__9327","G__9328","G__9329","cljs.core\/shuffle","goog.array\/shuffle","cljs.core\/vec","args9336","G__9338","cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$2","cljs.core._reduce.cljs$core$IFn$_invoke$arity$2","cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2","cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$3","cljs.core._reduce.cljs$core$IFn$_invoke$arity$3","cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3","cljs.core\/reduce-kv","cljs.core\/identity","args9345","G__9347","cljs.core\/completing","cljs.core.completing.cljs$core$IFn$_invoke$arity$2","cf","args9353","G__9355","cljs.core\/transduce","xform","cljs.core.transduce.cljs$core$IFn$_invoke$arity$4","cljs.core.reduce.cljs$core$IFn$_invoke$arity$3","args9360","G__9365","cljs.core\/+","seq9361","G__9362","G__9363","args9370","G__9375","cljs.core\/-","seq9371","G__9372","G__9373","args9380","G__9385","cljs.core\/*","seq9381","G__9382","G__9383","cljs.core\/\/","args9390","G__9395","seq9391","G__9392","G__9393","args9400","G__9405","cljs.core\/<","seq9401","G__9402","G__9403","args9413","G__9418","cljs.core\/<=","seq9414","G__9415","G__9416","args9426","G__9431","cljs.core\/>","seq9427","G__9428","G__9429","args9439","G__9444","cljs.core\/>=","seq9440","G__9441","G__9442","cljs.core\/dec","args9452","G__9457","cljs.core\/max","seq9453","G__9454","G__9455","args9462","G__9467","cljs.core\/min","seq9463","G__9464","G__9465","cljs.core\/byte","cljs.core\/char","js\/String","cljs.core\/short","cljs.core\/float","cljs.core\/double","cljs.core\/unchecked-byte","cljs.core\/unchecked-char","cljs.core\/unchecked-short","cljs.core\/unchecked-float","cljs.core\/unchecked-double","args9472","G__9477","cljs.core\/unchecked-add","seq9473","G__9474","G__9475","args9482","G__9487","cljs.core\/unchecked-add-int","seq9483","G__9484","G__9485","cljs.core\/unchecked-dec","cljs.core\/unchecked-dec-int","args9492","G__9497","cljs.core\/unchecked-divide-int","seq9493","G__9494","G__9495","cljs.core\/unchecked-inc","cljs.core\/unchecked-inc-int","args9502","G__9507","cljs.core\/unchecked-multiply","seq9503","G__9504","G__9505","args9512","G__9517","cljs.core\/unchecked-multiply-int","seq9513","G__9514","G__9515","cljs.core\/unchecked-negate","cljs.core\/unchecked-negate-int","cljs.core\/unchecked-remainder-int","cljs.core\/mod","args9522","G__9527","cljs.core\/unchecked-subtract","seq9523","G__9524","G__9525","args9532","G__9537","cljs.core\/unchecked-subtract-int","seq9533","G__9534","G__9535","cljs.core\/fix","Math\/ceil","cljs.core\/int","cljs.core\/unchecked-int","cljs.core\/long","cljs.core\/unchecked-long","cljs.core\/booleans","cljs.core\/bytes","cljs.core\/chars","cljs.core\/shorts","cljs.core\/ints","cljs.core\/floats","cljs.core\/doubles","cljs.core\/longs","cljs.core\/js-mod","cljs.core\/quot","rem","cljs.core\/rem","args9542","G__9547","cljs.core\/bit-xor","seq9543","G__9544","G__9545","args9552","G__9557","cljs.core\/bit-and","seq9553","G__9554","G__9555","args9562","G__9567","cljs.core\/bit-or","seq9563","G__9564","G__9565","args9572","G__9577","cljs.core\/bit-and-not","seq9573","G__9574","G__9575","cljs.core\/bit-clear","cljs.core\/bit-flip","cljs.core\/bit-not","cljs.core\/bit-set","cljs.core\/bit-test","cljs.core\/bit-shift-left","cljs.core\/bit-shift-right","cljs.core\/bit-shift-right-zero-fill","cljs.core\/unsigned-bit-shift-right","cljs.core\/bit-count","args9582","G__9587","cljs.core\/==","seq9583","G__9584","G__9585","cljs.core\/pos?","cljs.core\/zero?","cljs.core\/neg?","cljs.core\/nthnext","args9597","G__9601","cljs.core\/str","seq9598","G__9599","args9608","G__9610","cljs.core\/subs","end","cljs.core\/hash-coll","res","cljs.core\/hash-imap","cljs.core\/key","cljs.core\/val","cljs.core\/hash-iset","cljs.core\/extend-object!","fn-map","seq__9633","chunk__9634","count__9635","i__9636","vec__9637","cljs.core.nth.cljs$core$IFn$_invoke$arity$3","temp__4657__auto__","c__7331__auto__","cljs.core\/chunk-rest","vec__9640","key-name","str-name","cljs.core\/name","cljs.core\/->List","first","__hash","cljs.core\/list?","cljs.core\/EmptyList","cljs.core\/->EmptyList","cljs.core\/reversible?","cljs.core\/rseq","rev","cljs.core\/reverse","cljs.core\/list","seq9678","cljs.core\/Cons","cljs.core\/->Cons","cljs.core\/hash-keyword","cljs.core\/compare-keywords","G__9697","G__9698","G__9699","G__9700","G__9701","G__9702","args9703","cljs.core\/Keyword","cljs.core\/->Keyword","fqn","kw","cljs.core\/keyword?","cljs.core\/keyword-identical?","cljs.core\/symbol-identical?","cljs.core\/namespace","cljs.core\/ident?","cljs.core\/simple-ident?","cljs.core\/qualified-ident?","cljs.core\/simple-symbol?","cljs.core\/qualified-symbol?","cljs.core\/simple-keyword?","cljs.core\/qualified-keyword?","args9707","G__9709","cljs.core\/keyword","parts","cljs.core\/LazySeq","cljs.core\/->LazySeq","fn","ls","cljs.core\/ChunkBuffer","cljs.core\/->ChunkBuffer","buf","cljs.core\/ArrayChunk","cljs.core\/chunk-buffer","capacity","cljs.core\/->ArrayChunk","off","args9717","G__9719","cljs.core\/array-chunk","cljs.core\/ChunkedCons","cljs.core\/->ChunkedCons","chunk","cljs.core\/chunk-cons","cljs.core\/chunk-append","cljs.core\/chunk","cljs.core\/chunk-next","ary","cljs.core\/to-array-2d","args9733","G__9735","cljs.core\/int-array","size-or-seq","cljs.core.int_array.cljs$core$IFn$_invoke$arity$2","init-val-or-seq","args9745","G__9747","cljs.core\/long-array","cljs.core.long_array.cljs$core$IFn$_invoke$arity$2","args9757","G__9759","cljs.core\/double-array","cljs.core.double_array.cljs$core$IFn$_invoke$arity$2","args9769","G__9771","cljs.core\/object-array","cljs.core.object_array.cljs$core$IFn$_invoke$arity$2","cljs.core\/bounded-count","cljs.core\/spread","arglist","G__9784","args9785","G__9790","cljs.core\/concat","seq9786","G__9787","G__9788","cljs.core.concat.cljs$core$IFn$_invoke$arity$2","zs","cat","xys","args9801","G__9808","cljs.core\/list*","seq9802","G__9803","G__9804","G__9805","G__9806","cljs.core\/transient","cljs.core\/persistent!","args9813","G__9818","cljs.core\/conj!","seq9814","G__9815","G__9816","vals","ntcoll","args9826","G__9832","cljs.core\/assoc!","seq9827","G__9828","G__9829","G__9830","args9841","G__9846","cljs.core\/dissoc!","seq9842","G__9843","G__9844","cljs.core\/pop!","args9854","G__9859","cljs.core\/disj!","seq9855","G__9856","G__9857","cljs.core\/apply-to","argc","a7479","b7480","c7481","d7482","e7483","f7484","g7485","h7486","i7487","j7488","k7489","l7490","m7491","n7492","o7493","p7494","q7495","r7496","s7497","t7498","args9867","G__9875","seq9868","G__9869","G__9870","G__9871","G__9872","G__9873","fixed-arity","bc","cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$2","cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$3","z","cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4","args9880","G__9889","cljs.core\/vary-meta","seq9881","G__9882","G__9883","G__9884","G__9885","G__9886","G__9887","G__9890","G__9891","G__9892","G__9893","G__9894","G__9895","G__9896","G__9897","G__9898","G__9899","G__9900","G__9901","G__9902","G__9903","G__9904","cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic","args9909","G__9914","cljs.core\/not=","seq9910","G__9911","G__9912","cljs.core.apply.cljs$core$IFn$_invoke$arity$4","cljs.core\/not-empty","cljs.core\/nil-iter","cljs.core\/t_cljs$core9922","_9924","meta9923","cljs.core\/->t_cljs$core9922","cljs.core\/StringIter","cljs.core\/->StringIter","cljs.core\/string-iter","cljs.core\/ArrayIter","cljs.core\/->ArrayIter","cljs.core\/array-iter","cljs.core\/INIT","cljs.core\/START","cljs.core\/SeqIter","cljs.core\/->SeqIter","_seq","_next","cljs.core\/seq-iter","cljs.core\/iter","cljs.core\/lazy-transformer","stepper","cljs.core\/LazyTransformer","cljs.core\/Stepper","cljs.core\/->Stepper","lt","G__9925","G__9926","cljs.core\/stepper","result","input","stepfn","cljs.core\/MultiStepper","cljs.core\/->MultiStepper","iters","nexts","cljs.core.apply.cljs$core$IFn$_invoke$arity$2","args9931","G__9933","cljs.core\/multi-stepper","cljs.core.multi_stepper.cljs$core$IFn$_invoke$arity$3","cljs.core\/->LazyTransformer","colls","seq__9940","chunk__9941","count__9942","i__9943","args9965","G__9970","cljs.core\/sequence","seq9966","G__9967","G__9968","cljs.core\/every?","pred","G__9976","cljs.core\/not-every?","cljs.core\/some","G__9982","cljs.core\/not-any?","cljs.core\/even?","cljs.core\/odd?","cljs.core\/complement","cljs.core\/constantly","args9994","G__10000","cljs.core\/comp","seq9995","G__9996","G__9997","G__9998","G__10001","G__10002","G__10003","G__10004","G__10005","cljs.core.apply.cljs$core$IFn$_invoke$arity$5","G__10006","G__10007","G__10008","G__10009","G__10010","G__10011","G__10012","G__10013","G__10014","G__10015","f1","f2","f3","fs","args10037","G__10044","cljs.core\/partial","seq10038","G__10039","G__10040","G__10041","G__10042","arg1","arg2","arg3","args10070","G__10072","cljs.core\/fnil","G__10073","G__10074","G__10075","G__10076","G__10077","G__10078","ds","G__10079","G__10080","G__10081","G__10082","G__10083","G__10084","G__10085","G__10086","G__10087","G__10088","args10111","G__10113","cljs.core\/map-indexed","rf","cljs.core\/volatile!","G__10114","G__10115","G__10116","G__10117","G__10138","G__10139","mapi","G__10140","G__10141","args10150","G__10152","cljs.core\/keep","G__10153","cljs.core.keep.cljs$core$IFn$_invoke$arity$2","G__10154","cljs.core\/Atom","cljs.core\/->Atom","state","validator","watches","seq__10164","chunk__10165","count__10166","i__10167","vec__10168","vec__10171","args10186","G__10190","cljs.core\/atom","p__10191","map__10192","cljs.core\/hash-map","seq10187","G__10188","cljs.core\/reset!","validate","old-value","args10198","G__10205","cljs.core\/swap!","seq10199","G__10200","G__10201","G__10202","G__10203","G__10206","cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$2","G__10207","G__10208","cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$3","G__10209","G__10210","G__10211","cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$4","cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$5","cljs.core\/compare-and-set!","cljs.core\/set-validator!","iref","cljs.core\/get-validator","cljs.core\/Volatile","cljs.core\/->Volatile","new-state","cljs.core\/volatile?","cljs.core\/vreset!","vol","args10216","G__10218","cljs.core\/keep-indexed","ia","G__10243","G__10244","keepi","G__10245","G__10246","args10262","G__10268","cljs.core\/every-pred","seq10263","G__10264","G__10265","G__10266","cljs$core$ep1.cljs$core$IFn$_invoke$arity$3","p1","p2","cljs$core$ep2.cljs$core$IFn$_invoke$arity$3","p1__10256#","p3","cljs$core$ep3.cljs$core$IFn$_invoke$arity$3","p1__10257#","ps","p1__10258#","p1__10259#","p1__10260#","cljs$core$epn.cljs$core$IFn$_invoke$arity$3","p1__10261#","args10299","G__10305","cljs.core\/some-fn","seq10300","G__10301","G__10302","G__10303","cljs$core$sp1.cljs$core$IFn$_invoke$arity$3","cljs$core$sp2.cljs$core$IFn$_invoke$arity$3","p1__10293#","cljs$core$sp3.cljs$core$IFn$_invoke$arity$3","p1__10294#","p1__10295#","p1__10296#","p1__10297#","cljs$core$spn.cljs$core$IFn$_invoke$arity$3","p1__10298#","args10331","G__10338","cljs.core\/map","seq10332","G__10333","G__10334","G__10335","G__10336","G__10339","G__10340","inputs","G__10341","G__10342","cljs.core.apply.cljs$core$IFn$_invoke$arity$3","G__10343","cljs.core.map.cljs$core$IFn$_invoke$arity$2","G__10344","c1","c2","s1","s2","G__10345","G__10346","cljs.core.map.cljs$core$IFn$_invoke$arity$3","c3","s3","G__10347","G__10348","G__10349","cljs.core.map.cljs$core$IFn$_invoke$arity$4","step","cs","ss","p1__10330#","cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic","args10364","G__10366","cljs.core\/take","na","nn","cljs.core.take.cljs$core$IFn$_invoke$arity$2","args10372","G__10374","cljs.core\/drop","args10382","G__10384","cljs.core\/drop-last","cljs.core.drop_last.cljs$core$IFn$_invoke$arity$2","cljs.core.drop.cljs$core$IFn$_invoke$arity$2","cljs.core\/take-last","lead","args10391","G__10393","cljs.core\/drop-while","da","drop?","G__10395","cljs.core\/cycle","cljs.core\/split-at","args10403","G__10405","cljs.core\/repeat","cljs.core.repeat.cljs$core$IFn$_invoke$arity$1","cljs.core\/replicate","args10410","G__10412","cljs.core\/repeatedly","cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$1","cljs.core\/iterate","G__10419","G__10420","args10421","G__10426","cljs.core\/interleave","seq10422","G__10423","G__10424","cljs.core.interleave.cljs$core$IFn$_invoke$arity$2","args10431","G__10433","cljs.core\/interpose","sep","started","sepr","cljs.core\/flatten1","args10447","G__10451","cljs.core\/mapcat","seq10448","G__10449","cljs.core.comp.cljs$core$IFn$_invoke$arity$2","cljs.core.map.cljs$core$IFn$_invoke$arity$1","cljs.core\/cat","args10456","G__10458","cljs.core\/filter","G__10459","cljs.core.filter.cljs$core$IFn$_invoke$arity$2","args10468","G__10470","cljs.core\/remove","cljs.core.filter.cljs$core$IFn$_invoke$arity$1","cljs.core\/tree-seq","branch?","children","root","walk","node","cljs.core.mapcat.cljs$core$IFn$_invoke$arity$variadic","cljs.core\/flatten","p1__10475#","args10476","G__10478","cljs.core\/into","args10485","G__10492","cljs.core\/mapv","seq10486","G__10487","G__10488","G__10489","G__10490","cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2","cljs.core.into.cljs$core$IFn$_invoke$arity$2","cljs.core\/filterv","args10497","G__10499","cljs.core\/partition","cljs.core.partition.cljs$core$IFn$_invoke$arity$3","pad","cljs.core.partition.cljs$core$IFn$_invoke$arity$4","args10504","G__10506","cljs.core\/get-in","sentinel","p__10514","vec__10521","seq__10522","first__10523","cljs.core\/assoc-in","G__10524","G__10525","G__10526","args10527","G__10536","cljs.core\/update-in","p__10537","vec__10538","seq__10539","first__10540","p__10542","vec__10543","seq__10544","first__10545","p__10548","vec__10549","seq__10550","first__10551","p__10555","vec__10556","seq__10557","first__10558","p__10563","vec__10564","seq__10565","first__10566","seq10528","G__10529","G__10530","G__10531","G__10532","G__10533","G__10534","cljs.core.update_in.cljs$core$IFn$_invoke$arity$3","G__10541","cljs.core.update_in.cljs$core$IFn$_invoke$arity$4","G__10546","G__10547","cljs.core.update_in.cljs$core$IFn$_invoke$arity$5","G__10552","G__10553","G__10554","cljs.core.update_in.cljs$core$IFn$_invoke$arity$6","G__10559","G__10560","G__10561","G__10562","args10571","G__10580","cljs.core\/update","seq10572","G__10573","G__10574","G__10575","G__10576","G__10577","G__10578","G__10581","G__10582","G__10583","G__10584","G__10585","G__10586","G__10587","G__10588","G__10589","G__10590","cljs.core\/VectorNode","cljs.core\/->VectorNode","edit","cljs.core\/pv-fresh-node","cljs.core\/pv-aget","cljs.core\/pv-aset","cljs.core\/pv-clone-node","cljs.core\/tail-off","pv","cljs.core\/new-path","level","ll","embed","cljs.core\/push-tail","parent","tailnode","subidx","child","node-to-insert","G__10601","G__10602","G__10603","G__10604","cljs.core\/vector-index-out-of-bounds","cljs.core\/first-array-for-longvec","cljs.core\/unchecked-array-for","cljs.core\/array-for","cljs.core\/do-assoc","G__10614","G__10615","G__10616","G__10617","G__10618","cljs.core\/pop-tail","new-child","G__10622","G__10623","G__10624","cljs.core\/RangedIterator","cljs.core\/->RangedIterator","base","cljs.core\/ranged-iterator","args10625","cljs.core\/PersistentVector","cljs.core\/->PersistentVector","shift","tail","new-tail","nr","new-root","cnt-1","root-overflow?","new-shift","n-r","me-iter","you-iter","G__10631","G__10632","G__10633","G__10634","cljs.core\/chunked-seq","cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2","G__10629","G__10630","G__10626","G__10627","G__10628","cljs.core\/TransientVector","cljs.core\/tv-editable-root","cljs.core\/tv-editable-tail","no-clone","out","cljs.core\/vector","seq10651","cljs.core\/ChunkedSeq","cljs.core\/->ChunkedSeq","vec","G__10665","G__10666","G__10667","G__10668","G__10655","G__10656","G__10657","G__10658","cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$2","G__10669","G__10670","G__10671","G__10672","G__10673","G__10674","G__10675","G__10676","G__10659","G__10660","G__10661","cljs.core\/subvec","cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3","G__10662","G__10663","G__10664","args10679","G__10681","args10686","cljs.core\/Subvec","cljs.core\/->Subvec","cljs.core\/build-subvec","G__10695","G__10696","G__10697","G__10698","G__10699","G__10701","G__10702","G__10703","G__10704","G__10705","subvec-seq","v-pos","G__10690","G__10691","G__10692","G__10693","G__10694","G__10687","G__10688","G__10689","args10717","G__10719","cljs.core.subvec.cljs$core$IFn$_invoke$arity$3","cljs.core\/tv-ensure-editable","tl","cljs.core\/tv-push-tail","tv","tail-node","G__10732","G__10733","G__10734","G__10735","cljs.core\/tv-pop-tail","G__10739","G__10740","G__10741","cljs.core\/unchecked-editable-array-for","args10744","cljs.core\/->TransientVector","new-root-array","trimmed-tail","go","cljs.core\/PersistentQueueIter","cljs.core\/->PersistentQueueIter","fseq","riter","cljs.core\/PersistentQueueSeq","cljs.core\/->PersistentQueueSeq","front","rear","cljs.core\/PersistentQueue","cljs.core\/->PersistentQueue","cljs.core\/NeverEquiv","cljs.core\/->NeverEquiv","cljs.core\/never-equiv","cljs.core\/equiv-map","xkv","cljs.core\/scan-array","incr","cljs.core\/obj-map-compare-keys","cljs.core\/obj-map->hash-map","so","mm","cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3","cljs.core\/obj-clone","new-obj","args10763","cljs.core\/ObjMap","cljs.core\/->ObjMap","strobj","update-count","p1__10762#","new-strobj","new-keys","G__10764","G__10765","G__10766","cljs.core\/RecordIter","cljs.core\/->RecordIter","record","base-count","fields","ext-map-iter","cljs.core\/ES6EntriesIterator","cljs.core\/->ES6EntriesIterator","vec__10772","cljs.core\/es6-entries-iterator","cljs.core\/ES6SetEntriesIterator","cljs.core\/->ES6SetEntriesIterator","cljs.core\/es6-set-entries-iterator","cljs.core\/array-index-of-nil?","cljs.core\/array-index-of-keyword?","kstr","cljs.core\/array-index-of-symbol?","cljs.core\/array-index-of-identical?","cljs.core\/array-index-of-equiv?","cljs.core\/array-index-of","cljs.core\/array-map-index-of","cljs.core\/array-extend-kv","narr","cljs.core\/array-map-extend-kv","cljs.core\/PersistentArrayMapSeq","cljs.core\/->PersistentArrayMapSeq","cljs.core\/persistent-array-map-seq","cljs.core\/PersistentArrayMapIterator","cljs.core\/->PersistentArrayMapIterator","args10784","cljs.core\/PersistentArrayMap","cljs.core\/->PersistentArrayMap","cljs.core\/keys","cljs.core\/vals","seq__10785","chunk__10786","count__10787","i__10788","vec__10789","vec__10792","es","alen","G__10801","new-len","G__10795","G__10796","G__10797","cljs.core\/TransientArrayMap","no-check","G__10829","G__10836","cljs.core\/->TransientArrayMap","editable?","cljs.core\/array->transient-hash-map","G__10844","cljs.core\/Box","cljs.core\/->Box","cljs.core\/key-test","cljs.core\/mask","args10850","G__10852","cljs.core\/clone-and-set","G__10853","G__10854","cljs.core\/remove-pair","cljs.core\/bitmap-indexed-node-index","bitmap","bit","cljs.core\/bitpos","args10859","G__10861","cljs.core\/edit-and-set","inode","editable","cljs.core\/inode-kv-reduce","G__10869","G__10870","G__10871","cljs.core\/NodeIterator","cljs.core\/->NodeIterator","next-entry","next-iter","node-or-val","found","new-iter","cljs.core\/BitmapIndexedNode","cljs.core\/->BitmapIndexedNode","added-leaf?","nodes","jdx","cljs.core\/ArrayNode","key-or-nil","val-or-node","cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3","cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$5","G__10881","G__10882","G__10883","G__10884","G__10885","G__10886","cljs.core\/create-node","cljs.core\/create-inode-seq","earr","cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4","cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$6","G__10874","G__10875","G__10876","G__10877","G__10878","G__10879","G__10880","removed-leaf?","cljs.core\/pack-array-node","array-node","cljs.core\/ArrayNodeIterator","cljs.core\/->ArrayNodeIterator","cljs.core\/->ArrayNode","cljs.core\/create-array-node-seq","cljs.core\/hash-collision-node-find-index","lim","cljs.core\/HashCollisionNode","cljs.core\/->HashCollisionNode","collision-hash","args10910","G__10912","key1","val1","key2hash","key2","val2","key1hash","cljs.core\/NodeSeq","cljs.core\/->NodeSeq","G__10917","G__10918","G__10919","G__10920","G__10921","G__10922","args10925","G__10927","cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3","node-seq","cljs.core\/ArrayNodeSeq","cljs.core\/->ArrayNodeSeq","G__10934","G__10935","G__10936","G__10937","args10940","G__10942","cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4","nj","cljs.core\/HashMapIter","cljs.core\/->HashMapIter","nil-val","root-iter","seen","args10949","cljs.core\/->PersistentHashMap","has-nil?","seq__10950","chunk__10951","count__10952","i__10953","vec__10954","vec__10957","cljs.core\/TransientHashMap","vs","cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2","cljs.core\/->TransientHashMap","cljs.core\/tree-map-seq-push","stack","cljs.core\/PersistentTreeMapSeq","cljs.core\/->PersistentTreeMapSeq","next-stack","cljs.core\/create-tree-map-seq","tree","cljs.core\/balance-left","ins","right","cljs.core\/RedNode","cljs.core\/BlackNode","cljs.core\/balance-right","left","cljs.core\/balance-left-del","del","cljs.core\/balance-right-del","cljs.core\/tree-map-kv-reduce","G__10999","G__11000","G__11001","G__11002","G__11003","G__11004","G__11005","G__11006","G__11007","args11008","cljs.core\/->BlackNode","args11012","cljs.core\/->RedNode","cljs.core\/tree-map-add","G__11028","G__11029","G__11030","G__11031","G__11032","G__11033","G__11034","G__11035","G__11036","G__11037","G__11038","G__11039","cljs.core\/tree-map-append","app","G__11048","G__11049","G__11050","G__11051","G__11052","G__11053","G__11054","G__11055","cljs.core\/tree-map-remove","G__11066","G__11067","G__11068","G__11069","G__11070","G__11071","G__11072","G__11073","G__11074","G__11075","cljs.core\/tree-map-replace","tk","G__11084","G__11085","G__11086","G__11087","G__11088","G__11089","G__11090","G__11091","args11092","cljs.core\/PersistentTreeMap","cljs.core\/->PersistentTreeMap","seq__11093","chunk__11094","count__11095","i__11096","vec__11097","vec__11100","G__11103","G__11104","found-node","G__11105","G__11106","seq11132","cljs.core\/array-map","seq11138","cljs.core\/obj-map","seq11142","cljs.core\/sorted-map","seq11149","cljs.core\/sorted-map-by","seq11155","G__11156","comparator","cljs.core\/KeySeq","cljs.core\/->KeySeq","mseq","me","nseq","hash-map","map-entry","cljs.core\/ValSeq","cljs.core\/->ValSeq","cljs.core\/merge","seq11172","maps","p1__11170#","p2__11171#","cljs.core.reduce.cljs$core$IFn$_invoke$arity$2","cljs.core\/merge-with","seq11176","G__11177","merge-entry","G__11178","G__11179","merge2","m1","m2","cljs.core\/select-keys","map","keyseq","cljs.core\/HashSetIter","cljs.core\/->HashSetIter","args11186","cljs.core\/PersistentHashSet","cljs.core\/->PersistentHashSet","seq__11187","chunk__11188","count__11189","i__11190","vec__11191","vec__11194","p1__11185#","cljs.core\/TransientHashSet","items","args11220","cljs.core\/->TransientHashSet","transient-map","cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$2","args11223","cljs.core\/PersistentTreeSet","cljs.core\/->PersistentTreeSet","tree-map","seq__11224","chunk__11225","count__11226","i__11227","vec__11228","vec__11231","p1__11222#","cljs.core\/set-from-indexed-seq","iseq","a__7429__auto__","cljs.core\/set","args11251","G__11254","cljs.core\/hash-set","seq11252","cljs.core\/sorted-set","seq11259","cljs.core\/sorted-set-by","seq11263","G__11264","args11270","G__11272","cljs.core\/replace","smap","p1__11268#","p1__11269#","args11277","G__11279","cljs.core\/distinct","p__11286","vec__11287","cljs.core\/butlast","cljs.core\/zipmap","args11306","G__11312","cljs.core\/max-key","seq11307","G__11308","G__11309","G__11310","p1__11304#","p2__11305#","cljs.core.max_key.cljs$core$IFn$_invoke$arity$3","args11319","G__11325","cljs.core\/min-key","seq11320","G__11321","G__11322","G__11323","p1__11317#","p2__11318#","cljs.core.min_key.cljs$core$IFn$_invoke$arity$3","cljs.core\/ArrayList","cljs.core\/->ArrayList","cljs.core\/array-list","args11330","G__11332","cljs.core\/partition-all","cljs.core.partition_all.cljs$core$IFn$_invoke$arity$3","args11338","G__11340","cljs.core\/take-while","G__11341","cljs.core.take_while.cljs$core$IFn$_invoke$arity$2","cljs.core\/mk-bound-fn","sc","test","G__11351","G__11352","G__11353","G__11354","args11355","G__11357","cljs.core\/subseq","include","vec__11358","start-test","start-key","end-test","end-key","vec__11361","args11368","G__11370","cljs.core\/rsubseq","vec__11371","vec__11374","cljs.core\/RangeIterator","cljs.core\/->RangeIterator","cljs.core\/Range","cljs.core\/->Range","rng","G__11381","args11386","G__11388","cljs.core\/range","cljs.core.range.cljs$core$IFn$_invoke$arity$3","js\/Number","args11393","G__11395","cljs.core\/take-nth","cljs.core.take_nth.cljs$core$IFn$_invoke$arity$2","cljs.core\/split-with","cljs.core.drop_while.cljs$core$IFn$_invoke$arity$2","args11402","G__11404","cljs.core\/partition-by","pa","pval","fst","fv","run","p1__11401#","cljs.core.partition_by.cljs$core$IFn$_invoke$arity$2","cljs.core\/frequencies","counts","args11410","G__11412","cljs.core\/reductions","cljs.core.reductions.cljs$core$IFn$_invoke$arity$3","G__11413","G__11414","args11429","G__11435","cljs.core\/juxt","seq11430","G__11431","G__11432","G__11433","p1__11419#","p2__11420#","p1__11421#","p2__11422#","p1__11423#","p2__11424#","p1__11425#","p2__11426#","p1__11427#","p2__11428#","args11464","G__11466","cljs.core\/dorun","args11474","G__11476","cljs.core\/doall","cljs.core.dorun.cljs$core$IFn$_invoke$arity$1","cljs.core.dorun.cljs$core$IFn$_invoke$arity$2","cljs.core\/regexp?","js\/RegExp","cljs.core\/re-matches","re","matches","js\/TypeError","cljs.core\/re-find","cljs.core\/re-seq","match-data","match-idx","match-str","post-match","cljs.core.subs.cljs$core$IFn$_invoke$arity$2","cljs.core\/re-pattern","vec__11484","prefix","flags","pattern","cljs.core\/pr-sequential-writer","print-one","begin","*print-level*11494","G__11495","G__11496","G__11497","G__11498","G__11499","G__11500","cljs.core\/write-all","seq11511","G__11512","seq__11513","chunk__11514","count__11515","i__11516","cljs.core\/string-print","cljs.core\/flush","cljs.core\/char-escapes","obj11533","cljs.core\/quote-string","match","cljs.core\/print-meta?","cljs.core\/pr-writer-impl","G__11548","G__11549","G__11550","cljs.core\/pr-writer","G__11552","G__11553","G__11554","G__11555","cljs.core\/print-map","cljs.core.keyword.cljs$core$IFn$_invoke$arity$1","goog.string\/isEmpty","cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic","normalize","alt-impl","G__11563","G__11564","G__11565","cljs.core\/pr-seq-writer","objs","seq__11570","chunk__11571","count__11572","i__11573","cljs.core\/pr-sb-with-opts","cljs.core\/pr-str-with-opts","cljs.core\/prn-str-with-opts","cljs.core\/pr-with-opts","args11586","G__11588","cljs.core\/newline","cljs.core.newline.cljs$core$IFn$_invoke$arity$1","cljs.core\/pr-str","seq11593","cljs.core\/prn-str","seq11597","cljs.core\/pr","seq11601","cljs.core\/print","cljs.core\/print-str","seq11607","cljs.core\/println","seq11611","cljs.core\/println-str","seq11615","cljs.core\/prn","seq11619","cljs.core\/strip-ns","named","cljs.core.keyword.cljs$core$IFn$_invoke$arity$2","cljs.core\/lift-ns","G__11648","vec__11649","seq__11650","first__11651","vec__11652","vec__11655","seq__11656","first__11657","vec__11658","entries","lm","new-ns","cljs.core\/print-prefix-map","w","G__11673","G__11674","G__11675","G__11676","G__11677","G__11678","vec__11685","lift-map","cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2","cljs.core\/alter-meta!","seq11688","G__11689","G__11690","cljs.core\/reset-meta!","cljs.core\/add-watch","cljs.core\/remove-watch","cljs.core\/gensym_counter","args11694","G__11696","cljs.core\/gensym","cljs.core.gensym.cljs$core$IFn$_invoke$arity$1","prefix-string","cljs.core.symbol.cljs$core$IFn$_invoke$arity$1","cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2","cljs.core\/fixture1","cljs.core\/fixture2","cljs.core\/Delay","cljs.core\/->Delay","cljs.core\/delay?","cljs.core\/force","cljs.core\/realized?","p1__11701#","p2__11702#","cljs.core\/preserving-reduced","rf1","args11704","G__11706","cljs.core\/halt-when","cljs.core.halt_when.cljs$core$IFn$_invoke$arity$2","retf","G__11707","G__11708","args11714","G__11716","cljs.core\/dedupe","prior","cljs.core.sequence.cljs$core$IFn$_invoke$arity$2","cljs.core.dedupe.cljs$core$IFn$_invoke$arity$0","args11722","G__11724","cljs.core\/random-sample","prob","cljs.core\/rand","cljs.core\/Eduction","cljs.core\/->Eduction","cljs.core.transduce.cljs$core$IFn$_invoke$arity$3","cljs.core.completing.cljs$core$IFn$_invoke$arity$1","cljs.core\/eduction","seq11731","xforms","cljs.core\/run!","proc","p1__11736#","p2__11735#","cljs\/core.-clj->js","cljs\/core.-key->js","cljs.core\/IEncodeJS","cljs.core\/-clj->js","cljs.core\/-key->js","cljs.core\/key->js","cljs.core\/clj->js","cljs.core.pr_str.cljs$core$IFn$_invoke$arity$variadic","seq__11759","chunk__11760","count__11761","i__11762","vec__11763","vec__11766","seq__11769","chunk__11770","count__11771","i__11772","cljs\/core.-js->clj","cljs.core\/IEncodeClojure","cljs.core\/-js->clj","options","args11819","G__11823","cljs.core\/js->clj","seq11820","G__11821","cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic","map__11824","keywordize-keys","cljs.core.doall.cljs$core$IFn$_invoke$arity$1","thisfn","iter__7300__auto__","c__7298__auto__","size__7299__auto__","b__11841","i__11840","iter__11838","cljs.core\/memoize","mem","G__11850","cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4","args11854","G__11858","cljs.core\/trampoline","seq11855","G__11856","cljs.core.trampoline.cljs$core$IFn$_invoke$arity$1","args11864","G__11866","cljs.core.rand.cljs$core$IFn$_invoke$arity$1","Math\/random","cljs.core\/rand-int","G__11872","cljs.core\/rand-nth","cljs.core\/group-by","cljs.core\/make-hierarchy","cljs.core\/-global-hierarchy","cljs.core\/get-global-hierarchy","G__11874","cljs.core\/swap-global-hierarchy!","seq11875","G__11876","args11880","G__11882","cljs.core\/isa?","G__11883","cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3","args11890","G__11892","cljs.core\/parents","tag","G__11893","cljs.core.parents.cljs$core$IFn$_invoke$arity$2","args11898","G__11900","cljs.core\/ancestors","G__11901","cljs.core.ancestors.cljs$core$IFn$_invoke$arity$2","args11906","G__11908","cljs.core\/descendants","G__11909","cljs.core.descendants.cljs$core$IFn$_invoke$arity$2","args11914","G__11916","cljs.core\/derive","cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic","tp","td","ta","tf","source","sources","target","targets","args11924","G__11926","cljs.core\/underive","parentMap","childsParents","newParents","deriv-seq","p1__11921#","cljs.core.interpose.cljs$core$IFn$_invoke$arity$2","p1__11922#","p2__11923#","cljs.core.partition.cljs$core$IFn$_invoke$arity$2","cljs.core\/reset-cache","method-cache","method-table","cached-hierarchy","hierarchy","cljs.core\/prefers*","prefer-table","xprefs","cljs.core.parents.cljs$core$IFn$_invoke$arity$1","G__11946","G__11947","G__11948","G__11952","G__11953","G__11954","cljs.core\/dominates","cljs.core\/find-and-cache-best-method","dispatch-val","best-entry","p__11961","vec__11962","be","be2","cljs\/core.-reset","cljs\/core.-add-method","cljs\/core.-remove-method","cljs\/core.-prefer-method","cljs\/core.-get-method","cljs\/core.-methods","cljs\/core.-prefers","cljs\/core.-default-dispatch-val","cljs\/core.-dispatch-fn","cljs.core\/IMultiFn","cljs.core\/-reset","mf","cljs.core\/-add-method","method","cljs.core\/-remove-method","cljs.core\/-prefer-method","dispatch-val-y","cljs.core\/-get-method","cljs.core\/-methods","cljs.core\/-prefers","cljs.core\/-default-dispatch-val","cljs.core\/-dispatch-fn","cljs.core\/throw-no-method-error","args11965","cljs.core\/MultiFn","cljs.core\/->MultiFn","dispatch-fn","default-dispatch-val","target-fn","cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3","dispatch-val-x","old","cljs.core\/remove-all-methods","multifn","cljs.core\/remove-method","cljs.core\/prefer-method","cljs.core\/methods","cljs.core\/get-method","cljs.core\/prefers","cljs.core\/default-dispatch-val","cljs.core\/dispatch-fn","cljs.core\/IUUID","cljs.core\/UUID","cljs.core\/->UUID","uuid","G__11967","G__11968","cljs.core\/uuid","cljs.core\/random-uuid","rhex","hex","cljs.core\/uuid?","cljs.core\/pr-writer-ex-info","cljs.core\/ExceptionInfo","message","data","cause","js\/Error.prototype","args11971","G__11973","cljs.core\/ex-info","msg","cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3","cljs.core\/ex-data","ex","cljs.core\/ex-message","cljs.core\/ex-cause","cljs.core\/comparator","cljs.core\/special-symbol?","cljs.core\/test","cljs.core\/TaggedLiteral","cljs.core\/->TaggedLiteral","form","G__11978","cljs.core\/tagged-literal?","cljs.core\/tagged-literal","cljs.core\/js-reserved-arr","cljs.core\/js-reserved","cljs.core\/js-reserved?","p1__11980#","p2__11981#","goog.object\/set","cljs.core\/demunge-pattern","G__11983","cljs.core\/munge-str","sub","goog.object\/get","cljs.core\/munge","name'","cljs.core\/demunge-str","munged-name","goog.string\/endsWith","last-match-end","vec__11993","cljs.core\/demunge","cljs.core\/ns-lookup","ns-obj","cljs.core\/Namespace","cljs.core\/->Namespace","goog.object\/containsKey","var-sym","var-meta","cljs.core\/NS_CACHE","cljs.core\/find-ns-obj*","ctxt","G__12000","G__12001","cljs.core\/find-ns-obj","munged-ns","segs","G__12007","e12008","G__12009","js\/eval","js\/ReferenceError","js\/global","goog\/global","cljs.core\/ns-interns*","args12011","G__12013","cljs.core\/create-ns","cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2","cljs.core\/find-ns","G__12019","the-ns","cljs.core\/find-macros-ns","G__12021","ns-str","goog.string\/contains","cljs.core\/ns-name"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/cljs_deps.js b/src/http/static/viz/1/cljs_deps.js
new file mode 100644
index 0000000..a6fad71
--- /dev/null
+++ b/src/http/static/viz/1/cljs_deps.js
@@ -0,0 +1,17 @@
+goog.addDependency("base.js", ['goog'], []);
+goog.addDependency("../cljs/core.js", ['cljs.core'], ['goog.string', 'goog.object', 'goog.math.Integer', 'goog.string.StringBuffer', 'goog.array', 'goog.math.Long']);
+goog.addDependency("../viz/forest.js", ['viz.forest'], ['cljs.core']);
+goog.addDependency("../processing.js", ['org.processingjs.Processing'], []);
+goog.addDependency("../quil/middlewares/deprecated_options.js", ['quil.middlewares.deprecated_options'], ['cljs.core']);
+goog.addDependency("../clojure/string.js", ['clojure.string'], ['goog.string', 'cljs.core', 'goog.string.StringBuffer']);
+goog.addDependency("../quil/util.js", ['quil.util'], ['cljs.core', 'clojure.string']);
+goog.addDependency("../quil/sketch.js", ['quil.sketch'], ['goog.dom', 'cljs.core', 'quil.middlewares.deprecated_options', 'goog.events.EventType', 'goog.events', 'quil.util']);
+goog.addDependency("../quil/core.js", ['quil.core'], ['org.processingjs.Processing', 'quil.sketch', 'cljs.core', 'clojure.string', 'quil.util']);
+goog.addDependency("../quil/middlewares/navigation_3d.js", ['quil.middlewares.navigation_3d'], ['cljs.core', 'quil.core']);
+goog.addDependency("../quil/middlewares/navigation_2d.js", ['quil.middlewares.navigation_2d'], ['cljs.core', 'quil.core']);
+goog.addDependency("../quil/middlewares/fun_mode.js", ['quil.middlewares.fun_mode'], ['cljs.core', 'quil.core']);
+goog.addDependency("../quil/middleware.js", ['quil.middleware'], ['cljs.core', 'quil.middlewares.navigation_3d', 'quil.middlewares.navigation_2d', 'quil.middlewares.fun_mode']);
+goog.addDependency("../clojure/set.js", ['clojure.set'], ['cljs.core']);
+goog.addDependency("../viz/grid.js", ['viz.grid'], ['cljs.core']);
+goog.addDependency("../viz/ghost.js", ['viz.ghost'], ['cljs.core', 'viz.forest', 'clojure.set', 'viz.grid']);
+goog.addDependency("../viz/core.js", ['viz.core'], ['goog.string', 'cljs.core', 'viz.forest', 'quil.core', 'quil.middleware', 'goog.string.format', 'viz.ghost', 'viz.grid']);
diff --git a/src/http/static/viz/1/clojure/set.cljs b/src/http/static/viz/1/clojure/set.cljs
new file mode 100644
index 0000000..b9ba41f
--- /dev/null
+++ b/src/http/static/viz/1/clojure/set.cljs
@@ -0,0 +1,161 @@
+; Copyright (c) Rich Hickey. All rights reserved.
+; The use and distribution terms for this software are covered by the
+; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
+; which can be found in the file epl-v10.html at the root of this distribution.
+; By using this software in any fashion, you are agreeing to be bound by
+; the terms of this license.
+; You must not remove this notice, or any other, from this software.
+
+(ns ^{:doc "Set operations such as union/intersection."
+ :author "Rich Hickey"}
+ clojure.set)
+
+(defn- bubble-max-key [k coll]
+ "Move a maximal element of coll according to fn k (which returns a number)
+ to the front of coll."
+ (let [max (apply max-key k coll)]
+ (cons max (remove #(identical? max %) coll))))
+
+(defn union
+ "Return a set that is the union of the input sets"
+ ([] #{})
+ ([s1] s1)
+ ([s1 s2]
+ (if (< (count s1) (count s2))
+ (reduce conj s2 s1)
+ (reduce conj s1 s2)))
+ ([s1 s2 & sets]
+ (let [bubbled-sets (bubble-max-key count (conj sets s2 s1))]
+ (reduce into (first bubbled-sets) (rest bubbled-sets)))))
+
+(defn intersection
+ "Return a set that is the intersection of the input sets"
+ ([s1] s1)
+ ([s1 s2]
+ (if (< (count s2) (count s1))
+ (recur s2 s1)
+ (reduce (fn [result item]
+ (if (contains? s2 item)
+ result
+ (disj result item)))
+ s1 s1)))
+ ([s1 s2 & sets]
+ (let [bubbled-sets (bubble-max-key #(- (count %)) (conj sets s2 s1))]
+ (reduce intersection (first bubbled-sets) (rest bubbled-sets)))))
+
+(defn difference
+ "Return a set that is the first set without elements of the remaining sets"
+ ([s1] s1)
+ ([s1 s2]
+ (if (< (count s1) (count s2))
+ (reduce (fn [result item]
+ (if (contains? s2 item)
+ (disj result item)
+ result))
+ s1 s1)
+ (reduce disj s1 s2)))
+ ([s1 s2 & sets]
+ (reduce difference s1 (conj sets s2))))
+
+
+(defn select
+ "Returns a set of the elements for which pred is true"
+ [pred xset]
+ (reduce (fn [s k] (if (pred k) s (disj s k)))
+ xset xset))
+
+(defn project
+ "Returns a rel of the elements of xrel with only the keys in ks"
+ [xrel ks]
+ (set (map #(select-keys % ks) xrel)))
+
+(defn rename-keys
+ "Returns the map with the keys in kmap renamed to the vals in kmap"
+ [map kmap]
+ (reduce
+ (fn [m [old new]]
+ (if (contains? map old)
+ (assoc m new (get map old))
+ m))
+ (apply dissoc map (keys kmap)) kmap))
+
+(defn rename
+ "Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap"
+ [xrel kmap]
+ (set (map #(rename-keys % kmap) xrel)))
+
+(defn index
+ "Returns a map of the distinct values of ks in the xrel mapped to a
+ set of the maps in xrel with the corresponding values of ks."
+ [xrel ks]
+ (reduce
+ (fn [m x]
+ (let [ik (select-keys x ks)]
+ (assoc m ik (conj (get m ik #{}) x))))
+ {} xrel))
+
+(defn map-invert
+ "Returns the map with the vals mapped to the keys."
+ [m] (reduce (fn [m [k v]] (assoc m v k)) {} m))
+
+(defn join
+ "When passed 2 rels, returns the rel corresponding to the natural
+ join. When passed an additional keymap, joins on the corresponding
+ keys."
+ ([xrel yrel] ;natural join
+ (if (and (seq xrel) (seq yrel))
+ (let [ks (intersection (set (keys (first xrel))) (set (keys (first yrel))))
+ [r s] (if (<= (count xrel) (count yrel))
+ [xrel yrel]
+ [yrel xrel])
+ idx (index r ks)]
+ (reduce (fn [ret x]
+ (let [found (idx (select-keys x ks))]
+ (if found
+ (reduce #(conj %1 (merge %2 x)) ret found)
+ ret)))
+ #{} s))
+ #{}))
+ ([xrel yrel km] ;arbitrary key mapping
+ (let [[r s k] (if (<= (count xrel) (count yrel))
+ [xrel yrel (map-invert km)]
+ [yrel xrel km])
+ idx (index r (vals k))]
+ (reduce (fn [ret x]
+ (let [found (idx (rename-keys (select-keys x (keys k)) k))]
+ (if found
+ (reduce #(conj %1 (merge %2 x)) ret found)
+ ret)))
+ #{} s))))
+
+(defn subset?
+ "Is set1 a subset of set2?"
+ [set1 set2]
+ (and (<= (count set1) (count set2))
+ (every? #(contains? set2 %) set1)))
+
+(defn superset?
+ "Is set1 a superset of set2?"
+ [set1 set2]
+ (and (>= (count set1) (count set2))
+ (every? #(contains? set1 %) set2)))
+
+(comment
+(refer 'set)
+(def xs #{{:a 11 :b 1 :c 1 :d 4}
+ {:a 2 :b 12 :c 2 :d 6}
+ {:a 3 :b 3 :c 3 :d 8 :f 42}})
+
+(def ys #{{:a 11 :b 11 :c 11 :e 5}
+ {:a 12 :b 11 :c 12 :e 3}
+ {:a 3 :b 3 :c 3 :e 7 }})
+
+(join xs ys)
+(join xs (rename ys {:b :yb :c :yc}) {:a :a})
+
+(union #{:a :b :c} #{:c :d :e })
+(difference #{:a :b :c} #{:c :d :e})
+(intersection #{:a :b :c} #{:c :d :e})
+
+(index ys [:b]))
+
diff --git a/src/http/static/viz/1/clojure/set.cljs.cache.edn b/src/http/static/viz/1/clojure/set.cljs.cache.edn
new file mode 100644
index 0000000..2341e7d
--- /dev/null
+++ b/src/http/static/viz/1/clojure/set.cljs.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {Error {}}, :use-macros {}, :excludes #{}, :name clojure.set, :imports nil, :requires nil, :uses nil, :defs {union {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 19, :column 7, :end-line 19, :end-column 12, :arglists (quote ([] [s1] [s1 s2] [s1 s2 & sets])), :doc "Return a set that is the union of the input sets", :top-fn {:variadic true, :max-fixed-arity 2, :method-params ([] [s1] [s1 s2]), :arglists ([] [s1] [s1 s2] [s1 s2 & sets]), :arglists-meta (nil nil nil nil)}}, :name clojure.set/union, :variadic true, :file "out/clojure/set.cljs", :end-column 12, :top-fn {:variadic true, :max-fixed-arity 2, :method-params ([] [s1] [s1 s2]), :arglists ([] [s1] [s1 s2] [s1 s2 & sets]), :arglists-meta (nil nil nil nil)}, :method-params ([] [s1] [s1 s2]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :line 19, :end-line 19, :max-fixed-arity 2, :fn-var true, :arglists ([] [s1] [s1 s2] [s1 s2 & sets]), :doc "Return a set that is the union of the input sets"}, map-invert {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 97, :column 7, :end-line 97, :end-column 17, :arglists (quote ([m])), :doc "Returns the map with the vals mapped to the keys."}, :name clojure.set/map-invert, :variadic false, :file "out/clojure/set.cljs", :end-column 17, :method-params ([m]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 97, :end-line 97, :max-fixed-arity 1, :fn-var true, :arglists (quote ([m])), :doc "Returns the map with the vals mapped to the keys."}, join {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 101, :column 7, :end-line 101, :end-column 11, :arglists (quote ([xrel yrel] [xrel yrel km])), :doc "When passed 2 rels, returns the rel corresponding to the natural\n join. When passed an additional keymap, joins on the corresponding\n keys.", :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([xrel yrel] [xrel yrel km]), :arglists ([xrel yrel] [xrel yrel km]), :arglists-meta (nil nil)}}, :name clojure.set/join, :variadic false, :file "out/clojure/set.cljs", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([xrel yrel] [xrel yrel km]), :arglists ([xrel yrel] [xrel yrel km]), :arglists-meta (nil nil)}, :method-params ([xrel yrel] [xrel yrel km]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 101, :end-line 101, :max-fixed-arity 3, :fn-var true, :arglists ([xrel yrel] [xrel yrel km]), :doc "When passed 2 rels, returns the rel corresponding to the natural\n join. When passed an additional keymap, joins on the corresponding\n keys."}, select {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 61, :column 7, :end-line 61, :end-column 13, :arglists (quote ([pred xset])), :doc "Returns a set of the elements for which pred is true"}, :name clojure.set/select, :variadic false, :file "out/clojure/set.cljs", :end-column 13, :method-params ([pred xset]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 61, :end-line 61, :max-fixed-arity 2, :fn-var true, :arglists (quote ([pred xset])), :doc "Returns a set of the elements for which pred is true"}, intersection {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 31, :column 7, :end-line 31, :end-column 19, :arglists (quote ([s1] [s1 s2] [s1 s2 & sets])), :doc "Return a set that is the intersection of the input sets", :top-fn {:variadic true, :max-fixed-arity 2, :method-params ([s1] [s1 s2]), :arglists ([s1] [s1 s2] [s1 s2 & sets]), :arglists-meta (nil nil nil)}}, :name clojure.set/intersection, :variadic true, :file "out/clojure/set.cljs", :end-column 19, :top-fn {:variadic true, :max-fixed-arity 2, :method-params ([s1] [s1 s2]), :arglists ([s1] [s1 s2] [s1 s2 & sets]), :arglists-meta (nil nil nil)}, :method-params ([s1] [s1 s2]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :line 31, :end-line 31, :max-fixed-arity 2, :fn-var true, :arglists ([s1] [s1 s2] [s1 s2 & sets]), :doc "Return a set that is the intersection of the input sets"}, superset? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 137, :column 7, :end-line 137, :end-column 16, :arglists (quote ([set1 set2])), :doc "Is set1 a superset of set2?"}, :name clojure.set/superset?, :variadic false, :file "out/clojure/set.cljs", :end-column 16, :method-params ([set1 set2]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 137, :end-line 137, :max-fixed-arity 2, :fn-var true, :arglists (quote ([set1 set2])), :doc "Is set1 a superset of set2?"}, index {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 87, :column 7, :end-line 87, :end-column 12, :arglists (quote ([xrel ks])), :doc "Returns a map of the distinct values of ks in the xrel mapped to a\n set of the maps in xrel with the corresponding values of ks."}, :name clojure.set/index, :variadic false, :file "out/clojure/set.cljs", :end-column 12, :method-params ([xrel ks]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 87, :end-line 87, :max-fixed-arity 2, :fn-var true, :arglists (quote ([xrel ks])), :doc "Returns a map of the distinct values of ks in the xrel mapped to a\n set of the maps in xrel with the corresponding values of ks."}, bubble-max-key {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 13, :column 8, :end-line 13, :end-column 22, :private true, :arglists (quote ([k coll]))}, :private true, :name clojure.set/bubble-max-key, :variadic false, :file "out/clojure/set.cljs", :end-column 22, :method-params ([k coll]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 13, :end-line 13, :max-fixed-arity 2, :fn-var true, :arglists (quote ([k coll]))}, subset? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 131, :column 7, :end-line 131, :end-column 14, :arglists (quote ([set1 set2])), :doc "Is set1 a subset of set2?"}, :name clojure.set/subset?, :variadic false, :file "out/clojure/set.cljs", :end-column 14, :method-params ([set1 set2]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 131, :end-line 131, :max-fixed-arity 2, :fn-var true, :arglists (quote ([set1 set2])), :doc "Is set1 a subset of set2?"}, rename {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 82, :column 7, :end-line 82, :end-column 13, :arglists (quote ([xrel kmap])), :doc "Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap"}, :name clojure.set/rename, :variadic false, :file "out/clojure/set.cljs", :end-column 13, :method-params ([xrel kmap]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 82, :end-line 82, :max-fixed-arity 2, :fn-var true, :arglists (quote ([xrel kmap])), :doc "Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap"}, rename-keys {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 72, :column 7, :end-line 72, :end-column 18, :arglists (quote ([map kmap])), :doc "Returns the map with the keys in kmap renamed to the vals in kmap"}, :name clojure.set/rename-keys, :variadic false, :file "out/clojure/set.cljs", :end-column 18, :method-params ([map kmap]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 72, :end-line 72, :max-fixed-arity 2, :fn-var true, :arglists (quote ([map kmap])), :doc "Returns the map with the keys in kmap renamed to the vals in kmap"}, project {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 67, :column 7, :end-line 67, :end-column 14, :arglists (quote ([xrel ks])), :doc "Returns a rel of the elements of xrel with only the keys in ks"}, :name clojure.set/project, :variadic false, :file "out/clojure/set.cljs", :end-column 14, :method-params ([xrel ks]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 67, :end-line 67, :max-fixed-arity 2, :fn-var true, :arglists (quote ([xrel ks])), :doc "Returns a rel of the elements of xrel with only the keys in ks"}, difference {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/set.cljs", :line 46, :column 7, :end-line 46, :end-column 17, :arglists (quote ([s1] [s1 s2] [s1 s2 & sets])), :doc "Return a set that is the first set without elements of the remaining sets", :top-fn {:variadic true, :max-fixed-arity 2, :method-params ([s1] [s1 s2]), :arglists ([s1] [s1 s2] [s1 s2 & sets]), :arglists-meta (nil nil nil)}}, :name clojure.set/difference, :variadic true, :file "out/clojure/set.cljs", :end-column 17, :top-fn {:variadic true, :max-fixed-arity 2, :method-params ([s1] [s1 s2]), :arglists ([s1] [s1 s2] [s1 s2 & sets]), :arglists-meta (nil nil nil)}, :method-params ([s1] [s1 s2]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :line 46, :end-line 46, :max-fixed-arity 2, :fn-var true, :arglists ([s1] [s1 s2] [s1 s2 & sets]), :doc "Return a set that is the first set without elements of the remaining sets"}}, :require-macros nil, :doc "Set operations such as union/intersection."} \ No newline at end of file
diff --git a/src/http/static/viz/1/clojure/set.js b/src/http/static/viz/1/clojure/set.js
new file mode 100644
index 0000000..920701d
--- /dev/null
+++ b/src/http/static/viz/1/clojure/set.js
@@ -0,0 +1,400 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('clojure.set');
+goog.require('cljs.core');
+clojure.set.bubble_max_key = (function clojure$set$bubble_max_key(k,coll){
+
+var max = cljs.core.apply.call(null,cljs.core.max_key,k,coll);
+return cljs.core.cons.call(null,max,cljs.core.remove.call(null,((function (max){
+return (function (p1__7981_SHARP_){
+return (max === p1__7981_SHARP_);
+});})(max))
+,coll));
+});
+/**
+ * Return a set that is the union of the input sets
+ */
+clojure.set.union = (function clojure$set$union(var_args){
+var args7982 = [];
+var len__7927__auto___7988 = arguments.length;
+var i__7928__auto___7989 = (0);
+while(true){
+if((i__7928__auto___7989 < len__7927__auto___7988)){
+args7982.push((arguments[i__7928__auto___7989]));
+
+var G__7990 = (i__7928__auto___7989 + (1));
+i__7928__auto___7989 = G__7990;
+continue;
+} else {
+}
+break;
+}
+
+var G__7987 = args7982.length;
+switch (G__7987) {
+case 0:
+return clojure.set.union.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return clojure.set.union.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return clojure.set.union.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7946__auto__ = (new cljs.core.IndexedSeq(args7982.slice((2)),(0),null));
+return clojure.set.union.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7946__auto__);
+
+}
+});
+
+clojure.set.union.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.PersistentHashSet.EMPTY;
+});
+
+clojure.set.union.cljs$core$IFn$_invoke$arity$1 = (function (s1){
+return s1;
+});
+
+clojure.set.union.cljs$core$IFn$_invoke$arity$2 = (function (s1,s2){
+if((cljs.core.count.call(null,s1) < cljs.core.count.call(null,s2))){
+return cljs.core.reduce.call(null,cljs.core.conj,s2,s1);
+} else {
+return cljs.core.reduce.call(null,cljs.core.conj,s1,s2);
+}
+});
+
+clojure.set.union.cljs$core$IFn$_invoke$arity$variadic = (function (s1,s2,sets){
+var bubbled_sets = clojure.set.bubble_max_key.call(null,cljs.core.count,cljs.core.conj.call(null,sets,s2,s1));
+return cljs.core.reduce.call(null,cljs.core.into,cljs.core.first.call(null,bubbled_sets),cljs.core.rest.call(null,bubbled_sets));
+});
+
+clojure.set.union.cljs$lang$applyTo = (function (seq7983){
+var G__7984 = cljs.core.first.call(null,seq7983);
+var seq7983__$1 = cljs.core.next.call(null,seq7983);
+var G__7985 = cljs.core.first.call(null,seq7983__$1);
+var seq7983__$2 = cljs.core.next.call(null,seq7983__$1);
+return clojure.set.union.cljs$core$IFn$_invoke$arity$variadic(G__7984,G__7985,seq7983__$2);
+});
+
+clojure.set.union.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Return a set that is the intersection of the input sets
+ */
+clojure.set.intersection = (function clojure$set$intersection(var_args){
+var args7993 = [];
+var len__7927__auto___7999 = arguments.length;
+var i__7928__auto___8000 = (0);
+while(true){
+if((i__7928__auto___8000 < len__7927__auto___7999)){
+args7993.push((arguments[i__7928__auto___8000]));
+
+var G__8001 = (i__7928__auto___8000 + (1));
+i__7928__auto___8000 = G__8001;
+continue;
+} else {
+}
+break;
+}
+
+var G__7998 = args7993.length;
+switch (G__7998) {
+case 1:
+return clojure.set.intersection.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return clojure.set.intersection.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7946__auto__ = (new cljs.core.IndexedSeq(args7993.slice((2)),(0),null));
+return clojure.set.intersection.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7946__auto__);
+
+}
+});
+
+clojure.set.intersection.cljs$core$IFn$_invoke$arity$1 = (function (s1){
+return s1;
+});
+
+clojure.set.intersection.cljs$core$IFn$_invoke$arity$2 = (function (s1,s2){
+while(true){
+if((cljs.core.count.call(null,s2) < cljs.core.count.call(null,s1))){
+var G__8003 = s2;
+var G__8004 = s1;
+s1 = G__8003;
+s2 = G__8004;
+continue;
+} else {
+return cljs.core.reduce.call(null,((function (s1,s2){
+return (function (result,item){
+if(cljs.core.contains_QMARK_.call(null,s2,item)){
+return result;
+} else {
+return cljs.core.disj.call(null,result,item);
+}
+});})(s1,s2))
+,s1,s1);
+}
+break;
+}
+});
+
+clojure.set.intersection.cljs$core$IFn$_invoke$arity$variadic = (function (s1,s2,sets){
+var bubbled_sets = clojure.set.bubble_max_key.call(null,(function (p1__7992_SHARP_){
+return (- cljs.core.count.call(null,p1__7992_SHARP_));
+}),cljs.core.conj.call(null,sets,s2,s1));
+return cljs.core.reduce.call(null,clojure.set.intersection,cljs.core.first.call(null,bubbled_sets),cljs.core.rest.call(null,bubbled_sets));
+});
+
+clojure.set.intersection.cljs$lang$applyTo = (function (seq7994){
+var G__7995 = cljs.core.first.call(null,seq7994);
+var seq7994__$1 = cljs.core.next.call(null,seq7994);
+var G__7996 = cljs.core.first.call(null,seq7994__$1);
+var seq7994__$2 = cljs.core.next.call(null,seq7994__$1);
+return clojure.set.intersection.cljs$core$IFn$_invoke$arity$variadic(G__7995,G__7996,seq7994__$2);
+});
+
+clojure.set.intersection.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Return a set that is the first set without elements of the remaining sets
+ */
+clojure.set.difference = (function clojure$set$difference(var_args){
+var args8005 = [];
+var len__7927__auto___8011 = arguments.length;
+var i__7928__auto___8012 = (0);
+while(true){
+if((i__7928__auto___8012 < len__7927__auto___8011)){
+args8005.push((arguments[i__7928__auto___8012]));
+
+var G__8013 = (i__7928__auto___8012 + (1));
+i__7928__auto___8012 = G__8013;
+continue;
+} else {
+}
+break;
+}
+
+var G__8010 = args8005.length;
+switch (G__8010) {
+case 1:
+return clojure.set.difference.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return clojure.set.difference.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var argseq__7946__auto__ = (new cljs.core.IndexedSeq(args8005.slice((2)),(0),null));
+return clojure.set.difference.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__7946__auto__);
+
+}
+});
+
+clojure.set.difference.cljs$core$IFn$_invoke$arity$1 = (function (s1){
+return s1;
+});
+
+clojure.set.difference.cljs$core$IFn$_invoke$arity$2 = (function (s1,s2){
+if((cljs.core.count.call(null,s1) < cljs.core.count.call(null,s2))){
+return cljs.core.reduce.call(null,(function (result,item){
+if(cljs.core.contains_QMARK_.call(null,s2,item)){
+return cljs.core.disj.call(null,result,item);
+} else {
+return result;
+}
+}),s1,s1);
+} else {
+return cljs.core.reduce.call(null,cljs.core.disj,s1,s2);
+}
+});
+
+clojure.set.difference.cljs$core$IFn$_invoke$arity$variadic = (function (s1,s2,sets){
+return cljs.core.reduce.call(null,clojure.set.difference,s1,cljs.core.conj.call(null,sets,s2));
+});
+
+clojure.set.difference.cljs$lang$applyTo = (function (seq8006){
+var G__8007 = cljs.core.first.call(null,seq8006);
+var seq8006__$1 = cljs.core.next.call(null,seq8006);
+var G__8008 = cljs.core.first.call(null,seq8006__$1);
+var seq8006__$2 = cljs.core.next.call(null,seq8006__$1);
+return clojure.set.difference.cljs$core$IFn$_invoke$arity$variadic(G__8007,G__8008,seq8006__$2);
+});
+
+clojure.set.difference.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns a set of the elements for which pred is true
+ */
+clojure.set.select = (function clojure$set$select(pred,xset){
+return cljs.core.reduce.call(null,(function (s,k){
+if(cljs.core.truth_(pred.call(null,k))){
+return s;
+} else {
+return cljs.core.disj.call(null,s,k);
+}
+}),xset,xset);
+});
+/**
+ * Returns a rel of the elements of xrel with only the keys in ks
+ */
+clojure.set.project = (function clojure$set$project(xrel,ks){
+return cljs.core.set.call(null,cljs.core.map.call(null,(function (p1__8015_SHARP_){
+return cljs.core.select_keys.call(null,p1__8015_SHARP_,ks);
+}),xrel));
+});
+/**
+ * Returns the map with the keys in kmap renamed to the vals in kmap
+ */
+clojure.set.rename_keys = (function clojure$set$rename_keys(map,kmap){
+return cljs.core.reduce.call(null,(function (m,p__8020){
+var vec__8021 = p__8020;
+var old = cljs.core.nth.call(null,vec__8021,(0),null);
+var new$ = cljs.core.nth.call(null,vec__8021,(1),null);
+if(cljs.core.contains_QMARK_.call(null,map,old)){
+return cljs.core.assoc.call(null,m,new$,cljs.core.get.call(null,map,old));
+} else {
+return m;
+}
+}),cljs.core.apply.call(null,cljs.core.dissoc,map,cljs.core.keys.call(null,kmap)),kmap);
+});
+/**
+ * Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap
+ */
+clojure.set.rename = (function clojure$set$rename(xrel,kmap){
+return cljs.core.set.call(null,cljs.core.map.call(null,(function (p1__8024_SHARP_){
+return clojure.set.rename_keys.call(null,p1__8024_SHARP_,kmap);
+}),xrel));
+});
+/**
+ * Returns a map of the distinct values of ks in the xrel mapped to a
+ * set of the maps in xrel with the corresponding values of ks.
+ */
+clojure.set.index = (function clojure$set$index(xrel,ks){
+return cljs.core.reduce.call(null,(function (m,x){
+var ik = cljs.core.select_keys.call(null,x,ks);
+return cljs.core.assoc.call(null,m,ik,cljs.core.conj.call(null,cljs.core.get.call(null,m,ik,cljs.core.PersistentHashSet.EMPTY),x));
+}),cljs.core.PersistentArrayMap.EMPTY,xrel);
+});
+/**
+ * Returns the map with the vals mapped to the keys.
+ */
+clojure.set.map_invert = (function clojure$set$map_invert(m){
+return cljs.core.reduce.call(null,(function (m__$1,p__8029){
+var vec__8030 = p__8029;
+var k = cljs.core.nth.call(null,vec__8030,(0),null);
+var v = cljs.core.nth.call(null,vec__8030,(1),null);
+return cljs.core.assoc.call(null,m__$1,v,k);
+}),cljs.core.PersistentArrayMap.EMPTY,m);
+});
+/**
+ * When passed 2 rels, returns the rel corresponding to the natural
+ * join. When passed an additional keymap, joins on the corresponding
+ * keys.
+ */
+clojure.set.join = (function clojure$set$join(var_args){
+var args8037 = [];
+var len__7927__auto___8046 = arguments.length;
+var i__7928__auto___8047 = (0);
+while(true){
+if((i__7928__auto___8047 < len__7927__auto___8046)){
+args8037.push((arguments[i__7928__auto___8047]));
+
+var G__8048 = (i__7928__auto___8047 + (1));
+i__7928__auto___8047 = G__8048;
+continue;
+} else {
+}
+break;
+}
+
+var G__8039 = args8037.length;
+switch (G__8039) {
+case 2:
+return clojure.set.join.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return clojure.set.join.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8037.length)].join('')));
+
+}
+});
+
+clojure.set.join.cljs$core$IFn$_invoke$arity$2 = (function (xrel,yrel){
+if((cljs.core.seq.call(null,xrel)) && (cljs.core.seq.call(null,yrel))){
+var ks = clojure.set.intersection.call(null,cljs.core.set.call(null,cljs.core.keys.call(null,cljs.core.first.call(null,xrel))),cljs.core.set.call(null,cljs.core.keys.call(null,cljs.core.first.call(null,yrel))));
+var vec__8040 = (((cljs.core.count.call(null,xrel) <= cljs.core.count.call(null,yrel)))?new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [xrel,yrel], null):new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [yrel,xrel], null));
+var r = cljs.core.nth.call(null,vec__8040,(0),null);
+var s = cljs.core.nth.call(null,vec__8040,(1),null);
+var idx = clojure.set.index.call(null,r,ks);
+return cljs.core.reduce.call(null,((function (ks,vec__8040,r,s,idx){
+return (function (ret,x){
+var found = idx.call(null,cljs.core.select_keys.call(null,x,ks));
+if(cljs.core.truth_(found)){
+return cljs.core.reduce.call(null,((function (found,ks,vec__8040,r,s,idx){
+return (function (p1__8033_SHARP_,p2__8034_SHARP_){
+return cljs.core.conj.call(null,p1__8033_SHARP_,cljs.core.merge.call(null,p2__8034_SHARP_,x));
+});})(found,ks,vec__8040,r,s,idx))
+,ret,found);
+} else {
+return ret;
+}
+});})(ks,vec__8040,r,s,idx))
+,cljs.core.PersistentHashSet.EMPTY,s);
+} else {
+return cljs.core.PersistentHashSet.EMPTY;
+}
+});
+
+clojure.set.join.cljs$core$IFn$_invoke$arity$3 = (function (xrel,yrel,km){
+var vec__8043 = (((cljs.core.count.call(null,xrel) <= cljs.core.count.call(null,yrel)))?new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [xrel,yrel,clojure.set.map_invert.call(null,km)], null):new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [yrel,xrel,km], null));
+var r = cljs.core.nth.call(null,vec__8043,(0),null);
+var s = cljs.core.nth.call(null,vec__8043,(1),null);
+var k = cljs.core.nth.call(null,vec__8043,(2),null);
+var idx = clojure.set.index.call(null,r,cljs.core.vals.call(null,k));
+return cljs.core.reduce.call(null,((function (vec__8043,r,s,k,idx){
+return (function (ret,x){
+var found = idx.call(null,clojure.set.rename_keys.call(null,cljs.core.select_keys.call(null,x,cljs.core.keys.call(null,k)),k));
+if(cljs.core.truth_(found)){
+return cljs.core.reduce.call(null,((function (found,vec__8043,r,s,k,idx){
+return (function (p1__8035_SHARP_,p2__8036_SHARP_){
+return cljs.core.conj.call(null,p1__8035_SHARP_,cljs.core.merge.call(null,p2__8036_SHARP_,x));
+});})(found,vec__8043,r,s,k,idx))
+,ret,found);
+} else {
+return ret;
+}
+});})(vec__8043,r,s,k,idx))
+,cljs.core.PersistentHashSet.EMPTY,s);
+});
+
+clojure.set.join.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Is set1 a subset of set2?
+ */
+clojure.set.subset_QMARK_ = (function clojure$set$subset_QMARK_(set1,set2){
+return ((cljs.core.count.call(null,set1) <= cljs.core.count.call(null,set2))) && (cljs.core.every_QMARK_.call(null,(function (p1__8050_SHARP_){
+return cljs.core.contains_QMARK_.call(null,set2,p1__8050_SHARP_);
+}),set1));
+});
+/**
+ * Is set1 a superset of set2?
+ */
+clojure.set.superset_QMARK_ = (function clojure$set$superset_QMARK_(set1,set2){
+return ((cljs.core.count.call(null,set1) >= cljs.core.count.call(null,set2))) && (cljs.core.every_QMARK_.call(null,(function (p1__8051_SHARP_){
+return cljs.core.contains_QMARK_.call(null,set1,p1__8051_SHARP_);
+}),set2));
+});
+
+//# sourceMappingURL=set.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/clojure/set.js.map b/src/http/static/viz/1/clojure/set.js.map
new file mode 100644
index 0000000..a42360e
--- /dev/null
+++ b/src/http/static/viz/1/clojure/set.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/clojure\/set.js","sources":["set.cljs"],"lineCount":400,"mappings":"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","names":["clojure.set\/bubble-max-key","k","coll","max","cljs.core\/apply","cljs.core\/max-key","cljs.core\/cons","p1__7981#","cljs.core\/remove","var_args","args7982","len__7927__auto__","i__7928__auto__","G__7987","clojure.set\/union","argseq__7946__auto__","cljs.core\/IndexedSeq","seq7983","G__7984","cljs.core\/first","cljs.core\/next","G__7985","s1","s2","cljs.core\/count","cljs.core\/reduce","cljs.core\/conj","sets","bubbled-sets","cljs.core\/into","cljs.core\/rest","args7993","G__7998","clojure.set\/intersection","seq7994","G__7995","G__7996","result","item","cljs.core\/contains?","cljs.core\/disj","p1__7992#","args8005","G__8010","clojure.set\/difference","seq8006","G__8007","G__8008","clojure.set\/select","pred","xset","s","clojure.set\/project","xrel","ks","cljs.core\/set","p1__8015#","cljs.core\/map","cljs.core\/select-keys","clojure.set\/rename-keys","map","kmap","p__8020","vec__8021","cljs.core\/nth","m","old","new","cljs.core\/assoc","cljs.core\/get","cljs.core\/dissoc","cljs.core\/keys","clojure.set\/rename","p1__8024#","clojure.set\/index","x","ik","clojure.set\/map-invert","p__8029","vec__8030","v","args8037","G__8039","clojure.set\/join","js\/Error","yrel","cljs.core\/seq","vec__8040","r","idx","ret","found","p1__8033#","p2__8034#","cljs.core\/merge","km","vec__8043","cljs.core\/vals","p1__8035#","p2__8036#","clojure.set\/subset?","set1","set2","p1__8050#","cljs.core\/every?","clojure.set\/superset?","p1__8051#"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/clojure/string.cljs b/src/http/static/viz/1/clojure/string.cljs
new file mode 100644
index 0000000..4cf5ede
--- /dev/null
+++ b/src/http/static/viz/1/clojure/string.cljs
@@ -0,0 +1,258 @@
+; Copyright (c) Rich Hickey. All rights reserved.
+; The use and distribution terms for this software are covered by the
+; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
+; which can be found in the file epl-v10.html at the root of this distribution.
+; By using this software in any fashion, you are agreeing to be bound by
+; the terms of this license.
+; You must not remove this notice, or any other, from this software.
+
+(ns clojure.string
+ (:refer-clojure :exclude [replace reverse])
+ (:require [goog.string :as gstring])
+ (:import [goog.string StringBuffer]))
+
+(defn- seq-reverse
+ [coll]
+ (reduce conj () coll))
+
+(def ^:private re-surrogate-pair
+ (js/RegExp. "([\\uD800-\\uDBFF])([\\uDC00-\\uDFFF])" "g"))
+
+(defn reverse
+ "Returns s with its characters reversed."
+ [s]
+ (-> (.replace s re-surrogate-pair "$2$1")
+ (.. (split "") (reverse) (join ""))))
+
+(defn- replace-all
+ [s re replacement]
+ (.replace s (js/RegExp. (.-source re) "g") replacement))
+
+(defn- replace-with
+ [f]
+ (fn [& args]
+ (let [matches (drop-last 2 args)]
+ (if (= (count matches) 1)
+ (f (first matches))
+ (f (vec matches))))))
+
+(defn replace
+ "Replaces all instance of match with replacement in s.
+ match/replacement can be:
+
+ string / string
+ pattern / (string or function of match)."
+ [s match replacement]
+ (cond
+ (string? match)
+ (.replace s (js/RegExp. (gstring/regExpEscape match) "g") replacement)
+
+ (instance? js/RegExp match)
+ (if (string? replacement)
+ (replace-all s match replacement)
+ (replace-all s match (replace-with replacement)))
+
+ :else (throw (str "Invalid match arg: " match))))
+
+(defn replace-first
+ "Replaces the first instance of match with replacement in s.
+ match/replacement can be:
+
+ string / string
+ pattern / (string or function of match)."
+ [s match replacement]
+ (.replace s match replacement))
+
+(defn join
+ "Returns a string of all elements in coll, as returned by (seq coll),
+ separated by an optional separator."
+ ([coll]
+ (loop [sb (StringBuffer.) coll (seq coll)]
+ (if-not (nil? coll)
+ (recur (. sb (append (str (first coll)))) (next coll))
+ (.toString sb))))
+ ([separator coll]
+ (loop [sb (StringBuffer.) coll (seq coll)]
+ (if-not (nil? coll)
+ (do
+ (. sb (append (str (first coll))))
+ (let [coll (next coll)]
+ (when-not (nil? coll)
+ (. sb (append separator)))
+ (recur sb coll)))
+ (.toString sb)))))
+
+(defn upper-case
+ "Converts string to all upper-case."
+ [s]
+ (.toUpperCase s))
+
+(defn lower-case
+ "Converts string to all lower-case."
+ [s]
+ (.toLowerCase s))
+
+(defn capitalize
+ "Converts first character of the string to upper-case, all other
+ characters to lower-case."
+ [s]
+ (if (< (count s) 2)
+ (upper-case s)
+ (str (upper-case (subs s 0 1))
+ (lower-case (subs s 1)))))
+
+;; The JavaScript split function takes a limit argument but the return
+;; value is not the same as the Java split function.
+;;
+;; Java: (.split "a-b-c" #"-" 2) => ["a" "b-c"]
+;; JavaScript: (.split "a-b-c" #"-" 2) => ["a" "b"]
+;;
+;; For consistency, the three arg version has been implemented to
+;; mimic Java's behavior.
+
+(defn- pop-last-while-empty
+ [v]
+ (loop [v v]
+ (if (identical? "" (peek v))
+ (recur (pop v))
+ v)))
+
+(defn- discard-trailing-if-needed
+ [limit v]
+ (if (and (== 0 limit) (< 1 (count v)))
+ (pop-last-while-empty v)
+ v))
+
+(defn- split-with-empty-regex
+ [s limit]
+ (if (or (<= limit 0) (>= limit (+ 2 (count s))))
+ (conj (vec (cons "" (map str (seq s)))) "")
+ (condp == limit
+ 1 (vector s)
+ 2 (vector "" s)
+ (let [c (- limit 2)]
+ (conj (vec (cons "" (subvec (vec (map str (seq s))) 0 c))) (subs s c))))))
+
+(defn split
+ "Splits string on a regular expression. Optional argument limit is
+ the maximum number of splits. Not lazy. Returns vector of the splits."
+ ([s re]
+ (split s re 0))
+ ([s re limit]
+ (discard-trailing-if-needed limit
+ (if (identical? "/(?:)/" (str re))
+ (split-with-empty-regex s limit)
+ (if (< limit 1)
+ (vec (.split (str s) re))
+ (loop [s s
+ limit limit
+ parts []]
+ (if (== 1 limit)
+ (conj parts s)
+ (let [m (re-find re s)]
+ (if-not (nil? m)
+ (let [index (.indexOf s m)]
+ (recur (.substring s (+ index (count m)))
+ (dec limit)
+ (conj parts (.substring s 0 index))))
+ (conj parts s))))))))))
+
+(defn split-lines
+ "Splits s on \n or \r\n."
+ [s]
+ (split s #"\n|\r\n"))
+
+(defn trim
+ "Removes whitespace from both ends of string."
+ [s]
+ (gstring/trim s))
+
+(defn triml
+ "Removes whitespace from the left side of string."
+ [s]
+ (gstring/trimLeft s))
+
+(defn trimr
+ "Removes whitespace from the right side of string."
+ [s]
+ (gstring/trimRight s))
+
+(defn trim-newline
+ "Removes all trailing newline \\n or return \\r characters from
+ string. Similar to Perl's chomp."
+ [s]
+ (loop [index (.-length s)]
+ (if (zero? index)
+ ""
+ (let [ch (get s (dec index))]
+ (if (or (identical? \newline ch)
+ (identical? \return ch))
+ (recur (dec index))
+ (.substring s 0 index))))))
+
+(defn ^boolean blank?
+ "True is s is nil, empty, or contains only whitespace."
+ [s]
+ (gstring/isEmptySafe s))
+
+(defn escape
+ "Return a new string, using cmap to escape each character ch
+ from s as follows:
+
+ If (cmap ch) is nil, append ch to the new string.
+ If (cmap ch) is non-nil, append (str (cmap ch)) instead."
+ [s cmap]
+ (let [buffer (StringBuffer.)
+ length (.-length s)]
+ (loop [index 0]
+ (if (== length index)
+ (. buffer (toString))
+ (let [ch (.charAt s index)
+ replacement (get cmap ch)]
+ (if-not (nil? replacement)
+ (.append buffer (str replacement))
+ (.append buffer ch))
+ (recur (inc index)))))))
+
+(defn index-of
+ "Return index of value (string or char) in s, optionally searching
+ forward from from-index or nil if not found."
+ ([s value]
+ (let [result (.indexOf s value)]
+ (if (neg? result)
+ nil
+ result)))
+ ([s value from-index]
+ (let [result (.indexOf s value from-index)]
+ (if (neg? result)
+ nil
+ result))))
+
+(defn last-index-of
+ "Return last index of value (string or char) in s, optionally
+ searching backward from from-index or nil if not found."
+ ([s value]
+ (let [result (.lastIndexOf s value)]
+ (if (neg? result)
+ nil
+ result)))
+ ([s value from-index]
+ (let [result (.lastIndexOf s value from-index)]
+ (if (neg? result)
+ nil
+ result))))
+
+(defn ^boolean starts-with?
+ "True if s starts with substr."
+ [s substr]
+ (gstring/startsWith s substr))
+
+(defn ^boolean ends-with?
+ "True if s ends with substr."
+ [s substr]
+ (gstring/endsWith s substr))
+
+(defn ^boolean includes?
+ "True if s includes substr."
+ [s substr]
+ (gstring/contains s substr))
diff --git a/src/http/static/viz/1/clojure/string.cljs.cache.edn b/src/http/static/viz/1/clojure/string.cljs.cache.edn
new file mode 100644
index 0000000..e4ac146
--- /dev/null
+++ b/src/http/static/viz/1/clojure/string.cljs.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {RegExp {}, Error {}}, :use-macros {}, :excludes #{reverse replace}, :name clojure.string, :imports {StringBuffer goog.string.StringBuffer}, :requires {gstring goog.string, goog.string goog.string, StringBuffer goog.string.StringBuffer}, :uses nil, :defs {ends-with? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 250, :column 16, :end-line 250, :end-column 26, :tag boolean, :arglists (quote ([s substr])), :doc "True if s ends with substr."}, :name clojure.string/ends-with?, :variadic false, :file "out/clojure/string.cljs", :end-column 26, :method-params ([s substr]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 250, :ret-tag boolean, :end-line 250, :max-fixed-arity 2, :tag boolean, :fn-var true, :arglists (quote ([s substr])), :doc "True if s ends with substr."}, seq-reverse {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 14, :column 8, :end-line 14, :end-column 19, :private true, :arglists (quote ([coll]))}, :private true, :name clojure.string/seq-reverse, :variadic false, :file "out/clojure/string.cljs", :end-column 19, :method-params ([coll]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 14, :end-line 14, :max-fixed-arity 1, :fn-var true, :arglists (quote ([coll]))}, replace-with {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 31, :column 8, :end-line 31, :end-column 20, :private true, :arglists (quote ([f]))}, :private true, :name clojure.string/replace-with, :variadic false, :file "out/clojure/string.cljs", :end-column 20, :method-params ([f]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 31, :end-line 31, :max-fixed-arity 1, :fn-var true, :arglists (quote ([f]))}, capitalize {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 95, :column 7, :end-line 95, :end-column 17, :arglists (quote ([s])), :doc "Converts first character of the string to upper-case, all other\n characters to lower-case."}, :name clojure.string/capitalize, :variadic false, :file "out/clojure/string.cljs", :end-column 17, :method-params ([s]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 95, :end-line 95, :max-fixed-arity 1, :fn-var true, :arglists (quote ([s])), :doc "Converts first character of the string to upper-case, all other\n characters to lower-case."}, reverse {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 21, :column 7, :end-line 21, :end-column 14, :arglists (quote ([s])), :doc "Returns s with its characters reversed."}, :name clojure.string/reverse, :variadic false, :file "out/clojure/string.cljs", :end-column 14, :method-params ([s]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 21, :end-line 21, :max-fixed-arity 1, :fn-var true, :arglists (quote ([s])), :doc "Returns s with its characters reversed."}, join {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 66, :column 7, :end-line 66, :end-column 11, :arglists (quote ([coll] [separator coll])), :doc "Returns a string of all elements in coll, as returned by (seq coll),\n separated by an optional separator.", :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([coll] [separator coll]), :arglists ([coll] [separator coll]), :arglists-meta (nil nil)}}, :name clojure.string/join, :variadic false, :file "out/clojure/string.cljs", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([coll] [separator coll]), :arglists ([coll] [separator coll]), :arglists-meta (nil nil)}, :method-params ([coll] [separator coll]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 66, :end-line 66, :max-fixed-arity 2, :fn-var true, :arglists ([coll] [separator coll]), :doc "Returns a string of all elements in coll, as returned by (seq coll),\n separated by an optional separator."}, replace-first {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 57, :column 7, :end-line 57, :end-column 20, :arglists (quote ([s match replacement])), :doc "Replaces the first instance of match with replacement in s.\n match/replacement can be:\n\n string / string\n pattern / (string or function of match)."}, :name clojure.string/replace-first, :variadic false, :file "out/clojure/string.cljs", :end-column 20, :method-params ([s match replacement]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 57, :end-line 57, :max-fixed-arity 3, :fn-var true, :arglists (quote ([s match replacement])), :doc "Replaces the first instance of match with replacement in s.\n match/replacement can be:\n\n string / string\n pattern / (string or function of match)."}, starts-with? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 245, :column 16, :end-line 245, :end-column 28, :tag boolean, :arglists (quote ([s substr])), :doc "True if s starts with substr."}, :name clojure.string/starts-with?, :variadic false, :file "out/clojure/string.cljs", :end-column 28, :method-params ([s substr]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 245, :ret-tag boolean, :end-line 245, :max-fixed-arity 2, :tag boolean, :fn-var true, :arglists (quote ([s substr])), :doc "True if s starts with substr."}, escape {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 198, :column 7, :end-line 198, :end-column 13, :arglists (quote ([s cmap])), :doc "Return a new string, using cmap to escape each character ch\n from s as follows:\n\n If (cmap ch) is nil, append ch to the new string.\n If (cmap ch) is non-nil, append (str (cmap ch)) instead."}, :name clojure.string/escape, :variadic false, :file "out/clojure/string.cljs", :end-column 13, :method-params ([s cmap]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 198, :end-line 198, :max-fixed-arity 2, :fn-var true, :arglists (quote ([s cmap])), :doc "Return a new string, using cmap to escape each character ch\n from s as follows:\n\n If (cmap ch) is nil, append ch to the new string.\n If (cmap ch) is non-nil, append (str (cmap ch)) instead."}, replace-all {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 27, :column 8, :end-line 27, :end-column 19, :private true, :arglists (quote ([s re replacement]))}, :private true, :name clojure.string/replace-all, :variadic false, :file "out/clojure/string.cljs", :end-column 19, :method-params ([s re replacement]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 27, :end-line 27, :max-fixed-arity 3, :fn-var true, :arglists (quote ([s re replacement]))}, discard-trailing-if-needed {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 120, :column 8, :end-line 120, :end-column 34, :private true, :arglists (quote ([limit v]))}, :private true, :name clojure.string/discard-trailing-if-needed, :variadic false, :file "out/clojure/string.cljs", :end-column 34, :method-params ([limit v]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 120, :end-line 120, :max-fixed-arity 2, :fn-var true, :arglists (quote ([limit v]))}, last-index-of {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 231, :column 7, :end-line 231, :end-column 20, :arglists (quote ([s value] [s value from-index])), :doc "Return last index of value (string or char) in s, optionally\n searching backward from from-index or nil if not found.", :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([s value] [s value from-index]), :arglists ([s value] [s value from-index]), :arglists-meta (nil nil)}}, :name clojure.string/last-index-of, :variadic false, :file "out/clojure/string.cljs", :end-column 20, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([s value] [s value from-index]), :arglists ([s value] [s value from-index]), :arglists-meta (nil nil)}, :method-params ([s value] [s value from-index]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 231, :end-line 231, :max-fixed-arity 3, :fn-var true, :arglists ([s value] [s value from-index]), :doc "Return last index of value (string or char) in s, optionally\n searching backward from from-index or nil if not found."}, pop-last-while-empty {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 113, :column 8, :end-line 113, :end-column 28, :private true, :arglists (quote ([v]))}, :private true, :name clojure.string/pop-last-while-empty, :variadic false, :file "out/clojure/string.cljs", :end-column 28, :method-params ([v]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 113, :end-line 113, :max-fixed-arity 1, :fn-var true, :arglists (quote ([v]))}, includes? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 255, :column 16, :end-line 255, :end-column 25, :tag boolean, :arglists (quote ([s substr])), :doc "True if s includes substr."}, :name clojure.string/includes?, :variadic false, :file "out/clojure/string.cljs", :end-column 25, :method-params ([s substr]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 255, :ret-tag boolean, :end-line 255, :max-fixed-arity 2, :tag boolean, :fn-var true, :arglists (quote ([s substr])), :doc "True if s includes substr."}, replace {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 39, :column 7, :end-line 39, :end-column 14, :arglists (quote ([s match replacement])), :doc "Replaces all instance of match with replacement in s.\n match/replacement can be:\n\n string / string\n pattern / (string or function of match)."}, :name clojure.string/replace, :variadic false, :file "out/clojure/string.cljs", :end-column 14, :method-params ([s match replacement]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 39, :end-line 39, :max-fixed-arity 3, :fn-var true, :arglists (quote ([s match replacement])), :doc "Replaces all instance of match with replacement in s.\n match/replacement can be:\n\n string / string\n pattern / (string or function of match)."}, split-lines {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 160, :column 7, :end-line 160, :end-column 18, :arglists (quote ([s])), :doc "Splits s on \n or \r\n."}, :name clojure.string/split-lines, :variadic false, :file "out/clojure/string.cljs", :end-column 18, :method-params ([s]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 160, :end-line 160, :max-fixed-arity 1, :fn-var true, :arglists (quote ([s])), :doc "Splits s on \n or \r\n."}, lower-case {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 90, :column 7, :end-line 90, :end-column 17, :arglists (quote ([s])), :doc "Converts string to all lower-case."}, :name clojure.string/lower-case, :variadic false, :file "out/clojure/string.cljs", :end-column 17, :method-params ([s]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 90, :end-line 90, :max-fixed-arity 1, :fn-var true, :arglists (quote ([s])), :doc "Converts string to all lower-case."}, trim-newline {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 180, :column 7, :end-line 180, :end-column 19, :arglists (quote ([s])), :doc "Removes all trailing newline \\n or return \\r characters from\n string. Similar to Perl's chomp."}, :name clojure.string/trim-newline, :variadic false, :file "out/clojure/string.cljs", :end-column 19, :method-params ([s]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 180, :end-line 180, :max-fixed-arity 1, :fn-var true, :arglists (quote ([s])), :doc "Removes all trailing newline \\n or return \\r characters from\n string. Similar to Perl's chomp."}, upper-case {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 85, :column 7, :end-line 85, :end-column 17, :arglists (quote ([s])), :doc "Converts string to all upper-case."}, :name clojure.string/upper-case, :variadic false, :file "out/clojure/string.cljs", :end-column 17, :method-params ([s]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 85, :end-line 85, :max-fixed-arity 1, :fn-var true, :arglists (quote ([s])), :doc "Converts string to all upper-case."}, split {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 136, :column 7, :end-line 136, :end-column 12, :arglists (quote ([s re] [s re limit])), :doc "Splits string on a regular expression. Optional argument limit is\n the maximum number of splits. Not lazy. Returns vector of the splits.", :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([s re] [s re limit]), :arglists ([s re] [s re limit]), :arglists-meta (nil nil)}}, :name clojure.string/split, :variadic false, :file "out/clojure/string.cljs", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([s re] [s re limit]), :arglists ([s re] [s re limit]), :arglists-meta (nil nil)}, :method-params ([s re] [s re limit]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 136, :end-line 136, :max-fixed-arity 3, :fn-var true, :arglists ([s re] [s re limit]), :doc "Splits string on a regular expression. Optional argument limit is\n the maximum number of splits. Not lazy. Returns vector of the splits."}, trimr {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 175, :column 7, :end-line 175, :end-column 12, :arglists (quote ([s])), :doc "Removes whitespace from the right side of string."}, :name clojure.string/trimr, :variadic false, :file "out/clojure/string.cljs", :end-column 12, :method-params ([s]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 175, :end-line 175, :max-fixed-arity 1, :fn-var true, :arglists (quote ([s])), :doc "Removes whitespace from the right side of string."}, index-of {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 217, :column 7, :end-line 217, :end-column 15, :arglists (quote ([s value] [s value from-index])), :doc "Return index of value (string or char) in s, optionally searching\n forward from from-index or nil if not found.", :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([s value] [s value from-index]), :arglists ([s value] [s value from-index]), :arglists-meta (nil nil)}}, :name clojure.string/index-of, :variadic false, :file "out/clojure/string.cljs", :end-column 15, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([s value] [s value from-index]), :arglists ([s value] [s value from-index]), :arglists-meta (nil nil)}, :method-params ([s value] [s value from-index]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 217, :end-line 217, :max-fixed-arity 3, :fn-var true, :arglists ([s value] [s value from-index]), :doc "Return index of value (string or char) in s, optionally searching\n forward from from-index or nil if not found."}, trim {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 165, :column 7, :end-line 165, :end-column 11, :arglists (quote ([s])), :doc "Removes whitespace from both ends of string."}, :name clojure.string/trim, :variadic false, :file "out/clojure/string.cljs", :end-column 11, :method-params ([s]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 165, :end-line 165, :max-fixed-arity 1, :fn-var true, :arglists (quote ([s])), :doc "Removes whitespace from both ends of string."}, triml {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 170, :column 7, :end-line 170, :end-column 12, :arglists (quote ([s])), :doc "Removes whitespace from the left side of string."}, :name clojure.string/triml, :variadic false, :file "out/clojure/string.cljs", :end-column 12, :method-params ([s]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 170, :end-line 170, :max-fixed-arity 1, :fn-var true, :arglists (quote ([s])), :doc "Removes whitespace from the left side of string."}, blank? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 193, :column 16, :end-line 193, :end-column 22, :tag boolean, :arglists (quote ([s])), :doc "True is s is nil, empty, or contains only whitespace."}, :name clojure.string/blank?, :variadic false, :file "out/clojure/string.cljs", :end-column 22, :method-params ([s]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 193, :ret-tag boolean, :end-line 193, :max-fixed-arity 1, :tag boolean, :fn-var true, :arglists (quote ([s])), :doc "True is s is nil, empty, or contains only whitespace."}, re-surrogate-pair {:name clojure.string/re-surrogate-pair, :file "out/clojure/string.cljs", :line 18, :column 1, :end-line 18, :end-column 33, :private true, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 18, :column 16, :end-line 18, :end-column 33, :private true}, :tag js/RegExp}, split-with-empty-regex {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/clojure/string.cljs", :line 126, :column 8, :end-line 126, :end-column 30, :private true, :arglists (quote ([s limit]))}, :private true, :name clojure.string/split-with-empty-regex, :variadic false, :file "out/clojure/string.cljs", :end-column 30, :method-params ([s limit]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 126, :end-line 126, :max-fixed-arity 2, :fn-var true, :arglists (quote ([s limit]))}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:else}, :order [:else]}, :doc nil} \ No newline at end of file
diff --git a/src/http/static/viz/1/clojure/string.js b/src/http/static/viz/1/clojure/string.js
new file mode 100644
index 0000000..a5f3d99
--- /dev/null
+++ b/src/http/static/viz/1/clojure/string.js
@@ -0,0 +1,505 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('clojure.string');
+goog.require('cljs.core');
+goog.require('goog.string');
+goog.require('goog.string.StringBuffer');
+clojure.string.seq_reverse = (function clojure$string$seq_reverse(coll){
+return cljs.core.reduce.call(null,cljs.core.conj,cljs.core.List.EMPTY,coll);
+});
+clojure.string.re_surrogate_pair = (new RegExp("([\\uD800-\\uDBFF])([\\uDC00-\\uDFFF])","g"));
+/**
+ * Returns s with its characters reversed.
+ */
+clojure.string.reverse = (function clojure$string$reverse(s){
+return s.replace(clojure.string.re_surrogate_pair,"$2$1").split("").reverse().join("");
+});
+clojure.string.replace_all = (function clojure$string$replace_all(s,re,replacement){
+return s.replace((new RegExp(re.source,"g")),replacement);
+});
+clojure.string.replace_with = (function clojure$string$replace_with(f){
+return (function() {
+var G__8073__delegate = function (args){
+var matches = cljs.core.drop_last.call(null,(2),args);
+if(cljs.core._EQ_.call(null,cljs.core.count.call(null,matches),(1))){
+return f.call(null,cljs.core.first.call(null,matches));
+} else {
+return f.call(null,cljs.core.vec.call(null,matches));
+}
+};
+var G__8073 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__8074__i = 0, G__8074__a = new Array(arguments.length - 0);
+while (G__8074__i < G__8074__a.length) {G__8074__a[G__8074__i] = arguments[G__8074__i + 0]; ++G__8074__i;}
+ args = new cljs.core.IndexedSeq(G__8074__a,0);
+}
+return G__8073__delegate.call(this,args);};
+G__8073.cljs$lang$maxFixedArity = 0;
+G__8073.cljs$lang$applyTo = (function (arglist__8075){
+var args = cljs.core.seq(arglist__8075);
+return G__8073__delegate(args);
+});
+G__8073.cljs$core$IFn$_invoke$arity$variadic = G__8073__delegate;
+return G__8073;
+})()
+;
+});
+/**
+ * Replaces all instance of match with replacement in s.
+ * match/replacement can be:
+ *
+ * string / string
+ * pattern / (string or function of match).
+ */
+clojure.string.replace = (function clojure$string$replace(s,match,replacement){
+if(typeof match === 'string'){
+return s.replace((new RegExp(goog.string.regExpEscape(match),"g")),replacement);
+} else {
+if((match instanceof RegExp)){
+if(typeof replacement === 'string'){
+return clojure.string.replace_all.call(null,s,match,replacement);
+} else {
+return clojure.string.replace_all.call(null,s,match,clojure.string.replace_with.call(null,replacement));
+}
+} else {
+throw [cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid match arg: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(match)].join('');
+
+}
+}
+});
+/**
+ * Replaces the first instance of match with replacement in s.
+ * match/replacement can be:
+ *
+ * string / string
+ * pattern / (string or function of match).
+ */
+clojure.string.replace_first = (function clojure$string$replace_first(s,match,replacement){
+return s.replace(match,replacement);
+});
+/**
+ * Returns a string of all elements in coll, as returned by (seq coll),
+ * separated by an optional separator.
+ */
+clojure.string.join = (function clojure$string$join(var_args){
+var args8076 = [];
+var len__7927__auto___8079 = arguments.length;
+var i__7928__auto___8080 = (0);
+while(true){
+if((i__7928__auto___8080 < len__7927__auto___8079)){
+args8076.push((arguments[i__7928__auto___8080]));
+
+var G__8081 = (i__7928__auto___8080 + (1));
+i__7928__auto___8080 = G__8081;
+continue;
+} else {
+}
+break;
+}
+
+var G__8078 = args8076.length;
+switch (G__8078) {
+case 1:
+return clojure.string.join.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return clojure.string.join.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8076.length)].join('')));
+
+}
+});
+
+clojure.string.join.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+var sb = (new goog.string.StringBuffer());
+var coll__$1 = cljs.core.seq.call(null,coll);
+while(true){
+if(!((coll__$1 == null))){
+var G__8083 = sb.append([cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.first.call(null,coll__$1))].join(''));
+var G__8084 = cljs.core.next.call(null,coll__$1);
+sb = G__8083;
+coll__$1 = G__8084;
+continue;
+} else {
+return sb.toString();
+}
+break;
+}
+});
+
+clojure.string.join.cljs$core$IFn$_invoke$arity$2 = (function (separator,coll){
+var sb = (new goog.string.StringBuffer());
+var coll__$1 = cljs.core.seq.call(null,coll);
+while(true){
+if(!((coll__$1 == null))){
+sb.append([cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.first.call(null,coll__$1))].join(''));
+
+var coll__$2 = cljs.core.next.call(null,coll__$1);
+if((coll__$2 == null)){
+} else {
+sb.append(separator);
+}
+
+var G__8085 = sb;
+var G__8086 = coll__$2;
+sb = G__8085;
+coll__$1 = G__8086;
+continue;
+} else {
+return sb.toString();
+}
+break;
+}
+});
+
+clojure.string.join.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Converts string to all upper-case.
+ */
+clojure.string.upper_case = (function clojure$string$upper_case(s){
+return s.toUpperCase();
+});
+/**
+ * Converts string to all lower-case.
+ */
+clojure.string.lower_case = (function clojure$string$lower_case(s){
+return s.toLowerCase();
+});
+/**
+ * Converts first character of the string to upper-case, all other
+ * characters to lower-case.
+ */
+clojure.string.capitalize = (function clojure$string$capitalize(s){
+if((cljs.core.count.call(null,s) < (2))){
+return clojure.string.upper_case.call(null,s);
+} else {
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(clojure.string.upper_case.call(null,cljs.core.subs.call(null,s,(0),(1)))),cljs.core.str.cljs$core$IFn$_invoke$arity$1(clojure.string.lower_case.call(null,cljs.core.subs.call(null,s,(1))))].join('');
+}
+});
+clojure.string.pop_last_while_empty = (function clojure$string$pop_last_while_empty(v){
+var v__$1 = v;
+while(true){
+if(("" === cljs.core.peek.call(null,v__$1))){
+var G__8087 = cljs.core.pop.call(null,v__$1);
+v__$1 = G__8087;
+continue;
+} else {
+return v__$1;
+}
+break;
+}
+});
+clojure.string.discard_trailing_if_needed = (function clojure$string$discard_trailing_if_needed(limit,v){
+if((((0) === limit)) && (((1) < cljs.core.count.call(null,v)))){
+return clojure.string.pop_last_while_empty.call(null,v);
+} else {
+return v;
+}
+});
+clojure.string.split_with_empty_regex = (function clojure$string$split_with_empty_regex(s,limit){
+if(((limit <= (0))) || ((limit >= ((2) + cljs.core.count.call(null,s))))){
+return cljs.core.conj.call(null,cljs.core.vec.call(null,cljs.core.cons.call(null,"",cljs.core.map.call(null,cljs.core.str,cljs.core.seq.call(null,s)))),"");
+} else {
+var pred__8091 = cljs.core._EQ__EQ_;
+var expr__8092 = limit;
+if(cljs.core.truth_(pred__8091.call(null,(1),expr__8092))){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[s],null));
+} else {
+if(cljs.core.truth_(pred__8091.call(null,(2),expr__8092))){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,["",s],null));
+} else {
+var c = (limit - (2));
+return cljs.core.conj.call(null,cljs.core.vec.call(null,cljs.core.cons.call(null,"",cljs.core.subvec.call(null,cljs.core.vec.call(null,cljs.core.map.call(null,cljs.core.str,cljs.core.seq.call(null,s))),(0),c))),cljs.core.subs.call(null,s,c));
+}
+}
+}
+});
+/**
+ * Splits string on a regular expression. Optional argument limit is
+ * the maximum number of splits. Not lazy. Returns vector of the splits.
+ */
+clojure.string.split = (function clojure$string$split(var_args){
+var args8094 = [];
+var len__7927__auto___8097 = arguments.length;
+var i__7928__auto___8098 = (0);
+while(true){
+if((i__7928__auto___8098 < len__7927__auto___8097)){
+args8094.push((arguments[i__7928__auto___8098]));
+
+var G__8099 = (i__7928__auto___8098 + (1));
+i__7928__auto___8098 = G__8099;
+continue;
+} else {
+}
+break;
+}
+
+var G__8096 = args8094.length;
+switch (G__8096) {
+case 2:
+return clojure.string.split.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return clojure.string.split.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8094.length)].join('')));
+
+}
+});
+
+clojure.string.split.cljs$core$IFn$_invoke$arity$2 = (function (s,re){
+return clojure.string.split.call(null,s,re,(0));
+});
+
+clojure.string.split.cljs$core$IFn$_invoke$arity$3 = (function (s,re,limit){
+return clojure.string.discard_trailing_if_needed.call(null,limit,((("/(?:)/" === [cljs.core.str.cljs$core$IFn$_invoke$arity$1(re)].join('')))?clojure.string.split_with_empty_regex.call(null,s,limit):(((limit < (1)))?cljs.core.vec.call(null,[cljs.core.str.cljs$core$IFn$_invoke$arity$1(s)].join('').split(re)):(function (){var s__$1 = s;
+var limit__$1 = limit;
+var parts = cljs.core.PersistentVector.EMPTY;
+while(true){
+if(((1) === limit__$1)){
+return cljs.core.conj.call(null,parts,s__$1);
+} else {
+var m = cljs.core.re_find.call(null,re,s__$1);
+if(!((m == null))){
+var index = s__$1.indexOf(m);
+var G__8101 = s__$1.substring((index + cljs.core.count.call(null,m)));
+var G__8102 = (limit__$1 - (1));
+var G__8103 = cljs.core.conj.call(null,parts,s__$1.substring((0),index));
+s__$1 = G__8101;
+limit__$1 = G__8102;
+parts = G__8103;
+continue;
+} else {
+return cljs.core.conj.call(null,parts,s__$1);
+}
+}
+break;
+}
+})())));
+});
+
+clojure.string.split.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Splits s on
+ * or
+ * .
+ */
+clojure.string.split_lines = (function clojure$string$split_lines(s){
+return clojure.string.split.call(null,s,/\n|\r\n/);
+});
+/**
+ * Removes whitespace from both ends of string.
+ */
+clojure.string.trim = (function clojure$string$trim(s){
+return goog.string.trim(s);
+});
+/**
+ * Removes whitespace from the left side of string.
+ */
+clojure.string.triml = (function clojure$string$triml(s){
+return goog.string.trimLeft(s);
+});
+/**
+ * Removes whitespace from the right side of string.
+ */
+clojure.string.trimr = (function clojure$string$trimr(s){
+return goog.string.trimRight(s);
+});
+/**
+ * Removes all trailing newline \n or return \r characters from
+ * string. Similar to Perl's chomp.
+ */
+clojure.string.trim_newline = (function clojure$string$trim_newline(s){
+var index = s.length;
+while(true){
+if((index === (0))){
+return "";
+} else {
+var ch = cljs.core.get.call(null,s,(index - (1)));
+if((("\n" === ch)) || (("\r" === ch))){
+var G__8104 = (index - (1));
+index = G__8104;
+continue;
+} else {
+return s.substring((0),index);
+}
+}
+break;
+}
+});
+/**
+ * True is s is nil, empty, or contains only whitespace.
+ */
+clojure.string.blank_QMARK_ = (function clojure$string$blank_QMARK_(s){
+return goog.string.isEmptySafe(s);
+});
+/**
+ * Return a new string, using cmap to escape each character ch
+ * from s as follows:
+ *
+ * If (cmap ch) is nil, append ch to the new string.
+ * If (cmap ch) is non-nil, append (str (cmap ch)) instead.
+ */
+clojure.string.escape = (function clojure$string$escape(s,cmap){
+var buffer = (new goog.string.StringBuffer());
+var length = s.length;
+var index = (0);
+while(true){
+if((length === index)){
+return buffer.toString();
+} else {
+var ch = s.charAt(index);
+var replacement = cljs.core.get.call(null,cmap,ch);
+if(!((replacement == null))){
+buffer.append([cljs.core.str.cljs$core$IFn$_invoke$arity$1(replacement)].join(''));
+} else {
+buffer.append(ch);
+}
+
+var G__8105 = (index + (1));
+index = G__8105;
+continue;
+}
+break;
+}
+});
+/**
+ * Return index of value (string or char) in s, optionally searching
+ * forward from from-index or nil if not found.
+ */
+clojure.string.index_of = (function clojure$string$index_of(var_args){
+var args8106 = [];
+var len__7927__auto___8109 = arguments.length;
+var i__7928__auto___8110 = (0);
+while(true){
+if((i__7928__auto___8110 < len__7927__auto___8109)){
+args8106.push((arguments[i__7928__auto___8110]));
+
+var G__8111 = (i__7928__auto___8110 + (1));
+i__7928__auto___8110 = G__8111;
+continue;
+} else {
+}
+break;
+}
+
+var G__8108 = args8106.length;
+switch (G__8108) {
+case 2:
+return clojure.string.index_of.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return clojure.string.index_of.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8106.length)].join('')));
+
+}
+});
+
+clojure.string.index_of.cljs$core$IFn$_invoke$arity$2 = (function (s,value){
+var result = s.indexOf(value);
+if((result < (0))){
+return null;
+} else {
+return result;
+}
+});
+
+clojure.string.index_of.cljs$core$IFn$_invoke$arity$3 = (function (s,value,from_index){
+var result = s.indexOf(value,from_index);
+if((result < (0))){
+return null;
+} else {
+return result;
+}
+});
+
+clojure.string.index_of.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Return last index of value (string or char) in s, optionally
+ * searching backward from from-index or nil if not found.
+ */
+clojure.string.last_index_of = (function clojure$string$last_index_of(var_args){
+var args8113 = [];
+var len__7927__auto___8116 = arguments.length;
+var i__7928__auto___8117 = (0);
+while(true){
+if((i__7928__auto___8117 < len__7927__auto___8116)){
+args8113.push((arguments[i__7928__auto___8117]));
+
+var G__8118 = (i__7928__auto___8117 + (1));
+i__7928__auto___8117 = G__8118;
+continue;
+} else {
+}
+break;
+}
+
+var G__8115 = args8113.length;
+switch (G__8115) {
+case 2:
+return clojure.string.last_index_of.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return clojure.string.last_index_of.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8113.length)].join('')));
+
+}
+});
+
+clojure.string.last_index_of.cljs$core$IFn$_invoke$arity$2 = (function (s,value){
+var result = s.lastIndexOf(value);
+if((result < (0))){
+return null;
+} else {
+return result;
+}
+});
+
+clojure.string.last_index_of.cljs$core$IFn$_invoke$arity$3 = (function (s,value,from_index){
+var result = s.lastIndexOf(value,from_index);
+if((result < (0))){
+return null;
+} else {
+return result;
+}
+});
+
+clojure.string.last_index_of.cljs$lang$maxFixedArity = 3;
+
+/**
+ * True if s starts with substr.
+ */
+clojure.string.starts_with_QMARK_ = (function clojure$string$starts_with_QMARK_(s,substr){
+return goog.string.startsWith(s,substr);
+});
+/**
+ * True if s ends with substr.
+ */
+clojure.string.ends_with_QMARK_ = (function clojure$string$ends_with_QMARK_(s,substr){
+return goog.string.endsWith(s,substr);
+});
+/**
+ * True if s includes substr.
+ */
+clojure.string.includes_QMARK_ = (function clojure$string$includes_QMARK_(s,substr){
+return goog.string.contains(s,substr);
+});
+
+//# sourceMappingURL=string.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/clojure/string.js.map b/src/http/static/viz/1/clojure/string.js.map
new file mode 100644
index 0000000..41f4864
--- /dev/null
+++ b/src/http/static/viz/1/clojure/string.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/clojure\/string.js","sources":["string.cljs"],"lineCount":505,"mappings":";AAQA;;;;AAKA,6BAAA,7BAAOA,kEACJC;AADH,AAEE,iDAAA,1CAACC,2BAAOC,oCAAQF;;AAElB,AAAeG,mCACb,KAAAC,OAAA,yCAAA;AAEF;;;yBAAA,zBAAMC,0DAEHC;AAFH,OAGM,2CAAA,3CAAUA,UAAEH,jBACZ,OAAA,AAAA,yDAAA,mBAAA;;AAEN,6BAAA,7BAAOI,kEACJD,EAAEE,GAAGC;AADR,AAEE,OAAUH,UAAE,KAAAF,iBAAA,VAAY,AAAUI,gBAASC;;AAE7C,8BAAA,9BAAOC,oEACJC;AADH,AAEE;kCAAOC;AAAP,AACE,IAAMC,UAAQ,8BAAA,9BAACC,kCAAYF;AAA3B,AACE,GAAI,4DAAA,5DAACG,yBAAE,AAACC,0BAAMH;AACZ,OAACF,YAAE,AAACM,0BAAMJ;;AACV,OAACF,YAAE,AAACO,wBAAIL;;;;IAJPD;;;;EAAAA;;mCAAAA;;;IAAAA;yBAAAA;;;;;;;AAMT;;;;;;;yBAAA,zBAAMO,0DAMHb,EAAEc,MAAMX;AANX,AAOE,GACE,OAASW;AACT,OAAUd,UAAE,KAAAF,uCAAA,hCAAY,AAACiB,yBAAqBD,aAAYX;;AAF5D,GAIE,kBAAWL,jBAAUgB;AACrB,GAAI,OAASX;AACX,OAACF,qCAAYD,EAAEc,MAAMX;;AACrB,OAACF,qCAAYD,EAAEc,MAAM,AAACV,sCAAaD;;;AAPvC,AASQ,MAAO,6CAAA,mEAA2BW;;;;;AAE5C;;;;;;;+BAAA,\/BAAME,sEAMHhB,EAAEc,MAAMX;AANX,AAOE,OAAUH,UAAEc,MAAMX;;AAEpB,AAAA;;;;sBAAA,8BAAAc,pDAAMK;AAAN,AAAA,IAAAJ,WAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,cAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,UAAA,AAAAH;AAAA,AAAA,QAAAG;KAAA;AAAA,OAAAC,kDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAC,MAAA,6CAAA,+DAAA,AAAAL;;;;;AAAA,AAAA,oDAAA,pDAAMI,+DAGF5B;AAHJ,AAIG,IAAO8B,KAAG,KAAAC;IAAgB\/B,WAAK,AAACgC,wBAAIhC;;AAApC,AACE,GAAA,EAAQ,aAAA,ZAAMA;AACZ,cAAO,AAAG8B,UAAW,6CAAK,AAACb,0BAAMjB;cAAS,AAACiC,yBAAKjC;;;;;AAChD,OAAW8B;;;;;;AAPlB,AAAA,oDAAA,pDAAMF,+DAQFM,UAAUlC;AARd,AASG,IAAO8B,KAAG,KAAAC;IAAgB\/B,WAAK,AAACgC,wBAAIhC;;AAApC,AACE,GAAA,EAAQ,aAAA,ZAAMA;AACZ,AACE,AAAG8B,UAAW,6CAAK,AAACb,0BAAMjB;;AAC1B,IAAMA,WAAK,AAACiC,yBAAKjC;AAAjB,AACE,GAAU,aAAA,ZAAMA;AAAhB;AAAA,AACE,AAAG8B,UAAWI;;;AAChB,cAAOJ;cAAG9B;;;;;AACd,OAAW8B;;;;;;AAjBlB,AAAA,8CAAA,9CAAMF;;AAAN,AAmBA;;;4BAAA,5BAAMO,gEAEH7B;AAFH,AAGE,OAAcA;;AAEhB;;;4BAAA,5BAAM8B,gEAEH9B;AAFH,AAGE,OAAcA;;AAEhB;;;;4BAAA,5BAAM+B,gEAGH\/B;AAHH,AAIE,GAAI,gCAAA,\/BAAG,AAACU,0BAAMV;AACZ,OAAC6B,oCAAW7B;;AACZ,oDAAK,AAAC6B,oCAAW,2BAAA,IAAA,\/BAACG,yBAAKhC,yDAClB,AAAC8B,oCAAW,2BAAA,3BAACE,yBAAKhC;;;AAW3B,sCAAA,tCAAOiC,oFACJC;AADH,AAEE,IAAOA,QAAEA;;AAAT,AACE,GAAI,CAAA,OAAe,AAACC,yBAAKD;AACvB,cAAO,AAACE,wBAAIF;;;;AACZA;;;;;AAEN,4CAAA,5CAAOG,gGACJC,MAAMJ;AADT,AAEE,GAAI,CAAK,CAAA,QAAMI,YAAO,CAAA,MAAK,AAAC5B,0BAAMwB;AAChC,OAACD,8CAAqBC;;AACtBA;;;AAEJ,wCAAA,xCAAOK,wFACJvC,EAAEsC;AADL,AAEE,GAAI,CAAI,UAAA,TAAIA,mBAAS,CAAIA,SAAM,CAAA,MAAK,AAAC5B,0BAAMV;AACzC,wJAAA,jJAACJ,yBAAK,AAACgB,wBAAI,yBAAA,zBAAC4B,4BAAQ,AAACC,wBAAIC,cAAI,AAAChB,wBAAI1B;;AAClC,IAAA2C,aAAOE;IAAPD,aAAUN;AAAV,AAAA,oBAAA,AAAAK,qBAAA,IAAAC;AACI,YAAAE,2BAAA,KAAA,EAAA,IAAA,AAAAA,sCAAA,IAAA,HAAQ9C;;AADZ,oBAAA,AAAA2C,qBAAA,IAAAC;AAEI,YAAAE,2BAAA,KAAA,EAAA,IAAA,AAAAA,sCAAA,CAAA,MAAA,HAAW9C;;AACb,IAAM+C,IAAE,SAAA,RAAGT;AAAX,AACE,OAAC1C,yBAAK,AAACgB,wBAAI,yBAAA,zBAAC4B,4BAAQ,sHAAA,tHAACQ,2BAAO,AAACpC,wBAAI,AAAC6B,wBAAIC,cAAI,AAAChB,wBAAI1B,SAAO+C,KAAK,AAACf,yBAAKhC,EAAE+C;;;;;AAE3E,AAAA;;;;uBAAA,+BAAA9B,tDAAMkC;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA9B,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA8B,cAAA,CAAA,UAAA7B;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA8B,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA5B,MAAA,6CAAA,+DAAA,AAAA0B;;;;;AAAA,AAAA,qDAAA,rDAAME,gEAGFnD,EAAEE;AAHN,AAIK,2CAAA,pCAACiD,+BAAMnD,EAAEE;;;AAJd,AAAA,qDAAA,rDAAMiD,gEAKAnD,EAAEE,GAAGoC;AALX,AAMK,OAACD,oDAA2BC,MAC1B,EAAI,CAAA,aAAqB,6CAAKpC,gBAC5B,AAACqC,gDAAuBvC,EAAEsC,OAC1B,EAAI,SAAA,RAAGA,cACL,AAAC1B,wBAAI,AAAQ,6CAAKZ,mBAAGE,KACrB,iBAAOF,QAAEA;IACFsC,YAAMA;YADb,RAEOc;;AAFP,AAGE,GAAI,CAAA,QAAMd;AACR,OAAC1C,yBAAKwD,MAAMpD;;AACZ,IAAMqD,IAAE,AAACC,4BAAQpD,GAAGF;AAApB,AACE,GAAA,EAAQ,MAAA,LAAMqD;AACZ,IAAME,QAAM,AAAUvD,cAAEqD;AAAxB,AACE,cAAO,AAAYrD,gBAAE,CAAGuD,QAAM,AAAC7C,0BAAM2C;cACnC,aAAA,ZAAKf;cACL,AAAC1C,yBAAKwD,MAAM,gBAAA,hBAAYpD,oBAAIuD;;;;;;AAChC,OAAC3D,yBAAKwD,MAAMpD;;;;;;;;AAtB\/B,AAAA,+CAAA,\/CAAMmD;;AAAN,AAwBA;;;;;6BAAA,7BAAMK,kEAEHxD;AAFH,AAGE,wCAAA,jCAACmD,+BAAMnD;;AAET;;;sBAAA,tBAAMyD,oDAEHzD;AAFH,AAGE,OAAC0D,iBAAa1D;;AAEhB;;;uBAAA,vBAAM2D,sDAEH3D;AAFH,AAGE,OAAC4D,qBAAiB5D;;AAEpB;;;uBAAA,vBAAM6D,sDAEH7D;AAFH,AAGE,OAAC8D,sBAAkB9D;;AAErB;;;;8BAAA,9BAAM+D,oEAGH\/D;AAHH,AAIE,IAAOuD,QAAM,AAAUvD;;AAAvB,AACE,GAAI,WAAA,VAAOuD;AAAX;;AAEE,IAAMS,KAAG,AAACC,wBAAIjE,EAAE,SAAA,RAAKuD;AAArB,AACE,GAAI,CAAI,CAAA,SAAqBS,SACrB,CAAA,SAAoBA;AAC1B,cAAO,SAAA,RAAKT;;;;AACZ,mBAAA,ZAAYvD,gBAAIuD;;;;;;AAE1B;;;8BAAA,9BAAeW,oEAEZlE;AAFH,AAGE,OAACmE,wBAAoBnE;;AAEvB;;;;;;;wBAAA,xBAAMoE,wDAMHpE,EAAEqE;AANL,AAOE,IAAMC,SAAO,KAAA7C;IACP8C,SAAO,AAAUvE;AADvB,AAEE,YAAA,RAAOuD;;AAAP,AACE,GAAI,CAAIgB,WAAOhB;AACb,OAAGe;;AACH,IAAMN,KAAG,AAAShE,SAAEuD;IACdpD,cAAY,AAAC8D,wBAAII,KAAKL;AAD5B,AAEE,GAAA,EAAQ,gBAAA,fAAM7D;AACZ,AAASmE,cAAO,6CAAKnE;;AACrB,AAASmE,cAAON;;;AAClB,cAAO,SAAA,RAAKT;;;;;;;AAEtB,AAAA;;;;0BAAA,kCAAAtC,5DAAMyD;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAArD,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAqD,cAAA,CAAA,UAAApD;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAqD,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAnD,MAAA,6CAAA,+DAAA,AAAAiD;;;;;AAAA,AAAA,wDAAA,xDAAME,mEAGF1E,EAAE2E;AAHN,AAIG,IAAMC,SAAO,AAAU5E,UAAE2E;AAAzB,AACE,GAAI,UAAA,TAAMC;AAAV;;AAEEA;;;;AAPP,AAAA,wDAAA,xDAAMF,mEAQF1E,EAAE2E,MAAME;AARZ,AASG,IAAMD,SAAO,AAAU5E,UAAE2E,MAAME;AAA\/B,AACE,GAAI,UAAA,TAAMD;AAAV;;AAEEA;;;;AAZP,AAAA,kDAAA,lDAAMF;;AAAN,AAcA,AAAA;;;;+BAAA,uCAAAzD,tEAAM+D;AAAN,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA3D,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA2D,cAAA,CAAA,UAAA1D;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA2D,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,2DAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,2DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAzD,MAAA,6CAAA,+DAAA,AAAAuD;;;;;AAAA,AAAA,6DAAA,7DAAME,wEAGFhF,EAAE2E;AAHN,AAIG,IAAMC,SAAO,AAAc5E,cAAE2E;AAA7B,AACE,GAAI,UAAA,TAAMC;AAAV;;AAEEA;;;;AAPP,AAAA,6DAAA,7DAAMI,wEAQFhF,EAAE2E,MAAME;AARZ,AASG,IAAMD,SAAO,AAAc5E,cAAE2E,MAAME;AAAnC,AACE,GAAI,UAAA,TAAMD;AAAV;;AAEEA;;;;AAZP,AAAA,uDAAA,vDAAMI;;AAAN,AAcA;;;oCAAA,pCAAeC,gFAEZjF,EAAEkF;AAFL,AAGE,OAACC,uBAAmBnF,EAAEkF;;AAExB;;;kCAAA,lCAAeE,4EAEZpF,EAAEkF;AAFL,AAGE,OAACG,qBAAiBrF,EAAEkF;;AAEtB;;;iCAAA,jCAAeI,0EAEZtF,EAAEkF;AAFL,AAGE,OAACK,qBAAiBvF,EAAEkF","names":["clojure.string\/seq-reverse","coll","cljs.core\/reduce","cljs.core\/conj","clojure.string\/re-surrogate-pair","js\/RegExp","clojure.string\/reverse","s","clojure.string\/replace-all","re","replacement","clojure.string\/replace-with","f","args","matches","cljs.core\/drop-last","cljs.core\/=","cljs.core\/count","cljs.core\/first","cljs.core\/vec","clojure.string\/replace","match","goog.string\/regExpEscape","clojure.string\/replace-first","var_args","args8076","len__7927__auto__","i__7928__auto__","G__8078","clojure.string\/join","js\/Error","sb","goog\/string.StringBuffer","cljs.core\/seq","cljs.core\/next","separator","clojure.string\/upper-case","clojure.string\/lower-case","clojure.string\/capitalize","cljs.core\/subs","clojure.string\/pop-last-while-empty","v","cljs.core\/peek","cljs.core\/pop","clojure.string\/discard-trailing-if-needed","limit","clojure.string\/split-with-empty-regex","cljs.core\/cons","cljs.core\/map","cljs.core\/str","pred__8091","expr__8092","cljs.core\/==","cljs.core\/PersistentVector","c","cljs.core\/subvec","args8094","G__8096","clojure.string\/split","parts","m","cljs.core\/re-find","index","clojure.string\/split-lines","clojure.string\/trim","goog.string\/trim","clojure.string\/triml","goog.string\/trimLeft","clojure.string\/trimr","goog.string\/trimRight","clojure.string\/trim-newline","ch","cljs.core\/get","clojure.string\/blank?","goog.string\/isEmptySafe","clojure.string\/escape","cmap","buffer","length","args8106","G__8108","clojure.string\/index-of","value","result","from-index","args8113","G__8115","clojure.string\/last-index-of","clojure.string\/starts-with?","substr","goog.string\/startsWith","clojure.string\/ends-with?","goog.string\/endsWith","clojure.string\/includes?","goog.string\/contains"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/goog/array/array.js b/src/http/static/viz/1/goog/array/array.js
new file mode 100644
index 0000000..4fdfcaf
--- /dev/null
+++ b/src/http/static/viz/1/goog/array/array.js
@@ -0,0 +1,1665 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for manipulating arrays.
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+goog.provide('goog.array');
+
+goog.require('goog.asserts');
+
+
+/**
+ * @define {boolean} NATIVE_ARRAY_PROTOTYPES indicates whether the code should
+ * rely on Array.prototype functions, if available.
+ *
+ * The Array.prototype functions can be defined by external libraries like
+ * Prototype and setting this flag to false forces closure to use its own
+ * goog.array implementation.
+ *
+ * If your javascript can be loaded by a third party site and you are wary about
+ * relying on the prototype functions, specify
+ * "--define goog.NATIVE_ARRAY_PROTOTYPES=false" to the JSCompiler.
+ *
+ * Setting goog.TRUSTED_SITE to false will automatically set
+ * NATIVE_ARRAY_PROTOTYPES to false.
+ */
+goog.define('goog.NATIVE_ARRAY_PROTOTYPES', goog.TRUSTED_SITE);
+
+
+/**
+ * @define {boolean} If true, JSCompiler will use the native implementation of
+ * array functions where appropriate (e.g., {@code Array#filter}) and remove the
+ * unused pure JS implementation.
+ */
+goog.define('goog.array.ASSUME_NATIVE_FUNCTIONS', false);
+
+
+/**
+ * Returns the last element in an array without removing it.
+ * Same as goog.array.last.
+ * @param {IArrayLike<T>|string} array The array.
+ * @return {T} Last item in array.
+ * @template T
+ */
+goog.array.peek = function(array) {
+ return array[array.length - 1];
+};
+
+
+/**
+ * Returns the last element in an array without removing it.
+ * Same as goog.array.peek.
+ * @param {IArrayLike<T>|string} array The array.
+ * @return {T} Last item in array.
+ * @template T
+ */
+goog.array.last = goog.array.peek;
+
+// NOTE(arv): Since most of the array functions are generic it allows you to
+// pass an array-like object. Strings have a length and are considered array-
+// like. However, the 'in' operator does not work on strings so we cannot just
+// use the array path even if the browser supports indexing into strings. We
+// therefore end up splitting the string.
+
+
+/**
+ * Returns the index of the first element of an array with a specified value, or
+ * -1 if the element is not present in the array.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-indexof}
+ *
+ * @param {IArrayLike<T>|string} arr The array to be searched.
+ * @param {T} obj The object for which we are searching.
+ * @param {number=} opt_fromIndex The index at which to start the search. If
+ * omitted the search starts at index 0.
+ * @return {number} The index of the first matching array element.
+ * @template T
+ */
+goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.indexOf) ?
+ function(arr, obj, opt_fromIndex) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.indexOf.call(arr, obj, opt_fromIndex);
+ } :
+ function(arr, obj, opt_fromIndex) {
+ var fromIndex = opt_fromIndex == null ?
+ 0 :
+ (opt_fromIndex < 0 ? Math.max(0, arr.length + opt_fromIndex) :
+ opt_fromIndex);
+
+ if (goog.isString(arr)) {
+ // Array.prototype.indexOf uses === so only strings should be found.
+ if (!goog.isString(obj) || obj.length != 1) {
+ return -1;
+ }
+ return arr.indexOf(obj, fromIndex);
+ }
+
+ for (var i = fromIndex; i < arr.length; i++) {
+ if (i in arr && arr[i] === obj) return i;
+ }
+ return -1;
+ };
+
+
+/**
+ * Returns the index of the last element of an array with a specified value, or
+ * -1 if the element is not present in the array.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-lastindexof}
+ *
+ * @param {!IArrayLike<T>|string} arr The array to be searched.
+ * @param {T} obj The object for which we are searching.
+ * @param {?number=} opt_fromIndex The index at which to start the search. If
+ * omitted the search starts at the end of the array.
+ * @return {number} The index of the last matching array element.
+ * @template T
+ */
+goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.lastIndexOf) ?
+ function(arr, obj, opt_fromIndex) {
+ goog.asserts.assert(arr.length != null);
+
+ // Firefox treats undefined and null as 0 in the fromIndex argument which
+ // leads it to always return -1
+ var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex;
+ return Array.prototype.lastIndexOf.call(arr, obj, fromIndex);
+ } :
+ function(arr, obj, opt_fromIndex) {
+ var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex;
+
+ if (fromIndex < 0) {
+ fromIndex = Math.max(0, arr.length + fromIndex);
+ }
+
+ if (goog.isString(arr)) {
+ // Array.prototype.lastIndexOf uses === so only strings should be found.
+ if (!goog.isString(obj) || obj.length != 1) {
+ return -1;
+ }
+ return arr.lastIndexOf(obj, fromIndex);
+ }
+
+ for (var i = fromIndex; i >= 0; i--) {
+ if (i in arr && arr[i] === obj) return i;
+ }
+ return -1;
+ };
+
+
+/**
+ * Calls a function for each element in an array. Skips holes in the array.
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-foreach}
+ *
+ * @param {IArrayLike<T>|string} arr Array or array like object over
+ * which to iterate.
+ * @param {?function(this: S, T, number, ?): ?} f The function to call for every
+ * element. This function takes 3 arguments (the element, the index and the
+ * array). The return value is ignored.
+ * @param {S=} opt_obj The object to be used as the value of 'this' within f.
+ * @template T,S
+ */
+goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.forEach) ?
+ function(arr, f, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+
+ Array.prototype.forEach.call(arr, f, opt_obj);
+ } :
+ function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2) {
+ f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);
+ }
+ }
+ };
+
+
+/**
+ * Calls a function for each element in an array, starting from the last
+ * element rather than the first.
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this: S, T, number, ?): ?} f The function to call for every
+ * element. This function
+ * takes 3 arguments (the element, the index and the array). The return
+ * value is ignored.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @template T,S
+ */
+goog.array.forEachRight = function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = l - 1; i >= 0; --i) {
+ if (i in arr2) {
+ f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);
+ }
+ }
+};
+
+
+/**
+ * Calls a function for each element in an array, and if the function returns
+ * true adds the element to a new array.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-filter}
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?):boolean} f The function to call for
+ * every element. This function
+ * takes 3 arguments (the element, the index and the array) and must
+ * return a Boolean. If the return value is true the element is added to the
+ * result array. If it is false the element is not included.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @return {!Array<T>} a new array in which only elements that passed the test
+ * are present.
+ * @template T,S
+ */
+goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.filter) ?
+ function(arr, f, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.filter.call(arr, f, opt_obj);
+ } :
+ function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var res = [];
+ var resLength = 0;
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2) {
+ var val = arr2[i]; // in case f mutates arr2
+ if (f.call(/** @type {?} */ (opt_obj), val, i, arr)) {
+ res[resLength++] = val;
+ }
+ }
+ }
+ return res;
+ };
+
+
+/**
+ * Calls a function for each element in an array and inserts the result into a
+ * new array.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-map}
+ *
+ * @param {IArrayLike<VALUE>|string} arr Array or array like object
+ * over which to iterate.
+ * @param {function(this:THIS, VALUE, number, ?): RESULT} f The function to call
+ * for every element. This function takes 3 arguments (the element,
+ * the index and the array) and should return something. The result will be
+ * inserted into a new array.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within f.
+ * @return {!Array<RESULT>} a new array with the results from f.
+ * @template THIS, VALUE, RESULT
+ */
+goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.map) ?
+ function(arr, f, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.map.call(arr, f, opt_obj);
+ } :
+ function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var res = new Array(l);
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2) {
+ res[i] = f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);
+ }
+ }
+ return res;
+ };
+
+
+/**
+ * Passes every element of an array into a function and accumulates the result.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-reduce}
+ *
+ * For example:
+ * var a = [1, 2, 3, 4];
+ * goog.array.reduce(a, function(r, v, i, arr) {return r + v;}, 0);
+ * returns 10
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {function(this:S, R, T, number, ?) : R} f The function to call for
+ * every element. This function
+ * takes 4 arguments (the function's previous result or the initial value,
+ * the value of the current array element, the current array index, and the
+ * array itself)
+ * function(previousValue, currentValue, index, array).
+ * @param {?} val The initial value to pass into the function on the first call.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @return {R} Result of evaluating f repeatedly across the values of the array.
+ * @template T,S,R
+ */
+goog.array.reduce = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.reduce) ?
+ function(arr, f, val, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+ if (opt_obj) {
+ f = goog.bind(f, opt_obj);
+ }
+ return Array.prototype.reduce.call(arr, f, val);
+ } :
+ function(arr, f, val, opt_obj) {
+ var rval = val;
+ goog.array.forEach(arr, function(val, index) {
+ rval = f.call(/** @type {?} */ (opt_obj), rval, val, index, arr);
+ });
+ return rval;
+ };
+
+
+/**
+ * Passes every element of an array into a function and accumulates the result,
+ * starting from the last element and working towards the first.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-reduceright}
+ *
+ * For example:
+ * var a = ['a', 'b', 'c'];
+ * goog.array.reduceRight(a, function(r, v, i, arr) {return r + v;}, '');
+ * returns 'cba'
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, R, T, number, ?) : R} f The function to call for
+ * every element. This function
+ * takes 4 arguments (the function's previous result or the initial value,
+ * the value of the current array element, the current array index, and the
+ * array itself)
+ * function(previousValue, currentValue, index, array).
+ * @param {?} val The initial value to pass into the function on the first call.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @return {R} Object returned as a result of evaluating f repeatedly across the
+ * values of the array.
+ * @template T,S,R
+ */
+goog.array.reduceRight = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.reduceRight) ?
+ function(arr, f, val, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+ goog.asserts.assert(f != null);
+ if (opt_obj) {
+ f = goog.bind(f, opt_obj);
+ }
+ return Array.prototype.reduceRight.call(arr, f, val);
+ } :
+ function(arr, f, val, opt_obj) {
+ var rval = val;
+ goog.array.forEachRight(arr, function(val, index) {
+ rval = f.call(/** @type {?} */ (opt_obj), rval, val, index, arr);
+ });
+ return rval;
+ };
+
+
+/**
+ * Calls f for each element of an array. If any call returns true, some()
+ * returns true (without checking the remaining elements). If all calls
+ * return false, some() returns false.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-some}
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call for
+ * for every element. This function takes 3 arguments (the element, the
+ * index and the array) and should return a boolean.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @return {boolean} true if any element passes the test.
+ * @template T,S
+ */
+goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.some) ?
+ function(arr, f, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.some.call(arr, f, opt_obj);
+ } :
+ function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+
+/**
+ * Call f for each element of an array. If all calls return true, every()
+ * returns true. If any call returns false, every() returns false and
+ * does not continue to check the remaining elements.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-every}
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call for
+ * for every element. This function takes 3 arguments (the element, the
+ * index and the array) and should return a boolean.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @return {boolean} false if any element fails the test.
+ * @template T,S
+ */
+goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.every) ?
+ function(arr, f, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.every.call(arr, f, opt_obj);
+ } :
+ function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2 && !f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+
+/**
+ * Counts the array elements that fulfill the predicate, i.e. for which the
+ * callback function returns true. Skips holes in the array.
+ *
+ * @param {!IArrayLike<T>|string} arr Array or array like object
+ * over which to iterate.
+ * @param {function(this: S, T, number, ?): boolean} f The function to call for
+ * every element. Takes 3 arguments (the element, the index and the array).
+ * @param {S=} opt_obj The object to be used as the value of 'this' within f.
+ * @return {number} The number of the matching elements.
+ * @template T,S
+ */
+goog.array.count = function(arr, f, opt_obj) {
+ var count = 0;
+ goog.array.forEach(arr, function(element, index, arr) {
+ if (f.call(/** @type {?} */ (opt_obj), element, index, arr)) {
+ ++count;
+ }
+ }, opt_obj);
+ return count;
+};
+
+
+/**
+ * Search an array for the first element that satisfies a given condition and
+ * return that element.
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call
+ * for every element. This function takes 3 arguments (the element, the
+ * index and the array) and should return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {T|null} The first array element that passes the test, or null if no
+ * element is found.
+ * @template T,S
+ */
+goog.array.find = function(arr, f, opt_obj) {
+ var i = goog.array.findIndex(arr, f, opt_obj);
+ return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];
+};
+
+
+/**
+ * Search an array for the first element that satisfies a given condition and
+ * return its index.
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call for
+ * every element. This function
+ * takes 3 arguments (the element, the index and the array) and should
+ * return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {number} The index of the first array element that passes the test,
+ * or -1 if no element is found.
+ * @template T,S
+ */
+goog.array.findIndex = function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {
+ return i;
+ }
+ }
+ return -1;
+};
+
+
+/**
+ * Search an array (in reverse order) for the last element that satisfies a
+ * given condition and return that element.
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call
+ * for every element. This function
+ * takes 3 arguments (the element, the index and the array) and should
+ * return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {T|null} The last array element that passes the test, or null if no
+ * element is found.
+ * @template T,S
+ */
+goog.array.findRight = function(arr, f, opt_obj) {
+ var i = goog.array.findIndexRight(arr, f, opt_obj);
+ return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];
+};
+
+
+/**
+ * Search an array (in reverse order) for the last element that satisfies a
+ * given condition and return its index.
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call
+ * for every element. This function
+ * takes 3 arguments (the element, the index and the array) and should
+ * return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {number} The index of the last array element that passes the test,
+ * or -1 if no element is found.
+ * @template T,S
+ */
+goog.array.findIndexRight = function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = l - 1; i >= 0; i--) {
+ if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {
+ return i;
+ }
+ }
+ return -1;
+};
+
+
+/**
+ * Whether the array contains the given object.
+ * @param {IArrayLike<?>|string} arr The array to test for the presence of the
+ * element.
+ * @param {*} obj The object for which to test.
+ * @return {boolean} true if obj is present.
+ */
+goog.array.contains = function(arr, obj) {
+ return goog.array.indexOf(arr, obj) >= 0;
+};
+
+
+/**
+ * Whether the array is empty.
+ * @param {IArrayLike<?>|string} arr The array to test.
+ * @return {boolean} true if empty.
+ */
+goog.array.isEmpty = function(arr) {
+ return arr.length == 0;
+};
+
+
+/**
+ * Clears the array.
+ * @param {IArrayLike<?>} arr Array or array like object to clear.
+ */
+goog.array.clear = function(arr) {
+ // For non real arrays we don't have the magic length so we delete the
+ // indices.
+ if (!goog.isArray(arr)) {
+ for (var i = arr.length - 1; i >= 0; i--) {
+ delete arr[i];
+ }
+ }
+ arr.length = 0;
+};
+
+
+/**
+ * Pushes an item into an array, if it's not already in the array.
+ * @param {Array<T>} arr Array into which to insert the item.
+ * @param {T} obj Value to add.
+ * @template T
+ */
+goog.array.insert = function(arr, obj) {
+ if (!goog.array.contains(arr, obj)) {
+ arr.push(obj);
+ }
+};
+
+
+/**
+ * Inserts an object at the given index of the array.
+ * @param {IArrayLike<?>} arr The array to modify.
+ * @param {*} obj The object to insert.
+ * @param {number=} opt_i The index at which to insert the object. If omitted,
+ * treated as 0. A negative index is counted from the end of the array.
+ */
+goog.array.insertAt = function(arr, obj, opt_i) {
+ goog.array.splice(arr, opt_i, 0, obj);
+};
+
+
+/**
+ * Inserts at the given index of the array, all elements of another array.
+ * @param {IArrayLike<?>} arr The array to modify.
+ * @param {IArrayLike<?>} elementsToAdd The array of elements to add.
+ * @param {number=} opt_i The index at which to insert the object. If omitted,
+ * treated as 0. A negative index is counted from the end of the array.
+ */
+goog.array.insertArrayAt = function(arr, elementsToAdd, opt_i) {
+ goog.partial(goog.array.splice, arr, opt_i, 0).apply(null, elementsToAdd);
+};
+
+
+/**
+ * Inserts an object into an array before a specified object.
+ * @param {Array<T>} arr The array to modify.
+ * @param {T} obj The object to insert.
+ * @param {T=} opt_obj2 The object before which obj should be inserted. If obj2
+ * is omitted or not found, obj is inserted at the end of the array.
+ * @template T
+ */
+goog.array.insertBefore = function(arr, obj, opt_obj2) {
+ var i;
+ if (arguments.length == 2 || (i = goog.array.indexOf(arr, opt_obj2)) < 0) {
+ arr.push(obj);
+ } else {
+ goog.array.insertAt(arr, obj, i);
+ }
+};
+
+
+/**
+ * Removes the first occurrence of a particular value from an array.
+ * @param {IArrayLike<T>} arr Array from which to remove
+ * value.
+ * @param {T} obj Object to remove.
+ * @return {boolean} True if an element was removed.
+ * @template T
+ */
+goog.array.remove = function(arr, obj) {
+ var i = goog.array.indexOf(arr, obj);
+ var rv;
+ if ((rv = i >= 0)) {
+ goog.array.removeAt(arr, i);
+ }
+ return rv;
+};
+
+
+/**
+ * Removes the last occurrence of a particular value from an array.
+ * @param {!IArrayLike<T>} arr Array from which to remove value.
+ * @param {T} obj Object to remove.
+ * @return {boolean} True if an element was removed.
+ * @template T
+ */
+goog.array.removeLast = function(arr, obj) {
+ var i = goog.array.lastIndexOf(arr, obj);
+ if (i >= 0) {
+ goog.array.removeAt(arr, i);
+ return true;
+ }
+ return false;
+};
+
+
+/**
+ * Removes from an array the element at index i
+ * @param {IArrayLike<?>} arr Array or array like object from which to
+ * remove value.
+ * @param {number} i The index to remove.
+ * @return {boolean} True if an element was removed.
+ */
+goog.array.removeAt = function(arr, i) {
+ goog.asserts.assert(arr.length != null);
+
+ // use generic form of splice
+ // splice returns the removed items and if successful the length of that
+ // will be 1
+ return Array.prototype.splice.call(arr, i, 1).length == 1;
+};
+
+
+/**
+ * Removes the first value that satisfies the given condition.
+ * @param {IArrayLike<T>} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call
+ * for every element. This function
+ * takes 3 arguments (the element, the index and the array) and should
+ * return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {boolean} True if an element was removed.
+ * @template T,S
+ */
+goog.array.removeIf = function(arr, f, opt_obj) {
+ var i = goog.array.findIndex(arr, f, opt_obj);
+ if (i >= 0) {
+ goog.array.removeAt(arr, i);
+ return true;
+ }
+ return false;
+};
+
+
+/**
+ * Removes all values that satisfy the given condition.
+ * @param {IArrayLike<T>} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call
+ * for every element. This function
+ * takes 3 arguments (the element, the index and the array) and should
+ * return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {number} The number of items removed
+ * @template T,S
+ */
+goog.array.removeAllIf = function(arr, f, opt_obj) {
+ var removedCount = 0;
+ goog.array.forEachRight(arr, function(val, index) {
+ if (f.call(/** @type {?} */ (opt_obj), val, index, arr)) {
+ if (goog.array.removeAt(arr, index)) {
+ removedCount++;
+ }
+ }
+ });
+ return removedCount;
+};
+
+
+/**
+ * Returns a new array that is the result of joining the arguments. If arrays
+ * are passed then their items are added, however, if non-arrays are passed they
+ * will be added to the return array as is.
+ *
+ * Note that ArrayLike objects will be added as is, rather than having their
+ * items added.
+ *
+ * goog.array.concat([1, 2], [3, 4]) -> [1, 2, 3, 4]
+ * goog.array.concat(0, [1, 2]) -> [0, 1, 2]
+ * goog.array.concat([1, 2], null) -> [1, 2, null]
+ *
+ * There is bug in all current versions of IE (6, 7 and 8) where arrays created
+ * in an iframe become corrupted soon (not immediately) after the iframe is
+ * destroyed. This is common if loading data via goog.net.IframeIo, for example.
+ * This corruption only affects the concat method which will start throwing
+ * Catastrophic Errors (#-2147418113).
+ *
+ * See http://endoflow.com/scratch/corrupted-arrays.html for a test case.
+ *
+ * Internally goog.array should use this, so that all methods will continue to
+ * work on these broken array objects.
+ *
+ * @param {...*} var_args Items to concatenate. Arrays will have each item
+ * added, while primitives and objects will be added as is.
+ * @return {!Array<?>} The new resultant array.
+ */
+goog.array.concat = function(var_args) {
+ return Array.prototype.concat.apply(Array.prototype, arguments);
+};
+
+
+/**
+ * Returns a new array that contains the contents of all the arrays passed.
+ * @param {...!Array<T>} var_args
+ * @return {!Array<T>}
+ * @template T
+ */
+goog.array.join = function(var_args) {
+ return Array.prototype.concat.apply(Array.prototype, arguments);
+};
+
+
+/**
+ * Converts an object to an array.
+ * @param {IArrayLike<T>|string} object The object to convert to an
+ * array.
+ * @return {!Array<T>} The object converted into an array. If object has a
+ * length property, every property indexed with a non-negative number
+ * less than length will be included in the result. If object does not
+ * have a length property, an empty array will be returned.
+ * @template T
+ */
+goog.array.toArray = function(object) {
+ var length = object.length;
+
+ // If length is not a number the following it false. This case is kept for
+ // backwards compatibility since there are callers that pass objects that are
+ // not array like.
+ if (length > 0) {
+ var rv = new Array(length);
+ for (var i = 0; i < length; i++) {
+ rv[i] = object[i];
+ }
+ return rv;
+ }
+ return [];
+};
+
+
+/**
+ * Does a shallow copy of an array.
+ * @param {IArrayLike<T>|string} arr Array or array-like object to
+ * clone.
+ * @return {!Array<T>} Clone of the input array.
+ * @template T
+ */
+goog.array.clone = goog.array.toArray;
+
+
+/**
+ * Extends an array with another array, element, or "array like" object.
+ * This function operates 'in-place', it does not create a new Array.
+ *
+ * Example:
+ * var a = [];
+ * goog.array.extend(a, [0, 1]);
+ * a; // [0, 1]
+ * goog.array.extend(a, 2);
+ * a; // [0, 1, 2]
+ *
+ * @param {Array<VALUE>} arr1 The array to modify.
+ * @param {...(Array<VALUE>|VALUE)} var_args The elements or arrays of elements
+ * to add to arr1.
+ * @template VALUE
+ */
+goog.array.extend = function(arr1, var_args) {
+ for (var i = 1; i < arguments.length; i++) {
+ var arr2 = arguments[i];
+ if (goog.isArrayLike(arr2)) {
+ var len1 = arr1.length || 0;
+ var len2 = arr2.length || 0;
+ arr1.length = len1 + len2;
+ for (var j = 0; j < len2; j++) {
+ arr1[len1 + j] = arr2[j];
+ }
+ } else {
+ arr1.push(arr2);
+ }
+ }
+};
+
+
+/**
+ * Adds or removes elements from an array. This is a generic version of Array
+ * splice. This means that it might work on other objects similar to arrays,
+ * such as the arguments object.
+ *
+ * @param {IArrayLike<T>} arr The array to modify.
+ * @param {number|undefined} index The index at which to start changing the
+ * array. If not defined, treated as 0.
+ * @param {number} howMany How many elements to remove (0 means no removal. A
+ * value below 0 is treated as zero and so is any other non number. Numbers
+ * are floored).
+ * @param {...T} var_args Optional, additional elements to insert into the
+ * array.
+ * @return {!Array<T>} the removed elements.
+ * @template T
+ */
+goog.array.splice = function(arr, index, howMany, var_args) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.splice.apply(arr, goog.array.slice(arguments, 1));
+};
+
+
+/**
+ * Returns a new array from a segment of an array. This is a generic version of
+ * Array slice. This means that it might work on other objects similar to
+ * arrays, such as the arguments object.
+ *
+ * @param {IArrayLike<T>|string} arr The array from
+ * which to copy a segment.
+ * @param {number} start The index of the first element to copy.
+ * @param {number=} opt_end The index after the last element to copy.
+ * @return {!Array<T>} A new array containing the specified segment of the
+ * original array.
+ * @template T
+ */
+goog.array.slice = function(arr, start, opt_end) {
+ goog.asserts.assert(arr.length != null);
+
+ // passing 1 arg to slice is not the same as passing 2 where the second is
+ // null or undefined (in that case the second argument is treated as 0).
+ // we could use slice on the arguments object and then use apply instead of
+ // testing the length
+ if (arguments.length <= 2) {
+ return Array.prototype.slice.call(arr, start);
+ } else {
+ return Array.prototype.slice.call(arr, start, opt_end);
+ }
+};
+
+
+/**
+ * Removes all duplicates from an array (retaining only the first
+ * occurrence of each array element). This function modifies the
+ * array in place and doesn't change the order of the non-duplicate items.
+ *
+ * For objects, duplicates are identified as having the same unique ID as
+ * defined by {@link goog.getUid}.
+ *
+ * Alternatively you can specify a custom hash function that returns a unique
+ * value for each item in the array it should consider unique.
+ *
+ * Runtime: N,
+ * Worstcase space: 2N (no dupes)
+ *
+ * @param {IArrayLike<T>} arr The array from which to remove
+ * duplicates.
+ * @param {Array=} opt_rv An optional array in which to return the results,
+ * instead of performing the removal inplace. If specified, the original
+ * array will remain unchanged.
+ * @param {function(T):string=} opt_hashFn An optional function to use to
+ * apply to every item in the array. This function should return a unique
+ * value for each item in the array it should consider unique.
+ * @template T
+ */
+goog.array.removeDuplicates = function(arr, opt_rv, opt_hashFn) {
+ var returnArray = opt_rv || arr;
+ var defaultHashFn = function(item) {
+ // Prefix each type with a single character representing the type to
+ // prevent conflicting keys (e.g. true and 'true').
+ return goog.isObject(item) ? 'o' + goog.getUid(item) :
+ (typeof item).charAt(0) + item;
+ };
+ var hashFn = opt_hashFn || defaultHashFn;
+
+ var seen = {}, cursorInsert = 0, cursorRead = 0;
+ while (cursorRead < arr.length) {
+ var current = arr[cursorRead++];
+ var key = hashFn(current);
+ if (!Object.prototype.hasOwnProperty.call(seen, key)) {
+ seen[key] = true;
+ returnArray[cursorInsert++] = current;
+ }
+ }
+ returnArray.length = cursorInsert;
+};
+
+
+/**
+ * Searches the specified array for the specified target using the binary
+ * search algorithm. If no opt_compareFn is specified, elements are compared
+ * using <code>goog.array.defaultCompare</code>, which compares the elements
+ * using the built in < and > operators. This will produce the expected
+ * behavior for homogeneous arrays of String(s) and Number(s). The array
+ * specified <b>must</b> be sorted in ascending order (as defined by the
+ * comparison function). If the array is not sorted, results are undefined.
+ * If the array contains multiple instances of the specified target value, any
+ * of these instances may be found.
+ *
+ * Runtime: O(log n)
+ *
+ * @param {IArrayLike<VALUE>} arr The array to be searched.
+ * @param {TARGET} target The sought value.
+ * @param {function(TARGET, VALUE): number=} opt_compareFn Optional comparison
+ * function by which the array is ordered. Should take 2 arguments to
+ * compare, and return a negative number, zero, or a positive number
+ * depending on whether the first argument is less than, equal to, or
+ * greater than the second.
+ * @return {number} Lowest index of the target value if found, otherwise
+ * (-(insertion point) - 1). The insertion point is where the value should
+ * be inserted into arr to preserve the sorted property. Return value >= 0
+ * iff target is found.
+ * @template TARGET, VALUE
+ */
+goog.array.binarySearch = function(arr, target, opt_compareFn) {
+ return goog.array.binarySearch_(
+ arr, opt_compareFn || goog.array.defaultCompare, false /* isEvaluator */,
+ target);
+};
+
+
+/**
+ * Selects an index in the specified array using the binary search algorithm.
+ * The evaluator receives an element and determines whether the desired index
+ * is before, at, or after it. The evaluator must be consistent (formally,
+ * goog.array.map(goog.array.map(arr, evaluator, opt_obj), goog.math.sign)
+ * must be monotonically non-increasing).
+ *
+ * Runtime: O(log n)
+ *
+ * @param {IArrayLike<VALUE>} arr The array to be searched.
+ * @param {function(this:THIS, VALUE, number, ?): number} evaluator
+ * Evaluator function that receives 3 arguments (the element, the index and
+ * the array). Should return a negative number, zero, or a positive number
+ * depending on whether the desired index is before, at, or after the
+ * element passed to it.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this'
+ * within evaluator.
+ * @return {number} Index of the leftmost element matched by the evaluator, if
+ * such exists; otherwise (-(insertion point) - 1). The insertion point is
+ * the index of the first element for which the evaluator returns negative,
+ * or arr.length if no such element exists. The return value is non-negative
+ * iff a match is found.
+ * @template THIS, VALUE
+ */
+goog.array.binarySelect = function(arr, evaluator, opt_obj) {
+ return goog.array.binarySearch_(
+ arr, evaluator, true /* isEvaluator */, undefined /* opt_target */,
+ opt_obj);
+};
+
+
+/**
+ * Implementation of a binary search algorithm which knows how to use both
+ * comparison functions and evaluators. If an evaluator is provided, will call
+ * the evaluator with the given optional data object, conforming to the
+ * interface defined in binarySelect. Otherwise, if a comparison function is
+ * provided, will call the comparison function against the given data object.
+ *
+ * This implementation purposefully does not use goog.bind or goog.partial for
+ * performance reasons.
+ *
+ * Runtime: O(log n)
+ *
+ * @param {IArrayLike<?>} arr The array to be searched.
+ * @param {function(?, ?, ?): number | function(?, ?): number} compareFn
+ * Either an evaluator or a comparison function, as defined by binarySearch
+ * and binarySelect above.
+ * @param {boolean} isEvaluator Whether the function is an evaluator or a
+ * comparison function.
+ * @param {?=} opt_target If the function is a comparison function, then
+ * this is the target to binary search for.
+ * @param {Object=} opt_selfObj If the function is an evaluator, this is an
+ * optional this object for the evaluator.
+ * @return {number} Lowest index of the target value if found, otherwise
+ * (-(insertion point) - 1). The insertion point is where the value should
+ * be inserted into arr to preserve the sorted property. Return value >= 0
+ * iff target is found.
+ * @private
+ */
+goog.array.binarySearch_ = function(
+ arr, compareFn, isEvaluator, opt_target, opt_selfObj) {
+ var left = 0; // inclusive
+ var right = arr.length; // exclusive
+ var found;
+ while (left < right) {
+ var middle = (left + right) >> 1;
+ var compareResult;
+ if (isEvaluator) {
+ compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr);
+ } else {
+ // NOTE(dimvar): To avoid this cast, we'd have to use function overloading
+ // for the type of binarySearch_, which the type system can't express yet.
+ compareResult = /** @type {function(?, ?): number} */ (compareFn)(
+ opt_target, arr[middle]);
+ }
+ if (compareResult > 0) {
+ left = middle + 1;
+ } else {
+ right = middle;
+ // We are looking for the lowest index so we can't return immediately.
+ found = !compareResult;
+ }
+ }
+ // left is the index if found, or the insertion point otherwise.
+ // ~left is a shorthand for -left - 1.
+ return found ? left : ~left;
+};
+
+
+/**
+ * Sorts the specified array into ascending order. If no opt_compareFn is
+ * specified, elements are compared using
+ * <code>goog.array.defaultCompare</code>, which compares the elements using
+ * the built in < and > operators. This will produce the expected behavior
+ * for homogeneous arrays of String(s) and Number(s), unlike the native sort,
+ * but will give unpredictable results for heterogeneous lists of strings and
+ * numbers with different numbers of digits.
+ *
+ * This sort is not guaranteed to be stable.
+ *
+ * Runtime: Same as <code>Array.prototype.sort</code>
+ *
+ * @param {Array<T>} arr The array to be sorted.
+ * @param {?function(T,T):number=} opt_compareFn Optional comparison
+ * function by which the
+ * array is to be ordered. Should take 2 arguments to compare, and return a
+ * negative number, zero, or a positive number depending on whether the
+ * first argument is less than, equal to, or greater than the second.
+ * @template T
+ */
+goog.array.sort = function(arr, opt_compareFn) {
+ // TODO(arv): Update type annotation since null is not accepted.
+ arr.sort(opt_compareFn || goog.array.defaultCompare);
+};
+
+
+/**
+ * Sorts the specified array into ascending order in a stable way. If no
+ * opt_compareFn is specified, elements are compared using
+ * <code>goog.array.defaultCompare</code>, which compares the elements using
+ * the built in < and > operators. This will produce the expected behavior
+ * for homogeneous arrays of String(s) and Number(s).
+ *
+ * Runtime: Same as <code>Array.prototype.sort</code>, plus an additional
+ * O(n) overhead of copying the array twice.
+ *
+ * @param {Array<T>} arr The array to be sorted.
+ * @param {?function(T, T): number=} opt_compareFn Optional comparison function
+ * by which the array is to be ordered. Should take 2 arguments to compare,
+ * and return a negative number, zero, or a positive number depending on
+ * whether the first argument is less than, equal to, or greater than the
+ * second.
+ * @template T
+ */
+goog.array.stableSort = function(arr, opt_compareFn) {
+ var compArr = new Array(arr.length);
+ for (var i = 0; i < arr.length; i++) {
+ compArr[i] = {index: i, value: arr[i]};
+ }
+ var valueCompareFn = opt_compareFn || goog.array.defaultCompare;
+ function stableCompareFn(obj1, obj2) {
+ return valueCompareFn(obj1.value, obj2.value) || obj1.index - obj2.index;
+ }
+ goog.array.sort(compArr, stableCompareFn);
+ for (var i = 0; i < arr.length; i++) {
+ arr[i] = compArr[i].value;
+ }
+};
+
+
+/**
+ * Sort the specified array into ascending order based on item keys
+ * returned by the specified key function.
+ * If no opt_compareFn is specified, the keys are compared in ascending order
+ * using <code>goog.array.defaultCompare</code>.
+ *
+ * Runtime: O(S(f(n)), where S is runtime of <code>goog.array.sort</code>
+ * and f(n) is runtime of the key function.
+ *
+ * @param {Array<T>} arr The array to be sorted.
+ * @param {function(T): K} keyFn Function taking array element and returning
+ * a key used for sorting this element.
+ * @param {?function(K, K): number=} opt_compareFn Optional comparison function
+ * by which the keys are to be ordered. Should take 2 arguments to compare,
+ * and return a negative number, zero, or a positive number depending on
+ * whether the first argument is less than, equal to, or greater than the
+ * second.
+ * @template T,K
+ */
+goog.array.sortByKey = function(arr, keyFn, opt_compareFn) {
+ var keyCompareFn = opt_compareFn || goog.array.defaultCompare;
+ goog.array.sort(
+ arr, function(a, b) { return keyCompareFn(keyFn(a), keyFn(b)); });
+};
+
+
+/**
+ * Sorts an array of objects by the specified object key and compare
+ * function. If no compare function is provided, the key values are
+ * compared in ascending order using <code>goog.array.defaultCompare</code>.
+ * This won't work for keys that get renamed by the compiler. So use
+ * {'foo': 1, 'bar': 2} rather than {foo: 1, bar: 2}.
+ * @param {Array<Object>} arr An array of objects to sort.
+ * @param {string} key The object key to sort by.
+ * @param {Function=} opt_compareFn The function to use to compare key
+ * values.
+ */
+goog.array.sortObjectsByKey = function(arr, key, opt_compareFn) {
+ goog.array.sortByKey(arr, function(obj) { return obj[key]; }, opt_compareFn);
+};
+
+
+/**
+ * Tells if the array is sorted.
+ * @param {!Array<T>} arr The array.
+ * @param {?function(T,T):number=} opt_compareFn Function to compare the
+ * array elements.
+ * Should take 2 arguments to compare, and return a negative number, zero,
+ * or a positive number depending on whether the first argument is less
+ * than, equal to, or greater than the second.
+ * @param {boolean=} opt_strict If true no equal elements are allowed.
+ * @return {boolean} Whether the array is sorted.
+ * @template T
+ */
+goog.array.isSorted = function(arr, opt_compareFn, opt_strict) {
+ var compare = opt_compareFn || goog.array.defaultCompare;
+ for (var i = 1; i < arr.length; i++) {
+ var compareResult = compare(arr[i - 1], arr[i]);
+ if (compareResult > 0 || compareResult == 0 && opt_strict) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * Compares two arrays for equality. Two arrays are considered equal if they
+ * have the same length and their corresponding elements are equal according to
+ * the comparison function.
+ *
+ * @param {IArrayLike<?>} arr1 The first array to compare.
+ * @param {IArrayLike<?>} arr2 The second array to compare.
+ * @param {Function=} opt_equalsFn Optional comparison function.
+ * Should take 2 arguments to compare, and return true if the arguments
+ * are equal. Defaults to {@link goog.array.defaultCompareEquality} which
+ * compares the elements using the built-in '===' operator.
+ * @return {boolean} Whether the two arrays are equal.
+ */
+goog.array.equals = function(arr1, arr2, opt_equalsFn) {
+ if (!goog.isArrayLike(arr1) || !goog.isArrayLike(arr2) ||
+ arr1.length != arr2.length) {
+ return false;
+ }
+ var l = arr1.length;
+ var equalsFn = opt_equalsFn || goog.array.defaultCompareEquality;
+ for (var i = 0; i < l; i++) {
+ if (!equalsFn(arr1[i], arr2[i])) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * 3-way array compare function.
+ * @param {!IArrayLike<VALUE>} arr1 The first array to
+ * compare.
+ * @param {!IArrayLike<VALUE>} arr2 The second array to
+ * compare.
+ * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison
+ * function by which the array is to be ordered. Should take 2 arguments to
+ * compare, and return a negative number, zero, or a positive number
+ * depending on whether the first argument is less than, equal to, or
+ * greater than the second.
+ * @return {number} Negative number, zero, or a positive number depending on
+ * whether the first argument is less than, equal to, or greater than the
+ * second.
+ * @template VALUE
+ */
+goog.array.compare3 = function(arr1, arr2, opt_compareFn) {
+ var compare = opt_compareFn || goog.array.defaultCompare;
+ var l = Math.min(arr1.length, arr2.length);
+ for (var i = 0; i < l; i++) {
+ var result = compare(arr1[i], arr2[i]);
+ if (result != 0) {
+ return result;
+ }
+ }
+ return goog.array.defaultCompare(arr1.length, arr2.length);
+};
+
+
+/**
+ * Compares its two arguments for order, using the built in < and >
+ * operators.
+ * @param {VALUE} a The first object to be compared.
+ * @param {VALUE} b The second object to be compared.
+ * @return {number} A negative number, zero, or a positive number as the first
+ * argument is less than, equal to, or greater than the second,
+ * respectively.
+ * @template VALUE
+ */
+goog.array.defaultCompare = function(a, b) {
+ return a > b ? 1 : a < b ? -1 : 0;
+};
+
+
+/**
+ * Compares its two arguments for inverse order, using the built in < and >
+ * operators.
+ * @param {VALUE} a The first object to be compared.
+ * @param {VALUE} b The second object to be compared.
+ * @return {number} A negative number, zero, or a positive number as the first
+ * argument is greater than, equal to, or less than the second,
+ * respectively.
+ * @template VALUE
+ */
+goog.array.inverseDefaultCompare = function(a, b) {
+ return -goog.array.defaultCompare(a, b);
+};
+
+
+/**
+ * Compares its two arguments for equality, using the built in === operator.
+ * @param {*} a The first object to compare.
+ * @param {*} b The second object to compare.
+ * @return {boolean} True if the two arguments are equal, false otherwise.
+ */
+goog.array.defaultCompareEquality = function(a, b) {
+ return a === b;
+};
+
+
+/**
+ * Inserts a value into a sorted array. The array is not modified if the
+ * value is already present.
+ * @param {IArrayLike<VALUE>} array The array to modify.
+ * @param {VALUE} value The object to insert.
+ * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison
+ * function by which the array is ordered. Should take 2 arguments to
+ * compare, and return a negative number, zero, or a positive number
+ * depending on whether the first argument is less than, equal to, or
+ * greater than the second.
+ * @return {boolean} True if an element was inserted.
+ * @template VALUE
+ */
+goog.array.binaryInsert = function(array, value, opt_compareFn) {
+ var index = goog.array.binarySearch(array, value, opt_compareFn);
+ if (index < 0) {
+ goog.array.insertAt(array, value, -(index + 1));
+ return true;
+ }
+ return false;
+};
+
+
+/**
+ * Removes a value from a sorted array.
+ * @param {!IArrayLike<VALUE>} array The array to modify.
+ * @param {VALUE} value The object to remove.
+ * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison
+ * function by which the array is ordered. Should take 2 arguments to
+ * compare, and return a negative number, zero, or a positive number
+ * depending on whether the first argument is less than, equal to, or
+ * greater than the second.
+ * @return {boolean} True if an element was removed.
+ * @template VALUE
+ */
+goog.array.binaryRemove = function(array, value, opt_compareFn) {
+ var index = goog.array.binarySearch(array, value, opt_compareFn);
+ return (index >= 0) ? goog.array.removeAt(array, index) : false;
+};
+
+
+/**
+ * Splits an array into disjoint buckets according to a splitting function.
+ * @param {Array<T>} array The array.
+ * @param {function(this:S, T,number,Array<T>):?} sorter Function to call for
+ * every element. This takes 3 arguments (the element, the index and the
+ * array) and must return a valid object key (a string, number, etc), or
+ * undefined, if that object should not be placed in a bucket.
+ * @param {S=} opt_obj The object to be used as the value of 'this' within
+ * sorter.
+ * @return {!Object} An object, with keys being all of the unique return values
+ * of sorter, and values being arrays containing the items for
+ * which the splitter returned that key.
+ * @template T,S
+ */
+goog.array.bucket = function(array, sorter, opt_obj) {
+ var buckets = {};
+
+ for (var i = 0; i < array.length; i++) {
+ var value = array[i];
+ var key = sorter.call(/** @type {?} */ (opt_obj), value, i, array);
+ if (goog.isDef(key)) {
+ // Push the value to the right bucket, creating it if necessary.
+ var bucket = buckets[key] || (buckets[key] = []);
+ bucket.push(value);
+ }
+ }
+
+ return buckets;
+};
+
+
+/**
+ * Creates a new object built from the provided array and the key-generation
+ * function.
+ * @param {IArrayLike<T>} arr Array or array like object over
+ * which to iterate whose elements will be the values in the new object.
+ * @param {?function(this:S, T, number, ?) : string} keyFunc The function to
+ * call for every element. This function takes 3 arguments (the element, the
+ * index and the array) and should return a string that will be used as the
+ * key for the element in the new object. If the function returns the same
+ * key for more than one element, the value for that key is
+ * implementation-defined.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within keyFunc.
+ * @return {!Object<T>} The new object.
+ * @template T,S
+ */
+goog.array.toObject = function(arr, keyFunc, opt_obj) {
+ var ret = {};
+ goog.array.forEach(arr, function(element, index) {
+ ret[keyFunc.call(/** @type {?} */ (opt_obj), element, index, arr)] =
+ element;
+ });
+ return ret;
+};
+
+
+/**
+ * Creates a range of numbers in an arithmetic progression.
+ *
+ * Range takes 1, 2, or 3 arguments:
+ * <pre>
+ * range(5) is the same as range(0, 5, 1) and produces [0, 1, 2, 3, 4]
+ * range(2, 5) is the same as range(2, 5, 1) and produces [2, 3, 4]
+ * range(-2, -5, -1) produces [-2, -3, -4]
+ * range(-2, -5, 1) produces [], since stepping by 1 wouldn't ever reach -5.
+ * </pre>
+ *
+ * @param {number} startOrEnd The starting value of the range if an end argument
+ * is provided. Otherwise, the start value is 0, and this is the end value.
+ * @param {number=} opt_end The optional end value of the range.
+ * @param {number=} opt_step The step size between range values. Defaults to 1
+ * if opt_step is undefined or 0.
+ * @return {!Array<number>} An array of numbers for the requested range. May be
+ * an empty array if adding the step would not converge toward the end
+ * value.
+ */
+goog.array.range = function(startOrEnd, opt_end, opt_step) {
+ var array = [];
+ var start = 0;
+ var end = startOrEnd;
+ var step = opt_step || 1;
+ if (opt_end !== undefined) {
+ start = startOrEnd;
+ end = opt_end;
+ }
+
+ if (step * (end - start) < 0) {
+ // Sign mismatch: start + step will never reach the end value.
+ return [];
+ }
+
+ if (step > 0) {
+ for (var i = start; i < end; i += step) {
+ array.push(i);
+ }
+ } else {
+ for (var i = start; i > end; i += step) {
+ array.push(i);
+ }
+ }
+ return array;
+};
+
+
+/**
+ * Returns an array consisting of the given value repeated N times.
+ *
+ * @param {VALUE} value The value to repeat.
+ * @param {number} n The repeat count.
+ * @return {!Array<VALUE>} An array with the repeated value.
+ * @template VALUE
+ */
+goog.array.repeat = function(value, n) {
+ var array = [];
+ for (var i = 0; i < n; i++) {
+ array[i] = value;
+ }
+ return array;
+};
+
+
+/**
+ * Returns an array consisting of every argument with all arrays
+ * expanded in-place recursively.
+ *
+ * @param {...*} var_args The values to flatten.
+ * @return {!Array<?>} An array containing the flattened values.
+ */
+goog.array.flatten = function(var_args) {
+ var CHUNK_SIZE = 8192;
+
+ var result = [];
+ for (var i = 0; i < arguments.length; i++) {
+ var element = arguments[i];
+ if (goog.isArray(element)) {
+ for (var c = 0; c < element.length; c += CHUNK_SIZE) {
+ var chunk = goog.array.slice(element, c, c + CHUNK_SIZE);
+ var recurseResult = goog.array.flatten.apply(null, chunk);
+ for (var r = 0; r < recurseResult.length; r++) {
+ result.push(recurseResult[r]);
+ }
+ }
+ } else {
+ result.push(element);
+ }
+ }
+ return result;
+};
+
+
+/**
+ * Rotates an array in-place. After calling this method, the element at
+ * index i will be the element previously at index (i - n) %
+ * array.length, for all values of i between 0 and array.length - 1,
+ * inclusive.
+ *
+ * For example, suppose list comprises [t, a, n, k, s]. After invoking
+ * rotate(array, 1) (or rotate(array, -4)), array will comprise [s, t, a, n, k].
+ *
+ * @param {!Array<T>} array The array to rotate.
+ * @param {number} n The amount to rotate.
+ * @return {!Array<T>} The array.
+ * @template T
+ */
+goog.array.rotate = function(array, n) {
+ goog.asserts.assert(array.length != null);
+
+ if (array.length) {
+ n %= array.length;
+ if (n > 0) {
+ Array.prototype.unshift.apply(array, array.splice(-n, n));
+ } else if (n < 0) {
+ Array.prototype.push.apply(array, array.splice(0, -n));
+ }
+ }
+ return array;
+};
+
+
+/**
+ * Moves one item of an array to a new position keeping the order of the rest
+ * of the items. Example use case: keeping a list of JavaScript objects
+ * synchronized with the corresponding list of DOM elements after one of the
+ * elements has been dragged to a new position.
+ * @param {!IArrayLike<?>} arr The array to modify.
+ * @param {number} fromIndex Index of the item to move between 0 and
+ * {@code arr.length - 1}.
+ * @param {number} toIndex Target index between 0 and {@code arr.length - 1}.
+ */
+goog.array.moveItem = function(arr, fromIndex, toIndex) {
+ goog.asserts.assert(fromIndex >= 0 && fromIndex < arr.length);
+ goog.asserts.assert(toIndex >= 0 && toIndex < arr.length);
+ // Remove 1 item at fromIndex.
+ var removedItems = Array.prototype.splice.call(arr, fromIndex, 1);
+ // Insert the removed item at toIndex.
+ Array.prototype.splice.call(arr, toIndex, 0, removedItems[0]);
+ // We don't use goog.array.insertAt and goog.array.removeAt, because they're
+ // significantly slower than splice.
+};
+
+
+/**
+ * Creates a new array for which the element at position i is an array of the
+ * ith element of the provided arrays. The returned array will only be as long
+ * as the shortest array provided; additional values are ignored. For example,
+ * the result of zipping [1, 2] and [3, 4, 5] is [[1,3], [2, 4]].
+ *
+ * This is similar to the zip() function in Python. See {@link
+ * http://docs.python.org/library/functions.html#zip}
+ *
+ * @param {...!IArrayLike<?>} var_args Arrays to be combined.
+ * @return {!Array<!Array<?>>} A new array of arrays created from
+ * provided arrays.
+ */
+goog.array.zip = function(var_args) {
+ if (!arguments.length) {
+ return [];
+ }
+ var result = [];
+ var minLen = arguments[0].length;
+ for (var i = 1; i < arguments.length; i++) {
+ if (arguments[i].length < minLen) {
+ minLen = arguments[i].length;
+ }
+ }
+ for (var i = 0; i < minLen; i++) {
+ var value = [];
+ for (var j = 0; j < arguments.length; j++) {
+ value.push(arguments[j][i]);
+ }
+ result.push(value);
+ }
+ return result;
+};
+
+
+/**
+ * Shuffles the values in the specified array using the Fisher-Yates in-place
+ * shuffle (also known as the Knuth Shuffle). By default, calls Math.random()
+ * and so resets the state of that random number generator. Similarly, may reset
+ * the state of the any other specified random number generator.
+ *
+ * Runtime: O(n)
+ *
+ * @param {!Array<?>} arr The array to be shuffled.
+ * @param {function():number=} opt_randFn Optional random function to use for
+ * shuffling.
+ * Takes no arguments, and returns a random number on the interval [0, 1).
+ * Defaults to Math.random() using JavaScript's built-in Math library.
+ */
+goog.array.shuffle = function(arr, opt_randFn) {
+ var randFn = opt_randFn || Math.random;
+
+ for (var i = arr.length - 1; i > 0; i--) {
+ // Choose a random array index in [0, i] (inclusive with i).
+ var j = Math.floor(randFn() * (i + 1));
+
+ var tmp = arr[i];
+ arr[i] = arr[j];
+ arr[j] = tmp;
+ }
+};
+
+
+/**
+ * Returns a new array of elements from arr, based on the indexes of elements
+ * provided by index_arr. For example, the result of index copying
+ * ['a', 'b', 'c'] with index_arr [1,0,0,2] is ['b', 'a', 'a', 'c'].
+ *
+ * @param {!Array<T>} arr The array to get a indexed copy from.
+ * @param {!Array<number>} index_arr An array of indexes to get from arr.
+ * @return {!Array<T>} A new array of elements from arr in index_arr order.
+ * @template T
+ */
+goog.array.copyByIndex = function(arr, index_arr) {
+ var result = [];
+ goog.array.forEach(index_arr, function(index) { result.push(arr[index]); });
+ return result;
+};
+
+
+/**
+ * Maps each element of the input array into zero or more elements of the output
+ * array.
+ *
+ * @param {!IArrayLike<VALUE>|string} arr Array or array like object
+ * over which to iterate.
+ * @param {function(this:THIS, VALUE, number, ?): !Array<RESULT>} f The function
+ * to call for every element. This function takes 3 arguments (the element,
+ * the index and the array) and should return an array. The result will be
+ * used to extend a new array.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within f.
+ * @return {!Array<RESULT>} a new array with the concatenation of all arrays
+ * returned from f.
+ * @template THIS, VALUE, RESULT
+ */
+goog.array.concatMap = function(arr, f, opt_obj) {
+ return goog.array.concat.apply([], goog.array.map(arr, f, opt_obj));
+};
diff --git a/src/http/static/viz/1/goog/asserts/asserts.js b/src/http/static/viz/1/goog/asserts/asserts.js
new file mode 100644
index 0000000..1f4b653
--- /dev/null
+++ b/src/http/static/viz/1/goog/asserts/asserts.js
@@ -0,0 +1,369 @@
+// Copyright 2008 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities to check the preconditions, postconditions and
+ * invariants runtime.
+ *
+ * Methods in this package should be given special treatment by the compiler
+ * for type-inference. For example, <code>goog.asserts.assert(foo)</code>
+ * will restrict <code>foo</code> to a truthy value.
+ *
+ * The compiler has an option to disable asserts. So code like:
+ * <code>
+ * var x = goog.asserts.assert(foo()); goog.asserts.assert(bar());
+ * </code>
+ * will be transformed into:
+ * <code>
+ * var x = foo();
+ * </code>
+ * The compiler will leave in foo() (because its return value is used),
+ * but it will remove bar() because it assumes it does not have side-effects.
+ *
+ * @author agrieve@google.com (Andrew Grieve)
+ */
+
+goog.provide('goog.asserts');
+goog.provide('goog.asserts.AssertionError');
+
+goog.require('goog.debug.Error');
+goog.require('goog.dom.NodeType');
+goog.require('goog.string');
+
+
+/**
+ * @define {boolean} Whether to strip out asserts or to leave them in.
+ */
+goog.define('goog.asserts.ENABLE_ASSERTS', goog.DEBUG);
+
+
+
+/**
+ * Error object for failed assertions.
+ * @param {string} messagePattern The pattern that was used to form message.
+ * @param {!Array<*>} messageArgs The items to substitute into the pattern.
+ * @constructor
+ * @extends {goog.debug.Error}
+ * @final
+ */
+goog.asserts.AssertionError = function(messagePattern, messageArgs) {
+ messageArgs.unshift(messagePattern);
+ goog.debug.Error.call(this, goog.string.subs.apply(null, messageArgs));
+ // Remove the messagePattern afterwards to avoid permanently modifying the
+ // passed in array.
+ messageArgs.shift();
+
+ /**
+ * The message pattern used to format the error message. Error handlers can
+ * use this to uniquely identify the assertion.
+ * @type {string}
+ */
+ this.messagePattern = messagePattern;
+};
+goog.inherits(goog.asserts.AssertionError, goog.debug.Error);
+
+
+/** @override */
+goog.asserts.AssertionError.prototype.name = 'AssertionError';
+
+
+/**
+ * The default error handler.
+ * @param {!goog.asserts.AssertionError} e The exception to be handled.
+ */
+goog.asserts.DEFAULT_ERROR_HANDLER = function(e) {
+ throw e;
+};
+
+
+/**
+ * The handler responsible for throwing or logging assertion errors.
+ * @private {function(!goog.asserts.AssertionError)}
+ */
+goog.asserts.errorHandler_ = goog.asserts.DEFAULT_ERROR_HANDLER;
+
+
+/**
+ * Throws an exception with the given message and "Assertion failed" prefixed
+ * onto it.
+ * @param {string} defaultMessage The message to use if givenMessage is empty.
+ * @param {Array<*>} defaultArgs The substitution arguments for defaultMessage.
+ * @param {string|undefined} givenMessage Message supplied by the caller.
+ * @param {Array<*>} givenArgs The substitution arguments for givenMessage.
+ * @throws {goog.asserts.AssertionError} When the value is not a number.
+ * @private
+ */
+goog.asserts.doAssertFailure_ = function(
+ defaultMessage, defaultArgs, givenMessage, givenArgs) {
+ var message = 'Assertion failed';
+ if (givenMessage) {
+ message += ': ' + givenMessage;
+ var args = givenArgs;
+ } else if (defaultMessage) {
+ message += ': ' + defaultMessage;
+ args = defaultArgs;
+ }
+ // The '' + works around an Opera 10 bug in the unit tests. Without it,
+ // a stack trace is added to var message above. With this, a stack trace is
+ // not added until this line (it causes the extra garbage to be added after
+ // the assertion message instead of in the middle of it).
+ var e = new goog.asserts.AssertionError('' + message, args || []);
+ goog.asserts.errorHandler_(e);
+};
+
+
+/**
+ * Sets a custom error handler that can be used to customize the behavior of
+ * assertion failures, for example by turning all assertion failures into log
+ * messages.
+ * @param {function(!goog.asserts.AssertionError)} errorHandler
+ */
+goog.asserts.setErrorHandler = function(errorHandler) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ goog.asserts.errorHandler_ = errorHandler;
+ }
+};
+
+
+/**
+ * Checks if the condition evaluates to true if goog.asserts.ENABLE_ASSERTS is
+ * true.
+ * @template T
+ * @param {T} condition The condition to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {T} The value of the condition.
+ * @throws {goog.asserts.AssertionError} When the condition evaluates to false.
+ */
+goog.asserts.assert = function(condition, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !condition) {
+ goog.asserts.doAssertFailure_(
+ '', null, opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return condition;
+};
+
+
+/**
+ * Fails if goog.asserts.ENABLE_ASSERTS is true. This function is useful in case
+ * when we want to add a check in the unreachable area like switch-case
+ * statement:
+ *
+ * <pre>
+ * switch(type) {
+ * case FOO: doSomething(); break;
+ * case BAR: doSomethingElse(); break;
+ * default: goog.asserts.fail('Unrecognized type: ' + type);
+ * // We have only 2 types - "default:" section is unreachable code.
+ * }
+ * </pre>
+ *
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @throws {goog.asserts.AssertionError} Failure.
+ */
+goog.asserts.fail = function(opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ goog.asserts.errorHandler_(
+ new goog.asserts.AssertionError(
+ 'Failure' + (opt_message ? ': ' + opt_message : ''),
+ Array.prototype.slice.call(arguments, 1)));
+ }
+};
+
+
+/**
+ * Checks if the value is a number if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {number} The value, guaranteed to be a number when asserts enabled.
+ * @throws {goog.asserts.AssertionError} When the value is not a number.
+ */
+goog.asserts.assertNumber = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isNumber(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected number but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {number} */ (value);
+};
+
+
+/**
+ * Checks if the value is a string if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {string} The value, guaranteed to be a string when asserts enabled.
+ * @throws {goog.asserts.AssertionError} When the value is not a string.
+ */
+goog.asserts.assertString = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isString(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected string but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {string} */ (value);
+};
+
+
+/**
+ * Checks if the value is a function if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {!Function} The value, guaranteed to be a function when asserts
+ * enabled.
+ * @throws {goog.asserts.AssertionError} When the value is not a function.
+ */
+goog.asserts.assertFunction = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isFunction(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected function but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {!Function} */ (value);
+};
+
+
+/**
+ * Checks if the value is an Object if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {!Object} The value, guaranteed to be a non-null object.
+ * @throws {goog.asserts.AssertionError} When the value is not an object.
+ */
+goog.asserts.assertObject = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isObject(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected object but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {!Object} */ (value);
+};
+
+
+/**
+ * Checks if the value is an Array if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {!Array<?>} The value, guaranteed to be a non-null array.
+ * @throws {goog.asserts.AssertionError} When the value is not an array.
+ */
+goog.asserts.assertArray = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isArray(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected array but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {!Array<?>} */ (value);
+};
+
+
+/**
+ * Checks if the value is a boolean if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {boolean} The value, guaranteed to be a boolean when asserts are
+ * enabled.
+ * @throws {goog.asserts.AssertionError} When the value is not a boolean.
+ */
+goog.asserts.assertBoolean = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isBoolean(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected boolean but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {boolean} */ (value);
+};
+
+
+/**
+ * Checks if the value is a DOM Element if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {!Element} The value, likely to be a DOM Element when asserts are
+ * enabled.
+ * @throws {goog.asserts.AssertionError} When the value is not an Element.
+ */
+goog.asserts.assertElement = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS &&
+ (!goog.isObject(value) || value.nodeType != goog.dom.NodeType.ELEMENT)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected Element but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {!Element} */ (value);
+};
+
+
+/**
+ * Checks if the value is an instance of the user-defined type if
+ * goog.asserts.ENABLE_ASSERTS is true.
+ *
+ * The compiler may tighten the type returned by this function.
+ *
+ * @param {?} value The value to check.
+ * @param {function(new: T, ...)} type A user-defined constructor.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @throws {goog.asserts.AssertionError} When the value is not an instance of
+ * type.
+ * @return {T}
+ * @template T
+ */
+goog.asserts.assertInstanceof = function(value, type, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !(value instanceof type)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected instanceof %s but got %s.',
+ [goog.asserts.getType_(type), goog.asserts.getType_(value)],
+ opt_message, Array.prototype.slice.call(arguments, 3));
+ }
+ return value;
+};
+
+
+/**
+ * Checks that no enumerable keys are present in Object.prototype. Such keys
+ * would break most code that use {@code for (var ... in ...)} loops.
+ */
+goog.asserts.assertObjectPrototypeIsIntact = function() {
+ for (var key in Object.prototype) {
+ goog.asserts.fail(key + ' should not be enumerable in Object.prototype.');
+ }
+};
+
+
+/**
+ * Returns the type of a value. If a constructor is passed, and a suitable
+ * string cannot be found, 'unknown type name' will be returned.
+ * @param {*} value A constructor, object, or primitive.
+ * @return {string} The best display name for the value, or 'unknown type name'.
+ * @private
+ */
+goog.asserts.getType_ = function(value) {
+ if (value instanceof Function) {
+ return value.displayName || value.name || 'unknown type name';
+ } else if (value instanceof Object) {
+ return value.constructor.displayName || value.constructor.name ||
+ Object.prototype.toString.call(value);
+ } else {
+ return value === null ? 'null' : typeof value;
+ }
+};
diff --git a/src/http/static/viz/1/goog/base.js b/src/http/static/viz/1/goog/base.js
new file mode 100644
index 0000000..97a9947
--- /dev/null
+++ b/src/http/static/viz/1/goog/base.js
@@ -0,0 +1,2727 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Bootstrap for the Google JS Library (Closure).
+ *
+ * In uncompiled mode base.js will write out Closure's deps file, unless the
+ * global <code>CLOSURE_NO_DEPS</code> is set to true. This allows projects to
+ * include their own deps file(s) from different locations.
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ *
+ * @provideGoog
+ */
+
+
+/**
+ * @define {boolean} Overridden to true by the compiler when
+ * --process_closure_primitives is specified.
+ */
+var COMPILED = false;
+
+
+/**
+ * Base namespace for the Closure library. Checks to see goog is already
+ * defined in the current scope before assigning to prevent clobbering if
+ * base.js is loaded more than once.
+ *
+ * @const
+ */
+var goog = goog || {};
+
+
+/**
+ * Reference to the global context. In most cases this will be 'window'.
+ */
+goog.global = this;
+
+
+/**
+ * A hook for overriding the define values in uncompiled mode.
+ *
+ * In uncompiled mode, {@code CLOSURE_UNCOMPILED_DEFINES} may be defined before
+ * loading base.js. If a key is defined in {@code CLOSURE_UNCOMPILED_DEFINES},
+ * {@code goog.define} will use the value instead of the default value. This
+ * allows flags to be overwritten without compilation (this is normally
+ * accomplished with the compiler's "define" flag).
+ *
+ * Example:
+ * <pre>
+ * var CLOSURE_UNCOMPILED_DEFINES = {'goog.DEBUG': false};
+ * </pre>
+ *
+ * @type {Object<string, (string|number|boolean)>|undefined}
+ */
+goog.global.CLOSURE_UNCOMPILED_DEFINES;
+
+
+/**
+ * A hook for overriding the define values in uncompiled or compiled mode,
+ * like CLOSURE_UNCOMPILED_DEFINES but effective in compiled code. In
+ * uncompiled code CLOSURE_UNCOMPILED_DEFINES takes precedence.
+ *
+ * Also unlike CLOSURE_UNCOMPILED_DEFINES the values must be number, boolean or
+ * string literals or the compiler will emit an error.
+ *
+ * While any @define value may be set, only those set with goog.define will be
+ * effective for uncompiled code.
+ *
+ * Example:
+ * <pre>
+ * var CLOSURE_DEFINES = {'goog.DEBUG': false} ;
+ * </pre>
+ *
+ * @type {Object<string, (string|number|boolean)>|undefined}
+ */
+goog.global.CLOSURE_DEFINES;
+
+
+/**
+ * Returns true if the specified value is not undefined.
+ * WARNING: Do not use this to test if an object has a property. Use the in
+ * operator instead.
+ *
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is defined.
+ */
+goog.isDef = function(val) {
+ // void 0 always evaluates to undefined and hence we do not need to depend on
+ // the definition of the global variable named 'undefined'.
+ return val !== void 0;
+};
+
+
+/**
+ * Builds an object structure for the provided namespace path, ensuring that
+ * names that already exist are not overwritten. For example:
+ * "a.b.c" -> a = {};a.b={};a.b.c={};
+ * Used by goog.provide and goog.exportSymbol.
+ * @param {string} name name of the object that this file defines.
+ * @param {*=} opt_object the object to expose at the end of the path.
+ * @param {Object=} opt_objectToExportTo The object to add the path to; default
+ * is |goog.global|.
+ * @private
+ */
+goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) {
+ var parts = name.split('.');
+ var cur = opt_objectToExportTo || goog.global;
+
+ // Internet Explorer exhibits strange behavior when throwing errors from
+ // methods externed in this manner. See the testExportSymbolExceptions in
+ // base_test.html for an example.
+ if (!(parts[0] in cur) && cur.execScript) {
+ cur.execScript('var ' + parts[0]);
+ }
+
+ // Certain browsers cannot parse code in the form for((a in b); c;);
+ // This pattern is produced by the JSCompiler when it collapses the
+ // statement above into the conditional loop below. To prevent this from
+ // happening, use a for-loop and reserve the init logic as below.
+
+ // Parentheses added to eliminate strict JS warning in Firefox.
+ for (var part; parts.length && (part = parts.shift());) {
+ if (!parts.length && goog.isDef(opt_object)) {
+ // last part and we have an object; use it
+ cur[part] = opt_object;
+ } else if (cur[part]) {
+ cur = cur[part];
+ } else {
+ cur = cur[part] = {};
+ }
+ }
+};
+
+
+/**
+ * Defines a named value. In uncompiled mode, the value is retrieved from
+ * CLOSURE_DEFINES or CLOSURE_UNCOMPILED_DEFINES if the object is defined and
+ * has the property specified, and otherwise used the defined defaultValue.
+ * When compiled the default can be overridden using the compiler
+ * options or the value set in the CLOSURE_DEFINES object.
+ *
+ * @param {string} name The distinguished name to provide.
+ * @param {string|number|boolean} defaultValue
+ */
+goog.define = function(name, defaultValue) {
+ var value = defaultValue;
+ if (!COMPILED) {
+ if (goog.global.CLOSURE_UNCOMPILED_DEFINES &&
+ Object.prototype.hasOwnProperty.call(
+ goog.global.CLOSURE_UNCOMPILED_DEFINES, name)) {
+ value = goog.global.CLOSURE_UNCOMPILED_DEFINES[name];
+ } else if (
+ goog.global.CLOSURE_DEFINES &&
+ Object.prototype.hasOwnProperty.call(
+ goog.global.CLOSURE_DEFINES, name)) {
+ value = goog.global.CLOSURE_DEFINES[name];
+ }
+ }
+ goog.exportPath_(name, value);
+};
+
+
+/**
+ * @define {boolean} DEBUG is provided as a convenience so that debugging code
+ * that should not be included in a production js_binary can be easily stripped
+ * by specifying --define goog.DEBUG=false to the JSCompiler. For example, most
+ * toString() methods should be declared inside an "if (goog.DEBUG)" conditional
+ * because they are generally used for debugging purposes and it is difficult
+ * for the JSCompiler to statically determine whether they are used.
+ */
+goog.define('goog.DEBUG', true);
+
+
+/**
+ * @define {string} LOCALE defines the locale being used for compilation. It is
+ * used to select locale specific data to be compiled in js binary. BUILD rule
+ * can specify this value by "--define goog.LOCALE=<locale_name>" as JSCompiler
+ * option.
+ *
+ * Take into account that the locale code format is important. You should use
+ * the canonical Unicode format with hyphen as a delimiter. Language must be
+ * lowercase, Language Script - Capitalized, Region - UPPERCASE.
+ * There are few examples: pt-BR, en, en-US, sr-Latin-BO, zh-Hans-CN.
+ *
+ * See more info about locale codes here:
+ * http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers
+ *
+ * For language codes you should use values defined by ISO 693-1. See it here
+ * http://www.w3.org/WAI/ER/IG/ert/iso639.htm. There is only one exception from
+ * this rule: the Hebrew language. For legacy reasons the old code (iw) should
+ * be used instead of the new code (he), see http://wiki/Main/IIISynonyms.
+ */
+goog.define('goog.LOCALE', 'en'); // default to en
+
+
+/**
+ * @define {boolean} Whether this code is running on trusted sites.
+ *
+ * On untrusted sites, several native functions can be defined or overridden by
+ * external libraries like Prototype, Datejs, and JQuery and setting this flag
+ * to false forces closure to use its own implementations when possible.
+ *
+ * If your JavaScript can be loaded by a third party site and you are wary about
+ * relying on non-standard implementations, specify
+ * "--define goog.TRUSTED_SITE=false" to the JSCompiler.
+ */
+goog.define('goog.TRUSTED_SITE', true);
+
+
+/**
+ * @define {boolean} Whether a project is expected to be running in strict mode.
+ *
+ * This define can be used to trigger alternate implementations compatible with
+ * running in EcmaScript Strict mode or warn about unavailable functionality.
+ * @see https://goo.gl/PudQ4y
+ *
+ */
+goog.define('goog.STRICT_MODE_COMPATIBLE', false);
+
+
+/**
+ * @define {boolean} Whether code that calls {@link goog.setTestOnly} should
+ * be disallowed in the compilation unit.
+ */
+goog.define('goog.DISALLOW_TEST_ONLY_CODE', COMPILED && !goog.DEBUG);
+
+
+/**
+ * @define {boolean} Whether to use a Chrome app CSP-compliant method for
+ * loading scripts via goog.require. @see appendScriptSrcNode_.
+ */
+goog.define('goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING', false);
+
+
+/**
+ * Defines a namespace in Closure.
+ *
+ * A namespace may only be defined once in a codebase. It may be defined using
+ * goog.provide() or goog.module().
+ *
+ * The presence of one or more goog.provide() calls in a file indicates
+ * that the file defines the given objects/namespaces.
+ * Provided symbols must not be null or undefined.
+ *
+ * In addition, goog.provide() creates the object stubs for a namespace
+ * (for example, goog.provide("goog.foo.bar") will create the object
+ * goog.foo.bar if it does not already exist).
+ *
+ * Build tools also scan for provide/require/module statements
+ * to discern dependencies, build dependency files (see deps.js), etc.
+ *
+ * @see goog.require
+ * @see goog.module
+ * @param {string} name Namespace provided by this file in the form
+ * "goog.package.part".
+ */
+goog.provide = function(name) {
+ if (goog.isInModuleLoader_()) {
+ throw Error('goog.provide can not be used within a goog.module.');
+ }
+ if (!COMPILED) {
+ // Ensure that the same namespace isn't provided twice.
+ // A goog.module/goog.provide maps a goog.require to a specific file
+ if (goog.isProvided_(name)) {
+ throw Error('Namespace "' + name + '" already declared.');
+ }
+ }
+
+ goog.constructNamespace_(name);
+};
+
+
+/**
+ * @param {string} name Namespace provided by this file in the form
+ * "goog.package.part".
+ * @param {Object=} opt_obj The object to embed in the namespace.
+ * @private
+ */
+goog.constructNamespace_ = function(name, opt_obj) {
+ if (!COMPILED) {
+ delete goog.implicitNamespaces_[name];
+
+ var namespace = name;
+ while ((namespace = namespace.substring(0, namespace.lastIndexOf('.')))) {
+ if (goog.getObjectByName(namespace)) {
+ break;
+ }
+ goog.implicitNamespaces_[namespace] = true;
+ }
+ }
+
+ goog.exportPath_(name, opt_obj);
+};
+
+
+/**
+ * Module identifier validation regexp.
+ * Note: This is a conservative check, it is very possible to be more lenient,
+ * the primary exclusion here is "/" and "\" and a leading ".", these
+ * restrictions are intended to leave the door open for using goog.require
+ * with relative file paths rather than module identifiers.
+ * @private
+ */
+goog.VALID_MODULE_RE_ = /^[a-zA-Z_$][a-zA-Z0-9._$]*$/;
+
+
+/**
+ * Defines a module in Closure.
+ *
+ * Marks that this file must be loaded as a module and claims the namespace.
+ *
+ * A namespace may only be defined once in a codebase. It may be defined using
+ * goog.provide() or goog.module().
+ *
+ * goog.module() has three requirements:
+ * - goog.module may not be used in the same file as goog.provide.
+ * - goog.module must be the first statement in the file.
+ * - only one goog.module is allowed per file.
+ *
+ * When a goog.module annotated file is loaded, it is enclosed in
+ * a strict function closure. This means that:
+ * - any variables declared in a goog.module file are private to the file
+ * (not global), though the compiler is expected to inline the module.
+ * - The code must obey all the rules of "strict" JavaScript.
+ * - the file will be marked as "use strict"
+ *
+ * NOTE: unlike goog.provide, goog.module does not declare any symbols by
+ * itself. If declared symbols are desired, use
+ * goog.module.declareLegacyNamespace().
+ *
+ *
+ * See the public goog.module proposal: http://goo.gl/Va1hin
+ *
+ * @param {string} name Namespace provided by this file in the form
+ * "goog.package.part", is expected but not required.
+ */
+goog.module = function(name) {
+ if (!goog.isString(name) || !name ||
+ name.search(goog.VALID_MODULE_RE_) == -1) {
+ throw Error('Invalid module identifier');
+ }
+ if (!goog.isInModuleLoader_()) {
+ throw Error('Module ' + name + ' has been loaded incorrectly.');
+ }
+ if (goog.moduleLoaderState_.moduleName) {
+ throw Error('goog.module may only be called once per module.');
+ }
+
+ // Store the module name for the loader.
+ goog.moduleLoaderState_.moduleName = name;
+ if (!COMPILED) {
+ // Ensure that the same namespace isn't provided twice.
+ // A goog.module/goog.provide maps a goog.require to a specific file
+ if (goog.isProvided_(name)) {
+ throw Error('Namespace "' + name + '" already declared.');
+ }
+ delete goog.implicitNamespaces_[name];
+ }
+};
+
+
+/**
+ * @param {string} name The module identifier.
+ * @return {?} The module exports for an already loaded module or null.
+ *
+ * Note: This is not an alternative to goog.require, it does not
+ * indicate a hard dependency, instead it is used to indicate
+ * an optional dependency or to access the exports of a module
+ * that has already been loaded.
+ * @suppress {missingProvide}
+ */
+goog.module.get = function(name) {
+ return goog.module.getInternal_(name);
+};
+
+
+/**
+ * @param {string} name The module identifier.
+ * @return {?} The module exports for an already loaded module or null.
+ * @private
+ */
+goog.module.getInternal_ = function(name) {
+ if (!COMPILED) {
+ if (goog.isProvided_(name)) {
+ // goog.require only return a value with-in goog.module files.
+ return name in goog.loadedModules_ ? goog.loadedModules_[name] :
+ goog.getObjectByName(name);
+ } else {
+ return null;
+ }
+ }
+};
+
+
+/**
+ * @private {?{moduleName: (string|undefined), declareLegacyNamespace:boolean}}
+ */
+goog.moduleLoaderState_ = null;
+
+
+/**
+ * @private
+ * @return {boolean} Whether a goog.module is currently being initialized.
+ */
+goog.isInModuleLoader_ = function() {
+ return goog.moduleLoaderState_ != null;
+};
+
+
+/**
+ * Provide the module's exports as a globally accessible object under the
+ * module's declared name. This is intended to ease migration to goog.module
+ * for files that have existing usages.
+ * @suppress {missingProvide}
+ */
+goog.module.declareLegacyNamespace = function() {
+ if (!COMPILED && !goog.isInModuleLoader_()) {
+ throw new Error(
+ 'goog.module.declareLegacyNamespace must be called from ' +
+ 'within a goog.module');
+ }
+ if (!COMPILED && !goog.moduleLoaderState_.moduleName) {
+ throw Error(
+ 'goog.module must be called prior to ' +
+ 'goog.module.declareLegacyNamespace.');
+ }
+ goog.moduleLoaderState_.declareLegacyNamespace = true;
+};
+
+
+/**
+ * Marks that the current file should only be used for testing, and never for
+ * live code in production.
+ *
+ * In the case of unit tests, the message may optionally be an exact namespace
+ * for the test (e.g. 'goog.stringTest'). The linter will then ignore the extra
+ * provide (if not explicitly defined in the code).
+ *
+ * @param {string=} opt_message Optional message to add to the error that's
+ * raised when used in production code.
+ */
+goog.setTestOnly = function(opt_message) {
+ if (goog.DISALLOW_TEST_ONLY_CODE) {
+ opt_message = opt_message || '';
+ throw Error(
+ 'Importing test-only code into non-debug environment' +
+ (opt_message ? ': ' + opt_message : '.'));
+ }
+};
+
+
+/**
+ * Forward declares a symbol. This is an indication to the compiler that the
+ * symbol may be used in the source yet is not required and may not be provided
+ * in compilation.
+ *
+ * The most common usage of forward declaration is code that takes a type as a
+ * function parameter but does not need to require it. By forward declaring
+ * instead of requiring, no hard dependency is made, and (if not required
+ * elsewhere) the namespace may never be required and thus, not be pulled
+ * into the JavaScript binary. If it is required elsewhere, it will be type
+ * checked as normal.
+ *
+ *
+ * @param {string} name The namespace to forward declare in the form of
+ * "goog.package.part".
+ */
+goog.forwardDeclare = function(name) {};
+
+
+/**
+ * Forward declare type information. Used to assign types to goog.global
+ * referenced object that would otherwise result in unknown type references
+ * and thus block property disambiguation.
+ */
+goog.forwardDeclare('Document');
+goog.forwardDeclare('HTMLScriptElement');
+goog.forwardDeclare('XMLHttpRequest');
+
+
+if (!COMPILED) {
+ /**
+ * Check if the given name has been goog.provided. This will return false for
+ * names that are available only as implicit namespaces.
+ * @param {string} name name of the object to look for.
+ * @return {boolean} Whether the name has been provided.
+ * @private
+ */
+ goog.isProvided_ = function(name) {
+ return (name in goog.loadedModules_) ||
+ (!goog.implicitNamespaces_[name] &&
+ goog.isDefAndNotNull(goog.getObjectByName(name)));
+ };
+
+ /**
+ * Namespaces implicitly defined by goog.provide. For example,
+ * goog.provide('goog.events.Event') implicitly declares that 'goog' and
+ * 'goog.events' must be namespaces.
+ *
+ * @type {!Object<string, (boolean|undefined)>}
+ * @private
+ */
+ goog.implicitNamespaces_ = {'goog.module': true};
+
+ // NOTE: We add goog.module as an implicit namespace as goog.module is defined
+ // here and because the existing module package has not been moved yet out of
+ // the goog.module namespace. This satisifies both the debug loader and
+ // ahead-of-time dependency management.
+}
+
+
+/**
+ * Returns an object based on its fully qualified external name. The object
+ * is not found if null or undefined. If you are using a compilation pass that
+ * renames property names beware that using this function will not find renamed
+ * properties.
+ *
+ * @param {string} name The fully qualified name.
+ * @param {Object=} opt_obj The object within which to look; default is
+ * |goog.global|.
+ * @return {?} The value (object or primitive) or, if not found, null.
+ */
+goog.getObjectByName = function(name, opt_obj) {
+ var parts = name.split('.');
+ var cur = opt_obj || goog.global;
+ for (var part; part = parts.shift();) {
+ if (goog.isDefAndNotNull(cur[part])) {
+ cur = cur[part];
+ } else {
+ return null;
+ }
+ }
+ return cur;
+};
+
+
+/**
+ * Globalizes a whole namespace, such as goog or goog.lang.
+ *
+ * @param {!Object} obj The namespace to globalize.
+ * @param {Object=} opt_global The object to add the properties to.
+ * @deprecated Properties may be explicitly exported to the global scope, but
+ * this should no longer be done in bulk.
+ */
+goog.globalize = function(obj, opt_global) {
+ var global = opt_global || goog.global;
+ for (var x in obj) {
+ global[x] = obj[x];
+ }
+};
+
+
+/**
+ * Adds a dependency from a file to the files it requires.
+ * @param {string} relPath The path to the js file.
+ * @param {!Array<string>} provides An array of strings with
+ * the names of the objects this file provides.
+ * @param {!Array<string>} requires An array of strings with
+ * the names of the objects this file requires.
+ * @param {boolean|!Object<string>=} opt_loadFlags Parameters indicating
+ * how the file must be loaded. The boolean 'true' is equivalent
+ * to {'module': 'goog'} for backwards-compatibility. Valid properties
+ * and values include {'module': 'goog'} and {'lang': 'es6'}.
+ */
+goog.addDependency = function(relPath, provides, requires, opt_loadFlags) {
+ if (goog.DEPENDENCIES_ENABLED) {
+ var provide, require;
+ var path = relPath.replace(/\\/g, '/');
+ var deps = goog.dependencies_;
+ if (!opt_loadFlags || typeof opt_loadFlags === 'boolean') {
+ opt_loadFlags = opt_loadFlags ? {'module': 'goog'} : {};
+ }
+ for (var i = 0; provide = provides[i]; i++) {
+ deps.nameToPath[provide] = path;
+ deps.loadFlags[path] = opt_loadFlags;
+ }
+ for (var j = 0; require = requires[j]; j++) {
+ if (!(path in deps.requires)) {
+ deps.requires[path] = {};
+ }
+ deps.requires[path][require] = true;
+ }
+ }
+};
+
+
+
+
+// NOTE(nnaze): The debug DOM loader was included in base.js as an original way
+// to do "debug-mode" development. The dependency system can sometimes be
+// confusing, as can the debug DOM loader's asynchronous nature.
+//
+// With the DOM loader, a call to goog.require() is not blocking -- the script
+// will not load until some point after the current script. If a namespace is
+// needed at runtime, it needs to be defined in a previous script, or loaded via
+// require() with its registered dependencies.
+//
+// User-defined namespaces may need their own deps file. For a reference on
+// creating a deps file, see:
+// Externally: https://developers.google.com/closure/library/docs/depswriter
+//
+// Because of legacy clients, the DOM loader can't be easily removed from
+// base.js. Work is being done to make it disableable or replaceable for
+// different environments (DOM-less JavaScript interpreters like Rhino or V8,
+// for example). See bootstrap/ for more information.
+
+
+/**
+ * @define {boolean} Whether to enable the debug loader.
+ *
+ * If enabled, a call to goog.require() will attempt to load the namespace by
+ * appending a script tag to the DOM (if the namespace has been registered).
+ *
+ * If disabled, goog.require() will simply assert that the namespace has been
+ * provided (and depend on the fact that some outside tool correctly ordered
+ * the script).
+ */
+goog.define('goog.ENABLE_DEBUG_LOADER', true);
+
+
+/**
+ * @param {string} msg
+ * @private
+ */
+goog.logToConsole_ = function(msg) {
+ if (goog.global.console) {
+ goog.global.console['error'](msg);
+ }
+};
+
+
+/**
+ * Implements a system for the dynamic resolution of dependencies that works in
+ * parallel with the BUILD system. Note that all calls to goog.require will be
+ * stripped by the JSCompiler when the --process_closure_primitives option is
+ * used.
+ * @see goog.provide
+ * @param {string} name Namespace to include (as was given in goog.provide()) in
+ * the form "goog.package.part".
+ * @return {?} If called within a goog.module file, the associated namespace or
+ * module otherwise null.
+ */
+goog.require = function(name) {
+ // If the object already exists we do not need do do anything.
+ if (!COMPILED) {
+ if (goog.ENABLE_DEBUG_LOADER && goog.IS_OLD_IE_) {
+ goog.maybeProcessDeferredDep_(name);
+ }
+
+ if (goog.isProvided_(name)) {
+ if (goog.isInModuleLoader_()) {
+ return goog.module.getInternal_(name);
+ } else {
+ return null;
+ }
+ }
+
+ if (goog.ENABLE_DEBUG_LOADER) {
+ var path = goog.getPathFromDeps_(name);
+ if (path) {
+ goog.writeScripts_(path);
+ return null;
+ }
+ }
+
+ var errorMessage = 'goog.require could not find: ' + name;
+ goog.logToConsole_(errorMessage);
+
+ throw Error(errorMessage);
+ }
+};
+
+
+/**
+ * Path for included scripts.
+ * @type {string}
+ */
+goog.basePath = '';
+
+
+/**
+ * A hook for overriding the base path.
+ * @type {string|undefined}
+ */
+goog.global.CLOSURE_BASE_PATH;
+
+
+/**
+ * Whether to write out Closure's deps file. By default, the deps are written.
+ * @type {boolean|undefined}
+ */
+goog.global.CLOSURE_NO_DEPS;
+
+
+/**
+ * A function to import a single script. This is meant to be overridden when
+ * Closure is being run in non-HTML contexts, such as web workers. It's defined
+ * in the global scope so that it can be set before base.js is loaded, which
+ * allows deps.js to be imported properly.
+ *
+ * The function is passed the script source, which is a relative URI. It should
+ * return true if the script was imported, false otherwise.
+ * @type {(function(string): boolean)|undefined}
+ */
+goog.global.CLOSURE_IMPORT_SCRIPT;
+
+
+/**
+ * Null function used for default values of callbacks, etc.
+ * @return {void} Nothing.
+ */
+goog.nullFunction = function() {};
+
+
+/**
+ * When defining a class Foo with an abstract method bar(), you can do:
+ * Foo.prototype.bar = goog.abstractMethod
+ *
+ * Now if a subclass of Foo fails to override bar(), an error will be thrown
+ * when bar() is invoked.
+ *
+ * Note: This does not take the name of the function to override as an argument
+ * because that would make it more difficult to obfuscate our JavaScript code.
+ *
+ * @type {!Function}
+ * @throws {Error} when invoked to indicate the method should be overridden.
+ */
+goog.abstractMethod = function() {
+ throw Error('unimplemented abstract method');
+};
+
+
+/**
+ * Adds a {@code getInstance} static method that always returns the same
+ * instance object.
+ * @param {!Function} ctor The constructor for the class to add the static
+ * method to.
+ */
+goog.addSingletonGetter = function(ctor) {
+ ctor.getInstance = function() {
+ if (ctor.instance_) {
+ return ctor.instance_;
+ }
+ if (goog.DEBUG) {
+ // NOTE: JSCompiler can't optimize away Array#push.
+ goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor;
+ }
+ return ctor.instance_ = new ctor;
+ };
+};
+
+
+/**
+ * All singleton classes that have been instantiated, for testing. Don't read
+ * it directly, use the {@code goog.testing.singleton} module. The compiler
+ * removes this variable if unused.
+ * @type {!Array<!Function>}
+ * @private
+ */
+goog.instantiatedSingletons_ = [];
+
+
+/**
+ * @define {boolean} Whether to load goog.modules using {@code eval} when using
+ * the debug loader. This provides a better debugging experience as the
+ * source is unmodified and can be edited using Chrome Workspaces or similar.
+ * However in some environments the use of {@code eval} is banned
+ * so we provide an alternative.
+ */
+goog.define('goog.LOAD_MODULE_USING_EVAL', true);
+
+
+/**
+ * @define {boolean} Whether the exports of goog.modules should be sealed when
+ * possible.
+ */
+goog.define('goog.SEAL_MODULE_EXPORTS', goog.DEBUG);
+
+
+/**
+ * The registry of initialized modules:
+ * the module identifier to module exports map.
+ * @private @const {!Object<string, ?>}
+ */
+goog.loadedModules_ = {};
+
+
+/**
+ * True if goog.dependencies_ is available.
+ * @const {boolean}
+ */
+goog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER;
+
+
+/**
+ * @define {string} How to decide whether to transpile. Valid values
+ * are 'always', 'never', and 'detect'. The default ('detect') is to
+ * use feature detection to determine which language levels need
+ * transpilation.
+ */
+// NOTE(user): we could expand this to accept a language level to bypass
+// detection: e.g. goog.TRANSPILE == 'es5' would transpile ES6 files but
+// would leave ES3 and ES5 files alone.
+goog.define('goog.TRANSPILE', 'detect');
+
+
+/**
+ * @define {string} Path to the transpiler. Executing the script at this
+ * path (relative to base.js) should define a function $jscomp.transpile.
+ */
+goog.define('goog.TRANSPILER', 'transpile.js');
+
+
+if (goog.DEPENDENCIES_ENABLED) {
+ /**
+ * This object is used to keep track of dependencies and other data that is
+ * used for loading scripts.
+ * @private
+ * @type {{
+ * loadFlags: !Object<string, !Object<string, string>>,
+ * nameToPath: !Object<string, string>,
+ * requires: !Object<string, !Object<string, boolean>>,
+ * visited: !Object<string, boolean>,
+ * written: !Object<string, boolean>,
+ * deferred: !Object<string, string>
+ * }}
+ */
+ goog.dependencies_ = {
+ loadFlags: {}, // 1 to 1
+
+ nameToPath: {}, // 1 to 1
+
+ requires: {}, // 1 to many
+
+ // Used when resolving dependencies to prevent us from visiting file twice.
+ visited: {},
+
+ written: {}, // Used to keep track of script files we have written.
+
+ deferred: {} // Used to track deferred module evaluations in old IEs
+ };
+
+
+ /**
+ * Tries to detect whether is in the context of an HTML document.
+ * @return {boolean} True if it looks like HTML document.
+ * @private
+ */
+ goog.inHtmlDocument_ = function() {
+ /** @type {Document} */
+ var doc = goog.global.document;
+ return doc != null && 'write' in doc; // XULDocument misses write.
+ };
+
+
+ /**
+ * Tries to detect the base path of base.js script that bootstraps Closure.
+ * @private
+ */
+ goog.findBasePath_ = function() {
+ if (goog.isDef(goog.global.CLOSURE_BASE_PATH)) {
+ goog.basePath = goog.global.CLOSURE_BASE_PATH;
+ return;
+ } else if (!goog.inHtmlDocument_()) {
+ return;
+ }
+ /** @type {Document} */
+ var doc = goog.global.document;
+ var scripts = doc.getElementsByTagName('SCRIPT');
+ // Search backwards since the current script is in almost all cases the one
+ // that has base.js.
+ for (var i = scripts.length - 1; i >= 0; --i) {
+ var script = /** @type {!HTMLScriptElement} */ (scripts[i]);
+ var src = script.src;
+ var qmark = src.lastIndexOf('?');
+ var l = qmark == -1 ? src.length : qmark;
+ if (src.substr(l - 7, 7) == 'base.js') {
+ goog.basePath = src.substr(0, l - 7);
+ return;
+ }
+ }
+ };
+
+
+ /**
+ * Imports a script if, and only if, that script hasn't already been imported.
+ * (Must be called at execution time)
+ * @param {string} src Script source.
+ * @param {string=} opt_sourceText The optionally source text to evaluate
+ * @private
+ */
+ goog.importScript_ = function(src, opt_sourceText) {
+ var importScript =
+ goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_;
+ if (importScript(src, opt_sourceText)) {
+ goog.dependencies_.written[src] = true;
+ }
+ };
+
+
+ /**
+ * Whether the browser is IE9 or earlier, which needs special handling
+ * for deferred modules.
+ * @const @private {boolean}
+ */
+ goog.IS_OLD_IE_ =
+ !!(!goog.global.atob && goog.global.document && goog.global.document.all);
+
+
+ /**
+ * Given a URL initiate retrieval and execution of a script that needs
+ * pre-processing.
+ * @param {string} src Script source URL.
+ * @param {boolean} isModule Whether this is a goog.module.
+ * @param {boolean} needsTranspile Whether this source needs transpilation.
+ * @private
+ */
+ goog.importProcessedScript_ = function(src, isModule, needsTranspile) {
+ // In an attempt to keep browsers from timing out loading scripts using
+ // synchronous XHRs, put each load in its own script block.
+ var bootstrap = 'goog.retrieveAndExec_("' + src + '", ' + isModule + ', ' +
+ needsTranspile + ');';
+
+ goog.importScript_('', bootstrap);
+ };
+
+
+ /** @private {!Array<string>} */
+ goog.queuedModules_ = [];
+
+
+ /**
+ * Return an appropriate module text. Suitable to insert into
+ * a script tag (that is unescaped).
+ * @param {string} srcUrl
+ * @param {string} scriptText
+ * @return {string}
+ * @private
+ */
+ goog.wrapModule_ = function(srcUrl, scriptText) {
+ if (!goog.LOAD_MODULE_USING_EVAL || !goog.isDef(goog.global.JSON)) {
+ return '' +
+ 'goog.loadModule(function(exports) {' +
+ '"use strict";' + scriptText +
+ '\n' + // terminate any trailing single line comment.
+ ';return exports' +
+ '});' +
+ '\n//# sourceURL=' + srcUrl + '\n';
+ } else {
+ return '' +
+ 'goog.loadModule(' +
+ goog.global.JSON.stringify(
+ scriptText + '\n//# sourceURL=' + srcUrl + '\n') +
+ ');';
+ }
+ };
+
+ // On IE9 and earlier, it is necessary to handle
+ // deferred module loads. In later browsers, the
+ // code to be evaluated is simply inserted as a script
+ // block in the correct order. To eval deferred
+ // code at the right time, we piggy back on goog.require to call
+ // goog.maybeProcessDeferredDep_.
+ //
+ // The goog.requires are used both to bootstrap
+ // the loading process (when no deps are available) and
+ // declare that they should be available.
+ //
+ // Here we eval the sources, if all the deps are available
+ // either already eval'd or goog.require'd. This will
+ // be the case when all the dependencies have already
+ // been loaded, and the dependent module is loaded.
+ //
+ // But this alone isn't sufficient because it is also
+ // necessary to handle the case where there is no root
+ // that is not deferred. For that there we register for an event
+ // and trigger goog.loadQueuedModules_ handle any remaining deferred
+ // evaluations.
+
+ /**
+ * Handle any remaining deferred goog.module evals.
+ * @private
+ */
+ goog.loadQueuedModules_ = function() {
+ var count = goog.queuedModules_.length;
+ if (count > 0) {
+ var queue = goog.queuedModules_;
+ goog.queuedModules_ = [];
+ for (var i = 0; i < count; i++) {
+ var path = queue[i];
+ goog.maybeProcessDeferredPath_(path);
+ }
+ }
+ };
+
+
+ /**
+ * Eval the named module if its dependencies are
+ * available.
+ * @param {string} name The module to load.
+ * @private
+ */
+ goog.maybeProcessDeferredDep_ = function(name) {
+ if (goog.isDeferredModule_(name) && goog.allDepsAreAvailable_(name)) {
+ var path = goog.getPathFromDeps_(name);
+ goog.maybeProcessDeferredPath_(goog.basePath + path);
+ }
+ };
+
+ /**
+ * @param {string} name The module to check.
+ * @return {boolean} Whether the name represents a
+ * module whose evaluation has been deferred.
+ * @private
+ */
+ goog.isDeferredModule_ = function(name) {
+ var path = goog.getPathFromDeps_(name);
+ var loadFlags = path && goog.dependencies_.loadFlags[path] || {};
+ if (path && (loadFlags['module'] == 'goog' ||
+ goog.needsTranspile_(loadFlags['lang']))) {
+ var abspath = goog.basePath + path;
+ return (abspath) in goog.dependencies_.deferred;
+ }
+ return false;
+ };
+
+ /**
+ * @param {string} name The module to check.
+ * @return {boolean} Whether the name represents a
+ * module whose declared dependencies have all been loaded
+ * (eval'd or a deferred module load)
+ * @private
+ */
+ goog.allDepsAreAvailable_ = function(name) {
+ var path = goog.getPathFromDeps_(name);
+ if (path && (path in goog.dependencies_.requires)) {
+ for (var requireName in goog.dependencies_.requires[path]) {
+ if (!goog.isProvided_(requireName) &&
+ !goog.isDeferredModule_(requireName)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ };
+
+
+ /**
+ * @param {string} abspath
+ * @private
+ */
+ goog.maybeProcessDeferredPath_ = function(abspath) {
+ if (abspath in goog.dependencies_.deferred) {
+ var src = goog.dependencies_.deferred[abspath];
+ delete goog.dependencies_.deferred[abspath];
+ goog.globalEval(src);
+ }
+ };
+
+
+ /**
+ * Load a goog.module from the provided URL. This is not a general purpose
+ * code loader and does not support late loading code, that is it should only
+ * be used during page load. This method exists to support unit tests and
+ * "debug" loaders that would otherwise have inserted script tags. Under the
+ * hood this needs to use a synchronous XHR and is not recommeneded for
+ * production code.
+ *
+ * The module's goog.requires must have already been satisified; an exception
+ * will be thrown if this is not the case. This assumption is that no
+ * "deps.js" file exists, so there is no way to discover and locate the
+ * module-to-be-loaded's dependencies and no attempt is made to do so.
+ *
+ * There should only be one attempt to load a module. If
+ * "goog.loadModuleFromUrl" is called for an already loaded module, an
+ * exception will be throw.
+ *
+ * @param {string} url The URL from which to attempt to load the goog.module.
+ */
+ goog.loadModuleFromUrl = function(url) {
+ // Because this executes synchronously, we don't need to do any additional
+ // bookkeeping. When "goog.loadModule" the namespace will be marked as
+ // having been provided which is sufficient.
+ goog.retrieveAndExec_(url, true, false);
+ };
+
+
+ /**
+ * @param {function(?):?|string} moduleDef The module definition.
+ */
+ goog.loadModule = function(moduleDef) {
+ // NOTE: we allow function definitions to be either in the from
+ // of a string to eval (which keeps the original source intact) or
+ // in a eval forbidden environment (CSP) we allow a function definition
+ // which in its body must call {@code goog.module}, and return the exports
+ // of the module.
+ var previousState = goog.moduleLoaderState_;
+ try {
+ goog.moduleLoaderState_ = {
+ moduleName: undefined,
+ declareLegacyNamespace: false
+ };
+ var exports;
+ if (goog.isFunction(moduleDef)) {
+ exports = moduleDef.call(goog.global, {});
+ } else if (goog.isString(moduleDef)) {
+ exports = goog.loadModuleFromSource_.call(goog.global, moduleDef);
+ } else {
+ throw Error('Invalid module definition');
+ }
+
+ var moduleName = goog.moduleLoaderState_.moduleName;
+ if (!goog.isString(moduleName) || !moduleName) {
+ throw Error('Invalid module name \"' + moduleName + '\"');
+ }
+
+ // Don't seal legacy namespaces as they may be uses as a parent of
+ // another namespace
+ if (goog.moduleLoaderState_.declareLegacyNamespace) {
+ goog.constructNamespace_(moduleName, exports);
+ } else if (goog.SEAL_MODULE_EXPORTS && Object.seal) {
+ Object.seal(exports);
+ }
+
+ goog.loadedModules_[moduleName] = exports;
+ } finally {
+ goog.moduleLoaderState_ = previousState;
+ }
+ };
+
+
+ /**
+ * @private @const {function(string):?}
+ *
+ * The new type inference warns because this function has no formal
+ * parameters, but its jsdoc says that it takes one argument.
+ * (The argument is used via arguments[0], but NTI does not detect this.)
+ * @suppress {newCheckTypes}
+ */
+ goog.loadModuleFromSource_ = function() {
+ // NOTE: we avoid declaring parameters or local variables here to avoid
+ // masking globals or leaking values into the module definition.
+ 'use strict';
+ var exports = {};
+ eval(arguments[0]);
+ return exports;
+ };
+
+
+ /**
+ * Writes a new script pointing to {@code src} directly into the DOM.
+ *
+ * NOTE: This method is not CSP-compliant. @see goog.appendScriptSrcNode_ for
+ * the fallback mechanism.
+ *
+ * @param {string} src The script URL.
+ * @private
+ */
+ goog.writeScriptSrcNode_ = function(src) {
+ goog.global.document.write(
+ '<script type="text/javascript" src="' + src + '"></' +
+ 'script>');
+ };
+
+
+ /**
+ * Appends a new script node to the DOM using a CSP-compliant mechanism. This
+ * method exists as a fallback for document.write (which is not allowed in a
+ * strict CSP context, e.g., Chrome apps).
+ *
+ * NOTE: This method is not analogous to using document.write to insert a
+ * <script> tag; specifically, the user agent will execute a script added by
+ * document.write immediately after the current script block finishes
+ * executing, whereas the DOM-appended script node will not be executed until
+ * the entire document is parsed and executed. That is to say, this script is
+ * added to the end of the script execution queue.
+ *
+ * The page must not attempt to call goog.required entities until after the
+ * document has loaded, e.g., in or after the window.onload callback.
+ *
+ * @param {string} src The script URL.
+ * @private
+ */
+ goog.appendScriptSrcNode_ = function(src) {
+ /** @type {Document} */
+ var doc = goog.global.document;
+ var scriptEl =
+ /** @type {HTMLScriptElement} */ (doc.createElement('script'));
+ scriptEl.type = 'text/javascript';
+ scriptEl.src = src;
+ scriptEl.defer = false;
+ scriptEl.async = false;
+ doc.head.appendChild(scriptEl);
+ };
+
+
+ /**
+ * The default implementation of the import function. Writes a script tag to
+ * import the script.
+ *
+ * @param {string} src The script url.
+ * @param {string=} opt_sourceText The optionally source text to evaluate
+ * @return {boolean} True if the script was imported, false otherwise.
+ * @private
+ */
+ goog.writeScriptTag_ = function(src, opt_sourceText) {
+ if (goog.inHtmlDocument_()) {
+ /** @type {!HTMLDocument} */
+ var doc = goog.global.document;
+
+ // If the user tries to require a new symbol after document load,
+ // something has gone terribly wrong. Doing a document.write would
+ // wipe out the page. This does not apply to the CSP-compliant method
+ // of writing script tags.
+ if (!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING &&
+ doc.readyState == 'complete') {
+ // Certain test frameworks load base.js multiple times, which tries
+ // to write deps.js each time. If that happens, just fail silently.
+ // These frameworks wipe the page between each load of base.js, so this
+ // is OK.
+ var isDeps = /\bdeps.js$/.test(src);
+ if (isDeps) {
+ return false;
+ } else {
+ throw Error('Cannot write "' + src + '" after document load');
+ }
+ }
+
+ if (opt_sourceText === undefined) {
+ if (!goog.IS_OLD_IE_) {
+ if (goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING) {
+ goog.appendScriptSrcNode_(src);
+ } else {
+ goog.writeScriptSrcNode_(src);
+ }
+ } else {
+ var state = " onreadystatechange='goog.onScriptLoad_(this, " +
+ ++goog.lastNonModuleScriptIndex_ + ")' ";
+ doc.write(
+ '<script type="text/javascript" src="' + src + '"' + state +
+ '></' +
+ 'script>');
+ }
+ } else {
+ doc.write(
+ '<script type="text/javascript">' + opt_sourceText + '</' +
+ 'script>');
+ }
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+
+ /**
+ * Determines whether the given language needs to be transpiled.
+ * @param {string} lang
+ * @return {boolean}
+ * @private
+ */
+ goog.needsTranspile_ = function(lang) {
+ if (goog.TRANSPILE == 'always') {
+ return true;
+ } else if (goog.TRANSPILE == 'never') {
+ return false;
+ } else if (!goog.transpiledLanguages_) {
+ goog.transpiledLanguages_ = {'es5': true, 'es6': true, 'es6-impl': true};
+ /** @preserveTry */
+ try {
+ // Perform some quick conformance checks, to distinguish
+ // between browsers that support es5, es6-impl, or es6.
+
+ // Identify ES3-only browsers by their incorrect treatment of commas.
+ goog.transpiledLanguages_['es5'] = eval('[1,].length!=1');
+
+ // As browsers mature, features will be moved from the full test
+ // into the impl test. This must happen before the corresponding
+ // features are changed in the Closure Compiler's FeatureSet object.
+
+ // Test 1: es6-impl [FF49, Edge 13, Chrome 49]
+ // (a) let/const keyword, (b) class expressions, (c) Map object,
+ // (d) iterable arguments, (e) spread operator
+ var es6implTest =
+ 'let a={};const X=class{constructor(){}x(z){return new Map([' +
+ '...arguments]).get(z[0])==3}};return new X().x([a,3])';
+
+ // Test 2: es6 [FF50 (?), Edge 14 (?), Chrome 50]
+ // (a) default params (specifically shadowing locals),
+ // (b) destructuring, (c) block-scoped functions,
+ // (d) for-of (const), (e) new.target/Reflect.construct
+ var es6fullTest =
+ 'class X{constructor(){if(new.target!=String)throw 1;this.x=42}}' +
+ 'let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof ' +
+ 'String))throw 1;for(const a of[2,3]){if(a==2)continue;function ' +
+ 'f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()' +
+ '==3}';
+
+ if (eval('(()=>{"use strict";' + es6implTest + '})()')) {
+ goog.transpiledLanguages_['es6-impl'] = false;
+ }
+ if (eval('(()=>{"use strict";' + es6fullTest + '})()')) {
+ goog.transpiledLanguages_['es6'] = false;
+ }
+ } catch (err) {
+ }
+ }
+ return !!goog.transpiledLanguages_[lang];
+ };
+
+
+ /** @private {?Object<string, boolean>} */
+ goog.transpiledLanguages_ = null;
+
+
+ /** @private {number} */
+ goog.lastNonModuleScriptIndex_ = 0;
+
+
+ /**
+ * A readystatechange handler for legacy IE
+ * @param {!HTMLScriptElement} script
+ * @param {number} scriptIndex
+ * @return {boolean}
+ * @private
+ */
+ goog.onScriptLoad_ = function(script, scriptIndex) {
+ // for now load the modules when we reach the last script,
+ // later allow more inter-mingling.
+ if (script.readyState == 'complete' &&
+ goog.lastNonModuleScriptIndex_ == scriptIndex) {
+ goog.loadQueuedModules_();
+ }
+ return true;
+ };
+
+ /**
+ * Resolves dependencies based on the dependencies added using addDependency
+ * and calls importScript_ in the correct order.
+ * @param {string} pathToLoad The path from which to start discovering
+ * dependencies.
+ * @private
+ */
+ goog.writeScripts_ = function(pathToLoad) {
+ /** @type {!Array<string>} The scripts we need to write this time. */
+ var scripts = [];
+ var seenScript = {};
+ var deps = goog.dependencies_;
+
+ /** @param {string} path */
+ function visitNode(path) {
+ if (path in deps.written) {
+ return;
+ }
+
+ // We have already visited this one. We can get here if we have cyclic
+ // dependencies.
+ if (path in deps.visited) {
+ return;
+ }
+
+ deps.visited[path] = true;
+
+ if (path in deps.requires) {
+ for (var requireName in deps.requires[path]) {
+ // If the required name is defined, we assume that it was already
+ // bootstrapped by other means.
+ if (!goog.isProvided_(requireName)) {
+ if (requireName in deps.nameToPath) {
+ visitNode(deps.nameToPath[requireName]);
+ } else {
+ throw Error('Undefined nameToPath for ' + requireName);
+ }
+ }
+ }
+ }
+
+ if (!(path in seenScript)) {
+ seenScript[path] = true;
+ scripts.push(path);
+ }
+ }
+
+ visitNode(pathToLoad);
+
+ // record that we are going to load all these scripts.
+ for (var i = 0; i < scripts.length; i++) {
+ var path = scripts[i];
+ goog.dependencies_.written[path] = true;
+ }
+
+ // If a module is loaded synchronously then we need to
+ // clear the current inModuleLoader value, and restore it when we are
+ // done loading the current "requires".
+ var moduleState = goog.moduleLoaderState_;
+ goog.moduleLoaderState_ = null;
+
+ for (var i = 0; i < scripts.length; i++) {
+ var path = scripts[i];
+ if (path) {
+ var loadFlags = deps.loadFlags[path] || {};
+ var needsTranspile = goog.needsTranspile_(loadFlags['lang']);
+ if (loadFlags['module'] == 'goog' || needsTranspile) {
+ goog.importProcessedScript_(
+ goog.basePath + path, loadFlags['module'] == 'goog',
+ needsTranspile);
+ } else {
+ goog.importScript_(goog.basePath + path);
+ }
+ } else {
+ goog.moduleLoaderState_ = moduleState;
+ throw Error('Undefined script input');
+ }
+ }
+
+ // restore the current "module loading state"
+ goog.moduleLoaderState_ = moduleState;
+ };
+
+
+ /**
+ * Looks at the dependency rules and tries to determine the script file that
+ * fulfills a particular rule.
+ * @param {string} rule In the form goog.namespace.Class or project.script.
+ * @return {?string} Url corresponding to the rule, or null.
+ * @private
+ */
+ goog.getPathFromDeps_ = function(rule) {
+ if (rule in goog.dependencies_.nameToPath) {
+ return goog.dependencies_.nameToPath[rule];
+ } else {
+ return null;
+ }
+ };
+
+ goog.findBasePath_();
+
+ // Allow projects to manage the deps files themselves.
+ if (!goog.global.CLOSURE_NO_DEPS) {
+ goog.importScript_(goog.basePath + 'deps.js');
+ }
+}
+
+
+/**
+ * Normalize a file path by removing redundant ".." and extraneous "." file
+ * path components.
+ * @param {string} path
+ * @return {string}
+ * @private
+ */
+goog.normalizePath_ = function(path) {
+ var components = path.split('/');
+ var i = 0;
+ while (i < components.length) {
+ if (components[i] == '.') {
+ components.splice(i, 1);
+ } else if (
+ i && components[i] == '..' && components[i - 1] &&
+ components[i - 1] != '..') {
+ components.splice(--i, 2);
+ } else {
+ i++;
+ }
+ }
+ return components.join('/');
+};
+
+
+/**
+ * Loads file by synchronous XHR. Should not be used in production environments.
+ * @param {string} src Source URL.
+ * @return {?string} File contents, or null if load failed.
+ * @private
+ */
+goog.loadFileSync_ = function(src) {
+ if (goog.global.CLOSURE_LOAD_FILE_SYNC) {
+ return goog.global.CLOSURE_LOAD_FILE_SYNC(src);
+ } else {
+ try {
+ /** @type {XMLHttpRequest} */
+ var xhr = new goog.global['XMLHttpRequest']();
+ xhr.open('get', src, false);
+ xhr.send();
+ // NOTE: Successful http: requests have a status of 200, but successful
+ // file: requests may have a status of zero. Any other status, or a
+ // thrown exception (particularly in case of file: requests) indicates
+ // some sort of error, which we treat as a missing or unavailable file.
+ return xhr.status == 0 || xhr.status == 200 ? xhr.responseText : null;
+ } catch (err) {
+ // No need to rethrow or log, since errors should show up on their own.
+ return null;
+ }
+ }
+};
+
+
+/**
+ * Retrieve and execute a script that needs some sort of wrapping.
+ * @param {string} src Script source URL.
+ * @param {boolean} isModule Whether to load as a module.
+ * @param {boolean} needsTranspile Whether to transpile down to ES3.
+ * @private
+ */
+goog.retrieveAndExec_ = function(src, isModule, needsTranspile) {
+ if (!COMPILED) {
+ // The full but non-canonicalized URL for later use.
+ var originalPath = src;
+ // Canonicalize the path, removing any /./ or /../ since Chrome's debugging
+ // console doesn't auto-canonicalize XHR loads as it does <script> srcs.
+ src = goog.normalizePath_(src);
+
+ var importScript =
+ goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_;
+
+ var scriptText = goog.loadFileSync_(src);
+ if (scriptText == null) {
+ throw new Error('Load of "' + src + '" failed');
+ }
+
+ if (needsTranspile) {
+ scriptText = goog.transpile_.call(goog.global, scriptText, src);
+ }
+
+ if (isModule) {
+ scriptText = goog.wrapModule_(src, scriptText);
+ } else {
+ scriptText += '\n//# sourceURL=' + src;
+ }
+ var isOldIE = goog.IS_OLD_IE_;
+ if (isOldIE) {
+ goog.dependencies_.deferred[originalPath] = scriptText;
+ goog.queuedModules_.push(originalPath);
+ } else {
+ importScript(src, scriptText);
+ }
+ }
+};
+
+
+/**
+ * Lazily retrieves the transpiler and applies it to the source.
+ * @param {string} code JS code.
+ * @param {string} path Path to the code.
+ * @return {string} The transpiled code.
+ * @private
+ */
+goog.transpile_ = function(code, path) {
+ var jscomp = goog.global['$jscomp'];
+ if (!jscomp) {
+ goog.global['$jscomp'] = jscomp = {};
+ }
+ var transpile = jscomp.transpile;
+ if (!transpile) {
+ var transpilerPath = goog.basePath + goog.TRANSPILER;
+ var transpilerCode = goog.loadFileSync_(transpilerPath);
+ if (transpilerCode) {
+ // This must be executed synchronously, since by the time we know we
+ // need it, we're about to load and write the ES6 code synchronously,
+ // so a normal script-tag load will be too slow.
+ eval(transpilerCode + '\n//# sourceURL=' + transpilerPath);
+ // Note: transpile.js reassigns goog.global['$jscomp'] so pull it again.
+ jscomp = goog.global['$jscomp'];
+ transpile = jscomp.transpile;
+ }
+ }
+ if (!transpile) {
+ // The transpiler is an optional component. If it's not available then
+ // replace it with a pass-through function that simply logs.
+ var suffix = ' requires transpilation but no transpiler was found.';
+ transpile = jscomp.transpile = function(code, path) {
+ // TODO(user): figure out some way to get this error to show up
+ // in test results, noting that the failure may occur in many
+ // different ways, including in loadModule() before the test
+ // runner even comes up.
+ goog.logToConsole_(path + suffix);
+ return code;
+ };
+ }
+ // Note: any transpilation errors/warnings will be logged to the console.
+ return transpile(code, path);
+};
+
+
+//==============================================================================
+// Language Enhancements
+//==============================================================================
+
+
+/**
+ * This is a "fixed" version of the typeof operator. It differs from the typeof
+ * operator in such a way that null returns 'null' and arrays return 'array'.
+ * @param {?} value The value to get the type of.
+ * @return {string} The name of the type.
+ */
+goog.typeOf = function(value) {
+ var s = typeof value;
+ if (s == 'object') {
+ if (value) {
+ // Check these first, so we can avoid calling Object.prototype.toString if
+ // possible.
+ //
+ // IE improperly marshals typeof across execution contexts, but a
+ // cross-context object will still return false for "instanceof Object".
+ if (value instanceof Array) {
+ return 'array';
+ } else if (value instanceof Object) {
+ return s;
+ }
+
+ // HACK: In order to use an Object prototype method on the arbitrary
+ // value, the compiler requires the value be cast to type Object,
+ // even though the ECMA spec explicitly allows it.
+ var className = Object.prototype.toString.call(
+ /** @type {!Object} */ (value));
+ // In Firefox 3.6, attempting to access iframe window objects' length
+ // property throws an NS_ERROR_FAILURE, so we need to special-case it
+ // here.
+ if (className == '[object Window]') {
+ return 'object';
+ }
+
+ // We cannot always use constructor == Array or instanceof Array because
+ // different frames have different Array objects. In IE6, if the iframe
+ // where the array was created is destroyed, the array loses its
+ // prototype. Then dereferencing val.splice here throws an exception, so
+ // we can't use goog.isFunction. Calling typeof directly returns 'unknown'
+ // so that will work. In this case, this function will return false and
+ // most array functions will still work because the array is still
+ // array-like (supports length and []) even though it has lost its
+ // prototype.
+ // Mark Miller noticed that Object.prototype.toString
+ // allows access to the unforgeable [[Class]] property.
+ // 15.2.4.2 Object.prototype.toString ( )
+ // When the toString method is called, the following steps are taken:
+ // 1. Get the [[Class]] property of this object.
+ // 2. Compute a string value by concatenating the three strings
+ // "[object ", Result(1), and "]".
+ // 3. Return Result(2).
+ // and this behavior survives the destruction of the execution context.
+ if ((className == '[object Array]' ||
+ // In IE all non value types are wrapped as objects across window
+ // boundaries (not iframe though) so we have to do object detection
+ // for this edge case.
+ typeof value.length == 'number' &&
+ typeof value.splice != 'undefined' &&
+ typeof value.propertyIsEnumerable != 'undefined' &&
+ !value.propertyIsEnumerable('splice')
+
+ )) {
+ return 'array';
+ }
+ // HACK: There is still an array case that fails.
+ // function ArrayImpostor() {}
+ // ArrayImpostor.prototype = [];
+ // var impostor = new ArrayImpostor;
+ // this can be fixed by getting rid of the fast path
+ // (value instanceof Array) and solely relying on
+ // (value && Object.prototype.toString.vall(value) === '[object Array]')
+ // but that would require many more function calls and is not warranted
+ // unless closure code is receiving objects from untrusted sources.
+
+ // IE in cross-window calls does not correctly marshal the function type
+ // (it appears just as an object) so we cannot use just typeof val ==
+ // 'function'. However, if the object has a call property, it is a
+ // function.
+ if ((className == '[object Function]' ||
+ typeof value.call != 'undefined' &&
+ typeof value.propertyIsEnumerable != 'undefined' &&
+ !value.propertyIsEnumerable('call'))) {
+ return 'function';
+ }
+
+ } else {
+ return 'null';
+ }
+
+ } else if (s == 'function' && typeof value.call == 'undefined') {
+ // In Safari typeof nodeList returns 'function', and on Firefox typeof
+ // behaves similarly for HTML{Applet,Embed,Object}, Elements and RegExps. We
+ // would like to return object for those and we can detect an invalid
+ // function by making sure that the function object has a call method.
+ return 'object';
+ }
+ return s;
+};
+
+
+/**
+ * Returns true if the specified value is null.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is null.
+ */
+goog.isNull = function(val) {
+ return val === null;
+};
+
+
+/**
+ * Returns true if the specified value is defined and not null.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is defined and not null.
+ */
+goog.isDefAndNotNull = function(val) {
+ // Note that undefined == null.
+ return val != null;
+};
+
+
+/**
+ * Returns true if the specified value is an array.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is an array.
+ */
+goog.isArray = function(val) {
+ return goog.typeOf(val) == 'array';
+};
+
+
+/**
+ * Returns true if the object looks like an array. To qualify as array like
+ * the value needs to be either a NodeList or an object with a Number length
+ * property. As a special case, a function value is not array like, because its
+ * length property is fixed to correspond to the number of expected arguments.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is an array.
+ */
+goog.isArrayLike = function(val) {
+ var type = goog.typeOf(val);
+ // We do not use goog.isObject here in order to exclude function values.
+ return type == 'array' || type == 'object' && typeof val.length == 'number';
+};
+
+
+/**
+ * Returns true if the object looks like a Date. To qualify as Date-like the
+ * value needs to be an object and have a getFullYear() function.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is a like a Date.
+ */
+goog.isDateLike = function(val) {
+ return goog.isObject(val) && typeof val.getFullYear == 'function';
+};
+
+
+/**
+ * Returns true if the specified value is a string.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is a string.
+ */
+goog.isString = function(val) {
+ return typeof val == 'string';
+};
+
+
+/**
+ * Returns true if the specified value is a boolean.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is boolean.
+ */
+goog.isBoolean = function(val) {
+ return typeof val == 'boolean';
+};
+
+
+/**
+ * Returns true if the specified value is a number.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is a number.
+ */
+goog.isNumber = function(val) {
+ return typeof val == 'number';
+};
+
+
+/**
+ * Returns true if the specified value is a function.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is a function.
+ */
+goog.isFunction = function(val) {
+ return goog.typeOf(val) == 'function';
+};
+
+
+/**
+ * Returns true if the specified value is an object. This includes arrays and
+ * functions.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is an object.
+ */
+goog.isObject = function(val) {
+ var type = typeof val;
+ return type == 'object' && val != null || type == 'function';
+ // return Object(val) === val also works, but is slower, especially if val is
+ // not an object.
+};
+
+
+/**
+ * Gets a unique ID for an object. This mutates the object so that further calls
+ * with the same object as a parameter returns the same value. The unique ID is
+ * guaranteed to be unique across the current session amongst objects that are
+ * passed into {@code getUid}. There is no guarantee that the ID is unique or
+ * consistent across sessions. It is unsafe to generate unique ID for function
+ * prototypes.
+ *
+ * @param {Object} obj The object to get the unique ID for.
+ * @return {number} The unique ID for the object.
+ */
+goog.getUid = function(obj) {
+ // TODO(arv): Make the type stricter, do not accept null.
+
+ // In Opera window.hasOwnProperty exists but always returns false so we avoid
+ // using it. As a consequence the unique ID generated for BaseClass.prototype
+ // and SubClass.prototype will be the same.
+ return obj[goog.UID_PROPERTY_] ||
+ (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_);
+};
+
+
+/**
+ * Whether the given object is already assigned a unique ID.
+ *
+ * This does not modify the object.
+ *
+ * @param {!Object} obj The object to check.
+ * @return {boolean} Whether there is an assigned unique id for the object.
+ */
+goog.hasUid = function(obj) {
+ return !!obj[goog.UID_PROPERTY_];
+};
+
+
+/**
+ * Removes the unique ID from an object. This is useful if the object was
+ * previously mutated using {@code goog.getUid} in which case the mutation is
+ * undone.
+ * @param {Object} obj The object to remove the unique ID field from.
+ */
+goog.removeUid = function(obj) {
+ // TODO(arv): Make the type stricter, do not accept null.
+
+ // In IE, DOM nodes are not instances of Object and throw an exception if we
+ // try to delete. Instead we try to use removeAttribute.
+ if (obj !== null && 'removeAttribute' in obj) {
+ obj.removeAttribute(goog.UID_PROPERTY_);
+ }
+ /** @preserveTry */
+ try {
+ delete obj[goog.UID_PROPERTY_];
+ } catch (ex) {
+ }
+};
+
+
+/**
+ * Name for unique ID property. Initialized in a way to help avoid collisions
+ * with other closure JavaScript on the same page.
+ * @type {string}
+ * @private
+ */
+goog.UID_PROPERTY_ = 'closure_uid_' + ((Math.random() * 1e9) >>> 0);
+
+
+/**
+ * Counter for UID.
+ * @type {number}
+ * @private
+ */
+goog.uidCounter_ = 0;
+
+
+/**
+ * Adds a hash code field to an object. The hash code is unique for the
+ * given object.
+ * @param {Object} obj The object to get the hash code for.
+ * @return {number} The hash code for the object.
+ * @deprecated Use goog.getUid instead.
+ */
+goog.getHashCode = goog.getUid;
+
+
+/**
+ * Removes the hash code field from an object.
+ * @param {Object} obj The object to remove the field from.
+ * @deprecated Use goog.removeUid instead.
+ */
+goog.removeHashCode = goog.removeUid;
+
+
+/**
+ * Clones a value. The input may be an Object, Array, or basic type. Objects and
+ * arrays will be cloned recursively.
+ *
+ * WARNINGS:
+ * <code>goog.cloneObject</code> does not detect reference loops. Objects that
+ * refer to themselves will cause infinite recursion.
+ *
+ * <code>goog.cloneObject</code> is unaware of unique identifiers, and copies
+ * UIDs created by <code>getUid</code> into cloned results.
+ *
+ * @param {*} obj The value to clone.
+ * @return {*} A clone of the input value.
+ * @deprecated goog.cloneObject is unsafe. Prefer the goog.object methods.
+ */
+goog.cloneObject = function(obj) {
+ var type = goog.typeOf(obj);
+ if (type == 'object' || type == 'array') {
+ if (obj.clone) {
+ return obj.clone();
+ }
+ var clone = type == 'array' ? [] : {};
+ for (var key in obj) {
+ clone[key] = goog.cloneObject(obj[key]);
+ }
+ return clone;
+ }
+
+ return obj;
+};
+
+
+/**
+ * A native implementation of goog.bind.
+ * @param {Function} fn A function to partially apply.
+ * @param {Object|undefined} selfObj Specifies the object which this should
+ * point to when the function is run.
+ * @param {...*} var_args Additional arguments that are partially applied to the
+ * function.
+ * @return {!Function} A partially-applied form of the function bind() was
+ * invoked as a method of.
+ * @private
+ * @suppress {deprecated} The compiler thinks that Function.prototype.bind is
+ * deprecated because some people have declared a pure-JS version.
+ * Only the pure-JS version is truly deprecated.
+ */
+goog.bindNative_ = function(fn, selfObj, var_args) {
+ return /** @type {!Function} */ (fn.call.apply(fn.bind, arguments));
+};
+
+
+/**
+ * A pure-JS implementation of goog.bind.
+ * @param {Function} fn A function to partially apply.
+ * @param {Object|undefined} selfObj Specifies the object which this should
+ * point to when the function is run.
+ * @param {...*} var_args Additional arguments that are partially applied to the
+ * function.
+ * @return {!Function} A partially-applied form of the function bind() was
+ * invoked as a method of.
+ * @private
+ */
+goog.bindJs_ = function(fn, selfObj, var_args) {
+ if (!fn) {
+ throw new Error();
+ }
+
+ if (arguments.length > 2) {
+ var boundArgs = Array.prototype.slice.call(arguments, 2);
+ return function() {
+ // Prepend the bound arguments to the current arguments.
+ var newArgs = Array.prototype.slice.call(arguments);
+ Array.prototype.unshift.apply(newArgs, boundArgs);
+ return fn.apply(selfObj, newArgs);
+ };
+
+ } else {
+ return function() { return fn.apply(selfObj, arguments); };
+ }
+};
+
+
+/**
+ * Partially applies this function to a particular 'this object' and zero or
+ * more arguments. The result is a new function with some arguments of the first
+ * function pre-filled and the value of this 'pre-specified'.
+ *
+ * Remaining arguments specified at call-time are appended to the pre-specified
+ * ones.
+ *
+ * Also see: {@link #partial}.
+ *
+ * Usage:
+ * <pre>var barMethBound = goog.bind(myFunction, myObj, 'arg1', 'arg2');
+ * barMethBound('arg3', 'arg4');</pre>
+ *
+ * @param {?function(this:T, ...)} fn A function to partially apply.
+ * @param {T} selfObj Specifies the object which this should point to when the
+ * function is run.
+ * @param {...*} var_args Additional arguments that are partially applied to the
+ * function.
+ * @return {!Function} A partially-applied form of the function goog.bind() was
+ * invoked as a method of.
+ * @template T
+ * @suppress {deprecated} See above.
+ */
+goog.bind = function(fn, selfObj, var_args) {
+ // TODO(nicksantos): narrow the type signature.
+ if (Function.prototype.bind &&
+ // NOTE(nicksantos): Somebody pulled base.js into the default Chrome
+ // extension environment. This means that for Chrome extensions, they get
+ // the implementation of Function.prototype.bind that calls goog.bind
+ // instead of the native one. Even worse, we don't want to introduce a
+ // circular dependency between goog.bind and Function.prototype.bind, so
+ // we have to hack this to make sure it works correctly.
+ Function.prototype.bind.toString().indexOf('native code') != -1) {
+ goog.bind = goog.bindNative_;
+ } else {
+ goog.bind = goog.bindJs_;
+ }
+ return goog.bind.apply(null, arguments);
+};
+
+
+/**
+ * Like goog.bind(), except that a 'this object' is not required. Useful when
+ * the target function is already bound.
+ *
+ * Usage:
+ * var g = goog.partial(f, arg1, arg2);
+ * g(arg3, arg4);
+ *
+ * @param {Function} fn A function to partially apply.
+ * @param {...*} var_args Additional arguments that are partially applied to fn.
+ * @return {!Function} A partially-applied form of the function goog.partial()
+ * was invoked as a method of.
+ */
+goog.partial = function(fn, var_args) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ return function() {
+ // Clone the array (with slice()) and append additional arguments
+ // to the existing arguments.
+ var newArgs = args.slice();
+ newArgs.push.apply(newArgs, arguments);
+ return fn.apply(this, newArgs);
+ };
+};
+
+
+/**
+ * Copies all the members of a source object to a target object. This method
+ * does not work on all browsers for all objects that contain keys such as
+ * toString or hasOwnProperty. Use goog.object.extend for this purpose.
+ * @param {Object} target Target.
+ * @param {Object} source Source.
+ */
+goog.mixin = function(target, source) {
+ for (var x in source) {
+ target[x] = source[x];
+ }
+
+ // For IE7 or lower, the for-in-loop does not contain any properties that are
+ // not enumerable on the prototype object (for example, isPrototypeOf from
+ // Object.prototype) but also it will not include 'replace' on objects that
+ // extend String and change 'replace' (not that it is common for anyone to
+ // extend anything except Object).
+};
+
+
+/**
+ * @return {number} An integer value representing the number of milliseconds
+ * between midnight, January 1, 1970 and the current time.
+ */
+goog.now = (goog.TRUSTED_SITE && Date.now) || (function() {
+ // Unary plus operator converts its operand to a number which in
+ // the case of
+ // a date is done by calling getTime().
+ return +new Date();
+ });
+
+
+/**
+ * Evals JavaScript in the global scope. In IE this uses execScript, other
+ * browsers use goog.global.eval. If goog.global.eval does not evaluate in the
+ * global scope (for example, in Safari), appends a script tag instead.
+ * Throws an exception if neither execScript or eval is defined.
+ * @param {string} script JavaScript string.
+ */
+goog.globalEval = function(script) {
+ if (goog.global.execScript) {
+ goog.global.execScript(script, 'JavaScript');
+ } else if (goog.global.eval) {
+ // Test to see if eval works
+ if (goog.evalWorksForGlobals_ == null) {
+ goog.global.eval('var _evalTest_ = 1;');
+ if (typeof goog.global['_evalTest_'] != 'undefined') {
+ try {
+ delete goog.global['_evalTest_'];
+ } catch (ignore) {
+ // Microsoft edge fails the deletion above in strict mode.
+ }
+ goog.evalWorksForGlobals_ = true;
+ } else {
+ goog.evalWorksForGlobals_ = false;
+ }
+ }
+
+ if (goog.evalWorksForGlobals_) {
+ goog.global.eval(script);
+ } else {
+ /** @type {Document} */
+ var doc = goog.global.document;
+ var scriptElt =
+ /** @type {!HTMLScriptElement} */ (doc.createElement('SCRIPT'));
+ scriptElt.type = 'text/javascript';
+ scriptElt.defer = false;
+ // Note(user): can't use .innerHTML since "t('<test>')" will fail and
+ // .text doesn't work in Safari 2. Therefore we append a text node.
+ scriptElt.appendChild(doc.createTextNode(script));
+ doc.body.appendChild(scriptElt);
+ doc.body.removeChild(scriptElt);
+ }
+ } else {
+ throw Error('goog.globalEval not available');
+ }
+};
+
+
+/**
+ * Indicates whether or not we can call 'eval' directly to eval code in the
+ * global scope. Set to a Boolean by the first call to goog.globalEval (which
+ * empirically tests whether eval works for globals). @see goog.globalEval
+ * @type {?boolean}
+ * @private
+ */
+goog.evalWorksForGlobals_ = null;
+
+
+/**
+ * Optional map of CSS class names to obfuscated names used with
+ * goog.getCssName().
+ * @private {!Object<string, string>|undefined}
+ * @see goog.setCssNameMapping
+ */
+goog.cssNameMapping_;
+
+
+/**
+ * Optional obfuscation style for CSS class names. Should be set to either
+ * 'BY_WHOLE' or 'BY_PART' if defined.
+ * @type {string|undefined}
+ * @private
+ * @see goog.setCssNameMapping
+ */
+goog.cssNameMappingStyle_;
+
+
+/**
+ * Handles strings that are intended to be used as CSS class names.
+ *
+ * This function works in tandem with @see goog.setCssNameMapping.
+ *
+ * Without any mapping set, the arguments are simple joined with a hyphen and
+ * passed through unaltered.
+ *
+ * When there is a mapping, there are two possible styles in which these
+ * mappings are used. In the BY_PART style, each part (i.e. in between hyphens)
+ * of the passed in css name is rewritten according to the map. In the BY_WHOLE
+ * style, the full css name is looked up in the map directly. If a rewrite is
+ * not specified by the map, the compiler will output a warning.
+ *
+ * When the mapping is passed to the compiler, it will replace calls to
+ * goog.getCssName with the strings from the mapping, e.g.
+ * var x = goog.getCssName('foo');
+ * var y = goog.getCssName(this.baseClass, 'active');
+ * becomes:
+ * var x = 'foo';
+ * var y = this.baseClass + '-active';
+ *
+ * If one argument is passed it will be processed, if two are passed only the
+ * modifier will be processed, as it is assumed the first argument was generated
+ * as a result of calling goog.getCssName.
+ *
+ * @param {string} className The class name.
+ * @param {string=} opt_modifier A modifier to be appended to the class name.
+ * @return {string} The class name or the concatenation of the class name and
+ * the modifier.
+ */
+goog.getCssName = function(className, opt_modifier) {
+ var getMapping = function(cssName) {
+ return goog.cssNameMapping_[cssName] || cssName;
+ };
+
+ var renameByParts = function(cssName) {
+ // Remap all the parts individually.
+ var parts = cssName.split('-');
+ var mapped = [];
+ for (var i = 0; i < parts.length; i++) {
+ mapped.push(getMapping(parts[i]));
+ }
+ return mapped.join('-');
+ };
+
+ var rename;
+ if (goog.cssNameMapping_) {
+ rename =
+ goog.cssNameMappingStyle_ == 'BY_WHOLE' ? getMapping : renameByParts;
+ } else {
+ rename = function(a) { return a; };
+ }
+
+ if (opt_modifier) {
+ return className + '-' + rename(opt_modifier);
+ } else {
+ return rename(className);
+ }
+};
+
+
+/**
+ * Sets the map to check when returning a value from goog.getCssName(). Example:
+ * <pre>
+ * goog.setCssNameMapping({
+ * "goog": "a",
+ * "disabled": "b",
+ * });
+ *
+ * var x = goog.getCssName('goog');
+ * // The following evaluates to: "a a-b".
+ * goog.getCssName('goog') + ' ' + goog.getCssName(x, 'disabled')
+ * </pre>
+ * When declared as a map of string literals to string literals, the JSCompiler
+ * will replace all calls to goog.getCssName() using the supplied map if the
+ * --process_closure_primitives flag is set.
+ *
+ * @param {!Object} mapping A map of strings to strings where keys are possible
+ * arguments to goog.getCssName() and values are the corresponding values
+ * that should be returned.
+ * @param {string=} opt_style The style of css name mapping. There are two valid
+ * options: 'BY_PART', and 'BY_WHOLE'.
+ * @see goog.getCssName for a description.
+ */
+goog.setCssNameMapping = function(mapping, opt_style) {
+ goog.cssNameMapping_ = mapping;
+ goog.cssNameMappingStyle_ = opt_style;
+};
+
+
+/**
+ * To use CSS renaming in compiled mode, one of the input files should have a
+ * call to goog.setCssNameMapping() with an object literal that the JSCompiler
+ * can extract and use to replace all calls to goog.getCssName(). In uncompiled
+ * mode, JavaScript code should be loaded before this base.js file that declares
+ * a global variable, CLOSURE_CSS_NAME_MAPPING, which is used below. This is
+ * to ensure that the mapping is loaded before any calls to goog.getCssName()
+ * are made in uncompiled mode.
+ *
+ * A hook for overriding the CSS name mapping.
+ * @type {!Object<string, string>|undefined}
+ */
+goog.global.CLOSURE_CSS_NAME_MAPPING;
+
+
+if (!COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING) {
+ // This does not call goog.setCssNameMapping() because the JSCompiler
+ // requires that goog.setCssNameMapping() be called with an object literal.
+ goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING;
+}
+
+
+/**
+ * Gets a localized message.
+ *
+ * This function is a compiler primitive. If you give the compiler a localized
+ * message bundle, it will replace the string at compile-time with a localized
+ * version, and expand goog.getMsg call to a concatenated string.
+ *
+ * Messages must be initialized in the form:
+ * <code>
+ * var MSG_NAME = goog.getMsg('Hello {$placeholder}', {'placeholder': 'world'});
+ * </code>
+ *
+ * This function produces a string which should be treated as plain text. Use
+ * {@link goog.html.SafeHtmlFormatter} in conjunction with goog.getMsg to
+ * produce SafeHtml.
+ *
+ * @param {string} str Translatable string, places holders in the form {$foo}.
+ * @param {Object<string, string>=} opt_values Maps place holder name to value.
+ * @return {string} message with placeholders filled.
+ */
+goog.getMsg = function(str, opt_values) {
+ if (opt_values) {
+ str = str.replace(/\{\$([^}]+)}/g, function(match, key) {
+ return (opt_values != null && key in opt_values) ? opt_values[key] :
+ match;
+ });
+ }
+ return str;
+};
+
+
+/**
+ * Gets a localized message. If the message does not have a translation, gives a
+ * fallback message.
+ *
+ * This is useful when introducing a new message that has not yet been
+ * translated into all languages.
+ *
+ * This function is a compiler primitive. Must be used in the form:
+ * <code>var x = goog.getMsgWithFallback(MSG_A, MSG_B);</code>
+ * where MSG_A and MSG_B were initialized with goog.getMsg.
+ *
+ * @param {string} a The preferred message.
+ * @param {string} b The fallback message.
+ * @return {string} The best translated message.
+ */
+goog.getMsgWithFallback = function(a, b) {
+ return a;
+};
+
+
+/**
+ * Exposes an unobfuscated global namespace path for the given object.
+ * Note that fields of the exported object *will* be obfuscated, unless they are
+ * exported in turn via this function or goog.exportProperty.
+ *
+ * Also handy for making public items that are defined in anonymous closures.
+ *
+ * ex. goog.exportSymbol('public.path.Foo', Foo);
+ *
+ * ex. goog.exportSymbol('public.path.Foo.staticFunction', Foo.staticFunction);
+ * public.path.Foo.staticFunction();
+ *
+ * ex. goog.exportSymbol('public.path.Foo.prototype.myMethod',
+ * Foo.prototype.myMethod);
+ * new public.path.Foo().myMethod();
+ *
+ * @param {string} publicPath Unobfuscated name to export.
+ * @param {*} object Object the name should point to.
+ * @param {Object=} opt_objectToExportTo The object to add the path to; default
+ * is goog.global.
+ */
+goog.exportSymbol = function(publicPath, object, opt_objectToExportTo) {
+ goog.exportPath_(publicPath, object, opt_objectToExportTo);
+};
+
+
+/**
+ * Exports a property unobfuscated into the object's namespace.
+ * ex. goog.exportProperty(Foo, 'staticFunction', Foo.staticFunction);
+ * ex. goog.exportProperty(Foo.prototype, 'myMethod', Foo.prototype.myMethod);
+ * @param {Object} object Object whose static property is being exported.
+ * @param {string} publicName Unobfuscated name to export.
+ * @param {*} symbol Object the name should point to.
+ */
+goog.exportProperty = function(object, publicName, symbol) {
+ object[publicName] = symbol;
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * Usage:
+ * <pre>
+ * function ParentClass(a, b) { }
+ * ParentClass.prototype.foo = function(a) { };
+ *
+ * function ChildClass(a, b, c) {
+ * ChildClass.base(this, 'constructor', a, b);
+ * }
+ * goog.inherits(ChildClass, ParentClass);
+ *
+ * var child = new ChildClass('a', 'b', 'see');
+ * child.foo(); // This works.
+ * </pre>
+ *
+ * @param {!Function} childCtor Child class.
+ * @param {!Function} parentCtor Parent class.
+ */
+goog.inherits = function(childCtor, parentCtor) {
+ /** @constructor */
+ function tempCtor() {}
+ tempCtor.prototype = parentCtor.prototype;
+ childCtor.superClass_ = parentCtor.prototype;
+ childCtor.prototype = new tempCtor();
+ /** @override */
+ childCtor.prototype.constructor = childCtor;
+
+ /**
+ * Calls superclass constructor/method.
+ *
+ * This function is only available if you use goog.inherits to
+ * express inheritance relationships between classes.
+ *
+ * NOTE: This is a replacement for goog.base and for superClass_
+ * property defined in childCtor.
+ *
+ * @param {!Object} me Should always be "this".
+ * @param {string} methodName The method name to call. Calling
+ * superclass constructor can be done with the special string
+ * 'constructor'.
+ * @param {...*} var_args The arguments to pass to superclass
+ * method/constructor.
+ * @return {*} The return value of the superclass method/constructor.
+ */
+ childCtor.base = function(me, methodName, var_args) {
+ // Copying using loop to avoid deop due to passing arguments object to
+ // function. This is faster in many JS engines as of late 2014.
+ var args = new Array(arguments.length - 2);
+ for (var i = 2; i < arguments.length; i++) {
+ args[i - 2] = arguments[i];
+ }
+ return parentCtor.prototype[methodName].apply(me, args);
+ };
+};
+
+
+/**
+ * Call up to the superclass.
+ *
+ * If this is called from a constructor, then this calls the superclass
+ * constructor with arguments 1-N.
+ *
+ * If this is called from a prototype method, then you must pass the name of the
+ * method as the second argument to this function. If you do not, you will get a
+ * runtime error. This calls the superclass' method with arguments 2-N.
+ *
+ * This function only works if you use goog.inherits to express inheritance
+ * relationships between your classes.
+ *
+ * This function is a compiler primitive. At compile-time, the compiler will do
+ * macro expansion to remove a lot of the extra overhead that this function
+ * introduces. The compiler will also enforce a lot of the assumptions that this
+ * function makes, and treat it as a compiler error if you break them.
+ *
+ * @param {!Object} me Should always be "this".
+ * @param {*=} opt_methodName The method name if calling a super method.
+ * @param {...*} var_args The rest of the arguments.
+ * @return {*} The return value of the superclass method.
+ * @suppress {es5Strict} This method can not be used in strict mode, but
+ * all Closure Library consumers must depend on this file.
+ */
+goog.base = function(me, opt_methodName, var_args) {
+ var caller = arguments.callee.caller;
+
+ if (goog.STRICT_MODE_COMPATIBLE || (goog.DEBUG && !caller)) {
+ throw Error(
+ 'arguments.caller not defined. goog.base() cannot be used ' +
+ 'with strict mode code. See ' +
+ 'http://www.ecma-international.org/ecma-262/5.1/#sec-C');
+ }
+
+ if (caller.superClass_) {
+ // Copying using loop to avoid deop due to passing arguments object to
+ // function. This is faster in many JS engines as of late 2014.
+ var ctorArgs = new Array(arguments.length - 1);
+ for (var i = 1; i < arguments.length; i++) {
+ ctorArgs[i - 1] = arguments[i];
+ }
+ // This is a constructor. Call the superclass constructor.
+ return caller.superClass_.constructor.apply(me, ctorArgs);
+ }
+
+ // Copying using loop to avoid deop due to passing arguments object to
+ // function. This is faster in many JS engines as of late 2014.
+ var args = new Array(arguments.length - 2);
+ for (var i = 2; i < arguments.length; i++) {
+ args[i - 2] = arguments[i];
+ }
+ var foundCaller = false;
+ for (var ctor = me.constructor; ctor;
+ ctor = ctor.superClass_ && ctor.superClass_.constructor) {
+ if (ctor.prototype[opt_methodName] === caller) {
+ foundCaller = true;
+ } else if (foundCaller) {
+ return ctor.prototype[opt_methodName].apply(me, args);
+ }
+ }
+
+ // If we did not find the caller in the prototype chain, then one of two
+ // things happened:
+ // 1) The caller is an instance method.
+ // 2) This method was not called by the right caller.
+ if (me[opt_methodName] === caller) {
+ return me.constructor.prototype[opt_methodName].apply(me, args);
+ } else {
+ throw Error(
+ 'goog.base called from a method of one name ' +
+ 'to a method of a different name');
+ }
+};
+
+
+/**
+ * Allow for aliasing within scope functions. This function exists for
+ * uncompiled code - in compiled code the calls will be inlined and the aliases
+ * applied. In uncompiled code the function is simply run since the aliases as
+ * written are valid JavaScript.
+ *
+ *
+ * @param {function()} fn Function to call. This function can contain aliases
+ * to namespaces (e.g. "var dom = goog.dom") or classes
+ * (e.g. "var Timer = goog.Timer").
+ */
+goog.scope = function(fn) {
+ if (goog.isInModuleLoader_()) {
+ throw Error('goog.scope is not supported within a goog.module.');
+ }
+ fn.call(goog.global);
+};
+
+
+/*
+ * To support uncompiled, strict mode bundles that use eval to divide source
+ * like so:
+ * eval('someSource;//# sourceUrl sourcefile.js');
+ * We need to export the globally defined symbols "goog" and "COMPILED".
+ * Exporting "goog" breaks the compiler optimizations, so we required that
+ * be defined externally.
+ * NOTE: We don't use goog.exportSymbol here because we don't want to trigger
+ * extern generation when that compiler option is enabled.
+ */
+if (!COMPILED) {
+ goog.global['COMPILED'] = COMPILED;
+}
+
+
+//==============================================================================
+// goog.defineClass implementation
+//==============================================================================
+
+
+/**
+ * Creates a restricted form of a Closure "class":
+ * - from the compiler's perspective, the instance returned from the
+ * constructor is sealed (no new properties may be added). This enables
+ * better checks.
+ * - the compiler will rewrite this definition to a form that is optimal
+ * for type checking and optimization (initially this will be a more
+ * traditional form).
+ *
+ * @param {Function} superClass The superclass, Object or null.
+ * @param {goog.defineClass.ClassDescriptor} def
+ * An object literal describing
+ * the class. It may have the following properties:
+ * "constructor": the constructor function
+ * "statics": an object literal containing methods to add to the constructor
+ * as "static" methods or a function that will receive the constructor
+ * function as its only parameter to which static properties can
+ * be added.
+ * all other properties are added to the prototype.
+ * @return {!Function} The class constructor.
+ */
+goog.defineClass = function(superClass, def) {
+ // TODO(johnlenz): consider making the superClass an optional parameter.
+ var constructor = def.constructor;
+ var statics = def.statics;
+ // Wrap the constructor prior to setting up the prototype and static methods.
+ if (!constructor || constructor == Object.prototype.constructor) {
+ constructor = function() {
+ throw Error('cannot instantiate an interface (no constructor defined).');
+ };
+ }
+
+ var cls = goog.defineClass.createSealingConstructor_(constructor, superClass);
+ if (superClass) {
+ goog.inherits(cls, superClass);
+ }
+
+ // Remove all the properties that should not be copied to the prototype.
+ delete def.constructor;
+ delete def.statics;
+
+ goog.defineClass.applyProperties_(cls.prototype, def);
+ if (statics != null) {
+ if (statics instanceof Function) {
+ statics(cls);
+ } else {
+ goog.defineClass.applyProperties_(cls, statics);
+ }
+ }
+
+ return cls;
+};
+
+
+/**
+ * @typedef {{
+ * constructor: (!Function|undefined),
+ * statics: (Object|undefined|function(Function):void)
+ * }}
+ * @suppress {missingProvide}
+ */
+goog.defineClass.ClassDescriptor;
+
+
+/**
+ * @define {boolean} Whether the instances returned by goog.defineClass should
+ * be sealed when possible.
+ *
+ * When sealing is disabled the constructor function will not be wrapped by
+ * goog.defineClass, making it incompatible with ES6 class methods.
+ */
+goog.define('goog.defineClass.SEAL_CLASS_INSTANCES', goog.DEBUG);
+
+
+/**
+ * If goog.defineClass.SEAL_CLASS_INSTANCES is enabled and Object.seal is
+ * defined, this function will wrap the constructor in a function that seals the
+ * results of the provided constructor function.
+ *
+ * @param {!Function} ctr The constructor whose results maybe be sealed.
+ * @param {Function} superClass The superclass constructor.
+ * @return {!Function} The replacement constructor.
+ * @private
+ */
+goog.defineClass.createSealingConstructor_ = function(ctr, superClass) {
+ if (!goog.defineClass.SEAL_CLASS_INSTANCES) {
+ // Do now wrap the constructor when sealing is disabled. Angular code
+ // depends on this for injection to work properly.
+ return ctr;
+ }
+
+ // Compute whether the constructor is sealable at definition time, rather
+ // than when the instance is being constructed.
+ var superclassSealable = !goog.defineClass.isUnsealable_(superClass);
+
+ /**
+ * @this {Object}
+ * @return {?}
+ */
+ var wrappedCtr = function() {
+ // Don't seal an instance of a subclass when it calls the constructor of
+ // its super class as there is most likely still setup to do.
+ var instance = ctr.apply(this, arguments) || this;
+ instance[goog.UID_PROPERTY_] = instance[goog.UID_PROPERTY_];
+
+ if (this.constructor === wrappedCtr && superclassSealable &&
+ Object.seal instanceof Function) {
+ Object.seal(instance);
+ }
+ return instance;
+ };
+
+ return wrappedCtr;
+};
+
+
+/**
+ * @param {Function} ctr The constructor to test.
+ * @returns {boolean} Whether the constructor has been tagged as unsealable
+ * using goog.tagUnsealableClass.
+ * @private
+ */
+goog.defineClass.isUnsealable_ = function(ctr) {
+ return ctr && ctr.prototype &&
+ ctr.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_];
+};
+
+
+// TODO(johnlenz): share these values with the goog.object
+/**
+ * The names of the fields that are defined on Object.prototype.
+ * @type {!Array<string>}
+ * @private
+ * @const
+ */
+goog.defineClass.OBJECT_PROTOTYPE_FIELDS_ = [
+ 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
+ 'toLocaleString', 'toString', 'valueOf'
+];
+
+
+// TODO(johnlenz): share this function with the goog.object
+/**
+ * @param {!Object} target The object to add properties to.
+ * @param {!Object} source The object to copy properties from.
+ * @private
+ */
+goog.defineClass.applyProperties_ = function(target, source) {
+ // TODO(johnlenz): update this to support ES5 getters/setters
+
+ var key;
+ for (key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+
+ // For IE the for-in-loop does not contain any properties that are not
+ // enumerable on the prototype object (for example isPrototypeOf from
+ // Object.prototype) and it will also not include 'replace' on objects that
+ // extend String and change 'replace' (not that it is common for anyone to
+ // extend anything except Object).
+ for (var i = 0; i < goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length; i++) {
+ key = goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[i];
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+};
+
+
+/**
+ * Sealing classes breaks the older idiom of assigning properties on the
+ * prototype rather than in the constructor. As such, goog.defineClass
+ * must not seal subclasses of these old-style classes until they are fixed.
+ * Until then, this marks a class as "broken", instructing defineClass
+ * not to seal subclasses.
+ * @param {!Function} ctr The legacy constructor to tag as unsealable.
+ */
+goog.tagUnsealableClass = function(ctr) {
+ if (!COMPILED && goog.defineClass.SEAL_CLASS_INSTANCES) {
+ ctr.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_] = true;
+ }
+};
+
+
+/**
+ * Name for unsealable tag property.
+ * @const @private {string}
+ */
+goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_ = 'goog_defineClass_legacy_unsealable';
diff --git a/src/http/static/viz/1/goog/debug/entrypointregistry.js b/src/http/static/viz/1/goog/debug/entrypointregistry.js
new file mode 100644
index 0000000..336e146
--- /dev/null
+++ b/src/http/static/viz/1/goog/debug/entrypointregistry.js
@@ -0,0 +1,159 @@
+// Copyright 2010 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A global registry for entry points into a program,
+ * so that they can be instrumented. Each module should register their
+ * entry points with this registry. Designed to be compiled out
+ * if no instrumentation is requested.
+ *
+ * Entry points may be registered before or after a call to
+ * goog.debug.entryPointRegistry.monitorAll. If an entry point is registered
+ * later, the existing monitor will instrument the new entry point.
+ *
+ * @author nicksantos@google.com (Nick Santos)
+ */
+
+goog.provide('goog.debug.EntryPointMonitor');
+goog.provide('goog.debug.entryPointRegistry');
+
+goog.require('goog.asserts');
+
+
+
+/**
+ * @interface
+ */
+goog.debug.EntryPointMonitor = function() {};
+
+
+/**
+ * Instruments a function.
+ *
+ * @param {!Function} fn A function to instrument.
+ * @return {!Function} The instrumented function.
+ */
+goog.debug.EntryPointMonitor.prototype.wrap;
+
+
+/**
+ * Try to remove an instrumentation wrapper created by this monitor.
+ * If the function passed to unwrap is not a wrapper created by this
+ * monitor, then we will do nothing.
+ *
+ * Notice that some wrappers may not be unwrappable. For example, if other
+ * monitors have applied their own wrappers, then it will be impossible to
+ * unwrap them because their wrappers will have captured our wrapper.
+ *
+ * So it is important that entry points are unwrapped in the reverse
+ * order that they were wrapped.
+ *
+ * @param {!Function} fn A function to unwrap.
+ * @return {!Function} The unwrapped function, or {@code fn} if it was not
+ * a wrapped function created by this monitor.
+ */
+goog.debug.EntryPointMonitor.prototype.unwrap;
+
+
+/**
+ * An array of entry point callbacks.
+ * @type {!Array<function(!Function)>}
+ * @private
+ */
+goog.debug.entryPointRegistry.refList_ = [];
+
+
+/**
+ * Monitors that should wrap all the entry points.
+ * @type {!Array<!goog.debug.EntryPointMonitor>}
+ * @private
+ */
+goog.debug.entryPointRegistry.monitors_ = [];
+
+
+/**
+ * Whether goog.debug.entryPointRegistry.monitorAll has ever been called.
+ * Checking this allows the compiler to optimize out the registrations.
+ * @type {boolean}
+ * @private
+ */
+goog.debug.entryPointRegistry.monitorsMayExist_ = false;
+
+
+/**
+ * Register an entry point with this module.
+ *
+ * The entry point will be instrumented when a monitor is passed to
+ * goog.debug.entryPointRegistry.monitorAll. If this has already occurred, the
+ * entry point is instrumented immediately.
+ *
+ * @param {function(!Function)} callback A callback function which is called
+ * with a transforming function to instrument the entry point. The callback
+ * is responsible for wrapping the relevant entry point with the
+ * transforming function.
+ */
+goog.debug.entryPointRegistry.register = function(callback) {
+ // Don't use push(), so that this can be compiled out.
+ goog.debug.entryPointRegistry
+ .refList_[goog.debug.entryPointRegistry.refList_.length] = callback;
+ // If no one calls monitorAll, this can be compiled out.
+ if (goog.debug.entryPointRegistry.monitorsMayExist_) {
+ var monitors = goog.debug.entryPointRegistry.monitors_;
+ for (var i = 0; i < monitors.length; i++) {
+ callback(goog.bind(monitors[i].wrap, monitors[i]));
+ }
+ }
+};
+
+
+/**
+ * Configures a monitor to wrap all entry points.
+ *
+ * Entry points that have already been registered are immediately wrapped by
+ * the monitor. When an entry point is registered in the future, it will also
+ * be wrapped by the monitor when it is registered.
+ *
+ * @param {!goog.debug.EntryPointMonitor} monitor An entry point monitor.
+ */
+goog.debug.entryPointRegistry.monitorAll = function(monitor) {
+ goog.debug.entryPointRegistry.monitorsMayExist_ = true;
+ var transformer = goog.bind(monitor.wrap, monitor);
+ for (var i = 0; i < goog.debug.entryPointRegistry.refList_.length; i++) {
+ goog.debug.entryPointRegistry.refList_[i](transformer);
+ }
+ goog.debug.entryPointRegistry.monitors_.push(monitor);
+};
+
+
+/**
+ * Try to unmonitor all the entry points that have already been registered. If
+ * an entry point is registered in the future, it will not be wrapped by the
+ * monitor when it is registered. Note that this may fail if the entry points
+ * have additional wrapping.
+ *
+ * @param {!goog.debug.EntryPointMonitor} monitor The last monitor to wrap
+ * the entry points.
+ * @throws {Error} If the monitor is not the most recently configured monitor.
+ */
+goog.debug.entryPointRegistry.unmonitorAllIfPossible = function(monitor) {
+ var monitors = goog.debug.entryPointRegistry.monitors_;
+ goog.asserts.assert(
+ monitor == monitors[monitors.length - 1],
+ 'Only the most recent monitor can be unwrapped.');
+ var transformer = goog.bind(monitor.unwrap, monitor);
+ for (var i = 0; i < goog.debug.entryPointRegistry.refList_.length; i++) {
+ goog.debug.entryPointRegistry.refList_[i](transformer);
+ }
+ monitors.length--;
+};
diff --git a/src/http/static/viz/1/goog/debug/error.js b/src/http/static/viz/1/goog/debug/error.js
new file mode 100644
index 0000000..5f1bd3e
--- /dev/null
+++ b/src/http/static/viz/1/goog/debug/error.js
@@ -0,0 +1,63 @@
+// Copyright 2009 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Provides a base class for custom Error objects such that the
+ * stack is correctly maintained.
+ *
+ * You should never need to throw goog.debug.Error(msg) directly, Error(msg) is
+ * sufficient.
+ *
+ */
+
+goog.provide('goog.debug.Error');
+
+
+
+/**
+ * Base class for custom error objects.
+ * @param {*=} opt_msg The message associated with the error.
+ * @constructor
+ * @extends {Error}
+ */
+goog.debug.Error = function(opt_msg) {
+
+ // Attempt to ensure there is a stack trace.
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, goog.debug.Error);
+ } else {
+ var stack = new Error().stack;
+ if (stack) {
+ this.stack = stack;
+ }
+ }
+
+ if (opt_msg) {
+ this.message = String(opt_msg);
+ }
+
+ /**
+ * Whether to report this error to the server. Setting this to false will
+ * cause the error reporter to not report the error back to the server,
+ * which can be useful if the client knows that the error has already been
+ * logged on the server.
+ * @type {boolean}
+ */
+ this.reportErrorToServer = true;
+};
+goog.inherits(goog.debug.Error, Error);
+
+
+/** @override */
+goog.debug.Error.prototype.name = 'CustomError';
diff --git a/src/http/static/viz/1/goog/deps.js b/src/http/static/viz/1/goog/deps.js
new file mode 100644
index 0000000..80936e8
--- /dev/null
+++ b/src/http/static/viz/1/goog/deps.js
@@ -0,0 +1,1508 @@
+// Copyright 2016 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// This file has been auto-generated by GenJsDeps, please do not edit.
+
+// Disable Clang formatter for this file.
+// See http://goo.gl/SdiwZH
+// clang-format off
+
+goog.addDependency('caja/string/html/htmlparser.js', ['goog.string.html', 'goog.string.html.HtmlParser', 'goog.string.html.HtmlParser.EFlags', 'goog.string.html.HtmlParser.Elements', 'goog.string.html.HtmlParser.Entities', 'goog.string.html.HtmlSaxHandler'], [], {});
+goog.addDependency('caja/string/html/htmlsanitizer.js', ['goog.string.html.HtmlSanitizer', 'goog.string.html.HtmlSanitizer.AttributeType', 'goog.string.html.HtmlSanitizer.Attributes', 'goog.string.html.htmlSanitize'], ['goog.string.StringBuffer', 'goog.string.html.HtmlParser', 'goog.string.html.HtmlSaxHandler'], {});
+goog.addDependency('dojo/dom/query.js', ['goog.dom.query'], ['goog.array', 'goog.dom', 'goog.functions', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('loremipsum/text/loremipsum.js', ['goog.text.LoremIpsum'], ['goog.array', 'goog.math', 'goog.string', 'goog.structs.Map', 'goog.structs.Set'], {});
+goog.addDependency('mochikit/async/deferred.js', ['goog.async.Deferred', 'goog.async.Deferred.AlreadyCalledError', 'goog.async.Deferred.CanceledError'], ['goog.Promise', 'goog.Thenable', 'goog.array', 'goog.asserts', 'goog.debug.Error'], {});
+goog.addDependency('mochikit/async/deferredlist.js', ['goog.async.DeferredList'], ['goog.async.Deferred'], {});
+goog.addDependency('osapi/osapi.js', ['goog.osapi'], [], {});
+goog.addDependency('svgpan/svgpan.js', ['svgpan.SvgPan'], ['goog.Disposable', 'goog.events', 'goog.events.EventType', 'goog.events.MouseWheelHandler'], {});
+goog.addDependency('a11y/aria/announcer.js', ['goog.a11y.aria.Announcer'], ['goog.Disposable', 'goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.object'], {});
+goog.addDependency('a11y/aria/announcer_test.js', ['goog.a11y.aria.AnnouncerTest'], ['goog.a11y.aria', 'goog.a11y.aria.Announcer', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.iframe', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('a11y/aria/aria.js', ['goog.a11y.aria'], ['goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.a11y.aria.datatables', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.object', 'goog.string'], {});
+goog.addDependency('a11y/aria/aria_test.js', ['goog.a11y.ariaTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit'], {});
+goog.addDependency('a11y/aria/attributes.js', ['goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.CheckedValues', 'goog.a11y.aria.DropEffectValues', 'goog.a11y.aria.ExpandedValues', 'goog.a11y.aria.GrabbedValues', 'goog.a11y.aria.InvalidValues', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.OrientationValues', 'goog.a11y.aria.PressedValues', 'goog.a11y.aria.RelevantValues', 'goog.a11y.aria.SelectedValues', 'goog.a11y.aria.SortValues', 'goog.a11y.aria.State'], [], {});
+goog.addDependency('a11y/aria/datatables.js', ['goog.a11y.aria.datatables'], ['goog.a11y.aria.State', 'goog.object'], {});
+goog.addDependency('a11y/aria/roles.js', ['goog.a11y.aria.Role'], [], {});
+goog.addDependency('array/array.js', ['goog.array'], ['goog.asserts'], {});
+goog.addDependency('array/array_test.js', ['goog.arrayTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('asserts/asserts.js', ['goog.asserts', 'goog.asserts.AssertionError'], ['goog.debug.Error', 'goog.dom.NodeType', 'goog.string'], {});
+goog.addDependency('asserts/asserts_test.js', ['goog.assertsTest'], ['goog.asserts', 'goog.asserts.AssertionError', 'goog.dom', 'goog.dom.TagName', 'goog.string', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('async/animationdelay.js', ['goog.async.AnimationDelay'], ['goog.Disposable', 'goog.events', 'goog.functions'], {});
+goog.addDependency('async/animationdelay_test.js', ['goog.async.AnimationDelayTest'], ['goog.Timer', 'goog.async.AnimationDelay', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('async/conditionaldelay.js', ['goog.async.ConditionalDelay'], ['goog.Disposable', 'goog.async.Delay'], {});
+goog.addDependency('async/conditionaldelay_test.js', ['goog.async.ConditionalDelayTest'], ['goog.async.ConditionalDelay', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('async/debouncer.js', ['goog.async.Debouncer'], ['goog.Disposable', 'goog.Timer'], {});
+goog.addDependency('async/debouncer_test.js', ['goog.async.DebouncerTest'], ['goog.array', 'goog.async.Debouncer', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('async/delay.js', ['goog.Delay', 'goog.async.Delay'], ['goog.Disposable', 'goog.Timer'], {});
+goog.addDependency('async/delay_test.js', ['goog.async.DelayTest'], ['goog.async.Delay', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('async/freelist.js', ['goog.async.FreeList'], [], {});
+goog.addDependency('async/freelist_test.js', ['goog.async.FreeListTest'], ['goog.async.FreeList', 'goog.testing.jsunit'], {});
+goog.addDependency('async/nexttick.js', ['goog.async.nextTick', 'goog.async.throwException'], ['goog.debug.entryPointRegistry', 'goog.dom.TagName', 'goog.functions', 'goog.labs.userAgent.browser', 'goog.labs.userAgent.engine'], {});
+goog.addDependency('async/nexttick_test.js', ['goog.async.nextTickTest'], ['goog.Promise', 'goog.Timer', 'goog.async.nextTick', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.dom', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('async/run.js', ['goog.async.run'], ['goog.async.WorkQueue', 'goog.async.nextTick', 'goog.async.throwException'], {});
+goog.addDependency('async/run_test.js', ['goog.async.runTest'], ['goog.async.run', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('async/throttle.js', ['goog.Throttle', 'goog.async.Throttle'], ['goog.Disposable', 'goog.Timer'], {});
+goog.addDependency('async/throttle_test.js', ['goog.async.ThrottleTest'], ['goog.async.Throttle', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('async/workqueue.js', ['goog.async.WorkItem', 'goog.async.WorkQueue'], ['goog.asserts', 'goog.async.FreeList'], {});
+goog.addDependency('async/workqueue_test.js', ['goog.async.WorkQueueTest'], ['goog.async.WorkQueue', 'goog.testing.jsunit'], {});
+goog.addDependency('base.js', ['goog'], [], {});
+goog.addDependency('base_module_test.js', ['goog.baseModuleTest'], ['goog.Timer', 'goog.test_module', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('base_test.js', ['an.existing.path', 'dup.base', 'far.out', 'goog.baseTest', 'goog.explicit', 'goog.implicit.explicit', 'goog.test', 'goog.test.name', 'goog.test.name.space', 'goog.xy', 'goog.xy.z', 'ns', 'testDep.bar'], ['goog.Promise', 'goog.Timer', 'goog.dom.TagName', 'goog.functions', 'goog.object', 'goog.test_module', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('color/alpha.js', ['goog.color.alpha'], ['goog.color'], {});
+goog.addDependency('color/alpha_test.js', ['goog.color.alphaTest'], ['goog.array', 'goog.color', 'goog.color.alpha', 'goog.testing.jsunit'], {});
+goog.addDependency('color/color.js', ['goog.color', 'goog.color.Hsl', 'goog.color.Hsv', 'goog.color.Rgb'], ['goog.color.names', 'goog.math'], {});
+goog.addDependency('color/color_test.js', ['goog.colorTest'], ['goog.array', 'goog.color', 'goog.color.names', 'goog.testing.jsunit'], {});
+goog.addDependency('color/names.js', ['goog.color.names'], [], {});
+goog.addDependency('crypt/aes.js', ['goog.crypt.Aes'], ['goog.asserts', 'goog.crypt.BlockCipher'], {});
+goog.addDependency('crypt/aes_test.js', ['goog.crypt.AesTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/arc4.js', ['goog.crypt.Arc4'], ['goog.asserts'], {});
+goog.addDependency('crypt/arc4_test.js', ['goog.crypt.Arc4Test'], ['goog.array', 'goog.crypt.Arc4', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/base64.js', ['goog.crypt.base64'], ['goog.asserts', 'goog.crypt', 'goog.string', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('crypt/base64_test.js', ['goog.crypt.base64Test'], ['goog.crypt', 'goog.crypt.base64', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/basen.js', ['goog.crypt.baseN'], [], {});
+goog.addDependency('crypt/basen_test.js', ['goog.crypt.baseNTest'], ['goog.crypt.baseN', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/blobhasher.js', ['goog.crypt.BlobHasher', 'goog.crypt.BlobHasher.EventType'], ['goog.asserts', 'goog.events.EventTarget', 'goog.fs', 'goog.log'], {});
+goog.addDependency('crypt/blobhasher_test.js', ['goog.crypt.BlobHasherTest'], ['goog.crypt', 'goog.crypt.BlobHasher', 'goog.crypt.Md5', 'goog.events', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/blockcipher.js', ['goog.crypt.BlockCipher'], [], {});
+goog.addDependency('crypt/bytestring_perf.js', ['goog.crypt.byteArrayToStringPerf'], ['goog.array', 'goog.dom', 'goog.testing.PerformanceTable'], {});
+goog.addDependency('crypt/cbc.js', ['goog.crypt.Cbc'], ['goog.array', 'goog.asserts', 'goog.crypt'], {});
+goog.addDependency('crypt/cbc_test.js', ['goog.crypt.CbcTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.crypt.Cbc', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/crypt.js', ['goog.crypt'], ['goog.array', 'goog.asserts'], {});
+goog.addDependency('crypt/crypt_test.js', ['goog.cryptTest'], ['goog.crypt', 'goog.string', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/ctr.js', ['goog.crypt.Ctr'], ['goog.array', 'goog.asserts', 'goog.crypt'], {});
+goog.addDependency('crypt/ctr_test.js', ['goog.crypt.CtrTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.crypt.Ctr', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/hash.js', ['goog.crypt.Hash'], [], {});
+goog.addDependency('crypt/hash32.js', ['goog.crypt.hash32'], ['goog.crypt'], {});
+goog.addDependency('crypt/hash32_test.js', ['goog.crypt.hash32Test'], ['goog.crypt.hash32', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/hashtester.js', ['goog.crypt.hashTester'], ['goog.array', 'goog.crypt', 'goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTable', 'goog.testing.PseudoRandom', 'goog.testing.asserts'], {});
+goog.addDependency('crypt/hmac.js', ['goog.crypt.Hmac'], ['goog.crypt.Hash'], {});
+goog.addDependency('crypt/hmac_test.js', ['goog.crypt.HmacTest'], ['goog.crypt.Hmac', 'goog.crypt.Sha1', 'goog.crypt.hashTester', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/md5.js', ['goog.crypt.Md5'], ['goog.crypt.Hash'], {});
+goog.addDependency('crypt/md5_test.js', ['goog.crypt.Md5Test'], ['goog.crypt', 'goog.crypt.Md5', 'goog.crypt.hashTester', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/pbkdf2.js', ['goog.crypt.pbkdf2'], ['goog.array', 'goog.asserts', 'goog.crypt', 'goog.crypt.Hmac', 'goog.crypt.Sha1'], {});
+goog.addDependency('crypt/pbkdf2_test.js', ['goog.crypt.pbkdf2Test'], ['goog.crypt', 'goog.crypt.pbkdf2', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('crypt/sha1.js', ['goog.crypt.Sha1'], ['goog.crypt.Hash'], {});
+goog.addDependency('crypt/sha1_test.js', ['goog.crypt.Sha1Test'], ['goog.crypt', 'goog.crypt.Sha1', 'goog.crypt.hashTester', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('crypt/sha2.js', ['goog.crypt.Sha2'], ['goog.array', 'goog.asserts', 'goog.crypt.Hash'], {});
+goog.addDependency('crypt/sha224.js', ['goog.crypt.Sha224'], ['goog.crypt.Sha2'], {});
+goog.addDependency('crypt/sha224_test.js', ['goog.crypt.Sha224Test'], ['goog.crypt', 'goog.crypt.Sha224', 'goog.crypt.hashTester', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/sha256.js', ['goog.crypt.Sha256'], ['goog.crypt.Sha2'], {});
+goog.addDependency('crypt/sha256_test.js', ['goog.crypt.Sha256Test'], ['goog.crypt', 'goog.crypt.Sha256', 'goog.crypt.hashTester', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/sha2_64bit.js', ['goog.crypt.Sha2_64bit'], ['goog.array', 'goog.asserts', 'goog.crypt.Hash', 'goog.math.Long'], {});
+goog.addDependency('crypt/sha2_64bit_test.js', ['goog.crypt.Sha2_64bit_test'], ['goog.array', 'goog.crypt', 'goog.crypt.Sha384', 'goog.crypt.Sha512', 'goog.crypt.Sha512_256', 'goog.crypt.hashTester', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('crypt/sha384.js', ['goog.crypt.Sha384'], ['goog.crypt.Sha2_64bit'], {});
+goog.addDependency('crypt/sha512.js', ['goog.crypt.Sha512'], ['goog.crypt.Sha2_64bit'], {});
+goog.addDependency('crypt/sha512_256.js', ['goog.crypt.Sha512_256'], ['goog.crypt.Sha2_64bit'], {});
+goog.addDependency('cssom/cssom.js', ['goog.cssom', 'goog.cssom.CssRuleType'], ['goog.array', 'goog.dom', 'goog.dom.TagName'], {});
+goog.addDependency('cssom/cssom_test.js', ['goog.cssomTest'], ['goog.array', 'goog.cssom', 'goog.cssom.CssRuleType', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('cssom/iframe/style.js', ['goog.cssom.iframe.style'], ['goog.asserts', 'goog.cssom', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('cssom/iframe/style_test.js', ['goog.cssom.iframe.styleTest'], ['goog.cssom', 'goog.cssom.iframe.style', 'goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('datasource/datamanager.js', ['goog.ds.DataManager'], ['goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.Expr', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.Map'], {});
+goog.addDependency('datasource/datasource.js', ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.DataNodeList', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState', 'goog.ds.SortedNodeList', 'goog.ds.Util', 'goog.ds.logger'], ['goog.array', 'goog.log'], {});
+goog.addDependency('datasource/datasource_test.js', ['goog.ds.JsDataSourceTest'], ['goog.dom.xml', 'goog.ds.DataManager', 'goog.ds.JsDataSource', 'goog.ds.SortedNodeList', 'goog.ds.XmlDataSource', 'goog.testing.jsunit'], {});
+goog.addDependency('datasource/expr.js', ['goog.ds.Expr'], ['goog.ds.BasicNodeList', 'goog.ds.EmptyNodeList', 'goog.string'], {});
+goog.addDependency('datasource/expr_test.js', ['goog.ds.ExprTest'], ['goog.ds.DataManager', 'goog.ds.Expr', 'goog.ds.JsDataSource', 'goog.testing.jsunit'], {});
+goog.addDependency('datasource/fastdatanode.js', ['goog.ds.AbstractFastDataNode', 'goog.ds.FastDataNode', 'goog.ds.FastListNode', 'goog.ds.PrimitiveFastDataNode'], ['goog.ds.DataManager', 'goog.ds.DataNodeList', 'goog.ds.EmptyNodeList', 'goog.string'], {});
+goog.addDependency('datasource/fastdatanode_test.js', ['goog.ds.FastDataNodeTest'], ['goog.array', 'goog.ds.DataManager', 'goog.ds.Expr', 'goog.ds.FastDataNode', 'goog.testing.jsunit'], {});
+goog.addDependency('datasource/jsdatasource.js', ['goog.ds.JsDataSource', 'goog.ds.JsPropertyDataSource'], ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.DataNode', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState'], {});
+goog.addDependency('datasource/jsondatasource.js', ['goog.ds.JsonDataSource'], ['goog.Uri', 'goog.dom', 'goog.dom.TagName', 'goog.ds.DataManager', 'goog.ds.JsDataSource', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.log'], {});
+goog.addDependency('datasource/jsxmlhttpdatasource.js', ['goog.ds.JsXmlHttpDataSource'], ['goog.Uri', 'goog.ds.DataManager', 'goog.ds.FastDataNode', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.events', 'goog.json', 'goog.log', 'goog.net.EventType', 'goog.net.XhrIo'], {});
+goog.addDependency('datasource/jsxmlhttpdatasource_test.js', ['goog.ds.JsXmlHttpDataSourceTest'], ['goog.ds.JsXmlHttpDataSource', 'goog.testing.TestQueue', 'goog.testing.jsunit', 'goog.testing.net.XhrIo'], {});
+goog.addDependency('datasource/xmldatasource.js', ['goog.ds.XmlDataSource', 'goog.ds.XmlHttpDataSource'], ['goog.Uri', 'goog.dom.NodeType', 'goog.dom.xml', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.DataNode', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.log', 'goog.net.XhrIo', 'goog.string'], {});
+goog.addDependency('date/date.js', ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay'], ['goog.asserts', 'goog.date.DateLike', 'goog.i18n.DateTimeSymbols', 'goog.string'], {});
+goog.addDependency('date/date_test.js', ['goog.dateTest'], ['goog.array', 'goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay', 'goog.i18n.DateTimeSymbols', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.platform', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('date/datelike.js', ['goog.date.DateLike'], [], {});
+goog.addDependency('date/daterange.js', ['goog.date.DateRange', 'goog.date.DateRange.Iterator', 'goog.date.DateRange.StandardDateRangeKeys'], ['goog.date.Date', 'goog.date.Interval', 'goog.iter.Iterator', 'goog.iter.StopIteration'], {});
+goog.addDependency('date/daterange_test.js', ['goog.date.DateRangeTest'], ['goog.date.Date', 'goog.date.DateRange', 'goog.date.Interval', 'goog.i18n.DateTimeSymbols', 'goog.testing.jsunit'], {});
+goog.addDependency('date/duration.js', ['goog.date.duration'], ['goog.i18n.DateTimeFormat', 'goog.i18n.MessageFormat'], {});
+goog.addDependency('date/duration_test.js', ['goog.date.durationTest'], ['goog.date.duration', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.testing.jsunit'], {});
+goog.addDependency('date/relative.js', ['goog.date.relative', 'goog.date.relative.TimeDeltaFormatter', 'goog.date.relative.Unit'], ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns'], {});
+goog.addDependency('date/relative_test.js', ['goog.date.relativeTest'], ['goog.date.DateTime', 'goog.date.relative', 'goog.i18n.DateTimeFormat', 'goog.testing.jsunit'], {});
+goog.addDependency('date/relativewithplurals.js', ['goog.date.relativeWithPlurals'], ['goog.date.relative', 'goog.date.relative.Unit', 'goog.i18n.MessageFormat'], {});
+goog.addDependency('date/relativewithplurals_test.js', ['goog.date.relativeWithPluralsTest'], ['goog.date.relative', 'goog.date.relativeTest', 'goog.date.relativeWithPlurals', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_fa'], {});
+goog.addDependency('date/utcdatetime.js', ['goog.date.UtcDateTime'], ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval'], {});
+goog.addDependency('date/utcdatetime_test.js', ['goog.date.UtcDateTimeTest'], ['goog.date.Interval', 'goog.date.UtcDateTime', 'goog.date.month', 'goog.date.weekDay', 'goog.testing.jsunit'], {});
+goog.addDependency('db/cursor.js', ['goog.db.Cursor'], ['goog.async.Deferred', 'goog.db.Error', 'goog.debug', 'goog.events.EventTarget'], {});
+goog.addDependency('db/db.js', ['goog.db', 'goog.db.BlockedCallback', 'goog.db.UpgradeNeededCallback'], ['goog.asserts', 'goog.async.Deferred', 'goog.db.Error', 'goog.db.IndexedDb', 'goog.db.Transaction'], {});
+goog.addDependency('db/db_test.js', ['goog.dbTest'], ['goog.Disposable', 'goog.Promise', 'goog.array', 'goog.db', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.IndexedDb', 'goog.db.KeyRange', 'goog.db.Transaction', 'goog.events', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent.product'], {});
+goog.addDependency('db/error.js', ['goog.db.Error', 'goog.db.Error.ErrorCode', 'goog.db.Error.ErrorName', 'goog.db.Error.VersionChangeBlockedError'], ['goog.debug.Error'], {});
+goog.addDependency('db/index.js', ['goog.db.Index'], ['goog.async.Deferred', 'goog.db.Cursor', 'goog.db.Error', 'goog.debug'], {});
+goog.addDependency('db/indexeddb.js', ['goog.db.IndexedDb'], ['goog.db.Error', 'goog.db.ObjectStore', 'goog.db.Transaction', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget'], {});
+goog.addDependency('db/keyrange.js', ['goog.db.KeyRange'], [], {});
+goog.addDependency('db/objectstore.js', ['goog.db.ObjectStore'], ['goog.async.Deferred', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.Index', 'goog.debug', 'goog.events'], {});
+goog.addDependency('db/transaction.js', ['goog.db.Transaction', 'goog.db.Transaction.TransactionMode'], ['goog.async.Deferred', 'goog.db.Error', 'goog.db.ObjectStore', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget'], {});
+goog.addDependency('debug/console.js', ['goog.debug.Console'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.debug.TextFormatter'], {});
+goog.addDependency('debug/console_test.js', ['goog.debug.ConsoleTest'], ['goog.debug.Console', 'goog.debug.LogRecord', 'goog.debug.Logger', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('debug/debug.js', ['goog.debug'], ['goog.array', 'goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.uncheckedconversions', 'goog.string.Const', 'goog.structs.Set', 'goog.userAgent'], {});
+goog.addDependency('debug/debug_test.js', ['goog.debugTest'], ['goog.debug', 'goog.html.SafeHtml', 'goog.structs.Set', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/debugwindow.js', ['goog.debug.DebugWindow'], ['goog.debug.HtmlFormatter', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.string.Const', 'goog.structs.CircularBuffer', 'goog.userAgent'], {});
+goog.addDependency('debug/debugwindow_test.js', ['goog.debug.DebugWindowTest'], ['goog.debug.DebugWindow', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/devcss/devcss.js', ['goog.debug.DevCss', 'goog.debug.DevCss.UserAgent'], ['goog.asserts', 'goog.cssom', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('debug/devcss/devcss_test.js', ['goog.debug.DevCssTest'], ['goog.debug.DevCss', 'goog.style', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/devcss/devcssrunner.js', ['goog.debug.devCssRunner'], ['goog.debug.DevCss'], {});
+goog.addDependency('debug/divconsole.js', ['goog.debug.DivConsole'], ['goog.debug.HtmlFormatter', 'goog.debug.LogManager', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.string.Const', 'goog.style'], {});
+goog.addDependency('debug/enhanceerror_test.js', ['goog.debugEnhanceErrorTest'], ['goog.debug', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/entrypointregistry.js', ['goog.debug.EntryPointMonitor', 'goog.debug.entryPointRegistry'], ['goog.asserts'], {});
+goog.addDependency('debug/entrypointregistry_test.js', ['goog.debug.entryPointRegistryTest'], ['goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/error.js', ['goog.debug.Error'], [], {});
+goog.addDependency('debug/error_test.js', ['goog.debug.ErrorTest'], ['goog.debug.Error', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('debug/errorhandler.js', ['goog.debug.ErrorHandler', 'goog.debug.ErrorHandler.ProtectedFunctionError'], ['goog.Disposable', 'goog.asserts', 'goog.debug', 'goog.debug.EntryPointMonitor', 'goog.debug.Error', 'goog.debug.Trace'], {});
+goog.addDependency('debug/errorhandler_async_test.js', ['goog.debug.ErrorHandlerAsyncTest'], ['goog.Promise', 'goog.debug.ErrorHandler', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('debug/errorhandler_test.js', ['goog.debug.ErrorHandlerTest'], ['goog.debug.ErrorHandler', 'goog.testing.MockControl', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/errorhandlerweakdep.js', ['goog.debug.errorHandlerWeakDep'], [], {});
+goog.addDependency('debug/errorreporter.js', ['goog.debug.ErrorReporter', 'goog.debug.ErrorReporter.ExceptionEvent'], ['goog.asserts', 'goog.debug', 'goog.debug.Error', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.log', 'goog.net.XhrIo', 'goog.object', 'goog.string', 'goog.uri.utils', 'goog.userAgent'], {});
+goog.addDependency('debug/errorreporter_test.js', ['goog.debug.ErrorReporterTest'], ['goog.debug.Error', 'goog.debug.ErrorReporter', 'goog.events', 'goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('debug/fancywindow.js', ['goog.debug.FancyWindow'], ['goog.array', 'goog.asserts', 'goog.debug.DebugWindow', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('debug/formatter.js', ['goog.debug.Formatter', 'goog.debug.HtmlFormatter', 'goog.debug.TextFormatter'], ['goog.debug', 'goog.debug.Logger', 'goog.debug.RelativeTimeProvider', 'goog.html.SafeHtml'], {});
+goog.addDependency('debug/formatter_test.js', ['goog.debug.FormatterTest'], ['goog.debug.HtmlFormatter', 'goog.debug.LogRecord', 'goog.debug.Logger', 'goog.html.SafeHtml', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/fpsdisplay.js', ['goog.debug.FpsDisplay'], ['goog.asserts', 'goog.async.AnimationDelay', 'goog.dom', 'goog.dom.TagName', 'goog.ui.Component'], {});
+goog.addDependency('debug/fpsdisplay_test.js', ['goog.debug.FpsDisplayTest'], ['goog.Timer', 'goog.debug.FpsDisplay', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/logbuffer.js', ['goog.debug.LogBuffer'], ['goog.asserts', 'goog.debug.LogRecord'], {});
+goog.addDependency('debug/logbuffer_test.js', ['goog.debug.LogBufferTest'], ['goog.debug.LogBuffer', 'goog.debug.Logger', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/logger.js', ['goog.debug.LogManager', 'goog.debug.Loggable', 'goog.debug.Logger', 'goog.debug.Logger.Level'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.LogBuffer', 'goog.debug.LogRecord'], {});
+goog.addDependency('debug/logger_test.js', ['goog.debug.LoggerTest'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/logrecord.js', ['goog.debug.LogRecord'], [], {});
+goog.addDependency('debug/logrecordserializer.js', ['goog.debug.logRecordSerializer'], ['goog.debug.LogRecord', 'goog.debug.Logger', 'goog.json', 'goog.object'], {});
+goog.addDependency('debug/logrecordserializer_test.js', ['goog.debug.logRecordSerializerTest'], ['goog.debug.LogRecord', 'goog.debug.Logger', 'goog.debug.logRecordSerializer', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/relativetimeprovider.js', ['goog.debug.RelativeTimeProvider'], [], {});
+goog.addDependency('debug/tracer.js', ['goog.debug.Trace'], ['goog.array', 'goog.debug.Logger', 'goog.iter', 'goog.log', 'goog.structs.Map', 'goog.structs.SimplePool'], {});
+goog.addDependency('debug/tracer_test.js', ['goog.debug.TraceTest'], ['goog.debug.Trace', 'goog.testing.jsunit'], {});
+goog.addDependency('defineclass_test.js', ['goog.defineClassTest'], ['goog.testing.jsunit'], {});
+goog.addDependency('disposable/disposable.js', ['goog.Disposable', 'goog.dispose', 'goog.disposeAll'], ['goog.disposable.IDisposable'], {});
+goog.addDependency('disposable/disposable_test.js', ['goog.DisposableTest'], ['goog.Disposable', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('disposable/idisposable.js', ['goog.disposable.IDisposable'], [], {});
+goog.addDependency('dom/abstractmultirange.js', ['goog.dom.AbstractMultiRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange'], {});
+goog.addDependency('dom/abstractrange.js', ['goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.SavedCaretRange', 'goog.dom.TagIterator', 'goog.userAgent'], {});
+goog.addDependency('dom/abstractrange_test.js', ['goog.dom.AbstractRangeTest'], ['goog.dom', 'goog.dom.AbstractRange', 'goog.dom.Range', 'goog.dom.TagName', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/animationframe/animationframe.js', ['goog.dom.animationFrame', 'goog.dom.animationFrame.Spec', 'goog.dom.animationFrame.State'], ['goog.dom.animationFrame.polyfill'], {});
+goog.addDependency('dom/animationframe/polyfill.js', ['goog.dom.animationFrame.polyfill'], [], {});
+goog.addDependency('dom/annotate.js', ['goog.dom.annotate', 'goog.dom.annotate.AnnotateFn'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml'], {});
+goog.addDependency('dom/annotate_test.js', ['goog.dom.annotateTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.annotate', 'goog.html.SafeHtml', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/browserfeature.js', ['goog.dom.BrowserFeature'], ['goog.userAgent'], {});
+goog.addDependency('dom/browserrange/abstractrange.js', ['goog.dom.browserrange.AbstractRange'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.iter', 'goog.math.Coordinate', 'goog.string', 'goog.string.StringBuffer', 'goog.userAgent'], {});
+goog.addDependency('dom/browserrange/browserrange.js', ['goog.dom.browserrange', 'goog.dom.browserrange.Error'], ['goog.dom', 'goog.dom.BrowserFeature', 'goog.dom.NodeType', 'goog.dom.browserrange.GeckoRange', 'goog.dom.browserrange.IeRange', 'goog.dom.browserrange.OperaRange', 'goog.dom.browserrange.W3cRange', 'goog.dom.browserrange.WebKitRange', 'goog.userAgent'], {});
+goog.addDependency('dom/browserrange/browserrange_test.js', ['goog.dom.browserrangeTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange', 'goog.html.testing', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/browserrange/geckorange.js', ['goog.dom.browserrange.GeckoRange'], ['goog.dom.browserrange.W3cRange'], {});
+goog.addDependency('dom/browserrange/ierange.js', ['goog.dom.browserrange.IeRange'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange.AbstractRange', 'goog.log', 'goog.string'], {});
+goog.addDependency('dom/browserrange/operarange.js', ['goog.dom.browserrange.OperaRange'], ['goog.dom.browserrange.W3cRange'], {});
+goog.addDependency('dom/browserrange/w3crange.js', ['goog.dom.browserrange.W3cRange'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange.AbstractRange', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('dom/browserrange/webkitrange.js', ['goog.dom.browserrange.WebKitRange'], ['goog.dom.RangeEndpoint', 'goog.dom.browserrange.W3cRange', 'goog.userAgent'], {});
+goog.addDependency('dom/bufferedviewportsizemonitor.js', ['goog.dom.BufferedViewportSizeMonitor'], ['goog.asserts', 'goog.async.Delay', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType'], {});
+goog.addDependency('dom/bufferedviewportsizemonitor_test.js', ['goog.dom.BufferedViewportSizeMonitorTest'], ['goog.dom.BufferedViewportSizeMonitor', 'goog.dom.ViewportSizeMonitor', 'goog.events', 'goog.events.EventType', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/classes.js', ['goog.dom.classes'], ['goog.array'], {});
+goog.addDependency('dom/classes_test.js', ['goog.dom.classes_test'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classes', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/classlist.js', ['goog.dom.classlist'], ['goog.array'], {});
+goog.addDependency('dom/classlist_test.js', ['goog.dom.classlist_test'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/controlrange.js', ['goog.dom.ControlRange', 'goog.dom.ControlRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagWalkType', 'goog.dom.TextRange', 'goog.iter.StopIteration', 'goog.userAgent'], {});
+goog.addDependency('dom/controlrange_test.js', ['goog.dom.ControlRangeTest'], ['goog.dom', 'goog.dom.ControlRange', 'goog.dom.RangeType', 'goog.dom.TagName', 'goog.dom.TextRange', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/dataset.js', ['goog.dom.dataset'], ['goog.string', 'goog.userAgent.product'], {});
+goog.addDependency('dom/dataset_test.js', ['goog.dom.datasetTest'], ['goog.dom', 'goog.dom.dataset', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/dom.js', ['goog.dom', 'goog.dom.Appendable', 'goog.dom.DomHelper'], ['goog.array', 'goog.asserts', 'goog.dom.BrowserFeature', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.uncheckedconversions', 'goog.math.Coordinate', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.userAgent'], {});
+goog.addDependency('dom/dom_test.js', ['goog.dom.dom_test'], ['goog.array', 'goog.dom', 'goog.dom.BrowserFeature', 'goog.dom.DomHelper', 'goog.dom.InputType', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.functions', 'goog.html.testing', 'goog.object', 'goog.string.Const', 'goog.string.Unicode', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('dom/fontsizemonitor.js', ['goog.dom.FontSizeMonitor', 'goog.dom.FontSizeMonitor.EventType'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent'], {});
+goog.addDependency('dom/fontsizemonitor_test.js', ['goog.dom.FontSizeMonitorTest'], ['goog.dom', 'goog.dom.FontSizeMonitor', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/forms.js', ['goog.dom.forms'], ['goog.dom.InputType', 'goog.dom.TagName', 'goog.structs.Map', 'goog.window'], {});
+goog.addDependency('dom/forms_test.js', ['goog.dom.formsTest'], ['goog.dom', 'goog.dom.forms', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/fullscreen.js', ['goog.dom.fullscreen', 'goog.dom.fullscreen.EventType'], ['goog.dom', 'goog.userAgent'], {});
+goog.addDependency('dom/fullscreen_test.js', ['goog.dom.fullscreen_test'], ['goog.dom.DomHelper', 'goog.dom.fullscreen', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/iframe.js', ['goog.dom.iframe'], ['goog.dom', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.userAgent'], {});
+goog.addDependency('dom/iframe_test.js', ['goog.dom.iframeTest'], ['goog.dom', 'goog.dom.iframe', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/inputtype.js', ['goog.dom.InputType'], [], {});
+goog.addDependency('dom/inputtype_test.js', ['goog.dom.InputTypeTest'], ['goog.dom.InputType', 'goog.object'], {});
+goog.addDependency('dom/iter.js', ['goog.dom.iter.AncestorIterator', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator'], ['goog.iter.Iterator', 'goog.iter.StopIteration'], {});
+goog.addDependency('dom/iter_test.js', ['goog.dom.iterTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.iter.AncestorIterator', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/multirange.js', ['goog.dom.MultiRange', 'goog.dom.MultiRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TextRange', 'goog.iter', 'goog.iter.StopIteration', 'goog.log'], {});
+goog.addDependency('dom/multirange_test.js', ['goog.dom.MultiRangeTest'], ['goog.dom', 'goog.dom.MultiRange', 'goog.dom.Range', 'goog.iter', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/nodeiterator.js', ['goog.dom.NodeIterator'], ['goog.dom.TagIterator'], {});
+goog.addDependency('dom/nodeiterator_test.js', ['goog.dom.NodeIteratorTest'], ['goog.dom', 'goog.dom.NodeIterator', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/nodeoffset.js', ['goog.dom.NodeOffset'], ['goog.Disposable', 'goog.dom.TagName'], {});
+goog.addDependency('dom/nodeoffset_test.js', ['goog.dom.NodeOffsetTest'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/nodetype.js', ['goog.dom.NodeType'], [], {});
+goog.addDependency('dom/pattern/abstractpattern.js', ['goog.dom.pattern.AbstractPattern'], ['goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/allchildren.js', ['goog.dom.pattern.AllChildren'], ['goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/callback/callback.js', ['goog.dom.pattern.callback'], ['goog.dom', 'goog.dom.TagWalkType', 'goog.iter'], {});
+goog.addDependency('dom/pattern/callback/counter.js', ['goog.dom.pattern.callback.Counter'], [], {});
+goog.addDependency('dom/pattern/callback/test.js', ['goog.dom.pattern.callback.Test'], ['goog.iter.StopIteration'], {});
+goog.addDependency('dom/pattern/childmatches.js', ['goog.dom.pattern.ChildMatches'], ['goog.dom.pattern.AllChildren', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/endtag.js', ['goog.dom.pattern.EndTag'], ['goog.dom.TagWalkType', 'goog.dom.pattern.Tag'], {});
+goog.addDependency('dom/pattern/fulltag.js', ['goog.dom.pattern.FullTag'], ['goog.dom.pattern.MatchType', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.Tag'], {});
+goog.addDependency('dom/pattern/matcher.js', ['goog.dom.pattern.Matcher'], ['goog.dom.TagIterator', 'goog.dom.pattern.MatchType', 'goog.iter'], {});
+goog.addDependency('dom/pattern/matcher_test.js', ['goog.dom.pattern.matcherTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.pattern.EndTag', 'goog.dom.pattern.FullTag', 'goog.dom.pattern.Matcher', 'goog.dom.pattern.Repeat', 'goog.dom.pattern.Sequence', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.callback.Counter', 'goog.dom.pattern.callback.Test', 'goog.iter.StopIteration', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/pattern/nodetype.js', ['goog.dom.pattern.NodeType'], ['goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/pattern.js', ['goog.dom.pattern', 'goog.dom.pattern.MatchType'], [], {});
+goog.addDependency('dom/pattern/pattern_test.js', ['goog.dom.patternTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagWalkType', 'goog.dom.pattern.AllChildren', 'goog.dom.pattern.ChildMatches', 'goog.dom.pattern.EndTag', 'goog.dom.pattern.FullTag', 'goog.dom.pattern.MatchType', 'goog.dom.pattern.NodeType', 'goog.dom.pattern.Repeat', 'goog.dom.pattern.Sequence', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.Text', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/pattern/repeat.js', ['goog.dom.pattern.Repeat'], ['goog.dom.NodeType', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/sequence.js', ['goog.dom.pattern.Sequence'], ['goog.dom.NodeType', 'goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/starttag.js', ['goog.dom.pattern.StartTag'], ['goog.dom.TagWalkType', 'goog.dom.pattern.Tag'], {});
+goog.addDependency('dom/pattern/tag.js', ['goog.dom.pattern.Tag'], ['goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType', 'goog.object'], {});
+goog.addDependency('dom/pattern/text.js', ['goog.dom.pattern.Text'], ['goog.dom.NodeType', 'goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/range.js', ['goog.dom.Range'], ['goog.dom', 'goog.dom.AbstractRange', 'goog.dom.BrowserFeature', 'goog.dom.ControlRange', 'goog.dom.MultiRange', 'goog.dom.NodeType', 'goog.dom.TextRange'], {});
+goog.addDependency('dom/range_test.js', ['goog.dom.RangeTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeType', 'goog.dom.TagName', 'goog.dom.TextRange', 'goog.dom.browserrange', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/rangeendpoint.js', ['goog.dom.RangeEndpoint'], [], {});
+goog.addDependency('dom/safe.js', ['goog.dom.safe', 'goog.dom.safe.InsertAdjacentHtmlPosition'], ['goog.asserts', 'goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.string', 'goog.string.Const'], {});
+goog.addDependency('dom/safe_test.js', ['goog.dom.safeTest'], ['goog.dom.safe', 'goog.dom.safe.InsertAdjacentHtmlPosition', 'goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.testing', 'goog.string.Const', 'goog.testing', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/savedcaretrange.js', ['goog.dom.SavedCaretRange'], ['goog.array', 'goog.dom', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.string'], {});
+goog.addDependency('dom/savedcaretrange_test.js', ['goog.dom.SavedCaretRangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.SavedCaretRange', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/savedrange.js', ['goog.dom.SavedRange'], ['goog.Disposable', 'goog.log'], {});
+goog.addDependency('dom/savedrange_test.js', ['goog.dom.SavedRangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/selection.js', ['goog.dom.selection'], ['goog.dom.InputType', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('dom/selection_test.js', ['goog.dom.selectionTest'], ['goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.selection', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/tagiterator.js', ['goog.dom.TagIterator', 'goog.dom.TagWalkType'], ['goog.dom', 'goog.dom.NodeType', 'goog.iter.Iterator', 'goog.iter.StopIteration'], {});
+goog.addDependency('dom/tagiterator_test.js', ['goog.dom.TagIteratorTest'], ['goog.dom', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.dom.TagWalkType', 'goog.iter', 'goog.iter.StopIteration', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/tagname.js', ['goog.dom.TagName'], [], {});
+goog.addDependency('dom/tagname_test.js', ['goog.dom.TagNameTest'], ['goog.dom.TagName', 'goog.object', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/tags.js', ['goog.dom.tags'], ['goog.object'], {});
+goog.addDependency('dom/tags_test.js', ['goog.dom.tagsTest'], ['goog.dom.tags', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/textrange.js', ['goog.dom.TextRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.dom.browserrange', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('dom/textrange_test.js', ['goog.dom.TextRangeTest'], ['goog.dom', 'goog.dom.ControlRange', 'goog.dom.Range', 'goog.dom.TextRange', 'goog.math.Coordinate', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('dom/textrangeiterator.js', ['goog.dom.TextRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeIterator', 'goog.dom.TagName', 'goog.iter.StopIteration'], {});
+goog.addDependency('dom/textrangeiterator_test.js', ['goog.dom.TextRangeIteratorTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.iter.StopIteration', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/vendor.js', ['goog.dom.vendor'], ['goog.string', 'goog.userAgent'], {});
+goog.addDependency('dom/vendor_test.js', ['goog.dom.vendorTest'], ['goog.array', 'goog.dom.vendor', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgentTestUtil'], {});
+goog.addDependency('dom/viewportsizemonitor.js', ['goog.dom.ViewportSizeMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Size'], {});
+goog.addDependency('dom/viewportsizemonitor_test.js', ['goog.dom.ViewportSizeMonitorTest'], ['goog.dom.ViewportSizeMonitor', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/xml.js', ['goog.dom.xml'], ['goog.dom', 'goog.dom.NodeType', 'goog.userAgent'], {});
+goog.addDependency('dom/xml_test.js', ['goog.dom.xmlTest'], ['goog.dom.TagName', 'goog.dom.xml', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/browserfeature.js', ['goog.editor.BrowserFeature'], ['goog.editor.defines', 'goog.labs.userAgent.browser', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('editor/browserfeature_test.js', ['goog.editor.BrowserFeatureTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/clicktoeditwrapper.js', ['goog.editor.ClickToEditWrapper'], ['goog.Disposable', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.range', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventType'], {});
+goog.addDependency('editor/clicktoeditwrapper_test.js', ['goog.editor.ClickToEditWrapperTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.ClickToEditWrapper', 'goog.editor.SeamlessField', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('editor/command.js', ['goog.editor.Command'], [], {});
+goog.addDependency('editor/contenteditablefield.js', ['goog.editor.ContentEditableField'], ['goog.asserts', 'goog.editor.Field', 'goog.log'], {});
+goog.addDependency('editor/contenteditablefield_test.js', ['goog.editor.ContentEditableFieldTest'], ['goog.dom', 'goog.editor.ContentEditableField', 'goog.editor.field_test', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/defines.js', ['goog.editor.defines'], [], {});
+goog.addDependency('editor/field.js', ['goog.editor.Field', 'goog.editor.Field.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.array', 'goog.asserts', 'goog.async.Delay', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.editor.range', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.log', 'goog.log.Level', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('editor/field_test.js', ['goog.editor.field_test'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.range', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.LooseMock', 'goog.testing.MockClock', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('editor/focus.js', ['goog.editor.focus'], ['goog.dom.selection'], {});
+goog.addDependency('editor/focus_test.js', ['goog.editor.focusTest'], ['goog.dom.selection', 'goog.editor.BrowserFeature', 'goog.editor.focus', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/icontent.js', ['goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo'], ['goog.dom', 'goog.editor.BrowserFeature', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('editor/icontent_test.js', ['goog.editor.icontentTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/link.js', ['goog.editor.Link'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.node', 'goog.editor.range', 'goog.string', 'goog.string.Unicode', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex'], {});
+goog.addDependency('editor/link_test.js', ['goog.editor.LinkTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Link', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/node.js', ['goog.editor.node'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator', 'goog.iter', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.userAgent'], {});
+goog.addDependency('editor/node_test.js', ['goog.editor.nodeTest'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.node', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugin.js', ['goog.editor.Plugin'], ['goog.events.EventTarget', 'goog.functions', 'goog.log', 'goog.object', 'goog.reflect', 'goog.userAgent'], {});
+goog.addDependency('editor/plugin_test.js', ['goog.editor.PluginTest'], ['goog.editor.Field', 'goog.editor.Plugin', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/abstractbubbleplugin.js', ['goog.editor.plugins.AbstractBubblePlugin'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.Plugin', 'goog.editor.style', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.actionEventWrapper', 'goog.functions', 'goog.string.Unicode', 'goog.ui.Component', 'goog.ui.editor.Bubble', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/abstractbubbleplugin_test.js', ['goog.editor.plugins.AbstractBubblePluginTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.style', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.editor.Bubble', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/abstractdialogplugin.js', ['goog.editor.plugins.AbstractDialogPlugin', 'goog.editor.plugins.AbstractDialogPlugin.EventType'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.range', 'goog.events', 'goog.ui.editor.AbstractDialog'], {});
+goog.addDependency('editor/plugins/abstractdialogplugin_test.js', ['goog.editor.plugins.AbstractDialogPluginTest'], ['goog.dom.SavedRange', 'goog.dom.TagName', 'goog.editor.Field', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.events.Event', 'goog.events.EventHandler', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.ui.editor.AbstractDialog', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/abstracttabhandler.js', ['goog.editor.plugins.AbstractTabHandler'], ['goog.editor.Plugin', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/abstracttabhandler_test.js', ['goog.editor.plugins.AbstractTabHandlerTest'], ['goog.editor.Field', 'goog.editor.plugins.AbstractTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/basictextformatter.js', ['goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.BasicTextFormatter.COMMAND'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.editor.style', 'goog.iter', 'goog.iter.StopIteration', 'goog.log', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.editor.messages', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/basictextformatter_test.js', ['goog.editor.plugins.BasicTextFormatterTest'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.BasicTextFormatter', 'goog.object', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.LooseMock', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/blockquote.js', ['goog.editor.plugins.Blockquote'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions', 'goog.log'], {});
+goog.addDependency('editor/plugins/blockquote_test.js', ['goog.editor.plugins.BlockquoteTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.plugins.Blockquote', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/plugins/emoticons.js', ['goog.editor.plugins.Emoticons'], ['goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.range', 'goog.functions', 'goog.ui.emoji.Emoji', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/emoticons_test.js', ['goog.editor.plugins.EmoticonsTest'], ['goog.Uri', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.editor.Field', 'goog.editor.plugins.Emoticons', 'goog.testing.jsunit', 'goog.ui.emoji.Emoji', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/enterhandler.js', ['goog.editor.plugins.EnterHandler'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.plugins.Blockquote', 'goog.editor.range', 'goog.editor.style', 'goog.events.KeyCodes', 'goog.functions', 'goog.object', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/enterhandler_test.js', ['goog.editor.plugins.EnterHandlerTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.Blockquote', 'goog.editor.plugins.EnterHandler', 'goog.editor.range', 'goog.events', 'goog.events.KeyCodes', 'goog.testing.ExpectedFailures', 'goog.testing.MockClock', 'goog.testing.dom', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/firststrong.js', ['goog.editor.plugins.FirstStrong'], ['goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.i18n.bidi', 'goog.i18n.uChar', 'goog.iter', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/firststrong_test.js', ['goog.editor.plugins.FirstStrongTest'], ['goog.dom.Range', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.plugins.FirstStrong', 'goog.editor.range', 'goog.events.KeyCodes', 'goog.testing.MockClock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/headerformatter.js', ['goog.editor.plugins.HeaderFormatter'], ['goog.editor.Command', 'goog.editor.Plugin', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/headerformatter_test.js', ['goog.editor.plugins.HeaderFormatterTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.HeaderFormatter', 'goog.events.BrowserEvent', 'goog.testing.LooseMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/linkbubble.js', ['goog.editor.plugins.LinkBubble', 'goog.editor.plugins.LinkBubble.Action'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.functions', 'goog.string', 'goog.style', 'goog.ui.editor.messages', 'goog.uri.utils', 'goog.window'], {});
+goog.addDependency('editor/plugins/linkbubble_test.js', ['goog.editor.plugins.LinkBubbleTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.plugins.LinkBubble', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.testing.FunctionMock', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/linkdialogplugin.js', ['goog.editor.plugins.LinkDialogPlugin'], ['goog.array', 'goog.dom', 'goog.editor.Command', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.events.EventHandler', 'goog.functions', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.LinkDialog', 'goog.uri.utils'], {});
+goog.addDependency('editor/plugins/linkdialogplugin_test.js', ['goog.ui.editor.plugins.LinkDialogTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Link', 'goog.editor.plugins.LinkDialogPlugin', 'goog.string', 'goog.string.Unicode', 'goog.testing.MockControl', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.editor.dom', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.LinkDialog', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/linkshortcutplugin.js', ['goog.editor.plugins.LinkShortcutPlugin'], ['goog.editor.Command', 'goog.editor.Plugin'], {});
+goog.addDependency('editor/plugins/linkshortcutplugin_test.js', ['goog.editor.plugins.LinkShortcutPluginTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Field', 'goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.LinkBubble', 'goog.editor.plugins.LinkShortcutPlugin', 'goog.events.KeyCodes', 'goog.testing.PropertyReplacer', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent.product'], {});
+goog.addDependency('editor/plugins/listtabhandler.js', ['goog.editor.plugins.ListTabHandler'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.plugins.AbstractTabHandler', 'goog.iter'], {});
+goog.addDependency('editor/plugins/listtabhandler_test.js', ['goog.editor.plugins.ListTabHandlerTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.plugins.ListTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/plugins/loremipsum.js', ['goog.editor.plugins.LoremIpsum'], ['goog.asserts', 'goog.dom', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/loremipsum_test.js', ['goog.editor.plugins.LoremIpsumTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.plugins.LoremIpsum', 'goog.string.Unicode', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/removeformatting.js', ['goog.editor.plugins.RemoveFormatting'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/removeformatting_test.js', ['goog.editor.plugins.RemoveFormattingTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.plugins.RemoveFormatting', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.dom', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/spacestabhandler.js', ['goog.editor.plugins.SpacesTabHandler'], ['goog.dom.TagName', 'goog.editor.plugins.AbstractTabHandler', 'goog.editor.range'], {});
+goog.addDependency('editor/plugins/spacestabhandler_test.js', ['goog.editor.plugins.SpacesTabHandlerTest'], ['goog.dom', 'goog.dom.Range', 'goog.editor.plugins.SpacesTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/plugins/tableeditor.js', ['goog.editor.plugins.TableEditor'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.Table', 'goog.editor.node', 'goog.editor.range', 'goog.object', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/tableeditor_test.js', ['goog.editor.plugins.TableEditorTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.plugins.TableEditor', 'goog.object', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/tagonenterhandler.js', ['goog.editor.plugins.TagOnEnterHandler'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.node', 'goog.editor.plugins.EnterHandler', 'goog.editor.range', 'goog.editor.style', 'goog.events.KeyCodes', 'goog.functions', 'goog.string.Unicode', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/tagonenterhandler_test.js', ['goog.editor.plugins.TagOnEnterHandlerTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.TagOnEnterHandler', 'goog.events.KeyCodes', 'goog.string.Unicode', 'goog.testing.dom', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/undoredo.js', ['goog.editor.plugins.UndoRedo'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.events.EventHandler', 'goog.log', 'goog.object'], {});
+goog.addDependency('editor/plugins/undoredo_test.js', ['goog.editor.plugins.UndoRedoTest'], ['goog.array', 'goog.dom', 'goog.dom.browserrange', 'goog.editor.Field', 'goog.editor.plugins.LoremIpsum', 'goog.editor.plugins.UndoRedo', 'goog.events', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/plugins/undoredomanager.js', ['goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoManager.EventType'], ['goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.events.EventTarget'], {});
+goog.addDependency('editor/plugins/undoredomanager_test.js', ['goog.editor.plugins.UndoRedoManagerTest'], ['goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.testing.StrictMock', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/plugins/undoredostate.js', ['goog.editor.plugins.UndoRedoState'], ['goog.events.EventTarget'], {});
+goog.addDependency('editor/plugins/undoredostate_test.js', ['goog.editor.plugins.UndoRedoStateTest'], ['goog.editor.plugins.UndoRedoState', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/range.js', ['goog.editor.range', 'goog.editor.range.Point'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeEndpoint', 'goog.dom.SavedCaretRange', 'goog.editor.node', 'goog.editor.style', 'goog.iter', 'goog.userAgent'], {});
+goog.addDependency('editor/range_test.js', ['goog.editor.rangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.range', 'goog.editor.range.Point', 'goog.string', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/seamlessfield.js', ['goog.editor.SeamlessField'], ['goog.cssom.iframe.style', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.safe', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.events', 'goog.events.EventType', 'goog.html.uncheckedconversions', 'goog.log', 'goog.string.Const', 'goog.style'], {});
+goog.addDependency('editor/seamlessfield_test.js', ['goog.editor.seamlessfield_test'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.SeamlessField', 'goog.events', 'goog.functions', 'goog.style', 'goog.testing.MockClock', 'goog.testing.MockRange', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/style.js', ['goog.editor.style'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.events.EventType', 'goog.object', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('editor/style_test.js', ['goog.editor.styleTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.style', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.style', 'goog.testing.LooseMock', 'goog.testing.jsunit', 'goog.testing.mockmatchers'], {});
+goog.addDependency('editor/table.js', ['goog.editor.Table', 'goog.editor.TableCell', 'goog.editor.TableRow'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.log', 'goog.string.Unicode', 'goog.style'], {});
+goog.addDependency('editor/table_test.js', ['goog.editor.TableTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Table', 'goog.testing.jsunit'], {});
+goog.addDependency('events/actioneventwrapper.js', ['goog.events.actionEventWrapper'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.EventWrapper', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('events/actioneventwrapper_test.js', ['goog.events.actionEventWrapperTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.events', 'goog.events.EventHandler', 'goog.events.KeyCodes', 'goog.events.actionEventWrapper', 'goog.testing.events', 'goog.testing.jsunit'], {});
+goog.addDependency('events/actionhandler.js', ['goog.events.ActionEvent', 'goog.events.ActionHandler', 'goog.events.ActionHandler.EventType', 'goog.events.BeforeActionEvent'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('events/actionhandler_test.js', ['goog.events.ActionHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.ActionHandler', 'goog.testing.events', 'goog.testing.jsunit'], {});
+goog.addDependency('events/browserevent.js', ['goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton'], ['goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventType', 'goog.reflect', 'goog.userAgent'], {});
+goog.addDependency('events/browserevent_test.js', ['goog.events.BrowserEventTest'], ['goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.math.Coordinate', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/browserfeature.js', ['goog.events.BrowserFeature'], ['goog.userAgent'], {});
+goog.addDependency('events/event.js', ['goog.events.Event', 'goog.events.EventLike'], ['goog.Disposable', 'goog.events.EventId'], {});
+goog.addDependency('events/event_test.js', ['goog.events.EventTest'], ['goog.events.Event', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.testing.jsunit'], {});
+goog.addDependency('events/eventhandler.js', ['goog.events.EventHandler'], ['goog.Disposable', 'goog.events', 'goog.object'], {});
+goog.addDependency('events/eventhandler_test.js', ['goog.events.EventHandlerTest'], ['goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('events/eventid.js', ['goog.events.EventId'], [], {});
+goog.addDependency('events/events.js', ['goog.events', 'goog.events.CaptureSimulationMode', 'goog.events.Key', 'goog.events.ListenableType'], ['goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.Listenable', 'goog.events.ListenerMap'], {});
+goog.addDependency('events/events_test.js', ['goog.eventsTest'], ['goog.asserts.AssertionError', 'goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.BrowserFeature', 'goog.events.CaptureSimulationMode', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.Listener', 'goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('events/eventtarget.js', ['goog.events.EventTarget'], ['goog.Disposable', 'goog.asserts', 'goog.events', 'goog.events.Event', 'goog.events.Listenable', 'goog.events.ListenerMap', 'goog.object'], {});
+goog.addDependency('events/eventtarget_test.js', ['goog.events.EventTargetTest'], ['goog.events.EventTarget', 'goog.events.Listenable', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.testing.jsunit'], {});
+goog.addDependency('events/eventtarget_via_googevents_test.js', ['goog.events.EventTargetGoogEventsTest'], ['goog.events', 'goog.events.EventTarget', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.testing', 'goog.testing.jsunit'], {});
+goog.addDependency('events/eventtarget_via_w3cinterface_test.js', ['goog.events.EventTargetW3CTest'], ['goog.events.EventTarget', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.testing.jsunit'], {});
+goog.addDependency('events/eventtargettester.js', ['goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType'], ['goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.testing.asserts', 'goog.testing.recordFunction'], {});
+goog.addDependency('events/eventtype.js', ['goog.events.EventType'], ['goog.userAgent'], {});
+goog.addDependency('events/eventwrapper.js', ['goog.events.EventWrapper'], [], {});
+goog.addDependency('events/filedrophandler.js', ['goog.events.FileDropHandler', 'goog.events.FileDropHandler.EventType'], ['goog.array', 'goog.dom', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.log', 'goog.log.Level'], {});
+goog.addDependency('events/filedrophandler_test.js', ['goog.events.FileDropHandlerTest'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.FileDropHandler', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/focushandler.js', ['goog.events.FocusHandler', 'goog.events.FocusHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.userAgent'], {});
+goog.addDependency('events/imehandler.js', ['goog.events.ImeHandler', 'goog.events.ImeHandler.Event', 'goog.events.ImeHandler.EventType'], ['goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('events/imehandler_test.js', ['goog.events.ImeHandlerTest'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.ImeHandler', 'goog.events.KeyCodes', 'goog.object', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/inputhandler.js', ['goog.events.InputHandler', 'goog.events.InputHandler.EventType'], ['goog.Timer', 'goog.dom.TagName', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('events/inputhandler_test.js', ['goog.events.InputHandlerTest'], ['goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('events/keycodes.js', ['goog.events.KeyCodes'], ['goog.userAgent'], {});
+goog.addDependency('events/keycodes_test.js', ['goog.events.KeyCodesTest'], ['goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/keyhandler.js', ['goog.events.KeyEvent', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('events/keyhandler_test.js', ['goog.events.KeyEventTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/keynames.js', ['goog.events.KeyNames'], [], {});
+goog.addDependency('events/listenable.js', ['goog.events.Listenable', 'goog.events.ListenableKey'], ['goog.events.EventId'], {});
+goog.addDependency('events/listenable_test.js', ['goog.events.ListenableTest'], ['goog.events.Listenable', 'goog.testing.jsunit'], {});
+goog.addDependency('events/listener.js', ['goog.events.Listener'], ['goog.events.ListenableKey'], {});
+goog.addDependency('events/listenermap.js', ['goog.events.ListenerMap'], ['goog.array', 'goog.events.Listener', 'goog.object'], {});
+goog.addDependency('events/listenermap_test.js', ['goog.events.ListenerMapTest'], ['goog.dispose', 'goog.events', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.events.ListenerMap', 'goog.testing.jsunit'], {});
+goog.addDependency('events/mousewheelhandler.js', ['goog.events.MouseWheelEvent', 'goog.events.MouseWheelHandler', 'goog.events.MouseWheelHandler.EventType'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.math', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('events/mousewheelhandler_test.js', ['goog.events.MouseWheelHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.MouseWheelEvent', 'goog.events.MouseWheelHandler', 'goog.functions', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/onlinehandler.js', ['goog.events.OnlineHandler', 'goog.events.OnlineHandler.EventType'], ['goog.Timer', 'goog.events.BrowserFeature', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.net.NetworkStatusMonitor'], {});
+goog.addDependency('events/onlinelistener_test.js', ['goog.events.OnlineHandlerTest'], ['goog.events', 'goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.OnlineHandler', 'goog.net.NetworkStatusMonitor', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('events/pastehandler.js', ['goog.events.PasteHandler', 'goog.events.PasteHandler.EventType', 'goog.events.PasteHandler.State'], ['goog.Timer', 'goog.async.ConditionalDelay', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.log', 'goog.userAgent'], {});
+goog.addDependency('events/pastehandler_test.js', ['goog.events.PasteHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.PasteHandler', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/wheelevent.js', ['goog.events.WheelEvent'], ['goog.asserts', 'goog.events.BrowserEvent'], {});
+goog.addDependency('events/wheelhandler.js', ['goog.events.WheelHandler'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.WheelEvent', 'goog.style', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('events/wheelhandler_test.js', ['goog.events.WheelHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.WheelEvent', 'goog.events.WheelHandler', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('format/emailaddress.js', ['goog.format.EmailAddress'], ['goog.string'], {});
+goog.addDependency('format/emailaddress_test.js', ['goog.format.EmailAddressTest'], ['goog.array', 'goog.format.EmailAddress', 'goog.testing.jsunit'], {});
+goog.addDependency('format/format.js', ['goog.format'], ['goog.i18n.GraphemeBreak', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('format/format_test.js', ['goog.formatTest'], ['goog.dom', 'goog.dom.TagName', 'goog.format', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('format/htmlprettyprinter.js', ['goog.format.HtmlPrettyPrinter', 'goog.format.HtmlPrettyPrinter.Buffer'], ['goog.dom.TagName', 'goog.object', 'goog.string.StringBuffer'], {});
+goog.addDependency('format/htmlprettyprinter_test.js', ['goog.format.HtmlPrettyPrinterTest'], ['goog.format.HtmlPrettyPrinter', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('format/internationalizedemailaddress.js', ['goog.format.InternationalizedEmailAddress'], ['goog.format.EmailAddress', 'goog.string'], {});
+goog.addDependency('format/internationalizedemailaddress_test.js', ['goog.format.InternationalizedEmailAddressTest'], ['goog.array', 'goog.format.InternationalizedEmailAddress', 'goog.testing.jsunit'], {});
+goog.addDependency('format/jsonprettyprinter.js', ['goog.format.JsonPrettyPrinter', 'goog.format.JsonPrettyPrinter.SafeHtmlDelimiters', 'goog.format.JsonPrettyPrinter.TextDelimiters'], ['goog.html.SafeHtml', 'goog.json', 'goog.json.Serializer', 'goog.string', 'goog.string.format'], {});
+goog.addDependency('format/jsonprettyprinter_test.js', ['goog.format.JsonPrettyPrinterTest'], ['goog.format.JsonPrettyPrinter', 'goog.testing.jsunit'], {});
+goog.addDependency('fs/entry.js', ['goog.fs.DirectoryEntry', 'goog.fs.DirectoryEntry.Behavior', 'goog.fs.Entry', 'goog.fs.FileEntry'], [], {});
+goog.addDependency('fs/entryimpl.js', ['goog.fs.DirectoryEntryImpl', 'goog.fs.EntryImpl', 'goog.fs.FileEntryImpl'], ['goog.array', 'goog.async.Deferred', 'goog.fs.DirectoryEntry', 'goog.fs.Entry', 'goog.fs.Error', 'goog.fs.FileEntry', 'goog.fs.FileWriter', 'goog.functions', 'goog.string'], {});
+goog.addDependency('fs/error.js', ['goog.fs.Error', 'goog.fs.Error.ErrorCode'], ['goog.debug.Error', 'goog.object', 'goog.string'], {});
+goog.addDependency('fs/filereader.js', ['goog.fs.FileReader', 'goog.fs.FileReader.EventType', 'goog.fs.FileReader.ReadyState'], ['goog.async.Deferred', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.ProgressEvent'], {});
+goog.addDependency('fs/filesaver.js', ['goog.fs.FileSaver', 'goog.fs.FileSaver.EventType', 'goog.fs.FileSaver.ReadyState'], ['goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.ProgressEvent'], {});
+goog.addDependency('fs/filesystem.js', ['goog.fs.FileSystem'], [], {});
+goog.addDependency('fs/filesystemimpl.js', ['goog.fs.FileSystemImpl'], ['goog.fs.DirectoryEntryImpl', 'goog.fs.FileSystem'], {});
+goog.addDependency('fs/filewriter.js', ['goog.fs.FileWriter'], ['goog.fs.Error', 'goog.fs.FileSaver'], {});
+goog.addDependency('fs/fs.js', ['goog.fs'], ['goog.array', 'goog.async.Deferred', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.fs.FileSystemImpl', 'goog.fs.url', 'goog.userAgent'], {});
+goog.addDependency('fs/fs_test.js', ['goog.fsTest'], ['goog.Promise', 'goog.array', 'goog.dom', 'goog.events', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.fs.FileSaver', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('fs/progressevent.js', ['goog.fs.ProgressEvent'], ['goog.events.Event'], {});
+goog.addDependency('fs/url.js', ['goog.fs.url'], [], {});
+goog.addDependency('fs/url_test.js', ['goog.urlTest'], ['goog.fs.url', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('functions/functions.js', ['goog.functions'], [], {});
+goog.addDependency('functions/functions_test.js', ['goog.functionsTest'], ['goog.array', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('fx/abstractdragdrop.js', ['goog.fx.AbstractDragDrop', 'goog.fx.AbstractDragDrop.EventType', 'goog.fx.DragDropEvent', 'goog.fx.DragDropItem'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style'], {});
+goog.addDependency('fx/abstractdragdrop_test.js', ['goog.fx.AbstractDragDropTest'], ['goog.array', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/anim/anim.js', ['goog.fx.anim', 'goog.fx.anim.Animated'], ['goog.async.AnimationDelay', 'goog.async.Delay', 'goog.object'], {});
+goog.addDependency('fx/anim/anim_test.js', ['goog.fx.animTest'], ['goog.async.AnimationDelay', 'goog.async.Delay', 'goog.events', 'goog.functions', 'goog.fx.Animation', 'goog.fx.anim', 'goog.object', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('fx/animation.js', ['goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent'], ['goog.array', 'goog.asserts', 'goog.events.Event', 'goog.fx.Transition', 'goog.fx.TransitionBase', 'goog.fx.anim', 'goog.fx.anim.Animated'], {});
+goog.addDependency('fx/animation_test.js', ['goog.fx.AnimationTest'], ['goog.events', 'goog.fx.Animation', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/animationqueue.js', ['goog.fx.AnimationParallelQueue', 'goog.fx.AnimationQueue', 'goog.fx.AnimationSerialQueue'], ['goog.array', 'goog.asserts', 'goog.events', 'goog.fx.Transition', 'goog.fx.TransitionBase'], {});
+goog.addDependency('fx/animationqueue_test.js', ['goog.fx.AnimationQueueTest'], ['goog.events', 'goog.fx.Animation', 'goog.fx.AnimationParallelQueue', 'goog.fx.AnimationSerialQueue', 'goog.fx.Transition', 'goog.fx.anim', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/css3/fx.js', ['goog.fx.css3'], ['goog.fx.css3.Transition'], {});
+goog.addDependency('fx/css3/transition.js', ['goog.fx.css3.Transition'], ['goog.Timer', 'goog.asserts', 'goog.fx.TransitionBase', 'goog.style', 'goog.style.transition'], {});
+goog.addDependency('fx/css3/transition_test.js', ['goog.fx.css3.TransitionTest'], ['goog.dispose', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.fx.Transition', 'goog.fx.css3.Transition', 'goog.style.transition', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('fx/cssspriteanimation.js', ['goog.fx.CssSpriteAnimation'], ['goog.fx.Animation'], {});
+goog.addDependency('fx/cssspriteanimation_test.js', ['goog.fx.CssSpriteAnimationTest'], ['goog.fx.CssSpriteAnimation', 'goog.math.Box', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/dom.js', ['goog.fx.dom', 'goog.fx.dom.BgColorTransform', 'goog.fx.dom.ColorTransform', 'goog.fx.dom.Fade', 'goog.fx.dom.FadeIn', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOut', 'goog.fx.dom.FadeOutAndHide', 'goog.fx.dom.PredefinedEffect', 'goog.fx.dom.Resize', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Scroll', 'goog.fx.dom.Slide', 'goog.fx.dom.SlideFrom', 'goog.fx.dom.Swipe'], ['goog.color', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.style', 'goog.style.bidi'], {});
+goog.addDependency('fx/dragdrop.js', ['goog.fx.DragDrop'], ['goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem'], {});
+goog.addDependency('fx/dragdropgroup.js', ['goog.fx.DragDropGroup'], ['goog.dom', 'goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem'], {});
+goog.addDependency('fx/dragdropgroup_test.js', ['goog.fx.DragDropGroupTest'], ['goog.events', 'goog.fx.DragDropGroup', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/dragger.js', ['goog.fx.DragEvent', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.style', 'goog.style.bidi', 'goog.userAgent'], {});
+goog.addDependency('fx/dragger_test.js', ['goog.fx.DraggerTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.style.bidi', 'goog.testing.StrictMock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('fx/draglistgroup.js', ['goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.DragListGroup.EventType', 'goog.fx.DragListGroupEvent'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Coordinate', 'goog.string', 'goog.style'], {});
+goog.addDependency('fx/draglistgroup_test.js', ['goog.fx.DragListGroupTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventType', 'goog.fx.DragEvent', 'goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.Dragger', 'goog.math.Coordinate', 'goog.object', 'goog.testing.events', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/dragscrollsupport.js', ['goog.fx.DragScrollSupport'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.style'], {});
+goog.addDependency('fx/dragscrollsupport_test.js', ['goog.fx.DragScrollSupportTest'], ['goog.fx.DragScrollSupport', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/easing.js', ['goog.fx.easing'], [], {});
+goog.addDependency('fx/easing_test.js', ['goog.fx.easingTest'], ['goog.fx.easing', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/fx.js', ['goog.fx'], ['goog.asserts', 'goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent', 'goog.fx.Transition.EventType', 'goog.fx.easing'], {});
+goog.addDependency('fx/fx_test.js', ['goog.fxTest'], ['goog.fx.Animation', 'goog.object', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/transition.js', ['goog.fx.Transition', 'goog.fx.Transition.EventType'], [], {});
+goog.addDependency('fx/transitionbase.js', ['goog.fx.TransitionBase', 'goog.fx.TransitionBase.State'], ['goog.events.EventTarget', 'goog.fx.Transition'], {});
+goog.addDependency('graphics/abstractgraphics.js', ['goog.graphics.AbstractGraphics'], ['goog.dom', 'goog.graphics.Path', 'goog.math.Coordinate', 'goog.math.Size', 'goog.style', 'goog.ui.Component'], {});
+goog.addDependency('graphics/affinetransform.js', ['goog.graphics.AffineTransform'], ['goog.math'], {});
+goog.addDependency('graphics/canvaselement.js', ['goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.Path', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement', 'goog.html.SafeHtml', 'goog.html.uncheckedconversions', 'goog.math', 'goog.string', 'goog.string.Const'], {});
+goog.addDependency('graphics/canvasgraphics.js', ['goog.graphics.CanvasGraphics'], ['goog.dom.TagName', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement', 'goog.graphics.SolidFill', 'goog.math.Size', 'goog.style'], {});
+goog.addDependency('graphics/canvasgraphics_test.js', ['goog.graphics.CanvasGraphicsTest'], ['goog.dom', 'goog.graphics.CanvasGraphics', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.testing.jsunit'], {});
+goog.addDependency('graphics/element.js', ['goog.graphics.Element'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.events.Listenable', 'goog.graphics.AffineTransform', 'goog.math'], {});
+goog.addDependency('graphics/ellipseelement.js', ['goog.graphics.EllipseElement'], ['goog.graphics.StrokeAndFillElement'], {});
+goog.addDependency('graphics/ext/coordinates.js', ['goog.graphics.ext.coordinates'], ['goog.string'], {});
+goog.addDependency('graphics/ext/element.js', ['goog.graphics.ext.Element'], ['goog.events.EventTarget', 'goog.functions', 'goog.graphics.ext.coordinates'], {});
+goog.addDependency('graphics/ext/ellipse.js', ['goog.graphics.ext.Ellipse'], ['goog.graphics.ext.StrokeAndFillElement'], {});
+goog.addDependency('graphics/ext/ext.js', ['goog.graphics.ext'], ['goog.graphics.ext.Ellipse', 'goog.graphics.ext.Graphics', 'goog.graphics.ext.Group', 'goog.graphics.ext.Image', 'goog.graphics.ext.Rectangle', 'goog.graphics.ext.Shape', 'goog.graphics.ext.coordinates'], {});
+goog.addDependency('graphics/ext/graphics.js', ['goog.graphics.ext.Graphics'], ['goog.events', 'goog.events.EventType', 'goog.graphics', 'goog.graphics.ext.Group'], {});
+goog.addDependency('graphics/ext/group.js', ['goog.graphics.ext.Group'], ['goog.array', 'goog.graphics.ext.Element'], {});
+goog.addDependency('graphics/ext/image.js', ['goog.graphics.ext.Image'], ['goog.graphics.ext.Element'], {});
+goog.addDependency('graphics/ext/path.js', ['goog.graphics.ext.Path'], ['goog.graphics.AffineTransform', 'goog.graphics.Path', 'goog.math.Rect'], {});
+goog.addDependency('graphics/ext/rectangle.js', ['goog.graphics.ext.Rectangle'], ['goog.graphics.ext.StrokeAndFillElement'], {});
+goog.addDependency('graphics/ext/shape.js', ['goog.graphics.ext.Shape'], ['goog.graphics.ext.StrokeAndFillElement'], {});
+goog.addDependency('graphics/ext/strokeandfillelement.js', ['goog.graphics.ext.StrokeAndFillElement'], ['goog.graphics.ext.Element'], {});
+goog.addDependency('graphics/fill.js', ['goog.graphics.Fill'], [], {});
+goog.addDependency('graphics/font.js', ['goog.graphics.Font'], [], {});
+goog.addDependency('graphics/graphics.js', ['goog.graphics'], ['goog.dom', 'goog.graphics.CanvasGraphics', 'goog.graphics.SvgGraphics', 'goog.graphics.VmlGraphics', 'goog.userAgent'], {});
+goog.addDependency('graphics/groupelement.js', ['goog.graphics.GroupElement'], ['goog.graphics.Element'], {});
+goog.addDependency('graphics/imageelement.js', ['goog.graphics.ImageElement'], ['goog.graphics.Element'], {});
+goog.addDependency('graphics/lineargradient.js', ['goog.graphics.LinearGradient'], ['goog.asserts', 'goog.graphics.Fill'], {});
+goog.addDependency('graphics/path.js', ['goog.graphics.Path', 'goog.graphics.Path.Segment'], ['goog.array', 'goog.math'], {});
+goog.addDependency('graphics/pathelement.js', ['goog.graphics.PathElement'], ['goog.graphics.StrokeAndFillElement'], {});
+goog.addDependency('graphics/paths.js', ['goog.graphics.paths'], ['goog.graphics.Path', 'goog.math.Coordinate'], {});
+goog.addDependency('graphics/rectelement.js', ['goog.graphics.RectElement'], ['goog.graphics.StrokeAndFillElement'], {});
+goog.addDependency('graphics/solidfill.js', ['goog.graphics.SolidFill'], ['goog.graphics.Fill'], {});
+goog.addDependency('graphics/stroke.js', ['goog.graphics.Stroke'], [], {});
+goog.addDependency('graphics/strokeandfillelement.js', ['goog.graphics.StrokeAndFillElement'], ['goog.graphics.Element'], {});
+goog.addDependency('graphics/svgelement.js', ['goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement'], ['goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement'], {});
+goog.addDependency('graphics/svggraphics.js', ['goog.graphics.SvgGraphics'], ['goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.LinearGradient', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement', 'goog.math', 'goog.math.Size', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('graphics/textelement.js', ['goog.graphics.TextElement'], ['goog.graphics.StrokeAndFillElement'], {});
+goog.addDependency('graphics/vmlelement.js', ['goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement'], ['goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement'], {});
+goog.addDependency('graphics/vmlgraphics.js', ['goog.graphics.VmlGraphics'], ['goog.array', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.LinearGradient', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement', 'goog.html.uncheckedconversions', 'goog.math', 'goog.math.Size', 'goog.reflect', 'goog.string', 'goog.string.Const', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('history/event.js', ['goog.history.Event'], ['goog.events.Event', 'goog.history.EventType'], {});
+goog.addDependency('history/eventtype.js', ['goog.history.EventType'], [], {});
+goog.addDependency('history/history.js', ['goog.History', 'goog.History.Event', 'goog.History.EventType'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.safe', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event', 'goog.history.EventType', 'goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.labs.userAgent.device', 'goog.memoize', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('history/history_test.js', ['goog.HistoryTest'], ['goog.History', 'goog.dispose', 'goog.dom', 'goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('history/html5history.js', ['goog.history.Html5History', 'goog.history.Html5History.TokenTransformer'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event'], {});
+goog.addDependency('history/html5history_test.js', ['goog.history.Html5HistoryTest'], ['goog.Timer', 'goog.events', 'goog.events.EventType', 'goog.history.EventType', 'goog.history.Html5History', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.recordFunction'], {});
+goog.addDependency('html/flash.js', ['goog.html.flash'], ['goog.asserts', 'goog.html.SafeHtml'], {});
+goog.addDependency('html/flash_test.js', ['goog.html.flashTest'], ['goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.html.flash', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/legacyconversions.js', ['goog.html.legacyconversions'], ['goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl'], {});
+goog.addDependency('html/legacyconversions_test.js', ['goog.html.legacyconversionsTest'], ['goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.legacyconversions', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safehtml.js', ['goog.html.SafeHtml'], ['goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.tags', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.labs.userAgent.browser', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/safehtml_test.js', ['goog.html.safeHtmlTest'], ['goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.testing', 'goog.i18n.bidi.Dir', 'goog.labs.userAgent.browser', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safehtmlformatter.js', ['goog.html.SafeHtmlFormatter'], ['goog.asserts', 'goog.dom.tags', 'goog.html.SafeHtml', 'goog.string'], {});
+goog.addDependency('html/safehtmlformatter_test.js', ['goog.html.safeHtmlFormatterTest'], ['goog.html.SafeHtml', 'goog.html.SafeHtmlFormatter', 'goog.string', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safescript.js', ['goog.html.SafeScript'], ['goog.asserts', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/safescript_test.js', ['goog.html.safeScriptTest'], ['goog.html.SafeScript', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safestyle.js', ['goog.html.SafeStyle'], ['goog.array', 'goog.asserts', 'goog.string', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/safestyle_test.js', ['goog.html.safeStyleTest'], ['goog.html.SafeStyle', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safestylesheet.js', ['goog.html.SafeStyleSheet'], ['goog.array', 'goog.asserts', 'goog.string', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/safestylesheet_test.js', ['goog.html.safeStyleSheetTest'], ['goog.html.SafeStyleSheet', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safeurl.js', ['goog.html.SafeUrl'], ['goog.asserts', 'goog.fs.url', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.string', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/safeurl_test.js', ['goog.html.safeUrlTest'], ['goog.html.SafeUrl', 'goog.i18n.bidi.Dir', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('html/sanitizer/attributewhitelist.js', ['goog.html.sanitizer.AttributeWhitelist'], [], {});
+goog.addDependency('html/sanitizer/csssanitizer.js', ['goog.html.sanitizer.CssSanitizer'], ['goog.array', 'goog.object', 'goog.string'], {});
+goog.addDependency('html/sanitizer/htmlsanitizer.js', ['goog.html.sanitizer.HtmlSanitizer', 'goog.html.sanitizer.HtmlSanitizer.Builder', 'goog.html.sanitizer.HtmlSanitizerPolicy', 'goog.html.sanitizer.HtmlSanitizerPolicyContext', 'goog.html.sanitizer.HtmlSanitizerPolicyHints'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.functions', 'goog.html.SafeUrl', 'goog.html.sanitizer.AttributeWhitelist', 'goog.html.sanitizer.CssSanitizer', 'goog.html.sanitizer.TagBlacklist', 'goog.html.sanitizer.TagWhitelist', 'goog.html.uncheckedconversions', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('html/sanitizer/tagblacklist.js', ['goog.html.sanitizer.TagBlacklist'], [], {});
+goog.addDependency('html/sanitizer/tagwhitelist.js', ['goog.html.sanitizer.TagWhitelist'], [], {});
+goog.addDependency('html/silverlight.js', ['goog.html.silverlight'], ['goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.html.flash', 'goog.string.Const'], {});
+goog.addDependency('html/silverlight_test.js', ['goog.html.silverlightTest'], ['goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.html.silverlight', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/testing.js', ['goog.html.testing'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl'], {});
+goog.addDependency('html/trustedresourceurl.js', ['goog.html.TrustedResourceUrl'], ['goog.asserts', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/trustedresourceurl_test.js', ['goog.html.trustedResourceUrlTest'], ['goog.html.TrustedResourceUrl', 'goog.i18n.bidi.Dir', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/uncheckedconversions.js', ['goog.html.uncheckedconversions'], ['goog.asserts', 'goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.string', 'goog.string.Const'], {});
+goog.addDependency('html/uncheckedconversions_test.js', ['goog.html.uncheckedconversionsTest'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.uncheckedconversions', 'goog.i18n.bidi.Dir', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/utils.js', ['goog.html.utils'], ['goog.string'], {});
+goog.addDependency('html/utils_test.js', ['goog.html.UtilsTest'], ['goog.array', 'goog.dom.TagName', 'goog.html.utils', 'goog.object', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/bidi.js', ['goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.i18n.bidi.Format'], [], {});
+goog.addDependency('i18n/bidi_test.js', ['goog.i18n.bidiTest'], ['goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/bidiformatter.js', ['goog.i18n.BidiFormatter'], ['goog.html.SafeHtml', 'goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.Format'], {});
+goog.addDependency('i18n/bidiformatter_test.js', ['goog.i18n.BidiFormatterTest'], ['goog.html.SafeHtml', 'goog.html.testing', 'goog.i18n.BidiFormatter', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.Format', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/charlistdecompressor.js', ['goog.i18n.CharListDecompressor'], ['goog.array', 'goog.i18n.uChar'], {});
+goog.addDependency('i18n/charlistdecompressor_test.js', ['goog.i18n.CharListDecompressorTest'], ['goog.i18n.CharListDecompressor', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/charpickerdata.js', ['goog.i18n.CharPickerData'], [], {});
+goog.addDependency('i18n/collation.js', ['goog.i18n.collation'], [], {});
+goog.addDependency('i18n/collation_test.js', ['goog.i18n.collationTest'], ['goog.i18n.collation', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('i18n/compactnumberformatsymbols.js', ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_af', 'goog.i18n.CompactNumberFormatSymbols_af_ZA', 'goog.i18n.CompactNumberFormatSymbols_am', 'goog.i18n.CompactNumberFormatSymbols_am_ET', 'goog.i18n.CompactNumberFormatSymbols_ar', 'goog.i18n.CompactNumberFormatSymbols_ar_001', 'goog.i18n.CompactNumberFormatSymbols_ar_EG', 'goog.i18n.CompactNumberFormatSymbols_ar_XB', 'goog.i18n.CompactNumberFormatSymbols_az', 'goog.i18n.CompactNumberFormatSymbols_az_Latn', 'goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ', 'goog.i18n.CompactNumberFormatSymbols_be', 'goog.i18n.CompactNumberFormatSymbols_be_BY', 'goog.i18n.CompactNumberFormatSymbols_bg', 'goog.i18n.CompactNumberFormatSymbols_bg_BG', 'goog.i18n.CompactNumberFormatSymbols_bn', 'goog.i18n.CompactNumberFormatSymbols_bn_BD', 'goog.i18n.CompactNumberFormatSymbols_br', 'goog.i18n.CompactNumberFormatSymbols_br_FR', 'goog.i18n.CompactNumberFormatSymbols_bs', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_ca', 'goog.i18n.CompactNumberFormatSymbols_ca_AD', 'goog.i18n.CompactNumberFormatSymbols_ca_ES', 'goog.i18n.CompactNumberFormatSymbols_ca_ES_VALENCIA', 'goog.i18n.CompactNumberFormatSymbols_ca_FR', 'goog.i18n.CompactNumberFormatSymbols_ca_IT', 'goog.i18n.CompactNumberFormatSymbols_chr', 'goog.i18n.CompactNumberFormatSymbols_chr_US', 'goog.i18n.CompactNumberFormatSymbols_cs', 'goog.i18n.CompactNumberFormatSymbols_cs_CZ', 'goog.i18n.CompactNumberFormatSymbols_cy', 'goog.i18n.CompactNumberFormatSymbols_cy_GB', 'goog.i18n.CompactNumberFormatSymbols_da', 'goog.i18n.CompactNumberFormatSymbols_da_DK', 'goog.i18n.CompactNumberFormatSymbols_da_GL', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_de_AT', 'goog.i18n.CompactNumberFormatSymbols_de_BE', 'goog.i18n.CompactNumberFormatSymbols_de_CH', 'goog.i18n.CompactNumberFormatSymbols_de_DE', 'goog.i18n.CompactNumberFormatSymbols_de_LU', 'goog.i18n.CompactNumberFormatSymbols_el', 'goog.i18n.CompactNumberFormatSymbols_el_CY', 'goog.i18n.CompactNumberFormatSymbols_el_GR', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_en_001', 'goog.i18n.CompactNumberFormatSymbols_en_AS', 'goog.i18n.CompactNumberFormatSymbols_en_AU', 'goog.i18n.CompactNumberFormatSymbols_en_CA', 'goog.i18n.CompactNumberFormatSymbols_en_DG', 'goog.i18n.CompactNumberFormatSymbols_en_FM', 'goog.i18n.CompactNumberFormatSymbols_en_GB', 'goog.i18n.CompactNumberFormatSymbols_en_GU', 'goog.i18n.CompactNumberFormatSymbols_en_IE', 'goog.i18n.CompactNumberFormatSymbols_en_IN', 'goog.i18n.CompactNumberFormatSymbols_en_IO', 'goog.i18n.CompactNumberFormatSymbols_en_MH', 'goog.i18n.CompactNumberFormatSymbols_en_MP', 'goog.i18n.CompactNumberFormatSymbols_en_PR', 'goog.i18n.CompactNumberFormatSymbols_en_PW', 'goog.i18n.CompactNumberFormatSymbols_en_SG', 'goog.i18n.CompactNumberFormatSymbols_en_TC', 'goog.i18n.CompactNumberFormatSymbols_en_UM', 'goog.i18n.CompactNumberFormatSymbols_en_US', 'goog.i18n.CompactNumberFormatSymbols_en_VG', 'goog.i18n.CompactNumberFormatSymbols_en_VI', 'goog.i18n.CompactNumberFormatSymbols_en_XA', 'goog.i18n.CompactNumberFormatSymbols_en_ZA', 'goog.i18n.CompactNumberFormatSymbols_en_ZW', 'goog.i18n.CompactNumberFormatSymbols_es', 'goog.i18n.CompactNumberFormatSymbols_es_419', 'goog.i18n.CompactNumberFormatSymbols_es_EA', 'goog.i18n.CompactNumberFormatSymbols_es_ES', 'goog.i18n.CompactNumberFormatSymbols_es_IC', 'goog.i18n.CompactNumberFormatSymbols_es_MX', 'goog.i18n.CompactNumberFormatSymbols_es_US', 'goog.i18n.CompactNumberFormatSymbols_et', 'goog.i18n.CompactNumberFormatSymbols_et_EE', 'goog.i18n.CompactNumberFormatSymbols_eu', 'goog.i18n.CompactNumberFormatSymbols_eu_ES', 'goog.i18n.CompactNumberFormatSymbols_fa', 'goog.i18n.CompactNumberFormatSymbols_fa_IR', 'goog.i18n.CompactNumberFormatSymbols_fi', 'goog.i18n.CompactNumberFormatSymbols_fi_FI', 'goog.i18n.CompactNumberFormatSymbols_fil', 'goog.i18n.CompactNumberFormatSymbols_fil_PH', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.CompactNumberFormatSymbols_fr_BL', 'goog.i18n.CompactNumberFormatSymbols_fr_CA', 'goog.i18n.CompactNumberFormatSymbols_fr_FR', 'goog.i18n.CompactNumberFormatSymbols_fr_GF', 'goog.i18n.CompactNumberFormatSymbols_fr_GP', 'goog.i18n.CompactNumberFormatSymbols_fr_MC', 'goog.i18n.CompactNumberFormatSymbols_fr_MF', 'goog.i18n.CompactNumberFormatSymbols_fr_MQ', 'goog.i18n.CompactNumberFormatSymbols_fr_PM', 'goog.i18n.CompactNumberFormatSymbols_fr_RE', 'goog.i18n.CompactNumberFormatSymbols_fr_YT', 'goog.i18n.CompactNumberFormatSymbols_ga', 'goog.i18n.CompactNumberFormatSymbols_ga_IE', 'goog.i18n.CompactNumberFormatSymbols_gl', 'goog.i18n.CompactNumberFormatSymbols_gl_ES', 'goog.i18n.CompactNumberFormatSymbols_gsw', 'goog.i18n.CompactNumberFormatSymbols_gsw_CH', 'goog.i18n.CompactNumberFormatSymbols_gsw_LI', 'goog.i18n.CompactNumberFormatSymbols_gu', 'goog.i18n.CompactNumberFormatSymbols_gu_IN', 'goog.i18n.CompactNumberFormatSymbols_haw', 'goog.i18n.CompactNumberFormatSymbols_haw_US', 'goog.i18n.CompactNumberFormatSymbols_he', 'goog.i18n.CompactNumberFormatSymbols_he_IL', 'goog.i18n.CompactNumberFormatSymbols_hi', 'goog.i18n.CompactNumberFormatSymbols_hi_IN', 'goog.i18n.CompactNumberFormatSymbols_hr', 'goog.i18n.CompactNumberFormatSymbols_hr_HR', 'goog.i18n.CompactNumberFormatSymbols_hu', 'goog.i18n.CompactNumberFormatSymbols_hu_HU', 'goog.i18n.CompactNumberFormatSymbols_hy', 'goog.i18n.CompactNumberFormatSymbols_hy_AM', 'goog.i18n.CompactNumberFormatSymbols_id', 'goog.i18n.CompactNumberFormatSymbols_id_ID', 'goog.i18n.CompactNumberFormatSymbols_in', 'goog.i18n.CompactNumberFormatSymbols_is', 'goog.i18n.CompactNumberFormatSymbols_is_IS', 'goog.i18n.CompactNumberFormatSymbols_it', 'goog.i18n.CompactNumberFormatSymbols_it_IT', 'goog.i18n.CompactNumberFormatSymbols_it_SM', 'goog.i18n.CompactNumberFormatSymbols_iw', 'goog.i18n.CompactNumberFormatSymbols_ja', 'goog.i18n.CompactNumberFormatSymbols_ja_JP', 'goog.i18n.CompactNumberFormatSymbols_ka', 'goog.i18n.CompactNumberFormatSymbols_ka_GE', 'goog.i18n.CompactNumberFormatSymbols_kk', 'goog.i18n.CompactNumberFormatSymbols_kk_KZ', 'goog.i18n.CompactNumberFormatSymbols_km', 'goog.i18n.CompactNumberFormatSymbols_km_KH', 'goog.i18n.CompactNumberFormatSymbols_kn', 'goog.i18n.CompactNumberFormatSymbols_kn_IN', 'goog.i18n.CompactNumberFormatSymbols_ko', 'goog.i18n.CompactNumberFormatSymbols_ko_KR', 'goog.i18n.CompactNumberFormatSymbols_ky', 'goog.i18n.CompactNumberFormatSymbols_ky_KG', 'goog.i18n.CompactNumberFormatSymbols_ln', 'goog.i18n.CompactNumberFormatSymbols_ln_CD', 'goog.i18n.CompactNumberFormatSymbols_lo', 'goog.i18n.CompactNumberFormatSymbols_lo_LA', 'goog.i18n.CompactNumberFormatSymbols_lt', 'goog.i18n.CompactNumberFormatSymbols_lt_LT', 'goog.i18n.CompactNumberFormatSymbols_lv', 'goog.i18n.CompactNumberFormatSymbols_lv_LV', 'goog.i18n.CompactNumberFormatSymbols_mk', 'goog.i18n.CompactNumberFormatSymbols_mk_MK', 'goog.i18n.CompactNumberFormatSymbols_ml', 'goog.i18n.CompactNumberFormatSymbols_ml_IN', 'goog.i18n.CompactNumberFormatSymbols_mn', 'goog.i18n.CompactNumberFormatSymbols_mn_MN', 'goog.i18n.CompactNumberFormatSymbols_mr', 'goog.i18n.CompactNumberFormatSymbols_mr_IN', 'goog.i18n.CompactNumberFormatSymbols_ms', 'goog.i18n.CompactNumberFormatSymbols_ms_MY', 'goog.i18n.CompactNumberFormatSymbols_mt', 'goog.i18n.CompactNumberFormatSymbols_mt_MT', 'goog.i18n.CompactNumberFormatSymbols_my', 'goog.i18n.CompactNumberFormatSymbols_my_MM', 'goog.i18n.CompactNumberFormatSymbols_nb', 'goog.i18n.CompactNumberFormatSymbols_nb_NO', 'goog.i18n.CompactNumberFormatSymbols_nb_SJ', 'goog.i18n.CompactNumberFormatSymbols_ne', 'goog.i18n.CompactNumberFormatSymbols_ne_NP', 'goog.i18n.CompactNumberFormatSymbols_nl', 'goog.i18n.CompactNumberFormatSymbols_nl_NL', 'goog.i18n.CompactNumberFormatSymbols_no', 'goog.i18n.CompactNumberFormatSymbols_no_NO', 'goog.i18n.CompactNumberFormatSymbols_or', 'goog.i18n.CompactNumberFormatSymbols_or_IN', 'goog.i18n.CompactNumberFormatSymbols_pa', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN', 'goog.i18n.CompactNumberFormatSymbols_pl', 'goog.i18n.CompactNumberFormatSymbols_pl_PL', 'goog.i18n.CompactNumberFormatSymbols_pt', 'goog.i18n.CompactNumberFormatSymbols_pt_BR', 'goog.i18n.CompactNumberFormatSymbols_pt_PT', 'goog.i18n.CompactNumberFormatSymbols_ro', 'goog.i18n.CompactNumberFormatSymbols_ro_RO', 'goog.i18n.CompactNumberFormatSymbols_ru', 'goog.i18n.CompactNumberFormatSymbols_ru_RU', 'goog.i18n.CompactNumberFormatSymbols_si', 'goog.i18n.CompactNumberFormatSymbols_si_LK', 'goog.i18n.CompactNumberFormatSymbols_sk', 'goog.i18n.CompactNumberFormatSymbols_sk_SK', 'goog.i18n.CompactNumberFormatSymbols_sl', 'goog.i18n.CompactNumberFormatSymbols_sl_SI', 'goog.i18n.CompactNumberFormatSymbols_sq', 'goog.i18n.CompactNumberFormatSymbols_sq_AL', 'goog.i18n.CompactNumberFormatSymbols_sr', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS', 'goog.i18n.CompactNumberFormatSymbols_sv', 'goog.i18n.CompactNumberFormatSymbols_sv_SE', 'goog.i18n.CompactNumberFormatSymbols_sw', 'goog.i18n.CompactNumberFormatSymbols_sw_TZ', 'goog.i18n.CompactNumberFormatSymbols_ta', 'goog.i18n.CompactNumberFormatSymbols_ta_IN', 'goog.i18n.CompactNumberFormatSymbols_te', 'goog.i18n.CompactNumberFormatSymbols_te_IN', 'goog.i18n.CompactNumberFormatSymbols_th', 'goog.i18n.CompactNumberFormatSymbols_th_TH', 'goog.i18n.CompactNumberFormatSymbols_tl', 'goog.i18n.CompactNumberFormatSymbols_tr', 'goog.i18n.CompactNumberFormatSymbols_tr_TR', 'goog.i18n.CompactNumberFormatSymbols_uk', 'goog.i18n.CompactNumberFormatSymbols_uk_UA', 'goog.i18n.CompactNumberFormatSymbols_ur', 'goog.i18n.CompactNumberFormatSymbols_ur_PK', 'goog.i18n.CompactNumberFormatSymbols_uz', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.CompactNumberFormatSymbols_vi', 'goog.i18n.CompactNumberFormatSymbols_vi_VN', 'goog.i18n.CompactNumberFormatSymbols_zh', 'goog.i18n.CompactNumberFormatSymbols_zh_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_TW', 'goog.i18n.CompactNumberFormatSymbols_zu', 'goog.i18n.CompactNumberFormatSymbols_zu_ZA'], [], {});
+goog.addDependency('i18n/compactnumberformatsymbols_ext.js', ['goog.i18n.CompactNumberFormatSymbolsExt', 'goog.i18n.CompactNumberFormatSymbols_af_NA', 'goog.i18n.CompactNumberFormatSymbols_agq', 'goog.i18n.CompactNumberFormatSymbols_agq_CM', 'goog.i18n.CompactNumberFormatSymbols_ak', 'goog.i18n.CompactNumberFormatSymbols_ak_GH', 'goog.i18n.CompactNumberFormatSymbols_ar_AE', 'goog.i18n.CompactNumberFormatSymbols_ar_BH', 'goog.i18n.CompactNumberFormatSymbols_ar_DJ', 'goog.i18n.CompactNumberFormatSymbols_ar_DZ', 'goog.i18n.CompactNumberFormatSymbols_ar_EH', 'goog.i18n.CompactNumberFormatSymbols_ar_ER', 'goog.i18n.CompactNumberFormatSymbols_ar_IL', 'goog.i18n.CompactNumberFormatSymbols_ar_IQ', 'goog.i18n.CompactNumberFormatSymbols_ar_JO', 'goog.i18n.CompactNumberFormatSymbols_ar_KM', 'goog.i18n.CompactNumberFormatSymbols_ar_KW', 'goog.i18n.CompactNumberFormatSymbols_ar_LB', 'goog.i18n.CompactNumberFormatSymbols_ar_LY', 'goog.i18n.CompactNumberFormatSymbols_ar_MA', 'goog.i18n.CompactNumberFormatSymbols_ar_MR', 'goog.i18n.CompactNumberFormatSymbols_ar_OM', 'goog.i18n.CompactNumberFormatSymbols_ar_PS', 'goog.i18n.CompactNumberFormatSymbols_ar_QA', 'goog.i18n.CompactNumberFormatSymbols_ar_SA', 'goog.i18n.CompactNumberFormatSymbols_ar_SD', 'goog.i18n.CompactNumberFormatSymbols_ar_SO', 'goog.i18n.CompactNumberFormatSymbols_ar_SS', 'goog.i18n.CompactNumberFormatSymbols_ar_SY', 'goog.i18n.CompactNumberFormatSymbols_ar_TD', 'goog.i18n.CompactNumberFormatSymbols_ar_TN', 'goog.i18n.CompactNumberFormatSymbols_ar_YE', 'goog.i18n.CompactNumberFormatSymbols_as', 'goog.i18n.CompactNumberFormatSymbols_as_IN', 'goog.i18n.CompactNumberFormatSymbols_asa', 'goog.i18n.CompactNumberFormatSymbols_asa_TZ', 'goog.i18n.CompactNumberFormatSymbols_ast', 'goog.i18n.CompactNumberFormatSymbols_ast_ES', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.CompactNumberFormatSymbols_bas', 'goog.i18n.CompactNumberFormatSymbols_bas_CM', 'goog.i18n.CompactNumberFormatSymbols_bem', 'goog.i18n.CompactNumberFormatSymbols_bem_ZM', 'goog.i18n.CompactNumberFormatSymbols_bez', 'goog.i18n.CompactNumberFormatSymbols_bez_TZ', 'goog.i18n.CompactNumberFormatSymbols_bm', 'goog.i18n.CompactNumberFormatSymbols_bm_ML', 'goog.i18n.CompactNumberFormatSymbols_bn_IN', 'goog.i18n.CompactNumberFormatSymbols_bo', 'goog.i18n.CompactNumberFormatSymbols_bo_CN', 'goog.i18n.CompactNumberFormatSymbols_bo_IN', 'goog.i18n.CompactNumberFormatSymbols_brx', 'goog.i18n.CompactNumberFormatSymbols_brx_IN', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_ce', 'goog.i18n.CompactNumberFormatSymbols_ce_RU', 'goog.i18n.CompactNumberFormatSymbols_cgg', 'goog.i18n.CompactNumberFormatSymbols_cgg_UG', 'goog.i18n.CompactNumberFormatSymbols_ckb', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab_IQ', 'goog.i18n.CompactNumberFormatSymbols_ckb_Arab_IR', 'goog.i18n.CompactNumberFormatSymbols_ckb_IQ', 'goog.i18n.CompactNumberFormatSymbols_ckb_IR', 'goog.i18n.CompactNumberFormatSymbols_ckb_Latn', 'goog.i18n.CompactNumberFormatSymbols_ckb_Latn_IQ', 'goog.i18n.CompactNumberFormatSymbols_cu', 'goog.i18n.CompactNumberFormatSymbols_cu_RU', 'goog.i18n.CompactNumberFormatSymbols_dav', 'goog.i18n.CompactNumberFormatSymbols_dav_KE', 'goog.i18n.CompactNumberFormatSymbols_de_LI', 'goog.i18n.CompactNumberFormatSymbols_dje', 'goog.i18n.CompactNumberFormatSymbols_dje_NE', 'goog.i18n.CompactNumberFormatSymbols_dsb', 'goog.i18n.CompactNumberFormatSymbols_dsb_DE', 'goog.i18n.CompactNumberFormatSymbols_dua', 'goog.i18n.CompactNumberFormatSymbols_dua_CM', 'goog.i18n.CompactNumberFormatSymbols_dyo', 'goog.i18n.CompactNumberFormatSymbols_dyo_SN', 'goog.i18n.CompactNumberFormatSymbols_dz', 'goog.i18n.CompactNumberFormatSymbols_dz_BT', 'goog.i18n.CompactNumberFormatSymbols_ebu', 'goog.i18n.CompactNumberFormatSymbols_ebu_KE', 'goog.i18n.CompactNumberFormatSymbols_ee', 'goog.i18n.CompactNumberFormatSymbols_ee_GH', 'goog.i18n.CompactNumberFormatSymbols_ee_TG', 'goog.i18n.CompactNumberFormatSymbols_en_150', 'goog.i18n.CompactNumberFormatSymbols_en_AG', 'goog.i18n.CompactNumberFormatSymbols_en_AI', 'goog.i18n.CompactNumberFormatSymbols_en_AT', 'goog.i18n.CompactNumberFormatSymbols_en_BB', 'goog.i18n.CompactNumberFormatSymbols_en_BE', 'goog.i18n.CompactNumberFormatSymbols_en_BI', 'goog.i18n.CompactNumberFormatSymbols_en_BM', 'goog.i18n.CompactNumberFormatSymbols_en_BS', 'goog.i18n.CompactNumberFormatSymbols_en_BW', 'goog.i18n.CompactNumberFormatSymbols_en_BZ', 'goog.i18n.CompactNumberFormatSymbols_en_CC', 'goog.i18n.CompactNumberFormatSymbols_en_CH', 'goog.i18n.CompactNumberFormatSymbols_en_CK', 'goog.i18n.CompactNumberFormatSymbols_en_CM', 'goog.i18n.CompactNumberFormatSymbols_en_CX', 'goog.i18n.CompactNumberFormatSymbols_en_CY', 'goog.i18n.CompactNumberFormatSymbols_en_DE', 'goog.i18n.CompactNumberFormatSymbols_en_DK', 'goog.i18n.CompactNumberFormatSymbols_en_DM', 'goog.i18n.CompactNumberFormatSymbols_en_ER', 'goog.i18n.CompactNumberFormatSymbols_en_FI', 'goog.i18n.CompactNumberFormatSymbols_en_FJ', 'goog.i18n.CompactNumberFormatSymbols_en_FK', 'goog.i18n.CompactNumberFormatSymbols_en_GD', 'goog.i18n.CompactNumberFormatSymbols_en_GG', 'goog.i18n.CompactNumberFormatSymbols_en_GH', 'goog.i18n.CompactNumberFormatSymbols_en_GI', 'goog.i18n.CompactNumberFormatSymbols_en_GM', 'goog.i18n.CompactNumberFormatSymbols_en_GY', 'goog.i18n.CompactNumberFormatSymbols_en_HK', 'goog.i18n.CompactNumberFormatSymbols_en_IL', 'goog.i18n.CompactNumberFormatSymbols_en_IM', 'goog.i18n.CompactNumberFormatSymbols_en_JE', 'goog.i18n.CompactNumberFormatSymbols_en_JM', 'goog.i18n.CompactNumberFormatSymbols_en_KE', 'goog.i18n.CompactNumberFormatSymbols_en_KI', 'goog.i18n.CompactNumberFormatSymbols_en_KN', 'goog.i18n.CompactNumberFormatSymbols_en_KY', 'goog.i18n.CompactNumberFormatSymbols_en_LC', 'goog.i18n.CompactNumberFormatSymbols_en_LR', 'goog.i18n.CompactNumberFormatSymbols_en_LS', 'goog.i18n.CompactNumberFormatSymbols_en_MG', 'goog.i18n.CompactNumberFormatSymbols_en_MO', 'goog.i18n.CompactNumberFormatSymbols_en_MS', 'goog.i18n.CompactNumberFormatSymbols_en_MT', 'goog.i18n.CompactNumberFormatSymbols_en_MU', 'goog.i18n.CompactNumberFormatSymbols_en_MW', 'goog.i18n.CompactNumberFormatSymbols_en_MY', 'goog.i18n.CompactNumberFormatSymbols_en_NA', 'goog.i18n.CompactNumberFormatSymbols_en_NF', 'goog.i18n.CompactNumberFormatSymbols_en_NG', 'goog.i18n.CompactNumberFormatSymbols_en_NL', 'goog.i18n.CompactNumberFormatSymbols_en_NR', 'goog.i18n.CompactNumberFormatSymbols_en_NU', 'goog.i18n.CompactNumberFormatSymbols_en_NZ', 'goog.i18n.CompactNumberFormatSymbols_en_PG', 'goog.i18n.CompactNumberFormatSymbols_en_PH', 'goog.i18n.CompactNumberFormatSymbols_en_PK', 'goog.i18n.CompactNumberFormatSymbols_en_PN', 'goog.i18n.CompactNumberFormatSymbols_en_RW', 'goog.i18n.CompactNumberFormatSymbols_en_SB', 'goog.i18n.CompactNumberFormatSymbols_en_SC', 'goog.i18n.CompactNumberFormatSymbols_en_SD', 'goog.i18n.CompactNumberFormatSymbols_en_SE', 'goog.i18n.CompactNumberFormatSymbols_en_SH', 'goog.i18n.CompactNumberFormatSymbols_en_SI', 'goog.i18n.CompactNumberFormatSymbols_en_SL', 'goog.i18n.CompactNumberFormatSymbols_en_SS', 'goog.i18n.CompactNumberFormatSymbols_en_SX', 'goog.i18n.CompactNumberFormatSymbols_en_SZ', 'goog.i18n.CompactNumberFormatSymbols_en_TK', 'goog.i18n.CompactNumberFormatSymbols_en_TO', 'goog.i18n.CompactNumberFormatSymbols_en_TT', 'goog.i18n.CompactNumberFormatSymbols_en_TV', 'goog.i18n.CompactNumberFormatSymbols_en_TZ', 'goog.i18n.CompactNumberFormatSymbols_en_UG', 'goog.i18n.CompactNumberFormatSymbols_en_VC', 'goog.i18n.CompactNumberFormatSymbols_en_VU', 'goog.i18n.CompactNumberFormatSymbols_en_WS', 'goog.i18n.CompactNumberFormatSymbols_en_ZM', 'goog.i18n.CompactNumberFormatSymbols_eo', 'goog.i18n.CompactNumberFormatSymbols_eo_001', 'goog.i18n.CompactNumberFormatSymbols_es_AR', 'goog.i18n.CompactNumberFormatSymbols_es_BO', 'goog.i18n.CompactNumberFormatSymbols_es_BR', 'goog.i18n.CompactNumberFormatSymbols_es_CL', 'goog.i18n.CompactNumberFormatSymbols_es_CO', 'goog.i18n.CompactNumberFormatSymbols_es_CR', 'goog.i18n.CompactNumberFormatSymbols_es_CU', 'goog.i18n.CompactNumberFormatSymbols_es_DO', 'goog.i18n.CompactNumberFormatSymbols_es_EC', 'goog.i18n.CompactNumberFormatSymbols_es_GQ', 'goog.i18n.CompactNumberFormatSymbols_es_GT', 'goog.i18n.CompactNumberFormatSymbols_es_HN', 'goog.i18n.CompactNumberFormatSymbols_es_NI', 'goog.i18n.CompactNumberFormatSymbols_es_PA', 'goog.i18n.CompactNumberFormatSymbols_es_PE', 'goog.i18n.CompactNumberFormatSymbols_es_PH', 'goog.i18n.CompactNumberFormatSymbols_es_PR', 'goog.i18n.CompactNumberFormatSymbols_es_PY', 'goog.i18n.CompactNumberFormatSymbols_es_SV', 'goog.i18n.CompactNumberFormatSymbols_es_UY', 'goog.i18n.CompactNumberFormatSymbols_es_VE', 'goog.i18n.CompactNumberFormatSymbols_ewo', 'goog.i18n.CompactNumberFormatSymbols_ewo_CM', 'goog.i18n.CompactNumberFormatSymbols_fa_AF', 'goog.i18n.CompactNumberFormatSymbols_ff', 'goog.i18n.CompactNumberFormatSymbols_ff_CM', 'goog.i18n.CompactNumberFormatSymbols_ff_GN', 'goog.i18n.CompactNumberFormatSymbols_ff_MR', 'goog.i18n.CompactNumberFormatSymbols_ff_SN', 'goog.i18n.CompactNumberFormatSymbols_fo', 'goog.i18n.CompactNumberFormatSymbols_fo_DK', 'goog.i18n.CompactNumberFormatSymbols_fo_FO', 'goog.i18n.CompactNumberFormatSymbols_fr_BE', 'goog.i18n.CompactNumberFormatSymbols_fr_BF', 'goog.i18n.CompactNumberFormatSymbols_fr_BI', 'goog.i18n.CompactNumberFormatSymbols_fr_BJ', 'goog.i18n.CompactNumberFormatSymbols_fr_CD', 'goog.i18n.CompactNumberFormatSymbols_fr_CF', 'goog.i18n.CompactNumberFormatSymbols_fr_CG', 'goog.i18n.CompactNumberFormatSymbols_fr_CH', 'goog.i18n.CompactNumberFormatSymbols_fr_CI', 'goog.i18n.CompactNumberFormatSymbols_fr_CM', 'goog.i18n.CompactNumberFormatSymbols_fr_DJ', 'goog.i18n.CompactNumberFormatSymbols_fr_DZ', 'goog.i18n.CompactNumberFormatSymbols_fr_GA', 'goog.i18n.CompactNumberFormatSymbols_fr_GN', 'goog.i18n.CompactNumberFormatSymbols_fr_GQ', 'goog.i18n.CompactNumberFormatSymbols_fr_HT', 'goog.i18n.CompactNumberFormatSymbols_fr_KM', 'goog.i18n.CompactNumberFormatSymbols_fr_LU', 'goog.i18n.CompactNumberFormatSymbols_fr_MA', 'goog.i18n.CompactNumberFormatSymbols_fr_MG', 'goog.i18n.CompactNumberFormatSymbols_fr_ML', 'goog.i18n.CompactNumberFormatSymbols_fr_MR', 'goog.i18n.CompactNumberFormatSymbols_fr_MU', 'goog.i18n.CompactNumberFormatSymbols_fr_NC', 'goog.i18n.CompactNumberFormatSymbols_fr_NE', 'goog.i18n.CompactNumberFormatSymbols_fr_PF', 'goog.i18n.CompactNumberFormatSymbols_fr_RW', 'goog.i18n.CompactNumberFormatSymbols_fr_SC', 'goog.i18n.CompactNumberFormatSymbols_fr_SN', 'goog.i18n.CompactNumberFormatSymbols_fr_SY', 'goog.i18n.CompactNumberFormatSymbols_fr_TD', 'goog.i18n.CompactNumberFormatSymbols_fr_TG', 'goog.i18n.CompactNumberFormatSymbols_fr_TN', 'goog.i18n.CompactNumberFormatSymbols_fr_VU', 'goog.i18n.CompactNumberFormatSymbols_fr_WF', 'goog.i18n.CompactNumberFormatSymbols_fur', 'goog.i18n.CompactNumberFormatSymbols_fur_IT', 'goog.i18n.CompactNumberFormatSymbols_fy', 'goog.i18n.CompactNumberFormatSymbols_fy_NL', 'goog.i18n.CompactNumberFormatSymbols_gd', 'goog.i18n.CompactNumberFormatSymbols_gd_GB', 'goog.i18n.CompactNumberFormatSymbols_gsw_FR', 'goog.i18n.CompactNumberFormatSymbols_guz', 'goog.i18n.CompactNumberFormatSymbols_guz_KE', 'goog.i18n.CompactNumberFormatSymbols_gv', 'goog.i18n.CompactNumberFormatSymbols_gv_IM', 'goog.i18n.CompactNumberFormatSymbols_ha', 'goog.i18n.CompactNumberFormatSymbols_ha_GH', 'goog.i18n.CompactNumberFormatSymbols_ha_NE', 'goog.i18n.CompactNumberFormatSymbols_ha_NG', 'goog.i18n.CompactNumberFormatSymbols_hr_BA', 'goog.i18n.CompactNumberFormatSymbols_hsb', 'goog.i18n.CompactNumberFormatSymbols_hsb_DE', 'goog.i18n.CompactNumberFormatSymbols_ig', 'goog.i18n.CompactNumberFormatSymbols_ig_NG', 'goog.i18n.CompactNumberFormatSymbols_ii', 'goog.i18n.CompactNumberFormatSymbols_ii_CN', 'goog.i18n.CompactNumberFormatSymbols_it_CH', 'goog.i18n.CompactNumberFormatSymbols_jgo', 'goog.i18n.CompactNumberFormatSymbols_jgo_CM', 'goog.i18n.CompactNumberFormatSymbols_jmc', 'goog.i18n.CompactNumberFormatSymbols_jmc_TZ', 'goog.i18n.CompactNumberFormatSymbols_kab', 'goog.i18n.CompactNumberFormatSymbols_kab_DZ', 'goog.i18n.CompactNumberFormatSymbols_kam', 'goog.i18n.CompactNumberFormatSymbols_kam_KE', 'goog.i18n.CompactNumberFormatSymbols_kde', 'goog.i18n.CompactNumberFormatSymbols_kde_TZ', 'goog.i18n.CompactNumberFormatSymbols_kea', 'goog.i18n.CompactNumberFormatSymbols_kea_CV', 'goog.i18n.CompactNumberFormatSymbols_khq', 'goog.i18n.CompactNumberFormatSymbols_khq_ML', 'goog.i18n.CompactNumberFormatSymbols_ki', 'goog.i18n.CompactNumberFormatSymbols_ki_KE', 'goog.i18n.CompactNumberFormatSymbols_kkj', 'goog.i18n.CompactNumberFormatSymbols_kkj_CM', 'goog.i18n.CompactNumberFormatSymbols_kl', 'goog.i18n.CompactNumberFormatSymbols_kl_GL', 'goog.i18n.CompactNumberFormatSymbols_kln', 'goog.i18n.CompactNumberFormatSymbols_kln_KE', 'goog.i18n.CompactNumberFormatSymbols_ko_KP', 'goog.i18n.CompactNumberFormatSymbols_kok', 'goog.i18n.CompactNumberFormatSymbols_kok_IN', 'goog.i18n.CompactNumberFormatSymbols_ks', 'goog.i18n.CompactNumberFormatSymbols_ks_IN', 'goog.i18n.CompactNumberFormatSymbols_ksb', 'goog.i18n.CompactNumberFormatSymbols_ksb_TZ', 'goog.i18n.CompactNumberFormatSymbols_ksf', 'goog.i18n.CompactNumberFormatSymbols_ksf_CM', 'goog.i18n.CompactNumberFormatSymbols_ksh', 'goog.i18n.CompactNumberFormatSymbols_ksh_DE', 'goog.i18n.CompactNumberFormatSymbols_kw', 'goog.i18n.CompactNumberFormatSymbols_kw_GB', 'goog.i18n.CompactNumberFormatSymbols_lag', 'goog.i18n.CompactNumberFormatSymbols_lag_TZ', 'goog.i18n.CompactNumberFormatSymbols_lb', 'goog.i18n.CompactNumberFormatSymbols_lb_LU', 'goog.i18n.CompactNumberFormatSymbols_lg', 'goog.i18n.CompactNumberFormatSymbols_lg_UG', 'goog.i18n.CompactNumberFormatSymbols_lkt', 'goog.i18n.CompactNumberFormatSymbols_lkt_US', 'goog.i18n.CompactNumberFormatSymbols_ln_AO', 'goog.i18n.CompactNumberFormatSymbols_ln_CF', 'goog.i18n.CompactNumberFormatSymbols_ln_CG', 'goog.i18n.CompactNumberFormatSymbols_lrc', 'goog.i18n.CompactNumberFormatSymbols_lrc_IQ', 'goog.i18n.CompactNumberFormatSymbols_lrc_IR', 'goog.i18n.CompactNumberFormatSymbols_lu', 'goog.i18n.CompactNumberFormatSymbols_lu_CD', 'goog.i18n.CompactNumberFormatSymbols_luo', 'goog.i18n.CompactNumberFormatSymbols_luo_KE', 'goog.i18n.CompactNumberFormatSymbols_luy', 'goog.i18n.CompactNumberFormatSymbols_luy_KE', 'goog.i18n.CompactNumberFormatSymbols_mas', 'goog.i18n.CompactNumberFormatSymbols_mas_KE', 'goog.i18n.CompactNumberFormatSymbols_mas_TZ', 'goog.i18n.CompactNumberFormatSymbols_mer', 'goog.i18n.CompactNumberFormatSymbols_mer_KE', 'goog.i18n.CompactNumberFormatSymbols_mfe', 'goog.i18n.CompactNumberFormatSymbols_mfe_MU', 'goog.i18n.CompactNumberFormatSymbols_mg', 'goog.i18n.CompactNumberFormatSymbols_mg_MG', 'goog.i18n.CompactNumberFormatSymbols_mgh', 'goog.i18n.CompactNumberFormatSymbols_mgh_MZ', 'goog.i18n.CompactNumberFormatSymbols_mgo', 'goog.i18n.CompactNumberFormatSymbols_mgo_CM', 'goog.i18n.CompactNumberFormatSymbols_ms_BN', 'goog.i18n.CompactNumberFormatSymbols_ms_SG', 'goog.i18n.CompactNumberFormatSymbols_mua', 'goog.i18n.CompactNumberFormatSymbols_mua_CM', 'goog.i18n.CompactNumberFormatSymbols_mzn', 'goog.i18n.CompactNumberFormatSymbols_mzn_IR', 'goog.i18n.CompactNumberFormatSymbols_naq', 'goog.i18n.CompactNumberFormatSymbols_naq_NA', 'goog.i18n.CompactNumberFormatSymbols_nd', 'goog.i18n.CompactNumberFormatSymbols_nd_ZW', 'goog.i18n.CompactNumberFormatSymbols_ne_IN', 'goog.i18n.CompactNumberFormatSymbols_nl_AW', 'goog.i18n.CompactNumberFormatSymbols_nl_BE', 'goog.i18n.CompactNumberFormatSymbols_nl_BQ', 'goog.i18n.CompactNumberFormatSymbols_nl_CW', 'goog.i18n.CompactNumberFormatSymbols_nl_SR', 'goog.i18n.CompactNumberFormatSymbols_nl_SX', 'goog.i18n.CompactNumberFormatSymbols_nmg', 'goog.i18n.CompactNumberFormatSymbols_nmg_CM', 'goog.i18n.CompactNumberFormatSymbols_nn', 'goog.i18n.CompactNumberFormatSymbols_nn_NO', 'goog.i18n.CompactNumberFormatSymbols_nnh', 'goog.i18n.CompactNumberFormatSymbols_nnh_CM', 'goog.i18n.CompactNumberFormatSymbols_nus', 'goog.i18n.CompactNumberFormatSymbols_nus_SS', 'goog.i18n.CompactNumberFormatSymbols_nyn', 'goog.i18n.CompactNumberFormatSymbols_nyn_UG', 'goog.i18n.CompactNumberFormatSymbols_om', 'goog.i18n.CompactNumberFormatSymbols_om_ET', 'goog.i18n.CompactNumberFormatSymbols_om_KE', 'goog.i18n.CompactNumberFormatSymbols_os', 'goog.i18n.CompactNumberFormatSymbols_os_GE', 'goog.i18n.CompactNumberFormatSymbols_os_RU', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK', 'goog.i18n.CompactNumberFormatSymbols_prg', 'goog.i18n.CompactNumberFormatSymbols_prg_001', 'goog.i18n.CompactNumberFormatSymbols_ps', 'goog.i18n.CompactNumberFormatSymbols_ps_AF', 'goog.i18n.CompactNumberFormatSymbols_pt_AO', 'goog.i18n.CompactNumberFormatSymbols_pt_CH', 'goog.i18n.CompactNumberFormatSymbols_pt_CV', 'goog.i18n.CompactNumberFormatSymbols_pt_GQ', 'goog.i18n.CompactNumberFormatSymbols_pt_GW', 'goog.i18n.CompactNumberFormatSymbols_pt_LU', 'goog.i18n.CompactNumberFormatSymbols_pt_MO', 'goog.i18n.CompactNumberFormatSymbols_pt_MZ', 'goog.i18n.CompactNumberFormatSymbols_pt_ST', 'goog.i18n.CompactNumberFormatSymbols_pt_TL', 'goog.i18n.CompactNumberFormatSymbols_qu', 'goog.i18n.CompactNumberFormatSymbols_qu_BO', 'goog.i18n.CompactNumberFormatSymbols_qu_EC', 'goog.i18n.CompactNumberFormatSymbols_qu_PE', 'goog.i18n.CompactNumberFormatSymbols_rm', 'goog.i18n.CompactNumberFormatSymbols_rm_CH', 'goog.i18n.CompactNumberFormatSymbols_rn', 'goog.i18n.CompactNumberFormatSymbols_rn_BI', 'goog.i18n.CompactNumberFormatSymbols_ro_MD', 'goog.i18n.CompactNumberFormatSymbols_rof', 'goog.i18n.CompactNumberFormatSymbols_rof_TZ', 'goog.i18n.CompactNumberFormatSymbols_ru_BY', 'goog.i18n.CompactNumberFormatSymbols_ru_KG', 'goog.i18n.CompactNumberFormatSymbols_ru_KZ', 'goog.i18n.CompactNumberFormatSymbols_ru_MD', 'goog.i18n.CompactNumberFormatSymbols_ru_UA', 'goog.i18n.CompactNumberFormatSymbols_rw', 'goog.i18n.CompactNumberFormatSymbols_rw_RW', 'goog.i18n.CompactNumberFormatSymbols_rwk', 'goog.i18n.CompactNumberFormatSymbols_rwk_TZ', 'goog.i18n.CompactNumberFormatSymbols_sah', 'goog.i18n.CompactNumberFormatSymbols_sah_RU', 'goog.i18n.CompactNumberFormatSymbols_saq', 'goog.i18n.CompactNumberFormatSymbols_saq_KE', 'goog.i18n.CompactNumberFormatSymbols_sbp', 'goog.i18n.CompactNumberFormatSymbols_sbp_TZ', 'goog.i18n.CompactNumberFormatSymbols_se', 'goog.i18n.CompactNumberFormatSymbols_se_FI', 'goog.i18n.CompactNumberFormatSymbols_se_NO', 'goog.i18n.CompactNumberFormatSymbols_se_SE', 'goog.i18n.CompactNumberFormatSymbols_seh', 'goog.i18n.CompactNumberFormatSymbols_seh_MZ', 'goog.i18n.CompactNumberFormatSymbols_ses', 'goog.i18n.CompactNumberFormatSymbols_ses_ML', 'goog.i18n.CompactNumberFormatSymbols_sg', 'goog.i18n.CompactNumberFormatSymbols_sg_CF', 'goog.i18n.CompactNumberFormatSymbols_shi', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.CompactNumberFormatSymbols_smn', 'goog.i18n.CompactNumberFormatSymbols_smn_FI', 'goog.i18n.CompactNumberFormatSymbols_sn', 'goog.i18n.CompactNumberFormatSymbols_sn_ZW', 'goog.i18n.CompactNumberFormatSymbols_so', 'goog.i18n.CompactNumberFormatSymbols_so_DJ', 'goog.i18n.CompactNumberFormatSymbols_so_ET', 'goog.i18n.CompactNumberFormatSymbols_so_KE', 'goog.i18n.CompactNumberFormatSymbols_so_SO', 'goog.i18n.CompactNumberFormatSymbols_sq_MK', 'goog.i18n.CompactNumberFormatSymbols_sq_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK', 'goog.i18n.CompactNumberFormatSymbols_sv_AX', 'goog.i18n.CompactNumberFormatSymbols_sv_FI', 'goog.i18n.CompactNumberFormatSymbols_sw_CD', 'goog.i18n.CompactNumberFormatSymbols_sw_KE', 'goog.i18n.CompactNumberFormatSymbols_sw_UG', 'goog.i18n.CompactNumberFormatSymbols_ta_LK', 'goog.i18n.CompactNumberFormatSymbols_ta_MY', 'goog.i18n.CompactNumberFormatSymbols_ta_SG', 'goog.i18n.CompactNumberFormatSymbols_teo', 'goog.i18n.CompactNumberFormatSymbols_teo_KE', 'goog.i18n.CompactNumberFormatSymbols_teo_UG', 'goog.i18n.CompactNumberFormatSymbols_ti', 'goog.i18n.CompactNumberFormatSymbols_ti_ER', 'goog.i18n.CompactNumberFormatSymbols_ti_ET', 'goog.i18n.CompactNumberFormatSymbols_tk', 'goog.i18n.CompactNumberFormatSymbols_tk_TM', 'goog.i18n.CompactNumberFormatSymbols_to', 'goog.i18n.CompactNumberFormatSymbols_to_TO', 'goog.i18n.CompactNumberFormatSymbols_tr_CY', 'goog.i18n.CompactNumberFormatSymbols_twq', 'goog.i18n.CompactNumberFormatSymbols_twq_NE', 'goog.i18n.CompactNumberFormatSymbols_tzm', 'goog.i18n.CompactNumberFormatSymbols_tzm_MA', 'goog.i18n.CompactNumberFormatSymbols_ug', 'goog.i18n.CompactNumberFormatSymbols_ug_CN', 'goog.i18n.CompactNumberFormatSymbols_ur_IN', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.CompactNumberFormatSymbols_vai', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.CompactNumberFormatSymbols_vo', 'goog.i18n.CompactNumberFormatSymbols_vo_001', 'goog.i18n.CompactNumberFormatSymbols_vun', 'goog.i18n.CompactNumberFormatSymbols_vun_TZ', 'goog.i18n.CompactNumberFormatSymbols_wae', 'goog.i18n.CompactNumberFormatSymbols_wae_CH', 'goog.i18n.CompactNumberFormatSymbols_xog', 'goog.i18n.CompactNumberFormatSymbols_xog_UG', 'goog.i18n.CompactNumberFormatSymbols_yav', 'goog.i18n.CompactNumberFormatSymbols_yav_CM', 'goog.i18n.CompactNumberFormatSymbols_yi', 'goog.i18n.CompactNumberFormatSymbols_yi_001', 'goog.i18n.CompactNumberFormatSymbols_yo', 'goog.i18n.CompactNumberFormatSymbols_yo_BJ', 'goog.i18n.CompactNumberFormatSymbols_yo_NG', 'goog.i18n.CompactNumberFormatSymbols_yue', 'goog.i18n.CompactNumberFormatSymbols_yue_HK', 'goog.i18n.CompactNumberFormatSymbols_zgh', 'goog.i18n.CompactNumberFormatSymbols_zgh_MA', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW'], [], {});
+goog.addDependency('i18n/currency.js', ['goog.i18n.currency', 'goog.i18n.currency.CurrencyInfo', 'goog.i18n.currency.CurrencyInfoTier2'], [], {});
+goog.addDependency('i18n/currency_test.js', ['goog.i18n.currencyTest'], ['goog.i18n.NumberFormat', 'goog.i18n.currency', 'goog.i18n.currency.CurrencyInfo', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/currencycodemap.js', ['goog.i18n.currencyCodeMap', 'goog.i18n.currencyCodeMapTier2'], [], {});
+goog.addDependency('i18n/datetimeformat.js', ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeFormat.Format'], ['goog.asserts', 'goog.date', 'goog.i18n.DateTimeSymbols', 'goog.i18n.TimeZone', 'goog.string'], {});
+goog.addDependency('i18n/datetimeformat_test.js', ['goog.i18n.DateTimeFormatTest'], ['goog.date.Date', 'goog.date.DateTime', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.TimeZone', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/datetimeparse.js', ['goog.i18n.DateTimeParse'], ['goog.asserts', 'goog.date', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols'], {});
+goog.addDependency('i18n/datetimeparse_test.js', ['goog.i18n.DateTimeParseTest'], ['goog.date.Date', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeParse', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_zh', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('i18n/datetimepatterns.js', ['goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_af', 'goog.i18n.DateTimePatterns_am', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_az', 'goog.i18n.DateTimePatterns_be', 'goog.i18n.DateTimePatterns_bg', 'goog.i18n.DateTimePatterns_bn', 'goog.i18n.DateTimePatterns_br', 'goog.i18n.DateTimePatterns_bs', 'goog.i18n.DateTimePatterns_ca', 'goog.i18n.DateTimePatterns_chr', 'goog.i18n.DateTimePatterns_cs', 'goog.i18n.DateTimePatterns_cy', 'goog.i18n.DateTimePatterns_da', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_de_AT', 'goog.i18n.DateTimePatterns_de_CH', 'goog.i18n.DateTimePatterns_el', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_en_AU', 'goog.i18n.DateTimePatterns_en_CA', 'goog.i18n.DateTimePatterns_en_GB', 'goog.i18n.DateTimePatterns_en_IE', 'goog.i18n.DateTimePatterns_en_IN', 'goog.i18n.DateTimePatterns_en_SG', 'goog.i18n.DateTimePatterns_en_US', 'goog.i18n.DateTimePatterns_en_ZA', 'goog.i18n.DateTimePatterns_es', 'goog.i18n.DateTimePatterns_es_419', 'goog.i18n.DateTimePatterns_es_ES', 'goog.i18n.DateTimePatterns_es_MX', 'goog.i18n.DateTimePatterns_es_US', 'goog.i18n.DateTimePatterns_et', 'goog.i18n.DateTimePatterns_eu', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fi', 'goog.i18n.DateTimePatterns_fil', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_fr_CA', 'goog.i18n.DateTimePatterns_ga', 'goog.i18n.DateTimePatterns_gl', 'goog.i18n.DateTimePatterns_gsw', 'goog.i18n.DateTimePatterns_gu', 'goog.i18n.DateTimePatterns_haw', 'goog.i18n.DateTimePatterns_he', 'goog.i18n.DateTimePatterns_hi', 'goog.i18n.DateTimePatterns_hr', 'goog.i18n.DateTimePatterns_hu', 'goog.i18n.DateTimePatterns_hy', 'goog.i18n.DateTimePatterns_id', 'goog.i18n.DateTimePatterns_in', 'goog.i18n.DateTimePatterns_is', 'goog.i18n.DateTimePatterns_it', 'goog.i18n.DateTimePatterns_iw', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_ka', 'goog.i18n.DateTimePatterns_kk', 'goog.i18n.DateTimePatterns_km', 'goog.i18n.DateTimePatterns_kn', 'goog.i18n.DateTimePatterns_ko', 'goog.i18n.DateTimePatterns_ky', 'goog.i18n.DateTimePatterns_ln', 'goog.i18n.DateTimePatterns_lo', 'goog.i18n.DateTimePatterns_lt', 'goog.i18n.DateTimePatterns_lv', 'goog.i18n.DateTimePatterns_mk', 'goog.i18n.DateTimePatterns_ml', 'goog.i18n.DateTimePatterns_mn', 'goog.i18n.DateTimePatterns_mo', 'goog.i18n.DateTimePatterns_mr', 'goog.i18n.DateTimePatterns_ms', 'goog.i18n.DateTimePatterns_mt', 'goog.i18n.DateTimePatterns_my', 'goog.i18n.DateTimePatterns_nb', 'goog.i18n.DateTimePatterns_ne', 'goog.i18n.DateTimePatterns_nl', 'goog.i18n.DateTimePatterns_no', 'goog.i18n.DateTimePatterns_no_NO', 'goog.i18n.DateTimePatterns_or', 'goog.i18n.DateTimePatterns_pa', 'goog.i18n.DateTimePatterns_pl', 'goog.i18n.DateTimePatterns_pt', 'goog.i18n.DateTimePatterns_pt_BR', 'goog.i18n.DateTimePatterns_pt_PT', 'goog.i18n.DateTimePatterns_ro', 'goog.i18n.DateTimePatterns_ru', 'goog.i18n.DateTimePatterns_sh', 'goog.i18n.DateTimePatterns_si', 'goog.i18n.DateTimePatterns_sk', 'goog.i18n.DateTimePatterns_sl', 'goog.i18n.DateTimePatterns_sq', 'goog.i18n.DateTimePatterns_sr', 'goog.i18n.DateTimePatterns_sr_Latn', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimePatterns_sw', 'goog.i18n.DateTimePatterns_ta', 'goog.i18n.DateTimePatterns_te', 'goog.i18n.DateTimePatterns_th', 'goog.i18n.DateTimePatterns_tl', 'goog.i18n.DateTimePatterns_tr', 'goog.i18n.DateTimePatterns_uk', 'goog.i18n.DateTimePatterns_ur', 'goog.i18n.DateTimePatterns_uz', 'goog.i18n.DateTimePatterns_vi', 'goog.i18n.DateTimePatterns_zh', 'goog.i18n.DateTimePatterns_zh_CN', 'goog.i18n.DateTimePatterns_zh_HK', 'goog.i18n.DateTimePatterns_zh_TW', 'goog.i18n.DateTimePatterns_zu'], [], {});
+goog.addDependency('i18n/datetimepatternsext.js', ['goog.i18n.DateTimePatternsExt', 'goog.i18n.DateTimePatterns_af_NA', 'goog.i18n.DateTimePatterns_af_ZA', 'goog.i18n.DateTimePatterns_agq', 'goog.i18n.DateTimePatterns_agq_CM', 'goog.i18n.DateTimePatterns_ak', 'goog.i18n.DateTimePatterns_ak_GH', 'goog.i18n.DateTimePatterns_am_ET', 'goog.i18n.DateTimePatterns_ar_001', 'goog.i18n.DateTimePatterns_ar_AE', 'goog.i18n.DateTimePatterns_ar_BH', 'goog.i18n.DateTimePatterns_ar_DJ', 'goog.i18n.DateTimePatterns_ar_DZ', 'goog.i18n.DateTimePatterns_ar_EG', 'goog.i18n.DateTimePatterns_ar_EH', 'goog.i18n.DateTimePatterns_ar_ER', 'goog.i18n.DateTimePatterns_ar_IL', 'goog.i18n.DateTimePatterns_ar_IQ', 'goog.i18n.DateTimePatterns_ar_JO', 'goog.i18n.DateTimePatterns_ar_KM', 'goog.i18n.DateTimePatterns_ar_KW', 'goog.i18n.DateTimePatterns_ar_LB', 'goog.i18n.DateTimePatterns_ar_LY', 'goog.i18n.DateTimePatterns_ar_MA', 'goog.i18n.DateTimePatterns_ar_MR', 'goog.i18n.DateTimePatterns_ar_OM', 'goog.i18n.DateTimePatterns_ar_PS', 'goog.i18n.DateTimePatterns_ar_QA', 'goog.i18n.DateTimePatterns_ar_SA', 'goog.i18n.DateTimePatterns_ar_SD', 'goog.i18n.DateTimePatterns_ar_SO', 'goog.i18n.DateTimePatterns_ar_SS', 'goog.i18n.DateTimePatterns_ar_SY', 'goog.i18n.DateTimePatterns_ar_TD', 'goog.i18n.DateTimePatterns_ar_TN', 'goog.i18n.DateTimePatterns_ar_XB', 'goog.i18n.DateTimePatterns_ar_YE', 'goog.i18n.DateTimePatterns_as', 'goog.i18n.DateTimePatterns_as_IN', 'goog.i18n.DateTimePatterns_asa', 'goog.i18n.DateTimePatterns_asa_TZ', 'goog.i18n.DateTimePatterns_ast', 'goog.i18n.DateTimePatterns_ast_ES', 'goog.i18n.DateTimePatterns_az_Cyrl', 'goog.i18n.DateTimePatterns_az_Cyrl_AZ', 'goog.i18n.DateTimePatterns_az_Latn', 'goog.i18n.DateTimePatterns_az_Latn_AZ', 'goog.i18n.DateTimePatterns_bas', 'goog.i18n.DateTimePatterns_bas_CM', 'goog.i18n.DateTimePatterns_be_BY', 'goog.i18n.DateTimePatterns_bem', 'goog.i18n.DateTimePatterns_bem_ZM', 'goog.i18n.DateTimePatterns_bez', 'goog.i18n.DateTimePatterns_bez_TZ', 'goog.i18n.DateTimePatterns_bg_BG', 'goog.i18n.DateTimePatterns_bm', 'goog.i18n.DateTimePatterns_bm_ML', 'goog.i18n.DateTimePatterns_bn_BD', 'goog.i18n.DateTimePatterns_bn_IN', 'goog.i18n.DateTimePatterns_bo', 'goog.i18n.DateTimePatterns_bo_CN', 'goog.i18n.DateTimePatterns_bo_IN', 'goog.i18n.DateTimePatterns_br_FR', 'goog.i18n.DateTimePatterns_brx', 'goog.i18n.DateTimePatterns_brx_IN', 'goog.i18n.DateTimePatterns_bs_Cyrl', 'goog.i18n.DateTimePatterns_bs_Cyrl_BA', 'goog.i18n.DateTimePatterns_bs_Latn', 'goog.i18n.DateTimePatterns_bs_Latn_BA', 'goog.i18n.DateTimePatterns_ca_AD', 'goog.i18n.DateTimePatterns_ca_ES', 'goog.i18n.DateTimePatterns_ca_FR', 'goog.i18n.DateTimePatterns_ca_IT', 'goog.i18n.DateTimePatterns_ce', 'goog.i18n.DateTimePatterns_ce_RU', 'goog.i18n.DateTimePatterns_cgg', 'goog.i18n.DateTimePatterns_cgg_UG', 'goog.i18n.DateTimePatterns_chr_US', 'goog.i18n.DateTimePatterns_cs_CZ', 'goog.i18n.DateTimePatterns_cy_GB', 'goog.i18n.DateTimePatterns_da_DK', 'goog.i18n.DateTimePatterns_da_GL', 'goog.i18n.DateTimePatterns_dav', 'goog.i18n.DateTimePatterns_dav_KE', 'goog.i18n.DateTimePatterns_de_BE', 'goog.i18n.DateTimePatterns_de_DE', 'goog.i18n.DateTimePatterns_de_LI', 'goog.i18n.DateTimePatterns_de_LU', 'goog.i18n.DateTimePatterns_dje', 'goog.i18n.DateTimePatterns_dje_NE', 'goog.i18n.DateTimePatterns_dsb', 'goog.i18n.DateTimePatterns_dsb_DE', 'goog.i18n.DateTimePatterns_dua', 'goog.i18n.DateTimePatterns_dua_CM', 'goog.i18n.DateTimePatterns_dyo', 'goog.i18n.DateTimePatterns_dyo_SN', 'goog.i18n.DateTimePatterns_dz', 'goog.i18n.DateTimePatterns_dz_BT', 'goog.i18n.DateTimePatterns_ebu', 'goog.i18n.DateTimePatterns_ebu_KE', 'goog.i18n.DateTimePatterns_ee', 'goog.i18n.DateTimePatterns_ee_GH', 'goog.i18n.DateTimePatterns_ee_TG', 'goog.i18n.DateTimePatterns_el_CY', 'goog.i18n.DateTimePatterns_el_GR', 'goog.i18n.DateTimePatterns_en_001', 'goog.i18n.DateTimePatterns_en_150', 'goog.i18n.DateTimePatterns_en_AG', 'goog.i18n.DateTimePatterns_en_AI', 'goog.i18n.DateTimePatterns_en_AS', 'goog.i18n.DateTimePatterns_en_AT', 'goog.i18n.DateTimePatterns_en_BB', 'goog.i18n.DateTimePatterns_en_BE', 'goog.i18n.DateTimePatterns_en_BI', 'goog.i18n.DateTimePatterns_en_BM', 'goog.i18n.DateTimePatterns_en_BS', 'goog.i18n.DateTimePatterns_en_BW', 'goog.i18n.DateTimePatterns_en_BZ', 'goog.i18n.DateTimePatterns_en_CC', 'goog.i18n.DateTimePatterns_en_CH', 'goog.i18n.DateTimePatterns_en_CK', 'goog.i18n.DateTimePatterns_en_CM', 'goog.i18n.DateTimePatterns_en_CX', 'goog.i18n.DateTimePatterns_en_CY', 'goog.i18n.DateTimePatterns_en_DE', 'goog.i18n.DateTimePatterns_en_DG', 'goog.i18n.DateTimePatterns_en_DK', 'goog.i18n.DateTimePatterns_en_DM', 'goog.i18n.DateTimePatterns_en_ER', 'goog.i18n.DateTimePatterns_en_FI', 'goog.i18n.DateTimePatterns_en_FJ', 'goog.i18n.DateTimePatterns_en_FK', 'goog.i18n.DateTimePatterns_en_FM', 'goog.i18n.DateTimePatterns_en_GD', 'goog.i18n.DateTimePatterns_en_GG', 'goog.i18n.DateTimePatterns_en_GH', 'goog.i18n.DateTimePatterns_en_GI', 'goog.i18n.DateTimePatterns_en_GM', 'goog.i18n.DateTimePatterns_en_GU', 'goog.i18n.DateTimePatterns_en_GY', 'goog.i18n.DateTimePatterns_en_HK', 'goog.i18n.DateTimePatterns_en_IL', 'goog.i18n.DateTimePatterns_en_IM', 'goog.i18n.DateTimePatterns_en_IO', 'goog.i18n.DateTimePatterns_en_JE', 'goog.i18n.DateTimePatterns_en_JM', 'goog.i18n.DateTimePatterns_en_KE', 'goog.i18n.DateTimePatterns_en_KI', 'goog.i18n.DateTimePatterns_en_KN', 'goog.i18n.DateTimePatterns_en_KY', 'goog.i18n.DateTimePatterns_en_LC', 'goog.i18n.DateTimePatterns_en_LR', 'goog.i18n.DateTimePatterns_en_LS', 'goog.i18n.DateTimePatterns_en_MG', 'goog.i18n.DateTimePatterns_en_MH', 'goog.i18n.DateTimePatterns_en_MO', 'goog.i18n.DateTimePatterns_en_MP', 'goog.i18n.DateTimePatterns_en_MS', 'goog.i18n.DateTimePatterns_en_MT', 'goog.i18n.DateTimePatterns_en_MU', 'goog.i18n.DateTimePatterns_en_MW', 'goog.i18n.DateTimePatterns_en_MY', 'goog.i18n.DateTimePatterns_en_NA', 'goog.i18n.DateTimePatterns_en_NF', 'goog.i18n.DateTimePatterns_en_NG', 'goog.i18n.DateTimePatterns_en_NL', 'goog.i18n.DateTimePatterns_en_NR', 'goog.i18n.DateTimePatterns_en_NU', 'goog.i18n.DateTimePatterns_en_NZ', 'goog.i18n.DateTimePatterns_en_PG', 'goog.i18n.DateTimePatterns_en_PH', 'goog.i18n.DateTimePatterns_en_PK', 'goog.i18n.DateTimePatterns_en_PN', 'goog.i18n.DateTimePatterns_en_PR', 'goog.i18n.DateTimePatterns_en_PW', 'goog.i18n.DateTimePatterns_en_RW', 'goog.i18n.DateTimePatterns_en_SB', 'goog.i18n.DateTimePatterns_en_SC', 'goog.i18n.DateTimePatterns_en_SD', 'goog.i18n.DateTimePatterns_en_SE', 'goog.i18n.DateTimePatterns_en_SH', 'goog.i18n.DateTimePatterns_en_SI', 'goog.i18n.DateTimePatterns_en_SL', 'goog.i18n.DateTimePatterns_en_SS', 'goog.i18n.DateTimePatterns_en_SX', 'goog.i18n.DateTimePatterns_en_SZ', 'goog.i18n.DateTimePatterns_en_TC', 'goog.i18n.DateTimePatterns_en_TK', 'goog.i18n.DateTimePatterns_en_TO', 'goog.i18n.DateTimePatterns_en_TT', 'goog.i18n.DateTimePatterns_en_TV', 'goog.i18n.DateTimePatterns_en_TZ', 'goog.i18n.DateTimePatterns_en_UG', 'goog.i18n.DateTimePatterns_en_UM', 'goog.i18n.DateTimePatterns_en_US_POSIX', 'goog.i18n.DateTimePatterns_en_VC', 'goog.i18n.DateTimePatterns_en_VG', 'goog.i18n.DateTimePatterns_en_VI', 'goog.i18n.DateTimePatterns_en_VU', 'goog.i18n.DateTimePatterns_en_WS', 'goog.i18n.DateTimePatterns_en_XA', 'goog.i18n.DateTimePatterns_en_ZM', 'goog.i18n.DateTimePatterns_en_ZW', 'goog.i18n.DateTimePatterns_eo', 'goog.i18n.DateTimePatterns_es_AR', 'goog.i18n.DateTimePatterns_es_BO', 'goog.i18n.DateTimePatterns_es_CL', 'goog.i18n.DateTimePatterns_es_CO', 'goog.i18n.DateTimePatterns_es_CR', 'goog.i18n.DateTimePatterns_es_CU', 'goog.i18n.DateTimePatterns_es_DO', 'goog.i18n.DateTimePatterns_es_EA', 'goog.i18n.DateTimePatterns_es_EC', 'goog.i18n.DateTimePatterns_es_GQ', 'goog.i18n.DateTimePatterns_es_GT', 'goog.i18n.DateTimePatterns_es_HN', 'goog.i18n.DateTimePatterns_es_IC', 'goog.i18n.DateTimePatterns_es_NI', 'goog.i18n.DateTimePatterns_es_PA', 'goog.i18n.DateTimePatterns_es_PE', 'goog.i18n.DateTimePatterns_es_PH', 'goog.i18n.DateTimePatterns_es_PR', 'goog.i18n.DateTimePatterns_es_PY', 'goog.i18n.DateTimePatterns_es_SV', 'goog.i18n.DateTimePatterns_es_UY', 'goog.i18n.DateTimePatterns_es_VE', 'goog.i18n.DateTimePatterns_et_EE', 'goog.i18n.DateTimePatterns_eu_ES', 'goog.i18n.DateTimePatterns_ewo', 'goog.i18n.DateTimePatterns_ewo_CM', 'goog.i18n.DateTimePatterns_fa_AF', 'goog.i18n.DateTimePatterns_fa_IR', 'goog.i18n.DateTimePatterns_ff', 'goog.i18n.DateTimePatterns_ff_CM', 'goog.i18n.DateTimePatterns_ff_GN', 'goog.i18n.DateTimePatterns_ff_MR', 'goog.i18n.DateTimePatterns_ff_SN', 'goog.i18n.DateTimePatterns_fi_FI', 'goog.i18n.DateTimePatterns_fil_PH', 'goog.i18n.DateTimePatterns_fo', 'goog.i18n.DateTimePatterns_fo_DK', 'goog.i18n.DateTimePatterns_fo_FO', 'goog.i18n.DateTimePatterns_fr_BE', 'goog.i18n.DateTimePatterns_fr_BF', 'goog.i18n.DateTimePatterns_fr_BI', 'goog.i18n.DateTimePatterns_fr_BJ', 'goog.i18n.DateTimePatterns_fr_BL', 'goog.i18n.DateTimePatterns_fr_CD', 'goog.i18n.DateTimePatterns_fr_CF', 'goog.i18n.DateTimePatterns_fr_CG', 'goog.i18n.DateTimePatterns_fr_CH', 'goog.i18n.DateTimePatterns_fr_CI', 'goog.i18n.DateTimePatterns_fr_CM', 'goog.i18n.DateTimePatterns_fr_DJ', 'goog.i18n.DateTimePatterns_fr_DZ', 'goog.i18n.DateTimePatterns_fr_FR', 'goog.i18n.DateTimePatterns_fr_GA', 'goog.i18n.DateTimePatterns_fr_GF', 'goog.i18n.DateTimePatterns_fr_GN', 'goog.i18n.DateTimePatterns_fr_GP', 'goog.i18n.DateTimePatterns_fr_GQ', 'goog.i18n.DateTimePatterns_fr_HT', 'goog.i18n.DateTimePatterns_fr_KM', 'goog.i18n.DateTimePatterns_fr_LU', 'goog.i18n.DateTimePatterns_fr_MA', 'goog.i18n.DateTimePatterns_fr_MC', 'goog.i18n.DateTimePatterns_fr_MF', 'goog.i18n.DateTimePatterns_fr_MG', 'goog.i18n.DateTimePatterns_fr_ML', 'goog.i18n.DateTimePatterns_fr_MQ', 'goog.i18n.DateTimePatterns_fr_MR', 'goog.i18n.DateTimePatterns_fr_MU', 'goog.i18n.DateTimePatterns_fr_NC', 'goog.i18n.DateTimePatterns_fr_NE', 'goog.i18n.DateTimePatterns_fr_PF', 'goog.i18n.DateTimePatterns_fr_PM', 'goog.i18n.DateTimePatterns_fr_RE', 'goog.i18n.DateTimePatterns_fr_RW', 'goog.i18n.DateTimePatterns_fr_SC', 'goog.i18n.DateTimePatterns_fr_SN', 'goog.i18n.DateTimePatterns_fr_SY', 'goog.i18n.DateTimePatterns_fr_TD', 'goog.i18n.DateTimePatterns_fr_TG', 'goog.i18n.DateTimePatterns_fr_TN', 'goog.i18n.DateTimePatterns_fr_VU', 'goog.i18n.DateTimePatterns_fr_WF', 'goog.i18n.DateTimePatterns_fr_YT', 'goog.i18n.DateTimePatterns_fur', 'goog.i18n.DateTimePatterns_fur_IT', 'goog.i18n.DateTimePatterns_fy', 'goog.i18n.DateTimePatterns_fy_NL', 'goog.i18n.DateTimePatterns_ga_IE', 'goog.i18n.DateTimePatterns_gd', 'goog.i18n.DateTimePatterns_gd_GB', 'goog.i18n.DateTimePatterns_gl_ES', 'goog.i18n.DateTimePatterns_gsw_CH', 'goog.i18n.DateTimePatterns_gsw_FR', 'goog.i18n.DateTimePatterns_gsw_LI', 'goog.i18n.DateTimePatterns_gu_IN', 'goog.i18n.DateTimePatterns_guz', 'goog.i18n.DateTimePatterns_guz_KE', 'goog.i18n.DateTimePatterns_gv', 'goog.i18n.DateTimePatterns_gv_IM', 'goog.i18n.DateTimePatterns_ha', 'goog.i18n.DateTimePatterns_ha_GH', 'goog.i18n.DateTimePatterns_ha_NE', 'goog.i18n.DateTimePatterns_ha_NG', 'goog.i18n.DateTimePatterns_haw_US', 'goog.i18n.DateTimePatterns_he_IL', 'goog.i18n.DateTimePatterns_hi_IN', 'goog.i18n.DateTimePatterns_hr_BA', 'goog.i18n.DateTimePatterns_hr_HR', 'goog.i18n.DateTimePatterns_hsb', 'goog.i18n.DateTimePatterns_hsb_DE', 'goog.i18n.DateTimePatterns_hu_HU', 'goog.i18n.DateTimePatterns_hy_AM', 'goog.i18n.DateTimePatterns_id_ID', 'goog.i18n.DateTimePatterns_ig', 'goog.i18n.DateTimePatterns_ig_NG', 'goog.i18n.DateTimePatterns_ii', 'goog.i18n.DateTimePatterns_ii_CN', 'goog.i18n.DateTimePatterns_is_IS', 'goog.i18n.DateTimePatterns_it_CH', 'goog.i18n.DateTimePatterns_it_IT', 'goog.i18n.DateTimePatterns_it_SM', 'goog.i18n.DateTimePatterns_ja_JP', 'goog.i18n.DateTimePatterns_jgo', 'goog.i18n.DateTimePatterns_jgo_CM', 'goog.i18n.DateTimePatterns_jmc', 'goog.i18n.DateTimePatterns_jmc_TZ', 'goog.i18n.DateTimePatterns_ka_GE', 'goog.i18n.DateTimePatterns_kab', 'goog.i18n.DateTimePatterns_kab_DZ', 'goog.i18n.DateTimePatterns_kam', 'goog.i18n.DateTimePatterns_kam_KE', 'goog.i18n.DateTimePatterns_kde', 'goog.i18n.DateTimePatterns_kde_TZ', 'goog.i18n.DateTimePatterns_kea', 'goog.i18n.DateTimePatterns_kea_CV', 'goog.i18n.DateTimePatterns_khq', 'goog.i18n.DateTimePatterns_khq_ML', 'goog.i18n.DateTimePatterns_ki', 'goog.i18n.DateTimePatterns_ki_KE', 'goog.i18n.DateTimePatterns_kk_KZ', 'goog.i18n.DateTimePatterns_kkj', 'goog.i18n.DateTimePatterns_kkj_CM', 'goog.i18n.DateTimePatterns_kl', 'goog.i18n.DateTimePatterns_kl_GL', 'goog.i18n.DateTimePatterns_kln', 'goog.i18n.DateTimePatterns_kln_KE', 'goog.i18n.DateTimePatterns_km_KH', 'goog.i18n.DateTimePatterns_kn_IN', 'goog.i18n.DateTimePatterns_ko_KP', 'goog.i18n.DateTimePatterns_ko_KR', 'goog.i18n.DateTimePatterns_kok', 'goog.i18n.DateTimePatterns_kok_IN', 'goog.i18n.DateTimePatterns_ks', 'goog.i18n.DateTimePatterns_ks_IN', 'goog.i18n.DateTimePatterns_ksb', 'goog.i18n.DateTimePatterns_ksb_TZ', 'goog.i18n.DateTimePatterns_ksf', 'goog.i18n.DateTimePatterns_ksf_CM', 'goog.i18n.DateTimePatterns_ksh', 'goog.i18n.DateTimePatterns_ksh_DE', 'goog.i18n.DateTimePatterns_kw', 'goog.i18n.DateTimePatterns_kw_GB', 'goog.i18n.DateTimePatterns_ky_KG', 'goog.i18n.DateTimePatterns_lag', 'goog.i18n.DateTimePatterns_lag_TZ', 'goog.i18n.DateTimePatterns_lb', 'goog.i18n.DateTimePatterns_lb_LU', 'goog.i18n.DateTimePatterns_lg', 'goog.i18n.DateTimePatterns_lg_UG', 'goog.i18n.DateTimePatterns_lkt', 'goog.i18n.DateTimePatterns_lkt_US', 'goog.i18n.DateTimePatterns_ln_AO', 'goog.i18n.DateTimePatterns_ln_CD', 'goog.i18n.DateTimePatterns_ln_CF', 'goog.i18n.DateTimePatterns_ln_CG', 'goog.i18n.DateTimePatterns_lo_LA', 'goog.i18n.DateTimePatterns_lrc', 'goog.i18n.DateTimePatterns_lrc_IQ', 'goog.i18n.DateTimePatterns_lrc_IR', 'goog.i18n.DateTimePatterns_lt_LT', 'goog.i18n.DateTimePatterns_lu', 'goog.i18n.DateTimePatterns_lu_CD', 'goog.i18n.DateTimePatterns_luo', 'goog.i18n.DateTimePatterns_luo_KE', 'goog.i18n.DateTimePatterns_luy', 'goog.i18n.DateTimePatterns_luy_KE', 'goog.i18n.DateTimePatterns_lv_LV', 'goog.i18n.DateTimePatterns_mas', 'goog.i18n.DateTimePatterns_mas_KE', 'goog.i18n.DateTimePatterns_mas_TZ', 'goog.i18n.DateTimePatterns_mer', 'goog.i18n.DateTimePatterns_mer_KE', 'goog.i18n.DateTimePatterns_mfe', 'goog.i18n.DateTimePatterns_mfe_MU', 'goog.i18n.DateTimePatterns_mg', 'goog.i18n.DateTimePatterns_mg_MG', 'goog.i18n.DateTimePatterns_mgh', 'goog.i18n.DateTimePatterns_mgh_MZ', 'goog.i18n.DateTimePatterns_mgo', 'goog.i18n.DateTimePatterns_mgo_CM', 'goog.i18n.DateTimePatterns_mk_MK', 'goog.i18n.DateTimePatterns_ml_IN', 'goog.i18n.DateTimePatterns_mn_MN', 'goog.i18n.DateTimePatterns_mr_IN', 'goog.i18n.DateTimePatterns_ms_BN', 'goog.i18n.DateTimePatterns_ms_MY', 'goog.i18n.DateTimePatterns_ms_SG', 'goog.i18n.DateTimePatterns_mt_MT', 'goog.i18n.DateTimePatterns_mua', 'goog.i18n.DateTimePatterns_mua_CM', 'goog.i18n.DateTimePatterns_my_MM', 'goog.i18n.DateTimePatterns_mzn', 'goog.i18n.DateTimePatterns_mzn_IR', 'goog.i18n.DateTimePatterns_naq', 'goog.i18n.DateTimePatterns_naq_NA', 'goog.i18n.DateTimePatterns_nb_NO', 'goog.i18n.DateTimePatterns_nb_SJ', 'goog.i18n.DateTimePatterns_nd', 'goog.i18n.DateTimePatterns_nd_ZW', 'goog.i18n.DateTimePatterns_ne_IN', 'goog.i18n.DateTimePatterns_ne_NP', 'goog.i18n.DateTimePatterns_nl_AW', 'goog.i18n.DateTimePatterns_nl_BE', 'goog.i18n.DateTimePatterns_nl_BQ', 'goog.i18n.DateTimePatterns_nl_CW', 'goog.i18n.DateTimePatterns_nl_NL', 'goog.i18n.DateTimePatterns_nl_SR', 'goog.i18n.DateTimePatterns_nl_SX', 'goog.i18n.DateTimePatterns_nmg', 'goog.i18n.DateTimePatterns_nmg_CM', 'goog.i18n.DateTimePatterns_nn', 'goog.i18n.DateTimePatterns_nn_NO', 'goog.i18n.DateTimePatterns_nnh', 'goog.i18n.DateTimePatterns_nnh_CM', 'goog.i18n.DateTimePatterns_nus', 'goog.i18n.DateTimePatterns_nus_SS', 'goog.i18n.DateTimePatterns_nyn', 'goog.i18n.DateTimePatterns_nyn_UG', 'goog.i18n.DateTimePatterns_om', 'goog.i18n.DateTimePatterns_om_ET', 'goog.i18n.DateTimePatterns_om_KE', 'goog.i18n.DateTimePatterns_or_IN', 'goog.i18n.DateTimePatterns_os', 'goog.i18n.DateTimePatterns_os_GE', 'goog.i18n.DateTimePatterns_os_RU', 'goog.i18n.DateTimePatterns_pa_Arab', 'goog.i18n.DateTimePatterns_pa_Arab_PK', 'goog.i18n.DateTimePatterns_pa_Guru', 'goog.i18n.DateTimePatterns_pa_Guru_IN', 'goog.i18n.DateTimePatterns_pl_PL', 'goog.i18n.DateTimePatterns_ps', 'goog.i18n.DateTimePatterns_ps_AF', 'goog.i18n.DateTimePatterns_pt_AO', 'goog.i18n.DateTimePatterns_pt_CV', 'goog.i18n.DateTimePatterns_pt_GW', 'goog.i18n.DateTimePatterns_pt_MO', 'goog.i18n.DateTimePatterns_pt_MZ', 'goog.i18n.DateTimePatterns_pt_ST', 'goog.i18n.DateTimePatterns_pt_TL', 'goog.i18n.DateTimePatterns_qu', 'goog.i18n.DateTimePatterns_qu_BO', 'goog.i18n.DateTimePatterns_qu_EC', 'goog.i18n.DateTimePatterns_qu_PE', 'goog.i18n.DateTimePatterns_rm', 'goog.i18n.DateTimePatterns_rm_CH', 'goog.i18n.DateTimePatterns_rn', 'goog.i18n.DateTimePatterns_rn_BI', 'goog.i18n.DateTimePatterns_ro_MD', 'goog.i18n.DateTimePatterns_ro_RO', 'goog.i18n.DateTimePatterns_rof', 'goog.i18n.DateTimePatterns_rof_TZ', 'goog.i18n.DateTimePatterns_ru_BY', 'goog.i18n.DateTimePatterns_ru_KG', 'goog.i18n.DateTimePatterns_ru_KZ', 'goog.i18n.DateTimePatterns_ru_MD', 'goog.i18n.DateTimePatterns_ru_RU', 'goog.i18n.DateTimePatterns_ru_UA', 'goog.i18n.DateTimePatterns_rw', 'goog.i18n.DateTimePatterns_rw_RW', 'goog.i18n.DateTimePatterns_rwk', 'goog.i18n.DateTimePatterns_rwk_TZ', 'goog.i18n.DateTimePatterns_sah', 'goog.i18n.DateTimePatterns_sah_RU', 'goog.i18n.DateTimePatterns_saq', 'goog.i18n.DateTimePatterns_saq_KE', 'goog.i18n.DateTimePatterns_sbp', 'goog.i18n.DateTimePatterns_sbp_TZ', 'goog.i18n.DateTimePatterns_se', 'goog.i18n.DateTimePatterns_se_FI', 'goog.i18n.DateTimePatterns_se_NO', 'goog.i18n.DateTimePatterns_se_SE', 'goog.i18n.DateTimePatterns_seh', 'goog.i18n.DateTimePatterns_seh_MZ', 'goog.i18n.DateTimePatterns_ses', 'goog.i18n.DateTimePatterns_ses_ML', 'goog.i18n.DateTimePatterns_sg', 'goog.i18n.DateTimePatterns_sg_CF', 'goog.i18n.DateTimePatterns_shi', 'goog.i18n.DateTimePatterns_shi_Latn', 'goog.i18n.DateTimePatterns_shi_Latn_MA', 'goog.i18n.DateTimePatterns_shi_Tfng', 'goog.i18n.DateTimePatterns_shi_Tfng_MA', 'goog.i18n.DateTimePatterns_si_LK', 'goog.i18n.DateTimePatterns_sk_SK', 'goog.i18n.DateTimePatterns_sl_SI', 'goog.i18n.DateTimePatterns_smn', 'goog.i18n.DateTimePatterns_smn_FI', 'goog.i18n.DateTimePatterns_sn', 'goog.i18n.DateTimePatterns_sn_ZW', 'goog.i18n.DateTimePatterns_so', 'goog.i18n.DateTimePatterns_so_DJ', 'goog.i18n.DateTimePatterns_so_ET', 'goog.i18n.DateTimePatterns_so_KE', 'goog.i18n.DateTimePatterns_so_SO', 'goog.i18n.DateTimePatterns_sq_AL', 'goog.i18n.DateTimePatterns_sq_MK', 'goog.i18n.DateTimePatterns_sq_XK', 'goog.i18n.DateTimePatterns_sr_Cyrl', 'goog.i18n.DateTimePatterns_sr_Cyrl_BA', 'goog.i18n.DateTimePatterns_sr_Cyrl_ME', 'goog.i18n.DateTimePatterns_sr_Cyrl_RS', 'goog.i18n.DateTimePatterns_sr_Cyrl_XK', 'goog.i18n.DateTimePatterns_sr_Latn_BA', 'goog.i18n.DateTimePatterns_sr_Latn_ME', 'goog.i18n.DateTimePatterns_sr_Latn_RS', 'goog.i18n.DateTimePatterns_sr_Latn_XK', 'goog.i18n.DateTimePatterns_sv_AX', 'goog.i18n.DateTimePatterns_sv_FI', 'goog.i18n.DateTimePatterns_sv_SE', 'goog.i18n.DateTimePatterns_sw_CD', 'goog.i18n.DateTimePatterns_sw_KE', 'goog.i18n.DateTimePatterns_sw_TZ', 'goog.i18n.DateTimePatterns_sw_UG', 'goog.i18n.DateTimePatterns_ta_IN', 'goog.i18n.DateTimePatterns_ta_LK', 'goog.i18n.DateTimePatterns_ta_MY', 'goog.i18n.DateTimePatterns_ta_SG', 'goog.i18n.DateTimePatterns_te_IN', 'goog.i18n.DateTimePatterns_teo', 'goog.i18n.DateTimePatterns_teo_KE', 'goog.i18n.DateTimePatterns_teo_UG', 'goog.i18n.DateTimePatterns_th_TH', 'goog.i18n.DateTimePatterns_ti', 'goog.i18n.DateTimePatterns_ti_ER', 'goog.i18n.DateTimePatterns_ti_ET', 'goog.i18n.DateTimePatterns_to', 'goog.i18n.DateTimePatterns_to_TO', 'goog.i18n.DateTimePatterns_tr_CY', 'goog.i18n.DateTimePatterns_tr_TR', 'goog.i18n.DateTimePatterns_twq', 'goog.i18n.DateTimePatterns_twq_NE', 'goog.i18n.DateTimePatterns_tzm', 'goog.i18n.DateTimePatterns_tzm_MA', 'goog.i18n.DateTimePatterns_ug', 'goog.i18n.DateTimePatterns_ug_CN', 'goog.i18n.DateTimePatterns_uk_UA', 'goog.i18n.DateTimePatterns_ur_IN', 'goog.i18n.DateTimePatterns_ur_PK', 'goog.i18n.DateTimePatterns_uz_Arab', 'goog.i18n.DateTimePatterns_uz_Arab_AF', 'goog.i18n.DateTimePatterns_uz_Cyrl', 'goog.i18n.DateTimePatterns_uz_Cyrl_UZ', 'goog.i18n.DateTimePatterns_uz_Latn', 'goog.i18n.DateTimePatterns_uz_Latn_UZ', 'goog.i18n.DateTimePatterns_vai', 'goog.i18n.DateTimePatterns_vai_Latn', 'goog.i18n.DateTimePatterns_vai_Latn_LR', 'goog.i18n.DateTimePatterns_vai_Vaii', 'goog.i18n.DateTimePatterns_vai_Vaii_LR', 'goog.i18n.DateTimePatterns_vi_VN', 'goog.i18n.DateTimePatterns_vun', 'goog.i18n.DateTimePatterns_vun_TZ', 'goog.i18n.DateTimePatterns_wae', 'goog.i18n.DateTimePatterns_wae_CH', 'goog.i18n.DateTimePatterns_xog', 'goog.i18n.DateTimePatterns_xog_UG', 'goog.i18n.DateTimePatterns_yav', 'goog.i18n.DateTimePatterns_yav_CM', 'goog.i18n.DateTimePatterns_yi', 'goog.i18n.DateTimePatterns_yi_001', 'goog.i18n.DateTimePatterns_yo', 'goog.i18n.DateTimePatterns_yo_BJ', 'goog.i18n.DateTimePatterns_yo_NG', 'goog.i18n.DateTimePatterns_yue', 'goog.i18n.DateTimePatterns_yue_HK', 'goog.i18n.DateTimePatterns_zgh', 'goog.i18n.DateTimePatterns_zgh_MA', 'goog.i18n.DateTimePatterns_zh_Hans', 'goog.i18n.DateTimePatterns_zh_Hans_CN', 'goog.i18n.DateTimePatterns_zh_Hans_HK', 'goog.i18n.DateTimePatterns_zh_Hans_MO', 'goog.i18n.DateTimePatterns_zh_Hans_SG', 'goog.i18n.DateTimePatterns_zh_Hant', 'goog.i18n.DateTimePatterns_zh_Hant_HK', 'goog.i18n.DateTimePatterns_zh_Hant_MO', 'goog.i18n.DateTimePatterns_zh_Hant_TW', 'goog.i18n.DateTimePatterns_zu_ZA'], ['goog.i18n.DateTimePatterns'], {});
+goog.addDependency('i18n/datetimesymbols.js', ['goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbolsType', 'goog.i18n.DateTimeSymbols_af', 'goog.i18n.DateTimeSymbols_am', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_az', 'goog.i18n.DateTimeSymbols_be', 'goog.i18n.DateTimeSymbols_bg', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_br', 'goog.i18n.DateTimeSymbols_bs', 'goog.i18n.DateTimeSymbols_ca', 'goog.i18n.DateTimeSymbols_chr', 'goog.i18n.DateTimeSymbols_cs', 'goog.i18n.DateTimeSymbols_cy', 'goog.i18n.DateTimeSymbols_da', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_de_AT', 'goog.i18n.DateTimeSymbols_de_CH', 'goog.i18n.DateTimeSymbols_el', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_AU', 'goog.i18n.DateTimeSymbols_en_CA', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_ISO', 'goog.i18n.DateTimeSymbols_en_SG', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_en_ZA', 'goog.i18n.DateTimeSymbols_es', 'goog.i18n.DateTimeSymbols_es_419', 'goog.i18n.DateTimeSymbols_es_ES', 'goog.i18n.DateTimeSymbols_es_MX', 'goog.i18n.DateTimeSymbols_es_US', 'goog.i18n.DateTimeSymbols_et', 'goog.i18n.DateTimeSymbols_eu', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fi', 'goog.i18n.DateTimeSymbols_fil', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_ga', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_gsw', 'goog.i18n.DateTimeSymbols_gu', 'goog.i18n.DateTimeSymbols_haw', 'goog.i18n.DateTimeSymbols_he', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_hr', 'goog.i18n.DateTimeSymbols_hu', 'goog.i18n.DateTimeSymbols_hy', 'goog.i18n.DateTimeSymbols_id', 'goog.i18n.DateTimeSymbols_in', 'goog.i18n.DateTimeSymbols_is', 'goog.i18n.DateTimeSymbols_it', 'goog.i18n.DateTimeSymbols_iw', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_ka', 'goog.i18n.DateTimeSymbols_kk', 'goog.i18n.DateTimeSymbols_km', 'goog.i18n.DateTimeSymbols_kn', 'goog.i18n.DateTimeSymbols_ko', 'goog.i18n.DateTimeSymbols_ky', 'goog.i18n.DateTimeSymbols_ln', 'goog.i18n.DateTimeSymbols_lo', 'goog.i18n.DateTimeSymbols_lt', 'goog.i18n.DateTimeSymbols_lv', 'goog.i18n.DateTimeSymbols_mk', 'goog.i18n.DateTimeSymbols_ml', 'goog.i18n.DateTimeSymbols_mn', 'goog.i18n.DateTimeSymbols_mr', 'goog.i18n.DateTimeSymbols_ms', 'goog.i18n.DateTimeSymbols_mt', 'goog.i18n.DateTimeSymbols_my', 'goog.i18n.DateTimeSymbols_nb', 'goog.i18n.DateTimeSymbols_ne', 'goog.i18n.DateTimeSymbols_nl', 'goog.i18n.DateTimeSymbols_no', 'goog.i18n.DateTimeSymbols_no_NO', 'goog.i18n.DateTimeSymbols_or', 'goog.i18n.DateTimeSymbols_pa', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_pt', 'goog.i18n.DateTimeSymbols_pt_BR', 'goog.i18n.DateTimeSymbols_pt_PT', 'goog.i18n.DateTimeSymbols_ro', 'goog.i18n.DateTimeSymbols_ru', 'goog.i18n.DateTimeSymbols_si', 'goog.i18n.DateTimeSymbols_sk', 'goog.i18n.DateTimeSymbols_sl', 'goog.i18n.DateTimeSymbols_sq', 'goog.i18n.DateTimeSymbols_sr', 'goog.i18n.DateTimeSymbols_sr_Latn', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.DateTimeSymbols_sw', 'goog.i18n.DateTimeSymbols_ta', 'goog.i18n.DateTimeSymbols_te', 'goog.i18n.DateTimeSymbols_th', 'goog.i18n.DateTimeSymbols_tl', 'goog.i18n.DateTimeSymbols_tr', 'goog.i18n.DateTimeSymbols_uk', 'goog.i18n.DateTimeSymbols_ur', 'goog.i18n.DateTimeSymbols_uz', 'goog.i18n.DateTimeSymbols_vi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.DateTimeSymbols_zh_CN', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.i18n.DateTimeSymbols_zh_TW', 'goog.i18n.DateTimeSymbols_zu'], [], {});
+goog.addDependency('i18n/datetimesymbolsext.js', ['goog.i18n.DateTimeSymbolsExt', 'goog.i18n.DateTimeSymbols_af_NA', 'goog.i18n.DateTimeSymbols_af_ZA', 'goog.i18n.DateTimeSymbols_agq', 'goog.i18n.DateTimeSymbols_agq_CM', 'goog.i18n.DateTimeSymbols_ak', 'goog.i18n.DateTimeSymbols_ak_GH', 'goog.i18n.DateTimeSymbols_am_ET', 'goog.i18n.DateTimeSymbols_ar_001', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_BH', 'goog.i18n.DateTimeSymbols_ar_DJ', 'goog.i18n.DateTimeSymbols_ar_DZ', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_ar_EH', 'goog.i18n.DateTimeSymbols_ar_ER', 'goog.i18n.DateTimeSymbols_ar_IL', 'goog.i18n.DateTimeSymbols_ar_IQ', 'goog.i18n.DateTimeSymbols_ar_JO', 'goog.i18n.DateTimeSymbols_ar_KM', 'goog.i18n.DateTimeSymbols_ar_KW', 'goog.i18n.DateTimeSymbols_ar_LB', 'goog.i18n.DateTimeSymbols_ar_LY', 'goog.i18n.DateTimeSymbols_ar_MA', 'goog.i18n.DateTimeSymbols_ar_MR', 'goog.i18n.DateTimeSymbols_ar_OM', 'goog.i18n.DateTimeSymbols_ar_PS', 'goog.i18n.DateTimeSymbols_ar_QA', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_ar_SD', 'goog.i18n.DateTimeSymbols_ar_SO', 'goog.i18n.DateTimeSymbols_ar_SS', 'goog.i18n.DateTimeSymbols_ar_SY', 'goog.i18n.DateTimeSymbols_ar_TD', 'goog.i18n.DateTimeSymbols_ar_TN', 'goog.i18n.DateTimeSymbols_ar_XB', 'goog.i18n.DateTimeSymbols_ar_YE', 'goog.i18n.DateTimeSymbols_as', 'goog.i18n.DateTimeSymbols_as_IN', 'goog.i18n.DateTimeSymbols_asa', 'goog.i18n.DateTimeSymbols_asa_TZ', 'goog.i18n.DateTimeSymbols_ast', 'goog.i18n.DateTimeSymbols_ast_ES', 'goog.i18n.DateTimeSymbols_az_Cyrl', 'goog.i18n.DateTimeSymbols_az_Cyrl_AZ', 'goog.i18n.DateTimeSymbols_az_Latn', 'goog.i18n.DateTimeSymbols_az_Latn_AZ', 'goog.i18n.DateTimeSymbols_bas', 'goog.i18n.DateTimeSymbols_bas_CM', 'goog.i18n.DateTimeSymbols_be_BY', 'goog.i18n.DateTimeSymbols_bem', 'goog.i18n.DateTimeSymbols_bem_ZM', 'goog.i18n.DateTimeSymbols_bez', 'goog.i18n.DateTimeSymbols_bez_TZ', 'goog.i18n.DateTimeSymbols_bg_BG', 'goog.i18n.DateTimeSymbols_bm', 'goog.i18n.DateTimeSymbols_bm_ML', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_bn_IN', 'goog.i18n.DateTimeSymbols_bo', 'goog.i18n.DateTimeSymbols_bo_CN', 'goog.i18n.DateTimeSymbols_bo_IN', 'goog.i18n.DateTimeSymbols_br_FR', 'goog.i18n.DateTimeSymbols_brx', 'goog.i18n.DateTimeSymbols_brx_IN', 'goog.i18n.DateTimeSymbols_bs_Cyrl', 'goog.i18n.DateTimeSymbols_bs_Cyrl_BA', 'goog.i18n.DateTimeSymbols_bs_Latn', 'goog.i18n.DateTimeSymbols_bs_Latn_BA', 'goog.i18n.DateTimeSymbols_ca_AD', 'goog.i18n.DateTimeSymbols_ca_ES', 'goog.i18n.DateTimeSymbols_ca_ES_VALENCIA', 'goog.i18n.DateTimeSymbols_ca_FR', 'goog.i18n.DateTimeSymbols_ca_IT', 'goog.i18n.DateTimeSymbols_ce', 'goog.i18n.DateTimeSymbols_ce_RU', 'goog.i18n.DateTimeSymbols_cgg', 'goog.i18n.DateTimeSymbols_cgg_UG', 'goog.i18n.DateTimeSymbols_chr_US', 'goog.i18n.DateTimeSymbols_ckb', 'goog.i18n.DateTimeSymbols_ckb_Arab', 'goog.i18n.DateTimeSymbols_ckb_Arab_IQ', 'goog.i18n.DateTimeSymbols_ckb_Arab_IR', 'goog.i18n.DateTimeSymbols_ckb_IQ', 'goog.i18n.DateTimeSymbols_ckb_IR', 'goog.i18n.DateTimeSymbols_ckb_Latn', 'goog.i18n.DateTimeSymbols_ckb_Latn_IQ', 'goog.i18n.DateTimeSymbols_cs_CZ', 'goog.i18n.DateTimeSymbols_cu', 'goog.i18n.DateTimeSymbols_cu_RU', 'goog.i18n.DateTimeSymbols_cy_GB', 'goog.i18n.DateTimeSymbols_da_DK', 'goog.i18n.DateTimeSymbols_da_GL', 'goog.i18n.DateTimeSymbols_dav', 'goog.i18n.DateTimeSymbols_dav_KE', 'goog.i18n.DateTimeSymbols_de_BE', 'goog.i18n.DateTimeSymbols_de_DE', 'goog.i18n.DateTimeSymbols_de_LI', 'goog.i18n.DateTimeSymbols_de_LU', 'goog.i18n.DateTimeSymbols_dje', 'goog.i18n.DateTimeSymbols_dje_NE', 'goog.i18n.DateTimeSymbols_dsb', 'goog.i18n.DateTimeSymbols_dsb_DE', 'goog.i18n.DateTimeSymbols_dua', 'goog.i18n.DateTimeSymbols_dua_CM', 'goog.i18n.DateTimeSymbols_dyo', 'goog.i18n.DateTimeSymbols_dyo_SN', 'goog.i18n.DateTimeSymbols_dz', 'goog.i18n.DateTimeSymbols_dz_BT', 'goog.i18n.DateTimeSymbols_ebu', 'goog.i18n.DateTimeSymbols_ebu_KE', 'goog.i18n.DateTimeSymbols_ee', 'goog.i18n.DateTimeSymbols_ee_GH', 'goog.i18n.DateTimeSymbols_ee_TG', 'goog.i18n.DateTimeSymbols_el_CY', 'goog.i18n.DateTimeSymbols_el_GR', 'goog.i18n.DateTimeSymbols_en_001', 'goog.i18n.DateTimeSymbols_en_150', 'goog.i18n.DateTimeSymbols_en_AG', 'goog.i18n.DateTimeSymbols_en_AI', 'goog.i18n.DateTimeSymbols_en_AS', 'goog.i18n.DateTimeSymbols_en_AT', 'goog.i18n.DateTimeSymbols_en_BB', 'goog.i18n.DateTimeSymbols_en_BE', 'goog.i18n.DateTimeSymbols_en_BI', 'goog.i18n.DateTimeSymbols_en_BM', 'goog.i18n.DateTimeSymbols_en_BS', 'goog.i18n.DateTimeSymbols_en_BW', 'goog.i18n.DateTimeSymbols_en_BZ', 'goog.i18n.DateTimeSymbols_en_CC', 'goog.i18n.DateTimeSymbols_en_CH', 'goog.i18n.DateTimeSymbols_en_CK', 'goog.i18n.DateTimeSymbols_en_CM', 'goog.i18n.DateTimeSymbols_en_CX', 'goog.i18n.DateTimeSymbols_en_CY', 'goog.i18n.DateTimeSymbols_en_DE', 'goog.i18n.DateTimeSymbols_en_DG', 'goog.i18n.DateTimeSymbols_en_DK', 'goog.i18n.DateTimeSymbols_en_DM', 'goog.i18n.DateTimeSymbols_en_ER', 'goog.i18n.DateTimeSymbols_en_FI', 'goog.i18n.DateTimeSymbols_en_FJ', 'goog.i18n.DateTimeSymbols_en_FK', 'goog.i18n.DateTimeSymbols_en_FM', 'goog.i18n.DateTimeSymbols_en_GD', 'goog.i18n.DateTimeSymbols_en_GG', 'goog.i18n.DateTimeSymbols_en_GH', 'goog.i18n.DateTimeSymbols_en_GI', 'goog.i18n.DateTimeSymbols_en_GM', 'goog.i18n.DateTimeSymbols_en_GU', 'goog.i18n.DateTimeSymbols_en_GY', 'goog.i18n.DateTimeSymbols_en_HK', 'goog.i18n.DateTimeSymbols_en_IL', 'goog.i18n.DateTimeSymbols_en_IM', 'goog.i18n.DateTimeSymbols_en_IO', 'goog.i18n.DateTimeSymbols_en_JE', 'goog.i18n.DateTimeSymbols_en_JM', 'goog.i18n.DateTimeSymbols_en_KE', 'goog.i18n.DateTimeSymbols_en_KI', 'goog.i18n.DateTimeSymbols_en_KN', 'goog.i18n.DateTimeSymbols_en_KY', 'goog.i18n.DateTimeSymbols_en_LC', 'goog.i18n.DateTimeSymbols_en_LR', 'goog.i18n.DateTimeSymbols_en_LS', 'goog.i18n.DateTimeSymbols_en_MG', 'goog.i18n.DateTimeSymbols_en_MH', 'goog.i18n.DateTimeSymbols_en_MO', 'goog.i18n.DateTimeSymbols_en_MP', 'goog.i18n.DateTimeSymbols_en_MS', 'goog.i18n.DateTimeSymbols_en_MT', 'goog.i18n.DateTimeSymbols_en_MU', 'goog.i18n.DateTimeSymbols_en_MW', 'goog.i18n.DateTimeSymbols_en_MY', 'goog.i18n.DateTimeSymbols_en_NA', 'goog.i18n.DateTimeSymbols_en_NF', 'goog.i18n.DateTimeSymbols_en_NG', 'goog.i18n.DateTimeSymbols_en_NL', 'goog.i18n.DateTimeSymbols_en_NR', 'goog.i18n.DateTimeSymbols_en_NU', 'goog.i18n.DateTimeSymbols_en_NZ', 'goog.i18n.DateTimeSymbols_en_PG', 'goog.i18n.DateTimeSymbols_en_PH', 'goog.i18n.DateTimeSymbols_en_PK', 'goog.i18n.DateTimeSymbols_en_PN', 'goog.i18n.DateTimeSymbols_en_PR', 'goog.i18n.DateTimeSymbols_en_PW', 'goog.i18n.DateTimeSymbols_en_RW', 'goog.i18n.DateTimeSymbols_en_SB', 'goog.i18n.DateTimeSymbols_en_SC', 'goog.i18n.DateTimeSymbols_en_SD', 'goog.i18n.DateTimeSymbols_en_SE', 'goog.i18n.DateTimeSymbols_en_SH', 'goog.i18n.DateTimeSymbols_en_SI', 'goog.i18n.DateTimeSymbols_en_SL', 'goog.i18n.DateTimeSymbols_en_SS', 'goog.i18n.DateTimeSymbols_en_SX', 'goog.i18n.DateTimeSymbols_en_SZ', 'goog.i18n.DateTimeSymbols_en_TC', 'goog.i18n.DateTimeSymbols_en_TK', 'goog.i18n.DateTimeSymbols_en_TO', 'goog.i18n.DateTimeSymbols_en_TT', 'goog.i18n.DateTimeSymbols_en_TV', 'goog.i18n.DateTimeSymbols_en_TZ', 'goog.i18n.DateTimeSymbols_en_UG', 'goog.i18n.DateTimeSymbols_en_UM', 'goog.i18n.DateTimeSymbols_en_VC', 'goog.i18n.DateTimeSymbols_en_VG', 'goog.i18n.DateTimeSymbols_en_VI', 'goog.i18n.DateTimeSymbols_en_VU', 'goog.i18n.DateTimeSymbols_en_WS', 'goog.i18n.DateTimeSymbols_en_XA', 'goog.i18n.DateTimeSymbols_en_ZM', 'goog.i18n.DateTimeSymbols_en_ZW', 'goog.i18n.DateTimeSymbols_eo', 'goog.i18n.DateTimeSymbols_eo_001', 'goog.i18n.DateTimeSymbols_es_AR', 'goog.i18n.DateTimeSymbols_es_BO', 'goog.i18n.DateTimeSymbols_es_BR', 'goog.i18n.DateTimeSymbols_es_CL', 'goog.i18n.DateTimeSymbols_es_CO', 'goog.i18n.DateTimeSymbols_es_CR', 'goog.i18n.DateTimeSymbols_es_CU', 'goog.i18n.DateTimeSymbols_es_DO', 'goog.i18n.DateTimeSymbols_es_EA', 'goog.i18n.DateTimeSymbols_es_EC', 'goog.i18n.DateTimeSymbols_es_GQ', 'goog.i18n.DateTimeSymbols_es_GT', 'goog.i18n.DateTimeSymbols_es_HN', 'goog.i18n.DateTimeSymbols_es_IC', 'goog.i18n.DateTimeSymbols_es_NI', 'goog.i18n.DateTimeSymbols_es_PA', 'goog.i18n.DateTimeSymbols_es_PE', 'goog.i18n.DateTimeSymbols_es_PH', 'goog.i18n.DateTimeSymbols_es_PR', 'goog.i18n.DateTimeSymbols_es_PY', 'goog.i18n.DateTimeSymbols_es_SV', 'goog.i18n.DateTimeSymbols_es_UY', 'goog.i18n.DateTimeSymbols_es_VE', 'goog.i18n.DateTimeSymbols_et_EE', 'goog.i18n.DateTimeSymbols_eu_ES', 'goog.i18n.DateTimeSymbols_ewo', 'goog.i18n.DateTimeSymbols_ewo_CM', 'goog.i18n.DateTimeSymbols_fa_AF', 'goog.i18n.DateTimeSymbols_fa_IR', 'goog.i18n.DateTimeSymbols_ff', 'goog.i18n.DateTimeSymbols_ff_CM', 'goog.i18n.DateTimeSymbols_ff_GN', 'goog.i18n.DateTimeSymbols_ff_MR', 'goog.i18n.DateTimeSymbols_ff_SN', 'goog.i18n.DateTimeSymbols_fi_FI', 'goog.i18n.DateTimeSymbols_fil_PH', 'goog.i18n.DateTimeSymbols_fo', 'goog.i18n.DateTimeSymbols_fo_DK', 'goog.i18n.DateTimeSymbols_fo_FO', 'goog.i18n.DateTimeSymbols_fr_BE', 'goog.i18n.DateTimeSymbols_fr_BF', 'goog.i18n.DateTimeSymbols_fr_BI', 'goog.i18n.DateTimeSymbols_fr_BJ', 'goog.i18n.DateTimeSymbols_fr_BL', 'goog.i18n.DateTimeSymbols_fr_CD', 'goog.i18n.DateTimeSymbols_fr_CF', 'goog.i18n.DateTimeSymbols_fr_CG', 'goog.i18n.DateTimeSymbols_fr_CH', 'goog.i18n.DateTimeSymbols_fr_CI', 'goog.i18n.DateTimeSymbols_fr_CM', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_fr_DZ', 'goog.i18n.DateTimeSymbols_fr_FR', 'goog.i18n.DateTimeSymbols_fr_GA', 'goog.i18n.DateTimeSymbols_fr_GF', 'goog.i18n.DateTimeSymbols_fr_GN', 'goog.i18n.DateTimeSymbols_fr_GP', 'goog.i18n.DateTimeSymbols_fr_GQ', 'goog.i18n.DateTimeSymbols_fr_HT', 'goog.i18n.DateTimeSymbols_fr_KM', 'goog.i18n.DateTimeSymbols_fr_LU', 'goog.i18n.DateTimeSymbols_fr_MA', 'goog.i18n.DateTimeSymbols_fr_MC', 'goog.i18n.DateTimeSymbols_fr_MF', 'goog.i18n.DateTimeSymbols_fr_MG', 'goog.i18n.DateTimeSymbols_fr_ML', 'goog.i18n.DateTimeSymbols_fr_MQ', 'goog.i18n.DateTimeSymbols_fr_MR', 'goog.i18n.DateTimeSymbols_fr_MU', 'goog.i18n.DateTimeSymbols_fr_NC', 'goog.i18n.DateTimeSymbols_fr_NE', 'goog.i18n.DateTimeSymbols_fr_PF', 'goog.i18n.DateTimeSymbols_fr_PM', 'goog.i18n.DateTimeSymbols_fr_RE', 'goog.i18n.DateTimeSymbols_fr_RW', 'goog.i18n.DateTimeSymbols_fr_SC', 'goog.i18n.DateTimeSymbols_fr_SN', 'goog.i18n.DateTimeSymbols_fr_SY', 'goog.i18n.DateTimeSymbols_fr_TD', 'goog.i18n.DateTimeSymbols_fr_TG', 'goog.i18n.DateTimeSymbols_fr_TN', 'goog.i18n.DateTimeSymbols_fr_VU', 'goog.i18n.DateTimeSymbols_fr_WF', 'goog.i18n.DateTimeSymbols_fr_YT', 'goog.i18n.DateTimeSymbols_fur', 'goog.i18n.DateTimeSymbols_fur_IT', 'goog.i18n.DateTimeSymbols_fy', 'goog.i18n.DateTimeSymbols_fy_NL', 'goog.i18n.DateTimeSymbols_ga_IE', 'goog.i18n.DateTimeSymbols_gd', 'goog.i18n.DateTimeSymbols_gd_GB', 'goog.i18n.DateTimeSymbols_gl_ES', 'goog.i18n.DateTimeSymbols_gsw_CH', 'goog.i18n.DateTimeSymbols_gsw_FR', 'goog.i18n.DateTimeSymbols_gsw_LI', 'goog.i18n.DateTimeSymbols_gu_IN', 'goog.i18n.DateTimeSymbols_guz', 'goog.i18n.DateTimeSymbols_guz_KE', 'goog.i18n.DateTimeSymbols_gv', 'goog.i18n.DateTimeSymbols_gv_IM', 'goog.i18n.DateTimeSymbols_ha', 'goog.i18n.DateTimeSymbols_ha_GH', 'goog.i18n.DateTimeSymbols_ha_NE', 'goog.i18n.DateTimeSymbols_ha_NG', 'goog.i18n.DateTimeSymbols_haw_US', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_hi_IN', 'goog.i18n.DateTimeSymbols_hr_BA', 'goog.i18n.DateTimeSymbols_hr_HR', 'goog.i18n.DateTimeSymbols_hsb', 'goog.i18n.DateTimeSymbols_hsb_DE', 'goog.i18n.DateTimeSymbols_hu_HU', 'goog.i18n.DateTimeSymbols_hy_AM', 'goog.i18n.DateTimeSymbols_id_ID', 'goog.i18n.DateTimeSymbols_ig', 'goog.i18n.DateTimeSymbols_ig_NG', 'goog.i18n.DateTimeSymbols_ii', 'goog.i18n.DateTimeSymbols_ii_CN', 'goog.i18n.DateTimeSymbols_is_IS', 'goog.i18n.DateTimeSymbols_it_CH', 'goog.i18n.DateTimeSymbols_it_IT', 'goog.i18n.DateTimeSymbols_it_SM', 'goog.i18n.DateTimeSymbols_ja_JP', 'goog.i18n.DateTimeSymbols_jgo', 'goog.i18n.DateTimeSymbols_jgo_CM', 'goog.i18n.DateTimeSymbols_jmc', 'goog.i18n.DateTimeSymbols_jmc_TZ', 'goog.i18n.DateTimeSymbols_ka_GE', 'goog.i18n.DateTimeSymbols_kab', 'goog.i18n.DateTimeSymbols_kab_DZ', 'goog.i18n.DateTimeSymbols_kam', 'goog.i18n.DateTimeSymbols_kam_KE', 'goog.i18n.DateTimeSymbols_kde', 'goog.i18n.DateTimeSymbols_kde_TZ', 'goog.i18n.DateTimeSymbols_kea', 'goog.i18n.DateTimeSymbols_kea_CV', 'goog.i18n.DateTimeSymbols_khq', 'goog.i18n.DateTimeSymbols_khq_ML', 'goog.i18n.DateTimeSymbols_ki', 'goog.i18n.DateTimeSymbols_ki_KE', 'goog.i18n.DateTimeSymbols_kk_KZ', 'goog.i18n.DateTimeSymbols_kkj', 'goog.i18n.DateTimeSymbols_kkj_CM', 'goog.i18n.DateTimeSymbols_kl', 'goog.i18n.DateTimeSymbols_kl_GL', 'goog.i18n.DateTimeSymbols_kln', 'goog.i18n.DateTimeSymbols_kln_KE', 'goog.i18n.DateTimeSymbols_km_KH', 'goog.i18n.DateTimeSymbols_kn_IN', 'goog.i18n.DateTimeSymbols_ko_KP', 'goog.i18n.DateTimeSymbols_ko_KR', 'goog.i18n.DateTimeSymbols_kok', 'goog.i18n.DateTimeSymbols_kok_IN', 'goog.i18n.DateTimeSymbols_ks', 'goog.i18n.DateTimeSymbols_ks_IN', 'goog.i18n.DateTimeSymbols_ksb', 'goog.i18n.DateTimeSymbols_ksb_TZ', 'goog.i18n.DateTimeSymbols_ksf', 'goog.i18n.DateTimeSymbols_ksf_CM', 'goog.i18n.DateTimeSymbols_ksh', 'goog.i18n.DateTimeSymbols_ksh_DE', 'goog.i18n.DateTimeSymbols_kw', 'goog.i18n.DateTimeSymbols_kw_GB', 'goog.i18n.DateTimeSymbols_ky_KG', 'goog.i18n.DateTimeSymbols_lag', 'goog.i18n.DateTimeSymbols_lag_TZ', 'goog.i18n.DateTimeSymbols_lb', 'goog.i18n.DateTimeSymbols_lb_LU', 'goog.i18n.DateTimeSymbols_lg', 'goog.i18n.DateTimeSymbols_lg_UG', 'goog.i18n.DateTimeSymbols_lkt', 'goog.i18n.DateTimeSymbols_lkt_US', 'goog.i18n.DateTimeSymbols_ln_AO', 'goog.i18n.DateTimeSymbols_ln_CD', 'goog.i18n.DateTimeSymbols_ln_CF', 'goog.i18n.DateTimeSymbols_ln_CG', 'goog.i18n.DateTimeSymbols_lo_LA', 'goog.i18n.DateTimeSymbols_lrc', 'goog.i18n.DateTimeSymbols_lrc_IQ', 'goog.i18n.DateTimeSymbols_lrc_IR', 'goog.i18n.DateTimeSymbols_lt_LT', 'goog.i18n.DateTimeSymbols_lu', 'goog.i18n.DateTimeSymbols_lu_CD', 'goog.i18n.DateTimeSymbols_luo', 'goog.i18n.DateTimeSymbols_luo_KE', 'goog.i18n.DateTimeSymbols_luy', 'goog.i18n.DateTimeSymbols_luy_KE', 'goog.i18n.DateTimeSymbols_lv_LV', 'goog.i18n.DateTimeSymbols_mas', 'goog.i18n.DateTimeSymbols_mas_KE', 'goog.i18n.DateTimeSymbols_mas_TZ', 'goog.i18n.DateTimeSymbols_mer', 'goog.i18n.DateTimeSymbols_mer_KE', 'goog.i18n.DateTimeSymbols_mfe', 'goog.i18n.DateTimeSymbols_mfe_MU', 'goog.i18n.DateTimeSymbols_mg', 'goog.i18n.DateTimeSymbols_mg_MG', 'goog.i18n.DateTimeSymbols_mgh', 'goog.i18n.DateTimeSymbols_mgh_MZ', 'goog.i18n.DateTimeSymbols_mgo', 'goog.i18n.DateTimeSymbols_mgo_CM', 'goog.i18n.DateTimeSymbols_mk_MK', 'goog.i18n.DateTimeSymbols_ml_IN', 'goog.i18n.DateTimeSymbols_mn_MN', 'goog.i18n.DateTimeSymbols_mr_IN', 'goog.i18n.DateTimeSymbols_ms_BN', 'goog.i18n.DateTimeSymbols_ms_MY', 'goog.i18n.DateTimeSymbols_ms_SG', 'goog.i18n.DateTimeSymbols_mt_MT', 'goog.i18n.DateTimeSymbols_mua', 'goog.i18n.DateTimeSymbols_mua_CM', 'goog.i18n.DateTimeSymbols_my_MM', 'goog.i18n.DateTimeSymbols_mzn', 'goog.i18n.DateTimeSymbols_mzn_IR', 'goog.i18n.DateTimeSymbols_naq', 'goog.i18n.DateTimeSymbols_naq_NA', 'goog.i18n.DateTimeSymbols_nb_NO', 'goog.i18n.DateTimeSymbols_nb_SJ', 'goog.i18n.DateTimeSymbols_nd', 'goog.i18n.DateTimeSymbols_nd_ZW', 'goog.i18n.DateTimeSymbols_ne_IN', 'goog.i18n.DateTimeSymbols_ne_NP', 'goog.i18n.DateTimeSymbols_nl_AW', 'goog.i18n.DateTimeSymbols_nl_BE', 'goog.i18n.DateTimeSymbols_nl_BQ', 'goog.i18n.DateTimeSymbols_nl_CW', 'goog.i18n.DateTimeSymbols_nl_NL', 'goog.i18n.DateTimeSymbols_nl_SR', 'goog.i18n.DateTimeSymbols_nl_SX', 'goog.i18n.DateTimeSymbols_nmg', 'goog.i18n.DateTimeSymbols_nmg_CM', 'goog.i18n.DateTimeSymbols_nn', 'goog.i18n.DateTimeSymbols_nn_NO', 'goog.i18n.DateTimeSymbols_nnh', 'goog.i18n.DateTimeSymbols_nnh_CM', 'goog.i18n.DateTimeSymbols_nus', 'goog.i18n.DateTimeSymbols_nus_SS', 'goog.i18n.DateTimeSymbols_nyn', 'goog.i18n.DateTimeSymbols_nyn_UG', 'goog.i18n.DateTimeSymbols_om', 'goog.i18n.DateTimeSymbols_om_ET', 'goog.i18n.DateTimeSymbols_om_KE', 'goog.i18n.DateTimeSymbols_or_IN', 'goog.i18n.DateTimeSymbols_os', 'goog.i18n.DateTimeSymbols_os_GE', 'goog.i18n.DateTimeSymbols_os_RU', 'goog.i18n.DateTimeSymbols_pa_Arab', 'goog.i18n.DateTimeSymbols_pa_Arab_PK', 'goog.i18n.DateTimeSymbols_pa_Guru', 'goog.i18n.DateTimeSymbols_pa_Guru_IN', 'goog.i18n.DateTimeSymbols_pl_PL', 'goog.i18n.DateTimeSymbols_prg', 'goog.i18n.DateTimeSymbols_prg_001', 'goog.i18n.DateTimeSymbols_ps', 'goog.i18n.DateTimeSymbols_ps_AF', 'goog.i18n.DateTimeSymbols_pt_AO', 'goog.i18n.DateTimeSymbols_pt_CH', 'goog.i18n.DateTimeSymbols_pt_CV', 'goog.i18n.DateTimeSymbols_pt_GQ', 'goog.i18n.DateTimeSymbols_pt_GW', 'goog.i18n.DateTimeSymbols_pt_LU', 'goog.i18n.DateTimeSymbols_pt_MO', 'goog.i18n.DateTimeSymbols_pt_MZ', 'goog.i18n.DateTimeSymbols_pt_ST', 'goog.i18n.DateTimeSymbols_pt_TL', 'goog.i18n.DateTimeSymbols_qu', 'goog.i18n.DateTimeSymbols_qu_BO', 'goog.i18n.DateTimeSymbols_qu_EC', 'goog.i18n.DateTimeSymbols_qu_PE', 'goog.i18n.DateTimeSymbols_rm', 'goog.i18n.DateTimeSymbols_rm_CH', 'goog.i18n.DateTimeSymbols_rn', 'goog.i18n.DateTimeSymbols_rn_BI', 'goog.i18n.DateTimeSymbols_ro_MD', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_rof', 'goog.i18n.DateTimeSymbols_rof_TZ', 'goog.i18n.DateTimeSymbols_ru_BY', 'goog.i18n.DateTimeSymbols_ru_KG', 'goog.i18n.DateTimeSymbols_ru_KZ', 'goog.i18n.DateTimeSymbols_ru_MD', 'goog.i18n.DateTimeSymbols_ru_RU', 'goog.i18n.DateTimeSymbols_ru_UA', 'goog.i18n.DateTimeSymbols_rw', 'goog.i18n.DateTimeSymbols_rw_RW', 'goog.i18n.DateTimeSymbols_rwk', 'goog.i18n.DateTimeSymbols_rwk_TZ', 'goog.i18n.DateTimeSymbols_sah', 'goog.i18n.DateTimeSymbols_sah_RU', 'goog.i18n.DateTimeSymbols_saq', 'goog.i18n.DateTimeSymbols_saq_KE', 'goog.i18n.DateTimeSymbols_sbp', 'goog.i18n.DateTimeSymbols_sbp_TZ', 'goog.i18n.DateTimeSymbols_se', 'goog.i18n.DateTimeSymbols_se_FI', 'goog.i18n.DateTimeSymbols_se_NO', 'goog.i18n.DateTimeSymbols_se_SE', 'goog.i18n.DateTimeSymbols_seh', 'goog.i18n.DateTimeSymbols_seh_MZ', 'goog.i18n.DateTimeSymbols_ses', 'goog.i18n.DateTimeSymbols_ses_ML', 'goog.i18n.DateTimeSymbols_sg', 'goog.i18n.DateTimeSymbols_sg_CF', 'goog.i18n.DateTimeSymbols_shi', 'goog.i18n.DateTimeSymbols_shi_Latn', 'goog.i18n.DateTimeSymbols_shi_Latn_MA', 'goog.i18n.DateTimeSymbols_shi_Tfng', 'goog.i18n.DateTimeSymbols_shi_Tfng_MA', 'goog.i18n.DateTimeSymbols_si_LK', 'goog.i18n.DateTimeSymbols_sk_SK', 'goog.i18n.DateTimeSymbols_sl_SI', 'goog.i18n.DateTimeSymbols_smn', 'goog.i18n.DateTimeSymbols_smn_FI', 'goog.i18n.DateTimeSymbols_sn', 'goog.i18n.DateTimeSymbols_sn_ZW', 'goog.i18n.DateTimeSymbols_so', 'goog.i18n.DateTimeSymbols_so_DJ', 'goog.i18n.DateTimeSymbols_so_ET', 'goog.i18n.DateTimeSymbols_so_KE', 'goog.i18n.DateTimeSymbols_so_SO', 'goog.i18n.DateTimeSymbols_sq_AL', 'goog.i18n.DateTimeSymbols_sq_MK', 'goog.i18n.DateTimeSymbols_sq_XK', 'goog.i18n.DateTimeSymbols_sr_Cyrl', 'goog.i18n.DateTimeSymbols_sr_Cyrl_BA', 'goog.i18n.DateTimeSymbols_sr_Cyrl_ME', 'goog.i18n.DateTimeSymbols_sr_Cyrl_RS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_XK', 'goog.i18n.DateTimeSymbols_sr_Latn_BA', 'goog.i18n.DateTimeSymbols_sr_Latn_ME', 'goog.i18n.DateTimeSymbols_sr_Latn_RS', 'goog.i18n.DateTimeSymbols_sr_Latn_XK', 'goog.i18n.DateTimeSymbols_sv_AX', 'goog.i18n.DateTimeSymbols_sv_FI', 'goog.i18n.DateTimeSymbols_sv_SE', 'goog.i18n.DateTimeSymbols_sw_CD', 'goog.i18n.DateTimeSymbols_sw_KE', 'goog.i18n.DateTimeSymbols_sw_TZ', 'goog.i18n.DateTimeSymbols_sw_UG', 'goog.i18n.DateTimeSymbols_ta_IN', 'goog.i18n.DateTimeSymbols_ta_LK', 'goog.i18n.DateTimeSymbols_ta_MY', 'goog.i18n.DateTimeSymbols_ta_SG', 'goog.i18n.DateTimeSymbols_te_IN', 'goog.i18n.DateTimeSymbols_teo', 'goog.i18n.DateTimeSymbols_teo_KE', 'goog.i18n.DateTimeSymbols_teo_UG', 'goog.i18n.DateTimeSymbols_th_TH', 'goog.i18n.DateTimeSymbols_ti', 'goog.i18n.DateTimeSymbols_ti_ER', 'goog.i18n.DateTimeSymbols_ti_ET', 'goog.i18n.DateTimeSymbols_tk', 'goog.i18n.DateTimeSymbols_tk_TM', 'goog.i18n.DateTimeSymbols_to', 'goog.i18n.DateTimeSymbols_to_TO', 'goog.i18n.DateTimeSymbols_tr_CY', 'goog.i18n.DateTimeSymbols_tr_TR', 'goog.i18n.DateTimeSymbols_twq', 'goog.i18n.DateTimeSymbols_twq_NE', 'goog.i18n.DateTimeSymbols_tzm', 'goog.i18n.DateTimeSymbols_tzm_MA', 'goog.i18n.DateTimeSymbols_ug', 'goog.i18n.DateTimeSymbols_ug_CN', 'goog.i18n.DateTimeSymbols_uk_UA', 'goog.i18n.DateTimeSymbols_ur_IN', 'goog.i18n.DateTimeSymbols_ur_PK', 'goog.i18n.DateTimeSymbols_uz_Arab', 'goog.i18n.DateTimeSymbols_uz_Arab_AF', 'goog.i18n.DateTimeSymbols_uz_Cyrl', 'goog.i18n.DateTimeSymbols_uz_Cyrl_UZ', 'goog.i18n.DateTimeSymbols_uz_Latn', 'goog.i18n.DateTimeSymbols_uz_Latn_UZ', 'goog.i18n.DateTimeSymbols_vai', 'goog.i18n.DateTimeSymbols_vai_Latn', 'goog.i18n.DateTimeSymbols_vai_Latn_LR', 'goog.i18n.DateTimeSymbols_vai_Vaii', 'goog.i18n.DateTimeSymbols_vai_Vaii_LR', 'goog.i18n.DateTimeSymbols_vi_VN', 'goog.i18n.DateTimeSymbols_vo', 'goog.i18n.DateTimeSymbols_vo_001', 'goog.i18n.DateTimeSymbols_vun', 'goog.i18n.DateTimeSymbols_vun_TZ', 'goog.i18n.DateTimeSymbols_wae', 'goog.i18n.DateTimeSymbols_wae_CH', 'goog.i18n.DateTimeSymbols_xog', 'goog.i18n.DateTimeSymbols_xog_UG', 'goog.i18n.DateTimeSymbols_yav', 'goog.i18n.DateTimeSymbols_yav_CM', 'goog.i18n.DateTimeSymbols_yi', 'goog.i18n.DateTimeSymbols_yi_001', 'goog.i18n.DateTimeSymbols_yo', 'goog.i18n.DateTimeSymbols_yo_BJ', 'goog.i18n.DateTimeSymbols_yo_NG', 'goog.i18n.DateTimeSymbols_yue', 'goog.i18n.DateTimeSymbols_yue_HK', 'goog.i18n.DateTimeSymbols_zgh', 'goog.i18n.DateTimeSymbols_zgh_MA', 'goog.i18n.DateTimeSymbols_zh_Hans', 'goog.i18n.DateTimeSymbols_zh_Hans_CN', 'goog.i18n.DateTimeSymbols_zh_Hans_HK', 'goog.i18n.DateTimeSymbols_zh_Hans_MO', 'goog.i18n.DateTimeSymbols_zh_Hans_SG', 'goog.i18n.DateTimeSymbols_zh_Hant', 'goog.i18n.DateTimeSymbols_zh_Hant_HK', 'goog.i18n.DateTimeSymbols_zh_Hant_MO', 'goog.i18n.DateTimeSymbols_zh_Hant_TW', 'goog.i18n.DateTimeSymbols_zu_ZA'], ['goog.i18n.DateTimeSymbols'], {});
+goog.addDependency('i18n/graphemebreak.js', ['goog.i18n.GraphemeBreak'], ['goog.structs.InversionMap'], {});
+goog.addDependency('i18n/graphemebreak_test.js', ['goog.i18n.GraphemeBreakTest'], ['goog.i18n.GraphemeBreak', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/messageformat.js', ['goog.i18n.MessageFormat'], ['goog.asserts', 'goog.i18n.NumberFormat', 'goog.i18n.ordinalRules', 'goog.i18n.pluralRules'], {});
+goog.addDependency('i18n/messageformat_test.js', ['goog.i18n.MessageFormatTest'], ['goog.i18n.MessageFormat', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.pluralRules', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/mime.js', ['goog.i18n.mime', 'goog.i18n.mime.encode'], ['goog.array'], {});
+goog.addDependency('i18n/mime_test.js', ['goog.i18n.mime.encodeTest'], ['goog.i18n.mime.encode', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/numberformat.js', ['goog.i18n.NumberFormat', 'goog.i18n.NumberFormat.CurrencyStyle', 'goog.i18n.NumberFormat.Format'], ['goog.asserts', 'goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.currency', 'goog.math'], {});
+goog.addDependency('i18n/numberformat_test.js', ['goog.i18n.NumberFormatTest'], ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.NumberFormat', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_ro', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('i18n/numberformatsymbols.js', ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_af', 'goog.i18n.NumberFormatSymbols_af_ZA', 'goog.i18n.NumberFormatSymbols_am', 'goog.i18n.NumberFormatSymbols_am_ET', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_ar_001', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_ar_XB', 'goog.i18n.NumberFormatSymbols_az', 'goog.i18n.NumberFormatSymbols_az_Latn', 'goog.i18n.NumberFormatSymbols_az_Latn_AZ', 'goog.i18n.NumberFormatSymbols_be', 'goog.i18n.NumberFormatSymbols_be_BY', 'goog.i18n.NumberFormatSymbols_bg', 'goog.i18n.NumberFormatSymbols_bg_BG', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_bn_BD', 'goog.i18n.NumberFormatSymbols_br', 'goog.i18n.NumberFormatSymbols_br_FR', 'goog.i18n.NumberFormatSymbols_bs', 'goog.i18n.NumberFormatSymbols_bs_Latn', 'goog.i18n.NumberFormatSymbols_bs_Latn_BA', 'goog.i18n.NumberFormatSymbols_ca', 'goog.i18n.NumberFormatSymbols_ca_AD', 'goog.i18n.NumberFormatSymbols_ca_ES', 'goog.i18n.NumberFormatSymbols_ca_ES_VALENCIA', 'goog.i18n.NumberFormatSymbols_ca_FR', 'goog.i18n.NumberFormatSymbols_ca_IT', 'goog.i18n.NumberFormatSymbols_chr', 'goog.i18n.NumberFormatSymbols_chr_US', 'goog.i18n.NumberFormatSymbols_cs', 'goog.i18n.NumberFormatSymbols_cs_CZ', 'goog.i18n.NumberFormatSymbols_cy', 'goog.i18n.NumberFormatSymbols_cy_GB', 'goog.i18n.NumberFormatSymbols_da', 'goog.i18n.NumberFormatSymbols_da_DK', 'goog.i18n.NumberFormatSymbols_da_GL', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_de_AT', 'goog.i18n.NumberFormatSymbols_de_BE', 'goog.i18n.NumberFormatSymbols_de_CH', 'goog.i18n.NumberFormatSymbols_de_DE', 'goog.i18n.NumberFormatSymbols_de_LU', 'goog.i18n.NumberFormatSymbols_el', 'goog.i18n.NumberFormatSymbols_el_CY', 'goog.i18n.NumberFormatSymbols_el_GR', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_001', 'goog.i18n.NumberFormatSymbols_en_AS', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_CA', 'goog.i18n.NumberFormatSymbols_en_DG', 'goog.i18n.NumberFormatSymbols_en_FM', 'goog.i18n.NumberFormatSymbols_en_GB', 'goog.i18n.NumberFormatSymbols_en_GU', 'goog.i18n.NumberFormatSymbols_en_IE', 'goog.i18n.NumberFormatSymbols_en_IN', 'goog.i18n.NumberFormatSymbols_en_IO', 'goog.i18n.NumberFormatSymbols_en_MH', 'goog.i18n.NumberFormatSymbols_en_MP', 'goog.i18n.NumberFormatSymbols_en_PR', 'goog.i18n.NumberFormatSymbols_en_PW', 'goog.i18n.NumberFormatSymbols_en_SG', 'goog.i18n.NumberFormatSymbols_en_TC', 'goog.i18n.NumberFormatSymbols_en_UM', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_en_VG', 'goog.i18n.NumberFormatSymbols_en_VI', 'goog.i18n.NumberFormatSymbols_en_XA', 'goog.i18n.NumberFormatSymbols_en_ZA', 'goog.i18n.NumberFormatSymbols_en_ZW', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_es_419', 'goog.i18n.NumberFormatSymbols_es_EA', 'goog.i18n.NumberFormatSymbols_es_ES', 'goog.i18n.NumberFormatSymbols_es_IC', 'goog.i18n.NumberFormatSymbols_es_MX', 'goog.i18n.NumberFormatSymbols_es_US', 'goog.i18n.NumberFormatSymbols_et', 'goog.i18n.NumberFormatSymbols_et_EE', 'goog.i18n.NumberFormatSymbols_eu', 'goog.i18n.NumberFormatSymbols_eu_ES', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_fa_IR', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fi_FI', 'goog.i18n.NumberFormatSymbols_fil', 'goog.i18n.NumberFormatSymbols_fil_PH', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_fr_BL', 'goog.i18n.NumberFormatSymbols_fr_CA', 'goog.i18n.NumberFormatSymbols_fr_FR', 'goog.i18n.NumberFormatSymbols_fr_GF', 'goog.i18n.NumberFormatSymbols_fr_GP', 'goog.i18n.NumberFormatSymbols_fr_MC', 'goog.i18n.NumberFormatSymbols_fr_MF', 'goog.i18n.NumberFormatSymbols_fr_MQ', 'goog.i18n.NumberFormatSymbols_fr_PM', 'goog.i18n.NumberFormatSymbols_fr_RE', 'goog.i18n.NumberFormatSymbols_fr_YT', 'goog.i18n.NumberFormatSymbols_ga', 'goog.i18n.NumberFormatSymbols_ga_IE', 'goog.i18n.NumberFormatSymbols_gl', 'goog.i18n.NumberFormatSymbols_gl_ES', 'goog.i18n.NumberFormatSymbols_gsw', 'goog.i18n.NumberFormatSymbols_gsw_CH', 'goog.i18n.NumberFormatSymbols_gsw_LI', 'goog.i18n.NumberFormatSymbols_gu', 'goog.i18n.NumberFormatSymbols_gu_IN', 'goog.i18n.NumberFormatSymbols_haw', 'goog.i18n.NumberFormatSymbols_haw_US', 'goog.i18n.NumberFormatSymbols_he', 'goog.i18n.NumberFormatSymbols_he_IL', 'goog.i18n.NumberFormatSymbols_hi', 'goog.i18n.NumberFormatSymbols_hi_IN', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.NumberFormatSymbols_hr_HR', 'goog.i18n.NumberFormatSymbols_hu', 'goog.i18n.NumberFormatSymbols_hu_HU', 'goog.i18n.NumberFormatSymbols_hy', 'goog.i18n.NumberFormatSymbols_hy_AM', 'goog.i18n.NumberFormatSymbols_id', 'goog.i18n.NumberFormatSymbols_id_ID', 'goog.i18n.NumberFormatSymbols_in', 'goog.i18n.NumberFormatSymbols_is', 'goog.i18n.NumberFormatSymbols_is_IS', 'goog.i18n.NumberFormatSymbols_it', 'goog.i18n.NumberFormatSymbols_it_IT', 'goog.i18n.NumberFormatSymbols_it_SM', 'goog.i18n.NumberFormatSymbols_iw', 'goog.i18n.NumberFormatSymbols_ja', 'goog.i18n.NumberFormatSymbols_ja_JP', 'goog.i18n.NumberFormatSymbols_ka', 'goog.i18n.NumberFormatSymbols_ka_GE', 'goog.i18n.NumberFormatSymbols_kk', 'goog.i18n.NumberFormatSymbols_kk_KZ', 'goog.i18n.NumberFormatSymbols_km', 'goog.i18n.NumberFormatSymbols_km_KH', 'goog.i18n.NumberFormatSymbols_kn', 'goog.i18n.NumberFormatSymbols_kn_IN', 'goog.i18n.NumberFormatSymbols_ko', 'goog.i18n.NumberFormatSymbols_ko_KR', 'goog.i18n.NumberFormatSymbols_ky', 'goog.i18n.NumberFormatSymbols_ky_KG', 'goog.i18n.NumberFormatSymbols_ln', 'goog.i18n.NumberFormatSymbols_ln_CD', 'goog.i18n.NumberFormatSymbols_lo', 'goog.i18n.NumberFormatSymbols_lo_LA', 'goog.i18n.NumberFormatSymbols_lt', 'goog.i18n.NumberFormatSymbols_lt_LT', 'goog.i18n.NumberFormatSymbols_lv', 'goog.i18n.NumberFormatSymbols_lv_LV', 'goog.i18n.NumberFormatSymbols_mk', 'goog.i18n.NumberFormatSymbols_mk_MK', 'goog.i18n.NumberFormatSymbols_ml', 'goog.i18n.NumberFormatSymbols_ml_IN', 'goog.i18n.NumberFormatSymbols_mn', 'goog.i18n.NumberFormatSymbols_mn_MN', 'goog.i18n.NumberFormatSymbols_mr', 'goog.i18n.NumberFormatSymbols_mr_IN', 'goog.i18n.NumberFormatSymbols_ms', 'goog.i18n.NumberFormatSymbols_ms_MY', 'goog.i18n.NumberFormatSymbols_mt', 'goog.i18n.NumberFormatSymbols_mt_MT', 'goog.i18n.NumberFormatSymbols_my', 'goog.i18n.NumberFormatSymbols_my_MM', 'goog.i18n.NumberFormatSymbols_nb', 'goog.i18n.NumberFormatSymbols_nb_NO', 'goog.i18n.NumberFormatSymbols_nb_SJ', 'goog.i18n.NumberFormatSymbols_ne', 'goog.i18n.NumberFormatSymbols_ne_NP', 'goog.i18n.NumberFormatSymbols_nl', 'goog.i18n.NumberFormatSymbols_nl_NL', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.NumberFormatSymbols_no_NO', 'goog.i18n.NumberFormatSymbols_or', 'goog.i18n.NumberFormatSymbols_or_IN', 'goog.i18n.NumberFormatSymbols_pa', 'goog.i18n.NumberFormatSymbols_pa_Guru', 'goog.i18n.NumberFormatSymbols_pa_Guru_IN', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_pl_PL', 'goog.i18n.NumberFormatSymbols_pt', 'goog.i18n.NumberFormatSymbols_pt_BR', 'goog.i18n.NumberFormatSymbols_pt_PT', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_ro_RO', 'goog.i18n.NumberFormatSymbols_ru', 'goog.i18n.NumberFormatSymbols_ru_RU', 'goog.i18n.NumberFormatSymbols_si', 'goog.i18n.NumberFormatSymbols_si_LK', 'goog.i18n.NumberFormatSymbols_sk', 'goog.i18n.NumberFormatSymbols_sk_SK', 'goog.i18n.NumberFormatSymbols_sl', 'goog.i18n.NumberFormatSymbols_sl_SI', 'goog.i18n.NumberFormatSymbols_sq', 'goog.i18n.NumberFormatSymbols_sq_AL', 'goog.i18n.NumberFormatSymbols_sr', 'goog.i18n.NumberFormatSymbols_sr_Cyrl', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.NumberFormatSymbols_sr_Latn', 'goog.i18n.NumberFormatSymbols_sr_Latn_RS', 'goog.i18n.NumberFormatSymbols_sv', 'goog.i18n.NumberFormatSymbols_sv_SE', 'goog.i18n.NumberFormatSymbols_sw', 'goog.i18n.NumberFormatSymbols_sw_TZ', 'goog.i18n.NumberFormatSymbols_ta', 'goog.i18n.NumberFormatSymbols_ta_IN', 'goog.i18n.NumberFormatSymbols_te', 'goog.i18n.NumberFormatSymbols_te_IN', 'goog.i18n.NumberFormatSymbols_th', 'goog.i18n.NumberFormatSymbols_th_TH', 'goog.i18n.NumberFormatSymbols_tl', 'goog.i18n.NumberFormatSymbols_tr', 'goog.i18n.NumberFormatSymbols_tr_TR', 'goog.i18n.NumberFormatSymbols_uk', 'goog.i18n.NumberFormatSymbols_uk_UA', 'goog.i18n.NumberFormatSymbols_ur', 'goog.i18n.NumberFormatSymbols_ur_PK', 'goog.i18n.NumberFormatSymbols_uz', 'goog.i18n.NumberFormatSymbols_uz_Latn', 'goog.i18n.NumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.NumberFormatSymbols_vi', 'goog.i18n.NumberFormatSymbols_vi_VN', 'goog.i18n.NumberFormatSymbols_zh', 'goog.i18n.NumberFormatSymbols_zh_CN', 'goog.i18n.NumberFormatSymbols_zh_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans', 'goog.i18n.NumberFormatSymbols_zh_Hans_CN', 'goog.i18n.NumberFormatSymbols_zh_TW', 'goog.i18n.NumberFormatSymbols_zu', 'goog.i18n.NumberFormatSymbols_zu_ZA'], [], {});
+goog.addDependency('i18n/numberformatsymbolsext.js', ['goog.i18n.NumberFormatSymbolsExt', 'goog.i18n.NumberFormatSymbols_af_NA', 'goog.i18n.NumberFormatSymbols_agq', 'goog.i18n.NumberFormatSymbols_agq_CM', 'goog.i18n.NumberFormatSymbols_ak', 'goog.i18n.NumberFormatSymbols_ak_GH', 'goog.i18n.NumberFormatSymbols_ar_AE', 'goog.i18n.NumberFormatSymbols_ar_BH', 'goog.i18n.NumberFormatSymbols_ar_DJ', 'goog.i18n.NumberFormatSymbols_ar_DZ', 'goog.i18n.NumberFormatSymbols_ar_EH', 'goog.i18n.NumberFormatSymbols_ar_ER', 'goog.i18n.NumberFormatSymbols_ar_IL', 'goog.i18n.NumberFormatSymbols_ar_IQ', 'goog.i18n.NumberFormatSymbols_ar_JO', 'goog.i18n.NumberFormatSymbols_ar_KM', 'goog.i18n.NumberFormatSymbols_ar_KW', 'goog.i18n.NumberFormatSymbols_ar_LB', 'goog.i18n.NumberFormatSymbols_ar_LY', 'goog.i18n.NumberFormatSymbols_ar_MA', 'goog.i18n.NumberFormatSymbols_ar_MR', 'goog.i18n.NumberFormatSymbols_ar_OM', 'goog.i18n.NumberFormatSymbols_ar_PS', 'goog.i18n.NumberFormatSymbols_ar_QA', 'goog.i18n.NumberFormatSymbols_ar_SA', 'goog.i18n.NumberFormatSymbols_ar_SD', 'goog.i18n.NumberFormatSymbols_ar_SO', 'goog.i18n.NumberFormatSymbols_ar_SS', 'goog.i18n.NumberFormatSymbols_ar_SY', 'goog.i18n.NumberFormatSymbols_ar_TD', 'goog.i18n.NumberFormatSymbols_ar_TN', 'goog.i18n.NumberFormatSymbols_ar_YE', 'goog.i18n.NumberFormatSymbols_as', 'goog.i18n.NumberFormatSymbols_as_IN', 'goog.i18n.NumberFormatSymbols_asa', 'goog.i18n.NumberFormatSymbols_asa_TZ', 'goog.i18n.NumberFormatSymbols_ast', 'goog.i18n.NumberFormatSymbols_ast_ES', 'goog.i18n.NumberFormatSymbols_az_Cyrl', 'goog.i18n.NumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.NumberFormatSymbols_bas', 'goog.i18n.NumberFormatSymbols_bas_CM', 'goog.i18n.NumberFormatSymbols_bem', 'goog.i18n.NumberFormatSymbols_bem_ZM', 'goog.i18n.NumberFormatSymbols_bez', 'goog.i18n.NumberFormatSymbols_bez_TZ', 'goog.i18n.NumberFormatSymbols_bm', 'goog.i18n.NumberFormatSymbols_bm_ML', 'goog.i18n.NumberFormatSymbols_bn_IN', 'goog.i18n.NumberFormatSymbols_bo', 'goog.i18n.NumberFormatSymbols_bo_CN', 'goog.i18n.NumberFormatSymbols_bo_IN', 'goog.i18n.NumberFormatSymbols_brx', 'goog.i18n.NumberFormatSymbols_brx_IN', 'goog.i18n.NumberFormatSymbols_bs_Cyrl', 'goog.i18n.NumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_ce', 'goog.i18n.NumberFormatSymbols_ce_RU', 'goog.i18n.NumberFormatSymbols_cgg', 'goog.i18n.NumberFormatSymbols_cgg_UG', 'goog.i18n.NumberFormatSymbols_ckb', 'goog.i18n.NumberFormatSymbols_ckb_Arab', 'goog.i18n.NumberFormatSymbols_ckb_Arab_IQ', 'goog.i18n.NumberFormatSymbols_ckb_Arab_IR', 'goog.i18n.NumberFormatSymbols_ckb_IQ', 'goog.i18n.NumberFormatSymbols_ckb_IR', 'goog.i18n.NumberFormatSymbols_ckb_Latn', 'goog.i18n.NumberFormatSymbols_ckb_Latn_IQ', 'goog.i18n.NumberFormatSymbols_cu', 'goog.i18n.NumberFormatSymbols_cu_RU', 'goog.i18n.NumberFormatSymbols_dav', 'goog.i18n.NumberFormatSymbols_dav_KE', 'goog.i18n.NumberFormatSymbols_de_LI', 'goog.i18n.NumberFormatSymbols_dje', 'goog.i18n.NumberFormatSymbols_dje_NE', 'goog.i18n.NumberFormatSymbols_dsb', 'goog.i18n.NumberFormatSymbols_dsb_DE', 'goog.i18n.NumberFormatSymbols_dua', 'goog.i18n.NumberFormatSymbols_dua_CM', 'goog.i18n.NumberFormatSymbols_dyo', 'goog.i18n.NumberFormatSymbols_dyo_SN', 'goog.i18n.NumberFormatSymbols_dz', 'goog.i18n.NumberFormatSymbols_dz_BT', 'goog.i18n.NumberFormatSymbols_ebu', 'goog.i18n.NumberFormatSymbols_ebu_KE', 'goog.i18n.NumberFormatSymbols_ee', 'goog.i18n.NumberFormatSymbols_ee_GH', 'goog.i18n.NumberFormatSymbols_ee_TG', 'goog.i18n.NumberFormatSymbols_en_150', 'goog.i18n.NumberFormatSymbols_en_AG', 'goog.i18n.NumberFormatSymbols_en_AI', 'goog.i18n.NumberFormatSymbols_en_AT', 'goog.i18n.NumberFormatSymbols_en_BB', 'goog.i18n.NumberFormatSymbols_en_BE', 'goog.i18n.NumberFormatSymbols_en_BI', 'goog.i18n.NumberFormatSymbols_en_BM', 'goog.i18n.NumberFormatSymbols_en_BS', 'goog.i18n.NumberFormatSymbols_en_BW', 'goog.i18n.NumberFormatSymbols_en_BZ', 'goog.i18n.NumberFormatSymbols_en_CC', 'goog.i18n.NumberFormatSymbols_en_CH', 'goog.i18n.NumberFormatSymbols_en_CK', 'goog.i18n.NumberFormatSymbols_en_CM', 'goog.i18n.NumberFormatSymbols_en_CX', 'goog.i18n.NumberFormatSymbols_en_CY', 'goog.i18n.NumberFormatSymbols_en_DE', 'goog.i18n.NumberFormatSymbols_en_DK', 'goog.i18n.NumberFormatSymbols_en_DM', 'goog.i18n.NumberFormatSymbols_en_ER', 'goog.i18n.NumberFormatSymbols_en_FI', 'goog.i18n.NumberFormatSymbols_en_FJ', 'goog.i18n.NumberFormatSymbols_en_FK', 'goog.i18n.NumberFormatSymbols_en_GD', 'goog.i18n.NumberFormatSymbols_en_GG', 'goog.i18n.NumberFormatSymbols_en_GH', 'goog.i18n.NumberFormatSymbols_en_GI', 'goog.i18n.NumberFormatSymbols_en_GM', 'goog.i18n.NumberFormatSymbols_en_GY', 'goog.i18n.NumberFormatSymbols_en_HK', 'goog.i18n.NumberFormatSymbols_en_IL', 'goog.i18n.NumberFormatSymbols_en_IM', 'goog.i18n.NumberFormatSymbols_en_JE', 'goog.i18n.NumberFormatSymbols_en_JM', 'goog.i18n.NumberFormatSymbols_en_KE', 'goog.i18n.NumberFormatSymbols_en_KI', 'goog.i18n.NumberFormatSymbols_en_KN', 'goog.i18n.NumberFormatSymbols_en_KY', 'goog.i18n.NumberFormatSymbols_en_LC', 'goog.i18n.NumberFormatSymbols_en_LR', 'goog.i18n.NumberFormatSymbols_en_LS', 'goog.i18n.NumberFormatSymbols_en_MG', 'goog.i18n.NumberFormatSymbols_en_MO', 'goog.i18n.NumberFormatSymbols_en_MS', 'goog.i18n.NumberFormatSymbols_en_MT', 'goog.i18n.NumberFormatSymbols_en_MU', 'goog.i18n.NumberFormatSymbols_en_MW', 'goog.i18n.NumberFormatSymbols_en_MY', 'goog.i18n.NumberFormatSymbols_en_NA', 'goog.i18n.NumberFormatSymbols_en_NF', 'goog.i18n.NumberFormatSymbols_en_NG', 'goog.i18n.NumberFormatSymbols_en_NL', 'goog.i18n.NumberFormatSymbols_en_NR', 'goog.i18n.NumberFormatSymbols_en_NU', 'goog.i18n.NumberFormatSymbols_en_NZ', 'goog.i18n.NumberFormatSymbols_en_PG', 'goog.i18n.NumberFormatSymbols_en_PH', 'goog.i18n.NumberFormatSymbols_en_PK', 'goog.i18n.NumberFormatSymbols_en_PN', 'goog.i18n.NumberFormatSymbols_en_RW', 'goog.i18n.NumberFormatSymbols_en_SB', 'goog.i18n.NumberFormatSymbols_en_SC', 'goog.i18n.NumberFormatSymbols_en_SD', 'goog.i18n.NumberFormatSymbols_en_SE', 'goog.i18n.NumberFormatSymbols_en_SH', 'goog.i18n.NumberFormatSymbols_en_SI', 'goog.i18n.NumberFormatSymbols_en_SL', 'goog.i18n.NumberFormatSymbols_en_SS', 'goog.i18n.NumberFormatSymbols_en_SX', 'goog.i18n.NumberFormatSymbols_en_SZ', 'goog.i18n.NumberFormatSymbols_en_TK', 'goog.i18n.NumberFormatSymbols_en_TO', 'goog.i18n.NumberFormatSymbols_en_TT', 'goog.i18n.NumberFormatSymbols_en_TV', 'goog.i18n.NumberFormatSymbols_en_TZ', 'goog.i18n.NumberFormatSymbols_en_UG', 'goog.i18n.NumberFormatSymbols_en_VC', 'goog.i18n.NumberFormatSymbols_en_VU', 'goog.i18n.NumberFormatSymbols_en_WS', 'goog.i18n.NumberFormatSymbols_en_ZM', 'goog.i18n.NumberFormatSymbols_eo', 'goog.i18n.NumberFormatSymbols_eo_001', 'goog.i18n.NumberFormatSymbols_es_AR', 'goog.i18n.NumberFormatSymbols_es_BO', 'goog.i18n.NumberFormatSymbols_es_BR', 'goog.i18n.NumberFormatSymbols_es_CL', 'goog.i18n.NumberFormatSymbols_es_CO', 'goog.i18n.NumberFormatSymbols_es_CR', 'goog.i18n.NumberFormatSymbols_es_CU', 'goog.i18n.NumberFormatSymbols_es_DO', 'goog.i18n.NumberFormatSymbols_es_EC', 'goog.i18n.NumberFormatSymbols_es_GQ', 'goog.i18n.NumberFormatSymbols_es_GT', 'goog.i18n.NumberFormatSymbols_es_HN', 'goog.i18n.NumberFormatSymbols_es_NI', 'goog.i18n.NumberFormatSymbols_es_PA', 'goog.i18n.NumberFormatSymbols_es_PE', 'goog.i18n.NumberFormatSymbols_es_PH', 'goog.i18n.NumberFormatSymbols_es_PR', 'goog.i18n.NumberFormatSymbols_es_PY', 'goog.i18n.NumberFormatSymbols_es_SV', 'goog.i18n.NumberFormatSymbols_es_UY', 'goog.i18n.NumberFormatSymbols_es_VE', 'goog.i18n.NumberFormatSymbols_ewo', 'goog.i18n.NumberFormatSymbols_ewo_CM', 'goog.i18n.NumberFormatSymbols_fa_AF', 'goog.i18n.NumberFormatSymbols_ff', 'goog.i18n.NumberFormatSymbols_ff_CM', 'goog.i18n.NumberFormatSymbols_ff_GN', 'goog.i18n.NumberFormatSymbols_ff_MR', 'goog.i18n.NumberFormatSymbols_ff_SN', 'goog.i18n.NumberFormatSymbols_fo', 'goog.i18n.NumberFormatSymbols_fo_DK', 'goog.i18n.NumberFormatSymbols_fo_FO', 'goog.i18n.NumberFormatSymbols_fr_BE', 'goog.i18n.NumberFormatSymbols_fr_BF', 'goog.i18n.NumberFormatSymbols_fr_BI', 'goog.i18n.NumberFormatSymbols_fr_BJ', 'goog.i18n.NumberFormatSymbols_fr_CD', 'goog.i18n.NumberFormatSymbols_fr_CF', 'goog.i18n.NumberFormatSymbols_fr_CG', 'goog.i18n.NumberFormatSymbols_fr_CH', 'goog.i18n.NumberFormatSymbols_fr_CI', 'goog.i18n.NumberFormatSymbols_fr_CM', 'goog.i18n.NumberFormatSymbols_fr_DJ', 'goog.i18n.NumberFormatSymbols_fr_DZ', 'goog.i18n.NumberFormatSymbols_fr_GA', 'goog.i18n.NumberFormatSymbols_fr_GN', 'goog.i18n.NumberFormatSymbols_fr_GQ', 'goog.i18n.NumberFormatSymbols_fr_HT', 'goog.i18n.NumberFormatSymbols_fr_KM', 'goog.i18n.NumberFormatSymbols_fr_LU', 'goog.i18n.NumberFormatSymbols_fr_MA', 'goog.i18n.NumberFormatSymbols_fr_MG', 'goog.i18n.NumberFormatSymbols_fr_ML', 'goog.i18n.NumberFormatSymbols_fr_MR', 'goog.i18n.NumberFormatSymbols_fr_MU', 'goog.i18n.NumberFormatSymbols_fr_NC', 'goog.i18n.NumberFormatSymbols_fr_NE', 'goog.i18n.NumberFormatSymbols_fr_PF', 'goog.i18n.NumberFormatSymbols_fr_RW', 'goog.i18n.NumberFormatSymbols_fr_SC', 'goog.i18n.NumberFormatSymbols_fr_SN', 'goog.i18n.NumberFormatSymbols_fr_SY', 'goog.i18n.NumberFormatSymbols_fr_TD', 'goog.i18n.NumberFormatSymbols_fr_TG', 'goog.i18n.NumberFormatSymbols_fr_TN', 'goog.i18n.NumberFormatSymbols_fr_VU', 'goog.i18n.NumberFormatSymbols_fr_WF', 'goog.i18n.NumberFormatSymbols_fur', 'goog.i18n.NumberFormatSymbols_fur_IT', 'goog.i18n.NumberFormatSymbols_fy', 'goog.i18n.NumberFormatSymbols_fy_NL', 'goog.i18n.NumberFormatSymbols_gd', 'goog.i18n.NumberFormatSymbols_gd_GB', 'goog.i18n.NumberFormatSymbols_gsw_FR', 'goog.i18n.NumberFormatSymbols_guz', 'goog.i18n.NumberFormatSymbols_guz_KE', 'goog.i18n.NumberFormatSymbols_gv', 'goog.i18n.NumberFormatSymbols_gv_IM', 'goog.i18n.NumberFormatSymbols_ha', 'goog.i18n.NumberFormatSymbols_ha_GH', 'goog.i18n.NumberFormatSymbols_ha_NE', 'goog.i18n.NumberFormatSymbols_ha_NG', 'goog.i18n.NumberFormatSymbols_hr_BA', 'goog.i18n.NumberFormatSymbols_hsb', 'goog.i18n.NumberFormatSymbols_hsb_DE', 'goog.i18n.NumberFormatSymbols_ig', 'goog.i18n.NumberFormatSymbols_ig_NG', 'goog.i18n.NumberFormatSymbols_ii', 'goog.i18n.NumberFormatSymbols_ii_CN', 'goog.i18n.NumberFormatSymbols_it_CH', 'goog.i18n.NumberFormatSymbols_jgo', 'goog.i18n.NumberFormatSymbols_jgo_CM', 'goog.i18n.NumberFormatSymbols_jmc', 'goog.i18n.NumberFormatSymbols_jmc_TZ', 'goog.i18n.NumberFormatSymbols_kab', 'goog.i18n.NumberFormatSymbols_kab_DZ', 'goog.i18n.NumberFormatSymbols_kam', 'goog.i18n.NumberFormatSymbols_kam_KE', 'goog.i18n.NumberFormatSymbols_kde', 'goog.i18n.NumberFormatSymbols_kde_TZ', 'goog.i18n.NumberFormatSymbols_kea', 'goog.i18n.NumberFormatSymbols_kea_CV', 'goog.i18n.NumberFormatSymbols_khq', 'goog.i18n.NumberFormatSymbols_khq_ML', 'goog.i18n.NumberFormatSymbols_ki', 'goog.i18n.NumberFormatSymbols_ki_KE', 'goog.i18n.NumberFormatSymbols_kkj', 'goog.i18n.NumberFormatSymbols_kkj_CM', 'goog.i18n.NumberFormatSymbols_kl', 'goog.i18n.NumberFormatSymbols_kl_GL', 'goog.i18n.NumberFormatSymbols_kln', 'goog.i18n.NumberFormatSymbols_kln_KE', 'goog.i18n.NumberFormatSymbols_ko_KP', 'goog.i18n.NumberFormatSymbols_kok', 'goog.i18n.NumberFormatSymbols_kok_IN', 'goog.i18n.NumberFormatSymbols_ks', 'goog.i18n.NumberFormatSymbols_ks_IN', 'goog.i18n.NumberFormatSymbols_ksb', 'goog.i18n.NumberFormatSymbols_ksb_TZ', 'goog.i18n.NumberFormatSymbols_ksf', 'goog.i18n.NumberFormatSymbols_ksf_CM', 'goog.i18n.NumberFormatSymbols_ksh', 'goog.i18n.NumberFormatSymbols_ksh_DE', 'goog.i18n.NumberFormatSymbols_kw', 'goog.i18n.NumberFormatSymbols_kw_GB', 'goog.i18n.NumberFormatSymbols_lag', 'goog.i18n.NumberFormatSymbols_lag_TZ', 'goog.i18n.NumberFormatSymbols_lb', 'goog.i18n.NumberFormatSymbols_lb_LU', 'goog.i18n.NumberFormatSymbols_lg', 'goog.i18n.NumberFormatSymbols_lg_UG', 'goog.i18n.NumberFormatSymbols_lkt', 'goog.i18n.NumberFormatSymbols_lkt_US', 'goog.i18n.NumberFormatSymbols_ln_AO', 'goog.i18n.NumberFormatSymbols_ln_CF', 'goog.i18n.NumberFormatSymbols_ln_CG', 'goog.i18n.NumberFormatSymbols_lrc', 'goog.i18n.NumberFormatSymbols_lrc_IQ', 'goog.i18n.NumberFormatSymbols_lrc_IR', 'goog.i18n.NumberFormatSymbols_lu', 'goog.i18n.NumberFormatSymbols_lu_CD', 'goog.i18n.NumberFormatSymbols_luo', 'goog.i18n.NumberFormatSymbols_luo_KE', 'goog.i18n.NumberFormatSymbols_luy', 'goog.i18n.NumberFormatSymbols_luy_KE', 'goog.i18n.NumberFormatSymbols_mas', 'goog.i18n.NumberFormatSymbols_mas_KE', 'goog.i18n.NumberFormatSymbols_mas_TZ', 'goog.i18n.NumberFormatSymbols_mer', 'goog.i18n.NumberFormatSymbols_mer_KE', 'goog.i18n.NumberFormatSymbols_mfe', 'goog.i18n.NumberFormatSymbols_mfe_MU', 'goog.i18n.NumberFormatSymbols_mg', 'goog.i18n.NumberFormatSymbols_mg_MG', 'goog.i18n.NumberFormatSymbols_mgh', 'goog.i18n.NumberFormatSymbols_mgh_MZ', 'goog.i18n.NumberFormatSymbols_mgo', 'goog.i18n.NumberFormatSymbols_mgo_CM', 'goog.i18n.NumberFormatSymbols_ms_BN', 'goog.i18n.NumberFormatSymbols_ms_SG', 'goog.i18n.NumberFormatSymbols_mua', 'goog.i18n.NumberFormatSymbols_mua_CM', 'goog.i18n.NumberFormatSymbols_mzn', 'goog.i18n.NumberFormatSymbols_mzn_IR', 'goog.i18n.NumberFormatSymbols_naq', 'goog.i18n.NumberFormatSymbols_naq_NA', 'goog.i18n.NumberFormatSymbols_nd', 'goog.i18n.NumberFormatSymbols_nd_ZW', 'goog.i18n.NumberFormatSymbols_ne_IN', 'goog.i18n.NumberFormatSymbols_nl_AW', 'goog.i18n.NumberFormatSymbols_nl_BE', 'goog.i18n.NumberFormatSymbols_nl_BQ', 'goog.i18n.NumberFormatSymbols_nl_CW', 'goog.i18n.NumberFormatSymbols_nl_SR', 'goog.i18n.NumberFormatSymbols_nl_SX', 'goog.i18n.NumberFormatSymbols_nmg', 'goog.i18n.NumberFormatSymbols_nmg_CM', 'goog.i18n.NumberFormatSymbols_nn', 'goog.i18n.NumberFormatSymbols_nn_NO', 'goog.i18n.NumberFormatSymbols_nnh', 'goog.i18n.NumberFormatSymbols_nnh_CM', 'goog.i18n.NumberFormatSymbols_nus', 'goog.i18n.NumberFormatSymbols_nus_SS', 'goog.i18n.NumberFormatSymbols_nyn', 'goog.i18n.NumberFormatSymbols_nyn_UG', 'goog.i18n.NumberFormatSymbols_om', 'goog.i18n.NumberFormatSymbols_om_ET', 'goog.i18n.NumberFormatSymbols_om_KE', 'goog.i18n.NumberFormatSymbols_os', 'goog.i18n.NumberFormatSymbols_os_GE', 'goog.i18n.NumberFormatSymbols_os_RU', 'goog.i18n.NumberFormatSymbols_pa_Arab', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK', 'goog.i18n.NumberFormatSymbols_prg', 'goog.i18n.NumberFormatSymbols_prg_001', 'goog.i18n.NumberFormatSymbols_ps', 'goog.i18n.NumberFormatSymbols_ps_AF', 'goog.i18n.NumberFormatSymbols_pt_AO', 'goog.i18n.NumberFormatSymbols_pt_CH', 'goog.i18n.NumberFormatSymbols_pt_CV', 'goog.i18n.NumberFormatSymbols_pt_GQ', 'goog.i18n.NumberFormatSymbols_pt_GW', 'goog.i18n.NumberFormatSymbols_pt_LU', 'goog.i18n.NumberFormatSymbols_pt_MO', 'goog.i18n.NumberFormatSymbols_pt_MZ', 'goog.i18n.NumberFormatSymbols_pt_ST', 'goog.i18n.NumberFormatSymbols_pt_TL', 'goog.i18n.NumberFormatSymbols_qu', 'goog.i18n.NumberFormatSymbols_qu_BO', 'goog.i18n.NumberFormatSymbols_qu_EC', 'goog.i18n.NumberFormatSymbols_qu_PE', 'goog.i18n.NumberFormatSymbols_rm', 'goog.i18n.NumberFormatSymbols_rm_CH', 'goog.i18n.NumberFormatSymbols_rn', 'goog.i18n.NumberFormatSymbols_rn_BI', 'goog.i18n.NumberFormatSymbols_ro_MD', 'goog.i18n.NumberFormatSymbols_rof', 'goog.i18n.NumberFormatSymbols_rof_TZ', 'goog.i18n.NumberFormatSymbols_ru_BY', 'goog.i18n.NumberFormatSymbols_ru_KG', 'goog.i18n.NumberFormatSymbols_ru_KZ', 'goog.i18n.NumberFormatSymbols_ru_MD', 'goog.i18n.NumberFormatSymbols_ru_UA', 'goog.i18n.NumberFormatSymbols_rw', 'goog.i18n.NumberFormatSymbols_rw_RW', 'goog.i18n.NumberFormatSymbols_rwk', 'goog.i18n.NumberFormatSymbols_rwk_TZ', 'goog.i18n.NumberFormatSymbols_sah', 'goog.i18n.NumberFormatSymbols_sah_RU', 'goog.i18n.NumberFormatSymbols_saq', 'goog.i18n.NumberFormatSymbols_saq_KE', 'goog.i18n.NumberFormatSymbols_sbp', 'goog.i18n.NumberFormatSymbols_sbp_TZ', 'goog.i18n.NumberFormatSymbols_se', 'goog.i18n.NumberFormatSymbols_se_FI', 'goog.i18n.NumberFormatSymbols_se_NO', 'goog.i18n.NumberFormatSymbols_se_SE', 'goog.i18n.NumberFormatSymbols_seh', 'goog.i18n.NumberFormatSymbols_seh_MZ', 'goog.i18n.NumberFormatSymbols_ses', 'goog.i18n.NumberFormatSymbols_ses_ML', 'goog.i18n.NumberFormatSymbols_sg', 'goog.i18n.NumberFormatSymbols_sg_CF', 'goog.i18n.NumberFormatSymbols_shi', 'goog.i18n.NumberFormatSymbols_shi_Latn', 'goog.i18n.NumberFormatSymbols_shi_Latn_MA', 'goog.i18n.NumberFormatSymbols_shi_Tfng', 'goog.i18n.NumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.NumberFormatSymbols_smn', 'goog.i18n.NumberFormatSymbols_smn_FI', 'goog.i18n.NumberFormatSymbols_sn', 'goog.i18n.NumberFormatSymbols_sn_ZW', 'goog.i18n.NumberFormatSymbols_so', 'goog.i18n.NumberFormatSymbols_so_DJ', 'goog.i18n.NumberFormatSymbols_so_ET', 'goog.i18n.NumberFormatSymbols_so_KE', 'goog.i18n.NumberFormatSymbols_so_SO', 'goog.i18n.NumberFormatSymbols_sq_MK', 'goog.i18n.NumberFormatSymbols_sq_XK', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.NumberFormatSymbols_sr_Latn_BA', 'goog.i18n.NumberFormatSymbols_sr_Latn_ME', 'goog.i18n.NumberFormatSymbols_sr_Latn_XK', 'goog.i18n.NumberFormatSymbols_sv_AX', 'goog.i18n.NumberFormatSymbols_sv_FI', 'goog.i18n.NumberFormatSymbols_sw_CD', 'goog.i18n.NumberFormatSymbols_sw_KE', 'goog.i18n.NumberFormatSymbols_sw_UG', 'goog.i18n.NumberFormatSymbols_ta_LK', 'goog.i18n.NumberFormatSymbols_ta_MY', 'goog.i18n.NumberFormatSymbols_ta_SG', 'goog.i18n.NumberFormatSymbols_teo', 'goog.i18n.NumberFormatSymbols_teo_KE', 'goog.i18n.NumberFormatSymbols_teo_UG', 'goog.i18n.NumberFormatSymbols_ti', 'goog.i18n.NumberFormatSymbols_ti_ER', 'goog.i18n.NumberFormatSymbols_ti_ET', 'goog.i18n.NumberFormatSymbols_tk', 'goog.i18n.NumberFormatSymbols_tk_TM', 'goog.i18n.NumberFormatSymbols_to', 'goog.i18n.NumberFormatSymbols_to_TO', 'goog.i18n.NumberFormatSymbols_tr_CY', 'goog.i18n.NumberFormatSymbols_twq', 'goog.i18n.NumberFormatSymbols_twq_NE', 'goog.i18n.NumberFormatSymbols_tzm', 'goog.i18n.NumberFormatSymbols_tzm_MA', 'goog.i18n.NumberFormatSymbols_ug', 'goog.i18n.NumberFormatSymbols_ug_CN', 'goog.i18n.NumberFormatSymbols_ur_IN', 'goog.i18n.NumberFormatSymbols_uz_Arab', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF', 'goog.i18n.NumberFormatSymbols_uz_Cyrl', 'goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.NumberFormatSymbols_vai', 'goog.i18n.NumberFormatSymbols_vai_Latn', 'goog.i18n.NumberFormatSymbols_vai_Latn_LR', 'goog.i18n.NumberFormatSymbols_vai_Vaii', 'goog.i18n.NumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.NumberFormatSymbols_vo', 'goog.i18n.NumberFormatSymbols_vo_001', 'goog.i18n.NumberFormatSymbols_vun', 'goog.i18n.NumberFormatSymbols_vun_TZ', 'goog.i18n.NumberFormatSymbols_wae', 'goog.i18n.NumberFormatSymbols_wae_CH', 'goog.i18n.NumberFormatSymbols_xog', 'goog.i18n.NumberFormatSymbols_xog_UG', 'goog.i18n.NumberFormatSymbols_yav', 'goog.i18n.NumberFormatSymbols_yav_CM', 'goog.i18n.NumberFormatSymbols_yi', 'goog.i18n.NumberFormatSymbols_yi_001', 'goog.i18n.NumberFormatSymbols_yo', 'goog.i18n.NumberFormatSymbols_yo_BJ', 'goog.i18n.NumberFormatSymbols_yo_NG', 'goog.i18n.NumberFormatSymbols_yue', 'goog.i18n.NumberFormatSymbols_yue_HK', 'goog.i18n.NumberFormatSymbols_zgh', 'goog.i18n.NumberFormatSymbols_zgh_MA', 'goog.i18n.NumberFormatSymbols_zh_Hans_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_MO', 'goog.i18n.NumberFormatSymbols_zh_Hans_SG', 'goog.i18n.NumberFormatSymbols_zh_Hant', 'goog.i18n.NumberFormatSymbols_zh_Hant_HK', 'goog.i18n.NumberFormatSymbols_zh_Hant_MO', 'goog.i18n.NumberFormatSymbols_zh_Hant_TW'], ['goog.i18n.NumberFormatSymbols'], {});
+goog.addDependency('i18n/ordinalrules.js', ['goog.i18n.ordinalRules'], [], {});
+goog.addDependency('i18n/pluralrules.js', ['goog.i18n.pluralRules'], [], {});
+goog.addDependency('i18n/pluralrules_test.js', ['goog.i18n.pluralRulesTest'], ['goog.i18n.pluralRules', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/timezone.js', ['goog.i18n.TimeZone'], ['goog.array', 'goog.date.DateLike', 'goog.object', 'goog.string'], {});
+goog.addDependency('i18n/timezone_test.js', ['goog.i18n.TimeZoneTest'], ['goog.i18n.TimeZone', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/uchar.js', ['goog.i18n.uChar'], [], {});
+goog.addDependency('i18n/uchar/localnamefetcher.js', ['goog.i18n.uChar.LocalNameFetcher'], ['goog.i18n.uChar.NameFetcher', 'goog.i18n.uCharNames', 'goog.log'], {});
+goog.addDependency('i18n/uchar/localnamefetcher_test.js', ['goog.i18n.uChar.LocalNameFetcherTest'], ['goog.i18n.uChar.LocalNameFetcher', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('i18n/uchar/namefetcher.js', ['goog.i18n.uChar.NameFetcher'], [], {});
+goog.addDependency('i18n/uchar/remotenamefetcher.js', ['goog.i18n.uChar.RemoteNameFetcher'], ['goog.Disposable', 'goog.Uri', 'goog.events', 'goog.i18n.uChar', 'goog.i18n.uChar.NameFetcher', 'goog.log', 'goog.net.XhrIo', 'goog.structs.Map'], {});
+goog.addDependency('i18n/uchar/remotenamefetcher_test.js', ['goog.i18n.uChar.RemoteNameFetcherTest'], ['goog.i18n.uChar.RemoteNameFetcher', 'goog.net.XhrIo', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction'], {});
+goog.addDependency('i18n/uchar_test.js', ['goog.i18n.uCharTest'], ['goog.i18n.uChar', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/ucharnames.js', ['goog.i18n.uCharNames'], ['goog.i18n.uChar'], {});
+goog.addDependency('i18n/ucharnames_test.js', ['goog.i18n.uCharNamesTest'], ['goog.i18n.uCharNames', 'goog.testing.jsunit'], {});
+goog.addDependency('iter/iter.js', ['goog.iter', 'goog.iter.Iterable', 'goog.iter.Iterator', 'goog.iter.StopIteration'], ['goog.array', 'goog.asserts', 'goog.functions', 'goog.math'], {});
+goog.addDependency('iter/iter_test.js', ['goog.iterTest'], ['goog.iter', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.testing.jsunit'], {});
+goog.addDependency('json/evaljsonprocessor.js', ['goog.json.EvalJsonProcessor'], ['goog.json', 'goog.json.Processor', 'goog.json.Serializer'], {});
+goog.addDependency('json/hybrid.js', ['goog.json.hybrid'], ['goog.asserts', 'goog.json'], {});
+goog.addDependency('json/hybrid_test.js', ['goog.json.hybridTest'], ['goog.json', 'goog.json.hybrid', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('json/hybridjsonprocessor.js', ['goog.json.HybridJsonProcessor'], ['goog.json.Processor', 'goog.json.hybrid'], {});
+goog.addDependency('json/hybridjsonprocessor_test.js', ['goog.json.HybridJsonProcessorTest'], ['goog.json.HybridJsonProcessor', 'goog.json.hybrid', 'goog.testing.jsunit'], {});
+goog.addDependency('json/json.js', ['goog.json', 'goog.json.Replacer', 'goog.json.Reviver', 'goog.json.Serializer'], [], {});
+goog.addDependency('json/json_perf.js', ['goog.jsonPerf'], ['goog.dom', 'goog.json', 'goog.math', 'goog.string', 'goog.testing.PerformanceTable', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('json/json_test.js', ['goog.jsonTest'], ['goog.functions', 'goog.json', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('json/nativejsonprocessor.js', ['goog.json.NativeJsonProcessor'], ['goog.asserts', 'goog.json.Processor'], {});
+goog.addDependency('json/processor.js', ['goog.json.Processor'], ['goog.string.Parser', 'goog.string.Stringifier'], {});
+goog.addDependency('json/processor_test.js', ['goog.json.processorTest'], ['goog.json.EvalJsonProcessor', 'goog.json.NativeJsonProcessor', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('labs/dom/pagevisibilitymonitor.js', ['goog.labs.dom.PageVisibilityEvent', 'goog.labs.dom.PageVisibilityMonitor', 'goog.labs.dom.PageVisibilityState'], ['goog.dom', 'goog.dom.vendor', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.memoize'], {});
+goog.addDependency('labs/dom/pagevisibilitymonitor_test.js', ['goog.labs.dom.PageVisibilityMonitorTest'], ['goog.events', 'goog.functions', 'goog.labs.dom.PageVisibilityMonitor', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('labs/events/nondisposableeventtarget.js', ['goog.labs.events.NonDisposableEventTarget'], ['goog.array', 'goog.asserts', 'goog.events.Event', 'goog.events.Listenable', 'goog.events.ListenerMap', 'goog.object'], {});
+goog.addDependency('labs/events/nondisposableeventtarget_test.js', ['goog.labs.events.NonDisposableEventTargetTest'], ['goog.events.Listenable', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.labs.events.NonDisposableEventTarget', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/events/nondisposableeventtarget_via_googevents_test.js', ['goog.labs.events.NonDisposableEventTargetGoogEventsTest'], ['goog.events', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.labs.events.NonDisposableEventTarget', 'goog.testing', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/events/touch.js', ['goog.labs.events.touch', 'goog.labs.events.touch.TouchData'], ['goog.array', 'goog.asserts', 'goog.events.EventType', 'goog.string'], {});
+goog.addDependency('labs/events/touch_test.js', ['goog.labs.events.touchTest'], ['goog.labs.events.touch', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/format/csv.js', ['goog.labs.format.csv', 'goog.labs.format.csv.ParseError', 'goog.labs.format.csv.Token'], ['goog.array', 'goog.asserts', 'goog.debug.Error', 'goog.object', 'goog.string', 'goog.string.newlines'], {});
+goog.addDependency('labs/format/csv_test.js', ['goog.labs.format.csvTest'], ['goog.labs.format.csv', 'goog.labs.format.csv.ParseError', 'goog.object', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/html/attribute_rewriter.js', ['goog.labs.html.AttributeRewriter', 'goog.labs.html.AttributeValue', 'goog.labs.html.attributeRewriterPresubmitWorkaround'], [], {});
+goog.addDependency('labs/html/sanitizer.js', ['goog.labs.html.Sanitizer'], ['goog.asserts', 'goog.html.SafeUrl', 'goog.labs.html.attributeRewriterPresubmitWorkaround', 'goog.labs.html.scrubber', 'goog.object', 'goog.string'], {});
+goog.addDependency('labs/html/sanitizer_test.js', ['goog.labs.html.SanitizerTest'], ['goog.html.SafeUrl', 'goog.labs.html.Sanitizer', 'goog.string', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/html/scrubber.js', ['goog.labs.html.scrubber'], ['goog.array', 'goog.dom.tags', 'goog.labs.html.attributeRewriterPresubmitWorkaround', 'goog.string'], {});
+goog.addDependency('labs/html/scrubber_test.js', ['goog.html.ScrubberTest'], ['goog.labs.html.scrubber', 'goog.object', 'goog.string', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/i18n/listformat.js', ['goog.labs.i18n.GenderInfo', 'goog.labs.i18n.GenderInfo.Gender', 'goog.labs.i18n.ListFormat'], ['goog.asserts', 'goog.labs.i18n.ListFormatSymbols'], {});
+goog.addDependency('labs/i18n/listformat_test.js', ['goog.labs.i18n.ListFormatTest'], ['goog.labs.i18n.GenderInfo', 'goog.labs.i18n.ListFormat', 'goog.labs.i18n.ListFormatSymbols', 'goog.labs.i18n.ListFormatSymbols_el', 'goog.labs.i18n.ListFormatSymbols_en', 'goog.labs.i18n.ListFormatSymbols_fr', 'goog.labs.i18n.ListFormatSymbols_ml', 'goog.labs.i18n.ListFormatSymbols_zu', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/i18n/listsymbols.js', ['goog.labs.i18n.ListFormatSymbols', 'goog.labs.i18n.ListFormatSymbols_af', 'goog.labs.i18n.ListFormatSymbols_am', 'goog.labs.i18n.ListFormatSymbols_ar', 'goog.labs.i18n.ListFormatSymbols_az', 'goog.labs.i18n.ListFormatSymbols_be', 'goog.labs.i18n.ListFormatSymbols_bg', 'goog.labs.i18n.ListFormatSymbols_bn', 'goog.labs.i18n.ListFormatSymbols_br', 'goog.labs.i18n.ListFormatSymbols_bs', 'goog.labs.i18n.ListFormatSymbols_ca', 'goog.labs.i18n.ListFormatSymbols_chr', 'goog.labs.i18n.ListFormatSymbols_cs', 'goog.labs.i18n.ListFormatSymbols_cy', 'goog.labs.i18n.ListFormatSymbols_da', 'goog.labs.i18n.ListFormatSymbols_de', 'goog.labs.i18n.ListFormatSymbols_de_AT', 'goog.labs.i18n.ListFormatSymbols_de_CH', 'goog.labs.i18n.ListFormatSymbols_el', 'goog.labs.i18n.ListFormatSymbols_en', 'goog.labs.i18n.ListFormatSymbols_en_AU', 'goog.labs.i18n.ListFormatSymbols_en_CA', 'goog.labs.i18n.ListFormatSymbols_en_GB', 'goog.labs.i18n.ListFormatSymbols_en_IE', 'goog.labs.i18n.ListFormatSymbols_en_IN', 'goog.labs.i18n.ListFormatSymbols_en_SG', 'goog.labs.i18n.ListFormatSymbols_en_US', 'goog.labs.i18n.ListFormatSymbols_en_ZA', 'goog.labs.i18n.ListFormatSymbols_es', 'goog.labs.i18n.ListFormatSymbols_es_419', 'goog.labs.i18n.ListFormatSymbols_es_ES', 'goog.labs.i18n.ListFormatSymbols_es_MX', 'goog.labs.i18n.ListFormatSymbols_es_US', 'goog.labs.i18n.ListFormatSymbols_et', 'goog.labs.i18n.ListFormatSymbols_eu', 'goog.labs.i18n.ListFormatSymbols_fa', 'goog.labs.i18n.ListFormatSymbols_fi', 'goog.labs.i18n.ListFormatSymbols_fil', 'goog.labs.i18n.ListFormatSymbols_fr', 'goog.labs.i18n.ListFormatSymbols_fr_CA', 'goog.labs.i18n.ListFormatSymbols_ga', 'goog.labs.i18n.ListFormatSymbols_gl', 'goog.labs.i18n.ListFormatSymbols_gsw', 'goog.labs.i18n.ListFormatSymbols_gu', 'goog.labs.i18n.ListFormatSymbols_haw', 'goog.labs.i18n.ListFormatSymbols_he', 'goog.labs.i18n.ListFormatSymbols_hi', 'goog.labs.i18n.ListFormatSymbols_hr', 'goog.labs.i18n.ListFormatSymbols_hu', 'goog.labs.i18n.ListFormatSymbols_hy', 'goog.labs.i18n.ListFormatSymbols_id', 'goog.labs.i18n.ListFormatSymbols_in', 'goog.labs.i18n.ListFormatSymbols_is', 'goog.labs.i18n.ListFormatSymbols_it', 'goog.labs.i18n.ListFormatSymbols_iw', 'goog.labs.i18n.ListFormatSymbols_ja', 'goog.labs.i18n.ListFormatSymbols_ka', 'goog.labs.i18n.ListFormatSymbols_kk', 'goog.labs.i18n.ListFormatSymbols_km', 'goog.labs.i18n.ListFormatSymbols_kn', 'goog.labs.i18n.ListFormatSymbols_ko', 'goog.labs.i18n.ListFormatSymbols_ky', 'goog.labs.i18n.ListFormatSymbols_ln', 'goog.labs.i18n.ListFormatSymbols_lo', 'goog.labs.i18n.ListFormatSymbols_lt', 'goog.labs.i18n.ListFormatSymbols_lv', 'goog.labs.i18n.ListFormatSymbols_mk', 'goog.labs.i18n.ListFormatSymbols_ml', 'goog.labs.i18n.ListFormatSymbols_mn', 'goog.labs.i18n.ListFormatSymbols_mo', 'goog.labs.i18n.ListFormatSymbols_mr', 'goog.labs.i18n.ListFormatSymbols_ms', 'goog.labs.i18n.ListFormatSymbols_mt', 'goog.labs.i18n.ListFormatSymbols_my', 'goog.labs.i18n.ListFormatSymbols_nb', 'goog.labs.i18n.ListFormatSymbols_ne', 'goog.labs.i18n.ListFormatSymbols_nl', 'goog.labs.i18n.ListFormatSymbols_no', 'goog.labs.i18n.ListFormatSymbols_no_NO', 'goog.labs.i18n.ListFormatSymbols_or', 'goog.labs.i18n.ListFormatSymbols_pa', 'goog.labs.i18n.ListFormatSymbols_pl', 'goog.labs.i18n.ListFormatSymbols_pt', 'goog.labs.i18n.ListFormatSymbols_pt_BR', 'goog.labs.i18n.ListFormatSymbols_pt_PT', 'goog.labs.i18n.ListFormatSymbols_ro', 'goog.labs.i18n.ListFormatSymbols_ru', 'goog.labs.i18n.ListFormatSymbols_sh', 'goog.labs.i18n.ListFormatSymbols_si', 'goog.labs.i18n.ListFormatSymbols_sk', 'goog.labs.i18n.ListFormatSymbols_sl', 'goog.labs.i18n.ListFormatSymbols_sq', 'goog.labs.i18n.ListFormatSymbols_sr', 'goog.labs.i18n.ListFormatSymbols_sr_Latn', 'goog.labs.i18n.ListFormatSymbols_sv', 'goog.labs.i18n.ListFormatSymbols_sw', 'goog.labs.i18n.ListFormatSymbols_ta', 'goog.labs.i18n.ListFormatSymbols_te', 'goog.labs.i18n.ListFormatSymbols_th', 'goog.labs.i18n.ListFormatSymbols_tl', 'goog.labs.i18n.ListFormatSymbols_tr', 'goog.labs.i18n.ListFormatSymbols_uk', 'goog.labs.i18n.ListFormatSymbols_ur', 'goog.labs.i18n.ListFormatSymbols_uz', 'goog.labs.i18n.ListFormatSymbols_vi', 'goog.labs.i18n.ListFormatSymbols_zh', 'goog.labs.i18n.ListFormatSymbols_zh_CN', 'goog.labs.i18n.ListFormatSymbols_zh_HK', 'goog.labs.i18n.ListFormatSymbols_zh_TW', 'goog.labs.i18n.ListFormatSymbols_zu'], [], {});
+goog.addDependency('labs/i18n/listsymbolsext.js', ['goog.labs.i18n.ListFormatSymbolsExt', 'goog.labs.i18n.ListFormatSymbols_af_NA', 'goog.labs.i18n.ListFormatSymbols_af_ZA', 'goog.labs.i18n.ListFormatSymbols_agq', 'goog.labs.i18n.ListFormatSymbols_agq_CM', 'goog.labs.i18n.ListFormatSymbols_ak', 'goog.labs.i18n.ListFormatSymbols_ak_GH', 'goog.labs.i18n.ListFormatSymbols_am_ET', 'goog.labs.i18n.ListFormatSymbols_ar_001', 'goog.labs.i18n.ListFormatSymbols_ar_AE', 'goog.labs.i18n.ListFormatSymbols_ar_BH', 'goog.labs.i18n.ListFormatSymbols_ar_DJ', 'goog.labs.i18n.ListFormatSymbols_ar_DZ', 'goog.labs.i18n.ListFormatSymbols_ar_EG', 'goog.labs.i18n.ListFormatSymbols_ar_EH', 'goog.labs.i18n.ListFormatSymbols_ar_ER', 'goog.labs.i18n.ListFormatSymbols_ar_IL', 'goog.labs.i18n.ListFormatSymbols_ar_IQ', 'goog.labs.i18n.ListFormatSymbols_ar_JO', 'goog.labs.i18n.ListFormatSymbols_ar_KM', 'goog.labs.i18n.ListFormatSymbols_ar_KW', 'goog.labs.i18n.ListFormatSymbols_ar_LB', 'goog.labs.i18n.ListFormatSymbols_ar_LY', 'goog.labs.i18n.ListFormatSymbols_ar_MA', 'goog.labs.i18n.ListFormatSymbols_ar_MR', 'goog.labs.i18n.ListFormatSymbols_ar_OM', 'goog.labs.i18n.ListFormatSymbols_ar_PS', 'goog.labs.i18n.ListFormatSymbols_ar_QA', 'goog.labs.i18n.ListFormatSymbols_ar_SA', 'goog.labs.i18n.ListFormatSymbols_ar_SD', 'goog.labs.i18n.ListFormatSymbols_ar_SO', 'goog.labs.i18n.ListFormatSymbols_ar_SS', 'goog.labs.i18n.ListFormatSymbols_ar_SY', 'goog.labs.i18n.ListFormatSymbols_ar_TD', 'goog.labs.i18n.ListFormatSymbols_ar_TN', 'goog.labs.i18n.ListFormatSymbols_ar_XB', 'goog.labs.i18n.ListFormatSymbols_ar_YE', 'goog.labs.i18n.ListFormatSymbols_as', 'goog.labs.i18n.ListFormatSymbols_as_IN', 'goog.labs.i18n.ListFormatSymbols_asa', 'goog.labs.i18n.ListFormatSymbols_asa_TZ', 'goog.labs.i18n.ListFormatSymbols_ast', 'goog.labs.i18n.ListFormatSymbols_ast_ES', 'goog.labs.i18n.ListFormatSymbols_az_Cyrl', 'goog.labs.i18n.ListFormatSymbols_az_Cyrl_AZ', 'goog.labs.i18n.ListFormatSymbols_az_Latn', 'goog.labs.i18n.ListFormatSymbols_az_Latn_AZ', 'goog.labs.i18n.ListFormatSymbols_bas', 'goog.labs.i18n.ListFormatSymbols_bas_CM', 'goog.labs.i18n.ListFormatSymbols_be_BY', 'goog.labs.i18n.ListFormatSymbols_bem', 'goog.labs.i18n.ListFormatSymbols_bem_ZM', 'goog.labs.i18n.ListFormatSymbols_bez', 'goog.labs.i18n.ListFormatSymbols_bez_TZ', 'goog.labs.i18n.ListFormatSymbols_bg_BG', 'goog.labs.i18n.ListFormatSymbols_bm', 'goog.labs.i18n.ListFormatSymbols_bm_ML', 'goog.labs.i18n.ListFormatSymbols_bn_BD', 'goog.labs.i18n.ListFormatSymbols_bn_IN', 'goog.labs.i18n.ListFormatSymbols_bo', 'goog.labs.i18n.ListFormatSymbols_bo_CN', 'goog.labs.i18n.ListFormatSymbols_bo_IN', 'goog.labs.i18n.ListFormatSymbols_br_FR', 'goog.labs.i18n.ListFormatSymbols_brx', 'goog.labs.i18n.ListFormatSymbols_brx_IN', 'goog.labs.i18n.ListFormatSymbols_bs_Cyrl', 'goog.labs.i18n.ListFormatSymbols_bs_Cyrl_BA', 'goog.labs.i18n.ListFormatSymbols_bs_Latn', 'goog.labs.i18n.ListFormatSymbols_bs_Latn_BA', 'goog.labs.i18n.ListFormatSymbols_ca_AD', 'goog.labs.i18n.ListFormatSymbols_ca_ES', 'goog.labs.i18n.ListFormatSymbols_ca_FR', 'goog.labs.i18n.ListFormatSymbols_ca_IT', 'goog.labs.i18n.ListFormatSymbols_ce', 'goog.labs.i18n.ListFormatSymbols_ce_RU', 'goog.labs.i18n.ListFormatSymbols_cgg', 'goog.labs.i18n.ListFormatSymbols_cgg_UG', 'goog.labs.i18n.ListFormatSymbols_chr_US', 'goog.labs.i18n.ListFormatSymbols_cs_CZ', 'goog.labs.i18n.ListFormatSymbols_cy_GB', 'goog.labs.i18n.ListFormatSymbols_da_DK', 'goog.labs.i18n.ListFormatSymbols_da_GL', 'goog.labs.i18n.ListFormatSymbols_dav', 'goog.labs.i18n.ListFormatSymbols_dav_KE', 'goog.labs.i18n.ListFormatSymbols_de_BE', 'goog.labs.i18n.ListFormatSymbols_de_DE', 'goog.labs.i18n.ListFormatSymbols_de_LI', 'goog.labs.i18n.ListFormatSymbols_de_LU', 'goog.labs.i18n.ListFormatSymbols_dje', 'goog.labs.i18n.ListFormatSymbols_dje_NE', 'goog.labs.i18n.ListFormatSymbols_dsb', 'goog.labs.i18n.ListFormatSymbols_dsb_DE', 'goog.labs.i18n.ListFormatSymbols_dua', 'goog.labs.i18n.ListFormatSymbols_dua_CM', 'goog.labs.i18n.ListFormatSymbols_dyo', 'goog.labs.i18n.ListFormatSymbols_dyo_SN', 'goog.labs.i18n.ListFormatSymbols_dz', 'goog.labs.i18n.ListFormatSymbols_dz_BT', 'goog.labs.i18n.ListFormatSymbols_ebu', 'goog.labs.i18n.ListFormatSymbols_ebu_KE', 'goog.labs.i18n.ListFormatSymbols_ee', 'goog.labs.i18n.ListFormatSymbols_ee_GH', 'goog.labs.i18n.ListFormatSymbols_ee_TG', 'goog.labs.i18n.ListFormatSymbols_el_CY', 'goog.labs.i18n.ListFormatSymbols_el_GR', 'goog.labs.i18n.ListFormatSymbols_en_001', 'goog.labs.i18n.ListFormatSymbols_en_150', 'goog.labs.i18n.ListFormatSymbols_en_AG', 'goog.labs.i18n.ListFormatSymbols_en_AI', 'goog.labs.i18n.ListFormatSymbols_en_AS', 'goog.labs.i18n.ListFormatSymbols_en_AT', 'goog.labs.i18n.ListFormatSymbols_en_BB', 'goog.labs.i18n.ListFormatSymbols_en_BE', 'goog.labs.i18n.ListFormatSymbols_en_BI', 'goog.labs.i18n.ListFormatSymbols_en_BM', 'goog.labs.i18n.ListFormatSymbols_en_BS', 'goog.labs.i18n.ListFormatSymbols_en_BW', 'goog.labs.i18n.ListFormatSymbols_en_BZ', 'goog.labs.i18n.ListFormatSymbols_en_CC', 'goog.labs.i18n.ListFormatSymbols_en_CH', 'goog.labs.i18n.ListFormatSymbols_en_CK', 'goog.labs.i18n.ListFormatSymbols_en_CM', 'goog.labs.i18n.ListFormatSymbols_en_CX', 'goog.labs.i18n.ListFormatSymbols_en_CY', 'goog.labs.i18n.ListFormatSymbols_en_DE', 'goog.labs.i18n.ListFormatSymbols_en_DG', 'goog.labs.i18n.ListFormatSymbols_en_DK', 'goog.labs.i18n.ListFormatSymbols_en_DM', 'goog.labs.i18n.ListFormatSymbols_en_ER', 'goog.labs.i18n.ListFormatSymbols_en_FI', 'goog.labs.i18n.ListFormatSymbols_en_FJ', 'goog.labs.i18n.ListFormatSymbols_en_FK', 'goog.labs.i18n.ListFormatSymbols_en_FM', 'goog.labs.i18n.ListFormatSymbols_en_GD', 'goog.labs.i18n.ListFormatSymbols_en_GG', 'goog.labs.i18n.ListFormatSymbols_en_GH', 'goog.labs.i18n.ListFormatSymbols_en_GI', 'goog.labs.i18n.ListFormatSymbols_en_GM', 'goog.labs.i18n.ListFormatSymbols_en_GU', 'goog.labs.i18n.ListFormatSymbols_en_GY', 'goog.labs.i18n.ListFormatSymbols_en_HK', 'goog.labs.i18n.ListFormatSymbols_en_IL', 'goog.labs.i18n.ListFormatSymbols_en_IM', 'goog.labs.i18n.ListFormatSymbols_en_IO', 'goog.labs.i18n.ListFormatSymbols_en_JE', 'goog.labs.i18n.ListFormatSymbols_en_JM', 'goog.labs.i18n.ListFormatSymbols_en_KE', 'goog.labs.i18n.ListFormatSymbols_en_KI', 'goog.labs.i18n.ListFormatSymbols_en_KN', 'goog.labs.i18n.ListFormatSymbols_en_KY', 'goog.labs.i18n.ListFormatSymbols_en_LC', 'goog.labs.i18n.ListFormatSymbols_en_LR', 'goog.labs.i18n.ListFormatSymbols_en_LS', 'goog.labs.i18n.ListFormatSymbols_en_MG', 'goog.labs.i18n.ListFormatSymbols_en_MH', 'goog.labs.i18n.ListFormatSymbols_en_MO', 'goog.labs.i18n.ListFormatSymbols_en_MP', 'goog.labs.i18n.ListFormatSymbols_en_MS', 'goog.labs.i18n.ListFormatSymbols_en_MT', 'goog.labs.i18n.ListFormatSymbols_en_MU', 'goog.labs.i18n.ListFormatSymbols_en_MW', 'goog.labs.i18n.ListFormatSymbols_en_MY', 'goog.labs.i18n.ListFormatSymbols_en_NA', 'goog.labs.i18n.ListFormatSymbols_en_NF', 'goog.labs.i18n.ListFormatSymbols_en_NG', 'goog.labs.i18n.ListFormatSymbols_en_NL', 'goog.labs.i18n.ListFormatSymbols_en_NR', 'goog.labs.i18n.ListFormatSymbols_en_NU', 'goog.labs.i18n.ListFormatSymbols_en_NZ', 'goog.labs.i18n.ListFormatSymbols_en_PG', 'goog.labs.i18n.ListFormatSymbols_en_PH', 'goog.labs.i18n.ListFormatSymbols_en_PK', 'goog.labs.i18n.ListFormatSymbols_en_PN', 'goog.labs.i18n.ListFormatSymbols_en_PR', 'goog.labs.i18n.ListFormatSymbols_en_PW', 'goog.labs.i18n.ListFormatSymbols_en_RW', 'goog.labs.i18n.ListFormatSymbols_en_SB', 'goog.labs.i18n.ListFormatSymbols_en_SC', 'goog.labs.i18n.ListFormatSymbols_en_SD', 'goog.labs.i18n.ListFormatSymbols_en_SE', 'goog.labs.i18n.ListFormatSymbols_en_SH', 'goog.labs.i18n.ListFormatSymbols_en_SI', 'goog.labs.i18n.ListFormatSymbols_en_SL', 'goog.labs.i18n.ListFormatSymbols_en_SS', 'goog.labs.i18n.ListFormatSymbols_en_SX', 'goog.labs.i18n.ListFormatSymbols_en_SZ', 'goog.labs.i18n.ListFormatSymbols_en_TC', 'goog.labs.i18n.ListFormatSymbols_en_TK', 'goog.labs.i18n.ListFormatSymbols_en_TO', 'goog.labs.i18n.ListFormatSymbols_en_TT', 'goog.labs.i18n.ListFormatSymbols_en_TV', 'goog.labs.i18n.ListFormatSymbols_en_TZ', 'goog.labs.i18n.ListFormatSymbols_en_UG', 'goog.labs.i18n.ListFormatSymbols_en_UM', 'goog.labs.i18n.ListFormatSymbols_en_US_POSIX', 'goog.labs.i18n.ListFormatSymbols_en_VC', 'goog.labs.i18n.ListFormatSymbols_en_VG', 'goog.labs.i18n.ListFormatSymbols_en_VI', 'goog.labs.i18n.ListFormatSymbols_en_VU', 'goog.labs.i18n.ListFormatSymbols_en_WS', 'goog.labs.i18n.ListFormatSymbols_en_XA', 'goog.labs.i18n.ListFormatSymbols_en_ZM', 'goog.labs.i18n.ListFormatSymbols_en_ZW', 'goog.labs.i18n.ListFormatSymbols_eo', 'goog.labs.i18n.ListFormatSymbols_es_AR', 'goog.labs.i18n.ListFormatSymbols_es_BO', 'goog.labs.i18n.ListFormatSymbols_es_CL', 'goog.labs.i18n.ListFormatSymbols_es_CO', 'goog.labs.i18n.ListFormatSymbols_es_CR', 'goog.labs.i18n.ListFormatSymbols_es_CU', 'goog.labs.i18n.ListFormatSymbols_es_DO', 'goog.labs.i18n.ListFormatSymbols_es_EA', 'goog.labs.i18n.ListFormatSymbols_es_EC', 'goog.labs.i18n.ListFormatSymbols_es_GQ', 'goog.labs.i18n.ListFormatSymbols_es_GT', 'goog.labs.i18n.ListFormatSymbols_es_HN', 'goog.labs.i18n.ListFormatSymbols_es_IC', 'goog.labs.i18n.ListFormatSymbols_es_NI', 'goog.labs.i18n.ListFormatSymbols_es_PA', 'goog.labs.i18n.ListFormatSymbols_es_PE', 'goog.labs.i18n.ListFormatSymbols_es_PH', 'goog.labs.i18n.ListFormatSymbols_es_PR', 'goog.labs.i18n.ListFormatSymbols_es_PY', 'goog.labs.i18n.ListFormatSymbols_es_SV', 'goog.labs.i18n.ListFormatSymbols_es_UY', 'goog.labs.i18n.ListFormatSymbols_es_VE', 'goog.labs.i18n.ListFormatSymbols_et_EE', 'goog.labs.i18n.ListFormatSymbols_eu_ES', 'goog.labs.i18n.ListFormatSymbols_ewo', 'goog.labs.i18n.ListFormatSymbols_ewo_CM', 'goog.labs.i18n.ListFormatSymbols_fa_AF', 'goog.labs.i18n.ListFormatSymbols_fa_IR', 'goog.labs.i18n.ListFormatSymbols_ff', 'goog.labs.i18n.ListFormatSymbols_ff_CM', 'goog.labs.i18n.ListFormatSymbols_ff_GN', 'goog.labs.i18n.ListFormatSymbols_ff_MR', 'goog.labs.i18n.ListFormatSymbols_ff_SN', 'goog.labs.i18n.ListFormatSymbols_fi_FI', 'goog.labs.i18n.ListFormatSymbols_fil_PH', 'goog.labs.i18n.ListFormatSymbols_fo', 'goog.labs.i18n.ListFormatSymbols_fo_DK', 'goog.labs.i18n.ListFormatSymbols_fo_FO', 'goog.labs.i18n.ListFormatSymbols_fr_BE', 'goog.labs.i18n.ListFormatSymbols_fr_BF', 'goog.labs.i18n.ListFormatSymbols_fr_BI', 'goog.labs.i18n.ListFormatSymbols_fr_BJ', 'goog.labs.i18n.ListFormatSymbols_fr_BL', 'goog.labs.i18n.ListFormatSymbols_fr_CD', 'goog.labs.i18n.ListFormatSymbols_fr_CF', 'goog.labs.i18n.ListFormatSymbols_fr_CG', 'goog.labs.i18n.ListFormatSymbols_fr_CH', 'goog.labs.i18n.ListFormatSymbols_fr_CI', 'goog.labs.i18n.ListFormatSymbols_fr_CM', 'goog.labs.i18n.ListFormatSymbols_fr_DJ', 'goog.labs.i18n.ListFormatSymbols_fr_DZ', 'goog.labs.i18n.ListFormatSymbols_fr_FR', 'goog.labs.i18n.ListFormatSymbols_fr_GA', 'goog.labs.i18n.ListFormatSymbols_fr_GF', 'goog.labs.i18n.ListFormatSymbols_fr_GN', 'goog.labs.i18n.ListFormatSymbols_fr_GP', 'goog.labs.i18n.ListFormatSymbols_fr_GQ', 'goog.labs.i18n.ListFormatSymbols_fr_HT', 'goog.labs.i18n.ListFormatSymbols_fr_KM', 'goog.labs.i18n.ListFormatSymbols_fr_LU', 'goog.labs.i18n.ListFormatSymbols_fr_MA', 'goog.labs.i18n.ListFormatSymbols_fr_MC', 'goog.labs.i18n.ListFormatSymbols_fr_MF', 'goog.labs.i18n.ListFormatSymbols_fr_MG', 'goog.labs.i18n.ListFormatSymbols_fr_ML', 'goog.labs.i18n.ListFormatSymbols_fr_MQ', 'goog.labs.i18n.ListFormatSymbols_fr_MR', 'goog.labs.i18n.ListFormatSymbols_fr_MU', 'goog.labs.i18n.ListFormatSymbols_fr_NC', 'goog.labs.i18n.ListFormatSymbols_fr_NE', 'goog.labs.i18n.ListFormatSymbols_fr_PF', 'goog.labs.i18n.ListFormatSymbols_fr_PM', 'goog.labs.i18n.ListFormatSymbols_fr_RE', 'goog.labs.i18n.ListFormatSymbols_fr_RW', 'goog.labs.i18n.ListFormatSymbols_fr_SC', 'goog.labs.i18n.ListFormatSymbols_fr_SN', 'goog.labs.i18n.ListFormatSymbols_fr_SY', 'goog.labs.i18n.ListFormatSymbols_fr_TD', 'goog.labs.i18n.ListFormatSymbols_fr_TG', 'goog.labs.i18n.ListFormatSymbols_fr_TN', 'goog.labs.i18n.ListFormatSymbols_fr_VU', 'goog.labs.i18n.ListFormatSymbols_fr_WF', 'goog.labs.i18n.ListFormatSymbols_fr_YT', 'goog.labs.i18n.ListFormatSymbols_fur', 'goog.labs.i18n.ListFormatSymbols_fur_IT', 'goog.labs.i18n.ListFormatSymbols_fy', 'goog.labs.i18n.ListFormatSymbols_fy_NL', 'goog.labs.i18n.ListFormatSymbols_ga_IE', 'goog.labs.i18n.ListFormatSymbols_gd', 'goog.labs.i18n.ListFormatSymbols_gd_GB', 'goog.labs.i18n.ListFormatSymbols_gl_ES', 'goog.labs.i18n.ListFormatSymbols_gsw_CH', 'goog.labs.i18n.ListFormatSymbols_gsw_FR', 'goog.labs.i18n.ListFormatSymbols_gsw_LI', 'goog.labs.i18n.ListFormatSymbols_gu_IN', 'goog.labs.i18n.ListFormatSymbols_guz', 'goog.labs.i18n.ListFormatSymbols_guz_KE', 'goog.labs.i18n.ListFormatSymbols_gv', 'goog.labs.i18n.ListFormatSymbols_gv_IM', 'goog.labs.i18n.ListFormatSymbols_ha', 'goog.labs.i18n.ListFormatSymbols_ha_GH', 'goog.labs.i18n.ListFormatSymbols_ha_NE', 'goog.labs.i18n.ListFormatSymbols_ha_NG', 'goog.labs.i18n.ListFormatSymbols_haw_US', 'goog.labs.i18n.ListFormatSymbols_he_IL', 'goog.labs.i18n.ListFormatSymbols_hi_IN', 'goog.labs.i18n.ListFormatSymbols_hr_BA', 'goog.labs.i18n.ListFormatSymbols_hr_HR', 'goog.labs.i18n.ListFormatSymbols_hsb', 'goog.labs.i18n.ListFormatSymbols_hsb_DE', 'goog.labs.i18n.ListFormatSymbols_hu_HU', 'goog.labs.i18n.ListFormatSymbols_hy_AM', 'goog.labs.i18n.ListFormatSymbols_id_ID', 'goog.labs.i18n.ListFormatSymbols_ig', 'goog.labs.i18n.ListFormatSymbols_ig_NG', 'goog.labs.i18n.ListFormatSymbols_ii', 'goog.labs.i18n.ListFormatSymbols_ii_CN', 'goog.labs.i18n.ListFormatSymbols_is_IS', 'goog.labs.i18n.ListFormatSymbols_it_CH', 'goog.labs.i18n.ListFormatSymbols_it_IT', 'goog.labs.i18n.ListFormatSymbols_it_SM', 'goog.labs.i18n.ListFormatSymbols_ja_JP', 'goog.labs.i18n.ListFormatSymbols_jgo', 'goog.labs.i18n.ListFormatSymbols_jgo_CM', 'goog.labs.i18n.ListFormatSymbols_jmc', 'goog.labs.i18n.ListFormatSymbols_jmc_TZ', 'goog.labs.i18n.ListFormatSymbols_ka_GE', 'goog.labs.i18n.ListFormatSymbols_kab', 'goog.labs.i18n.ListFormatSymbols_kab_DZ', 'goog.labs.i18n.ListFormatSymbols_kam', 'goog.labs.i18n.ListFormatSymbols_kam_KE', 'goog.labs.i18n.ListFormatSymbols_kde', 'goog.labs.i18n.ListFormatSymbols_kde_TZ', 'goog.labs.i18n.ListFormatSymbols_kea', 'goog.labs.i18n.ListFormatSymbols_kea_CV', 'goog.labs.i18n.ListFormatSymbols_khq', 'goog.labs.i18n.ListFormatSymbols_khq_ML', 'goog.labs.i18n.ListFormatSymbols_ki', 'goog.labs.i18n.ListFormatSymbols_ki_KE', 'goog.labs.i18n.ListFormatSymbols_kk_KZ', 'goog.labs.i18n.ListFormatSymbols_kkj', 'goog.labs.i18n.ListFormatSymbols_kkj_CM', 'goog.labs.i18n.ListFormatSymbols_kl', 'goog.labs.i18n.ListFormatSymbols_kl_GL', 'goog.labs.i18n.ListFormatSymbols_kln', 'goog.labs.i18n.ListFormatSymbols_kln_KE', 'goog.labs.i18n.ListFormatSymbols_km_KH', 'goog.labs.i18n.ListFormatSymbols_kn_IN', 'goog.labs.i18n.ListFormatSymbols_ko_KP', 'goog.labs.i18n.ListFormatSymbols_ko_KR', 'goog.labs.i18n.ListFormatSymbols_kok', 'goog.labs.i18n.ListFormatSymbols_kok_IN', 'goog.labs.i18n.ListFormatSymbols_ks', 'goog.labs.i18n.ListFormatSymbols_ks_IN', 'goog.labs.i18n.ListFormatSymbols_ksb', 'goog.labs.i18n.ListFormatSymbols_ksb_TZ', 'goog.labs.i18n.ListFormatSymbols_ksf', 'goog.labs.i18n.ListFormatSymbols_ksf_CM', 'goog.labs.i18n.ListFormatSymbols_ksh', 'goog.labs.i18n.ListFormatSymbols_ksh_DE', 'goog.labs.i18n.ListFormatSymbols_kw', 'goog.labs.i18n.ListFormatSymbols_kw_GB', 'goog.labs.i18n.ListFormatSymbols_ky_KG', 'goog.labs.i18n.ListFormatSymbols_lag', 'goog.labs.i18n.ListFormatSymbols_lag_TZ', 'goog.labs.i18n.ListFormatSymbols_lb', 'goog.labs.i18n.ListFormatSymbols_lb_LU', 'goog.labs.i18n.ListFormatSymbols_lg', 'goog.labs.i18n.ListFormatSymbols_lg_UG', 'goog.labs.i18n.ListFormatSymbols_lkt', 'goog.labs.i18n.ListFormatSymbols_lkt_US', 'goog.labs.i18n.ListFormatSymbols_ln_AO', 'goog.labs.i18n.ListFormatSymbols_ln_CD', 'goog.labs.i18n.ListFormatSymbols_ln_CF', 'goog.labs.i18n.ListFormatSymbols_ln_CG', 'goog.labs.i18n.ListFormatSymbols_lo_LA', 'goog.labs.i18n.ListFormatSymbols_lrc', 'goog.labs.i18n.ListFormatSymbols_lrc_IQ', 'goog.labs.i18n.ListFormatSymbols_lrc_IR', 'goog.labs.i18n.ListFormatSymbols_lt_LT', 'goog.labs.i18n.ListFormatSymbols_lu', 'goog.labs.i18n.ListFormatSymbols_lu_CD', 'goog.labs.i18n.ListFormatSymbols_luo', 'goog.labs.i18n.ListFormatSymbols_luo_KE', 'goog.labs.i18n.ListFormatSymbols_luy', 'goog.labs.i18n.ListFormatSymbols_luy_KE', 'goog.labs.i18n.ListFormatSymbols_lv_LV', 'goog.labs.i18n.ListFormatSymbols_mas', 'goog.labs.i18n.ListFormatSymbols_mas_KE', 'goog.labs.i18n.ListFormatSymbols_mas_TZ', 'goog.labs.i18n.ListFormatSymbols_mer', 'goog.labs.i18n.ListFormatSymbols_mer_KE', 'goog.labs.i18n.ListFormatSymbols_mfe', 'goog.labs.i18n.ListFormatSymbols_mfe_MU', 'goog.labs.i18n.ListFormatSymbols_mg', 'goog.labs.i18n.ListFormatSymbols_mg_MG', 'goog.labs.i18n.ListFormatSymbols_mgh', 'goog.labs.i18n.ListFormatSymbols_mgh_MZ', 'goog.labs.i18n.ListFormatSymbols_mgo', 'goog.labs.i18n.ListFormatSymbols_mgo_CM', 'goog.labs.i18n.ListFormatSymbols_mk_MK', 'goog.labs.i18n.ListFormatSymbols_ml_IN', 'goog.labs.i18n.ListFormatSymbols_mn_MN', 'goog.labs.i18n.ListFormatSymbols_mr_IN', 'goog.labs.i18n.ListFormatSymbols_ms_BN', 'goog.labs.i18n.ListFormatSymbols_ms_MY', 'goog.labs.i18n.ListFormatSymbols_ms_SG', 'goog.labs.i18n.ListFormatSymbols_mt_MT', 'goog.labs.i18n.ListFormatSymbols_mua', 'goog.labs.i18n.ListFormatSymbols_mua_CM', 'goog.labs.i18n.ListFormatSymbols_my_MM', 'goog.labs.i18n.ListFormatSymbols_mzn', 'goog.labs.i18n.ListFormatSymbols_mzn_IR', 'goog.labs.i18n.ListFormatSymbols_naq', 'goog.labs.i18n.ListFormatSymbols_naq_NA', 'goog.labs.i18n.ListFormatSymbols_nb_NO', 'goog.labs.i18n.ListFormatSymbols_nb_SJ', 'goog.labs.i18n.ListFormatSymbols_nd', 'goog.labs.i18n.ListFormatSymbols_nd_ZW', 'goog.labs.i18n.ListFormatSymbols_ne_IN', 'goog.labs.i18n.ListFormatSymbols_ne_NP', 'goog.labs.i18n.ListFormatSymbols_nl_AW', 'goog.labs.i18n.ListFormatSymbols_nl_BE', 'goog.labs.i18n.ListFormatSymbols_nl_BQ', 'goog.labs.i18n.ListFormatSymbols_nl_CW', 'goog.labs.i18n.ListFormatSymbols_nl_NL', 'goog.labs.i18n.ListFormatSymbols_nl_SR', 'goog.labs.i18n.ListFormatSymbols_nl_SX', 'goog.labs.i18n.ListFormatSymbols_nmg', 'goog.labs.i18n.ListFormatSymbols_nmg_CM', 'goog.labs.i18n.ListFormatSymbols_nn', 'goog.labs.i18n.ListFormatSymbols_nn_NO', 'goog.labs.i18n.ListFormatSymbols_nnh', 'goog.labs.i18n.ListFormatSymbols_nnh_CM', 'goog.labs.i18n.ListFormatSymbols_nus', 'goog.labs.i18n.ListFormatSymbols_nus_SS', 'goog.labs.i18n.ListFormatSymbols_nyn', 'goog.labs.i18n.ListFormatSymbols_nyn_UG', 'goog.labs.i18n.ListFormatSymbols_om', 'goog.labs.i18n.ListFormatSymbols_om_ET', 'goog.labs.i18n.ListFormatSymbols_om_KE', 'goog.labs.i18n.ListFormatSymbols_or_IN', 'goog.labs.i18n.ListFormatSymbols_os', 'goog.labs.i18n.ListFormatSymbols_os_GE', 'goog.labs.i18n.ListFormatSymbols_os_RU', 'goog.labs.i18n.ListFormatSymbols_pa_Arab', 'goog.labs.i18n.ListFormatSymbols_pa_Arab_PK', 'goog.labs.i18n.ListFormatSymbols_pa_Guru', 'goog.labs.i18n.ListFormatSymbols_pa_Guru_IN', 'goog.labs.i18n.ListFormatSymbols_pl_PL', 'goog.labs.i18n.ListFormatSymbols_ps', 'goog.labs.i18n.ListFormatSymbols_ps_AF', 'goog.labs.i18n.ListFormatSymbols_pt_AO', 'goog.labs.i18n.ListFormatSymbols_pt_CV', 'goog.labs.i18n.ListFormatSymbols_pt_GW', 'goog.labs.i18n.ListFormatSymbols_pt_MO', 'goog.labs.i18n.ListFormatSymbols_pt_MZ', 'goog.labs.i18n.ListFormatSymbols_pt_ST', 'goog.labs.i18n.ListFormatSymbols_pt_TL', 'goog.labs.i18n.ListFormatSymbols_qu', 'goog.labs.i18n.ListFormatSymbols_qu_BO', 'goog.labs.i18n.ListFormatSymbols_qu_EC', 'goog.labs.i18n.ListFormatSymbols_qu_PE', 'goog.labs.i18n.ListFormatSymbols_rm', 'goog.labs.i18n.ListFormatSymbols_rm_CH', 'goog.labs.i18n.ListFormatSymbols_rn', 'goog.labs.i18n.ListFormatSymbols_rn_BI', 'goog.labs.i18n.ListFormatSymbols_ro_MD', 'goog.labs.i18n.ListFormatSymbols_ro_RO', 'goog.labs.i18n.ListFormatSymbols_rof', 'goog.labs.i18n.ListFormatSymbols_rof_TZ', 'goog.labs.i18n.ListFormatSymbols_ru_BY', 'goog.labs.i18n.ListFormatSymbols_ru_KG', 'goog.labs.i18n.ListFormatSymbols_ru_KZ', 'goog.labs.i18n.ListFormatSymbols_ru_MD', 'goog.labs.i18n.ListFormatSymbols_ru_RU', 'goog.labs.i18n.ListFormatSymbols_ru_UA', 'goog.labs.i18n.ListFormatSymbols_rw', 'goog.labs.i18n.ListFormatSymbols_rw_RW', 'goog.labs.i18n.ListFormatSymbols_rwk', 'goog.labs.i18n.ListFormatSymbols_rwk_TZ', 'goog.labs.i18n.ListFormatSymbols_sah', 'goog.labs.i18n.ListFormatSymbols_sah_RU', 'goog.labs.i18n.ListFormatSymbols_saq', 'goog.labs.i18n.ListFormatSymbols_saq_KE', 'goog.labs.i18n.ListFormatSymbols_sbp', 'goog.labs.i18n.ListFormatSymbols_sbp_TZ', 'goog.labs.i18n.ListFormatSymbols_se', 'goog.labs.i18n.ListFormatSymbols_se_FI', 'goog.labs.i18n.ListFormatSymbols_se_NO', 'goog.labs.i18n.ListFormatSymbols_se_SE', 'goog.labs.i18n.ListFormatSymbols_seh', 'goog.labs.i18n.ListFormatSymbols_seh_MZ', 'goog.labs.i18n.ListFormatSymbols_ses', 'goog.labs.i18n.ListFormatSymbols_ses_ML', 'goog.labs.i18n.ListFormatSymbols_sg', 'goog.labs.i18n.ListFormatSymbols_sg_CF', 'goog.labs.i18n.ListFormatSymbols_shi', 'goog.labs.i18n.ListFormatSymbols_shi_Latn', 'goog.labs.i18n.ListFormatSymbols_shi_Latn_MA', 'goog.labs.i18n.ListFormatSymbols_shi_Tfng', 'goog.labs.i18n.ListFormatSymbols_shi_Tfng_MA', 'goog.labs.i18n.ListFormatSymbols_si_LK', 'goog.labs.i18n.ListFormatSymbols_sk_SK', 'goog.labs.i18n.ListFormatSymbols_sl_SI', 'goog.labs.i18n.ListFormatSymbols_smn', 'goog.labs.i18n.ListFormatSymbols_smn_FI', 'goog.labs.i18n.ListFormatSymbols_sn', 'goog.labs.i18n.ListFormatSymbols_sn_ZW', 'goog.labs.i18n.ListFormatSymbols_so', 'goog.labs.i18n.ListFormatSymbols_so_DJ', 'goog.labs.i18n.ListFormatSymbols_so_ET', 'goog.labs.i18n.ListFormatSymbols_so_KE', 'goog.labs.i18n.ListFormatSymbols_so_SO', 'goog.labs.i18n.ListFormatSymbols_sq_AL', 'goog.labs.i18n.ListFormatSymbols_sq_MK', 'goog.labs.i18n.ListFormatSymbols_sq_XK', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_BA', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_ME', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_RS', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_XK', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_BA', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_ME', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_RS', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_XK', 'goog.labs.i18n.ListFormatSymbols_sv_AX', 'goog.labs.i18n.ListFormatSymbols_sv_FI', 'goog.labs.i18n.ListFormatSymbols_sv_SE', 'goog.labs.i18n.ListFormatSymbols_sw_CD', 'goog.labs.i18n.ListFormatSymbols_sw_KE', 'goog.labs.i18n.ListFormatSymbols_sw_TZ', 'goog.labs.i18n.ListFormatSymbols_sw_UG', 'goog.labs.i18n.ListFormatSymbols_ta_IN', 'goog.labs.i18n.ListFormatSymbols_ta_LK', 'goog.labs.i18n.ListFormatSymbols_ta_MY', 'goog.labs.i18n.ListFormatSymbols_ta_SG', 'goog.labs.i18n.ListFormatSymbols_te_IN', 'goog.labs.i18n.ListFormatSymbols_teo', 'goog.labs.i18n.ListFormatSymbols_teo_KE', 'goog.labs.i18n.ListFormatSymbols_teo_UG', 'goog.labs.i18n.ListFormatSymbols_th_TH', 'goog.labs.i18n.ListFormatSymbols_ti', 'goog.labs.i18n.ListFormatSymbols_ti_ER', 'goog.labs.i18n.ListFormatSymbols_ti_ET', 'goog.labs.i18n.ListFormatSymbols_to', 'goog.labs.i18n.ListFormatSymbols_to_TO', 'goog.labs.i18n.ListFormatSymbols_tr_CY', 'goog.labs.i18n.ListFormatSymbols_tr_TR', 'goog.labs.i18n.ListFormatSymbols_twq', 'goog.labs.i18n.ListFormatSymbols_twq_NE', 'goog.labs.i18n.ListFormatSymbols_tzm', 'goog.labs.i18n.ListFormatSymbols_tzm_MA', 'goog.labs.i18n.ListFormatSymbols_ug', 'goog.labs.i18n.ListFormatSymbols_ug_CN', 'goog.labs.i18n.ListFormatSymbols_uk_UA', 'goog.labs.i18n.ListFormatSymbols_ur_IN', 'goog.labs.i18n.ListFormatSymbols_ur_PK', 'goog.labs.i18n.ListFormatSymbols_uz_Arab', 'goog.labs.i18n.ListFormatSymbols_uz_Arab_AF', 'goog.labs.i18n.ListFormatSymbols_uz_Cyrl', 'goog.labs.i18n.ListFormatSymbols_uz_Cyrl_UZ', 'goog.labs.i18n.ListFormatSymbols_uz_Latn', 'goog.labs.i18n.ListFormatSymbols_uz_Latn_UZ', 'goog.labs.i18n.ListFormatSymbols_vai', 'goog.labs.i18n.ListFormatSymbols_vai_Latn', 'goog.labs.i18n.ListFormatSymbols_vai_Latn_LR', 'goog.labs.i18n.ListFormatSymbols_vai_Vaii', 'goog.labs.i18n.ListFormatSymbols_vai_Vaii_LR', 'goog.labs.i18n.ListFormatSymbols_vi_VN', 'goog.labs.i18n.ListFormatSymbols_vun', 'goog.labs.i18n.ListFormatSymbols_vun_TZ', 'goog.labs.i18n.ListFormatSymbols_wae', 'goog.labs.i18n.ListFormatSymbols_wae_CH', 'goog.labs.i18n.ListFormatSymbols_xog', 'goog.labs.i18n.ListFormatSymbols_xog_UG', 'goog.labs.i18n.ListFormatSymbols_yav', 'goog.labs.i18n.ListFormatSymbols_yav_CM', 'goog.labs.i18n.ListFormatSymbols_yi', 'goog.labs.i18n.ListFormatSymbols_yi_001', 'goog.labs.i18n.ListFormatSymbols_yo', 'goog.labs.i18n.ListFormatSymbols_yo_BJ', 'goog.labs.i18n.ListFormatSymbols_yo_NG', 'goog.labs.i18n.ListFormatSymbols_yue', 'goog.labs.i18n.ListFormatSymbols_yue_HK', 'goog.labs.i18n.ListFormatSymbols_zgh', 'goog.labs.i18n.ListFormatSymbols_zgh_MA', 'goog.labs.i18n.ListFormatSymbols_zh_Hans', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_CN', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_HK', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_MO', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_SG', 'goog.labs.i18n.ListFormatSymbols_zh_Hant', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_HK', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_MO', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_TW', 'goog.labs.i18n.ListFormatSymbols_zu_ZA'], ['goog.labs.i18n.ListFormatSymbols'], {});
+goog.addDependency('labs/iterable/iterable.js', ['goog.labs.iterable'], [], {'module': 'goog'});
+goog.addDependency('labs/iterable/iterable_test.js', ['goog.labs.iterableTest'], ['goog.labs.iterable', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('labs/mock/mock.js', ['goog.labs.mock', 'goog.labs.mock.VerificationError'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.Error', 'goog.functions', 'goog.labs.mock.verification', 'goog.labs.mock.verification.VerificationMode', 'goog.object'], {});
+goog.addDependency('labs/mock/mock_test.js', ['goog.labs.mockTest'], ['goog.array', 'goog.labs.mock', 'goog.labs.mock.VerificationError', 'goog.labs.testing.AnythingMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.string', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/mock/verificationmode.js', ['goog.labs.mock.verification', 'goog.labs.mock.verification.VerificationMode'], [], {});
+goog.addDependency('labs/mock/verificationmode_test.js', ['goog.labs.mock.VerificationModeTest'], ['goog.labs.mock.verification', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('labs/net/image.js', ['goog.labs.net.image'], ['goog.Promise', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.net.EventType', 'goog.userAgent'], {});
+goog.addDependency('labs/net/image_test.js', ['goog.labs.net.imageTest'], ['goog.labs.net.image', 'goog.string', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('labs/net/webchannel.js', ['goog.net.WebChannel'], ['goog.events', 'goog.events.Event'], {});
+goog.addDependency('labs/net/webchannel/basetestchannel.js', ['goog.labs.net.webChannel.BaseTestChannel'], ['goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Stat'], {});
+goog.addDependency('labs/net/webchannel/channel.js', ['goog.labs.net.webChannel.Channel'], [], {});
+goog.addDependency('labs/net/webchannel/channelrequest.js', ['goog.labs.net.webChannel.ChannelRequest'], ['goog.Timer', 'goog.async.Throttle', 'goog.events.EventHandler', 'goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.userAgent'], {});
+goog.addDependency('labs/net/webchannel/channelrequest_test.js', ['goog.labs.net.webChannel.channelRequestTest'], ['goog.Uri', 'goog.functions', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction'], {});
+goog.addDependency('labs/net/webchannel/connectionstate.js', ['goog.labs.net.webChannel.ConnectionState'], [], {});
+goog.addDependency('labs/net/webchannel/forwardchannelrequestpool.js', ['goog.labs.net.webChannel.ForwardChannelRequestPool'], ['goog.array', 'goog.string', 'goog.structs.Set'], {});
+goog.addDependency('labs/net/webchannel/forwardchannelrequestpool_test.js', ['goog.labs.net.webChannel.forwardChannelRequestPoolTest'], ['goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/net/webchannel/netutils.js', ['goog.labs.net.webChannel.netUtils'], ['goog.Uri', 'goog.labs.net.webChannel.WebChannelDebug'], {});
+goog.addDependency('labs/net/webchannel/requeststats.js', ['goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Event', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.labs.net.webChannel.requestStats.ServerReachabilityEvent', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.labs.net.webChannel.requestStats.StatEvent', 'goog.labs.net.webChannel.requestStats.TimingEvent'], ['goog.events.Event', 'goog.events.EventTarget'], {});
+goog.addDependency('labs/net/webchannel/webchannelbase.js', ['goog.labs.net.webChannel.WebChannelBase'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug.TextFormatter', 'goog.json', 'goog.labs.net.webChannel.BaseTestChannel', 'goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ConnectionState', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.Wire', 'goog.labs.net.webChannel.WireV8', 'goog.labs.net.webChannel.netUtils', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.log', 'goog.net.XhrIo', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.CircularBuffer'], {});
+goog.addDependency('labs/net/webchannel/webchannelbase_test.js', ['goog.labs.net.webChannel.webChannelBaseTest'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.functions', 'goog.json', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.labs.net.webChannel.WebChannelBase', 'goog.labs.net.webChannel.WebChannelBaseTransport', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.Wire', 'goog.labs.net.webChannel.netUtils', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/net/webchannel/webchannelbasetransport.js', ['goog.labs.net.webChannel.WebChannelBaseTransport'], ['goog.asserts', 'goog.events.EventTarget', 'goog.json', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelBase', 'goog.log', 'goog.net.WebChannel', 'goog.net.WebChannelTransport', 'goog.object', 'goog.string.path'], {});
+goog.addDependency('labs/net/webchannel/webchannelbasetransport_test.js', ['goog.labs.net.webChannel.webChannelBaseTransportTest'], ['goog.events', 'goog.functions', 'goog.json', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelBase', 'goog.labs.net.webChannel.WebChannelBaseTransport', 'goog.net.WebChannel', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/net/webchannel/webchanneldebug.js', ['goog.labs.net.webChannel.WebChannelDebug'], ['goog.json', 'goog.log'], {});
+goog.addDependency('labs/net/webchannel/wire.js', ['goog.labs.net.webChannel.Wire'], [], {});
+goog.addDependency('labs/net/webchannel/wirev8.js', ['goog.labs.net.webChannel.WireV8'], ['goog.asserts', 'goog.json', 'goog.json.NativeJsonProcessor', 'goog.labs.net.webChannel.Wire', 'goog.structs'], {});
+goog.addDependency('labs/net/webchannel/wirev8_test.js', ['goog.labs.net.webChannel.WireV8Test'], ['goog.labs.net.webChannel.WireV8', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/net/webchanneltransport.js', ['goog.net.WebChannelTransport'], [], {});
+goog.addDependency('labs/net/webchanneltransportfactory.js', ['goog.net.createWebChannelTransport'], ['goog.functions', 'goog.labs.net.webChannel.WebChannelBaseTransport'], {});
+goog.addDependency('labs/net/xhr.js', ['goog.labs.net.xhr', 'goog.labs.net.xhr.Error', 'goog.labs.net.xhr.HttpError', 'goog.labs.net.xhr.Options', 'goog.labs.net.xhr.PostData', 'goog.labs.net.xhr.ResponseType', 'goog.labs.net.xhr.TimeoutError'], ['goog.Promise', 'goog.asserts', 'goog.debug.Error', 'goog.json', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.string', 'goog.uri.utils', 'goog.userAgent'], {});
+goog.addDependency('labs/net/xhr_test.js', ['goog.labs.net.xhrTest'], ['goog.Promise', 'goog.events', 'goog.events.EventType', 'goog.labs.net.xhr', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XmlHttp', 'goog.testing.MockClock', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('labs/promise/promise.js', ['goog.labs.promise'], ['goog.Promise'], {'module': 'goog'});
+goog.addDependency('labs/promise/promise_test.js', ['goog.labs.promiseTest'], ['goog.Promise', 'goog.Timer', 'goog.labs.promise', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('labs/pubsub/broadcastpubsub.js', ['goog.labs.pubsub.BroadcastPubSub'], ['goog.Disposable', 'goog.Timer', 'goog.array', 'goog.async.run', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.math', 'goog.pubsub.PubSub', 'goog.storage.Storage', 'goog.storage.mechanism.HTML5LocalStorage', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('labs/pubsub/broadcastpubsub_test.js', ['goog.labs.pubsub.BroadcastPubSubTest'], ['goog.array', 'goog.debug.Logger', 'goog.json', 'goog.labs.pubsub.BroadcastPubSub', 'goog.storage.Storage', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('labs/storage/boundedcollectablestorage.js', ['goog.labs.storage.BoundedCollectableStorage'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.storage.CollectableStorage', 'goog.storage.ErrorCode', 'goog.storage.ExpiringStorage'], {});
+goog.addDependency('labs/storage/boundedcollectablestorage_test.js', ['goog.labs.storage.BoundedCollectableStorageTest'], ['goog.labs.storage.BoundedCollectableStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storage_test', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('labs/structs/map.js', ['goog.labs.structs.Map'], ['goog.array', 'goog.asserts', 'goog.object'], {});
+goog.addDependency('labs/structs/map_perf.js', ['goog.labs.structs.MapPerf'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.labs.structs.Map', 'goog.structs.Map', 'goog.testing.PerformanceTable', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/structs/map_test.js', ['goog.labs.structs.MapTest'], ['goog.labs.structs.Map', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/structs/multimap.js', ['goog.labs.structs.Multimap'], ['goog.array', 'goog.labs.structs.Map', 'goog.object'], {});
+goog.addDependency('labs/structs/multimap_test.js', ['goog.labs.structs.MultimapTest'], ['goog.labs.structs.Map', 'goog.labs.structs.Multimap', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/style/pixeldensitymonitor.js', ['goog.labs.style.PixelDensityMonitor', 'goog.labs.style.PixelDensityMonitor.Density', 'goog.labs.style.PixelDensityMonitor.EventType'], ['goog.events', 'goog.events.EventTarget'], {});
+goog.addDependency('labs/style/pixeldensitymonitor_test.js', ['goog.labs.style.PixelDensityMonitorTest'], ['goog.array', 'goog.dom.DomHelper', 'goog.events', 'goog.labs.style.PixelDensityMonitor', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('labs/testing/assertthat.js', ['goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat'], ['goog.debug.Error'], {});
+goog.addDependency('labs/testing/assertthat_test.js', ['goog.labs.testing.assertThatTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('labs/testing/decoratormatcher.js', ['goog.labs.testing.AnythingMatcher'], ['goog.labs.testing.Matcher'], {});
+goog.addDependency('labs/testing/decoratormatcher_test.js', ['goog.labs.testing.decoratorMatcherTest'], ['goog.labs.testing.AnythingMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/dictionarymatcher.js', ['goog.labs.testing.HasEntriesMatcher', 'goog.labs.testing.HasEntryMatcher', 'goog.labs.testing.HasKeyMatcher', 'goog.labs.testing.HasValueMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher', 'goog.object'], {});
+goog.addDependency('labs/testing/dictionarymatcher_test.js', ['goog.labs.testing.dictionaryMatcherTest'], ['goog.labs.testing.HasEntryMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/environment.js', ['goog.labs.testing.Environment'], ['goog.array', 'goog.asserts', 'goog.debug.Console', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/environment_test.js', ['goog.labs.testing.environmentTest'], ['goog.labs.testing.Environment', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.testSuite'], {});
+goog.addDependency('labs/testing/environment_usage_test.js', ['goog.labs.testing.environmentUsageTest'], ['goog.labs.testing.Environment'], {});
+goog.addDependency('labs/testing/json_fuzzing.js', ['goog.labs.testing.JsonFuzzing'], ['goog.string', 'goog.testing.PseudoRandom'], {});
+goog.addDependency('labs/testing/json_fuzzing_test.js', ['goog.labs.testing.JsonFuzzingTest'], ['goog.json', 'goog.labs.testing.JsonFuzzing', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/logicmatcher.js', ['goog.labs.testing.AllOfMatcher', 'goog.labs.testing.AnyOfMatcher', 'goog.labs.testing.IsNotMatcher'], ['goog.array', 'goog.labs.testing.Matcher'], {});
+goog.addDependency('labs/testing/logicmatcher_test.js', ['goog.labs.testing.logicMatcherTest'], ['goog.labs.testing.AllOfMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/matcher.js', ['goog.labs.testing.Matcher'], [], {});
+goog.addDependency('labs/testing/numbermatcher.js', ['goog.labs.testing.CloseToMatcher', 'goog.labs.testing.EqualToMatcher', 'goog.labs.testing.GreaterThanEqualToMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.LessThanEqualToMatcher', 'goog.labs.testing.LessThanMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher'], {});
+goog.addDependency('labs/testing/numbermatcher_test.js', ['goog.labs.testing.numberMatcherTest'], ['goog.labs.testing.LessThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/objectmatcher.js', ['goog.labs.testing.HasPropertyMatcher', 'goog.labs.testing.InstanceOfMatcher', 'goog.labs.testing.IsNullMatcher', 'goog.labs.testing.IsNullOrUndefinedMatcher', 'goog.labs.testing.IsUndefinedMatcher', 'goog.labs.testing.ObjectEqualsMatcher'], ['goog.labs.testing.Matcher'], {});
+goog.addDependency('labs/testing/objectmatcher_test.js', ['goog.labs.testing.objectMatcherTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.ObjectEqualsMatcher', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/stringmatcher.js', ['goog.labs.testing.ContainsStringMatcher', 'goog.labs.testing.EndsWithMatcher', 'goog.labs.testing.EqualToIgnoringWhitespaceMatcher', 'goog.labs.testing.EqualsMatcher', 'goog.labs.testing.RegexMatcher', 'goog.labs.testing.StartsWithMatcher', 'goog.labs.testing.StringContainsInOrderMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher', 'goog.string'], {});
+goog.addDependency('labs/testing/stringmatcher_test.js', ['goog.labs.testing.stringMatcherTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.StringContainsInOrderMatcher', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/browser.js', ['goog.labs.userAgent.browser'], ['goog.array', 'goog.labs.userAgent.util', 'goog.object', 'goog.string'], {});
+goog.addDependency('labs/useragent/browser_test.js', ['goog.labs.userAgent.browserTest'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.object', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/device.js', ['goog.labs.userAgent.device'], ['goog.labs.userAgent.util'], {});
+goog.addDependency('labs/useragent/device_test.js', ['goog.labs.userAgent.deviceTest'], ['goog.labs.userAgent.device', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/engine.js', ['goog.labs.userAgent.engine'], ['goog.array', 'goog.labs.userAgent.util', 'goog.string'], {});
+goog.addDependency('labs/useragent/engine_test.js', ['goog.labs.userAgent.engineTest'], ['goog.labs.userAgent.engine', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/platform.js', ['goog.labs.userAgent.platform'], ['goog.labs.userAgent.util', 'goog.string'], {});
+goog.addDependency('labs/useragent/platform_test.js', ['goog.labs.userAgent.platformTest'], ['goog.labs.userAgent.platform', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/test_agents.js', ['goog.labs.userAgent.testAgents'], [], {});
+goog.addDependency('labs/useragent/util.js', ['goog.labs.userAgent.util'], ['goog.string'], {});
+goog.addDependency('labs/useragent/util_test.js', ['goog.labs.userAgent.utilTest'], ['goog.functions', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/verifier.js', ['goog.labs.useragent.verifier'], [], {});
+goog.addDependency('labs/useragent/verifier_test.js', ['goog.labs.useragent.verifierTest'], ['goog.labs.userAgent.browser', 'goog.labs.useragent.verifier', 'goog.testing.testSuite'], {'lang': 'es5', 'module': 'goog'});
+goog.addDependency('locale/countries.js', ['goog.locale.countries'], [], {});
+goog.addDependency('locale/countrylanguagenames_test.js', ['goog.locale.countryLanguageNamesTest'], ['goog.locale', 'goog.testing.jsunit'], {});
+goog.addDependency('locale/defaultlocalenameconstants.js', ['goog.locale.defaultLocaleNameConstants'], [], {});
+goog.addDependency('locale/genericfontnames.js', ['goog.locale.genericFontNames'], [], {});
+goog.addDependency('locale/genericfontnames_test.js', ['goog.locale.genericFontNamesTest'], ['goog.locale.genericFontNames', 'goog.testing.jsunit'], {});
+goog.addDependency('locale/genericfontnamesdata.js', ['goog.locale.genericFontNamesData'], [], {});
+goog.addDependency('locale/locale.js', ['goog.locale'], ['goog.locale.nativeNameConstants'], {});
+goog.addDependency('locale/nativenameconstants.js', ['goog.locale.nativeNameConstants'], [], {});
+goog.addDependency('locale/scriptToLanguages.js', ['goog.locale.scriptToLanguages'], ['goog.locale'], {});
+goog.addDependency('locale/timezonedetection.js', ['goog.locale.timeZoneDetection'], ['goog.locale.TimeZoneFingerprint'], {});
+goog.addDependency('locale/timezonedetection_test.js', ['goog.locale.timeZoneDetectionTest'], ['goog.locale.timeZoneDetection', 'goog.testing.jsunit'], {});
+goog.addDependency('locale/timezonefingerprint.js', ['goog.locale.TimeZoneFingerprint'], [], {});
+goog.addDependency('locale/timezonelist.js', ['goog.locale.TimeZoneList'], ['goog.locale'], {});
+goog.addDependency('locale/timezonelist_test.js', ['goog.locale.TimeZoneListTest'], ['goog.locale', 'goog.locale.TimeZoneList', 'goog.testing.jsunit'], {});
+goog.addDependency('log/log.js', ['goog.log', 'goog.log.Level', 'goog.log.LogRecord', 'goog.log.Logger'], ['goog.debug', 'goog.debug.LogManager', 'goog.debug.LogRecord', 'goog.debug.Logger'], {});
+goog.addDependency('log/log_test.js', ['goog.logTest'], ['goog.debug.LogManager', 'goog.log', 'goog.log.Level', 'goog.testing.jsunit'], {});
+goog.addDependency('math/affinetransform.js', ['goog.math.AffineTransform'], ['goog.math'], {});
+goog.addDependency('math/affinetransform_test.js', ['goog.math.AffineTransformTest'], ['goog.array', 'goog.math', 'goog.math.AffineTransform', 'goog.testing.jsunit'], {});
+goog.addDependency('math/bezier.js', ['goog.math.Bezier'], ['goog.math', 'goog.math.Coordinate'], {});
+goog.addDependency('math/bezier_test.js', ['goog.math.BezierTest'], ['goog.math', 'goog.math.Bezier', 'goog.math.Coordinate', 'goog.testing.jsunit'], {});
+goog.addDependency('math/box.js', ['goog.math.Box'], ['goog.asserts', 'goog.math.Coordinate'], {});
+goog.addDependency('math/box_test.js', ['goog.math.BoxTest'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.testing.jsunit'], {});
+goog.addDependency('math/coordinate.js', ['goog.math.Coordinate'], ['goog.math'], {});
+goog.addDependency('math/coordinate3.js', ['goog.math.Coordinate3'], [], {});
+goog.addDependency('math/coordinate3_test.js', ['goog.math.Coordinate3Test'], ['goog.math.Coordinate3', 'goog.testing.jsunit'], {});
+goog.addDependency('math/coordinate_test.js', ['goog.math.CoordinateTest'], ['goog.math.Coordinate', 'goog.testing.jsunit'], {});
+goog.addDependency('math/exponentialbackoff.js', ['goog.math.ExponentialBackoff'], ['goog.asserts'], {});
+goog.addDependency('math/exponentialbackoff_test.js', ['goog.math.ExponentialBackoffTest'], ['goog.math.ExponentialBackoff', 'goog.testing.jsunit'], {});
+goog.addDependency('math/integer.js', ['goog.math.Integer'], [], {});
+goog.addDependency('math/integer_test.js', ['goog.math.IntegerTest'], ['goog.math.Integer', 'goog.testing.jsunit'], {});
+goog.addDependency('math/interpolator/interpolator1.js', ['goog.math.interpolator.Interpolator1'], [], {});
+goog.addDependency('math/interpolator/linear1.js', ['goog.math.interpolator.Linear1'], ['goog.array', 'goog.asserts', 'goog.math', 'goog.math.interpolator.Interpolator1'], {});
+goog.addDependency('math/interpolator/linear1_test.js', ['goog.math.interpolator.Linear1Test'], ['goog.math.interpolator.Linear1', 'goog.testing.jsunit'], {});
+goog.addDependency('math/interpolator/pchip1.js', ['goog.math.interpolator.Pchip1'], ['goog.math', 'goog.math.interpolator.Spline1'], {});
+goog.addDependency('math/interpolator/pchip1_test.js', ['goog.math.interpolator.Pchip1Test'], ['goog.math.interpolator.Pchip1', 'goog.testing.jsunit'], {});
+goog.addDependency('math/interpolator/spline1.js', ['goog.math.interpolator.Spline1'], ['goog.array', 'goog.asserts', 'goog.math', 'goog.math.interpolator.Interpolator1', 'goog.math.tdma'], {});
+goog.addDependency('math/interpolator/spline1_test.js', ['goog.math.interpolator.Spline1Test'], ['goog.math.interpolator.Spline1', 'goog.testing.jsunit'], {});
+goog.addDependency('math/irect.js', ['goog.math.IRect'], [], {});
+goog.addDependency('math/line.js', ['goog.math.Line'], ['goog.math', 'goog.math.Coordinate'], {});
+goog.addDependency('math/line_test.js', ['goog.math.LineTest'], ['goog.math.Coordinate', 'goog.math.Line', 'goog.testing.jsunit'], {});
+goog.addDependency('math/long.js', ['goog.math.Long'], ['goog.reflect'], {});
+goog.addDependency('math/long_test.js', ['goog.math.LongTest'], ['goog.math.Long', 'goog.testing.jsunit'], {});
+goog.addDependency('math/math.js', ['goog.math'], ['goog.array', 'goog.asserts'], {});
+goog.addDependency('math/math_test.js', ['goog.mathTest'], ['goog.math', 'goog.testing.jsunit'], {});
+goog.addDependency('math/matrix.js', ['goog.math.Matrix'], ['goog.array', 'goog.asserts', 'goog.math', 'goog.math.Size', 'goog.string'], {});
+goog.addDependency('math/matrix_test.js', ['goog.math.MatrixTest'], ['goog.math.Matrix', 'goog.testing.jsunit'], {});
+goog.addDependency('math/path.js', ['goog.math.Path', 'goog.math.Path.Segment'], ['goog.array', 'goog.math'], {});
+goog.addDependency('math/path_test.js', ['goog.math.PathTest'], ['goog.array', 'goog.math.AffineTransform', 'goog.math.Path', 'goog.testing.jsunit'], {});
+goog.addDependency('math/paths.js', ['goog.math.paths'], ['goog.math.Coordinate', 'goog.math.Path'], {});
+goog.addDependency('math/paths_test.js', ['goog.math.pathsTest'], ['goog.math.Coordinate', 'goog.math.paths', 'goog.testing.jsunit'], {});
+goog.addDependency('math/range.js', ['goog.math.Range'], ['goog.asserts'], {});
+goog.addDependency('math/range_test.js', ['goog.math.RangeTest'], ['goog.math.Range', 'goog.testing.jsunit'], {});
+goog.addDependency('math/rangeset.js', ['goog.math.RangeSet'], ['goog.array', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.math.Range'], {});
+goog.addDependency('math/rangeset_test.js', ['goog.math.RangeSetTest'], ['goog.iter', 'goog.math.Range', 'goog.math.RangeSet', 'goog.testing.jsunit'], {});
+goog.addDependency('math/rect.js', ['goog.math.Rect'], ['goog.asserts', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.IRect', 'goog.math.Size'], {});
+goog.addDependency('math/rect_test.js', ['goog.math.RectTest'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.testing.jsunit'], {});
+goog.addDependency('math/size.js', ['goog.math.Size'], [], {});
+goog.addDependency('math/size_test.js', ['goog.math.SizeTest'], ['goog.math.Size', 'goog.testing.jsunit'], {});
+goog.addDependency('math/tdma.js', ['goog.math.tdma'], [], {});
+goog.addDependency('math/tdma_test.js', ['goog.math.tdmaTest'], ['goog.math.tdma', 'goog.testing.jsunit'], {});
+goog.addDependency('math/vec2.js', ['goog.math.Vec2'], ['goog.math', 'goog.math.Coordinate'], {});
+goog.addDependency('math/vec2_test.js', ['goog.math.Vec2Test'], ['goog.math.Vec2', 'goog.testing.jsunit'], {});
+goog.addDependency('math/vec3.js', ['goog.math.Vec3'], ['goog.math', 'goog.math.Coordinate3'], {});
+goog.addDependency('math/vec3_test.js', ['goog.math.Vec3Test'], ['goog.math.Coordinate3', 'goog.math.Vec3', 'goog.testing.jsunit'], {});
+goog.addDependency('memoize/memoize.js', ['goog.memoize'], [], {});
+goog.addDependency('memoize/memoize_test.js', ['goog.memoizeTest'], ['goog.memoize', 'goog.testing.jsunit'], {});
+goog.addDependency('messaging/abstractchannel.js', ['goog.messaging.AbstractChannel'], ['goog.Disposable', 'goog.json', 'goog.log', 'goog.messaging.MessageChannel'], {});
+goog.addDependency('messaging/abstractchannel_test.js', ['goog.messaging.AbstractChannelTest'], ['goog.messaging.AbstractChannel', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.jsunit'], {});
+goog.addDependency('messaging/bufferedchannel.js', ['goog.messaging.BufferedChannel'], ['goog.Disposable', 'goog.Timer', 'goog.events', 'goog.log', 'goog.messaging.MessageChannel', 'goog.messaging.MultiChannel'], {});
+goog.addDependency('messaging/bufferedchannel_test.js', ['goog.messaging.BufferedChannelTest'], ['goog.debug.Console', 'goog.dom', 'goog.dom.TagName', 'goog.log', 'goog.log.Level', 'goog.messaging.BufferedChannel', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/deferredchannel.js', ['goog.messaging.DeferredChannel'], ['goog.Disposable', 'goog.messaging.MessageChannel'], {});
+goog.addDependency('messaging/deferredchannel_test.js', ['goog.messaging.DeferredChannelTest'], ['goog.async.Deferred', 'goog.messaging.DeferredChannel', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/loggerclient.js', ['goog.messaging.LoggerClient'], ['goog.Disposable', 'goog.debug', 'goog.debug.LogManager', 'goog.debug.Logger'], {});
+goog.addDependency('messaging/loggerclient_test.js', ['goog.messaging.LoggerClientTest'], ['goog.debug', 'goog.debug.Logger', 'goog.messaging.LoggerClient', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/loggerserver.js', ['goog.messaging.LoggerServer'], ['goog.Disposable', 'goog.log', 'goog.log.Level'], {});
+goog.addDependency('messaging/loggerserver_test.js', ['goog.messaging.LoggerServerTest'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.log', 'goog.log.Level', 'goog.messaging.LoggerServer', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/messagechannel.js', ['goog.messaging.MessageChannel'], [], {});
+goog.addDependency('messaging/messaging.js', ['goog.messaging'], [], {});
+goog.addDependency('messaging/messaging_test.js', ['goog.testing.messaging.MockMessageChannelTest'], ['goog.messaging', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/multichannel.js', ['goog.messaging.MultiChannel', 'goog.messaging.MultiChannel.VirtualChannel'], ['goog.Disposable', 'goog.log', 'goog.messaging.MessageChannel', 'goog.object'], {});
+goog.addDependency('messaging/multichannel_test.js', ['goog.messaging.MultiChannelTest'], ['goog.messaging.MultiChannel', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.mockmatchers.IgnoreArgument'], {});
+goog.addDependency('messaging/portcaller.js', ['goog.messaging.PortCaller'], ['goog.Disposable', 'goog.async.Deferred', 'goog.messaging.DeferredChannel', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object'], {});
+goog.addDependency('messaging/portcaller_test.js', ['goog.messaging.PortCallerTest'], ['goog.events.EventTarget', 'goog.messaging.PortCaller', 'goog.messaging.PortNetwork', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/portchannel.js', ['goog.messaging.PortChannel'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.debug', 'goog.events', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.messaging.AbstractChannel', 'goog.messaging.DeferredChannel', 'goog.object', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('messaging/portchannel_test.js', ['goog.messaging.PortChannelTest'], ['goog.Promise', 'goog.Timer', 'goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.messaging.PortChannel', 'goog.testing.MockControl', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageEvent'], {});
+goog.addDependency('messaging/portnetwork.js', ['goog.messaging.PortNetwork'], [], {});
+goog.addDependency('messaging/portnetwork_test.js', ['goog.messaging.PortNetworkTest'], ['goog.Promise', 'goog.Timer', 'goog.labs.userAgent.browser', 'goog.messaging.PortChannel', 'goog.messaging.PortOperator', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('messaging/portoperator.js', ['goog.messaging.PortOperator'], ['goog.Disposable', 'goog.asserts', 'goog.log', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object'], {});
+goog.addDependency('messaging/portoperator_test.js', ['goog.messaging.PortOperatorTest'], ['goog.messaging.PortNetwork', 'goog.messaging.PortOperator', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.messaging.MockMessagePort'], {});
+goog.addDependency('messaging/respondingchannel.js', ['goog.messaging.RespondingChannel'], ['goog.Disposable', 'goog.log', 'goog.messaging.MultiChannel'], {});
+goog.addDependency('messaging/respondingchannel_test.js', ['goog.messaging.RespondingChannelTest'], ['goog.messaging.RespondingChannel', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/testdata/portchannel_worker.js', ['goog.messaging.testdata.portchannel_worker'], ['goog.messaging.PortChannel'], {});
+goog.addDependency('messaging/testdata/portnetwork_worker1.js', ['goog.messaging.testdata.portnetwork_worker1'], ['goog.messaging.PortCaller', 'goog.messaging.PortChannel'], {});
+goog.addDependency('messaging/testdata/portnetwork_worker2.js', ['goog.messaging.testdata.portnetwork_worker2'], ['goog.messaging.PortCaller', 'goog.messaging.PortChannel'], {});
+goog.addDependency('module/abstractmoduleloader.js', ['goog.module.AbstractModuleLoader'], ['goog.module'], {});
+goog.addDependency('module/basemodule.js', ['goog.module.BaseModule'], ['goog.Disposable', 'goog.module'], {});
+goog.addDependency('module/loader.js', ['goog.module.Loader'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.module', 'goog.object'], {});
+goog.addDependency('module/module.js', ['goog.module'], [], {});
+goog.addDependency('module/moduleinfo.js', ['goog.module.ModuleInfo'], ['goog.Disposable', 'goog.async.throwException', 'goog.functions', 'goog.module', 'goog.module.BaseModule', 'goog.module.ModuleLoadCallback'], {});
+goog.addDependency('module/moduleinfo_test.js', ['goog.module.ModuleInfoTest'], ['goog.module.BaseModule', 'goog.module.ModuleInfo', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('module/moduleloadcallback.js', ['goog.module.ModuleLoadCallback'], ['goog.debug.entryPointRegistry', 'goog.module'], {});
+goog.addDependency('module/moduleloadcallback_test.js', ['goog.module.ModuleLoadCallbackTest'], ['goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.functions', 'goog.module.ModuleLoadCallback', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('module/moduleloader.js', ['goog.module.ModuleLoader'], ['goog.Timer', 'goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.labs.userAgent.browser', 'goog.log', 'goog.module.AbstractModuleLoader', 'goog.net.BulkLoader', 'goog.net.EventType', 'goog.net.jsloader', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('module/moduleloader_test.js', ['goog.module.ModuleLoaderTest'], ['goog.Promise', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.functions', 'goog.module.ModuleLoader', 'goog.module.ModuleManager', 'goog.net.BulkLoader', 'goog.net.XmlHttp', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.events.EventObserver', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('module/modulemanager.js', ['goog.module.ModuleManager', 'goog.module.ModuleManager.CallbackType', 'goog.module.ModuleManager.FailureType'], ['goog.Disposable', 'goog.array', 'goog.asserts', 'goog.async.Deferred', 'goog.debug.Trace', 'goog.dispose', 'goog.log', 'goog.module', 'goog.module.ModuleInfo', 'goog.module.ModuleLoadCallback', 'goog.object'], {});
+goog.addDependency('module/modulemanager_test.js', ['goog.module.ModuleManagerTest'], ['goog.array', 'goog.functions', 'goog.module.BaseModule', 'goog.module.ModuleManager', 'goog.testing', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('module/testdata/modA_1.js', ['goog.module.testdata.modA_1'], [], {});
+goog.addDependency('module/testdata/modA_2.js', ['goog.module.testdata.modA_2'], ['goog.module.ModuleManager'], {});
+goog.addDependency('module/testdata/modB_1.js', ['goog.module.testdata.modB_1'], ['goog.module.ModuleManager'], {});
+goog.addDependency('net/browserchannel.js', ['goog.net.BrowserChannel', 'goog.net.BrowserChannel.Error', 'goog.net.BrowserChannel.Event', 'goog.net.BrowserChannel.Handler', 'goog.net.BrowserChannel.LogSaver', 'goog.net.BrowserChannel.QueuedMap', 'goog.net.BrowserChannel.ServerReachability', 'goog.net.BrowserChannel.ServerReachabilityEvent', 'goog.net.BrowserChannel.Stat', 'goog.net.BrowserChannel.StatEvent', 'goog.net.BrowserChannel.State', 'goog.net.BrowserChannel.TimingEvent'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug.TextFormatter', 'goog.events.Event', 'goog.events.EventTarget', 'goog.json', 'goog.json.EvalJsonProcessor', 'goog.log', 'goog.net.BrowserTestChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.XhrIo', 'goog.net.tmpnetwork', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.CircularBuffer'], {});
+goog.addDependency('net/browserchannel_test.js', ['goog.net.BrowserChannelTest'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.functions', 'goog.json', 'goog.net.BrowserChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.tmpnetwork', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/browsertestchannel.js', ['goog.net.BrowserTestChannel'], ['goog.json.EvalJsonProcessor', 'goog.net.ChannelRequest', 'goog.net.ChannelRequest.Error', 'goog.net.tmpnetwork', 'goog.string.Parser'], {});
+goog.addDependency('net/bulkloader.js', ['goog.net.BulkLoader'], ['goog.events.EventHandler', 'goog.events.EventTarget', 'goog.log', 'goog.net.BulkLoaderHelper', 'goog.net.EventType', 'goog.net.XhrIo'], {});
+goog.addDependency('net/bulkloader_test.js', ['goog.net.BulkLoaderTest'], ['goog.events.Event', 'goog.events.EventHandler', 'goog.net.BulkLoader', 'goog.net.EventType', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('net/bulkloaderhelper.js', ['goog.net.BulkLoaderHelper'], ['goog.Disposable'], {});
+goog.addDependency('net/channeldebug.js', ['goog.net.ChannelDebug'], ['goog.json', 'goog.log'], {});
+goog.addDependency('net/channelrequest.js', ['goog.net.ChannelRequest', 'goog.net.ChannelRequest.Error'], ['goog.Timer', 'goog.async.Throttle', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events.EventHandler', 'goog.html.SafeUrl', 'goog.html.uncheckedconversions', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('net/channelrequest_test.js', ['goog.net.ChannelRequestTest'], ['goog.Uri', 'goog.functions', 'goog.net.BrowserChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/cookies.js', ['goog.net.Cookies', 'goog.net.cookies'], [], {});
+goog.addDependency('net/cookies_test.js', ['goog.net.cookiesTest'], ['goog.array', 'goog.net.cookies', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('net/corsxmlhttpfactory.js', ['goog.net.CorsXmlHttpFactory', 'goog.net.IeCorsXhrAdapter'], ['goog.net.HttpStatus', 'goog.net.XhrLike', 'goog.net.XmlHttp', 'goog.net.XmlHttpFactory'], {});
+goog.addDependency('net/corsxmlhttpfactory_test.js', ['goog.net.CorsXmlHttpFactoryTest'], ['goog.net.CorsXmlHttpFactory', 'goog.net.IeCorsXhrAdapter', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('net/crossdomainrpc.js', ['goog.net.CrossDomainRpc'], ['goog.Uri', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.html.SafeHtml', 'goog.json', 'goog.log', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('net/crossdomainrpc_test.js', ['goog.net.CrossDomainRpcTest'], ['goog.Promise', 'goog.log', 'goog.net.CrossDomainRpc', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('net/errorcode.js', ['goog.net.ErrorCode'], [], {});
+goog.addDependency('net/eventtype.js', ['goog.net.EventType'], [], {});
+goog.addDependency('net/fetchxmlhttpfactory.js', ['goog.net.FetchXmlHttp', 'goog.net.FetchXmlHttpFactory'], ['goog.asserts', 'goog.events.EventTarget', 'goog.functions', 'goog.log', 'goog.net.XhrLike', 'goog.net.XmlHttpFactory'], {});
+goog.addDependency('net/fetchxmlhttpfactory_test.js', ['goog.net.FetchXmlHttpFactoryTest'], ['goog.net.FetchXmlHttp', 'goog.net.FetchXmlHttpFactory', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('net/filedownloader.js', ['goog.net.FileDownloader', 'goog.net.FileDownloader.Error'], ['goog.Disposable', 'goog.asserts', 'goog.async.Deferred', 'goog.crypt.hash32', 'goog.debug.Error', 'goog.events', 'goog.events.EventHandler', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrIoPool', 'goog.object'], {});
+goog.addDependency('net/filedownloader_test.js', ['goog.net.FileDownloaderTest'], ['goog.fs.Error', 'goog.net.ErrorCode', 'goog.net.FileDownloader', 'goog.net.XhrIo', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.fs', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit', 'goog.testing.net.XhrIoPool'], {});
+goog.addDependency('net/httpstatus.js', ['goog.net.HttpStatus'], [], {});
+goog.addDependency('net/iframeio.js', ['goog.net.IframeIo', 'goog.net.IframeIo.IncrementalDataEvent'], ['goog.Timer', 'goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.html.uncheckedconversions', 'goog.json', 'goog.log', 'goog.log.Level', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.reflect', 'goog.string', 'goog.string.Const', 'goog.structs', 'goog.userAgent'], {});
+goog.addDependency('net/iframeio_different_base_test.js', ['goog.net.iframeIoDifferentBaseTest'], ['goog.Promise', 'goog.events', 'goog.net.EventType', 'goog.net.IframeIo', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('net/iframeio_test.js', ['goog.net.IframeIoTest'], ['goog.debug', 'goog.debug.DivConsole', 'goog.debug.LogManager', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.log', 'goog.log.Level', 'goog.net.IframeIo', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('net/iframeloadmonitor.js', ['goog.net.IframeLoadMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent'], {});
+goog.addDependency('net/iframeloadmonitor_test.js', ['goog.net.IframeLoadMonitorTest'], ['goog.Promise', 'goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.net.IframeLoadMonitor', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('net/imageloader.js', ['goog.net.ImageLoader'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.net.EventType', 'goog.object', 'goog.userAgent'], {});
+goog.addDependency('net/imageloader_test.js', ['goog.net.ImageLoaderTest'], ['goog.Promise', 'goog.Timer', 'goog.array', 'goog.dispose', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.net.EventType', 'goog.net.ImageLoader', 'goog.object', 'goog.string', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/ipaddress.js', ['goog.net.IpAddress', 'goog.net.Ipv4Address', 'goog.net.Ipv6Address'], ['goog.array', 'goog.math.Integer', 'goog.object', 'goog.string'], {});
+goog.addDependency('net/ipaddress_test.js', ['goog.net.IpAddressTest'], ['goog.math.Integer', 'goog.net.IpAddress', 'goog.net.Ipv4Address', 'goog.net.Ipv6Address', 'goog.testing.jsunit'], {});
+goog.addDependency('net/jsloader.js', ['goog.net.jsloader', 'goog.net.jsloader.Error', 'goog.net.jsloader.ErrorCode', 'goog.net.jsloader.Options'], ['goog.array', 'goog.async.Deferred', 'goog.debug.Error', 'goog.dom', 'goog.dom.TagName', 'goog.object'], {});
+goog.addDependency('net/jsloader_test.js', ['goog.net.jsloaderTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.net.jsloader', 'goog.net.jsloader.ErrorCode', 'goog.testing.jsunit'], {});
+goog.addDependency('net/jsonp.js', ['goog.net.Jsonp'], ['goog.Uri', 'goog.net.jsloader'], {});
+goog.addDependency('net/jsonp_test.js', ['goog.net.JsonpTest'], ['goog.net.Jsonp', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('net/mockiframeio.js', ['goog.net.MockIFrameIo'], ['goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.IframeIo'], {});
+goog.addDependency('net/multiiframeloadmonitor.js', ['goog.net.MultiIframeLoadMonitor'], ['goog.events', 'goog.net.IframeLoadMonitor'], {});
+goog.addDependency('net/multiiframeloadmonitor_test.js', ['goog.net.MultiIframeLoadMonitorTest'], ['goog.Promise', 'goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.net.IframeLoadMonitor', 'goog.net.MultiIframeLoadMonitor', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('net/networkstatusmonitor.js', ['goog.net.NetworkStatusMonitor'], ['goog.events.Listenable'], {});
+goog.addDependency('net/networktester.js', ['goog.net.NetworkTester'], ['goog.Timer', 'goog.Uri', 'goog.log'], {});
+goog.addDependency('net/networktester_test.js', ['goog.net.NetworkTesterTest'], ['goog.Uri', 'goog.net.NetworkTester', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('net/streams/jsonstreamparser.js', ['goog.net.streams.JsonStreamParser'], ['goog.asserts', 'goog.json', 'goog.net.streams.StreamParser'], {});
+goog.addDependency('net/streams/jsonstreamparser_test.js', ['goog.net.streams.JsonStreamParserTest'], ['goog.array', 'goog.json', 'goog.labs.testing.JsonFuzzing', 'goog.net.streams.JsonStreamParser', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.uri.utils'], {});
+goog.addDependency('net/streams/nodereadablestream.js', ['goog.net.streams.NodeReadableStream'], [], {});
+goog.addDependency('net/streams/pbstreamparser.js', ['goog.net.streams.PbStreamParser'], ['goog.asserts', 'goog.net.streams.StreamParser'], {});
+goog.addDependency('net/streams/streamfactory.js', ['goog.net.streams.createXhrNodeReadableStream'], ['goog.asserts', 'goog.net.streams.XhrNodeReadableStream', 'goog.net.streams.XhrStreamReader'], {});
+goog.addDependency('net/streams/streamparser.js', ['goog.net.streams.StreamParser'], [], {});
+goog.addDependency('net/streams/xhrnodereadablestream.js', ['goog.net.streams.XhrNodeReadableStream'], ['goog.array', 'goog.log', 'goog.net.streams.NodeReadableStream', 'goog.net.streams.XhrStreamReader'], {});
+goog.addDependency('net/streams/xhrnodereadablestream_test.js', ['goog.net.streams.XhrNodeReadableStreamTest'], ['goog.net.streams.NodeReadableStream', 'goog.net.streams.XhrNodeReadableStream', 'goog.net.streams.XhrStreamReader', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('net/streams/xhrstreamreader.js', ['goog.net.streams.XhrStreamReader'], ['goog.events.EventHandler', 'goog.log', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.net.streams.JsonStreamParser', 'goog.net.streams.PbStreamParser', 'goog.userAgent'], {});
+goog.addDependency('net/streams/xhrstreamreader_test.js', ['goog.net.streams.XhrStreamReaderTest'], ['goog.net.ErrorCode', 'goog.net.XmlHttp', 'goog.net.streams.XhrStreamReader', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.net.XhrIo'], {});
+goog.addDependency('net/testdata/jsloader_test1.js', ['goog.net.testdata.jsloader_test1'], [], {});
+goog.addDependency('net/testdata/jsloader_test2.js', ['goog.net.testdata.jsloader_test2'], [], {});
+goog.addDependency('net/testdata/jsloader_test3.js', ['goog.net.testdata.jsloader_test3'], [], {});
+goog.addDependency('net/testdata/jsloader_test4.js', ['goog.net.testdata.jsloader_test4'], [], {});
+goog.addDependency('net/tmpnetwork.js', ['goog.net.tmpnetwork'], ['goog.Uri', 'goog.net.ChannelDebug'], {});
+goog.addDependency('net/websocket.js', ['goog.net.WebSocket', 'goog.net.WebSocket.ErrorEvent', 'goog.net.WebSocket.EventType', 'goog.net.WebSocket.MessageEvent'], ['goog.Timer', 'goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.log'], {});
+goog.addDependency('net/websocket_test.js', ['goog.net.WebSocketTest'], ['goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.functions', 'goog.net.WebSocket', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/wrapperxmlhttpfactory.js', ['goog.net.WrapperXmlHttpFactory'], ['goog.net.XhrLike', 'goog.net.XmlHttpFactory'], {});
+goog.addDependency('net/xhrio.js', ['goog.net.XhrIo', 'goog.net.XhrIo.ResponseType'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events.EventTarget', 'goog.json', 'goog.log', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.userAgent'], {});
+goog.addDependency('net/xhrio_test.js', ['goog.net.XhrIoTest'], ['goog.Uri', 'goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.functions', 'goog.net.EventType', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction', 'goog.userAgent.product'], {});
+goog.addDependency('net/xhriopool.js', ['goog.net.XhrIoPool'], ['goog.net.XhrIo', 'goog.structs.PriorityPool'], {});
+goog.addDependency('net/xhriopool_test.js', ['goog.net.XhrIoPoolTest'], ['goog.net.XhrIoPool', 'goog.structs.Map', 'goog.testing.jsunit'], {});
+goog.addDependency('net/xhrlike.js', ['goog.net.XhrLike'], [], {});
+goog.addDependency('net/xhrmanager.js', ['goog.net.XhrManager', 'goog.net.XhrManager.Event', 'goog.net.XhrManager.Request'], ['goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrIoPool', 'goog.structs.Map'], {});
+goog.addDependency('net/xhrmanager_test.js', ['goog.net.XhrManagerTest'], ['goog.events', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrManager', 'goog.testing.jsunit', 'goog.testing.net.XhrIoPool', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/xmlhttp.js', ['goog.net.DefaultXmlHttpFactory', 'goog.net.XmlHttp', 'goog.net.XmlHttp.OptionType', 'goog.net.XmlHttp.ReadyState', 'goog.net.XmlHttpDefines'], ['goog.asserts', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XmlHttpFactory'], {});
+goog.addDependency('net/xmlhttpfactory.js', ['goog.net.XmlHttpFactory'], ['goog.net.XhrLike'], {});
+goog.addDependency('net/xpc/crosspagechannel.js', ['goog.net.xpc.CrossPageChannel'], ['goog.Uri', 'goog.async.Deferred', 'goog.async.Delay', 'goog.dispose', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.messaging.AbstractChannel', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.ChannelStates', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.DirectTransport', 'goog.net.xpc.FrameElementMethodTransport', 'goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframeRelayTransport', 'goog.net.xpc.NativeMessagingTransport', 'goog.net.xpc.NixTransport', 'goog.net.xpc.TransportTypes', 'goog.net.xpc.UriCfgFields', 'goog.string', 'goog.uri.utils', 'goog.userAgent'], {});
+goog.addDependency('net/xpc/crosspagechannel_test.js', ['goog.net.xpc.CrossPageChannelTest'], ['goog.Disposable', 'goog.Promise', 'goog.Timer', 'goog.Uri', 'goog.dom', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('net/xpc/crosspagechannelrole.js', ['goog.net.xpc.CrossPageChannelRole'], [], {});
+goog.addDependency('net/xpc/directtransport.js', ['goog.net.xpc.DirectTransport'], ['goog.Timer', 'goog.async.Deferred', 'goog.events.EventHandler', 'goog.log', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.object'], {});
+goog.addDependency('net/xpc/directtransport_test.js', ['goog.net.xpc.DirectTransportTest'], ['goog.Promise', 'goog.dom', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('net/xpc/frameelementmethodtransport.js', ['goog.net.xpc.FrameElementMethodTransport'], ['goog.log', 'goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes'], {});
+goog.addDependency('net/xpc/iframepollingtransport.js', ['goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframePollingTransport.Receiver', 'goog.net.xpc.IframePollingTransport.Sender'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.userAgent'], {});
+goog.addDependency('net/xpc/iframepollingtransport_test.js', ['goog.net.xpc.IframePollingTransportTest'], ['goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.object', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/xpc/iframerelaytransport.js', ['goog.net.xpc.IframeRelayTransport'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.html.SafeHtml', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('net/xpc/nativemessagingtransport.js', ['goog.net.xpc.NativeMessagingTransport'], ['goog.Timer', 'goog.asserts', 'goog.async.Deferred', 'goog.events', 'goog.events.EventHandler', 'goog.log', 'goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes'], {});
+goog.addDependency('net/xpc/nativemessagingtransport_test.js', ['goog.net.xpc.NativeMessagingTransportTest'], ['goog.dom', 'goog.events', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.NativeMessagingTransport', 'goog.testing.jsunit'], {});
+goog.addDependency('net/xpc/nixtransport.js', ['goog.net.xpc.NixTransport'], ['goog.log', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.reflect'], {});
+goog.addDependency('net/xpc/relay.js', ['goog.net.xpc.relay'], [], {});
+goog.addDependency('net/xpc/transport.js', ['goog.net.xpc.Transport'], ['goog.Disposable', 'goog.dom', 'goog.net.xpc.TransportNames'], {});
+goog.addDependency('net/xpc/xpc.js', ['goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.ChannelStates', 'goog.net.xpc.TransportNames', 'goog.net.xpc.TransportTypes', 'goog.net.xpc.UriCfgFields'], ['goog.log'], {});
+goog.addDependency('object/object.js', ['goog.object'], [], {});
+goog.addDependency('object/object_test.js', ['goog.objectTest'], ['goog.functions', 'goog.object', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('positioning/absoluteposition.js', ['goog.positioning.AbsolutePosition'], ['goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AbstractPosition'], {});
+goog.addDependency('positioning/abstractposition.js', ['goog.positioning.AbstractPosition'], [], {});
+goog.addDependency('positioning/anchoredposition.js', ['goog.positioning.AnchoredPosition'], ['goog.positioning', 'goog.positioning.AbstractPosition'], {});
+goog.addDependency('positioning/anchoredposition_test.js', ['goog.positioning.AnchoredPositionTest'], ['goog.dom', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.style', 'goog.testing.jsunit'], {});
+goog.addDependency('positioning/anchoredviewportposition.js', ['goog.positioning.AnchoredViewportPosition'], ['goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus'], {});
+goog.addDependency('positioning/anchoredviewportposition_test.js', ['goog.positioning.AnchoredViewportPositionTest'], ['goog.dom', 'goog.math.Box', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.OverflowStatus', 'goog.style', 'goog.testing.jsunit'], {});
+goog.addDependency('positioning/clientposition.js', ['goog.positioning.ClientPosition'], ['goog.asserts', 'goog.dom', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AbstractPosition', 'goog.style'], {});
+goog.addDependency('positioning/clientposition_test.js', ['goog.positioning.clientPositionTest'], ['goog.dom', 'goog.dom.TagName', 'goog.positioning.ClientPosition', 'goog.positioning.Corner', 'goog.style', 'goog.testing.jsunit'], {});
+goog.addDependency('positioning/menuanchoredposition.js', ['goog.positioning.MenuAnchoredPosition'], ['goog.positioning.AnchoredViewportPosition', 'goog.positioning.Overflow'], {});
+goog.addDependency('positioning/menuanchoredposition_test.js', ['goog.positioning.MenuAnchoredPositionTest'], ['goog.dom', 'goog.dom.TagName', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.testing.jsunit'], {});
+goog.addDependency('positioning/positioning.js', ['goog.positioning', 'goog.positioning.Corner', 'goog.positioning.CornerBit', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.style', 'goog.style.bidi'], {});
+goog.addDependency('positioning/positioning_test.js', ['goog.positioningTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('positioning/viewportclientposition.js', ['goog.positioning.ViewportClientPosition'], ['goog.dom', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.ClientPosition', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.style'], {});
+goog.addDependency('positioning/viewportclientposition_test.js', ['goog.positioning.ViewportClientPositionTest'], ['goog.dom', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.ViewportClientPosition', 'goog.style', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('positioning/viewportposition.js', ['goog.positioning.ViewportPosition'], ['goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AbstractPosition', 'goog.positioning.Corner', 'goog.style'], {});
+goog.addDependency('promise/promise.js', ['goog.Promise'], ['goog.Thenable', 'goog.asserts', 'goog.async.FreeList', 'goog.async.run', 'goog.async.throwException', 'goog.debug.Error', 'goog.promise.Resolver'], {});
+goog.addDependency('promise/promise_test.js', ['goog.PromiseTest'], ['goog.Promise', 'goog.Thenable', 'goog.Timer', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('promise/resolver.js', ['goog.promise.Resolver'], [], {});
+goog.addDependency('promise/testsuiteadapter.js', ['goog.promise.testSuiteAdapter'], ['goog.Promise'], {});
+goog.addDependency('promise/thenable.js', ['goog.Thenable'], [], {});
+goog.addDependency('proto/proto.js', ['goog.proto'], ['goog.proto.Serializer'], {});
+goog.addDependency('proto/serializer.js', ['goog.proto.Serializer'], ['goog.json.Serializer', 'goog.string'], {});
+goog.addDependency('proto/serializer_test.js', ['goog.protoTest'], ['goog.proto', 'goog.testing.jsunit'], {});
+goog.addDependency('proto2/descriptor.js', ['goog.proto2.Descriptor', 'goog.proto2.Metadata'], ['goog.array', 'goog.asserts', 'goog.object', 'goog.string'], {});
+goog.addDependency('proto2/descriptor_test.js', ['goog.proto2.DescriptorTest'], ['goog.proto2.Descriptor', 'goog.proto2.Message', 'goog.testing.jsunit'], {});
+goog.addDependency('proto2/fielddescriptor.js', ['goog.proto2.FieldDescriptor'], ['goog.asserts', 'goog.string'], {});
+goog.addDependency('proto2/fielddescriptor_test.js', ['goog.proto2.FieldDescriptorTest'], ['goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.testing.jsunit'], {});
+goog.addDependency('proto2/lazydeserializer.js', ['goog.proto2.LazyDeserializer'], ['goog.asserts', 'goog.proto2.Message', 'goog.proto2.Serializer'], {});
+goog.addDependency('proto2/message.js', ['goog.proto2.Message'], ['goog.asserts', 'goog.proto2.Descriptor', 'goog.proto2.FieldDescriptor'], {});
+goog.addDependency('proto2/message_test.js', ['goog.proto2.MessageTest'], ['goog.testing.TestCase', 'goog.testing.jsunit', 'proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup'], {});
+goog.addDependency('proto2/objectserializer.js', ['goog.proto2.ObjectSerializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.Serializer', 'goog.string'], {});
+goog.addDependency('proto2/objectserializer_test.js', ['goog.proto2.ObjectSerializerTest'], ['goog.proto2.ObjectSerializer', 'goog.proto2.Serializer', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'proto2.TestAllTypes'], {});
+goog.addDependency('proto2/package_test.pb.js', ['someprotopackage.TestPackageTypes'], ['goog.proto2.Message', 'proto2.TestAllTypes'], {});
+goog.addDependency('proto2/pbliteserializer.js', ['goog.proto2.PbLiteSerializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.LazyDeserializer', 'goog.proto2.Serializer'], {});
+goog.addDependency('proto2/pbliteserializer_test.js', ['goog.proto2.PbLiteSerializerTest'], ['goog.proto2.PbLiteSerializer', 'goog.testing.jsunit', 'proto2.TestAllTypes'], {});
+goog.addDependency('proto2/proto_test.js', ['goog.proto2.messageTest'], ['goog.proto2.FieldDescriptor', 'goog.testing.jsunit', 'proto2.TestAllTypes', 'proto2.TestDefaultParent', 'someprotopackage.TestPackageTypes'], {});
+goog.addDependency('proto2/serializer.js', ['goog.proto2.Serializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message'], {});
+goog.addDependency('proto2/test.pb.js', ['proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup', 'proto2.TestDefaultChild', 'proto2.TestDefaultParent'], ['goog.proto2.Message'], {});
+goog.addDependency('proto2/textformatserializer.js', ['goog.proto2.TextFormatSerializer'], ['goog.array', 'goog.asserts', 'goog.json', 'goog.math', 'goog.object', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.proto2.Serializer', 'goog.string'], {});
+goog.addDependency('proto2/textformatserializer_test.js', ['goog.proto2.TextFormatSerializerTest'], ['goog.proto2.ObjectSerializer', 'goog.proto2.TextFormatSerializer', 'goog.testing.jsunit', 'proto2.TestAllTypes'], {});
+goog.addDependency('proto2/util.js', ['goog.proto2.Util'], ['goog.asserts'], {});
+goog.addDependency('pubsub/pubsub.js', ['goog.pubsub.PubSub'], ['goog.Disposable', 'goog.array', 'goog.async.run'], {});
+goog.addDependency('pubsub/pubsub_test.js', ['goog.pubsub.PubSubTest'], ['goog.array', 'goog.pubsub.PubSub', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('pubsub/topicid.js', ['goog.pubsub.TopicId'], [], {});
+goog.addDependency('pubsub/typedpubsub.js', ['goog.pubsub.TypedPubSub'], ['goog.Disposable', 'goog.pubsub.PubSub'], {});
+goog.addDependency('pubsub/typedpubsub_test.js', ['goog.pubsub.TypedPubSubTest'], ['goog.array', 'goog.pubsub.TopicId', 'goog.pubsub.TypedPubSub', 'goog.testing.jsunit'], {});
+goog.addDependency('reflect/reflect.js', ['goog.reflect'], [], {});
+goog.addDependency('reflect/reflect_test.js', ['goog.reflectTest'], ['goog.object', 'goog.reflect', 'goog.testing.jsunit'], {});
+goog.addDependency('result/deferredadaptor.js', ['goog.result.DeferredAdaptor'], ['goog.async.Deferred', 'goog.result', 'goog.result.Result'], {});
+goog.addDependency('result/dependentresult.js', ['goog.result.DependentResult'], ['goog.result.Result'], {});
+goog.addDependency('result/result_interface.js', ['goog.result.Result'], ['goog.Thenable'], {});
+goog.addDependency('result/resultutil.js', ['goog.result'], ['goog.array', 'goog.result.DependentResult', 'goog.result.Result', 'goog.result.SimpleResult'], {});
+goog.addDependency('result/simpleresult.js', ['goog.result.SimpleResult', 'goog.result.SimpleResult.StateError'], ['goog.Promise', 'goog.Thenable', 'goog.debug.Error', 'goog.result.Result'], {});
+goog.addDependency('soy/data.js', ['goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.soy.data.SanitizedCss', 'goog.soy.data.UnsanitizedText'], ['goog.html.SafeHtml', 'goog.html.uncheckedconversions', 'goog.string.Const'], {});
+goog.addDependency('soy/data_test.js', ['goog.soy.dataTest'], ['goog.html.SafeHtml', 'goog.soy.testHelper', 'goog.testing.jsunit'], {});
+goog.addDependency('soy/renderer.js', ['goog.soy.InjectedDataSupplier', 'goog.soy.Renderer'], ['goog.asserts', 'goog.dom', 'goog.html.uncheckedconversions', 'goog.soy', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.string.Const'], {});
+goog.addDependency('soy/renderer_test.js', ['goog.soy.RendererTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.html.SafeHtml', 'goog.i18n.bidi.Dir', 'goog.soy.Renderer', 'goog.soy.data.SanitizedContentKind', 'goog.soy.testHelper', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('soy/soy.js', ['goog.soy'], ['goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.html.legacyconversions', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.string'], {});
+goog.addDependency('soy/soy_test.js', ['goog.soyTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.functions', 'goog.soy', 'goog.soy.testHelper', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('soy/soy_testhelper.js', ['goog.soy.testHelper'], ['goog.dom', 'goog.dom.TagName', 'goog.i18n.bidi.Dir', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('spell/spellcheck.js', ['goog.spell.SpellCheck', 'goog.spell.SpellCheck.WordChangedEvent'], ['goog.Timer', 'goog.events.Event', 'goog.events.EventTarget', 'goog.structs.Set'], {});
+goog.addDependency('spell/spellcheck_test.js', ['goog.spell.SpellCheckTest'], ['goog.spell.SpellCheck', 'goog.testing.jsunit'], {});
+goog.addDependency('stats/basicstat.js', ['goog.stats.BasicStat'], ['goog.asserts', 'goog.log', 'goog.string.format', 'goog.structs.CircularBuffer'], {});
+goog.addDependency('stats/basicstat_test.js', ['goog.stats.BasicStatTest'], ['goog.array', 'goog.stats.BasicStat', 'goog.string.format', 'goog.testing.PseudoRandom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('storage/collectablestorage.js', ['goog.storage.CollectableStorage'], ['goog.array', 'goog.iter', 'goog.storage.ErrorCode', 'goog.storage.ExpiringStorage', 'goog.storage.RichStorage'], {});
+goog.addDependency('storage/collectablestorage_test.js', ['goog.storage.CollectableStorageTest'], ['goog.storage.CollectableStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storage_test', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('storage/collectablestoragetester.js', ['goog.storage.collectableStorageTester'], ['goog.testing.asserts'], {});
+goog.addDependency('storage/encryptedstorage.js', ['goog.storage.EncryptedStorage'], ['goog.crypt', 'goog.crypt.Arc4', 'goog.crypt.Sha1', 'goog.crypt.base64', 'goog.json', 'goog.json.Serializer', 'goog.storage.CollectableStorage', 'goog.storage.ErrorCode', 'goog.storage.RichStorage'], {});
+goog.addDependency('storage/encryptedstorage_test.js', ['goog.storage.EncryptedStorageTest'], ['goog.json', 'goog.storage.EncryptedStorage', 'goog.storage.ErrorCode', 'goog.storage.RichStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storage_test', 'goog.testing.MockClock', 'goog.testing.PseudoRandom', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('storage/errorcode.js', ['goog.storage.ErrorCode'], [], {});
+goog.addDependency('storage/expiringstorage.js', ['goog.storage.ExpiringStorage'], ['goog.storage.RichStorage'], {});
+goog.addDependency('storage/expiringstorage_test.js', ['goog.storage.ExpiringStorageTest'], ['goog.storage.ExpiringStorage', 'goog.storage.storage_test', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('storage/mechanism/errorcode.js', ['goog.storage.mechanism.ErrorCode'], [], {});
+goog.addDependency('storage/mechanism/errorhandlingmechanism.js', ['goog.storage.mechanism.ErrorHandlingMechanism'], ['goog.storage.mechanism.Mechanism'], {});
+goog.addDependency('storage/mechanism/errorhandlingmechanism_test.js', ['goog.storage.mechanism.ErrorHandlingMechanismTest'], ['goog.storage.mechanism.ErrorHandlingMechanism', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('storage/mechanism/html5localstorage.js', ['goog.storage.mechanism.HTML5LocalStorage'], ['goog.storage.mechanism.HTML5WebStorage'], {});
+goog.addDependency('storage/mechanism/html5localstorage_test.js', ['goog.storage.mechanism.HTML5LocalStorageTest'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('storage/mechanism/html5sessionstorage.js', ['goog.storage.mechanism.HTML5SessionStorage'], ['goog.storage.mechanism.HTML5WebStorage'], {});
+goog.addDependency('storage/mechanism/html5sessionstorage_test.js', ['goog.storage.mechanism.HTML5SessionStorageTest'], ['goog.storage.mechanism.HTML5SessionStorage', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('storage/mechanism/html5webstorage.js', ['goog.storage.mechanism.HTML5WebStorage'], ['goog.asserts', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.IterableMechanism'], {});
+goog.addDependency('storage/mechanism/html5webstorage_test.js', ['goog.storage.mechanism.HTML5MockStorage', 'goog.storage.mechanism.HTML5WebStorageTest', 'goog.storage.mechanism.MockThrowableStorage'], ['goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.HTML5WebStorage', 'goog.testing.jsunit'], {});
+goog.addDependency('storage/mechanism/ieuserdata.js', ['goog.storage.mechanism.IEUserData'], ['goog.asserts', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.IterableMechanism', 'goog.structs.Map', 'goog.userAgent'], {});
+goog.addDependency('storage/mechanism/ieuserdata_test.js', ['goog.storage.mechanism.IEUserDataTest'], ['goog.storage.mechanism.IEUserData', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('storage/mechanism/iterablemechanism.js', ['goog.storage.mechanism.IterableMechanism'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.storage.mechanism.Mechanism'], {});
+goog.addDependency('storage/mechanism/iterablemechanismtester.js', ['goog.storage.mechanism.iterableMechanismTester'], ['goog.iter', 'goog.iter.StopIteration', 'goog.testing.asserts'], {});
+goog.addDependency('storage/mechanism/mechanism.js', ['goog.storage.mechanism.Mechanism'], [], {});
+goog.addDependency('storage/mechanism/mechanismfactory.js', ['goog.storage.mechanism.mechanismfactory'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.HTML5SessionStorage', 'goog.storage.mechanism.IEUserData', 'goog.storage.mechanism.PrefixedMechanism'], {});
+goog.addDependency('storage/mechanism/mechanismfactory_test.js', ['goog.storage.mechanism.mechanismfactoryTest'], ['goog.storage.mechanism.mechanismfactory', 'goog.testing.jsunit'], {});
+goog.addDependency('storage/mechanism/mechanismseparationtester.js', ['goog.storage.mechanism.mechanismSeparationTester'], ['goog.iter.StopIteration', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.asserts'], {});
+goog.addDependency('storage/mechanism/mechanismsharingtester.js', ['goog.storage.mechanism.mechanismSharingTester'], ['goog.iter.StopIteration', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.asserts'], {});
+goog.addDependency('storage/mechanism/mechanismtestdefinition.js', ['goog.storage.mechanism.mechanismTestDefinition'], [], {});
+goog.addDependency('storage/mechanism/mechanismtester.js', ['goog.storage.mechanism.mechanismTester'], ['goog.storage.mechanism.ErrorCode', 'goog.testing.asserts', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('storage/mechanism/prefixedmechanism.js', ['goog.storage.mechanism.PrefixedMechanism'], ['goog.iter.Iterator', 'goog.storage.mechanism.IterableMechanism'], {});
+goog.addDependency('storage/mechanism/prefixedmechanism_test.js', ['goog.storage.mechanism.PrefixedMechanismTest'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.PrefixedMechanism', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.testing.jsunit'], {});
+goog.addDependency('storage/richstorage.js', ['goog.storage.RichStorage', 'goog.storage.RichStorage.Wrapper'], ['goog.storage.ErrorCode', 'goog.storage.Storage'], {});
+goog.addDependency('storage/richstorage_test.js', ['goog.storage.RichStorageTest'], ['goog.storage.ErrorCode', 'goog.storage.RichStorage', 'goog.storage.storage_test', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('storage/storage.js', ['goog.storage.Storage'], ['goog.json', 'goog.storage.ErrorCode'], {});
+goog.addDependency('storage/storage_test.js', ['goog.storage.storage_test'], ['goog.structs.Map', 'goog.testing.asserts'], {});
+goog.addDependency('string/const.js', ['goog.string.Const'], ['goog.asserts', 'goog.string.TypedString'], {});
+goog.addDependency('string/const_test.js', ['goog.string.constTest'], ['goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('string/linkify.js', ['goog.string.linkify'], ['goog.html.SafeHtml', 'goog.string'], {});
+goog.addDependency('string/linkify_test.js', ['goog.string.linkifyTest'], ['goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.string', 'goog.string.linkify', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('string/newlines.js', ['goog.string.newlines', 'goog.string.newlines.Line'], ['goog.array'], {});
+goog.addDependency('string/newlines_test.js', ['goog.string.newlinesTest'], ['goog.string.newlines', 'goog.testing.jsunit'], {});
+goog.addDependency('string/parser.js', ['goog.string.Parser'], [], {});
+goog.addDependency('string/path.js', ['goog.string.path'], ['goog.array', 'goog.string'], {});
+goog.addDependency('string/path_test.js', ['goog.string.pathTest'], ['goog.string.path', 'goog.testing.jsunit'], {});
+goog.addDependency('string/string.js', ['goog.string', 'goog.string.Unicode'], [], {});
+goog.addDependency('string/string_test.js', ['goog.stringTest'], ['goog.dom.TagName', 'goog.functions', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('string/stringbuffer.js', ['goog.string.StringBuffer'], [], {});
+goog.addDependency('string/stringbuffer_test.js', ['goog.string.StringBufferTest'], ['goog.string.StringBuffer', 'goog.testing.jsunit'], {});
+goog.addDependency('string/stringformat.js', ['goog.string.format'], ['goog.string'], {});
+goog.addDependency('string/stringformat_test.js', ['goog.string.formatTest'], ['goog.string.format', 'goog.testing.jsunit'], {});
+goog.addDependency('string/stringifier.js', ['goog.string.Stringifier'], [], {});
+goog.addDependency('string/typedstring.js', ['goog.string.TypedString'], [], {});
+goog.addDependency('structs/avltree.js', ['goog.structs.AvlTree', 'goog.structs.AvlTree.Node'], ['goog.structs.Collection'], {});
+goog.addDependency('structs/avltree_test.js', ['goog.structs.AvlTreeTest'], ['goog.array', 'goog.structs.AvlTree', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/circularbuffer.js', ['goog.structs.CircularBuffer'], [], {});
+goog.addDependency('structs/circularbuffer_test.js', ['goog.structs.CircularBufferTest'], ['goog.structs.CircularBuffer', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/collection.js', ['goog.structs.Collection'], [], {});
+goog.addDependency('structs/collection_test.js', ['goog.structs.CollectionTest'], ['goog.structs.AvlTree', 'goog.structs.Set', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/heap.js', ['goog.structs.Heap'], ['goog.array', 'goog.object', 'goog.structs.Node'], {});
+goog.addDependency('structs/heap_test.js', ['goog.structs.HeapTest'], ['goog.structs', 'goog.structs.Heap', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/inversionmap.js', ['goog.structs.InversionMap'], ['goog.array', 'goog.asserts'], {});
+goog.addDependency('structs/inversionmap_test.js', ['goog.structs.InversionMapTest'], ['goog.structs.InversionMap', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/linkedmap.js', ['goog.structs.LinkedMap'], ['goog.structs.Map'], {});
+goog.addDependency('structs/linkedmap_test.js', ['goog.structs.LinkedMapTest'], ['goog.structs.LinkedMap', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('structs/map.js', ['goog.structs.Map'], ['goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.object'], {});
+goog.addDependency('structs/map_test.js', ['goog.structs.MapTest'], ['goog.iter', 'goog.structs', 'goog.structs.Map', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/node.js', ['goog.structs.Node'], [], {});
+goog.addDependency('structs/pool.js', ['goog.structs.Pool'], ['goog.Disposable', 'goog.structs.Queue', 'goog.structs.Set'], {});
+goog.addDependency('structs/pool_test.js', ['goog.structs.PoolTest'], ['goog.structs.Pool', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/prioritypool.js', ['goog.structs.PriorityPool'], ['goog.structs.Pool', 'goog.structs.PriorityQueue'], {});
+goog.addDependency('structs/prioritypool_test.js', ['goog.structs.PriorityPoolTest'], ['goog.structs.PriorityPool', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/priorityqueue.js', ['goog.structs.PriorityQueue'], ['goog.structs.Heap'], {});
+goog.addDependency('structs/priorityqueue_test.js', ['goog.structs.PriorityQueueTest'], ['goog.structs', 'goog.structs.PriorityQueue', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/quadtree.js', ['goog.structs.QuadTree', 'goog.structs.QuadTree.Node', 'goog.structs.QuadTree.Point'], ['goog.math.Coordinate'], {});
+goog.addDependency('structs/quadtree_test.js', ['goog.structs.QuadTreeTest'], ['goog.structs', 'goog.structs.QuadTree', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/queue.js', ['goog.structs.Queue'], ['goog.array'], {});
+goog.addDependency('structs/queue_test.js', ['goog.structs.QueueTest'], ['goog.structs.Queue', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/set.js', ['goog.structs.Set'], ['goog.structs', 'goog.structs.Collection', 'goog.structs.Map'], {});
+goog.addDependency('structs/set_test.js', ['goog.structs.SetTest'], ['goog.iter', 'goog.structs', 'goog.structs.Set', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/simplepool.js', ['goog.structs.SimplePool'], ['goog.Disposable'], {});
+goog.addDependency('structs/stringset.js', ['goog.structs.StringSet'], ['goog.asserts', 'goog.iter'], {});
+goog.addDependency('structs/stringset_test.js', ['goog.structs.StringSetTest'], ['goog.array', 'goog.iter', 'goog.structs.StringSet', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/structs.js', ['goog.structs'], ['goog.array', 'goog.object'], {});
+goog.addDependency('structs/structs_test.js', ['goog.structsTest'], ['goog.array', 'goog.dom.TagName', 'goog.structs', 'goog.structs.Map', 'goog.structs.Set', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/treenode.js', ['goog.structs.TreeNode'], ['goog.array', 'goog.asserts', 'goog.structs.Node'], {});
+goog.addDependency('structs/treenode_test.js', ['goog.structs.TreeNodeTest'], ['goog.structs.TreeNode', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/trie.js', ['goog.structs.Trie'], ['goog.object', 'goog.structs'], {});
+goog.addDependency('structs/trie_test.js', ['goog.structs.TrieTest'], ['goog.object', 'goog.structs', 'goog.structs.Trie', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/weak/weak.js', ['goog.structs.weak'], ['goog.userAgent'], {});
+goog.addDependency('structs/weak/weak_test.js', ['goog.structs.weakTest'], ['goog.array', 'goog.structs.weak', 'goog.testing.jsunit'], {});
+goog.addDependency('style/bidi.js', ['goog.style.bidi'], ['goog.dom', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('style/bidi_test.js', ['goog.style.bidiTest'], ['goog.dom', 'goog.style', 'goog.style.bidi', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('style/cursor.js', ['goog.style.cursor'], ['goog.userAgent'], {});
+goog.addDependency('style/cursor_test.js', ['goog.style.cursorTest'], ['goog.style.cursor', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('style/style.js', ['goog.style'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.vendor', 'goog.html.SafeStyleSheet', 'goog.html.legacyconversions', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.reflect', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('style/style_document_scroll_test.js', ['goog.style.style_document_scroll_test'], ['goog.dom', 'goog.style', 'goog.testing.jsunit'], {});
+goog.addDependency('style/style_test.js', ['goog.style_test'], ['goog.array', 'goog.color', 'goog.dom', 'goog.dom.TagName', 'goog.events.BrowserEvent', 'goog.html.testing', 'goog.labs.userAgent.util', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.MockUserAgent', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgentTestUtil', 'goog.userAgentTestUtil.UserAgents'], {});
+goog.addDependency('style/style_webkit_scrollbars_test.js', ['goog.style.webkitScrollbarsTest'], ['goog.asserts', 'goog.style', 'goog.styleScrollbarTester', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('style/stylescrollbartester.js', ['goog.styleScrollbarTester'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.asserts'], {});
+goog.addDependency('style/transform.js', ['goog.style.transform'], ['goog.functions', 'goog.math.Coordinate', 'goog.math.Coordinate3', 'goog.style', 'goog.userAgent', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('style/transform_test.js', ['goog.style.transformTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style.transform', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('style/transition.js', ['goog.style.transition', 'goog.style.transition.Css3Property'], ['goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.safe', 'goog.dom.vendor', 'goog.functions', 'goog.html.SafeHtml', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('style/transition_test.js', ['goog.style.transitionTest'], ['goog.style', 'goog.style.transition', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('test_module.js', ['goog.test_module'], ['goog.test_module_dep'], {'module': 'goog'});
+goog.addDependency('test_module_dep.js', ['goog.test_module_dep'], [], {'module': 'goog'});
+goog.addDependency('testing/asserts.js', ['goog.testing.JsUnitException', 'goog.testing.asserts'], ['goog.testing.stacktrace'], {});
+goog.addDependency('testing/asserts_test.js', ['goog.testing.assertsTest'], ['goog.array', 'goog.dom', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.labs.userAgent.browser', 'goog.string', 'goog.structs.Map', 'goog.structs.Set', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('testing/async/mockcontrol.js', ['goog.testing.async.MockControl'], ['goog.asserts', 'goog.async.Deferred', 'goog.debug', 'goog.testing.asserts', 'goog.testing.mockmatchers.IgnoreArgument'], {});
+goog.addDependency('testing/async/mockcontrol_test.js', ['goog.testing.async.MockControlTest'], ['goog.async.Deferred', 'goog.testing.MockControl', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.async.MockControl', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/asynctestcase.js', ['goog.testing.AsyncTestCase', 'goog.testing.AsyncTestCase.ControlBreakingException'], ['goog.testing.TestCase', 'goog.testing.asserts'], {});
+goog.addDependency('testing/asynctestcase_async_test.js', ['goog.testing.AsyncTestCaseAsyncTest'], ['goog.testing.AsyncTestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/asynctestcase_noasync_test.js', ['goog.testing.AsyncTestCaseSyncTest'], ['goog.testing.AsyncTestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/asynctestcase_test.js', ['goog.testing.AsyncTestCaseTest'], ['goog.debug.Error', 'goog.testing.AsyncTestCase', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/benchmark.js', ['goog.testing.benchmark'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTable', 'goog.testing.PerformanceTimer', 'goog.testing.TestCase'], {});
+goog.addDependency('testing/continuationtestcase.js', ['goog.testing.ContinuationTestCase', 'goog.testing.ContinuationTestCase.ContinuationTest', 'goog.testing.ContinuationTestCase.Step'], ['goog.array', 'goog.events.EventHandler', 'goog.testing.TestCase', 'goog.testing.asserts'], {});
+goog.addDependency('testing/continuationtestcase_test.js', ['goog.testing.ContinuationTestCaseTest'], ['goog.events', 'goog.events.EventTarget', 'goog.testing.ContinuationTestCase', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/deferredtestcase.js', ['goog.testing.DeferredTestCase'], ['goog.testing.AsyncTestCase', 'goog.testing.TestCase'], {});
+goog.addDependency('testing/deferredtestcase_test.js', ['goog.testing.DeferredTestCaseTest'], ['goog.async.Deferred', 'goog.testing.DeferredTestCase', 'goog.testing.TestCase', 'goog.testing.TestRunner', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('testing/dom.js', ['goog.testing.dom'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.iter', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.asserts', 'goog.userAgent'], {});
+goog.addDependency('testing/dom_test.js', ['goog.testing.domTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.TestCase', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('testing/editor/dom.js', ['goog.testing.editor.dom'], ['goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagWalkType', 'goog.iter', 'goog.string', 'goog.testing.asserts'], {});
+goog.addDependency('testing/editor/dom_test.js', ['goog.testing.editor.domTest'], ['goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.testing.TestCase', 'goog.testing.editor.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/editor/fieldmock.js', ['goog.testing.editor.FieldMock'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field', 'goog.testing.LooseMock', 'goog.testing.mockmatchers'], {});
+goog.addDependency('testing/editor/testhelper.js', ['goog.testing.editor.TestHelper'], ['goog.Disposable', 'goog.dom', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.node', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.testing.dom'], {});
+goog.addDependency('testing/editor/testhelper_test.js', ['goog.testing.editor.TestHelperTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.node', 'goog.testing.TestCase', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('testing/events/eventobserver.js', ['goog.testing.events.EventObserver'], ['goog.array'], {});
+goog.addDependency('testing/events/eventobserver_test.js', ['goog.testing.events.EventObserverTest'], ['goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.testing.events.EventObserver', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/events/events.js', ['goog.testing.events', 'goog.testing.events.Event'], ['goog.Disposable', 'goog.asserts', 'goog.dom.NodeType', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.object', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('testing/events/events_test.js', ['goog.testing.eventsTest'], ['goog.array', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('testing/events/matchers.js', ['goog.testing.events.EventMatcher'], ['goog.events.Event', 'goog.testing.mockmatchers.ArgumentMatcher'], {});
+goog.addDependency('testing/events/matchers_test.js', ['goog.testing.events.EventMatcherTest'], ['goog.events.Event', 'goog.testing.events.EventMatcher', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/events/onlinehandler.js', ['goog.testing.events.OnlineHandler'], ['goog.events.EventTarget', 'goog.net.NetworkStatusMonitor'], {});
+goog.addDependency('testing/events/onlinehandler_test.js', ['goog.testing.events.OnlineHandlerTest'], ['goog.events', 'goog.net.NetworkStatusMonitor', 'goog.testing.events.EventObserver', 'goog.testing.events.OnlineHandler', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/expectedfailures.js', ['goog.testing.ExpectedFailures'], ['goog.asserts', 'goog.debug.DivConsole', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.log', 'goog.style', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.asserts'], {});
+goog.addDependency('testing/expectedfailures_test.js', ['goog.testing.ExpectedFailuresTest'], ['goog.debug.Logger', 'goog.testing.ExpectedFailures', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/blob.js', ['goog.testing.fs.Blob'], ['goog.crypt', 'goog.crypt.base64'], {});
+goog.addDependency('testing/fs/blob_test.js', ['goog.testing.fs.BlobTest'], ['goog.dom', 'goog.testing.fs.Blob', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/directoryentry_test.js', ['goog.testing.fs.DirectoryEntryTest'], ['goog.array', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.testing.MockClock', 'goog.testing.TestCase', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/entry.js', ['goog.testing.fs.DirectoryEntry', 'goog.testing.fs.Entry', 'goog.testing.fs.FileEntry'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.async.Deferred', 'goog.fs.DirectoryEntry', 'goog.fs.DirectoryEntryImpl', 'goog.fs.Entry', 'goog.fs.Error', 'goog.fs.FileEntry', 'goog.functions', 'goog.object', 'goog.string', 'goog.testing.fs.File', 'goog.testing.fs.FileWriter'], {});
+goog.addDependency('testing/fs/entry_test.js', ['goog.testing.fs.EntryTest'], ['goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.testing.MockClock', 'goog.testing.TestCase', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/file.js', ['goog.testing.fs.File'], ['goog.testing.fs.Blob'], {});
+goog.addDependency('testing/fs/fileentry_test.js', ['goog.testing.fs.FileEntryTest'], ['goog.testing.MockClock', 'goog.testing.fs.FileEntry', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/filereader.js', ['goog.testing.fs.FileReader'], ['goog.Timer', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.testing.fs.ProgressEvent'], {});
+goog.addDependency('testing/fs/filereader_test.js', ['goog.testing.fs.FileReaderTest'], ['goog.Promise', 'goog.array', 'goog.events', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.object', 'goog.testing.events.EventObserver', 'goog.testing.fs.FileReader', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/filesystem.js', ['goog.testing.fs.FileSystem'], ['goog.fs.FileSystem', 'goog.testing.fs.DirectoryEntry'], {});
+goog.addDependency('testing/fs/filewriter.js', ['goog.testing.fs.FileWriter'], ['goog.Timer', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.string', 'goog.testing.fs.ProgressEvent'], {});
+goog.addDependency('testing/fs/filewriter_test.js', ['goog.testing.fs.FileWriterTest'], ['goog.Promise', 'goog.array', 'goog.events', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.object', 'goog.testing.MockClock', 'goog.testing.events.EventObserver', 'goog.testing.fs.Blob', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/fs.js', ['goog.testing.fs'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.fs', 'goog.testing.fs.Blob', 'goog.testing.fs.FileSystem'], {});
+goog.addDependency('testing/fs/fs_test.js', ['goog.testing.fsTest'], ['goog.testing.fs', 'goog.testing.fs.Blob', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/integration_test.js', ['goog.testing.fs.integrationTest'], ['goog.Promise', 'goog.events', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.testing.PropertyReplacer', 'goog.testing.fs', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/progressevent.js', ['goog.testing.fs.ProgressEvent'], ['goog.events.Event'], {});
+goog.addDependency('testing/functionmock.js', ['goog.testing', 'goog.testing.FunctionMock', 'goog.testing.GlobalFunctionMock', 'goog.testing.MethodMock'], ['goog.object', 'goog.testing.LooseMock', 'goog.testing.Mock', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock'], {});
+goog.addDependency('testing/functionmock_test.js', ['goog.testing.FunctionMockTest'], ['goog.array', 'goog.string', 'goog.testing', 'goog.testing.FunctionMock', 'goog.testing.Mock', 'goog.testing.StrictMock', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.mockmatchers'], {});
+goog.addDependency('testing/graphics.js', ['goog.testing.graphics'], ['goog.graphics.Path', 'goog.testing.asserts'], {});
+goog.addDependency('testing/i18n/asserts.js', ['goog.testing.i18n.asserts'], ['goog.testing.jsunit'], {});
+goog.addDependency('testing/i18n/asserts_test.js', ['goog.testing.i18n.assertsTest'], ['goog.testing.ExpectedFailures', 'goog.testing.i18n.asserts'], {});
+goog.addDependency('testing/jstdtestcaseadapter.js', ['goog.testing.JsTdTestCaseAdapter'], ['goog.async.run', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/jsunit.js', ['goog.testing.jsunit'], ['goog.dom.TagName', 'goog.testing.TestCase', 'goog.testing.TestRunner'], {});
+goog.addDependency('testing/loosemock.js', ['goog.testing.LooseExpectationCollection', 'goog.testing.LooseMock'], ['goog.array', 'goog.structs.Map', 'goog.testing.Mock'], {});
+goog.addDependency('testing/loosemock_test.js', ['goog.testing.LooseMockTest'], ['goog.testing.LooseMock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.mockmatchers'], {});
+goog.addDependency('testing/messaging/mockmessagechannel.js', ['goog.testing.messaging.MockMessageChannel'], ['goog.messaging.AbstractChannel', 'goog.testing.asserts'], {});
+goog.addDependency('testing/messaging/mockmessageevent.js', ['goog.testing.messaging.MockMessageEvent'], ['goog.events.BrowserEvent', 'goog.events.EventType', 'goog.testing.events.Event'], {});
+goog.addDependency('testing/messaging/mockmessageport.js', ['goog.testing.messaging.MockMessagePort'], ['goog.events.EventTarget'], {});
+goog.addDependency('testing/messaging/mockportnetwork.js', ['goog.testing.messaging.MockPortNetwork'], ['goog.messaging.PortNetwork', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('testing/mock.js', ['goog.testing.Mock', 'goog.testing.MockExpectation'], ['goog.array', 'goog.object', 'goog.testing.JsUnitException', 'goog.testing.MockInterface', 'goog.testing.mockmatchers'], {});
+goog.addDependency('testing/mock_test.js', ['goog.testing.MockTest'], ['goog.array', 'goog.testing', 'goog.testing.Mock', 'goog.testing.MockControl', 'goog.testing.MockExpectation', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockclassfactory.js', ['goog.testing.MockClassFactory', 'goog.testing.MockClassRecord'], ['goog.array', 'goog.object', 'goog.testing.LooseMock', 'goog.testing.StrictMock', 'goog.testing.TestCase', 'goog.testing.mockmatchers'], {});
+goog.addDependency('testing/mockclassfactory_test.js', ['fake.BaseClass', 'fake.ChildClass', 'goog.testing.MockClassFactoryTest'], ['goog.testing', 'goog.testing.MockClassFactory', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockclock.js', ['goog.testing.MockClock'], ['goog.Disposable', 'goog.async.run', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event'], {});
+goog.addDependency('testing/mockclock_test.js', ['goog.testing.MockClockTest'], ['goog.Promise', 'goog.Timer', 'goog.events', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('testing/mockcontrol.js', ['goog.testing.MockControl'], ['goog.array', 'goog.testing', 'goog.testing.LooseMock', 'goog.testing.StrictMock'], {});
+goog.addDependency('testing/mockcontrol_test.js', ['goog.testing.MockControlTest'], ['goog.testing.Mock', 'goog.testing.MockControl', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockinterface.js', ['goog.testing.MockInterface'], [], {});
+goog.addDependency('testing/mockmatchers.js', ['goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.mockmatchers.IgnoreArgument', 'goog.testing.mockmatchers.InstanceOf', 'goog.testing.mockmatchers.ObjectEquals', 'goog.testing.mockmatchers.RegexpMatch', 'goog.testing.mockmatchers.SaveArgument', 'goog.testing.mockmatchers.TypeOf'], ['goog.array', 'goog.dom', 'goog.testing.asserts'], {});
+goog.addDependency('testing/mockmatchers_test.js', ['goog.testing.mockmatchersTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher'], {});
+goog.addDependency('testing/mockrandom.js', ['goog.testing.MockRandom'], ['goog.Disposable'], {});
+goog.addDependency('testing/mockrandom_test.js', ['goog.testing.MockRandomTest'], ['goog.testing.MockRandom', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockrange.js', ['goog.testing.MockRange'], ['goog.dom.AbstractRange', 'goog.testing.LooseMock'], {});
+goog.addDependency('testing/mockrange_test.js', ['goog.testing.MockRangeTest'], ['goog.testing.MockRange', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockstorage.js', ['goog.testing.MockStorage'], ['goog.structs.Map'], {});
+goog.addDependency('testing/mockstorage_test.js', ['goog.testing.MockStorageTest'], ['goog.testing.MockStorage', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockuseragent.js', ['goog.testing.MockUserAgent'], ['goog.Disposable', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.userAgent'], {});
+goog.addDependency('testing/mockuseragent_test.js', ['goog.testing.MockUserAgentTest'], ['goog.dispose', 'goog.testing.MockUserAgent', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('testing/multitestrunner.js', ['goog.testing.MultiTestRunner', 'goog.testing.MultiTestRunner.TestFrame'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.functions', 'goog.object', 'goog.string', 'goog.ui.Component', 'goog.ui.ServerChart', 'goog.ui.TableSorter'], {});
+goog.addDependency('testing/multitestrunner_test.js', ['goog.testing.MultiTestRunnerTest'], ['goog.Promise', 'goog.events', 'goog.testing.MockControl', 'goog.testing.MultiTestRunner', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('testing/net/xhrio.js', ['goog.testing.net.XhrIo'], ['goog.array', 'goog.dom.xml', 'goog.events', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.object', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils'], {});
+goog.addDependency('testing/net/xhrio_test.js', ['goog.testing.net.XhrIoTest'], ['goog.dom.xml', 'goog.events', 'goog.events.Event', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.testing.MockControl', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.mockmatchers.InstanceOf', 'goog.testing.net.XhrIo'], {});
+goog.addDependency('testing/net/xhriopool.js', ['goog.testing.net.XhrIoPool'], ['goog.net.XhrIoPool', 'goog.testing.net.XhrIo'], {});
+goog.addDependency('testing/objectpropertystring.js', ['goog.testing.ObjectPropertyString'], [], {});
+goog.addDependency('testing/parallel_closure_test_suite.js', ['goog.testing.parallelClosureTestSuite'], ['goog.Promise', 'goog.events', 'goog.testing.MultiTestRunner', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('testing/parallel_closure_test_suite_test.js', ['goog.testing.parallelClosureTestSuiteTest'], ['goog.dom', 'goog.testing.MockControl', 'goog.testing.MultiTestRunner', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.parallelClosureTestSuite', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('testing/performancetable.js', ['goog.testing.PerformanceTable'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTimer'], {});
+goog.addDependency('testing/performancetimer.js', ['goog.testing.PerformanceTimer', 'goog.testing.PerformanceTimer.Task'], ['goog.array', 'goog.async.Deferred', 'goog.math'], {});
+goog.addDependency('testing/performancetimer_test.js', ['goog.testing.PerformanceTimerTest'], ['goog.async.Deferred', 'goog.dom', 'goog.math', 'goog.testing.MockClock', 'goog.testing.PerformanceTimer', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/propertyreplacer.js', ['goog.testing.PropertyReplacer'], ['goog.testing.ObjectPropertyString', 'goog.userAgent'], {});
+goog.addDependency('testing/propertyreplacer_test.js', ['goog.testing.PropertyReplacerTest'], ['goog.dom.TagName', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('testing/proto2/proto2.js', ['goog.testing.proto2'], ['goog.proto2.Message', 'goog.proto2.ObjectSerializer', 'goog.testing.asserts'], {});
+goog.addDependency('testing/proto2/proto2_test.js', ['goog.testing.proto2Test'], ['goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.proto2', 'proto2.TestAllTypes'], {});
+goog.addDependency('testing/pseudorandom.js', ['goog.testing.PseudoRandom'], ['goog.Disposable'], {});
+goog.addDependency('testing/pseudorandom_test.js', ['goog.testing.PseudoRandomTest'], ['goog.testing.PseudoRandom', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/recordfunction.js', ['goog.testing.FunctionCall', 'goog.testing.recordConstructor', 'goog.testing.recordFunction'], ['goog.testing.asserts'], {});
+goog.addDependency('testing/recordfunction_test.js', ['goog.testing.recordFunctionTest'], ['goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.recordConstructor', 'goog.testing.recordFunction'], {});
+goog.addDependency('testing/shardingtestcase.js', ['goog.testing.ShardingTestCase'], ['goog.asserts', 'goog.testing.TestCase'], {});
+goog.addDependency('testing/shardingtestcase_test.js', ['goog.testing.ShardingTestCaseTest'], ['goog.testing.ShardingTestCase', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/singleton.js', ['goog.testing.singleton'], [], {});
+goog.addDependency('testing/singleton_test.js', ['goog.testing.singletonTest'], ['goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.singleton'], {});
+goog.addDependency('testing/stacktrace.js', ['goog.testing.stacktrace', 'goog.testing.stacktrace.Frame'], [], {});
+goog.addDependency('testing/stacktrace_test.js', ['goog.testing.stacktraceTest'], ['goog.functions', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.stacktrace', 'goog.testing.stacktrace.Frame', 'goog.userAgent'], {});
+goog.addDependency('testing/storage/fakemechanism.js', ['goog.testing.storage.FakeMechanism'], ['goog.storage.mechanism.IterableMechanism', 'goog.structs.Map'], {});
+goog.addDependency('testing/strictmock.js', ['goog.testing.StrictMock'], ['goog.array', 'goog.testing.Mock'], {});
+goog.addDependency('testing/strictmock_test.js', ['goog.testing.StrictMockTest'], ['goog.testing.StrictMock', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/style/layoutasserts.js', ['goog.testing.style.layoutasserts'], ['goog.style', 'goog.testing.asserts', 'goog.testing.style'], {});
+goog.addDependency('testing/style/layoutasserts_test.js', ['goog.testing.style.layoutassertsTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.style.layoutasserts'], {});
+goog.addDependency('testing/style/style.js', ['goog.testing.style'], ['goog.dom', 'goog.math.Rect', 'goog.style'], {});
+goog.addDependency('testing/style/style_test.js', ['goog.testing.styleTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.jsunit', 'goog.testing.style'], {});
+goog.addDependency('testing/testcase.js', ['goog.testing.TestCase', 'goog.testing.TestCase.Error', 'goog.testing.TestCase.Order', 'goog.testing.TestCase.Result', 'goog.testing.TestCase.Test'], ['goog.Promise', 'goog.Thenable', 'goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.object', 'goog.testing.JsUnitException', 'goog.testing.asserts', 'goog.testing.stacktrace'], {});
+goog.addDependency('testing/testcase_test.js', ['goog.testing.TestCaseTest'], ['goog.Promise', 'goog.functions', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.JsUnitException', 'goog.testing.MethodMock', 'goog.testing.MockRandom', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/testqueue.js', ['goog.testing.TestQueue'], [], {});
+goog.addDependency('testing/testrunner.js', ['goog.testing.TestRunner'], ['goog.dom.TagName', 'goog.testing.TestCase'], {});
+goog.addDependency('testing/testsuite.js', ['goog.testing.testSuite'], ['goog.labs.testing.Environment', 'goog.testing.TestCase'], {});
+goog.addDependency('testing/ui/rendererasserts.js', ['goog.testing.ui.rendererasserts'], ['goog.testing.asserts', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('testing/ui/rendererasserts_test.js', ['goog.testing.ui.rendererassertsTest'], ['goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('testing/ui/rendererharness.js', ['goog.testing.ui.RendererHarness'], ['goog.Disposable', 'goog.dom.NodeType', 'goog.testing.asserts', 'goog.testing.dom'], {});
+goog.addDependency('testing/ui/style.js', ['goog.testing.ui.style'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.testing.asserts'], {});
+goog.addDependency('testing/ui/style_test.js', ['goog.testing.ui.styleTest'], ['goog.dom', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.ui.style'], {});
+goog.addDependency('timer/timer.js', ['goog.Timer'], ['goog.Promise', 'goog.events.EventTarget'], {});
+goog.addDependency('timer/timer_test.js', ['goog.TimerTest'], ['goog.Promise', 'goog.Timer', 'goog.events', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('tweak/entries.js', ['goog.tweak.BaseEntry', 'goog.tweak.BasePrimitiveSetting', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting'], ['goog.array', 'goog.asserts', 'goog.log', 'goog.object'], {});
+goog.addDependency('tweak/entries_test.js', ['goog.tweak.BaseEntryTest'], ['goog.testing.MockControl', 'goog.testing.jsunit', 'goog.tweak.testhelpers'], {});
+goog.addDependency('tweak/registry.js', ['goog.tweak.Registry'], ['goog.array', 'goog.asserts', 'goog.log', 'goog.string', 'goog.tweak.BasePrimitiveSetting', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting', 'goog.uri.utils'], {});
+goog.addDependency('tweak/registry_test.js', ['goog.tweak.RegistryTest'], ['goog.asserts.AssertionError', 'goog.testing.jsunit', 'goog.tweak', 'goog.tweak.testhelpers'], {});
+goog.addDependency('tweak/testhelpers.js', ['goog.tweak.testhelpers'], ['goog.tweak', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.Registry', 'goog.tweak.StringSetting'], {});
+goog.addDependency('tweak/tweak.js', ['goog.tweak', 'goog.tweak.ConfigParams'], ['goog.asserts', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.Registry', 'goog.tweak.StringSetting'], {});
+goog.addDependency('tweak/tweakui.js', ['goog.tweak.EntriesPanel', 'goog.tweak.TweakUi'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.object', 'goog.string.Const', 'goog.style', 'goog.tweak', 'goog.tweak.BaseEntry', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting', 'goog.ui.Zippy', 'goog.userAgent'], {});
+goog.addDependency('tweak/tweakui_test.js', ['goog.tweak.TweakUiTest'], ['goog.dom', 'goog.dom.TagName', 'goog.string', 'goog.testing.jsunit', 'goog.tweak', 'goog.tweak.TweakUi', 'goog.tweak.testhelpers'], {});
+goog.addDependency('ui/abstractspellchecker.js', ['goog.ui.AbstractSpellChecker', 'goog.ui.AbstractSpellChecker.AsyncResult'], ['goog.a11y.aria', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.selection', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.spell.SpellCheck', 'goog.structs.Set', 'goog.style', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.PopupMenu'], {});
+goog.addDependency('ui/ac/ac.js', ['goog.ui.ac'], ['goog.ui.ac.ArrayMatcher', 'goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.Renderer'], {});
+goog.addDependency('ui/ac/ac_test.js', ['goog.ui.acTest'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.dom.selection', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.ui.ac', 'goog.userAgent'], {});
+goog.addDependency('ui/ac/arraymatcher.js', ['goog.ui.ac.ArrayMatcher'], ['goog.string'], {});
+goog.addDependency('ui/ac/arraymatcher_test.js', ['goog.ui.ac.ArrayMatcherTest'], ['goog.testing.jsunit', 'goog.ui.ac.ArrayMatcher'], {});
+goog.addDependency('ui/ac/autocomplete.js', ['goog.ui.ac.AutoComplete', 'goog.ui.ac.AutoComplete.EventType'], ['goog.array', 'goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.object'], {});
+goog.addDependency('ui/ac/autocomplete_test.js', ['goog.ui.ac.AutoCompleteTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.string', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.RenderOptions', 'goog.ui.ac.Renderer'], {});
+goog.addDependency('ui/ac/cachingmatcher.js', ['goog.ui.ac.CachingMatcher'], ['goog.array', 'goog.async.Throttle', 'goog.ui.ac.ArrayMatcher', 'goog.ui.ac.RenderOptions'], {});
+goog.addDependency('ui/ac/cachingmatcher_test.js', ['goog.ui.ac.CachingMatcherTest'], ['goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.ui.ac.CachingMatcher'], {});
+goog.addDependency('ui/ac/inputhandler.js', ['goog.ui.ac.InputHandler'], ['goog.Disposable', 'goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.selection', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('ui/ac/inputhandler_test.js', ['goog.ui.ac.InputHandlerTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.selection', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.KeyCodes', 'goog.functions', 'goog.object', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.ui.ac.InputHandler', 'goog.userAgent'], {});
+goog.addDependency('ui/ac/remote.js', ['goog.ui.ac.Remote'], ['goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.RemoteArrayMatcher', 'goog.ui.ac.Renderer'], {});
+goog.addDependency('ui/ac/remotearraymatcher.js', ['goog.ui.ac.RemoteArrayMatcher'], ['goog.Disposable', 'goog.Uri', 'goog.events', 'goog.json', 'goog.net.EventType', 'goog.net.XhrIo'], {});
+goog.addDependency('ui/ac/remotearraymatcher_test.js', ['goog.ui.ac.RemoteArrayMatcherTest'], ['goog.json', 'goog.net.XhrIo', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.ui.ac.RemoteArrayMatcher'], {});
+goog.addDependency('ui/ac/renderer.js', ['goog.ui.ac.Renderer', 'goog.ui.ac.Renderer.CustomRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dispose', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOutAndHide', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.string', 'goog.style', 'goog.ui.IdGenerator', 'goog.ui.ac.AutoComplete'], {});
+goog.addDependency('ui/ac/renderer_test.js', ['goog.ui.ac.RendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOutAndHide', 'goog.string', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.ac.AutoComplete', 'goog.ui.ac.Renderer'], {});
+goog.addDependency('ui/ac/renderoptions.js', ['goog.ui.ac.RenderOptions'], [], {});
+goog.addDependency('ui/ac/richinputhandler.js', ['goog.ui.ac.RichInputHandler'], ['goog.ui.ac.InputHandler'], {});
+goog.addDependency('ui/ac/richremote.js', ['goog.ui.ac.RichRemote'], ['goog.ui.ac.AutoComplete', 'goog.ui.ac.Remote', 'goog.ui.ac.Renderer', 'goog.ui.ac.RichInputHandler', 'goog.ui.ac.RichRemoteArrayMatcher'], {});
+goog.addDependency('ui/ac/richremotearraymatcher.js', ['goog.ui.ac.RichRemoteArrayMatcher'], ['goog.dom', 'goog.ui.ac.RemoteArrayMatcher'], {});
+goog.addDependency('ui/activitymonitor.js', ['goog.ui.ActivityMonitor'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType'], {});
+goog.addDependency('ui/activitymonitor_test.js', ['goog.ui.ActivityMonitorTest'], ['goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.ActivityMonitor'], {});
+goog.addDependency('ui/advancedtooltip.js', ['goog.ui.AdvancedTooltip'], ['goog.events', 'goog.events.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Tooltip', 'goog.userAgent'], {});
+goog.addDependency('ui/advancedtooltip_test.js', ['goog.ui.AdvancedTooltipTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.AdvancedTooltip', 'goog.ui.Tooltip', 'goog.userAgent'], {});
+goog.addDependency('ui/animatedzippy.js', ['goog.ui.AnimatedZippy'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.fx.easing', 'goog.ui.Zippy', 'goog.ui.ZippyEvent'], {});
+goog.addDependency('ui/animatedzippy_test.js', ['goog.ui.AnimatedZippyTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events', 'goog.functions', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.ui.AnimatedZippy', 'goog.ui.Zippy'], {});
+goog.addDependency('ui/attachablemenu.js', ['goog.ui.AttachableMenu'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.ui.ItemEvent', 'goog.ui.MenuBase', 'goog.ui.PopupBase', 'goog.userAgent'], {});
+goog.addDependency('ui/bidiinput.js', ['goog.ui.BidiInput'], ['goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.InputHandler', 'goog.i18n.bidi', 'goog.ui.Component'], {});
+goog.addDependency('ui/bidiinput_test.js', ['goog.ui.BidiInputTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.BidiInput'], {});
+goog.addDependency('ui/bubble.js', ['goog.ui.Bubble'], ['goog.Timer', 'goog.dom.safe', 'goog.events', 'goog.events.EventType', 'goog.html.SafeHtml', 'goog.math.Box', 'goog.positioning', 'goog.positioning.AbsolutePosition', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.CornerBit', 'goog.string.Const', 'goog.style', 'goog.ui.Component', 'goog.ui.Popup'], {});
+goog.addDependency('ui/button.js', ['goog.ui.Button', 'goog.ui.Button.Side'], ['goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.NativeButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/button_test.js', ['goog.ui.ButtonTest'], ['goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.NativeButtonRenderer'], {});
+goog.addDependency('ui/buttonrenderer.js', ['goog.ui.ButtonRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/buttonrenderer_test.js', ['goog.ui.ButtonRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/buttonside.js', ['goog.ui.ButtonSide'], [], {});
+goog.addDependency('ui/charcounter.js', ['goog.ui.CharCounter', 'goog.ui.CharCounter.Display'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.InputHandler'], {});
+goog.addDependency('ui/charcounter_test.js', ['goog.ui.CharCounterTest'], ['goog.dom', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.ui.CharCounter', 'goog.userAgent'], {});
+goog.addDependency('ui/charpicker.js', ['goog.ui.CharPicker'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.i18n.CharListDecompressor', 'goog.i18n.uChar', 'goog.structs.Set', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.ContainerScroller', 'goog.ui.FlatButtonRenderer', 'goog.ui.HoverCard', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.Tooltip'], {});
+goog.addDependency('ui/charpicker_test.js', ['goog.ui.CharPickerTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dispose', 'goog.dom', 'goog.events.Event', 'goog.events.EventType', 'goog.i18n.CharPickerData', 'goog.i18n.uChar.NameFetcher', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.ui.CharPicker', 'goog.ui.FlatButtonRenderer'], {});
+goog.addDependency('ui/checkbox.js', ['goog.ui.Checkbox', 'goog.ui.Checkbox.State'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.string', 'goog.ui.CheckboxRenderer', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.registry'], {});
+goog.addDependency('ui/checkbox_test.js', ['goog.ui.CheckboxTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.KeyCodes', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Checkbox', 'goog.ui.CheckboxRenderer', 'goog.ui.Component', 'goog.ui.ControlRenderer', 'goog.ui.decorate'], {});
+goog.addDependency('ui/checkboxmenuitem.js', ['goog.ui.CheckBoxMenuItem'], ['goog.ui.MenuItem', 'goog.ui.registry'], {});
+goog.addDependency('ui/checkboxrenderer.js', ['goog.ui.CheckboxRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.object', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/colorbutton.js', ['goog.ui.ColorButton'], ['goog.ui.Button', 'goog.ui.ColorButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/colorbutton_test.js', ['goog.ui.ColorButtonTest'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.ui.ColorButton', 'goog.ui.decorate'], {});
+goog.addDependency('ui/colorbuttonrenderer.js', ['goog.ui.ColorButtonRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.functions', 'goog.ui.ColorMenuButtonRenderer'], {});
+goog.addDependency('ui/colormenubutton.js', ['goog.ui.ColorMenuButton'], ['goog.array', 'goog.object', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.ColorPalette', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.registry'], {});
+goog.addDependency('ui/colormenubuttonrenderer.js', ['goog.ui.ColorMenuButtonRenderer'], ['goog.asserts', 'goog.color', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.MenuButtonRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/colormenubuttonrenderer_test.js', ['goog.ui.ColorMenuButtonTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.testing.ui.RendererHarness', 'goog.testing.ui.rendererasserts', 'goog.ui.ColorMenuButton', 'goog.ui.ColorMenuButtonRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/colorpalette.js', ['goog.ui.ColorPalette'], ['goog.array', 'goog.color', 'goog.dom.TagName', 'goog.style', 'goog.ui.Palette', 'goog.ui.PaletteRenderer'], {});
+goog.addDependency('ui/colorpalette_test.js', ['goog.ui.ColorPaletteTest'], ['goog.color', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.ui.ColorPalette'], {});
+goog.addDependency('ui/colorpicker.js', ['goog.ui.ColorPicker', 'goog.ui.ColorPicker.EventType'], ['goog.ui.ColorPalette', 'goog.ui.Component'], {});
+goog.addDependency('ui/colorsplitbehavior.js', ['goog.ui.ColorSplitBehavior'], ['goog.ui.ColorMenuButton', 'goog.ui.SplitBehavior'], {});
+goog.addDependency('ui/combobox.js', ['goog.ui.ComboBox', 'goog.ui.ComboBoxItem'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.log', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ItemEvent', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.registry', 'goog.userAgent'], {});
+goog.addDependency('ui/combobox_test.js', ['goog.ui.ComboBoxTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.ComboBox', 'goog.ui.ComboBoxItem', 'goog.ui.Component', 'goog.ui.ControlRenderer', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuItem'], {});
+goog.addDependency('ui/component.js', ['goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Component.State'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.object', 'goog.style', 'goog.ui.IdGenerator'], {});
+goog.addDependency('ui/component_test.js', ['goog.ui.ComponentTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.events.EventTarget', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.Component'], {});
+goog.addDependency('ui/container.js', ['goog.ui.Container', 'goog.ui.Container.EventType', 'goog.ui.Container.Orientation'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.object', 'goog.style', 'goog.ui.Component', 'goog.ui.ContainerRenderer', 'goog.ui.Control'], {});
+goog.addDependency('ui/container_test.js', ['goog.ui.ContainerTest'], ['goog.a11y.aria', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.events.KeyEvent', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Control'], {});
+goog.addDependency('ui/containerrenderer.js', ['goog.ui.ContainerRenderer'], ['goog.a11y.aria', 'goog.array', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.style', 'goog.ui.registry', 'goog.userAgent'], {});
+goog.addDependency('ui/containerrenderer_test.js', ['goog.ui.ContainerRendererTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Container', 'goog.ui.ContainerRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/containerscroller.js', ['goog.ui.ContainerScroller'], ['goog.Disposable', 'goog.Timer', 'goog.events.EventHandler', 'goog.style', 'goog.ui.Component', 'goog.ui.Container'], {});
+goog.addDependency('ui/containerscroller_test.js', ['goog.ui.ContainerScrollerTest'], ['goog.dom', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Container', 'goog.ui.ContainerScroller'], {});
+goog.addDependency('ui/control.js', ['goog.ui.Control'], ['goog.Disposable', 'goog.array', 'goog.dom', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.ui.Component', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer', 'goog.ui.registry', 'goog.userAgent'], {});
+goog.addDependency('ui/control_test.js', ['goog.ui.ControlTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.html.testing', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.ControlRenderer', 'goog.ui.registry', 'goog.userAgent'], {});
+goog.addDependency('ui/controlcontent.js', ['goog.ui.ControlContent'], [], {});
+goog.addDependency('ui/controlrenderer.js', ['goog.ui.ControlRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.object', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/controlrenderer_test.js', ['goog.ui.ControlRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.object', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.ControlRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/cookieeditor.js', ['goog.ui.CookieEditor'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.events.EventType', 'goog.net.cookies', 'goog.string', 'goog.style', 'goog.ui.Component'], {});
+goog.addDependency('ui/cookieeditor_test.js', ['goog.ui.CookieEditorTest'], ['goog.dom', 'goog.events.Event', 'goog.events.EventType', 'goog.net.cookies', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.CookieEditor'], {});
+goog.addDependency('ui/css3buttonrenderer.js', ['goog.ui.Css3ButtonRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.Component', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});
+goog.addDependency('ui/css3menubuttonrenderer.js', ['goog.ui.Css3MenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/cssnames.js', ['goog.ui.INLINE_BLOCK_CLASSNAME'], [], {});
+goog.addDependency('ui/custombutton.js', ['goog.ui.CustomButton'], ['goog.ui.Button', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/custombuttonrenderer.js', ['goog.ui.CustomButtonRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.ui.ButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME'], {});
+goog.addDependency('ui/customcolorpalette.js', ['goog.ui.CustomColorPalette'], ['goog.color', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.ColorPalette', 'goog.ui.Component'], {});
+goog.addDependency('ui/customcolorpalette_test.js', ['goog.ui.CustomColorPaletteTest'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.ui.CustomColorPalette'], {});
+goog.addDependency('ui/datepicker.js', ['goog.ui.DatePicker', 'goog.ui.DatePicker.Events', 'goog.ui.DatePickerEvent'], ['goog.a11y.aria', 'goog.asserts', 'goog.date.Date', 'goog.date.DateRange', 'goog.date.Interval', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns', 'goog.i18n.DateTimeSymbols', 'goog.style', 'goog.ui.Component', 'goog.ui.DefaultDatePickerRenderer', 'goog.ui.IdGenerator'], {});
+goog.addDependency('ui/datepicker_test.js', ['goog.ui.DatePickerTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.date.Date', 'goog.date.DateRange', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.KeyCodes', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.DatePicker'], {});
+goog.addDependency('ui/datepickerrenderer.js', ['goog.ui.DatePickerRenderer'], [], {});
+goog.addDependency('ui/decorate.js', ['goog.ui.decorate'], ['goog.ui.registry'], {});
+goog.addDependency('ui/decorate_test.js', ['goog.ui.decorateTest'], ['goog.testing.jsunit', 'goog.ui.decorate', 'goog.ui.registry'], {});
+goog.addDependency('ui/defaultdatepickerrenderer.js', ['goog.ui.DefaultDatePickerRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.DatePickerRenderer'], {});
+goog.addDependency('ui/dialog.js', ['goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.ButtonSet.DefaultButtons', 'goog.ui.Dialog.DefaultButtonCaptions', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.Event', 'goog.ui.Dialog.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.safe', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Dragger', 'goog.html.SafeHtml', 'goog.math.Rect', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.ModalPopup'], {});
+goog.addDependency('ui/dialog_test.js', ['goog.ui.DialogTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.css3', 'goog.html.SafeHtml', 'goog.html.testing', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Dialog', 'goog.userAgent'], {});
+goog.addDependency('ui/dimensionpicker.js', ['goog.ui.DimensionPicker'], ['goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.DimensionPickerRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/dimensionpicker_test.js', ['goog.ui.DimensionPickerTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.DimensionPicker', 'goog.ui.DimensionPickerRenderer'], {});
+goog.addDependency('ui/dimensionpickerrenderer.js', ['goog.ui.DimensionPickerRenderer'], ['goog.a11y.aria.Announcer', 'goog.a11y.aria.LivePriority', 'goog.dom', 'goog.dom.TagName', 'goog.i18n.bidi', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/dimensionpickerrenderer_test.js', ['goog.ui.DimensionPickerRendererTest'], ['goog.a11y.aria.LivePriority', 'goog.array', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.DimensionPicker', 'goog.ui.DimensionPickerRenderer'], {});
+goog.addDependency('ui/dragdropdetector.js', ['goog.ui.DragDropDetector', 'goog.ui.DragDropDetector.EventType', 'goog.ui.DragDropDetector.ImageDropEvent', 'goog.ui.DragDropDetector.LinkDropEvent'], ['goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('ui/drilldownrow.js', ['goog.ui.DrilldownRow'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.string.Unicode', 'goog.ui.Component'], {});
+goog.addDependency('ui/drilldownrow_test.js', ['goog.ui.DrilldownRowTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.SafeHtml', 'goog.testing.jsunit', 'goog.ui.DrilldownRow'], {});
+goog.addDependency('ui/editor/abstractdialog.js', ['goog.ui.editor.AbstractDialog', 'goog.ui.editor.AbstractDialog.Builder', 'goog.ui.editor.AbstractDialog.EventType'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventTarget', 'goog.string', 'goog.ui.Dialog', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/editor/abstractdialog_test.js', ['goog.ui.editor.AbstractDialogTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.KeyCodes', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.ui.editor.AbstractDialog', 'goog.userAgent'], {});
+goog.addDependency('ui/editor/bubble.js', ['goog.ui.editor.Bubble'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.ViewportSizeMonitor', 'goog.dom.classlist', 'goog.editor.style', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.functions', 'goog.log', 'goog.math.Box', 'goog.object', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.PopupBase', 'goog.userAgent'], {});
+goog.addDependency('ui/editor/bubble_test.js', ['goog.ui.editor.BubbleTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.positioning.Corner', 'goog.positioning.OverflowStatus', 'goog.string', 'goog.style', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.editor.Bubble', 'goog.userAgent.product'], {});
+goog.addDependency('ui/editor/defaulttoolbar.js', ['goog.ui.editor.ButtonDescriptor', 'goog.ui.editor.DefaultToolbar'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.Command', 'goog.style', 'goog.ui.editor.ToolbarFactory', 'goog.ui.editor.messages', 'goog.userAgent'], {});
+goog.addDependency('ui/editor/linkdialog.js', ['goog.ui.editor.LinkDialog', 'goog.ui.editor.LinkDialog.BeforeTestLinkEvent', 'goog.ui.editor.LinkDialog.EventType', 'goog.ui.editor.LinkDialog.OkEvent'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.editor.BrowserFeature', 'goog.editor.Link', 'goog.editor.focus', 'goog.editor.node', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.InputHandler', 'goog.html.SafeHtml', 'goog.html.SafeHtmlFormatter', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.LinkButtonRenderer', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.TabPane', 'goog.ui.editor.messages', 'goog.userAgent', 'goog.window'], {});
+goog.addDependency('ui/editor/linkdialog_test.js', ['goog.ui.editor.LinkDialogTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Link', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.LinkDialog', 'goog.ui.editor.messages', 'goog.userAgent'], {});
+goog.addDependency('ui/editor/messages.js', ['goog.ui.editor.messages'], ['goog.html.uncheckedconversions', 'goog.string.Const'], {});
+goog.addDependency('ui/editor/tabpane.js', ['goog.ui.editor.TabPane'], ['goog.asserts', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.Tab', 'goog.ui.TabBar'], {});
+goog.addDependency('ui/editor/toolbarcontroller.js', ['goog.ui.editor.ToolbarController'], ['goog.editor.Field', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.ui.Component'], {});
+goog.addDependency('ui/editor/toolbarfactory.js', ['goog.ui.editor.ToolbarFactory'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Option', 'goog.ui.Toolbar', 'goog.ui.ToolbarButton', 'goog.ui.ToolbarColorMenuButton', 'goog.ui.ToolbarMenuButton', 'goog.ui.ToolbarRenderer', 'goog.ui.ToolbarSelect', 'goog.userAgent'], {});
+goog.addDependency('ui/editor/toolbarfactory_test.js', ['goog.ui.editor.ToolbarFactoryTest'], ['goog.dom', 'goog.testing.ExpectedFailures', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.ui.editor.ToolbarFactory', 'goog.userAgent'], {});
+goog.addDependency('ui/emoji/emoji.js', ['goog.ui.emoji.Emoji'], [], {});
+goog.addDependency('ui/emoji/emojipalette.js', ['goog.ui.emoji.EmojiPalette'], ['goog.events.EventType', 'goog.net.ImageLoader', 'goog.ui.Palette', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPaletteRenderer'], {});
+goog.addDependency('ui/emoji/emojipaletterenderer.js', ['goog.ui.emoji.EmojiPaletteRenderer'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.style', 'goog.ui.PaletteRenderer', 'goog.ui.emoji.Emoji'], {});
+goog.addDependency('ui/emoji/emojipicker.js', ['goog.ui.emoji.EmojiPicker'], ['goog.dom.TagName', 'goog.style', 'goog.ui.Component', 'goog.ui.TabPane', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPalette', 'goog.ui.emoji.EmojiPaletteRenderer', 'goog.ui.emoji.ProgressiveEmojiPaletteRenderer'], {});
+goog.addDependency('ui/emoji/emojipicker_test.js', ['goog.ui.emoji.EmojiPickerTest'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPicker', 'goog.ui.emoji.SpriteInfo'], {});
+goog.addDependency('ui/emoji/fast_nonprogressive_emojipicker_test.js', ['goog.ui.emoji.FastNonProgressiveEmojiPickerTest'], ['goog.Promise', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.net.EventType', 'goog.style', 'goog.testing.jsunit', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPicker', 'goog.ui.emoji.SpriteInfo'], {});
+goog.addDependency('ui/emoji/fast_progressive_emojipicker_test.js', ['goog.ui.emoji.FastProgressiveEmojiPickerTest'], ['goog.Promise', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.net.EventType', 'goog.style', 'goog.testing.jsunit', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPicker', 'goog.ui.emoji.SpriteInfo'], {});
+goog.addDependency('ui/emoji/popupemojipicker.js', ['goog.ui.emoji.PopupEmojiPicker'], ['goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.Component', 'goog.ui.Popup', 'goog.ui.emoji.EmojiPicker'], {});
+goog.addDependency('ui/emoji/popupemojipicker_test.js', ['goog.ui.emoji.PopupEmojiPickerTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.emoji.PopupEmojiPicker'], {});
+goog.addDependency('ui/emoji/progressiveemojipaletterenderer.js', ['goog.ui.emoji.ProgressiveEmojiPaletteRenderer'], ['goog.dom.TagName', 'goog.style', 'goog.ui.emoji.EmojiPaletteRenderer'], {});
+goog.addDependency('ui/emoji/spriteinfo.js', ['goog.ui.emoji.SpriteInfo'], [], {});
+goog.addDependency('ui/emoji/spriteinfo_test.js', ['goog.ui.emoji.SpriteInfoTest'], ['goog.testing.jsunit', 'goog.ui.emoji.SpriteInfo'], {});
+goog.addDependency('ui/filteredmenu.js', ['goog.ui.FilteredMenu'], ['goog.a11y.aria', 'goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.object', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.FilterObservingMenuItem', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.userAgent'], {});
+goog.addDependency('ui/filteredmenu_test.js', ['goog.ui.FilteredMenuTest'], ['goog.a11y.aria', 'goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Rect', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.FilteredMenu', 'goog.ui.MenuItem'], {});
+goog.addDependency('ui/filterobservingmenuitem.js', ['goog.ui.FilterObservingMenuItem'], ['goog.ui.FilterObservingMenuItemRenderer', 'goog.ui.MenuItem', 'goog.ui.registry'], {});
+goog.addDependency('ui/filterobservingmenuitemrenderer.js', ['goog.ui.FilterObservingMenuItemRenderer'], ['goog.ui.MenuItemRenderer'], {});
+goog.addDependency('ui/flatbuttonrenderer.js', ['goog.ui.FlatButtonRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});
+goog.addDependency('ui/flatmenubuttonrenderer.js', ['goog.ui.FlatMenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.ui.FlatButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/formpost.js', ['goog.ui.FormPost'], ['goog.array', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.ui.Component'], {});
+goog.addDependency('ui/formpost_test.js', ['goog.ui.FormPostTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.object', 'goog.testing.jsunit', 'goog.ui.FormPost', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('ui/gauge.js', ['goog.ui.Gauge', 'goog.ui.GaugeColoredRange'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.TagName', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.fx.easing', 'goog.graphics', 'goog.graphics.Font', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.math', 'goog.ui.Component', 'goog.ui.GaugeTheme'], {});
+goog.addDependency('ui/gaugetheme.js', ['goog.ui.GaugeTheme'], ['goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke'], {});
+goog.addDependency('ui/hovercard.js', ['goog.ui.HoverCard', 'goog.ui.HoverCard.EventType', 'goog.ui.HoverCard.TriggerEvent'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.ui.AdvancedTooltip', 'goog.ui.PopupBase', 'goog.ui.Tooltip'], {});
+goog.addDependency('ui/hovercard_test.js', ['goog.ui.HoverCardTest'], ['goog.dom', 'goog.events', 'goog.math.Coordinate', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.HoverCard'], {});
+goog.addDependency('ui/hsvapalette.js', ['goog.ui.HsvaPalette'], ['goog.array', 'goog.color.alpha', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.HsvPalette'], {});
+goog.addDependency('ui/hsvapalette_test.js', ['goog.ui.HsvaPaletteTest'], ['goog.color.alpha', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.Event', 'goog.math.Coordinate', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.HsvaPalette', 'goog.userAgent'], {});
+goog.addDependency('ui/hsvpalette.js', ['goog.ui.HsvPalette'], ['goog.color', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.style', 'goog.style.bidi', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/hsvpalette_test.js', ['goog.ui.HsvPaletteTest'], ['goog.color', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.math.Coordinate', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.HsvPalette', 'goog.userAgent'], {});
+goog.addDependency('ui/idgenerator.js', ['goog.ui.IdGenerator'], [], {});
+goog.addDependency('ui/idletimer.js', ['goog.ui.IdleTimer'], ['goog.Timer', 'goog.events', 'goog.events.EventTarget', 'goog.structs.Set', 'goog.ui.ActivityMonitor'], {});
+goog.addDependency('ui/idletimer_test.js', ['goog.ui.IdleTimerTest'], ['goog.events', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.ui.IdleTimer', 'goog.ui.MockActivityMonitor'], {});
+goog.addDependency('ui/iframemask.js', ['goog.ui.IframeMask'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.dom.iframe', 'goog.events.EventHandler', 'goog.style'], {});
+goog.addDependency('ui/iframemask_test.js', ['goog.ui.IframeMaskTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.iframe', 'goog.structs.Pool', 'goog.style', 'goog.testing.MockClock', 'goog.testing.StrictMock', 'goog.testing.jsunit', 'goog.ui.IframeMask', 'goog.ui.Popup', 'goog.ui.PopupBase', 'goog.userAgent'], {});
+goog.addDependency('ui/imagelessbuttonrenderer.js', ['goog.ui.ImagelessButtonRenderer'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});
+goog.addDependency('ui/imagelessmenubuttonrenderer.js', ['goog.ui.ImagelessMenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/inputdatepicker.js', ['goog.ui.InputDatePicker'], ['goog.date.DateTime', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.string', 'goog.ui.Component', 'goog.ui.DatePicker', 'goog.ui.LabelInput', 'goog.ui.PopupBase', 'goog.ui.PopupDatePicker'], {});
+goog.addDependency('ui/inputdatepicker_test.js', ['goog.ui.InputDatePickerTest'], ['goog.dom', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeParse', 'goog.testing.jsunit', 'goog.ui.InputDatePicker'], {});
+goog.addDependency('ui/itemevent.js', ['goog.ui.ItemEvent'], ['goog.events.Event'], {});
+goog.addDependency('ui/keyboardshortcuthandler.js', ['goog.ui.KeyboardShortcutEvent', 'goog.ui.KeyboardShortcutHandler', 'goog.ui.KeyboardShortcutHandler.EventType'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyNames', 'goog.object', 'goog.userAgent'], {});
+goog.addDependency('ui/keyboardshortcuthandler_test.js', ['goog.ui.KeyboardShortcutHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.KeyboardShortcutHandler', 'goog.userAgent'], {});
+goog.addDependency('ui/labelinput.js', ['goog.ui.LabelInput'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/labelinput_test.js', ['goog.ui.LabelInputTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventType', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.LabelInput', 'goog.userAgent'], {});
+goog.addDependency('ui/linkbuttonrenderer.js', ['goog.ui.LinkButtonRenderer'], ['goog.ui.Button', 'goog.ui.FlatButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/media/flashobject.js', ['goog.ui.media.FlashObject', 'goog.ui.media.FlashObject.ScriptAccessLevel', 'goog.ui.media.FlashObject.Wmodes'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.html.TrustedResourceUrl', 'goog.html.flash', 'goog.log', 'goog.object', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.userAgent', 'goog.userAgent.flash'], {});
+goog.addDependency('ui/media/flashobject_test.js', ['goog.ui.media.FlashObjectTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.html.testing', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.userAgent'], {});
+goog.addDependency('ui/media/flickr.js', ['goog.ui.media.FlickrSet', 'goog.ui.media.FlickrSetModel'], ['goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/flickr_test.js', ['goog.ui.media.FlickrSetTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.FlickrSet', 'goog.ui.media.FlickrSetModel', 'goog.ui.media.Media'], {});
+goog.addDependency('ui/media/googlevideo.js', ['goog.ui.media.GoogleVideo', 'goog.ui.media.GoogleVideoModel'], ['goog.html.uncheckedconversions', 'goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/googlevideo_test.js', ['goog.ui.media.GoogleVideoTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.GoogleVideo', 'goog.ui.media.GoogleVideoModel', 'goog.ui.media.Media'], {});
+goog.addDependency('ui/media/media.js', ['goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.style', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/media/media_test.js', ['goog.ui.media.MediaTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.math.Size', 'goog.testing.jsunit', 'goog.ui.ControlRenderer', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/mediamodel.js', ['goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Category', 'goog.ui.media.MediaModel.Credit', 'goog.ui.media.MediaModel.Credit.Role', 'goog.ui.media.MediaModel.Credit.Scheme', 'goog.ui.media.MediaModel.Medium', 'goog.ui.media.MediaModel.MimeType', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaModel.SubTitle', 'goog.ui.media.MediaModel.Thumbnail'], ['goog.array', 'goog.html.TrustedResourceUrl'], {});
+goog.addDependency('ui/media/mediamodel_test.js', ['goog.ui.media.MediaModelTest'], ['goog.testing.jsunit', 'goog.ui.media.MediaModel'], {});
+goog.addDependency('ui/media/mp3.js', ['goog.ui.media.Mp3'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/mp3_test.js', ['goog.ui.media.Mp3Test'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.Mp3'], {});
+goog.addDependency('ui/media/photo.js', ['goog.ui.media.Photo'], ['goog.dom.TagName', 'goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/photo_test.js', ['goog.ui.media.PhotoTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.jsunit', 'goog.ui.media.MediaModel', 'goog.ui.media.Photo'], {});
+goog.addDependency('ui/media/picasa.js', ['goog.ui.media.PicasaAlbum', 'goog.ui.media.PicasaAlbumModel'], ['goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/picasa_test.js', ['goog.ui.media.PicasaTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.PicasaAlbum', 'goog.ui.media.PicasaAlbumModel'], {});
+goog.addDependency('ui/media/vimeo.js', ['goog.ui.media.Vimeo', 'goog.ui.media.VimeoModel'], ['goog.html.uncheckedconversions', 'goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/vimeo_test.js', ['goog.ui.media.VimeoTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.Vimeo', 'goog.ui.media.VimeoModel'], {});
+goog.addDependency('ui/media/youtube.js', ['goog.ui.media.Youtube', 'goog.ui.media.YoutubeModel'], ['goog.dom.TagName', 'goog.html.uncheckedconversions', 'goog.string', 'goog.ui.Component', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/youtube_test.js', ['goog.ui.media.YoutubeTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.Youtube', 'goog.ui.media.YoutubeModel'], {});
+goog.addDependency('ui/menu.js', ['goog.ui.Menu', 'goog.ui.Menu.EventType'], ['goog.dom.TagName', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.MenuHeader', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.MenuSeparator'], {});
+goog.addDependency('ui/menu_test.js', ['goog.ui.MenuTest'], ['goog.dom', 'goog.events', 'goog.math.Coordinate', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Menu'], {});
+goog.addDependency('ui/menubar.js', ['goog.ui.menuBar'], ['goog.ui.Container', 'goog.ui.MenuBarRenderer'], {});
+goog.addDependency('ui/menubardecorator.js', ['goog.ui.menuBarDecorator'], ['goog.ui.MenuBarRenderer', 'goog.ui.menuBar', 'goog.ui.registry'], {});
+goog.addDependency('ui/menubarrenderer.js', ['goog.ui.MenuBarRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Container', 'goog.ui.ContainerRenderer'], {});
+goog.addDependency('ui/menubase.js', ['goog.ui.MenuBase'], ['goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.ui.Popup'], {});
+goog.addDependency('ui/menubutton.js', ['goog.ui.MenuButton'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.math.Box', 'goog.math.Rect', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.IdGenerator', 'goog.ui.Menu', 'goog.ui.MenuButtonRenderer', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.registry', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('ui/menubutton_test.js', ['goog.ui.MenuButtonTest'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.SubMenu', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('ui/menubuttonrenderer.js', ['goog.ui.MenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuRenderer'], {});
+goog.addDependency('ui/menubuttonrenderer_test.js', ['goog.ui.MenuButtonRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/menuheader.js', ['goog.ui.MenuHeader'], ['goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuHeaderRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/menuheaderrenderer.js', ['goog.ui.MenuHeaderRenderer'], ['goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/menuitem.js', ['goog.ui.MenuItem'], ['goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.dom.classlist', 'goog.math.Coordinate', 'goog.string', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuItemRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/menuitem_test.js', ['goog.ui.MenuItemTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.html.testing', 'goog.math.Coordinate', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuItemRenderer'], {});
+goog.addDependency('ui/menuitemrenderer.js', ['goog.ui.MenuItemRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/menuitemrenderer_test.js', ['goog.ui.MenuItemRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuItemRenderer'], {});
+goog.addDependency('ui/menurenderer.js', ['goog.ui.MenuRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.ui.ContainerRenderer', 'goog.ui.Separator'], {});
+goog.addDependency('ui/menuseparator.js', ['goog.ui.MenuSeparator'], ['goog.ui.MenuSeparatorRenderer', 'goog.ui.Separator', 'goog.ui.registry'], {});
+goog.addDependency('ui/menuseparatorrenderer.js', ['goog.ui.MenuSeparatorRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/menuseparatorrenderer_test.js', ['goog.ui.MenuSeparatorRendererTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.MenuSeparator', 'goog.ui.MenuSeparatorRenderer'], {});
+goog.addDependency('ui/mockactivitymonitor.js', ['goog.ui.MockActivityMonitor'], ['goog.events.EventType', 'goog.ui.ActivityMonitor'], {});
+goog.addDependency('ui/mockactivitymonitor_test.js', ['goog.ui.MockActivityMonitorTest'], ['goog.events', 'goog.functions', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.ActivityMonitor', 'goog.ui.MockActivityMonitor'], {});
+goog.addDependency('ui/modalariavisibilityhelper.js', ['goog.ui.ModalAriaVisibilityHelper'], ['goog.a11y.aria', 'goog.a11y.aria.State'], {});
+goog.addDependency('ui/modalariavisibilityhelper_test.js', ['goog.ui.ModalAriaVisibilityHelperTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.string', 'goog.testing.jsunit', 'goog.ui.ModalAriaVisibilityHelper'], {});
+goog.addDependency('ui/modalpopup.js', ['goog.ui.ModalPopup'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.iframe', 'goog.events', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.fx.Transition', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ModalAriaVisibilityHelper', 'goog.ui.PopupBase', 'goog.userAgent'], {});
+goog.addDependency('ui/modalpopup_test.js', ['goog.ui.ModalPopupTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dispose', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.fx.Transition', 'goog.fx.css3', 'goog.string', 'goog.style', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.ui.ModalPopup', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/nativebuttonrenderer.js', ['goog.ui.NativeButtonRenderer'], ['goog.asserts', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.ui.ButtonRenderer', 'goog.ui.Component'], {});
+goog.addDependency('ui/nativebuttonrenderer_test.js', ['goog.ui.NativeButtonRendererTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.testing.ExpectedFailures', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.NativeButtonRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/option.js', ['goog.ui.Option'], ['goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.registry'], {});
+goog.addDependency('ui/palette.js', ['goog.ui.Palette'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.PaletteRenderer', 'goog.ui.SelectionModel'], {});
+goog.addDependency('ui/palette_test.js', ['goog.ui.PaletteTest'], ['goog.a11y.aria', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyEvent', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Palette'], {});
+goog.addDependency('ui/paletterenderer.js', ['goog.ui.PaletteRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.iter', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/paletterenderer_test.js', ['goog.ui.PaletteRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.jsunit', 'goog.ui.Palette', 'goog.ui.PaletteRenderer'], {});
+goog.addDependency('ui/plaintextspellchecker.js', ['goog.ui.PlainTextSpellChecker'], ['goog.Timer', 'goog.a11y.aria', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.spell.SpellCheck', 'goog.style', 'goog.ui.AbstractSpellChecker', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/plaintextspellchecker_test.js', ['goog.ui.PlainTextSpellCheckerTest'], ['goog.Timer', 'goog.dom', 'goog.events.KeyCodes', 'goog.spell.SpellCheck', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.PlainTextSpellChecker'], {});
+goog.addDependency('ui/popup.js', ['goog.ui.Popup'], ['goog.math.Box', 'goog.positioning.Corner', 'goog.style', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/popup_test.js', ['goog.ui.PopupTest'], ['goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.style', 'goog.testing.jsunit', 'goog.ui.Popup', 'goog.userAgent'], {});
+goog.addDependency('ui/popupbase.js', ['goog.ui.PopupBase', 'goog.ui.PopupBase.EventType', 'goog.ui.PopupBase.Type'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Transition', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('ui/popupbase_test.js', ['goog.ui.PopupBaseTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Transition', 'goog.fx.css3', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/popupcolorpicker.js', ['goog.ui.PopupColorPicker'], ['goog.asserts', 'goog.dom.classlist', 'goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.ColorPicker', 'goog.ui.Component', 'goog.ui.Popup'], {});
+goog.addDependency('ui/popupcolorpicker_test.js', ['goog.ui.PopupColorPickerTest'], ['goog.dom', 'goog.events', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.ColorPicker', 'goog.ui.PopupColorPicker'], {});
+goog.addDependency('ui/popupdatepicker.js', ['goog.ui.PopupDatePicker'], ['goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.style', 'goog.ui.Component', 'goog.ui.DatePicker', 'goog.ui.Popup', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/popupdatepicker_test.js', ['goog.ui.PopupDatePickerTest'], ['goog.date.Date', 'goog.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.PopupBase', 'goog.ui.PopupDatePicker'], {});
+goog.addDependency('ui/popupmenu.js', ['goog.ui.PopupMenu'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.positioning.ViewportClientPosition', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.PopupBase', 'goog.userAgent'], {});
+goog.addDependency('ui/popupmenu_test.js', ['goog.ui.PopupMenuTest'], ['goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Box', 'goog.math.Coordinate', 'goog.positioning.Corner', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.PopupMenu'], {});
+goog.addDependency('ui/progressbar.js', ['goog.ui.ProgressBar', 'goog.ui.ProgressBar.Orientation'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.ui.Component', 'goog.ui.RangeModel', 'goog.userAgent'], {});
+goog.addDependency('ui/prompt.js', ['goog.ui.Prompt'], ['goog.Timer', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.html.SafeHtml', 'goog.ui.Component', 'goog.ui.Dialog', 'goog.userAgent'], {});
+goog.addDependency('ui/prompt_test.js', ['goog.ui.PromptTest'], ['goog.dom.selection', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.functions', 'goog.string', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.BidiInput', 'goog.ui.Dialog', 'goog.ui.Prompt', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('ui/rangemodel.js', ['goog.ui.RangeModel'], ['goog.events.EventTarget', 'goog.ui.Component'], {});
+goog.addDependency('ui/rangemodel_test.js', ['goog.ui.RangeModelTest'], ['goog.testing.jsunit', 'goog.ui.RangeModel'], {});
+goog.addDependency('ui/ratings.js', ['goog.ui.Ratings', 'goog.ui.Ratings.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.ui.Component'], {});
+goog.addDependency('ui/registry.js', ['goog.ui.registry'], ['goog.asserts', 'goog.dom.classlist'], {});
+goog.addDependency('ui/registry_test.js', ['goog.ui.registryTest'], ['goog.object', 'goog.testing.jsunit', 'goog.ui.registry'], {});
+goog.addDependency('ui/richtextspellchecker.js', ['goog.ui.RichTextSpellChecker'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.math.Coordinate', 'goog.spell.SpellCheck', 'goog.string.StringBuffer', 'goog.style', 'goog.ui.AbstractSpellChecker', 'goog.ui.Component', 'goog.ui.PopupMenu'], {});
+goog.addDependency('ui/richtextspellchecker_test.js', ['goog.ui.RichTextSpellCheckerTest'], ['goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.object', 'goog.spell.SpellCheck', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.RichTextSpellChecker'], {});
+goog.addDependency('ui/roundedpanel.js', ['goog.ui.BaseRoundedPanel', 'goog.ui.CssRoundedPanel', 'goog.ui.GraphicsRoundedPanel', 'goog.ui.RoundedPanel', 'goog.ui.RoundedPanel.Corner'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.graphics', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/roundedpanel_test.js', ['goog.ui.RoundedPanelTest'], ['goog.testing.jsunit', 'goog.ui.CssRoundedPanel', 'goog.ui.GraphicsRoundedPanel', 'goog.ui.RoundedPanel', 'goog.userAgent'], {});
+goog.addDependency('ui/roundedtabrenderer.js', ['goog.ui.RoundedTabRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.Tab', 'goog.ui.TabBar', 'goog.ui.TabRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/scrollfloater.js', ['goog.ui.ScrollFloater', 'goog.ui.ScrollFloater.EventType'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/scrollfloater_test.js', ['goog.ui.ScrollFloaterTest'], ['goog.dom', 'goog.events', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.ScrollFloater'], {});
+goog.addDependency('ui/select.js', ['goog.ui.Select'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.events.EventType', 'goog.ui.Component', 'goog.ui.IdGenerator', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.SelectionModel', 'goog.ui.registry'], {});
+goog.addDependency('ui/select_test.js', ['goog.ui.SelectTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.Select', 'goog.ui.Separator'], {});
+goog.addDependency('ui/selectionmenubutton.js', ['goog.ui.SelectionMenuButton', 'goog.ui.SelectionMenuButton.SelectionState'], ['goog.dom.InputType', 'goog.dom.TagName', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.registry'], {});
+goog.addDependency('ui/selectionmenubutton_test.js', ['goog.ui.SelectionMenuButtonTest'], ['goog.dom', 'goog.events', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.SelectionMenuButton'], {});
+goog.addDependency('ui/selectionmodel.js', ['goog.ui.SelectionModel'], ['goog.array', 'goog.events.EventTarget', 'goog.events.EventType'], {});
+goog.addDependency('ui/selectionmodel_test.js', ['goog.ui.SelectionModelTest'], ['goog.array', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.SelectionModel'], {});
+goog.addDependency('ui/separator.js', ['goog.ui.Separator'], ['goog.a11y.aria', 'goog.asserts', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuSeparatorRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/serverchart.js', ['goog.ui.ServerChart', 'goog.ui.ServerChart.AxisDisplayType', 'goog.ui.ServerChart.ChartType', 'goog.ui.ServerChart.EncodingType', 'goog.ui.ServerChart.Event', 'goog.ui.ServerChart.LegendPosition', 'goog.ui.ServerChart.MaximumValue', 'goog.ui.ServerChart.MultiAxisAlignment', 'goog.ui.ServerChart.MultiAxisType', 'goog.ui.ServerChart.UriParam', 'goog.ui.ServerChart.UriTooLongEvent'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.events.Event', 'goog.string', 'goog.ui.Component'], {});
+goog.addDependency('ui/serverchart_test.js', ['goog.ui.ServerChartTest'], ['goog.Uri', 'goog.events', 'goog.testing.jsunit', 'goog.ui.ServerChart'], {});
+goog.addDependency('ui/slider.js', ['goog.ui.Slider', 'goog.ui.Slider.Orientation'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.ui.SliderBase'], {});
+goog.addDependency('ui/sliderbase.js', ['goog.ui.SliderBase', 'goog.ui.SliderBase.AnimationFactory', 'goog.ui.SliderBase.Orientation'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.MouseWheelHandler', 'goog.functions', 'goog.fx.AnimationParallelQueue', 'goog.fx.Dragger', 'goog.fx.Transition', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Slide', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.ui.Component', 'goog.ui.RangeModel'], {});
+goog.addDependency('ui/sliderbase_test.js', ['goog.ui.SliderBaseTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Animation', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.SliderBase', 'goog.userAgent'], {});
+goog.addDependency('ui/splitbehavior.js', ['goog.ui.SplitBehavior', 'goog.ui.SplitBehavior.DefaultHandlers'], ['goog.Disposable', 'goog.asserts', 'goog.dispose', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.decorate', 'goog.ui.registry'], {});
+goog.addDependency('ui/splitbehavior_test.js', ['goog.ui.SplitBehaviorTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.CustomButton', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.SplitBehavior', 'goog.ui.decorate'], {});
+goog.addDependency('ui/splitpane.js', ['goog.ui.SplitPane', 'goog.ui.SplitPane.Orientation'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.math.Size', 'goog.style', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/splitpane_test.js', ['goog.ui.SplitPaneTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.math.Size', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.SplitPane'], {});
+goog.addDependency('ui/style/app/buttonrenderer.js', ['goog.ui.style.app.ButtonRenderer'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});
+goog.addDependency('ui/style/app/buttonrenderer_test.js', ['goog.ui.style.app.ButtonRendererTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.testing.ui.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.style.app.ButtonRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/style/app/menubuttonrenderer.js', ['goog.ui.style.app.MenuButtonRenderer'], ['goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.ui.Menu', 'goog.ui.MenuRenderer', 'goog.ui.style.app.ButtonRenderer'], {});
+goog.addDependency('ui/style/app/menubuttonrenderer_test.js', ['goog.ui.style.app.MenuButtonRendererTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.testing.ui.style', 'goog.ui.Component', 'goog.ui.MenuButton', 'goog.ui.style.app.MenuButtonRenderer'], {});
+goog.addDependency('ui/style/app/primaryactionbuttonrenderer.js', ['goog.ui.style.app.PrimaryActionButtonRenderer'], ['goog.ui.Button', 'goog.ui.registry', 'goog.ui.style.app.ButtonRenderer'], {});
+goog.addDependency('ui/style/app/primaryactionbuttonrenderer_test.js', ['goog.ui.style.app.PrimaryActionButtonRendererTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.testing.ui.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.style.app.PrimaryActionButtonRenderer'], {});
+goog.addDependency('ui/submenu.js', ['goog.ui.SubMenu'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.SubMenuRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/submenu_test.js', ['goog.ui.SubMenuTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.functions', 'goog.positioning', 'goog.positioning.Overflow', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.SubMenu', 'goog.ui.SubMenuRenderer'], {});
+goog.addDependency('ui/submenurenderer.js', ['goog.ui.SubMenuRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.style', 'goog.ui.Menu', 'goog.ui.MenuItemRenderer'], {});
+goog.addDependency('ui/tab.js', ['goog.ui.Tab'], ['goog.ui.Component', 'goog.ui.Control', 'goog.ui.TabRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/tab_test.js', ['goog.ui.TabTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Tab', 'goog.ui.TabRenderer'], {});
+goog.addDependency('ui/tabbar.js', ['goog.ui.TabBar', 'goog.ui.TabBar.Location'], ['goog.ui.Component.EventType', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.Tab', 'goog.ui.TabBarRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/tabbar_test.js', ['goog.ui.TabBarTest'], ['goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Tab', 'goog.ui.TabBar', 'goog.ui.TabBarRenderer'], {});
+goog.addDependency('ui/tabbarrenderer.js', ['goog.ui.TabBarRenderer'], ['goog.a11y.aria.Role', 'goog.object', 'goog.ui.ContainerRenderer'], {});
+goog.addDependency('ui/tabbarrenderer_test.js', ['goog.ui.TabBarRendererTest'], ['goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Container', 'goog.ui.TabBar', 'goog.ui.TabBarRenderer'], {});
+goog.addDependency('ui/tablesorter.js', ['goog.ui.TableSorter', 'goog.ui.TableSorter.EventType'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.functions', 'goog.ui.Component'], {});
+goog.addDependency('ui/tablesorter_test.js', ['goog.ui.TableSorterTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.TableSorter'], {});
+goog.addDependency('ui/tabpane.js', ['goog.ui.TabPane', 'goog.ui.TabPane.Events', 'goog.ui.TabPane.TabLocation', 'goog.ui.TabPane.TabPage', 'goog.ui.TabPaneEvent'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style'], {});
+goog.addDependency('ui/tabpane_test.js', ['goog.ui.TabPaneTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.TabPane'], {});
+goog.addDependency('ui/tabrenderer.js', ['goog.ui.TabRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/tabrenderer_test.js', ['goog.ui.TabRendererTest'], ['goog.a11y.aria.Role', 'goog.dom', 'goog.dom.classlist', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Tab', 'goog.ui.TabRenderer'], {});
+goog.addDependency('ui/textarea.js', ['goog.ui.Textarea', 'goog.ui.Textarea.EventType'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventType', 'goog.style', 'goog.ui.Control', 'goog.ui.TextareaRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/textarea_test.js', ['goog.ui.TextareaTest'], ['goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.events.EventObserver', 'goog.testing.jsunit', 'goog.ui.Textarea', 'goog.ui.TextareaRenderer', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('ui/textarearenderer.js', ['goog.ui.TextareaRenderer'], ['goog.dom.TagName', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/togglebutton.js', ['goog.ui.ToggleButton'], ['goog.ui.Button', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbar.js', ['goog.ui.Toolbar'], ['goog.ui.Container', 'goog.ui.ToolbarRenderer'], {});
+goog.addDependency('ui/toolbar_test.js', ['goog.ui.ToolbarTest'], ['goog.a11y.aria', 'goog.dom', 'goog.events.EventType', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.Toolbar', 'goog.ui.ToolbarMenuButton'], {});
+goog.addDependency('ui/toolbarbutton.js', ['goog.ui.ToolbarButton'], ['goog.ui.Button', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbarbuttonrenderer.js', ['goog.ui.ToolbarButtonRenderer'], ['goog.ui.CustomButtonRenderer'], {});
+goog.addDependency('ui/toolbarcolormenubutton.js', ['goog.ui.ToolbarColorMenuButton'], ['goog.ui.ColorMenuButton', 'goog.ui.ToolbarColorMenuButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbarcolormenubuttonrenderer.js', ['goog.ui.ToolbarColorMenuButtonRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.MenuButtonRenderer', 'goog.ui.ToolbarMenuButtonRenderer'], {});
+goog.addDependency('ui/toolbarcolormenubuttonrenderer_test.js', ['goog.ui.ToolbarColorMenuButtonRendererTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.testing.ui.RendererHarness', 'goog.testing.ui.rendererasserts', 'goog.ui.ToolbarColorMenuButton', 'goog.ui.ToolbarColorMenuButtonRenderer'], {});
+goog.addDependency('ui/toolbarmenubutton.js', ['goog.ui.ToolbarMenuButton'], ['goog.ui.MenuButton', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbarmenubuttonrenderer.js', ['goog.ui.ToolbarMenuButtonRenderer'], ['goog.ui.MenuButtonRenderer'], {});
+goog.addDependency('ui/toolbarrenderer.js', ['goog.ui.ToolbarRenderer'], ['goog.a11y.aria.Role', 'goog.dom.TagName', 'goog.ui.Container', 'goog.ui.ContainerRenderer', 'goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer'], {});
+goog.addDependency('ui/toolbarselect.js', ['goog.ui.ToolbarSelect'], ['goog.ui.Select', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbarseparator.js', ['goog.ui.ToolbarSeparator'], ['goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbarseparatorrenderer.js', ['goog.ui.ToolbarSeparatorRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuSeparatorRenderer'], {});
+goog.addDependency('ui/toolbarseparatorrenderer_test.js', ['goog.ui.ToolbarSeparatorRendererTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.ToolbarSeparator', 'goog.ui.ToolbarSeparatorRenderer'], {});
+goog.addDependency('ui/toolbartogglebutton.js', ['goog.ui.ToolbarToggleButton'], ['goog.ui.ToggleButton', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/tooltip.js', ['goog.ui.Tooltip', 'goog.ui.Tooltip.CursorTooltipPosition', 'goog.ui.Tooltip.ElementTooltipPosition', 'goog.ui.Tooltip.State'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.math.Box', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.positioning.ViewportPosition', 'goog.structs.Set', 'goog.style', 'goog.ui.Popup', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/tooltip_test.js', ['goog.ui.TooltipTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.html.testing', 'goog.math.Coordinate', 'goog.positioning.AbsolutePosition', 'goog.style', 'goog.testing.MockClock', 'goog.testing.TestQueue', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.PopupBase', 'goog.ui.Tooltip', 'goog.userAgent'], {});
+goog.addDependency('ui/tree/basenode.js', ['goog.ui.tree.BaseNode', 'goog.ui.tree.BaseNode.EventType'], ['goog.Timer', 'goog.a11y.aria', 'goog.asserts', 'goog.dom.safe', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.string', 'goog.string.StringBuffer', 'goog.style', 'goog.ui.Component'], {});
+goog.addDependency('ui/tree/basenode_test.js', ['goog.ui.tree.BaseNodeTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.html.testing', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.tree.BaseNode', 'goog.ui.tree.TreeControl', 'goog.ui.tree.TreeNode'], {});
+goog.addDependency('ui/tree/treecontrol.js', ['goog.ui.tree.TreeControl'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.classlist', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.events.KeyHandler', 'goog.html.SafeHtml', 'goog.log', 'goog.ui.tree.BaseNode', 'goog.ui.tree.TreeNode', 'goog.ui.tree.TypeAhead', 'goog.userAgent'], {});
+goog.addDependency('ui/tree/treecontrol_test.js', ['goog.ui.tree.TreeControlTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.tree.TreeControl'], {});
+goog.addDependency('ui/tree/treenode.js', ['goog.ui.tree.TreeNode'], ['goog.ui.tree.BaseNode'], {});
+goog.addDependency('ui/tree/typeahead.js', ['goog.ui.tree.TypeAhead', 'goog.ui.tree.TypeAhead.Offset'], ['goog.array', 'goog.events.KeyCodes', 'goog.string', 'goog.structs.Trie'], {});
+goog.addDependency('ui/tree/typeahead_test.js', ['goog.ui.tree.TypeAheadTest'], ['goog.dom', 'goog.events.KeyCodes', 'goog.testing.jsunit', 'goog.ui.tree.TreeControl', 'goog.ui.tree.TypeAhead'], {});
+goog.addDependency('ui/tristatemenuitem.js', ['goog.ui.TriStateMenuItem', 'goog.ui.TriStateMenuItem.State'], ['goog.dom.classlist', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.TriStateMenuItemRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/tristatemenuitemrenderer.js', ['goog.ui.TriStateMenuItemRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.ui.MenuItemRenderer'], {});
+goog.addDependency('ui/twothumbslider.js', ['goog.ui.TwoThumbSlider'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.ui.SliderBase'], {});
+goog.addDependency('ui/twothumbslider_test.js', ['goog.ui.TwoThumbSliderTest'], ['goog.testing.jsunit', 'goog.ui.SliderBase', 'goog.ui.TwoThumbSlider'], {});
+goog.addDependency('ui/zippy.js', ['goog.ui.Zippy', 'goog.ui.Zippy.Events', 'goog.ui.ZippyEvent'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style'], {});
+goog.addDependency('ui/zippy_test.js', ['goog.ui.ZippyTest'], ['goog.a11y.aria', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.object', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Zippy'], {});
+goog.addDependency('uri/uri.js', ['goog.Uri', 'goog.Uri.QueryData'], ['goog.array', 'goog.asserts', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex', 'goog.uri.utils.StandardQueryParam'], {});
+goog.addDependency('uri/uri_test.js', ['goog.UriTest'], ['goog.Uri', 'goog.testing.jsunit'], {});
+goog.addDependency('uri/utils.js', ['goog.uri.utils', 'goog.uri.utils.ComponentIndex', 'goog.uri.utils.QueryArray', 'goog.uri.utils.QueryValue', 'goog.uri.utils.StandardQueryParam'], ['goog.asserts', 'goog.string'], {});
+goog.addDependency('uri/utils_test.js', ['goog.uri.utilsTest'], ['goog.functions', 'goog.string', 'goog.testing.jsunit', 'goog.uri.utils'], {});
+goog.addDependency('useragent/adobereader.js', ['goog.userAgent.adobeReader'], ['goog.string', 'goog.userAgent'], {});
+goog.addDependency('useragent/adobereader_test.js', ['goog.userAgent.adobeReaderTest'], ['goog.testing.jsunit', 'goog.userAgent.adobeReader'], {});
+goog.addDependency('useragent/flash.js', ['goog.userAgent.flash'], ['goog.string'], {});
+goog.addDependency('useragent/flash_test.js', ['goog.userAgent.flashTest'], ['goog.testing.jsunit', 'goog.userAgent.flash'], {});
+goog.addDependency('useragent/iphoto.js', ['goog.userAgent.iphoto'], ['goog.string', 'goog.userAgent'], {});
+goog.addDependency('useragent/jscript.js', ['goog.userAgent.jscript'], ['goog.string'], {});
+goog.addDependency('useragent/jscript_test.js', ['goog.userAgent.jscriptTest'], ['goog.testing.jsunit', 'goog.userAgent.jscript'], {});
+goog.addDependency('useragent/keyboard.js', ['goog.userAgent.keyboard'], ['goog.labs.userAgent.platform'], {});
+goog.addDependency('useragent/keyboard_test.js', ['goog.userAgent.keyboardTest'], ['goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.jsunit', 'goog.userAgent.keyboard', 'goog.userAgentTestUtil'], {});
+goog.addDependency('useragent/platform.js', ['goog.userAgent.platform'], ['goog.string', 'goog.userAgent'], {});
+goog.addDependency('useragent/platform_test.js', ['goog.userAgent.platformTest'], ['goog.testing.MockUserAgent', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.platform', 'goog.userAgentTestUtil'], {});
+goog.addDependency('useragent/product.js', ['goog.userAgent.product'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.platform', 'goog.userAgent'], {});
+goog.addDependency('useragent/product_isversion.js', ['goog.userAgent.product.isVersion'], ['goog.labs.userAgent.platform', 'goog.string', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('useragent/product_test.js', ['goog.userAgent.productTest'], ['goog.array', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion', 'goog.userAgentTestUtil'], {});
+goog.addDependency('useragent/useragent.js', ['goog.userAgent'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.labs.userAgent.platform', 'goog.labs.userAgent.util', 'goog.string'], {});
+goog.addDependency('useragent/useragent_quirks_test.js', ['goog.userAgentQuirksTest'], ['goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('useragent/useragent_test.js', ['goog.userAgentTest'], ['goog.array', 'goog.labs.userAgent.platform', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgentTestUtil'], {'lang': 'es5'});
+goog.addDependency('useragent/useragenttestutil.js', ['goog.userAgentTestUtil', 'goog.userAgentTestUtil.UserAgents'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.labs.userAgent.platform', 'goog.userAgent', 'goog.userAgent.keyboard', 'goog.userAgent.platform', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('vec/float32array.js', ['goog.vec.Float32Array'], [], {});
+goog.addDependency('vec/float64array.js', ['goog.vec.Float64Array'], [], {});
+goog.addDependency('vec/mat3.js', ['goog.vec.Mat3'], ['goog.vec'], {});
+goog.addDependency('vec/mat3d.js', ['goog.vec.mat3d', 'goog.vec.mat3d.Type'], ['goog.vec'], {});
+goog.addDependency('vec/mat3f.js', ['goog.vec.mat3f', 'goog.vec.mat3f.Type'], ['goog.vec'], {});
+goog.addDependency('vec/mat4.js', ['goog.vec.Mat4'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4'], {});
+goog.addDependency('vec/mat4d.js', ['goog.vec.mat4d', 'goog.vec.mat4d.Type'], ['goog.vec', 'goog.vec.Quaternion', 'goog.vec.vec3d', 'goog.vec.vec4d'], {});
+goog.addDependency('vec/mat4f.js', ['goog.vec.mat4f', 'goog.vec.mat4f.Type'], ['goog.vec', 'goog.vec.Quaternion', 'goog.vec.vec3f', 'goog.vec.vec4f'], {});
+goog.addDependency('vec/matrix3.js', ['goog.vec.Matrix3'], [], {});
+goog.addDependency('vec/matrix4.js', ['goog.vec.Matrix4'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4'], {});
+goog.addDependency('vec/quaternion.js', ['goog.vec.Quaternion', 'goog.vec.Quaternion.AnyType'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4'], {});
+goog.addDependency('vec/ray.js', ['goog.vec.Ray'], ['goog.vec.Vec3'], {});
+goog.addDependency('vec/vec.js', ['goog.vec', 'goog.vec.AnyType', 'goog.vec.ArrayType', 'goog.vec.Float32', 'goog.vec.Float64', 'goog.vec.Number'], ['goog.vec.Float32Array', 'goog.vec.Float64Array'], {});
+goog.addDependency('vec/vec2.js', ['goog.vec.Vec2'], ['goog.vec'], {});
+goog.addDependency('vec/vec2d.js', ['goog.vec.vec2d', 'goog.vec.vec2d.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec2f.js', ['goog.vec.vec2f', 'goog.vec.vec2f.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec3.js', ['goog.vec.Vec3'], ['goog.vec'], {});
+goog.addDependency('vec/vec3d.js', ['goog.vec.vec3d', 'goog.vec.vec3d.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec3f.js', ['goog.vec.vec3f', 'goog.vec.vec3f.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec4.js', ['goog.vec.Vec4'], ['goog.vec'], {});
+goog.addDependency('vec/vec4d.js', ['goog.vec.vec4d', 'goog.vec.vec4d.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec4f.js', ['goog.vec.vec4f', 'goog.vec.vec4f.Type'], ['goog.vec'], {});
+goog.addDependency('webgl/webgl.js', ['goog.webgl'], [], {});
+goog.addDependency('window/window.js', ['goog.window'], ['goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeUrl', 'goog.html.uncheckedconversions', 'goog.labs.userAgent.platform', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('window/window_test.js', ['goog.windowTest'], ['goog.Promise', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.functions', 'goog.html.SafeUrl', 'goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.labs.userAgent.platform', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.window'], {});
diff --git a/src/http/static/viz/1/goog/disposable/disposable.js b/src/http/static/viz/1/goog/disposable/disposable.js
new file mode 100644
index 0000000..ca8d088
--- /dev/null
+++ b/src/http/static/viz/1/goog/disposable/disposable.js
@@ -0,0 +1,308 @@
+// Copyright 2005 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Implements the disposable interface. The dispose method is used
+ * to clean up references and resources.
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+goog.provide('goog.Disposable');
+/** @suppress {extraProvide} */
+goog.provide('goog.dispose');
+/** @suppress {extraProvide} */
+goog.provide('goog.disposeAll');
+
+goog.require('goog.disposable.IDisposable');
+
+
+
+/**
+ * Class that provides the basic implementation for disposable objects. If your
+ * class holds one or more references to COM objects, DOM nodes, or other
+ * disposable objects, it should extend this class or implement the disposable
+ * interface (defined in goog.disposable.IDisposable).
+ * @constructor
+ * @implements {goog.disposable.IDisposable}
+ */
+goog.Disposable = function() {
+ if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) {
+ if (goog.Disposable.INCLUDE_STACK_ON_CREATION) {
+ this.creationStack = new Error().stack;
+ }
+ goog.Disposable.instances_[goog.getUid(this)] = this;
+ }
+ // Support sealing
+ this.disposed_ = this.disposed_;
+ this.onDisposeCallbacks_ = this.onDisposeCallbacks_;
+};
+
+
+/**
+ * @enum {number} Different monitoring modes for Disposable.
+ */
+goog.Disposable.MonitoringMode = {
+ /**
+ * No monitoring.
+ */
+ OFF: 0,
+ /**
+ * Creating and disposing the goog.Disposable instances is monitored. All
+ * disposable objects need to call the {@code goog.Disposable} base
+ * constructor. The PERMANENT mode must be switched on before creating any
+ * goog.Disposable instances.
+ */
+ PERMANENT: 1,
+ /**
+ * INTERACTIVE mode can be switched on and off on the fly without producing
+ * errors. It also doesn't warn if the disposable objects don't call the
+ * {@code goog.Disposable} base constructor.
+ */
+ INTERACTIVE: 2
+};
+
+
+/**
+ * @define {number} The monitoring mode of the goog.Disposable
+ * instances. Default is OFF. Switching on the monitoring is only
+ * recommended for debugging because it has a significant impact on
+ * performance and memory usage. If switched off, the monitoring code
+ * compiles down to 0 bytes.
+ */
+goog.define('goog.Disposable.MONITORING_MODE', 0);
+
+
+/**
+ * @define {boolean} Whether to attach creation stack to each created disposable
+ * instance; This is only relevant for when MonitoringMode != OFF.
+ */
+goog.define('goog.Disposable.INCLUDE_STACK_ON_CREATION', true);
+
+
+/**
+ * Maps the unique ID of every undisposed {@code goog.Disposable} object to
+ * the object itself.
+ * @type {!Object<number, !goog.Disposable>}
+ * @private
+ */
+goog.Disposable.instances_ = {};
+
+
+/**
+ * @return {!Array<!goog.Disposable>} All {@code goog.Disposable} objects that
+ * haven't been disposed of.
+ */
+goog.Disposable.getUndisposedObjects = function() {
+ var ret = [];
+ for (var id in goog.Disposable.instances_) {
+ if (goog.Disposable.instances_.hasOwnProperty(id)) {
+ ret.push(goog.Disposable.instances_[Number(id)]);
+ }
+ }
+ return ret;
+};
+
+
+/**
+ * Clears the registry of undisposed objects but doesn't dispose of them.
+ */
+goog.Disposable.clearUndisposedObjects = function() {
+ goog.Disposable.instances_ = {};
+};
+
+
+/**
+ * Whether the object has been disposed of.
+ * @type {boolean}
+ * @private
+ */
+goog.Disposable.prototype.disposed_ = false;
+
+
+/**
+ * Callbacks to invoke when this object is disposed.
+ * @type {Array<!Function>}
+ * @private
+ */
+goog.Disposable.prototype.onDisposeCallbacks_;
+
+
+/**
+ * If monitoring the goog.Disposable instances is enabled, stores the creation
+ * stack trace of the Disposable instance.
+ * @const {string}
+ */
+goog.Disposable.prototype.creationStack;
+
+
+/**
+ * @return {boolean} Whether the object has been disposed of.
+ * @override
+ */
+goog.Disposable.prototype.isDisposed = function() {
+ return this.disposed_;
+};
+
+
+/**
+ * @return {boolean} Whether the object has been disposed of.
+ * @deprecated Use {@link #isDisposed} instead.
+ */
+goog.Disposable.prototype.getDisposed = goog.Disposable.prototype.isDisposed;
+
+
+/**
+ * Disposes of the object. If the object hasn't already been disposed of, calls
+ * {@link #disposeInternal}. Classes that extend {@code goog.Disposable} should
+ * override {@link #disposeInternal} in order to delete references to COM
+ * objects, DOM nodes, and other disposable objects. Reentrant.
+ *
+ * @return {void} Nothing.
+ * @override
+ */
+goog.Disposable.prototype.dispose = function() {
+ if (!this.disposed_) {
+ // Set disposed_ to true first, in case during the chain of disposal this
+ // gets disposed recursively.
+ this.disposed_ = true;
+ this.disposeInternal();
+ if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) {
+ var uid = goog.getUid(this);
+ if (goog.Disposable.MONITORING_MODE ==
+ goog.Disposable.MonitoringMode.PERMANENT &&
+ !goog.Disposable.instances_.hasOwnProperty(uid)) {
+ throw Error(
+ this + ' did not call the goog.Disposable base ' +
+ 'constructor or was disposed of after a clearUndisposedObjects ' +
+ 'call');
+ }
+ delete goog.Disposable.instances_[uid];
+ }
+ }
+};
+
+
+/**
+ * Associates a disposable object with this object so that they will be disposed
+ * together.
+ * @param {goog.disposable.IDisposable} disposable that will be disposed when
+ * this object is disposed.
+ */
+goog.Disposable.prototype.registerDisposable = function(disposable) {
+ this.addOnDisposeCallback(goog.partial(goog.dispose, disposable));
+};
+
+
+/**
+ * Invokes a callback function when this object is disposed. Callbacks are
+ * invoked in the order in which they were added. If a callback is added to
+ * an already disposed Disposable, it will be called immediately.
+ * @param {function(this:T):?} callback The callback function.
+ * @param {T=} opt_scope An optional scope to call the callback in.
+ * @template T
+ */
+goog.Disposable.prototype.addOnDisposeCallback = function(callback, opt_scope) {
+ if (this.disposed_) {
+ callback.call(opt_scope);
+ return;
+ }
+ if (!this.onDisposeCallbacks_) {
+ this.onDisposeCallbacks_ = [];
+ }
+
+ this.onDisposeCallbacks_.push(
+ goog.isDef(opt_scope) ? goog.bind(callback, opt_scope) : callback);
+};
+
+
+/**
+ * Deletes or nulls out any references to COM objects, DOM nodes, or other
+ * disposable objects. Classes that extend {@code goog.Disposable} should
+ * override this method.
+ * Not reentrant. To avoid calling it twice, it must only be called from the
+ * subclass' {@code disposeInternal} method. Everywhere else the public
+ * {@code dispose} method must be used.
+ * For example:
+ * <pre>
+ * mypackage.MyClass = function() {
+ * mypackage.MyClass.base(this, 'constructor');
+ * // Constructor logic specific to MyClass.
+ * ...
+ * };
+ * goog.inherits(mypackage.MyClass, goog.Disposable);
+ *
+ * mypackage.MyClass.prototype.disposeInternal = function() {
+ * // Dispose logic specific to MyClass.
+ * ...
+ * // Call superclass's disposeInternal at the end of the subclass's, like
+ * // in C++, to avoid hard-to-catch issues.
+ * mypackage.MyClass.base(this, 'disposeInternal');
+ * };
+ * </pre>
+ * @protected
+ */
+goog.Disposable.prototype.disposeInternal = function() {
+ if (this.onDisposeCallbacks_) {
+ while (this.onDisposeCallbacks_.length) {
+ this.onDisposeCallbacks_.shift()();
+ }
+ }
+};
+
+
+/**
+ * Returns True if we can verify the object is disposed.
+ * Calls {@code isDisposed} on the argument if it supports it. If obj
+ * is not an object with an isDisposed() method, return false.
+ * @param {*} obj The object to investigate.
+ * @return {boolean} True if we can verify the object is disposed.
+ */
+goog.Disposable.isDisposed = function(obj) {
+ if (obj && typeof obj.isDisposed == 'function') {
+ return obj.isDisposed();
+ }
+ return false;
+};
+
+
+/**
+ * Calls {@code dispose} on the argument if it supports it. If obj is not an
+ * object with a dispose() method, this is a no-op.
+ * @param {*} obj The object to dispose of.
+ */
+goog.dispose = function(obj) {
+ if (obj && typeof obj.dispose == 'function') {
+ obj.dispose();
+ }
+};
+
+
+/**
+ * Calls {@code dispose} on each member of the list that supports it. (If the
+ * member is an ArrayLike, then {@code goog.disposeAll()} will be called
+ * recursively on each of its members.) If the member is not an object with a
+ * {@code dispose()} method, then it is ignored.
+ * @param {...*} var_args The list.
+ */
+goog.disposeAll = function(var_args) {
+ for (var i = 0, len = arguments.length; i < len; ++i) {
+ var disposable = arguments[i];
+ if (goog.isArrayLike(disposable)) {
+ goog.disposeAll.apply(null, disposable);
+ } else {
+ goog.dispose(disposable);
+ }
+ }
+};
diff --git a/src/http/static/viz/1/goog/disposable/idisposable.js b/src/http/static/viz/1/goog/disposable/idisposable.js
new file mode 100644
index 0000000..917d17e
--- /dev/null
+++ b/src/http/static/viz/1/goog/disposable/idisposable.js
@@ -0,0 +1,45 @@
+// Copyright 2011 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Definition of the disposable interface. A disposable object
+ * has a dispose method to to clean up references and resources.
+ * @author nnaze@google.com (Nathan Naze)
+ */
+
+
+goog.provide('goog.disposable.IDisposable');
+
+
+
+/**
+ * Interface for a disposable object. If a instance requires cleanup
+ * (references COM objects, DOM notes, or other disposable objects), it should
+ * implement this interface (it may subclass goog.Disposable).
+ * @interface
+ */
+goog.disposable.IDisposable = function() {};
+
+
+/**
+ * Disposes of the object and its resources.
+ * @return {void} Nothing.
+ */
+goog.disposable.IDisposable.prototype.dispose = goog.abstractMethod;
+
+
+/**
+ * @return {boolean} Whether the object has been disposed of.
+ */
+goog.disposable.IDisposable.prototype.isDisposed = goog.abstractMethod;
diff --git a/src/http/static/viz/1/goog/dom/browserfeature.js b/src/http/static/viz/1/goog/dom/browserfeature.js
new file mode 100644
index 0000000..1172166
--- /dev/null
+++ b/src/http/static/viz/1/goog/dom/browserfeature.js
@@ -0,0 +1,73 @@
+// Copyright 2010 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Browser capability checks for the dom package.
+ *
+ */
+
+
+goog.provide('goog.dom.BrowserFeature');
+
+goog.require('goog.userAgent');
+
+
+/**
+ * Enum of browser capabilities.
+ * @enum {boolean}
+ */
+goog.dom.BrowserFeature = {
+ /**
+ * Whether attributes 'name' and 'type' can be added to an element after it's
+ * created. False in Internet Explorer prior to version 9.
+ */
+ CAN_ADD_NAME_OR_TYPE_ATTRIBUTES:
+ !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9),
+
+ /**
+ * Whether we can use element.children to access an element's Element
+ * children. Available since Gecko 1.9.1, IE 9. (IE<9 also includes comment
+ * nodes in the collection.)
+ */
+ CAN_USE_CHILDREN_ATTRIBUTE: !goog.userAgent.GECKO && !goog.userAgent.IE ||
+ goog.userAgent.IE && goog.userAgent.isDocumentModeOrHigher(9) ||
+ goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9.1'),
+
+ /**
+ * Opera, Safari 3, and Internet Explorer 9 all support innerText but they
+ * include text nodes in script and style tags. Not document-mode-dependent.
+ */
+ CAN_USE_INNER_TEXT:
+ (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9')),
+
+ /**
+ * MSIE, Opera, and Safari>=4 support element.parentElement to access an
+ * element's parent if it is an Element.
+ */
+ CAN_USE_PARENT_ELEMENT_PROPERTY:
+ goog.userAgent.IE || goog.userAgent.OPERA || goog.userAgent.WEBKIT,
+
+ /**
+ * Whether NoScope elements need a scoped element written before them in
+ * innerHTML.
+ * MSDN: http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx#1
+ */
+ INNER_HTML_NEEDS_SCOPED_ELEMENT: goog.userAgent.IE,
+
+ /**
+ * Whether we use legacy IE range API.
+ */
+ LEGACY_IE_RANGES:
+ goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)
+};
diff --git a/src/http/static/viz/1/goog/dom/dom.js b/src/http/static/viz/1/goog/dom/dom.js
new file mode 100644
index 0000000..4d3cdf9
--- /dev/null
+++ b/src/http/static/viz/1/goog/dom/dom.js
@@ -0,0 +1,2992 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for manipulating the browser's Document Object Model
+ * Inspiration taken *heavily* from mochikit (http://mochikit.com/).
+ *
+ * You can use {@link goog.dom.DomHelper} to create new dom helpers that refer
+ * to a different document object. This is useful if you are working with
+ * frames or multiple windows.
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+// TODO(arv): Rename/refactor getTextContent and getRawTextContent. The problem
+// is that getTextContent should mimic the DOM3 textContent. We should add a
+// getInnerText (or getText) which tries to return the visible text, innerText.
+
+
+goog.provide('goog.dom');
+goog.provide('goog.dom.Appendable');
+goog.provide('goog.dom.DomHelper');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom.BrowserFeature');
+goog.require('goog.dom.NodeType');
+goog.require('goog.dom.TagName');
+goog.require('goog.dom.safe');
+goog.require('goog.html.SafeHtml');
+goog.require('goog.html.uncheckedconversions');
+goog.require('goog.math.Coordinate');
+goog.require('goog.math.Size');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('goog.string.Unicode');
+goog.require('goog.userAgent');
+
+
+/**
+ * @define {boolean} Whether we know at compile time that the browser is in
+ * quirks mode.
+ */
+goog.define('goog.dom.ASSUME_QUIRKS_MODE', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile time that the browser is in
+ * standards compliance mode.
+ */
+goog.define('goog.dom.ASSUME_STANDARDS_MODE', false);
+
+
+/**
+ * Whether we know the compatibility mode at compile time.
+ * @type {boolean}
+ * @private
+ */
+goog.dom.COMPAT_MODE_KNOWN_ =
+ goog.dom.ASSUME_QUIRKS_MODE || goog.dom.ASSUME_STANDARDS_MODE;
+
+
+/**
+ * Gets the DomHelper object for the document where the element resides.
+ * @param {(Node|Window)=} opt_element If present, gets the DomHelper for this
+ * element.
+ * @return {!goog.dom.DomHelper} The DomHelper.
+ */
+goog.dom.getDomHelper = function(opt_element) {
+ return opt_element ?
+ new goog.dom.DomHelper(goog.dom.getOwnerDocument(opt_element)) :
+ (goog.dom.defaultDomHelper_ ||
+ (goog.dom.defaultDomHelper_ = new goog.dom.DomHelper()));
+};
+
+
+/**
+ * Cached default DOM helper.
+ * @type {!goog.dom.DomHelper|undefined}
+ * @private
+ */
+goog.dom.defaultDomHelper_;
+
+
+/**
+ * Gets the document object being used by the dom library.
+ * @return {!Document} Document object.
+ */
+goog.dom.getDocument = function() {
+ return document;
+};
+
+
+/**
+ * Gets an element from the current document by element id.
+ *
+ * If an Element is passed in, it is returned.
+ *
+ * @param {string|Element} element Element ID or a DOM node.
+ * @return {Element} The element with the given ID, or the node passed in.
+ */
+goog.dom.getElement = function(element) {
+ return goog.dom.getElementHelper_(document, element);
+};
+
+
+/**
+ * Gets an element by id from the given document (if present).
+ * If an element is given, it is returned.
+ * @param {!Document} doc
+ * @param {string|Element} element Element ID or a DOM node.
+ * @return {Element} The resulting element.
+ * @private
+ */
+goog.dom.getElementHelper_ = function(doc, element) {
+ return goog.isString(element) ? doc.getElementById(element) : element;
+};
+
+
+/**
+ * Gets an element by id, asserting that the element is found.
+ *
+ * This is used when an element is expected to exist, and should fail with
+ * an assertion error if it does not (if assertions are enabled).
+ *
+ * @param {string} id Element ID.
+ * @return {!Element} The element with the given ID, if it exists.
+ */
+goog.dom.getRequiredElement = function(id) {
+ return goog.dom.getRequiredElementHelper_(document, id);
+};
+
+
+/**
+ * Helper function for getRequiredElementHelper functions, both static and
+ * on DomHelper. Asserts the element with the given id exists.
+ * @param {!Document} doc
+ * @param {string} id
+ * @return {!Element} The element with the given ID, if it exists.
+ * @private
+ */
+goog.dom.getRequiredElementHelper_ = function(doc, id) {
+ // To prevent users passing in Elements as is permitted in getElement().
+ goog.asserts.assertString(id);
+ var element = goog.dom.getElementHelper_(doc, id);
+ element =
+ goog.asserts.assertElement(element, 'No element found with id: ' + id);
+ return element;
+};
+
+
+/**
+ * Alias for getElement.
+ * @param {string|Element} element Element ID or a DOM node.
+ * @return {Element} The element with the given ID, or the node passed in.
+ * @deprecated Use {@link goog.dom.getElement} instead.
+ */
+goog.dom.$ = goog.dom.getElement;
+
+
+/**
+ * Looks up elements by both tag and class name, using browser native functions
+ * ({@code querySelectorAll}, {@code getElementsByTagName} or
+ * {@code getElementsByClassName}) where possible. This function
+ * is a useful, if limited, way of collecting a list of DOM elements
+ * with certain characteristics. {@code goog.dom.query} offers a
+ * more powerful and general solution which allows matching on CSS3
+ * selector expressions, but at increased cost in code size. If all you
+ * need is particular tags belonging to a single class, this function
+ * is fast and sleek.
+ *
+ * Note that tag names are case sensitive in the SVG namespace, and this
+ * function converts opt_tag to uppercase for comparisons. For queries in the
+ * SVG namespace you should use querySelector or querySelectorAll instead.
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=963870
+ * https://bugs.webkit.org/show_bug.cgi?id=83438
+ *
+ * @see {goog.dom.query}
+ *
+ * @param {?string=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {!IArrayLike<!Element>} Array-like list of elements (only a length
+ * property and numerical indices are guaranteed to exist).
+ */
+goog.dom.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) {
+ return goog.dom.getElementsByTagNameAndClass_(
+ document, opt_tag, opt_class, opt_el);
+};
+
+
+/**
+ * Returns a static, array-like list of the elements with the provided
+ * className.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {!IArrayLike<!Element>} The items found with the class name provided.
+ */
+goog.dom.getElementsByClass = function(className, opt_el) {
+ var parent = opt_el || document;
+ if (goog.dom.canUseQuerySelector_(parent)) {
+ return parent.querySelectorAll('.' + className);
+ }
+ return goog.dom.getElementsByTagNameAndClass_(
+ document, '*', className, opt_el);
+};
+
+
+/**
+ * Returns the first element with the provided className.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {Element|Document=} opt_el Optional element to look in.
+ * @return {Element} The first item with the class name provided.
+ */
+goog.dom.getElementByClass = function(className, opt_el) {
+ var parent = opt_el || document;
+ var retVal = null;
+ if (parent.getElementsByClassName) {
+ retVal = parent.getElementsByClassName(className)[0];
+ } else if (goog.dom.canUseQuerySelector_(parent)) {
+ retVal = parent.querySelector('.' + className);
+ } else {
+ retVal = goog.dom.getElementsByTagNameAndClass_(
+ document, '*', className, opt_el)[0];
+ }
+ return retVal || null;
+};
+
+
+/**
+ * Ensures an element with the given className exists, and then returns the
+ * first element with the provided className.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {!Element|!Document=} opt_root Optional element or document to look
+ * in.
+ * @return {!Element} The first item with the class name provided.
+ * @throws {goog.asserts.AssertionError} Thrown if no element is found.
+ */
+goog.dom.getRequiredElementByClass = function(className, opt_root) {
+ var retValue = goog.dom.getElementByClass(className, opt_root);
+ return goog.asserts.assert(
+ retValue, 'No element found with className: ' + className);
+};
+
+
+/**
+ * Prefer the standardized (http://www.w3.org/TR/selectors-api/), native and
+ * fast W3C Selectors API.
+ * @param {!(Element|Document)} parent The parent document object.
+ * @return {boolean} whether or not we can use parent.querySelector* APIs.
+ * @private
+ */
+goog.dom.canUseQuerySelector_ = function(parent) {
+ return !!(parent.querySelectorAll && parent.querySelector);
+};
+
+
+/**
+ * Helper for {@code getElementsByTagNameAndClass}.
+ * @param {!Document} doc The document to get the elements in.
+ * @param {?string=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {!IArrayLike<!Element>} Array-like list of elements (only a length
+ * property and numerical indices are guaranteed to exist).
+ * @private
+ */
+goog.dom.getElementsByTagNameAndClass_ = function(
+ doc, opt_tag, opt_class, opt_el) {
+ var parent = opt_el || doc;
+ var tagName = (opt_tag && opt_tag != '*') ? opt_tag.toUpperCase() : '';
+
+ if (goog.dom.canUseQuerySelector_(parent) && (tagName || opt_class)) {
+ var query = tagName + (opt_class ? '.' + opt_class : '');
+ return parent.querySelectorAll(query);
+ }
+
+ // Use the native getElementsByClassName if available, under the assumption
+ // that even when the tag name is specified, there will be fewer elements to
+ // filter through when going by class than by tag name
+ if (opt_class && parent.getElementsByClassName) {
+ var els = parent.getElementsByClassName(opt_class);
+
+ if (tagName) {
+ var arrayLike = {};
+ var len = 0;
+
+ // Filter for specific tags if requested.
+ for (var i = 0, el; el = els[i]; i++) {
+ if (tagName == el.nodeName) {
+ arrayLike[len++] = el;
+ }
+ }
+ arrayLike.length = len;
+
+ return /** @type {!IArrayLike<!Element>} */ (arrayLike);
+ } else {
+ return els;
+ }
+ }
+
+ var els = parent.getElementsByTagName(tagName || '*');
+
+ if (opt_class) {
+ var arrayLike = {};
+ var len = 0;
+ for (var i = 0, el; el = els[i]; i++) {
+ var className = el.className;
+ // Check if className has a split function since SVG className does not.
+ if (typeof className.split == 'function' &&
+ goog.array.contains(className.split(/\s+/), opt_class)) {
+ arrayLike[len++] = el;
+ }
+ }
+ arrayLike.length = len;
+ return /** @type {!IArrayLike<!Element>} */ (arrayLike);
+ } else {
+ return els;
+ }
+};
+
+
+/**
+ * Alias for {@code getElementsByTagNameAndClass}.
+ * @param {?string=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {Element=} opt_el Optional element to look in.
+ * @return {!IArrayLike<!Element>} Array-like list of elements (only a length
+ * property and numerical indices are guaranteed to exist).
+ * @deprecated Use {@link goog.dom.getElementsByTagNameAndClass} instead.
+ */
+goog.dom.$$ = goog.dom.getElementsByTagNameAndClass;
+
+
+/**
+ * Sets multiple properties on a node.
+ * @param {Element} element DOM node to set properties on.
+ * @param {Object} properties Hash of property:value pairs.
+ */
+goog.dom.setProperties = function(element, properties) {
+ goog.object.forEach(properties, function(val, key) {
+ if (key == 'style') {
+ element.style.cssText = val;
+ } else if (key == 'class') {
+ element.className = val;
+ } else if (key == 'for') {
+ element.htmlFor = val;
+ } else if (goog.dom.DIRECT_ATTRIBUTE_MAP_.hasOwnProperty(key)) {
+ element.setAttribute(goog.dom.DIRECT_ATTRIBUTE_MAP_[key], val);
+ } else if (
+ goog.string.startsWith(key, 'aria-') ||
+ goog.string.startsWith(key, 'data-')) {
+ element.setAttribute(key, val);
+ } else {
+ element[key] = val;
+ }
+ });
+};
+
+
+/**
+ * Map of attributes that should be set using
+ * element.setAttribute(key, val) instead of element[key] = val. Used
+ * by goog.dom.setProperties.
+ *
+ * @private {!Object<string, string>}
+ * @const
+ */
+goog.dom.DIRECT_ATTRIBUTE_MAP_ = {
+ 'cellpadding': 'cellPadding',
+ 'cellspacing': 'cellSpacing',
+ 'colspan': 'colSpan',
+ 'frameborder': 'frameBorder',
+ 'height': 'height',
+ 'maxlength': 'maxLength',
+ 'nonce': 'nonce',
+ 'role': 'role',
+ 'rowspan': 'rowSpan',
+ 'type': 'type',
+ 'usemap': 'useMap',
+ 'valign': 'vAlign',
+ 'width': 'width'
+};
+
+
+/**
+ * Gets the dimensions of the viewport.
+ *
+ * Gecko Standards mode:
+ * docEl.clientWidth Width of viewport excluding scrollbar.
+ * win.innerWidth Width of viewport including scrollbar.
+ * body.clientWidth Width of body element.
+ *
+ * docEl.clientHeight Height of viewport excluding scrollbar.
+ * win.innerHeight Height of viewport including scrollbar.
+ * body.clientHeight Height of document.
+ *
+ * Gecko Backwards compatible mode:
+ * docEl.clientWidth Width of viewport excluding scrollbar.
+ * win.innerWidth Width of viewport including scrollbar.
+ * body.clientWidth Width of viewport excluding scrollbar.
+ *
+ * docEl.clientHeight Height of document.
+ * win.innerHeight Height of viewport including scrollbar.
+ * body.clientHeight Height of viewport excluding scrollbar.
+ *
+ * IE6/7 Standards mode:
+ * docEl.clientWidth Width of viewport excluding scrollbar.
+ * win.innerWidth Undefined.
+ * body.clientWidth Width of body element.
+ *
+ * docEl.clientHeight Height of viewport excluding scrollbar.
+ * win.innerHeight Undefined.
+ * body.clientHeight Height of document element.
+ *
+ * IE5 + IE6/7 Backwards compatible mode:
+ * docEl.clientWidth 0.
+ * win.innerWidth Undefined.
+ * body.clientWidth Width of viewport excluding scrollbar.
+ *
+ * docEl.clientHeight 0.
+ * win.innerHeight Undefined.
+ * body.clientHeight Height of viewport excluding scrollbar.
+ *
+ * Opera 9 Standards and backwards compatible mode:
+ * docEl.clientWidth Width of viewport excluding scrollbar.
+ * win.innerWidth Width of viewport including scrollbar.
+ * body.clientWidth Width of viewport excluding scrollbar.
+ *
+ * docEl.clientHeight Height of document.
+ * win.innerHeight Height of viewport including scrollbar.
+ * body.clientHeight Height of viewport excluding scrollbar.
+ *
+ * WebKit:
+ * Safari 2
+ * docEl.clientHeight Same as scrollHeight.
+ * docEl.clientWidth Same as innerWidth.
+ * win.innerWidth Width of viewport excluding scrollbar.
+ * win.innerHeight Height of the viewport including scrollbar.
+ * frame.innerHeight Height of the viewport exluding scrollbar.
+ *
+ * Safari 3 (tested in 522)
+ *
+ * docEl.clientWidth Width of viewport excluding scrollbar.
+ * docEl.clientHeight Height of viewport excluding scrollbar in strict mode.
+ * body.clientHeight Height of viewport excluding scrollbar in quirks mode.
+ *
+ * @param {Window=} opt_window Optional window element to test.
+ * @return {!goog.math.Size} Object with values 'width' and 'height'.
+ */
+goog.dom.getViewportSize = function(opt_window) {
+ // TODO(arv): This should not take an argument
+ return goog.dom.getViewportSize_(opt_window || window);
+};
+
+
+/**
+ * Helper for {@code getViewportSize}.
+ * @param {Window} win The window to get the view port size for.
+ * @return {!goog.math.Size} Object with values 'width' and 'height'.
+ * @private
+ */
+goog.dom.getViewportSize_ = function(win) {
+ var doc = win.document;
+ var el = goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body;
+ return new goog.math.Size(el.clientWidth, el.clientHeight);
+};
+
+
+/**
+ * Calculates the height of the document.
+ *
+ * @return {number} The height of the current document.
+ */
+goog.dom.getDocumentHeight = function() {
+ return goog.dom.getDocumentHeight_(window);
+};
+
+/**
+ * Calculates the height of the document of the given window.
+ *
+ * @param {!Window} win The window whose document height to retrieve.
+ * @return {number} The height of the document of the given window.
+ */
+goog.dom.getDocumentHeightForWindow = function(win) {
+ return goog.dom.getDocumentHeight_(win);
+};
+
+/**
+ * Calculates the height of the document of the given window.
+ *
+ * Function code copied from the opensocial gadget api:
+ * gadgets.window.adjustHeight(opt_height)
+ *
+ * @private
+ * @param {!Window} win The window whose document height to retrieve.
+ * @return {number} The height of the document of the given window.
+ */
+goog.dom.getDocumentHeight_ = function(win) {
+ // NOTE(eae): This method will return the window size rather than the document
+ // size in webkit quirks mode.
+ var doc = win.document;
+ var height = 0;
+
+ if (doc) {
+ // Calculating inner content height is hard and different between
+ // browsers rendering in Strict vs. Quirks mode. We use a combination of
+ // three properties within document.body and document.documentElement:
+ // - scrollHeight
+ // - offsetHeight
+ // - clientHeight
+ // These values differ significantly between browsers and rendering modes.
+ // But there are patterns. It just takes a lot of time and persistence
+ // to figure out.
+
+ var body = doc.body;
+ var docEl = /** @type {!HTMLElement} */ (doc.documentElement);
+ if (!(docEl && body)) {
+ return 0;
+ }
+
+ // Get the height of the viewport
+ var vh = goog.dom.getViewportSize_(win).height;
+ if (goog.dom.isCss1CompatMode_(doc) && docEl.scrollHeight) {
+ // In Strict mode:
+ // The inner content height is contained in either:
+ // document.documentElement.scrollHeight
+ // document.documentElement.offsetHeight
+ // Based on studying the values output by different browsers,
+ // use the value that's NOT equal to the viewport height found above.
+ height =
+ docEl.scrollHeight != vh ? docEl.scrollHeight : docEl.offsetHeight;
+ } else {
+ // In Quirks mode:
+ // documentElement.clientHeight is equal to documentElement.offsetHeight
+ // except in IE. In most browsers, document.documentElement can be used
+ // to calculate the inner content height.
+ // However, in other browsers (e.g. IE), document.body must be used
+ // instead. How do we know which one to use?
+ // If document.documentElement.clientHeight does NOT equal
+ // document.documentElement.offsetHeight, then use document.body.
+ var sh = docEl.scrollHeight;
+ var oh = docEl.offsetHeight;
+ if (docEl.clientHeight != oh) {
+ sh = body.scrollHeight;
+ oh = body.offsetHeight;
+ }
+
+ // Detect whether the inner content height is bigger or smaller
+ // than the bounding box (viewport). If bigger, take the larger
+ // value. If smaller, take the smaller value.
+ if (sh > vh) {
+ // Content is larger
+ height = sh > oh ? sh : oh;
+ } else {
+ // Content is smaller
+ height = sh < oh ? sh : oh;
+ }
+ }
+ }
+
+ return height;
+};
+
+
+/**
+ * Gets the page scroll distance as a coordinate object.
+ *
+ * @param {Window=} opt_window Optional window element to test.
+ * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.
+ * @deprecated Use {@link goog.dom.getDocumentScroll} instead.
+ */
+goog.dom.getPageScroll = function(opt_window) {
+ var win = opt_window || goog.global || window;
+ return goog.dom.getDomHelper(win.document).getDocumentScroll();
+};
+
+
+/**
+ * Gets the document scroll distance as a coordinate object.
+ *
+ * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.
+ */
+goog.dom.getDocumentScroll = function() {
+ return goog.dom.getDocumentScroll_(document);
+};
+
+
+/**
+ * Helper for {@code getDocumentScroll}.
+ *
+ * @param {!Document} doc The document to get the scroll for.
+ * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.
+ * @private
+ */
+goog.dom.getDocumentScroll_ = function(doc) {
+ var el = goog.dom.getDocumentScrollElement_(doc);
+ var win = goog.dom.getWindow_(doc);
+ if (goog.userAgent.IE && goog.userAgent.isVersionOrHigher('10') &&
+ win.pageYOffset != el.scrollTop) {
+ // The keyboard on IE10 touch devices shifts the page using the pageYOffset
+ // without modifying scrollTop. For this case, we want the body scroll
+ // offsets.
+ return new goog.math.Coordinate(el.scrollLeft, el.scrollTop);
+ }
+ return new goog.math.Coordinate(
+ win.pageXOffset || el.scrollLeft, win.pageYOffset || el.scrollTop);
+};
+
+
+/**
+ * Gets the document scroll element.
+ * @return {!Element} Scrolling element.
+ */
+goog.dom.getDocumentScrollElement = function() {
+ return goog.dom.getDocumentScrollElement_(document);
+};
+
+
+/**
+ * Helper for {@code getDocumentScrollElement}.
+ * @param {!Document} doc The document to get the scroll element for.
+ * @return {!Element} Scrolling element.
+ * @private
+ */
+goog.dom.getDocumentScrollElement_ = function(doc) {
+ // Old WebKit needs body.scrollLeft in both quirks mode and strict mode. We
+ // also default to the documentElement if the document does not have a body
+ // (e.g. a SVG document).
+ // Uses http://dev.w3.org/csswg/cssom-view/#dom-document-scrollingelement to
+ // avoid trying to guess about browser behavior from the UA string.
+ if (doc.scrollingElement) {
+ return doc.scrollingElement;
+ }
+ if (!goog.userAgent.WEBKIT && goog.dom.isCss1CompatMode_(doc)) {
+ return doc.documentElement;
+ }
+ return doc.body || doc.documentElement;
+};
+
+
+/**
+ * Gets the window object associated with the given document.
+ *
+ * @param {Document=} opt_doc Document object to get window for.
+ * @return {!Window} The window associated with the given document.
+ */
+goog.dom.getWindow = function(opt_doc) {
+ // TODO(arv): This should not take an argument.
+ return opt_doc ? goog.dom.getWindow_(opt_doc) : window;
+};
+
+
+/**
+ * Helper for {@code getWindow}.
+ *
+ * @param {!Document} doc Document object to get window for.
+ * @return {!Window} The window associated with the given document.
+ * @private
+ */
+goog.dom.getWindow_ = function(doc) {
+ return doc.parentWindow || doc.defaultView;
+};
+
+
+/**
+ * Returns a dom node with a set of attributes. This function accepts varargs
+ * for subsequent nodes to be added. Subsequent nodes will be added to the
+ * first node as childNodes.
+ *
+ * So:
+ * <code>createDom('div', null, createDom('p'), createDom('p'));</code>
+ * would return a div with two child paragraphs
+ *
+ * @param {string} tagName Tag to create.
+ * @param {(Object|Array<string>|string)=} opt_attributes If object, then a map
+ * of name-value pairs for attributes. If a string, then this is the
+ * className of the new element. If an array, the elements will be joined
+ * together as the className of the new element.
+ * @param {...(Object|string|Array|NodeList)} var_args Further DOM nodes or
+ * strings for text nodes. If one of the var_args is an array or NodeList,
+ * its elements will be added as childNodes instead.
+ * @return {!Element} Reference to a DOM node.
+ */
+goog.dom.createDom = function(tagName, opt_attributes, var_args) {
+ return goog.dom.createDom_(document, arguments);
+};
+
+
+/**
+ * Helper for {@code createDom}.
+ * @param {!Document} doc The document to create the DOM in.
+ * @param {!Arguments} args Argument object passed from the callers. See
+ * {@code goog.dom.createDom} for details.
+ * @return {!Element} Reference to a DOM node.
+ * @private
+ */
+goog.dom.createDom_ = function(doc, args) {
+ var tagName = args[0];
+ var attributes = args[1];
+
+ // Internet Explorer is dumb:
+ // name: https://msdn.microsoft.com/en-us/library/ms534184(v=vs.85).aspx
+ // type: https://msdn.microsoft.com/en-us/library/ms534700(v=vs.85).aspx
+ // Also does not allow setting of 'type' attribute on 'input' or 'button'.
+ if (!goog.dom.BrowserFeature.CAN_ADD_NAME_OR_TYPE_ATTRIBUTES && attributes &&
+ (attributes.name || attributes.type)) {
+ var tagNameArr = ['<', tagName];
+ if (attributes.name) {
+ tagNameArr.push(' name="', goog.string.htmlEscape(attributes.name), '"');
+ }
+ if (attributes.type) {
+ tagNameArr.push(' type="', goog.string.htmlEscape(attributes.type), '"');
+
+ // Clone attributes map to remove 'type' without mutating the input.
+ var clone = {};
+ goog.object.extend(clone, attributes);
+
+ // JSCompiler can't see how goog.object.extend added this property,
+ // because it was essentially added by reflection.
+ // So it needs to be quoted.
+ delete clone['type'];
+
+ attributes = clone;
+ }
+ tagNameArr.push('>');
+ tagName = tagNameArr.join('');
+ }
+
+ var element = doc.createElement(tagName);
+
+ if (attributes) {
+ if (goog.isString(attributes)) {
+ element.className = attributes;
+ } else if (goog.isArray(attributes)) {
+ element.className = attributes.join(' ');
+ } else {
+ goog.dom.setProperties(element, attributes);
+ }
+ }
+
+ if (args.length > 2) {
+ goog.dom.append_(doc, element, args, 2);
+ }
+
+ return element;
+};
+
+
+/**
+ * Appends a node with text or other nodes.
+ * @param {!Document} doc The document to create new nodes in.
+ * @param {!Node} parent The node to append nodes to.
+ * @param {!Arguments} args The values to add. See {@code goog.dom.append}.
+ * @param {number} startIndex The index of the array to start from.
+ * @private
+ */
+goog.dom.append_ = function(doc, parent, args, startIndex) {
+ function childHandler(child) {
+ // TODO(user): More coercion, ala MochiKit?
+ if (child) {
+ parent.appendChild(
+ goog.isString(child) ? doc.createTextNode(child) : child);
+ }
+ }
+
+ for (var i = startIndex; i < args.length; i++) {
+ var arg = args[i];
+ // TODO(attila): Fix isArrayLike to return false for a text node.
+ if (goog.isArrayLike(arg) && !goog.dom.isNodeLike(arg)) {
+ // If the argument is a node list, not a real array, use a clone,
+ // because forEach can't be used to mutate a NodeList.
+ goog.array.forEach(
+ goog.dom.isNodeList(arg) ? goog.array.toArray(arg) : arg,
+ childHandler);
+ } else {
+ childHandler(arg);
+ }
+ }
+};
+
+
+/**
+ * Alias for {@code createDom}.
+ * @param {string} tagName Tag to create.
+ * @param {(string|Object)=} opt_attributes If object, then a map of name-value
+ * pairs for attributes. If a string, then this is the className of the new
+ * element.
+ * @param {...(Object|string|Array|NodeList)} var_args Further DOM nodes or
+ * strings for text nodes. If one of the var_args is an array, its
+ * children will be added as childNodes instead.
+ * @return {!Element} Reference to a DOM node.
+ * @deprecated Use {@link goog.dom.createDom} instead.
+ */
+goog.dom.$dom = goog.dom.createDom;
+
+
+/**
+ * Creates a new element.
+ * @param {string} name Tag name.
+ * @return {!Element} The new element.
+ */
+goog.dom.createElement = function(name) {
+ return document.createElement(name);
+};
+
+
+/**
+ * Creates a new text node.
+ * @param {number|string} content Content.
+ * @return {!Text} The new text node.
+ */
+goog.dom.createTextNode = function(content) {
+ return document.createTextNode(String(content));
+};
+
+
+/**
+ * Create a table.
+ * @param {number} rows The number of rows in the table. Must be >= 1.
+ * @param {number} columns The number of columns in the table. Must be >= 1.
+ * @param {boolean=} opt_fillWithNbsp If true, fills table entries with
+ * {@code goog.string.Unicode.NBSP} characters.
+ * @return {!Element} The created table.
+ */
+goog.dom.createTable = function(rows, columns, opt_fillWithNbsp) {
+ // TODO(user): Return HTMLTableElement, also in prototype function.
+ // Callers need to be updated to e.g. not assign numbers to table.cellSpacing.
+ return goog.dom.createTable_(document, rows, columns, !!opt_fillWithNbsp);
+};
+
+
+/**
+ * Create a table.
+ * @param {!Document} doc Document object to use to create the table.
+ * @param {number} rows The number of rows in the table. Must be >= 1.
+ * @param {number} columns The number of columns in the table. Must be >= 1.
+ * @param {boolean} fillWithNbsp If true, fills table entries with
+ * {@code goog.string.Unicode.NBSP} characters.
+ * @return {!HTMLTableElement} The created table.
+ * @private
+ */
+goog.dom.createTable_ = function(doc, rows, columns, fillWithNbsp) {
+ var table = /** @type {!HTMLTableElement} */
+ (doc.createElement(goog.dom.TagName.TABLE));
+ var tbody = table.appendChild(doc.createElement(goog.dom.TagName.TBODY));
+ for (var i = 0; i < rows; i++) {
+ var tr = doc.createElement(goog.dom.TagName.TR);
+ for (var j = 0; j < columns; j++) {
+ var td = doc.createElement(goog.dom.TagName.TD);
+ // IE <= 9 will create a text node if we set text content to the empty
+ // string, so we avoid doing it unless necessary. This ensures that the
+ // same DOM tree is returned on all browsers.
+ if (fillWithNbsp) {
+ goog.dom.setTextContent(td, goog.string.Unicode.NBSP);
+ }
+ tr.appendChild(td);
+ }
+ tbody.appendChild(tr);
+ }
+ return table;
+};
+
+
+
+/**
+ * Creates a new Node from constant strings of HTML markup.
+ * @param {...!goog.string.Const} var_args The HTML strings to concatenate then
+ * convert into a node.
+ * @return {!Node}
+ */
+goog.dom.constHtmlToNode = function(var_args) {
+ var stringArray = goog.array.map(arguments, goog.string.Const.unwrap);
+ var safeHtml =
+ goog.html.uncheckedconversions
+ .safeHtmlFromStringKnownToSatisfyTypeContract(
+ goog.string.Const.from(
+ 'Constant HTML string, that gets turned into a ' +
+ 'Node later, so it will be automatically balanced.'),
+ stringArray.join(''));
+ return goog.dom.safeHtmlToNode(safeHtml);
+};
+
+
+/**
+ * Converts HTML markup into a node. This is a safe version of
+ * {@code goog.dom.htmlToDocumentFragment} which is now deleted.
+ * @param {!goog.html.SafeHtml} html The HTML markup to convert.
+ * @return {!Node} The resulting node.
+ */
+goog.dom.safeHtmlToNode = function(html) {
+ return goog.dom.safeHtmlToNode_(document, html);
+};
+
+
+/**
+ * Helper for {@code safeHtmlToNode}.
+ * @param {!Document} doc The document.
+ * @param {!goog.html.SafeHtml} html The HTML markup to convert.
+ * @return {!Node} The resulting node.
+ * @private
+ */
+goog.dom.safeHtmlToNode_ = function(doc, html) {
+ var tempDiv = doc.createElement(goog.dom.TagName.DIV);
+ if (goog.dom.BrowserFeature.INNER_HTML_NEEDS_SCOPED_ELEMENT) {
+ goog.dom.safe.setInnerHtml(
+ tempDiv, goog.html.SafeHtml.concat(goog.html.SafeHtml.BR, html));
+ tempDiv.removeChild(tempDiv.firstChild);
+ } else {
+ goog.dom.safe.setInnerHtml(tempDiv, html);
+ }
+ return goog.dom.childrenToNode_(doc, tempDiv);
+};
+
+
+/**
+ * Helper for {@code safeHtmlToNode_}.
+ * @param {!Document} doc The document.
+ * @param {!Node} tempDiv The input node.
+ * @return {!Node} The resulting node.
+ * @private
+ */
+goog.dom.childrenToNode_ = function(doc, tempDiv) {
+ if (tempDiv.childNodes.length == 1) {
+ return tempDiv.removeChild(tempDiv.firstChild);
+ } else {
+ var fragment = doc.createDocumentFragment();
+ while (tempDiv.firstChild) {
+ fragment.appendChild(tempDiv.firstChild);
+ }
+ return fragment;
+ }
+};
+
+
+/**
+ * Returns true if the browser is in "CSS1-compatible" (standards-compliant)
+ * mode, false otherwise.
+ * @return {boolean} True if in CSS1-compatible mode.
+ */
+goog.dom.isCss1CompatMode = function() {
+ return goog.dom.isCss1CompatMode_(document);
+};
+
+
+/**
+ * Returns true if the browser is in "CSS1-compatible" (standards-compliant)
+ * mode, false otherwise.
+ * @param {!Document} doc The document to check.
+ * @return {boolean} True if in CSS1-compatible mode.
+ * @private
+ */
+goog.dom.isCss1CompatMode_ = function(doc) {
+ if (goog.dom.COMPAT_MODE_KNOWN_) {
+ return goog.dom.ASSUME_STANDARDS_MODE;
+ }
+
+ return doc.compatMode == 'CSS1Compat';
+};
+
+
+/**
+ * Determines if the given node can contain children, intended to be used for
+ * HTML generation.
+ *
+ * IE natively supports node.canHaveChildren but has inconsistent behavior.
+ * Prior to IE8 the base tag allows children and in IE9 all nodes return true
+ * for canHaveChildren.
+ *
+ * In practice all non-IE browsers allow you to add children to any node, but
+ * the behavior is inconsistent:
+ *
+ * <pre>
+ * var a = document.createElement(goog.dom.TagName.BR);
+ * a.appendChild(document.createTextNode('foo'));
+ * a.appendChild(document.createTextNode('bar'));
+ * console.log(a.childNodes.length); // 2
+ * console.log(a.innerHTML); // Chrome: "", IE9: "foobar", FF3.5: "foobar"
+ * </pre>
+ *
+ * For more information, see:
+ * http://dev.w3.org/html5/markup/syntax.html#syntax-elements
+ *
+ * TODO(user): Rename shouldAllowChildren() ?
+ *
+ * @param {Node} node The node to check.
+ * @return {boolean} Whether the node can contain children.
+ */
+goog.dom.canHaveChildren = function(node) {
+ if (node.nodeType != goog.dom.NodeType.ELEMENT) {
+ return false;
+ }
+ switch (/** @type {!Element} */ (node).tagName) {
+ case goog.dom.TagName.APPLET:
+ case goog.dom.TagName.AREA:
+ case goog.dom.TagName.BASE:
+ case goog.dom.TagName.BR:
+ case goog.dom.TagName.COL:
+ case goog.dom.TagName.COMMAND:
+ case goog.dom.TagName.EMBED:
+ case goog.dom.TagName.FRAME:
+ case goog.dom.TagName.HR:
+ case goog.dom.TagName.IMG:
+ case goog.dom.TagName.INPUT:
+ case goog.dom.TagName.IFRAME:
+ case goog.dom.TagName.ISINDEX:
+ case goog.dom.TagName.KEYGEN:
+ case goog.dom.TagName.LINK:
+ case goog.dom.TagName.NOFRAMES:
+ case goog.dom.TagName.NOSCRIPT:
+ case goog.dom.TagName.META:
+ case goog.dom.TagName.OBJECT:
+ case goog.dom.TagName.PARAM:
+ case goog.dom.TagName.SCRIPT:
+ case goog.dom.TagName.SOURCE:
+ case goog.dom.TagName.STYLE:
+ case goog.dom.TagName.TRACK:
+ case goog.dom.TagName.WBR:
+ return false;
+ }
+ return true;
+};
+
+
+/**
+ * Appends a child to a node.
+ * @param {Node} parent Parent.
+ * @param {Node} child Child.
+ */
+goog.dom.appendChild = function(parent, child) {
+ parent.appendChild(child);
+};
+
+
+/**
+ * Appends a node with text or other nodes.
+ * @param {!Node} parent The node to append nodes to.
+ * @param {...goog.dom.Appendable} var_args The things to append to the node.
+ * If this is a Node it is appended as is.
+ * If this is a string then a text node is appended.
+ * If this is an array like object then fields 0 to length - 1 are appended.
+ */
+goog.dom.append = function(parent, var_args) {
+ goog.dom.append_(goog.dom.getOwnerDocument(parent), parent, arguments, 1);
+};
+
+
+/**
+ * Removes all the child nodes on a DOM node.
+ * @param {Node} node Node to remove children from.
+ */
+goog.dom.removeChildren = function(node) {
+ // Note: Iterations over live collections can be slow, this is the fastest
+ // we could find. The double parenthesis are used to prevent JsCompiler and
+ // strict warnings.
+ var child;
+ while ((child = node.firstChild)) {
+ node.removeChild(child);
+ }
+};
+
+
+/**
+ * Inserts a new node before an existing reference node (i.e. as the previous
+ * sibling). If the reference node has no parent, then does nothing.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} refNode Reference node to insert before.
+ */
+goog.dom.insertSiblingBefore = function(newNode, refNode) {
+ if (refNode.parentNode) {
+ refNode.parentNode.insertBefore(newNode, refNode);
+ }
+};
+
+
+/**
+ * Inserts a new node after an existing reference node (i.e. as the next
+ * sibling). If the reference node has no parent, then does nothing.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} refNode Reference node to insert after.
+ */
+goog.dom.insertSiblingAfter = function(newNode, refNode) {
+ if (refNode.parentNode) {
+ refNode.parentNode.insertBefore(newNode, refNode.nextSibling);
+ }
+};
+
+
+/**
+ * Insert a child at a given index. If index is larger than the number of child
+ * nodes that the parent currently has, the node is inserted as the last child
+ * node.
+ * @param {Element} parent The element into which to insert the child.
+ * @param {Node} child The element to insert.
+ * @param {number} index The index at which to insert the new child node. Must
+ * not be negative.
+ */
+goog.dom.insertChildAt = function(parent, child, index) {
+ // Note that if the second argument is null, insertBefore
+ // will append the child at the end of the list of children.
+ parent.insertBefore(child, parent.childNodes[index] || null);
+};
+
+
+/**
+ * Removes a node from its parent.
+ * @param {Node} node The node to remove.
+ * @return {Node} The node removed if removed; else, null.
+ */
+goog.dom.removeNode = function(node) {
+ return node && node.parentNode ? node.parentNode.removeChild(node) : null;
+};
+
+
+/**
+ * Replaces a node in the DOM tree. Will do nothing if {@code oldNode} has no
+ * parent.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} oldNode Node to replace.
+ */
+goog.dom.replaceNode = function(newNode, oldNode) {
+ var parent = oldNode.parentNode;
+ if (parent) {
+ parent.replaceChild(newNode, oldNode);
+ }
+};
+
+
+/**
+ * Flattens an element. That is, removes it and replace it with its children.
+ * Does nothing if the element is not in the document.
+ * @param {Element} element The element to flatten.
+ * @return {Element|undefined} The original element, detached from the document
+ * tree, sans children; or undefined, if the element was not in the document
+ * to begin with.
+ */
+goog.dom.flattenElement = function(element) {
+ var child, parent = element.parentNode;
+ if (parent && parent.nodeType != goog.dom.NodeType.DOCUMENT_FRAGMENT) {
+ // Use IE DOM method (supported by Opera too) if available
+ if (element.removeNode) {
+ return /** @type {Element} */ (element.removeNode(false));
+ } else {
+ // Move all children of the original node up one level.
+ while ((child = element.firstChild)) {
+ parent.insertBefore(child, element);
+ }
+
+ // Detach the original element.
+ return /** @type {Element} */ (goog.dom.removeNode(element));
+ }
+ }
+};
+
+
+/**
+ * Returns an array containing just the element children of the given element.
+ * @param {Element} element The element whose element children we want.
+ * @return {!(Array<!Element>|NodeList<!Element>)} An array or array-like list
+ * of just the element children of the given element.
+ */
+goog.dom.getChildren = function(element) {
+ // We check if the children attribute is supported for child elements
+ // since IE8 misuses the attribute by also including comments.
+ if (goog.dom.BrowserFeature.CAN_USE_CHILDREN_ATTRIBUTE &&
+ element.children != undefined) {
+ return element.children;
+ }
+ // Fall back to manually filtering the element's child nodes.
+ return goog.array.filter(element.childNodes, function(node) {
+ return node.nodeType == goog.dom.NodeType.ELEMENT;
+ });
+};
+
+
+/**
+ * Returns the first child node that is an element.
+ * @param {Node} node The node to get the first child element of.
+ * @return {Element} The first child node of {@code node} that is an element.
+ */
+goog.dom.getFirstElementChild = function(node) {
+ if (goog.isDef(node.firstElementChild)) {
+ return /** @type {!Element} */ (node).firstElementChild;
+ }
+ return goog.dom.getNextElementNode_(node.firstChild, true);
+};
+
+
+/**
+ * Returns the last child node that is an element.
+ * @param {Node} node The node to get the last child element of.
+ * @return {Element} The last child node of {@code node} that is an element.
+ */
+goog.dom.getLastElementChild = function(node) {
+ if (goog.isDef(node.lastElementChild)) {
+ return /** @type {!Element} */ (node).lastElementChild;
+ }
+ return goog.dom.getNextElementNode_(node.lastChild, false);
+};
+
+
+/**
+ * Returns the first next sibling that is an element.
+ * @param {Node} node The node to get the next sibling element of.
+ * @return {Element} The next sibling of {@code node} that is an element.
+ */
+goog.dom.getNextElementSibling = function(node) {
+ if (goog.isDef(node.nextElementSibling)) {
+ return /** @type {!Element} */ (node).nextElementSibling;
+ }
+ return goog.dom.getNextElementNode_(node.nextSibling, true);
+};
+
+
+/**
+ * Returns the first previous sibling that is an element.
+ * @param {Node} node The node to get the previous sibling element of.
+ * @return {Element} The first previous sibling of {@code node} that is
+ * an element.
+ */
+goog.dom.getPreviousElementSibling = function(node) {
+ if (goog.isDef(node.previousElementSibling)) {
+ return /** @type {!Element} */ (node).previousElementSibling;
+ }
+ return goog.dom.getNextElementNode_(node.previousSibling, false);
+};
+
+
+/**
+ * Returns the first node that is an element in the specified direction,
+ * starting with {@code node}.
+ * @param {Node} node The node to get the next element from.
+ * @param {boolean} forward Whether to look forwards or backwards.
+ * @return {Element} The first element.
+ * @private
+ */
+goog.dom.getNextElementNode_ = function(node, forward) {
+ while (node && node.nodeType != goog.dom.NodeType.ELEMENT) {
+ node = forward ? node.nextSibling : node.previousSibling;
+ }
+
+ return /** @type {Element} */ (node);
+};
+
+
+/**
+ * Returns the next node in source order from the given node.
+ * @param {Node} node The node.
+ * @return {Node} The next node in the DOM tree, or null if this was the last
+ * node.
+ */
+goog.dom.getNextNode = function(node) {
+ if (!node) {
+ return null;
+ }
+
+ if (node.firstChild) {
+ return node.firstChild;
+ }
+
+ while (node && !node.nextSibling) {
+ node = node.parentNode;
+ }
+
+ return node ? node.nextSibling : null;
+};
+
+
+/**
+ * Returns the previous node in source order from the given node.
+ * @param {Node} node The node.
+ * @return {Node} The previous node in the DOM tree, or null if this was the
+ * first node.
+ */
+goog.dom.getPreviousNode = function(node) {
+ if (!node) {
+ return null;
+ }
+
+ if (!node.previousSibling) {
+ return node.parentNode;
+ }
+
+ node = node.previousSibling;
+ while (node && node.lastChild) {
+ node = node.lastChild;
+ }
+
+ return node;
+};
+
+
+/**
+ * Whether the object looks like a DOM node.
+ * @param {?} obj The object being tested for node likeness.
+ * @return {boolean} Whether the object looks like a DOM node.
+ */
+goog.dom.isNodeLike = function(obj) {
+ return goog.isObject(obj) && obj.nodeType > 0;
+};
+
+
+/**
+ * Whether the object looks like an Element.
+ * @param {?} obj The object being tested for Element likeness.
+ * @return {boolean} Whether the object looks like an Element.
+ */
+goog.dom.isElement = function(obj) {
+ return goog.isObject(obj) && obj.nodeType == goog.dom.NodeType.ELEMENT;
+};
+
+
+/**
+ * Returns true if the specified value is a Window object. This includes the
+ * global window for HTML pages, and iframe windows.
+ * @param {?} obj Variable to test.
+ * @return {boolean} Whether the variable is a window.
+ */
+goog.dom.isWindow = function(obj) {
+ return goog.isObject(obj) && obj['window'] == obj;
+};
+
+
+/**
+ * Returns an element's parent, if it's an Element.
+ * @param {Element} element The DOM element.
+ * @return {Element} The parent, or null if not an Element.
+ */
+goog.dom.getParentElement = function(element) {
+ var parent;
+ if (goog.dom.BrowserFeature.CAN_USE_PARENT_ELEMENT_PROPERTY) {
+ var isIe9 = goog.userAgent.IE && goog.userAgent.isVersionOrHigher('9') &&
+ !goog.userAgent.isVersionOrHigher('10');
+ // SVG elements in IE9 can't use the parentElement property.
+ // goog.global['SVGElement'] is not defined in IE9 quirks mode.
+ if (!(isIe9 && goog.global['SVGElement'] &&
+ element instanceof goog.global['SVGElement'])) {
+ parent = element.parentElement;
+ if (parent) {
+ return parent;
+ }
+ }
+ }
+ parent = element.parentNode;
+ return goog.dom.isElement(parent) ? /** @type {!Element} */ (parent) : null;
+};
+
+
+/**
+ * Whether a node contains another node.
+ * @param {?Node} parent The node that should contain the other node.
+ * @param {?Node} descendant The node to test presence of.
+ * @return {boolean} Whether the parent node contains the descendent node.
+ */
+goog.dom.contains = function(parent, descendant) {
+ if (!parent || !descendant) {
+ return false;
+ }
+ // We use browser specific methods for this if available since it is faster
+ // that way.
+
+ // IE DOM
+ if (parent.contains && descendant.nodeType == goog.dom.NodeType.ELEMENT) {
+ return parent == descendant || parent.contains(descendant);
+ }
+
+ // W3C DOM Level 3
+ if (typeof parent.compareDocumentPosition != 'undefined') {
+ return parent == descendant ||
+ Boolean(parent.compareDocumentPosition(descendant) & 16);
+ }
+
+ // W3C DOM Level 1
+ while (descendant && parent != descendant) {
+ descendant = descendant.parentNode;
+ }
+ return descendant == parent;
+};
+
+
+/**
+ * Compares the document order of two nodes, returning 0 if they are the same
+ * node, a negative number if node1 is before node2, and a positive number if
+ * node2 is before node1. Note that we compare the order the tags appear in the
+ * document so in the tree <b><i>text</i></b> the B node is considered to be
+ * before the I node.
+ *
+ * @param {Node} node1 The first node to compare.
+ * @param {Node} node2 The second node to compare.
+ * @return {number} 0 if the nodes are the same node, a negative number if node1
+ * is before node2, and a positive number if node2 is before node1.
+ */
+goog.dom.compareNodeOrder = function(node1, node2) {
+ // Fall out quickly for equality.
+ if (node1 == node2) {
+ return 0;
+ }
+
+ // Use compareDocumentPosition where available
+ if (node1.compareDocumentPosition) {
+ // 4 is the bitmask for FOLLOWS.
+ return node1.compareDocumentPosition(node2) & 2 ? 1 : -1;
+ }
+
+ // Special case for document nodes on IE 7 and 8.
+ if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {
+ if (node1.nodeType == goog.dom.NodeType.DOCUMENT) {
+ return -1;
+ }
+ if (node2.nodeType == goog.dom.NodeType.DOCUMENT) {
+ return 1;
+ }
+ }
+
+ // Process in IE using sourceIndex - we check to see if the first node has
+ // a source index or if its parent has one.
+ if ('sourceIndex' in node1 ||
+ (node1.parentNode && 'sourceIndex' in node1.parentNode)) {
+ var isElement1 = node1.nodeType == goog.dom.NodeType.ELEMENT;
+ var isElement2 = node2.nodeType == goog.dom.NodeType.ELEMENT;
+
+ if (isElement1 && isElement2) {
+ return node1.sourceIndex - node2.sourceIndex;
+ } else {
+ var parent1 = node1.parentNode;
+ var parent2 = node2.parentNode;
+
+ if (parent1 == parent2) {
+ return goog.dom.compareSiblingOrder_(node1, node2);
+ }
+
+ if (!isElement1 && goog.dom.contains(parent1, node2)) {
+ return -1 * goog.dom.compareParentsDescendantNodeIe_(node1, node2);
+ }
+
+
+ if (!isElement2 && goog.dom.contains(parent2, node1)) {
+ return goog.dom.compareParentsDescendantNodeIe_(node2, node1);
+ }
+
+ return (isElement1 ? node1.sourceIndex : parent1.sourceIndex) -
+ (isElement2 ? node2.sourceIndex : parent2.sourceIndex);
+ }
+ }
+
+ // For Safari, we compare ranges.
+ var doc = goog.dom.getOwnerDocument(node1);
+
+ var range1, range2;
+ range1 = doc.createRange();
+ range1.selectNode(node1);
+ range1.collapse(true);
+
+ range2 = doc.createRange();
+ range2.selectNode(node2);
+ range2.collapse(true);
+
+ return range1.compareBoundaryPoints(
+ goog.global['Range'].START_TO_END, range2);
+};
+
+
+/**
+ * Utility function to compare the position of two nodes, when
+ * {@code textNode}'s parent is an ancestor of {@code node}. If this entry
+ * condition is not met, this function will attempt to reference a null object.
+ * @param {!Node} textNode The textNode to compare.
+ * @param {Node} node The node to compare.
+ * @return {number} -1 if node is before textNode, +1 otherwise.
+ * @private
+ */
+goog.dom.compareParentsDescendantNodeIe_ = function(textNode, node) {
+ var parent = textNode.parentNode;
+ if (parent == node) {
+ // If textNode is a child of node, then node comes first.
+ return -1;
+ }
+ var sibling = node;
+ while (sibling.parentNode != parent) {
+ sibling = sibling.parentNode;
+ }
+ return goog.dom.compareSiblingOrder_(sibling, textNode);
+};
+
+
+/**
+ * Utility function to compare the position of two nodes known to be non-equal
+ * siblings.
+ * @param {Node} node1 The first node to compare.
+ * @param {!Node} node2 The second node to compare.
+ * @return {number} -1 if node1 is before node2, +1 otherwise.
+ * @private
+ */
+goog.dom.compareSiblingOrder_ = function(node1, node2) {
+ var s = node2;
+ while ((s = s.previousSibling)) {
+ if (s == node1) {
+ // We just found node1 before node2.
+ return -1;
+ }
+ }
+
+ // Since we didn't find it, node1 must be after node2.
+ return 1;
+};
+
+
+/**
+ * Find the deepest common ancestor of the given nodes.
+ * @param {...Node} var_args The nodes to find a common ancestor of.
+ * @return {Node} The common ancestor of the nodes, or null if there is none.
+ * null will only be returned if two or more of the nodes are from different
+ * documents.
+ */
+goog.dom.findCommonAncestor = function(var_args) {
+ var i, count = arguments.length;
+ if (!count) {
+ return null;
+ } else if (count == 1) {
+ return arguments[0];
+ }
+
+ var paths = [];
+ var minLength = Infinity;
+ for (i = 0; i < count; i++) {
+ // Compute the list of ancestors.
+ var ancestors = [];
+ var node = arguments[i];
+ while (node) {
+ ancestors.unshift(node);
+ node = node.parentNode;
+ }
+
+ // Save the list for comparison.
+ paths.push(ancestors);
+ minLength = Math.min(minLength, ancestors.length);
+ }
+ var output = null;
+ for (i = 0; i < minLength; i++) {
+ var first = paths[0][i];
+ for (var j = 1; j < count; j++) {
+ if (first != paths[j][i]) {
+ return output;
+ }
+ }
+ output = first;
+ }
+ return output;
+};
+
+
+/**
+ * Returns the owner document for a node.
+ * @param {Node|Window} node The node to get the document for.
+ * @return {!Document} The document owning the node.
+ */
+goog.dom.getOwnerDocument = function(node) {
+ // TODO(nnaze): Update param signature to be non-nullable.
+ goog.asserts.assert(node, 'Node cannot be null or undefined.');
+ return /** @type {!Document} */ (
+ node.nodeType == goog.dom.NodeType.DOCUMENT ? node : node.ownerDocument ||
+ node.document);
+};
+
+
+/**
+ * Cross-browser function for getting the document element of a frame or iframe.
+ * @param {Element} frame Frame element.
+ * @return {!Document} The frame content document.
+ */
+goog.dom.getFrameContentDocument = function(frame) {
+ return frame.contentDocument ||
+ /** @type {!HTMLFrameElement} */ (frame).contentWindow.document;
+};
+
+
+/**
+ * Cross-browser function for getting the window of a frame or iframe.
+ * @param {Element} frame Frame element.
+ * @return {Window} The window associated with the given frame, or null if none
+ * exists.
+ */
+goog.dom.getFrameContentWindow = function(frame) {
+ try {
+ return frame.contentWindow ||
+ (frame.contentDocument ? goog.dom.getWindow(frame.contentDocument) :
+ null);
+ } catch (e) {
+ // NOTE(user): In IE8, checking the contentWindow or contentDocument
+ // properties will throw a "Unspecified Error" exception if the iframe is
+ // not inserted in the DOM. If we get this we can be sure that no window
+ // exists, so return null.
+ }
+ return null;
+};
+
+
+/**
+ * Sets the text content of a node, with cross-browser support.
+ * @param {Node} node The node to change the text content of.
+ * @param {string|number} text The value that should replace the node's content.
+ */
+goog.dom.setTextContent = function(node, text) {
+ goog.asserts.assert(
+ node != null,
+ 'goog.dom.setTextContent expects a non-null value for node');
+
+ if ('textContent' in node) {
+ node.textContent = text;
+ } else if (node.nodeType == goog.dom.NodeType.TEXT) {
+ node.data = text;
+ } else if (
+ node.firstChild && node.firstChild.nodeType == goog.dom.NodeType.TEXT) {
+ // If the first child is a text node we just change its data and remove the
+ // rest of the children.
+ while (node.lastChild != node.firstChild) {
+ node.removeChild(node.lastChild);
+ }
+ node.firstChild.data = text;
+ } else {
+ goog.dom.removeChildren(node);
+ var doc = goog.dom.getOwnerDocument(node);
+ node.appendChild(doc.createTextNode(String(text)));
+ }
+};
+
+
+/**
+ * Gets the outerHTML of a node, which islike innerHTML, except that it
+ * actually contains the HTML of the node itself.
+ * @param {Element} element The element to get the HTML of.
+ * @return {string} The outerHTML of the given element.
+ */
+goog.dom.getOuterHtml = function(element) {
+ goog.asserts.assert(
+ element !== null,
+ 'goog.dom.getOuterHtml expects a non-null value for element');
+ // IE, Opera and WebKit all have outerHTML.
+ if ('outerHTML' in element) {
+ return element.outerHTML;
+ } else {
+ var doc = goog.dom.getOwnerDocument(element);
+ var div = doc.createElement(goog.dom.TagName.DIV);
+ div.appendChild(element.cloneNode(true));
+ return div.innerHTML;
+ }
+};
+
+
+/**
+ * Finds the first descendant node that matches the filter function, using
+ * a depth first search. This function offers the most general purpose way
+ * of finding a matching element. You may also wish to consider
+ * {@code goog.dom.query} which can express many matching criteria using
+ * CSS selector expressions. These expressions often result in a more
+ * compact representation of the desired result.
+ * @see goog.dom.query
+ *
+ * @param {Node} root The root of the tree to search.
+ * @param {function(Node) : boolean} p The filter function.
+ * @return {Node|undefined} The found node or undefined if none is found.
+ */
+goog.dom.findNode = function(root, p) {
+ var rv = [];
+ var found = goog.dom.findNodes_(root, p, rv, true);
+ return found ? rv[0] : undefined;
+};
+
+
+/**
+ * Finds all the descendant nodes that match the filter function, using a
+ * a depth first search. This function offers the most general-purpose way
+ * of finding a set of matching elements. You may also wish to consider
+ * {@code goog.dom.query} which can express many matching criteria using
+ * CSS selector expressions. These expressions often result in a more
+ * compact representation of the desired result.
+
+ * @param {Node} root The root of the tree to search.
+ * @param {function(Node) : boolean} p The filter function.
+ * @return {!Array<!Node>} The found nodes or an empty array if none are found.
+ */
+goog.dom.findNodes = function(root, p) {
+ var rv = [];
+ goog.dom.findNodes_(root, p, rv, false);
+ return rv;
+};
+
+
+/**
+ * Finds the first or all the descendant nodes that match the filter function,
+ * using a depth first search.
+ * @param {Node} root The root of the tree to search.
+ * @param {function(Node) : boolean} p The filter function.
+ * @param {!Array<!Node>} rv The found nodes are added to this array.
+ * @param {boolean} findOne If true we exit after the first found node.
+ * @return {boolean} Whether the search is complete or not. True in case findOne
+ * is true and the node is found. False otherwise.
+ * @private
+ */
+goog.dom.findNodes_ = function(root, p, rv, findOne) {
+ if (root != null) {
+ var child = root.firstChild;
+ while (child) {
+ if (p(child)) {
+ rv.push(child);
+ if (findOne) {
+ return true;
+ }
+ }
+ if (goog.dom.findNodes_(child, p, rv, findOne)) {
+ return true;
+ }
+ child = child.nextSibling;
+ }
+ }
+ return false;
+};
+
+
+/**
+ * Map of tags whose content to ignore when calculating text length.
+ * @private {!Object<string, number>}
+ * @const
+ */
+goog.dom.TAGS_TO_IGNORE_ = {
+ 'SCRIPT': 1,
+ 'STYLE': 1,
+ 'HEAD': 1,
+ 'IFRAME': 1,
+ 'OBJECT': 1
+};
+
+
+/**
+ * Map of tags which have predefined values with regard to whitespace.
+ * @private {!Object<string, string>}
+ * @const
+ */
+goog.dom.PREDEFINED_TAG_VALUES_ = {
+ 'IMG': ' ',
+ 'BR': '\n'
+};
+
+
+/**
+ * Returns true if the element has a tab index that allows it to receive
+ * keyboard focus (tabIndex >= 0), false otherwise. Note that some elements
+ * natively support keyboard focus, even if they have no tab index.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element has a tab index that allows keyboard
+ * focus.
+ */
+goog.dom.isFocusableTabIndex = function(element) {
+ return goog.dom.hasSpecifiedTabIndex_(element) &&
+ goog.dom.isTabIndexFocusable_(element);
+};
+
+
+/**
+ * Enables or disables keyboard focus support on the element via its tab index.
+ * Only elements for which {@link goog.dom.isFocusableTabIndex} returns true
+ * (or elements that natively support keyboard focus, like form elements) can
+ * receive keyboard focus. See http://go/tabindex for more info.
+ * @param {Element} element Element whose tab index is to be changed.
+ * @param {boolean} enable Whether to set or remove a tab index on the element
+ * that supports keyboard focus.
+ */
+goog.dom.setFocusableTabIndex = function(element, enable) {
+ if (enable) {
+ element.tabIndex = 0;
+ } else {
+ // Set tabIndex to -1 first, then remove it. This is a workaround for
+ // Safari (confirmed in version 4 on Windows). When removing the attribute
+ // without setting it to -1 first, the element remains keyboard focusable
+ // despite not having a tabIndex attribute anymore.
+ element.tabIndex = -1;
+ element.removeAttribute('tabIndex'); // Must be camelCase!
+ }
+};
+
+
+/**
+ * Returns true if the element can be focused, i.e. it has a tab index that
+ * allows it to receive keyboard focus (tabIndex >= 0), or it is an element
+ * that natively supports keyboard focus.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element allows keyboard focus.
+ */
+goog.dom.isFocusable = function(element) {
+ var focusable;
+ // Some elements can have unspecified tab index and still receive focus.
+ if (goog.dom.nativelySupportsFocus_(element)) {
+ // Make sure the element is not disabled ...
+ focusable = !element.disabled &&
+ // ... and if a tab index is specified, it allows focus.
+ (!goog.dom.hasSpecifiedTabIndex_(element) ||
+ goog.dom.isTabIndexFocusable_(element));
+ } else {
+ focusable = goog.dom.isFocusableTabIndex(element);
+ }
+
+ // IE requires elements to be visible in order to focus them.
+ return focusable && goog.userAgent.IE ?
+ goog.dom.hasNonZeroBoundingRect_(/** @type {!HTMLElement} */ (element)) :
+ focusable;
+};
+
+
+/**
+ * Returns true if the element has a specified tab index.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element has a specified tab index.
+ * @private
+ */
+goog.dom.hasSpecifiedTabIndex_ = function(element) {
+ // IE returns 0 for an unset tabIndex, so we must use getAttributeNode(),
+ // which returns an object with a 'specified' property if tabIndex is
+ // specified. This works on other browsers, too.
+ var attrNode = element.getAttributeNode('tabindex'); // Must be lowercase!
+ return goog.isDefAndNotNull(attrNode) && attrNode.specified;
+};
+
+
+/**
+ * Returns true if the element's tab index allows the element to be focused.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element's tab index allows focus.
+ * @private
+ */
+goog.dom.isTabIndexFocusable_ = function(element) {
+ var index = /** @type {!HTMLElement} */ (element).tabIndex;
+ // NOTE: IE9 puts tabIndex in 16-bit int, e.g. -2 is 65534.
+ return goog.isNumber(index) && index >= 0 && index < 32768;
+};
+
+
+/**
+ * Returns true if the element is focusable even when tabIndex is not set.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element natively supports focus.
+ * @private
+ */
+goog.dom.nativelySupportsFocus_ = function(element) {
+ return element.tagName == goog.dom.TagName.A ||
+ element.tagName == goog.dom.TagName.INPUT ||
+ element.tagName == goog.dom.TagName.TEXTAREA ||
+ element.tagName == goog.dom.TagName.SELECT ||
+ element.tagName == goog.dom.TagName.BUTTON;
+};
+
+
+/**
+ * Returns true if the element has a bounding rectangle that would be visible
+ * (i.e. its width and height are greater than zero).
+ * @param {!HTMLElement} element Element to check.
+ * @return {boolean} Whether the element has a non-zero bounding rectangle.
+ * @private
+ */
+goog.dom.hasNonZeroBoundingRect_ = function(element) {
+ var rect;
+ if (!goog.isFunction(element['getBoundingClientRect']) ||
+ // In IE, getBoundingClientRect throws on detached nodes.
+ (goog.userAgent.IE && element.parentElement == null)) {
+ rect = {'height': element.offsetHeight, 'width': element.offsetWidth};
+ } else {
+ rect = element.getBoundingClientRect();
+ }
+ return goog.isDefAndNotNull(rect) && rect.height > 0 && rect.width > 0;
+};
+
+
+/**
+ * Returns the text content of the current node, without markup and invisible
+ * symbols. New lines are stripped and whitespace is collapsed,
+ * such that each character would be visible.
+ *
+ * In browsers that support it, innerText is used. Other browsers attempt to
+ * simulate it via node traversal. Line breaks are canonicalized in IE.
+ *
+ * @param {Node} node The node from which we are getting content.
+ * @return {string} The text content.
+ */
+goog.dom.getTextContent = function(node) {
+ var textContent;
+ // Note(arv): IE9, Opera, and Safari 3 support innerText but they include
+ // text nodes in script tags. So we revert to use a user agent test here.
+ if (goog.dom.BrowserFeature.CAN_USE_INNER_TEXT && node !== null &&
+ ('innerText' in node)) {
+ textContent = goog.string.canonicalizeNewlines(node.innerText);
+ // Unfortunately .innerText() returns text with &shy; symbols
+ // We need to filter it out and then remove duplicate whitespaces
+ } else {
+ var buf = [];
+ goog.dom.getTextContent_(node, buf, true);
+ textContent = buf.join('');
+ }
+
+ // Strip &shy; entities. goog.format.insertWordBreaks inserts them in Opera.
+ textContent = textContent.replace(/ \xAD /g, ' ').replace(/\xAD/g, '');
+ // Strip &#8203; entities. goog.format.insertWordBreaks inserts them in IE8.
+ textContent = textContent.replace(/\u200B/g, '');
+
+ // Skip this replacement on old browsers with working innerText, which
+ // automatically turns &nbsp; into ' ' and / +/ into ' ' when reading
+ // innerText.
+ if (!goog.dom.BrowserFeature.CAN_USE_INNER_TEXT) {
+ textContent = textContent.replace(/ +/g, ' ');
+ }
+ if (textContent != ' ') {
+ textContent = textContent.replace(/^\s*/, '');
+ }
+
+ return textContent;
+};
+
+
+/**
+ * Returns the text content of the current node, without markup.
+ *
+ * Unlike {@code getTextContent} this method does not collapse whitespaces
+ * or normalize lines breaks.
+ *
+ * @param {Node} node The node from which we are getting content.
+ * @return {string} The raw text content.
+ */
+goog.dom.getRawTextContent = function(node) {
+ var buf = [];
+ goog.dom.getTextContent_(node, buf, false);
+
+ return buf.join('');
+};
+
+
+/**
+ * Recursive support function for text content retrieval.
+ *
+ * @param {Node} node The node from which we are getting content.
+ * @param {Array<string>} buf string buffer.
+ * @param {boolean} normalizeWhitespace Whether to normalize whitespace.
+ * @private
+ */
+goog.dom.getTextContent_ = function(node, buf, normalizeWhitespace) {
+ if (node.nodeName in goog.dom.TAGS_TO_IGNORE_) {
+ // ignore certain tags
+ } else if (node.nodeType == goog.dom.NodeType.TEXT) {
+ if (normalizeWhitespace) {
+ buf.push(String(node.nodeValue).replace(/(\r\n|\r|\n)/g, ''));
+ } else {
+ buf.push(node.nodeValue);
+ }
+ } else if (node.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {
+ buf.push(goog.dom.PREDEFINED_TAG_VALUES_[node.nodeName]);
+ } else {
+ var child = node.firstChild;
+ while (child) {
+ goog.dom.getTextContent_(child, buf, normalizeWhitespace);
+ child = child.nextSibling;
+ }
+ }
+};
+
+
+/**
+ * Returns the text length of the text contained in a node, without markup. This
+ * is equivalent to the selection length if the node was selected, or the number
+ * of cursor movements to traverse the node. Images & BRs take one space. New
+ * lines are ignored.
+ *
+ * @param {Node} node The node whose text content length is being calculated.
+ * @return {number} The length of {@code node}'s text content.
+ */
+goog.dom.getNodeTextLength = function(node) {
+ return goog.dom.getTextContent(node).length;
+};
+
+
+/**
+ * Returns the text offset of a node relative to one of its ancestors. The text
+ * length is the same as the length calculated by goog.dom.getNodeTextLength.
+ *
+ * @param {Node} node The node whose offset is being calculated.
+ * @param {Node=} opt_offsetParent The node relative to which the offset will
+ * be calculated. Defaults to the node's owner document's body.
+ * @return {number} The text offset.
+ */
+goog.dom.getNodeTextOffset = function(node, opt_offsetParent) {
+ var root = opt_offsetParent || goog.dom.getOwnerDocument(node).body;
+ var buf = [];
+ while (node && node != root) {
+ var cur = node;
+ while ((cur = cur.previousSibling)) {
+ buf.unshift(goog.dom.getTextContent(cur));
+ }
+ node = node.parentNode;
+ }
+ // Trim left to deal with FF cases when there might be line breaks and empty
+ // nodes at the front of the text
+ return goog.string.trimLeft(buf.join('')).replace(/ +/g, ' ').length;
+};
+
+
+/**
+ * Returns the node at a given offset in a parent node. If an object is
+ * provided for the optional third parameter, the node and the remainder of the
+ * offset will stored as properties of this object.
+ * @param {Node} parent The parent node.
+ * @param {number} offset The offset into the parent node.
+ * @param {Object=} opt_result Object to be used to store the return value. The
+ * return value will be stored in the form {node: Node, remainder: number}
+ * if this object is provided.
+ * @return {Node} The node at the given offset.
+ */
+goog.dom.getNodeAtOffset = function(parent, offset, opt_result) {
+ var stack = [parent], pos = 0, cur = null;
+ while (stack.length > 0 && pos < offset) {
+ cur = stack.pop();
+ if (cur.nodeName in goog.dom.TAGS_TO_IGNORE_) {
+ // ignore certain tags
+ } else if (cur.nodeType == goog.dom.NodeType.TEXT) {
+ var text = cur.nodeValue.replace(/(\r\n|\r|\n)/g, '').replace(/ +/g, ' ');
+ pos += text.length;
+ } else if (cur.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {
+ pos += goog.dom.PREDEFINED_TAG_VALUES_[cur.nodeName].length;
+ } else {
+ for (var i = cur.childNodes.length - 1; i >= 0; i--) {
+ stack.push(cur.childNodes[i]);
+ }
+ }
+ }
+ if (goog.isObject(opt_result)) {
+ opt_result.remainder = cur ? cur.nodeValue.length + offset - pos - 1 : 0;
+ opt_result.node = cur;
+ }
+
+ return cur;
+};
+
+
+/**
+ * Returns true if the object is a {@code NodeList}. To qualify as a NodeList,
+ * the object must have a numeric length property and an item function (which
+ * has type 'string' on IE for some reason).
+ * @param {Object} val Object to test.
+ * @return {boolean} Whether the object is a NodeList.
+ */
+goog.dom.isNodeList = function(val) {
+ // TODO(attila): Now the isNodeList is part of goog.dom we can use
+ // goog.userAgent to make this simpler.
+ // A NodeList must have a length property of type 'number' on all platforms.
+ if (val && typeof val.length == 'number') {
+ // A NodeList is an object everywhere except Safari, where it's a function.
+ if (goog.isObject(val)) {
+ // A NodeList must have an item function (on non-IE platforms) or an item
+ // property of type 'string' (on IE).
+ return typeof val.item == 'function' || typeof val.item == 'string';
+ } else if (goog.isFunction(val)) {
+ // On Safari, a NodeList is a function with an item property that is also
+ // a function.
+ return typeof val.item == 'function';
+ }
+ }
+
+ // Not a NodeList.
+ return false;
+};
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that has the passed
+ * tag name and/or class name. If the passed element matches the specified
+ * criteria, the element itself is returned.
+ * @param {Node} element The DOM node to start with.
+ * @param {?(goog.dom.TagName|string)=} opt_tag The tag name to match (or
+ * null/undefined to match only based on class name).
+ * @param {?string=} opt_class The class name to match (or null/undefined to
+ * match only based on tag name).
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {Element} The first ancestor that matches the passed criteria, or
+ * null if no match is found.
+ */
+goog.dom.getAncestorByTagNameAndClass = function(
+ element, opt_tag, opt_class, opt_maxSearchSteps) {
+ if (!opt_tag && !opt_class) {
+ return null;
+ }
+ var tagName = opt_tag ? opt_tag.toUpperCase() : null;
+ return /** @type {Element} */ (goog.dom.getAncestor(element, function(node) {
+ return (!tagName || node.nodeName == tagName) &&
+ (!opt_class ||
+ goog.isString(node.className) &&
+ goog.array.contains(node.className.split(/\s+/), opt_class));
+ }, true, opt_maxSearchSteps));
+};
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that has the passed
+ * class name. If the passed element matches the specified criteria, the
+ * element itself is returned.
+ * @param {Node} element The DOM node to start with.
+ * @param {string} className The class name to match.
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {Element} The first ancestor that matches the passed criteria, or
+ * null if none match.
+ */
+goog.dom.getAncestorByClass = function(element, className, opt_maxSearchSteps) {
+ return goog.dom.getAncestorByTagNameAndClass(
+ element, null, className, opt_maxSearchSteps);
+};
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that passes the
+ * matcher function.
+ * @param {Node} element The DOM node to start with.
+ * @param {function(Node) : boolean} matcher A function that returns true if the
+ * passed node matches the desired criteria.
+ * @param {boolean=} opt_includeNode If true, the node itself is included in
+ * the search (the first call to the matcher will pass startElement as
+ * the node to test).
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {Node} DOM node that matched the matcher, or null if there was
+ * no match.
+ */
+goog.dom.getAncestor = function(
+ element, matcher, opt_includeNode, opt_maxSearchSteps) {
+ if (!opt_includeNode) {
+ element = element.parentNode;
+ }
+ var steps = 0;
+ while (element &&
+ (opt_maxSearchSteps == null || steps <= opt_maxSearchSteps)) {
+ goog.asserts.assert(element.name != 'parentNode');
+ if (matcher(element)) {
+ return element;
+ }
+ element = element.parentNode;
+ steps++;
+ }
+ // Reached the root of the DOM without a match
+ return null;
+};
+
+
+/**
+ * Determines the active element in the given document.
+ * @param {Document} doc The document to look in.
+ * @return {Element} The active element.
+ */
+goog.dom.getActiveElement = function(doc) {
+ try {
+ return doc && doc.activeElement;
+ } catch (e) {
+ // NOTE(nicksantos): Sometimes, evaluating document.activeElement in IE
+ // throws an exception. I'm not 100% sure why, but I suspect it chokes
+ // on document.activeElement if the activeElement has been recently
+ // removed from the DOM by a JS operation.
+ //
+ // We assume that an exception here simply means
+ // "there is no active element."
+ }
+
+ return null;
+};
+
+
+/**
+ * Gives the current devicePixelRatio.
+ *
+ * By default, this is the value of window.devicePixelRatio (which should be
+ * preferred if present).
+ *
+ * If window.devicePixelRatio is not present, the ratio is calculated with
+ * window.matchMedia, if present. Otherwise, gives 1.0.
+ *
+ * Some browsers (including Chrome) consider the browser zoom level in the pixel
+ * ratio, so the value may change across multiple calls.
+ *
+ * @return {number} The number of actual pixels per virtual pixel.
+ */
+goog.dom.getPixelRatio = function() {
+ var win = goog.dom.getWindow();
+ if (goog.isDef(win.devicePixelRatio)) {
+ return win.devicePixelRatio;
+ } else if (win.matchMedia) {
+ return goog.dom.matchesPixelRatio_(.75) ||
+ goog.dom.matchesPixelRatio_(1.5) || goog.dom.matchesPixelRatio_(2) ||
+ goog.dom.matchesPixelRatio_(3) || 1;
+ }
+ return 1;
+};
+
+
+/**
+ * Calculates a mediaQuery to check if the current device supports the
+ * given actual to virtual pixel ratio.
+ * @param {number} pixelRatio The ratio of actual pixels to virtual pixels.
+ * @return {number} pixelRatio if applicable, otherwise 0.
+ * @private
+ */
+goog.dom.matchesPixelRatio_ = function(pixelRatio) {
+ var win = goog.dom.getWindow();
+ var query =
+ ('(-webkit-min-device-pixel-ratio: ' + pixelRatio + '),' +
+ '(min--moz-device-pixel-ratio: ' + pixelRatio + '),' +
+ '(min-resolution: ' + pixelRatio + 'dppx)');
+ return win.matchMedia(query).matches ? pixelRatio : 0;
+};
+
+
+
+/**
+ * Create an instance of a DOM helper with a new document object.
+ * @param {Document=} opt_document Document object to associate with this
+ * DOM helper.
+ * @constructor
+ */
+goog.dom.DomHelper = function(opt_document) {
+ /**
+ * Reference to the document object to use
+ * @type {!Document}
+ * @private
+ */
+ this.document_ = opt_document || goog.global.document || document;
+};
+
+
+/**
+ * Gets the dom helper object for the document where the element resides.
+ * @param {Node=} opt_node If present, gets the DomHelper for this node.
+ * @return {!goog.dom.DomHelper} The DomHelper.
+ */
+goog.dom.DomHelper.prototype.getDomHelper = goog.dom.getDomHelper;
+
+
+/**
+ * Sets the document object.
+ * @param {!Document} document Document object.
+ */
+goog.dom.DomHelper.prototype.setDocument = function(document) {
+ this.document_ = document;
+};
+
+
+/**
+ * Gets the document object being used by the dom library.
+ * @return {!Document} Document object.
+ */
+goog.dom.DomHelper.prototype.getDocument = function() {
+ return this.document_;
+};
+
+
+/**
+ * Alias for {@code getElementById}. If a DOM node is passed in then we just
+ * return that.
+ * @param {string|Element} element Element ID or a DOM node.
+ * @return {Element} The element with the given ID, or the node passed in.
+ */
+goog.dom.DomHelper.prototype.getElement = function(element) {
+ return goog.dom.getElementHelper_(this.document_, element);
+};
+
+
+/**
+ * Gets an element by id, asserting that the element is found.
+ *
+ * This is used when an element is expected to exist, and should fail with
+ * an assertion error if it does not (if assertions are enabled).
+ *
+ * @param {string} id Element ID.
+ * @return {!Element} The element with the given ID, if it exists.
+ */
+goog.dom.DomHelper.prototype.getRequiredElement = function(id) {
+ return goog.dom.getRequiredElementHelper_(this.document_, id);
+};
+
+
+/**
+ * Alias for {@code getElement}.
+ * @param {string|Element} element Element ID or a DOM node.
+ * @return {Element} The element with the given ID, or the node passed in.
+ * @deprecated Use {@link goog.dom.DomHelper.prototype.getElement} instead.
+ */
+goog.dom.DomHelper.prototype.$ = goog.dom.DomHelper.prototype.getElement;
+
+
+/**
+ * Looks up elements by both tag and class name, using browser native functions
+ * ({@code querySelectorAll}, {@code getElementsByTagName} or
+ * {@code getElementsByClassName}) where possible. The returned array is a live
+ * NodeList or a static list depending on the code path taken.
+ *
+ * @see goog.dom.query
+ *
+ * @param {?string=} opt_tag Element tag name or * for all tags.
+ * @param {?string=} opt_class Optional class name.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {!IArrayLike<!Element>} Array-like list of elements (only a length
+ * property and numerical indices are guaranteed to exist).
+ */
+goog.dom.DomHelper.prototype.getElementsByTagNameAndClass = function(
+ opt_tag, opt_class, opt_el) {
+ return goog.dom.getElementsByTagNameAndClass_(
+ this.document_, opt_tag, opt_class, opt_el);
+};
+
+
+/**
+ * Returns an array of all the elements with the provided className.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {Element|Document=} opt_el Optional element to look in.
+ * @return {!IArrayLike<!Element>} The items found with the class name provided.
+ */
+goog.dom.DomHelper.prototype.getElementsByClass = function(className, opt_el) {
+ var doc = opt_el || this.document_;
+ return goog.dom.getElementsByClass(className, doc);
+};
+
+
+/**
+ * Returns the first element we find matching the provided class name.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {(Element|Document)=} opt_el Optional element to look in.
+ * @return {Element} The first item found with the class name provided.
+ */
+goog.dom.DomHelper.prototype.getElementByClass = function(className, opt_el) {
+ var doc = opt_el || this.document_;
+ return goog.dom.getElementByClass(className, doc);
+};
+
+
+/**
+ * Ensures an element with the given className exists, and then returns the
+ * first element with the provided className.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {(!Element|!Document)=} opt_root Optional element or document to look
+ * in.
+ * @return {!Element} The first item found with the class name provided.
+ * @throws {goog.asserts.AssertionError} Thrown if no element is found.
+ */
+goog.dom.DomHelper.prototype.getRequiredElementByClass = function(
+ className, opt_root) {
+ var root = opt_root || this.document_;
+ return goog.dom.getRequiredElementByClass(className, root);
+};
+
+
+/**
+ * Alias for {@code getElementsByTagNameAndClass}.
+ * @deprecated Use DomHelper getElementsByTagNameAndClass.
+ * @see goog.dom.query
+ *
+ * @param {?string=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {Element=} opt_el Optional element to look in.
+ * @return {!IArrayLike<!Element>} Array-like list of elements (only a length
+ * property and numerical indices are guaranteed to exist).
+ */
+goog.dom.DomHelper.prototype.$$ =
+ goog.dom.DomHelper.prototype.getElementsByTagNameAndClass;
+
+
+/**
+ * Sets a number of properties on a node.
+ * @param {Element} element DOM node to set properties on.
+ * @param {Object} properties Hash of property:value pairs.
+ */
+goog.dom.DomHelper.prototype.setProperties = goog.dom.setProperties;
+
+
+/**
+ * Gets the dimensions of the viewport.
+ * @param {Window=} opt_window Optional window element to test. Defaults to
+ * the window of the Dom Helper.
+ * @return {!goog.math.Size} Object with values 'width' and 'height'.
+ */
+goog.dom.DomHelper.prototype.getViewportSize = function(opt_window) {
+ // TODO(arv): This should not take an argument. That breaks the rule of a
+ // a DomHelper representing a single frame/window/document.
+ return goog.dom.getViewportSize(opt_window || this.getWindow());
+};
+
+
+/**
+ * Calculates the height of the document.
+ *
+ * @return {number} The height of the document.
+ */
+goog.dom.DomHelper.prototype.getDocumentHeight = function() {
+ return goog.dom.getDocumentHeight_(this.getWindow());
+};
+
+
+/**
+ * Typedef for use with goog.dom.createDom and goog.dom.append.
+ * @typedef {Object|string|Array|NodeList}
+ */
+goog.dom.Appendable;
+
+
+/**
+ * Returns a dom node with a set of attributes. This function accepts varargs
+ * for subsequent nodes to be added. Subsequent nodes will be added to the
+ * first node as childNodes.
+ *
+ * So:
+ * <code>createDom('div', null, createDom('p'), createDom('p'));</code>
+ * would return a div with two child paragraphs
+ *
+ * An easy way to move all child nodes of an existing element to a new parent
+ * element is:
+ * <code>createDom('div', null, oldElement.childNodes);</code>
+ * which will remove all child nodes from the old element and add them as
+ * child nodes of the new DIV.
+ *
+ * @param {string} tagName Tag to create.
+ * @param {Object|string=} opt_attributes If object, then a map of name-value
+ * pairs for attributes. If a string, then this is the className of the new
+ * element.
+ * @param {...goog.dom.Appendable} var_args Further DOM nodes or
+ * strings for text nodes. If one of the var_args is an array or
+ * NodeList, its elements will be added as childNodes instead.
+ * @return {!Element} Reference to a DOM node.
+ */
+goog.dom.DomHelper.prototype.createDom = function(
+ tagName, opt_attributes, var_args) {
+ return goog.dom.createDom_(this.document_, arguments);
+};
+
+
+/**
+ * Alias for {@code createDom}.
+ * @param {string} tagName Tag to create.
+ * @param {(Object|string)=} opt_attributes If object, then a map of name-value
+ * pairs for attributes. If a string, then this is the className of the new
+ * element.
+ * @param {...goog.dom.Appendable} var_args Further DOM nodes or strings for
+ * text nodes. If one of the var_args is an array, its children will be
+ * added as childNodes instead.
+ * @return {!Element} Reference to a DOM node.
+ * @deprecated Use {@link goog.dom.DomHelper.prototype.createDom} instead.
+ */
+goog.dom.DomHelper.prototype.$dom = goog.dom.DomHelper.prototype.createDom;
+
+
+/**
+ * Creates a new element.
+ * @param {string} name Tag name.
+ * @return {!Element} The new element.
+ */
+goog.dom.DomHelper.prototype.createElement = function(name) {
+ return this.document_.createElement(name);
+};
+
+
+/**
+ * Creates a new text node.
+ * @param {number|string} content Content.
+ * @return {!Text} The new text node.
+ */
+goog.dom.DomHelper.prototype.createTextNode = function(content) {
+ return this.document_.createTextNode(String(content));
+};
+
+
+/**
+ * Create a table.
+ * @param {number} rows The number of rows in the table. Must be >= 1.
+ * @param {number} columns The number of columns in the table. Must be >= 1.
+ * @param {boolean=} opt_fillWithNbsp If true, fills table entries with
+ * {@code goog.string.Unicode.NBSP} characters.
+ * @return {!HTMLElement} The created table.
+ */
+goog.dom.DomHelper.prototype.createTable = function(
+ rows, columns, opt_fillWithNbsp) {
+ return goog.dom.createTable_(
+ this.document_, rows, columns, !!opt_fillWithNbsp);
+};
+
+
+/**
+ * Converts an HTML into a node or a document fragment. A single Node is used if
+ * {@code html} only generates a single node. If {@code html} generates multiple
+ * nodes then these are put inside a {@code DocumentFragment}. This is a safe
+ * version of {@code goog.dom.DomHelper#htmlToDocumentFragment} which is now
+ * deleted.
+ * @param {!goog.html.SafeHtml} html The HTML markup to convert.
+ * @return {!Node} The resulting node.
+ */
+goog.dom.DomHelper.prototype.safeHtmlToNode = function(html) {
+ return goog.dom.safeHtmlToNode_(this.document_, html);
+};
+
+
+/**
+ * Returns true if the browser is in "CSS1-compatible" (standards-compliant)
+ * mode, false otherwise.
+ * @return {boolean} True if in CSS1-compatible mode.
+ */
+goog.dom.DomHelper.prototype.isCss1CompatMode = function() {
+ return goog.dom.isCss1CompatMode_(this.document_);
+};
+
+
+/**
+ * Gets the window object associated with the document.
+ * @return {!Window} The window associated with the given document.
+ */
+goog.dom.DomHelper.prototype.getWindow = function() {
+ return goog.dom.getWindow_(this.document_);
+};
+
+
+/**
+ * Gets the document scroll element.
+ * @return {!Element} Scrolling element.
+ */
+goog.dom.DomHelper.prototype.getDocumentScrollElement = function() {
+ return goog.dom.getDocumentScrollElement_(this.document_);
+};
+
+
+/**
+ * Gets the document scroll distance as a coordinate object.
+ * @return {!goog.math.Coordinate} Object with properties 'x' and 'y'.
+ */
+goog.dom.DomHelper.prototype.getDocumentScroll = function() {
+ return goog.dom.getDocumentScroll_(this.document_);
+};
+
+
+/**
+ * Determines the active element in the given document.
+ * @param {Document=} opt_doc The document to look in.
+ * @return {Element} The active element.
+ */
+goog.dom.DomHelper.prototype.getActiveElement = function(opt_doc) {
+ return goog.dom.getActiveElement(opt_doc || this.document_);
+};
+
+
+/**
+ * Appends a child to a node.
+ * @param {Node} parent Parent.
+ * @param {Node} child Child.
+ */
+goog.dom.DomHelper.prototype.appendChild = goog.dom.appendChild;
+
+
+/**
+ * Appends a node with text or other nodes.
+ * @param {!Node} parent The node to append nodes to.
+ * @param {...goog.dom.Appendable} var_args The things to append to the node.
+ * If this is a Node it is appended as is.
+ * If this is a string then a text node is appended.
+ * If this is an array like object then fields 0 to length - 1 are appended.
+ */
+goog.dom.DomHelper.prototype.append = goog.dom.append;
+
+
+/**
+ * Determines if the given node can contain children, intended to be used for
+ * HTML generation.
+ *
+ * @param {Node} node The node to check.
+ * @return {boolean} Whether the node can contain children.
+ */
+goog.dom.DomHelper.prototype.canHaveChildren = goog.dom.canHaveChildren;
+
+
+/**
+ * Removes all the child nodes on a DOM node.
+ * @param {Node} node Node to remove children from.
+ */
+goog.dom.DomHelper.prototype.removeChildren = goog.dom.removeChildren;
+
+
+/**
+ * Inserts a new node before an existing reference node (i.e., as the previous
+ * sibling). If the reference node has no parent, then does nothing.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} refNode Reference node to insert before.
+ */
+goog.dom.DomHelper.prototype.insertSiblingBefore = goog.dom.insertSiblingBefore;
+
+
+/**
+ * Inserts a new node after an existing reference node (i.e., as the next
+ * sibling). If the reference node has no parent, then does nothing.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} refNode Reference node to insert after.
+ */
+goog.dom.DomHelper.prototype.insertSiblingAfter = goog.dom.insertSiblingAfter;
+
+
+/**
+ * Insert a child at a given index. If index is larger than the number of child
+ * nodes that the parent currently has, the node is inserted as the last child
+ * node.
+ * @param {Element} parent The element into which to insert the child.
+ * @param {Node} child The element to insert.
+ * @param {number} index The index at which to insert the new child node. Must
+ * not be negative.
+ */
+goog.dom.DomHelper.prototype.insertChildAt = goog.dom.insertChildAt;
+
+
+/**
+ * Removes a node from its parent.
+ * @param {Node} node The node to remove.
+ * @return {Node} The node removed if removed; else, null.
+ */
+goog.dom.DomHelper.prototype.removeNode = goog.dom.removeNode;
+
+
+/**
+ * Replaces a node in the DOM tree. Will do nothing if {@code oldNode} has no
+ * parent.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} oldNode Node to replace.
+ */
+goog.dom.DomHelper.prototype.replaceNode = goog.dom.replaceNode;
+
+
+/**
+ * Flattens an element. That is, removes it and replace it with its children.
+ * @param {Element} element The element to flatten.
+ * @return {Element|undefined} The original element, detached from the document
+ * tree, sans children, or undefined if the element was already not in the
+ * document.
+ */
+goog.dom.DomHelper.prototype.flattenElement = goog.dom.flattenElement;
+
+
+/**
+ * Returns an array containing just the element children of the given element.
+ * @param {Element} element The element whose element children we want.
+ * @return {!(Array<!Element>|NodeList<!Element>)} An array or array-like list
+ * of just the element children of the given element.
+ */
+goog.dom.DomHelper.prototype.getChildren = goog.dom.getChildren;
+
+
+/**
+ * Returns the first child node that is an element.
+ * @param {Node} node The node to get the first child element of.
+ * @return {Element} The first child node of {@code node} that is an element.
+ */
+goog.dom.DomHelper.prototype.getFirstElementChild =
+ goog.dom.getFirstElementChild;
+
+
+/**
+ * Returns the last child node that is an element.
+ * @param {Node} node The node to get the last child element of.
+ * @return {Element} The last child node of {@code node} that is an element.
+ */
+goog.dom.DomHelper.prototype.getLastElementChild = goog.dom.getLastElementChild;
+
+
+/**
+ * Returns the first next sibling that is an element.
+ * @param {Node} node The node to get the next sibling element of.
+ * @return {Element} The next sibling of {@code node} that is an element.
+ */
+goog.dom.DomHelper.prototype.getNextElementSibling =
+ goog.dom.getNextElementSibling;
+
+
+/**
+ * Returns the first previous sibling that is an element.
+ * @param {Node} node The node to get the previous sibling element of.
+ * @return {Element} The first previous sibling of {@code node} that is
+ * an element.
+ */
+goog.dom.DomHelper.prototype.getPreviousElementSibling =
+ goog.dom.getPreviousElementSibling;
+
+
+/**
+ * Returns the next node in source order from the given node.
+ * @param {Node} node The node.
+ * @return {Node} The next node in the DOM tree, or null if this was the last
+ * node.
+ */
+goog.dom.DomHelper.prototype.getNextNode = goog.dom.getNextNode;
+
+
+/**
+ * Returns the previous node in source order from the given node.
+ * @param {Node} node The node.
+ * @return {Node} The previous node in the DOM tree, or null if this was the
+ * first node.
+ */
+goog.dom.DomHelper.prototype.getPreviousNode = goog.dom.getPreviousNode;
+
+
+/**
+ * Whether the object looks like a DOM node.
+ * @param {?} obj The object being tested for node likeness.
+ * @return {boolean} Whether the object looks like a DOM node.
+ */
+goog.dom.DomHelper.prototype.isNodeLike = goog.dom.isNodeLike;
+
+
+/**
+ * Whether the object looks like an Element.
+ * @param {?} obj The object being tested for Element likeness.
+ * @return {boolean} Whether the object looks like an Element.
+ */
+goog.dom.DomHelper.prototype.isElement = goog.dom.isElement;
+
+
+/**
+ * Returns true if the specified value is a Window object. This includes the
+ * global window for HTML pages, and iframe windows.
+ * @param {?} obj Variable to test.
+ * @return {boolean} Whether the variable is a window.
+ */
+goog.dom.DomHelper.prototype.isWindow = goog.dom.isWindow;
+
+
+/**
+ * Returns an element's parent, if it's an Element.
+ * @param {Element} element The DOM element.
+ * @return {Element} The parent, or null if not an Element.
+ */
+goog.dom.DomHelper.prototype.getParentElement = goog.dom.getParentElement;
+
+
+/**
+ * Whether a node contains another node.
+ * @param {Node} parent The node that should contain the other node.
+ * @param {Node} descendant The node to test presence of.
+ * @return {boolean} Whether the parent node contains the descendent node.
+ */
+goog.dom.DomHelper.prototype.contains = goog.dom.contains;
+
+
+/**
+ * Compares the document order of two nodes, returning 0 if they are the same
+ * node, a negative number if node1 is before node2, and a positive number if
+ * node2 is before node1. Note that we compare the order the tags appear in the
+ * document so in the tree <b><i>text</i></b> the B node is considered to be
+ * before the I node.
+ *
+ * @param {Node} node1 The first node to compare.
+ * @param {Node} node2 The second node to compare.
+ * @return {number} 0 if the nodes are the same node, a negative number if node1
+ * is before node2, and a positive number if node2 is before node1.
+ */
+goog.dom.DomHelper.prototype.compareNodeOrder = goog.dom.compareNodeOrder;
+
+
+/**
+ * Find the deepest common ancestor of the given nodes.
+ * @param {...Node} var_args The nodes to find a common ancestor of.
+ * @return {Node} The common ancestor of the nodes, or null if there is none.
+ * null will only be returned if two or more of the nodes are from different
+ * documents.
+ */
+goog.dom.DomHelper.prototype.findCommonAncestor = goog.dom.findCommonAncestor;
+
+
+/**
+ * Returns the owner document for a node.
+ * @param {Node} node The node to get the document for.
+ * @return {!Document} The document owning the node.
+ */
+goog.dom.DomHelper.prototype.getOwnerDocument = goog.dom.getOwnerDocument;
+
+
+/**
+ * Cross browser function for getting the document element of an iframe.
+ * @param {Element} iframe Iframe element.
+ * @return {!Document} The frame content document.
+ */
+goog.dom.DomHelper.prototype.getFrameContentDocument =
+ goog.dom.getFrameContentDocument;
+
+
+/**
+ * Cross browser function for getting the window of a frame or iframe.
+ * @param {Element} frame Frame element.
+ * @return {Window} The window associated with the given frame.
+ */
+goog.dom.DomHelper.prototype.getFrameContentWindow =
+ goog.dom.getFrameContentWindow;
+
+
+/**
+ * Sets the text content of a node, with cross-browser support.
+ * @param {Node} node The node to change the text content of.
+ * @param {string|number} text The value that should replace the node's content.
+ */
+goog.dom.DomHelper.prototype.setTextContent = goog.dom.setTextContent;
+
+
+/**
+ * Gets the outerHTML of a node, which islike innerHTML, except that it
+ * actually contains the HTML of the node itself.
+ * @param {Element} element The element to get the HTML of.
+ * @return {string} The outerHTML of the given element.
+ */
+goog.dom.DomHelper.prototype.getOuterHtml = goog.dom.getOuterHtml;
+
+
+/**
+ * Finds the first descendant node that matches the filter function. This does
+ * a depth first search.
+ * @param {Node} root The root of the tree to search.
+ * @param {function(Node) : boolean} p The filter function.
+ * @return {Node|undefined} The found node or undefined if none is found.
+ */
+goog.dom.DomHelper.prototype.findNode = goog.dom.findNode;
+
+
+/**
+ * Finds all the descendant nodes that matches the filter function. This does a
+ * depth first search.
+ * @param {Node} root The root of the tree to search.
+ * @param {function(Node) : boolean} p The filter function.
+ * @return {Array<Node>} The found nodes or an empty array if none are found.
+ */
+goog.dom.DomHelper.prototype.findNodes = goog.dom.findNodes;
+
+
+/**
+ * Returns true if the element has a tab index that allows it to receive
+ * keyboard focus (tabIndex >= 0), false otherwise. Note that some elements
+ * natively support keyboard focus, even if they have no tab index.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element has a tab index that allows keyboard
+ * focus.
+ */
+goog.dom.DomHelper.prototype.isFocusableTabIndex = goog.dom.isFocusableTabIndex;
+
+
+/**
+ * Enables or disables keyboard focus support on the element via its tab index.
+ * Only elements for which {@link goog.dom.isFocusableTabIndex} returns true
+ * (or elements that natively support keyboard focus, like form elements) can
+ * receive keyboard focus. See http://go/tabindex for more info.
+ * @param {Element} element Element whose tab index is to be changed.
+ * @param {boolean} enable Whether to set or remove a tab index on the element
+ * that supports keyboard focus.
+ */
+goog.dom.DomHelper.prototype.setFocusableTabIndex =
+ goog.dom.setFocusableTabIndex;
+
+
+/**
+ * Returns true if the element can be focused, i.e. it has a tab index that
+ * allows it to receive keyboard focus (tabIndex >= 0), or it is an element
+ * that natively supports keyboard focus.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element allows keyboard focus.
+ */
+goog.dom.DomHelper.prototype.isFocusable = goog.dom.isFocusable;
+
+
+/**
+ * Returns the text contents of the current node, without markup. New lines are
+ * stripped and whitespace is collapsed, such that each character would be
+ * visible.
+ *
+ * In browsers that support it, innerText is used. Other browsers attempt to
+ * simulate it via node traversal. Line breaks are canonicalized in IE.
+ *
+ * @param {Node} node The node from which we are getting content.
+ * @return {string} The text content.
+ */
+goog.dom.DomHelper.prototype.getTextContent = goog.dom.getTextContent;
+
+
+/**
+ * Returns the text length of the text contained in a node, without markup. This
+ * is equivalent to the selection length if the node was selected, or the number
+ * of cursor movements to traverse the node. Images & BRs take one space. New
+ * lines are ignored.
+ *
+ * @param {Node} node The node whose text content length is being calculated.
+ * @return {number} The length of {@code node}'s text content.
+ */
+goog.dom.DomHelper.prototype.getNodeTextLength = goog.dom.getNodeTextLength;
+
+
+/**
+ * Returns the text offset of a node relative to one of its ancestors. The text
+ * length is the same as the length calculated by
+ * {@code goog.dom.getNodeTextLength}.
+ *
+ * @param {Node} node The node whose offset is being calculated.
+ * @param {Node=} opt_offsetParent Defaults to the node's owner document's body.
+ * @return {number} The text offset.
+ */
+goog.dom.DomHelper.prototype.getNodeTextOffset = goog.dom.getNodeTextOffset;
+
+
+/**
+ * Returns the node at a given offset in a parent node. If an object is
+ * provided for the optional third parameter, the node and the remainder of the
+ * offset will stored as properties of this object.
+ * @param {Node} parent The parent node.
+ * @param {number} offset The offset into the parent node.
+ * @param {Object=} opt_result Object to be used to store the return value. The
+ * return value will be stored in the form {node: Node, remainder: number}
+ * if this object is provided.
+ * @return {Node} The node at the given offset.
+ */
+goog.dom.DomHelper.prototype.getNodeAtOffset = goog.dom.getNodeAtOffset;
+
+
+/**
+ * Returns true if the object is a {@code NodeList}. To qualify as a NodeList,
+ * the object must have a numeric length property and an item function (which
+ * has type 'string' on IE for some reason).
+ * @param {Object} val Object to test.
+ * @return {boolean} Whether the object is a NodeList.
+ */
+goog.dom.DomHelper.prototype.isNodeList = goog.dom.isNodeList;
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that has the passed
+ * tag name and/or class name. If the passed element matches the specified
+ * criteria, the element itself is returned.
+ * @param {Node} element The DOM node to start with.
+ * @param {?(goog.dom.TagName|string)=} opt_tag The tag name to match (or
+ * null/undefined to match only based on class name).
+ * @param {?string=} opt_class The class name to match (or null/undefined to
+ * match only based on tag name).
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {Element} The first ancestor that matches the passed criteria, or
+ * null if no match is found.
+ */
+goog.dom.DomHelper.prototype.getAncestorByTagNameAndClass =
+ goog.dom.getAncestorByTagNameAndClass;
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that has the passed
+ * class name. If the passed element matches the specified criteria, the
+ * element itself is returned.
+ * @param {Node} element The DOM node to start with.
+ * @param {string} class The class name to match.
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {Element} The first ancestor that matches the passed criteria, or
+ * null if none match.
+ */
+goog.dom.DomHelper.prototype.getAncestorByClass = goog.dom.getAncestorByClass;
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that passes the
+ * matcher function.
+ * @param {Node} element The DOM node to start with.
+ * @param {function(Node) : boolean} matcher A function that returns true if the
+ * passed node matches the desired criteria.
+ * @param {boolean=} opt_includeNode If true, the node itself is included in
+ * the search (the first call to the matcher will pass startElement as
+ * the node to test).
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {Node} DOM node that matched the matcher, or null if there was
+ * no match.
+ */
+goog.dom.DomHelper.prototype.getAncestor = goog.dom.getAncestor;
diff --git a/src/http/static/viz/1/goog/dom/nodetype.js b/src/http/static/viz/1/goog/dom/nodetype.js
new file mode 100644
index 0000000..cccb470
--- /dev/null
+++ b/src/http/static/viz/1/goog/dom/nodetype.js
@@ -0,0 +1,48 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Definition of goog.dom.NodeType.
+ */
+
+goog.provide('goog.dom.NodeType');
+
+
+/**
+ * Constants for the nodeType attribute in the Node interface.
+ *
+ * These constants match those specified in the Node interface. These are
+ * usually present on the Node object in recent browsers, but not in older
+ * browsers (specifically, early IEs) and thus are given here.
+ *
+ * In some browsers (early IEs), these are not defined on the Node object,
+ * so they are provided here.
+ *
+ * See http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
+ * @enum {number}
+ */
+goog.dom.NodeType = {
+ ELEMENT: 1,
+ ATTRIBUTE: 2,
+ TEXT: 3,
+ CDATA_SECTION: 4,
+ ENTITY_REFERENCE: 5,
+ ENTITY: 6,
+ PROCESSING_INSTRUCTION: 7,
+ COMMENT: 8,
+ DOCUMENT: 9,
+ DOCUMENT_TYPE: 10,
+ DOCUMENT_FRAGMENT: 11,
+ NOTATION: 12
+};
diff --git a/src/http/static/viz/1/goog/dom/safe.js b/src/http/static/viz/1/goog/dom/safe.js
new file mode 100644
index 0000000..012ad22
--- /dev/null
+++ b/src/http/static/viz/1/goog/dom/safe.js
@@ -0,0 +1,372 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Type-safe wrappers for unsafe DOM APIs.
+ *
+ * This file provides type-safe wrappers for DOM APIs that can result in
+ * cross-site scripting (XSS) vulnerabilities, if the API is supplied with
+ * untrusted (attacker-controlled) input. Instead of plain strings, the type
+ * safe wrappers consume values of types from the goog.html package whose
+ * contract promises that values are safe to use in the corresponding context.
+ *
+ * Hence, a program that exclusively uses the wrappers in this file (i.e., whose
+ * only reference to security-sensitive raw DOM APIs are in this file) is
+ * guaranteed to be free of XSS due to incorrect use of such DOM APIs (modulo
+ * correctness of code that produces values of the respective goog.html types,
+ * and absent code that violates type safety).
+ *
+ * For example, assigning to an element's .innerHTML property a string that is
+ * derived (even partially) from untrusted input typically results in an XSS
+ * vulnerability. The type-safe wrapper goog.html.setInnerHtml consumes a value
+ * of type goog.html.SafeHtml, whose contract states that using its values in a
+ * HTML context will not result in XSS. Hence a program that is free of direct
+ * assignments to any element's innerHTML property (with the exception of the
+ * assignment to .innerHTML in this file) is guaranteed to be free of XSS due to
+ * assignment of untrusted strings to the innerHTML property.
+ */
+
+goog.provide('goog.dom.safe');
+goog.provide('goog.dom.safe.InsertAdjacentHtmlPosition');
+
+goog.require('goog.asserts');
+goog.require('goog.html.SafeHtml');
+goog.require('goog.html.SafeUrl');
+goog.require('goog.html.TrustedResourceUrl');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+
+
+/** @enum {string} */
+goog.dom.safe.InsertAdjacentHtmlPosition = {
+ AFTERBEGIN: 'afterbegin',
+ AFTEREND: 'afterend',
+ BEFOREBEGIN: 'beforebegin',
+ BEFOREEND: 'beforeend'
+};
+
+
+/**
+ * Inserts known-safe HTML into a Node, at the specified position.
+ * @param {!Node} node The node on which to call insertAdjacentHTML.
+ * @param {!goog.dom.safe.InsertAdjacentHtmlPosition} position Position where
+ * to insert the HTML.
+ * @param {!goog.html.SafeHtml} html The known-safe HTML to insert.
+ */
+goog.dom.safe.insertAdjacentHtml = function(node, position, html) {
+ node.insertAdjacentHTML(position, goog.html.SafeHtml.unwrap(html));
+};
+
+
+/**
+ * Assigns known-safe HTML to an element's innerHTML property.
+ * @param {!Element} elem The element whose innerHTML is to be assigned to.
+ * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.
+ */
+goog.dom.safe.setInnerHtml = function(elem, html) {
+ elem.innerHTML = goog.html.SafeHtml.unwrap(html);
+};
+
+
+/**
+ * Assigns known-safe HTML to an element's outerHTML property.
+ * @param {!Element} elem The element whose outerHTML is to be assigned to.
+ * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.
+ */
+goog.dom.safe.setOuterHtml = function(elem, html) {
+ elem.outerHTML = goog.html.SafeHtml.unwrap(html);
+};
+
+
+/**
+ * Writes known-safe HTML to a document.
+ * @param {!Document} doc The document to be written to.
+ * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.
+ */
+goog.dom.safe.documentWrite = function(doc, html) {
+ doc.write(goog.html.SafeHtml.unwrap(html));
+};
+
+
+/**
+ * Safely assigns a URL to an anchor element's href property.
+ *
+ * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to
+ * anchor's href property. If url is of type string however, it is first
+ * sanitized using goog.html.SafeUrl.sanitize.
+ *
+ * Example usage:
+ * goog.dom.safe.setAnchorHref(anchorEl, url);
+ * which is a safe alternative to
+ * anchorEl.href = url;
+ * The latter can result in XSS vulnerabilities if url is a
+ * user-/attacker-controlled value.
+ *
+ * @param {!HTMLAnchorElement} anchor The anchor element whose href property
+ * is to be assigned to.
+ * @param {string|!goog.html.SafeUrl} url The URL to assign.
+ * @see goog.html.SafeUrl#sanitize
+ */
+goog.dom.safe.setAnchorHref = function(anchor, url) {
+ /** @type {!goog.html.SafeUrl} */
+ var safeUrl;
+ if (url instanceof goog.html.SafeUrl) {
+ safeUrl = url;
+ } else {
+ safeUrl = goog.html.SafeUrl.sanitize(url);
+ }
+ anchor.href = goog.html.SafeUrl.unwrap(safeUrl);
+};
+
+
+/**
+ * Safely assigns a URL to an image element's src property.
+ *
+ * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to
+ * image's src property. If url is of type string however, it is first
+ * sanitized using goog.html.SafeUrl.sanitize.
+ *
+ * @param {!HTMLImageElement} imageElement The image element whose src property
+ * is to be assigned to.
+ * @param {string|!goog.html.SafeUrl} url The URL to assign.
+ * @see goog.html.SafeUrl#sanitize
+ */
+goog.dom.safe.setImageSrc = function(imageElement, url) {
+ /** @type {!goog.html.SafeUrl} */
+ var safeUrl;
+ if (url instanceof goog.html.SafeUrl) {
+ safeUrl = url;
+ } else {
+ safeUrl = goog.html.SafeUrl.sanitize(url);
+ }
+ imageElement.src = goog.html.SafeUrl.unwrap(safeUrl);
+};
+
+
+/**
+ * Safely assigns a URL to an embed element's src property.
+ *
+ * Example usage:
+ * goog.dom.safe.setEmbedSrc(embedEl, url);
+ * which is a safe alternative to
+ * embedEl.src = url;
+ * The latter can result in loading untrusted code unless it is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLEmbedElement} embed The embed element whose src property
+ * is to be assigned to.
+ * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
+ */
+goog.dom.safe.setEmbedSrc = function(embed, url) {
+ embed.src = goog.html.TrustedResourceUrl.unwrap(url);
+};
+
+
+/**
+ * Safely assigns a URL to a frame element's src property.
+ *
+ * Example usage:
+ * goog.dom.safe.setFrameSrc(frameEl, url);
+ * which is a safe alternative to
+ * frameEl.src = url;
+ * The latter can result in loading untrusted code unless it is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLFrameElement} frame The frame element whose src property
+ * is to be assigned to.
+ * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
+ */
+goog.dom.safe.setFrameSrc = function(frame, url) {
+ frame.src = goog.html.TrustedResourceUrl.unwrap(url);
+};
+
+
+/**
+ * Safely assigns a URL to an iframe element's src property.
+ *
+ * Example usage:
+ * goog.dom.safe.setIframeSrc(iframeEl, url);
+ * which is a safe alternative to
+ * iframeEl.src = url;
+ * The latter can result in loading untrusted code unless it is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLIFrameElement} iframe The iframe element whose src property
+ * is to be assigned to.
+ * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
+ */
+goog.dom.safe.setIframeSrc = function(iframe, url) {
+ iframe.src = goog.html.TrustedResourceUrl.unwrap(url);
+};
+
+
+/**
+ * Safely sets a link element's href and rel properties. Whether or not
+ * the URL assigned to href has to be a goog.html.TrustedResourceUrl
+ * depends on the value of the rel property. If rel contains "stylesheet"
+ * then a TrustedResourceUrl is required.
+ *
+ * Example usage:
+ * goog.dom.safe.setLinkHrefAndRel(linkEl, url, 'stylesheet');
+ * which is a safe alternative to
+ * linkEl.rel = 'stylesheet';
+ * linkEl.href = url;
+ * The latter can result in loading untrusted code unless it is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLLinkElement} link The link element whose href property
+ * is to be assigned to.
+ * @param {string|!goog.html.SafeUrl|!goog.html.TrustedResourceUrl} url The URL
+ * to assign to the href property. Must be a TrustedResourceUrl if the
+ * value assigned to rel contains "stylesheet". A string value is
+ * sanitized with goog.html.SafeUrl.sanitize.
+ * @param {string} rel The value to assign to the rel property.
+ * @throws {Error} if rel contains "stylesheet" and url is not a
+ * TrustedResourceUrl
+ * @see goog.html.SafeUrl#sanitize
+ */
+goog.dom.safe.setLinkHrefAndRel = function(link, url, rel) {
+ link.rel = rel;
+ if (goog.string.caseInsensitiveContains(rel, 'stylesheet')) {
+ goog.asserts.assert(
+ url instanceof goog.html.TrustedResourceUrl,
+ 'URL must be TrustedResourceUrl because "rel" contains "stylesheet"');
+ link.href = goog.html.TrustedResourceUrl.unwrap(url);
+ } else if (url instanceof goog.html.TrustedResourceUrl) {
+ link.href = goog.html.TrustedResourceUrl.unwrap(url);
+ } else if (url instanceof goog.html.SafeUrl) {
+ link.href = goog.html.SafeUrl.unwrap(url);
+ } else { // string
+ // SafeUrl.sanitize must return legitimate SafeUrl when passed a string.
+ link.href = goog.html.SafeUrl.sanitize(url).getTypedStringValue();
+ }
+};
+
+
+/**
+ * Safely assigns a URL to an object element's data property.
+ *
+ * Example usage:
+ * goog.dom.safe.setObjectData(objectEl, url);
+ * which is a safe alternative to
+ * objectEl.data = url;
+ * The latter can result in loading untrusted code unless setit is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLObjectElement} object The object element whose data property
+ * is to be assigned to.
+ * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
+ */
+goog.dom.safe.setObjectData = function(object, url) {
+ object.data = goog.html.TrustedResourceUrl.unwrap(url);
+};
+
+
+/**
+ * Safely assigns a URL to an iframe element's src property.
+ *
+ * Example usage:
+ * goog.dom.safe.setScriptSrc(scriptEl, url);
+ * which is a safe alternative to
+ * scriptEl.src = url;
+ * The latter can result in loading untrusted code unless it is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLScriptElement} script The script element whose src property
+ * is to be assigned to.
+ * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
+ */
+goog.dom.safe.setScriptSrc = function(script, url) {
+ script.src = goog.html.TrustedResourceUrl.unwrap(url);
+};
+
+
+/**
+ * Safely assigns a URL to a Location object's href property.
+ *
+ * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to
+ * loc's href property. If url is of type string however, it is first sanitized
+ * using goog.html.SafeUrl.sanitize.
+ *
+ * Example usage:
+ * goog.dom.safe.setLocationHref(document.location, redirectUrl);
+ * which is a safe alternative to
+ * document.location.href = redirectUrl;
+ * The latter can result in XSS vulnerabilities if redirectUrl is a
+ * user-/attacker-controlled value.
+ *
+ * @param {!Location} loc The Location object whose href property is to be
+ * assigned to.
+ * @param {string|!goog.html.SafeUrl} url The URL to assign.
+ * @see goog.html.SafeUrl#sanitize
+ */
+goog.dom.safe.setLocationHref = function(loc, url) {
+ /** @type {!goog.html.SafeUrl} */
+ var safeUrl;
+ if (url instanceof goog.html.SafeUrl) {
+ safeUrl = url;
+ } else {
+ safeUrl = goog.html.SafeUrl.sanitize(url);
+ }
+ loc.href = goog.html.SafeUrl.unwrap(safeUrl);
+};
+
+
+/**
+ * Safely opens a URL in a new window (via window.open).
+ *
+ * If url is of type goog.html.SafeUrl, its value is unwrapped and passed in to
+ * window.open. If url is of type string however, it is first sanitized
+ * using goog.html.SafeUrl.sanitize.
+ *
+ * Note that this function does not prevent leakages via the referer that is
+ * sent by window.open. It is advised to only use this to open 1st party URLs.
+ *
+ * Example usage:
+ * goog.dom.safe.openInWindow(url);
+ * which is a safe alternative to
+ * window.open(url);
+ * The latter can result in XSS vulnerabilities if redirectUrl is a
+ * user-/attacker-controlled value.
+ *
+ * @param {string|!goog.html.SafeUrl} url The URL to open.
+ * @param {Window=} opt_openerWin Window of which to call the .open() method.
+ * Defaults to the global window.
+ * @param {!goog.string.Const=} opt_name Name of the window to open in. Can be
+ * _top, etc as allowed by window.open().
+ * @param {string=} opt_specs Comma-separated list of specifications, same as
+ * in window.open().
+ * @param {boolean=} opt_replace Whether to replace the current entry in browser
+ * history, same as in window.open().
+ * @return {Window} Window the url was opened in.
+ */
+goog.dom.safe.openInWindow = function(
+ url, opt_openerWin, opt_name, opt_specs, opt_replace) {
+ /** @type {!goog.html.SafeUrl} */
+ var safeUrl;
+ if (url instanceof goog.html.SafeUrl) {
+ safeUrl = url;
+ } else {
+ safeUrl = goog.html.SafeUrl.sanitize(url);
+ }
+ var win = opt_openerWin || window;
+ return win.open(
+ goog.html.SafeUrl.unwrap(safeUrl),
+ // If opt_name is undefined, simply passing that in to open() causes IE to
+ // reuse the current window instead of opening a new one. Thus we pass ''
+ // in instead, which according to spec opens a new window. See
+ // https://html.spec.whatwg.org/multipage/browsers.html#dom-open .
+ opt_name ? goog.string.Const.unwrap(opt_name) : '', opt_specs,
+ opt_replace);
+};
diff --git a/src/http/static/viz/1/goog/dom/tagname.js b/src/http/static/viz/1/goog/dom/tagname.js
new file mode 100644
index 0000000..ad44d85
--- /dev/null
+++ b/src/http/static/viz/1/goog/dom/tagname.js
@@ -0,0 +1,160 @@
+// Copyright 2007 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Defines the goog.dom.TagName enum. This enumerates
+ * all HTML tag names specified in either the the W3C HTML 4.01 index of
+ * elements or the HTML5 draft specification.
+ *
+ * References:
+ * http://www.w3.org/TR/html401/index/elements.html
+ * http://dev.w3.org/html5/spec/section-index.html
+ *
+ */
+goog.provide('goog.dom.TagName');
+
+
+/**
+ * Enum of all html tag names specified by the W3C HTML4.01 and HTML5
+ * specifications.
+ * @enum {string}
+ */
+goog.dom.TagName = {
+ A: 'A',
+ ABBR: 'ABBR',
+ ACRONYM: 'ACRONYM',
+ ADDRESS: 'ADDRESS',
+ APPLET: 'APPLET',
+ AREA: 'AREA',
+ ARTICLE: 'ARTICLE',
+ ASIDE: 'ASIDE',
+ AUDIO: 'AUDIO',
+ B: 'B',
+ BASE: 'BASE',
+ BASEFONT: 'BASEFONT',
+ BDI: 'BDI',
+ BDO: 'BDO',
+ BIG: 'BIG',
+ BLOCKQUOTE: 'BLOCKQUOTE',
+ BODY: 'BODY',
+ BR: 'BR',
+ BUTTON: 'BUTTON',
+ CANVAS: 'CANVAS',
+ CAPTION: 'CAPTION',
+ CENTER: 'CENTER',
+ CITE: 'CITE',
+ CODE: 'CODE',
+ COL: 'COL',
+ COLGROUP: 'COLGROUP',
+ COMMAND: 'COMMAND',
+ DATA: 'DATA',
+ DATALIST: 'DATALIST',
+ DD: 'DD',
+ DEL: 'DEL',
+ DETAILS: 'DETAILS',
+ DFN: 'DFN',
+ DIALOG: 'DIALOG',
+ DIR: 'DIR',
+ DIV: 'DIV',
+ DL: 'DL',
+ DT: 'DT',
+ EM: 'EM',
+ EMBED: 'EMBED',
+ FIELDSET: 'FIELDSET',
+ FIGCAPTION: 'FIGCAPTION',
+ FIGURE: 'FIGURE',
+ FONT: 'FONT',
+ FOOTER: 'FOOTER',
+ FORM: 'FORM',
+ FRAME: 'FRAME',
+ FRAMESET: 'FRAMESET',
+ H1: 'H1',
+ H2: 'H2',
+ H3: 'H3',
+ H4: 'H4',
+ H5: 'H5',
+ H6: 'H6',
+ HEAD: 'HEAD',
+ HEADER: 'HEADER',
+ HGROUP: 'HGROUP',
+ HR: 'HR',
+ HTML: 'HTML',
+ I: 'I',
+ IFRAME: 'IFRAME',
+ IMG: 'IMG',
+ INPUT: 'INPUT',
+ INS: 'INS',
+ ISINDEX: 'ISINDEX',
+ KBD: 'KBD',
+ KEYGEN: 'KEYGEN',
+ LABEL: 'LABEL',
+ LEGEND: 'LEGEND',
+ LI: 'LI',
+ LINK: 'LINK',
+ MAP: 'MAP',
+ MARK: 'MARK',
+ MATH: 'MATH',
+ MENU: 'MENU',
+ META: 'META',
+ METER: 'METER',
+ NAV: 'NAV',
+ NOFRAMES: 'NOFRAMES',
+ NOSCRIPT: 'NOSCRIPT',
+ OBJECT: 'OBJECT',
+ OL: 'OL',
+ OPTGROUP: 'OPTGROUP',
+ OPTION: 'OPTION',
+ OUTPUT: 'OUTPUT',
+ P: 'P',
+ PARAM: 'PARAM',
+ PRE: 'PRE',
+ PROGRESS: 'PROGRESS',
+ Q: 'Q',
+ RP: 'RP',
+ RT: 'RT',
+ RUBY: 'RUBY',
+ S: 'S',
+ SAMP: 'SAMP',
+ SCRIPT: 'SCRIPT',
+ SECTION: 'SECTION',
+ SELECT: 'SELECT',
+ SMALL: 'SMALL',
+ SOURCE: 'SOURCE',
+ SPAN: 'SPAN',
+ STRIKE: 'STRIKE',
+ STRONG: 'STRONG',
+ STYLE: 'STYLE',
+ SUB: 'SUB',
+ SUMMARY: 'SUMMARY',
+ SUP: 'SUP',
+ SVG: 'SVG',
+ TABLE: 'TABLE',
+ TBODY: 'TBODY',
+ TD: 'TD',
+ TEMPLATE: 'TEMPLATE',
+ TEXTAREA: 'TEXTAREA',
+ TFOOT: 'TFOOT',
+ TH: 'TH',
+ THEAD: 'THEAD',
+ TIME: 'TIME',
+ TITLE: 'TITLE',
+ TR: 'TR',
+ TRACK: 'TRACK',
+ TT: 'TT',
+ U: 'U',
+ UL: 'UL',
+ VAR: 'VAR',
+ VIDEO: 'VIDEO',
+ WBR: 'WBR'
+};
diff --git a/src/http/static/viz/1/goog/dom/tags.js b/src/http/static/viz/1/goog/dom/tags.js
new file mode 100644
index 0000000..7c12938
--- /dev/null
+++ b/src/http/static/viz/1/goog/dom/tags.js
@@ -0,0 +1,41 @@
+// Copyright 2014 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for HTML element tag names.
+ */
+goog.provide('goog.dom.tags');
+
+goog.require('goog.object');
+
+
+/**
+ * The void elements specified by
+ * http://www.w3.org/TR/html-markup/syntax.html#void-elements.
+ * @const @private {!Object<string, boolean>}
+ */
+goog.dom.tags.VOID_TAGS_ = goog.object.createSet(
+ 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input',
+ 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr');
+
+
+/**
+ * Checks whether the tag is void (with no contents allowed and no legal end
+ * tag), for example 'br'.
+ * @param {string} tagName The tag name in lower case.
+ * @return {boolean}
+ */
+goog.dom.tags.isVoidTag = function(tagName) {
+ return goog.dom.tags.VOID_TAGS_[tagName] === true;
+};
diff --git a/src/http/static/viz/1/goog/events/browserevent.js b/src/http/static/viz/1/goog/events/browserevent.js
new file mode 100644
index 0000000..14894e1
--- /dev/null
+++ b/src/http/static/viz/1/goog/events/browserevent.js
@@ -0,0 +1,402 @@
+// Copyright 2005 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A patched, standardized event object for browser events.
+ *
+ * <pre>
+ * The patched event object contains the following members:
+ * - type {string} Event type, e.g. 'click'
+ * - target {Object} The element that actually triggered the event
+ * - currentTarget {Object} The element the listener is attached to
+ * - relatedTarget {Object} For mouseover and mouseout, the previous object
+ * - offsetX {number} X-coordinate relative to target
+ * - offsetY {number} Y-coordinate relative to target
+ * - clientX {number} X-coordinate relative to viewport
+ * - clientY {number} Y-coordinate relative to viewport
+ * - screenX {number} X-coordinate relative to the edge of the screen
+ * - screenY {number} Y-coordinate relative to the edge of the screen
+ * - button {number} Mouse button. Use isButton() to test.
+ * - keyCode {number} Key-code
+ * - ctrlKey {boolean} Was ctrl key depressed
+ * - altKey {boolean} Was alt key depressed
+ * - shiftKey {boolean} Was shift key depressed
+ * - metaKey {boolean} Was meta key depressed
+ * - defaultPrevented {boolean} Whether the default action has been prevented
+ * - state {Object} History state object
+ *
+ * NOTE: The keyCode member contains the raw browser keyCode. For normalized
+ * key and character code use {@link goog.events.KeyHandler}.
+ * </pre>
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+goog.provide('goog.events.BrowserEvent');
+goog.provide('goog.events.BrowserEvent.MouseButton');
+
+goog.require('goog.events.BrowserFeature');
+goog.require('goog.events.Event');
+goog.require('goog.events.EventType');
+goog.require('goog.reflect');
+goog.require('goog.userAgent');
+
+
+
+/**
+ * Accepts a browser event object and creates a patched, cross browser event
+ * object.
+ * The content of this object will not be initialized if no event object is
+ * provided. If this is the case, init() needs to be invoked separately.
+ * @param {Event=} opt_e Browser event object.
+ * @param {EventTarget=} opt_currentTarget Current target for event.
+ * @constructor
+ * @extends {goog.events.Event}
+ */
+goog.events.BrowserEvent = function(opt_e, opt_currentTarget) {
+ goog.events.BrowserEvent.base(this, 'constructor', opt_e ? opt_e.type : '');
+
+ /**
+ * Target that fired the event.
+ * @override
+ * @type {Node}
+ */
+ this.target = null;
+
+ /**
+ * Node that had the listener attached.
+ * @override
+ * @type {Node|undefined}
+ */
+ this.currentTarget = null;
+
+ /**
+ * For mouseover and mouseout events, the related object for the event.
+ * @type {Node}
+ */
+ this.relatedTarget = null;
+
+ /**
+ * X-coordinate relative to target.
+ * @type {number}
+ */
+ this.offsetX = 0;
+
+ /**
+ * Y-coordinate relative to target.
+ * @type {number}
+ */
+ this.offsetY = 0;
+
+ /**
+ * X-coordinate relative to the window.
+ * @type {number}
+ */
+ this.clientX = 0;
+
+ /**
+ * Y-coordinate relative to the window.
+ * @type {number}
+ */
+ this.clientY = 0;
+
+ /**
+ * X-coordinate relative to the monitor.
+ * @type {number}
+ */
+ this.screenX = 0;
+
+ /**
+ * Y-coordinate relative to the monitor.
+ * @type {number}
+ */
+ this.screenY = 0;
+
+ /**
+ * Which mouse button was pressed.
+ * @type {number}
+ */
+ this.button = 0;
+
+ /**
+ * Keycode of key press.
+ * @type {number}
+ */
+ this.keyCode = 0;
+
+ /**
+ * Keycode of key press.
+ * @type {number}
+ */
+ this.charCode = 0;
+
+ /**
+ * Whether control was pressed at time of event.
+ * @type {boolean}
+ */
+ this.ctrlKey = false;
+
+ /**
+ * Whether alt was pressed at time of event.
+ * @type {boolean}
+ */
+ this.altKey = false;
+
+ /**
+ * Whether shift was pressed at time of event.
+ * @type {boolean}
+ */
+ this.shiftKey = false;
+
+ /**
+ * Whether the meta key was pressed at time of event.
+ * @type {boolean}
+ */
+ this.metaKey = false;
+
+ /**
+ * History state object, only set for PopState events where it's a copy of the
+ * state object provided to pushState or replaceState.
+ * @type {Object}
+ */
+ this.state = null;
+
+ /**
+ * Whether the default platform modifier key was pressed at time of event.
+ * (This is control for all platforms except Mac, where it's Meta.)
+ * @type {boolean}
+ */
+ this.platformModifierKey = false;
+
+ /**
+ * The browser event object.
+ * @private {Event}
+ */
+ this.event_ = null;
+
+ if (opt_e) {
+ this.init(opt_e, opt_currentTarget);
+ }
+};
+goog.inherits(goog.events.BrowserEvent, goog.events.Event);
+
+
+/**
+ * Normalized button constants for the mouse.
+ * @enum {number}
+ */
+goog.events.BrowserEvent.MouseButton = {
+ LEFT: 0,
+ MIDDLE: 1,
+ RIGHT: 2
+};
+
+
+/**
+ * Static data for mapping mouse buttons.
+ * @type {!Array<number>}
+ */
+goog.events.BrowserEvent.IEButtonMap = [
+ 1, // LEFT
+ 4, // MIDDLE
+ 2 // RIGHT
+];
+
+
+/**
+ * Accepts a browser event object and creates a patched, cross browser event
+ * object.
+ * @param {Event} e Browser event object.
+ * @param {EventTarget=} opt_currentTarget Current target for event.
+ */
+goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) {
+ var type = this.type = e.type;
+
+ /**
+ * On touch devices use the first "changed touch" as the relevant touch.
+ * @type {Touch}
+ */
+ var relevantTouch = e.changedTouches ? e.changedTouches[0] : null;
+
+ // TODO(nicksantos): Change this.target to type EventTarget.
+ this.target = /** @type {Node} */ (e.target) || e.srcElement;
+
+ // TODO(nicksantos): Change this.currentTarget to type EventTarget.
+ this.currentTarget = /** @type {Node} */ (opt_currentTarget);
+
+ var relatedTarget = /** @type {Node} */ (e.relatedTarget);
+ if (relatedTarget) {
+ // There's a bug in FireFox where sometimes, relatedTarget will be a
+ // chrome element, and accessing any property of it will get a permission
+ // denied exception. See:
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=497780
+ if (goog.userAgent.GECKO) {
+ if (!goog.reflect.canAccessProperty(relatedTarget, 'nodeName')) {
+ relatedTarget = null;
+ }
+ }
+ // TODO(arv): Use goog.events.EventType when it has been refactored into its
+ // own file.
+ } else if (type == goog.events.EventType.MOUSEOVER) {
+ relatedTarget = e.fromElement;
+ } else if (type == goog.events.EventType.MOUSEOUT) {
+ relatedTarget = e.toElement;
+ }
+
+ this.relatedTarget = relatedTarget;
+
+ if (!goog.isNull(relevantTouch)) {
+ this.clientX = relevantTouch.clientX !== undefined ? relevantTouch.clientX :
+ relevantTouch.pageX;
+ this.clientY = relevantTouch.clientY !== undefined ? relevantTouch.clientY :
+ relevantTouch.pageY;
+ this.screenX = relevantTouch.screenX || 0;
+ this.screenY = relevantTouch.screenY || 0;
+ } else {
+ // Webkit emits a lame warning whenever layerX/layerY is accessed.
+ // http://code.google.com/p/chromium/issues/detail?id=101733
+ this.offsetX = (goog.userAgent.WEBKIT || e.offsetX !== undefined) ?
+ e.offsetX :
+ e.layerX;
+ this.offsetY = (goog.userAgent.WEBKIT || e.offsetY !== undefined) ?
+ e.offsetY :
+ e.layerY;
+ this.clientX = e.clientX !== undefined ? e.clientX : e.pageX;
+ this.clientY = e.clientY !== undefined ? e.clientY : e.pageY;
+ this.screenX = e.screenX || 0;
+ this.screenY = e.screenY || 0;
+ }
+
+ this.button = e.button;
+
+ this.keyCode = e.keyCode || 0;
+ this.charCode = e.charCode || (type == 'keypress' ? e.keyCode : 0);
+ this.ctrlKey = e.ctrlKey;
+ this.altKey = e.altKey;
+ this.shiftKey = e.shiftKey;
+ this.metaKey = e.metaKey;
+ this.platformModifierKey = goog.userAgent.MAC ? e.metaKey : e.ctrlKey;
+ this.state = e.state;
+ this.event_ = e;
+ if (e.defaultPrevented) {
+ this.preventDefault();
+ }
+};
+
+
+/**
+ * Tests to see which button was pressed during the event. This is really only
+ * useful in IE and Gecko browsers. And in IE, it's only useful for
+ * mousedown/mouseup events, because click only fires for the left mouse button.
+ *
+ * Safari 2 only reports the left button being clicked, and uses the value '1'
+ * instead of 0. Opera only reports a mousedown event for the middle button, and
+ * no mouse events for the right button. Opera has default behavior for left and
+ * middle click that can only be overridden via a configuration setting.
+ *
+ * There's a nice table of this mess at http://www.unixpapa.com/js/mouse.html.
+ *
+ * @param {goog.events.BrowserEvent.MouseButton} button The button
+ * to test for.
+ * @return {boolean} True if button was pressed.
+ */
+goog.events.BrowserEvent.prototype.isButton = function(button) {
+ if (!goog.events.BrowserFeature.HAS_W3C_BUTTON) {
+ if (this.type == 'click') {
+ return button == goog.events.BrowserEvent.MouseButton.LEFT;
+ } else {
+ return !!(
+ this.event_.button & goog.events.BrowserEvent.IEButtonMap[button]);
+ }
+ } else {
+ return this.event_.button == button;
+ }
+};
+
+
+/**
+ * Whether this has an "action"-producing mouse button.
+ *
+ * By definition, this includes left-click on windows/linux, and left-click
+ * without the ctrl key on Macs.
+ *
+ * @return {boolean} The result.
+ */
+goog.events.BrowserEvent.prototype.isMouseActionButton = function() {
+ // Webkit does not ctrl+click to be a right-click, so we
+ // normalize it to behave like Gecko and Opera.
+ return this.isButton(goog.events.BrowserEvent.MouseButton.LEFT) &&
+ !(goog.userAgent.WEBKIT && goog.userAgent.MAC && this.ctrlKey);
+};
+
+
+/**
+ * @override
+ */
+goog.events.BrowserEvent.prototype.stopPropagation = function() {
+ goog.events.BrowserEvent.superClass_.stopPropagation.call(this);
+ if (this.event_.stopPropagation) {
+ this.event_.stopPropagation();
+ } else {
+ this.event_.cancelBubble = true;
+ }
+};
+
+
+/**
+ * @override
+ */
+goog.events.BrowserEvent.prototype.preventDefault = function() {
+ goog.events.BrowserEvent.superClass_.preventDefault.call(this);
+ var be = this.event_;
+ if (!be.preventDefault) {
+ be.returnValue = false;
+ if (goog.events.BrowserFeature.SET_KEY_CODE_TO_PREVENT_DEFAULT) {
+ /** @preserveTry */
+ try {
+ // Most keys can be prevented using returnValue. Some special keys
+ // require setting the keyCode to -1 as well:
+ //
+ // In IE7:
+ // F3, F5, F10, F11, Ctrl+P, Crtl+O, Ctrl+F (these are taken from IE6)
+ //
+ // In IE8:
+ // Ctrl+P, Crtl+O, Ctrl+F (F1-F12 cannot be stopped through the event)
+ //
+ // We therefore do this for all function keys as well as when Ctrl key
+ // is pressed.
+ var VK_F1 = 112;
+ var VK_F12 = 123;
+ if (be.ctrlKey || be.keyCode >= VK_F1 && be.keyCode <= VK_F12) {
+ be.keyCode = -1;
+ }
+ } catch (ex) {
+ // IE throws an 'access denied' exception when trying to change
+ // keyCode in some situations (e.g. srcElement is input[type=file],
+ // or srcElement is an anchor tag rewritten by parent's innerHTML).
+ // Do nothing in this case.
+ }
+ }
+ } else {
+ be.preventDefault();
+ }
+};
+
+
+/**
+ * @return {Event} The underlying browser event object.
+ */
+goog.events.BrowserEvent.prototype.getBrowserEvent = function() {
+ return this.event_;
+};
diff --git a/src/http/static/viz/1/goog/events/browserfeature.js b/src/http/static/viz/1/goog/events/browserfeature.js
new file mode 100644
index 0000000..4cfa8e3
--- /dev/null
+++ b/src/http/static/viz/1/goog/events/browserfeature.js
@@ -0,0 +1,84 @@
+// Copyright 2010 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Browser capability checks for the events package.
+ *
+ */
+
+
+goog.provide('goog.events.BrowserFeature');
+
+goog.require('goog.userAgent');
+
+
+/**
+ * Enum of browser capabilities.
+ * @enum {boolean}
+ */
+goog.events.BrowserFeature = {
+ /**
+ * Whether the button attribute of the event is W3C compliant. False in
+ * Internet Explorer prior to version 9; document-version dependent.
+ */
+ HAS_W3C_BUTTON:
+ !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9),
+
+ /**
+ * Whether the browser supports full W3C event model.
+ */
+ HAS_W3C_EVENT_SUPPORT:
+ !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9),
+
+ /**
+ * To prevent default in IE7-8 for certain keydown events we need set the
+ * keyCode to -1.
+ */
+ SET_KEY_CODE_TO_PREVENT_DEFAULT:
+ goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9'),
+
+ /**
+ * Whether the {@code navigator.onLine} property is supported.
+ */
+ HAS_NAVIGATOR_ONLINE_PROPERTY:
+ !goog.userAgent.WEBKIT || goog.userAgent.isVersionOrHigher('528'),
+
+ /**
+ * Whether HTML5 network online/offline events are supported.
+ */
+ HAS_HTML5_NETWORK_EVENT_SUPPORT:
+ goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9b') ||
+ goog.userAgent.IE && goog.userAgent.isVersionOrHigher('8') ||
+ goog.userAgent.OPERA && goog.userAgent.isVersionOrHigher('9.5') ||
+ goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher('528'),
+
+ /**
+ * Whether HTML5 network events fire on document.body, or otherwise the
+ * window.
+ */
+ HTML5_NETWORK_EVENTS_FIRE_ON_BODY:
+ goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher('8') ||
+ goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9'),
+
+ /**
+ * Whether touch is enabled in the browser.
+ */
+ TOUCH_ENABLED:
+ ('ontouchstart' in goog.global ||
+ !!(goog.global['document'] && document.documentElement &&
+ 'ontouchstart' in document.documentElement) ||
+ // IE10 uses non-standard touch events, so it has a different check.
+ !!(goog.global['navigator'] &&
+ goog.global['navigator']['msMaxTouchPoints']))
+};
diff --git a/src/http/static/viz/1/goog/events/event.js b/src/http/static/viz/1/goog/events/event.js
new file mode 100644
index 0000000..89db91e
--- /dev/null
+++ b/src/http/static/viz/1/goog/events/event.js
@@ -0,0 +1,145 @@
+// Copyright 2005 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A base class for event objects.
+ *
+ */
+
+
+goog.provide('goog.events.Event');
+goog.provide('goog.events.EventLike');
+
+/**
+ * goog.events.Event no longer depends on goog.Disposable. Keep requiring
+ * goog.Disposable here to not break projects which assume this dependency.
+ * @suppress {extraRequire}
+ */
+goog.require('goog.Disposable');
+goog.require('goog.events.EventId');
+
+
+/**
+ * A typedef for event like objects that are dispatchable via the
+ * goog.events.dispatchEvent function. strings are treated as the type for a
+ * goog.events.Event. Objects are treated as an extension of a new
+ * goog.events.Event with the type property of the object being used as the type
+ * of the Event.
+ * @typedef {string|Object|goog.events.Event|goog.events.EventId}
+ */
+goog.events.EventLike;
+
+
+
+/**
+ * A base class for event objects, so that they can support preventDefault and
+ * stopPropagation.
+ *
+ * @suppress {underscore} Several properties on this class are technically
+ * public, but referencing these properties outside this package is strongly
+ * discouraged.
+ *
+ * @param {string|!goog.events.EventId} type Event Type.
+ * @param {Object=} opt_target Reference to the object that is the target of
+ * this event. It has to implement the {@code EventTarget} interface
+ * declared at {@link http://developer.mozilla.org/en/DOM/EventTarget}.
+ * @constructor
+ */
+goog.events.Event = function(type, opt_target) {
+ /**
+ * Event type.
+ * @type {string}
+ */
+ this.type = type instanceof goog.events.EventId ? String(type) : type;
+
+ /**
+ * TODO(tbreisacher): The type should probably be
+ * EventTarget|goog.events.EventTarget.
+ *
+ * Target of the event.
+ * @type {Object|undefined}
+ */
+ this.target = opt_target;
+
+ /**
+ * Object that had the listener attached.
+ * @type {Object|undefined}
+ */
+ this.currentTarget = this.target;
+
+ /**
+ * Whether to cancel the event in internal capture/bubble processing for IE.
+ * @type {boolean}
+ * @public
+ */
+ this.propagationStopped_ = false;
+
+ /**
+ * Whether the default action has been prevented.
+ * This is a property to match the W3C specification at
+ * {@link http://www.w3.org/TR/DOM-Level-3-Events/
+ * #events-event-type-defaultPrevented}.
+ * Must be treated as read-only outside the class.
+ * @type {boolean}
+ */
+ this.defaultPrevented = false;
+
+ /**
+ * Return value for in internal capture/bubble processing for IE.
+ * @type {boolean}
+ * @public
+ * @suppress {underscore|visibility} Technically public, but referencing this
+ * outside this package is strongly discouraged.
+ */
+ this.returnValue_ = true;
+};
+
+
+/**
+ * Stops event propagation.
+ */
+goog.events.Event.prototype.stopPropagation = function() {
+ this.propagationStopped_ = true;
+};
+
+
+/**
+ * Prevents the default action, for example a link redirecting to a url.
+ */
+goog.events.Event.prototype.preventDefault = function() {
+ this.defaultPrevented = true;
+ this.returnValue_ = false;
+};
+
+
+/**
+ * Stops the propagation of the event. It is equivalent to
+ * {@code e.stopPropagation()}, but can be used as the callback argument of
+ * {@link goog.events.listen} without declaring another function.
+ * @param {!goog.events.Event} e An event.
+ */
+goog.events.Event.stopPropagation = function(e) {
+ e.stopPropagation();
+};
+
+
+/**
+ * Prevents the default action. It is equivalent to
+ * {@code e.preventDefault()}, but can be used as the callback argument of
+ * {@link goog.events.listen} without declaring another function.
+ * @param {!goog.events.Event} e An event.
+ */
+goog.events.Event.preventDefault = function(e) {
+ e.preventDefault();
+};
diff --git a/src/http/static/viz/1/goog/events/eventid.js b/src/http/static/viz/1/goog/events/eventid.js
new file mode 100644
index 0000000..9ff9e40
--- /dev/null
+++ b/src/http/static/viz/1/goog/events/eventid.js
@@ -0,0 +1,46 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+goog.provide('goog.events.EventId');
+
+
+
+/**
+ * A templated class that is used when registering for events. Typical usage:
+ *
+ * /** @type {goog.events.EventId<MyEventObj>} *\
+ * var myEventId = new goog.events.EventId(
+ * goog.events.getUniqueId(('someEvent'));
+ *
+ * // No need to cast or declare here since the compiler knows the
+ * // correct type of 'evt' (MyEventObj).
+ * something.listen(myEventId, function(evt) {});
+ *
+ * @param {string} eventId
+ * @template T
+ * @constructor
+ * @struct
+ * @final
+ */
+goog.events.EventId = function(eventId) {
+ /** @const */ this.id = eventId;
+};
+
+
+/**
+ * @override
+ */
+goog.events.EventId.prototype.toString = function() {
+ return this.id;
+};
diff --git a/src/http/static/viz/1/goog/events/events.js b/src/http/static/viz/1/goog/events/events.js
new file mode 100644
index 0000000..6a0acf7
--- /dev/null
+++ b/src/http/static/viz/1/goog/events/events.js
@@ -0,0 +1,989 @@
+// Copyright 2005 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview An event manager for both native browser event
+ * targets and custom JavaScript event targets
+ * ({@code goog.events.Listenable}). This provides an abstraction
+ * over browsers' event systems.
+ *
+ * It also provides a simulation of W3C event model's capture phase in
+ * Internet Explorer (IE 8 and below). Caveat: the simulation does not
+ * interact well with listeners registered directly on the elements
+ * (bypassing goog.events) or even with listeners registered via
+ * goog.events in a separate JS binary. In these cases, we provide
+ * no ordering guarantees.
+ *
+ * The listeners will receive a "patched" event object. Such event object
+ * contains normalized values for certain event properties that differs in
+ * different browsers.
+ *
+ * Example usage:
+ * <pre>
+ * goog.events.listen(myNode, 'click', function(e) { alert('woo') });
+ * goog.events.listen(myNode, 'mouseover', mouseHandler, true);
+ * goog.events.unlisten(myNode, 'mouseover', mouseHandler, true);
+ * goog.events.removeAll(myNode);
+ * </pre>
+ *
+ * in IE and event object patching]
+ * @author arv@google.com (Erik Arvidsson)
+ *
+ * @see ../demos/events.html
+ * @see ../demos/event-propagation.html
+ * @see ../demos/stopevent.html
+ */
+
+// IMPLEMENTATION NOTES:
+// goog.events stores an auxiliary data structure on each EventTarget
+// source being listened on. This allows us to take advantage of GC,
+// having the data structure GC'd when the EventTarget is GC'd. This
+// GC behavior is equivalent to using W3C DOM Events directly.
+
+goog.provide('goog.events');
+goog.provide('goog.events.CaptureSimulationMode');
+goog.provide('goog.events.Key');
+goog.provide('goog.events.ListenableType');
+
+goog.require('goog.asserts');
+goog.require('goog.debug.entryPointRegistry');
+goog.require('goog.events.BrowserEvent');
+goog.require('goog.events.BrowserFeature');
+goog.require('goog.events.Listenable');
+goog.require('goog.events.ListenerMap');
+
+goog.forwardDeclare('goog.debug.ErrorHandler');
+goog.forwardDeclare('goog.events.EventWrapper');
+
+
+/**
+ * @typedef {number|goog.events.ListenableKey}
+ */
+goog.events.Key;
+
+
+/**
+ * @typedef {EventTarget|goog.events.Listenable}
+ */
+goog.events.ListenableType;
+
+
+/**
+ * Property name on a native event target for the listener map
+ * associated with the event target.
+ * @private @const {string}
+ */
+goog.events.LISTENER_MAP_PROP_ = 'closure_lm_' + ((Math.random() * 1e6) | 0);
+
+
+/**
+ * String used to prepend to IE event types.
+ * @const
+ * @private
+ */
+goog.events.onString_ = 'on';
+
+
+/**
+ * Map of computed "on<eventname>" strings for IE event types. Caching
+ * this removes an extra object allocation in goog.events.listen which
+ * improves IE6 performance.
+ * @const
+ * @dict
+ * @private
+ */
+goog.events.onStringMap_ = {};
+
+
+/**
+ * @enum {number} Different capture simulation mode for IE8-.
+ */
+goog.events.CaptureSimulationMode = {
+ /**
+ * Does not perform capture simulation. Will asserts in IE8- when you
+ * add capture listeners.
+ */
+ OFF_AND_FAIL: 0,
+
+ /**
+ * Does not perform capture simulation, silently ignore capture
+ * listeners.
+ */
+ OFF_AND_SILENT: 1,
+
+ /**
+ * Performs capture simulation.
+ */
+ ON: 2
+};
+
+
+/**
+ * @define {number} The capture simulation mode for IE8-. By default,
+ * this is ON.
+ */
+goog.define('goog.events.CAPTURE_SIMULATION_MODE', 2);
+
+
+/**
+ * Estimated count of total native listeners.
+ * @private {number}
+ */
+goog.events.listenerCountEstimate_ = 0;
+
+
+/**
+ * Adds an event listener for a specific event on a native event
+ * target (such as a DOM element) or an object that has implemented
+ * {@link goog.events.Listenable}. A listener can only be added once
+ * to an object and if it is added again the key for the listener is
+ * returned. Note that if the existing listener is a one-off listener
+ * (registered via listenOnce), it will no longer be a one-off
+ * listener after a call to listen().
+ *
+ * @param {EventTarget|goog.events.Listenable} src The node to listen
+ * to events on.
+ * @param {string|Array<string>|
+ * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}
+ * type Event type or array of event types.
+ * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null}
+ * listener Callback method, or an object with a handleEvent function.
+ * WARNING: passing an Object is now softly deprecated.
+ * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to
+ * false).
+ * @param {T=} opt_handler Element in whose scope to call the listener.
+ * @return {goog.events.Key} Unique key for the listener.
+ * @template T,EVENTOBJ
+ */
+goog.events.listen = function(src, type, listener, opt_capt, opt_handler) {
+ if (goog.isArray(type)) {
+ for (var i = 0; i < type.length; i++) {
+ goog.events.listen(src, type[i], listener, opt_capt, opt_handler);
+ }
+ return null;
+ }
+
+ listener = goog.events.wrapListener(listener);
+ if (goog.events.Listenable.isImplementedBy(src)) {
+ return src.listen(
+ /** @type {string|!goog.events.EventId} */ (type), listener, opt_capt,
+ opt_handler);
+ } else {
+ return goog.events.listen_(
+ /** @type {!EventTarget} */ (src),
+ /** @type {string|!goog.events.EventId} */ (type), listener,
+ /* callOnce */ false, opt_capt, opt_handler);
+ }
+};
+
+
+/**
+ * Adds an event listener for a specific event on a native event
+ * target. A listener can only be added once to an object and if it
+ * is added again the key for the listener is returned.
+ *
+ * Note that a one-off listener will not change an existing listener,
+ * if any. On the other hand a normal listener will change existing
+ * one-off listener to become a normal listener.
+ *
+ * @param {EventTarget} src The node to listen to events on.
+ * @param {string|!goog.events.EventId} type Event type.
+ * @param {!Function} listener Callback function.
+ * @param {boolean} callOnce Whether the listener is a one-off
+ * listener or otherwise.
+ * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to
+ * false).
+ * @param {Object=} opt_handler Element in whose scope to call the listener.
+ * @return {goog.events.ListenableKey} Unique key for the listener.
+ * @private
+ */
+goog.events.listen_ = function(
+ src, type, listener, callOnce, opt_capt, opt_handler) {
+ if (!type) {
+ throw Error('Invalid event type');
+ }
+
+ var capture = !!opt_capt;
+ if (capture && !goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {
+ if (goog.events.CAPTURE_SIMULATION_MODE ==
+ goog.events.CaptureSimulationMode.OFF_AND_FAIL) {
+ goog.asserts.fail('Can not register capture listener in IE8-.');
+ return null;
+ } else if (
+ goog.events.CAPTURE_SIMULATION_MODE ==
+ goog.events.CaptureSimulationMode.OFF_AND_SILENT) {
+ return null;
+ }
+ }
+
+ var listenerMap = goog.events.getListenerMap_(src);
+ if (!listenerMap) {
+ src[goog.events.LISTENER_MAP_PROP_] = listenerMap =
+ new goog.events.ListenerMap(src);
+ }
+
+ var listenerObj =
+ listenerMap.add(type, listener, callOnce, opt_capt, opt_handler);
+
+ // If the listenerObj already has a proxy, it has been set up
+ // previously. We simply return.
+ if (listenerObj.proxy) {
+ return listenerObj;
+ }
+
+ var proxy = goog.events.getProxy();
+ listenerObj.proxy = proxy;
+
+ proxy.src = src;
+ proxy.listener = listenerObj;
+
+ // Attach the proxy through the browser's API
+ if (src.addEventListener) {
+ src.addEventListener(type.toString(), proxy, capture);
+ } else if (src.attachEvent) {
+ // The else if above used to be an unconditional else. It would call
+ // exception on IE11, spoiling the day of some callers. The previous
+ // incarnation of this code, from 2007, indicates that it replaced an
+ // earlier still version that caused excess allocations on IE6.
+ src.attachEvent(goog.events.getOnString_(type.toString()), proxy);
+ } else {
+ throw Error('addEventListener and attachEvent are unavailable.');
+ }
+
+ goog.events.listenerCountEstimate_++;
+ return listenerObj;
+};
+
+
+/**
+ * Helper function for returning a proxy function.
+ * @return {!Function} A new or reused function object.
+ */
+goog.events.getProxy = function() {
+ var proxyCallbackFunction = goog.events.handleBrowserEvent_;
+ // Use a local var f to prevent one allocation.
+ var f =
+ goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT ? function(eventObject) {
+ return proxyCallbackFunction.call(f.src, f.listener, eventObject);
+ } : function(eventObject) {
+ var v = proxyCallbackFunction.call(f.src, f.listener, eventObject);
+ // NOTE(chrishenry): In IE, we hack in a capture phase. However, if
+ // there is inline event handler which tries to prevent default (for
+ // example <a href="..." onclick="return false">...</a>) in a
+ // descendant element, the prevent default will be overridden
+ // by this listener if this listener were to return true. Hence, we
+ // return undefined.
+ if (!v) return v;
+ };
+ return f;
+};
+
+
+/**
+ * Adds an event listener for a specific event on a native event
+ * target (such as a DOM element) or an object that has implemented
+ * {@link goog.events.Listenable}. After the event has fired the event
+ * listener is removed from the target.
+ *
+ * If an existing listener already exists, listenOnce will do
+ * nothing. In particular, if the listener was previously registered
+ * via listen(), listenOnce() will not turn the listener into a
+ * one-off listener. Similarly, if there is already an existing
+ * one-off listener, listenOnce does not modify the listeners (it is
+ * still a once listener).
+ *
+ * @param {EventTarget|goog.events.Listenable} src The node to listen
+ * to events on.
+ * @param {string|Array<string>|
+ * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}
+ * type Event type or array of event types.
+ * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null}
+ * listener Callback method.
+ * @param {boolean=} opt_capt Fire in capture phase?.
+ * @param {T=} opt_handler Element in whose scope to call the listener.
+ * @return {goog.events.Key} Unique key for the listener.
+ * @template T,EVENTOBJ
+ */
+goog.events.listenOnce = function(src, type, listener, opt_capt, opt_handler) {
+ if (goog.isArray(type)) {
+ for (var i = 0; i < type.length; i++) {
+ goog.events.listenOnce(src, type[i], listener, opt_capt, opt_handler);
+ }
+ return null;
+ }
+
+ listener = goog.events.wrapListener(listener);
+ if (goog.events.Listenable.isImplementedBy(src)) {
+ return src.listenOnce(
+ /** @type {string|!goog.events.EventId} */ (type), listener, opt_capt,
+ opt_handler);
+ } else {
+ return goog.events.listen_(
+ /** @type {!EventTarget} */ (src),
+ /** @type {string|!goog.events.EventId} */ (type), listener,
+ /* callOnce */ true, opt_capt, opt_handler);
+ }
+};
+
+
+/**
+ * Adds an event listener with a specific event wrapper on a DOM Node or an
+ * object that has implemented {@link goog.events.Listenable}. A listener can
+ * only be added once to an object.
+ *
+ * @param {EventTarget|goog.events.Listenable} src The target to
+ * listen to events on.
+ * @param {goog.events.EventWrapper} wrapper Event wrapper to use.
+ * @param {function(this:T, ?):?|{handleEvent:function(?):?}|null} listener
+ * Callback method, or an object with a handleEvent function.
+ * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to
+ * false).
+ * @param {T=} opt_handler Element in whose scope to call the listener.
+ * @template T
+ */
+goog.events.listenWithWrapper = function(
+ src, wrapper, listener, opt_capt, opt_handler) {
+ wrapper.listen(src, listener, opt_capt, opt_handler);
+};
+
+
+/**
+ * Removes an event listener which was added with listen().
+ *
+ * @param {EventTarget|goog.events.Listenable} src The target to stop
+ * listening to events on.
+ * @param {string|Array<string>|
+ * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}
+ * type Event type or array of event types to unlisten to.
+ * @param {function(?):?|{handleEvent:function(?):?}|null} listener The
+ * listener function to remove.
+ * @param {boolean=} opt_capt In DOM-compliant browsers, this determines
+ * whether the listener is fired during the capture or bubble phase of the
+ * event.
+ * @param {Object=} opt_handler Element in whose scope to call the listener.
+ * @return {?boolean} indicating whether the listener was there to remove.
+ * @template EVENTOBJ
+ */
+goog.events.unlisten = function(src, type, listener, opt_capt, opt_handler) {
+ if (goog.isArray(type)) {
+ for (var i = 0; i < type.length; i++) {
+ goog.events.unlisten(src, type[i], listener, opt_capt, opt_handler);
+ }
+ return null;
+ }
+
+ listener = goog.events.wrapListener(listener);
+ if (goog.events.Listenable.isImplementedBy(src)) {
+ return src.unlisten(
+ /** @type {string|!goog.events.EventId} */ (type), listener, opt_capt,
+ opt_handler);
+ }
+
+ if (!src) {
+ // TODO(chrishenry): We should tighten the API to only accept
+ // non-null objects, or add an assertion here.
+ return false;
+ }
+
+ var capture = !!opt_capt;
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (src));
+ if (listenerMap) {
+ var listenerObj = listenerMap.getListener(
+ /** @type {string|!goog.events.EventId} */ (type), listener, capture,
+ opt_handler);
+ if (listenerObj) {
+ return goog.events.unlistenByKey(listenerObj);
+ }
+ }
+
+ return false;
+};
+
+
+/**
+ * Removes an event listener which was added with listen() by the key
+ * returned by listen().
+ *
+ * @param {goog.events.Key} key The key returned by listen() for this
+ * event listener.
+ * @return {boolean} indicating whether the listener was there to remove.
+ */
+goog.events.unlistenByKey = function(key) {
+ // TODO(chrishenry): Remove this check when tests that rely on this
+ // are fixed.
+ if (goog.isNumber(key)) {
+ return false;
+ }
+
+ var listener = key;
+ if (!listener || listener.removed) {
+ return false;
+ }
+
+ var src = listener.src;
+ if (goog.events.Listenable.isImplementedBy(src)) {
+ return /** @type {!goog.events.Listenable} */ (src).unlistenByKey(listener);
+ }
+
+ var type = listener.type;
+ var proxy = listener.proxy;
+ if (src.removeEventListener) {
+ src.removeEventListener(type, proxy, listener.capture);
+ } else if (src.detachEvent) {
+ src.detachEvent(goog.events.getOnString_(type), proxy);
+ }
+ goog.events.listenerCountEstimate_--;
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (src));
+ // TODO(chrishenry): Try to remove this conditional and execute the
+ // first branch always. This should be safe.
+ if (listenerMap) {
+ listenerMap.removeByKey(listener);
+ if (listenerMap.getTypeCount() == 0) {
+ // Null the src, just because this is simple to do (and useful
+ // for IE <= 7).
+ listenerMap.src = null;
+ // We don't use delete here because IE does not allow delete
+ // on a window object.
+ src[goog.events.LISTENER_MAP_PROP_] = null;
+ }
+ } else {
+ listener.markAsRemoved();
+ }
+
+ return true;
+};
+
+
+/**
+ * Removes an event listener which was added with listenWithWrapper().
+ *
+ * @param {EventTarget|goog.events.Listenable} src The target to stop
+ * listening to events on.
+ * @param {goog.events.EventWrapper} wrapper Event wrapper to use.
+ * @param {function(?):?|{handleEvent:function(?):?}|null} listener The
+ * listener function to remove.
+ * @param {boolean=} opt_capt In DOM-compliant browsers, this determines
+ * whether the listener is fired during the capture or bubble phase of the
+ * event.
+ * @param {Object=} opt_handler Element in whose scope to call the listener.
+ */
+goog.events.unlistenWithWrapper = function(
+ src, wrapper, listener, opt_capt, opt_handler) {
+ wrapper.unlisten(src, listener, opt_capt, opt_handler);
+};
+
+
+/**
+ * Removes all listeners from an object. You can also optionally
+ * remove listeners of a particular type.
+ *
+ * @param {Object|undefined} obj Object to remove listeners from. Must be an
+ * EventTarget or a goog.events.Listenable.
+ * @param {string|!goog.events.EventId=} opt_type Type of event to remove.
+ * Default is all types.
+ * @return {number} Number of listeners removed.
+ */
+goog.events.removeAll = function(obj, opt_type) {
+ // TODO(chrishenry): Change the type of obj to
+ // (!EventTarget|!goog.events.Listenable).
+
+ if (!obj) {
+ return 0;
+ }
+
+ if (goog.events.Listenable.isImplementedBy(obj)) {
+ return /** @type {?} */ (obj).removeAllListeners(opt_type);
+ }
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (obj));
+ if (!listenerMap) {
+ return 0;
+ }
+
+ var count = 0;
+ var typeStr = opt_type && opt_type.toString();
+ for (var type in listenerMap.listeners) {
+ if (!typeStr || type == typeStr) {
+ // Clone so that we don't need to worry about unlistenByKey
+ // changing the content of the ListenerMap.
+ var listeners = listenerMap.listeners[type].concat();
+ for (var i = 0; i < listeners.length; ++i) {
+ if (goog.events.unlistenByKey(listeners[i])) {
+ ++count;
+ }
+ }
+ }
+ }
+ return count;
+};
+
+
+/**
+ * Gets the listeners for a given object, type and capture phase.
+ *
+ * @param {Object} obj Object to get listeners for.
+ * @param {string|!goog.events.EventId} type Event type.
+ * @param {boolean} capture Capture phase?.
+ * @return {Array<!goog.events.Listener>} Array of listener objects.
+ */
+goog.events.getListeners = function(obj, type, capture) {
+ if (goog.events.Listenable.isImplementedBy(obj)) {
+ return /** @type {!goog.events.Listenable} */ (obj).getListeners(
+ type, capture);
+ } else {
+ if (!obj) {
+ // TODO(chrishenry): We should tighten the API to accept
+ // !EventTarget|goog.events.Listenable, and add an assertion here.
+ return [];
+ }
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (obj));
+ return listenerMap ? listenerMap.getListeners(type, capture) : [];
+ }
+};
+
+
+/**
+ * Gets the goog.events.Listener for the event or null if no such listener is
+ * in use.
+ *
+ * @param {EventTarget|goog.events.Listenable} src The target from
+ * which to get listeners.
+ * @param {?string|!goog.events.EventId<EVENTOBJ>} type The type of the event.
+ * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null} listener The
+ * listener function to get.
+ * @param {boolean=} opt_capt In DOM-compliant browsers, this determines
+ * whether the listener is fired during the
+ * capture or bubble phase of the event.
+ * @param {Object=} opt_handler Element in whose scope to call the listener.
+ * @return {goog.events.ListenableKey} the found listener or null if not found.
+ * @template EVENTOBJ
+ */
+goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) {
+ // TODO(chrishenry): Change type from ?string to string, or add assertion.
+ type = /** @type {string} */ (type);
+ listener = goog.events.wrapListener(listener);
+ var capture = !!opt_capt;
+ if (goog.events.Listenable.isImplementedBy(src)) {
+ return src.getListener(type, listener, capture, opt_handler);
+ }
+
+ if (!src) {
+ // TODO(chrishenry): We should tighten the API to only accept
+ // non-null objects, or add an assertion here.
+ return null;
+ }
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (src));
+ if (listenerMap) {
+ return listenerMap.getListener(type, listener, capture, opt_handler);
+ }
+ return null;
+};
+
+
+/**
+ * Returns whether an event target has any active listeners matching the
+ * specified signature. If either the type or capture parameters are
+ * unspecified, the function will match on the remaining criteria.
+ *
+ * @param {EventTarget|goog.events.Listenable} obj Target to get
+ * listeners for.
+ * @param {string|!goog.events.EventId=} opt_type Event type.
+ * @param {boolean=} opt_capture Whether to check for capture or bubble-phase
+ * listeners.
+ * @return {boolean} Whether an event target has one or more listeners matching
+ * the requested type and/or capture phase.
+ */
+goog.events.hasListener = function(obj, opt_type, opt_capture) {
+ if (goog.events.Listenable.isImplementedBy(obj)) {
+ return obj.hasListener(opt_type, opt_capture);
+ }
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (obj));
+ return !!listenerMap && listenerMap.hasListener(opt_type, opt_capture);
+};
+
+
+/**
+ * Provides a nice string showing the normalized event objects public members
+ * @param {Object} e Event Object.
+ * @return {string} String of the public members of the normalized event object.
+ */
+goog.events.expose = function(e) {
+ var str = [];
+ for (var key in e) {
+ if (e[key] && e[key].id) {
+ str.push(key + ' = ' + e[key] + ' (' + e[key].id + ')');
+ } else {
+ str.push(key + ' = ' + e[key]);
+ }
+ }
+ return str.join('\n');
+};
+
+
+/**
+ * Returns a string with on prepended to the specified type. This is used for IE
+ * which expects "on" to be prepended. This function caches the string in order
+ * to avoid extra allocations in steady state.
+ * @param {string} type Event type.
+ * @return {string} The type string with 'on' prepended.
+ * @private
+ */
+goog.events.getOnString_ = function(type) {
+ if (type in goog.events.onStringMap_) {
+ return goog.events.onStringMap_[type];
+ }
+ return goog.events.onStringMap_[type] = goog.events.onString_ + type;
+};
+
+
+/**
+ * Fires an object's listeners of a particular type and phase
+ *
+ * @param {Object} obj Object whose listeners to call.
+ * @param {string|!goog.events.EventId} type Event type.
+ * @param {boolean} capture Which event phase.
+ * @param {Object} eventObject Event object to be passed to listener.
+ * @return {boolean} True if all listeners returned true else false.
+ */
+goog.events.fireListeners = function(obj, type, capture, eventObject) {
+ if (goog.events.Listenable.isImplementedBy(obj)) {
+ return /** @type {!goog.events.Listenable} */ (obj).fireListeners(
+ type, capture, eventObject);
+ }
+
+ return goog.events.fireListeners_(obj, type, capture, eventObject);
+};
+
+
+/**
+ * Fires an object's listeners of a particular type and phase.
+ * @param {Object} obj Object whose listeners to call.
+ * @param {string|!goog.events.EventId} type Event type.
+ * @param {boolean} capture Which event phase.
+ * @param {Object} eventObject Event object to be passed to listener.
+ * @return {boolean} True if all listeners returned true else false.
+ * @private
+ */
+goog.events.fireListeners_ = function(obj, type, capture, eventObject) {
+ /** @type {boolean} */
+ var retval = true;
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {EventTarget} */ (obj));
+ if (listenerMap) {
+ // TODO(chrishenry): Original code avoids array creation when there
+ // is no listener, so we do the same. If this optimization turns
+ // out to be not required, we can replace this with
+ // listenerMap.getListeners(type, capture) instead, which is simpler.
+ var listenerArray = listenerMap.listeners[type.toString()];
+ if (listenerArray) {
+ listenerArray = listenerArray.concat();
+ for (var i = 0; i < listenerArray.length; i++) {
+ var listener = listenerArray[i];
+ // We might not have a listener if the listener was removed.
+ if (listener && listener.capture == capture && !listener.removed) {
+ var result = goog.events.fireListener(listener, eventObject);
+ retval = retval && (result !== false);
+ }
+ }
+ }
+ }
+ return retval;
+};
+
+
+/**
+ * Fires a listener with a set of arguments
+ *
+ * @param {goog.events.Listener} listener The listener object to call.
+ * @param {Object} eventObject The event object to pass to the listener.
+ * @return {boolean} Result of listener.
+ */
+goog.events.fireListener = function(listener, eventObject) {
+ var listenerFn = listener.listener;
+ var listenerHandler = listener.handler || listener.src;
+
+ if (listener.callOnce) {
+ goog.events.unlistenByKey(listener);
+ }
+ return listenerFn.call(listenerHandler, eventObject);
+};
+
+
+/**
+ * Gets the total number of listeners currently in the system.
+ * @return {number} Number of listeners.
+ * @deprecated This returns estimated count, now that Closure no longer
+ * stores a central listener registry. We still return an estimation
+ * to keep existing listener-related tests passing. In the near future,
+ * this function will be removed.
+ */
+goog.events.getTotalListenerCount = function() {
+ return goog.events.listenerCountEstimate_;
+};
+
+
+/**
+ * Dispatches an event (or event like object) and calls all listeners
+ * listening for events of this type. The type of the event is decided by the
+ * type property on the event object.
+ *
+ * If any of the listeners returns false OR calls preventDefault then this
+ * function will return false. If one of the capture listeners calls
+ * stopPropagation, then the bubble listeners won't fire.
+ *
+ * @param {goog.events.Listenable} src The event target.
+ * @param {goog.events.EventLike} e Event object.
+ * @return {boolean} If anyone called preventDefault on the event object (or
+ * if any of the handlers returns false) this will also return false.
+ * If there are no handlers, or if all handlers return true, this returns
+ * true.
+ */
+goog.events.dispatchEvent = function(src, e) {
+ goog.asserts.assert(
+ goog.events.Listenable.isImplementedBy(src),
+ 'Can not use goog.events.dispatchEvent with ' +
+ 'non-goog.events.Listenable instance.');
+ return src.dispatchEvent(e);
+};
+
+
+/**
+ * Installs exception protection for the browser event entry point using the
+ * given error handler.
+ *
+ * @param {goog.debug.ErrorHandler} errorHandler Error handler with which to
+ * protect the entry point.
+ */
+goog.events.protectBrowserEventEntryPoint = function(errorHandler) {
+ goog.events.handleBrowserEvent_ =
+ errorHandler.protectEntryPoint(goog.events.handleBrowserEvent_);
+};
+
+
+/**
+ * Handles an event and dispatches it to the correct listeners. This
+ * function is a proxy for the real listener the user specified.
+ *
+ * @param {goog.events.Listener} listener The listener object.
+ * @param {Event=} opt_evt Optional event object that gets passed in via the
+ * native event handlers.
+ * @return {boolean} Result of the event handler.
+ * @this {EventTarget} The object or Element that fired the event.
+ * @private
+ */
+goog.events.handleBrowserEvent_ = function(listener, opt_evt) {
+ if (listener.removed) {
+ return true;
+ }
+
+ // Synthesize event propagation if the browser does not support W3C
+ // event model.
+ if (!goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {
+ var ieEvent = opt_evt ||
+ /** @type {Event} */ (goog.getObjectByName('window.event'));
+ var evt = new goog.events.BrowserEvent(ieEvent, this);
+ /** @type {boolean} */
+ var retval = true;
+
+ if (goog.events.CAPTURE_SIMULATION_MODE ==
+ goog.events.CaptureSimulationMode.ON) {
+ // If we have not marked this event yet, we should perform capture
+ // simulation.
+ if (!goog.events.isMarkedIeEvent_(ieEvent)) {
+ goog.events.markIeEvent_(ieEvent);
+
+ var ancestors = [];
+ for (var parent = evt.currentTarget; parent;
+ parent = parent.parentNode) {
+ ancestors.push(parent);
+ }
+
+ // Fire capture listeners.
+ var type = listener.type;
+ for (var i = ancestors.length - 1; !evt.propagationStopped_ && i >= 0;
+ i--) {
+ evt.currentTarget = ancestors[i];
+ var result =
+ goog.events.fireListeners_(ancestors[i], type, true, evt);
+ retval = retval && result;
+ }
+
+ // Fire bubble listeners.
+ //
+ // We can technically rely on IE to perform bubble event
+ // propagation. However, it turns out that IE fires events in
+ // opposite order of attachEvent registration, which broke
+ // some code and tests that rely on the order. (While W3C DOM
+ // Level 2 Events TR leaves the event ordering unspecified,
+ // modern browsers and W3C DOM Level 3 Events Working Draft
+ // actually specify the order as the registration order.)
+ for (var i = 0; !evt.propagationStopped_ && i < ancestors.length; i++) {
+ evt.currentTarget = ancestors[i];
+ var result =
+ goog.events.fireListeners_(ancestors[i], type, false, evt);
+ retval = retval && result;
+ }
+ }
+ } else {
+ retval = goog.events.fireListener(listener, evt);
+ }
+ return retval;
+ }
+
+ // Otherwise, simply fire the listener.
+ return goog.events.fireListener(
+ listener, new goog.events.BrowserEvent(opt_evt, this));
+};
+
+
+/**
+ * This is used to mark the IE event object so we do not do the Closure pass
+ * twice for a bubbling event.
+ * @param {Event} e The IE browser event.
+ * @private
+ */
+goog.events.markIeEvent_ = function(e) {
+ // Only the keyCode and the returnValue can be changed. We use keyCode for
+ // non keyboard events.
+ // event.returnValue is a bit more tricky. It is undefined by default. A
+ // boolean false prevents the default action. In a window.onbeforeunload and
+ // the returnValue is non undefined it will be alerted. However, we will only
+ // modify the returnValue for keyboard events. We can get a problem if non
+ // closure events sets the keyCode or the returnValue
+
+ var useReturnValue = false;
+
+ if (e.keyCode == 0) {
+ // We cannot change the keyCode in case that srcElement is input[type=file].
+ // We could test that that is the case but that would allocate 3 objects.
+ // If we use try/catch we will only allocate extra objects in the case of a
+ // failure.
+ /** @preserveTry */
+ try {
+ e.keyCode = -1;
+ return;
+ } catch (ex) {
+ useReturnValue = true;
+ }
+ }
+
+ if (useReturnValue ||
+ /** @type {boolean|undefined} */ (e.returnValue) == undefined) {
+ e.returnValue = true;
+ }
+};
+
+
+/**
+ * This is used to check if an IE event has already been handled by the Closure
+ * system so we do not do the Closure pass twice for a bubbling event.
+ * @param {Event} e The IE browser event.
+ * @return {boolean} True if the event object has been marked.
+ * @private
+ */
+goog.events.isMarkedIeEvent_ = function(e) {
+ return e.keyCode < 0 || e.returnValue != undefined;
+};
+
+
+/**
+ * Counter to create unique event ids.
+ * @private {number}
+ */
+goog.events.uniqueIdCounter_ = 0;
+
+
+/**
+ * Creates a unique event id.
+ *
+ * @param {string} identifier The identifier.
+ * @return {string} A unique identifier.
+ * @idGenerator {unique}
+ */
+goog.events.getUniqueId = function(identifier) {
+ return identifier + '_' + goog.events.uniqueIdCounter_++;
+};
+
+
+/**
+ * @param {EventTarget} src The source object.
+ * @return {goog.events.ListenerMap} A listener map for the given
+ * source object, or null if none exists.
+ * @private
+ */
+goog.events.getListenerMap_ = function(src) {
+ var listenerMap = src[goog.events.LISTENER_MAP_PROP_];
+ // IE serializes the property as well (e.g. when serializing outer
+ // HTML). So we must check that the value is of the correct type.
+ return listenerMap instanceof goog.events.ListenerMap ? listenerMap : null;
+};
+
+
+/**
+ * Expando property for listener function wrapper for Object with
+ * handleEvent.
+ * @private @const {string}
+ */
+goog.events.LISTENER_WRAPPER_PROP_ =
+ '__closure_events_fn_' + ((Math.random() * 1e9) >>> 0);
+
+
+/**
+ * @param {Object|Function} listener The listener function or an
+ * object that contains handleEvent method.
+ * @return {!Function} Either the original function or a function that
+ * calls obj.handleEvent. If the same listener is passed to this
+ * function more than once, the same function is guaranteed to be
+ * returned.
+ */
+goog.events.wrapListener = function(listener) {
+ goog.asserts.assert(listener, 'Listener can not be null.');
+
+ if (goog.isFunction(listener)) {
+ return listener;
+ }
+
+ goog.asserts.assert(
+ listener.handleEvent, 'An object listener must have handleEvent method.');
+ if (!listener[goog.events.LISTENER_WRAPPER_PROP_]) {
+ listener[goog.events.LISTENER_WRAPPER_PROP_] = function(e) {
+ return /** @type {?} */ (listener).handleEvent(e);
+ };
+ }
+ return listener[goog.events.LISTENER_WRAPPER_PROP_];
+};
+
+
+// Register the browser event handler as an entry point, so that
+// it can be monitored for exception handling, etc.
+goog.debug.entryPointRegistry.register(
+ /**
+ * @param {function(!Function): !Function} transformer The transforming
+ * function.
+ */
+ function(transformer) {
+ goog.events.handleBrowserEvent_ =
+ transformer(goog.events.handleBrowserEvent_);
+ });
diff --git a/src/http/static/viz/1/goog/events/eventtype.js b/src/http/static/viz/1/goog/events/eventtype.js
new file mode 100644
index 0000000..161e88a
--- /dev/null
+++ b/src/http/static/viz/1/goog/events/eventtype.js
@@ -0,0 +1,239 @@
+// Copyright 2010 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Event Types.
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+goog.provide('goog.events.EventType');
+
+goog.require('goog.userAgent');
+
+
+/**
+ * Returns a prefixed event name for the current browser.
+ * @param {string} eventName The name of the event.
+ * @return {string} The prefixed event name.
+ * @suppress {missingRequire|missingProvide}
+ * @private
+ */
+goog.events.getVendorPrefixedName_ = function(eventName) {
+ return goog.userAgent.WEBKIT ?
+ 'webkit' + eventName :
+ (goog.userAgent.OPERA ? 'o' + eventName.toLowerCase() :
+ eventName.toLowerCase());
+};
+
+
+/**
+ * Constants for event names.
+ * @enum {string}
+ */
+goog.events.EventType = {
+ // Mouse events
+ CLICK: 'click',
+ RIGHTCLICK: 'rightclick',
+ DBLCLICK: 'dblclick',
+ MOUSEDOWN: 'mousedown',
+ MOUSEUP: 'mouseup',
+ MOUSEOVER: 'mouseover',
+ MOUSEOUT: 'mouseout',
+ MOUSEMOVE: 'mousemove',
+ MOUSEENTER: 'mouseenter',
+ MOUSELEAVE: 'mouseleave',
+ // Select start is non-standard.
+ // See http://msdn.microsoft.com/en-us/library/ie/ms536969(v=vs.85).aspx.
+ SELECTSTART: 'selectstart', // IE, Safari, Chrome
+
+ // Wheel events
+ // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
+ WHEEL: 'wheel',
+
+ // Key events
+ KEYPRESS: 'keypress',
+ KEYDOWN: 'keydown',
+ KEYUP: 'keyup',
+
+ // Focus
+ BLUR: 'blur',
+ FOCUS: 'focus',
+ DEACTIVATE: 'deactivate', // IE only
+ // NOTE: The following two events are not stable in cross-browser usage.
+ // WebKit and Opera implement DOMFocusIn/Out.
+ // IE implements focusin/out.
+ // Gecko implements neither see bug at
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=396927.
+ // The DOM Events Level 3 Draft deprecates DOMFocusIn in favor of focusin:
+ // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html
+ // You can use FOCUS in Capture phase until implementations converge.
+ FOCUSIN: goog.userAgent.IE ? 'focusin' : 'DOMFocusIn',
+ FOCUSOUT: goog.userAgent.IE ? 'focusout' : 'DOMFocusOut',
+
+ // Forms
+ CHANGE: 'change',
+ RESET: 'reset',
+ SELECT: 'select',
+ SUBMIT: 'submit',
+ INPUT: 'input',
+ PROPERTYCHANGE: 'propertychange', // IE only
+
+ // Drag and drop
+ DRAGSTART: 'dragstart',
+ DRAG: 'drag',
+ DRAGENTER: 'dragenter',
+ DRAGOVER: 'dragover',
+ DRAGLEAVE: 'dragleave',
+ DROP: 'drop',
+ DRAGEND: 'dragend',
+
+ // Touch events
+ // Note that other touch events exist, but we should follow the W3C list here.
+ // http://www.w3.org/TR/touch-events/#list-of-touchevent-types
+ TOUCHSTART: 'touchstart',
+ TOUCHMOVE: 'touchmove',
+ TOUCHEND: 'touchend',
+ TOUCHCANCEL: 'touchcancel',
+
+ // Misc
+ BEFOREUNLOAD: 'beforeunload',
+ CONSOLEMESSAGE: 'consolemessage',
+ CONTEXTMENU: 'contextmenu',
+ DOMCONTENTLOADED: 'DOMContentLoaded',
+ ERROR: 'error',
+ HELP: 'help',
+ LOAD: 'load',
+ LOSECAPTURE: 'losecapture',
+ ORIENTATIONCHANGE: 'orientationchange',
+ READYSTATECHANGE: 'readystatechange',
+ RESIZE: 'resize',
+ SCROLL: 'scroll',
+ TIMEUPDATE: 'timeupdate',
+ UNLOAD: 'unload',
+
+ // HTML 5 History events
+ // See http://www.w3.org/TR/html5/browsers.html#event-definitions-0
+ HASHCHANGE: 'hashchange',
+ PAGEHIDE: 'pagehide',
+ PAGESHOW: 'pageshow',
+ POPSTATE: 'popstate',
+
+ // Copy and Paste
+ // Support is limited. Make sure it works on your favorite browser
+ // before using.
+ // http://www.quirksmode.org/dom/events/cutcopypaste.html
+ COPY: 'copy',
+ PASTE: 'paste',
+ CUT: 'cut',
+ BEFORECOPY: 'beforecopy',
+ BEFORECUT: 'beforecut',
+ BEFOREPASTE: 'beforepaste',
+
+ // HTML5 online/offline events.
+ // http://www.w3.org/TR/offline-webapps/#related
+ ONLINE: 'online',
+ OFFLINE: 'offline',
+
+ // HTML 5 worker events
+ MESSAGE: 'message',
+ CONNECT: 'connect',
+
+ // CSS animation events.
+ /** @suppress {missingRequire} */
+ ANIMATIONSTART: goog.events.getVendorPrefixedName_('AnimationStart'),
+ /** @suppress {missingRequire} */
+ ANIMATIONEND: goog.events.getVendorPrefixedName_('AnimationEnd'),
+ /** @suppress {missingRequire} */
+ ANIMATIONITERATION: goog.events.getVendorPrefixedName_('AnimationIteration'),
+
+ // CSS transition events. Based on the browser support described at:
+ // https://developer.mozilla.org/en/css/css_transitions#Browser_compatibility
+ /** @suppress {missingRequire} */
+ TRANSITIONEND: goog.events.getVendorPrefixedName_('TransitionEnd'),
+
+ // W3C Pointer Events
+ // http://www.w3.org/TR/pointerevents/
+ POINTERDOWN: 'pointerdown',
+ POINTERUP: 'pointerup',
+ POINTERCANCEL: 'pointercancel',
+ POINTERMOVE: 'pointermove',
+ POINTEROVER: 'pointerover',
+ POINTEROUT: 'pointerout',
+ POINTERENTER: 'pointerenter',
+ POINTERLEAVE: 'pointerleave',
+ GOTPOINTERCAPTURE: 'gotpointercapture',
+ LOSTPOINTERCAPTURE: 'lostpointercapture',
+
+ // IE specific events.
+ // See http://msdn.microsoft.com/en-us/library/ie/hh772103(v=vs.85).aspx
+ // Note: these events will be supplanted in IE11.
+ MSGESTURECHANGE: 'MSGestureChange',
+ MSGESTUREEND: 'MSGestureEnd',
+ MSGESTUREHOLD: 'MSGestureHold',
+ MSGESTURESTART: 'MSGestureStart',
+ MSGESTURETAP: 'MSGestureTap',
+ MSGOTPOINTERCAPTURE: 'MSGotPointerCapture',
+ MSINERTIASTART: 'MSInertiaStart',
+ MSLOSTPOINTERCAPTURE: 'MSLostPointerCapture',
+ MSPOINTERCANCEL: 'MSPointerCancel',
+ MSPOINTERDOWN: 'MSPointerDown',
+ MSPOINTERENTER: 'MSPointerEnter',
+ MSPOINTERHOVER: 'MSPointerHover',
+ MSPOINTERLEAVE: 'MSPointerLeave',
+ MSPOINTERMOVE: 'MSPointerMove',
+ MSPOINTEROUT: 'MSPointerOut',
+ MSPOINTEROVER: 'MSPointerOver',
+ MSPOINTERUP: 'MSPointerUp',
+
+ // Native IMEs/input tools events.
+ TEXT: 'text',
+ TEXTINPUT: 'textInput',
+ COMPOSITIONSTART: 'compositionstart',
+ COMPOSITIONUPDATE: 'compositionupdate',
+ COMPOSITIONEND: 'compositionend',
+
+ // Webview tag events
+ // See http://developer.chrome.com/dev/apps/webview_tag.html
+ EXIT: 'exit',
+ LOADABORT: 'loadabort',
+ LOADCOMMIT: 'loadcommit',
+ LOADREDIRECT: 'loadredirect',
+ LOADSTART: 'loadstart',
+ LOADSTOP: 'loadstop',
+ RESPONSIVE: 'responsive',
+ SIZECHANGED: 'sizechanged',
+ UNRESPONSIVE: 'unresponsive',
+
+ // HTML5 Page Visibility API. See details at
+ // {@code goog.labs.dom.PageVisibilityMonitor}.
+ VISIBILITYCHANGE: 'visibilitychange',
+
+ // LocalStorage event.
+ STORAGE: 'storage',
+
+ // DOM Level 2 mutation events (deprecated).
+ DOMSUBTREEMODIFIED: 'DOMSubtreeModified',
+ DOMNODEINSERTED: 'DOMNodeInserted',
+ DOMNODEREMOVED: 'DOMNodeRemoved',
+ DOMNODEREMOVEDFROMDOCUMENT: 'DOMNodeRemovedFromDocument',
+ DOMNODEINSERTEDINTODOCUMENT: 'DOMNodeInsertedIntoDocument',
+ DOMATTRMODIFIED: 'DOMAttrModified',
+ DOMCHARACTERDATAMODIFIED: 'DOMCharacterDataModified',
+
+ // Print events.
+ BEFOREPRINT: 'beforeprint',
+ AFTERPRINT: 'afterprint'
+};
diff --git a/src/http/static/viz/1/goog/events/listenable.js b/src/http/static/viz/1/goog/events/listenable.js
new file mode 100644
index 0000000..648d9fc
--- /dev/null
+++ b/src/http/static/viz/1/goog/events/listenable.js
@@ -0,0 +1,338 @@
+// Copyright 2012 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview An interface for a listenable JavaScript object.
+ * @author chrishenry@google.com (Chris Henry)
+ */
+
+goog.provide('goog.events.Listenable');
+goog.provide('goog.events.ListenableKey');
+
+/** @suppress {extraRequire} */
+goog.require('goog.events.EventId');
+
+goog.forwardDeclare('goog.events.EventLike');
+goog.forwardDeclare('goog.events.EventTarget');
+
+
+
+/**
+ * A listenable interface. A listenable is an object with the ability
+ * to dispatch/broadcast events to "event listeners" registered via
+ * listen/listenOnce.
+ *
+ * The interface allows for an event propagation mechanism similar
+ * to one offered by native browser event targets, such as
+ * capture/bubble mechanism, stopping propagation, and preventing
+ * default actions. Capture/bubble mechanism depends on the ancestor
+ * tree constructed via {@code #getParentEventTarget}; this tree
+ * must be directed acyclic graph. The meaning of default action(s)
+ * in preventDefault is specific to a particular use case.
+ *
+ * Implementations that do not support capture/bubble or can not have
+ * a parent listenable can simply not implement any ability to set the
+ * parent listenable (and have {@code #getParentEventTarget} return
+ * null).
+ *
+ * Implementation of this class can be used with or independently from
+ * goog.events.
+ *
+ * Implementation must call {@code #addImplementation(implClass)}.
+ *
+ * @interface
+ * @see goog.events
+ * @see http://www.w3.org/TR/DOM-Level-2-Events/events.html
+ */
+goog.events.Listenable = function() {};
+
+
+/**
+ * An expando property to indicate that an object implements
+ * goog.events.Listenable.
+ *
+ * See addImplementation/isImplementedBy.
+ *
+ * @type {string}
+ * @const
+ */
+goog.events.Listenable.IMPLEMENTED_BY_PROP =
+ 'closure_listenable_' + ((Math.random() * 1e6) | 0);
+
+
+/**
+ * Marks a given class (constructor) as an implementation of
+ * Listenable, do that we can query that fact at runtime. The class
+ * must have already implemented the interface.
+ * @param {!Function} cls The class constructor. The corresponding
+ * class must have already implemented the interface.
+ */
+goog.events.Listenable.addImplementation = function(cls) {
+ cls.prototype[goog.events.Listenable.IMPLEMENTED_BY_PROP] = true;
+};
+
+
+/**
+ * @param {Object} obj The object to check.
+ * @return {boolean} Whether a given instance implements Listenable. The
+ * class/superclass of the instance must call addImplementation.
+ */
+goog.events.Listenable.isImplementedBy = function(obj) {
+ return !!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]);
+};
+
+
+/**
+ * Adds an event listener. A listener can only be added once to an
+ * object and if it is added again the key for the listener is
+ * returned. Note that if the existing listener is a one-off listener
+ * (registered via listenOnce), it will no longer be a one-off
+ * listener after a call to listen().
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback
+ * method.
+ * @param {boolean=} opt_useCapture Whether to fire in capture phase
+ * (defaults to false).
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {!goog.events.ListenableKey} Unique key for the listener.
+ * @template SCOPE,EVENTOBJ
+ */
+goog.events.Listenable.prototype.listen;
+
+
+/**
+ * Adds an event listener that is removed automatically after the
+ * listener fired once.
+ *
+ * If an existing listener already exists, listenOnce will do
+ * nothing. In particular, if the listener was previously registered
+ * via listen(), listenOnce() will not turn the listener into a
+ * one-off listener. Similarly, if there is already an existing
+ * one-off listener, listenOnce does not modify the listeners (it is
+ * still a once listener).
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback
+ * method.
+ * @param {boolean=} opt_useCapture Whether to fire in capture phase
+ * (defaults to false).
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {!goog.events.ListenableKey} Unique key for the listener.
+ * @template SCOPE,EVENTOBJ
+ */
+goog.events.Listenable.prototype.listenOnce;
+
+
+/**
+ * Removes an event listener which was added with listen() or listenOnce().
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback
+ * method.
+ * @param {boolean=} opt_useCapture Whether to fire in capture phase
+ * (defaults to false).
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call
+ * the listener.
+ * @return {boolean} Whether any listener was removed.
+ * @template SCOPE,EVENTOBJ
+ */
+goog.events.Listenable.prototype.unlisten;
+
+
+/**
+ * Removes an event listener which was added with listen() by the key
+ * returned by listen().
+ *
+ * @param {!goog.events.ListenableKey} key The key returned by
+ * listen() or listenOnce().
+ * @return {boolean} Whether any listener was removed.
+ */
+goog.events.Listenable.prototype.unlistenByKey;
+
+
+/**
+ * Dispatches an event (or event like object) and calls all listeners
+ * listening for events of this type. The type of the event is decided by the
+ * type property on the event object.
+ *
+ * If any of the listeners returns false OR calls preventDefault then this
+ * function will return false. If one of the capture listeners calls
+ * stopPropagation, then the bubble listeners won't fire.
+ *
+ * @param {goog.events.EventLike} e Event object.
+ * @return {boolean} If anyone called preventDefault on the event object (or
+ * if any of the listeners returns false) this will also return false.
+ */
+goog.events.Listenable.prototype.dispatchEvent;
+
+
+/**
+ * Removes all listeners from this listenable. If type is specified,
+ * it will only remove listeners of the particular type. otherwise all
+ * registered listeners will be removed.
+ *
+ * @param {string=} opt_type Type of event to remove, default is to
+ * remove all types.
+ * @return {number} Number of listeners removed.
+ */
+goog.events.Listenable.prototype.removeAllListeners;
+
+
+/**
+ * Returns the parent of this event target to use for capture/bubble
+ * mechanism.
+ *
+ * NOTE(chrishenry): The name reflects the original implementation of
+ * custom event target ({@code goog.events.EventTarget}). We decided
+ * that changing the name is not worth it.
+ *
+ * @return {goog.events.Listenable} The parent EventTarget or null if
+ * there is no parent.
+ */
+goog.events.Listenable.prototype.getParentEventTarget;
+
+
+/**
+ * Fires all registered listeners in this listenable for the given
+ * type and capture mode, passing them the given eventObject. This
+ * does not perform actual capture/bubble. Only implementors of the
+ * interface should be using this.
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>} type The type of the
+ * listeners to fire.
+ * @param {boolean} capture The capture mode of the listeners to fire.
+ * @param {EVENTOBJ} eventObject The event object to fire.
+ * @return {boolean} Whether all listeners succeeded without
+ * attempting to prevent default behavior. If any listener returns
+ * false or called goog.events.Event#preventDefault, this returns
+ * false.
+ * @template EVENTOBJ
+ */
+goog.events.Listenable.prototype.fireListeners;
+
+
+/**
+ * Gets all listeners in this listenable for the given type and
+ * capture mode.
+ *
+ * @param {string|!goog.events.EventId} type The type of the listeners to fire.
+ * @param {boolean} capture The capture mode of the listeners to fire.
+ * @return {!Array<!goog.events.ListenableKey>} An array of registered
+ * listeners.
+ * @template EVENTOBJ
+ */
+goog.events.Listenable.prototype.getListeners;
+
+
+/**
+ * Gets the goog.events.ListenableKey for the event or null if no such
+ * listener is in use.
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>} type The name of the event
+ * without the 'on' prefix.
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener The
+ * listener function to get.
+ * @param {boolean} capture Whether the listener is a capturing listener.
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {goog.events.ListenableKey} the found listener or null if not found.
+ * @template SCOPE,EVENTOBJ
+ */
+goog.events.Listenable.prototype.getListener;
+
+
+/**
+ * Whether there is any active listeners matching the specified
+ * signature. If either the type or capture parameters are
+ * unspecified, the function will match on the remaining criteria.
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>=} opt_type Event type.
+ * @param {boolean=} opt_capture Whether to check for capture or bubble
+ * listeners.
+ * @return {boolean} Whether there is any active listeners matching
+ * the requested type and/or capture phase.
+ * @template EVENTOBJ
+ */
+goog.events.Listenable.prototype.hasListener;
+
+
+
+/**
+ * An interface that describes a single registered listener.
+ * @interface
+ */
+goog.events.ListenableKey = function() {};
+
+
+/**
+ * Counter used to create a unique key
+ * @type {number}
+ * @private
+ */
+goog.events.ListenableKey.counter_ = 0;
+
+
+/**
+ * Reserves a key to be used for ListenableKey#key field.
+ * @return {number} A number to be used to fill ListenableKey#key
+ * field.
+ */
+goog.events.ListenableKey.reserveKey = function() {
+ return ++goog.events.ListenableKey.counter_;
+};
+
+
+/**
+ * The source event target.
+ * @type {Object|goog.events.Listenable|goog.events.EventTarget}
+ */
+goog.events.ListenableKey.prototype.src;
+
+
+/**
+ * The event type the listener is listening to.
+ * @type {string}
+ */
+goog.events.ListenableKey.prototype.type;
+
+
+/**
+ * The listener function.
+ * @type {function(?):?|{handleEvent:function(?):?}|null}
+ */
+goog.events.ListenableKey.prototype.listener;
+
+
+/**
+ * Whether the listener works on capture phase.
+ * @type {boolean}
+ */
+goog.events.ListenableKey.prototype.capture;
+
+
+/**
+ * The 'this' object for the listener function's scope.
+ * @type {Object|undefined}
+ */
+goog.events.ListenableKey.prototype.handler;
+
+
+/**
+ * A globally unique number to identify the key.
+ * @type {number}
+ */
+goog.events.ListenableKey.prototype.key;
diff --git a/src/http/static/viz/1/goog/events/listener.js b/src/http/static/viz/1/goog/events/listener.js
new file mode 100644
index 0000000..60c7370
--- /dev/null
+++ b/src/http/static/viz/1/goog/events/listener.js
@@ -0,0 +1,131 @@
+// Copyright 2005 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Listener object.
+ * @see ../demos/events.html
+ */
+
+goog.provide('goog.events.Listener');
+
+goog.require('goog.events.ListenableKey');
+
+
+
+/**
+ * Simple class that stores information about a listener
+ * @param {!Function} listener Callback function.
+ * @param {Function} proxy Wrapper for the listener that patches the event.
+ * @param {EventTarget|goog.events.Listenable} src Source object for
+ * the event.
+ * @param {string} type Event type.
+ * @param {boolean} capture Whether in capture or bubble phase.
+ * @param {Object=} opt_handler Object in whose context to execute the callback.
+ * @implements {goog.events.ListenableKey}
+ * @constructor
+ */
+goog.events.Listener = function(
+ listener, proxy, src, type, capture, opt_handler) {
+ if (goog.events.Listener.ENABLE_MONITORING) {
+ this.creationStack = new Error().stack;
+ }
+
+ /**
+ * Callback function.
+ * @type {Function}
+ */
+ this.listener = listener;
+
+ /**
+ * A wrapper over the original listener. This is used solely to
+ * handle native browser events (it is used to simulate the capture
+ * phase and to patch the event object).
+ * @type {Function}
+ */
+ this.proxy = proxy;
+
+ /**
+ * Object or node that callback is listening to
+ * @type {EventTarget|goog.events.Listenable}
+ */
+ this.src = src;
+
+ /**
+ * The event type.
+ * @const {string}
+ */
+ this.type = type;
+
+ /**
+ * Whether the listener is being called in the capture or bubble phase
+ * @const {boolean}
+ */
+ this.capture = !!capture;
+
+ /**
+ * Optional object whose context to execute the listener in
+ * @type {Object|undefined}
+ */
+ this.handler = opt_handler;
+
+ /**
+ * The key of the listener.
+ * @const {number}
+ * @override
+ */
+ this.key = goog.events.ListenableKey.reserveKey();
+
+ /**
+ * Whether to remove the listener after it has been called.
+ * @type {boolean}
+ */
+ this.callOnce = false;
+
+ /**
+ * Whether the listener has been removed.
+ * @type {boolean}
+ */
+ this.removed = false;
+};
+
+
+/**
+ * @define {boolean} Whether to enable the monitoring of the
+ * goog.events.Listener instances. Switching on the monitoring is only
+ * recommended for debugging because it has a significant impact on
+ * performance and memory usage. If switched off, the monitoring code
+ * compiles down to 0 bytes.
+ */
+goog.define('goog.events.Listener.ENABLE_MONITORING', false);
+
+
+/**
+ * If monitoring the goog.events.Listener instances is enabled, stores the
+ * creation stack trace of the Disposable instance.
+ * @type {string}
+ */
+goog.events.Listener.prototype.creationStack;
+
+
+/**
+ * Marks this listener as removed. This also remove references held by
+ * this listener object (such as listener and event source).
+ */
+goog.events.Listener.prototype.markAsRemoved = function() {
+ this.removed = true;
+ this.listener = null;
+ this.proxy = null;
+ this.src = null;
+ this.handler = null;
+};
diff --git a/src/http/static/viz/1/goog/events/listenermap.js b/src/http/static/viz/1/goog/events/listenermap.js
new file mode 100644
index 0000000..40cb848
--- /dev/null
+++ b/src/http/static/viz/1/goog/events/listenermap.js
@@ -0,0 +1,306 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A map of listeners that provides utility functions to
+ * deal with listeners on an event target. Used by
+ * {@code goog.events.EventTarget}.
+ *
+ * WARNING: Do not use this class from outside goog.events package.
+ *
+ * @visibility {//closure/goog/bin/sizetests:__pkg__}
+ * @visibility {//closure/goog/events:__pkg__}
+ * @visibility {//closure/goog/labs/events:__pkg__}
+ */
+
+goog.provide('goog.events.ListenerMap');
+
+goog.require('goog.array');
+goog.require('goog.events.Listener');
+goog.require('goog.object');
+
+
+
+/**
+ * Creates a new listener map.
+ * @param {EventTarget|goog.events.Listenable} src The src object.
+ * @constructor
+ * @final
+ */
+goog.events.ListenerMap = function(src) {
+ /** @type {EventTarget|goog.events.Listenable} */
+ this.src = src;
+
+ /**
+ * Maps of event type to an array of listeners.
+ * @type {!Object<string, !Array<!goog.events.Listener>>}
+ */
+ this.listeners = {};
+
+ /**
+ * The count of types in this map that have registered listeners.
+ * @private {number}
+ */
+ this.typeCount_ = 0;
+};
+
+
+/**
+ * @return {number} The count of event types in this map that actually
+ * have registered listeners.
+ */
+goog.events.ListenerMap.prototype.getTypeCount = function() {
+ return this.typeCount_;
+};
+
+
+/**
+ * @return {number} Total number of registered listeners.
+ */
+goog.events.ListenerMap.prototype.getListenerCount = function() {
+ var count = 0;
+ for (var type in this.listeners) {
+ count += this.listeners[type].length;
+ }
+ return count;
+};
+
+
+/**
+ * Adds an event listener. A listener can only be added once to an
+ * object and if it is added again the key for the listener is
+ * returned.
+ *
+ * Note that a one-off listener will not change an existing listener,
+ * if any. On the other hand a normal listener will change existing
+ * one-off listener to become a normal listener.
+ *
+ * @param {string|!goog.events.EventId} type The listener event type.
+ * @param {!Function} listener This listener callback method.
+ * @param {boolean} callOnce Whether the listener is a one-off
+ * listener.
+ * @param {boolean=} opt_useCapture The capture mode of the listener.
+ * @param {Object=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {!goog.events.ListenableKey} Unique key for the listener.
+ */
+goog.events.ListenerMap.prototype.add = function(
+ type, listener, callOnce, opt_useCapture, opt_listenerScope) {
+ var typeStr = type.toString();
+ var listenerArray = this.listeners[typeStr];
+ if (!listenerArray) {
+ listenerArray = this.listeners[typeStr] = [];
+ this.typeCount_++;
+ }
+
+ var listenerObj;
+ var index = goog.events.ListenerMap.findListenerIndex_(
+ listenerArray, listener, opt_useCapture, opt_listenerScope);
+ if (index > -1) {
+ listenerObj = listenerArray[index];
+ if (!callOnce) {
+ // Ensure that, if there is an existing callOnce listener, it is no
+ // longer a callOnce listener.
+ listenerObj.callOnce = false;
+ }
+ } else {
+ listenerObj = new goog.events.Listener(
+ listener, null, this.src, typeStr, !!opt_useCapture, opt_listenerScope);
+ listenerObj.callOnce = callOnce;
+ listenerArray.push(listenerObj);
+ }
+ return listenerObj;
+};
+
+
+/**
+ * Removes a matching listener.
+ * @param {string|!goog.events.EventId} type The listener event type.
+ * @param {!Function} listener This listener callback method.
+ * @param {boolean=} opt_useCapture The capture mode of the listener.
+ * @param {Object=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {boolean} Whether any listener was removed.
+ */
+goog.events.ListenerMap.prototype.remove = function(
+ type, listener, opt_useCapture, opt_listenerScope) {
+ var typeStr = type.toString();
+ if (!(typeStr in this.listeners)) {
+ return false;
+ }
+
+ var listenerArray = this.listeners[typeStr];
+ var index = goog.events.ListenerMap.findListenerIndex_(
+ listenerArray, listener, opt_useCapture, opt_listenerScope);
+ if (index > -1) {
+ var listenerObj = listenerArray[index];
+ listenerObj.markAsRemoved();
+ goog.array.removeAt(listenerArray, index);
+ if (listenerArray.length == 0) {
+ delete this.listeners[typeStr];
+ this.typeCount_--;
+ }
+ return true;
+ }
+ return false;
+};
+
+
+/**
+ * Removes the given listener object.
+ * @param {!goog.events.ListenableKey} listener The listener to remove.
+ * @return {boolean} Whether the listener is removed.
+ */
+goog.events.ListenerMap.prototype.removeByKey = function(listener) {
+ var type = listener.type;
+ if (!(type in this.listeners)) {
+ return false;
+ }
+
+ var removed = goog.array.remove(this.listeners[type], listener);
+ if (removed) {
+ listener.markAsRemoved();
+ if (this.listeners[type].length == 0) {
+ delete this.listeners[type];
+ this.typeCount_--;
+ }
+ }
+ return removed;
+};
+
+
+/**
+ * Removes all listeners from this map. If opt_type is provided, only
+ * listeners that match the given type are removed.
+ * @param {string|!goog.events.EventId=} opt_type Type of event to remove.
+ * @return {number} Number of listeners removed.
+ */
+goog.events.ListenerMap.prototype.removeAll = function(opt_type) {
+ var typeStr = opt_type && opt_type.toString();
+ var count = 0;
+ for (var type in this.listeners) {
+ if (!typeStr || type == typeStr) {
+ var listenerArray = this.listeners[type];
+ for (var i = 0; i < listenerArray.length; i++) {
+ ++count;
+ listenerArray[i].markAsRemoved();
+ }
+ delete this.listeners[type];
+ this.typeCount_--;
+ }
+ }
+ return count;
+};
+
+
+/**
+ * Gets all listeners that match the given type and capture mode. The
+ * returned array is a copy (but the listener objects are not).
+ * @param {string|!goog.events.EventId} type The type of the listeners
+ * to retrieve.
+ * @param {boolean} capture The capture mode of the listeners to retrieve.
+ * @return {!Array<!goog.events.ListenableKey>} An array of matching
+ * listeners.
+ */
+goog.events.ListenerMap.prototype.getListeners = function(type, capture) {
+ var listenerArray = this.listeners[type.toString()];
+ var rv = [];
+ if (listenerArray) {
+ for (var i = 0; i < listenerArray.length; ++i) {
+ var listenerObj = listenerArray[i];
+ if (listenerObj.capture == capture) {
+ rv.push(listenerObj);
+ }
+ }
+ }
+ return rv;
+};
+
+
+/**
+ * Gets the goog.events.ListenableKey for the event or null if no such
+ * listener is in use.
+ *
+ * @param {string|!goog.events.EventId} type The type of the listener
+ * to retrieve.
+ * @param {!Function} listener The listener function to get.
+ * @param {boolean} capture Whether the listener is a capturing listener.
+ * @param {Object=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {goog.events.ListenableKey} the found listener or null if not found.
+ */
+goog.events.ListenerMap.prototype.getListener = function(
+ type, listener, capture, opt_listenerScope) {
+ var listenerArray = this.listeners[type.toString()];
+ var i = -1;
+ if (listenerArray) {
+ i = goog.events.ListenerMap.findListenerIndex_(
+ listenerArray, listener, capture, opt_listenerScope);
+ }
+ return i > -1 ? listenerArray[i] : null;
+};
+
+
+/**
+ * Whether there is a matching listener. If either the type or capture
+ * parameters are unspecified, the function will match on the
+ * remaining criteria.
+ *
+ * @param {string|!goog.events.EventId=} opt_type The type of the listener.
+ * @param {boolean=} opt_capture The capture mode of the listener.
+ * @return {boolean} Whether there is an active listener matching
+ * the requested type and/or capture phase.
+ */
+goog.events.ListenerMap.prototype.hasListener = function(
+ opt_type, opt_capture) {
+ var hasType = goog.isDef(opt_type);
+ var typeStr = hasType ? opt_type.toString() : '';
+ var hasCapture = goog.isDef(opt_capture);
+
+ return goog.object.some(this.listeners, function(listenerArray, type) {
+ for (var i = 0; i < listenerArray.length; ++i) {
+ if ((!hasType || listenerArray[i].type == typeStr) &&
+ (!hasCapture || listenerArray[i].capture == opt_capture)) {
+ return true;
+ }
+ }
+
+ return false;
+ });
+};
+
+
+/**
+ * Finds the index of a matching goog.events.Listener in the given
+ * listenerArray.
+ * @param {!Array<!goog.events.Listener>} listenerArray Array of listener.
+ * @param {!Function} listener The listener function.
+ * @param {boolean=} opt_useCapture The capture flag for the listener.
+ * @param {Object=} opt_listenerScope The listener scope.
+ * @return {number} The index of the matching listener within the
+ * listenerArray.
+ * @private
+ */
+goog.events.ListenerMap.findListenerIndex_ = function(
+ listenerArray, listener, opt_useCapture, opt_listenerScope) {
+ for (var i = 0; i < listenerArray.length; ++i) {
+ var listenerObj = listenerArray[i];
+ if (!listenerObj.removed && listenerObj.listener == listener &&
+ listenerObj.capture == !!opt_useCapture &&
+ listenerObj.handler == opt_listenerScope) {
+ return i;
+ }
+ }
+ return -1;
+};
diff --git a/src/http/static/viz/1/goog/fs/url.js b/src/http/static/viz/1/goog/fs/url.js
new file mode 100644
index 0000000..90d8349
--- /dev/null
+++ b/src/http/static/viz/1/goog/fs/url.js
@@ -0,0 +1,110 @@
+// Copyright 2015 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Wrapper for URL and its createObjectUrl and revokeObjectUrl
+ * methods that are part of the HTML5 File API.
+ */
+
+goog.provide('goog.fs.url');
+
+
+/**
+ * Creates a blob URL for a blob object.
+ * Throws an error if the browser does not support Object Urls.
+ *
+ * @param {!Blob} blob The object for which to create the URL.
+ * @return {string} The URL for the object.
+ */
+goog.fs.url.createObjectUrl = function(blob) {
+ return goog.fs.url.getUrlObject_().createObjectURL(blob);
+};
+
+
+/**
+ * Revokes a URL created by {@link goog.fs.url.createObjectUrl}.
+ * Throws an error if the browser does not support Object Urls.
+ *
+ * @param {string} url The URL to revoke.
+ */
+goog.fs.url.revokeObjectUrl = function(url) {
+ goog.fs.url.getUrlObject_().revokeObjectURL(url);
+};
+
+
+/**
+ * @typedef {{createObjectURL: (function(!Blob): string),
+ * revokeObjectURL: function(string): void}}
+ */
+goog.fs.url.UrlObject_;
+
+
+/**
+ * Get the object that has the createObjectURL and revokeObjectURL functions for
+ * this browser.
+ *
+ * @return {goog.fs.url.UrlObject_} The object for this browser.
+ * @private
+ */
+goog.fs.url.getUrlObject_ = function() {
+ var urlObject = goog.fs.url.findUrlObject_();
+ if (urlObject != null) {
+ return urlObject;
+ } else {
+ throw Error('This browser doesn\'t seem to support blob URLs');
+ }
+};
+
+
+/**
+ * Finds the object that has the createObjectURL and revokeObjectURL functions
+ * for this browser.
+ *
+ * @return {?goog.fs.url.UrlObject_} The object for this browser or null if the
+ * browser does not support Object Urls.
+ * @suppress {unnecessaryCasts} Depending on how the code is compiled, casting
+ * goog.global to UrlObject_ may result in unnecessary cast warning.
+ * However, the cast cannot be removed because with different set of
+ * compiler flags, the cast is indeed necessary. As such, silencing it.
+ * @private
+ */
+goog.fs.url.findUrlObject_ = function() {
+ // This is what the spec says to do
+ // http://dev.w3.org/2006/webapi/FileAPI/#dfn-createObjectURL
+ if (goog.isDef(goog.global.URL) &&
+ goog.isDef(goog.global.URL.createObjectURL)) {
+ return /** @type {goog.fs.url.UrlObject_} */ (goog.global.URL);
+ // This is what Chrome does (as of 10.0.648.6 dev)
+ } else if (
+ goog.isDef(goog.global.webkitURL) &&
+ goog.isDef(goog.global.webkitURL.createObjectURL)) {
+ return /** @type {goog.fs.url.UrlObject_} */ (goog.global.webkitURL);
+ // This is what the spec used to say to do
+ } else if (goog.isDef(goog.global.createObjectURL)) {
+ return /** @type {goog.fs.url.UrlObject_} */ (goog.global);
+ } else {
+ return null;
+ }
+};
+
+
+/**
+ * Checks whether this browser supports Object Urls. If not, calls to
+ * createObjectUrl and revokeObjectUrl will result in an error.
+ *
+ * @return {boolean} True if this browser supports Object Urls.
+ */
+goog.fs.url.browserSupportsObjectUrls = function() {
+ return goog.fs.url.findUrlObject_() != null;
+};
diff --git a/src/http/static/viz/1/goog/html/safehtml.js b/src/http/static/viz/1/goog/html/safehtml.js
new file mode 100644
index 0000000..704d826
--- /dev/null
+++ b/src/http/static/viz/1/goog/html/safehtml.js
@@ -0,0 +1,948 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+/**
+ * @fileoverview The SafeHtml type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.SafeHtml');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom.TagName');
+goog.require('goog.dom.tags');
+goog.require('goog.html.SafeStyle');
+goog.require('goog.html.SafeStyleSheet');
+goog.require('goog.html.SafeUrl');
+goog.require('goog.html.TrustedResourceUrl');
+goog.require('goog.i18n.bidi.Dir');
+goog.require('goog.i18n.bidi.DirectionalString');
+goog.require('goog.labs.userAgent.browser');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A string that is safe to use in HTML context in DOM APIs and HTML documents.
+ *
+ * A SafeHtml is a string-like object that carries the security type contract
+ * that its value as a string will not cause untrusted script execution when
+ * evaluated as HTML in a browser.
+ *
+ * Values of this type are guaranteed to be safe to use in HTML contexts,
+ * such as, assignment to the innerHTML DOM property, or interpolation into
+ * a HTML template in HTML PC_DATA context, in the sense that the use will not
+ * result in a Cross-Site-Scripting vulnerability.
+ *
+ * Instances of this type must be created via the factory methods
+ * ({@code goog.html.SafeHtml.create}, {@code goog.html.SafeHtml.htmlEscape}),
+ * etc and not by invoking its constructor. The constructor intentionally
+ * takes no parameters and the type is immutable; hence only a default instance
+ * corresponding to the empty string can be obtained via constructor invocation.
+ *
+ * @see goog.html.SafeHtml#create
+ * @see goog.html.SafeHtml#htmlEscape
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.i18n.bidi.DirectionalString}
+ * @implements {goog.string.TypedString}
+ */
+goog.html.SafeHtml = function() {
+ /**
+ * The contained value of this SafeHtml. The field has a purposely ugly
+ * name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.SafeHtml#unwrap
+ * @const
+ * @private
+ */
+ this.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+
+ /**
+ * This SafeHtml's directionality, or null if unknown.
+ * @private {?goog.i18n.bidi.Dir}
+ */
+ this.dir_ = null;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeHtml.prototype.implementsGoogI18nBidiDirectionalString = true;
+
+
+/** @override */
+goog.html.SafeHtml.prototype.getDirection = function() {
+ return this.dir_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeHtml.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Returns this SafeHtml's value as string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code SafeHtml}, use {@code goog.html.SafeHtml.unwrap} instead of
+ * this method. If in doubt, assume that it's security relevant. In particular,
+ * note that goog.html functions which return a goog.html type do not guarantee
+ * that the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml
+ * // instanceof goog.html.SafeHtml.
+ * </pre>
+ *
+ * @see goog.html.SafeHtml#unwrap
+ * @override
+ */
+goog.html.SafeHtml.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a SafeHtml, use
+ * {@code goog.html.SafeHtml.unwrap}.
+ *
+ * @see goog.html.SafeHtml#unwrap
+ * @override
+ */
+ goog.html.SafeHtml.prototype.toString = function() {
+ return 'SafeHtml{' + this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ +
+ '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a SafeHtml
+ * object, and returns its value.
+ * @param {!goog.html.SafeHtml} safeHtml The object to extract from.
+ * @return {string} The SafeHtml object's contained string, unless the run-time
+ * type check fails. In that case, {@code unwrap} returns an innocuous
+ * string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.SafeHtml.unwrap = function(safeHtml) {
+ // Perform additional run-time type-checking to ensure that safeHtml is indeed
+ // an instance of the expected type. This provides some additional protection
+ // against security bugs due to application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (safeHtml instanceof goog.html.SafeHtml &&
+ safeHtml.constructor === goog.html.SafeHtml &&
+ safeHtml.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return safeHtml.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type SafeHtml, got \'' +
+ safeHtml + '\' of type ' + goog.typeOf(safeHtml));
+ return 'type_error:SafeHtml';
+ }
+};
+
+
+/**
+ * Shorthand for union of types that can sensibly be converted to strings
+ * or might already be SafeHtml (as SafeHtml is a goog.string.TypedString).
+ * @private
+ * @typedef {string|number|boolean|!goog.string.TypedString|
+ * !goog.i18n.bidi.DirectionalString}
+ */
+goog.html.SafeHtml.TextOrHtml_;
+
+
+/**
+ * Returns HTML-escaped text as a SafeHtml object.
+ *
+ * If text is of a type that implements
+ * {@code goog.i18n.bidi.DirectionalString}, the directionality of the new
+ * {@code SafeHtml} object is set to {@code text}'s directionality, if known.
+ * Otherwise, the directionality of the resulting SafeHtml is unknown (i.e.,
+ * {@code null}).
+ *
+ * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If
+ * the parameter is of type SafeHtml it is returned directly (no escaping
+ * is done).
+ * @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.
+ */
+goog.html.SafeHtml.htmlEscape = function(textOrHtml) {
+ if (textOrHtml instanceof goog.html.SafeHtml) {
+ return textOrHtml;
+ }
+ var dir = null;
+ if (textOrHtml.implementsGoogI18nBidiDirectionalString) {
+ dir = textOrHtml.getDirection();
+ }
+ var textAsString;
+ if (textOrHtml.implementsGoogStringTypedString) {
+ textAsString = textOrHtml.getTypedStringValue();
+ } else {
+ textAsString = String(textOrHtml);
+ }
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ goog.string.htmlEscape(textAsString), dir);
+};
+
+
+/**
+ * Returns HTML-escaped text as a SafeHtml object, with newlines changed to
+ * &lt;br&gt;.
+ * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If
+ * the parameter is of type SafeHtml it is returned directly (no escaping
+ * is done).
+ * @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.
+ */
+goog.html.SafeHtml.htmlEscapePreservingNewlines = function(textOrHtml) {
+ if (textOrHtml instanceof goog.html.SafeHtml) {
+ return textOrHtml;
+ }
+ var html = goog.html.SafeHtml.htmlEscape(textOrHtml);
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ goog.string.newLineToBr(goog.html.SafeHtml.unwrap(html)),
+ html.getDirection());
+};
+
+
+/**
+ * Returns HTML-escaped text as a SafeHtml object, with newlines changed to
+ * &lt;br&gt; and escaping whitespace to preserve spatial formatting. Character
+ * entity #160 is used to make it safer for XML.
+ * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If
+ * the parameter is of type SafeHtml it is returned directly (no escaping
+ * is done).
+ * @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.
+ */
+goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces = function(
+ textOrHtml) {
+ if (textOrHtml instanceof goog.html.SafeHtml) {
+ return textOrHtml;
+ }
+ var html = goog.html.SafeHtml.htmlEscape(textOrHtml);
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ goog.string.whitespaceEscape(goog.html.SafeHtml.unwrap(html)),
+ html.getDirection());
+};
+
+
+/**
+ * Coerces an arbitrary object into a SafeHtml object.
+ *
+ * If {@code textOrHtml} is already of type {@code goog.html.SafeHtml}, the same
+ * object is returned. Otherwise, {@code textOrHtml} is coerced to string, and
+ * HTML-escaped. If {@code textOrHtml} is of a type that implements
+ * {@code goog.i18n.bidi.DirectionalString}, its directionality, if known, is
+ * preserved.
+ *
+ * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text or SafeHtml to
+ * coerce.
+ * @return {!goog.html.SafeHtml} The resulting SafeHtml object.
+ * @deprecated Use goog.html.SafeHtml.htmlEscape.
+ */
+goog.html.SafeHtml.from = goog.html.SafeHtml.htmlEscape;
+
+
+/**
+ * @const
+ * @private
+ */
+goog.html.SafeHtml.VALID_NAMES_IN_TAG_ = /^[a-zA-Z0-9-]+$/;
+
+
+/**
+ * Set of attributes containing URL as defined at
+ * http://www.w3.org/TR/html5/index.html#attributes-1.
+ * @private @const {!Object<string,boolean>}
+ */
+goog.html.SafeHtml.URL_ATTRIBUTES_ = goog.object.createSet(
+ 'action', 'cite', 'data', 'formaction', 'href', 'manifest', 'poster',
+ 'src');
+
+
+/**
+ * Tags which are unsupported via create(). They might be supported via a
+ * tag-specific create method. These are tags which might require a
+ * TrustedResourceUrl in one of their attributes or a restricted type for
+ * their content.
+ * @private @const {!Object<string,boolean>}
+ */
+goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_ = goog.object.createSet(
+ goog.dom.TagName.APPLET, goog.dom.TagName.BASE, goog.dom.TagName.EMBED,
+ goog.dom.TagName.IFRAME, goog.dom.TagName.LINK, goog.dom.TagName.MATH,
+ goog.dom.TagName.META, goog.dom.TagName.OBJECT, goog.dom.TagName.SCRIPT,
+ goog.dom.TagName.STYLE, goog.dom.TagName.SVG, goog.dom.TagName.TEMPLATE);
+
+
+/**
+ * @typedef {string|number|goog.string.TypedString|
+ * goog.html.SafeStyle.PropertyMap}
+ */
+goog.html.SafeHtml.AttributeValue;
+
+
+/**
+ * Creates a SafeHtml content consisting of a tag with optional attributes and
+ * optional content.
+ *
+ * For convenience tag names and attribute names are accepted as regular
+ * strings, instead of goog.string.Const. Nevertheless, you should not pass
+ * user-controlled values to these parameters. Note that these parameters are
+ * syntactically validated at runtime, and invalid values will result in
+ * an exception.
+ *
+ * Example usage:
+ *
+ * goog.html.SafeHtml.create('br');
+ * goog.html.SafeHtml.create('div', {'class': 'a'});
+ * goog.html.SafeHtml.create('p', {}, 'a');
+ * goog.html.SafeHtml.create('p', {}, goog.html.SafeHtml.create('br'));
+ *
+ * goog.html.SafeHtml.create('span', {
+ * 'style': {'margin': '0'}
+ * });
+ *
+ * To guarantee SafeHtml's type contract is upheld there are restrictions on
+ * attribute values and tag names.
+ *
+ * - For attributes which contain script code (on*), a goog.string.Const is
+ * required.
+ * - For attributes which contain style (style), a goog.html.SafeStyle or a
+ * goog.html.SafeStyle.PropertyMap is required.
+ * - For attributes which are interpreted as URLs (e.g. src, href) a
+ * goog.html.SafeUrl, goog.string.Const or string is required. If a string
+ * is passed, it will be sanitized with SafeUrl.sanitize().
+ * - For tags which can load code or set security relevant page metadata,
+ * more specific goog.html.SafeHtml.create*() functions must be used. Tags
+ * which are not supported by this function are applet, base, embed, iframe,
+ * link, math, object, script, style, svg, and template.
+ *
+ * @param {string} tagName The name of the tag. Only tag names consisting of
+ * [a-zA-Z0-9-] are allowed. Tag names documented above are disallowed.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes
+ * the attribute to be omitted.
+ * @param {!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to
+ * HTML-escape and put inside the tag. This must be empty for void tags
+ * like <br>. Array elements are concatenated.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid tag name, attribute name, or attribute value is
+ * provided.
+ * @throws {goog.asserts.AssertionError} If content for void tag is provided.
+ */
+goog.html.SafeHtml.create = function(tagName, opt_attributes, opt_content) {
+ goog.html.SafeHtml.verifyTagName(tagName);
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ tagName, opt_attributes, opt_content);
+};
+
+
+/**
+ * Verifies if the tag name is valid and if it doesn't change the context.
+ * E.g. STRONG is fine but SCRIPT throws because it changes context. See
+ * goog.html.SafeHtml.create for an explanation of allowed tags.
+ * @param {string} tagName
+ * @throws {Error} If invalid tag name is provided.
+ * @package
+ */
+goog.html.SafeHtml.verifyTagName = function(tagName) {
+ if (!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(tagName)) {
+ throw Error('Invalid tag name <' + tagName + '>.');
+ }
+ if (tagName.toUpperCase() in goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_) {
+ throw Error('Tag name <' + tagName + '> is not allowed for SafeHtml.');
+ }
+};
+
+
+/**
+ * Creates a SafeHtml representing an iframe tag.
+ *
+ * This by default restricts the iframe as much as possible by setting the
+ * sandbox attribute to the empty string. If the iframe requires less
+ * restrictions, set the sandbox attribute as tight as possible, but do not rely
+ * on the sandbox as a security feature because it is not supported by older
+ * browsers. If a sandbox is essential to security (e.g. for third-party
+ * frames), use createSandboxIframe which checks for browser support.
+ *
+ * @see https://developer.mozilla.org/en/docs/Web/HTML/Element/iframe#attr-sandbox
+ *
+ * @param {?goog.html.TrustedResourceUrl=} opt_src The value of the src
+ * attribute. If null or undefined src will not be set.
+ * @param {?goog.html.SafeHtml=} opt_srcdoc The value of the srcdoc attribute.
+ * If null or undefined srcdoc will not be set.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes
+ * the attribute to be omitted.
+ * @param {!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to
+ * HTML-escape and put inside the tag. Array elements are concatenated.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid tag name, attribute name, or attribute value is
+ * provided. If opt_attributes contains the src or srcdoc attributes.
+ */
+goog.html.SafeHtml.createIframe = function(
+ opt_src, opt_srcdoc, opt_attributes, opt_content) {
+ if (opt_src) {
+ // Check whether this is really TrustedResourceUrl.
+ goog.html.TrustedResourceUrl.unwrap(opt_src);
+ }
+
+ var fixedAttributes = {};
+ fixedAttributes['src'] = opt_src || null;
+ fixedAttributes['srcdoc'] =
+ opt_srcdoc && goog.html.SafeHtml.unwrap(opt_srcdoc);
+ var defaultAttributes = {'sandbox': ''};
+ var attributes = goog.html.SafeHtml.combineAttributes(
+ fixedAttributes, defaultAttributes, opt_attributes);
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'iframe', attributes, opt_content);
+};
+
+
+/**
+ * Creates a SafeHtml representing a sandboxed iframe tag.
+ *
+ * The sandbox attribute is enforced in its most restrictive mode, an empty
+ * string. Consequently, the security requirements for the src and srcdoc
+ * attributes are relaxed compared to SafeHtml.createIframe. This function
+ * will throw on browsers that do not support the sandbox attribute, as
+ * determined by SafeHtml.canUseSandboxIframe.
+ *
+ * The SafeHtml returned by this function can trigger downloads with no
+ * user interaction on Chrome (though only a few, further attempts are blocked).
+ * Firefox and IE will block all downloads from the sandbox.
+ *
+ * @see https://developer.mozilla.org/en/docs/Web/HTML/Element/iframe#attr-sandbox
+ * @see https://lists.w3.org/Archives/Public/public-whatwg-archive/2013Feb/0112.html
+ *
+ * @param {string|!goog.html.SafeUrl=} opt_src The value of the src
+ * attribute. If null or undefined src will not be set.
+ * @param {string=} opt_srcdoc The value of the srcdoc attribute.
+ * If null or undefined srcdoc will not be set. Will not be sanitized.
+ * @param {!Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes
+ * the attribute to be omitted.
+ * @param {!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to
+ * HTML-escape and put inside the tag. Array elements are concatenated.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid tag name, attribute name, or attribute value is
+ * provided. If opt_attributes contains the src, srcdoc or sandbox
+ * attributes. If browser does not support the sandbox attribute on iframe.
+ */
+goog.html.SafeHtml.createSandboxIframe = function(
+ opt_src, opt_srcdoc, opt_attributes, opt_content) {
+ if (!goog.html.SafeHtml.canUseSandboxIframe()) {
+ throw new Error('The browser does not support sandboxed iframes.');
+ }
+
+ var fixedAttributes = {};
+ if (opt_src) {
+ // Note that sanitize is a no-op on SafeUrl.
+ fixedAttributes['src'] =
+ goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(opt_src));
+ } else {
+ fixedAttributes['src'] = null;
+ }
+ fixedAttributes['srcdoc'] = opt_srcdoc || null;
+ fixedAttributes['sandbox'] = '';
+ var attributes =
+ goog.html.SafeHtml.combineAttributes(fixedAttributes, {}, opt_attributes);
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'iframe', attributes, opt_content);
+};
+
+
+/**
+ * Checks if the user agent supports sandboxed iframes.
+ * @return {boolean}
+ */
+goog.html.SafeHtml.canUseSandboxIframe = function() {
+ return goog.global['HTMLIFrameElement'] &&
+ ('sandbox' in goog.global['HTMLIFrameElement'].prototype);
+};
+
+
+/**
+ * Creates a SafeHtml representing a script tag with the src attribute.
+ * @param {!goog.html.TrustedResourceUrl} src The value of the src
+ * attribute.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=}
+ * opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined
+ * causes the attribute to be omitted.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid attribute name or value is provided. If
+ * opt_attributes contains the src attribute.
+ */
+goog.html.SafeHtml.createScriptSrc = function(src, opt_attributes) {
+ // Check whether this is really TrustedResourceUrl.
+ goog.html.TrustedResourceUrl.unwrap(src);
+
+ var fixedAttributes = {'src': src};
+ var defaultAttributes = {};
+ var attributes = goog.html.SafeHtml.combineAttributes(
+ fixedAttributes, defaultAttributes, opt_attributes);
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'script', attributes);
+};
+
+
+/**
+ * Creates a SafeHtml representing a style tag. The type attribute is set
+ * to "text/css".
+ * @param {!goog.html.SafeStyleSheet|!Array<!goog.html.SafeStyleSheet>}
+ * styleSheet Content to put inside the tag. Array elements are
+ * concatenated.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes
+ * the attribute to be omitted.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid attribute name or attribute value is provided. If
+ * opt_attributes contains the type attribute.
+ */
+goog.html.SafeHtml.createStyle = function(styleSheet, opt_attributes) {
+ var fixedAttributes = {'type': 'text/css'};
+ var defaultAttributes = {};
+ var attributes = goog.html.SafeHtml.combineAttributes(
+ fixedAttributes, defaultAttributes, opt_attributes);
+
+ var content = '';
+ styleSheet = goog.array.concat(styleSheet);
+ for (var i = 0; i < styleSheet.length; i++) {
+ content += goog.html.SafeStyleSheet.unwrap(styleSheet[i]);
+ }
+ // Convert to SafeHtml so that it's not HTML-escaped. This is safe because
+ // as part of its contract, SafeStyleSheet should have no dangerous '<'.
+ var htmlContent =
+ goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ content, goog.i18n.bidi.Dir.NEUTRAL);
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'style', attributes, htmlContent);
+};
+
+
+/**
+ * Creates a SafeHtml representing a meta refresh tag.
+ * @param {!goog.html.SafeUrl|string} url Where to redirect. If a string is
+ * passed, it will be sanitized with SafeUrl.sanitize().
+ * @param {number=} opt_secs Number of seconds until the page should be
+ * reloaded. Will be set to 0 if unspecified.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ */
+goog.html.SafeHtml.createMetaRefresh = function(url, opt_secs) {
+
+ // Note that sanitize is a no-op on SafeUrl.
+ var unwrappedUrl = goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(url));
+
+ if (goog.labs.userAgent.browser.isIE() ||
+ goog.labs.userAgent.browser.isEdge()) {
+ // IE/EDGE can't parse the content attribute if the url contains a
+ // semicolon. We can fix this by adding quotes around the url, but then we
+ // can't parse quotes in the URL correctly. Also, it seems that IE/EDGE
+ // did not unescape semicolons in these URLs at some point in the past. We
+ // take a best-effort approach.
+ //
+ // If the URL has semicolons (which may happen in some cases, see
+ // http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.2
+ // for instance), wrap it in single quotes to protect the semicolons.
+ // If the URL has semicolons and single quotes, url-encode the single quotes
+ // as well.
+ //
+ // This is imperfect. Notice that both ' and ; are reserved characters in
+ // URIs, so this could do the wrong thing, but at least it will do the wrong
+ // thing in only rare cases.
+ if (goog.string.contains(unwrappedUrl, ';')) {
+ unwrappedUrl = "'" + unwrappedUrl.replace(/'/g, '%27') + "'";
+ }
+ }
+ var attributes = {
+ 'http-equiv': 'refresh',
+ 'content': (opt_secs || 0) + '; url=' + unwrappedUrl
+ };
+
+ // This function will handle the HTML escaping for attributes.
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'meta', attributes);
+};
+
+
+/**
+ * @param {string} tagName The tag name.
+ * @param {string} name The attribute name.
+ * @param {!goog.html.SafeHtml.AttributeValue} value The attribute value.
+ * @return {string} A "name=value" string.
+ * @throws {Error} If attribute value is unsafe for the given tag and attribute.
+ * @private
+ */
+goog.html.SafeHtml.getAttrNameAndValue_ = function(tagName, name, value) {
+ // If it's goog.string.Const, allow any valid attribute name.
+ if (value instanceof goog.string.Const) {
+ value = goog.string.Const.unwrap(value);
+ } else if (name.toLowerCase() == 'style') {
+ value = goog.html.SafeHtml.getStyleValue_(value);
+ } else if (/^on/i.test(name)) {
+ // TODO(jakubvrana): Disallow more attributes with a special meaning.
+ throw Error(
+ 'Attribute "' + name + '" requires goog.string.Const value, "' + value +
+ '" given.');
+ // URL attributes handled differently accroding to tag.
+ } else if (name.toLowerCase() in goog.html.SafeHtml.URL_ATTRIBUTES_) {
+ if (value instanceof goog.html.TrustedResourceUrl) {
+ value = goog.html.TrustedResourceUrl.unwrap(value);
+ } else if (value instanceof goog.html.SafeUrl) {
+ value = goog.html.SafeUrl.unwrap(value);
+ } else if (goog.isString(value)) {
+ value = goog.html.SafeUrl.sanitize(value).getTypedStringValue();
+ } else {
+ throw Error(
+ 'Attribute "' + name + '" on tag "' + tagName +
+ '" requires goog.html.SafeUrl, goog.string.Const, or string,' +
+ ' value "' + value + '" given.');
+ }
+ }
+
+ // Accept SafeUrl, TrustedResourceUrl, etc. for attributes which only require
+ // HTML-escaping.
+ if (value.implementsGoogStringTypedString) {
+ // Ok to call getTypedStringValue() since there's no reliance on the type
+ // contract for security here.
+ value = value.getTypedStringValue();
+ }
+
+ goog.asserts.assert(
+ goog.isString(value) || goog.isNumber(value),
+ 'String or number value expected, got ' + (typeof value) +
+ ' with value: ' + value);
+ return name + '="' + goog.string.htmlEscape(String(value)) + '"';
+};
+
+
+/**
+ * Gets value allowed in "style" attribute.
+ * @param {!goog.html.SafeHtml.AttributeValue} value It could be SafeStyle or a
+ * map which will be passed to goog.html.SafeStyle.create.
+ * @return {string} Unwrapped value.
+ * @throws {Error} If string value is given.
+ * @private
+ */
+goog.html.SafeHtml.getStyleValue_ = function(value) {
+ if (!goog.isObject(value)) {
+ throw Error(
+ 'The "style" attribute requires goog.html.SafeStyle or map ' +
+ 'of style properties, ' + (typeof value) + ' given: ' + value);
+ }
+ if (!(value instanceof goog.html.SafeStyle)) {
+ // Process the property bag into a style object.
+ value = goog.html.SafeStyle.create(value);
+ }
+ return goog.html.SafeStyle.unwrap(value);
+};
+
+
+/**
+ * Creates a SafeHtml content with known directionality consisting of a tag with
+ * optional attributes and optional content.
+ * @param {!goog.i18n.bidi.Dir} dir Directionality.
+ * @param {string} tagName
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * @param {!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ */
+goog.html.SafeHtml.createWithDir = function(
+ dir, tagName, opt_attributes, opt_content) {
+ var html = goog.html.SafeHtml.create(tagName, opt_attributes, opt_content);
+ html.dir_ = dir;
+ return html;
+};
+
+
+/**
+ * Creates a new SafeHtml object by concatenating values.
+ * @param {...(!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>)} var_args Values to concatenate.
+ * @return {!goog.html.SafeHtml}
+ */
+goog.html.SafeHtml.concat = function(var_args) {
+ var dir = goog.i18n.bidi.Dir.NEUTRAL;
+ var content = '';
+
+ /**
+ * @param {!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>} argument
+ */
+ var addArgument = function(argument) {
+ if (goog.isArray(argument)) {
+ goog.array.forEach(argument, addArgument);
+ } else {
+ var html = goog.html.SafeHtml.htmlEscape(argument);
+ content += goog.html.SafeHtml.unwrap(html);
+ var htmlDir = html.getDirection();
+ if (dir == goog.i18n.bidi.Dir.NEUTRAL) {
+ dir = htmlDir;
+ } else if (htmlDir != goog.i18n.bidi.Dir.NEUTRAL && dir != htmlDir) {
+ dir = null;
+ }
+ }
+ };
+
+ goog.array.forEach(arguments, addArgument);
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ content, dir);
+};
+
+
+/**
+ * Creates a new SafeHtml object with known directionality by concatenating the
+ * values.
+ * @param {!goog.i18n.bidi.Dir} dir Directionality.
+ * @param {...(!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>)} var_args Elements of array
+ * arguments would be processed recursively.
+ * @return {!goog.html.SafeHtml}
+ */
+goog.html.SafeHtml.concatWithDir = function(dir, var_args) {
+ var html = goog.html.SafeHtml.concat(goog.array.slice(arguments, 1));
+ html.dir_ = dir;
+ return html;
+};
+
+
+/**
+ * Type marker for the SafeHtml type, used to implement additional run-time
+ * type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Package-internal utility method to create SafeHtml instances.
+ *
+ * @param {string} html The string to initialize the SafeHtml object with.
+ * @param {?goog.i18n.bidi.Dir} dir The directionality of the SafeHtml to be
+ * constructed, or null if unknown.
+ * @return {!goog.html.SafeHtml} The initialized SafeHtml object.
+ * @package
+ */
+goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse = function(
+ html, dir) {
+ return new goog.html.SafeHtml().initSecurityPrivateDoNotAccessOrElse_(
+ html, dir);
+};
+
+
+/**
+ * Called from createSafeHtmlSecurityPrivateDoNotAccessOrElse(). This
+ * method exists only so that the compiler can dead code eliminate static
+ * fields (like EMPTY) when they're not accessed.
+ * @param {string} html
+ * @param {?goog.i18n.bidi.Dir} dir
+ * @return {!goog.html.SafeHtml}
+ * @private
+ */
+goog.html.SafeHtml.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(
+ html, dir) {
+ this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = html;
+ this.dir_ = dir;
+ return this;
+};
+
+
+/**
+ * Like create() but does not restrict which tags can be constructed.
+ *
+ * @param {string} tagName Tag name. Set or validated by caller.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * @param {(!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>)=} opt_content
+ * @return {!goog.html.SafeHtml}
+ * @throws {Error} If invalid or unsafe attribute name or value is provided.
+ * @throws {goog.asserts.AssertionError} If content for void tag is provided.
+ * @package
+ */
+goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse = function(
+ tagName, opt_attributes, opt_content) {
+ var dir = null;
+ var result = '<' + tagName;
+ result += goog.html.SafeHtml.stringifyAttributes(tagName, opt_attributes);
+
+ var content = opt_content;
+ if (!goog.isDefAndNotNull(content)) {
+ content = [];
+ } else if (!goog.isArray(content)) {
+ content = [content];
+ }
+
+ if (goog.dom.tags.isVoidTag(tagName.toLowerCase())) {
+ goog.asserts.assert(
+ !content.length, 'Void tag <' + tagName + '> does not allow content.');
+ result += '>';
+ } else {
+ var html = goog.html.SafeHtml.concat(content);
+ result += '>' + goog.html.SafeHtml.unwrap(html) + '</' + tagName + '>';
+ dir = html.getDirection();
+ }
+
+ var dirAttribute = opt_attributes && opt_attributes['dir'];
+ if (dirAttribute) {
+ if (/^(ltr|rtl|auto)$/i.test(dirAttribute)) {
+ // If the tag has the "dir" attribute specified then its direction is
+ // neutral because it can be safely used in any context.
+ dir = goog.i18n.bidi.Dir.NEUTRAL;
+ } else {
+ dir = null;
+ }
+ }
+
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ result, dir);
+};
+
+
+/**
+ * Creates a string with attributes to insert after tagName.
+ * @param {string} tagName
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * @return {string} Returns an empty string if there are no attributes, returns
+ * a string starting with a space otherwise.
+ * @throws {Error} If attribute value is unsafe for the given tag and attribute.
+ * @package
+ */
+goog.html.SafeHtml.stringifyAttributes = function(tagName, opt_attributes) {
+ var result = '';
+ if (opt_attributes) {
+ for (var name in opt_attributes) {
+ if (!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(name)) {
+ throw Error('Invalid attribute name "' + name + '".');
+ }
+ var value = opt_attributes[name];
+ if (!goog.isDefAndNotNull(value)) {
+ continue;
+ }
+ result +=
+ ' ' + goog.html.SafeHtml.getAttrNameAndValue_(tagName, name, value);
+ }
+ }
+ return result;
+};
+
+
+/**
+ * @param {!Object<string, string>} fixedAttributes
+ * @param {!Object<string, string>} defaultAttributes
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Optional attributes passed to create*().
+ * @return {!Object<string, ?goog.html.SafeHtml.AttributeValue>}
+ * @throws {Error} If opt_attributes contains an attribute with the same name
+ * as an attribute in fixedAttributes.
+ * @package
+ */
+goog.html.SafeHtml.combineAttributes = function(
+ fixedAttributes, defaultAttributes, opt_attributes) {
+ var combinedAttributes = {};
+ var name;
+
+ for (name in fixedAttributes) {
+ goog.asserts.assert(name.toLowerCase() == name, 'Must be lower case');
+ combinedAttributes[name] = fixedAttributes[name];
+ }
+ for (name in defaultAttributes) {
+ goog.asserts.assert(name.toLowerCase() == name, 'Must be lower case');
+ combinedAttributes[name] = defaultAttributes[name];
+ }
+
+ for (name in opt_attributes) {
+ var nameLower = name.toLowerCase();
+ if (nameLower in fixedAttributes) {
+ throw Error(
+ 'Cannot override "' + nameLower + '" attribute, got "' + name +
+ '" with value "' + opt_attributes[name] + '"');
+ }
+ if (nameLower in defaultAttributes) {
+ delete combinedAttributes[nameLower];
+ }
+ combinedAttributes[name] = opt_attributes[name];
+ }
+
+ return combinedAttributes;
+};
+
+
+/**
+ * A SafeHtml instance corresponding to the HTML doctype: "<!DOCTYPE html>".
+ * @const {!goog.html.SafeHtml}
+ */
+goog.html.SafeHtml.DOCTYPE_HTML =
+ goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ '<!DOCTYPE html>', goog.i18n.bidi.Dir.NEUTRAL);
+
+
+/**
+ * A SafeHtml instance corresponding to the empty string.
+ * @const {!goog.html.SafeHtml}
+ */
+goog.html.SafeHtml.EMPTY =
+ goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ '', goog.i18n.bidi.Dir.NEUTRAL);
+
+
+/**
+ * A SafeHtml instance corresponding to the <br> tag.
+ * @const {!goog.html.SafeHtml}
+ */
+goog.html.SafeHtml.BR =
+ goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ '<br>', goog.i18n.bidi.Dir.NEUTRAL);
diff --git a/src/http/static/viz/1/goog/html/safescript.js b/src/http/static/viz/1/goog/html/safescript.js
new file mode 100644
index 0000000..26f58f6
--- /dev/null
+++ b/src/http/static/viz/1/goog/html/safescript.js
@@ -0,0 +1,234 @@
+// Copyright 2014 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview The SafeScript type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.SafeScript');
+
+goog.require('goog.asserts');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A string-like object which represents JavaScript code and that carries the
+ * security type contract that its value, as a string, will not cause execution
+ * of unconstrained attacker controlled code (XSS) when evaluated as JavaScript
+ * in a browser.
+ *
+ * Instances of this type must be created via the factory method
+ * {@code goog.html.SafeScript.fromConstant} and not by invoking its
+ * constructor. The constructor intentionally takes no parameters and the type
+ * is immutable; hence only a default instance corresponding to the empty string
+ * can be obtained via constructor invocation.
+ *
+ * A SafeScript's string representation can safely be interpolated as the
+ * content of a script element within HTML. The SafeScript string should not be
+ * escaped before interpolation.
+ *
+ * Note that the SafeScript might contain text that is attacker-controlled but
+ * that text should have been interpolated with appropriate escaping,
+ * sanitization and/or validation into the right location in the script, such
+ * that it is highly constrained in its effect (for example, it had to match a
+ * set of whitelisted words).
+ *
+ * A SafeScript can be constructed via security-reviewed unchecked
+ * conversions. In this case producers of SafeScript must ensure themselves that
+ * the SafeScript does not contain unsafe script. Note in particular that
+ * {@code &lt;} is dangerous, even when inside JavaScript strings, and so should
+ * always be forbidden or JavaScript escaped in user controlled input. For
+ * example, if {@code &lt;/script&gt;&lt;script&gt;evil&lt;/script&gt;"} were
+ * interpolated inside a JavaScript string, it would break out of the context
+ * of the original script element and {@code evil} would execute. Also note
+ * that within an HTML script (raw text) element, HTML character references,
+ * such as "&lt;" are not allowed. See
+ * http://www.w3.org/TR/html5/scripting-1.html#restrictions-for-contents-of-script-elements.
+ *
+ * @see goog.html.SafeScript#fromConstant
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.string.TypedString}
+ */
+goog.html.SafeScript = function() {
+ /**
+ * The contained value of this SafeScript. The field has a purposely
+ * ugly name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseSafeScriptWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.SafeScript#unwrap
+ * @const
+ * @private
+ */
+ this.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeScript.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Type marker for the SafeScript type, used to implement additional
+ * run-time type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Creates a SafeScript object from a compile-time constant string.
+ *
+ * @param {!goog.string.Const} script A compile-time-constant string from which
+ * to create a SafeScript.
+ * @return {!goog.html.SafeScript} A SafeScript object initialized to
+ * {@code script}.
+ */
+goog.html.SafeScript.fromConstant = function(script) {
+ var scriptString = goog.string.Const.unwrap(script);
+ if (scriptString.length === 0) {
+ return goog.html.SafeScript.EMPTY;
+ }
+ return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(
+ scriptString);
+};
+
+
+/**
+ * Returns this SafeScript's value as a string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code SafeScript}, use {@code goog.html.SafeScript.unwrap} instead of
+ * this method. If in doubt, assume that it's security relevant. In particular,
+ * note that goog.html functions which return a goog.html type do not guarantee
+ * the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml
+ * // instanceof goog.html.SafeHtml.
+ * </pre>
+ *
+ * @see goog.html.SafeScript#unwrap
+ * @override
+ */
+goog.html.SafeScript.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseSafeScriptWrappedValue_;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a SafeScript, use
+ * {@code goog.html.SafeScript.unwrap}.
+ *
+ * @see goog.html.SafeScript#unwrap
+ * @override
+ */
+ goog.html.SafeScript.prototype.toString = function() {
+ return 'SafeScript{' +
+ this.privateDoNotAccessOrElseSafeScriptWrappedValue_ + '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a
+ * SafeScript object, and returns its value.
+ *
+ * @param {!goog.html.SafeScript} safeScript The object to extract from.
+ * @return {string} The safeScript object's contained string, unless
+ * the run-time type check fails. In that case, {@code unwrap} returns an
+ * innocuous string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.SafeScript.unwrap = function(safeScript) {
+ // Perform additional Run-time type-checking to ensure that
+ // safeScript is indeed an instance of the expected type. This
+ // provides some additional protection against security bugs due to
+ // application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (safeScript instanceof goog.html.SafeScript &&
+ safeScript.constructor === goog.html.SafeScript &&
+ safeScript.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return safeScript.privateDoNotAccessOrElseSafeScriptWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type SafeScript, got \'' +
+ safeScript + '\' of type ' + goog.typeOf(safeScript));
+ return 'type_error:SafeScript';
+ }
+};
+
+
+/**
+ * Package-internal utility method to create SafeScript instances.
+ *
+ * @param {string} script The string to initialize the SafeScript object with.
+ * @return {!goog.html.SafeScript} The initialized SafeScript object.
+ * @package
+ */
+goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse =
+ function(script) {
+ return new goog.html.SafeScript().initSecurityPrivateDoNotAccessOrElse_(
+ script);
+};
+
+
+/**
+ * Called from createSafeScriptSecurityPrivateDoNotAccessOrElse(). This
+ * method exists only so that the compiler can dead code eliminate static
+ * fields (like EMPTY) when they're not accessed.
+ * @param {string} script
+ * @return {!goog.html.SafeScript}
+ * @private
+ */
+goog.html.SafeScript.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(
+ script) {
+ this.privateDoNotAccessOrElseSafeScriptWrappedValue_ = script;
+ return this;
+};
+
+
+/**
+ * A SafeScript instance corresponding to the empty string.
+ * @const {!goog.html.SafeScript}
+ */
+goog.html.SafeScript.EMPTY =
+ goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse('');
diff --git a/src/http/static/viz/1/goog/html/safestyle.js b/src/http/static/viz/1/goog/html/safestyle.js
new file mode 100644
index 0000000..a1f87cb
--- /dev/null
+++ b/src/http/static/viz/1/goog/html/safestyle.js
@@ -0,0 +1,449 @@
+// Copyright 2014 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview The SafeStyle type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.SafeStyle');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A string-like object which represents a sequence of CSS declarations
+ * ({@code propertyName1: propertyvalue1; propertyName2: propertyValue2; ...})
+ * and that carries the security type contract that its value, as a string,
+ * will not cause untrusted script execution (XSS) when evaluated as CSS in a
+ * browser.
+ *
+ * Instances of this type must be created via the factory methods
+ * ({@code goog.html.SafeStyle.create} or
+ * {@code goog.html.SafeStyle.fromConstant}) and not by invoking its
+ * constructor. The constructor intentionally takes no parameters and the type
+ * is immutable; hence only a default instance corresponding to the empty string
+ * can be obtained via constructor invocation.
+ *
+ * A SafeStyle's string representation ({@link #getTypedStringValue()}) can
+ * safely:
+ * <ul>
+ * <li>Be interpolated as the entire content of a *quoted* HTML style
+ * attribute, or before already existing properties. The SafeStyle string
+ * *must be HTML-attribute-escaped* (where " and ' are escaped) before
+ * interpolation.
+ * <li>Be interpolated as the entire content of a {}-wrapped block within a
+ * stylesheet, or before already existing properties. The SafeStyle string
+ * should not be escaped before interpolation. SafeStyle's contract also
+ * guarantees that the string will not be able to introduce new properties
+ * or elide existing ones.
+ * <li>Be assigned to the style property of a DOM node. The SafeStyle string
+ * should not be escaped before being assigned to the property.
+ * </ul>
+ *
+ * A SafeStyle may never contain literal angle brackets. Otherwise, it could
+ * be unsafe to place a SafeStyle into a &lt;style&gt; tag (where it can't
+ * be HTML escaped). For example, if the SafeStyle containing
+ * "{@code font: 'foo &lt;style/&gt;&lt;script&gt;evil&lt;/script&gt;'}" were
+ * interpolated within a &lt;style&gt; tag, this would then break out of the
+ * style context into HTML.
+ *
+ * A SafeStyle may contain literal single or double quotes, and as such the
+ * entire style string must be escaped when used in a style attribute (if
+ * this were not the case, the string could contain a matching quote that
+ * would escape from the style attribute).
+ *
+ * Values of this type must be composable, i.e. for any two values
+ * {@code style1} and {@code style2} of this type,
+ * {@code goog.html.SafeStyle.unwrap(style1) +
+ * goog.html.SafeStyle.unwrap(style2)} must itself be a value that satisfies
+ * the SafeStyle type constraint. This requirement implies that for any value
+ * {@code style} of this type, {@code goog.html.SafeStyle.unwrap(style)} must
+ * not end in a "property value" or "property name" context. For example,
+ * a value of {@code background:url("} or {@code font-} would not satisfy the
+ * SafeStyle contract. This is because concatenating such strings with a
+ * second value that itself does not contain unsafe CSS can result in an
+ * overall string that does. For example, if {@code javascript:evil())"} is
+ * appended to {@code background:url("}, the resulting string may result in
+ * the execution of a malicious script.
+ *
+ * TODO(user): Consider whether we should implement UTF-8 interchange
+ * validity checks and blacklisting of newlines (including Unicode ones) and
+ * other whitespace characters (\t, \f). Document here if so and also update
+ * SafeStyle.fromConstant().
+ *
+ * The following example values comply with this type's contract:
+ * <ul>
+ * <li><pre>width: 1em;</pre>
+ * <li><pre>height:1em;</pre>
+ * <li><pre>width: 1em;height: 1em;</pre>
+ * <li><pre>background:url('http://url');</pre>
+ * </ul>
+ * In addition, the empty string is safe for use in a CSS attribute.
+ *
+ * The following example values do NOT comply with this type's contract:
+ * <ul>
+ * <li><pre>background: red</pre> (missing a trailing semi-colon)
+ * <li><pre>background:</pre> (missing a value and a trailing semi-colon)
+ * <li><pre>1em</pre> (missing an attribute name, which provides context for
+ * the value)
+ * </ul>
+ *
+ * @see goog.html.SafeStyle#create
+ * @see goog.html.SafeStyle#fromConstant
+ * @see http://www.w3.org/TR/css3-syntax/
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.string.TypedString}
+ */
+goog.html.SafeStyle = function() {
+ /**
+ * The contained value of this SafeStyle. The field has a purposely
+ * ugly name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseSafeStyleWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.SafeStyle#unwrap
+ * @const
+ * @private
+ */
+ this.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeStyle.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Type marker for the SafeStyle type, used to implement additional
+ * run-time type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Creates a SafeStyle object from a compile-time constant string.
+ *
+ * {@code style} should be in the format
+ * {@code name: value; [name: value; ...]} and must not have any < or >
+ * characters in it. This is so that SafeStyle's contract is preserved,
+ * allowing the SafeStyle to correctly be interpreted as a sequence of CSS
+ * declarations and without affecting the syntactic structure of any
+ * surrounding CSS and HTML.
+ *
+ * This method performs basic sanity checks on the format of {@code style}
+ * but does not constrain the format of {@code name} and {@code value}, except
+ * for disallowing tag characters.
+ *
+ * @param {!goog.string.Const} style A compile-time-constant string from which
+ * to create a SafeStyle.
+ * @return {!goog.html.SafeStyle} A SafeStyle object initialized to
+ * {@code style}.
+ */
+goog.html.SafeStyle.fromConstant = function(style) {
+ var styleString = goog.string.Const.unwrap(style);
+ if (styleString.length === 0) {
+ return goog.html.SafeStyle.EMPTY;
+ }
+ goog.html.SafeStyle.checkStyle_(styleString);
+ goog.asserts.assert(
+ goog.string.endsWith(styleString, ';'),
+ 'Last character of style string is not \';\': ' + styleString);
+ goog.asserts.assert(
+ goog.string.contains(styleString, ':'),
+ 'Style string must contain at least one \':\', to ' +
+ 'specify a "name: value" pair: ' + styleString);
+ return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(
+ styleString);
+};
+
+
+/**
+ * Checks if the style definition is valid.
+ * @param {string} style
+ * @private
+ */
+goog.html.SafeStyle.checkStyle_ = function(style) {
+ goog.asserts.assert(
+ !/[<>]/.test(style), 'Forbidden characters in style string: ' + style);
+};
+
+
+/**
+ * Returns this SafeStyle's value as a string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code SafeStyle}, use {@code goog.html.SafeStyle.unwrap} instead of
+ * this method. If in doubt, assume that it's security relevant. In particular,
+ * note that goog.html functions which return a goog.html type do not guarantee
+ * the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml
+ * // instanceof goog.html.SafeHtml.
+ * </pre>
+ *
+ * @see goog.html.SafeStyle#unwrap
+ * @override
+ */
+goog.html.SafeStyle.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseSafeStyleWrappedValue_;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a SafeStyle, use
+ * {@code goog.html.SafeStyle.unwrap}.
+ *
+ * @see goog.html.SafeStyle#unwrap
+ * @override
+ */
+ goog.html.SafeStyle.prototype.toString = function() {
+ return 'SafeStyle{' + this.privateDoNotAccessOrElseSafeStyleWrappedValue_ +
+ '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a
+ * SafeStyle object, and returns its value.
+ *
+ * @param {!goog.html.SafeStyle} safeStyle The object to extract from.
+ * @return {string} The safeStyle object's contained string, unless
+ * the run-time type check fails. In that case, {@code unwrap} returns an
+ * innocuous string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.SafeStyle.unwrap = function(safeStyle) {
+ // Perform additional Run-time type-checking to ensure that
+ // safeStyle is indeed an instance of the expected type. This
+ // provides some additional protection against security bugs due to
+ // application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (safeStyle instanceof goog.html.SafeStyle &&
+ safeStyle.constructor === goog.html.SafeStyle &&
+ safeStyle.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return safeStyle.privateDoNotAccessOrElseSafeStyleWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type SafeStyle, got \'' +
+ safeStyle + '\' of type ' + goog.typeOf(safeStyle));
+ return 'type_error:SafeStyle';
+ }
+};
+
+
+/**
+ * Package-internal utility method to create SafeStyle instances.
+ *
+ * @param {string} style The string to initialize the SafeStyle object with.
+ * @return {!goog.html.SafeStyle} The initialized SafeStyle object.
+ * @package
+ */
+goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse = function(
+ style) {
+ return new goog.html.SafeStyle().initSecurityPrivateDoNotAccessOrElse_(style);
+};
+
+
+/**
+ * Called from createSafeStyleSecurityPrivateDoNotAccessOrElse(). This
+ * method exists only so that the compiler can dead code eliminate static
+ * fields (like EMPTY) when they're not accessed.
+ * @param {string} style
+ * @return {!goog.html.SafeStyle}
+ * @private
+ */
+goog.html.SafeStyle.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(
+ style) {
+ this.privateDoNotAccessOrElseSafeStyleWrappedValue_ = style;
+ return this;
+};
+
+
+/**
+ * A SafeStyle instance corresponding to the empty string.
+ * @const {!goog.html.SafeStyle}
+ */
+goog.html.SafeStyle.EMPTY =
+ goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse('');
+
+
+/**
+ * The innocuous string generated by goog.html.SafeUrl.create when passed
+ * an unsafe value.
+ * @const {string}
+ */
+goog.html.SafeStyle.INNOCUOUS_STRING = 'zClosurez';
+
+
+/**
+ * Mapping of property names to their values.
+ * @typedef {!Object<string, goog.string.Const|string>}
+ */
+goog.html.SafeStyle.PropertyMap;
+
+
+/**
+ * Creates a new SafeStyle object from the properties specified in the map.
+ * @param {goog.html.SafeStyle.PropertyMap} map Mapping of property names to
+ * their values, for example {'margin': '1px'}. Names must consist of
+ * [-_a-zA-Z0-9]. Values might be strings consisting of
+ * [-,.'"%_!# a-zA-Z0-9], where " and ' must be properly balanced.
+ * Other values must be wrapped in goog.string.Const. Null value causes
+ * skipping the property.
+ * @return {!goog.html.SafeStyle}
+ * @throws {Error} If invalid name is provided.
+ * @throws {goog.asserts.AssertionError} If invalid value is provided. With
+ * disabled assertions, invalid value is replaced by
+ * goog.html.SafeStyle.INNOCUOUS_STRING.
+ */
+goog.html.SafeStyle.create = function(map) {
+ var style = '';
+ for (var name in map) {
+ if (!/^[-_a-zA-Z0-9]+$/.test(name)) {
+ throw Error('Name allows only [-_a-zA-Z0-9], got: ' + name);
+ }
+ var value = map[name];
+ if (value == null) {
+ continue;
+ }
+ if (value instanceof goog.string.Const) {
+ value = goog.string.Const.unwrap(value);
+ // These characters can be used to change context and we don't want that
+ // even with const values.
+ goog.asserts.assert(!/[{;}]/.test(value), 'Value does not allow [{;}].');
+ } else if (!goog.html.SafeStyle.VALUE_RE_.test(value)) {
+ goog.asserts.fail(
+ 'String value allows only [-,."\'%_!# a-zA-Z0-9], rgb() and ' +
+ 'rgba(), got: ' + value);
+ value = goog.html.SafeStyle.INNOCUOUS_STRING;
+ } else if (!goog.html.SafeStyle.hasBalancedQuotes_(value)) {
+ goog.asserts.fail('String value requires balanced quotes, got: ' + value);
+ value = goog.html.SafeStyle.INNOCUOUS_STRING;
+ }
+ style += name + ':' + value + ';';
+ }
+ if (!style) {
+ return goog.html.SafeStyle.EMPTY;
+ }
+ goog.html.SafeStyle.checkStyle_(style);
+ return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(
+ style);
+};
+
+
+/**
+ * Checks that quotes (" and ') are properly balanced inside a string. Assumes
+ * that neither escape (\) nor any other character that could result in
+ * breaking out of a string parsing context are allowed;
+ * see http://www.w3.org/TR/css3-syntax/#string-token-diagram.
+ * @param {string} value Untrusted CSS property value.
+ * @return {boolean} True if property value is safe with respect to quote
+ * balancedness.
+ * @private
+ */
+goog.html.SafeStyle.hasBalancedQuotes_ = function(value) {
+ var outsideSingle = true;
+ var outsideDouble = true;
+ for (var i = 0; i < value.length; i++) {
+ var c = value.charAt(i);
+ if (c == "'" && outsideDouble) {
+ outsideSingle = !outsideSingle;
+ } else if (c == '"' && outsideSingle) {
+ outsideDouble = !outsideDouble;
+ }
+ }
+ return outsideSingle && outsideDouble;
+};
+
+
+// Keep in sync with the error string in create().
+/**
+ * Regular expression for safe values.
+ *
+ * Quotes (" and ') are allowed, but a check must be done elsewhere to ensure
+ * they're balanced.
+ *
+ * ',' allows multiple values to be assigned to the same property
+ * (e.g. background-attachment or font-family) and hence could allow
+ * multiple values to get injected, but that should pose no risk of XSS.
+ *
+ * The rgb() and rgba() expression checks only for XSS safety, not for CSS
+ * validity.
+ * @const {!RegExp}
+ * @private
+ */
+goog.html.SafeStyle.VALUE_RE_ =
+ /^([-,."'%_!# a-zA-Z0-9]+|(?:rgb|hsl)a?\([0-9.%, ]+\))$/;
+
+
+/**
+ * Creates a new SafeStyle object by concatenating the values.
+ * @param {...(!goog.html.SafeStyle|!Array<!goog.html.SafeStyle>)} var_args
+ * SafeStyles to concatenate.
+ * @return {!goog.html.SafeStyle}
+ */
+goog.html.SafeStyle.concat = function(var_args) {
+ var style = '';
+
+ /**
+ * @param {!goog.html.SafeStyle|!Array<!goog.html.SafeStyle>} argument
+ */
+ var addArgument = function(argument) {
+ if (goog.isArray(argument)) {
+ goog.array.forEach(argument, addArgument);
+ } else {
+ style += goog.html.SafeStyle.unwrap(argument);
+ }
+ };
+
+ goog.array.forEach(arguments, addArgument);
+ if (!style) {
+ return goog.html.SafeStyle.EMPTY;
+ }
+ return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(
+ style);
+};
diff --git a/src/http/static/viz/1/goog/html/safestylesheet.js b/src/http/static/viz/1/goog/html/safestylesheet.js
new file mode 100644
index 0000000..65a81b0
--- /dev/null
+++ b/src/http/static/viz/1/goog/html/safestylesheet.js
@@ -0,0 +1,278 @@
+// Copyright 2014 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview The SafeStyleSheet type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.SafeStyleSheet');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A string-like object which represents a CSS style sheet and that carries the
+ * security type contract that its value, as a string, will not cause untrusted
+ * script execution (XSS) when evaluated as CSS in a browser.
+ *
+ * Instances of this type must be created via the factory method
+ * {@code goog.html.SafeStyleSheet.fromConstant} and not by invoking its
+ * constructor. The constructor intentionally takes no parameters and the type
+ * is immutable; hence only a default instance corresponding to the empty string
+ * can be obtained via constructor invocation.
+ *
+ * A SafeStyleSheet's string representation can safely be interpolated as the
+ * content of a style element within HTML. The SafeStyleSheet string should
+ * not be escaped before interpolation.
+ *
+ * Values of this type must be composable, i.e. for any two values
+ * {@code styleSheet1} and {@code styleSheet2} of this type,
+ * {@code goog.html.SafeStyleSheet.unwrap(styleSheet1) +
+ * goog.html.SafeStyleSheet.unwrap(styleSheet2)} must itself be a value that
+ * satisfies the SafeStyleSheet type constraint. This requirement implies that
+ * for any value {@code styleSheet} of this type,
+ * {@code goog.html.SafeStyleSheet.unwrap(styleSheet1)} must end in
+ * "beginning of rule" context.
+
+ * A SafeStyleSheet can be constructed via security-reviewed unchecked
+ * conversions. In this case producers of SafeStyleSheet must ensure themselves
+ * that the SafeStyleSheet does not contain unsafe script. Note in particular
+ * that {@code &lt;} is dangerous, even when inside CSS strings, and so should
+ * always be forbidden or CSS-escaped in user controlled input. For example, if
+ * {@code &lt;/style&gt;&lt;script&gt;evil&lt;/script&gt;"} were interpolated
+ * inside a CSS string, it would break out of the context of the original
+ * style element and {@code evil} would execute. Also note that within an HTML
+ * style (raw text) element, HTML character references, such as
+ * {@code &amp;lt;}, are not allowed. See
+ *
+ http://www.w3.org/TR/html5/scripting-1.html#restrictions-for-contents-of-script-elements
+ * (similar considerations apply to the style element).
+ *
+ * @see goog.html.SafeStyleSheet#fromConstant
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.string.TypedString}
+ */
+goog.html.SafeStyleSheet = function() {
+ /**
+ * The contained value of this SafeStyleSheet. The field has a purposely
+ * ugly name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.SafeStyleSheet#unwrap
+ * @const
+ * @private
+ */
+ this.SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeStyleSheet.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Type marker for the SafeStyleSheet type, used to implement additional
+ * run-time type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Creates a new SafeStyleSheet object by concatenating values.
+ * @param {...(!goog.html.SafeStyleSheet|!Array<!goog.html.SafeStyleSheet>)}
+ * var_args Values to concatenate.
+ * @return {!goog.html.SafeStyleSheet}
+ */
+goog.html.SafeStyleSheet.concat = function(var_args) {
+ var result = '';
+
+ /**
+ * @param {!goog.html.SafeStyleSheet|!Array<!goog.html.SafeStyleSheet>}
+ * argument
+ */
+ var addArgument = function(argument) {
+ if (goog.isArray(argument)) {
+ goog.array.forEach(argument, addArgument);
+ } else {
+ result += goog.html.SafeStyleSheet.unwrap(argument);
+ }
+ };
+
+ goog.array.forEach(arguments, addArgument);
+ return goog.html.SafeStyleSheet
+ .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(result);
+};
+
+
+/**
+ * Creates a SafeStyleSheet object from a compile-time constant string.
+ *
+ * {@code styleSheet} must not have any &lt; characters in it, so that
+ * the syntactic structure of the surrounding HTML is not affected.
+ *
+ * @param {!goog.string.Const} styleSheet A compile-time-constant string from
+ * which to create a SafeStyleSheet.
+ * @return {!goog.html.SafeStyleSheet} A SafeStyleSheet object initialized to
+ * {@code styleSheet}.
+ */
+goog.html.SafeStyleSheet.fromConstant = function(styleSheet) {
+ var styleSheetString = goog.string.Const.unwrap(styleSheet);
+ if (styleSheetString.length === 0) {
+ return goog.html.SafeStyleSheet.EMPTY;
+ }
+ // > is a valid character in CSS selectors and there's no strict need to
+ // block it if we already block <.
+ goog.asserts.assert(
+ !goog.string.contains(styleSheetString, '<'),
+ "Forbidden '<' character in style sheet string: " + styleSheetString);
+ return goog.html.SafeStyleSheet
+ .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheetString);
+};
+
+
+/**
+ * Returns this SafeStyleSheet's value as a string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code SafeStyleSheet}, use {@code goog.html.SafeStyleSheet.unwrap}
+ * instead of this method. If in doubt, assume that it's security relevant. In
+ * particular, note that goog.html functions which return a goog.html type do
+ * not guarantee the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml
+ * // instanceof goog.html.SafeHtml.
+ * </pre>
+ *
+ * @see goog.html.SafeStyleSheet#unwrap
+ * @override
+ */
+goog.html.SafeStyleSheet.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a SafeStyleSheet, use
+ * {@code goog.html.SafeStyleSheet.unwrap}.
+ *
+ * @see goog.html.SafeStyleSheet#unwrap
+ * @override
+ */
+ goog.html.SafeStyleSheet.prototype.toString = function() {
+ return 'SafeStyleSheet{' +
+ this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ + '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a
+ * SafeStyleSheet object, and returns its value.
+ *
+ * @param {!goog.html.SafeStyleSheet} safeStyleSheet The object to extract from.
+ * @return {string} The safeStyleSheet object's contained string, unless
+ * the run-time type check fails. In that case, {@code unwrap} returns an
+ * innocuous string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.SafeStyleSheet.unwrap = function(safeStyleSheet) {
+ // Perform additional Run-time type-checking to ensure that
+ // safeStyleSheet is indeed an instance of the expected type. This
+ // provides some additional protection against security bugs due to
+ // application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (safeStyleSheet instanceof goog.html.SafeStyleSheet &&
+ safeStyleSheet.constructor === goog.html.SafeStyleSheet &&
+ safeStyleSheet
+ .SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return safeStyleSheet.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type SafeStyleSheet, got \'' +
+ safeStyleSheet + '\' of type ' + goog.typeOf(safeStyleSheet));
+ return 'type_error:SafeStyleSheet';
+ }
+};
+
+
+/**
+ * Package-internal utility method to create SafeStyleSheet instances.
+ *
+ * @param {string} styleSheet The string to initialize the SafeStyleSheet
+ * object with.
+ * @return {!goog.html.SafeStyleSheet} The initialized SafeStyleSheet object.
+ * @package
+ */
+goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse =
+ function(styleSheet) {
+ return new goog.html.SafeStyleSheet().initSecurityPrivateDoNotAccessOrElse_(
+ styleSheet);
+};
+
+
+/**
+ * Called from createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(). This
+ * method exists only so that the compiler can dead code eliminate static
+ * fields (like EMPTY) when they're not accessed.
+ * @param {string} styleSheet
+ * @return {!goog.html.SafeStyleSheet}
+ * @private
+ */
+goog.html.SafeStyleSheet.prototype.initSecurityPrivateDoNotAccessOrElse_ =
+ function(styleSheet) {
+ this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ = styleSheet;
+ return this;
+};
+
+
+/**
+ * A SafeStyleSheet instance corresponding to the empty string.
+ * @const {!goog.html.SafeStyleSheet}
+ */
+goog.html.SafeStyleSheet.EMPTY =
+ goog.html.SafeStyleSheet
+ .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse('');
diff --git a/src/http/static/viz/1/goog/html/safeurl.js b/src/http/static/viz/1/goog/html/safeurl.js
new file mode 100644
index 0000000..640a070
--- /dev/null
+++ b/src/http/static/viz/1/goog/html/safeurl.js
@@ -0,0 +1,412 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview The SafeUrl type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.SafeUrl');
+
+goog.require('goog.asserts');
+goog.require('goog.fs.url');
+goog.require('goog.i18n.bidi.Dir');
+goog.require('goog.i18n.bidi.DirectionalString');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A string that is safe to use in URL context in DOM APIs and HTML documents.
+ *
+ * A SafeUrl is a string-like object that carries the security type contract
+ * that its value as a string will not cause untrusted script execution
+ * when evaluated as a hyperlink URL in a browser.
+ *
+ * Values of this type are guaranteed to be safe to use in URL/hyperlink
+ * contexts, such as, assignment to URL-valued DOM properties, or
+ * interpolation into a HTML template in URL context (e.g., inside a href
+ * attribute), in the sense that the use will not result in a
+ * Cross-Site-Scripting vulnerability.
+ *
+ * Note that, as documented in {@code goog.html.SafeUrl.unwrap}, this type's
+ * contract does not guarantee that instances are safe to interpolate into HTML
+ * without appropriate escaping.
+ *
+ * Note also that this type's contract does not imply any guarantees regarding
+ * the resource the URL refers to. In particular, SafeUrls are <b>not</b>
+ * safe to use in a context where the referred-to resource is interpreted as
+ * trusted code, e.g., as the src of a script tag.
+ *
+ * Instances of this type must be created via the factory methods
+ * ({@code goog.html.SafeUrl.fromConstant}, {@code goog.html.SafeUrl.sanitize}),
+ * etc and not by invoking its constructor. The constructor intentionally
+ * takes no parameters and the type is immutable; hence only a default instance
+ * corresponding to the empty string can be obtained via constructor invocation.
+ *
+ * @see goog.html.SafeUrl#fromConstant
+ * @see goog.html.SafeUrl#from
+ * @see goog.html.SafeUrl#sanitize
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.i18n.bidi.DirectionalString}
+ * @implements {goog.string.TypedString}
+ */
+goog.html.SafeUrl = function() {
+ /**
+ * The contained value of this SafeUrl. The field has a purposely ugly
+ * name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.SafeUrl#unwrap
+ * @const
+ * @private
+ */
+ this.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+};
+
+
+/**
+ * The innocuous string generated by goog.html.SafeUrl.sanitize when passed
+ * an unsafe URL.
+ *
+ * about:invalid is registered in
+ * http://www.w3.org/TR/css3-values/#about-invalid.
+ * http://tools.ietf.org/html/rfc6694#section-2.2.1 permits about URLs to
+ * contain a fragment, which is not to be considered when determining if an
+ * about URL is well-known.
+ *
+ * Using about:invalid seems preferable to using a fixed data URL, since
+ * browsers might choose to not report CSP violations on it, as legitimate
+ * CSS function calls to attr() can result in this URL being produced. It is
+ * also a standard URL which matches exactly the semantics we need:
+ * "The about:invalid URI references a non-existent document with a generic
+ * error condition. It can be used when a URI is necessary, but the default
+ * value shouldn't be resolveable as any type of document".
+ *
+ * @const {string}
+ */
+goog.html.SafeUrl.INNOCUOUS_STRING = 'about:invalid#zClosurez';
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeUrl.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Returns this SafeUrl's value a string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code SafeUrl}, use {@code goog.html.SafeUrl.unwrap} instead of this
+ * method. If in doubt, assume that it's security relevant. In particular, note
+ * that goog.html functions which return a goog.html type do not guarantee that
+ * the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml instanceof
+ * // goog.html.SafeHtml.
+ * </pre>
+ *
+ * IMPORTANT: The guarantees of the SafeUrl type contract only extend to the
+ * behavior of browsers when interpreting URLs. Values of SafeUrl objects MUST
+ * be appropriately escaped before embedding in a HTML document. Note that the
+ * required escaping is context-sensitive (e.g. a different escaping is
+ * required for embedding a URL in a style property within a style
+ * attribute, as opposed to embedding in a href attribute).
+ *
+ * @see goog.html.SafeUrl#unwrap
+ * @override
+ */
+goog.html.SafeUrl.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeUrl.prototype.implementsGoogI18nBidiDirectionalString = true;
+
+
+/**
+ * Returns this URLs directionality, which is always {@code LTR}.
+ * @override
+ */
+goog.html.SafeUrl.prototype.getDirection = function() {
+ return goog.i18n.bidi.Dir.LTR;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a SafeUrl, use
+ * {@code goog.html.SafeUrl.unwrap}.
+ *
+ * @see goog.html.SafeUrl#unwrap
+ * @override
+ */
+ goog.html.SafeUrl.prototype.toString = function() {
+ return 'SafeUrl{' + this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ +
+ '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a SafeUrl
+ * object, and returns its value.
+ *
+ * IMPORTANT: The guarantees of the SafeUrl type contract only extend to the
+ * behavior of browsers when interpreting URLs. Values of SafeUrl objects MUST
+ * be appropriately escaped before embedding in a HTML document. Note that the
+ * required escaping is context-sensitive (e.g. a different escaping is
+ * required for embedding a URL in a style property within a style
+ * attribute, as opposed to embedding in a href attribute).
+ *
+ * @param {!goog.html.SafeUrl} safeUrl The object to extract from.
+ * @return {string} The SafeUrl object's contained string, unless the run-time
+ * type check fails. In that case, {@code unwrap} returns an innocuous
+ * string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.SafeUrl.unwrap = function(safeUrl) {
+ // Perform additional Run-time type-checking to ensure that safeUrl is indeed
+ // an instance of the expected type. This provides some additional protection
+ // against security bugs due to application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (safeUrl instanceof goog.html.SafeUrl &&
+ safeUrl.constructor === goog.html.SafeUrl &&
+ safeUrl.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return safeUrl.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type SafeUrl, got \'' +
+ safeUrl + '\' of type ' + goog.typeOf(safeUrl));
+ return 'type_error:SafeUrl';
+ }
+};
+
+
+/**
+ * Creates a SafeUrl object from a compile-time constant string.
+ *
+ * Compile-time constant strings are inherently program-controlled and hence
+ * trusted.
+ *
+ * @param {!goog.string.Const} url A compile-time-constant string from which to
+ * create a SafeUrl.
+ * @return {!goog.html.SafeUrl} A SafeUrl object initialized to {@code url}.
+ */
+goog.html.SafeUrl.fromConstant = function(url) {
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(
+ goog.string.Const.unwrap(url));
+};
+
+
+/**
+ * A pattern that matches Blob or data types that can have SafeUrls created
+ * from URL.createObjectURL(blob) or via a data: URI. Only matches image and
+ * video types, currently.
+ * @const
+ * @private
+ */
+goog.html.SAFE_MIME_TYPE_PATTERN_ =
+ /^(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm))$/i;
+
+
+/**
+ * Creates a SafeUrl wrapping a blob URL for the given {@code blob}.
+ *
+ * The blob URL is created with {@code URL.createObjectURL}. If the MIME type
+ * for {@code blob} is not of a known safe image or video MIME type, then the
+ * SafeUrl will wrap {@link #INNOCUOUS_STRING}.
+ *
+ * @see http://www.w3.org/TR/FileAPI/#url
+ * @param {!Blob} blob
+ * @return {!goog.html.SafeUrl} The blob URL, or an innocuous string wrapped
+ * as a SafeUrl.
+ */
+goog.html.SafeUrl.fromBlob = function(blob) {
+ var url = goog.html.SAFE_MIME_TYPE_PATTERN_.test(blob.type) ?
+ goog.fs.url.createObjectUrl(blob) :
+ goog.html.SafeUrl.INNOCUOUS_STRING;
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);
+};
+
+
+/**
+ * Matches a base-64 data URL, with the first match group being the MIME type.
+ * @const
+ * @private
+ */
+goog.html.DATA_URL_PATTERN_ = /^data:([^;,]*);base64,[a-z0-9+\/]+=*$/i;
+
+
+/**
+ * Creates a SafeUrl wrapping a data: URL, after validating it matches a
+ * known-safe image or video MIME type.
+ *
+ * @param {string} dataUrl A valid base64 data URL with one of the whitelisted
+ * image or video MIME types.
+ * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}
+ * wrapped as a SafeUrl if it does not pass.
+ */
+goog.html.SafeUrl.fromDataUrl = function(dataUrl) {
+ // There's a slight risk here that a browser sniffs the content type if it
+ // doesn't know the MIME type and executes HTML within the data: URL. For this
+ // to cause XSS it would also have to execute the HTML in the same origin
+ // of the page with the link. It seems unlikely that both of these will
+ // happen, particularly in not really old IEs.
+ var match = dataUrl.match(goog.html.DATA_URL_PATTERN_);
+ var valid = match && goog.html.SAFE_MIME_TYPE_PATTERN_.test(match[1]);
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(
+ valid ? dataUrl : goog.html.SafeUrl.INNOCUOUS_STRING);
+};
+
+
+/**
+ * Creates a SafeUrl wrapping a tel: URL.
+ *
+ * @param {string} telUrl A tel URL.
+ * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}
+ * wrapped as a SafeUrl if it does not pass.
+ */
+goog.html.SafeUrl.fromTelUrl = function(telUrl) {
+ // There's a risk that a tel: URL could immediately place a call once
+ // clicked, without requiring user confirmation. For that reason it is
+ // handled in this separate function.
+ if (!goog.string.caseInsensitiveStartsWith(telUrl, 'tel:')) {
+ telUrl = goog.html.SafeUrl.INNOCUOUS_STRING;
+ }
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(
+ telUrl);
+};
+
+
+/**
+ * A pattern that recognizes a commonly useful subset of URLs that satisfy
+ * the SafeUrl contract.
+ *
+ * This regular expression matches a subset of URLs that will not cause script
+ * execution if used in URL context within a HTML document. Specifically, this
+ * regular expression matches if (comment from here on and regex copied from
+ * Soy's EscapingConventions):
+ * (1) Either a protocol in a whitelist (http, https, mailto or ftp).
+ * (2) or no protocol. A protocol must be followed by a colon. The below
+ * allows that by allowing colons only after one of the characters [/?#].
+ * A colon after a hash (#) must be in the fragment.
+ * Otherwise, a colon after a (?) must be in a query.
+ * Otherwise, a colon after a single solidus (/) must be in a path.
+ * Otherwise, a colon after a double solidus (//) must be in the authority
+ * (before port).
+ *
+ * The pattern disallows &, used in HTML entity declarations before
+ * one of the characters in [/?#]. This disallows HTML entities used in the
+ * protocol name, which should never happen, e.g. "h&#116;tp" for "http".
+ * It also disallows HTML entities in the first path part of a relative path,
+ * e.g. "foo&lt;bar/baz". Our existing escaping functions should not produce
+ * that. More importantly, it disallows masking of a colon,
+ * e.g. "javascript&#58;...".
+ *
+ * @private
+ * @const {!RegExp}
+ */
+goog.html.SAFE_URL_PATTERN_ =
+ /^(?:(?:https?|mailto|ftp):|[^&:/?#]*(?:[/?#]|$))/i;
+
+
+/**
+ * Creates a SafeUrl object from {@code url}. If {@code url} is a
+ * goog.html.SafeUrl then it is simply returned. Otherwise the input string is
+ * validated to match a pattern of commonly used safe URLs.
+ *
+ * {@code url} may be a URL with the http, https, mailto or ftp scheme,
+ * or a relative URL (i.e., a URL without a scheme; specifically, a
+ * scheme-relative, absolute-path-relative, or path-relative URL).
+ *
+ * @see http://url.spec.whatwg.org/#concept-relative-url
+ * @param {string|!goog.string.TypedString} url The URL to validate.
+ * @return {!goog.html.SafeUrl} The validated URL, wrapped as a SafeUrl.
+ */
+goog.html.SafeUrl.sanitize = function(url) {
+ if (url instanceof goog.html.SafeUrl) {
+ return url;
+ } else if (url.implementsGoogStringTypedString) {
+ url = url.getTypedStringValue();
+ } else {
+ url = String(url);
+ }
+ if (!goog.html.SAFE_URL_PATTERN_.test(url)) {
+ url = goog.html.SafeUrl.INNOCUOUS_STRING;
+ }
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);
+};
+
+
+/**
+ * Type marker for the SafeUrl type, used to implement additional run-time
+ * type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Package-internal utility method to create SafeUrl instances.
+ *
+ * @param {string} url The string to initialize the SafeUrl object with.
+ * @return {!goog.html.SafeUrl} The initialized SafeUrl object.
+ * @package
+ */
+goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse = function(
+ url) {
+ var safeUrl = new goog.html.SafeUrl();
+ safeUrl.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = url;
+ return safeUrl;
+};
+
+
+/**
+ * A SafeUrl corresponding to the special about:blank url.
+ * @const {!goog.html.SafeUrl}
+ */
+goog.html.SafeUrl.ABOUT_BLANK =
+ goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(
+ 'about:blank');
diff --git a/src/http/static/viz/1/goog/html/trustedresourceurl.js b/src/http/static/viz/1/goog/html/trustedresourceurl.js
new file mode 100644
index 0000000..6e3c0df
--- /dev/null
+++ b/src/http/static/viz/1/goog/html/trustedresourceurl.js
@@ -0,0 +1,244 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview The TrustedResourceUrl type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.TrustedResourceUrl');
+
+goog.require('goog.asserts');
+goog.require('goog.i18n.bidi.Dir');
+goog.require('goog.i18n.bidi.DirectionalString');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A URL which is under application control and from which script, CSS, and
+ * other resources that represent executable code, can be fetched.
+ *
+ * Given that the URL can only be constructed from strings under application
+ * control and is used to load resources, bugs resulting in a malformed URL
+ * should not have a security impact and are likely to be easily detectable
+ * during testing. Given the wide number of non-RFC compliant URLs in use,
+ * stricter validation could prevent some applications from being able to use
+ * this type.
+ *
+ * Instances of this type must be created via the factory method,
+ * ({@code goog.html.TrustedResourceUrl.fromConstant}), and not by invoking its
+ * constructor. The constructor intentionally takes no parameters and the type
+ * is immutable; hence only a default instance corresponding to the empty
+ * string can be obtained via constructor invocation.
+ *
+ * @see goog.html.TrustedResourceUrl#fromConstant
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.i18n.bidi.DirectionalString}
+ * @implements {goog.string.TypedString}
+ */
+goog.html.TrustedResourceUrl = function() {
+ /**
+ * The contained value of this TrustedResourceUrl. The field has a purposely
+ * ugly name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.TrustedResourceUrl#unwrap
+ * @const
+ * @private
+ */
+ this.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.TrustedResourceUrl.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Returns this TrustedResourceUrl's value as a string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code TrustedResourceUrl}, use
+ * {@code goog.html.TrustedResourceUrl.unwrap} instead of this method. If in
+ * doubt, assume that it's security relevant. In particular, note that
+ * goog.html functions which return a goog.html type do not guarantee that
+ * the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml instanceof
+ * // goog.html.SafeHtml.
+ * </pre>
+ *
+ * @see goog.html.TrustedResourceUrl#unwrap
+ * @override
+ */
+goog.html.TrustedResourceUrl.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.TrustedResourceUrl.prototype.implementsGoogI18nBidiDirectionalString =
+ true;
+
+
+/**
+ * Returns this URLs directionality, which is always {@code LTR}.
+ * @override
+ */
+goog.html.TrustedResourceUrl.prototype.getDirection = function() {
+ return goog.i18n.bidi.Dir.LTR;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a TrustedResourceUrl, use
+ * {@code goog.html.TrustedResourceUrl.unwrap}.
+ *
+ * @see goog.html.TrustedResourceUrl#unwrap
+ * @override
+ */
+ goog.html.TrustedResourceUrl.prototype.toString = function() {
+ return 'TrustedResourceUrl{' +
+ this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ + '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a
+ * TrustedResourceUrl object, and returns its value.
+ *
+ * @param {!goog.html.TrustedResourceUrl} trustedResourceUrl The object to
+ * extract from.
+ * @return {string} The trustedResourceUrl object's contained string, unless
+ * the run-time type check fails. In that case, {@code unwrap} returns an
+ * innocuous string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.TrustedResourceUrl.unwrap = function(trustedResourceUrl) {
+ // Perform additional Run-time type-checking to ensure that
+ // trustedResourceUrl is indeed an instance of the expected type. This
+ // provides some additional protection against security bugs due to
+ // application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (trustedResourceUrl instanceof goog.html.TrustedResourceUrl &&
+ trustedResourceUrl.constructor === goog.html.TrustedResourceUrl &&
+ trustedResourceUrl
+ .TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.TrustedResourceUrl
+ .TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return trustedResourceUrl
+ .privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type TrustedResourceUrl, got \'' +
+ trustedResourceUrl + '\' of type ' + goog.typeOf(trustedResourceUrl));
+ return 'type_error:TrustedResourceUrl';
+ }
+};
+
+
+/**
+ * Creates a TrustedResourceUrl object from a compile-time constant string.
+ *
+ * Compile-time constant strings are inherently program-controlled and hence
+ * trusted.
+ *
+ * @param {!goog.string.Const} url A compile-time-constant string from which to
+ * create a TrustedResourceUrl.
+ * @return {!goog.html.TrustedResourceUrl} A TrustedResourceUrl object
+ * initialized to {@code url}.
+ */
+goog.html.TrustedResourceUrl.fromConstant = function(url) {
+ return goog.html.TrustedResourceUrl
+ .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(
+ goog.string.Const.unwrap(url));
+};
+
+
+/**
+ * Creates a TrustedResourceUrl object from a compile-time constant strings.
+ *
+ * Compile-time constant strings are inherently program-controlled and hence
+ * trusted.
+ *
+ * @param {!Array<!goog.string.Const>} parts Compile-time-constant strings from
+ * which to create a TrustedResourceUrl.
+ * @return {!goog.html.TrustedResourceUrl} A TrustedResourceUrl object
+ * initialized to concatenation of {@code parts}.
+ */
+goog.html.TrustedResourceUrl.fromConstants = function(parts) {
+ var unwrapped = '';
+ for (var i = 0; i < parts.length; i++) {
+ unwrapped += goog.string.Const.unwrap(parts[i]);
+ }
+ return goog.html.TrustedResourceUrl
+ .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(unwrapped);
+};
+
+
+/**
+ * Type marker for the TrustedResourceUrl type, used to implement additional
+ * run-time type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Package-internal utility method to create TrustedResourceUrl instances.
+ *
+ * @param {string} url The string to initialize the TrustedResourceUrl object
+ * with.
+ * @return {!goog.html.TrustedResourceUrl} The initialized TrustedResourceUrl
+ * object.
+ * @package
+ */
+goog.html.TrustedResourceUrl
+ .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse = function(url) {
+ var trustedResourceUrl = new goog.html.TrustedResourceUrl();
+ trustedResourceUrl.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ =
+ url;
+ return trustedResourceUrl;
+};
diff --git a/src/http/static/viz/1/goog/html/uncheckedconversions.js b/src/http/static/viz/1/goog/html/uncheckedconversions.js
new file mode 100644
index 0000000..2cef322
--- /dev/null
+++ b/src/http/static/viz/1/goog/html/uncheckedconversions.js
@@ -0,0 +1,232 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Unchecked conversions to create values of goog.html types from
+ * plain strings. Use of these functions could potentially result in instances
+ * of goog.html types that violate their type contracts, and hence result in
+ * security vulnerabilties.
+ *
+ * Therefore, all uses of the methods herein must be carefully security
+ * reviewed. Avoid use of the methods in this file whenever possible; instead
+ * prefer to create instances of goog.html types using inherently safe builders
+ * or template systems.
+ *
+ *
+ *
+ * @visibility {//closure/goog/html:approved_for_unchecked_conversion}
+ * @visibility {//closure/goog/bin/sizetests:__pkg__}
+ */
+
+
+goog.provide('goog.html.uncheckedconversions');
+
+goog.require('goog.asserts');
+goog.require('goog.html.SafeHtml');
+goog.require('goog.html.SafeScript');
+goog.require('goog.html.SafeStyle');
+goog.require('goog.html.SafeStyleSheet');
+goog.require('goog.html.SafeUrl');
+goog.require('goog.html.TrustedResourceUrl');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+
+
+/**
+ * Performs an "unchecked conversion" to SafeHtml from a plain string that is
+ * known to satisfy the SafeHtml type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code html} satisfies the SafeHtml type contract in all
+ * possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} html A string that is claimed to adhere to the SafeHtml
+ * contract.
+ * @param {?goog.i18n.bidi.Dir=} opt_dir The optional directionality of the
+ * SafeHtml to be constructed. A null or undefined value signifies an
+ * unknown directionality.
+ * @return {!goog.html.SafeHtml} The value of html, wrapped in a SafeHtml
+ * object.
+ * @suppress {visibility} For access to SafeHtml.create... Note that this
+ * use is appropriate since this method is intended to be "package private"
+ * within goog.html. DO NOT call SafeHtml.create... from outside this
+ * package; use appropriate wrappers instead.
+ */
+goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract =
+ function(justification, html, opt_dir) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ html, opt_dir || null);
+};
+
+
+/**
+ * Performs an "unchecked conversion" to SafeScript from a plain string that is
+ * known to satisfy the SafeScript type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code script} satisfies the SafeScript type contract in
+ * all possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} script The string to wrap as a SafeScript.
+ * @return {!goog.html.SafeScript} The value of {@code script}, wrapped in a
+ * SafeScript object.
+ */
+goog.html.uncheckedconversions.safeScriptFromStringKnownToSatisfyTypeContract =
+ function(justification, script) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmpty(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(
+ script);
+};
+
+
+/**
+ * Performs an "unchecked conversion" to SafeStyle from a plain string that is
+ * known to satisfy the SafeStyle type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code style} satisfies the SafeUrl type contract in all
+ * possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} style The string to wrap as a SafeStyle.
+ * @return {!goog.html.SafeStyle} The value of {@code style}, wrapped in a
+ * SafeStyle object.
+ */
+goog.html.uncheckedconversions.safeStyleFromStringKnownToSatisfyTypeContract =
+ function(justification, style) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(
+ style);
+};
+
+
+/**
+ * Performs an "unchecked conversion" to SafeStyleSheet from a plain string
+ * that is known to satisfy the SafeStyleSheet type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code styleSheet} satisfies the SafeUrl type contract in
+ * all possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} styleSheet The string to wrap as a SafeStyleSheet.
+ * @return {!goog.html.SafeStyleSheet} The value of {@code styleSheet}, wrapped
+ * in a SafeStyleSheet object.
+ */
+goog.html.uncheckedconversions
+ .safeStyleSheetFromStringKnownToSatisfyTypeContract = function(
+ justification, styleSheet) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.SafeStyleSheet
+ .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheet);
+};
+
+
+/**
+ * Performs an "unchecked conversion" to SafeUrl from a plain string that is
+ * known to satisfy the SafeUrl type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code url} satisfies the SafeUrl type contract in all
+ * possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} url The string to wrap as a SafeUrl.
+ * @return {!goog.html.SafeUrl} The value of {@code url}, wrapped in a SafeUrl
+ * object.
+ */
+goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract =
+ function(justification, url) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);
+};
+
+
+/**
+ * Performs an "unchecked conversion" to TrustedResourceUrl from a plain string
+ * that is known to satisfy the TrustedResourceUrl type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code url} satisfies the TrustedResourceUrl type contract
+ * in all possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} url The string to wrap as a TrustedResourceUrl.
+ * @return {!goog.html.TrustedResourceUrl} The value of {@code url}, wrapped in
+ * a TrustedResourceUrl object.
+ */
+goog.html.uncheckedconversions
+ .trustedResourceUrlFromStringKnownToSatisfyTypeContract = function(
+ justification, url) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.TrustedResourceUrl
+ .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(url);
+};
diff --git a/src/http/static/viz/1/goog/i18n/bidi.js b/src/http/static/viz/1/goog/i18n/bidi.js
new file mode 100644
index 0000000..695cfda
--- /dev/null
+++ b/src/http/static/viz/1/goog/i18n/bidi.js
@@ -0,0 +1,876 @@
+// Copyright 2007 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utility functions for supporting Bidi issues.
+ */
+
+
+/**
+ * Namespace for bidi supporting functions.
+ */
+goog.provide('goog.i18n.bidi');
+goog.provide('goog.i18n.bidi.Dir');
+goog.provide('goog.i18n.bidi.DirectionalString');
+goog.provide('goog.i18n.bidi.Format');
+
+
+/**
+ * @define {boolean} FORCE_RTL forces the {@link goog.i18n.bidi.IS_RTL} constant
+ * to say that the current locale is a RTL locale. This should only be used
+ * if you want to override the default behavior for deciding whether the
+ * current locale is RTL or not.
+ *
+ * {@see goog.i18n.bidi.IS_RTL}
+ */
+goog.define('goog.i18n.bidi.FORCE_RTL', false);
+
+
+/**
+ * Constant that defines whether or not the current locale is a RTL locale.
+ * If {@link goog.i18n.bidi.FORCE_RTL} is not true, this constant will default
+ * to check that {@link goog.LOCALE} is one of a few major RTL locales.
+ *
+ * <p>This is designed to be a maximally efficient compile-time constant. For
+ * example, for the default goog.LOCALE, compiling
+ * "if (goog.i18n.bidi.IS_RTL) alert('rtl') else {}" should produce no code. It
+ * is this design consideration that limits the implementation to only
+ * supporting a few major RTL locales, as opposed to the broader repertoire of
+ * something like goog.i18n.bidi.isRtlLanguage.
+ *
+ * <p>Since this constant refers to the directionality of the locale, it is up
+ * to the caller to determine if this constant should also be used for the
+ * direction of the UI.
+ *
+ * {@see goog.LOCALE}
+ *
+ * @type {boolean}
+ *
+ * TODO(user): write a test that checks that this is a compile-time constant.
+ */
+goog.i18n.bidi.IS_RTL = goog.i18n.bidi.FORCE_RTL ||
+ ((goog.LOCALE.substring(0, 2).toLowerCase() == 'ar' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'fa' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'he' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'iw' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'ps' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'sd' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'ug' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'ur' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'yi') &&
+ (goog.LOCALE.length == 2 || goog.LOCALE.substring(2, 3) == '-' ||
+ goog.LOCALE.substring(2, 3) == '_')) ||
+ (goog.LOCALE.length >= 3 &&
+ goog.LOCALE.substring(0, 3).toLowerCase() == 'ckb' &&
+ (goog.LOCALE.length == 3 || goog.LOCALE.substring(3, 4) == '-' ||
+ goog.LOCALE.substring(3, 4) == '_'));
+
+
+/**
+ * Unicode formatting characters and directionality string constants.
+ * @enum {string}
+ */
+goog.i18n.bidi.Format = {
+ /** Unicode "Left-To-Right Embedding" (LRE) character. */
+ LRE: '\u202A',
+ /** Unicode "Right-To-Left Embedding" (RLE) character. */
+ RLE: '\u202B',
+ /** Unicode "Pop Directional Formatting" (PDF) character. */
+ PDF: '\u202C',
+ /** Unicode "Left-To-Right Mark" (LRM) character. */
+ LRM: '\u200E',
+ /** Unicode "Right-To-Left Mark" (RLM) character. */
+ RLM: '\u200F'
+};
+
+
+/**
+ * Directionality enum.
+ * @enum {number}
+ */
+goog.i18n.bidi.Dir = {
+ /**
+ * Left-to-right.
+ */
+ LTR: 1,
+
+ /**
+ * Right-to-left.
+ */
+ RTL: -1,
+
+ /**
+ * Neither left-to-right nor right-to-left.
+ */
+ NEUTRAL: 0
+};
+
+
+/**
+ * 'right' string constant.
+ * @type {string}
+ */
+goog.i18n.bidi.RIGHT = 'right';
+
+
+/**
+ * 'left' string constant.
+ * @type {string}
+ */
+goog.i18n.bidi.LEFT = 'left';
+
+
+/**
+ * 'left' if locale is RTL, 'right' if not.
+ * @type {string}
+ */
+goog.i18n.bidi.I18N_RIGHT =
+ goog.i18n.bidi.IS_RTL ? goog.i18n.bidi.LEFT : goog.i18n.bidi.RIGHT;
+
+
+/**
+ * 'right' if locale is RTL, 'left' if not.
+ * @type {string}
+ */
+goog.i18n.bidi.I18N_LEFT =
+ goog.i18n.bidi.IS_RTL ? goog.i18n.bidi.RIGHT : goog.i18n.bidi.LEFT;
+
+
+/**
+ * Convert a directionality given in various formats to a goog.i18n.bidi.Dir
+ * constant. Useful for interaction with different standards of directionality
+ * representation.
+ *
+ * @param {goog.i18n.bidi.Dir|number|boolean|null} givenDir Directionality given
+ * in one of the following formats:
+ * 1. A goog.i18n.bidi.Dir constant.
+ * 2. A number (positive = LTR, negative = RTL, 0 = neutral).
+ * 3. A boolean (true = RTL, false = LTR).
+ * 4. A null for unknown directionality.
+ * @param {boolean=} opt_noNeutral Whether a givenDir of zero or
+ * goog.i18n.bidi.Dir.NEUTRAL should be treated as null, i.e. unknown, in
+ * order to preserve legacy behavior.
+ * @return {?goog.i18n.bidi.Dir} A goog.i18n.bidi.Dir constant matching the
+ * given directionality. If given null, returns null (i.e. unknown).
+ */
+goog.i18n.bidi.toDir = function(givenDir, opt_noNeutral) {
+ if (typeof givenDir == 'number') {
+ // This includes the non-null goog.i18n.bidi.Dir case.
+ return givenDir > 0 ? goog.i18n.bidi.Dir.LTR : givenDir < 0 ?
+ goog.i18n.bidi.Dir.RTL :
+ opt_noNeutral ? null : goog.i18n.bidi.Dir.NEUTRAL;
+ } else if (givenDir == null) {
+ return null;
+ } else {
+ // Must be typeof givenDir == 'boolean'.
+ return givenDir ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.LTR;
+ }
+};
+
+
+/**
+ * A practical pattern to identify strong LTR characters. This pattern is not
+ * theoretically correct according to the Unicode standard. It is simplified for
+ * performance and small code size.
+ * @type {string}
+ * @private
+ */
+goog.i18n.bidi.ltrChars_ =
+ 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF' +
+ '\u200E\u2C00-\uFB1C\uFE00-\uFE6F\uFEFD-\uFFFF';
+
+
+/**
+ * A practical pattern to identify strong RTL character. This pattern is not
+ * theoretically correct according to the Unicode standard. It is simplified
+ * for performance and small code size.
+ * @type {string}
+ * @private
+ */
+goog.i18n.bidi.rtlChars_ =
+ '\u0591-\u06EF\u06FA-\u07FF\u200F\uFB1D-\uFDFF\uFE70-\uFEFC';
+
+
+/**
+ * Simplified regular expression for an HTML tag (opening or closing) or an HTML
+ * escape. We might want to skip over such expressions when estimating the text
+ * directionality.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.htmlSkipReg_ = /<[^>]*>|&[^;]+;/g;
+
+
+/**
+ * Returns the input text with spaces instead of HTML tags or HTML escapes, if
+ * opt_isStripNeeded is true. Else returns the input as is.
+ * Useful for text directionality estimation.
+ * Note: the function should not be used in other contexts; it is not 100%
+ * correct, but rather a good-enough implementation for directionality
+ * estimation purposes.
+ * @param {string} str The given string.
+ * @param {boolean=} opt_isStripNeeded Whether to perform the stripping.
+ * Default: false (to retain consistency with calling functions).
+ * @return {string} The given string cleaned of HTML tags / escapes.
+ * @private
+ */
+goog.i18n.bidi.stripHtmlIfNeeded_ = function(str, opt_isStripNeeded) {
+ return opt_isStripNeeded ? str.replace(goog.i18n.bidi.htmlSkipReg_, '') : str;
+};
+
+
+/**
+ * Regular expression to check for RTL characters.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rtlCharReg_ = new RegExp('[' + goog.i18n.bidi.rtlChars_ + ']');
+
+
+/**
+ * Regular expression to check for LTR characters.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.ltrCharReg_ = new RegExp('[' + goog.i18n.bidi.ltrChars_ + ']');
+
+
+/**
+ * Test whether the given string has any RTL characters in it.
+ * @param {string} str The given string that need to be tested.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether the string contains RTL characters.
+ */
+goog.i18n.bidi.hasAnyRtl = function(str, opt_isHtml) {
+ return goog.i18n.bidi.rtlCharReg_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Test whether the given string has any RTL characters in it.
+ * @param {string} str The given string that need to be tested.
+ * @return {boolean} Whether the string contains RTL characters.
+ * @deprecated Use hasAnyRtl.
+ */
+goog.i18n.bidi.hasRtlChar = goog.i18n.bidi.hasAnyRtl;
+
+
+/**
+ * Test whether the given string has any LTR characters in it.
+ * @param {string} str The given string that need to be tested.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether the string contains LTR characters.
+ */
+goog.i18n.bidi.hasAnyLtr = function(str, opt_isHtml) {
+ return goog.i18n.bidi.ltrCharReg_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Regular expression pattern to check if the first character in the string
+ * is LTR.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.ltrRe_ = new RegExp('^[' + goog.i18n.bidi.ltrChars_ + ']');
+
+
+/**
+ * Regular expression pattern to check if the first character in the string
+ * is RTL.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rtlRe_ = new RegExp('^[' + goog.i18n.bidi.rtlChars_ + ']');
+
+
+/**
+ * Check if the first character in the string is RTL or not.
+ * @param {string} str The given string that need to be tested.
+ * @return {boolean} Whether the first character in str is an RTL char.
+ */
+goog.i18n.bidi.isRtlChar = function(str) {
+ return goog.i18n.bidi.rtlRe_.test(str);
+};
+
+
+/**
+ * Check if the first character in the string is LTR or not.
+ * @param {string} str The given string that need to be tested.
+ * @return {boolean} Whether the first character in str is an LTR char.
+ */
+goog.i18n.bidi.isLtrChar = function(str) {
+ return goog.i18n.bidi.ltrRe_.test(str);
+};
+
+
+/**
+ * Check if the first character in the string is neutral or not.
+ * @param {string} str The given string that need to be tested.
+ * @return {boolean} Whether the first character in str is a neutral char.
+ */
+goog.i18n.bidi.isNeutralChar = function(str) {
+ return !goog.i18n.bidi.isLtrChar(str) && !goog.i18n.bidi.isRtlChar(str);
+};
+
+
+/**
+ * Regular expressions to check if a piece of text is of LTR directionality
+ * on first character with strong directionality.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.ltrDirCheckRe_ = new RegExp(
+ '^[^' + goog.i18n.bidi.rtlChars_ + ']*[' + goog.i18n.bidi.ltrChars_ + ']');
+
+
+/**
+ * Regular expressions to check if a piece of text is of RTL directionality
+ * on first character with strong directionality.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rtlDirCheckRe_ = new RegExp(
+ '^[^' + goog.i18n.bidi.ltrChars_ + ']*[' + goog.i18n.bidi.rtlChars_ + ']');
+
+
+/**
+ * Check whether the first strongly directional character (if any) is RTL.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether RTL directionality is detected using the first
+ * strongly-directional character method.
+ */
+goog.i18n.bidi.startsWithRtl = function(str, opt_isHtml) {
+ return goog.i18n.bidi.rtlDirCheckRe_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Check whether the first strongly directional character (if any) is RTL.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether RTL directionality is detected using the first
+ * strongly-directional character method.
+ * @deprecated Use startsWithRtl.
+ */
+goog.i18n.bidi.isRtlText = goog.i18n.bidi.startsWithRtl;
+
+
+/**
+ * Check whether the first strongly directional character (if any) is LTR.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether LTR directionality is detected using the first
+ * strongly-directional character method.
+ */
+goog.i18n.bidi.startsWithLtr = function(str, opt_isHtml) {
+ return goog.i18n.bidi.ltrDirCheckRe_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Check whether the first strongly directional character (if any) is LTR.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether LTR directionality is detected using the first
+ * strongly-directional character method.
+ * @deprecated Use startsWithLtr.
+ */
+goog.i18n.bidi.isLtrText = goog.i18n.bidi.startsWithLtr;
+
+
+/**
+ * Regular expression to check if a string looks like something that must
+ * always be LTR even in RTL text, e.g. a URL. When estimating the
+ * directionality of text containing these, we treat these as weakly LTR,
+ * like numbers.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.isRequiredLtrRe_ = /^http:\/\/.*/;
+
+
+/**
+ * Check whether the input string either contains no strongly directional
+ * characters or looks like a url.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether neutral directionality is detected.
+ */
+goog.i18n.bidi.isNeutralText = function(str, opt_isHtml) {
+ str = goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml);
+ return goog.i18n.bidi.isRequiredLtrRe_.test(str) ||
+ !goog.i18n.bidi.hasAnyLtr(str) && !goog.i18n.bidi.hasAnyRtl(str);
+};
+
+
+/**
+ * Regular expressions to check if the last strongly-directional character in a
+ * piece of text is LTR.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.ltrExitDirCheckRe_ = new RegExp(
+ '[' + goog.i18n.bidi.ltrChars_ + '][^' + goog.i18n.bidi.rtlChars_ + ']*$');
+
+
+/**
+ * Regular expressions to check if the last strongly-directional character in a
+ * piece of text is RTL.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rtlExitDirCheckRe_ = new RegExp(
+ '[' + goog.i18n.bidi.rtlChars_ + '][^' + goog.i18n.bidi.ltrChars_ + ']*$');
+
+
+/**
+ * Check if the exit directionality a piece of text is LTR, i.e. if the last
+ * strongly-directional character in the string is LTR.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether LTR exit directionality was detected.
+ */
+goog.i18n.bidi.endsWithLtr = function(str, opt_isHtml) {
+ return goog.i18n.bidi.ltrExitDirCheckRe_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Check if the exit directionality a piece of text is LTR, i.e. if the last
+ * strongly-directional character in the string is LTR.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether LTR exit directionality was detected.
+ * @deprecated Use endsWithLtr.
+ */
+goog.i18n.bidi.isLtrExitText = goog.i18n.bidi.endsWithLtr;
+
+
+/**
+ * Check if the exit directionality a piece of text is RTL, i.e. if the last
+ * strongly-directional character in the string is RTL.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether RTL exit directionality was detected.
+ */
+goog.i18n.bidi.endsWithRtl = function(str, opt_isHtml) {
+ return goog.i18n.bidi.rtlExitDirCheckRe_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Check if the exit directionality a piece of text is RTL, i.e. if the last
+ * strongly-directional character in the string is RTL.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether RTL exit directionality was detected.
+ * @deprecated Use endsWithRtl.
+ */
+goog.i18n.bidi.isRtlExitText = goog.i18n.bidi.endsWithRtl;
+
+
+/**
+ * A regular expression for matching right-to-left language codes.
+ * See {@link #isRtlLanguage} for the design.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rtlLocalesRe_ = new RegExp(
+ '^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|' +
+ '.*[-_](Arab|Hebr|Thaa|Nkoo|Tfng))' +
+ '(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)',
+ 'i');
+
+
+/**
+ * Check if a BCP 47 / III language code indicates an RTL language, i.e. either:
+ * - a language code explicitly specifying one of the right-to-left scripts,
+ * e.g. "az-Arab", or<p>
+ * - a language code specifying one of the languages normally written in a
+ * right-to-left script, e.g. "fa" (Farsi), except ones explicitly specifying
+ * Latin or Cyrillic script (which are the usual LTR alternatives).<p>
+ * The list of right-to-left scripts appears in the 100-199 range in
+ * http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic and
+ * Hebrew are by far the most widely used. We also recognize Thaana, N'Ko, and
+ * Tifinagh, which also have significant modern usage. The rest (Syriac,
+ * Samaritan, Mandaic, etc.) seem to have extremely limited or no modern usage
+ * and are not recognized to save on code size.
+ * The languages usually written in a right-to-left script are taken as those
+ * with Suppress-Script: Hebr|Arab|Thaa|Nkoo|Tfng in
+ * http://www.iana.org/assignments/language-subtag-registry,
+ * as well as Central (or Sorani) Kurdish (ckb), Sindhi (sd) and Uyghur (ug).
+ * Other subtags of the language code, e.g. regions like EG (Egypt), are
+ * ignored.
+ * @param {string} lang BCP 47 (a.k.a III) language code.
+ * @return {boolean} Whether the language code is an RTL language.
+ */
+goog.i18n.bidi.isRtlLanguage = function(lang) {
+ return goog.i18n.bidi.rtlLocalesRe_.test(lang);
+};
+
+
+/**
+ * Regular expression for bracket guard replacement in text.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.bracketGuardTextRe_ =
+ /(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)/g;
+
+
+/**
+ * Apply bracket guard using LRM and RLM. This is to address the problem of
+ * messy bracket display frequently happens in RTL layout.
+ * This function works for plain text, not for HTML. In HTML, the opening
+ * bracket might be in a different context than the closing bracket (such as
+ * an attribute value).
+ * @param {string} s The string that need to be processed.
+ * @param {boolean=} opt_isRtlContext specifies default direction (usually
+ * direction of the UI).
+ * @return {string} The processed string, with all bracket guarded.
+ */
+goog.i18n.bidi.guardBracketInText = function(s, opt_isRtlContext) {
+ var useRtl = opt_isRtlContext === undefined ? goog.i18n.bidi.hasAnyRtl(s) :
+ opt_isRtlContext;
+ var mark = useRtl ? goog.i18n.bidi.Format.RLM : goog.i18n.bidi.Format.LRM;
+ return s.replace(goog.i18n.bidi.bracketGuardTextRe_, mark + '$&' + mark);
+};
+
+
+/**
+ * Enforce the html snippet in RTL directionality regardless overall context.
+ * If the html piece was enclosed by tag, dir will be applied to existing
+ * tag, otherwise a span tag will be added as wrapper. For this reason, if
+ * html snippet start with with tag, this tag must enclose the whole piece. If
+ * the tag already has a dir specified, this new one will override existing
+ * one in behavior (tested on FF and IE).
+ * @param {string} html The string that need to be processed.
+ * @return {string} The processed string, with directionality enforced to RTL.
+ */
+goog.i18n.bidi.enforceRtlInHtml = function(html) {
+ if (html.charAt(0) == '<') {
+ return html.replace(/<\w+/, '$& dir=rtl');
+ }
+ // '\n' is important for FF so that it won't incorrectly merge span groups
+ return '\n<span dir=rtl>' + html + '</span>';
+};
+
+
+/**
+ * Enforce RTL on both end of the given text piece using unicode BiDi formatting
+ * characters RLE and PDF.
+ * @param {string} text The piece of text that need to be wrapped.
+ * @return {string} The wrapped string after process.
+ */
+goog.i18n.bidi.enforceRtlInText = function(text) {
+ return goog.i18n.bidi.Format.RLE + text + goog.i18n.bidi.Format.PDF;
+};
+
+
+/**
+ * Enforce the html snippet in RTL directionality regardless overall context.
+ * If the html piece was enclosed by tag, dir will be applied to existing
+ * tag, otherwise a span tag will be added as wrapper. For this reason, if
+ * html snippet start with with tag, this tag must enclose the whole piece. If
+ * the tag already has a dir specified, this new one will override existing
+ * one in behavior (tested on FF and IE).
+ * @param {string} html The string that need to be processed.
+ * @return {string} The processed string, with directionality enforced to RTL.
+ */
+goog.i18n.bidi.enforceLtrInHtml = function(html) {
+ if (html.charAt(0) == '<') {
+ return html.replace(/<\w+/, '$& dir=ltr');
+ }
+ // '\n' is important for FF so that it won't incorrectly merge span groups
+ return '\n<span dir=ltr>' + html + '</span>';
+};
+
+
+/**
+ * Enforce LTR on both end of the given text piece using unicode BiDi formatting
+ * characters LRE and PDF.
+ * @param {string} text The piece of text that need to be wrapped.
+ * @return {string} The wrapped string after process.
+ */
+goog.i18n.bidi.enforceLtrInText = function(text) {
+ return goog.i18n.bidi.Format.LRE + text + goog.i18n.bidi.Format.PDF;
+};
+
+
+/**
+ * Regular expression to find dimensions such as "padding: .3 0.4ex 5px 6;"
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.dimensionsRe_ =
+ /:\s*([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)/g;
+
+
+/**
+ * Regular expression for left.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.leftRe_ = /left/gi;
+
+
+/**
+ * Regular expression for right.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rightRe_ = /right/gi;
+
+
+/**
+ * Placeholder regular expression for swapping.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.tempRe_ = /%%%%/g;
+
+
+/**
+ * Swap location parameters and 'left'/'right' in CSS specification. The
+ * processed string will be suited for RTL layout. Though this function can
+ * cover most cases, there are always exceptions. It is suggested to put
+ * those exceptions in separate group of CSS string.
+ * @param {string} cssStr CSS spefication string.
+ * @return {string} Processed CSS specification string.
+ */
+goog.i18n.bidi.mirrorCSS = function(cssStr) {
+ return cssStr
+ .
+ // reverse dimensions
+ replace(goog.i18n.bidi.dimensionsRe_, ':$1 $4 $3 $2')
+ .replace(goog.i18n.bidi.leftRe_, '%%%%')
+ . // swap left and right
+ replace(goog.i18n.bidi.rightRe_, goog.i18n.bidi.LEFT)
+ .replace(goog.i18n.bidi.tempRe_, goog.i18n.bidi.RIGHT);
+};
+
+
+/**
+ * Regular expression for hebrew double quote substitution, finding quote
+ * directly after hebrew characters.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.doubleQuoteSubstituteRe_ = /([\u0591-\u05f2])"/g;
+
+
+/**
+ * Regular expression for hebrew single quote substitution, finding quote
+ * directly after hebrew characters.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.singleQuoteSubstituteRe_ = /([\u0591-\u05f2])'/g;
+
+
+/**
+ * Replace the double and single quote directly after a Hebrew character with
+ * GERESH and GERSHAYIM. In such case, most likely that's user intention.
+ * @param {string} str String that need to be processed.
+ * @return {string} Processed string with double/single quote replaced.
+ */
+goog.i18n.bidi.normalizeHebrewQuote = function(str) {
+ return str.replace(goog.i18n.bidi.doubleQuoteSubstituteRe_, '$1\u05f4')
+ .replace(goog.i18n.bidi.singleQuoteSubstituteRe_, '$1\u05f3');
+};
+
+
+/**
+ * Regular expression to split a string into "words" for directionality
+ * estimation based on relative word counts.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.wordSeparatorRe_ = /\s+/;
+
+
+/**
+ * Regular expression to check if a string contains any numerals. Used to
+ * differentiate between completely neutral strings and those containing
+ * numbers, which are weakly LTR.
+ *
+ * Native Arabic digits (\u0660 - \u0669) are not included because although they
+ * do flow left-to-right inside a number, this is the case even if the overall
+ * directionality is RTL, and a mathematical expression using these digits is
+ * supposed to flow right-to-left overall, including unary plus and minus
+ * appearing to the right of a number, and this does depend on the overall
+ * directionality being RTL. The digits used in Farsi (\u06F0 - \u06F9), on the
+ * other hand, are included, since Farsi math (including unary plus and minus)
+ * does flow left-to-right.
+ *
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.hasNumeralsRe_ = /[\d\u06f0-\u06f9]/;
+
+
+/**
+ * This constant controls threshold of RTL directionality.
+ * @type {number}
+ * @private
+ */
+goog.i18n.bidi.rtlDetectionThreshold_ = 0.40;
+
+
+/**
+ * Estimates the directionality of a string based on relative word counts.
+ * If the number of RTL words is above a certain percentage of the total number
+ * of strongly directional words, returns RTL.
+ * Otherwise, if any words are strongly or weakly LTR, returns LTR.
+ * Otherwise, returns UNKNOWN, which is used to mean "neutral".
+ * Numbers are counted as weakly LTR.
+ * @param {string} str The string to be checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {goog.i18n.bidi.Dir} Estimated overall directionality of {@code str}.
+ */
+goog.i18n.bidi.estimateDirection = function(str, opt_isHtml) {
+ var rtlCount = 0;
+ var totalCount = 0;
+ var hasWeaklyLtr = false;
+ var tokens = goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml)
+ .split(goog.i18n.bidi.wordSeparatorRe_);
+ for (var i = 0; i < tokens.length; i++) {
+ var token = tokens[i];
+ if (goog.i18n.bidi.startsWithRtl(token)) {
+ rtlCount++;
+ totalCount++;
+ } else if (goog.i18n.bidi.isRequiredLtrRe_.test(token)) {
+ hasWeaklyLtr = true;
+ } else if (goog.i18n.bidi.hasAnyLtr(token)) {
+ totalCount++;
+ } else if (goog.i18n.bidi.hasNumeralsRe_.test(token)) {
+ hasWeaklyLtr = true;
+ }
+ }
+
+ return totalCount == 0 ?
+ (hasWeaklyLtr ? goog.i18n.bidi.Dir.LTR : goog.i18n.bidi.Dir.NEUTRAL) :
+ (rtlCount / totalCount > goog.i18n.bidi.rtlDetectionThreshold_ ?
+ goog.i18n.bidi.Dir.RTL :
+ goog.i18n.bidi.Dir.LTR);
+};
+
+
+/**
+ * Check the directionality of a piece of text, return true if the piece of
+ * text should be laid out in RTL direction.
+ * @param {string} str The piece of text that need to be detected.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether this piece of text should be laid out in RTL.
+ */
+goog.i18n.bidi.detectRtlDirectionality = function(str, opt_isHtml) {
+ return goog.i18n.bidi.estimateDirection(str, opt_isHtml) ==
+ goog.i18n.bidi.Dir.RTL;
+};
+
+
+/**
+ * Sets text input element's directionality and text alignment based on a
+ * given directionality. Does nothing if the given directionality is unknown or
+ * neutral.
+ * @param {Element} element Input field element to set directionality to.
+ * @param {goog.i18n.bidi.Dir|number|boolean|null} dir Desired directionality,
+ * given in one of the following formats:
+ * 1. A goog.i18n.bidi.Dir constant.
+ * 2. A number (positive = LRT, negative = RTL, 0 = neutral).
+ * 3. A boolean (true = RTL, false = LTR).
+ * 4. A null for unknown directionality.
+ */
+goog.i18n.bidi.setElementDirAndAlign = function(element, dir) {
+ if (element) {
+ dir = goog.i18n.bidi.toDir(dir);
+ if (dir) {
+ element.style.textAlign = dir == goog.i18n.bidi.Dir.RTL ?
+ goog.i18n.bidi.RIGHT :
+ goog.i18n.bidi.LEFT;
+ element.dir = dir == goog.i18n.bidi.Dir.RTL ? 'rtl' : 'ltr';
+ }
+ }
+};
+
+
+/**
+ * Sets element dir based on estimated directionality of the given text.
+ * @param {!Element} element
+ * @param {string} text
+ */
+goog.i18n.bidi.setElementDirByTextDirectionality = function(element, text) {
+ switch (goog.i18n.bidi.estimateDirection(text)) {
+ case (goog.i18n.bidi.Dir.LTR):
+ element.dir = 'ltr';
+ break;
+ case (goog.i18n.bidi.Dir.RTL):
+ element.dir = 'rtl';
+ break;
+ default:
+ // Default for no direction, inherit from document.
+ element.removeAttribute('dir');
+ }
+};
+
+
+
+/**
+ * Strings that have an (optional) known direction.
+ *
+ * Implementations of this interface are string-like objects that carry an
+ * attached direction, if known.
+ * @interface
+ */
+goog.i18n.bidi.DirectionalString = function() {};
+
+
+/**
+ * Interface marker of the DirectionalString interface.
+ *
+ * This property can be used to determine at runtime whether or not an object
+ * implements this interface. All implementations of this interface set this
+ * property to {@code true}.
+ * @type {boolean}
+ */
+goog.i18n.bidi.DirectionalString.prototype
+ .implementsGoogI18nBidiDirectionalString;
+
+
+/**
+ * Retrieves this object's known direction (if any).
+ * @return {?goog.i18n.bidi.Dir} The known direction. Null if unknown.
+ */
+goog.i18n.bidi.DirectionalString.prototype.getDirection;
diff --git a/src/http/static/viz/1/goog/labs/useragent/browser.js b/src/http/static/viz/1/goog/labs/useragent/browser.js
new file mode 100644
index 0000000..a7dd638
--- /dev/null
+++ b/src/http/static/viz/1/goog/labs/useragent/browser.js
@@ -0,0 +1,338 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Closure user agent detection (Browser).
+ * @see <a href="http://www.useragentstring.com/">User agent strings</a>
+ * For more information on rendering engine, platform, or device see the other
+ * sub-namespaces in goog.labs.userAgent, goog.labs.userAgent.platform,
+ * goog.labs.userAgent.device respectively.)
+ *
+ * @author martone@google.com (Andy Martone)
+ */
+
+goog.provide('goog.labs.userAgent.browser');
+
+goog.require('goog.array');
+goog.require('goog.labs.userAgent.util');
+goog.require('goog.object');
+goog.require('goog.string');
+
+
+// TODO(nnaze): Refactor to remove excessive exclusion logic in matching
+// functions.
+
+
+/**
+ * @return {boolean} Whether the user's browser is Opera. Note: Chromium
+ * based Opera (Opera 15+) is detected as Chrome to avoid unnecessary
+ * special casing.
+ * @private
+ */
+goog.labs.userAgent.browser.matchOpera_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Opera');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is IE.
+ * @private
+ */
+goog.labs.userAgent.browser.matchIE_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Trident') ||
+ goog.labs.userAgent.util.matchUserAgent('MSIE');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Edge.
+ * @private
+ */
+goog.labs.userAgent.browser.matchEdge_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Edge');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Firefox.
+ * @private
+ */
+goog.labs.userAgent.browser.matchFirefox_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Firefox');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Safari.
+ * @private
+ */
+goog.labs.userAgent.browser.matchSafari_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Safari') &&
+ !(goog.labs.userAgent.browser.matchChrome_() ||
+ goog.labs.userAgent.browser.matchCoast_() ||
+ goog.labs.userAgent.browser.matchOpera_() ||
+ goog.labs.userAgent.browser.matchEdge_() ||
+ goog.labs.userAgent.browser.isSilk() ||
+ goog.labs.userAgent.util.matchUserAgent('Android'));
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Coast (Opera's Webkit-based
+ * iOS browser).
+ * @private
+ */
+goog.labs.userAgent.browser.matchCoast_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Coast');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is iOS Webview.
+ * @private
+ */
+goog.labs.userAgent.browser.matchIosWebview_ = function() {
+ // iOS Webview does not show up as Chrome or Safari. Also check for Opera's
+ // WebKit-based iOS browser, Coast.
+ return (goog.labs.userAgent.util.matchUserAgent('iPad') ||
+ goog.labs.userAgent.util.matchUserAgent('iPhone')) &&
+ !goog.labs.userAgent.browser.matchSafari_() &&
+ !goog.labs.userAgent.browser.matchChrome_() &&
+ !goog.labs.userAgent.browser.matchCoast_() &&
+ goog.labs.userAgent.util.matchUserAgent('AppleWebKit');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Chrome.
+ * @private
+ */
+goog.labs.userAgent.browser.matchChrome_ = function() {
+ return (goog.labs.userAgent.util.matchUserAgent('Chrome') ||
+ goog.labs.userAgent.util.matchUserAgent('CriOS')) &&
+ !goog.labs.userAgent.browser.matchEdge_();
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is the Android browser.
+ * @private
+ */
+goog.labs.userAgent.browser.matchAndroidBrowser_ = function() {
+ // Android can appear in the user agent string for Chrome on Android.
+ // This is not the Android standalone browser if it does.
+ return goog.labs.userAgent.util.matchUserAgent('Android') &&
+ !(goog.labs.userAgent.browser.isChrome() ||
+ goog.labs.userAgent.browser.isFirefox() ||
+ goog.labs.userAgent.browser.isOpera() ||
+ goog.labs.userAgent.browser.isSilk());
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Opera.
+ */
+goog.labs.userAgent.browser.isOpera = goog.labs.userAgent.browser.matchOpera_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is IE.
+ */
+goog.labs.userAgent.browser.isIE = goog.labs.userAgent.browser.matchIE_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is Edge.
+ */
+goog.labs.userAgent.browser.isEdge = goog.labs.userAgent.browser.matchEdge_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is Firefox.
+ */
+goog.labs.userAgent.browser.isFirefox =
+ goog.labs.userAgent.browser.matchFirefox_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is Safari.
+ */
+goog.labs.userAgent.browser.isSafari = goog.labs.userAgent.browser.matchSafari_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is Coast (Opera's Webkit-based
+ * iOS browser).
+ */
+goog.labs.userAgent.browser.isCoast = goog.labs.userAgent.browser.matchCoast_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is iOS Webview.
+ */
+goog.labs.userAgent.browser.isIosWebview =
+ goog.labs.userAgent.browser.matchIosWebview_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is Chrome.
+ */
+goog.labs.userAgent.browser.isChrome = goog.labs.userAgent.browser.matchChrome_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is the Android browser.
+ */
+goog.labs.userAgent.browser.isAndroidBrowser =
+ goog.labs.userAgent.browser.matchAndroidBrowser_;
+
+
+/**
+ * For more information, see:
+ * http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html
+ * @return {boolean} Whether the user's browser is Silk.
+ */
+goog.labs.userAgent.browser.isSilk = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Silk');
+};
+
+
+/**
+ * @return {string} The browser version or empty string if version cannot be
+ * determined. Note that for Internet Explorer, this returns the version of
+ * the browser, not the version of the rendering engine. (IE 8 in
+ * compatibility mode will return 8.0 rather than 7.0. To determine the
+ * rendering engine version, look at document.documentMode instead. See
+ * http://msdn.microsoft.com/en-us/library/cc196988(v=vs.85).aspx for more
+ * details.)
+ */
+goog.labs.userAgent.browser.getVersion = function() {
+ var userAgentString = goog.labs.userAgent.util.getUserAgent();
+ // Special case IE since IE's version is inside the parenthesis and
+ // without the '/'.
+ if (goog.labs.userAgent.browser.isIE()) {
+ return goog.labs.userAgent.browser.getIEVersion_(userAgentString);
+ }
+
+ var versionTuples =
+ goog.labs.userAgent.util.extractVersionTuples(userAgentString);
+
+ // Construct a map for easy lookup.
+ var versionMap = {};
+ goog.array.forEach(versionTuples, function(tuple) {
+ // Note that the tuple is of length three, but we only care about the
+ // first two.
+ var key = tuple[0];
+ var value = tuple[1];
+ versionMap[key] = value;
+ });
+
+ var versionMapHasKey = goog.partial(goog.object.containsKey, versionMap);
+
+ // Gives the value with the first key it finds, otherwise empty string.
+ function lookUpValueWithKeys(keys) {
+ var key = goog.array.find(keys, versionMapHasKey);
+ return versionMap[key] || '';
+ }
+
+ // Check Opera before Chrome since Opera 15+ has "Chrome" in the string.
+ // See
+ // http://my.opera.com/ODIN/blog/2013/07/15/opera-user-agent-strings-opera-15-and-beyond
+ if (goog.labs.userAgent.browser.isOpera()) {
+ // Opera 10 has Version/10.0 but Opera/9.8, so look for "Version" first.
+ // Opera uses 'OPR' for more recent UAs.
+ return lookUpValueWithKeys(['Version', 'Opera']);
+ }
+
+ // Check Edge before Chrome since it has Chrome in the string.
+ if (goog.labs.userAgent.browser.isEdge()) {
+ return lookUpValueWithKeys(['Edge']);
+ }
+
+ if (goog.labs.userAgent.browser.isChrome()) {
+ return lookUpValueWithKeys(['Chrome', 'CriOS']);
+ }
+
+ // Usually products browser versions are in the third tuple after "Mozilla"
+ // and the engine.
+ var tuple = versionTuples[2];
+ return tuple && tuple[1] || '';
+};
+
+
+/**
+ * @param {string|number} version The version to check.
+ * @return {boolean} Whether the browser version is higher or the same as the
+ * given version.
+ */
+goog.labs.userAgent.browser.isVersionOrHigher = function(version) {
+ return goog.string.compareVersions(
+ goog.labs.userAgent.browser.getVersion(), version) >= 0;
+};
+
+
+/**
+ * Determines IE version. More information:
+ * http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx#uaString
+ * http://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx
+ * http://blogs.msdn.com/b/ie/archive/2010/03/23/introducing-ie9-s-user-agent-string.aspx
+ * http://blogs.msdn.com/b/ie/archive/2009/01/09/the-internet-explorer-8-user-agent-string-updated-edition.aspx
+ *
+ * @param {string} userAgent the User-Agent.
+ * @return {string}
+ * @private
+ */
+goog.labs.userAgent.browser.getIEVersion_ = function(userAgent) {
+ // IE11 may identify itself as MSIE 9.0 or MSIE 10.0 due to an IE 11 upgrade
+ // bug. Example UA:
+ // Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)
+ // like Gecko.
+ // See http://www.whatismybrowser.com/developers/unknown-user-agent-fragments.
+ var rv = /rv: *([\d\.]*)/.exec(userAgent);
+ if (rv && rv[1]) {
+ return rv[1];
+ }
+
+ var version = '';
+ var msie = /MSIE +([\d\.]+)/.exec(userAgent);
+ if (msie && msie[1]) {
+ // IE in compatibility mode usually identifies itself as MSIE 7.0; in this
+ // case, use the Trident version to determine the version of IE. For more
+ // details, see the links above.
+ var tridentVersion = /Trident\/(\d.\d)/.exec(userAgent);
+ if (msie[1] == '7.0') {
+ if (tridentVersion && tridentVersion[1]) {
+ switch (tridentVersion[1]) {
+ case '4.0':
+ version = '8.0';
+ break;
+ case '5.0':
+ version = '9.0';
+ break;
+ case '6.0':
+ version = '10.0';
+ break;
+ case '7.0':
+ version = '11.0';
+ break;
+ }
+ } else {
+ version = '7.0';
+ }
+ } else {
+ version = msie[1];
+ }
+ }
+ return version;
+};
diff --git a/src/http/static/viz/1/goog/labs/useragent/engine.js b/src/http/static/viz/1/goog/labs/useragent/engine.js
new file mode 100644
index 0000000..31c5667
--- /dev/null
+++ b/src/http/static/viz/1/goog/labs/useragent/engine.js
@@ -0,0 +1,156 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Closure user agent detection.
+ * @see http://en.wikipedia.org/wiki/User_agent
+ * For more information on browser brand, platform, or device see the other
+ * sub-namespaces in goog.labs.userAgent (browser, platform, and device).
+ *
+ */
+
+goog.provide('goog.labs.userAgent.engine');
+
+goog.require('goog.array');
+goog.require('goog.labs.userAgent.util');
+goog.require('goog.string');
+
+
+/**
+ * @return {boolean} Whether the rendering engine is Presto.
+ */
+goog.labs.userAgent.engine.isPresto = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Presto');
+};
+
+
+/**
+ * @return {boolean} Whether the rendering engine is Trident.
+ */
+goog.labs.userAgent.engine.isTrident = function() {
+ // IE only started including the Trident token in IE8.
+ return goog.labs.userAgent.util.matchUserAgent('Trident') ||
+ goog.labs.userAgent.util.matchUserAgent('MSIE');
+};
+
+
+/**
+ * @return {boolean} Whether the rendering engine is Edge.
+ */
+goog.labs.userAgent.engine.isEdge = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Edge');
+};
+
+
+/**
+ * @return {boolean} Whether the rendering engine is WebKit.
+ */
+goog.labs.userAgent.engine.isWebKit = function() {
+ return goog.labs.userAgent.util.matchUserAgentIgnoreCase('WebKit') &&
+ !goog.labs.userAgent.engine.isEdge();
+};
+
+
+/**
+ * @return {boolean} Whether the rendering engine is Gecko.
+ */
+goog.labs.userAgent.engine.isGecko = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Gecko') &&
+ !goog.labs.userAgent.engine.isWebKit() &&
+ !goog.labs.userAgent.engine.isTrident() &&
+ !goog.labs.userAgent.engine.isEdge();
+};
+
+
+/**
+ * @return {string} The rendering engine's version or empty string if version
+ * can't be determined.
+ */
+goog.labs.userAgent.engine.getVersion = function() {
+ var userAgentString = goog.labs.userAgent.util.getUserAgent();
+ if (userAgentString) {
+ var tuples = goog.labs.userAgent.util.extractVersionTuples(userAgentString);
+
+ var engineTuple = goog.labs.userAgent.engine.getEngineTuple_(tuples);
+ if (engineTuple) {
+ // In Gecko, the version string is either in the browser info or the
+ // Firefox version. See Gecko user agent string reference:
+ // http://goo.gl/mULqa
+ if (engineTuple[0] == 'Gecko') {
+ return goog.labs.userAgent.engine.getVersionForKey_(tuples, 'Firefox');
+ }
+
+ return engineTuple[1];
+ }
+
+ // MSIE has only one version identifier, and the Trident version is
+ // specified in the parenthetical. IE Edge is covered in the engine tuple
+ // detection.
+ var browserTuple = tuples[0];
+ var info;
+ if (browserTuple && (info = browserTuple[2])) {
+ var match = /Trident\/([^\s;]+)/.exec(info);
+ if (match) {
+ return match[1];
+ }
+ }
+ }
+ return '';
+};
+
+
+/**
+ * @param {!Array<!Array<string>>} tuples Extracted version tuples.
+ * @return {!Array<string>|undefined} The engine tuple or undefined if not
+ * found.
+ * @private
+ */
+goog.labs.userAgent.engine.getEngineTuple_ = function(tuples) {
+ if (!goog.labs.userAgent.engine.isEdge()) {
+ return tuples[1];
+ }
+ for (var i = 0; i < tuples.length; i++) {
+ var tuple = tuples[i];
+ if (tuple[0] == 'Edge') {
+ return tuple;
+ }
+ }
+};
+
+
+/**
+ * @param {string|number} version The version to check.
+ * @return {boolean} Whether the rendering engine version is higher or the same
+ * as the given version.
+ */
+goog.labs.userAgent.engine.isVersionOrHigher = function(version) {
+ return goog.string.compareVersions(
+ goog.labs.userAgent.engine.getVersion(), version) >= 0;
+};
+
+
+/**
+ * @param {!Array<!Array<string>>} tuples Version tuples.
+ * @param {string} key The key to look for.
+ * @return {string} The version string of the given key, if present.
+ * Otherwise, the empty string.
+ * @private
+ */
+goog.labs.userAgent.engine.getVersionForKey_ = function(tuples, key) {
+ // TODO(nnaze): Move to util if useful elsewhere.
+
+ var pair = goog.array.find(tuples, function(pair) { return key == pair[0]; });
+
+ return pair && pair[1] || '';
+};
diff --git a/src/http/static/viz/1/goog/labs/useragent/platform.js b/src/http/static/viz/1/goog/labs/useragent/platform.js
new file mode 100644
index 0000000..9c72402
--- /dev/null
+++ b/src/http/static/viz/1/goog/labs/useragent/platform.js
@@ -0,0 +1,160 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Closure user agent platform detection.
+ * @see <a href="http://www.useragentstring.com/">User agent strings</a>
+ * For more information on browser brand, rendering engine, or device see the
+ * other sub-namespaces in goog.labs.userAgent (browser, engine, and device
+ * respectively).
+ *
+ */
+
+goog.provide('goog.labs.userAgent.platform');
+
+goog.require('goog.labs.userAgent.util');
+goog.require('goog.string');
+
+
+/**
+ * @return {boolean} Whether the platform is Android.
+ */
+goog.labs.userAgent.platform.isAndroid = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Android');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is iPod.
+ */
+goog.labs.userAgent.platform.isIpod = function() {
+ return goog.labs.userAgent.util.matchUserAgent('iPod');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is iPhone.
+ */
+goog.labs.userAgent.platform.isIphone = function() {
+ return goog.labs.userAgent.util.matchUserAgent('iPhone') &&
+ !goog.labs.userAgent.util.matchUserAgent('iPod') &&
+ !goog.labs.userAgent.util.matchUserAgent('iPad');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is iPad.
+ */
+goog.labs.userAgent.platform.isIpad = function() {
+ return goog.labs.userAgent.util.matchUserAgent('iPad');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is iOS.
+ */
+goog.labs.userAgent.platform.isIos = function() {
+ return goog.labs.userAgent.platform.isIphone() ||
+ goog.labs.userAgent.platform.isIpad() ||
+ goog.labs.userAgent.platform.isIpod();
+};
+
+
+/**
+ * @return {boolean} Whether the platform is Mac.
+ */
+goog.labs.userAgent.platform.isMacintosh = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Macintosh');
+};
+
+
+/**
+ * Note: ChromeOS is not considered to be Linux as it does not report itself
+ * as Linux in the user agent string.
+ * @return {boolean} Whether the platform is Linux.
+ */
+goog.labs.userAgent.platform.isLinux = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Linux');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is Windows.
+ */
+goog.labs.userAgent.platform.isWindows = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Windows');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is ChromeOS.
+ */
+goog.labs.userAgent.platform.isChromeOS = function() {
+ return goog.labs.userAgent.util.matchUserAgent('CrOS');
+};
+
+
+/**
+ * The version of the platform. We only determine the version for Windows,
+ * Mac, and Chrome OS. It doesn't make much sense on Linux. For Windows, we only
+ * look at the NT version. Non-NT-based versions (e.g. 95, 98, etc.) are given
+ * version 0.0.
+ *
+ * @return {string} The platform version or empty string if version cannot be
+ * determined.
+ */
+goog.labs.userAgent.platform.getVersion = function() {
+ var userAgentString = goog.labs.userAgent.util.getUserAgent();
+ var version = '', re;
+ if (goog.labs.userAgent.platform.isWindows()) {
+ re = /Windows (?:NT|Phone) ([0-9.]+)/;
+ var match = re.exec(userAgentString);
+ if (match) {
+ version = match[1];
+ } else {
+ version = '0.0';
+ }
+ } else if (goog.labs.userAgent.platform.isIos()) {
+ re = /(?:iPhone|iPod|iPad|CPU)\s+OS\s+(\S+)/;
+ var match = re.exec(userAgentString);
+ // Report the version as x.y.z and not x_y_z
+ version = match && match[1].replace(/_/g, '.');
+ } else if (goog.labs.userAgent.platform.isMacintosh()) {
+ re = /Mac OS X ([0-9_.]+)/;
+ var match = re.exec(userAgentString);
+ // Note: some old versions of Camino do not report an OSX version.
+ // Default to 10.
+ version = match ? match[1].replace(/_/g, '.') : '10';
+ } else if (goog.labs.userAgent.platform.isAndroid()) {
+ re = /Android\s+([^\);]+)(\)|;)/;
+ var match = re.exec(userAgentString);
+ version = match && match[1];
+ } else if (goog.labs.userAgent.platform.isChromeOS()) {
+ re = /(?:CrOS\s+(?:i686|x86_64)\s+([0-9.]+))/;
+ var match = re.exec(userAgentString);
+ version = match && match[1];
+ }
+ return version || '';
+};
+
+
+/**
+ * @param {string|number} version The version to check.
+ * @return {boolean} Whether the browser version is higher or the same as the
+ * given version.
+ */
+goog.labs.userAgent.platform.isVersionOrHigher = function(version) {
+ return goog.string.compareVersions(
+ goog.labs.userAgent.platform.getVersion(), version) >= 0;
+};
diff --git a/src/http/static/viz/1/goog/labs/useragent/util.js b/src/http/static/viz/1/goog/labs/useragent/util.js
new file mode 100644
index 0000000..caa3407
--- /dev/null
+++ b/src/http/static/viz/1/goog/labs/useragent/util.js
@@ -0,0 +1,147 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities used by goog.labs.userAgent tools. These functions
+ * should not be used outside of goog.labs.userAgent.*.
+ *
+ *
+ * @author nnaze@google.com (Nathan Naze)
+ */
+
+goog.provide('goog.labs.userAgent.util');
+
+goog.require('goog.string');
+
+
+/**
+ * Gets the native userAgent string from navigator if it exists.
+ * If navigator or navigator.userAgent string is missing, returns an empty
+ * string.
+ * @return {string}
+ * @private
+ */
+goog.labs.userAgent.util.getNativeUserAgentString_ = function() {
+ var navigator = goog.labs.userAgent.util.getNavigator_();
+ if (navigator) {
+ var userAgent = navigator.userAgent;
+ if (userAgent) {
+ return userAgent;
+ }
+ }
+ return '';
+};
+
+
+/**
+ * Getter for the native navigator.
+ * This is a separate function so it can be stubbed out in testing.
+ * @return {Navigator}
+ * @private
+ */
+goog.labs.userAgent.util.getNavigator_ = function() {
+ return goog.global.navigator;
+};
+
+
+/**
+ * A possible override for applications which wish to not check
+ * navigator.userAgent but use a specified value for detection instead.
+ * @private {string}
+ */
+goog.labs.userAgent.util.userAgent_ =
+ goog.labs.userAgent.util.getNativeUserAgentString_();
+
+
+/**
+ * Applications may override browser detection on the built in
+ * navigator.userAgent object by setting this string. Set to null to use the
+ * browser object instead.
+ * @param {?string=} opt_userAgent The User-Agent override.
+ */
+goog.labs.userAgent.util.setUserAgent = function(opt_userAgent) {
+ goog.labs.userAgent.util.userAgent_ =
+ opt_userAgent || goog.labs.userAgent.util.getNativeUserAgentString_();
+};
+
+
+/**
+ * @return {string} The user agent string.
+ */
+goog.labs.userAgent.util.getUserAgent = function() {
+ return goog.labs.userAgent.util.userAgent_;
+};
+
+
+/**
+ * @param {string} str
+ * @return {boolean} Whether the user agent contains the given string, ignoring
+ * case.
+ */
+goog.labs.userAgent.util.matchUserAgent = function(str) {
+ var userAgent = goog.labs.userAgent.util.getUserAgent();
+ return goog.string.contains(userAgent, str);
+};
+
+
+/**
+ * @param {string} str
+ * @return {boolean} Whether the user agent contains the given string.
+ */
+goog.labs.userAgent.util.matchUserAgentIgnoreCase = function(str) {
+ var userAgent = goog.labs.userAgent.util.getUserAgent();
+ return goog.string.caseInsensitiveContains(userAgent, str);
+};
+
+
+/**
+ * Parses the user agent into tuples for each section.
+ * @param {string} userAgent
+ * @return {!Array<!Array<string>>} Tuples of key, version, and the contents
+ * of the parenthetical.
+ */
+goog.labs.userAgent.util.extractVersionTuples = function(userAgent) {
+ // Matches each section of a user agent string.
+ // Example UA:
+ // Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us)
+ // AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405
+ // This has three version tuples: Mozilla, AppleWebKit, and Mobile.
+
+ var versionRegExp = new RegExp(
+ // Key. Note that a key may have a space.
+ // (i.e. 'Mobile Safari' in 'Mobile Safari/5.0')
+ '(\\w[\\w ]+)' +
+
+ '/' + // slash
+ '([^\\s]+)' + // version (i.e. '5.0b')
+ '\\s*' + // whitespace
+ '(?:\\((.*?)\\))?', // parenthetical info. parentheses not matched.
+ 'g');
+
+ var data = [];
+ var match;
+
+ // Iterate and collect the version tuples. Each iteration will be the
+ // next regex match.
+ while (match = versionRegExp.exec(userAgent)) {
+ data.push([
+ match[1], // key
+ match[2], // value
+ // || undefined as this is not undefined in IE7 and IE8
+ match[3] || undefined // info
+ ]);
+ }
+
+ return data;
+};
diff --git a/src/http/static/viz/1/goog/math/coordinate.js b/src/http/static/viz/1/goog/math/coordinate.js
new file mode 100644
index 0000000..a08b9cb
--- /dev/null
+++ b/src/http/static/viz/1/goog/math/coordinate.js
@@ -0,0 +1,268 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A utility class for representing two-dimensional positions.
+ */
+
+
+goog.provide('goog.math.Coordinate');
+
+goog.require('goog.math');
+
+
+
+/**
+ * Class for representing coordinates and positions.
+ * @param {number=} opt_x Left, defaults to 0.
+ * @param {number=} opt_y Top, defaults to 0.
+ * @struct
+ * @constructor
+ */
+goog.math.Coordinate = function(opt_x, opt_y) {
+ /**
+ * X-value
+ * @type {number}
+ */
+ this.x = goog.isDef(opt_x) ? opt_x : 0;
+
+ /**
+ * Y-value
+ * @type {number}
+ */
+ this.y = goog.isDef(opt_y) ? opt_y : 0;
+};
+
+
+/**
+ * Returns a new copy of the coordinate.
+ * @return {!goog.math.Coordinate} A clone of this coordinate.
+ */
+goog.math.Coordinate.prototype.clone = function() {
+ return new goog.math.Coordinate(this.x, this.y);
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a nice string representing the coordinate.
+ * @return {string} In the form (50, 73).
+ * @override
+ */
+ goog.math.Coordinate.prototype.toString = function() {
+ return '(' + this.x + ', ' + this.y + ')';
+ };
+}
+
+
+/**
+ * Compares coordinates for equality.
+ * @param {goog.math.Coordinate} a A Coordinate.
+ * @param {goog.math.Coordinate} b A Coordinate.
+ * @return {boolean} True iff the coordinates are equal, or if both are null.
+ */
+goog.math.Coordinate.equals = function(a, b) {
+ if (a == b) {
+ return true;
+ }
+ if (!a || !b) {
+ return false;
+ }
+ return a.x == b.x && a.y == b.y;
+};
+
+
+/**
+ * Returns the distance between two coordinates.
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @param {!goog.math.Coordinate} b A Coordinate.
+ * @return {number} The distance between {@code a} and {@code b}.
+ */
+goog.math.Coordinate.distance = function(a, b) {
+ var dx = a.x - b.x;
+ var dy = a.y - b.y;
+ return Math.sqrt(dx * dx + dy * dy);
+};
+
+
+/**
+ * Returns the magnitude of a coordinate.
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @return {number} The distance between the origin and {@code a}.
+ */
+goog.math.Coordinate.magnitude = function(a) {
+ return Math.sqrt(a.x * a.x + a.y * a.y);
+};
+
+
+/**
+ * Returns the angle from the origin to a coordinate.
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @return {number} The angle, in degrees, clockwise from the positive X
+ * axis to {@code a}.
+ */
+goog.math.Coordinate.azimuth = function(a) {
+ return goog.math.angle(0, 0, a.x, a.y);
+};
+
+
+/**
+ * Returns the squared distance between two coordinates. Squared distances can
+ * be used for comparisons when the actual value is not required.
+ *
+ * Performance note: eliminating the square root is an optimization often used
+ * in lower-level languages, but the speed difference is not nearly as
+ * pronounced in JavaScript (only a few percent.)
+ *
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @param {!goog.math.Coordinate} b A Coordinate.
+ * @return {number} The squared distance between {@code a} and {@code b}.
+ */
+goog.math.Coordinate.squaredDistance = function(a, b) {
+ var dx = a.x - b.x;
+ var dy = a.y - b.y;
+ return dx * dx + dy * dy;
+};
+
+
+/**
+ * Returns the difference between two coordinates as a new
+ * goog.math.Coordinate.
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @param {!goog.math.Coordinate} b A Coordinate.
+ * @return {!goog.math.Coordinate} A Coordinate representing the difference
+ * between {@code a} and {@code b}.
+ */
+goog.math.Coordinate.difference = function(a, b) {
+ return new goog.math.Coordinate(a.x - b.x, a.y - b.y);
+};
+
+
+/**
+ * Returns the sum of two coordinates as a new goog.math.Coordinate.
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @param {!goog.math.Coordinate} b A Coordinate.
+ * @return {!goog.math.Coordinate} A Coordinate representing the sum of the two
+ * coordinates.
+ */
+goog.math.Coordinate.sum = function(a, b) {
+ return new goog.math.Coordinate(a.x + b.x, a.y + b.y);
+};
+
+
+/**
+ * Rounds the x and y fields to the next larger integer values.
+ * @return {!goog.math.Coordinate} This coordinate with ceil'd fields.
+ */
+goog.math.Coordinate.prototype.ceil = function() {
+ this.x = Math.ceil(this.x);
+ this.y = Math.ceil(this.y);
+ return this;
+};
+
+
+/**
+ * Rounds the x and y fields to the next smaller integer values.
+ * @return {!goog.math.Coordinate} This coordinate with floored fields.
+ */
+goog.math.Coordinate.prototype.floor = function() {
+ this.x = Math.floor(this.x);
+ this.y = Math.floor(this.y);
+ return this;
+};
+
+
+/**
+ * Rounds the x and y fields to the nearest integer values.
+ * @return {!goog.math.Coordinate} This coordinate with rounded fields.
+ */
+goog.math.Coordinate.prototype.round = function() {
+ this.x = Math.round(this.x);
+ this.y = Math.round(this.y);
+ return this;
+};
+
+
+/**
+ * Translates this box by the given offsets. If a {@code goog.math.Coordinate}
+ * is given, then the x and y values are translated by the coordinate's x and y.
+ * Otherwise, x and y are translated by {@code tx} and {@code opt_ty}
+ * respectively.
+ * @param {number|goog.math.Coordinate} tx The value to translate x by or the
+ * the coordinate to translate this coordinate by.
+ * @param {number=} opt_ty The value to translate y by.
+ * @return {!goog.math.Coordinate} This coordinate after translating.
+ */
+goog.math.Coordinate.prototype.translate = function(tx, opt_ty) {
+ if (tx instanceof goog.math.Coordinate) {
+ this.x += tx.x;
+ this.y += tx.y;
+ } else {
+ this.x += Number(tx);
+ if (goog.isNumber(opt_ty)) {
+ this.y += opt_ty;
+ }
+ }
+ return this;
+};
+
+
+/**
+ * Scales this coordinate by the given scale factors. The x and y values are
+ * scaled by {@code sx} and {@code opt_sy} respectively. If {@code opt_sy}
+ * is not given, then {@code sx} is used for both x and y.
+ * @param {number} sx The scale factor to use for the x dimension.
+ * @param {number=} opt_sy The scale factor to use for the y dimension.
+ * @return {!goog.math.Coordinate} This coordinate after scaling.
+ */
+goog.math.Coordinate.prototype.scale = function(sx, opt_sy) {
+ var sy = goog.isNumber(opt_sy) ? opt_sy : sx;
+ this.x *= sx;
+ this.y *= sy;
+ return this;
+};
+
+
+/**
+ * Rotates this coordinate clockwise about the origin (or, optionally, the given
+ * center) by the given angle, in radians.
+ * @param {number} radians The angle by which to rotate this coordinate
+ * clockwise about the given center, in radians.
+ * @param {!goog.math.Coordinate=} opt_center The center of rotation. Defaults
+ * to (0, 0) if not given.
+ */
+goog.math.Coordinate.prototype.rotateRadians = function(radians, opt_center) {
+ var center = opt_center || new goog.math.Coordinate(0, 0);
+
+ var x = this.x;
+ var y = this.y;
+ var cos = Math.cos(radians);
+ var sin = Math.sin(radians);
+
+ this.x = (x - center.x) * cos - (y - center.y) * sin + center.x;
+ this.y = (x - center.x) * sin + (y - center.y) * cos + center.y;
+};
+
+
+/**
+ * Rotates this coordinate clockwise about the origin (or, optionally, the given
+ * center) by the given angle, in degrees.
+ * @param {number} degrees The angle by which to rotate this coordinate
+ * clockwise about the given center, in degrees.
+ * @param {!goog.math.Coordinate=} opt_center The center of rotation. Defaults
+ * to (0, 0) if not given.
+ */
+goog.math.Coordinate.prototype.rotateDegrees = function(degrees, opt_center) {
+ this.rotateRadians(goog.math.toRadians(degrees), opt_center);
+};
diff --git a/src/http/static/viz/1/goog/math/integer.js b/src/http/static/viz/1/goog/math/integer.js
new file mode 100644
index 0000000..11b6a95
--- /dev/null
+++ b/src/http/static/viz/1/goog/math/integer.js
@@ -0,0 +1,807 @@
+// Copyright 2009 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Defines an Integer class for representing (potentially)
+ * infinite length two's-complement integer values.
+ *
+ * For the specific case of 64-bit integers, use goog.math.Long, which is more
+ * efficient.
+ *
+ */
+
+goog.provide('goog.math.Integer');
+
+
+
+/**
+ * Constructs a two's-complement integer an array containing bits of the
+ * integer in 32-bit (signed) pieces, given in little-endian order (i.e.,
+ * lowest-order bits in the first piece), and the sign of -1 or 0.
+ *
+ * See the from* functions below for other convenient ways of constructing
+ * Integers.
+ *
+ * The internal representation of an integer is an array of 32-bit signed
+ * pieces, along with a sign (0 or -1) that indicates the contents of all the
+ * other 32-bit pieces out to infinity. We use 32-bit pieces because these are
+ * the size of integers on which Javascript performs bit-operations. For
+ * operations like addition and multiplication, we split each number into 16-bit
+ * pieces, which can easily be multiplied within Javascript's floating-point
+ * representation without overflow or change in sign.
+ *
+ * @struct
+ * @constructor
+ * @param {Array<number>} bits Array containing the bits of the number.
+ * @param {number} sign The sign of the number: -1 for negative and 0 positive.
+ * @final
+ */
+goog.math.Integer = function(bits, sign) {
+ /**
+ * @type {!Array<number>}
+ * @private
+ */
+ this.bits_ = [];
+
+ /**
+ * @type {number}
+ * @private
+ */
+ this.sign_ = sign;
+
+ // Copy the 32-bit signed integer values passed in. We prune out those at the
+ // top that equal the sign since they are redundant.
+ var top = true;
+ for (var i = bits.length - 1; i >= 0; i--) {
+ var val = bits[i] | 0;
+ if (!top || val != sign) {
+ this.bits_[i] = val;
+ top = false;
+ }
+ }
+};
+
+
+// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the
+// from* methods on which they depend.
+
+
+/**
+ * A cache of the Integer representations of small integer values.
+ * @type {!Object}
+ * @private
+ */
+goog.math.Integer.IntCache_ = {};
+
+
+/**
+ * Returns an Integer representing the given (32-bit) integer value.
+ * @param {number} value A 32-bit integer value.
+ * @return {!goog.math.Integer} The corresponding Integer value.
+ */
+goog.math.Integer.fromInt = function(value) {
+ if (-128 <= value && value < 128) {
+ var cachedObj = goog.math.Integer.IntCache_[value];
+ if (cachedObj) {
+ return cachedObj;
+ }
+ }
+
+ var obj = new goog.math.Integer([value | 0], value < 0 ? -1 : 0);
+ if (-128 <= value && value < 128) {
+ goog.math.Integer.IntCache_[value] = obj;
+ }
+ return obj;
+};
+
+
+/**
+ * Returns an Integer representing the given value, provided that it is a finite
+ * number. Otherwise, zero is returned.
+ * @param {number} value The value in question.
+ * @return {!goog.math.Integer} The corresponding Integer value.
+ */
+goog.math.Integer.fromNumber = function(value) {
+ if (isNaN(value) || !isFinite(value)) {
+ return goog.math.Integer.ZERO;
+ } else if (value < 0) {
+ return goog.math.Integer.fromNumber(-value).negate();
+ } else {
+ var bits = [];
+ var pow = 1;
+ for (var i = 0; value >= pow; i++) {
+ bits[i] = (value / pow) | 0;
+ pow *= goog.math.Integer.TWO_PWR_32_DBL_;
+ }
+ return new goog.math.Integer(bits, 0);
+ }
+};
+
+
+/**
+ * Returns a Integer representing the value that comes by concatenating the
+ * given entries, each is assumed to be 32 signed bits, given in little-endian
+ * order (lowest order bits in the lowest index), and sign-extending the highest
+ * order 32-bit value.
+ * @param {Array<number>} bits The bits of the number, in 32-bit signed pieces,
+ * in little-endian order.
+ * @return {!goog.math.Integer} The corresponding Integer value.
+ */
+goog.math.Integer.fromBits = function(bits) {
+ var high = bits[bits.length - 1];
+ return new goog.math.Integer(bits, high & (1 << 31) ? -1 : 0);
+};
+
+
+/**
+ * Returns an Integer representation of the given string, written using the
+ * given radix.
+ * @param {string} str The textual representation of the Integer.
+ * @param {number=} opt_radix The radix in which the text is written.
+ * @return {!goog.math.Integer} The corresponding Integer value.
+ */
+goog.math.Integer.fromString = function(str, opt_radix) {
+ if (str.length == 0) {
+ throw Error('number format error: empty string');
+ }
+
+ var radix = opt_radix || 10;
+ if (radix < 2 || 36 < radix) {
+ throw Error('radix out of range: ' + radix);
+ }
+
+ if (str.charAt(0) == '-') {
+ return goog.math.Integer.fromString(str.substring(1), radix).negate();
+ } else if (str.indexOf('-') >= 0) {
+ throw Error('number format error: interior "-" character');
+ }
+
+ // Do several (8) digits each time through the loop, so as to
+ // minimize the calls to the very expensive emulated div.
+ var radixToPower = goog.math.Integer.fromNumber(Math.pow(radix, 8));
+
+ var result = goog.math.Integer.ZERO;
+ for (var i = 0; i < str.length; i += 8) {
+ var size = Math.min(8, str.length - i);
+ var value = parseInt(str.substring(i, i + size), radix);
+ if (size < 8) {
+ var power = goog.math.Integer.fromNumber(Math.pow(radix, size));
+ result = result.multiply(power).add(goog.math.Integer.fromNumber(value));
+ } else {
+ result = result.multiply(radixToPower);
+ result = result.add(goog.math.Integer.fromNumber(value));
+ }
+ }
+ return result;
+};
+
+
+/**
+ * A number used repeatedly in calculations. This must appear before the first
+ * call to the from* functions below.
+ * @type {number}
+ * @private
+ */
+goog.math.Integer.TWO_PWR_32_DBL_ = (1 << 16) * (1 << 16);
+
+
+/** @type {!goog.math.Integer} */
+goog.math.Integer.ZERO = goog.math.Integer.fromInt(0);
+
+
+/** @type {!goog.math.Integer} */
+goog.math.Integer.ONE = goog.math.Integer.fromInt(1);
+
+
+/**
+ * @type {!goog.math.Integer}
+ * @private
+ */
+goog.math.Integer.TWO_PWR_24_ = goog.math.Integer.fromInt(1 << 24);
+
+
+/**
+ * Returns the value, assuming it is a 32-bit integer.
+ * @return {number} The corresponding int value.
+ */
+goog.math.Integer.prototype.toInt = function() {
+ return this.bits_.length > 0 ? this.bits_[0] : this.sign_;
+};
+
+
+/** @return {number} The closest floating-point representation to this value. */
+goog.math.Integer.prototype.toNumber = function() {
+ if (this.isNegative()) {
+ return -this.negate().toNumber();
+ } else {
+ var val = 0;
+ var pow = 1;
+ for (var i = 0; i < this.bits_.length; i++) {
+ val += this.getBitsUnsigned(i) * pow;
+ pow *= goog.math.Integer.TWO_PWR_32_DBL_;
+ }
+ return val;
+ }
+};
+
+
+/**
+ * @param {number=} opt_radix The radix in which the text should be written.
+ * @return {string} The textual representation of this value.
+ * @override
+ */
+goog.math.Integer.prototype.toString = function(opt_radix) {
+ var radix = opt_radix || 10;
+ if (radix < 2 || 36 < radix) {
+ throw Error('radix out of range: ' + radix);
+ }
+
+ if (this.isZero()) {
+ return '0';
+ } else if (this.isNegative()) {
+ return '-' + this.negate().toString(radix);
+ }
+
+ // Do several (6) digits each time through the loop, so as to
+ // minimize the calls to the very expensive emulated div.
+ var radixToPower = goog.math.Integer.fromNumber(Math.pow(radix, 6));
+
+ var rem = this;
+ var result = '';
+ while (true) {
+ var remDiv = rem.divide(radixToPower);
+ // The right shifting fixes negative values in the case when
+ // intval >= 2^31; for more details see
+ // https://github.com/google/closure-library/pull/498
+ var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt() >>> 0;
+ var digits = intval.toString(radix);
+
+ rem = remDiv;
+ if (rem.isZero()) {
+ return digits + result;
+ } else {
+ while (digits.length < 6) {
+ digits = '0' + digits;
+ }
+ result = '' + digits + result;
+ }
+ }
+};
+
+
+/**
+ * Returns the index-th 32-bit (signed) piece of the Integer according to
+ * little-endian order (i.e., index 0 contains the smallest bits).
+ * @param {number} index The index in question.
+ * @return {number} The requested 32-bits as a signed number.
+ */
+goog.math.Integer.prototype.getBits = function(index) {
+ if (index < 0) {
+ return 0; // Allowing this simplifies bit shifting operations below...
+ } else if (index < this.bits_.length) {
+ return this.bits_[index];
+ } else {
+ return this.sign_;
+ }
+};
+
+
+/**
+ * Returns the index-th 32-bit piece as an unsigned number.
+ * @param {number} index The index in question.
+ * @return {number} The requested 32-bits as an unsigned number.
+ */
+goog.math.Integer.prototype.getBitsUnsigned = function(index) {
+ var val = this.getBits(index);
+ return val >= 0 ? val : goog.math.Integer.TWO_PWR_32_DBL_ + val;
+};
+
+
+/** @return {number} The sign bit of this number, -1 or 0. */
+goog.math.Integer.prototype.getSign = function() {
+ return this.sign_;
+};
+
+
+/** @return {boolean} Whether this value is zero. */
+goog.math.Integer.prototype.isZero = function() {
+ if (this.sign_ != 0) {
+ return false;
+ }
+ for (var i = 0; i < this.bits_.length; i++) {
+ if (this.bits_[i] != 0) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/** @return {boolean} Whether this value is negative. */
+goog.math.Integer.prototype.isNegative = function() {
+ return this.sign_ == -1;
+};
+
+
+/** @return {boolean} Whether this value is odd. */
+goog.math.Integer.prototype.isOdd = function() {
+ return (this.bits_.length == 0) && (this.sign_ == -1) ||
+ (this.bits_.length > 0) && ((this.bits_[0] & 1) != 0);
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer equals the other.
+ */
+goog.math.Integer.prototype.equals = function(other) {
+ if (this.sign_ != other.sign_) {
+ return false;
+ }
+ var len = Math.max(this.bits_.length, other.bits_.length);
+ for (var i = 0; i < len; i++) {
+ if (this.getBits(i) != other.getBits(i)) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer does not equal the other.
+ */
+goog.math.Integer.prototype.notEquals = function(other) {
+ return !this.equals(other);
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer is greater than the other.
+ */
+goog.math.Integer.prototype.greaterThan = function(other) {
+ return this.compare(other) > 0;
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer is greater than or equal to the other.
+ */
+goog.math.Integer.prototype.greaterThanOrEqual = function(other) {
+ return this.compare(other) >= 0;
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer is less than the other.
+ */
+goog.math.Integer.prototype.lessThan = function(other) {
+ return this.compare(other) < 0;
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer is less than or equal to the other.
+ */
+goog.math.Integer.prototype.lessThanOrEqual = function(other) {
+ return this.compare(other) <= 0;
+};
+
+
+/**
+ * Compares this Integer with the given one.
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {number} 0 if they are the same, 1 if the this is greater, and -1
+ * if the given one is greater.
+ */
+goog.math.Integer.prototype.compare = function(other) {
+ var diff = this.subtract(other);
+ if (diff.isNegative()) {
+ return -1;
+ } else if (diff.isZero()) {
+ return 0;
+ } else {
+ return +1;
+ }
+};
+
+
+/**
+ * Returns an integer with only the first numBits bits of this value, sign
+ * extended from the final bit.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Integer} The shorted integer value.
+ */
+goog.math.Integer.prototype.shorten = function(numBits) {
+ var arr_index = (numBits - 1) >> 5;
+ var bit_index = (numBits - 1) % 32;
+ var bits = [];
+ for (var i = 0; i < arr_index; i++) {
+ bits[i] = this.getBits(i);
+ }
+ var sigBits = bit_index == 31 ? 0xFFFFFFFF : (1 << (bit_index + 1)) - 1;
+ var val = this.getBits(arr_index) & sigBits;
+ if (val & (1 << bit_index)) {
+ val |= 0xFFFFFFFF - sigBits;
+ bits[arr_index] = val;
+ return new goog.math.Integer(bits, -1);
+ } else {
+ bits[arr_index] = val;
+ return new goog.math.Integer(bits, 0);
+ }
+};
+
+
+/** @return {!goog.math.Integer} The negation of this value. */
+goog.math.Integer.prototype.negate = function() {
+ return this.not().add(goog.math.Integer.ONE);
+};
+
+
+/**
+ * Returns the sum of this and the given Integer.
+ * @param {goog.math.Integer} other The Integer to add to this.
+ * @return {!goog.math.Integer} The Integer result.
+ */
+goog.math.Integer.prototype.add = function(other) {
+ var len = Math.max(this.bits_.length, other.bits_.length);
+ var arr = [];
+ var carry = 0;
+
+ for (var i = 0; i <= len; i++) {
+ var a1 = this.getBits(i) >>> 16;
+ var a0 = this.getBits(i) & 0xFFFF;
+
+ var b1 = other.getBits(i) >>> 16;
+ var b0 = other.getBits(i) & 0xFFFF;
+
+ var c0 = carry + a0 + b0;
+ var c1 = (c0 >>> 16) + a1 + b1;
+ carry = c1 >>> 16;
+ c0 &= 0xFFFF;
+ c1 &= 0xFFFF;
+ arr[i] = (c1 << 16) | c0;
+ }
+ return goog.math.Integer.fromBits(arr);
+};
+
+
+/**
+ * Returns the difference of this and the given Integer.
+ * @param {goog.math.Integer} other The Integer to subtract from this.
+ * @return {!goog.math.Integer} The Integer result.
+ */
+goog.math.Integer.prototype.subtract = function(other) {
+ return this.add(other.negate());
+};
+
+
+/**
+ * Returns the product of this and the given Integer.
+ * @param {goog.math.Integer} other The Integer to multiply against this.
+ * @return {!goog.math.Integer} The product of this and the other.
+ */
+goog.math.Integer.prototype.multiply = function(other) {
+ if (this.isZero()) {
+ return goog.math.Integer.ZERO;
+ } else if (other.isZero()) {
+ return goog.math.Integer.ZERO;
+ }
+
+ if (this.isNegative()) {
+ if (other.isNegative()) {
+ return this.negate().multiply(other.negate());
+ } else {
+ return this.negate().multiply(other).negate();
+ }
+ } else if (other.isNegative()) {
+ return this.multiply(other.negate()).negate();
+ }
+
+ // If both numbers are small, use float multiplication
+ if (this.lessThan(goog.math.Integer.TWO_PWR_24_) &&
+ other.lessThan(goog.math.Integer.TWO_PWR_24_)) {
+ return goog.math.Integer.fromNumber(this.toNumber() * other.toNumber());
+ }
+
+ // Fill in an array of 16-bit products.
+ var len = this.bits_.length + other.bits_.length;
+ var arr = [];
+ for (var i = 0; i < 2 * len; i++) {
+ arr[i] = 0;
+ }
+ for (var i = 0; i < this.bits_.length; i++) {
+ for (var j = 0; j < other.bits_.length; j++) {
+ var a1 = this.getBits(i) >>> 16;
+ var a0 = this.getBits(i) & 0xFFFF;
+
+ var b1 = other.getBits(j) >>> 16;
+ var b0 = other.getBits(j) & 0xFFFF;
+
+ arr[2 * i + 2 * j] += a0 * b0;
+ goog.math.Integer.carry16_(arr, 2 * i + 2 * j);
+ arr[2 * i + 2 * j + 1] += a1 * b0;
+ goog.math.Integer.carry16_(arr, 2 * i + 2 * j + 1);
+ arr[2 * i + 2 * j + 1] += a0 * b1;
+ goog.math.Integer.carry16_(arr, 2 * i + 2 * j + 1);
+ arr[2 * i + 2 * j + 2] += a1 * b1;
+ goog.math.Integer.carry16_(arr, 2 * i + 2 * j + 2);
+ }
+ }
+
+ // Combine the 16-bit values into 32-bit values.
+ for (var i = 0; i < len; i++) {
+ arr[i] = (arr[2 * i + 1] << 16) | arr[2 * i];
+ }
+ for (var i = len; i < 2 * len; i++) {
+ arr[i] = 0;
+ }
+ return new goog.math.Integer(arr, 0);
+};
+
+
+/**
+ * Carries any overflow from the given index into later entries.
+ * @param {Array<number>} bits Array of 16-bit values in little-endian order.
+ * @param {number} index The index in question.
+ * @private
+ */
+goog.math.Integer.carry16_ = function(bits, index) {
+ while ((bits[index] & 0xFFFF) != bits[index]) {
+ bits[index + 1] += bits[index] >>> 16;
+ bits[index] &= 0xFFFF;
+ }
+};
+
+
+/**
+ * Returns "this" Integer divided by the given one. Both "this" and the given
+ * Integer MUST be positive.
+ *
+ * This method is only needed for very large numbers (>10^308),
+ * for which the original division algorithm gets into an infinite
+ * loop (see https://github.com/google/closure-library/issues/500).
+ *
+ * The algorithm has some possible performance enhancements (or
+ * could be rewritten entirely), it's just an initial solution for
+ * the issue linked above.
+ *
+ * @param {!goog.math.Integer} other The Integer to divide "this" by.
+ * @return {!goog.math.Integer} "this" value divided by the given one.
+ * @private
+ */
+goog.math.Integer.prototype.slowDivide_ = function(other) {
+ if (this.isNegative() || other.isNegative()) {
+ throw Error('slowDivide_ only works with positive integers.');
+ }
+
+ var twoPower = goog.math.Integer.ONE;
+ var multiple = other;
+
+ // First we have to figure out what the highest bit of the result
+ // is, so we increase "twoPower" and "multiple" until "multiple"
+ // exceeds "this".
+ while (multiple.lessThanOrEqual(this)) {
+ twoPower = twoPower.shiftLeft(1);
+ multiple = multiple.shiftLeft(1);
+ }
+
+ // Rewind by one power of two, giving us the highest bit of the
+ // result.
+ var res = twoPower.shiftRight(1);
+ var total = multiple.shiftRight(1);
+
+ // Now we starting decreasing "multiple" and "twoPower" to find the
+ // rest of the bits of the result.
+ var total2;
+ multiple = multiple.shiftRight(2);
+ twoPower = twoPower.shiftRight(2);
+ while (!multiple.isZero()) {
+ // whenever we can add "multiple" to the total and not exceed
+ // "this", that means we've found a 1 bit. Else we've found a 0
+ // and don't need to add to the result.
+ total2 = total.add(multiple);
+ if (total2.lessThanOrEqual(this)) {
+ res = res.add(twoPower);
+ total = total2;
+ }
+ multiple = multiple.shiftRight(1);
+ twoPower = twoPower.shiftRight(1);
+ }
+ return res;
+};
+
+
+/**
+ * Returns this Integer divided by the given one.
+ * @param {!goog.math.Integer} other The Integer to divide this by.
+ * @return {!goog.math.Integer} This value divided by the given one.
+ */
+goog.math.Integer.prototype.divide = function(other) {
+ if (other.isZero()) {
+ throw Error('division by zero');
+ } else if (this.isZero()) {
+ return goog.math.Integer.ZERO;
+ }
+
+ if (this.isNegative()) {
+ if (other.isNegative()) {
+ return this.negate().divide(other.negate());
+ } else {
+ return this.negate().divide(other).negate();
+ }
+ } else if (other.isNegative()) {
+ return this.divide(other.negate()).negate();
+ }
+
+ // Have to degrade to slowDivide for Very Large Numbers, because
+ // they're out of range for the floating-point approximation
+ // technique used below.
+ if (this.bits_.length > 30) {
+ return this.slowDivide_(other);
+ }
+
+ // Repeat the following until the remainder is less than other: find a
+ // floating-point that approximates remainder / other *from below*, add this
+ // into the result, and subtract it from the remainder. It is critical that
+ // the approximate value is less than or equal to the real value so that the
+ // remainder never becomes negative.
+ var res = goog.math.Integer.ZERO;
+ var rem = this;
+ while (rem.greaterThanOrEqual(other)) {
+ // Approximate the result of division. This may be a little greater or
+ // smaller than the actual value.
+ var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));
+
+ // We will tweak the approximate result by changing it in the 48-th digit or
+ // the smallest non-fractional digit, whichever is larger.
+ var log2 = Math.ceil(Math.log(approx) / Math.LN2);
+ var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);
+
+ // Decrease the approximation until it is smaller than the remainder. Note
+ // that if it is too large, the product overflows and is negative.
+ var approxRes = goog.math.Integer.fromNumber(approx);
+ var approxRem = approxRes.multiply(other);
+ while (approxRem.isNegative() || approxRem.greaterThan(rem)) {
+ approx -= delta;
+ approxRes = goog.math.Integer.fromNumber(approx);
+ approxRem = approxRes.multiply(other);
+ }
+
+ // We know the answer can't be zero... and actually, zero would cause
+ // infinite recursion since we would make no progress.
+ if (approxRes.isZero()) {
+ approxRes = goog.math.Integer.ONE;
+ }
+
+ res = res.add(approxRes);
+ rem = rem.subtract(approxRem);
+ }
+ return res;
+};
+
+
+/**
+ * Returns this Integer modulo the given one.
+ * @param {!goog.math.Integer} other The Integer by which to mod.
+ * @return {!goog.math.Integer} This value modulo the given one.
+ */
+goog.math.Integer.prototype.modulo = function(other) {
+ return this.subtract(this.divide(other).multiply(other));
+};
+
+
+/** @return {!goog.math.Integer} The bitwise-NOT of this value. */
+goog.math.Integer.prototype.not = function() {
+ var len = this.bits_.length;
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ arr[i] = ~this.bits_[i];
+ }
+ return new goog.math.Integer(arr, ~this.sign_);
+};
+
+
+/**
+ * Returns the bitwise-AND of this Integer and the given one.
+ * @param {goog.math.Integer} other The Integer to AND with this.
+ * @return {!goog.math.Integer} The bitwise-AND of this and the other.
+ */
+goog.math.Integer.prototype.and = function(other) {
+ var len = Math.max(this.bits_.length, other.bits_.length);
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ arr[i] = this.getBits(i) & other.getBits(i);
+ }
+ return new goog.math.Integer(arr, this.sign_ & other.sign_);
+};
+
+
+/**
+ * Returns the bitwise-OR of this Integer and the given one.
+ * @param {goog.math.Integer} other The Integer to OR with this.
+ * @return {!goog.math.Integer} The bitwise-OR of this and the other.
+ */
+goog.math.Integer.prototype.or = function(other) {
+ var len = Math.max(this.bits_.length, other.bits_.length);
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ arr[i] = this.getBits(i) | other.getBits(i);
+ }
+ return new goog.math.Integer(arr, this.sign_ | other.sign_);
+};
+
+
+/**
+ * Returns the bitwise-XOR of this Integer and the given one.
+ * @param {goog.math.Integer} other The Integer to XOR with this.
+ * @return {!goog.math.Integer} The bitwise-XOR of this and the other.
+ */
+goog.math.Integer.prototype.xor = function(other) {
+ var len = Math.max(this.bits_.length, other.bits_.length);
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ arr[i] = this.getBits(i) ^ other.getBits(i);
+ }
+ return new goog.math.Integer(arr, this.sign_ ^ other.sign_);
+};
+
+
+/**
+ * Returns this value with bits shifted to the left by the given amount.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Integer} This shifted to the left by the given amount.
+ */
+goog.math.Integer.prototype.shiftLeft = function(numBits) {
+ var arr_delta = numBits >> 5;
+ var bit_delta = numBits % 32;
+ var len = this.bits_.length + arr_delta + (bit_delta > 0 ? 1 : 0);
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ if (bit_delta > 0) {
+ arr[i] = (this.getBits(i - arr_delta) << bit_delta) |
+ (this.getBits(i - arr_delta - 1) >>> (32 - bit_delta));
+ } else {
+ arr[i] = this.getBits(i - arr_delta);
+ }
+ }
+ return new goog.math.Integer(arr, this.sign_);
+};
+
+
+/**
+ * Returns this value with bits shifted to the right by the given amount.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Integer} This shifted to the right by the given amount.
+ */
+goog.math.Integer.prototype.shiftRight = function(numBits) {
+ var arr_delta = numBits >> 5;
+ var bit_delta = numBits % 32;
+ var len = this.bits_.length - arr_delta;
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ if (bit_delta > 0) {
+ arr[i] = (this.getBits(i + arr_delta) >>> bit_delta) |
+ (this.getBits(i + arr_delta + 1) << (32 - bit_delta));
+ } else {
+ arr[i] = this.getBits(i + arr_delta);
+ }
+ }
+ return new goog.math.Integer(arr, this.sign_);
+};
diff --git a/src/http/static/viz/1/goog/math/long.js b/src/http/static/viz/1/goog/math/long.js
new file mode 100644
index 0000000..a43ea3f
--- /dev/null
+++ b/src/http/static/viz/1/goog/math/long.js
@@ -0,0 +1,843 @@
+// Copyright 2009 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Defines a Long class for representing a 64-bit two's-complement
+ * integer value, which faithfully simulates the behavior of a Java "long". This
+ * implementation is derived from LongLib in GWT.
+ *
+ */
+
+goog.provide('goog.math.Long');
+
+goog.require('goog.reflect');
+
+
+
+/**
+ * Constructs a 64-bit two's-complement integer, given its low and high 32-bit
+ * values as *signed* integers. See the from* functions below for more
+ * convenient ways of constructing Longs.
+ *
+ * The internal representation of a long is the two given signed, 32-bit values.
+ * We use 32-bit pieces because these are the size of integers on which
+ * Javascript performs bit-operations. For operations like addition and
+ * multiplication, we split each number into 16-bit pieces, which can easily be
+ * multiplied within Javascript's floating-point representation without overflow
+ * or change in sign.
+ *
+ * In the algorithms below, we frequently reduce the negative case to the
+ * positive case by negating the input(s) and then post-processing the result.
+ * Note that we must ALWAYS check specially whether those values are MIN_VALUE
+ * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as
+ * a positive number, it overflows back into a negative). Not handling this
+ * case would often result in infinite recursion.
+ *
+ * @param {number} low The low (signed) 32 bits of the long.
+ * @param {number} high The high (signed) 32 bits of the long.
+ * @struct
+ * @constructor
+ * @final
+ */
+goog.math.Long = function(low, high) {
+ /**
+ * @type {number}
+ * @private
+ */
+ this.low_ = low | 0; // force into 32 signed bits.
+
+ /**
+ * @type {number}
+ * @private
+ */
+ this.high_ = high | 0; // force into 32 signed bits.
+};
+
+
+// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the
+// from* methods on which they depend.
+
+
+/**
+ * A cache of the Long representations of small integer values.
+ * @type {!Object<number, !goog.math.Long>}
+ * @private
+ */
+goog.math.Long.IntCache_ = {};
+
+
+/**
+ * A cache of the Long representations of common values.
+ * @type {!Object<goog.math.Long.ValueCacheId_, !goog.math.Long>}
+ * @private
+ */
+goog.math.Long.valueCache_ = {};
+
+
+/**
+ * Returns a Long representing the given (32-bit) integer value.
+ * @param {number} value The 32-bit integer in question.
+ * @return {!goog.math.Long} The corresponding Long value.
+ */
+goog.math.Long.fromInt = function(value) {
+ if (-128 <= value && value < 128) {
+ return goog.reflect.cache(goog.math.Long.IntCache_, value, function(val) {
+ return new goog.math.Long(val | 0, val < 0 ? -1 : 0);
+ });
+ } else {
+ return new goog.math.Long(value | 0, value < 0 ? -1 : 0);
+ }
+};
+
+
+/**
+ * Returns a Long representing the given value.
+ * NaN will be returned as zero. Infinity is converted to max value and
+ * -Infinity to min value.
+ * @param {number} value The number in question.
+ * @return {!goog.math.Long} The corresponding Long value.
+ */
+goog.math.Long.fromNumber = function(value) {
+ if (isNaN(value)) {
+ return goog.math.Long.getZero();
+ } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {
+ return goog.math.Long.getMinValue();
+ } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {
+ return goog.math.Long.getMaxValue();
+ } else if (value < 0) {
+ return goog.math.Long.fromNumber(-value).negate();
+ } else {
+ return new goog.math.Long(
+ (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,
+ (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);
+ }
+};
+
+
+/**
+ * Returns a Long representing the 64-bit integer that comes by concatenating
+ * the given high and low bits. Each is assumed to use 32 bits.
+ * @param {number} lowBits The low 32-bits.
+ * @param {number} highBits The high 32-bits.
+ * @return {!goog.math.Long} The corresponding Long value.
+ */
+goog.math.Long.fromBits = function(lowBits, highBits) {
+ return new goog.math.Long(lowBits, highBits);
+};
+
+
+/**
+ * Returns a Long representation of the given string, written using the given
+ * radix.
+ * @param {string} str The textual representation of the Long.
+ * @param {number=} opt_radix The radix in which the text is written.
+ * @return {!goog.math.Long} The corresponding Long value.
+ */
+goog.math.Long.fromString = function(str, opt_radix) {
+ if (str.length == 0) {
+ throw Error('number format error: empty string');
+ }
+
+ var radix = opt_radix || 10;
+ if (radix < 2 || 36 < radix) {
+ throw Error('radix out of range: ' + radix);
+ }
+
+ if (str.charAt(0) == '-') {
+ return goog.math.Long.fromString(str.substring(1), radix).negate();
+ } else if (str.indexOf('-') >= 0) {
+ throw Error('number format error: interior "-" character: ' + str);
+ }
+
+ // Do several (8) digits each time through the loop, so as to
+ // minimize the calls to the very expensive emulated div.
+ var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));
+
+ var result = goog.math.Long.getZero();
+ for (var i = 0; i < str.length; i += 8) {
+ var size = Math.min(8, str.length - i);
+ var value = parseInt(str.substring(i, i + size), radix);
+ if (size < 8) {
+ var power = goog.math.Long.fromNumber(Math.pow(radix, size));
+ result = result.multiply(power).add(goog.math.Long.fromNumber(value));
+ } else {
+ result = result.multiply(radixToPower);
+ result = result.add(goog.math.Long.fromNumber(value));
+ }
+ }
+ return result;
+};
+
+
+// NOTE: the compiler should inline these constant values below and then remove
+// these variables, so there should be no runtime penalty for these.
+
+
+/**
+ * Number used repeated below in calculations. This must appear before the
+ * first call to any from* function below.
+ * @type {number}
+ * @private
+ */
+goog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;
+
+
+/**
+ * @type {number}
+ * @private
+ */
+goog.math.Long.TWO_PWR_32_DBL_ =
+ goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;
+
+
+/**
+ * @type {number}
+ * @private
+ */
+goog.math.Long.TWO_PWR_64_DBL_ =
+ goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;
+
+
+/**
+ * @type {number}
+ * @private
+ */
+goog.math.Long.TWO_PWR_63_DBL_ = goog.math.Long.TWO_PWR_64_DBL_ / 2;
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getZero = function() {
+ return goog.reflect.cache(
+ goog.math.Long.valueCache_, goog.math.Long.ValueCacheId_.ZERO,
+ function() { return goog.math.Long.fromInt(0); });
+};
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getOne = function() {
+ return goog.reflect.cache(
+ goog.math.Long.valueCache_, goog.math.Long.ValueCacheId_.ONE,
+ function() { return goog.math.Long.fromInt(1); });
+};
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getNegOne = function() {
+ return goog.reflect.cache(
+ goog.math.Long.valueCache_, goog.math.Long.ValueCacheId_.NEG_ONE,
+ function() { return goog.math.Long.fromInt(-1); });
+};
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getMaxValue = function() {
+ return goog.reflect.cache(
+ goog.math.Long.valueCache_, goog.math.Long.ValueCacheId_.MAX_VALUE,
+ function() {
+ return goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);
+ });
+};
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getMinValue = function() {
+ return goog.reflect.cache(
+ goog.math.Long.valueCache_, goog.math.Long.ValueCacheId_.MIN_VALUE,
+ function() { return goog.math.Long.fromBits(0, 0x80000000 | 0); });
+};
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getTwoPwr24 = function() {
+ return goog.reflect.cache(
+ goog.math.Long.valueCache_, goog.math.Long.ValueCacheId_.TWO_PWR_24,
+ function() { return goog.math.Long.fromInt(1 << 24); });
+};
+
+
+/** @return {number} The value, assuming it is a 32-bit integer. */
+goog.math.Long.prototype.toInt = function() {
+ return this.low_;
+};
+
+
+/** @return {number} The closest floating-point representation to this value. */
+goog.math.Long.prototype.toNumber = function() {
+ return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +
+ this.getLowBitsUnsigned();
+};
+
+
+/**
+ * @param {number=} opt_radix The radix in which the text should be written.
+ * @return {string} The textual representation of this value.
+ * @override
+ */
+goog.math.Long.prototype.toString = function(opt_radix) {
+ var radix = opt_radix || 10;
+ if (radix < 2 || 36 < radix) {
+ throw Error('radix out of range: ' + radix);
+ }
+
+ if (this.isZero()) {
+ return '0';
+ }
+
+ if (this.isNegative()) {
+ if (this.equals(goog.math.Long.getMinValue())) {
+ // We need to change the Long value before it can be negated, so we remove
+ // the bottom-most digit in this base and then recurse to do the rest.
+ var radixLong = goog.math.Long.fromNumber(radix);
+ var div = this.div(radixLong);
+ var rem = div.multiply(radixLong).subtract(this);
+ return div.toString(radix) + rem.toInt().toString(radix);
+ } else {
+ return '-' + this.negate().toString(radix);
+ }
+ }
+
+ // Do several (6) digits each time through the loop, so as to
+ // minimize the calls to the very expensive emulated div.
+ var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));
+
+ var rem = this;
+ var result = '';
+ while (true) {
+ var remDiv = rem.div(radixToPower);
+ // The right shifting fixes negative values in the case when
+ // intval >= 2^31; for more details see
+ // https://github.com/google/closure-library/pull/498
+ var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt() >>> 0;
+ var digits = intval.toString(radix);
+
+ rem = remDiv;
+ if (rem.isZero()) {
+ return digits + result;
+ } else {
+ while (digits.length < 6) {
+ digits = '0' + digits;
+ }
+ result = '' + digits + result;
+ }
+ }
+};
+
+
+/** @return {number} The high 32-bits as a signed value. */
+goog.math.Long.prototype.getHighBits = function() {
+ return this.high_;
+};
+
+
+/** @return {number} The low 32-bits as a signed value. */
+goog.math.Long.prototype.getLowBits = function() {
+ return this.low_;
+};
+
+
+/** @return {number} The low 32-bits as an unsigned value. */
+goog.math.Long.prototype.getLowBitsUnsigned = function() {
+ return (this.low_ >= 0) ? this.low_ :
+ goog.math.Long.TWO_PWR_32_DBL_ + this.low_;
+};
+
+
+/**
+ * @return {number} Returns the number of bits needed to represent the absolute
+ * value of this Long.
+ */
+goog.math.Long.prototype.getNumBitsAbs = function() {
+ if (this.isNegative()) {
+ if (this.equals(goog.math.Long.getMinValue())) {
+ return 64;
+ } else {
+ return this.negate().getNumBitsAbs();
+ }
+ } else {
+ var val = this.high_ != 0 ? this.high_ : this.low_;
+ for (var bit = 31; bit > 0; bit--) {
+ if ((val & (1 << bit)) != 0) {
+ break;
+ }
+ }
+ return this.high_ != 0 ? bit + 33 : bit + 1;
+ }
+};
+
+
+/** @return {boolean} Whether this value is zero. */
+goog.math.Long.prototype.isZero = function() {
+ return this.high_ == 0 && this.low_ == 0;
+};
+
+
+/** @return {boolean} Whether this value is negative. */
+goog.math.Long.prototype.isNegative = function() {
+ return this.high_ < 0;
+};
+
+
+/** @return {boolean} Whether this value is odd. */
+goog.math.Long.prototype.isOdd = function() {
+ return (this.low_ & 1) == 1;
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long equals the other.
+ */
+goog.math.Long.prototype.equals = function(other) {
+ return (this.high_ == other.high_) && (this.low_ == other.low_);
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long does not equal the other.
+ */
+goog.math.Long.prototype.notEquals = function(other) {
+ return (this.high_ != other.high_) || (this.low_ != other.low_);
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long is less than the other.
+ */
+goog.math.Long.prototype.lessThan = function(other) {
+ return this.compare(other) < 0;
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long is less than or equal to the other.
+ */
+goog.math.Long.prototype.lessThanOrEqual = function(other) {
+ return this.compare(other) <= 0;
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long is greater than the other.
+ */
+goog.math.Long.prototype.greaterThan = function(other) {
+ return this.compare(other) > 0;
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long is greater than or equal to the other.
+ */
+goog.math.Long.prototype.greaterThanOrEqual = function(other) {
+ return this.compare(other) >= 0;
+};
+
+
+/**
+ * Compares this Long with the given one.
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {number} 0 if they are the same, 1 if the this is greater, and -1
+ * if the given one is greater.
+ */
+goog.math.Long.prototype.compare = function(other) {
+ if (this.equals(other)) {
+ return 0;
+ }
+
+ var thisNeg = this.isNegative();
+ var otherNeg = other.isNegative();
+ if (thisNeg && !otherNeg) {
+ return -1;
+ }
+ if (!thisNeg && otherNeg) {
+ return 1;
+ }
+
+ // at this point, the signs are the same, so subtraction will not overflow
+ if (this.subtract(other).isNegative()) {
+ return -1;
+ } else {
+ return 1;
+ }
+};
+
+
+/** @return {!goog.math.Long} The negation of this value. */
+goog.math.Long.prototype.negate = function() {
+ if (this.equals(goog.math.Long.getMinValue())) {
+ return goog.math.Long.getMinValue();
+ } else {
+ return this.not().add(goog.math.Long.getOne());
+ }
+};
+
+
+/**
+ * Returns the sum of this and the given Long.
+ * @param {goog.math.Long} other Long to add to this one.
+ * @return {!goog.math.Long} The sum of this and the given Long.
+ */
+goog.math.Long.prototype.add = function(other) {
+ // Divide each number into 4 chunks of 16 bits, and then sum the chunks.
+
+ var a48 = this.high_ >>> 16;
+ var a32 = this.high_ & 0xFFFF;
+ var a16 = this.low_ >>> 16;
+ var a00 = this.low_ & 0xFFFF;
+
+ var b48 = other.high_ >>> 16;
+ var b32 = other.high_ & 0xFFFF;
+ var b16 = other.low_ >>> 16;
+ var b00 = other.low_ & 0xFFFF;
+
+ var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
+ c00 += a00 + b00;
+ c16 += c00 >>> 16;
+ c00 &= 0xFFFF;
+ c16 += a16 + b16;
+ c32 += c16 >>> 16;
+ c16 &= 0xFFFF;
+ c32 += a32 + b32;
+ c48 += c32 >>> 16;
+ c32 &= 0xFFFF;
+ c48 += a48 + b48;
+ c48 &= 0xFFFF;
+ return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);
+};
+
+
+/**
+ * Returns the difference of this and the given Long.
+ * @param {goog.math.Long} other Long to subtract from this.
+ * @return {!goog.math.Long} The difference of this and the given Long.
+ */
+goog.math.Long.prototype.subtract = function(other) {
+ return this.add(other.negate());
+};
+
+
+/**
+ * Returns the product of this and the given long.
+ * @param {goog.math.Long} other Long to multiply with this.
+ * @return {!goog.math.Long} The product of this and the other.
+ */
+goog.math.Long.prototype.multiply = function(other) {
+ if (this.isZero()) {
+ return goog.math.Long.getZero();
+ } else if (other.isZero()) {
+ return goog.math.Long.getZero();
+ }
+
+ if (this.equals(goog.math.Long.getMinValue())) {
+ return other.isOdd() ? goog.math.Long.getMinValue() :
+ goog.math.Long.getZero();
+ } else if (other.equals(goog.math.Long.getMinValue())) {
+ return this.isOdd() ? goog.math.Long.getMinValue() :
+ goog.math.Long.getZero();
+ }
+
+ if (this.isNegative()) {
+ if (other.isNegative()) {
+ return this.negate().multiply(other.negate());
+ } else {
+ return this.negate().multiply(other).negate();
+ }
+ } else if (other.isNegative()) {
+ return this.multiply(other.negate()).negate();
+ }
+
+ // If both longs are small, use float multiplication
+ if (this.lessThan(goog.math.Long.getTwoPwr24()) &&
+ other.lessThan(goog.math.Long.getTwoPwr24())) {
+ return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());
+ }
+
+ // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
+ // We can skip products that would overflow.
+
+ var a48 = this.high_ >>> 16;
+ var a32 = this.high_ & 0xFFFF;
+ var a16 = this.low_ >>> 16;
+ var a00 = this.low_ & 0xFFFF;
+
+ var b48 = other.high_ >>> 16;
+ var b32 = other.high_ & 0xFFFF;
+ var b16 = other.low_ >>> 16;
+ var b00 = other.low_ & 0xFFFF;
+
+ var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
+ c00 += a00 * b00;
+ c16 += c00 >>> 16;
+ c00 &= 0xFFFF;
+ c16 += a16 * b00;
+ c32 += c16 >>> 16;
+ c16 &= 0xFFFF;
+ c16 += a00 * b16;
+ c32 += c16 >>> 16;
+ c16 &= 0xFFFF;
+ c32 += a32 * b00;
+ c48 += c32 >>> 16;
+ c32 &= 0xFFFF;
+ c32 += a16 * b16;
+ c48 += c32 >>> 16;
+ c32 &= 0xFFFF;
+ c32 += a00 * b32;
+ c48 += c32 >>> 16;
+ c32 &= 0xFFFF;
+ c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
+ c48 &= 0xFFFF;
+ return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);
+};
+
+
+/**
+ * Returns this Long divided by the given one.
+ * @param {goog.math.Long} other Long by which to divide.
+ * @return {!goog.math.Long} This Long divided by the given one.
+ */
+goog.math.Long.prototype.div = function(other) {
+ if (other.isZero()) {
+ throw Error('division by zero');
+ } else if (this.isZero()) {
+ return goog.math.Long.getZero();
+ }
+
+ if (this.equals(goog.math.Long.getMinValue())) {
+ if (other.equals(goog.math.Long.getOne()) ||
+ other.equals(goog.math.Long.getNegOne())) {
+ return goog.math.Long.getMinValue(); // recall -MIN_VALUE == MIN_VALUE
+ } else if (other.equals(goog.math.Long.getMinValue())) {
+ return goog.math.Long.getOne();
+ } else {
+ // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
+ var halfThis = this.shiftRight(1);
+ var approx = halfThis.div(other).shiftLeft(1);
+ if (approx.equals(goog.math.Long.getZero())) {
+ return other.isNegative() ? goog.math.Long.getOne() :
+ goog.math.Long.getNegOne();
+ } else {
+ var rem = this.subtract(other.multiply(approx));
+ var result = approx.add(rem.div(other));
+ return result;
+ }
+ }
+ } else if (other.equals(goog.math.Long.getMinValue())) {
+ return goog.math.Long.getZero();
+ }
+
+ if (this.isNegative()) {
+ if (other.isNegative()) {
+ return this.negate().div(other.negate());
+ } else {
+ return this.negate().div(other).negate();
+ }
+ } else if (other.isNegative()) {
+ return this.div(other.negate()).negate();
+ }
+
+ // Repeat the following until the remainder is less than other: find a
+ // floating-point that approximates remainder / other *from below*, add this
+ // into the result, and subtract it from the remainder. It is critical that
+ // the approximate value is less than or equal to the real value so that the
+ // remainder never becomes negative.
+ var res = goog.math.Long.getZero();
+ var rem = this;
+ while (rem.greaterThanOrEqual(other)) {
+ // Approximate the result of division. This may be a little greater or
+ // smaller than the actual value.
+ var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));
+
+ // We will tweak the approximate result by changing it in the 48-th digit or
+ // the smallest non-fractional digit, whichever is larger.
+ var log2 = Math.ceil(Math.log(approx) / Math.LN2);
+ var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);
+
+ // Decrease the approximation until it is smaller than the remainder. Note
+ // that if it is too large, the product overflows and is negative.
+ var approxRes = goog.math.Long.fromNumber(approx);
+ var approxRem = approxRes.multiply(other);
+ while (approxRem.isNegative() || approxRem.greaterThan(rem)) {
+ approx -= delta;
+ approxRes = goog.math.Long.fromNumber(approx);
+ approxRem = approxRes.multiply(other);
+ }
+
+ // We know the answer can't be zero... and actually, zero would cause
+ // infinite recursion since we would make no progress.
+ if (approxRes.isZero()) {
+ approxRes = goog.math.Long.getOne();
+ }
+
+ res = res.add(approxRes);
+ rem = rem.subtract(approxRem);
+ }
+ return res;
+};
+
+
+/**
+ * Returns this Long modulo the given one.
+ * @param {goog.math.Long} other Long by which to mod.
+ * @return {!goog.math.Long} This Long modulo the given one.
+ */
+goog.math.Long.prototype.modulo = function(other) {
+ return this.subtract(this.div(other).multiply(other));
+};
+
+
+/** @return {!goog.math.Long} The bitwise-NOT of this value. */
+goog.math.Long.prototype.not = function() {
+ return goog.math.Long.fromBits(~this.low_, ~this.high_);
+};
+
+
+/**
+ * Returns the bitwise-AND of this Long and the given one.
+ * @param {goog.math.Long} other The Long with which to AND.
+ * @return {!goog.math.Long} The bitwise-AND of this and the other.
+ */
+goog.math.Long.prototype.and = function(other) {
+ return goog.math.Long.fromBits(
+ this.low_ & other.low_, this.high_ & other.high_);
+};
+
+
+/**
+ * Returns the bitwise-OR of this Long and the given one.
+ * @param {goog.math.Long} other The Long with which to OR.
+ * @return {!goog.math.Long} The bitwise-OR of this and the other.
+ */
+goog.math.Long.prototype.or = function(other) {
+ return goog.math.Long.fromBits(
+ this.low_ | other.low_, this.high_ | other.high_);
+};
+
+
+/**
+ * Returns the bitwise-XOR of this Long and the given one.
+ * @param {goog.math.Long} other The Long with which to XOR.
+ * @return {!goog.math.Long} The bitwise-XOR of this and the other.
+ */
+goog.math.Long.prototype.xor = function(other) {
+ return goog.math.Long.fromBits(
+ this.low_ ^ other.low_, this.high_ ^ other.high_);
+};
+
+
+/**
+ * Returns this Long with bits shifted to the left by the given amount.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Long} This shifted to the left by the given amount.
+ */
+goog.math.Long.prototype.shiftLeft = function(numBits) {
+ numBits &= 63;
+ if (numBits == 0) {
+ return this;
+ } else {
+ var low = this.low_;
+ if (numBits < 32) {
+ var high = this.high_;
+ return goog.math.Long.fromBits(
+ low << numBits, (high << numBits) | (low >>> (32 - numBits)));
+ } else {
+ return goog.math.Long.fromBits(0, low << (numBits - 32));
+ }
+ }
+};
+
+
+/**
+ * Returns this Long with bits shifted to the right by the given amount.
+ * The new leading bits match the current sign bit.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Long} This shifted to the right by the given amount.
+ */
+goog.math.Long.prototype.shiftRight = function(numBits) {
+ numBits &= 63;
+ if (numBits == 0) {
+ return this;
+ } else {
+ var high = this.high_;
+ if (numBits < 32) {
+ var low = this.low_;
+ return goog.math.Long.fromBits(
+ (low >>> numBits) | (high << (32 - numBits)), high >> numBits);
+ } else {
+ return goog.math.Long.fromBits(
+ high >> (numBits - 32), high >= 0 ? 0 : -1);
+ }
+ }
+};
+
+
+/**
+ * Returns this Long with bits shifted to the right by the given amount, with
+ * zeros placed into the new leading bits.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Long} This shifted to the right by the given amount, with
+ * zeros placed into the new leading bits.
+ */
+goog.math.Long.prototype.shiftRightUnsigned = function(numBits) {
+ numBits &= 63;
+ if (numBits == 0) {
+ return this;
+ } else {
+ var high = this.high_;
+ if (numBits < 32) {
+ var low = this.low_;
+ return goog.math.Long.fromBits(
+ (low >>> numBits) | (high << (32 - numBits)), high >>> numBits);
+ } else if (numBits == 32) {
+ return goog.math.Long.fromBits(high, 0);
+ } else {
+ return goog.math.Long.fromBits(high >>> (numBits - 32), 0);
+ }
+ }
+};
+
+
+/**
+ * @enum {number} Ids of commonly requested Long instances.
+ * @private
+ */
+goog.math.Long.ValueCacheId_ = {
+ MAX_VALUE: 1,
+ MIN_VALUE: 2,
+ ZERO: 3,
+ ONE: 4,
+ NEG_ONE: 5,
+ TWO_PWR_24: 6
+};
diff --git a/src/http/static/viz/1/goog/math/math.js b/src/http/static/viz/1/goog/math/math.js
new file mode 100644
index 0000000..95e5fb5
--- /dev/null
+++ b/src/http/static/viz/1/goog/math/math.js
@@ -0,0 +1,447 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Additional mathematical functions.
+ */
+
+goog.provide('goog.math');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+
+
+/**
+ * Returns a random integer greater than or equal to 0 and less than {@code a}.
+ * @param {number} a The upper bound for the random integer (exclusive).
+ * @return {number} A random integer N such that 0 <= N < a.
+ */
+goog.math.randomInt = function(a) {
+ return Math.floor(Math.random() * a);
+};
+
+
+/**
+ * Returns a random number greater than or equal to {@code a} and less than
+ * {@code b}.
+ * @param {number} a The lower bound for the random number (inclusive).
+ * @param {number} b The upper bound for the random number (exclusive).
+ * @return {number} A random number N such that a <= N < b.
+ */
+goog.math.uniformRandom = function(a, b) {
+ return a + Math.random() * (b - a);
+};
+
+
+/**
+ * Takes a number and clamps it to within the provided bounds.
+ * @param {number} value The input number.
+ * @param {number} min The minimum value to return.
+ * @param {number} max The maximum value to return.
+ * @return {number} The input number if it is within bounds, or the nearest
+ * number within the bounds.
+ */
+goog.math.clamp = function(value, min, max) {
+ return Math.min(Math.max(value, min), max);
+};
+
+
+/**
+ * The % operator in JavaScript returns the remainder of a / b, but differs from
+ * some other languages in that the result will have the same sign as the
+ * dividend. For example, -1 % 8 == -1, whereas in some other languages
+ * (such as Python) the result would be 7. This function emulates the more
+ * correct modulo behavior, which is useful for certain applications such as
+ * calculating an offset index in a circular list.
+ *
+ * @param {number} a The dividend.
+ * @param {number} b The divisor.
+ * @return {number} a % b where the result is between 0 and b (either 0 <= x < b
+ * or b < x <= 0, depending on the sign of b).
+ */
+goog.math.modulo = function(a, b) {
+ var r = a % b;
+ // If r and b differ in sign, add b to wrap the result to the correct sign.
+ return (r * b < 0) ? r + b : r;
+};
+
+
+/**
+ * Performs linear interpolation between values a and b. Returns the value
+ * between a and b proportional to x (when x is between 0 and 1. When x is
+ * outside this range, the return value is a linear extrapolation).
+ * @param {number} a A number.
+ * @param {number} b A number.
+ * @param {number} x The proportion between a and b.
+ * @return {number} The interpolated value between a and b.
+ */
+goog.math.lerp = function(a, b, x) {
+ return a + x * (b - a);
+};
+
+
+/**
+ * Tests whether the two values are equal to each other, within a certain
+ * tolerance to adjust for floating point errors.
+ * @param {number} a A number.
+ * @param {number} b A number.
+ * @param {number=} opt_tolerance Optional tolerance range. Defaults
+ * to 0.000001. If specified, should be greater than 0.
+ * @return {boolean} Whether {@code a} and {@code b} are nearly equal.
+ */
+goog.math.nearlyEquals = function(a, b, opt_tolerance) {
+ return Math.abs(a - b) <= (opt_tolerance || 0.000001);
+};
+
+
+// TODO(user): Rename to normalizeAngle, retaining old name as deprecated
+// alias.
+/**
+ * Normalizes an angle to be in range [0-360). Angles outside this range will
+ * be normalized to be the equivalent angle with that range.
+ * @param {number} angle Angle in degrees.
+ * @return {number} Standardized angle.
+ */
+goog.math.standardAngle = function(angle) {
+ return goog.math.modulo(angle, 360);
+};
+
+
+/**
+ * Normalizes an angle to be in range [0-2*PI). Angles outside this range will
+ * be normalized to be the equivalent angle with that range.
+ * @param {number} angle Angle in radians.
+ * @return {number} Standardized angle.
+ */
+goog.math.standardAngleInRadians = function(angle) {
+ return goog.math.modulo(angle, 2 * Math.PI);
+};
+
+
+/**
+ * Converts degrees to radians.
+ * @param {number} angleDegrees Angle in degrees.
+ * @return {number} Angle in radians.
+ */
+goog.math.toRadians = function(angleDegrees) {
+ return angleDegrees * Math.PI / 180;
+};
+
+
+/**
+ * Converts radians to degrees.
+ * @param {number} angleRadians Angle in radians.
+ * @return {number} Angle in degrees.
+ */
+goog.math.toDegrees = function(angleRadians) {
+ return angleRadians * 180 / Math.PI;
+};
+
+
+/**
+ * For a given angle and radius, finds the X portion of the offset.
+ * @param {number} degrees Angle in degrees (zero points in +X direction).
+ * @param {number} radius Radius.
+ * @return {number} The x-distance for the angle and radius.
+ */
+goog.math.angleDx = function(degrees, radius) {
+ return radius * Math.cos(goog.math.toRadians(degrees));
+};
+
+
+/**
+ * For a given angle and radius, finds the Y portion of the offset.
+ * @param {number} degrees Angle in degrees (zero points in +X direction).
+ * @param {number} radius Radius.
+ * @return {number} The y-distance for the angle and radius.
+ */
+goog.math.angleDy = function(degrees, radius) {
+ return radius * Math.sin(goog.math.toRadians(degrees));
+};
+
+
+/**
+ * Computes the angle between two points (x1,y1) and (x2,y2).
+ * Angle zero points in the +X direction, 90 degrees points in the +Y
+ * direction (down) and from there we grow clockwise towards 360 degrees.
+ * @param {number} x1 x of first point.
+ * @param {number} y1 y of first point.
+ * @param {number} x2 x of second point.
+ * @param {number} y2 y of second point.
+ * @return {number} Standardized angle in degrees of the vector from
+ * x1,y1 to x2,y2.
+ */
+goog.math.angle = function(x1, y1, x2, y2) {
+ return goog.math.standardAngle(
+ goog.math.toDegrees(Math.atan2(y2 - y1, x2 - x1)));
+};
+
+
+/**
+ * Computes the difference between startAngle and endAngle (angles in degrees).
+ * @param {number} startAngle Start angle in degrees.
+ * @param {number} endAngle End angle in degrees.
+ * @return {number} The number of degrees that when added to
+ * startAngle will result in endAngle. Positive numbers mean that the
+ * direction is clockwise. Negative numbers indicate a counter-clockwise
+ * direction.
+ * The shortest route (clockwise vs counter-clockwise) between the angles
+ * is used.
+ * When the difference is 180 degrees, the function returns 180 (not -180)
+ * angleDifference(30, 40) is 10, and angleDifference(40, 30) is -10.
+ * angleDifference(350, 10) is 20, and angleDifference(10, 350) is -20.
+ */
+goog.math.angleDifference = function(startAngle, endAngle) {
+ var d =
+ goog.math.standardAngle(endAngle) - goog.math.standardAngle(startAngle);
+ if (d > 180) {
+ d = d - 360;
+ } else if (d <= -180) {
+ d = 360 + d;
+ }
+ return d;
+};
+
+
+/**
+ * Returns the sign of a number as per the "sign" or "signum" function.
+ * @param {number} x The number to take the sign of.
+ * @return {number} -1 when negative, 1 when positive, 0 when 0. Preserves
+ * signed zeros and NaN.
+ */
+goog.math.sign = Math.sign || function(x) {
+ if (x > 0) {
+ return 1;
+ }
+ if (x < 0) {
+ return -1;
+ }
+ return x; // Preserves signed zeros and NaN.
+};
+
+
+/**
+ * JavaScript implementation of Longest Common Subsequence problem.
+ * http://en.wikipedia.org/wiki/Longest_common_subsequence
+ *
+ * Returns the longest possible array that is subarray of both of given arrays.
+ *
+ * @param {IArrayLike<S>} array1 First array of objects.
+ * @param {IArrayLike<T>} array2 Second array of objects.
+ * @param {Function=} opt_compareFn Function that acts as a custom comparator
+ * for the array ojects. Function should return true if objects are equal,
+ * otherwise false.
+ * @param {Function=} opt_collectorFn Function used to decide what to return
+ * as a result subsequence. It accepts 2 arguments: index of common element
+ * in the first array and index in the second. The default function returns
+ * element from the first array.
+ * @return {!Array<S|T>} A list of objects that are common to both arrays
+ * such that there is no common subsequence with size greater than the
+ * length of the list.
+ * @template S,T
+ */
+goog.math.longestCommonSubsequence = function(
+ array1, array2, opt_compareFn, opt_collectorFn) {
+
+ var compare = opt_compareFn || function(a, b) { return a == b; };
+
+ var collect = opt_collectorFn || function(i1, i2) { return array1[i1]; };
+
+ var length1 = array1.length;
+ var length2 = array2.length;
+
+ var arr = [];
+ for (var i = 0; i < length1 + 1; i++) {
+ arr[i] = [];
+ arr[i][0] = 0;
+ }
+
+ for (var j = 0; j < length2 + 1; j++) {
+ arr[0][j] = 0;
+ }
+
+ for (i = 1; i <= length1; i++) {
+ for (j = 1; j <= length2; j++) {
+ if (compare(array1[i - 1], array2[j - 1])) {
+ arr[i][j] = arr[i - 1][j - 1] + 1;
+ } else {
+ arr[i][j] = Math.max(arr[i - 1][j], arr[i][j - 1]);
+ }
+ }
+ }
+
+ // Backtracking
+ var result = [];
+ var i = length1, j = length2;
+ while (i > 0 && j > 0) {
+ if (compare(array1[i - 1], array2[j - 1])) {
+ result.unshift(collect(i - 1, j - 1));
+ i--;
+ j--;
+ } else {
+ if (arr[i - 1][j] > arr[i][j - 1]) {
+ i--;
+ } else {
+ j--;
+ }
+ }
+ }
+
+ return result;
+};
+
+
+/**
+ * Returns the sum of the arguments.
+ * @param {...number} var_args Numbers to add.
+ * @return {number} The sum of the arguments (0 if no arguments were provided,
+ * {@code NaN} if any of the arguments is not a valid number).
+ */
+goog.math.sum = function(var_args) {
+ return /** @type {number} */ (
+ goog.array.reduce(
+ arguments, function(sum, value) { return sum + value; }, 0));
+};
+
+
+/**
+ * Returns the arithmetic mean of the arguments.
+ * @param {...number} var_args Numbers to average.
+ * @return {number} The average of the arguments ({@code NaN} if no arguments
+ * were provided or any of the arguments is not a valid number).
+ */
+goog.math.average = function(var_args) {
+ return goog.math.sum.apply(null, arguments) / arguments.length;
+};
+
+
+/**
+ * Returns the unbiased sample variance of the arguments. For a definition,
+ * see e.g. http://en.wikipedia.org/wiki/Variance
+ * @param {...number} var_args Number samples to analyze.
+ * @return {number} The unbiased sample variance of the arguments (0 if fewer
+ * than two samples were provided, or {@code NaN} if any of the samples is
+ * not a valid number).
+ */
+goog.math.sampleVariance = function(var_args) {
+ var sampleSize = arguments.length;
+ if (sampleSize < 2) {
+ return 0;
+ }
+
+ var mean = goog.math.average.apply(null, arguments);
+ var variance =
+ goog.math.sum.apply(null, goog.array.map(arguments, function(val) {
+ return Math.pow(val - mean, 2);
+ })) / (sampleSize - 1);
+
+ return variance;
+};
+
+
+/**
+ * Returns the sample standard deviation of the arguments. For a definition of
+ * sample standard deviation, see e.g.
+ * http://en.wikipedia.org/wiki/Standard_deviation
+ * @param {...number} var_args Number samples to analyze.
+ * @return {number} The sample standard deviation of the arguments (0 if fewer
+ * than two samples were provided, or {@code NaN} if any of the samples is
+ * not a valid number).
+ */
+goog.math.standardDeviation = function(var_args) {
+ return Math.sqrt(goog.math.sampleVariance.apply(null, arguments));
+};
+
+
+/**
+ * Returns whether the supplied number represents an integer, i.e. that is has
+ * no fractional component. No range-checking is performed on the number.
+ * @param {number} num The number to test.
+ * @return {boolean} Whether {@code num} is an integer.
+ */
+goog.math.isInt = function(num) {
+ return isFinite(num) && num % 1 == 0;
+};
+
+
+/**
+ * Returns whether the supplied number is finite and not NaN.
+ * @param {number} num The number to test.
+ * @return {boolean} Whether {@code num} is a finite number.
+ */
+goog.math.isFiniteNumber = function(num) {
+ return isFinite(num) && !isNaN(num);
+};
+
+
+/**
+ * @param {number} num The number to test.
+ * @return {boolean} Whether it is negative zero.
+ */
+goog.math.isNegativeZero = function(num) {
+ return num == 0 && 1 / num < 0;
+};
+
+
+/**
+ * Returns the precise value of floor(log10(num)).
+ * Simpler implementations didn't work because of floating point rounding
+ * errors. For example
+ * <ul>
+ * <li>Math.floor(Math.log(num) / Math.LN10) is off by one for num == 1e+3.
+ * <li>Math.floor(Math.log(num) * Math.LOG10E) is off by one for num == 1e+15.
+ * <li>Math.floor(Math.log10(num)) is off by one for num == 1e+15 - 1.
+ * </ul>
+ * @param {number} num A floating point number.
+ * @return {number} Its logarithm to base 10 rounded down to the nearest
+ * integer if num > 0. -Infinity if num == 0. NaN if num < 0.
+ */
+goog.math.log10Floor = function(num) {
+ if (num > 0) {
+ var x = Math.round(Math.log(num) * Math.LOG10E);
+ return x - (parseFloat('1e' + x) > num ? 1 : 0);
+ }
+ return num == 0 ? -Infinity : NaN;
+};
+
+
+/**
+ * A tweaked variant of {@code Math.floor} which tolerates if the passed number
+ * is infinitesimally smaller than the closest integer. It often happens with
+ * the results of floating point calculations because of the finite precision
+ * of the intermediate results. For example {@code Math.floor(Math.log(1000) /
+ * Math.LN10) == 2}, not 3 as one would expect.
+ * @param {number} num A number.
+ * @param {number=} opt_epsilon An infinitesimally small positive number, the
+ * rounding error to tolerate.
+ * @return {number} The largest integer less than or equal to {@code num}.
+ */
+goog.math.safeFloor = function(num, opt_epsilon) {
+ goog.asserts.assert(!goog.isDef(opt_epsilon) || opt_epsilon > 0);
+ return Math.floor(num + (opt_epsilon || 2e-15));
+};
+
+
+/**
+ * A tweaked variant of {@code Math.ceil}. See {@code goog.math.safeFloor} for
+ * details.
+ * @param {number} num A number.
+ * @param {number=} opt_epsilon An infinitesimally small positive number, the
+ * rounding error to tolerate.
+ * @return {number} The smallest integer greater than or equal to {@code num}.
+ */
+goog.math.safeCeil = function(num, opt_epsilon) {
+ goog.asserts.assert(!goog.isDef(opt_epsilon) || opt_epsilon > 0);
+ return Math.ceil(num - (opt_epsilon || 2e-15));
+};
diff --git a/src/http/static/viz/1/goog/math/size.js b/src/http/static/viz/1/goog/math/size.js
new file mode 100644
index 0000000..f5c379b
--- /dev/null
+++ b/src/http/static/viz/1/goog/math/size.js
@@ -0,0 +1,227 @@
+// Copyright 2007 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A utility class for representing two-dimensional sizes.
+ * @author brenneman@google.com (Shawn Brenneman)
+ */
+
+
+goog.provide('goog.math.Size');
+
+
+
+/**
+ * Class for representing sizes consisting of a width and height. Undefined
+ * width and height support is deprecated and results in compiler warning.
+ * @param {number} width Width.
+ * @param {number} height Height.
+ * @struct
+ * @constructor
+ */
+goog.math.Size = function(width, height) {
+ /**
+ * Width
+ * @type {number}
+ */
+ this.width = width;
+
+ /**
+ * Height
+ * @type {number}
+ */
+ this.height = height;
+};
+
+
+/**
+ * Compares sizes for equality.
+ * @param {goog.math.Size} a A Size.
+ * @param {goog.math.Size} b A Size.
+ * @return {boolean} True iff the sizes have equal widths and equal
+ * heights, or if both are null.
+ */
+goog.math.Size.equals = function(a, b) {
+ if (a == b) {
+ return true;
+ }
+ if (!a || !b) {
+ return false;
+ }
+ return a.width == b.width && a.height == b.height;
+};
+
+
+/**
+ * @return {!goog.math.Size} A new copy of the Size.
+ */
+goog.math.Size.prototype.clone = function() {
+ return new goog.math.Size(this.width, this.height);
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a nice string representing size.
+ * @return {string} In the form (50 x 73).
+ * @override
+ */
+ goog.math.Size.prototype.toString = function() {
+ return '(' + this.width + ' x ' + this.height + ')';
+ };
+}
+
+
+/**
+ * @return {number} The longer of the two dimensions in the size.
+ */
+goog.math.Size.prototype.getLongest = function() {
+ return Math.max(this.width, this.height);
+};
+
+
+/**
+ * @return {number} The shorter of the two dimensions in the size.
+ */
+goog.math.Size.prototype.getShortest = function() {
+ return Math.min(this.width, this.height);
+};
+
+
+/**
+ * @return {number} The area of the size (width * height).
+ */
+goog.math.Size.prototype.area = function() {
+ return this.width * this.height;
+};
+
+
+/**
+ * @return {number} The perimeter of the size (width + height) * 2.
+ */
+goog.math.Size.prototype.perimeter = function() {
+ return (this.width + this.height) * 2;
+};
+
+
+/**
+ * @return {number} The ratio of the size's width to its height.
+ */
+goog.math.Size.prototype.aspectRatio = function() {
+ return this.width / this.height;
+};
+
+
+/**
+ * @return {boolean} True if the size has zero area, false if both dimensions
+ * are non-zero numbers.
+ */
+goog.math.Size.prototype.isEmpty = function() {
+ return !this.area();
+};
+
+
+/**
+ * Clamps the width and height parameters upward to integer values.
+ * @return {!goog.math.Size} This size with ceil'd components.
+ */
+goog.math.Size.prototype.ceil = function() {
+ this.width = Math.ceil(this.width);
+ this.height = Math.ceil(this.height);
+ return this;
+};
+
+
+/**
+ * @param {!goog.math.Size} target The target size.
+ * @return {boolean} True if this Size is the same size or smaller than the
+ * target size in both dimensions.
+ */
+goog.math.Size.prototype.fitsInside = function(target) {
+ return this.width <= target.width && this.height <= target.height;
+};
+
+
+/**
+ * Clamps the width and height parameters downward to integer values.
+ * @return {!goog.math.Size} This size with floored components.
+ */
+goog.math.Size.prototype.floor = function() {
+ this.width = Math.floor(this.width);
+ this.height = Math.floor(this.height);
+ return this;
+};
+
+
+/**
+ * Rounds the width and height parameters to integer values.
+ * @return {!goog.math.Size} This size with rounded components.
+ */
+goog.math.Size.prototype.round = function() {
+ this.width = Math.round(this.width);
+ this.height = Math.round(this.height);
+ return this;
+};
+
+
+/**
+ * Scales this size by the given scale factors. The width and height are scaled
+ * by {@code sx} and {@code opt_sy} respectively. If {@code opt_sy} is not
+ * given, then {@code sx} is used for both the width and height.
+ * @param {number} sx The scale factor to use for the width.
+ * @param {number=} opt_sy The scale factor to use for the height.
+ * @return {!goog.math.Size} This Size object after scaling.
+ */
+goog.math.Size.prototype.scale = function(sx, opt_sy) {
+ var sy = goog.isNumber(opt_sy) ? opt_sy : sx;
+ this.width *= sx;
+ this.height *= sy;
+ return this;
+};
+
+
+/**
+ * Uniformly scales the size to perfectly cover the dimensions of a given size.
+ * If the size is already larger than the target, it will be scaled down to the
+ * minimum size at which it still covers the entire target. The original aspect
+ * ratio will be preserved.
+ *
+ * This function assumes that both Sizes contain strictly positive dimensions.
+ * @param {!goog.math.Size} target The target size.
+ * @return {!goog.math.Size} This Size object, after optional scaling.
+ */
+goog.math.Size.prototype.scaleToCover = function(target) {
+ var s = this.aspectRatio() <= target.aspectRatio() ?
+ target.width / this.width :
+ target.height / this.height;
+
+ return this.scale(s);
+};
+
+
+/**
+ * Uniformly scales the size to fit inside the dimensions of a given size. The
+ * original aspect ratio will be preserved.
+ *
+ * This function assumes that both Sizes contain strictly positive dimensions.
+ * @param {!goog.math.Size} target The target size.
+ * @return {!goog.math.Size} This Size object, after optional scaling.
+ */
+goog.math.Size.prototype.scaleToFit = function(target) {
+ var s = this.aspectRatio() > target.aspectRatio() ?
+ target.width / this.width :
+ target.height / this.height;
+
+ return this.scale(s);
+};
diff --git a/src/http/static/viz/1/goog/object/object.js b/src/http/static/viz/1/goog/object/object.js
new file mode 100644
index 0000000..d15c88c
--- /dev/null
+++ b/src/http/static/viz/1/goog/object/object.js
@@ -0,0 +1,705 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for manipulating objects/maps/hashes.
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+goog.provide('goog.object');
+
+
+/**
+ * Whether two values are not observably distinguishable. This
+ * correctly detects that 0 is not the same as -0 and two NaNs are
+ * practically equivalent.
+ *
+ * The implementation is as suggested by harmony:egal proposal.
+ *
+ * @param {*} v The first value to compare.
+ * @param {*} v2 The second value to compare.
+ * @return {boolean} Whether two values are not observably distinguishable.
+ * @see http://wiki.ecmascript.org/doku.php?id=harmony:egal
+ */
+goog.object.is = function(v, v2) {
+ if (v === v2) {
+ // 0 === -0, but they are not identical.
+ // We need the cast because the compiler requires that v2 is a
+ // number (although 1/v2 works with non-number). We cast to ? to
+ // stop the compiler from type-checking this statement.
+ return v !== 0 || 1 / v === 1 / /** @type {?} */ (v2);
+ }
+
+ // NaN is non-reflexive: NaN !== NaN, although they are identical.
+ return v !== v && v2 !== v2;
+};
+
+
+/**
+ * Calls a function for each element in an object/map/hash.
+ *
+ * @param {Object<K,V>} obj The object over which to iterate.
+ * @param {function(this:T,V,?,Object<K,V>):?} f The function to call
+ * for every element. This function takes 3 arguments (the value, the
+ * key and the object) and the return value is ignored.
+ * @param {T=} opt_obj This is used as the 'this' object within f.
+ * @template T,K,V
+ */
+goog.object.forEach = function(obj, f, opt_obj) {
+ for (var key in obj) {
+ f.call(/** @type {?} */ (opt_obj), obj[key], key, obj);
+ }
+};
+
+
+/**
+ * Calls a function for each element in an object/map/hash. If that call returns
+ * true, adds the element to a new object.
+ *
+ * @param {Object<K,V>} obj The object over which to iterate.
+ * @param {function(this:T,V,?,Object<K,V>):boolean} f The function to call
+ * for every element. This
+ * function takes 3 arguments (the value, the key and the object)
+ * and should return a boolean. If the return value is true the
+ * element is added to the result object. If it is false the
+ * element is not included.
+ * @param {T=} opt_obj This is used as the 'this' object within f.
+ * @return {!Object<K,V>} a new object in which only elements that passed the
+ * test are present.
+ * @template T,K,V
+ */
+goog.object.filter = function(obj, f, opt_obj) {
+ var res = {};
+ for (var key in obj) {
+ if (f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {
+ res[key] = obj[key];
+ }
+ }
+ return res;
+};
+
+
+/**
+ * For every element in an object/map/hash calls a function and inserts the
+ * result into a new object.
+ *
+ * @param {Object<K,V>} obj The object over which to iterate.
+ * @param {function(this:T,V,?,Object<K,V>):R} f The function to call
+ * for every element. This function
+ * takes 3 arguments (the value, the key and the object)
+ * and should return something. The result will be inserted
+ * into a new object.
+ * @param {T=} opt_obj This is used as the 'this' object within f.
+ * @return {!Object<K,R>} a new object with the results from f.
+ * @template T,K,V,R
+ */
+goog.object.map = function(obj, f, opt_obj) {
+ var res = {};
+ for (var key in obj) {
+ res[key] = f.call(/** @type {?} */ (opt_obj), obj[key], key, obj);
+ }
+ return res;
+};
+
+
+/**
+ * Calls a function for each element in an object/map/hash. If any
+ * call returns true, returns true (without checking the rest). If
+ * all calls return false, returns false.
+ *
+ * @param {Object<K,V>} obj The object to check.
+ * @param {function(this:T,V,?,Object<K,V>):boolean} f The function to
+ * call for every element. This function
+ * takes 3 arguments (the value, the key and the object) and should
+ * return a boolean.
+ * @param {T=} opt_obj This is used as the 'this' object within f.
+ * @return {boolean} true if any element passes the test.
+ * @template T,K,V
+ */
+goog.object.some = function(obj, f, opt_obj) {
+ for (var key in obj) {
+ if (f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {
+ return true;
+ }
+ }
+ return false;
+};
+
+
+/**
+ * Calls a function for each element in an object/map/hash. If
+ * all calls return true, returns true. If any call returns false, returns
+ * false at this point and does not continue to check the remaining elements.
+ *
+ * @param {Object<K,V>} obj The object to check.
+ * @param {?function(this:T,V,?,Object<K,V>):boolean} f The function to
+ * call for every element. This function
+ * takes 3 arguments (the value, the key and the object) and should
+ * return a boolean.
+ * @param {T=} opt_obj This is used as the 'this' object within f.
+ * @return {boolean} false if any element fails the test.
+ * @template T,K,V
+ */
+goog.object.every = function(obj, f, opt_obj) {
+ for (var key in obj) {
+ if (!f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * Returns the number of key-value pairs in the object map.
+ *
+ * @param {Object} obj The object for which to get the number of key-value
+ * pairs.
+ * @return {number} The number of key-value pairs in the object map.
+ */
+goog.object.getCount = function(obj) {
+ var rv = 0;
+ for (var key in obj) {
+ rv++;
+ }
+ return rv;
+};
+
+
+/**
+ * Returns one key from the object map, if any exists.
+ * For map literals the returned key will be the first one in most of the
+ * browsers (a know exception is Konqueror).
+ *
+ * @param {Object} obj The object to pick a key from.
+ * @return {string|undefined} The key or undefined if the object is empty.
+ */
+goog.object.getAnyKey = function(obj) {
+ for (var key in obj) {
+ return key;
+ }
+};
+
+
+/**
+ * Returns one value from the object map, if any exists.
+ * For map literals the returned value will be the first one in most of the
+ * browsers (a know exception is Konqueror).
+ *
+ * @param {Object<K,V>} obj The object to pick a value from.
+ * @return {V|undefined} The value or undefined if the object is empty.
+ * @template K,V
+ */
+goog.object.getAnyValue = function(obj) {
+ for (var key in obj) {
+ return obj[key];
+ }
+};
+
+
+/**
+ * Whether the object/hash/map contains the given object as a value.
+ * An alias for goog.object.containsValue(obj, val).
+ *
+ * @param {Object<K,V>} obj The object in which to look for val.
+ * @param {V} val The object for which to check.
+ * @return {boolean} true if val is present.
+ * @template K,V
+ */
+goog.object.contains = function(obj, val) {
+ return goog.object.containsValue(obj, val);
+};
+
+
+/**
+ * Returns the values of the object/map/hash.
+ *
+ * @param {Object<K,V>} obj The object from which to get the values.
+ * @return {!Array<V>} The values in the object/map/hash.
+ * @template K,V
+ */
+goog.object.getValues = function(obj) {
+ var res = [];
+ var i = 0;
+ for (var key in obj) {
+ res[i++] = obj[key];
+ }
+ return res;
+};
+
+
+/**
+ * Returns the keys of the object/map/hash.
+ *
+ * @param {Object} obj The object from which to get the keys.
+ * @return {!Array<string>} Array of property keys.
+ */
+goog.object.getKeys = function(obj) {
+ var res = [];
+ var i = 0;
+ for (var key in obj) {
+ res[i++] = key;
+ }
+ return res;
+};
+
+
+/**
+ * Get a value from an object multiple levels deep. This is useful for
+ * pulling values from deeply nested objects, such as JSON responses.
+ * Example usage: getValueByKeys(jsonObj, 'foo', 'entries', 3)
+ *
+ * @param {!Object} obj An object to get the value from. Can be array-like.
+ * @param {...(string|number|!IArrayLike<number|string>)}
+ * var_args A number of keys
+ * (as strings, or numbers, for array-like objects). Can also be
+ * specified as a single array of keys.
+ * @return {*} The resulting value. If, at any point, the value for a key
+ * is undefined, returns undefined.
+ */
+goog.object.getValueByKeys = function(obj, var_args) {
+ var isArrayLike = goog.isArrayLike(var_args);
+ var keys = isArrayLike ? var_args : arguments;
+
+ // Start with the 2nd parameter for the variable parameters syntax.
+ for (var i = isArrayLike ? 0 : 1; i < keys.length; i++) {
+ obj = obj[keys[i]];
+ if (!goog.isDef(obj)) {
+ break;
+ }
+ }
+
+ return obj;
+};
+
+
+/**
+ * Whether the object/map/hash contains the given key.
+ *
+ * @param {Object} obj The object in which to look for key.
+ * @param {?} key The key for which to check.
+ * @return {boolean} true If the map contains the key.
+ */
+goog.object.containsKey = function(obj, key) {
+ return obj !== null && key in obj;
+};
+
+
+/**
+ * Whether the object/map/hash contains the given value. This is O(n).
+ *
+ * @param {Object<K,V>} obj The object in which to look for val.
+ * @param {V} val The value for which to check.
+ * @return {boolean} true If the map contains the value.
+ * @template K,V
+ */
+goog.object.containsValue = function(obj, val) {
+ for (var key in obj) {
+ if (obj[key] == val) {
+ return true;
+ }
+ }
+ return false;
+};
+
+
+/**
+ * Searches an object for an element that satisfies the given condition and
+ * returns its key.
+ * @param {Object<K,V>} obj The object to search in.
+ * @param {function(this:T,V,string,Object<K,V>):boolean} f The
+ * function to call for every element. Takes 3 arguments (the value,
+ * the key and the object) and should return a boolean.
+ * @param {T=} opt_this An optional "this" context for the function.
+ * @return {string|undefined} The key of an element for which the function
+ * returns true or undefined if no such element is found.
+ * @template T,K,V
+ */
+goog.object.findKey = function(obj, f, opt_this) {
+ for (var key in obj) {
+ if (f.call(/** @type {?} */ (opt_this), obj[key], key, obj)) {
+ return key;
+ }
+ }
+ return undefined;
+};
+
+
+/**
+ * Searches an object for an element that satisfies the given condition and
+ * returns its value.
+ * @param {Object<K,V>} obj The object to search in.
+ * @param {function(this:T,V,string,Object<K,V>):boolean} f The function
+ * to call for every element. Takes 3 arguments (the value, the key
+ * and the object) and should return a boolean.
+ * @param {T=} opt_this An optional "this" context for the function.
+ * @return {V} The value of an element for which the function returns true or
+ * undefined if no such element is found.
+ * @template T,K,V
+ */
+goog.object.findValue = function(obj, f, opt_this) {
+ var key = goog.object.findKey(obj, f, opt_this);
+ return key && obj[key];
+};
+
+
+/**
+ * Whether the object/map/hash is empty.
+ *
+ * @param {Object} obj The object to test.
+ * @return {boolean} true if obj is empty.
+ */
+goog.object.isEmpty = function(obj) {
+ for (var key in obj) {
+ return false;
+ }
+ return true;
+};
+
+
+/**
+ * Removes all key value pairs from the object/map/hash.
+ *
+ * @param {Object} obj The object to clear.
+ */
+goog.object.clear = function(obj) {
+ for (var i in obj) {
+ delete obj[i];
+ }
+};
+
+
+/**
+ * Removes a key-value pair based on the key.
+ *
+ * @param {Object} obj The object from which to remove the key.
+ * @param {?} key The key to remove.
+ * @return {boolean} Whether an element was removed.
+ */
+goog.object.remove = function(obj, key) {
+ var rv;
+ if (rv = key in /** @type {!Object} */ (obj)) {
+ delete obj[key];
+ }
+ return rv;
+};
+
+
+/**
+ * Adds a key-value pair to the object. Throws an exception if the key is
+ * already in use. Use set if you want to change an existing pair.
+ *
+ * @param {Object<K,V>} obj The object to which to add the key-value pair.
+ * @param {string} key The key to add.
+ * @param {V} val The value to add.
+ * @template K,V
+ */
+goog.object.add = function(obj, key, val) {
+ if (obj !== null && key in obj) {
+ throw Error('The object already contains the key "' + key + '"');
+ }
+ goog.object.set(obj, key, val);
+};
+
+
+/**
+ * Returns the value for the given key.
+ *
+ * @param {Object<K,V>} obj The object from which to get the value.
+ * @param {string} key The key for which to get the value.
+ * @param {R=} opt_val The value to return if no item is found for the given
+ * key (default is undefined).
+ * @return {V|R|undefined} The value for the given key.
+ * @template K,V,R
+ */
+goog.object.get = function(obj, key, opt_val) {
+ if (obj !== null && key in obj) {
+ return obj[key];
+ }
+ return opt_val;
+};
+
+
+/**
+ * Adds a key-value pair to the object/map/hash.
+ *
+ * @param {Object<K,V>} obj The object to which to add the key-value pair.
+ * @param {string} key The key to add.
+ * @param {V} value The value to add.
+ * @template K,V
+ */
+goog.object.set = function(obj, key, value) {
+ obj[key] = value;
+};
+
+
+/**
+ * Adds a key-value pair to the object/map/hash if it doesn't exist yet.
+ *
+ * @param {Object<K,V>} obj The object to which to add the key-value pair.
+ * @param {string} key The key to add.
+ * @param {V} value The value to add if the key wasn't present.
+ * @return {V} The value of the entry at the end of the function.
+ * @template K,V
+ */
+goog.object.setIfUndefined = function(obj, key, value) {
+ return key in /** @type {!Object} */ (obj) ? obj[key] : (obj[key] = value);
+};
+
+
+/**
+ * Sets a key and value to an object if the key is not set. The value will be
+ * the return value of the given function. If the key already exists, the
+ * object will not be changed and the function will not be called (the function
+ * will be lazily evaluated -- only called if necessary).
+ *
+ * This function is particularly useful for use with a map used a as a cache.
+ *
+ * @param {!Object<K,V>} obj The object to which to add the key-value pair.
+ * @param {string} key The key to add.
+ * @param {function():V} f The value to add if the key wasn't present.
+ * @return {V} The value of the entry at the end of the function.
+ * @template K,V
+ */
+goog.object.setWithReturnValueIfNotSet = function(obj, key, f) {
+ if (key in obj) {
+ return obj[key];
+ }
+
+ var val = f();
+ obj[key] = val;
+ return val;
+};
+
+
+/**
+ * Compares two objects for equality using === on the values.
+ *
+ * @param {!Object<K,V>} a
+ * @param {!Object<K,V>} b
+ * @return {boolean}
+ * @template K,V
+ */
+goog.object.equals = function(a, b) {
+ for (var k in a) {
+ if (!(k in b) || a[k] !== b[k]) {
+ return false;
+ }
+ }
+ for (var k in b) {
+ if (!(k in a)) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * Returns a shallow clone of the object.
+ *
+ * @param {Object<K,V>} obj Object to clone.
+ * @return {!Object<K,V>} Clone of the input object.
+ * @template K,V
+ */
+goog.object.clone = function(obj) {
+ // We cannot use the prototype trick because a lot of methods depend on where
+ // the actual key is set.
+
+ var res = {};
+ for (var key in obj) {
+ res[key] = obj[key];
+ }
+ return res;
+ // We could also use goog.mixin but I wanted this to be independent from that.
+};
+
+
+/**
+ * Clones a value. The input may be an Object, Array, or basic type. Objects and
+ * arrays will be cloned recursively.
+ *
+ * WARNINGS:
+ * <code>goog.object.unsafeClone</code> does not detect reference loops. Objects
+ * that refer to themselves will cause infinite recursion.
+ *
+ * <code>goog.object.unsafeClone</code> is unaware of unique identifiers, and
+ * copies UIDs created by <code>getUid</code> into cloned results.
+ *
+ * @param {*} obj The value to clone.
+ * @return {*} A clone of the input value.
+ */
+goog.object.unsafeClone = function(obj) {
+ var type = goog.typeOf(obj);
+ if (type == 'object' || type == 'array') {
+ if (goog.isFunction(obj.clone)) {
+ return obj.clone();
+ }
+ var clone = type == 'array' ? [] : {};
+ for (var key in obj) {
+ clone[key] = goog.object.unsafeClone(obj[key]);
+ }
+ return clone;
+ }
+
+ return obj;
+};
+
+
+/**
+ * Returns a new object in which all the keys and values are interchanged
+ * (keys become values and values become keys). If multiple keys map to the
+ * same value, the chosen transposed value is implementation-dependent.
+ *
+ * @param {Object} obj The object to transpose.
+ * @return {!Object} The transposed object.
+ */
+goog.object.transpose = function(obj) {
+ var transposed = {};
+ for (var key in obj) {
+ transposed[obj[key]] = key;
+ }
+ return transposed;
+};
+
+
+/**
+ * The names of the fields that are defined on Object.prototype.
+ * @type {Array<string>}
+ * @private
+ */
+goog.object.PROTOTYPE_FIELDS_ = [
+ 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
+ 'toLocaleString', 'toString', 'valueOf'
+];
+
+
+/**
+ * Extends an object with another object.
+ * This operates 'in-place'; it does not create a new Object.
+ *
+ * Example:
+ * var o = {};
+ * goog.object.extend(o, {a: 0, b: 1});
+ * o; // {a: 0, b: 1}
+ * goog.object.extend(o, {b: 2, c: 3});
+ * o; // {a: 0, b: 2, c: 3}
+ *
+ * @param {Object} target The object to modify. Existing properties will be
+ * overwritten if they are also present in one of the objects in
+ * {@code var_args}.
+ * @param {...Object} var_args The objects from which values will be copied.
+ */
+goog.object.extend = function(target, var_args) {
+ var key, source;
+ for (var i = 1; i < arguments.length; i++) {
+ source = arguments[i];
+ for (key in source) {
+ target[key] = source[key];
+ }
+
+ // For IE the for-in-loop does not contain any properties that are not
+ // enumerable on the prototype object (for example isPrototypeOf from
+ // Object.prototype) and it will also not include 'replace' on objects that
+ // extend String and change 'replace' (not that it is common for anyone to
+ // extend anything except Object).
+
+ for (var j = 0; j < goog.object.PROTOTYPE_FIELDS_.length; j++) {
+ key = goog.object.PROTOTYPE_FIELDS_[j];
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+};
+
+
+/**
+ * Creates a new object built from the key-value pairs provided as arguments.
+ * @param {...*} var_args If only one argument is provided and it is an array
+ * then this is used as the arguments, otherwise even arguments are used as
+ * the property names and odd arguments are used as the property values.
+ * @return {!Object} The new object.
+ * @throws {Error} If there are uneven number of arguments or there is only one
+ * non array argument.
+ */
+goog.object.create = function(var_args) {
+ var argLength = arguments.length;
+ if (argLength == 1 && goog.isArray(arguments[0])) {
+ return goog.object.create.apply(null, arguments[0]);
+ }
+
+ if (argLength % 2) {
+ throw Error('Uneven number of arguments');
+ }
+
+ var rv = {};
+ for (var i = 0; i < argLength; i += 2) {
+ rv[arguments[i]] = arguments[i + 1];
+ }
+ return rv;
+};
+
+
+/**
+ * Creates a new object where the property names come from the arguments but
+ * the value is always set to true
+ * @param {...*} var_args If only one argument is provided and it is an array
+ * then this is used as the arguments, otherwise the arguments are used
+ * as the property names.
+ * @return {!Object} The new object.
+ */
+goog.object.createSet = function(var_args) {
+ var argLength = arguments.length;
+ if (argLength == 1 && goog.isArray(arguments[0])) {
+ return goog.object.createSet.apply(null, arguments[0]);
+ }
+
+ var rv = {};
+ for (var i = 0; i < argLength; i++) {
+ rv[arguments[i]] = true;
+ }
+ return rv;
+};
+
+
+/**
+ * Creates an immutable view of the underlying object, if the browser
+ * supports immutable objects.
+ *
+ * In default mode, writes to this view will fail silently. In strict mode,
+ * they will throw an error.
+ *
+ * @param {!Object<K,V>} obj An object.
+ * @return {!Object<K,V>} An immutable view of that object, or the
+ * original object if this browser does not support immutables.
+ * @template K,V
+ */
+goog.object.createImmutableView = function(obj) {
+ var result = obj;
+ if (Object.isFrozen && !Object.isFrozen(obj)) {
+ result = Object.create(obj);
+ Object.freeze(result);
+ }
+ return result;
+};
+
+
+/**
+ * @param {!Object} obj An object.
+ * @return {boolean} Whether this is an immutable view of the object.
+ */
+goog.object.isImmutableView = function(obj) {
+ return !!Object.isFrozen && Object.isFrozen(obj);
+};
diff --git a/src/http/static/viz/1/goog/reflect/reflect.js b/src/http/static/viz/1/goog/reflect/reflect.js
new file mode 100644
index 0000000..5a88b45
--- /dev/null
+++ b/src/http/static/viz/1/goog/reflect/reflect.js
@@ -0,0 +1,138 @@
+// Copyright 2009 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Useful compiler idioms.
+ *
+ * @author johnlenz@google.com (John Lenz)
+ */
+
+goog.provide('goog.reflect');
+
+
+/**
+ * Syntax for object literal casts.
+ * @see http://go/jscompiler-renaming
+ * @see https://goo.gl/CRs09P
+ *
+ * Use this if you have an object literal whose keys need to have the same names
+ * as the properties of some class even after they are renamed by the compiler.
+ *
+ * @param {!Function} type Type to cast to.
+ * @param {Object} object Object literal to cast.
+ * @return {Object} The object literal.
+ */
+goog.reflect.object = function(type, object) {
+ return object;
+};
+
+/**
+ * Syntax for renaming property strings.
+ * @see http://go/jscompiler-renaming
+ * @see https://goo.gl/CRs09P
+ *
+ * Use this if you have an need to access a property as a string, but want
+ * to also have the property renamed by the compiler. In contrast to
+ * goog.reflect.object, this method takes an instance of an object.
+ *
+ * Properties must be simple names (not qualified names).
+ *
+ * @param {string} prop Name of the property
+ * @param {!Object} object Instance of the object whose type will be used
+ * for renaming
+ * @return {string} The renamed property.
+ */
+goog.reflect.objectProperty = function(prop, object) {
+ return prop;
+};
+
+/**
+ * To assert to the compiler that an operation is needed when it would
+ * otherwise be stripped. For example:
+ * <code>
+ * // Force a layout
+ * goog.reflect.sinkValue(dialog.offsetHeight);
+ * </code>
+ * @param {T} x
+ * @return {T}
+ * @template T
+ */
+goog.reflect.sinkValue = function(x) {
+ goog.reflect.sinkValue[' '](x);
+ return x;
+};
+
+
+/**
+ * The compiler should optimize this function away iff no one ever uses
+ * goog.reflect.sinkValue.
+ */
+goog.reflect.sinkValue[' '] = goog.nullFunction;
+
+
+/**
+ * Check if a property can be accessed without throwing an exception.
+ * @param {Object} obj The owner of the property.
+ * @param {string} prop The property name.
+ * @return {boolean} Whether the property is accessible. Will also return true
+ * if obj is null.
+ */
+goog.reflect.canAccessProperty = function(obj, prop) {
+ /** @preserveTry */
+ try {
+ goog.reflect.sinkValue(obj[prop]);
+ return true;
+ } catch (e) {
+ }
+ return false;
+};
+
+
+/**
+ * Retrieves a value from a cache given a key. The compiler provides special
+ * consideration for this call such that it is generally considered side-effect
+ * free. However, if the {@code opt_keyFn} or {@code valueFn} have side-effects
+ * then the entire call is considered to have side-effects.
+ *
+ * Conventionally storing the value on the cache would be considered a
+ * side-effect and preclude unused calls from being pruned, ie. even if
+ * the value was never used, it would still always be stored in the cache.
+ *
+ * Providing a side-effect free {@code valueFn} and {@code opt_keyFn}
+ * allows unused calls to {@code goog.cache} to be pruned.
+ *
+ * @param {!Object<K, V>} cacheObj The object that contains the cached values.
+ * @param {?} key The key to lookup in the cache. If it is not string or number
+ * then a {@code opt_keyFn} should be provided. The key is also used as the
+ * parameter to the {@code valueFn}.
+ * @param {!function(?):V} valueFn The value provider to use to calculate the
+ * value to store in the cache. This function should be side-effect free
+ * to take advantage of the optimization.
+ * @param {function(?):K=} opt_keyFn The key provider to determine the cache
+ * map key. This should be used if the given key is not a string or number.
+ * If not provided then the given key is used. This function should be
+ * side-effect free to take advantage of the optimization.
+ * @return {V} The cached or calculated value.
+ * @template K
+ * @template V
+ */
+goog.reflect.cache = function(cacheObj, key, valueFn, opt_keyFn) {
+ var storedKey = opt_keyFn ? opt_keyFn(key) : key;
+
+ if (Object.prototype.hasOwnProperty.call(cacheObj, storedKey)) {
+ return cacheObj[storedKey];
+ }
+
+ return (cacheObj[storedKey] = valueFn(key));
+};
diff --git a/src/http/static/viz/1/goog/string/const.js b/src/http/static/viz/1/goog/string/const.js
new file mode 100644
index 0000000..7f919be
--- /dev/null
+++ b/src/http/static/viz/1/goog/string/const.js
@@ -0,0 +1,182 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+goog.provide('goog.string.Const');
+
+goog.require('goog.asserts');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * Wrapper for compile-time-constant strings.
+ *
+ * Const is a wrapper for strings that can only be created from program
+ * constants (i.e., string literals). This property relies on a custom Closure
+ * compiler check that {@code goog.string.Const.from} is only invoked on
+ * compile-time-constant expressions.
+ *
+ * Const is useful in APIs whose correct and secure use requires that certain
+ * arguments are not attacker controlled: Compile-time constants are inherently
+ * under the control of the application and not under control of external
+ * attackers, and hence are safe to use in such contexts.
+ *
+ * Instances of this type must be created via its factory method
+ * {@code goog.string.Const.from} and not by invoking its constructor. The
+ * constructor intentionally takes no parameters and the type is immutable;
+ * hence only a default instance corresponding to the empty string can be
+ * obtained via constructor invocation.
+ *
+ * @see goog.string.Const#from
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.string.TypedString}
+ */
+goog.string.Const = function() {
+ /**
+ * The wrapped value of this Const object. The field has a purposely ugly
+ * name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.stringConstValueWithSecurityContract__googStringSecurityPrivate_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.string.Const#unwrap
+ * @const
+ * @private
+ */
+ this.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_ =
+ goog.string.Const.TYPE_MARKER_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.string.Const.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Returns this Const's value a string.
+ *
+ * IMPORTANT: In code where it is security-relevant that an object's type is
+ * indeed {@code goog.string.Const}, use {@code goog.string.Const.unwrap}
+ * instead of this method.
+ *
+ * @see goog.string.Const#unwrap
+ * @override
+ */
+goog.string.Const.prototype.getTypedStringValue = function() {
+ return this.stringConstValueWithSecurityContract__googStringSecurityPrivate_;
+};
+
+
+/**
+ * Returns a debug-string representation of this value.
+ *
+ * To obtain the actual string value wrapped inside an object of this type,
+ * use {@code goog.string.Const.unwrap}.
+ *
+ * @see goog.string.Const#unwrap
+ * @override
+ */
+goog.string.Const.prototype.toString = function() {
+ return 'Const{' +
+ this.stringConstValueWithSecurityContract__googStringSecurityPrivate_ +
+ '}';
+};
+
+
+/**
+ * Performs a runtime check that the provided object is indeed an instance
+ * of {@code goog.string.Const}, and returns its value.
+ * @param {!goog.string.Const} stringConst The object to extract from.
+ * @return {string} The Const object's contained string, unless the run-time
+ * type check fails. In that case, {@code unwrap} returns an innocuous
+ * string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.string.Const.unwrap = function(stringConst) {
+ // Perform additional run-time type-checking to ensure that stringConst is
+ // indeed an instance of the expected type. This provides some additional
+ // protection against security bugs due to application code that disables type
+ // checks.
+ if (stringConst instanceof goog.string.Const &&
+ stringConst.constructor === goog.string.Const &&
+ stringConst.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_ ===
+ goog.string.Const.TYPE_MARKER_) {
+ return stringConst
+ .stringConstValueWithSecurityContract__googStringSecurityPrivate_;
+ } else {
+ goog.asserts.fail(
+ 'expected object of type Const, got \'' + stringConst + '\'');
+ return 'type_error:Const';
+ }
+};
+
+
+/**
+ * Creates a Const object from a compile-time constant string.
+ *
+ * It is illegal to invoke this function on an expression whose
+ * compile-time-contant value cannot be determined by the Closure compiler.
+ *
+ * Correct invocations include,
+ * <pre>
+ * var s = goog.string.Const.from('hello');
+ * var t = goog.string.Const.from('hello' + 'world');
+ * </pre>
+ *
+ * In contrast, the following are illegal:
+ * <pre>
+ * var s = goog.string.Const.from(getHello());
+ * var t = goog.string.Const.from('hello' + world);
+ * </pre>
+ *
+ * TODO(xtof): Compile-time checks that this function is only called
+ * with compile-time constant expressions.
+ *
+ * @param {string} s A constant string from which to create a Const.
+ * @return {!goog.string.Const} A Const object initialized to stringConst.
+ */
+goog.string.Const.from = function(s) {
+ return goog.string.Const.create__googStringSecurityPrivate_(s);
+};
+
+
+/**
+ * Type marker for the Const type, used to implement additional run-time
+ * type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.string.Const.TYPE_MARKER_ = {};
+
+
+/**
+ * Utility method to create Const instances.
+ * @param {string} s The string to initialize the Const object with.
+ * @return {!goog.string.Const} The initialized Const object.
+ * @private
+ */
+goog.string.Const.create__googStringSecurityPrivate_ = function(s) {
+ var stringConst = new goog.string.Const();
+ stringConst.stringConstValueWithSecurityContract__googStringSecurityPrivate_ =
+ s;
+ return stringConst;
+};
diff --git a/src/http/static/viz/1/goog/string/string.js b/src/http/static/viz/1/goog/string/string.js
new file mode 100644
index 0000000..a2f7003
--- /dev/null
+++ b/src/http/static/viz/1/goog/string/string.js
@@ -0,0 +1,1631 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for string manipulation.
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+/**
+ * Namespace for string utilities
+ */
+goog.provide('goog.string');
+goog.provide('goog.string.Unicode');
+
+
+/**
+ * @define {boolean} Enables HTML escaping of lowercase letter "e" which helps
+ * with detection of double-escaping as this letter is frequently used.
+ */
+goog.define('goog.string.DETECT_DOUBLE_ESCAPING', false);
+
+
+/**
+ * @define {boolean} Whether to force non-dom html unescaping.
+ */
+goog.define('goog.string.FORCE_NON_DOM_HTML_UNESCAPING', false);
+
+
+/**
+ * Common Unicode string characters.
+ * @enum {string}
+ */
+goog.string.Unicode = {
+ NBSP: '\xa0'
+};
+
+
+/**
+ * Fast prefix-checker.
+ * @param {string} str The string to check.
+ * @param {string} prefix A string to look for at the start of {@code str}.
+ * @return {boolean} True if {@code str} begins with {@code prefix}.
+ */
+goog.string.startsWith = function(str, prefix) {
+ return str.lastIndexOf(prefix, 0) == 0;
+};
+
+
+/**
+ * Fast suffix-checker.
+ * @param {string} str The string to check.
+ * @param {string} suffix A string to look for at the end of {@code str}.
+ * @return {boolean} True if {@code str} ends with {@code suffix}.
+ */
+goog.string.endsWith = function(str, suffix) {
+ var l = str.length - suffix.length;
+ return l >= 0 && str.indexOf(suffix, l) == l;
+};
+
+
+/**
+ * Case-insensitive prefix-checker.
+ * @param {string} str The string to check.
+ * @param {string} prefix A string to look for at the end of {@code str}.
+ * @return {boolean} True if {@code str} begins with {@code prefix} (ignoring
+ * case).
+ */
+goog.string.caseInsensitiveStartsWith = function(str, prefix) {
+ return goog.string.caseInsensitiveCompare(
+ prefix, str.substr(0, prefix.length)) == 0;
+};
+
+
+/**
+ * Case-insensitive suffix-checker.
+ * @param {string} str The string to check.
+ * @param {string} suffix A string to look for at the end of {@code str}.
+ * @return {boolean} True if {@code str} ends with {@code suffix} (ignoring
+ * case).
+ */
+goog.string.caseInsensitiveEndsWith = function(str, suffix) {
+ return goog.string.caseInsensitiveCompare(
+ suffix, str.substr(str.length - suffix.length, suffix.length)) ==
+ 0;
+};
+
+
+/**
+ * Case-insensitive equality checker.
+ * @param {string} str1 First string to check.
+ * @param {string} str2 Second string to check.
+ * @return {boolean} True if {@code str1} and {@code str2} are the same string,
+ * ignoring case.
+ */
+goog.string.caseInsensitiveEquals = function(str1, str2) {
+ return str1.toLowerCase() == str2.toLowerCase();
+};
+
+
+/**
+ * Does simple python-style string substitution.
+ * subs("foo%s hot%s", "bar", "dog") becomes "foobar hotdog".
+ * @param {string} str The string containing the pattern.
+ * @param {...*} var_args The items to substitute into the pattern.
+ * @return {string} A copy of {@code str} in which each occurrence of
+ * {@code %s} has been replaced an argument from {@code var_args}.
+ */
+goog.string.subs = function(str, var_args) {
+ var splitParts = str.split('%s');
+ var returnString = '';
+
+ var subsArguments = Array.prototype.slice.call(arguments, 1);
+ while (subsArguments.length &&
+ // Replace up to the last split part. We are inserting in the
+ // positions between split parts.
+ splitParts.length > 1) {
+ returnString += splitParts.shift() + subsArguments.shift();
+ }
+
+ return returnString + splitParts.join('%s'); // Join unused '%s'
+};
+
+
+/**
+ * Converts multiple whitespace chars (spaces, non-breaking-spaces, new lines
+ * and tabs) to a single space, and strips leading and trailing whitespace.
+ * @param {string} str Input string.
+ * @return {string} A copy of {@code str} with collapsed whitespace.
+ */
+goog.string.collapseWhitespace = function(str) {
+ // Since IE doesn't include non-breaking-space (0xa0) in their \s character
+ // class (as required by section 7.2 of the ECMAScript spec), we explicitly
+ // include it in the regexp to enforce consistent cross-browser behavior.
+ return str.replace(/[\s\xa0]+/g, ' ').replace(/^\s+|\s+$/g, '');
+};
+
+
+/**
+ * Checks if a string is empty or contains only whitespaces.
+ * @param {string} str The string to check.
+ * @return {boolean} Whether {@code str} is empty or whitespace only.
+ */
+goog.string.isEmptyOrWhitespace = function(str) {
+ // testing length == 0 first is actually slower in all browsers (about the
+ // same in Opera).
+ // Since IE doesn't include non-breaking-space (0xa0) in their \s character
+ // class (as required by section 7.2 of the ECMAScript spec), we explicitly
+ // include it in the regexp to enforce consistent cross-browser behavior.
+ return /^[\s\xa0]*$/.test(str);
+};
+
+
+/**
+ * Checks if a string is empty.
+ * @param {string} str The string to check.
+ * @return {boolean} Whether {@code str} is empty.
+ */
+goog.string.isEmptyString = function(str) {
+ return str.length == 0;
+};
+
+
+/**
+ * Checks if a string is empty or contains only whitespaces.
+ *
+ * TODO(user): Deprecate this when clients have been switched over to
+ * goog.string.isEmptyOrWhitespace.
+ *
+ * @param {string} str The string to check.
+ * @return {boolean} Whether {@code str} is empty or whitespace only.
+ */
+goog.string.isEmpty = goog.string.isEmptyOrWhitespace;
+
+
+/**
+ * Checks if a string is null, undefined, empty or contains only whitespaces.
+ * @param {*} str The string to check.
+ * @return {boolean} Whether {@code str} is null, undefined, empty, or
+ * whitespace only.
+ * @deprecated Use goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str))
+ * instead.
+ */
+goog.string.isEmptyOrWhitespaceSafe = function(str) {
+ return goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str));
+};
+
+
+/**
+ * Checks if a string is null, undefined, empty or contains only whitespaces.
+ *
+ * TODO(user): Deprecate this when clients have been switched over to
+ * goog.string.isEmptyOrWhitespaceSafe.
+ *
+ * @param {*} str The string to check.
+ * @return {boolean} Whether {@code str} is null, undefined, empty, or
+ * whitespace only.
+ */
+goog.string.isEmptySafe = goog.string.isEmptyOrWhitespaceSafe;
+
+
+/**
+ * Checks if a string is all breaking whitespace.
+ * @param {string} str The string to check.
+ * @return {boolean} Whether the string is all breaking whitespace.
+ */
+goog.string.isBreakingWhitespace = function(str) {
+ return !/[^\t\n\r ]/.test(str);
+};
+
+
+/**
+ * Checks if a string contains all letters.
+ * @param {string} str string to check.
+ * @return {boolean} True if {@code str} consists entirely of letters.
+ */
+goog.string.isAlpha = function(str) {
+ return !/[^a-zA-Z]/.test(str);
+};
+
+
+/**
+ * Checks if a string contains only numbers.
+ * @param {*} str string to check. If not a string, it will be
+ * casted to one.
+ * @return {boolean} True if {@code str} is numeric.
+ */
+goog.string.isNumeric = function(str) {
+ return !/[^0-9]/.test(str);
+};
+
+
+/**
+ * Checks if a string contains only numbers or letters.
+ * @param {string} str string to check.
+ * @return {boolean} True if {@code str} is alphanumeric.
+ */
+goog.string.isAlphaNumeric = function(str) {
+ return !/[^a-zA-Z0-9]/.test(str);
+};
+
+
+/**
+ * Checks if a character is a space character.
+ * @param {string} ch Character to check.
+ * @return {boolean} True if {@code ch} is a space.
+ */
+goog.string.isSpace = function(ch) {
+ return ch == ' ';
+};
+
+
+/**
+ * Checks if a character is a valid unicode character.
+ * @param {string} ch Character to check.
+ * @return {boolean} True if {@code ch} is a valid unicode character.
+ */
+goog.string.isUnicodeChar = function(ch) {
+ return ch.length == 1 && ch >= ' ' && ch <= '~' ||
+ ch >= '\u0080' && ch <= '\uFFFD';
+};
+
+
+/**
+ * Takes a string and replaces newlines with a space. Multiple lines are
+ * replaced with a single space.
+ * @param {string} str The string from which to strip newlines.
+ * @return {string} A copy of {@code str} stripped of newlines.
+ */
+goog.string.stripNewlines = function(str) {
+ return str.replace(/(\r\n|\r|\n)+/g, ' ');
+};
+
+
+/**
+ * Replaces Windows and Mac new lines with unix style: \r or \r\n with \n.
+ * @param {string} str The string to in which to canonicalize newlines.
+ * @return {string} {@code str} A copy of {@code} with canonicalized newlines.
+ */
+goog.string.canonicalizeNewlines = function(str) {
+ return str.replace(/(\r\n|\r|\n)/g, '\n');
+};
+
+
+/**
+ * Normalizes whitespace in a string, replacing all whitespace chars with
+ * a space.
+ * @param {string} str The string in which to normalize whitespace.
+ * @return {string} A copy of {@code str} with all whitespace normalized.
+ */
+goog.string.normalizeWhitespace = function(str) {
+ return str.replace(/\xa0|\s/g, ' ');
+};
+
+
+/**
+ * Normalizes spaces in a string, replacing all consecutive spaces and tabs
+ * with a single space. Replaces non-breaking space with a space.
+ * @param {string} str The string in which to normalize spaces.
+ * @return {string} A copy of {@code str} with all consecutive spaces and tabs
+ * replaced with a single space.
+ */
+goog.string.normalizeSpaces = function(str) {
+ return str.replace(/\xa0|[ \t]+/g, ' ');
+};
+
+
+/**
+ * Removes the breaking spaces from the left and right of the string and
+ * collapses the sequences of breaking spaces in the middle into single spaces.
+ * The original and the result strings render the same way in HTML.
+ * @param {string} str A string in which to collapse spaces.
+ * @return {string} Copy of the string with normalized breaking spaces.
+ */
+goog.string.collapseBreakingSpaces = function(str) {
+ return str.replace(/[\t\r\n ]+/g, ' ')
+ .replace(/^[\t\r\n ]+|[\t\r\n ]+$/g, '');
+};
+
+
+/**
+ * Trims white spaces to the left and right of a string.
+ * @param {string} str The string to trim.
+ * @return {string} A trimmed copy of {@code str}.
+ */
+goog.string.trim =
+ (goog.TRUSTED_SITE && String.prototype.trim) ? function(str) {
+ return str.trim();
+ } : function(str) {
+ // Since IE doesn't include non-breaking-space (0xa0) in their \s
+ // character class (as required by section 7.2 of the ECMAScript spec),
+ // we explicitly include it in the regexp to enforce consistent
+ // cross-browser behavior.
+ return str.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
+ };
+
+
+/**
+ * Trims whitespaces at the left end of a string.
+ * @param {string} str The string to left trim.
+ * @return {string} A trimmed copy of {@code str}.
+ */
+goog.string.trimLeft = function(str) {
+ // Since IE doesn't include non-breaking-space (0xa0) in their \s character
+ // class (as required by section 7.2 of the ECMAScript spec), we explicitly
+ // include it in the regexp to enforce consistent cross-browser behavior.
+ return str.replace(/^[\s\xa0]+/, '');
+};
+
+
+/**
+ * Trims whitespaces at the right end of a string.
+ * @param {string} str The string to right trim.
+ * @return {string} A trimmed copy of {@code str}.
+ */
+goog.string.trimRight = function(str) {
+ // Since IE doesn't include non-breaking-space (0xa0) in their \s character
+ // class (as required by section 7.2 of the ECMAScript spec), we explicitly
+ // include it in the regexp to enforce consistent cross-browser behavior.
+ return str.replace(/[\s\xa0]+$/, '');
+};
+
+
+/**
+ * A string comparator that ignores case.
+ * -1 = str1 less than str2
+ * 0 = str1 equals str2
+ * 1 = str1 greater than str2
+ *
+ * @param {string} str1 The string to compare.
+ * @param {string} str2 The string to compare {@code str1} to.
+ * @return {number} The comparator result, as described above.
+ */
+goog.string.caseInsensitiveCompare = function(str1, str2) {
+ var test1 = String(str1).toLowerCase();
+ var test2 = String(str2).toLowerCase();
+
+ if (test1 < test2) {
+ return -1;
+ } else if (test1 == test2) {
+ return 0;
+ } else {
+ return 1;
+ }
+};
+
+
+/**
+ * Compares two strings interpreting their numeric substrings as numbers.
+ *
+ * @param {string} str1 First string.
+ * @param {string} str2 Second string.
+ * @param {!RegExp} tokenizerRegExp Splits a string into substrings of
+ * non-negative integers, non-numeric characters and optionally fractional
+ * numbers starting with a decimal point.
+ * @return {number} Negative if str1 < str2, 0 is str1 == str2, positive if
+ * str1 > str2.
+ * @private
+ */
+goog.string.numberAwareCompare_ = function(str1, str2, tokenizerRegExp) {
+ if (str1 == str2) {
+ return 0;
+ }
+ if (!str1) {
+ return -1;
+ }
+ if (!str2) {
+ return 1;
+ }
+
+ // Using match to split the entire string ahead of time turns out to be faster
+ // for most inputs than using RegExp.exec or iterating over each character.
+ var tokens1 = str1.toLowerCase().match(tokenizerRegExp);
+ var tokens2 = str2.toLowerCase().match(tokenizerRegExp);
+
+ var count = Math.min(tokens1.length, tokens2.length);
+
+ for (var i = 0; i < count; i++) {
+ var a = tokens1[i];
+ var b = tokens2[i];
+
+ // Compare pairs of tokens, returning if one token sorts before the other.
+ if (a != b) {
+ // Only if both tokens are integers is a special comparison required.
+ // Decimal numbers are sorted as strings (e.g., '.09' < '.1').
+ var num1 = parseInt(a, 10);
+ if (!isNaN(num1)) {
+ var num2 = parseInt(b, 10);
+ if (!isNaN(num2) && num1 - num2) {
+ return num1 - num2;
+ }
+ }
+ return a < b ? -1 : 1;
+ }
+ }
+
+ // If one string is a substring of the other, the shorter string sorts first.
+ if (tokens1.length != tokens2.length) {
+ return tokens1.length - tokens2.length;
+ }
+
+ // The two strings must be equivalent except for case (perfect equality is
+ // tested at the head of the function.) Revert to default ASCII string
+ // comparison to stabilize the sort.
+ return str1 < str2 ? -1 : 1;
+};
+
+
+/**
+ * String comparison function that handles non-negative integer numbers in a
+ * way humans might expect. Using this function, the string 'File 2.jpg' sorts
+ * before 'File 10.jpg', and 'Version 1.9' before 'Version 1.10'. The comparison
+ * is mostly case-insensitive, though strings that are identical except for case
+ * are sorted with the upper-case strings before lower-case.
+ *
+ * This comparison function is up to 50x slower than either the default or the
+ * case-insensitive compare. It should not be used in time-critical code, but
+ * should be fast enough to sort several hundred short strings (like filenames)
+ * with a reasonable delay.
+ *
+ * @param {string} str1 The string to compare in a numerically sensitive way.
+ * @param {string} str2 The string to compare {@code str1} to.
+ * @return {number} less than 0 if str1 < str2, 0 if str1 == str2, greater than
+ * 0 if str1 > str2.
+ */
+goog.string.intAwareCompare = function(str1, str2) {
+ return goog.string.numberAwareCompare_(str1, str2, /\d+|\D+/g);
+};
+
+
+/**
+ * String comparison function that handles non-negative integer and fractional
+ * numbers in a way humans might expect. Using this function, the string
+ * 'File 2.jpg' sorts before 'File 10.jpg', and '3.14' before '3.2'. Equivalent
+ * to {@link goog.string.intAwareCompare} apart from the way how it interprets
+ * dots.
+ *
+ * @param {string} str1 The string to compare in a numerically sensitive way.
+ * @param {string} str2 The string to compare {@code str1} to.
+ * @return {number} less than 0 if str1 < str2, 0 if str1 == str2, greater than
+ * 0 if str1 > str2.
+ */
+goog.string.floatAwareCompare = function(str1, str2) {
+ return goog.string.numberAwareCompare_(str1, str2, /\d+|\.\d+|\D+/g);
+};
+
+
+/**
+ * Alias for {@link goog.string.floatAwareCompare}.
+ *
+ * @param {string} str1
+ * @param {string} str2
+ * @return {number}
+ */
+goog.string.numerateCompare = goog.string.floatAwareCompare;
+
+
+/**
+ * URL-encodes a string
+ * @param {*} str The string to url-encode.
+ * @return {string} An encoded copy of {@code str} that is safe for urls.
+ * Note that '#', ':', and other characters used to delimit portions
+ * of URLs *will* be encoded.
+ */
+goog.string.urlEncode = function(str) {
+ return encodeURIComponent(String(str));
+};
+
+
+/**
+ * URL-decodes the string. We need to specially handle '+'s because
+ * the javascript library doesn't convert them to spaces.
+ * @param {string} str The string to url decode.
+ * @return {string} The decoded {@code str}.
+ */
+goog.string.urlDecode = function(str) {
+ return decodeURIComponent(str.replace(/\+/g, ' '));
+};
+
+
+/**
+ * Converts \n to <br>s or <br />s.
+ * @param {string} str The string in which to convert newlines.
+ * @param {boolean=} opt_xml Whether to use XML compatible tags.
+ * @return {string} A copy of {@code str} with converted newlines.
+ */
+goog.string.newLineToBr = function(str, opt_xml) {
+ return str.replace(/(\r\n|\r|\n)/g, opt_xml ? '<br />' : '<br>');
+};
+
+
+/**
+ * Escapes double quote '"' and single quote '\'' characters in addition to
+ * '&', '<', and '>' so that a string can be included in an HTML tag attribute
+ * value within double or single quotes.
+ *
+ * It should be noted that > doesn't need to be escaped for the HTML or XML to
+ * be valid, but it has been decided to escape it for consistency with other
+ * implementations.
+ *
+ * With goog.string.DETECT_DOUBLE_ESCAPING, this function escapes also the
+ * lowercase letter "e".
+ *
+ * NOTE(user):
+ * HtmlEscape is often called during the generation of large blocks of HTML.
+ * Using statics for the regular expressions and strings is an optimization
+ * that can more than half the amount of time IE spends in this function for
+ * large apps, since strings and regexes both contribute to GC allocations.
+ *
+ * Testing for the presence of a character before escaping increases the number
+ * of function calls, but actually provides a speed increase for the average
+ * case -- since the average case often doesn't require the escaping of all 4
+ * characters and indexOf() is much cheaper than replace().
+ * The worst case does suffer slightly from the additional calls, therefore the
+ * opt_isLikelyToContainHtmlChars option has been included for situations
+ * where all 4 HTML entities are very likely to be present and need escaping.
+ *
+ * Some benchmarks (times tended to fluctuate +-0.05ms):
+ * FireFox IE6
+ * (no chars / average (mix of cases) / all 4 chars)
+ * no checks 0.13 / 0.22 / 0.22 0.23 / 0.53 / 0.80
+ * indexOf 0.08 / 0.17 / 0.26 0.22 / 0.54 / 0.84
+ * indexOf + re test 0.07 / 0.17 / 0.28 0.19 / 0.50 / 0.85
+ *
+ * An additional advantage of checking if replace actually needs to be called
+ * is a reduction in the number of object allocations, so as the size of the
+ * application grows the difference between the various methods would increase.
+ *
+ * @param {string} str string to be escaped.
+ * @param {boolean=} opt_isLikelyToContainHtmlChars Don't perform a check to see
+ * if the character needs replacing - use this option if you expect each of
+ * the characters to appear often. Leave false if you expect few html
+ * characters to occur in your strings, such as if you are escaping HTML.
+ * @return {string} An escaped copy of {@code str}.
+ */
+goog.string.htmlEscape = function(str, opt_isLikelyToContainHtmlChars) {
+
+ if (opt_isLikelyToContainHtmlChars) {
+ str = str.replace(goog.string.AMP_RE_, '&amp;')
+ .replace(goog.string.LT_RE_, '&lt;')
+ .replace(goog.string.GT_RE_, '&gt;')
+ .replace(goog.string.QUOT_RE_, '&quot;')
+ .replace(goog.string.SINGLE_QUOTE_RE_, '&#39;')
+ .replace(goog.string.NULL_RE_, '&#0;');
+ if (goog.string.DETECT_DOUBLE_ESCAPING) {
+ str = str.replace(goog.string.E_RE_, '&#101;');
+ }
+ return str;
+
+ } else {
+ // quick test helps in the case when there are no chars to replace, in
+ // worst case this makes barely a difference to the time taken
+ if (!goog.string.ALL_RE_.test(str)) return str;
+
+ // str.indexOf is faster than regex.test in this case
+ if (str.indexOf('&') != -1) {
+ str = str.replace(goog.string.AMP_RE_, '&amp;');
+ }
+ if (str.indexOf('<') != -1) {
+ str = str.replace(goog.string.LT_RE_, '&lt;');
+ }
+ if (str.indexOf('>') != -1) {
+ str = str.replace(goog.string.GT_RE_, '&gt;');
+ }
+ if (str.indexOf('"') != -1) {
+ str = str.replace(goog.string.QUOT_RE_, '&quot;');
+ }
+ if (str.indexOf('\'') != -1) {
+ str = str.replace(goog.string.SINGLE_QUOTE_RE_, '&#39;');
+ }
+ if (str.indexOf('\x00') != -1) {
+ str = str.replace(goog.string.NULL_RE_, '&#0;');
+ }
+ if (goog.string.DETECT_DOUBLE_ESCAPING && str.indexOf('e') != -1) {
+ str = str.replace(goog.string.E_RE_, '&#101;');
+ }
+ return str;
+ }
+};
+
+
+/**
+ * Regular expression that matches an ampersand, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.AMP_RE_ = /&/g;
+
+
+/**
+ * Regular expression that matches a less than sign, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.LT_RE_ = /</g;
+
+
+/**
+ * Regular expression that matches a greater than sign, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.GT_RE_ = />/g;
+
+
+/**
+ * Regular expression that matches a double quote, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.QUOT_RE_ = /"/g;
+
+
+/**
+ * Regular expression that matches a single quote, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.SINGLE_QUOTE_RE_ = /'/g;
+
+
+/**
+ * Regular expression that matches null character, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.NULL_RE_ = /\x00/g;
+
+
+/**
+ * Regular expression that matches a lowercase letter "e", for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.E_RE_ = /e/g;
+
+
+/**
+ * Regular expression that matches any character that needs to be escaped.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.ALL_RE_ =
+ (goog.string.DETECT_DOUBLE_ESCAPING ? /[\x00&<>"'e]/ : /[\x00&<>"']/);
+
+
+/**
+ * Unescapes an HTML string.
+ *
+ * @param {string} str The string to unescape.
+ * @return {string} An unescaped copy of {@code str}.
+ */
+goog.string.unescapeEntities = function(str) {
+ if (goog.string.contains(str, '&')) {
+ // We are careful not to use a DOM if we do not have one or we explicitly
+ // requested non-DOM html unescaping.
+ if (!goog.string.FORCE_NON_DOM_HTML_UNESCAPING &&
+ 'document' in goog.global) {
+ return goog.string.unescapeEntitiesUsingDom_(str);
+ } else {
+ // Fall back on pure XML entities
+ return goog.string.unescapePureXmlEntities_(str);
+ }
+ }
+ return str;
+};
+
+
+/**
+ * Unescapes a HTML string using the provided document.
+ *
+ * @param {string} str The string to unescape.
+ * @param {!Document} document A document to use in escaping the string.
+ * @return {string} An unescaped copy of {@code str}.
+ */
+goog.string.unescapeEntitiesWithDocument = function(str, document) {
+ if (goog.string.contains(str, '&')) {
+ return goog.string.unescapeEntitiesUsingDom_(str, document);
+ }
+ return str;
+};
+
+
+/**
+ * Unescapes an HTML string using a DOM to resolve non-XML, non-numeric
+ * entities. This function is XSS-safe and whitespace-preserving.
+ * @private
+ * @param {string} str The string to unescape.
+ * @param {Document=} opt_document An optional document to use for creating
+ * elements. If this is not specified then the default window.document
+ * will be used.
+ * @return {string} The unescaped {@code str} string.
+ */
+goog.string.unescapeEntitiesUsingDom_ = function(str, opt_document) {
+ /** @type {!Object<string, string>} */
+ var seen = {'&amp;': '&', '&lt;': '<', '&gt;': '>', '&quot;': '"'};
+ var div;
+ if (opt_document) {
+ div = opt_document.createElement('div');
+ } else {
+ div = goog.global.document.createElement('div');
+ }
+ // Match as many valid entity characters as possible. If the actual entity
+ // happens to be shorter, it will still work as innerHTML will return the
+ // trailing characters unchanged. Since the entity characters do not include
+ // open angle bracket, there is no chance of XSS from the innerHTML use.
+ // Since no whitespace is passed to innerHTML, whitespace is preserved.
+ return str.replace(goog.string.HTML_ENTITY_PATTERN_, function(s, entity) {
+ // Check for cached entity.
+ var value = seen[s];
+ if (value) {
+ return value;
+ }
+ // Check for numeric entity.
+ if (entity.charAt(0) == '#') {
+ // Prefix with 0 so that hex entities (e.g. &#x10) parse as hex numbers.
+ var n = Number('0' + entity.substr(1));
+ if (!isNaN(n)) {
+ value = String.fromCharCode(n);
+ }
+ }
+ // Fall back to innerHTML otherwise.
+ if (!value) {
+ // Append a non-entity character to avoid a bug in Webkit that parses
+ // an invalid entity at the end of innerHTML text as the empty string.
+ div.innerHTML = s + ' ';
+ // Then remove the trailing character from the result.
+ value = div.firstChild.nodeValue.slice(0, -1);
+ }
+ // Cache and return.
+ return seen[s] = value;
+ });
+};
+
+
+/**
+ * Unescapes XML entities.
+ * @private
+ * @param {string} str The string to unescape.
+ * @return {string} An unescaped copy of {@code str}.
+ */
+goog.string.unescapePureXmlEntities_ = function(str) {
+ return str.replace(/&([^;]+);/g, function(s, entity) {
+ switch (entity) {
+ case 'amp':
+ return '&';
+ case 'lt':
+ return '<';
+ case 'gt':
+ return '>';
+ case 'quot':
+ return '"';
+ default:
+ if (entity.charAt(0) == '#') {
+ // Prefix with 0 so that hex entities (e.g. &#x10) parse as hex.
+ var n = Number('0' + entity.substr(1));
+ if (!isNaN(n)) {
+ return String.fromCharCode(n);
+ }
+ }
+ // For invalid entities we just return the entity
+ return s;
+ }
+ });
+};
+
+
+/**
+ * Regular expression that matches an HTML entity.
+ * See also HTML5: Tokenization / Tokenizing character references.
+ * @private
+ * @type {!RegExp}
+ */
+goog.string.HTML_ENTITY_PATTERN_ = /&([^;\s<&]+);?/g;
+
+
+/**
+ * Do escaping of whitespace to preserve spatial formatting. We use character
+ * entity #160 to make it safer for xml.
+ * @param {string} str The string in which to escape whitespace.
+ * @param {boolean=} opt_xml Whether to use XML compatible tags.
+ * @return {string} An escaped copy of {@code str}.
+ */
+goog.string.whitespaceEscape = function(str, opt_xml) {
+ // This doesn't use goog.string.preserveSpaces for backwards compatibility.
+ return goog.string.newLineToBr(str.replace(/ /g, ' &#160;'), opt_xml);
+};
+
+
+/**
+ * Preserve spaces that would be otherwise collapsed in HTML by replacing them
+ * with non-breaking space Unicode characters.
+ * @param {string} str The string in which to preserve whitespace.
+ * @return {string} A copy of {@code str} with preserved whitespace.
+ */
+goog.string.preserveSpaces = function(str) {
+ return str.replace(/(^|[\n ]) /g, '$1' + goog.string.Unicode.NBSP);
+};
+
+
+/**
+ * Strip quote characters around a string. The second argument is a string of
+ * characters to treat as quotes. This can be a single character or a string of
+ * multiple character and in that case each of those are treated as possible
+ * quote characters. For example:
+ *
+ * <pre>
+ * goog.string.stripQuotes('"abc"', '"`') --> 'abc'
+ * goog.string.stripQuotes('`abc`', '"`') --> 'abc'
+ * </pre>
+ *
+ * @param {string} str The string to strip.
+ * @param {string} quoteChars The quote characters to strip.
+ * @return {string} A copy of {@code str} without the quotes.
+ */
+goog.string.stripQuotes = function(str, quoteChars) {
+ var length = quoteChars.length;
+ for (var i = 0; i < length; i++) {
+ var quoteChar = length == 1 ? quoteChars : quoteChars.charAt(i);
+ if (str.charAt(0) == quoteChar && str.charAt(str.length - 1) == quoteChar) {
+ return str.substring(1, str.length - 1);
+ }
+ }
+ return str;
+};
+
+
+/**
+ * Truncates a string to a certain length and adds '...' if necessary. The
+ * length also accounts for the ellipsis, so a maximum length of 10 and a string
+ * 'Hello World!' produces 'Hello W...'.
+ * @param {string} str The string to truncate.
+ * @param {number} chars Max number of characters.
+ * @param {boolean=} opt_protectEscapedCharacters Whether to protect escaped
+ * characters from being cut off in the middle.
+ * @return {string} The truncated {@code str} string.
+ */
+goog.string.truncate = function(str, chars, opt_protectEscapedCharacters) {
+ if (opt_protectEscapedCharacters) {
+ str = goog.string.unescapeEntities(str);
+ }
+
+ if (str.length > chars) {
+ str = str.substring(0, chars - 3) + '...';
+ }
+
+ if (opt_protectEscapedCharacters) {
+ str = goog.string.htmlEscape(str);
+ }
+
+ return str;
+};
+
+
+/**
+ * Truncate a string in the middle, adding "..." if necessary,
+ * and favoring the beginning of the string.
+ * @param {string} str The string to truncate the middle of.
+ * @param {number} chars Max number of characters.
+ * @param {boolean=} opt_protectEscapedCharacters Whether to protect escaped
+ * characters from being cutoff in the middle.
+ * @param {number=} opt_trailingChars Optional number of trailing characters to
+ * leave at the end of the string, instead of truncating as close to the
+ * middle as possible.
+ * @return {string} A truncated copy of {@code str}.
+ */
+goog.string.truncateMiddle = function(
+ str, chars, opt_protectEscapedCharacters, opt_trailingChars) {
+ if (opt_protectEscapedCharacters) {
+ str = goog.string.unescapeEntities(str);
+ }
+
+ if (opt_trailingChars && str.length > chars) {
+ if (opt_trailingChars > chars) {
+ opt_trailingChars = chars;
+ }
+ var endPoint = str.length - opt_trailingChars;
+ var startPoint = chars - opt_trailingChars;
+ str = str.substring(0, startPoint) + '...' + str.substring(endPoint);
+ } else if (str.length > chars) {
+ // Favor the beginning of the string:
+ var half = Math.floor(chars / 2);
+ var endPos = str.length - half;
+ half += chars % 2;
+ str = str.substring(0, half) + '...' + str.substring(endPos);
+ }
+
+ if (opt_protectEscapedCharacters) {
+ str = goog.string.htmlEscape(str);
+ }
+
+ return str;
+};
+
+
+/**
+ * Special chars that need to be escaped for goog.string.quote.
+ * @private {!Object<string, string>}
+ */
+goog.string.specialEscapeChars_ = {
+ '\0': '\\0',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\x0B': '\\x0B', // '\v' is not supported in JScript
+ '"': '\\"',
+ '\\': '\\\\',
+ // To support the use case of embedding quoted strings inside of script
+ // tags, we have to make sure HTML comments and opening/closing script tags do
+ // not appear in the resulting string. The specific strings that must be
+ // escaped are documented at:
+ // http://www.w3.org/TR/html51/semantics.html#restrictions-for-contents-of-script-elements
+ '<': '\x3c'
+};
+
+
+/**
+ * Character mappings used internally for goog.string.escapeChar.
+ * @private {!Object<string, string>}
+ */
+goog.string.jsEscapeCache_ = {
+ '\'': '\\\''
+};
+
+
+/**
+ * Encloses a string in double quotes and escapes characters so that the
+ * string is a valid JS string. The resulting string is safe to embed in
+ * `<script>` tags as "<" is escaped.
+ * @param {string} s The string to quote.
+ * @return {string} A copy of {@code s} surrounded by double quotes.
+ */
+goog.string.quote = function(s) {
+ s = String(s);
+ var sb = ['"'];
+ for (var i = 0; i < s.length; i++) {
+ var ch = s.charAt(i);
+ var cc = ch.charCodeAt(0);
+ sb[i + 1] = goog.string.specialEscapeChars_[ch] ||
+ ((cc > 31 && cc < 127) ? ch : goog.string.escapeChar(ch));
+ }
+ sb.push('"');
+ return sb.join('');
+};
+
+
+/**
+ * Takes a string and returns the escaped string for that character.
+ * @param {string} str The string to escape.
+ * @return {string} An escaped string representing {@code str}.
+ */
+goog.string.escapeString = function(str) {
+ var sb = [];
+ for (var i = 0; i < str.length; i++) {
+ sb[i] = goog.string.escapeChar(str.charAt(i));
+ }
+ return sb.join('');
+};
+
+
+/**
+ * Takes a character and returns the escaped string for that character. For
+ * example escapeChar(String.fromCharCode(15)) -> "\\x0E".
+ * @param {string} c The character to escape.
+ * @return {string} An escaped string representing {@code c}.
+ */
+goog.string.escapeChar = function(c) {
+ if (c in goog.string.jsEscapeCache_) {
+ return goog.string.jsEscapeCache_[c];
+ }
+
+ if (c in goog.string.specialEscapeChars_) {
+ return goog.string.jsEscapeCache_[c] = goog.string.specialEscapeChars_[c];
+ }
+
+ var rv = c;
+ var cc = c.charCodeAt(0);
+ if (cc > 31 && cc < 127) {
+ rv = c;
+ } else {
+ // tab is 9 but handled above
+ if (cc < 256) {
+ rv = '\\x';
+ if (cc < 16 || cc > 256) {
+ rv += '0';
+ }
+ } else {
+ rv = '\\u';
+ if (cc < 4096) { // \u1000
+ rv += '0';
+ }
+ }
+ rv += cc.toString(16).toUpperCase();
+ }
+
+ return goog.string.jsEscapeCache_[c] = rv;
+};
+
+
+/**
+ * Determines whether a string contains a substring.
+ * @param {string} str The string to search.
+ * @param {string} subString The substring to search for.
+ * @return {boolean} Whether {@code str} contains {@code subString}.
+ */
+goog.string.contains = function(str, subString) {
+ return str.indexOf(subString) != -1;
+};
+
+
+/**
+ * Determines whether a string contains a substring, ignoring case.
+ * @param {string} str The string to search.
+ * @param {string} subString The substring to search for.
+ * @return {boolean} Whether {@code str} contains {@code subString}.
+ */
+goog.string.caseInsensitiveContains = function(str, subString) {
+ return goog.string.contains(str.toLowerCase(), subString.toLowerCase());
+};
+
+
+/**
+ * Returns the non-overlapping occurrences of ss in s.
+ * If either s or ss evalutes to false, then returns zero.
+ * @param {string} s The string to look in.
+ * @param {string} ss The string to look for.
+ * @return {number} Number of occurrences of ss in s.
+ */
+goog.string.countOf = function(s, ss) {
+ return s && ss ? s.split(ss).length - 1 : 0;
+};
+
+
+/**
+ * Removes a substring of a specified length at a specific
+ * index in a string.
+ * @param {string} s The base string from which to remove.
+ * @param {number} index The index at which to remove the substring.
+ * @param {number} stringLength The length of the substring to remove.
+ * @return {string} A copy of {@code s} with the substring removed or the full
+ * string if nothing is removed or the input is invalid.
+ */
+goog.string.removeAt = function(s, index, stringLength) {
+ var resultStr = s;
+ // If the index is greater or equal to 0 then remove substring
+ if (index >= 0 && index < s.length && stringLength > 0) {
+ resultStr = s.substr(0, index) +
+ s.substr(index + stringLength, s.length - index - stringLength);
+ }
+ return resultStr;
+};
+
+
+/**
+ * Removes the first occurrence of a substring from a string.
+ * @param {string} s The base string from which to remove.
+ * @param {string} ss The string to remove.
+ * @return {string} A copy of {@code s} with {@code ss} removed or the full
+ * string if nothing is removed.
+ */
+goog.string.remove = function(s, ss) {
+ var re = new RegExp(goog.string.regExpEscape(ss), '');
+ return s.replace(re, '');
+};
+
+
+/**
+ * Removes all occurrences of a substring from a string.
+ * @param {string} s The base string from which to remove.
+ * @param {string} ss The string to remove.
+ * @return {string} A copy of {@code s} with {@code ss} removed or the full
+ * string if nothing is removed.
+ */
+goog.string.removeAll = function(s, ss) {
+ var re = new RegExp(goog.string.regExpEscape(ss), 'g');
+ return s.replace(re, '');
+};
+
+
+/**
+ * Escapes characters in the string that are not safe to use in a RegExp.
+ * @param {*} s The string to escape. If not a string, it will be casted
+ * to one.
+ * @return {string} A RegExp safe, escaped copy of {@code s}.
+ */
+goog.string.regExpEscape = function(s) {
+ return String(s)
+ .replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1')
+ .replace(/\x08/g, '\\x08');
+};
+
+
+/**
+ * Repeats a string n times.
+ * @param {string} string The string to repeat.
+ * @param {number} length The number of times to repeat.
+ * @return {string} A string containing {@code length} repetitions of
+ * {@code string}.
+ */
+goog.string.repeat = (String.prototype.repeat) ? function(string, length) {
+ // The native method is over 100 times faster than the alternative.
+ return string.repeat(length);
+} : function(string, length) {
+ return new Array(length + 1).join(string);
+};
+
+
+/**
+ * Pads number to given length and optionally rounds it to a given precision.
+ * For example:
+ * <pre>padNumber(1.25, 2, 3) -> '01.250'
+ * padNumber(1.25, 2) -> '01.25'
+ * padNumber(1.25, 2, 1) -> '01.3'
+ * padNumber(1.25, 0) -> '1.25'</pre>
+ *
+ * @param {number} num The number to pad.
+ * @param {number} length The desired length.
+ * @param {number=} opt_precision The desired precision.
+ * @return {string} {@code num} as a string with the given options.
+ */
+goog.string.padNumber = function(num, length, opt_precision) {
+ var s = goog.isDef(opt_precision) ? num.toFixed(opt_precision) : String(num);
+ var index = s.indexOf('.');
+ if (index == -1) {
+ index = s.length;
+ }
+ return goog.string.repeat('0', Math.max(0, length - index)) + s;
+};
+
+
+/**
+ * Returns a string representation of the given object, with
+ * null and undefined being returned as the empty string.
+ *
+ * @param {*} obj The object to convert.
+ * @return {string} A string representation of the {@code obj}.
+ */
+goog.string.makeSafe = function(obj) {
+ return obj == null ? '' : String(obj);
+};
+
+
+/**
+ * Concatenates string expressions. This is useful
+ * since some browsers are very inefficient when it comes to using plus to
+ * concat strings. Be careful when using null and undefined here since
+ * these will not be included in the result. If you need to represent these
+ * be sure to cast the argument to a String first.
+ * For example:
+ * <pre>buildString('a', 'b', 'c', 'd') -> 'abcd'
+ * buildString(null, undefined) -> ''
+ * </pre>
+ * @param {...*} var_args A list of strings to concatenate. If not a string,
+ * it will be casted to one.
+ * @return {string} The concatenation of {@code var_args}.
+ */
+goog.string.buildString = function(var_args) {
+ return Array.prototype.join.call(arguments, '');
+};
+
+
+/**
+ * Returns a string with at least 64-bits of randomness.
+ *
+ * Doesn't trust Javascript's random function entirely. Uses a combination of
+ * random and current timestamp, and then encodes the string in base-36 to
+ * make it shorter.
+ *
+ * @return {string} A random string, e.g. sn1s7vb4gcic.
+ */
+goog.string.getRandomString = function() {
+ var x = 2147483648;
+ return Math.floor(Math.random() * x).toString(36) +
+ Math.abs(Math.floor(Math.random() * x) ^ goog.now()).toString(36);
+};
+
+
+/**
+ * Compares two version numbers.
+ *
+ * @param {string|number} version1 Version of first item.
+ * @param {string|number} version2 Version of second item.
+ *
+ * @return {number} 1 if {@code version1} is higher.
+ * 0 if arguments are equal.
+ * -1 if {@code version2} is higher.
+ */
+goog.string.compareVersions = function(version1, version2) {
+ var order = 0;
+ // Trim leading and trailing whitespace and split the versions into
+ // subversions.
+ var v1Subs = goog.string.trim(String(version1)).split('.');
+ var v2Subs = goog.string.trim(String(version2)).split('.');
+ var subCount = Math.max(v1Subs.length, v2Subs.length);
+
+ // Iterate over the subversions, as long as they appear to be equivalent.
+ for (var subIdx = 0; order == 0 && subIdx < subCount; subIdx++) {
+ var v1Sub = v1Subs[subIdx] || '';
+ var v2Sub = v2Subs[subIdx] || '';
+
+ // Split the subversions into pairs of numbers and qualifiers (like 'b').
+ // Two different RegExp objects are needed because they are both using
+ // the 'g' flag.
+ var v1CompParser = new RegExp('(\\d*)(\\D*)', 'g');
+ var v2CompParser = new RegExp('(\\d*)(\\D*)', 'g');
+ do {
+ var v1Comp = v1CompParser.exec(v1Sub) || ['', '', ''];
+ var v2Comp = v2CompParser.exec(v2Sub) || ['', '', ''];
+ // Break if there are no more matches.
+ if (v1Comp[0].length == 0 && v2Comp[0].length == 0) {
+ break;
+ }
+
+ // Parse the numeric part of the subversion. A missing number is
+ // equivalent to 0.
+ var v1CompNum = v1Comp[1].length == 0 ? 0 : parseInt(v1Comp[1], 10);
+ var v2CompNum = v2Comp[1].length == 0 ? 0 : parseInt(v2Comp[1], 10);
+
+ // Compare the subversion components. The number has the highest
+ // precedence. Next, if the numbers are equal, a subversion without any
+ // qualifier is always higher than a subversion with any qualifier. Next,
+ // the qualifiers are compared as strings.
+ order = goog.string.compareElements_(v1CompNum, v2CompNum) ||
+ goog.string.compareElements_(
+ v1Comp[2].length == 0, v2Comp[2].length == 0) ||
+ goog.string.compareElements_(v1Comp[2], v2Comp[2]);
+ // Stop as soon as an inequality is discovered.
+ } while (order == 0);
+ }
+
+ return order;
+};
+
+
+/**
+ * Compares elements of a version number.
+ *
+ * @param {string|number|boolean} left An element from a version number.
+ * @param {string|number|boolean} right An element from a version number.
+ *
+ * @return {number} 1 if {@code left} is higher.
+ * 0 if arguments are equal.
+ * -1 if {@code right} is higher.
+ * @private
+ */
+goog.string.compareElements_ = function(left, right) {
+ if (left < right) {
+ return -1;
+ } else if (left > right) {
+ return 1;
+ }
+ return 0;
+};
+
+
+/**
+ * String hash function similar to java.lang.String.hashCode().
+ * The hash code for a string is computed as
+ * s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],
+ * where s[i] is the ith character of the string and n is the length of
+ * the string. We mod the result to make it between 0 (inclusive) and 2^32
+ * (exclusive).
+ * @param {string} str A string.
+ * @return {number} Hash value for {@code str}, between 0 (inclusive) and 2^32
+ * (exclusive). The empty string returns 0.
+ */
+goog.string.hashCode = function(str) {
+ var result = 0;
+ for (var i = 0; i < str.length; ++i) {
+ // Normalize to 4 byte range, 0 ... 2^32.
+ result = (31 * result + str.charCodeAt(i)) >>> 0;
+ }
+ return result;
+};
+
+
+/**
+ * The most recent unique ID. |0 is equivalent to Math.floor in this case.
+ * @type {number}
+ * @private
+ */
+goog.string.uniqueStringCounter_ = Math.random() * 0x80000000 | 0;
+
+
+/**
+ * Generates and returns a string which is unique in the current document.
+ * This is useful, for example, to create unique IDs for DOM elements.
+ * @return {string} A unique id.
+ */
+goog.string.createUniqueString = function() {
+ return 'goog_' + goog.string.uniqueStringCounter_++;
+};
+
+
+/**
+ * Converts the supplied string to a number, which may be Infinity or NaN.
+ * This function strips whitespace: (toNumber(' 123') === 123)
+ * This function accepts scientific notation: (toNumber('1e1') === 10)
+ *
+ * This is better than Javascript's built-in conversions because, sadly:
+ * (Number(' ') === 0) and (parseFloat('123a') === 123)
+ *
+ * @param {string} str The string to convert.
+ * @return {number} The number the supplied string represents, or NaN.
+ */
+goog.string.toNumber = function(str) {
+ var num = Number(str);
+ if (num == 0 && goog.string.isEmptyOrWhitespace(str)) {
+ return NaN;
+ }
+ return num;
+};
+
+
+/**
+ * Returns whether the given string is lower camel case (e.g. "isFooBar").
+ *
+ * Note that this assumes the string is entirely letters.
+ * @see http://en.wikipedia.org/wiki/CamelCase#Variations_and_synonyms
+ *
+ * @param {string} str String to test.
+ * @return {boolean} Whether the string is lower camel case.
+ */
+goog.string.isLowerCamelCase = function(str) {
+ return /^[a-z]+([A-Z][a-z]*)*$/.test(str);
+};
+
+
+/**
+ * Returns whether the given string is upper camel case (e.g. "FooBarBaz").
+ *
+ * Note that this assumes the string is entirely letters.
+ * @see http://en.wikipedia.org/wiki/CamelCase#Variations_and_synonyms
+ *
+ * @param {string} str String to test.
+ * @return {boolean} Whether the string is upper camel case.
+ */
+goog.string.isUpperCamelCase = function(str) {
+ return /^([A-Z][a-z]*)+$/.test(str);
+};
+
+
+/**
+ * Converts a string from selector-case to camelCase (e.g. from
+ * "multi-part-string" to "multiPartString"), useful for converting
+ * CSS selectors and HTML dataset keys to their equivalent JS properties.
+ * @param {string} str The string in selector-case form.
+ * @return {string} The string in camelCase form.
+ */
+goog.string.toCamelCase = function(str) {
+ return String(str).replace(
+ /\-([a-z])/g, function(all, match) { return match.toUpperCase(); });
+};
+
+
+/**
+ * Converts a string from camelCase to selector-case (e.g. from
+ * "multiPartString" to "multi-part-string"), useful for converting JS
+ * style and dataset properties to equivalent CSS selectors and HTML keys.
+ * @param {string} str The string in camelCase form.
+ * @return {string} The string in selector-case form.
+ */
+goog.string.toSelectorCase = function(str) {
+ return String(str).replace(/([A-Z])/g, '-$1').toLowerCase();
+};
+
+
+/**
+ * Converts a string into TitleCase. First character of the string is always
+ * capitalized in addition to the first letter of every subsequent word.
+ * Words are delimited by one or more whitespaces by default. Custom delimiters
+ * can optionally be specified to replace the default, which doesn't preserve
+ * whitespace delimiters and instead must be explicitly included if needed.
+ *
+ * Default delimiter => " ":
+ * goog.string.toTitleCase('oneTwoThree') => 'OneTwoThree'
+ * goog.string.toTitleCase('one two three') => 'One Two Three'
+ * goog.string.toTitleCase(' one two ') => ' One Two '
+ * goog.string.toTitleCase('one_two_three') => 'One_two_three'
+ * goog.string.toTitleCase('one-two-three') => 'One-two-three'
+ *
+ * Custom delimiter => "_-.":
+ * goog.string.toTitleCase('oneTwoThree', '_-.') => 'OneTwoThree'
+ * goog.string.toTitleCase('one two three', '_-.') => 'One two three'
+ * goog.string.toTitleCase(' one two ', '_-.') => ' one two '
+ * goog.string.toTitleCase('one_two_three', '_-.') => 'One_Two_Three'
+ * goog.string.toTitleCase('one-two-three', '_-.') => 'One-Two-Three'
+ * goog.string.toTitleCase('one...two...three', '_-.') => 'One...Two...Three'
+ * goog.string.toTitleCase('one. two. three', '_-.') => 'One. two. three'
+ * goog.string.toTitleCase('one-two.three', '_-.') => 'One-Two.Three'
+ *
+ * @param {string} str String value in camelCase form.
+ * @param {string=} opt_delimiters Custom delimiter character set used to
+ * distinguish words in the string value. Each character represents a
+ * single delimiter. When provided, default whitespace delimiter is
+ * overridden and must be explicitly included if needed.
+ * @return {string} String value in TitleCase form.
+ */
+goog.string.toTitleCase = function(str, opt_delimiters) {
+ var delimiters = goog.isString(opt_delimiters) ?
+ goog.string.regExpEscape(opt_delimiters) :
+ '\\s';
+
+ // For IE8, we need to prevent using an empty character set. Otherwise,
+ // incorrect matching will occur.
+ delimiters = delimiters ? '|[' + delimiters + ']+' : '';
+
+ var regexp = new RegExp('(^' + delimiters + ')([a-z])', 'g');
+ return str.replace(
+ regexp, function(all, p1, p2) { return p1 + p2.toUpperCase(); });
+};
+
+
+/**
+ * Capitalizes a string, i.e. converts the first letter to uppercase
+ * and all other letters to lowercase, e.g.:
+ *
+ * goog.string.capitalize('one') => 'One'
+ * goog.string.capitalize('ONE') => 'One'
+ * goog.string.capitalize('one two') => 'One two'
+ *
+ * Note that this function does not trim initial whitespace.
+ *
+ * @param {string} str String value to capitalize.
+ * @return {string} String value with first letter in uppercase.
+ */
+goog.string.capitalize = function(str) {
+ return String(str.charAt(0)).toUpperCase() +
+ String(str.substr(1)).toLowerCase();
+};
+
+
+/**
+ * Parse a string in decimal or hexidecimal ('0xFFFF') form.
+ *
+ * To parse a particular radix, please use parseInt(string, radix) directly. See
+ * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/parseInt
+ *
+ * This is a wrapper for the built-in parseInt function that will only parse
+ * numbers as base 10 or base 16. Some JS implementations assume strings
+ * starting with "0" are intended to be octal. ES3 allowed but discouraged
+ * this behavior. ES5 forbids it. This function emulates the ES5 behavior.
+ *
+ * For more information, see Mozilla JS Reference: http://goo.gl/8RiFj
+ *
+ * @param {string|number|null|undefined} value The value to be parsed.
+ * @return {number} The number, parsed. If the string failed to parse, this
+ * will be NaN.
+ */
+goog.string.parseInt = function(value) {
+ // Force finite numbers to strings.
+ if (isFinite(value)) {
+ value = String(value);
+ }
+
+ if (goog.isString(value)) {
+ // If the string starts with '0x' or '-0x', parse as hex.
+ return /^\s*-?0x/i.test(value) ? parseInt(value, 16) : parseInt(value, 10);
+ }
+
+ return NaN;
+};
+
+
+/**
+ * Splits a string on a separator a limited number of times.
+ *
+ * This implementation is more similar to Python or Java, where the limit
+ * parameter specifies the maximum number of splits rather than truncating
+ * the number of results.
+ *
+ * See http://docs.python.org/2/library/stdtypes.html#str.split
+ * See JavaDoc: http://goo.gl/F2AsY
+ * See Mozilla reference: http://goo.gl/dZdZs
+ *
+ * @param {string} str String to split.
+ * @param {string} separator The separator.
+ * @param {number} limit The limit to the number of splits. The resulting array
+ * will have a maximum length of limit+1. Negative numbers are the same
+ * as zero.
+ * @return {!Array<string>} The string, split.
+ */
+goog.string.splitLimit = function(str, separator, limit) {
+ var parts = str.split(separator);
+ var returnVal = [];
+
+ // Only continue doing this while we haven't hit the limit and we have
+ // parts left.
+ while (limit > 0 && parts.length) {
+ returnVal.push(parts.shift());
+ limit--;
+ }
+
+ // If there are remaining parts, append them to the end.
+ if (parts.length) {
+ returnVal.push(parts.join(separator));
+ }
+
+ return returnVal;
+};
+
+
+/**
+ * Finds the characters to the right of the last instance of any separator
+ *
+ * This function is similar to goog.string.path.baseName, except it can take a
+ * list of characters to split the string on. It will return the rightmost
+ * grouping of characters to the right of any separator as a left-to-right
+ * oriented string.
+ *
+ * @see goog.string.path.baseName
+ * @param {string} str The string
+ * @param {string|!Array<string>} separators A list of separator characters
+ * @return {string} The last part of the string with respect to the separators
+ */
+goog.string.lastComponent = function(str, separators) {
+ if (!separators) {
+ return str;
+ } else if (typeof separators == 'string') {
+ separators = [separators];
+ }
+
+ var lastSeparatorIndex = -1;
+ for (var i = 0; i < separators.length; i++) {
+ if (separators[i] == '') {
+ continue;
+ }
+ var currentSeparatorIndex = str.lastIndexOf(separators[i]);
+ if (currentSeparatorIndex > lastSeparatorIndex) {
+ lastSeparatorIndex = currentSeparatorIndex;
+ }
+ }
+ if (lastSeparatorIndex == -1) {
+ return str;
+ }
+ return str.slice(lastSeparatorIndex + 1);
+};
+
+
+/**
+ * Computes the Levenshtein edit distance between two strings.
+ * @param {string} a
+ * @param {string} b
+ * @return {number} The edit distance between the two strings.
+ */
+goog.string.editDistance = function(a, b) {
+ var v0 = [];
+ var v1 = [];
+
+ if (a == b) {
+ return 0;
+ }
+
+ if (!a.length || !b.length) {
+ return Math.max(a.length, b.length);
+ }
+
+ for (var i = 0; i < b.length + 1; i++) {
+ v0[i] = i;
+ }
+
+ for (var i = 0; i < a.length; i++) {
+ v1[0] = i + 1;
+
+ for (var j = 0; j < b.length; j++) {
+ var cost = Number(a[i] != b[j]);
+ // Cost for the substring is the minimum of adding one character, removing
+ // one character, or a swap.
+ v1[j + 1] = Math.min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost);
+ }
+
+ for (var j = 0; j < v0.length; j++) {
+ v0[j] = v1[j];
+ }
+ }
+
+ return v1[b.length];
+};
diff --git a/src/http/static/viz/1/goog/string/stringbuffer.js b/src/http/static/viz/1/goog/string/stringbuffer.js
new file mode 100644
index 0000000..478b08b
--- /dev/null
+++ b/src/http/static/viz/1/goog/string/stringbuffer.js
@@ -0,0 +1,103 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utility for fast string concatenation.
+ */
+
+goog.provide('goog.string.StringBuffer');
+
+
+
+/**
+ * Utility class to facilitate string concatenation.
+ *
+ * @param {*=} opt_a1 Optional first initial item to append.
+ * @param {...*} var_args Other initial items to
+ * append, e.g., new goog.string.StringBuffer('foo', 'bar').
+ * @constructor
+ */
+goog.string.StringBuffer = function(opt_a1, var_args) {
+ if (opt_a1 != null) {
+ this.append.apply(this, arguments);
+ }
+};
+
+
+/**
+ * Internal buffer for the string to be concatenated.
+ * @type {string}
+ * @private
+ */
+goog.string.StringBuffer.prototype.buffer_ = '';
+
+
+/**
+ * Sets the contents of the string buffer object, replacing what's currently
+ * there.
+ *
+ * @param {*} s String to set.
+ */
+goog.string.StringBuffer.prototype.set = function(s) {
+ this.buffer_ = '' + s;
+};
+
+
+/**
+ * Appends one or more items to the buffer.
+ *
+ * Calling this with null, undefined, or empty arguments is an error.
+ *
+ * @param {*} a1 Required first string.
+ * @param {*=} opt_a2 Optional second string.
+ * @param {...?} var_args Other items to append,
+ * e.g., sb.append('foo', 'bar', 'baz').
+ * @return {!goog.string.StringBuffer} This same StringBuffer object.
+ * @suppress {duplicate}
+ */
+goog.string.StringBuffer.prototype.append = function(a1, opt_a2, var_args) {
+ // Use a1 directly to avoid arguments instantiation for single-arg case.
+ this.buffer_ += String(a1);
+ if (opt_a2 != null) { // second argument is undefined (null == undefined)
+ for (var i = 1; i < arguments.length; i++) {
+ this.buffer_ += arguments[i];
+ }
+ }
+ return this;
+};
+
+
+/**
+ * Clears the internal buffer.
+ */
+goog.string.StringBuffer.prototype.clear = function() {
+ this.buffer_ = '';
+};
+
+
+/**
+ * @return {number} the length of the current contents of the buffer.
+ */
+goog.string.StringBuffer.prototype.getLength = function() {
+ return this.buffer_.length;
+};
+
+
+/**
+ * @return {string} The concatenated string.
+ * @override
+ */
+goog.string.StringBuffer.prototype.toString = function() {
+ return this.buffer_;
+};
diff --git a/src/http/static/viz/1/goog/string/stringformat.js b/src/http/static/viz/1/goog/string/stringformat.js
new file mode 100644
index 0000000..58d7af9
--- /dev/null
+++ b/src/http/static/viz/1/goog/string/stringformat.js
@@ -0,0 +1,221 @@
+// Copyright 2008 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Implementation of sprintf-like, python-%-operator-like,
+ * .NET-String.Format-like functionality. Uses JS string's replace method to
+ * extract format specifiers and sends those specifiers to a handler function,
+ * which then, based on conversion type part of the specifier, calls the
+ * appropriate function to handle the specific conversion.
+ * For specific functionality implemented, look at formatRe below, or look
+ * at the tests.
+ */
+
+goog.provide('goog.string.format');
+
+goog.require('goog.string');
+
+
+/**
+ * Performs sprintf-like conversion, i.e. puts the values in a template.
+ * DO NOT use it instead of built-in conversions in simple cases such as
+ * 'Cost: %.2f' as it would introduce unnecessary latency opposed to
+ * 'Cost: ' + cost.toFixed(2).
+ * @param {string} formatString Template string containing % specifiers.
+ * @param {...string|number} var_args Values formatString is to be filled with.
+ * @return {string} Formatted string.
+ */
+goog.string.format = function(formatString, var_args) {
+
+ // Convert the arguments to an array (MDC recommended way).
+ var args = Array.prototype.slice.call(arguments);
+
+ // Try to get the template.
+ var template = args.shift();
+ if (typeof template == 'undefined') {
+ throw Error('[goog.string.format] Template required');
+ }
+
+ // This re is used for matching, it also defines what is supported.
+ var formatRe = /%([0\-\ \+]*)(\d+)?(\.(\d+))?([%sfdiu])/g;
+
+ /**
+ * Chooses which conversion function to call based on type conversion
+ * specifier.
+ * @param {string} match Contains the re matched string.
+ * @param {string} flags Formatting flags.
+ * @param {string} width Replacement string minimum width.
+ * @param {string} dotp Matched precision including a dot.
+ * @param {string} precision Specifies floating point precision.
+ * @param {string} type Type conversion specifier.
+ * @param {string} offset Matching location in the original string.
+ * @param {string} wholeString Has the actualString being searched.
+ * @return {string} Formatted parameter.
+ */
+ function replacerDemuxer(
+ match, flags, width, dotp, precision, type, offset, wholeString) {
+ // The % is too simple and doesn't take an argument.
+ if (type == '%') {
+ return '%';
+ }
+
+ // Try to get the actual value from parent function.
+ var value = args.shift();
+
+ // If we didn't get any arguments, fail.
+ if (typeof value == 'undefined') {
+ throw Error('[goog.string.format] Not enough arguments');
+ }
+
+ // Patch the value argument to the beginning of our type specific call.
+ arguments[0] = value;
+
+ return goog.string.format.demuxes_[type].apply(null, arguments);
+ }
+
+ return template.replace(formatRe, replacerDemuxer);
+};
+
+
+/**
+ * Contains various conversion functions (to be filled in later on).
+ * @private {!Object}
+ */
+goog.string.format.demuxes_ = {};
+
+
+/**
+ * Processes %s conversion specifier.
+ * @param {string} value Contains the formatRe matched string.
+ * @param {string} flags Formatting flags.
+ * @param {string} width Replacement string minimum width.
+ * @param {string} dotp Matched precision including a dot.
+ * @param {string} precision Specifies floating point precision.
+ * @param {string} type Type conversion specifier.
+ * @param {string} offset Matching location in the original string.
+ * @param {string} wholeString Has the actualString being searched.
+ * @return {string} Replacement string.
+ */
+goog.string.format.demuxes_['s'] = function(
+ value, flags, width, dotp, precision, type, offset, wholeString) {
+ var replacement = value;
+ // If no padding is necessary we're done.
+ // The check for '' is necessary because Firefox incorrectly provides the
+ // empty string instead of undefined for non-participating capture groups,
+ // and isNaN('') == false.
+ if (isNaN(width) || width == '' || replacement.length >= Number(width)) {
+ return replacement;
+ }
+
+ // Otherwise we should find out where to put spaces.
+ if (flags.indexOf('-', 0) > -1) {
+ replacement = replacement +
+ goog.string.repeat(' ', Number(width) - replacement.length);
+ } else {
+ replacement = goog.string.repeat(' ', Number(width) - replacement.length) +
+ replacement;
+ }
+ return replacement;
+};
+
+
+/**
+ * Processes %f conversion specifier.
+ * @param {string} value Contains the formatRe matched string.
+ * @param {string} flags Formatting flags.
+ * @param {string} width Replacement string minimum width.
+ * @param {string} dotp Matched precision including a dot.
+ * @param {string} precision Specifies floating point precision.
+ * @param {string} type Type conversion specifier.
+ * @param {string} offset Matching location in the original string.
+ * @param {string} wholeString Has the actualString being searched.
+ * @return {string} Replacement string.
+ */
+goog.string.format.demuxes_['f'] = function(
+ value, flags, width, dotp, precision, type, offset, wholeString) {
+
+ var replacement = value.toString();
+
+ // The check for '' is necessary because Firefox incorrectly provides the
+ // empty string instead of undefined for non-participating capture groups,
+ // and isNaN('') == false.
+ if (!(isNaN(precision) || precision == '')) {
+ replacement = parseFloat(value).toFixed(precision);
+ }
+
+ // Generates sign string that will be attached to the replacement.
+ var sign;
+ if (Number(value) < 0) {
+ sign = '-';
+ } else if (flags.indexOf('+') >= 0) {
+ sign = '+';
+ } else if (flags.indexOf(' ') >= 0) {
+ sign = ' ';
+ } else {
+ sign = '';
+ }
+
+ if (Number(value) >= 0) {
+ replacement = sign + replacement;
+ }
+
+ // If no padding is necessary we're done.
+ if (isNaN(width) || replacement.length >= Number(width)) {
+ return replacement;
+ }
+
+ // We need a clean signless replacement to start with
+ replacement = isNaN(precision) ? Math.abs(Number(value)).toString() :
+ Math.abs(Number(value)).toFixed(precision);
+
+ var padCount = Number(width) - replacement.length - sign.length;
+
+ // Find out which side to pad, and if it's left side, then which character to
+ // pad, and set the sign on the left and padding in the middle.
+ if (flags.indexOf('-', 0) >= 0) {
+ replacement = sign + replacement + goog.string.repeat(' ', padCount);
+ } else {
+ // Decides which character to pad.
+ var paddingChar = (flags.indexOf('0', 0) >= 0) ? '0' : ' ';
+ replacement =
+ sign + goog.string.repeat(paddingChar, padCount) + replacement;
+ }
+
+ return replacement;
+};
+
+
+/**
+ * Processes %d conversion specifier.
+ * @param {string} value Contains the formatRe matched string.
+ * @param {string} flags Formatting flags.
+ * @param {string} width Replacement string minimum width.
+ * @param {string} dotp Matched precision including a dot.
+ * @param {string} precision Specifies floating point precision.
+ * @param {string} type Type conversion specifier.
+ * @param {string} offset Matching location in the original string.
+ * @param {string} wholeString Has the actualString being searched.
+ * @return {string} Replacement string.
+ */
+goog.string.format.demuxes_['d'] = function(
+ value, flags, width, dotp, precision, type, offset, wholeString) {
+ return goog.string.format.demuxes_['f'](
+ parseInt(value, 10) /* value */, flags, width, dotp, 0 /* precision */,
+ type, offset, wholeString);
+};
+
+
+// These are additional aliases, for integer conversion.
+goog.string.format.demuxes_['i'] = goog.string.format.demuxes_['d'];
+goog.string.format.demuxes_['u'] = goog.string.format.demuxes_['d'];
diff --git a/src/http/static/viz/1/goog/string/typedstring.js b/src/http/static/viz/1/goog/string/typedstring.js
new file mode 100644
index 0000000..075115f
--- /dev/null
+++ b/src/http/static/viz/1/goog/string/typedstring.js
@@ -0,0 +1,48 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+goog.provide('goog.string.TypedString');
+
+
+
+/**
+ * Wrapper for strings that conform to a data type or language.
+ *
+ * Implementations of this interface are wrappers for strings, and typically
+ * associate a type contract with the wrapped string. Concrete implementations
+ * of this interface may choose to implement additional run-time type checking,
+ * see for example {@code goog.html.SafeHtml}. If available, client code that
+ * needs to ensure type membership of an object should use the type's function
+ * to assert type membership, such as {@code goog.html.SafeHtml.unwrap}.
+ * @interface
+ */
+goog.string.TypedString = function() {};
+
+
+/**
+ * Interface marker of the TypedString interface.
+ *
+ * This property can be used to determine at runtime whether or not an object
+ * implements this interface. All implementations of this interface set this
+ * property to {@code true}.
+ * @type {boolean}
+ */
+goog.string.TypedString.prototype.implementsGoogStringTypedString;
+
+
+/**
+ * Retrieves this wrapped string's value.
+ * @return {!string} The wrapped string's value.
+ */
+goog.string.TypedString.prototype.getTypedStringValue;
diff --git a/src/http/static/viz/1/goog/useragent/useragent.js b/src/http/static/viz/1/goog/useragent/useragent.js
new file mode 100644
index 0000000..1ab49c4
--- /dev/null
+++ b/src/http/static/viz/1/goog/useragent/useragent.js
@@ -0,0 +1,568 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Rendering engine detection.
+ * @see <a href="http://www.useragentstring.com/">User agent strings</a>
+ * For information on the browser brand (such as Safari versus Chrome), see
+ * goog.userAgent.product.
+ * @author arv@google.com (Erik Arvidsson)
+ * @see ../demos/useragent.html
+ */
+
+goog.provide('goog.userAgent');
+
+goog.require('goog.labs.userAgent.browser');
+goog.require('goog.labs.userAgent.engine');
+goog.require('goog.labs.userAgent.platform');
+goog.require('goog.labs.userAgent.util');
+goog.require('goog.string');
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is IE.
+ */
+goog.define('goog.userAgent.ASSUME_IE', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is EDGE.
+ */
+goog.define('goog.userAgent.ASSUME_EDGE', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is GECKO.
+ */
+goog.define('goog.userAgent.ASSUME_GECKO', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is WEBKIT.
+ */
+goog.define('goog.userAgent.ASSUME_WEBKIT', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is a
+ * mobile device running WebKit e.g. iPhone or Android.
+ */
+goog.define('goog.userAgent.ASSUME_MOBILE_WEBKIT', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is OPERA.
+ */
+goog.define('goog.userAgent.ASSUME_OPERA', false);
+
+
+/**
+ * @define {boolean} Whether the
+ * {@code goog.userAgent.isVersionOrHigher}
+ * function will return true for any version.
+ */
+goog.define('goog.userAgent.ASSUME_ANY_VERSION', false);
+
+
+/**
+ * Whether we know the browser engine at compile-time.
+ * @type {boolean}
+ * @private
+ */
+goog.userAgent.BROWSER_KNOWN_ = goog.userAgent.ASSUME_IE ||
+ goog.userAgent.ASSUME_EDGE || goog.userAgent.ASSUME_GECKO ||
+ goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.ASSUME_WEBKIT ||
+ goog.userAgent.ASSUME_OPERA;
+
+
+/**
+ * Returns the userAgent string for the current browser.
+ *
+ * @return {string} The userAgent string.
+ */
+goog.userAgent.getUserAgentString = function() {
+ return goog.labs.userAgent.util.getUserAgent();
+};
+
+
+/**
+ * TODO(nnaze): Change type to "Navigator" and update compilation targets.
+ * @return {Object} The native navigator object.
+ */
+goog.userAgent.getNavigator = function() {
+ // Need a local navigator reference instead of using the global one,
+ // to avoid the rare case where they reference different objects.
+ // (in a WorkerPool, for example).
+ return goog.global['navigator'] || null;
+};
+
+
+/**
+ * Whether the user agent is Opera.
+ * @type {boolean}
+ */
+goog.userAgent.OPERA = goog.userAgent.BROWSER_KNOWN_ ?
+ goog.userAgent.ASSUME_OPERA :
+ goog.labs.userAgent.browser.isOpera();
+
+
+/**
+ * Whether the user agent is Internet Explorer.
+ * @type {boolean}
+ */
+goog.userAgent.IE = goog.userAgent.BROWSER_KNOWN_ ?
+ goog.userAgent.ASSUME_IE :
+ goog.labs.userAgent.browser.isIE();
+
+
+/**
+ * Whether the user agent is Microsoft Edge.
+ * @type {boolean}
+ */
+goog.userAgent.EDGE = goog.userAgent.BROWSER_KNOWN_ ?
+ goog.userAgent.ASSUME_EDGE :
+ goog.labs.userAgent.engine.isEdge();
+
+
+/**
+ * Whether the user agent is MS Internet Explorer or MS Edge.
+ * @type {boolean}
+ */
+goog.userAgent.EDGE_OR_IE = goog.userAgent.EDGE || goog.userAgent.IE;
+
+
+/**
+ * Whether the user agent is Gecko. Gecko is the rendering engine used by
+ * Mozilla, Firefox, and others.
+ * @type {boolean}
+ */
+goog.userAgent.GECKO = goog.userAgent.BROWSER_KNOWN_ ?
+ goog.userAgent.ASSUME_GECKO :
+ goog.labs.userAgent.engine.isGecko();
+
+
+/**
+ * Whether the user agent is WebKit. WebKit is the rendering engine that
+ * Safari, Android and others use.
+ * @type {boolean}
+ */
+goog.userAgent.WEBKIT = goog.userAgent.BROWSER_KNOWN_ ?
+ goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_MOBILE_WEBKIT :
+ goog.labs.userAgent.engine.isWebKit();
+
+
+/**
+ * Whether the user agent is running on a mobile device.
+ *
+ * This is a separate function so that the logic can be tested.
+ *
+ * TODO(nnaze): Investigate swapping in goog.labs.userAgent.device.isMobile().
+ *
+ * @return {boolean} Whether the user agent is running on a mobile device.
+ * @private
+ */
+goog.userAgent.isMobile_ = function() {
+ return goog.userAgent.WEBKIT &&
+ goog.labs.userAgent.util.matchUserAgent('Mobile');
+};
+
+
+/**
+ * Whether the user agent is running on a mobile device.
+ *
+ * TODO(nnaze): Consider deprecating MOBILE when labs.userAgent
+ * is promoted as the gecko/webkit logic is likely inaccurate.
+ *
+ * @type {boolean}
+ */
+goog.userAgent.MOBILE =
+ goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.isMobile_();
+
+
+/**
+ * Used while transitioning code to use WEBKIT instead.
+ * @type {boolean}
+ * @deprecated Use {@link goog.userAgent.product.SAFARI} instead.
+ * TODO(nicksantos): Delete this from goog.userAgent.
+ */
+goog.userAgent.SAFARI = goog.userAgent.WEBKIT;
+
+
+/**
+ * @return {string} the platform (operating system) the user agent is running
+ * on. Default to empty string because navigator.platform may not be defined
+ * (on Rhino, for example).
+ * @private
+ */
+goog.userAgent.determinePlatform_ = function() {
+ var navigator = goog.userAgent.getNavigator();
+ return navigator && navigator.platform || '';
+};
+
+
+/**
+ * The platform (operating system) the user agent is running on. Default to
+ * empty string because navigator.platform may not be defined (on Rhino, for
+ * example).
+ * @type {string}
+ */
+goog.userAgent.PLATFORM = goog.userAgent.determinePlatform_();
+
+
+/**
+ * @define {boolean} Whether the user agent is running on a Macintosh operating
+ * system.
+ */
+goog.define('goog.userAgent.ASSUME_MAC', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on a Windows operating
+ * system.
+ */
+goog.define('goog.userAgent.ASSUME_WINDOWS', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on a Linux operating
+ * system.
+ */
+goog.define('goog.userAgent.ASSUME_LINUX', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on a X11 windowing
+ * system.
+ */
+goog.define('goog.userAgent.ASSUME_X11', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on Android.
+ */
+goog.define('goog.userAgent.ASSUME_ANDROID', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on an iPhone.
+ */
+goog.define('goog.userAgent.ASSUME_IPHONE', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on an iPad.
+ */
+goog.define('goog.userAgent.ASSUME_IPAD', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on an iPod.
+ */
+goog.define('goog.userAgent.ASSUME_IPOD', false);
+
+
+/**
+ * @type {boolean}
+ * @private
+ */
+goog.userAgent.PLATFORM_KNOWN_ = goog.userAgent.ASSUME_MAC ||
+ goog.userAgent.ASSUME_WINDOWS || goog.userAgent.ASSUME_LINUX ||
+ goog.userAgent.ASSUME_X11 || goog.userAgent.ASSUME_ANDROID ||
+ goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD ||
+ goog.userAgent.ASSUME_IPOD;
+
+
+/**
+ * Whether the user agent is running on a Macintosh operating system.
+ * @type {boolean}
+ */
+goog.userAgent.MAC = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_MAC :
+ goog.labs.userAgent.platform.isMacintosh();
+
+
+/**
+ * Whether the user agent is running on a Windows operating system.
+ * @type {boolean}
+ */
+goog.userAgent.WINDOWS = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_WINDOWS :
+ goog.labs.userAgent.platform.isWindows();
+
+
+/**
+ * Whether the user agent is Linux per the legacy behavior of
+ * goog.userAgent.LINUX, which considered ChromeOS to also be
+ * Linux.
+ * @return {boolean}
+ * @private
+ */
+goog.userAgent.isLegacyLinux_ = function() {
+ return goog.labs.userAgent.platform.isLinux() ||
+ goog.labs.userAgent.platform.isChromeOS();
+};
+
+
+/**
+ * Whether the user agent is running on a Linux operating system.
+ *
+ * Note that goog.userAgent.LINUX considers ChromeOS to be Linux,
+ * while goog.labs.userAgent.platform considers ChromeOS and
+ * Linux to be different OSes.
+ *
+ * @type {boolean}
+ */
+goog.userAgent.LINUX = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_LINUX :
+ goog.userAgent.isLegacyLinux_();
+
+
+/**
+ * @return {boolean} Whether the user agent is an X11 windowing system.
+ * @private
+ */
+goog.userAgent.isX11_ = function() {
+ var navigator = goog.userAgent.getNavigator();
+ return !!navigator &&
+ goog.string.contains(navigator['appVersion'] || '', 'X11');
+};
+
+
+/**
+ * Whether the user agent is running on a X11 windowing system.
+ * @type {boolean}
+ */
+goog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_X11 :
+ goog.userAgent.isX11_();
+
+
+/**
+ * Whether the user agent is running on Android.
+ * @type {boolean}
+ */
+goog.userAgent.ANDROID = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_ANDROID :
+ goog.labs.userAgent.platform.isAndroid();
+
+
+/**
+ * Whether the user agent is running on an iPhone.
+ * @type {boolean}
+ */
+goog.userAgent.IPHONE = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_IPHONE :
+ goog.labs.userAgent.platform.isIphone();
+
+
+/**
+ * Whether the user agent is running on an iPad.
+ * @type {boolean}
+ */
+goog.userAgent.IPAD = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_IPAD :
+ goog.labs.userAgent.platform.isIpad();
+
+
+/**
+ * Whether the user agent is running on an iPod.
+ * @type {boolean}
+ */
+goog.userAgent.IPOD = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_IPOD :
+ goog.labs.userAgent.platform.isIpod();
+
+
+/**
+ * @return {string} The string that describes the version number of the user
+ * agent.
+ * @private
+ */
+goog.userAgent.determineVersion_ = function() {
+ // All browsers have different ways to detect the version and they all have
+ // different naming schemes.
+ // version is a string rather than a number because it may contain 'b', 'a',
+ // and so on.
+ var version = '';
+ var arr = goog.userAgent.getVersionRegexResult_();
+ if (arr) {
+ version = arr ? arr[1] : '';
+ }
+
+ if (goog.userAgent.IE) {
+ // IE9 can be in document mode 9 but be reporting an inconsistent user agent
+ // version. If it is identifying as a version lower than 9 we take the
+ // documentMode as the version instead. IE8 has similar behavior.
+ // It is recommended to set the X-UA-Compatible header to ensure that IE9
+ // uses documentMode 9.
+ var docMode = goog.userAgent.getDocumentMode_();
+ if (docMode != null && docMode > parseFloat(version)) {
+ return String(docMode);
+ }
+ }
+
+ return version;
+};
+
+
+/**
+ * @return {?Array|undefined} The version regex matches from parsing the user
+ * agent string. These regex statements must be executed inline so they can
+ * be compiled out by the closure compiler with the rest of the useragent
+ * detection logic when ASSUME_* is specified.
+ * @private
+ */
+goog.userAgent.getVersionRegexResult_ = function() {
+ var userAgent = goog.userAgent.getUserAgentString();
+ if (goog.userAgent.GECKO) {
+ return /rv\:([^\);]+)(\)|;)/.exec(userAgent);
+ }
+ if (goog.userAgent.EDGE) {
+ return /Edge\/([\d\.]+)/.exec(userAgent);
+ }
+ if (goog.userAgent.IE) {
+ return /\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(userAgent);
+ }
+ if (goog.userAgent.WEBKIT) {
+ // WebKit/125.4
+ return /WebKit\/(\S+)/.exec(userAgent);
+ }
+ if (goog.userAgent.OPERA) {
+ // If none of the above browsers were detected but the browser is Opera, the
+ // only string that is of interest is 'Version/<number>'.
+ return /(?:Version)[ \/]?(\S+)/.exec(userAgent);
+ }
+ return undefined;
+};
+
+
+/**
+ * @return {number|undefined} Returns the document mode (for testing).
+ * @private
+ */
+goog.userAgent.getDocumentMode_ = function() {
+ // NOTE(user): goog.userAgent may be used in context where there is no DOM.
+ var doc = goog.global['document'];
+ return doc ? doc['documentMode'] : undefined;
+};
+
+
+/**
+ * The version of the user agent. This is a string because it might contain
+ * 'b' (as in beta) as well as multiple dots.
+ * @type {string}
+ */
+goog.userAgent.VERSION = goog.userAgent.determineVersion_();
+
+
+/**
+ * Compares two version numbers.
+ *
+ * @param {string} v1 Version of first item.
+ * @param {string} v2 Version of second item.
+ *
+ * @return {number} 1 if first argument is higher
+ * 0 if arguments are equal
+ * -1 if second argument is higher.
+ * @deprecated Use goog.string.compareVersions.
+ */
+goog.userAgent.compare = function(v1, v2) {
+ return goog.string.compareVersions(v1, v2);
+};
+
+
+/**
+ * Cache for {@link goog.userAgent.isVersionOrHigher}.
+ * Calls to compareVersions are surprisingly expensive and, as a browser's
+ * version number is unlikely to change during a session, we cache the results.
+ * @const
+ * @private
+ */
+goog.userAgent.isVersionOrHigherCache_ = {};
+
+
+/**
+ * Whether the user agent version is higher or the same as the given version.
+ * NOTE: When checking the version numbers for Firefox and Safari, be sure to
+ * use the engine's version, not the browser's version number. For example,
+ * Firefox 3.0 corresponds to Gecko 1.9 and Safari 3.0 to Webkit 522.11.
+ * Opera and Internet Explorer versions match the product release number.<br>
+ * @see <a href="http://en.wikipedia.org/wiki/Safari_version_history">
+ * Webkit</a>
+ * @see <a href="http://en.wikipedia.org/wiki/Gecko_engine">Gecko</a>
+ *
+ * @param {string|number} version The version to check.
+ * @return {boolean} Whether the user agent version is higher or the same as
+ * the given version.
+ */
+goog.userAgent.isVersionOrHigher = function(version) {
+ return goog.userAgent.ASSUME_ANY_VERSION ||
+ goog.userAgent.isVersionOrHigherCache_[version] ||
+ (goog.userAgent.isVersionOrHigherCache_[version] =
+ goog.string.compareVersions(goog.userAgent.VERSION, version) >= 0);
+};
+
+
+/**
+ * Deprecated alias to {@code goog.userAgent.isVersionOrHigher}.
+ * @param {string|number} version The version to check.
+ * @return {boolean} Whether the user agent version is higher or the same as
+ * the given version.
+ * @deprecated Use goog.userAgent.isVersionOrHigher().
+ */
+goog.userAgent.isVersion = goog.userAgent.isVersionOrHigher;
+
+
+/**
+ * Whether the IE effective document mode is higher or the same as the given
+ * document mode version.
+ * NOTE: Only for IE, return false for another browser.
+ *
+ * @param {number} documentMode The document mode version to check.
+ * @return {boolean} Whether the IE effective document mode is higher or the
+ * same as the given version.
+ */
+goog.userAgent.isDocumentModeOrHigher = function(documentMode) {
+ return Number(goog.userAgent.DOCUMENT_MODE) >= documentMode;
+};
+
+
+/**
+ * Deprecated alias to {@code goog.userAgent.isDocumentModeOrHigher}.
+ * @param {number} version The version to check.
+ * @return {boolean} Whether the IE effective document mode is higher or the
+ * same as the given version.
+ * @deprecated Use goog.userAgent.isDocumentModeOrHigher().
+ */
+goog.userAgent.isDocumentMode = goog.userAgent.isDocumentModeOrHigher;
+
+
+/**
+ * For IE version < 7, documentMode is undefined, so attempt to use the
+ * CSS1Compat property to see if we are in standards mode. If we are in
+ * standards mode, treat the browser version as the document mode. Otherwise,
+ * IE is emulating version 5.
+ * @type {number|undefined}
+ * @const
+ */
+goog.userAgent.DOCUMENT_MODE = (function() {
+ var doc = goog.global['document'];
+ var mode = goog.userAgent.getDocumentMode_();
+ if (!doc || !goog.userAgent.IE) {
+ return undefined;
+ }
+ return mode || (doc['compatMode'] == 'CSS1Compat' ?
+ parseInt(goog.userAgent.VERSION, 10) :
+ 5);
+})();
diff --git a/src/http/static/viz/1/processing.js b/src/http/static/viz/1/processing.js
new file mode 100644
index 0000000..7cfb7a8
--- /dev/null
+++ b/src/http/static/viz/1/processing.js
@@ -0,0 +1,21796 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+// build script for generating processing.js
+
+var Browser = {
+ isDomPresent: true,
+ navigator: navigator,
+ window: window,
+ document: document,
+ ajax: function(url) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url, false);
+ if (xhr.overrideMimeType) {
+ xhr.overrideMimeType("text/plain");
+ }
+ xhr.setRequestHeader("If-Modified-Since", "Fri, 01 Jan 1960 00:00:00 GMT");
+ xhr.send(null);
+ // failed request?
+ if (xhr.status !== 200 && xhr.status !== 0) { throw ("XMLHttpRequest failed, status code " + xhr.status); }
+ return xhr.responseText;
+ }
+};
+
+window.Processing = require('./src/')(Browser);
+
+},{"./src/":28}],2:[function(require,module,exports){
+module.exports={
+ "name": "processing-js",
+ "version": "1.6.4",
+ "author": "Processing.js",
+ "repository": {
+ "type": "git",
+ "url": "git@github.com/processing-js/processing-js.git"
+ },
+ "main": "processing.min.js",
+ "bugs": "https://github.com/processing-js/processing-js/issues",
+ "devDependencies": {
+ "argv": "~0.0.2",
+ "browserify": "^11.0.1",
+ "express": "~3.3.3",
+ "grunt": "~0.4.1",
+ "grunt-cli": "~0.1.8",
+ "grunt-contrib-jshint": "~0.4.3",
+ "http-server": "^0.9.0",
+ "minifier": "^0.7.1",
+ "node-minify": "~0.7.3",
+ "nunjucks": "~0.1.9",
+ "open": "0.0.3"
+ },
+ "scripts": {
+ "test": "node test",
+ "test:manual": "http-server -o test/manual",
+ "start": "browserify build.js -o processing.js && minify --output processing.min.js processing.js"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "minifier": "^0.7.1"
+ }
+}
+
+},{}],3:[function(require,module,exports){
+/**
+* A ObjectIterator is an iterator wrapper for objects. If passed object contains
+* the iterator method, the object instance will be replaced by the result returned by
+* this method call. If passed object is an array, the ObjectIterator instance iterates
+* through its items.
+*
+* @param {Object} obj The object to be iterated.
+*/
+module.exports = function ObjectIterator(obj) {
+ if (obj instanceof Array) {
+ // iterate through array items
+ var index = -1;
+ this.hasNext = function() {
+ return ++index < obj.length;
+ };
+ this.next = function() {
+ return obj[index];
+ };
+ } else if (obj.iterator instanceof Function) {
+ return obj.iterator();
+ } else {
+ throw "Unable to iterate: " + obj;
+ }
+};
+
+},{}],4:[function(require,module,exports){
+/**
+ * Processing.js environment constants
+ */
+module.exports = {
+ X: 0,
+ Y: 1,
+ Z: 2,
+
+ R: 3,
+ G: 4,
+ B: 5,
+ A: 6,
+
+ U: 7,
+ V: 8,
+
+ NX: 9,
+ NY: 10,
+ NZ: 11,
+
+ EDGE: 12,
+
+ // Stroke
+ SR: 13,
+ SG: 14,
+ SB: 15,
+ SA: 16,
+
+ SW: 17,
+
+ // Transformations (2D and 3D)
+ TX: 18,
+ TY: 19,
+ TZ: 20,
+
+ VX: 21,
+ VY: 22,
+ VZ: 23,
+ VW: 24,
+
+ // Material properties
+ AR: 25,
+ AG: 26,
+ AB: 27,
+
+ DR: 3,
+ DG: 4,
+ DB: 5,
+ DA: 6,
+
+ SPR: 28,
+ SPG: 29,
+ SPB: 30,
+
+ SHINE: 31,
+
+ ER: 32,
+ EG: 33,
+ EB: 34,
+
+ BEEN_LIT: 35,
+
+ VERTEX_FIELD_COUNT: 36,
+
+ // Renderers
+ P2D: 1,
+ JAVA2D: 1,
+ WEBGL: 2,
+ P3D: 2,
+ OPENGL: 2,
+ PDF: 0,
+ DXF: 0,
+
+ // Platform IDs
+ OTHER: 0,
+ WINDOWS: 1,
+ MAXOSX: 2,
+ LINUX: 3,
+
+ EPSILON: 0.0001,
+
+ MAX_FLOAT: 3.4028235e+38,
+ MIN_FLOAT: -3.4028235e+38,
+ MAX_INT: 2147483647,
+ MIN_INT: -2147483648,
+
+ PI: Math.PI,
+ TWO_PI: 2 * Math.PI,
+ TAU: 2 * Math.PI,
+ HALF_PI: Math.PI / 2,
+ THIRD_PI: Math.PI / 3,
+ QUARTER_PI: Math.PI / 4,
+
+ DEG_TO_RAD: Math.PI / 180,
+ RAD_TO_DEG: 180 / Math.PI,
+
+ WHITESPACE: " \t\n\r\f\u00A0",
+
+ // Color modes
+ RGB: 1,
+ ARGB: 2,
+ HSB: 3,
+ ALPHA: 4,
+ CMYK: 5,
+
+ // Image file types
+ TIFF: 0,
+ TARGA: 1,
+ JPEG: 2,
+ GIF: 3,
+
+ // Filter/convert types
+ BLUR: 11,
+ GRAY: 12,
+ INVERT: 13,
+ OPAQUE: 14,
+ POSTERIZE: 15,
+ THRESHOLD: 16,
+ ERODE: 17,
+ DILATE: 18,
+
+ // Blend modes
+ REPLACE: 0,
+ BLEND: 1 << 0,
+ ADD: 1 << 1,
+ SUBTRACT: 1 << 2,
+ LIGHTEST: 1 << 3,
+ DARKEST: 1 << 4,
+ DIFFERENCE: 1 << 5,
+ EXCLUSION: 1 << 6,
+ MULTIPLY: 1 << 7,
+ SCREEN: 1 << 8,
+ OVERLAY: 1 << 9,
+ HARD_LIGHT: 1 << 10,
+ SOFT_LIGHT: 1 << 11,
+ DODGE: 1 << 12,
+ BURN: 1 << 13,
+
+ // Color component bit masks
+ ALPHA_MASK: 0xff000000,
+ RED_MASK: 0x00ff0000,
+ GREEN_MASK: 0x0000ff00,
+ BLUE_MASK: 0x000000ff,
+
+ // Projection matrices
+ CUSTOM: 0,
+ ORTHOGRAPHIC: 2,
+ PERSPECTIVE: 3,
+
+ // Shapes
+ POINT: 2,
+ POINTS: 2,
+ LINE: 4,
+ LINES: 4,
+ TRIANGLE: 8,
+ TRIANGLES: 9,
+ TRIANGLE_STRIP: 10,
+ TRIANGLE_FAN: 11,
+ QUAD: 16,
+ QUADS: 16,
+ QUAD_STRIP: 17,
+ POLYGON: 20,
+ PATH: 21,
+ RECT: 30,
+ ELLIPSE: 31,
+ ARC: 32,
+ SPHERE: 40,
+ BOX: 41,
+
+ // Arc drawing modes
+ //OPEN: 1, // shared with Shape closing modes
+ CHORD: 2,
+ PIE: 3,
+
+
+ GROUP: 0,
+ PRIMITIVE: 1,
+ //PATH: 21, // shared with Shape PATH
+ GEOMETRY: 3,
+
+ // Shape Vertex
+ VERTEX: 0,
+ BEZIER_VERTEX: 1,
+ CURVE_VERTEX: 2,
+ BREAK: 3,
+ CLOSESHAPE: 4,
+
+ // Shape closing modes
+ OPEN: 1,
+ CLOSE: 2,
+
+ // Shape drawing modes
+ CORNER: 0, // Draw mode convention to use (x, y) to (width, height)
+ CORNERS: 1, // Draw mode convention to use (x1, y1) to (x2, y2) coordinates
+ RADIUS: 2, // Draw mode from the center, and using the radius
+ CENTER_RADIUS: 2, // Deprecated! Use RADIUS instead
+ CENTER: 3, // Draw from the center, using second pair of values as the diameter
+ DIAMETER: 3, // Synonym for the CENTER constant. Draw from the center
+ CENTER_DIAMETER: 3, // Deprecated! Use DIAMETER instead
+
+ // Text vertical alignment modes
+ BASELINE: 0, // Default vertical alignment for text placement
+ TOP: 101, // Align text to the top
+ BOTTOM: 102, // Align text from the bottom, using the baseline
+
+ // UV Texture coordinate modes
+ NORMAL: 1,
+ NORMALIZED: 1,
+ IMAGE: 2,
+
+ // Text placement modes
+ MODEL: 4,
+ SHAPE: 5,
+
+ // Stroke modes
+ SQUARE: 'butt',
+ ROUND: 'round',
+ PROJECT: 'square',
+ MITER: 'miter',
+ BEVEL: 'bevel',
+
+ // Lighting modes
+ AMBIENT: 0,
+ DIRECTIONAL: 1,
+ //POINT: 2, Shared with Shape constant
+ SPOT: 3,
+
+ // Key constants
+
+ // Both key and keyCode will be equal to these values
+ BACKSPACE: 8,
+ TAB: 9,
+ ENTER: 10,
+ RETURN: 13,
+ ESC: 27,
+ DELETE: 127,
+ CODED: 0xffff,
+
+ // p.key will be CODED and p.keyCode will be this value
+ SHIFT: 16,
+ CONTROL: 17,
+ ALT: 18,
+ CAPSLK: 20,
+ PGUP: 33,
+ PGDN: 34,
+ END: 35,
+ HOME: 36,
+ LEFT: 37,
+ UP: 38,
+ RIGHT: 39,
+ DOWN: 40,
+ F1: 112,
+ F2: 113,
+ F3: 114,
+ F4: 115,
+ F5: 116,
+ F6: 117,
+ F7: 118,
+ F8: 119,
+ F9: 120,
+ F10: 121,
+ F11: 122,
+ F12: 123,
+ NUMLK: 144,
+ META: 157,
+ INSERT: 155,
+
+ // Cursor types
+ ARROW: 'default',
+ CROSS: 'crosshair',
+ HAND: 'pointer',
+ MOVE: 'move',
+ TEXT: 'text',
+ WAIT: 'wait',
+ NOCURSOR: "url('data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='), auto",
+
+ // Hints
+ DISABLE_OPENGL_2X_SMOOTH: 1,
+ ENABLE_OPENGL_2X_SMOOTH: -1,
+ ENABLE_OPENGL_4X_SMOOTH: 2,
+ ENABLE_NATIVE_FONTS: 3,
+ DISABLE_DEPTH_TEST: 4,
+ ENABLE_DEPTH_TEST: -4,
+ ENABLE_DEPTH_SORT: 5,
+ DISABLE_DEPTH_SORT: -5,
+ DISABLE_OPENGL_ERROR_REPORT: 6,
+ ENABLE_OPENGL_ERROR_REPORT: -6,
+ ENABLE_ACCURATE_TEXTURES: 7,
+ DISABLE_ACCURATE_TEXTURES: -7,
+ HINT_COUNT: 10,
+
+ // PJS defined constants
+ SINCOS_LENGTH: 720, // every half degree
+ PRECISIONB: 15, // fixed point precision is limited to 15 bits!!
+ PRECISIONF: 1 << 15,
+ PREC_MAXVAL: (1 << 15) - 1,
+ PREC_ALPHA_SHIFT: 24 - 15,
+ PREC_RED_SHIFT: 16 - 15,
+ NORMAL_MODE_AUTO: 0,
+ NORMAL_MODE_SHAPE: 1,
+ NORMAL_MODE_VERTEX: 2,
+ MAX_LIGHTS: 8
+};
+
+},{}],5:[function(require,module,exports){
+// the logger for print() and println()
+module.exports = function PjsConsole(document) {
+ var e = { BufferMax: 200 },
+ style = document.createElement("style"),
+ added = false;
+
+ style.textContent = [
+ ".pjsconsole.hidden {",
+ " display: none!important;",
+ "}"
+ ].join('\n');
+
+ e.wrapper = document.createElement("div");
+ style.textContent += [
+ "",
+ ".pjsconsole {",
+ " opacity: .75;",
+ " display: block;",
+ " position: fixed;",
+ " bottom: 0px;",
+ " left: 0px;",
+ " right: 0px;",
+ " height: 50px;",
+ " background-color: #aaa;",
+ "}"
+ ].join('\n');
+ e.wrapper.classList.add("pjsconsole");
+
+ e.dragger = document.createElement("div");
+ style.textContent += [
+ "",
+ ".pjsconsole .dragger {",
+ " display: block;",
+ " border: 3px black raised;",
+ " cursor: n-resize;",
+ " position: absolute;",
+ " top: 0px;",
+ " left: 0px;",
+ " right: 0px;",
+ " height: 5px;",
+ " background-color: #333;",
+ "}"
+ ].join('\n');
+ e.dragger.classList.add("dragger");
+
+ e.closer = document.createElement("div");
+ style.textContent += [
+ "",
+ ".pjsconsole .closer {",
+ " opacity: .5;",
+ " display: block;",
+ " border: 3px black raised;",
+ " position: absolute;",
+ " top: 10px;",
+ " right: 30px;",
+ " height: 20px;",
+ " width: 20px;",
+ " background-color: #ddd;",
+ " color: #000;",
+ " line-height: 20px;",
+ " text-align: center;",
+ " cursor: pointer",
+ "}"
+ ].join('\n');
+ e.closer.classList.add("closer");
+ e.closer.innerHTML = "&#10006;";
+
+ e.javaconsole = document.createElement("div");
+ style.textContent += [
+ "",
+ ".pjsconsole .console {",
+ " overflow-x: auto;",
+ " display: block;",
+ " position: absolute;",
+ " left: 10px;",
+ " right: 0px;",
+ " bottom: 5px;",
+ " top: 10px;",
+ " overflow-y: scroll;",
+ " height: 40px;",
+ "}"
+ ].join('\n');
+ e.javaconsole.setAttribute("class", "console");
+
+ e.wrapper.appendChild(e.dragger);
+ e.wrapper.appendChild(e.javaconsole);
+ e.wrapper.appendChild(e.closer);
+
+ e.dragger.onmousedown = function (t) {
+ e.divheight = e.wrapper.style.height;
+ if (document.selection) document.selection.empty();
+ else window.getSelection().removeAllRanges();
+ var n = t.screenY;
+ window.onmousemove = function (t) {
+ e.wrapper.style.height = parseFloat(e.divheight) + (n - t.screenY) + "px";
+ e.javaconsole.style.height = parseFloat(e.divheight) + (n - t.screenY) - 10 + "px";
+ };
+ window.onmouseup = function (t) {
+ if (document.selection) document.selection.empty();
+ else window.getSelection().removeAllRanges();
+ e.wrapper.style.height = parseFloat(e.divheight) + (n - t.screenY) + "px";
+ e.javaconsole.style.height = parseFloat(e.divheight) + (n - t.screenY) - 10 + "px";
+ window.onmousemove = null;
+ window.onmouseup = null;
+ };
+ };
+
+ e.BufferArray = [];
+
+ e.print = e.log = function () {
+ if(!added) {
+ document.body.appendChild(style);
+ document.body.appendChild(e.wrapper);
+ added = true;
+ }
+ var args = Array.prototype.slice.call(arguments);
+ t = args.map(function(t, idx) { return t + (idx+1 === args.length ? "" : " "); }).join('');
+ if (e.BufferArray[e.BufferArray.length - 1]) e.BufferArray[e.BufferArray.length - 1] += (t) + "";
+ else e.BufferArray.push(t);
+ e.javaconsole.innerHTML = e.BufferArray.join('');
+ e.showconsole();
+ };
+
+ e.println = function () {
+ var args = Array.prototype.slice.call(arguments);
+ args.push('<br>');
+ e.print.apply(e, args);
+ if (e.BufferArray.length > e.BufferMax) {
+ e.BufferArray.splice(0, 1);
+ } else {
+ e.javaconsole.scrollTop = e.javaconsole.scrollHeight;
+ }
+ };
+
+ e.showconsole = function () { e.wrapper.classList.remove("hidden"); };
+ e.hideconsole = function () { e.wrapper.classList.add("hidden"); };
+
+ e.closer.onclick = function () { e.hideconsole(); };
+
+ e.hideconsole();
+
+ return e;
+};
+
+},{}],6:[function(require,module,exports){
+/**
+ * Processing.js default scope
+ */
+module.exports = function(options) {
+
+ // Building defaultScope. Changing of the prototype protects
+ // internal Processing code from the changes in defaultScope
+ function DefaultScope() {}
+ DefaultScope.prototype = options.PConstants;
+
+ var defaultScope = new DefaultScope();
+
+ // copy over all known Object types and helper objects
+ Object.keys(options).forEach(function(prop) {
+ defaultScope[prop] = options[prop];
+ });
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Class inheritance helper methods
+ ////////////////////////////////////////////////////////////////////////////
+
+ defaultScope.defineProperty = function(obj, name, desc) {
+ if("defineProperty" in Object) {
+ Object.defineProperty(obj, name, desc);
+ } else {
+ if (desc.hasOwnProperty("get")) {
+ obj.__defineGetter__(name, desc.get);
+ }
+ if (desc.hasOwnProperty("set")) {
+ obj.__defineSetter__(name, desc.set);
+ }
+ }
+ };
+
+ /**
+ * class overloading, part 1
+ */
+ function overloadBaseClassFunction(object, name, basefn) {
+ if (!object.hasOwnProperty(name) || typeof object[name] !== 'function') {
+ // object method is not a function or just inherited from Object.prototype
+ object[name] = basefn;
+ return;
+ }
+ var fn = object[name];
+ if ("$overloads" in fn) {
+ // the object method already overloaded (see defaultScope.addMethod)
+ // let's just change a fallback method
+ fn.$defaultOverload = basefn;
+ return;
+ }
+ if (!("$overloads" in basefn) && fn.length === basefn.length) {
+ // special case when we just overriding the method
+ return;
+ }
+ var overloads, defaultOverload;
+ if ("$overloads" in basefn) {
+ // let's inherit base class overloads to speed up things
+ overloads = basefn.$overloads.slice(0);
+ overloads[fn.length] = fn;
+ defaultOverload = basefn.$defaultOverload;
+ } else {
+ overloads = [];
+ overloads[basefn.length] = basefn;
+ overloads[fn.length] = fn;
+ defaultOverload = fn;
+ }
+ var hubfn = function() {
+ var fn = hubfn.$overloads[arguments.length] ||
+ ("$methodArgsIndex" in hubfn && arguments.length > hubfn.$methodArgsIndex ?
+ hubfn.$overloads[hubfn.$methodArgsIndex] : null) ||
+ hubfn.$defaultOverload;
+ return fn.apply(this, arguments);
+ };
+ hubfn.$overloads = overloads;
+ if ("$methodArgsIndex" in basefn) {
+ hubfn.$methodArgsIndex = basefn.$methodArgsIndex;
+ }
+ hubfn.$defaultOverload = defaultOverload;
+ hubfn.name = name;
+ object[name] = hubfn;
+ }
+
+ /**
+ * class overloading, part 2
+ */
+
+ function extendClass(subClass, baseClass) {
+ function extendGetterSetter(propertyName) {
+ defaultScope.defineProperty(subClass, propertyName, {
+ get: function() {
+ return baseClass[propertyName];
+ },
+ set: function(v) {
+ baseClass[propertyName]=v;
+ },
+ enumerable: true
+ });
+ }
+
+ var properties = [];
+ for (var propertyName in baseClass) {
+ if (typeof baseClass[propertyName] === 'function') {
+ overloadBaseClassFunction(subClass, propertyName, baseClass[propertyName]);
+ } else if(propertyName.charAt(0) !== "$" && !(propertyName in subClass)) {
+ // Delaying the properties extension due to the IE9 bug (see #918).
+ properties.push(propertyName);
+ }
+ }
+ while (properties.length > 0) {
+ extendGetterSetter(properties.shift());
+ }
+
+ subClass.$super = baseClass;
+ }
+
+ /**
+ * class overloading, part 3
+ */
+ defaultScope.extendClassChain = function(base) {
+ var path = [base];
+ for (var self = base.$upcast; self; self = self.$upcast) {
+ extendClass(self, base);
+ path.push(self);
+ base = self;
+ }
+ while (path.length > 0) {
+ path.pop().$self=base;
+ }
+ };
+
+ // static
+ defaultScope.extendStaticMembers = function(derived, base) {
+ extendClass(derived, base);
+ };
+
+ // interface
+ defaultScope.extendInterfaceMembers = function(derived, base) {
+ extendClass(derived, base);
+ };
+
+ /**
+ * Java methods and JavaScript functions differ enough that
+ * we need a special function to make sure it all links up
+ * as classical hierarchical class chains.
+ */
+ defaultScope.addMethod = function(object, name, fn, hasMethodArgs) {
+ var existingfn = object[name];
+ if (existingfn || hasMethodArgs) {
+ var args = fn.length;
+ // builds the overload methods table
+ if ("$overloads" in existingfn) {
+ existingfn.$overloads[args] = fn;
+ } else {
+ var hubfn = function() {
+ var fn = hubfn.$overloads[arguments.length] ||
+ ("$methodArgsIndex" in hubfn && arguments.length > hubfn.$methodArgsIndex ?
+ hubfn.$overloads[hubfn.$methodArgsIndex] : null) ||
+ hubfn.$defaultOverload;
+ return fn.apply(this, arguments);
+ };
+ var overloads = [];
+ if (existingfn) {
+ overloads[existingfn.length] = existingfn;
+ }
+ overloads[args] = fn;
+ hubfn.$overloads = overloads;
+ hubfn.$defaultOverload = existingfn || fn;
+ if (hasMethodArgs) {
+ hubfn.$methodArgsIndex = args;
+ }
+ hubfn.name = name;
+ object[name] = hubfn;
+ }
+ } else {
+ object[name] = fn;
+ }
+ };
+
+ // internal helper function
+ function isNumericalJavaType(type) {
+ if (typeof type !== "string") {
+ return false;
+ }
+ return ["byte", "int", "char", "color", "float", "long", "double"].indexOf(type) !== -1;
+ }
+
+ /**
+ * Java's arrays are pre-filled when declared with
+ * an initial size, but no content. JS arrays are not.
+ */
+ defaultScope.createJavaArray = function(type, bounds) {
+ var result = null,
+ defaultValue = null;
+ if (typeof type === "string") {
+ if (type === "boolean") {
+ defaultValue = false;
+ } else if (isNumericalJavaType(type)) {
+ defaultValue = 0;
+ }
+ }
+ if (typeof bounds[0] === 'number') {
+ var itemsCount = 0 | bounds[0];
+ if (bounds.length <= 1) {
+ result = [];
+ result.length = itemsCount;
+ for (var i = 0; i < itemsCount; ++i) {
+ result[i] = defaultValue;
+ }
+ } else {
+ result = [];
+ var newBounds = bounds.slice(1);
+ for (var j = 0; j < itemsCount; ++j) {
+ result.push(defaultScope.createJavaArray(type, newBounds));
+ }
+ }
+ }
+ return result;
+ };
+
+ // screenWidth and screenHeight are shared by all instances.
+ // and return the width/height of the browser's viewport.
+ defaultScope.defineProperty(defaultScope, 'screenWidth',
+ { get: function() { return window.innerWidth; } });
+
+ defaultScope.defineProperty(defaultScope, 'screenHeight',
+ { get: function() { return window.innerHeight; } });
+
+ return defaultScope;
+};
+
+},{}],7:[function(require,module,exports){
+/**
+ * Finalise the Processing.js object.
+ */
+module.exports = function finalizeProcessing(Processing, options) {
+
+ // unpack options
+ var window = options.window,
+ document = options.document,
+ XMLHttpRequest = window.XMLHttpRequest,
+ noop = options.noop,
+ isDOMPresent = options.isDOMPresent,
+ version = options.version,
+ undef;
+
+ // versioning
+ Processing.version = (version ? version : "@DEV-VERSION@");
+
+ // Share lib space
+ Processing.lib = {};
+
+ /**
+ * External libraries can be added to the global Processing
+ * objects with the `registerLibrary` function.
+ */
+ Processing.registerLibrary = function(name, library) {
+ Processing.lib[name] = library;
+ if(library.hasOwnProperty("init")) {
+ library.init(defaultScope);
+ }
+ };
+
+ /**
+ * This is the object that acts as our version of PApplet.
+ * This can be called as Processing.Sketch() or as
+ * Processing.Sketch(function) in which case the function
+ * must be an already-compiled-to-JS sketch function.
+ */
+ Processing.Sketch = function(attachFunction) {
+ this.attachFunction = attachFunction;
+ this.options = {
+ pauseOnBlur: false,
+ globalKeyEvents: false
+ };
+
+ /* Optional Sketch event hooks:
+ * onLoad - parsing/preloading is done, before sketch starts
+ * onSetup - setup() has been called, before first draw()
+ * onPause - noLoop() has been called, pausing draw loop
+ * onLoop - loop() has been called, resuming draw loop
+ * onFrameStart - draw() loop about to begin
+ * onFrameEnd - draw() loop finished
+ * onExit - exit() done being called
+ */
+ this.onLoad = noop;
+ this.onSetup = noop;
+ this.onPause = noop;
+ this.onLoop = noop;
+ this.onFrameStart = noop;
+ this.onFrameEnd = noop;
+ this.onExit = noop;
+
+ this.params = {};
+ this.imageCache = {
+ pending: 0,
+ images: {},
+ // Opera requires special administration for preloading
+ operaCache: {},
+ // Specify an optional img arg if the image is already loaded in the DOM,
+ // otherwise href will get loaded.
+ add: function(href, img) {
+ // Prevent muliple loads for an image, in case it gets
+ // preloaded more than once, or is added via JS and then preloaded.
+ if (this.images[href]) {
+ return;
+ }
+
+ if (!isDOMPresent) {
+ this.images[href] = null;
+ }
+
+ // No image in the DOM, kick-off a background load
+ if (!img) {
+ img = new Image();
+ img.onload = (function(owner) {
+ return function() {
+ owner.pending--;
+ };
+ }(this));
+ this.pending++;
+ img.src = href;
+ }
+
+ this.images[href] = img;
+
+ // Opera will not load images until they are inserted into the DOM.
+ if (window.opera) {
+ var div = document.createElement("div");
+ div.appendChild(img);
+ // we can't use "display: none", since that makes it invisible, and thus not load
+ div.style.position = "absolute";
+ div.style.opacity = 0;
+ div.style.width = "1px";
+ div.style.height= "1px";
+ if (!this.operaCache[href]) {
+ document.body.appendChild(div);
+ this.operaCache[href] = div;
+ }
+ }
+ }
+ };
+
+ this.sourceCode = undefined;
+ this.attach = function(processing) {
+ // either attachFunction or sourceCode must be present on attach
+ if(typeof this.attachFunction === "function") {
+ this.attachFunction(processing);
+ } else if(this.sourceCode) {
+ var func = ((new Function("return (" + this.sourceCode + ");"))());
+ func(processing);
+ this.attachFunction = func;
+ } else {
+ throw "Unable to attach sketch to the processing instance";
+ }
+ };
+
+ this.toString = function() {
+ var i;
+ var code = "((function(Sketch) {\n";
+ code += "var sketch = new Sketch(\n" + this.sourceCode + ");\n";
+ for(i in this.options) {
+ if(this.options.hasOwnProperty(i)) {
+ var value = this.options[i];
+ code += "sketch.options." + i + " = " +
+ (typeof value === 'string' ? '\"' + value + '\"' : "" + value) + ";\n";
+ }
+ }
+ for(i in this.imageCache) {
+ if(this.options.hasOwnProperty(i)) {
+ code += "sketch.imageCache.add(\"" + i + "\");\n";
+ }
+ }
+ // TODO serialize fonts
+ code += "return sketch;\n})(Processing.Sketch))";
+ return code;
+ };
+ };
+
+ /**
+ * aggregate all source code into a single file, then rewrite that
+ * source and bind to canvas via new Processing(canvas, sourcestring).
+ * @param {CANVAS} canvas The html canvas element to bind to
+ * @param {String[]} source The array of files that must be loaded
+ * @param {Function} onComplete A callback, called with the sketch as the argument.
+ */
+ var loadSketchFromSources = Processing.loadSketchFromSources = function(canvas, sources, onComplete) {
+ var code = [], errors = [], sourcesCount = sources.length, loaded = 0;
+
+ function ajaxAsync(url, callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState === 4) {
+ var error;
+ if (xhr.status !== 200 && xhr.status !== 0) {
+ error = "Invalid XHR status " + xhr.status;
+ } else if (xhr.responseText === "") {
+ // Give a hint when loading fails due to same-origin issues on file:/// urls
+ if ( ("withCredentials" in new XMLHttpRequest()) &&
+ (new XMLHttpRequest()).withCredentials === false &&
+ window.location.protocol === "file:" ) {
+ error = "XMLHttpRequest failure, possibly due to a same-origin policy violation. You can try loading this page in another browser, or load it from http://localhost using a local webserver. See the Processing.js README for a more detailed explanation of this problem and solutions.";
+ } else {
+ error = "File is empty.";
+ }
+ }
+
+ callback(xhr.responseText, error);
+ }
+ };
+ xhr.open("GET", url, true);
+ if (xhr.overrideMimeType) {
+ xhr.overrideMimeType("application/json");
+ }
+ xhr.setRequestHeader("If-Modified-Since", "Fri, 01 Jan 1960 00:00:00 GMT"); // no cache
+ xhr.send(null);
+ }
+
+ function loadBlock(index, filename) {
+ function callback(block, error) {
+ code[index] = block;
+ ++loaded;
+ if (error) {
+ errors.push(filename + " ==> " + error);
+ }
+ if (loaded === sourcesCount) {
+ if (errors.length === 0) {
+ // This used to throw, but it was constantly getting in the way of debugging where things go wrong!
+ var sketch = new Processing(canvas, code.join("\n"));
+ if (onComplete) {
+ onComplete(sketch);
+ }
+ } else {
+ throw "Processing.js: Unable to load pjs sketch files: " + errors.join("\n");
+ }
+ }
+ }
+ if (filename.charAt(0) === '#') {
+ // trying to get script from the element
+ var scriptElement = document.getElementById(filename.substring(1));
+ if (scriptElement) {
+ callback(scriptElement.text || scriptElement.textContent);
+ } else {
+ callback("", "Unable to load pjs sketch: element with id \'" + filename.substring(1) + "\' was not found");
+ }
+ return;
+ }
+
+ ajaxAsync(filename, callback);
+ }
+
+ for (var i = 0; i < sourcesCount; ++i) {
+ loadBlock(i, sources[i]);
+ }
+ };
+
+ /**
+ * Automatic initialization function.
+ */
+ var init = function() {
+ document.removeEventListener('DOMContentLoaded', init, false);
+ var i;
+
+ // before running through init, clear the instances list, to prevent
+ // sketch duplication when page content is dynamically swapped without
+ // swapping out processing.js
+ while (Processing.instances.length > 0) {
+ for (i = Processing.instances.length - 1; i >= 0; i--) {
+ if (Processing.instances[i]) {
+ Processing.instances[i].exit();
+ }
+ }
+ }
+
+ var canvas = document.getElementsByTagName('canvas'),
+ filenames;
+
+ for (i = 0, l = canvas.length; i < l; i++) {
+ // datasrc and data-src are deprecated.
+ var processingSources = canvas[i].getAttribute('data-processing-sources');
+ if (processingSources === null) {
+ // Temporary fallback for datasrc and data-src
+ processingSources = canvas[i].getAttribute('data-src');
+ if (processingSources === null) {
+ processingSources = canvas[i].getAttribute('datasrc');
+ }
+ }
+ if (processingSources) {
+ filenames = processingSources.split(/\s+/g);
+ for (var j = 0; j < filenames.length;) {
+ if (filenames[j]) {
+ j++;
+ } else {
+ filenames.splice(j, 1);
+ }
+ }
+ loadSketchFromSources(canvas[i], filenames);
+ }
+ }
+
+ // also process all <script>-indicated sketches, if there are any
+ var s, last, source, instance,
+ nodelist = document.getElementsByTagName('script'),
+ scripts=[];
+
+ // snapshot the DOM, as the nodelist is only a DOM view, and is
+ // updated instantly when a script element is added or removed.
+ for (s = nodelist.length - 1; s >= 0; s--) {
+ scripts.push(nodelist[s]);
+ }
+
+ // iterate over all script elements to see if they contain Processing code
+ for (s = 0, last = scripts.length; s < last; s++) {
+ var script = scripts[s];
+ if (!script.getAttribute) {
+ continue;
+ }
+
+ var type = script.getAttribute("type");
+ if (type && (type.toLowerCase() === "text/processing" || type.toLowerCase() === "application/processing")) {
+ var target = script.getAttribute("data-processing-target");
+ canvas = undef;
+ if (target) {
+ canvas = document.getElementById(target);
+ } else {
+ var nextSibling = script.nextSibling;
+ while (nextSibling && nextSibling.nodeType !== 1) {
+ nextSibling = nextSibling.nextSibling;
+ }
+ if (nextSibling && nextSibling.nodeName.toLowerCase() === "canvas") {
+ canvas = nextSibling;
+ }
+ }
+
+ if (canvas) {
+ if (script.getAttribute("src")) {
+ filenames = script.getAttribute("src").split(/\s+/);
+ loadSketchFromSources(canvas, filenames);
+ continue;
+ }
+ source = script.textContent || script.text;
+ instance = new Processing(canvas, source);
+ }
+ }
+ }
+ };
+
+ /**
+ * automatic loading of all sketches on the page
+ */
+ document.addEventListener('DOMContentLoaded', init, false);
+
+ /**
+ * Make Processing run through init after already having
+ * been set up for a page. This function exists mostly for pages
+ * that swap content in/out without reloading a page.
+ */
+ Processing.reload = init;
+
+ /**
+ * Disable the automatic loading of all sketches on the page.
+ * This will work as long as it's issued before DOMContentLoaded.
+ */
+ Processing.disableInit = function() {
+ document.removeEventListener('DOMContentLoaded', init, false);
+ };
+
+ // done.
+ return Processing;
+};
+
+},{}],8:[function(require,module,exports){
+/**
+ * Returns Java equals() result for two objects. If the first object
+ * has the "equals" function, it preforms the call of this function.
+ * Otherwise the method uses the JavaScript === operator.
+ *
+ * @param {Object} obj The first object.
+ * @param {Object} other The second object.
+ *
+ * @returns {boolean} true if the objects are equal.
+ */
+module.exports = function virtEquals(obj, other) {
+ if (obj === null || other === null) {
+ return (obj === null) && (other === null);
+ }
+ if (typeof (obj) === "string") {
+ return obj === other;
+ }
+ if (typeof(obj) !== "object") {
+ return obj === other;
+ }
+ if (obj.equals instanceof Function) {
+ return obj.equals(other);
+ }
+ return obj === other;
+};
+
+},{}],9:[function(require,module,exports){
+/**
+ * Returns Java hashCode() result for the object. If the object has the "hashCode" function,
+ * it preforms the call of this function. Otherwise it uses/creates the "$id" property,
+ * which is used as the hashCode.
+ *
+ * @param {Object} obj The object.
+ * @returns {int} The object's hash code.
+ */
+module.exports = function virtHashCode(obj, undef) {
+ if (typeof(obj) === "string") {
+ var hash = 0;
+ for (var i = 0; i < obj.length; ++i) {
+ hash = (hash * 31 + obj.charCodeAt(i)) & 0xFFFFFFFF;
+ }
+ return hash;
+ }
+ if (typeof(obj) !== "object") {
+ return obj & 0xFFFFFFFF;
+ }
+ if (obj.hashCode instanceof Function) {
+ return obj.hashCode();
+ }
+ if (obj.$id === undef) {
+ obj.$id = ((Math.floor(Math.random() * 0x10000) - 0x8000) << 16) | Math.floor(Math.random() * 0x10000);
+ }
+ return obj.$id;
+};
+
+},{}],10:[function(require,module,exports){
+/**
+ * An ArrayList stores a variable number of objects.
+ *
+ * @param {int} initialCapacity optional defines the initial capacity of the list, it's empty by default
+ *
+ * @returns {ArrayList} new ArrayList object
+ */
+module.exports = function(options) {
+ var virtHashCode = options.virtHashCode,
+ virtEquals = options.virtEquals;
+
+ function Iterator(array) {
+ var index = -1;
+ this.hasNext = function() {
+ return (index + 1) < array.length;
+ };
+
+ this.next = function() {
+ return array[++index];
+ };
+
+ this.remove = function() {
+ array.splice(index--, 1);
+ };
+ }
+
+ function ArrayList(a) {
+ var array = [];
+
+ if (a && a.toArray) {
+ array = a.toArray();
+ }
+
+ /**
+ * @member ArrayList
+ * ArrayList.get() Returns the element at the specified position in this list.
+ *
+ * @param {int} i index of element to return
+ *
+ * @returns {Object} the element at the specified position in this list.
+ */
+ this.get = function(i) {
+ return array[i];
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.contains() Returns true if this list contains the specified element.
+ *
+ * @param {Object} item element whose presence in this List is to be tested.
+ *
+ * @returns {boolean} true if the specified element is present; false otherwise.
+ */
+ this.contains = function(item) {
+ return this.indexOf(item)>-1;
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.indexOf() Returns the position this element takes in the list, or -1 if the element is not found.
+ *
+ * @param {Object} item element whose position in this List is to be tested.
+ *
+ * @returns {int} the list position that the first match for this element holds in the list, or -1 if it is not in the list.
+ */
+ this.indexOf = function(item) {
+ for (var i = 0, len = array.length; i < len; ++i) {
+ if (virtEquals(item, array[i])) {
+ return i;
+ }
+ }
+ return -1;
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.lastIndexOf() Returns the index of the last occurrence of the specified element in this list,
+ * or -1 if this list does not contain the element. More formally, returns the highest index i such that
+ * (o==null ? get(i)==null : o.equals(get(i))), or -1 if there is no such index.
+ *
+ * @param {Object} item element to search for.
+ *
+ * @returns {int} the index of the last occurrence of the specified element in this list, or -1 if this list does not contain the element.
+ */
+ this.lastIndexOf = function(item) {
+ for (var i = array.length-1; i >= 0; --i) {
+ if (virtEquals(item, array[i])) {
+ return i;
+ }
+ }
+ return -1;
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.add() Adds the specified element to this list.
+ *
+ * @param {int} index optional index at which the specified element is to be inserted
+ * @param {Object} object element to be added to the list
+ */
+ this.add = function() {
+ if (arguments.length === 1) {
+ array.push(arguments[0]); // for add(Object)
+ } else if (arguments.length === 2) {
+ var arg0 = arguments[0];
+ if (typeof arg0 === 'number') {
+ if (arg0 >= 0 && arg0 <= array.length) {
+ array.splice(arg0, 0, arguments[1]); // for add(i, Object)
+ } else {
+ throw(arg0 + " is not a valid index");
+ }
+ } else {
+ throw(typeof arg0 + " is not a number");
+ }
+ } else {
+ throw("Please use the proper number of parameters.");
+ }
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.addAll(collection) appends all of the elements in the specified
+ * Collection to the end of this list, in the order that they are returned by
+ * the specified Collection's Iterator.
+ *
+ * When called as addAll(index, collection) the elements are inserted into
+ * this list at the position indicated by index.
+ *
+ * @param {index} Optional; specifies the position the colletion should be inserted at
+ * @param {collection} Any iterable object (ArrayList, HashMap.keySet(), etc.)
+ * @throws out of bounds error for negative index, or index greater than list size.
+ */
+ this.addAll = function(arg1, arg2) {
+ // addAll(int, Collection)
+ var it;
+ if (typeof arg1 === "number") {
+ if (arg1 < 0 || arg1 > array.length) {
+ throw("Index out of bounds for addAll: " + arg1 + " greater or equal than " + array.length);
+ }
+ it = new ObjectIterator(arg2);
+ while (it.hasNext()) {
+ array.splice(arg1++, 0, it.next());
+ }
+ }
+ // addAll(Collection)
+ else {
+ it = new ObjectIterator(arg1);
+ while (it.hasNext()) {
+ array.push(it.next());
+ }
+ }
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.set() Replaces the element at the specified position in this list with the specified element.
+ *
+ * @param {int} index index of element to replace
+ * @param {Object} object element to be stored at the specified position
+ */
+ this.set = function() {
+ if (arguments.length === 2) {
+ var arg0 = arguments[0];
+ if (typeof arg0 === 'number') {
+ if (arg0 >= 0 && arg0 < array.length) {
+ array.splice(arg0, 1, arguments[1]);
+ } else {
+ throw(arg0 + " is not a valid index.");
+ }
+ } else {
+ throw(typeof arg0 + " is not a number");
+ }
+ } else {
+ throw("Please use the proper number of parameters.");
+ }
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.size() Returns the number of elements in this list.
+ *
+ * @returns {int} the number of elements in this list
+ */
+ this.size = function() {
+ return array.length;
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.clear() Removes all of the elements from this list. The list will be empty after this call returns.
+ */
+ this.clear = function() {
+ array.length = 0;
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.remove() Removes an element either based on index, if the argument is a number, or
+ * by equality check, if the argument is an object.
+ *
+ * @param {int|Object} item either the index of the element to be removed, or the element itself.
+ *
+ * @returns {Object|boolean} If removal is by index, the element that was removed, or null if nothing was removed. If removal is by object, true if removal occurred, otherwise false.
+ */
+ this.remove = function(item) {
+ if (typeof item === 'number') {
+ return array.splice(item, 1)[0];
+ }
+ item = this.indexOf(item);
+ if (item > -1) {
+ array.splice(item, 1);
+ return true;
+ }
+ return false;
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.removeAll Removes from this List all of the elements from
+ * the current ArrayList which are present in the passed in paramater ArrayList 'c'.
+ * Shifts any succeeding elements to the left (reduces their index).
+ *
+ * @param {ArrayList} the ArrayList to compare to the current ArrayList
+ *
+ * @returns {boolean} true if the ArrayList had an element removed; false otherwise
+ */
+ this.removeAll = function(c) {
+ var i, x, item,
+ newList = new ArrayList();
+ newList.addAll(this);
+ this.clear();
+ // For every item that exists in the original ArrayList and not in the c ArrayList
+ // copy it into the empty 'this' ArrayList to create the new 'this' Array.
+ for (i = 0, x = 0; i < newList.size(); i++) {
+ item = newList.get(i);
+ if (!c.contains(item)) {
+ this.add(x++, item);
+ }
+ }
+ if (this.size() < newList.size()) {
+ return true;
+ }
+ return false;
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.isEmpty() Tests if this list has no elements.
+ *
+ * @returns {boolean} true if this list has no elements; false otherwise
+ */
+ this.isEmpty = function() {
+ return !array.length;
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.clone() Returns a shallow copy of this ArrayList instance. (The elements themselves are not copied.)
+ *
+ * @returns {ArrayList} a clone of this ArrayList instance
+ */
+ this.clone = function() {
+ return new ArrayList(this);
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.toArray() Returns an array containing all of the elements in this list in the correct order.
+ *
+ * @returns {Object[]} Returns an array containing all of the elements in this list in the correct order
+ */
+ this.toArray = function() {
+ return array.slice(0);
+ };
+
+ this.iterator = function() {
+ return new Iterator(array);
+ };
+ }
+
+ return ArrayList;
+};
+
+},{}],11:[function(require,module,exports){
+module.exports = (function(charMap, undef) {
+
+ var Char = function(chr) {
+ if (typeof chr === 'string' && chr.length === 1) {
+ this.code = chr.charCodeAt(0);
+ } else if (typeof chr === 'number') {
+ this.code = chr;
+ } else if (chr instanceof Char) {
+ this.code = chr;
+ } else {
+ this.code = NaN;
+ }
+ return (charMap[this.code] === undef) ? charMap[this.code] = this : charMap[this.code];
+ };
+
+ Char.prototype.toString = function() {
+ return String.fromCharCode(this.code);
+ };
+
+ Char.prototype.valueOf = function() {
+ return this.code;
+ };
+
+ return Char;
+}({}));
+
+},{}],12:[function(require,module,exports){
+/**
+* A HashMap stores a collection of objects, each referenced by a key. This is similar to an Array, only
+* instead of accessing elements with a numeric index, a String is used. (If you are familiar with
+* associative arrays from other languages, this is the same idea.)
+*
+* @param {int} initialCapacity defines the initial capacity of the map, it's 16 by default
+* @param {float} loadFactor the load factor for the map, the default is 0.75
+* @param {Map} m gives the new HashMap the same mappings as this Map
+*/
+module.exports = function(options) {
+ var virtHashCode = options.virtHashCode,
+ virtEquals = options.virtEquals;
+
+ /**
+ * @member HashMap
+ * A HashMap stores a collection of objects, each referenced by a key. This is similar to an Array, only
+ * instead of accessing elements with a numeric index, a String is used. (If you are familiar with
+ * associative arrays from other languages, this is the same idea.)
+ *
+ * @param {int} initialCapacity defines the initial capacity of the map, it's 16 by default
+ * @param {float} loadFactor the load factor for the map, the default is 0.75
+ * @param {Map} m gives the new HashMap the same mappings as this Map
+ */
+ function HashMap() {
+ if (arguments.length === 1 && arguments[0] instanceof HashMap) {
+ return arguments[0].clone();
+ }
+
+ var initialCapacity = arguments.length > 0 ? arguments[0] : 16;
+ var loadFactor = arguments.length > 1 ? arguments[1] : 0.75;
+ var buckets = [];
+ buckets.length = initialCapacity;
+ var count = 0;
+ var hashMap = this;
+
+ function getBucketIndex(key) {
+ var index = virtHashCode(key) % buckets.length;
+ return index < 0 ? buckets.length + index : index;
+ }
+ function ensureLoad() {
+ if (count <= loadFactor * buckets.length) {
+ return;
+ }
+ var allEntries = [];
+ for (var i = 0; i < buckets.length; ++i) {
+ if (buckets[i] !== undefined) {
+ allEntries = allEntries.concat(buckets[i]);
+ }
+ }
+ var newBucketsLength = buckets.length * 2;
+ buckets = [];
+ buckets.length = newBucketsLength;
+ for (var j = 0; j < allEntries.length; ++j) {
+ var index = getBucketIndex(allEntries[j].key);
+ var bucket = buckets[index];
+ if (bucket === undefined) {
+ buckets[index] = bucket = [];
+ }
+ bucket.push(allEntries[j]);
+ }
+ }
+
+ function Iterator(conversion, removeItem) {
+ var bucketIndex = 0;
+ var itemIndex = -1;
+ var endOfBuckets = false;
+ var currentItem;
+
+ function findNext() {
+ while (!endOfBuckets) {
+ ++itemIndex;
+ if (bucketIndex >= buckets.length) {
+ endOfBuckets = true;
+ } else if (buckets[bucketIndex] === undefined || itemIndex >= buckets[bucketIndex].length) {
+ itemIndex = -1;
+ ++bucketIndex;
+ } else {
+ return;
+ }
+ }
+ }
+
+ /*
+ * @member Iterator
+ * Checks if the Iterator has more items
+ */
+ this.hasNext = function() {
+ return !endOfBuckets;
+ };
+
+ /*
+ * @member Iterator
+ * Return the next Item
+ */
+ this.next = function() {
+ currentItem = conversion(buckets[bucketIndex][itemIndex]);
+ findNext();
+ return currentItem;
+ };
+
+ /*
+ * @member Iterator
+ * Remove the current item
+ */
+ this.remove = function() {
+ if (currentItem !== undefined) {
+ removeItem(currentItem);
+ --itemIndex;
+ findNext();
+ }
+ };
+
+ findNext();
+ }
+
+ function Set(conversion, isIn, removeItem) {
+ this.clear = function() {
+ hashMap.clear();
+ };
+
+ this.contains = function(o) {
+ return isIn(o);
+ };
+
+ this.containsAll = function(o) {
+ var it = o.iterator();
+ while (it.hasNext()) {
+ if (!this.contains(it.next())) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ this.isEmpty = function() {
+ return hashMap.isEmpty();
+ };
+
+ this.iterator = function() {
+ return new Iterator(conversion, removeItem);
+ };
+
+ this.remove = function(o) {
+ if (this.contains(o)) {
+ removeItem(o);
+ return true;
+ }
+ return false;
+ };
+
+ this.removeAll = function(c) {
+ var it = c.iterator();
+ var changed = false;
+ while (it.hasNext()) {
+ var item = it.next();
+ if (this.contains(item)) {
+ removeItem(item);
+ changed = true;
+ }
+ }
+ return true;
+ };
+
+ this.retainAll = function(c) {
+ var it = this.iterator();
+ var toRemove = [];
+ while (it.hasNext()) {
+ var entry = it.next();
+ if (!c.contains(entry)) {
+ toRemove.push(entry);
+ }
+ }
+ for (var i = 0; i < toRemove.length; ++i) {
+ removeItem(toRemove[i]);
+ }
+ return toRemove.length > 0;
+ };
+
+ this.size = function() {
+ return hashMap.size();
+ };
+
+ this.toArray = function() {
+ var result = [];
+ var it = this.iterator();
+ while (it.hasNext()) {
+ result.push(it.next());
+ }
+ return result;
+ };
+ }
+
+ function Entry(pair) {
+ this._isIn = function(map) {
+ return map === hashMap && (pair.removed === undefined);
+ };
+
+ this.equals = function(o) {
+ return virtEquals(pair.key, o.getKey());
+ };
+
+ this.getKey = function() {
+ return pair.key;
+ };
+
+ this.getValue = function() {
+ return pair.value;
+ };
+
+ this.hashCode = function(o) {
+ return virtHashCode(pair.key);
+ };
+
+ this.setValue = function(value) {
+ var old = pair.value;
+ pair.value = value;
+ return old;
+ };
+ }
+
+ this.clear = function() {
+ count = 0;
+ buckets = [];
+ buckets.length = initialCapacity;
+ };
+
+ this.clone = function() {
+ var map = new HashMap();
+ map.putAll(this);
+ return map;
+ };
+
+ this.containsKey = function(key) {
+ var index = getBucketIndex(key);
+ var bucket = buckets[index];
+ if (bucket === undefined) {
+ return false;
+ }
+ for (var i = 0; i < bucket.length; ++i) {
+ if (virtEquals(bucket[i].key, key)) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ this.containsValue = function(value) {
+ for (var i = 0; i < buckets.length; ++i) {
+ var bucket = buckets[i];
+ if (bucket === undefined) {
+ continue;
+ }
+ for (var j = 0; j < bucket.length; ++j) {
+ if (virtEquals(bucket[j].value, value)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ this.entrySet = function() {
+ return new Set(
+
+ function(pair) {
+ return new Entry(pair);
+ },
+
+ function(pair) {
+ return (pair instanceof Entry) && pair._isIn(hashMap);
+ },
+
+ function(pair) {
+ return hashMap.remove(pair.getKey());
+ });
+ };
+
+ this.get = function(key) {
+ var index = getBucketIndex(key);
+ var bucket = buckets[index];
+ if (bucket === undefined) {
+ return null;
+ }
+ for (var i = 0; i < bucket.length; ++i) {
+ if (virtEquals(bucket[i].key, key)) {
+ return bucket[i].value;
+ }
+ }
+ return null;
+ };
+
+ this.isEmpty = function() {
+ return count === 0;
+ };
+
+ this.keySet = function() {
+ return new Set(
+ // get key from pair
+ function(pair) {
+ return pair.key;
+ },
+ // is-in test
+ function(key) {
+ return hashMap.containsKey(key);
+ },
+ // remove from hashmap by key
+ function(key) {
+ return hashMap.remove(key);
+ }
+ );
+ };
+
+ this.values = function() {
+ return new Set(
+ // get value from pair
+ function(pair) {
+ return pair.value;
+ },
+ // is-in test
+ function(value) {
+ return hashMap.containsValue(value);
+ },
+ // remove from hashmap by value
+ function(value) {
+ return hashMap.removeByValue(value);
+ }
+ );
+ };
+
+ this.put = function(key, value) {
+ var index = getBucketIndex(key);
+ var bucket = buckets[index];
+ if (bucket === undefined) {
+ ++count;
+ buckets[index] = [{
+ key: key,
+ value: value
+ }];
+ ensureLoad();
+ return null;
+ }
+ for (var i = 0; i < bucket.length; ++i) {
+ if (virtEquals(bucket[i].key, key)) {
+ var previous = bucket[i].value;
+ bucket[i].value = value;
+ return previous;
+ }
+ }
+ ++count;
+ bucket.push({
+ key: key,
+ value: value
+ });
+ ensureLoad();
+ return null;
+ };
+
+ this.putAll = function(m) {
+ var it = m.entrySet().iterator();
+ while (it.hasNext()) {
+ var entry = it.next();
+ this.put(entry.getKey(), entry.getValue());
+ }
+ };
+
+ this.remove = function(key) {
+ var index = getBucketIndex(key);
+ var bucket = buckets[index];
+ if (bucket === undefined) {
+ return null;
+ }
+ for (var i = 0; i < bucket.length; ++i) {
+ if (virtEquals(bucket[i].key, key)) {
+ --count;
+ var previous = bucket[i].value;
+ bucket[i].removed = true;
+ if (bucket.length > 1) {
+ bucket.splice(i, 1);
+ } else {
+ buckets[index] = undefined;
+ }
+ return previous;
+ }
+ }
+ return null;
+ };
+
+ this.removeByValue = function(value) {
+ var bucket, i, ilen, pair;
+ for (bucket in buckets) {
+ if (buckets.hasOwnProperty(bucket)) {
+ for (i = 0, ilen = buckets[bucket].length; i < ilen; i++) {
+ pair = buckets[bucket][i];
+ // removal on values is based on identity, not equality
+ if (pair.value === value) {
+ buckets[bucket].splice(i, 1);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ };
+
+ this.size = function() {
+ return count;
+ };
+ }
+
+ return HashMap;
+};
+
+},{}],13:[function(require,module,exports){
+// module export
+module.exports = function(options,undef) {
+ var window = options.Browser.window,
+ document = options.Browser.document,
+ noop = options.noop;
+
+ /**
+ * [internal function] computeFontMetrics() calculates various metrics for text
+ * placement. Currently this function computes the ascent, descent and leading
+ * (from "lead", used for vertical space) values for the currently active font.
+ */
+ function computeFontMetrics(pfont) {
+ var emQuad = 250,
+ correctionFactor = pfont.size / emQuad,
+ canvas = document.createElement("canvas");
+ canvas.width = 2*emQuad;
+ canvas.height = 2*emQuad;
+ canvas.style.opacity = 0;
+ var cfmFont = pfont.getCSSDefinition(emQuad+"px", "normal"),
+ ctx = canvas.getContext("2d");
+ ctx.font = cfmFont;
+
+ // Size the canvas using a string with common max-ascent and max-descent letters.
+ // Changing the canvas dimensions resets the context, so we must reset the font.
+ var protrusions = "dbflkhyjqpg";
+ canvas.width = ctx.measureText(protrusions).width;
+ ctx.font = cfmFont;
+
+ // for text lead values, we meaure a multiline text container.
+ var leadDiv = document.createElement("div");
+ leadDiv.style.position = "absolute";
+ leadDiv.style.opacity = 0;
+ leadDiv.style.fontFamily = '"' + pfont.name + '"';
+ leadDiv.style.fontSize = emQuad + "px";
+ leadDiv.innerHTML = protrusions + "<br/>" + protrusions;
+ document.body.appendChild(leadDiv);
+
+ var w = canvas.width,
+ h = canvas.height,
+ baseline = h/2;
+
+ // Set all canvas pixeldata values to 255, with all the content
+ // data being 0. This lets us scan for data[i] != 255.
+ ctx.fillStyle = "white";
+ ctx.fillRect(0, 0, w, h);
+ ctx.fillStyle = "black";
+ ctx.fillText(protrusions, 0, baseline);
+ var pixelData = ctx.getImageData(0, 0, w, h).data;
+
+ // canvas pixel data is w*4 by h*4, because R, G, B and A are separate,
+ // consecutive values in the array, rather than stored as 32 bit ints.
+ var i = 0,
+ w4 = w * 4,
+ len = pixelData.length;
+
+ // Finding the ascent uses a normal, forward scanline
+ while (++i < len && pixelData[i] === 255) {
+ noop();
+ }
+ var ascent = Math.round(i / w4);
+
+ // Finding the descent uses a reverse scanline
+ i = len - 1;
+ while (--i > 0 && pixelData[i] === 255) {
+ noop();
+ }
+ var descent = Math.round(i / w4);
+
+ // set font metrics
+ pfont.ascent = correctionFactor * (baseline - ascent);
+ pfont.descent = correctionFactor * (descent - baseline);
+
+ // Then we try to get the real value from the browser
+ if (document.defaultView.getComputedStyle) {
+ var leadDivHeight = document.defaultView.getComputedStyle(leadDiv,null).getPropertyValue("height");
+ leadDivHeight = correctionFactor * leadDivHeight.replace("px","");
+ if (leadDivHeight >= pfont.size * 2) {
+ pfont.leading = Math.round(leadDivHeight/2);
+ }
+ }
+ document.body.removeChild(leadDiv);
+
+ // if we're caching, cache the context used for this pfont
+ if (pfont.caching) {
+ return ctx;
+ }
+ }
+
+ /**
+ * Constructor for a system or from-file (non-SVG) font.
+ */
+ function PFont(name, size) {
+ // according to the P5 API, new PFont() is legal (albeit completely useless)
+ if (name === undef) {
+ name = "";
+ }
+ this.name = name;
+ if (size === undef) {
+ size = 0;
+ }
+ this.size = size;
+ this.glyph = false;
+ this.ascent = 0;
+ this.descent = 0;
+ // For leading, the "safe" value uses the standard TEX ratio
+ this.leading = 1.2 * size;
+
+ // Note that an italic, bold font must used "... Bold Italic"
+ // in P5. "... Italic Bold" is treated as normal/normal.
+ var illegalIndicator = name.indexOf(" Italic Bold");
+ if (illegalIndicator !== -1) {
+ name = name.substring(0, illegalIndicator);
+ }
+
+ // determine font style
+ this.style = "normal";
+ var italicsIndicator = name.indexOf(" Italic");
+ if (italicsIndicator !== -1) {
+ name = name.substring(0, italicsIndicator);
+ this.style = "italic";
+ }
+
+ // determine font weight
+ this.weight = "normal";
+ var boldIndicator = name.indexOf(" Bold");
+ if (boldIndicator !== -1) {
+ name = name.substring(0, boldIndicator);
+ this.weight = "bold";
+ }
+
+ // determine font-family name
+ this.family = "sans-serif";
+ if (name !== undef) {
+ switch(name) {
+ case "sans-serif":
+ case "serif":
+ case "monospace":
+ case "fantasy":
+ case "cursive":
+ this.family = name;
+ break;
+ default:
+ this.family = '"' + name + '", sans-serif';
+ break;
+ }
+ }
+ // Calculate the ascent/descent/leading value based on
+ // how the browser renders this font.
+ this.context2d = computeFontMetrics(this);
+ this.css = this.getCSSDefinition();
+ if (this.context2d) {
+ this.context2d.font = this.css;
+ }
+ }
+
+ /**
+ * regulates whether or not we're caching the canvas
+ * 2d context for quick text width computation.
+ */
+ PFont.prototype.caching = true;
+
+ /**
+ * This function generates the CSS "font" string for this PFont
+ */
+ PFont.prototype.getCSSDefinition = function(fontSize, lineHeight) {
+ if(fontSize===undef) {
+ fontSize = this.size + "px";
+ }
+ if(lineHeight===undef) {
+ lineHeight = this.leading + "px";
+ }
+ // CSS "font" definition: font-style font-variant font-weight font-size/line-height font-family
+ var components = [this.style, "normal", this.weight, fontSize + "/" + lineHeight, this.family];
+ return components.join(" ");
+ };
+
+ /**
+ * Rely on the cached context2d measureText function.
+ */
+ PFont.prototype.measureTextWidth = function(string) {
+ return this.context2d.measureText(string).width;
+ };
+
+ /**
+ * FALLBACK FUNCTION -- replaces Pfont.prototype.measureTextWidth
+ * when the font cache becomes too large. This contructs a new
+ * canvas 2d context object for calling measureText on.
+ */
+ PFont.prototype.measureTextWidthFallback = function(string) {
+ var canvas = document.createElement("canvas"),
+ ctx = canvas.getContext("2d");
+ ctx.font = this.css;
+ return ctx.measureText(string).width;
+ };
+
+ /**
+ * Global "loaded fonts" list, internal to PFont
+ */
+ PFont.PFontCache = { length: 0 };
+
+ /**
+ * This function acts as single access point for getting and caching
+ * fonts across all sketches handled by an instance of Processing.js
+ */
+ PFont.get = function(fontName, fontSize) {
+ // round fontSize to one decimal point
+ fontSize = ((fontSize*10)+0.5|0)/10;
+ var cache = PFont.PFontCache,
+ idx = fontName+"/"+fontSize;
+ if (!cache[idx]) {
+ cache[idx] = new PFont(fontName, fontSize);
+ cache.length++;
+
+ // FALLBACK FUNCTIONALITY 1:
+ // If the cache has become large, switch over from full caching
+ // to caching only the static metrics for each new font request.
+ if (cache.length === 50) {
+ PFont.prototype.measureTextWidth = PFont.prototype.measureTextWidthFallback;
+ PFont.prototype.caching = false;
+ // clear contexts stored for each cached font
+ var entry;
+ for (entry in cache) {
+ if (entry !== "length") {
+ cache[entry].context2d = null;
+ }
+ }
+ return new PFont(fontName, fontSize);
+ }
+
+ // FALLBACK FUNCTIONALITY 2:
+ // If the cache has become too large, switch off font caching entirely.
+ if (cache.length === 400) {
+ PFont.PFontCache = {};
+ PFont.get = PFont.getFallback;
+ return new PFont(fontName, fontSize);
+ }
+ }
+ return cache[idx];
+ };
+
+ /**
+ * FALLBACK FUNCTION -- replaces PFont.get when the font cache
+ * becomes too large. This function bypasses font caching entirely.
+ */
+ PFont.getFallback = function(fontName, fontSize) {
+ return new PFont(fontName, fontSize);
+ };
+
+ /**
+ * Lists all standard fonts. Due to browser limitations, this list is
+ * not the system font list, like in P5, but the CSS "genre" list.
+ */
+ PFont.list = function() {
+ return ["sans-serif", "serif", "monospace", "fantasy", "cursive"];
+ };
+
+ /**
+ * Loading external fonts through @font-face rules is handled by PFont,
+ * to ensure fonts loaded in this way are globally available.
+ */
+ PFont.preloading = {
+ // template element used to compare font sizes
+ template: {},
+ // indicates whether or not the reference tiny font has been loaded
+ initialized: false,
+ // load the reference tiny font via a css @font-face rule
+ initialize: function() {
+ var generateTinyFont = function() {
+ var encoded = "#E3KAI2wAgT1MvMg7Eo3VmNtYX7ABi3CxnbHlm" +
+ "7Abw3kaGVhZ7ACs3OGhoZWE7A53CRobXR47AY3" +
+ "AGbG9jYQ7G03Bm1heH7ABC3CBuYW1l7Ae3AgcG" +
+ "9zd7AI3AE#B3AQ2kgTY18PPPUACwAg3ALSRoo3" +
+ "#yld0xg32QAB77#E777773B#E3C#I#Q77773E#" +
+ "Q7777777772CMAIw7AB77732B#M#Q3wAB#g3B#" +
+ "E#E2BB//82BB////w#B7#gAEg3E77x2B32B#E#" +
+ "Q#MTcBAQ32gAe#M#QQJ#E32M#QQJ#I#g32Q77#";
+ var expand = function(input) {
+ return "AAAAAAAA".substr(~~input ? 7-input : 6);
+ };
+ return encoded.replace(/[#237]/g, expand);
+ };
+ var fontface = document.createElement("style");
+ fontface.setAttribute("type","text/css");
+ fontface.innerHTML = "@font-face {\n" +
+ ' font-family: "PjsEmptyFont";' + "\n" +
+ " src: url('data:application/x-font-ttf;base64,"+generateTinyFont()+"')\n" +
+ " format('truetype');\n" +
+ "}";
+ document.head.appendChild(fontface);
+
+ // set up the template element
+ var element = document.createElement("span");
+ element.style.cssText = 'position: absolute; top: -1000; left: 0; opacity: 0; font-family: "PjsEmptyFont", fantasy;';
+ element.innerHTML = "AAAAAAAA";
+ document.body.appendChild(element);
+ this.template = element;
+
+ this.initialized = true;
+ },
+ // Shorthand function to get the computed width for an element.
+ getElementWidth: function(element) {
+ return document.defaultView.getComputedStyle(element,"").getPropertyValue("width");
+ },
+ // time taken so far in attempting to load a font
+ timeAttempted: 0,
+ // returns false if no fonts are pending load, or true otherwise.
+ pending: function(intervallength) {
+ if (!this.initialized) {
+ this.initialize();
+ }
+ var element,
+ computedWidthFont,
+ computedWidthRef = this.getElementWidth(this.template);
+ for (var i = 0; i < this.fontList.length; i++) {
+ // compares size of text in pixels. if equal, custom font is not yet loaded
+ element = this.fontList[i];
+ computedWidthFont = this.getElementWidth(element);
+ if (this.timeAttempted < 4000 && computedWidthFont === computedWidthRef) {
+ this.timeAttempted += intervallength;
+ return true;
+ } else {
+ document.body.removeChild(element);
+ this.fontList.splice(i--, 1);
+ this.timeAttempted = 0;
+ }
+ }
+ // if there are no more fonts to load, pending is false
+ if (this.fontList.length === 0) {
+ return false;
+ }
+ // We should have already returned before getting here.
+ // But, if we do get here, length!=0 so fonts are pending.
+ return true;
+ },
+ // fontList contains elements to compare font sizes against a template
+ fontList: [],
+ // addedList contains the fontnames of all the fonts loaded via @font-face
+ addedList: {},
+ // adds a font to the font cache
+ // creates an element using the font, to start loading the font,
+ // and compare against a default font to see if the custom font is loaded
+ add: function(fontSrc) {
+ if (!this.initialized) {
+ this.initialize();
+ }
+ // fontSrc can be a string or a javascript object
+ // acceptable fonts are .ttf, .otf, and data uri
+ var fontName = (typeof fontSrc === 'object' ? fontSrc.fontFace : fontSrc),
+ fontUrl = (typeof fontSrc === 'object' ? fontSrc.url : fontSrc);
+
+ // check whether we already created the @font-face rule for this font
+ if (this.addedList[fontName]) {
+ return;
+ }
+
+ // if we didn't, create the @font-face rule
+ var style = document.createElement("style");
+ style.setAttribute("type","text/css");
+ style.innerHTML = "@font-face{\n font-family: '" + fontName + "';\n src: url('" + fontUrl + "');\n}\n";
+ document.head.appendChild(style);
+ this.addedList[fontName] = true;
+
+ // also create the element to load and compare the new font
+ var element = document.createElement("span");
+ element.style.cssText = "position: absolute; top: 0; left: 0; opacity: 0;";
+ element.style.fontFamily = '"' + fontName + '", "PjsEmptyFont", fantasy';
+ element.innerHTML = "AAAAAAAA";
+ document.body.appendChild(element);
+ this.fontList.push(element);
+ }
+ };
+
+ return PFont;
+};
+},{}],14:[function(require,module,exports){
+module.exports = function(options, undef) {
+
+ // FIXME: hack
+ var p = options.p;
+
+ /**
+ * PMatrix2D is a 3x2 affine matrix implementation. The constructor accepts another PMatrix2D or a list of six float elements.
+ * If no parameters are provided the matrix is set to the identity matrix.
+ *
+ * @param {PMatrix2D} matrix the initial matrix to set to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fifth element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ var PMatrix2D = function() {
+ if (arguments.length === 0) {
+ this.reset();
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ this.set(arguments[0].array());
+ } else if (arguments.length === 6) {
+ this.set(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
+ }
+ };
+
+ /**
+ * PMatrix2D methods
+ */
+ PMatrix2D.prototype = {
+ /**
+ * @member PMatrix2D
+ * The set() function sets the matrix elements. The function accepts either another PMatrix2D, an array of elements, or a list of six floats.
+ *
+ * @param {PMatrix2D} matrix the matrix to set this matrix to
+ * @param {float[]} elements an array of elements to set this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ set: function() {
+ if (arguments.length === 6) {
+ var a = arguments;
+ this.set([a[0], a[1], a[2],
+ a[3], a[4], a[5]]);
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ this.elements = arguments[0].array();
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ this.elements = arguments[0].slice();
+ }
+ },
+ /**
+ * @member PMatrix2D
+ * The get() function returns a copy of this PMatrix2D.
+ *
+ * @return {PMatrix2D} a copy of this PMatrix2D
+ */
+ get: function() {
+ var outgoing = new PMatrix2D();
+ outgoing.set(this.elements);
+ return outgoing;
+ },
+ /**
+ * @member PMatrix2D
+ * The reset() function sets this PMatrix2D to the identity matrix.
+ */
+ reset: function() {
+ this.set([1, 0, 0, 0, 1, 0]);
+ },
+ /**
+ * @member PMatrix2D
+ * The array() function returns a copy of the element values.
+ * @addon
+ *
+ * @return {float[]} returns a copy of the element values
+ */
+ array: function array() {
+ return this.elements.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The translate() function translates this matrix by moving the current coordinates to the location specified by tx and ty.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ */
+ translate: function(tx, ty) {
+ this.elements[2] = tx * this.elements[0] + ty * this.elements[1] + this.elements[2];
+ this.elements[5] = tx * this.elements[3] + ty * this.elements[4] + this.elements[5];
+ },
+ /**
+ * @member PMatrix2D
+ * The invTranslate() function translates this matrix by moving the current coordinates to the negative location specified by tx and ty.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ */
+ invTranslate: function(tx, ty) {
+ this.translate(-tx, -ty);
+ },
+ /**
+ * @member PMatrix2D
+ * The transpose() function is not used in processingjs.
+ */
+ transpose: function() {
+ // Does nothing in Processing.
+ },
+ /**
+ * @member PMatrix2D
+ * The mult() function multiplied this matrix.
+ * If two array elements are passed in the function will multiply a two element vector against this matrix.
+ * If target is null or not length four, a new float array will be returned.
+ * The values for vec and target can be the same (though that's less efficient).
+ * If two PVectors are passed in the function multiply the x and y coordinates of a PVector against this matrix.
+ *
+ * @param {PVector} source, target the PVectors used to multiply this matrix
+ * @param {float[]} source, target the arrays used to multiply this matrix
+ *
+ * @return {PVector|float[]} returns a PVector or an array representing the new matrix
+ */
+ mult: function(source, target) {
+ var x, y;
+ if (source instanceof PVector) {
+ x = source.x;
+ y = source.y;
+ if (!target) {
+ target = new PVector();
+ }
+ } else if (source instanceof Array) {
+ x = source[0];
+ y = source[1];
+ if (!target) {
+ target = [];
+ }
+ }
+ if (target instanceof Array) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2];
+ target[1] = this.elements[3] * x + this.elements[4] * y + this.elements[5];
+ } else if (target instanceof PVector) {
+ target.x = this.elements[0] * x + this.elements[1] * y + this.elements[2];
+ target.y = this.elements[3] * x + this.elements[4] * y + this.elements[5];
+ target.z = 0;
+ }
+ return target;
+ },
+ /**
+ * @member PMatrix2D
+ * The multX() function calculates the x component of a vector from a transformation.
+ *
+ * @param {float} x the x component of the vector being transformed
+ * @param {float} y the y component of the vector being transformed
+ *
+ * @return {float} returnes the result of the calculation
+ */
+ multX: function(x, y) {
+ return (x * this.elements[0] + y * this.elements[1] + this.elements[2]);
+ },
+ /**
+ * @member PMatrix2D
+ * The multY() function calculates the y component of a vector from a transformation.
+ *
+ * @param {float} x the x component of the vector being transformed
+ * @param {float} y the y component of the vector being transformed
+ *
+ * @return {float} returnes the result of the calculation
+ */
+ multY: function(x, y) {
+ return (x * this.elements[3] + y * this.elements[4] + this.elements[5]);
+ },
+ /**
+ * @member PMatrix2D
+ * The skewX() function skews the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewX: function(angle) {
+ this.apply(1, 0, 1, angle, 0, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The skewY() function skews the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewY: function(angle) {
+ this.apply(1, 0, 1, 0, angle, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The shearX() function shears the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ shearX: function(angle) {
+ this.apply(1, 0, 1, Math.tan(angle) , 0, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The shearY() function shears the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ shearY: function(angle) {
+ this.apply(1, 0, 1, 0, Math.tan(angle), 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The determinant() function calvculates the determinant of this matrix.
+ *
+ * @return {float} the determinant of the matrix
+ */
+ determinant: function() {
+ return (this.elements[0] * this.elements[4] - this.elements[1] * this.elements[3]);
+ },
+ /**
+ * @member PMatrix2D
+ * The invert() function inverts this matrix
+ *
+ * @return {boolean} true if successful
+ */
+ invert: function() {
+ var d = this.determinant();
+ if (Math.abs( d ) > PConstants.MIN_INT) {
+ var old00 = this.elements[0];
+ var old01 = this.elements[1];
+ var old02 = this.elements[2];
+ var old10 = this.elements[3];
+ var old11 = this.elements[4];
+ var old12 = this.elements[5];
+ this.elements[0] = old11 / d;
+ this.elements[3] = -old10 / d;
+ this.elements[1] = -old01 / d;
+ this.elements[4] = old00 / d;
+ this.elements[2] = (old01 * old12 - old11 * old02) / d;
+ this.elements[5] = (old10 * old02 - old00 * old12) / d;
+ return true;
+ }
+ return false;
+ },
+ /**
+ * @member PMatrix2D
+ * The scale() function increases or decreases the size of a shape by expanding and contracting vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a two parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ */
+ scale: function(sx, sy) {
+ if (sx && sy === undef) {
+ sy = sx;
+ }
+ if (sx && sy) {
+ this.elements[0] *= sx;
+ this.elements[1] *= sy;
+ this.elements[3] *= sx;
+ this.elements[4] *= sy;
+ }
+ },
+ /**
+ * @member PMatrix2D
+ * The invScale() function decreases or increases the size of a shape by contracting and expanding vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a two parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ */
+ invScale: function(sx, sy) {
+ if (sx && !sy) {
+ sy = sx;
+ }
+ this.scale(1 / sx, 1 / sy);
+ },
+ /**
+ * @member PMatrix2D
+ * The apply() function multiplies the current matrix by the one specified through the parameters. Note that either a PMatrix2D or a list of floats can be passed in.
+ *
+ * @param {PMatrix2D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ apply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 6) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, this.elements[2],
+ 0, 0, this.elements[5]];
+ var e = 0;
+ for (var row = 0; row < 2; row++) {
+ for (var col = 0; col < 3; col++, e++) {
+ result[e] += this.elements[row * 3 + 0] * source[col + 0] +
+ this.elements[row * 3 + 1] * source[col + 3];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The preApply() function applies another matrix to the left of this one. Note that either a PMatrix2D or elements of a matrix can be passed in.
+ *
+ * @param {PMatrix2D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ preApply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 6) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+ var result = [0, 0, source[2],
+ 0, 0, source[5]];
+ result[2] = source[2] + this.elements[2] * source[0] + this.elements[5] * source[1];
+ result[5] = source[5] + this.elements[2] * source[3] + this.elements[5] * source[4];
+ result[0] = this.elements[0] * source[0] + this.elements[3] * source[1];
+ result[3] = this.elements[0] * source[3] + this.elements[3] * source[4];
+ result[1] = this.elements[1] * source[0] + this.elements[4] * source[1];
+ result[4] = this.elements[1] * source[3] + this.elements[4] * source[4];
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The rotate() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotate: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ var temp1 = this.elements[0];
+ var temp2 = this.elements[1];
+ this.elements[0] = c * temp1 + s * temp2;
+ this.elements[1] = -s * temp1 + c * temp2;
+ temp1 = this.elements[3];
+ temp2 = this.elements[4];
+ this.elements[3] = c * temp1 + s * temp2;
+ this.elements[4] = -s * temp1 + c * temp2;
+ },
+ /**
+ * @member PMatrix2D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateZ: function(angle) {
+ this.rotate(angle);
+ },
+ /**
+ * @member PMatrix2D
+ * The invRotateZ() function rotates the matrix in opposite direction.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ invRotateZ: function(angle) {
+ this.rotateZ(angle - Math.PI);
+ },
+ /**
+ * @member PMatrix2D
+ * The print() function prints out the elements of this matrix
+ */
+ print: function() {
+ var digits = printMatrixHelper(this.elements);
+ var output = "" + p.nfs(this.elements[0], digits, 4) + " " +
+ p.nfs(this.elements[1], digits, 4) + " " +
+ p.nfs(this.elements[2], digits, 4) + "\n" +
+ p.nfs(this.elements[3], digits, 4) + " " +
+ p.nfs(this.elements[4], digits, 4) + " " +
+ p.nfs(this.elements[5], digits, 4) + "\n\n";
+ p.println(output);
+ }
+ };
+
+ return PMatrix2D;
+};
+
+},{}],15:[function(require,module,exports){
+module.exports = function(options, undef) {
+
+ // FIXME: hack
+ var p = options.p;
+
+ /**
+ * PMatrix3D is a 4x4 matrix implementation. The constructor accepts another PMatrix3D or a list of six or sixteen float elements.
+ * If no parameters are provided the matrix is set to the identity matrix.
+ */
+ var PMatrix3D = function() {
+ // When a matrix is created, it is set to an identity matrix
+ this.reset();
+ };
+
+ /**
+ * PMatrix3D methods
+ */
+ PMatrix3D.prototype = {
+ /**
+ * @member PMatrix2D
+ * The set() function sets the matrix elements. The function accepts either another PMatrix3D, an array of elements, or a list of six or sixteen floats.
+ *
+ * @param {PMatrix3D} matrix the initial matrix to set to
+ * @param {float[]} elements an array of elements to set this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ set: function() {
+ if (arguments.length === 16) {
+ this.elements = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ this.elements = arguments[0].array();
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ this.elements = arguments[0].slice();
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The get() function returns a copy of this PMatrix3D.
+ *
+ * @return {PMatrix3D} a copy of this PMatrix3D
+ */
+ get: function() {
+ var outgoing = new PMatrix3D();
+ outgoing.set(this.elements);
+ return outgoing;
+ },
+ /**
+ * @member PMatrix3D
+ * The reset() function sets this PMatrix3D to the identity matrix.
+ */
+ reset: function() {
+ this.elements = [1,0,0,0,
+ 0,1,0,0,
+ 0,0,1,0,
+ 0,0,0,1];
+ },
+ /**
+ * @member PMatrix3D
+ * The array() function returns a copy of the element values.
+ * @addon
+ *
+ * @return {float[]} returns a copy of the element values
+ */
+ array: function array() {
+ return this.elements.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The translate() function translates this matrix by moving the current coordinates to the location specified by tx, ty, and tz.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ * @param {float} tz the z-axis coordinate to move to
+ */
+ translate: function(tx, ty, tz) {
+ if (tz === undef) {
+ tz = 0;
+ }
+
+ this.elements[3] += tx * this.elements[0] + ty * this.elements[1] + tz * this.elements[2];
+ this.elements[7] += tx * this.elements[4] + ty * this.elements[5] + tz * this.elements[6];
+ this.elements[11] += tx * this.elements[8] + ty * this.elements[9] + tz * this.elements[10];
+ this.elements[15] += tx * this.elements[12] + ty * this.elements[13] + tz * this.elements[14];
+ },
+ /**
+ * @member PMatrix3D
+ * The transpose() function transpose this matrix.
+ */
+ transpose: function() {
+ var temp = this.elements[4];
+ this.elements[4] = this.elements[1];
+ this.elements[1] = temp;
+
+ temp = this.elements[8];
+ this.elements[8] = this.elements[2];
+ this.elements[2] = temp;
+
+ temp = this.elements[6];
+ this.elements[6] = this.elements[9];
+ this.elements[9] = temp;
+
+ temp = this.elements[3];
+ this.elements[3] = this.elements[12];
+ this.elements[12] = temp;
+
+ temp = this.elements[7];
+ this.elements[7] = this.elements[13];
+ this.elements[13] = temp;
+
+ temp = this.elements[11];
+ this.elements[11] = this.elements[14];
+ this.elements[14] = temp;
+ },
+ /**
+ * @member PMatrix3D
+ * The mult() function multiplied this matrix.
+ * If two array elements are passed in the function will multiply a two element vector against this matrix.
+ * If target is null or not length four, a new float array will be returned.
+ * The values for vec and target can be the same (though that's less efficient).
+ * If two PVectors are passed in the function multiply the x and y coordinates of a PVector against this matrix.
+ *
+ * @param {PVector} source, target the PVectors used to multiply this matrix
+ * @param {float[]} source, target the arrays used to multiply this matrix
+ *
+ * @return {PVector|float[]} returns a PVector or an array representing the new matrix
+ */
+ mult: function(source, target) {
+ var x, y, z, w;
+ if (source instanceof PVector) {
+ x = source.x;
+ y = source.y;
+ z = source.z;
+ w = 1;
+ if (!target) {
+ target = new PVector();
+ }
+ } else if (source instanceof Array) {
+ x = source[0];
+ y = source[1];
+ z = source[2];
+ w = source[3] || 1;
+
+ if ( !target || (target.length !== 3 && target.length !== 4) ) {
+ target = [0, 0, 0];
+ }
+ }
+
+ if (target instanceof Array) {
+ if (target.length === 3) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ target[1] = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ target[2] = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ } else if (target.length === 4) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3] * w;
+ target[1] = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7] * w;
+ target[2] = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11] * w;
+ target[3] = this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15] * w;
+ }
+ }
+ if (target instanceof PVector) {
+ target.x = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ target.y = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ target.z = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ }
+ return target;
+ },
+ /**
+ * @member PMatrix3D
+ * The preApply() function applies another matrix to the left of this one. Note that either a PMatrix3D or elements of a matrix can be passed in.
+ *
+ * @param {PMatrix3D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ preApply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 16) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0];
+ var e = 0;
+ for (var row = 0; row < 4; row++) {
+ for (var col = 0; col < 4; col++, e++) {
+ result[e] += this.elements[col + 0] * source[row * 4 + 0] + this.elements[col + 4] *
+ source[row * 4 + 1] + this.elements[col + 8] * source[row * 4 + 2] +
+ this.elements[col + 12] * source[row * 4 + 3];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The apply() function multiplies the current matrix by the one specified through the parameters. Note that either a PMatrix3D or a list of floats can be passed in.
+ *
+ * @param {PMatrix3D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ apply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 16) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0];
+ var e = 0;
+ for (var row = 0; row < 4; row++) {
+ for (var col = 0; col < 4; col++, e++) {
+ result[e] += this.elements[row * 4 + 0] * source[col + 0] + this.elements[row * 4 + 1] *
+ source[col + 4] + this.elements[row * 4 + 2] * source[col + 8] +
+ this.elements[row * 4 + 3] * source[col + 12];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The rotate() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotate: function(angle, v0, v1, v2) {
+ if (!v1) {
+ this.rotateZ(angle);
+ } else {
+ // TODO should make sure this vector is normalized
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ var t = 1.0 - c;
+
+ this.apply((t * v0 * v0) + c,
+ (t * v0 * v1) - (s * v2),
+ (t * v0 * v2) + (s * v1),
+ 0,
+ (t * v0 * v1) + (s * v2),
+ (t * v1 * v1) + c,
+ (t * v1 * v2) - (s * v0),
+ 0,
+ (t * v0 * v2) - (s * v1),
+ (t * v1 * v2) + (s * v0),
+ (t * v2 * v2) + c,
+ 0,
+ 0, 0, 0, 1);
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The invApply() function applies the inverted matrix to this matrix.
+ *
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ *
+ * @return {boolean} returns true if the operation was successful.
+ */
+ invApply: function() {
+ if (inverseCopy === undef) {
+ inverseCopy = new PMatrix3D();
+ }
+ var a = arguments;
+ inverseCopy.set(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8],
+ a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
+
+ if (!inverseCopy.invert()) {
+ return false;
+ }
+ this.preApply(inverseCopy);
+ return true;
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateX: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ this.apply([1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateY() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateY: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ this.apply([c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateZ: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ this.apply([c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The scale() function increases or decreases the size of a matrix by expanding and contracting vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a three parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ * @param {float} sz the amount to scale on the z-axis
+ */
+ scale: function(sx, sy, sz) {
+ if (sx && sy === undef && sz === undef) {
+ sy = sz = sx;
+ } else if (sx && sy && sz === undef) {
+ sz = 1;
+ }
+
+ if (sx && sy && sz) {
+ this.elements[0] *= sx;
+ this.elements[1] *= sy;
+ this.elements[2] *= sz;
+ this.elements[4] *= sx;
+ this.elements[5] *= sy;
+ this.elements[6] *= sz;
+ this.elements[8] *= sx;
+ this.elements[9] *= sy;
+ this.elements[10] *= sz;
+ this.elements[12] *= sx;
+ this.elements[13] *= sy;
+ this.elements[14] *= sz;
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The skewX() function skews the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewX: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, t, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The skewY() function skews the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewY: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, 0, 0, 0, t, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The shearX() function shears the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of shear specified in radians
+ */
+ shearX: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, t, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The shearY() function shears the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of shear specified in radians
+ */
+ shearY: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, 0, 0, 0, t, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ multX: function(x, y, z, w) {
+ if (!z) {
+ return this.elements[0] * x + this.elements[1] * y + this.elements[3];
+ }
+ if (!w) {
+ return this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ }
+ return this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3] * w;
+ },
+ multY: function(x, y, z, w) {
+ if (!z) {
+ return this.elements[4] * x + this.elements[5] * y + this.elements[7];
+ }
+ if (!w) {
+ return this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ }
+ return this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7] * w;
+ },
+ multZ: function(x, y, z, w) {
+ if (!w) {
+ return this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ }
+ return this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11] * w;
+ },
+ multW: function(x, y, z, w) {
+ if (!w) {
+ return this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15];
+ }
+ return this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15] * w;
+ },
+ /**
+ * @member PMatrix3D
+ * The invert() function inverts this matrix
+ *
+ * @return {boolean} true if successful
+ */
+ invert: function() {
+ var fA0 = this.elements[0] * this.elements[5] - this.elements[1] * this.elements[4];
+ var fA1 = this.elements[0] * this.elements[6] - this.elements[2] * this.elements[4];
+ var fA2 = this.elements[0] * this.elements[7] - this.elements[3] * this.elements[4];
+ var fA3 = this.elements[1] * this.elements[6] - this.elements[2] * this.elements[5];
+ var fA4 = this.elements[1] * this.elements[7] - this.elements[3] * this.elements[5];
+ var fA5 = this.elements[2] * this.elements[7] - this.elements[3] * this.elements[6];
+ var fB0 = this.elements[8] * this.elements[13] - this.elements[9] * this.elements[12];
+ var fB1 = this.elements[8] * this.elements[14] - this.elements[10] * this.elements[12];
+ var fB2 = this.elements[8] * this.elements[15] - this.elements[11] * this.elements[12];
+ var fB3 = this.elements[9] * this.elements[14] - this.elements[10] * this.elements[13];
+ var fB4 = this.elements[9] * this.elements[15] - this.elements[11] * this.elements[13];
+ var fB5 = this.elements[10] * this.elements[15] - this.elements[11] * this.elements[14];
+
+ // Determinant
+ var fDet = fA0 * fB5 - fA1 * fB4 + fA2 * fB3 + fA3 * fB2 - fA4 * fB1 + fA5 * fB0;
+
+ // Account for a very small value
+ // return false if not successful.
+ if (Math.abs(fDet) <= 1e-9) {
+ return false;
+ }
+
+ var kInv = [];
+ kInv[0] = +this.elements[5] * fB5 - this.elements[6] * fB4 + this.elements[7] * fB3;
+ kInv[4] = -this.elements[4] * fB5 + this.elements[6] * fB2 - this.elements[7] * fB1;
+ kInv[8] = +this.elements[4] * fB4 - this.elements[5] * fB2 + this.elements[7] * fB0;
+ kInv[12] = -this.elements[4] * fB3 + this.elements[5] * fB1 - this.elements[6] * fB0;
+ kInv[1] = -this.elements[1] * fB5 + this.elements[2] * fB4 - this.elements[3] * fB3;
+ kInv[5] = +this.elements[0] * fB5 - this.elements[2] * fB2 + this.elements[3] * fB1;
+ kInv[9] = -this.elements[0] * fB4 + this.elements[1] * fB2 - this.elements[3] * fB0;
+ kInv[13] = +this.elements[0] * fB3 - this.elements[1] * fB1 + this.elements[2] * fB0;
+ kInv[2] = +this.elements[13] * fA5 - this.elements[14] * fA4 + this.elements[15] * fA3;
+ kInv[6] = -this.elements[12] * fA5 + this.elements[14] * fA2 - this.elements[15] * fA1;
+ kInv[10] = +this.elements[12] * fA4 - this.elements[13] * fA2 + this.elements[15] * fA0;
+ kInv[14] = -this.elements[12] * fA3 + this.elements[13] * fA1 - this.elements[14] * fA0;
+ kInv[3] = -this.elements[9] * fA5 + this.elements[10] * fA4 - this.elements[11] * fA3;
+ kInv[7] = +this.elements[8] * fA5 - this.elements[10] * fA2 + this.elements[11] * fA1;
+ kInv[11] = -this.elements[8] * fA4 + this.elements[9] * fA2 - this.elements[11] * fA0;
+ kInv[15] = +this.elements[8] * fA3 - this.elements[9] * fA1 + this.elements[10] * fA0;
+
+ // Inverse using Determinant
+ var fInvDet = 1.0 / fDet;
+ kInv[0] *= fInvDet;
+ kInv[1] *= fInvDet;
+ kInv[2] *= fInvDet;
+ kInv[3] *= fInvDet;
+ kInv[4] *= fInvDet;
+ kInv[5] *= fInvDet;
+ kInv[6] *= fInvDet;
+ kInv[7] *= fInvDet;
+ kInv[8] *= fInvDet;
+ kInv[9] *= fInvDet;
+ kInv[10] *= fInvDet;
+ kInv[11] *= fInvDet;
+ kInv[12] *= fInvDet;
+ kInv[13] *= fInvDet;
+ kInv[14] *= fInvDet;
+ kInv[15] *= fInvDet;
+
+ this.elements = kInv.slice();
+ return true;
+ },
+ toString: function() {
+ var str = "";
+ for (var i = 0; i < 15; i++) {
+ str += this.elements[i] + ", ";
+ }
+ str += this.elements[15];
+ return str;
+ },
+ /**
+ * @member PMatrix3D
+ * The print() function prints out the elements of this matrix
+ */
+ print: function() {
+ var digits = printMatrixHelper(this.elements);
+
+ var output = "" + p.nfs(this.elements[0], digits, 4) + " " + p.nfs(this.elements[1], digits, 4) +
+ " " + p.nfs(this.elements[2], digits, 4) + " " + p.nfs(this.elements[3], digits, 4) +
+ "\n" + p.nfs(this.elements[4], digits, 4) + " " + p.nfs(this.elements[5], digits, 4) +
+ " " + p.nfs(this.elements[6], digits, 4) + " " + p.nfs(this.elements[7], digits, 4) +
+ "\n" + p.nfs(this.elements[8], digits, 4) + " " + p.nfs(this.elements[9], digits, 4) +
+ " " + p.nfs(this.elements[10], digits, 4) + " " + p.nfs(this.elements[11], digits, 4) +
+ "\n" + p.nfs(this.elements[12], digits, 4) + " " + p.nfs(this.elements[13], digits, 4) +
+ " " + p.nfs(this.elements[14], digits, 4) + " " + p.nfs(this.elements[15], digits, 4) + "\n\n";
+ p.println(output);
+ },
+ invTranslate: function(tx, ty, tz) {
+ this.preApply(1, 0, 0, -tx, 0, 1, 0, -ty, 0, 0, 1, -tz, 0, 0, 0, 1);
+ },
+ invRotateX: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1]);
+ },
+ invRotateY: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1]);
+ },
+ invRotateZ: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
+ },
+ invScale: function(x, y, z) {
+ this.preApply([1 / x, 0, 0, 0, 0, 1 / y, 0, 0, 0, 0, 1 / z, 0, 0, 0, 0, 1]);
+ }
+ };
+
+ return PMatrix3D;
+};
+},{}],16:[function(require,module,exports){
+module.exports = function(options) {
+ var PConstants = options.PConstants,
+ PMatrix2D = options.PMatrix2D,
+ PMatrix3D = options.PMatrix3D;
+
+ /**
+ * Datatype for storing shapes. Processing can currently load and display SVG (Scalable Vector Graphics) shapes.
+ * Before a shape is used, it must be loaded with the <b>loadShape()</b> function. The <b>shape()</b> function is used to draw the shape to the display window.
+ * The <b>PShape</b> object contain a group of methods, linked below, that can operate on the shape data.
+ * <br><br>The <b>loadShape()</b> method supports SVG files created with Inkscape and Adobe Illustrator.
+ * It is not a full SVG implementation, but offers some straightforward support for handling vector data.
+ *
+ * @param {int} family the shape type, one of GROUP, PRIMITIVE, PATH, or GEOMETRY
+ *
+ * @see #shape()
+ * @see #loadShape()
+ * @see #shapeMode()
+ */
+ var PShape = function(family) {
+ this.family = family || PConstants.GROUP;
+ this.visible = true;
+ this.style = true;
+ this.children = [];
+ this.nameTable = [];
+ this.params = [];
+ this.name = "";
+ this.image = null; //type PImage
+ this.matrix = null;
+ this.kind = null;
+ this.close = null;
+ this.width = null;
+ this.height = null;
+ this.parent = null;
+ };
+ /**
+ * PShape methods
+ * missing: findChild(), apply(), contains(), findChild(), getPrimitive(), getParams(), getVertex() , getVertexCount(),
+ * getVertexCode() , getVertexCodes() , getVertexCodeCount(), getVertexX(), getVertexY(), getVertexZ()
+ */
+ PShape.prototype = {
+ /**
+ * @member PShape
+ * The isVisible() function returns a boolean value "true" if the image is set to be visible, "false" if not. This is modified with the <b>setVisible()</b> parameter.
+ * <br><br>The visibility of a shape is usually controlled by whatever program created the SVG file.
+ * For instance, this parameter is controlled by showing or hiding the shape in the layers palette in Adobe Illustrator.
+ *
+ * @return {boolean} returns "true" if the image is set to be visible, "false" if not
+ */
+ isVisible: function(){
+ return this.visible;
+ },
+ /**
+ * @member PShape
+ * The setVisible() function sets the shape to be visible or invisible. This is determined by the value of the <b>visible</b> parameter.
+ * <br><br>The visibility of a shape is usually controlled by whatever program created the SVG file.
+ * For instance, this parameter is controlled by showing or hiding the shape in the layers palette in Adobe Illustrator.
+ *
+ * @param {boolean} visible "false" makes the shape invisible and "true" makes it visible
+ */
+ setVisible: function (visible){
+ this.visible = visible;
+ },
+ /**
+ * @member PShape
+ * The disableStyle() function disables the shape's style data and uses Processing's current styles. Styles include attributes such as colors, stroke weight, and stroke joints.
+ * Overrides this shape's style information and uses PGraphics styles and colors. Identical to ignoreStyles(true). Also disables styles for all child shapes.
+ */
+ disableStyle: function(){
+ this.style = false;
+ for(var i = 0, j=this.children.length; i<j; i++) {
+ this.children[i].disableStyle();
+ }
+ },
+ /**
+ * @member PShape
+ * The enableStyle() function enables the shape's style data and ignores Processing's current styles. Styles include attributes such as colors, stroke weight, and stroke joints.
+ */
+ enableStyle: function(){
+ this.style = true;
+ for(var i = 0, j=this.children.length; i<j; i++) {
+ this.children[i].enableStyle();
+ }
+ },
+ /**
+ * @member PShape
+ * The getFamily function returns the shape type
+ *
+ * @return {int} the shape type, one of GROUP, PRIMITIVE, PATH, or GEOMETRY
+ */
+ getFamily: function(){
+ return this.family;
+ },
+ /**
+ * @member PShape
+ * The getWidth() function gets the width of the drawing area (not necessarily the shape boundary).
+ */
+ getWidth: function(){
+ return this.width;
+ },
+ /**
+ * @member PShape
+ * The getHeight() function gets the height of the drawing area (not necessarily the shape boundary).
+ */
+ getHeight: function(){
+ return this.height;
+ },
+ /**
+ * @member PShape
+ * The setName() function sets the name of the shape
+ *
+ * @param {String} name the name of the shape
+ */
+ setName: function(name){
+ this.name = name;
+ },
+ /**
+ * @member PShape
+ * The getName() function returns the name of the shape
+ *
+ * @return {String} the name of the shape
+ */
+ getName: function(){
+ return this.name;
+ },
+ /**
+ * @member PShape
+ * Called by the following (the shape() command adds the g)
+ * PShape s = loadShapes("blah.svg");
+ * shape(s);
+ */
+ draw: function(renderContext) {
+ if(!renderContext) {
+ throw "render context missing for draw() in PShape";
+ }
+ if (this.visible) {
+ this.pre(renderContext);
+ this.drawImpl(renderContext);
+ this.post(renderContext);
+ }
+ },
+ /**
+ * @member PShape
+ * the drawImpl() function draws the SVG document.
+ */
+ drawImpl: function(renderContext) {
+ if (this.family === PConstants.GROUP) {
+ this.drawGroup(renderContext);
+ } else if (this.family === PConstants.PRIMITIVE) {
+ this.drawPrimitive(renderContext);
+ } else if (this.family === PConstants.GEOMETRY) {
+ this.drawGeometry(renderContext);
+ } else if (this.family === PConstants.PATH) {
+ this.drawPath(renderContext);
+ }
+ },
+ /**
+ * @member PShape
+ * The drawPath() function draws the <path> part of the SVG document.
+ */
+ drawPath: function(renderContext) {
+ var i, j;
+ if (this.vertices.length === 0) { return; }
+ renderContext.beginShape();
+ if (this.vertexCodes.length === 0) { // each point is a simple vertex
+ if (this.vertices[0].length === 2) { // drawing 2D vertices
+ for (i = 0, j = this.vertices.length; i < j; i++) {
+ renderContext.vertex(this.vertices[i][0], this.vertices[i][1]);
+ }
+ } else { // drawing 3D vertices
+ for (i = 0, j = this.vertices.length; i < j; i++) {
+ renderContext.vertex(this.vertices[i][0],
+ this.vertices[i][1],
+ this.vertices[i][2]);
+ }
+ }
+ } else { // coded set of vertices
+ var index = 0;
+ if (this.vertices[0].length === 2) { // drawing a 2D path
+ for (i = 0, j = this.vertexCodes.length; i < j; i++) {
+ if (this.vertexCodes[i] === PConstants.VERTEX) {
+ renderContext.vertex(this.vertices[index][0], this.vertices[index][1], this.vertices[index].moveTo);
+ renderContext.breakShape = false;
+ index++;
+ } else if (this.vertexCodes[i] === PConstants.BEZIER_VERTEX) {
+ renderContext.bezierVertex(this.vertices[index+0][0],
+ this.vertices[index+0][1],
+ this.vertices[index+1][0],
+ this.vertices[index+1][1],
+ this.vertices[index+2][0],
+ this.vertices[index+2][1]);
+ index += 3;
+ } else if (this.vertexCodes[i] === PConstants.CURVE_VERTEX) {
+ renderContext.curveVertex(this.vertices[index][0],
+ this.vertices[index][1]);
+ index++;
+ } else if (this.vertexCodes[i] === PConstants.BREAK) {
+ renderContext.breakShape = true;
+ }
+ }
+ } else { // drawing a 3D path
+ for (i = 0, j = this.vertexCodes.length; i < j; i++) {
+ if (this.vertexCodes[i] === PConstants.VERTEX) {
+ renderContext.vertex(this.vertices[index][0],
+ this.vertices[index][1],
+ this.vertices[index][2]);
+ if (this.vertices[index].moveTo === true) {
+ vertArray[vertArray.length-1].moveTo = true;
+ } else if (this.vertices[index].moveTo === false) {
+ vertArray[vertArray.length-1].moveTo = false;
+ }
+ renderContext.breakShape = false;
+ } else if (this.vertexCodes[i] === PConstants.BEZIER_VERTEX) {
+ renderContext.bezierVertex(this.vertices[index+0][0],
+ this.vertices[index+0][1],
+ this.vertices[index+0][2],
+ this.vertices[index+1][0],
+ this.vertices[index+1][1],
+ this.vertices[index+1][2],
+ this.vertices[index+2][0],
+ this.vertices[index+2][1],
+ this.vertices[index+2][2]);
+ index += 3;
+ } else if (this.vertexCodes[i] === PConstants.CURVE_VERTEX) {
+ renderContext.curveVertex(this.vertices[index][0],
+ this.vertices[index][1],
+ this.vertices[index][2]);
+ index++;
+ } else if (this.vertexCodes[i] === PConstants.BREAK) {
+ renderContext.breakShape = true;
+ }
+ }
+ }
+ }
+ renderContext.endShape(this.close ? PConstants.CLOSE : PConstants.OPEN);
+ },
+ /**
+ * @member PShape
+ * The drawGeometry() function draws the geometry part of the SVG document.
+ */
+ drawGeometry: function(renderContext) {
+ var i, j;
+ renderContext.beginShape(this.kind);
+ if (this.style) {
+ for (i = 0, j = this.vertices.length; i < j; i++) {
+ renderContext.vertex(this.vertices[i]);
+ }
+ } else {
+ for (i = 0, j = this.vertices.length; i < j; i++) {
+ var vert = this.vertices[i];
+ if (vert[2] === 0) {
+ renderContext.vertex(vert[0], vert[1]);
+ } else {
+ renderContext.vertex(vert[0], vert[1], vert[2]);
+ }
+ }
+ }
+ renderContext.endShape();
+ },
+ /**
+ * @member PShape
+ * The drawGroup() function draws the <g> part of the SVG document.
+ */
+ drawGroup: function(renderContext) {
+ for (var i = 0, j = this.children.length; i < j; i++) {
+ this.children[i].draw(renderContext);
+ }
+ },
+ /**
+ * @member PShape
+ * The drawPrimitive() function draws SVG document shape elements. These can be point, line, triangle, quad, rect, ellipse, arc, box, or sphere.
+ */
+ drawPrimitive: function(renderContext) {
+ if (this.kind === PConstants.POINT) {
+ renderContext.point(this.params[0], this.params[1]);
+ } else if (this.kind === PConstants.LINE) {
+ if (this.params.length === 4) { // 2D
+ renderContext.line(this.params[0], this.params[1],
+ this.params[2], this.params[3]);
+ } else { // 3D
+ renderContext.line(this.params[0], this.params[1], this.params[2],
+ this.params[3], this.params[4], this.params[5]);
+ }
+ } else if (this.kind === PConstants.TRIANGLE) {
+ renderContext.triangle(this.params[0], this.params[1],
+ this.params[2], this.params[3],
+ this.params[4], this.params[5]);
+ } else if (this.kind === PConstants.QUAD) {
+ renderContext.quad(this.params[0], this.params[1],
+ this.params[2], this.params[3],
+ this.params[4], this.params[5],
+ this.params[6], this.params[7]);
+ } else if (this.kind === PConstants.RECT) {
+ if (this.image !== null) {
+ var imMode = imageModeConvert;
+ renderContext.imageMode(PConstants.CORNER);
+ renderContext.image(this.image,
+ this.params[0],
+ this.params[1],
+ this.params[2],
+ this.params[3]);
+ imageModeConvert = imMode;
+ } else {
+ var rcMode = renderContext.curRectMode;
+ renderContext.rectMode(PConstants.CORNER);
+ renderContext.rect(this.params[0],
+ this.params[1],
+ this.params[2],
+ this.params[3]);
+ renderContext.curRectMode = rcMode;
+ }
+ } else if (this.kind === PConstants.ELLIPSE) {
+ var elMode = renderContext.curEllipseMode;
+ renderContext.ellipseMode(PConstants.CORNER);
+ renderContext.ellipse(this.params[0],
+ this.params[1],
+ this.params[2],
+ this.params[3]);
+ renderContext.curEllipseMode = elMode;
+ } else if (this.kind === PConstants.ARC) {
+ var eMode = curEllipseMode;
+ renderContext.ellipseMode(PConstants.CORNER);
+ renderContext.arc(this.params[0],
+ this.params[1],
+ this.params[2],
+ this.params[3],
+ this.params[4],
+ this.params[5]);
+ curEllipseMode = eMode;
+ } else if (this.kind === PConstants.BOX) {
+ if (this.params.length === 1) {
+ renderContext.box(this.params[0]);
+ } else {
+ renderContext.box(this.params[0], this.params[1], this.params[2]);
+ }
+ } else if (this.kind === PConstants.SPHERE) {
+ renderContext.sphere(this.params[0]);
+ }
+ },
+ /**
+ * @member PShape
+ * The pre() function performs the preparations before the SVG is drawn. This includes doing transformations and storing previous styles.
+ */
+ pre: function(renderContext) {
+ if (this.matrix) {
+ renderContext.pushMatrix();
+ renderContext.transform(this.matrix);
+ }
+ if (this.style) {
+ renderContext.pushStyle();
+ this.styles(renderContext);
+ }
+ },
+ /**
+ * @member PShape
+ * The post() function performs the necessary actions after the SVG is drawn. This includes removing transformations and removing added styles.
+ */
+ post: function(renderContext) {
+ if (this.matrix) {
+ renderContext.popMatrix();
+ }
+ if (this.style) {
+ renderContext.popStyle();
+ }
+ },
+ /**
+ * @member PShape
+ * The styles() function changes the Processing's current styles
+ */
+ styles: function(renderContext) {
+ if (this.stroke) {
+ renderContext.stroke(this.strokeColor);
+ renderContext.strokeWeight(this.strokeWeight);
+ renderContext.strokeCap(this.strokeCap);
+ renderContext.strokeJoin(this.strokeJoin);
+ } else {
+ renderContext.noStroke();
+ }
+
+ if (this.fill) {
+ renderContext.fill(this.fillColor);
+
+ } else {
+ renderContext.noFill();
+ }
+ },
+ /**
+ * @member PShape
+ * The getChild() function extracts a child shape from a parent shape. Specify the name of the shape with the <b>target</b> parameter or the
+ * layer position of the shape to get with the <b>index</b> parameter.
+ * The shape is returned as a <b>PShape</b> object, or <b>null</b> is returned if there is an error.
+ *
+ * @param {String} target the name of the shape to get
+ * @param {int} index the layer position of the shape to get
+ *
+ * @return {PShape} returns a child element of a shape as a PShape object or null if there is an error
+ */
+ getChild: function(child) {
+ var i, j;
+ if (typeof child === 'number') {
+ return this.children[child];
+ }
+ var found;
+ if(child === "" || this.name === child){
+ return this;
+ }
+ if(this.nameTable.length > 0) {
+ for(i = 0, j = this.nameTable.length; i < j || found; i++) {
+ if(this.nameTable[i].getName === child) {
+ found = this.nameTable[i];
+ break;
+ }
+ }
+ if (found) { return found; }
+ }
+ for(i = 0, j = this.children.length; i < j; i++) {
+ found = this.children[i].getChild(child);
+ if(found) { return found; }
+ }
+ return null;
+ },
+ /**
+ * @member PShape
+ * The getChildCount() returns the number of children
+ *
+ * @return {int} returns a count of children
+ */
+ getChildCount: function () {
+ return this.children.length;
+ },
+ /**
+ * @member PShape
+ * The addChild() adds a child to the PShape.
+ *
+ * @param {PShape} child the child to add
+ */
+ addChild: function( child ) {
+ this.children.push(child);
+ child.parent = this;
+ if (child.getName() !== null) {
+ this.addName(child.getName(), child);
+ }
+ },
+ /**
+ * @member PShape
+ * The addName() functions adds a shape to the name lookup table.
+ *
+ * @param {String} name the name to be added
+ * @param {PShape} shape the shape
+ */
+ addName: function(name, shape) {
+ if (this.parent !== null) {
+ this.parent.addName( name, shape );
+ } else {
+ this.nameTable.push( [name, shape] );
+ }
+ },
+ /**
+ * @member PShape
+ * The translate() function specifies an amount to displace the shape. The <b>x</b> parameter specifies left/right translation, the <b>y</b> parameter specifies up/down translation, and the <b>z</b> parameter specifies translations toward/away from the screen.
+ * Subsequent calls to the method accumulates the effect. For example, calling <b>translate(50, 0)</b> and then <b>translate(20, 0)</b> is the same as <b>translate(70, 0)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * <br><br>Using this method with the <b>z</b> parameter requires using the P3D or OPENGL parameter in combination with size.
+ *
+ * @param {int|float} x left/right translation
+ * @param {int|float} y up/down translation
+ * @param {int|float} z forward/back translation
+ *
+ * @see PMatrix2D#translate
+ * @see PMatrix3D#translate
+ */
+ translate: function() {
+ if(arguments.length === 2)
+ {
+ this.checkMatrix(2);
+ this.matrix.translate(arguments[0], arguments[1]);
+ } else {
+ this.checkMatrix(3);
+ this.matrix.translate(arguments[0], arguments[1], 0);
+ }
+ },
+ /**
+ * @member PShape
+ * The checkMatrix() function makes sure that the shape's matrix is 1) not null, and 2) has a matrix
+ * that can handle <em>at least</em> the specified number of dimensions.
+ *
+ * @param {int} dimensions the specified number of dimensions
+ */
+ checkMatrix: function(dimensions) {
+ if(this.matrix === null) {
+ if(dimensions === 2) {
+ this.matrix = new PMatrix2D();
+ } else {
+ this.matrix = new PMatrix3D();
+ }
+ }else if(dimensions === 3 && this.matrix instanceof PMatrix2D) {
+ this.matrix = new PMatrix3D();
+ }
+ },
+ /**
+ * @member PShape
+ * The rotateX() function rotates a shape around the x-axis the amount specified by the <b>angle</b> parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
+ * <br><br>Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction.
+ * Subsequent calls to the method accumulates the effect. For example, calling <b>rotateX(HALF_PI)</b> and then <b>rotateX(HALF_PI)</b> is the same as <b>rotateX(PI)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * <br><br>This method requires a 3D renderer. You need to pass P3D or OPENGL as a third parameter into the <b>size()</b> method as shown in the example above.
+ *
+ * @param {float}angle angle of rotation specified in radians
+ *
+ * @see PMatrix3D#rotateX
+ */
+ rotateX: function(angle) {
+ this.rotate(angle, 1, 0, 0);
+ },
+ /**
+ * @member PShape
+ * The rotateY() function rotates a shape around the y-axis the amount specified by the <b>angle</b> parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
+ * <br><br>Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction.
+ * Subsequent calls to the method accumulates the effect. For example, calling <b>rotateY(HALF_PI)</b> and then <b>rotateY(HALF_PI)</b> is the same as <b>rotateY(PI)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * <br><br>This method requires a 3D renderer. You need to pass P3D or OPENGL as a third parameter into the <b>size()</b> method as shown in the example above.
+ *
+ * @param {float}angle angle of rotation specified in radians
+ *
+ * @see PMatrix3D#rotateY
+ */
+ rotateY: function(angle) {
+ this.rotate(angle, 0, 1, 0);
+ },
+ /**
+ * @member PShape
+ * The rotateZ() function rotates a shape around the z-axis the amount specified by the <b>angle</b> parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
+ * <br><br>Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction.
+ * Subsequent calls to the method accumulates the effect. For example, calling <b>rotateZ(HALF_PI)</b> and then <b>rotateZ(HALF_PI)</b> is the same as <b>rotateZ(PI)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * <br><br>This method requires a 3D renderer. You need to pass P3D or OPENGL as a third parameter into the <b>size()</b> method as shown in the example above.
+ *
+ * @param {float}angle angle of rotation specified in radians
+ *
+ * @see PMatrix3D#rotateZ
+ */
+ rotateZ: function(angle) {
+ this.rotate(angle, 0, 0, 1);
+ },
+ /**
+ * @member PShape
+ * The rotate() function rotates a shape the amount specified by the <b>angle</b> parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
+ * <br><br>Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction.
+ * Transformations apply to everything that happens after and subsequent calls to the method accumulates the effect.
+ * For example, calling <b>rotate(HALF_PI)</b> and then <b>rotate(HALF_PI)</b> is the same as <b>rotate(PI)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * If optional parameters x,y,z are supplied, the rotate is about the point (x, y, z).
+ *
+ * @param {float}angle angle of rotation specified in radians
+ * @param {float}x x-coordinate of the point
+ * @param {float}y y-coordinate of the point
+ * @param {float}z z-coordinate of the point
+ * @see PMatrix2D#rotate
+ * @see PMatrix3D#rotate
+ */
+ rotate: function() {
+ if(arguments.length === 1){
+ this.checkMatrix(2);
+ this.matrix.rotate(arguments[0]);
+ } else {
+ this.checkMatrix(3);
+ this.matrix.rotate(arguments[0],
+ arguments[1],
+ arguments[2],
+ arguments[3]);
+ }
+ },
+ /**
+ * @member PShape
+ * The scale() function increases or decreases the size of a shape by expanding and contracting vertices. Shapes always scale from the relative origin of their bounding box.
+ * Scale values are specified as decimal percentages. For example, the method call <b>scale(2.0)</b> increases the dimension of a shape by 200%.
+ * Subsequent calls to the method multiply the effect. For example, calling <b>scale(2.0)</b> and then <b>scale(1.5)</b> is the same as <b>scale(3.0)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * <br><br>Using this fuction with the <b>z</b> parameter requires passing P3D or OPENGL into the size() parameter.
+ *
+ * @param {float}s percentage to scale the object
+ * @param {float}x percentage to scale the object in the x-axis
+ * @param {float}y percentage to scale the object in the y-axis
+ * @param {float}z percentage to scale the object in the z-axis
+ *
+ * @see PMatrix2D#scale
+ * @see PMatrix3D#scale
+ */
+ scale: function() {
+ if(arguments.length === 2) {
+ this.checkMatrix(2);
+ this.matrix.scale(arguments[0], arguments[1]);
+ } else if (arguments.length === 3) {
+ this.checkMatrix(2);
+ this.matrix.scale(arguments[0], arguments[1], arguments[2]);
+ } else {
+ this.checkMatrix(2);
+ this.matrix.scale(arguments[0]);
+ }
+ },
+ /**
+ * @member PShape
+ * The resetMatrix() function resets the matrix
+ *
+ * @see PMatrix2D#reset
+ * @see PMatrix3D#reset
+ */
+ resetMatrix: function() {
+ this.checkMatrix(2);
+ this.matrix.reset();
+ },
+ /**
+ * @member PShape
+ * The applyMatrix() function multiplies this matrix by another matrix of type PMatrix3D or PMatrix2D.
+ * Individual elements can also be provided
+ *
+ * @param {PMatrix3D|PMatrix2D} matrix the matrix to multiply by
+ *
+ * @see PMatrix2D#apply
+ * @see PMatrix3D#apply
+ */
+ applyMatrix: function(matrix) {
+ if (arguments.length === 1) {
+ this.applyMatrix(matrix.elements[0],
+ matrix.elements[1], 0,
+ matrix.elements[2],
+ matrix.elements[3],
+ matrix.elements[4], 0,
+ matrix.elements[5],
+ 0, 0, 1, 0,
+ 0, 0, 0, 1);
+ } else if (arguments.length === 6) {
+ this.checkMatrix(2);
+ this.matrix.apply(arguments[0], arguments[1], arguments[2], 0,
+ arguments[3], arguments[4], arguments[5], 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1);
+
+ } else if (arguments.length === 16) {
+ this.checkMatrix(3);
+ this.matrix.apply(arguments[0],
+ arguments[1],
+ arguments[2],
+ arguments[3],
+ arguments[4],
+ arguments[5],
+ arguments[6],
+ arguments[7],
+ arguments[8],
+ arguments[9],
+ arguments[10],
+ arguments[11],
+ arguments[12],
+ arguments[13],
+ arguments[14],
+ arguments[15]);
+ }
+ }
+ };
+
+ return PShape;
+};
+},{}],17:[function(require,module,exports){
+/**
+ * SVG stands for Scalable Vector Graphics, a portable graphics format. It is
+ * a vector format so it allows for infinite resolution and relatively small
+ * file sizes. Most modern media software can view SVG files, including Adobe
+ * products, Firefox, etc. Illustrator and Inkscape can edit SVG files.
+ *
+ * @param {PApplet} parent typically use "this"
+ * @param {String} filename name of the SVG file to load
+ * @param {XMLElement} xml an XMLElement element
+ * @param {PShapeSVG} parent the parent PShapeSVG
+ *
+ * @see PShape
+ */
+module.exports = function(options) {
+ var CommonFunctions = options.CommonFunctions,
+ PConstants = options.PConstants,
+ PShape = options.PShape,
+ XMLElement = options.XMLElement,
+ colors = options.colors;
+
+ var PShapeSVG = function() {
+ PShape.call(this); // PShape is the base class.
+ if (arguments.length === 1) { // xml element coming in
+ this.element = arguments[0];
+
+ // set values to their defaults according to the SVG spec
+ this.vertexCodes = [];
+ this.vertices = [];
+ this.opacity = 1;
+
+ this.stroke = false;
+ this.strokeColor = PConstants.ALPHA_MASK;
+ this.strokeWeight = 1;
+ this.strokeCap = PConstants.SQUARE; // BUTT in svg spec
+ this.strokeJoin = PConstants.MITER;
+ this.strokeGradient = null;
+ this.strokeGradientPaint = null;
+ this.strokeName = null;
+ this.strokeOpacity = 1;
+
+ this.fill = true;
+ this.fillColor = PConstants.ALPHA_MASK;
+ this.fillGradient = null;
+ this.fillGradientPaint = null;
+ this.fillName = null;
+ this.fillOpacity = 1;
+
+ if (this.element.getName() !== "svg") {
+ throw("root is not <svg>, it's <" + this.element.getName() + ">");
+ }
+ }
+ else if (arguments.length === 2) {
+ if (typeof arguments[1] === 'string') {
+ if (arguments[1].indexOf(".svg") > -1) { //its a filename
+ this.element = new XMLElement(true, arguments[1]);
+ // set values to their defaults according to the SVG spec
+ this.vertexCodes = [];
+ this.vertices = [];
+ this.opacity = 1;
+
+ this.stroke = false;
+ this.strokeColor = PConstants.ALPHA_MASK;
+ this.strokeWeight = 1;
+ this.strokeCap = PConstants.SQUARE; // BUTT in svg spec
+ this.strokeJoin = PConstants.MITER;
+ this.strokeGradient = "";
+ this.strokeGradientPaint = "";
+ this.strokeName = "";
+ this.strokeOpacity = 1;
+
+ this.fill = true;
+ this.fillColor = PConstants.ALPHA_MASK;
+ this.fillGradient = null;
+ this.fillGradientPaint = null;
+ this.fillOpacity = 1;
+
+ }
+ } else { // XMLElement
+ if (arguments[0]) { // PShapeSVG
+ this.element = arguments[1];
+ this.vertexCodes = arguments[0].vertexCodes.slice();
+ this.vertices = arguments[0].vertices.slice();
+
+ this.stroke = arguments[0].stroke;
+ this.strokeColor = arguments[0].strokeColor;
+ this.strokeWeight = arguments[0].strokeWeight;
+ this.strokeCap = arguments[0].strokeCap;
+ this.strokeJoin = arguments[0].strokeJoin;
+ this.strokeGradient = arguments[0].strokeGradient;
+ this.strokeGradientPaint = arguments[0].strokeGradientPaint;
+ this.strokeName = arguments[0].strokeName;
+
+ this.fill = arguments[0].fill;
+ this.fillColor = arguments[0].fillColor;
+ this.fillGradient = arguments[0].fillGradient;
+ this.fillGradientPaint = arguments[0].fillGradientPaint;
+ this.fillName = arguments[0].fillName;
+ this.strokeOpacity = arguments[0].strokeOpacity;
+ this.fillOpacity = arguments[0].fillOpacity;
+ this.opacity = arguments[0].opacity;
+ }
+ }
+ }
+
+ this.name = this.element.getStringAttribute("id");
+ var displayStr = this.element.getStringAttribute("display", "inline");
+ this.visible = displayStr !== "none";
+ var str = this.element.getAttribute("transform");
+ if (str) {
+ this.matrix = this.parseMatrix(str);
+ }
+ // not proper parsing of the viewBox, but will cover us for cases where
+ // the width and height of the object is not specified
+ var viewBoxStr = this.element.getStringAttribute("viewBox");
+ if ( viewBoxStr !== null ) {
+ var viewBox = viewBoxStr.split(" ");
+ this.width = viewBox[2];
+ this.height = viewBox[3];
+ }
+
+ // TODO if viewbox is not same as width/height, then use it to scale
+ // the original objects. for now, viewbox only used when width/height
+ // are empty values (which by the spec means w/h of "100%"
+ var unitWidth = this.element.getStringAttribute("width");
+ var unitHeight = this.element.getStringAttribute("height");
+ if (unitWidth !== null) {
+ this.width = this.parseUnitSize(unitWidth);
+ this.height = this.parseUnitSize(unitHeight);
+ } else {
+ if ((this.width === 0) || (this.height === 0)) {
+ // For the spec, the default is 100% and 100%. For purposes
+ // here, insert a dummy value because this is prolly just a
+ // font or something for which the w/h doesn't matter.
+ this.width = 1;
+ this.height = 1;
+
+ //show warning
+ throw("The width and/or height is not " +
+ "readable in the <svg> tag of this file.");
+ }
+ }
+ this.parseColors(this.element);
+ this.parseChildren(this.element);
+
+ };
+ /**
+ * PShapeSVG methods are inherited from the PShape prototype
+ */
+ PShapeSVG.prototype = new PShape();
+ /**
+ * @member PShapeSVG
+ * The parseMatrix() function parses the specified SVG matrix into a PMatrix2D. Note that PMatrix2D
+ * is rotated relative to the SVG definition, so parameters are rearranged
+ * here. More about the transformation matrices in
+ * <a href="http://www.w3.org/TR/SVG/coords.html#TransformAttribute">this section</a>
+ * of the SVG documentation.
+ *
+ * @param {String} str text of the matrix param.
+ *
+ * @return {PMatrix2D} a PMatrix2D
+ */
+ PShapeSVG.prototype.parseMatrix = (function() {
+ function getCoords(s) {
+ var m = [];
+ s.replace(/\((.*?)\)/, (function() {
+ return function(all, params) {
+ // get the coordinates that can be separated by spaces or a comma
+ m = params.replace(/,+/g, " ").split(/\s+/);
+ };
+ }()));
+ return m;
+ }
+
+ return function(str) {
+ this.checkMatrix(2);
+ var pieces = [];
+ str.replace(/\s*(\w+)\((.*?)\)/g, function(all) {
+ // get a list of transform definitions
+ pieces.push(CommonFunctions.trim(all));
+ });
+ if (pieces.length === 0) {
+ return null;
+ }
+
+ for (var i = 0, j = pieces.length; i < j; i++) {
+ var m = getCoords(pieces[i]);
+
+ if (pieces[i].indexOf("matrix") !== -1) {
+ this.matrix.set(m[0], m[2], m[4], m[1], m[3], m[5]);
+ } else if (pieces[i].indexOf("translate") !== -1) {
+ var tx = m[0];
+ var ty = (m.length === 2) ? m[1] : 0;
+ this.matrix.translate(tx,ty);
+ } else if (pieces[i].indexOf("scale") !== -1) {
+ var sx = m[0];
+ var sy = (m.length === 2) ? m[1] : m[0];
+ this.matrix.scale(sx,sy);
+ } else if (pieces[i].indexOf("rotate") !== -1) {
+ var angle = m[0];
+ if (m.length === 1) {
+ this.matrix.rotate(CommonFunctions.radians(angle));
+ } else if (m.length === 3) {
+ this.matrix.translate(m[1], m[2]);
+ this.matrix.rotate(CommonFunctions.radians(m[0]));
+ this.matrix.translate(-m[1], -m[2]);
+ }
+ } else if (pieces[i].indexOf("skewX") !== -1) {
+ this.matrix.skewX(parseFloat(m[0]));
+ } else if (pieces[i].indexOf("skewY") !== -1) {
+ this.matrix.skewY(m[0]);
+ } else if (pieces[i].indexOf("shearX") !== -1) {
+ this.matrix.shearX(m[0]);
+ } else if (pieces[i].indexOf("shearY") !== -1) {
+ this.matrix.shearY(m[0]);
+ }
+ }
+ return this.matrix;
+ };
+ }());
+
+ /**
+ * @member PShapeSVG
+ * The parseChildren() function parses the specified XMLElement
+ *
+ * @param {XMLElement}element the XMLElement to parse
+ */
+ PShapeSVG.prototype.parseChildren = function(element) {
+ var newelement = element.getChildren();
+ var base = new PShape();
+ var i, j;
+ for (i = 0, j = newelement.length; i < j; i++) {
+ var kid = this.parseChild(newelement[i]);
+ if (kid) {
+ base.addChild(kid);
+ }
+ }
+ for (i = 0, j = base.children.length; i < j; i++) {
+ this.children.push(base.children[i]);
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * The getName() function returns the name
+ *
+ * @return {String} the name
+ */
+ PShapeSVG.prototype.getName = function() {
+ return this.name;
+ };
+ /**
+ * @member PShapeSVG
+ * The parseChild() function parses a child XML element.
+ *
+ * @param {XMLElement} elem the element to parse
+ *
+ * @return {PShape} the newly created PShape
+ */
+ PShapeSVG.prototype.parseChild = function( elem ) {
+ var name = elem.getName();
+ var shape;
+ if (name === "g") {
+ shape = new PShapeSVG(this, elem);
+ } else if (name === "defs") {
+ // generally this will contain gradient info, so may
+ // as well just throw it into a group element for parsing
+ shape = new PShapeSVG(this, elem);
+ } else if (name === "line") {
+ shape = new PShapeSVG(this, elem);
+ shape.parseLine();
+ } else if (name === "circle") {
+ shape = new PShapeSVG(this, elem);
+ shape.parseEllipse(true);
+ } else if (name === "ellipse") {
+ shape = new PShapeSVG(this, elem);
+ shape.parseEllipse(false);
+ } else if (name === "rect") {
+ shape = new PShapeSVG(this, elem);
+ shape.parseRect();
+ } else if (name === "polygon") {
+ shape = new PShapeSVG(this, elem);
+ shape.parsePoly(true);
+ } else if (name === "polyline") {
+ shape = new PShapeSVG(this, elem);
+ shape.parsePoly(false);
+ } else if (name === "path") {
+ shape = new PShapeSVG(this, elem);
+ shape.parsePath();
+ } else if (name === "radialGradient") {
+ //return new RadialGradient(this, elem);
+ unimplemented('PShapeSVG.prototype.parseChild, name = radialGradient');
+ } else if (name === "linearGradient") {
+ //return new LinearGradient(this, elem);
+ unimplemented('PShapeSVG.prototype.parseChild, name = linearGradient');
+ } else if (name === "text") {
+ unimplemented('PShapeSVG.prototype.parseChild, name = text');
+ } else if (name === "filter") {
+ unimplemented('PShapeSVG.prototype.parseChild, name = filter');
+ } else if (name === "mask") {
+ unimplemented('PShapeSVG.prototype.parseChild, name = mask');
+ } else {
+ // ignoring
+ }
+ return shape;
+ };
+ /**
+ * @member PShapeSVG
+ * The parsePath() function parses the <path> element of the svg file
+ * A path is defined by including a path element which contains a d="(path data)" attribute, where the d attribute contains
+ * the moveto, line, curve (both cubic and quadratic Beziers), arc and closepath instructions.
+ **/
+ PShapeSVG.prototype.parsePath = function() {
+ this.family = PConstants.PATH;
+ this.kind = 0;
+ var pathDataChars = [];
+ var c;
+ //change multiple spaces and commas to single space
+ var pathData = CommonFunctions.trim(this.element.getStringAttribute("d").replace(/[\s,]+/g,' '));
+ if (pathData === null) {
+ return;
+ }
+ pathData = pathData.split('');
+ var cx = 0,
+ cy = 0,
+ ctrlX = 0,
+ ctrlY = 0,
+ ctrlX1 = 0,
+ ctrlX2 = 0,
+ ctrlY1 = 0,
+ ctrlY2 = 0,
+ endX = 0,
+ endY = 0,
+ ppx = 0,
+ ppy = 0,
+ px = 0,
+ py = 0,
+ i = 0,
+ valOf = 0;
+ var str = "";
+ var tmpArray = [];
+ var flag = false;
+ var lastInstruction;
+ var command;
+ var j, k;
+ while (i< pathData.length) {
+ valOf = pathData[i].charCodeAt(0);
+ if ((valOf >= 65 && valOf <= 90) || (valOf >= 97 && valOf <= 122)) {
+ // if it's a letter
+ // populate the tmpArray with coordinates
+ j = i;
+ i++;
+ if (i < pathData.length) { // don't go over boundary of array
+ tmpArray = [];
+ valOf = pathData[i].charCodeAt(0);
+ while (!((valOf >= 65 && valOf <= 90) ||
+ (valOf >= 97 && valOf <= 100) ||
+ (valOf >= 102 && valOf <= 122)) && flag === false) { // if its NOT a letter
+ if (valOf === 32) { //if its a space and the str isn't empty
+ // sometimes you get a space after the letter
+ if (str !== "") {
+ tmpArray.push(parseFloat(str));
+ str = "";
+ }
+ i++;
+ } else if (valOf === 45) { //if it's a -
+ // allow for 'e' notation in numbers, e.g. 2.10e-9
+ if (pathData[i-1].charCodeAt(0) === 101) {
+ str += pathData[i].toString();
+ i++;
+ } else {
+ // sometimes no space separator after (ex: 104.535-16.322)
+ if (str !== "") {
+ tmpArray.push(parseFloat(str));
+ }
+ str = pathData[i].toString();
+ i++;
+ }
+ } else {
+ str += pathData[i].toString();
+ i++;
+ }
+ if (i === pathData.length) { // don't go over boundary of array
+ flag = true;
+ } else {
+ valOf = pathData[i].charCodeAt(0);
+ }
+ }
+ }
+ if (str !== "") {
+ tmpArray.push(parseFloat(str));
+ str = "";
+ }
+ command = pathData[j];
+ valOf = command.charCodeAt(0);
+ if (valOf === 77) { // M - move to (absolute)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ cx = tmpArray[0];
+ cy = tmpArray[1];
+ this.parsePathMoveto(cx, cy);
+ if (tmpArray.length > 2) {
+ for (j = 2, k = tmpArray.length; j < k; j+=2) {
+ // absolute line to
+ cx = tmpArray[j];
+ cy = tmpArray[j+1];
+ this.parsePathLineto(cx,cy);
+ }
+ }
+ }
+ } else if (valOf === 109) { // m - move to (relative)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ cx += tmpArray[0];
+ cy += tmpArray[1];
+ this.parsePathMoveto(cx,cy);
+ if (tmpArray.length > 2) {
+ for (j = 2, k = tmpArray.length; j < k; j+=2) {
+ // relative line to
+ cx += tmpArray[j];
+ cy += tmpArray[j + 1];
+ this.parsePathLineto(cx,cy);
+ }
+ }
+ }
+ } else if (valOf === 76) { // L - lineto (absolute)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=2) {
+ cx = tmpArray[j];
+ cy = tmpArray[j + 1];
+ this.parsePathLineto(cx,cy);
+ }
+ }
+ } else if (valOf === 108) { // l - lineto (relative)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=2) {
+ cx += tmpArray[j];
+ cy += tmpArray[j+1];
+ this.parsePathLineto(cx,cy);
+ }
+ }
+ } else if (valOf === 72) { // H - horizontal lineto (absolute)
+ for (j = 0, k = tmpArray.length; j < k; j++) {
+ // multiple x co-ordinates can be provided
+ cx = tmpArray[j];
+ this.parsePathLineto(cx, cy);
+ }
+ } else if (valOf === 104) { // h - horizontal lineto (relative)
+ for (j = 0, k = tmpArray.length; j < k; j++) {
+ // multiple x co-ordinates can be provided
+ cx += tmpArray[j];
+ this.parsePathLineto(cx, cy);
+ }
+ } else if (valOf === 86) { // V - vertical lineto (absolute)
+ for (j = 0, k = tmpArray.length; j < k; j++) {
+ // multiple y co-ordinates can be provided
+ cy = tmpArray[j];
+ this.parsePathLineto(cx, cy);
+ }
+ } else if (valOf === 118) { // v - vertical lineto (relative)
+ for (j = 0, k = tmpArray.length; j < k; j++) {
+ // multiple y co-ordinates can be provided
+ cy += tmpArray[j];
+ this.parsePathLineto(cx, cy);
+ }
+ } else if (valOf === 67) { // C - curve to (absolute)
+ if (tmpArray.length >= 6 && tmpArray.length % 6 === 0) {
+ // need one+ multiples of 6 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=6) {
+ ctrlX1 = tmpArray[j];
+ ctrlY1 = tmpArray[j + 1];
+ ctrlX2 = tmpArray[j + 2];
+ ctrlY2 = tmpArray[j + 3];
+ endX = tmpArray[j + 4];
+ endY = tmpArray[j + 5];
+ this.parsePathCurveto(ctrlX1,
+ ctrlY1,
+ ctrlX2,
+ ctrlY2,
+ endX,
+ endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 99) { // c - curve to (relative)
+ if (tmpArray.length >= 6 && tmpArray.length % 6 === 0) {
+ // need one+ multiples of 6 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=6) {
+ ctrlX1 = cx + tmpArray[j];
+ ctrlY1 = cy + tmpArray[j + 1];
+ ctrlX2 = cx + tmpArray[j + 2];
+ ctrlY2 = cy + tmpArray[j + 3];
+ endX = cx + tmpArray[j + 4];
+ endY = cy + tmpArray[j + 5];
+ this.parsePathCurveto(ctrlX1,
+ ctrlY1,
+ ctrlX2,
+ ctrlY2,
+ endX,
+ endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 83) { // S - curve to shorthand (absolute)
+ if (tmpArray.length >= 4 && tmpArray.length % 4 === 0) {
+ // need one+ multiples of 4 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=4) {
+ if (lastInstruction.toLowerCase() === "c" ||
+ lastInstruction.toLowerCase() === "s") {
+ ppx = this.vertices[ this.vertices.length-2 ][0];
+ ppy = this.vertices[ this.vertices.length-2 ][1];
+ px = this.vertices[ this.vertices.length-1 ][0];
+ py = this.vertices[ this.vertices.length-1 ][1];
+ ctrlX1 = px + (px - ppx);
+ ctrlY1 = py + (py - ppy);
+ } else {
+ //If there is no previous curve,
+ //the current point will be used as the first control point.
+ ctrlX1 = this.vertices[this.vertices.length-1][0];
+ ctrlY1 = this.vertices[this.vertices.length-1][1];
+ }
+ ctrlX2 = tmpArray[j];
+ ctrlY2 = tmpArray[j + 1];
+ endX = tmpArray[j + 2];
+ endY = tmpArray[j + 3];
+ this.parsePathCurveto(ctrlX1,
+ ctrlY1,
+ ctrlX2,
+ ctrlY2,
+ endX,
+ endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 115) { // s - curve to shorthand (relative)
+ if (tmpArray.length >= 4 && tmpArray.length % 4 === 0) {
+ // need one+ multiples of 4 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=4) {
+ if (lastInstruction.toLowerCase() === "c" ||
+ lastInstruction.toLowerCase() === "s") {
+ ppx = this.vertices[this.vertices.length-2][0];
+ ppy = this.vertices[this.vertices.length-2][1];
+ px = this.vertices[this.vertices.length-1][0];
+ py = this.vertices[this.vertices.length-1][1];
+ ctrlX1 = px + (px - ppx);
+ ctrlY1 = py + (py - ppy);
+ } else {
+ //If there is no previous curve,
+ //the current point will be used as the first control point.
+ ctrlX1 = this.vertices[this.vertices.length-1][0];
+ ctrlY1 = this.vertices[this.vertices.length-1][1];
+ }
+ ctrlX2 = cx + tmpArray[j];
+ ctrlY2 = cy + tmpArray[j + 1];
+ endX = cx + tmpArray[j + 2];
+ endY = cy + tmpArray[j + 3];
+ this.parsePathCurveto(ctrlX1,
+ ctrlY1,
+ ctrlX2,
+ ctrlY2,
+ endX,
+ endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 81) { // Q - quadratic curve to (absolute)
+ if (tmpArray.length >= 4 && tmpArray.length % 4 === 0) {
+ // need one+ multiples of 4 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=4) {
+ ctrlX = tmpArray[j];
+ ctrlY = tmpArray[j + 1];
+ endX = tmpArray[j + 2];
+ endY = tmpArray[j + 3];
+ this.parsePathQuadto(cx, cy, ctrlX, ctrlY, endX, endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 113) { // q - quadratic curve to (relative)
+ if (tmpArray.length >= 4 && tmpArray.length % 4 === 0) {
+ // need one+ multiples of 4 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=4) {
+ ctrlX = cx + tmpArray[j];
+ ctrlY = cy + tmpArray[j + 1];
+ endX = cx + tmpArray[j + 2];
+ endY = cy + tmpArray[j + 3];
+ this.parsePathQuadto(cx, cy, ctrlX, ctrlY, endX, endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 84) {
+ // T - quadratic curve to shorthand (absolute)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=2) {
+ if (lastInstruction.toLowerCase() === "q" ||
+ lastInstruction.toLowerCase() === "t") {
+ ppx = this.vertices[this.vertices.length-2][0];
+ ppy = this.vertices[this.vertices.length-2][1];
+ px = this.vertices[this.vertices.length-1][0];
+ py = this.vertices[this.vertices.length-1][1];
+ ctrlX = px + (px - ppx);
+ ctrlY = py + (py - ppy);
+ } else {
+ // If there is no previous command or if the previous command
+ // was not a Q, q, T or t, assume the control point is
+ // coincident with the current point.
+ ctrlX = cx;
+ ctrlY = cy;
+ }
+ endX = tmpArray[j];
+ endY = tmpArray[j + 1];
+ this.parsePathQuadto(cx, cy, ctrlX, ctrlY, endX, endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 116) {
+ // t - quadratic curve to shorthand (relative)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=2) {
+ if (lastInstruction.toLowerCase() === "q" ||
+ lastInstruction.toLowerCase() === "t") {
+ ppx = this.vertices[this.vertices.length-2][0];
+ ppy = this.vertices[this.vertices.length-2][1];
+ px = this.vertices[this.vertices.length-1][0];
+ py = this.vertices[this.vertices.length-1][1];
+ ctrlX = px + (px - ppx);
+ ctrlY = py + (py - ppy);
+ } else {
+ // If there is no previous command or if the previous command
+ // was not a Q, q, T or t, assume the control point is
+ // coincident with the current point.
+ ctrlX = cx;
+ ctrlY = cy;
+ }
+ endX = cx + tmpArray[j];
+ endY = cy + tmpArray[j + 1];
+ this.parsePathQuadto(cx, cy, ctrlX, ctrlY, endX, endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 90 || valOf === 122) { // Z or z (these do the same thing)
+ this.close = true;
+ }
+ lastInstruction = command.toString();
+ } else { i++;}
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parsePath() helper function
+ *
+ * @see PShapeSVG#parsePath
+ */
+ PShapeSVG.prototype.parsePathQuadto = function(x1, y1, cx, cy, x2, y2) {
+ if (this.vertices.length > 0) {
+ this.parsePathCode(PConstants.BEZIER_VERTEX);
+ // x1/y1 already covered by last moveto, lineto, or curveto
+ this.parsePathVertex(x1 + ((cx-x1)*2/3), y1 + ((cy-y1)*2/3));
+ this.parsePathVertex(x2 + ((cx-x2)*2/3), y2 + ((cy-y2)*2/3));
+ this.parsePathVertex(x2, y2);
+ } else {
+ throw ("Path must start with M/m");
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parsePath() helper function
+ *
+ * @see PShapeSVG#parsePath
+ */
+ PShapeSVG.prototype.parsePathCurveto = function(x1, y1, x2, y2, x3, y3) {
+ if (this.vertices.length > 0) {
+ this.parsePathCode(PConstants.BEZIER_VERTEX );
+ this.parsePathVertex(x1, y1);
+ this.parsePathVertex(x2, y2);
+ this.parsePathVertex(x3, y3);
+ } else {
+ throw ("Path must start with M/m");
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parsePath() helper function
+ *
+ * @see PShapeSVG#parsePath
+ */
+ PShapeSVG.prototype.parsePathLineto = function(px, py) {
+ if (this.vertices.length > 0) {
+ this.parsePathCode(PConstants.VERTEX);
+ this.parsePathVertex(px, py);
+ // add property to distinguish between curContext.moveTo
+ // or curContext.lineTo
+ this.vertices[this.vertices.length-1].moveTo = false;
+ } else {
+ throw ("Path must start with M/m");
+ }
+ };
+
+ PShapeSVG.prototype.parsePathMoveto = function(px, py) {
+ if (this.vertices.length > 0) {
+ this.parsePathCode(PConstants.BREAK);
+ }
+ this.parsePathCode(PConstants.VERTEX);
+ this.parsePathVertex(px, py);
+ // add property to distinguish between curContext.moveTo
+ // or curContext.lineTo
+ this.vertices[this.vertices.length-1].moveTo = true;
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parsePath() helper function
+ *
+ * @see PShapeSVG#parsePath
+ */
+ PShapeSVG.prototype.parsePathVertex = function(x, y) {
+ var verts = [];
+ verts[0] = x;
+ verts[1] = y;
+ this.vertices.push(verts);
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parsePath() helper function
+ *
+ * @see PShapeSVG#parsePath
+ */
+ PShapeSVG.prototype.parsePathCode = function(what) {
+ this.vertexCodes.push(what);
+ };
+ /**
+ * @member PShapeSVG
+ * The parsePoly() function parses a polyline or polygon from an SVG file.
+ *
+ * @param {boolean}val true if shape is closed (polygon), false if not (polyline)
+ */
+ PShapeSVG.prototype.parsePoly = function(val) {
+ this.family = PConstants.PATH;
+ this.close = val;
+ var pointsAttr = CommonFunctions.trim(this.element.getStringAttribute("points").replace(/[,\s]+/g,' '));
+ if (pointsAttr !== null) {
+ //split into array
+ var pointsBuffer = pointsAttr.split(" ");
+ if (pointsBuffer.length % 2 === 0) {
+ for (var i = 0, j = pointsBuffer.length; i < j; i++) {
+ var verts = [];
+ verts[0] = pointsBuffer[i];
+ verts[1] = pointsBuffer[++i];
+ this.vertices.push(verts);
+ }
+ } else {
+ throw("Error parsing polygon points: odd number of coordinates provided");
+ }
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * The parseRect() function parses a rect from an SVG file.
+ */
+ PShapeSVG.prototype.parseRect = function() {
+ this.kind = PConstants.RECT;
+ this.family = PConstants.PRIMITIVE;
+ this.params = [];
+ this.params[0] = this.element.getFloatAttribute("x");
+ this.params[1] = this.element.getFloatAttribute("y");
+ this.params[2] = this.element.getFloatAttribute("width");
+ this.params[3] = this.element.getFloatAttribute("height");
+ if (this.params[2] < 0 || this.params[3] < 0) {
+ throw("svg error: negative width or height found while parsing <rect>");
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * The parseEllipse() function handles parsing ellipse and circle tags.
+ *
+ * @param {boolean}val true if this is a circle and not an ellipse
+ */
+ PShapeSVG.prototype.parseEllipse = function(val) {
+ this.kind = PConstants.ELLIPSE;
+ this.family = PConstants.PRIMITIVE;
+ this.params = [];
+
+ this.params[0] = this.element.getFloatAttribute("cx") | 0 ;
+ this.params[1] = this.element.getFloatAttribute("cy") | 0;
+
+ var rx, ry;
+ if (val) {
+ rx = ry = this.element.getFloatAttribute("r");
+ if (rx < 0) {
+ throw("svg error: negative radius found while parsing <circle>");
+ }
+ } else {
+ rx = this.element.getFloatAttribute("rx");
+ ry = this.element.getFloatAttribute("ry");
+ if (rx < 0 || ry < 0) {
+ throw("svg error: negative x-axis radius or y-axis radius found while parsing <ellipse>");
+ }
+ }
+ this.params[0] -= rx;
+ this.params[1] -= ry;
+
+ this.params[2] = rx*2;
+ this.params[3] = ry*2;
+ };
+ /**
+ * @member PShapeSVG
+ * The parseLine() function handles parsing line tags.
+ *
+ * @param {boolean}val true if this is a circle and not an ellipse
+ */
+ PShapeSVG.prototype.parseLine = function() {
+ this.kind = PConstants.LINE;
+ this.family = PConstants.PRIMITIVE;
+ this.params = [];
+ this.params[0] = this.element.getFloatAttribute("x1");
+ this.params[1] = this.element.getFloatAttribute("y1");
+ this.params[2] = this.element.getFloatAttribute("x2");
+ this.params[3] = this.element.getFloatAttribute("y2");
+ };
+ /**
+ * @member PShapeSVG
+ * The parseColors() function handles parsing the opacity, strijem stroke-width, stroke-linejoin,stroke-linecap, fill, and style attributes
+ *
+ * @param {XMLElement}element the element of which attributes to parse
+ */
+ PShapeSVG.prototype.parseColors = function(element) {
+ if (element.hasAttribute("opacity")) {
+ this.setOpacity(element.getAttribute("opacity"));
+ }
+ if (element.hasAttribute("stroke")) {
+ this.setStroke(element.getAttribute("stroke"));
+ }
+ if (element.hasAttribute("stroke-width")) {
+ // if NaN (i.e. if it's 'inherit') then default
+ // back to the inherit setting
+ this.setStrokeWeight(element.getAttribute("stroke-width"));
+ }
+ if (element.hasAttribute("stroke-linejoin") ) {
+ this.setStrokeJoin(element.getAttribute("stroke-linejoin"));
+ }
+ if (element.hasAttribute("stroke-linecap")) {
+ this.setStrokeCap(element.getStringAttribute("stroke-linecap"));
+ }
+ // fill defaults to black (though stroke defaults to "none")
+ // http://www.w3.org/TR/SVG/painting.html#FillProperties
+ if (element.hasAttribute("fill")) {
+ this.setFill(element.getStringAttribute("fill"));
+ }
+ if (element.hasAttribute("style")) {
+ var styleText = element.getStringAttribute("style");
+ var styleTokens = styleText.toString().split( ";" );
+
+ for (var i = 0, j = styleTokens.length; i < j; i++) {
+ var tokens = CommonFunctions.trim(styleTokens[i].split( ":" ));
+ if (tokens[0] === "fill") {
+ this.setFill(tokens[1]);
+ } else if (tokens[0] === "fill-opacity") {
+ this.setFillOpacity(tokens[1]);
+ } else if (tokens[0] === "stroke") {
+ this.setStroke(tokens[1]);
+ } else if (tokens[0] === "stroke-width") {
+ this.setStrokeWeight(tokens[1]);
+ } else if (tokens[0] === "stroke-linecap") {
+ this.setStrokeCap(tokens[1]);
+ } else if (tokens[0] === "stroke-linejoin") {
+ this.setStrokeJoin(tokens[1]);
+ } else if (tokens[0] === "stroke-opacity") {
+ this.setStrokeOpacity(tokens[1]);
+ } else if (tokens[0] === "opacity") {
+ this.setOpacity(tokens[1]);
+ } // Other attributes are not yet implemented
+ }
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} opacityText the value of fillOpacity
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setFillOpacity = function(opacityText) {
+ this.fillOpacity = parseFloat(opacityText);
+ this.fillColor = this.fillOpacity * 255 << 24 |
+ this.fillColor & 0xFFFFFF;
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} fillText the value of fill
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setFill = function (fillText) {
+ var opacityMask = this.fillColor & 0xFF000000;
+ if (fillText === "none") {
+ this.fill = false;
+ } else if (fillText.indexOf("#") === 0) {
+ this.fill = true;
+ if (fillText.length === 4) {
+ // convert #00F to #0000FF
+ fillText = fillText.replace(/#(.)(.)(.)/,"#$1$1$2$2$3$3");
+ }
+ this.fillColor = opacityMask |
+ (parseInt(fillText.substring(1), 16 )) &
+ 0xFFFFFF;
+ } else if (fillText.indexOf("rgb") === 0) {
+ this.fill = true;
+ this.fillColor = opacityMask | this.parseRGB(fillText);
+ } else if (fillText.indexOf("url(#") === 0) {
+ this.fillName = fillText.substring(5, fillText.length - 1 );
+ } else if (colors[fillText]) {
+ this.fill = true;
+ this.fillColor = opacityMask |
+ (parseInt(colors[fillText].substring(1), 16)) &
+ 0xFFFFFF;
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} opacity the value of opacity
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setOpacity = function(opacity) {
+ this.strokeColor = parseFloat(opacity) * 255 << 24 |
+ this.strokeColor & 0xFFFFFF;
+ this.fillColor = parseFloat(opacity) * 255 << 24 |
+ this.fillColor & 0xFFFFFF;
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} strokeText the value to set stroke to
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setStroke = function(strokeText) {
+ var opacityMask = this.strokeColor & 0xFF000000;
+ if (strokeText === "none") {
+ this.stroke = false;
+ } else if (strokeText.charAt( 0 ) === "#") {
+ this.stroke = true;
+ if (strokeText.length === 4) {
+ // convert #00F to #0000FF
+ strokeText = strokeText.replace(/#(.)(.)(.)/,"#$1$1$2$2$3$3");
+ }
+ this.strokeColor = opacityMask |
+ (parseInt( strokeText.substring( 1 ), 16 )) &
+ 0xFFFFFF;
+ } else if (strokeText.indexOf( "rgb" ) === 0 ) {
+ this.stroke = true;
+ this.strokeColor = opacityMask | this.parseRGB(strokeText);
+ } else if (strokeText.indexOf( "url(#" ) === 0) {
+ this.strokeName = strokeText.substring(5, strokeText.length - 1);
+ } else if (colors[strokeText]) {
+ this.stroke = true;
+ this.strokeColor = opacityMask |
+ (parseInt(colors[strokeText].substring(1), 16)) &
+ 0xFFFFFF;
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} weight the value to set strokeWeight to
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setStrokeWeight = function(weight) {
+ this.strokeWeight = this.parseUnitSize(weight);
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} linejoin the value to set strokeJoin to
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setStrokeJoin = function(linejoin) {
+ if (linejoin === "miter") {
+ this.strokeJoin = PConstants.MITER;
+
+ } else if (linejoin === "round") {
+ this.strokeJoin = PConstants.ROUND;
+
+ } else if (linejoin === "bevel") {
+ this.strokeJoin = PConstants.BEVEL;
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} linecap the value to set strokeCap to
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setStrokeCap = function (linecap) {
+ if (linecap === "butt") {
+ this.strokeCap = PConstants.SQUARE;
+
+ } else if (linecap === "round") {
+ this.strokeCap = PConstants.ROUND;
+
+ } else if (linecap === "square") {
+ this.strokeCap = PConstants.PROJECT;
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} opacityText the value to set stroke opacity to
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setStrokeOpacity = function (opacityText) {
+ this.strokeOpacity = parseFloat(opacityText);
+ this.strokeColor = this.strokeOpacity * 255 << 24 |
+ this.strokeColor &
+ 0xFFFFFF;
+ };
+ /**
+ * @member PShapeSVG
+ * The parseRGB() function parses an rbg() color string and returns a color int
+ *
+ * @param {String} color the color to parse in rbg() format
+ *
+ * @return {int} the equivalent color int
+ */
+ PShapeSVG.prototype.parseRGB = function(color) {
+ var sub = color.substring(color.indexOf('(') + 1, color.indexOf(')'));
+ var values = sub.split(", ");
+ return (values[0] << 16) | (values[1] << 8) | (values[2]);
+ };
+ /**
+ * @member PShapeSVG
+ * The parseUnitSize() function parse a size that may have a suffix for its units.
+ * Ignoring cases where this could also be a percentage.
+ * The <A HREF="http://www.w3.org/TR/SVG/coords.html#Units">units</A> spec:
+ * <UL>
+ * <LI>"1pt" equals "1.25px" (and therefore 1.25 user units)
+ * <LI>"1pc" equals "15px" (and therefore 15 user units)
+ * <LI>"1mm" would be "3.543307px" (3.543307 user units)
+ * <LI>"1cm" equals "35.43307px" (and therefore 35.43307 user units)
+ * <LI>"1in" equals "90px" (and therefore 90 user units)
+ * </UL>
+ */
+ PShapeSVG.prototype.parseUnitSize = function (text) {
+ var len = text.length - 2;
+ if (len < 0) { return text; }
+ if (text.indexOf("pt") === len) {
+ return parseFloat(text.substring(0, len)) * 1.25;
+ }
+ if (text.indexOf("pc") === len) {
+ return parseFloat( text.substring( 0, len)) * 15;
+ }
+ if (text.indexOf("mm") === len) {
+ return parseFloat( text.substring(0, len)) * 3.543307;
+ }
+ if (text.indexOf("cm") === len) {
+ return parseFloat(text.substring(0, len)) * 35.43307;
+ }
+ if (text.indexOf("in") === len) {
+ return parseFloat(text.substring(0, len)) * 90;
+ }
+ if (text.indexOf("px") === len) {
+ return parseFloat(text.substring(0, len));
+ }
+ return parseFloat(text);
+ };
+
+ return PShapeSVG;
+};
+
+},{}],18:[function(require,module,exports){
+module.exports = function(options, undef) {
+ var PConstants = options.PConstants;
+
+ function PVector(x, y, z) {
+ this.x = x || 0;
+ this.y = y || 0;
+ this.z = z || 0;
+ }
+
+ PVector.fromAngle = function(angle, v) {
+ if (v === undef || v === null) {
+ v = new PVector();
+ }
+ v.x = Math.cos(angle);
+ v.y = Math.sin(angle);
+ return v;
+ };
+
+ PVector.random2D = function(v) {
+ return PVector.fromAngle(Math.random() * PConstants.TWO_PI, v);
+ };
+
+ PVector.random3D = function(v) {
+ var angle = Math.random() * PConstants.TWO_PI;
+ var vz = Math.random() * 2 - 1;
+ var mult = Math.sqrt(1 - vz * vz);
+ var vx = mult * Math.cos(angle);
+ var vy = mult * Math.sin(angle);
+ if (v === undef || v === null) {
+ v = new PVector(vx, vy, vz);
+ } else {
+ v.set(vx, vy, vz);
+ }
+ return v;
+ };
+
+ PVector.dist = function(v1, v2) {
+ return v1.dist(v2);
+ };
+
+ PVector.dot = function(v1, v2) {
+ return v1.dot(v2);
+ };
+
+ PVector.cross = function(v1, v2) {
+ return v1.cross(v2);
+ };
+
+ PVector.sub = function(v1, v2) {
+ return new PVector(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
+ };
+
+ PVector.angleBetween = function(v1, v2) {
+ return Math.acos(v1.dot(v2) / Math.sqrt(v1.magSq() * v2.magSq()));
+ };
+
+ PVector.lerp = function(v1, v2, amt) {
+ // non-static lerp mutates object, but this version returns a new vector
+ var retval = new PVector(v1.x, v1.y, v1.z);
+ retval.lerp(v2, amt);
+ return retval;
+ };
+
+ // Common vector operations for PVector
+ PVector.prototype = {
+ set: function(v, y, z) {
+ if (arguments.length === 1) {
+ this.set(v.x || v[0] || 0,
+ v.y || v[1] || 0,
+ v.z || v[2] || 0);
+ } else {
+ this.x = v;
+ this.y = y;
+ this.z = z;
+ }
+ },
+ get: function() {
+ return new PVector(this.x, this.y, this.z);
+ },
+ mag: function() {
+ var x = this.x,
+ y = this.y,
+ z = this.z;
+ return Math.sqrt(x * x + y * y + z * z);
+ },
+ magSq: function() {
+ var x = this.x,
+ y = this.y,
+ z = this.z;
+ return (x * x + y * y + z * z);
+ },
+ setMag: function(v_or_len, len) {
+ if (len === undef) {
+ len = v_or_len;
+ this.normalize();
+ this.mult(len);
+ } else {
+ var v = v_or_len;
+ v.normalize();
+ v.mult(len);
+ return v;
+ }
+ },
+ add: function(v, y, z) {
+ if (arguments.length === 1) {
+ this.x += v.x;
+ this.y += v.y;
+ this.z += v.z;
+ } else if (arguments.length === 2) {
+ // 2D Vector
+ this.x += v;
+ this.y += y;
+ } else {
+ this.x += v;
+ this.y += y;
+ this.z += z;
+ }
+ },
+ sub: function(v, y, z) {
+ if (arguments.length === 1) {
+ this.x -= v.x;
+ this.y -= v.y;
+ this.z -= v.z;
+ } else if (arguments.length === 2) {
+ // 2D Vector
+ this.x -= v;
+ this.y -= y;
+ } else {
+ this.x -= v;
+ this.y -= y;
+ this.z -= z;
+ }
+ },
+ mult: function(v) {
+ if (typeof v === 'number') {
+ this.x *= v;
+ this.y *= v;
+ this.z *= v;
+ } else {
+ this.x *= v.x;
+ this.y *= v.y;
+ this.z *= v.z;
+ }
+ },
+ div: function(v) {
+ if (typeof v === 'number') {
+ this.x /= v;
+ this.y /= v;
+ this.z /= v;
+ } else {
+ this.x /= v.x;
+ this.y /= v.y;
+ this.z /= v.z;
+ }
+ },
+ rotate: function(angle) {
+ var prev_x = this.x;
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ this.x = c * this.x - s * this.y;
+ this.y = s * prev_x + c * this.y;
+ },
+ dist: function(v) {
+ var dx = this.x - v.x,
+ dy = this.y - v.y,
+ dz = this.z - v.z;
+ return Math.sqrt(dx * dx + dy * dy + dz * dz);
+ },
+ dot: function(v, y, z) {
+ if (arguments.length === 1) {
+ return (this.x * v.x + this.y * v.y + this.z * v.z);
+ }
+ return (this.x * v + this.y * y + this.z * z);
+ },
+ cross: function(v) {
+ var x = this.x,
+ y = this.y,
+ z = this.z;
+ return new PVector(y * v.z - v.y * z,
+ z * v.x - v.z * x,
+ x * v.y - v.x * y);
+ },
+ lerp: function(v_or_x, amt_or_y, z, amt) {
+ var lerp_val = function(start, stop, amt) {
+ return start + (stop - start) * amt;
+ };
+ var x, y;
+ if (arguments.length === 2) {
+ // given vector and amt
+ amt = amt_or_y;
+ x = v_or_x.x;
+ y = v_or_x.y;
+ z = v_or_x.z;
+ } else {
+ // given x, y, z and amt
+ x = v_or_x;
+ y = amt_or_y;
+ }
+ this.x = lerp_val(this.x, x, amt);
+ this.y = lerp_val(this.y, y, amt);
+ this.z = lerp_val(this.z, z, amt);
+ },
+ normalize: function() {
+ var m = this.mag();
+ if (m > 0) {
+ this.div(m);
+ }
+ },
+ limit: function(high) {
+ if (this.mag() > high) {
+ this.normalize();
+ this.mult(high);
+ }
+ },
+ heading: function() {
+ return (-Math.atan2(-this.y, this.x));
+ },
+ heading2D: function() {
+ return this.heading();
+ },
+ toString: function() {
+ return "[" + this.x + ", " + this.y + ", " + this.z + "]";
+ },
+ array: function() {
+ return [this.x, this.y, this.z];
+ }
+ };
+
+ function createPVectorMethod(method) {
+ return function(v1, v2) {
+ var v = v1.get();
+ v[method](v2);
+ return v;
+ };
+ }
+
+ for (var method in PVector.prototype) {
+ if (PVector.prototype.hasOwnProperty(method) && !PVector.hasOwnProperty(method)) {
+ PVector[method] = createPVectorMethod(method);
+ }
+ }
+
+ return PVector;
+};
+
+},{}],19:[function(require,module,exports){
+/**
+ * XMLAttribute is an attribute of a XML element.
+ *
+ * @param {String} fname the full name of the attribute
+ * @param {String} n the short name of the attribute
+ * @param {String} namespace the namespace URI of the attribute
+ * @param {String} v the value of the attribute
+ * @param {String }t the type of the attribute
+ *
+ * @see XMLElement
+ */
+module.exports = function() {
+
+ var XMLAttribute = function (fname, n, nameSpace, v, t){
+ this.fullName = fname || "";
+ this.name = n || "";
+ this.namespace = nameSpace || "";
+ this.value = v;
+ this.type = t;
+ };
+
+ XMLAttribute.prototype = {
+ /**
+ * @member XMLAttribute
+ * The getName() function returns the short name of the attribute
+ *
+ * @return {String} the short name of the attribute
+ */
+ getName: function() {
+ return this.name;
+ },
+ /**
+ * @member XMLAttribute
+ * The getFullName() function returns the full name of the attribute
+ *
+ * @return {String} the full name of the attribute
+ */
+ getFullName: function() {
+ return this.fullName;
+ },
+ /**
+ * @member XMLAttribute
+ * The getNamespace() function returns the namespace of the attribute
+ *
+ * @return {String} the namespace of the attribute
+ */
+ getNamespace: function() {
+ return this.namespace;
+ },
+ /**
+ * @member XMLAttribute
+ * The getValue() function returns the value of the attribute
+ *
+ * @return {String} the value of the attribute
+ */
+ getValue: function() {
+ return this.value;
+ },
+ /**
+ * @member XMLAttribute
+ * The getValue() function returns the type of the attribute
+ *
+ * @return {String} the type of the attribute
+ */
+ getType: function() {
+ return this.type;
+ },
+ /**
+ * @member XMLAttribute
+ * The setValue() function sets the value of the attribute
+ *
+ * @param {String} newval the new value
+ */
+ setValue: function(newval) {
+ this.value = newval;
+ }
+ };
+
+ return XMLAttribute;
+};
+
+},{}],20:[function(require,module,exports){
+/**
+ * XMLElement is a representation of an XML object. The object is able to parse XML code
+ *
+ * @param {PApplet} parent typically use "this"
+ * @param {String} filename name of the XML/SVG file to load
+ * @param {String} xml the xml/svg string
+ * @param {String} fullname the full name of the element
+ * @param {String} namespace the namespace of the URI
+ * @param {String} systemID the system ID of the XML data where the element starts
+ * @param {Integer }lineNr the line in the XML data where the element starts
+ */
+module.exports = function(options, undef) {
+
+ var Browser = options.Browser,
+ ajax = Browser.ajax,
+ window = Browser.window,
+ XMLHttpRequest = window.XMLHttpRequest,
+ DOMParser = window.DOMParser,
+ XMLAttribute = options. XMLAttribute;
+
+ var XMLElement = function(selector, uri, sysid, line) {
+ this.attributes = [];
+ this.children = [];
+ this.fullName = null;
+ this.name = null;
+ this.namespace = "";
+ this.content = null;
+ this.parent = null;
+ this.lineNr = "";
+ this.systemID = "";
+ this.type = "ELEMENT";
+
+ if (selector) {
+ if (typeof selector === "string") {
+ if (uri === undef && selector.indexOf("<") > -1) {
+ // load XML from text string
+ this.parse(selector);
+ } else {
+ // XMLElement(fullname, namespace, sysid, line) format
+ this.fullName = selector;
+ this.namespace = uri;
+ this.systemId = sysid;
+ this.lineNr = line;
+ }
+ } else {
+ // XMLElement(this, file uri) format
+ this.parse(uri, true);
+ }
+ }
+ };
+ /**
+ * XMLElement methods
+ * missing: enumerateAttributeNames(), enumerateChildren(),
+ * NOTE: parse does not work when a url is passed in
+ */
+ XMLElement.prototype = {
+ /**
+ * @member XMLElement
+ * The parse() function retrieves the file via ajax() and uses DOMParser()
+ * parseFromString method to make an XML document
+ * @addon
+ *
+ * @param {String} filename name of the XML/SVG file to load
+ *
+ * @throws ExceptionType Error loading document
+ *
+ * @see XMLElement#parseChildrenRecursive
+ */
+ parse: function(textstring, stringIsURI) {
+ var xmlDoc;
+ try {
+ if (stringIsURI) {
+ textstring = ajax(textstring);
+ }
+ xmlDoc = new DOMParser().parseFromString(textstring, "text/xml");
+ var elements = xmlDoc.documentElement;
+ if (elements) {
+ this.parseChildrenRecursive(null, elements);
+ } else {
+ throw ("Error loading document");
+ }
+ return this;
+ } catch(e) {
+ throw(e);
+ }
+ },
+ /**
+ * @member XMLElement
+ * Internal helper function for parse().
+ * Loops through the
+ * @addon
+ *
+ * @param {XMLElement} parent the parent node
+ * @param {XML document childNodes} elementpath the remaining nodes that need parsing
+ *
+ * @return {XMLElement} the new element and its children elements
+ */
+ parseChildrenRecursive: function (parent, elementpath){
+ var xmlelement,
+ xmlattribute,
+ tmpattrib,
+ l, m,
+ child;
+ if (!parent) { // this element is the root element
+ this.fullName = elementpath.localName;
+ this.name = elementpath.nodeName;
+ xmlelement = this;
+ } else { // this element has a parent
+ xmlelement = new XMLElement(elementpath.nodeName);
+ xmlelement.parent = parent;
+ }
+
+ // if this is a text node, return a PCData element (parsed character data)
+ if (elementpath.nodeType === 3 && elementpath.textContent !== "") {
+ return this.createPCDataElement(elementpath.textContent);
+ }
+
+ // if this is a CDATA node, return a CData element (unparsed character data)
+ if (elementpath.nodeType === 4) {
+ return this.createCDataElement(elementpath.textContent);
+ }
+
+ // bind all attributes, if there are any
+ if (elementpath.attributes) {
+ for (l = 0, m = elementpath.attributes.length; l < m; l++) {
+ tmpattrib = elementpath.attributes[l];
+ xmlattribute = new XMLAttribute(tmpattrib.getname,
+ tmpattrib.nodeName,
+ tmpattrib.namespaceURI,
+ tmpattrib.nodeValue,
+ tmpattrib.nodeType);
+ xmlelement.attributes.push(xmlattribute);
+ }
+ }
+
+ // bind all children, if there are any
+ if (elementpath.childNodes) {
+ for (l = 0, m = elementpath.childNodes.length; l < m; l++) {
+ var node = elementpath.childNodes[l];
+ child = xmlelement.parseChildrenRecursive(xmlelement, node);
+ if (child !== null) {
+ xmlelement.children.push(child);
+ }
+ }
+ }
+
+ return xmlelement;
+ },
+ /**
+ * @member XMLElement
+ * The createElement() function Creates an empty element
+ *
+ * @param {String} fullName the full name of the element
+ * @param {String} namespace the namespace URI
+ * @param {String} systemID the system ID of the XML data where the element starts
+ * @param {int} lineNr the line in the XML data where the element starts
+ */
+ createElement: function (fullname, namespaceuri, sysid, line) {
+ if (sysid === undef) {
+ return new XMLElement(fullname, namespaceuri);
+ }
+ return new XMLElement(fullname, namespaceuri, sysid, line);
+ },
+ /**
+ * @member XMLElement
+ * The createPCDataElement() function creates an element to be used for #PCDATA content.
+ * Because Processing discards whitespace TEXT nodes, this method will not build an element
+ * if the passed content is empty after trimming for whitespace.
+ *
+ * @return {XMLElement} new "pcdata" XMLElement, or null if content consists only of whitespace
+ */
+ createPCDataElement: function (content, isCDATA) {
+ if (content.replace(/^\s+$/g,"") === "") {
+ return null;
+ }
+ var pcdata = new XMLElement();
+ pcdata.type = "TEXT";
+ pcdata.content = content;
+ return pcdata;
+ },
+ /**
+ * @member XMLElement
+ * The createCDataElement() function creates an element to be used for CDATA content.
+ *
+ * @return {XMLElement} new "cdata" XMLElement, or null if content consists only of whitespace
+ */
+ createCDataElement: function (content) {
+ var cdata = this.createPCDataElement(content);
+ if (cdata === null) {
+ return null;
+ }
+
+ cdata.type = "CDATA";
+ var htmlentities = {"<": "&lt;", ">": "&gt;", "'": "&apos;", '"': "&quot;"},
+ entity;
+ for (entity in htmlentities) {
+ if (!Object.hasOwnProperty(htmlentities,entity)) {
+ content = content.replace(new RegExp(entity, "g"), htmlentities[entity]);
+ }
+ }
+ cdata.cdata = content;
+ return cdata;
+ },
+ /**
+ * @member XMLElement
+ * The hasAttribute() function returns whether an attribute exists
+ *
+ * @param {String} name name of the attribute
+ * @param {String} namespace the namespace URI of the attribute
+ *
+ * @return {boolean} true if the attribute exists
+ */
+ hasAttribute: function () {
+ if (arguments.length === 1) {
+ return this.getAttribute(arguments[0]) !== null;
+ }
+ if (arguments.length === 2) {
+ return this.getAttribute(arguments[0],arguments[1]) !== null;
+ }
+ },
+ /**
+ * @member XMLElement
+ * The equals() function checks to see if the XMLElement being passed in equals another XMLElement
+ *
+ * @param {XMLElement} rawElement the element to compare to
+ *
+ * @return {boolean} true if the element equals another element
+ */
+ equals: function(other) {
+ if (!(other instanceof XMLElement)) {
+ return false;
+ }
+ var i, j;
+ if (this.fullName !== other.fullName) { return false; }
+ if (this.attributes.length !== other.getAttributeCount()) { return false; }
+ // attributes may be ordered differently
+ if (this.attributes.length !== other.attributes.length) { return false; }
+ var attr_name, attr_ns, attr_value, attr_type, attr_other;
+ for (i = 0, j = this.attributes.length; i < j; i++) {
+ attr_name = this.attributes[i].getName();
+ attr_ns = this.attributes[i].getNamespace();
+ attr_other = other.findAttribute(attr_name, attr_ns);
+ if (attr_other === null) { return false; }
+ if (this.attributes[i].getValue() !== attr_other.getValue()) { return false; }
+ if (this.attributes[i].getType() !== attr_other.getType()) { return false; }
+ }
+ // children must be ordered identically
+ if (this.children.length !== other.getChildCount()) { return false; }
+ if (this.children.length>0) {
+ var child1, child2;
+ for (i = 0, j = this.children.length; i < j; i++) {
+ child1 = this.getChild(i);
+ child2 = other.getChild(i);
+ if (!child1.equals(child2)) { return false; }
+ }
+ return true;
+ }
+ return (this.content === other.content);
+ },
+ /**
+ * @member XMLElement
+ * The getContent() function returns the content of an element. If there is no such content, null is returned
+ *
+ * @return {String} the (possibly null) content
+ */
+ getContent: function(){
+ if (this.type === "TEXT" || this.type === "CDATA") {
+ return this.content;
+ }
+ var children = this.children;
+ if (children.length === 1 && (children[0].type === "TEXT" || children[0].type === "CDATA")) {
+ return children[0].content;
+ }
+ return null;
+ },
+ /**
+ * @member XMLElement
+ * The getAttribute() function returns the value of an attribute
+ *
+ * @param {String} name the non-null full name of the attribute
+ * @param {String} namespace the namespace URI, which may be null
+ * @param {String} defaultValue the default value of the attribute
+ *
+ * @return {String} the value, or defaultValue if the attribute does not exist
+ */
+ getAttribute: function (){
+ var attribute;
+ if (arguments.length === 2) {
+ attribute = this.findAttribute(arguments[0]);
+ if (attribute) {
+ return attribute.getValue();
+ }
+ return arguments[1];
+ } else if (arguments.length === 1) {
+ attribute = this.findAttribute(arguments[0]);
+ if (attribute) {
+ return attribute.getValue();
+ }
+ return null;
+ } else if (arguments.length === 3) {
+ attribute = this.findAttribute(arguments[0],arguments[1]);
+ if (attribute) {
+ return attribute.getValue();
+ }
+ return arguments[2];
+ }
+ },
+ /**
+ * @member XMLElement
+ * The getStringAttribute() function returns the string attribute of the element
+ * If the <b>defaultValue</b> parameter is used and the attribute doesn't exist, the <b>defaultValue</b> value is returned.
+ * When calling the function without the <b>defaultValue</b> parameter, if the attribute doesn't exist, the value 0 is returned.
+ *
+ * @param name the name of the attribute
+ * @param defaultValue value returned if the attribute is not found
+ *
+ * @return {String} the value, or defaultValue if the attribute does not exist
+ */
+ getStringAttribute: function() {
+ if (arguments.length === 1) {
+ return this.getAttribute(arguments[0]);
+ }
+ if (arguments.length === 2) {
+ return this.getAttribute(arguments[0], arguments[1]);
+ }
+ return this.getAttribute(arguments[0], arguments[1],arguments[2]);
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic String
+ * attribute getter. This may only take one argument.
+ */
+ getString: function(attributeName) {
+ return this.getStringAttribute(attributeName);
+ },
+ /**
+ * @member XMLElement
+ * The getFloatAttribute() function returns the float attribute of the element.
+ * If the <b>defaultValue</b> parameter is used and the attribute doesn't exist, the <b>defaultValue</b> value is returned.
+ * When calling the function without the <b>defaultValue</b> parameter, if the attribute doesn't exist, the value 0 is returned.
+ *
+ * @param name the name of the attribute
+ * @param defaultValue value returned if the attribute is not found
+ *
+ * @return {float} the value, or defaultValue if the attribute does not exist
+ */
+ getFloatAttribute: function() {
+ if (arguments.length === 1 ) {
+ return parseFloat(this.getAttribute(arguments[0], 0));
+ }
+ if (arguments.length === 2 ) {
+ return this.getAttribute(arguments[0], arguments[1]);
+ }
+ return this.getAttribute(arguments[0], arguments[1],arguments[2]);
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic float
+ * attribute getter. This may only take one argument.
+ */
+ getFloat: function(attributeName) {
+ return this.getFloatAttribute(attributeName);
+ },
+ /**
+ * @member XMLElement
+ * The getIntAttribute() function returns the integer attribute of the element.
+ * If the <b>defaultValue</b> parameter is used and the attribute doesn't exist, the <b>defaultValue</b> value is returned.
+ * When calling the function without the <b>defaultValue</b> parameter, if the attribute doesn't exist, the value 0 is returned.
+ *
+ * @param name the name of the attribute
+ * @param defaultValue value returned if the attribute is not found
+ *
+ * @return {int} the value, or defaultValue if the attribute does not exist
+ */
+ getIntAttribute: function () {
+ if (arguments.length === 1) {
+ return this.getAttribute( arguments[0], 0 );
+ }
+ if (arguments.length === 2) {
+ return this.getAttribute(arguments[0], arguments[1]);
+ }
+ return this.getAttribute(arguments[0], arguments[1],arguments[2]);
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic int
+ * attribute getter. This may only take one argument.
+ */
+ getInt: function(attributeName) {
+ return this.getIntAttribute(attributeName);
+ },
+ /**
+ * @member XMLElement
+ * The hasChildren() function returns whether the element has children.
+ *
+ * @return {boolean} true if the element has children.
+ */
+ hasChildren: function () {
+ return this.children.length > 0 ;
+ },
+ /**
+ * @member XMLElement
+ * The addChild() function adds a child element
+ *
+ * @param {XMLElement} child the non-null child to add.
+ */
+ addChild: function (child) {
+ if (child !== null) {
+ child.parent = this;
+ this.children.push(child);
+ }
+ },
+ /**
+ * @member XMLElement
+ * The insertChild() function inserts a child element at the index provided
+ *
+ * @param {XMLElement} child the non-null child to add.
+ * @param {int} index where to put the child.
+ */
+ insertChild: function (child, index) {
+ if (child) {
+ if ((child.getLocalName() === null) && (! this.hasChildren())) {
+ var lastChild = this.children[this.children.length -1];
+ if (lastChild.getLocalName() === null) {
+ lastChild.setContent(lastChild.getContent() + child.getContent());
+ return;
+ }
+ }
+ child.parent = this;
+ this.children.splice(index,0,child);
+ }
+ },
+ /**
+ * @member XMLElement
+ * The getChild() returns the child XMLElement as specified by the <b>index</b> parameter.
+ * The value of the <b>index</b> parameter must be less than the total number of children to avoid going out of the array storing the child elements.
+ * When the <b>path</b> parameter is specified, then it will return all children that match that path. The path is a series of elements and sub-elements, separated by slashes.
+ *
+ * @param {int} index where to put the child.
+ * @param {String} path path to a particular element
+ *
+ * @return {XMLElement} the element
+ */
+ getChild: function (selector) {
+ if (typeof selector === "number") {
+ return this.children[selector];
+ }
+ if (selector.indexOf('/') !== -1) {
+ // path traversal is required
+ return this.getChildRecursive(selector.split("/"), 0);
+ }
+ var kid, kidName;
+ for (var i = 0, j = this.getChildCount(); i < j; i++) {
+ kid = this.getChild(i);
+ kidName = kid.getName();
+ if (kidName !== null && kidName === selector) {
+ return kid;
+ }
+ }
+ return null;
+ },
+ /**
+ * @member XMLElement
+ * The getChildren() returns all of the children as an XMLElement array.
+ * When the <b>path</b> parameter is specified, then it will return all children that match that path.
+ * The path is a series of elements and sub-elements, separated by slashes.
+ *
+ * @param {String} path element name or path/to/element
+ *
+ * @return {XMLElement} array of child elements that match
+ *
+ * @see XMLElement#getChildCount()
+ * @see XMLElement#getChild()
+ */
+ getChildren: function(){
+ if (arguments.length === 1) {
+ if (typeof arguments[0] === "number") {
+ return this.getChild( arguments[0]);
+ }
+ if (arguments[0].indexOf('/') !== -1) { // path was given
+ return this.getChildrenRecursive( arguments[0].split("/"), 0);
+ }
+ var matches = [];
+ var kid, kidName;
+ for (var i = 0, j = this.getChildCount(); i < j; i++) {
+ kid = this.getChild(i);
+ kidName = kid.getName();
+ if (kidName !== null && kidName === arguments[0]) {
+ matches.push(kid);
+ }
+ }
+ return matches;
+ }
+ return this.children;
+ },
+ /**
+ * @member XMLElement
+ * The getChildCount() returns the number of children for the element.
+ *
+ * @return {int} the count
+ *
+ * @see XMLElement#getChild()
+ * @see XMLElement#getChildren()
+ */
+ getChildCount: function() {
+ return this.children.length;
+ },
+ /**
+ * @member XMLElement
+ * Internal helper function for getChild().
+ *
+ * @param {String[]} items result of splitting the query on slashes
+ * @param {int} offset where in the items[] array we're currently looking
+ *
+ * @return {XMLElement} matching element or null if no match
+ */
+ getChildRecursive: function (items, offset) {
+ // terminating clause: we are the requested candidate
+ if (offset === items.length) {
+ return this;
+ }
+ // continuation clause
+ var kid, kidName, matchName = items[offset];
+ for(var i = 0, j = this.getChildCount(); i < j; i++) {
+ kid = this.getChild(i);
+ kidName = kid.getName();
+ if (kidName !== null && kidName === matchName) {
+ return kid.getChildRecursive(items, offset+1);
+ }
+ }
+ return null;
+ },
+ /**
+ * @member XMLElement
+ * Internal helper function for getChildren().
+ *
+ * @param {String[]} items result of splitting the query on slashes
+ * @param {int} offset where in the items[] array we're currently looking
+ *
+ * @return {XMLElement[]} matching elements or empty array if no match
+ */
+ getChildrenRecursive: function (items, offset) {
+ if (offset === items.length-1) {
+ return this.getChildren(items[offset]);
+ }
+ var matches = this.getChildren(items[offset]);
+ var kidMatches = [];
+ for (var i = 0; i < matches.length; i++) {
+ kidMatches = kidMatches.concat(matches[i].getChildrenRecursive(items, offset+1));
+ }
+ return kidMatches;
+ },
+ /**
+ * @member XMLElement
+ * The isLeaf() function returns whether the element is a leaf element.
+ *
+ * @return {boolean} true if the element has no children.
+ */
+ isLeaf: function() {
+ return !this.hasChildren();
+ },
+ /**
+ * @member XMLElement
+ * The listChildren() function put the names of all children into an array. Same as looping through
+ * each child and calling getName() on each XMLElement.
+ *
+ * @return {String[]} a list of element names.
+ */
+ listChildren: function() {
+ var arr = [];
+ for (var i = 0, j = this.children.length; i < j; i++) {
+ arr.push( this.getChild(i).getName());
+ }
+ return arr;
+ },
+ /**
+ * @member XMLElement
+ * The removeAttribute() function removes an attribute
+ *
+ * @param {String} name the non-null name of the attribute.
+ * @param {String} namespace the namespace URI of the attribute, which may be null.
+ */
+ removeAttribute: function (name , namespace) {
+ this.namespace = namespace || "";
+ for (var i = 0, j = this.attributes.length; i < j; i++) {
+ if (this.attributes[i].getName() === name && this.attributes[i].getNamespace() === this.namespace) {
+ this.attributes.splice(i, 1);
+ break;
+ }
+ }
+ },
+ /**
+ * @member XMLElement
+ * The removeChild() removes a child element.
+ *
+ * @param {XMLElement} child the the non-null child to be renoved
+ */
+ removeChild: function(child) {
+ if (child) {
+ for (var i = 0, j = this.children.length; i < j; i++) {
+ if (this.children[i].equals(child)) {
+ this.children.splice(i, 1);
+ break;
+ }
+ }
+ }
+ },
+ /**
+ * @member XMLElement
+ * The removeChildAtIndex() removes the child located at a certain index
+ *
+ * @param {int} index the index of the child, where the first child has index 0
+ */
+ removeChildAtIndex: function(index) {
+ if (this.children.length > index) { //make sure its not outofbounds
+ this.children.splice(index, 1);
+ }
+ },
+ /**
+ * @member XMLElement
+ * The findAttribute() function searches an attribute
+ *
+ * @param {String} name fullName the non-null full name of the attribute
+ * @param {String} namespace the name space, which may be null
+ *
+ * @return {XMLAttribute} the attribute, or null if the attribute does not exist.
+ */
+ findAttribute: function (name, namespace) {
+ this.namespace = namespace || "";
+ for (var i = 0, j = this.attributes.length; i < j; i++) {
+ if (this.attributes[i].getName() === name && this.attributes[i].getNamespace() === this.namespace) {
+ return this.attributes[i];
+ }
+ }
+ return null;
+ },
+ /**
+ * @member XMLElement
+ * The setAttribute() function sets an attribute.
+ *
+ * @param {String} name the non-null full name of the attribute
+ * @param {String} namespace the non-null value of the attribute
+ */
+ setAttribute: function() {
+ var attr;
+ if (arguments.length === 3) {
+ var index = arguments[0].indexOf(':');
+ var name = arguments[0].substring(index + 1);
+ attr = this.findAttribute(name, arguments[1]);
+ if (attr) {
+ attr.setValue(arguments[2]);
+ } else {
+ attr = new XMLAttribute(arguments[0], name, arguments[1], arguments[2], "CDATA");
+ this.attributes.push(attr);
+ }
+ } else {
+ attr = this.findAttribute(arguments[0]);
+ if (attr) {
+ attr.setValue(arguments[1]);
+ } else {
+ attr = new XMLAttribute(arguments[0], arguments[0], null, arguments[1], "CDATA");
+ this.attributes.push(attr);
+ }
+ }
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic String
+ * attribute setter. This must take two arguments.
+ */
+ setString: function(attribute, value) {
+ this.setAttribute(attribute, value);
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic int
+ * attribute setter. This must take two arguments.
+ */
+ setInt: function(attribute, value) {
+ this.setAttribute(attribute, value);
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic float
+ * attribute setter. This must take two arguments.
+ */
+ setFloat: function(attribute, value) {
+ this.setAttribute(attribute, value);
+ },
+ /**
+ * @member XMLElement
+ * The setContent() function sets the #PCDATA content. It is an error to call this method with a
+ * non-null value if there are child objects.
+ *
+ * @param {String} content the (possibly null) content
+ */
+ setContent: function(content) {
+ if (this.children.length > 0) {
+ Processing.debug("Tried to set content for XMLElement with children"); }
+ this.content = content;
+ },
+ /**
+ * @member XMLElement
+ * The setName() function sets the full name. This method also sets the short name and clears the
+ * namespace URI.
+ *
+ * @param {String} name the non-null name
+ * @param {String} namespace the namespace URI, which may be null.
+ */
+ setName: function() {
+ if (arguments.length === 1) {
+ this.name = arguments[0];
+ this.fullName = arguments[0];
+ this.namespace = null;
+ } else {
+ var index = arguments[0].indexOf(':');
+ if ((arguments[1] === null) || (index < 0)) {
+ this.name = arguments[0];
+ } else {
+ this.name = arguments[0].substring(index + 1);
+ }
+ this.fullName = arguments[0];
+ this.namespace = arguments[1];
+ }
+ },
+ /**
+ * @member XMLElement
+ * The getName() function returns the full name (i.e. the name including an eventual namespace
+ * prefix) of the element.
+ *
+ * @return {String} the name, or null if the element only contains #PCDATA.
+ */
+ getName: function() {
+ return this.fullName;
+ },
+ /**
+ * @member XMLElement
+ * The getLocalName() function returns the local name (i.e. the name excluding an eventual namespace
+ * prefix) of the element.
+ *
+ * @return {String} the name, or null if the element only contains #PCDATA.
+ */
+ getLocalName: function() {
+ return this.name;
+ },
+ /**
+ * @member XMLElement
+ * The getAttributeCount() function returns the number of attributes for the node
+ * that this XMLElement represents.
+ *
+ * @return {int} the number of attributes in this XMLElement
+ */
+ getAttributeCount: function() {
+ return this.attributes.length;
+ },
+ /**
+ * @member XMLElement
+ * The toString() function returns the XML definition of an XMLElement.
+ *
+ * @return {String} the XML definition of this XMLElement
+ */
+ toString: function() {
+ // shortcut for text and cdata nodes
+ if (this.type === "TEXT") {
+ return this.content || "";
+ }
+
+ if (this.type === "CDATA") {
+ return this.cdata || "";
+ }
+
+ // real XMLElements
+ var tagstring = this.fullName;
+ var xmlstring = "<" + tagstring;
+ var a,c;
+
+ // serialize the attributes to XML string
+ for (a = 0; a<this.attributes.length; a++) {
+ var attr = this.attributes[a];
+ xmlstring += " " + attr.getName() + "=" + '"' + attr.getValue() + '"';
+ }
+
+ // serialize all children to XML string
+ if (this.children.length === 0) {
+ if (this.content === "" || this.content === null || this.content === undefined) {
+ xmlstring += "/>";
+ } else {
+ xmlstring += ">" + this.content + "</"+tagstring+">";
+ }
+ } else {
+ xmlstring += ">";
+ for (c = 0; c<this.children.length; c++) {
+ xmlstring += this.children[c].toString();
+ }
+ xmlstring += "</" + tagstring + ">";
+ }
+ return xmlstring;
+ }
+ };
+
+ /**
+ * static Processing 1.5 XML API wrapper for the
+ * parse method. This may only take one argument.
+ */
+ XMLElement.parse = function(xmlstring) {
+ var element = new XMLElement();
+ element.parse(xmlstring);
+ return element;
+ };
+
+ return XMLElement;
+};
+
+},{}],21:[function(require,module,exports){
+/**
+ * web colors, by name
+ */
+module.exports = {
+ aliceblue: "#f0f8ff",
+ antiquewhite: "#faebd7",
+ aqua: "#00ffff",
+ aquamarine: "#7fffd4",
+ azure: "#f0ffff",
+ beige: "#f5f5dc",
+ bisque: "#ffe4c4",
+ black: "#000000",
+ blanchedalmond: "#ffebcd",
+ blue: "#0000ff",
+ blueviolet: "#8a2be2",
+ brown: "#a52a2a",
+ burlywood: "#deb887",
+ cadetblue: "#5f9ea0",
+ chartreuse: "#7fff00",
+ chocolate: "#d2691e",
+ coral: "#ff7f50",
+ cornflowerblue: "#6495ed",
+ cornsilk: "#fff8dc",
+ crimson: "#dc143c",
+ cyan: "#00ffff",
+ darkblue: "#00008b",
+ darkcyan: "#008b8b",
+ darkgoldenrod: "#b8860b",
+ darkgray: "#a9a9a9",
+ darkgreen: "#006400",
+ darkkhaki: "#bdb76b",
+ darkmagenta: "#8b008b",
+ darkolivegreen: "#556b2f",
+ darkorange: "#ff8c00",
+ darkorchid: "#9932cc",
+ darkred: "#8b0000",
+ darksalmon: "#e9967a",
+ darkseagreen: "#8fbc8f",
+ darkslateblue: "#483d8b",
+ darkslategray: "#2f4f4f",
+ darkturquoise: "#00ced1",
+ darkviolet: "#9400d3",
+ deeppink: "#ff1493",
+ deepskyblue: "#00bfff",
+ dimgray: "#696969",
+ dodgerblue: "#1e90ff",
+ firebrick: "#b22222",
+ floralwhite: "#fffaf0",
+ forestgreen: "#228b22",
+ fuchsia: "#ff00ff",
+ gainsboro: "#dcdcdc",
+ ghostwhite: "#f8f8ff",
+ gold: "#ffd700",
+ goldenrod: "#daa520",
+ gray: "#808080",
+ green: "#008000",
+ greenyellow: "#adff2f",
+ honeydew: "#f0fff0",
+ hotpink: "#ff69b4",
+ indianred: "#cd5c5c",
+ indigo: "#4b0082",
+ ivory: "#fffff0",
+ khaki: "#f0e68c",
+ lavender: "#e6e6fa",
+ lavenderblush: "#fff0f5",
+ lawngreen: "#7cfc00",
+ lemonchiffon: "#fffacd",
+ lightblue: "#add8e6",
+ lightcoral: "#f08080",
+ lightcyan: "#e0ffff",
+ lightgoldenrodyellow: "#fafad2",
+ lightgrey: "#d3d3d3",
+ lightgreen: "#90ee90",
+ lightpink: "#ffb6c1",
+ lightsalmon: "#ffa07a",
+ lightseagreen: "#20b2aa",
+ lightskyblue: "#87cefa",
+ lightslategray: "#778899",
+ lightsteelblue: "#b0c4de",
+ lightyellow: "#ffffe0",
+ lime: "#00ff00",
+ limegreen: "#32cd32",
+ linen: "#faf0e6",
+ magenta: "#ff00ff",
+ maroon: "#800000",
+ mediumaquamarine: "#66cdaa",
+ mediumblue: "#0000cd",
+ mediumorchid: "#ba55d3",
+ mediumpurple: "#9370d8",
+ mediumseagreen: "#3cb371",
+ mediumslateblue: "#7b68ee",
+ mediumspringgreen: "#00fa9a",
+ mediumturquoise: "#48d1cc",
+ mediumvioletred: "#c71585",
+ midnightblue: "#191970",
+ mintcream: "#f5fffa",
+ mistyrose: "#ffe4e1",
+ moccasin: "#ffe4b5",
+ navajowhite: "#ffdead",
+ navy: "#000080",
+ oldlace: "#fdf5e6",
+ olive: "#808000",
+ olivedrab: "#6b8e23",
+ orange: "#ffa500",
+ orangered: "#ff4500",
+ orchid: "#da70d6",
+ palegoldenrod: "#eee8aa",
+ palegreen: "#98fb98",
+ paleturquoise: "#afeeee",
+ palevioletred: "#d87093",
+ papayawhip: "#ffefd5",
+ peachpuff: "#ffdab9",
+ peru: "#cd853f",
+ pink: "#ffc0cb",
+ plum: "#dda0dd",
+ powderblue: "#b0e0e6",
+ purple: "#800080",
+ red: "#ff0000",
+ rosybrown: "#bc8f8f",
+ royalblue: "#4169e1",
+ saddlebrown: "#8b4513",
+ salmon: "#fa8072",
+ sandybrown: "#f4a460",
+ seagreen: "#2e8b57",
+ seashell: "#fff5ee",
+ sienna: "#a0522d",
+ silver: "#c0c0c0",
+ skyblue: "#87ceeb",
+ slateblue: "#6a5acd",
+ slategray: "#708090",
+ snow: "#fffafa",
+ springgreen: "#00ff7f",
+ steelblue: "#4682b4",
+ tan: "#d2b48c",
+ teal: "#008080",
+ thistle: "#d8bfd8",
+ tomato: "#ff6347",
+ turquoise: "#40e0d0",
+ violet: "#ee82ee",
+ wheat: "#f5deb3",
+ white: "#ffffff",
+ whitesmoke: "#f5f5f5",
+ yellow: "#ffff00",
+ yellowgreen: "#9acd32"
+ };
+
+},{}],22:[function(require,module,exports){
+module.exports = function(virtHashCode, virtEquals, undef) {
+
+ return function withProxyFunctions(p, removeFirstArgument) {
+ /**
+ * The contains(string) function returns true if the string passed in the parameter
+ * is a substring of this string. It returns false if the string passed
+ * in the parameter is not a substring of this string.
+ *
+ * @param {String} The string to look for in the current string
+ *
+ * @return {boolean} returns true if this string contains
+ * the string passed as parameter. returns false, otherwise.
+ *
+ */
+ p.__contains = function (subject, subStr) {
+ if (typeof subject !== "string") {
+ return subject.contains.apply(subject, removeFirstArgument(arguments));
+ }
+ //Parameter is not null AND
+ //The type of the parameter is the same as this object (string)
+ //The javascript function that finds a substring returns 0 or higher
+ return (
+ (subject !== null) &&
+ (subStr !== null) &&
+ (typeof subStr === "string") &&
+ (subject.indexOf(subStr) > -1)
+ );
+ };
+
+ /**
+ * The __replaceAll() function searches all matches between a substring (or regular expression) and a string,
+ * and replaces the matched substring with a new substring
+ *
+ * @param {String} subject a substring
+ * @param {String} regex a substring or a regular expression
+ * @param {String} replace the string to replace the found value
+ *
+ * @return {String} returns result
+ *
+ * @see #match
+ */
+ p.__replaceAll = function(subject, regex, replacement) {
+ if (typeof subject !== "string") {
+ return subject.replaceAll.apply(subject, removeFirstArgument(arguments));
+ }
+
+ return subject.replace(new RegExp(regex, "g"), replacement);
+ };
+
+ /**
+ * The __replaceFirst() function searches first matche between a substring (or regular expression) and a string,
+ * and replaces the matched substring with a new substring
+ *
+ * @param {String} subject a substring
+ * @param {String} regex a substring or a regular expression
+ * @param {String} replace the string to replace the found value
+ *
+ * @return {String} returns result
+ *
+ * @see #match
+ */
+ p.__replaceFirst = function(subject, regex, replacement) {
+ if (typeof subject !== "string") {
+ return subject.replaceFirst.apply(subject, removeFirstArgument(arguments));
+ }
+
+ return subject.replace(new RegExp(regex, ""), replacement);
+ };
+
+ /**
+ * The __replace() function searches all matches between a substring and a string,
+ * and replaces the matched substring with a new substring
+ *
+ * @param {String} subject a substring
+ * @param {String} what a substring to find
+ * @param {String} replacement the string to replace the found value
+ *
+ * @return {String} returns result
+ */
+ p.__replace = function(subject, what, replacement) {
+ if (typeof subject !== "string") {
+ return subject.replace.apply(subject, removeFirstArgument(arguments));
+ }
+ if (what instanceof RegExp) {
+ return subject.replace(what, replacement);
+ }
+
+ if (typeof what !== "string") {
+ what = what.toString();
+ }
+ if (what === "") {
+ return subject;
+ }
+
+ var i = subject.indexOf(what);
+ if (i < 0) {
+ return subject;
+ }
+
+ var j = 0, result = "";
+ do {
+ result += subject.substring(j, i) + replacement;
+ j = i + what.length;
+ } while ( (i = subject.indexOf(what, j)) >= 0);
+ return result + subject.substring(j);
+ };
+
+ /**
+ * The __equals() function compares two strings (or objects) to see if they are the same.
+ * This method is necessary because it's not possible to compare strings using the equality operator (==).
+ * Returns true if the strings are the same and false if they are not.
+ *
+ * @param {String} subject a string used for comparison
+ * @param {String} other a string used for comparison with
+ *
+ * @return {boolean} true is the strings are the same false otherwise
+ */
+ p.__equals = function(subject, other) {
+ if (subject.equals instanceof Function) {
+ return subject.equals.apply(subject, removeFirstArgument(arguments));
+ }
+
+ return virtEquals(subject, other);
+ };
+
+ /**
+ * The __equalsIgnoreCase() function compares two strings to see if they are the same.
+ * Returns true if the strings are the same, either when forced to all lower case or
+ * all upper case.
+ *
+ * @param {String} subject a string used for comparison
+ * @param {String} other a string used for comparison with
+ *
+ * @return {boolean} true is the strings are the same, ignoring case. false otherwise
+ */
+ p.__equalsIgnoreCase = function(subject, other) {
+ if (typeof subject !== "string") {
+ return subject.equalsIgnoreCase.apply(subject, removeFirstArgument(arguments));
+ }
+
+ return subject.toLowerCase() === other.toLowerCase();
+ };
+
+ /**
+ * The __toCharArray() function splits the string into a char array.
+ *
+ * @param {String} subject The string
+ *
+ * @return {Char[]} a char array
+ */
+ p.__toCharArray = function(subject) {
+ if (typeof subject !== "string") {
+ return subject.toCharArray.apply(subject, removeFirstArgument(arguments));
+ }
+
+ var chars = [];
+ for (var i = 0, len = subject.length; i < len; ++i) {
+ chars[i] = new Char(subject.charAt(i));
+ }
+ return chars;
+ };
+
+ /**
+ * The __split() function splits a string using the regex delimiter
+ * specified. If limit is specified, the resultant array will have number
+ * of elements equal to or less than the limit.
+ *
+ * @param {String} subject string to be split
+ * @param {String} regexp regex string used to split the subject
+ * @param {int} limit max number of tokens to be returned
+ *
+ * @return {String[]} an array of tokens from the split string
+ */
+ p.__split = function(subject, regex, limit) {
+ if (typeof subject !== "string") {
+ return subject.split.apply(subject, removeFirstArgument(arguments));
+ }
+
+ var pattern = new RegExp(regex);
+
+ // If limit is not specified, use JavaScript's built-in String.split.
+ if ((limit === undef) || (limit < 1)) {
+ return subject.split(pattern);
+ }
+
+ // If limit is specified, JavaScript's built-in String.split has a
+ // different behaviour than Java's. A Java-compatible implementation is
+ // provided here.
+ var result = [], currSubject = subject, pos;
+ while (((pos = currSubject.search(pattern)) !== -1) && (result.length < (limit - 1))) {
+ var match = pattern.exec(currSubject).toString();
+ result.push(currSubject.substring(0, pos));
+ currSubject = currSubject.substring(pos + match.length);
+ }
+ if ((pos !== -1) || (currSubject !== "")) {
+ result.push(currSubject);
+ }
+ return result;
+ };
+
+ /**
+ * The codePointAt() function returns the unicode value of the character at a given index of a string.
+ *
+ * @param {int} idx the index of the character
+ *
+ * @return {String} code the String containing the unicode value of the character
+ */
+ p.__codePointAt = function(subject, idx) {
+ var code = subject.charCodeAt(idx),
+ hi,
+ low;
+ if (0xD800 <= code && code <= 0xDBFF) {
+ hi = code;
+ low = subject.charCodeAt(idx + 1);
+ return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
+ }
+ return code;
+ };
+
+ /**
+ * The matches() function checks whether or not a string matches a given regular expression.
+ *
+ * @param {String} str the String on which the match is tested
+ * @param {String} regexp the regexp for which a match is tested
+ *
+ * @return {boolean} true if the string fits the regexp, false otherwise
+ */
+ p.__matches = function(str, regexp) {
+ return (new RegExp(regexp)).test(str);
+ };
+
+ /**
+ * The startsWith() function tests if a string starts with the specified prefix. If the prefix
+ * is the empty String or equal to the subject String, startsWith() will also return true.
+ *
+ * @param {String} prefix the String used to compare against the start of the subject String.
+ * @param {int} toffset (optional) an offset into the subject String where searching should begin.
+ *
+ * @return {boolean} true if the subject String starts with the prefix.
+ */
+ p.__startsWith = function(subject, prefix, toffset) {
+ if (typeof subject !== "string") {
+ return subject.startsWith.apply(subject, removeFirstArgument(arguments));
+ }
+
+ toffset = toffset || 0;
+ if (toffset < 0 || toffset > subject.length) {
+ return false;
+ }
+ return (prefix === '' || prefix === subject) ? true : (subject.indexOf(prefix) === toffset);
+ };
+
+ /**
+ * The endsWith() function tests if a string ends with the specified suffix. If the suffix
+ * is the empty String, endsWith() will also return true.
+ *
+ * @param {String} suffix the String used to compare against the end of the subject String.
+ *
+ * @return {boolean} true if the subject String starts with the prefix.
+ */
+ p.__endsWith = function(subject, suffix) {
+ if (typeof subject !== "string") {
+ return subject.endsWith.apply(subject, removeFirstArgument(arguments));
+ }
+
+ var suffixLen = suffix ? suffix.length : 0;
+ return (suffix === '' || suffix === subject) ? true :
+ (subject.indexOf(suffix) === subject.length - suffixLen);
+ };
+
+ /**
+ * The returns hash code of the.
+ *
+ * @param {Object} subject The string
+ *
+ * @return {int} a hash code
+ */
+ p.__hashCode = function(subject) {
+ if (subject.hashCode instanceof Function) {
+ return subject.hashCode.apply(subject, removeFirstArgument(arguments));
+ }
+ return virtHashCode(subject);
+ };
+
+ /**
+ * The __printStackTrace() prints stack trace to the console.
+ *
+ * @param {Exception} subject The error
+ */
+ p.__printStackTrace = function(subject) {
+ p.println("Exception: " + subject.toString() );
+ };
+ };
+
+};
+
+},{}],23:[function(require,module,exports){
+/**
+ * For many "math" functions, we can delegate
+ * to the Math object. For others, we can't.
+ */
+module.exports = function withMath(p, undef) {
+ var internalRandomGenerator = function() { return Math.random(); };
+
+ /**
+ * Calculates the absolute value (magnitude) of a number. The absolute value of a number is always positive.
+ *
+ * @param {int|float} value int or float
+ *
+ * @returns {int|float}
+ */
+ p.abs = Math.abs;
+
+ /**
+ * Calculates the closest int value that is greater than or equal to the value of the parameter.
+ * For example, ceil(9.03) returns the value 10.
+ *
+ * @param {float} value float
+ *
+ * @returns {int}
+ *
+ * @see floor
+ * @see round
+ */
+ p.ceil = Math.ceil;
+
+ /**
+ * Returns Euler's number e (2.71828...) raised to the power of the value parameter.
+ *
+ * @param {int|float} value int or float: the exponent to raise e to
+ *
+ * @returns {float}
+ */
+ p.exp = Math.exp;
+
+ /**
+ * Calculates the closest int value that is less than or equal to the value of the parameter.
+ *
+ * @param {int|float} value the value to floor
+ *
+ * @returns {int|float}
+ *
+ * @see ceil
+ * @see round
+ */
+ p.floor = Math.floor;
+
+ /**
+ * Calculates the natural logarithm (the base-e logarithm) of a number. This function
+ * expects the values greater than 0.0.
+ *
+ * @param {int|float} value int or float: number must be greater then 0.0
+ *
+ * @returns {float}
+ */
+ p.log = Math.log;
+
+ /**
+ * Facilitates exponential expressions. The pow() function is an efficient way of
+ * multiplying numbers by themselves (or their reciprocal) in large quantities.
+ * For example, pow(3, 5) is equivalent to the expression 3*3*3*3*3 and pow(3, -5)
+ * is equivalent to 1 / 3*3*3*3*3.
+ *
+ * @param {int|float} num base of the exponential expression
+ * @param {int|float} exponent power of which to raise the base
+ *
+ * @returns {float}
+ *
+ * @see sqrt
+ */
+ p.pow = Math.pow;
+
+ /**
+ * Calculates the integer closest to the value parameter. For example, round(9.2) returns the value 9.
+ *
+ * @param {float} value number to round
+ *
+ * @returns {int}
+ *
+ * @see floor
+ * @see ceil
+ */
+ p.round = Math.round;
+ /**
+ * Calculates the square root of a number. The square root of a number is always positive,
+ * even though there may be a valid negative root. The square root s of number a is such
+ * that s*s = a. It is the opposite of squaring.
+ *
+ * @param {float} value int or float, non negative
+ *
+ * @returns {float}
+ *
+ * @see pow
+ * @see sq
+ */
+
+ p.sqrt = Math.sqrt;
+
+ // Trigonometry
+ /**
+ * The inverse of cos(), returns the arc cosine of a value. This function expects the
+ * values in the range of -1 to 1 and values are returned in the range 0 to PI (3.1415927).
+ *
+ * @param {float} value the value whose arc cosine is to be returned
+ *
+ * @returns {float}
+ *
+ * @see cos
+ * @see asin
+ * @see atan
+ */
+ p.acos = Math.acos;
+
+ /**
+ * The inverse of sin(), returns the arc sine of a value. This function expects the values
+ * in the range of -1 to 1 and values are returned in the range -PI/2 to PI/2.
+ *
+ * @param {float} value the value whose arc sine is to be returned
+ *
+ * @returns {float}
+ *
+ * @see sin
+ * @see acos
+ * @see atan
+ */
+ p.asin = Math.asin;
+
+ /**
+ * The inverse of tan(), returns the arc tangent of a value. This function expects the values
+ * in the range of -Infinity to Infinity (exclusive) and values are returned in the range -PI/2 to PI/2 .
+ *
+ * @param {float} value -Infinity to Infinity (exclusive)
+ *
+ * @returns {float}
+ *
+ * @see tan
+ * @see asin
+ * @see acos
+ */
+ p.atan = Math.atan;
+
+ /**
+ * Calculates the angle (in radians) from a specified point to the coordinate origin as measured from
+ * the positive x-axis. Values are returned as a float in the range from PI to -PI. The atan2() function
+ * is most often used for orienting geometry to the position of the cursor. Note: The y-coordinate of the
+ * point is the first parameter and the x-coordinate is the second due the the structure of calculating the tangent.
+ *
+ * @param {float} y y-coordinate of the point
+ * @param {float} x x-coordinate of the point
+ *
+ * @returns {float}
+ *
+ * @see tan
+ */
+ p.atan2 = Math.atan2;
+
+ /**
+ * Calculates the cosine of an angle. This function expects the values of the angle parameter to be provided
+ * in radians (values from 0 to PI*2). Values are returned in the range -1 to 1.
+ *
+ * @param {float} value an angle in radians
+ *
+ * @returns {float}
+ *
+ * @see tan
+ * @see sin
+ */
+ p.cos = Math.cos;
+
+ /**
+ * Calculates the sine of an angle. This function expects the values of the angle parameter to be provided in
+ * radians (values from 0 to 6.28). Values are returned in the range -1 to 1.
+ *
+ * @param {float} value an angle in radians
+ *
+ * @returns {float}
+ *
+ * @see cos
+ * @see radians
+ */
+ p.sin = Math.sin;
+
+ /**
+ * Calculates the ratio of the sine and cosine of an angle. This function expects the values of the angle
+ * parameter to be provided in radians (values from 0 to PI*2). Values are returned in the range infinity to -infinity.
+ *
+ * @param {float} value an angle in radians
+ *
+ * @returns {float}
+ *
+ * @see cos
+ * @see sin
+ * @see radians
+ */
+ p.tan = Math.tan;
+
+ /**
+ * Constrains a value to not exceed a maximum and minimum value.
+ *
+ * @param {int|float} value the value to constrain
+ * @param {int|float} value minimum limit
+ * @param {int|float} value maximum limit
+ *
+ * @returns {int|float}
+ *
+ * @see max
+ * @see min
+ */
+ p.constrain = function(aNumber, aMin, aMax) {
+ return aNumber > aMax ? aMax : aNumber < aMin ? aMin : aNumber;
+ };
+
+ /**
+ * Calculates the distance between two points.
+ *
+ * @param {int|float} x1 int or float: x-coordinate of the first point
+ * @param {int|float} y1 int or float: y-coordinate of the first point
+ * @param {int|float} z1 int or float: z-coordinate of the first point
+ * @param {int|float} x2 int or float: x-coordinate of the second point
+ * @param {int|float} y2 int or float: y-coordinate of the second point
+ * @param {int|float} z2 int or float: z-coordinate of the second point
+ *
+ * @returns {float}
+ */
+ p.dist = function() {
+ var dx, dy, dz;
+ if (arguments.length === 4) {
+ dx = arguments[0] - arguments[2];
+ dy = arguments[1] - arguments[3];
+ return Math.sqrt(dx * dx + dy * dy);
+ }
+ if (arguments.length === 6) {
+ dx = arguments[0] - arguments[3];
+ dy = arguments[1] - arguments[4];
+ dz = arguments[2] - arguments[5];
+ return Math.sqrt(dx * dx + dy * dy + dz * dz);
+ }
+ };
+
+ /**
+ * Calculates a number between two numbers at a specific increment. The amt parameter is the
+ * amount to interpolate between the two values where 0.0 equal to the first point, 0.1 is very
+ * near the first point, 0.5 is half-way in between, etc. The lerp function is convenient for
+ * creating motion along a straight path and for drawing dotted lines.
+ *
+ * @param {int|float} value1 float or int: first value
+ * @param {int|float} value2 float or int: second value
+ * @param {int|float} amt float: between 0.0 and 1.0
+ *
+ * @returns {float}
+ *
+ * @see curvePoint
+ * @see bezierPoint
+ */
+ p.lerp = function(value1, value2, amt) {
+ return ((value2 - value1) * amt) + value1;
+ };
+
+ /**
+ * Calculates the magnitude (or length) of a vector. A vector is a direction in space commonly
+ * used in computer graphics and linear algebra. Because it has no "start" position, the magnitude
+ * of a vector can be thought of as the distance from coordinate (0,0) to its (x,y) value.
+ * Therefore, mag() is a shortcut for writing "dist(0, 0, x, y)".
+ *
+ * @param {int|float} a float or int: first value
+ * @param {int|float} b float or int: second value
+ * @param {int|float} c float or int: third value
+ *
+ * @returns {float}
+ *
+ * @see dist
+ */
+ p.mag = function(a, b, c) {
+ if (c) {
+ return Math.sqrt(a * a + b * b + c * c);
+ }
+
+ return Math.sqrt(a * a + b * b);
+ };
+
+ /**
+ * Re-maps a number from one range to another. In the example above, the number '25' is converted from
+ * a value in the range 0..100 into a value that ranges from the left edge (0) to the right edge (width) of the screen.
+ * Numbers outside the range are not clamped to 0 and 1, because out-of-range values are often intentional and useful.
+ *
+ * @param {float} value The incoming value to be converted
+ * @param {float} istart Lower bound of the value's current range
+ * @param {float} istop Upper bound of the value's current range
+ * @param {float} ostart Lower bound of the value's target range
+ * @param {float} ostop Upper bound of the value's target range
+ *
+ * @returns {float}
+ *
+ * @see norm
+ * @see lerp
+ */
+ p.map = function(value, istart, istop, ostart, ostop) {
+ return ostart + (ostop - ostart) * ((value - istart) / (istop - istart));
+ };
+
+ /**
+ * Determines the largest value in a sequence of numbers.
+ *
+ * @param {int|float} value1 int or float
+ * @param {int|float} value2 int or float
+ * @param {int|float} value3 int or float
+ * @param {int|float} array int or float array
+ *
+ * @returns {int|float}
+ *
+ * @see min
+ */
+ p.max = function() {
+ if (arguments.length === 2) {
+ return arguments[0] < arguments[1] ? arguments[1] : arguments[0];
+ }
+ var numbers = arguments.length === 1 ? arguments[0] : arguments; // if single argument, array is used
+ if (! ("length" in numbers && numbers.length > 0)) {
+ throw "Non-empty array is expected";
+ }
+ var max = numbers[0],
+ count = numbers.length;
+ for (var i = 1; i < count; ++i) {
+ if (max < numbers[i]) {
+ max = numbers[i];
+ }
+ }
+ return max;
+ };
+
+ /**
+ * Determines the smallest value in a sequence of numbers.
+ *
+ * @param {int|float} value1 int or float
+ * @param {int|float} value2 int or float
+ * @param {int|float} value3 int or float
+ * @param {int|float} array int or float array
+ *
+ * @returns {int|float}
+ *
+ * @see max
+ */
+ p.min = function() {
+ if (arguments.length === 2) {
+ return arguments[0] < arguments[1] ? arguments[0] : arguments[1];
+ }
+ var numbers = arguments.length === 1 ? arguments[0] : arguments; // if single argument, array is used
+ if (! ("length" in numbers && numbers.length > 0)) {
+ throw "Non-empty array is expected";
+ }
+ var min = numbers[0],
+ count = numbers.length;
+ for (var i = 1; i < count; ++i) {
+ if (min > numbers[i]) {
+ min = numbers[i];
+ }
+ }
+ return min;
+ };
+
+ /**
+ * Normalizes a number from another range into a value between 0 and 1.
+ * Identical to map(value, low, high, 0, 1);
+ * Numbers outside the range are not clamped to 0 and 1, because out-of-range
+ * values are often intentional and useful.
+ *
+ * @param {float} aNumber The incoming value to be converted
+ * @param {float} low Lower bound of the value's current range
+ * @param {float} high Upper bound of the value's current range
+ *
+ * @returns {float}
+ *
+ * @see map
+ * @see lerp
+ */
+ p.norm = function(aNumber, low, high) {
+ return (aNumber - low) / (high - low);
+ };
+
+ /**
+ * Squares a number (multiplies a number by itself). The result is always a positive number,
+ * as multiplying two negative numbers always yields a positive result. For example, -1 * -1 = 1.
+ *
+ * @param {float} value int or float
+ *
+ * @returns {float}
+ *
+ * @see sqrt
+ */
+ p.sq = function(aNumber) {
+ return aNumber * aNumber;
+ };
+
+ /**
+ * Converts a radian measurement to its corresponding value in degrees. Radians and degrees are two ways of
+ * measuring the same thing. There are 360 degrees in a circle and 2*PI radians in a circle. For example,
+ * 90 degrees = PI/2 = 1.5707964. All trigonometric methods in Processing require their parameters to be specified in radians.
+ *
+ * @param {int|float} value an angle in radians
+ *
+ * @returns {float}
+ *
+ * @see radians
+ */
+ p.degrees = function(aAngle) {
+ return (aAngle * 180) / Math.PI;
+ };
+
+ /**
+ * Generates random numbers. Each time the random() function is called, it returns an unexpected value within
+ * the specified range. If one parameter is passed to the function it will return a float between zero and the
+ * value of the high parameter. The function call random(5) returns values between 0 and 5 (starting at zero,
+ * up to but not including 5). If two parameters are passed, it will return a float with a value between the
+ * parameters. The function call random(-5, 10.2) returns values starting at -5 up to (but not including) 10.2.
+ * To convert a floating-point random number to an integer, use the int() function.
+ *
+ * @param {int|float} value1 if one parameter is used, the top end to random from, if two params the low end
+ * @param {int|float} value2 the top end of the random range
+ *
+ * @returns {float}
+ *
+ * @see randomSeed
+ * @see noise
+ */
+ p.random = function(aMin, aMax) {
+ if (arguments.length === 0) {
+ aMax = 1;
+ aMin = 0;
+ } else if (arguments.length === 1) {
+ aMax = aMin;
+ aMin = 0;
+ }
+ if (aMin === aMax) {
+ return aMin;
+ }
+ for (var i = 0; i < 100; i++) {
+ var ir = internalRandomGenerator();
+ var result = ir * (aMax - aMin) + aMin;
+ if (result !== aMax) {
+ return result;
+ }
+ // assertion: ir is never less than 0.5
+ }
+ return aMin;
+ };
+
+ // Pseudo-random generator
+ function Marsaglia(i1, i2) {
+ // from http://www.math.uni-bielefeld.de/~sillke/ALGORITHMS/random/marsaglia-c
+ var z=i1 || 362436069, w= i2 || 521288629;
+ var intGenerator = function() {
+ z=(36969*(z&65535)+(z>>>16)) & 0xFFFFFFFF;
+ w=(18000*(w&65535)+(w>>>16)) & 0xFFFFFFFF;
+ return (((z&0xFFFF)<<16) | (w&0xFFFF)) & 0xFFFFFFFF;
+ };
+
+ this.doubleGenerator = function() {
+ var i = intGenerator() / 4294967296;
+ return i < 0 ? 1 + i : i;
+ };
+ this.intGenerator = intGenerator;
+ }
+
+ Marsaglia.createRandomized = function() {
+ var now = new Date();
+ return new Marsaglia((now / 60000) & 0xFFFFFFFF, now & 0xFFFFFFFF);
+ };
+
+ /**
+ * Sets the seed value for random(). By default, random() produces different results each time the
+ * program is run. Set the value parameter to a constant to return the same pseudo-random numbers
+ * each time the software is run.
+ *
+ * @param {int|float} seed int
+ *
+ * @see random
+ * @see noise
+ * @see noiseSeed
+ */
+ p.randomSeed = function(seed) {
+ internalRandomGenerator = (new Marsaglia(seed, (seed<<16)+(seed>>16))).doubleGenerator;
+ this.haveNextNextGaussian = false;
+ };
+
+ /**
+ * Returns a float from a random series of numbers having a mean of 0 and standard deviation of 1. Each time
+ * the randomGaussian() function is called, it returns a number fitting a Gaussian, or normal, distribution.
+ * There is theoretically no minimum or maximum value that randomGaussian() might return. Rather, there is just a
+ * very low probability that values far from the mean will be returned; and a higher probability that numbers
+ * near the mean will be returned.
+ *
+ * @returns {float}
+ *
+ * @see random
+ * @see noise
+ */
+ p.randomGaussian = function() {
+ if (this.haveNextNextGaussian) {
+ this.haveNextNextGaussian = false;
+ return this.nextNextGaussian;
+ }
+ var v1, v2, s;
+ do {
+ v1 = 2 * internalRandomGenerator() - 1; // between -1.0 and 1.0
+ v2 = 2 * internalRandomGenerator() - 1; // between -1.0 and 1.0
+ s = v1 * v1 + v2 * v2;
+ }
+ while (s >= 1 || s === 0);
+
+ var multiplier = Math.sqrt(-2 * Math.log(s) / s);
+ this.nextNextGaussian = v2 * multiplier;
+ this.haveNextNextGaussian = true;
+
+ return v1 * multiplier;
+ };
+
+ // Noise functions and helpers
+ function PerlinNoise(seed) {
+ var rnd = seed !== undef ? new Marsaglia(seed, (seed<<16)+(seed>>16)) : Marsaglia.createRandomized();
+ var i, j;
+ // http://www.noisemachine.com/talk1/17b.html
+ // http://mrl.nyu.edu/~perlin/noise/
+ // generate permutation
+ var perm = new Uint8Array(512);
+ for(i=0;i<256;++i) { perm[i] = i; }
+ for(i=0;i<256;++i) {
+ // NOTE: we can only do this because we've made sure the Marsaglia generator
+ // gives us numbers where the last byte in a pseudo-random number is
+ // still pseudo-random. If no 2nd argument is passed in the constructor,
+ // that is no longer the case and this pair swap will always run identically.
+ var t = perm[j = rnd.intGenerator() & 0xFF];
+ perm[j] = perm[i];
+ perm[i] = t;
+ }
+ // copy to avoid taking mod in perm[0];
+ for(i=0;i<256;++i) { perm[i + 256] = perm[i]; }
+
+ function grad3d(i,x,y,z) {
+ var h = i & 15; // convert into 12 gradient directions
+ var u = h<8 ? x : y,
+ v = h<4 ? y : h===12||h===14 ? x : z;
+ return ((h&1) === 0 ? u : -u) + ((h&2) === 0 ? v : -v);
+ }
+
+ function grad2d(i,x,y) {
+ var v = (i & 1) === 0 ? x : y;
+ return (i&2) === 0 ? -v : v;
+ }
+
+ function grad1d(i,x) {
+ return (i&1) === 0 ? -x : x;
+ }
+
+ function lerp(t,a,b) { return a + t * (b - a); }
+
+ this.noise3d = function(x, y, z) {
+ var X = Math.floor(x)&255, Y = Math.floor(y)&255, Z = Math.floor(z)&255;
+ x -= Math.floor(x); y -= Math.floor(y); z -= Math.floor(z);
+ var fx = (3-2*x)*x*x, fy = (3-2*y)*y*y, fz = (3-2*z)*z*z;
+ var p0 = perm[X]+Y, p00 = perm[p0] + Z, p01 = perm[p0 + 1] + Z,
+ p1 = perm[X + 1] + Y, p10 = perm[p1] + Z, p11 = perm[p1 + 1] + Z;
+ return lerp(fz,
+ lerp(fy, lerp(fx, grad3d(perm[p00], x, y, z), grad3d(perm[p10], x-1, y, z)),
+ lerp(fx, grad3d(perm[p01], x, y-1, z), grad3d(perm[p11], x-1, y-1,z))),
+ lerp(fy, lerp(fx, grad3d(perm[p00 + 1], x, y, z-1), grad3d(perm[p10 + 1], x-1, y, z-1)),
+ lerp(fx, grad3d(perm[p01 + 1], x, y-1, z-1), grad3d(perm[p11 + 1], x-1, y-1,z-1))));
+ };
+
+ this.noise2d = function(x, y) {
+ var X = Math.floor(x)&255, Y = Math.floor(y)&255;
+ x -= Math.floor(x); y -= Math.floor(y);
+ var fx = (3-2*x)*x*x, fy = (3-2*y)*y*y;
+ var p0 = perm[X]+Y, p1 = perm[X + 1] + Y;
+ return lerp(fy,
+ lerp(fx, grad2d(perm[p0], x, y), grad2d(perm[p1], x-1, y)),
+ lerp(fx, grad2d(perm[p0 + 1], x, y-1), grad2d(perm[p1 + 1], x-1, y-1)));
+ };
+
+ this.noise1d = function(x) {
+ var X = Math.floor(x)&255;
+ x -= Math.floor(x);
+ var fx = (3-2*x)*x*x;
+ return lerp(fx, grad1d(perm[X], x), grad1d(perm[X+1], x-1));
+ };
+ }
+
+ // processing defaults
+ var noiseProfile = { generator: undef, octaves: 4, fallout: 0.5, seed: undef};
+
+ /**
+ * Returns the Perlin noise value at specified coordinates. Perlin noise is a random sequence
+ * generator producing a more natural ordered, harmonic succession of numbers compared to the
+ * standard random() function. It was invented by Ken Perlin in the 1980s and been used since
+ * in graphical applications to produce procedural textures, natural motion, shapes, terrains etc.
+ * The main difference to the random() function is that Perlin noise is defined in an infinite
+ * n-dimensional space where each pair of coordinates corresponds to a fixed semi-random value
+ * (fixed only for the lifespan of the program). The resulting value will always be between 0.0
+ * and 1.0. Processing can compute 1D, 2D and 3D noise, depending on the number of coordinates
+ * given. The noise value can be animated by moving through the noise space as demonstrated in
+ * the example above. The 2nd and 3rd dimension can also be interpreted as time.
+ * The actual noise is structured similar to an audio signal, in respect to the function's use
+ * of frequencies. Similar to the concept of harmonics in physics, perlin noise is computed over
+ * several octaves which are added together for the final result.
+ * Another way to adjust the character of the resulting sequence is the scale of the input
+ * coordinates. As the function works within an infinite space the value of the coordinates
+ * doesn't matter as such, only the distance between successive coordinates does (eg. when using
+ * noise() within a loop). As a general rule the smaller the difference between coordinates, the
+ * smoother the resulting noise sequence will be. Steps of 0.005-0.03 work best for most applications,
+ * but this will differ depending on use.
+ *
+ * @param {float} x x coordinate in noise space
+ * @param {float} y y coordinate in noise space
+ * @param {float} z z coordinate in noise space
+ *
+ * @returns {float}
+ *
+ * @see random
+ * @see noiseDetail
+ */
+ p.noise = function(x, y, z) {
+ if(noiseProfile.generator === undef) {
+ // caching
+ noiseProfile.generator = new PerlinNoise(noiseProfile.seed);
+ }
+ var generator = noiseProfile.generator;
+ var effect = 1, k = 1, sum = 0;
+ for(var i=0; i<noiseProfile.octaves; ++i) {
+ effect *= noiseProfile.fallout;
+ switch (arguments.length) {
+ case 1:
+ sum += effect * (1 + generator.noise1d(k*x))/2; break;
+ case 2:
+ sum += effect * (1 + generator.noise2d(k*x, k*y))/2; break;
+ case 3:
+ sum += effect * (1 + generator.noise3d(k*x, k*y, k*z))/2; break;
+ }
+ k *= 2;
+ }
+ return sum;
+ };
+
+ /**
+ * Adjusts the character and level of detail produced by the Perlin noise function.
+ * Similar to harmonics in physics, noise is computed over several octaves. Lower octaves
+ * contribute more to the output signal and as such define the overal intensity of the noise,
+ * whereas higher octaves create finer grained details in the noise sequence. By default,
+ * noise is computed over 4 octaves with each octave contributing exactly half than its
+ * predecessor, starting at 50% strength for the 1st octave. This falloff amount can be
+ * changed by adding an additional function parameter. Eg. a falloff factor of 0.75 means
+ * each octave will now have 75% impact (25% less) of the previous lower octave. Any value
+ * between 0.0 and 1.0 is valid, however note that values greater than 0.5 might result in
+ * greater than 1.0 values returned by noise(). By changing these parameters, the signal
+ * created by the noise() function can be adapted to fit very specific needs and characteristics.
+ *
+ * @param {int} octaves number of octaves to be used by the noise() function
+ * @param {float} falloff falloff factor for each octave
+ *
+ * @see noise
+ */
+ p.noiseDetail = function(octaves, fallout) {
+ noiseProfile.octaves = octaves;
+ if(fallout !== undef) {
+ noiseProfile.fallout = fallout;
+ }
+ };
+
+ /**
+ * Sets the seed value for noise(). By default, noise() produces different results each
+ * time the program is run. Set the value parameter to a constant to return the same
+ * pseudo-random numbers each time the software is run.
+ *
+ * @param {int} seed int
+ *
+ * @returns {float}
+ *
+ * @see random
+ * @see radomSeed
+ * @see noise
+ * @see noiseDetail
+ */
+ p.noiseSeed = function(seed) {
+ noiseProfile.seed = seed;
+ noiseProfile.generator = undef;
+ };
+};
+
+},{}],24:[function(require,module,exports){
+/**
+ * Common functions traditionally on "p" that should be class functions
+ * that get bound to "p" when an instance is actually built, instead.
+ */
+module.exports = (function commonFunctions(undef) {
+
+ var CommonFunctions = {
+ /**
+ * Remove whitespace characters from the beginning and ending
+ * of a String or a String array. Works like String.trim() but includes the
+ * unicode nbsp character as well. If an array is passed in the function will return a new array not effecting the array passed in.
+ *
+ * @param {String} str the string to trim
+ * @param {String[]} str the string array to trim
+ *
+ * @return {String|String[]} retrurns a string or an array will removed whitespaces
+ */
+ trim: function(str) {
+ if (str instanceof Array) {
+ var arr = [];
+ for (var i = 0; i < str.length; i++) {
+ arr.push(str[i].replace(/^\s*/, '').replace(/\s*$/, '').replace(/\r*$/, ''));
+ }
+ return arr;
+ }
+ return str.replace(/^\s*/, '').replace(/\s*$/, '').replace(/\r*$/, '');
+ },
+
+ /**
+ * Converts a degree measurement to its corresponding value in radians. Radians and degrees are two ways of
+ * measuring the same thing. There are 360 degrees in a circle and 2*PI radians in a circle. For example,
+ * 90 degrees = PI/2 = 1.5707964. All trigonometric methods in Processing require their parameters to be specified in radians.
+ *
+ * @param {int|float} value an angle in radians
+ *
+ * @returns {float}
+ *
+ * @see degrees
+ */
+ radians: function(aAngle) {
+ return (aAngle / 180) * Math.PI;
+ },
+
+ /**
+ * Number-to-String formatting function. Prepends "plus" or "minus" depending
+ * on whether the value is positive or negative, respectively, after padding
+ * the value with zeroes on the left and right, the number of zeroes used dictated
+ * by the values 'leftDigits' and 'rightDigits'. 'value' cannot be an array.
+ *
+ * @param {int|float} value the number to format
+ * @param {String} plus the prefix for positive numbers
+ * @param {String} minus the prefix for negative numbers
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ * @param {String} group string delimited for groups, such as the comma in "1,000"
+ *
+ * @returns {String or String[]}
+ *
+ * @see nfCore
+ */
+ nfCoreScalar: function (value, plus, minus, leftDigits, rightDigits, group) {
+ var sign = (value < 0) ? minus : plus;
+ var autoDetectDecimals = rightDigits === 0;
+ var rightDigitsOfDefault = (rightDigits === undef || rightDigits < 0) ? 0 : rightDigits;
+
+ var absValue = Math.abs(value);
+ if (autoDetectDecimals) {
+ rightDigitsOfDefault = 1;
+ absValue *= 10;
+ while (Math.abs(Math.round(absValue) - absValue) > 1e-6 && rightDigitsOfDefault < 7) {
+ ++rightDigitsOfDefault;
+ absValue *= 10;
+ }
+ } else if (rightDigitsOfDefault !== 0) {
+ absValue *= Math.pow(10, rightDigitsOfDefault);
+ }
+
+ // Using Java's default rounding policy HALF_EVEN. This policy is based
+ // on the idea that 0.5 values round to the nearest even number, and
+ // everything else is rounded normally.
+ var number, doubled = absValue * 2;
+ if (Math.floor(absValue) === absValue) {
+ number = absValue;
+ } else if (Math.floor(doubled) === doubled) {
+ var floored = Math.floor(absValue);
+ number = floored + (floored % 2);
+ } else {
+ number = Math.round(absValue);
+ }
+
+ var buffer = "";
+ var totalDigits = leftDigits + rightDigitsOfDefault;
+ while (totalDigits > 0 || number > 0) {
+ totalDigits--;
+ buffer = "" + (number % 10) + buffer;
+ number = Math.floor(number / 10);
+ }
+ if (group !== undef) {
+ var i = buffer.length - 3 - rightDigitsOfDefault;
+ while(i > 0) {
+ buffer = buffer.substring(0,i) + group + buffer.substring(i);
+ i-=3;
+ }
+ }
+ if (rightDigitsOfDefault > 0) {
+ return sign + buffer.substring(0, buffer.length - rightDigitsOfDefault) +
+ "." + buffer.substring(buffer.length - rightDigitsOfDefault, buffer.length);
+ }
+ return sign + buffer;
+ },
+
+ /**
+ * Number-to-String formatting function. Prepends "plus" or "minus" depending
+ * on whether the value is positive or negative, respectively, after padding
+ * the value with zeroes on the left and right, the number of zeroes used dictated
+ * by the values 'leftDigits' and 'rightDigits'. 'value' can be an array;
+ * if the input is an array, each value in it is formatted separately, and
+ * an array with formatted values is returned.
+ *
+ * @param {int|int[]|float|float[]} value the number(s) to format
+ * @param {String} plus the prefix for positive numbers
+ * @param {String} minus the prefix for negative numbers
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ * @param {String} group string delimited for groups, such as the comma in "1,000"
+ *
+ * @returns {String or String[]}
+ *
+ * @see nfCoreScalar
+ */
+ nfCore: function(value, plus, minus, leftDigits, rightDigits, group) {
+ if (value instanceof Array) {
+ var arr = [];
+ for (var i = 0, len = value.length; i < len; i++) {
+ arr.push(CommonFunctions.nfCoreScalar(value[i], plus, minus, leftDigits, rightDigits, group));
+ }
+ return arr;
+ }
+ return CommonFunctions.nfCoreScalar(value, plus, minus, leftDigits, rightDigits, group);
+ },
+
+ /**
+ * Utility function for formatting numbers into strings. There are two versions, one for
+ * formatting floats and one for formatting ints. The values for the digits, left, and
+ * right parameters should always be positive integers.
+ * As shown in the above example, nf() is used to add zeros to the left and/or right
+ * of a number. This is typically for aligning a list of numbers. To remove digits from
+ * a floating-point number, use the int(), ceil(), floor(), or round() functions.
+ *
+ * @param {int|int[]|float|float[]} value the number(s) to format
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ *
+ * @returns {String or String[]}
+ *
+ * @see nfs
+ * @see nfp
+ * @see nfc
+ */
+ nf: function(value, leftDigits, rightDigits) {
+ return CommonFunctions.nfCore(value, "", "-", leftDigits, rightDigits);
+ },
+
+ /**
+ * Utility function for formatting numbers into strings. Similar to nf() but leaves a blank space in front
+ * of positive numbers so they align with negative numbers in spite of the minus symbol. There are two
+ * versions, one for formatting floats and one for formatting ints. The values for the digits, left,
+ * and right parameters should always be positive integers.
+ *
+ * @param {int|int[]|float|float[]} value the number(s) to format
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ *
+ * @returns {String or String[]}
+ *
+ * @see nf
+ * @see nfp
+ * @see nfc
+ */
+ nfs: function(value, leftDigits, rightDigits) {
+ return CommonFunctions.nfCore(value, " ", "-", leftDigits, rightDigits);
+ },
+
+ /**
+ * Utility function for formatting numbers into strings. Similar to nf() but puts a "+" in front of
+ * positive numbers and a "-" in front of negative numbers. There are two versions, one for formatting
+ * floats and one for formatting ints. The values for the digits, left, and right parameters should
+ * always be positive integers.
+ *
+ * @param {int|int[]|float|float[]} value the number(s) to format
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ *
+ * @returns {String or String[]}
+ *
+ * @see nfs
+ * @see nf
+ * @see nfc
+ */
+ nfp: function(value, leftDigits, rightDigits) {
+ return CommonFunctions.nfCore(value, "+", "-", leftDigits, rightDigits);
+ },
+
+ /**
+ * Utility function for formatting numbers into strings and placing appropriate commas to mark
+ * units of 1000. There are two versions, one for formatting ints and one for formatting an array
+ * of ints. The value for the digits parameter should always be a positive integer.
+ *
+ * @param {int|int[]|float|float[]} value the number(s) to format
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ *
+ * @returns {String or String[]}
+ *
+ * @see nf
+ * @see nfs
+ * @see nfp
+ */
+ nfc: function(value, rightDigits) {
+ return CommonFunctions.nfCore(value, "", "-", 0, rightDigits, ",");
+ },
+
+ // used to bind all common functions to "p"
+ withCommonFunctions: function withCommonFunctions(p) {
+ ["trim", "radians", "nf", "nfs", "nfp", "nfc"].forEach(function(f){
+ p[f] = CommonFunctions[f];
+ });
+ }
+ };
+
+ return CommonFunctions;
+}());
+
+},{}],25:[function(require,module,exports){
+/**
+ * Touch and Mouse event handling
+ */
+module.exports = function withTouch(p, curElement, attachEventHandler, document, PConstants, undef) {
+
+ /**
+ * Determine the location of the (mouse) pointer.
+ */
+ function calculateOffset(curElement, event) {
+ var element = curElement,
+ offsetX = 0,
+ offsetY = 0;
+
+ p.pmouseX = p.mouseX;
+ p.pmouseY = p.mouseY;
+
+ // Find element offset
+ if (element.offsetParent) {
+ do {
+ offsetX += element.offsetLeft;
+ offsetY += element.offsetTop;
+ } while (!!(element = element.offsetParent));
+ }
+
+ // Find Scroll offset
+ element = curElement;
+ do {
+ offsetX -= element.scrollLeft || 0;
+ offsetY -= element.scrollTop || 0;
+ } while (!!(element = element.parentNode));
+
+ // Get padding and border style widths for mouse offsets
+ var stylePaddingLeft, stylePaddingTop, styleBorderLeft, styleBorderTop;
+ if (document.defaultView && document.defaultView.getComputedStyle) {
+ stylePaddingLeft = parseInt(document.defaultView.getComputedStyle(curElement, null).paddingLeft, 10) || 0;
+ stylePaddingTop = parseInt(document.defaultView.getComputedStyle(curElement, null).paddingTop, 10) || 0;
+ styleBorderLeft = parseInt(document.defaultView.getComputedStyle(curElement, null).borderLeftWidth, 10) || 0;
+ styleBorderTop = parseInt(document.defaultView.getComputedStyle(curElement, null).borderTopWidth, 10) || 0;
+ }
+
+ // Add padding and border style widths to offset
+ offsetX += stylePaddingLeft;
+ offsetY += stylePaddingTop;
+
+ offsetX += styleBorderLeft;
+ offsetY += styleBorderTop;
+
+ // Take into account any scrolling done
+ offsetX += window.pageXOffset;
+ offsetY += window.pageYOffset;
+
+ return {'X':offsetX,'Y':offsetY};
+ }
+
+ // simple relative position
+ function updateMousePosition(curElement, event) {
+ var offset = calculateOffset(curElement, event);
+ // Dropping support for IE clientX and clientY, switching to pageX and pageY
+ // so we don't have to calculate scroll offset.
+ // Removed in ticket #184. See rev: 2f106d1c7017fed92d045ba918db47d28e5c16f4
+ p.mouseX = event.pageX - offset.X;
+ p.mouseY = event.pageY - offset.Y;
+ }
+
+ /**
+ * Return a TouchEvent with canvas-specific x/y co-ordinates
+ */
+ function addTouchEventOffset(t) {
+ var offset = calculateOffset(t.changedTouches[0].target, t.changedTouches[0]),
+ i;
+
+ for (i = 0; i < t.touches.length; i++) {
+ var touch = t.touches[i];
+ touch.offsetX = touch.pageX - offset.X;
+ touch.offsetY = touch.pageY - offset.Y;
+ }
+ for (i = 0; i < t.targetTouches.length; i++) {
+ var targetTouch = t.targetTouches[i];
+ targetTouch.offsetX = targetTouch.pageX - offset.X;
+ targetTouch.offsetY = targetTouch.pageY - offset.Y;
+ }
+ for (i = 0; i < t.changedTouches.length; i++) {
+ var changedTouch = t.changedTouches[i];
+ changedTouch.offsetX = changedTouch.pageX - offset.X;
+ changedTouch.offsetY = changedTouch.pageY - offset.Y;
+ }
+
+ return t;
+ }
+
+ /**
+ * Touch event support.
+ */
+ attachEventHandler(curElement, "touchstart", function (t) {
+ // Removes unwanted behaviour of the canvas when touching canvas
+ curElement.setAttribute("style","-webkit-user-select: none");
+ curElement.setAttribute("onclick","void(0)");
+ curElement.setAttribute("style","-webkit-tap-highlight-color:rgba(0,0,0,0)");
+ // Loop though eventHandlers and remove mouse listeners
+ for (var i=0, ehl=eventHandlers.length; i<ehl; i++) {
+ var type = eventHandlers[i].type;
+ // Have this function remove itself from the eventHandlers list too
+ if (type === "mouseout" || type === "mousemove" ||
+ type === "mousedown" || type === "mouseup" ||
+ type === "DOMMouseScroll" || type === "mousewheel" || type === "touchstart") {
+ detachEventHandler(eventHandlers[i]);
+ }
+ }
+
+ // If there are any native touch events defined in the sketch, connect all of them
+ // Otherwise, connect all of the emulated mouse events
+ if (p.touchStart !== undef || p.touchMove !== undef ||
+ p.touchEnd !== undef || p.touchCancel !== undef) {
+ attachEventHandler(curElement, "touchstart", function(t) {
+ if (p.touchStart !== undef) {
+ t = addTouchEventOffset(t);
+ p.touchStart(t);
+ }
+ });
+
+ attachEventHandler(curElement, "touchmove", function(t) {
+ if (p.touchMove !== undef) {
+ t.preventDefault(); // Stop the viewport from scrolling
+ t = addTouchEventOffset(t);
+ p.touchMove(t);
+ }
+ });
+
+ attachEventHandler(curElement, "touchend", function(t) {
+ if (p.touchEnd !== undef) {
+ t = addTouchEventOffset(t);
+ p.touchEnd(t);
+ }
+ });
+
+ attachEventHandler(curElement, "touchcancel", function(t) {
+ if (p.touchCancel !== undef) {
+ t = addTouchEventOffset(t);
+ p.touchCancel(t);
+ }
+ });
+
+ } else {
+ // Emulated touch start/mouse down event
+ attachEventHandler(curElement, "touchstart", function(e) {
+ updateMousePosition(curElement, e.touches[0]);
+
+ p.__mousePressed = true;
+ p.mouseDragging = false;
+ p.mouseButton = PConstants.LEFT;
+
+ if (typeof p.mousePressed === "function") {
+ p.mousePressed();
+ }
+ });
+
+ // Emulated touch move/mouse move event
+ attachEventHandler(curElement, "touchmove", function(e) {
+ e.preventDefault();
+ updateMousePosition(curElement, e.touches[0]);
+
+ if (typeof p.mouseMoved === "function" && !p.__mousePressed) {
+ p.mouseMoved();
+ }
+ if (typeof p.mouseDragged === "function" && p.__mousePressed) {
+ p.mouseDragged();
+ p.mouseDragging = true;
+ }
+ });
+
+ // Emulated touch up/mouse up event
+ attachEventHandler(curElement, "touchend", function(e) {
+ p.__mousePressed = false;
+
+ if (typeof p.mouseClicked === "function" && !p.mouseDragging) {
+ p.mouseClicked();
+ }
+
+ if (typeof p.mouseReleased === "function") {
+ p.mouseReleased();
+ }
+ });
+ }
+
+ // Refire the touch start event we consumed in this function
+ curElement.dispatchEvent(t);
+ });
+
+ /**
+ * Context menu toggles. Most often you will not want the
+ * browser's context menu to show on a right click, but
+ * sometimes, you do, so we add two unofficial functions
+ * that can be used to trigger context menu behaviour.
+ */
+ (function() {
+ var enabled = true,
+ contextMenu = function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ };
+
+ p.disableContextMenu = function() {
+ if (!enabled) {
+ return;
+ }
+ attachEventHandler(curElement, 'contextmenu', contextMenu);
+ enabled = false;
+ };
+
+ p.enableContextMenu = function() {
+ if (enabled) {
+ return;
+ }
+ detachEventHandler({elem: curElement, type: 'contextmenu', fn: contextMenu});
+ enabled = true;
+ };
+ }());
+
+ /**
+ * Mouse moved or dragged
+ */
+ attachEventHandler(curElement, "mousemove", function(e) {
+ updateMousePosition(curElement, e);
+ if (typeof p.mouseMoved === "function" && !p.__mousePressed) {
+ p.mouseMoved();
+ }
+ if (typeof p.mouseDragged === "function" && p.__mousePressed) {
+ p.mouseDragged();
+ p.mouseDragging = true;
+ }
+ });
+
+ /**
+ * Unofficial mouse-out handling
+ */
+ attachEventHandler(curElement, "mouseout", function(e) {
+ if (typeof p.mouseOut === "function") {
+ p.mouseOut();
+ }
+ });
+
+ /**
+ * Mouse over
+ */
+ attachEventHandler(curElement, "mouseover", function(e) {
+ updateMousePosition(curElement, e);
+ if (typeof p.mouseOver === "function") {
+ p.mouseOver();
+ }
+ });
+
+ /**
+ * Disable browser's default handling for click-drag of a canvas.
+ */
+ curElement.onmousedown = function () {
+ // make sure focus happens, but nothing else
+ curElement.focus();
+ return false;
+ };
+
+ /**
+ * Mouse pressed or drag
+ */
+ attachEventHandler(curElement, "mousedown", function(e) {
+ p.__mousePressed = true;
+ p.mouseDragging = false;
+ switch (e.which) {
+ case 1:
+ p.mouseButton = PConstants.LEFT;
+ break;
+ case 2:
+ p.mouseButton = PConstants.CENTER;
+ break;
+ case 3:
+ p.mouseButton = PConstants.RIGHT;
+ break;
+ }
+
+ if (typeof p.mousePressed === "function") {
+ p.mousePressed();
+ }
+ });
+
+ /**
+ * Mouse clicked or released
+ */
+ attachEventHandler(curElement, "mouseup", function(e) {
+ p.__mousePressed = false;
+
+ if (typeof p.mouseClicked === "function" && !p.mouseDragging) {
+ p.mouseClicked();
+ }
+
+ if (typeof p.mouseReleased === "function") {
+ p.mouseReleased();
+ }
+ });
+
+ /**
+ * Unofficial scroll wheel handling.
+ */
+ var mouseWheelHandler = function(e) {
+ // do not handle scroll wheel if initiated outside of the sketch
+ if (e.target !== curElement) return;
+
+ var delta = 0;
+
+ if (e.wheelDelta) {
+ delta = e.wheelDelta / 120;
+ if (window.opera) {
+ delta = -delta;
+ }
+ } else if (e.detail) {
+ delta = -e.detail / 3;
+ }
+
+ p.mouseScroll = delta;
+
+ if (delta && typeof p.mouseScrolled === 'function') {
+ // If this sketch has explicit scroll handling,
+ // prevent scroll from kicking in globally before
+ // calling the scroll handler.
+ e.stopPropagation();
+ e.preventDefault();
+ p.mouseScrolled();
+ }
+ };
+
+ // Support Gecko and non-Gecko scroll events
+ attachEventHandler(document, 'DOMMouseScroll', mouseWheelHandler);
+ attachEventHandler(document, 'mousewheel', mouseWheelHandler);
+
+};
+
+
+},{}],26:[function(require,module,exports){
+/**
+ * The parser for turning Processing syntax into Pjs JavaScript.
+ * This code is not trivial; unless you know what you're doing,
+ * you shouldn't be changing things in here =)
+ */
+module.exports = function setupParser(Processing, options) {
+
+ var defaultScope = options.defaultScope,
+ PConstants = defaultScope.PConstants,
+ aFunctions = options.aFunctions,
+ Browser = options.Browser,
+ document = Browser.document,
+ undef;
+
+ // Processing global methods and constants for the parser
+ function getGlobalMembers() {
+ // The names array contains the names of everything that is inside "p."
+ // When something new is added to "p." it must also be added to this list.
+ var names = [ /* this code is generated by jsglobals.js */
+ "abs", "acos", "alpha", "ambient", "ambientLight", "append", "applyMatrix",
+ "arc", "arrayCopy", "asin", "atan", "atan2", "background", "beginCamera",
+ "beginDraw", "beginShape", "bezier", "bezierDetail", "bezierPoint",
+ "bezierTangent", "bezierVertex", "binary", "blend", "blendColor",
+ "blit_resize", "blue", "box", "breakShape", "brightness",
+ "camera", "ceil", "Character", "color", "colorMode",
+ "concat", "constrain", "copy", "cos", "createFont",
+ "createGraphics", "createImage", "cursor", "curve", "curveDetail",
+ "curvePoint", "curveTangent", "curveTightness", "curveVertex", "day",
+ "degrees", "directionalLight", "disableContextMenu",
+ "dist", "draw", "ellipse", "ellipseMode", "emissive", "enableContextMenu",
+ "endCamera", "endDraw", "endShape", "exit", "exp", "expand", "externals",
+ "fill", "filter", "floor", "focused", "frameCount", "frameRate", "frustum",
+ "get", "glyphLook", "glyphTable", "green", "height", "hex", "hint", "hour",
+ "hue", "image", "imageMode", "intersect", "join", "key",
+ "keyCode", "keyPressed", "keyReleased", "keyTyped", "lerp", "lerpColor",
+ "lightFalloff", "lights", "lightSpecular", "line", "link", "loadBytes",
+ "loadFont", "loadGlyphs", "loadImage", "loadPixels", "loadShape", "loadXML",
+ "loadStrings", "log", "loop", "mag", "map", "match", "matchAll", "max",
+ "millis", "min", "minute", "mix", "modelX", "modelY", "modelZ", "modes",
+ "month", "mouseButton", "mouseClicked", "mouseDragged", "mouseMoved",
+ "mouseOut", "mouseOver", "mousePressed", "mouseReleased", "mouseScroll",
+ "mouseScrolled", "mouseX", "mouseY", "name", "nf", "nfc", "nfp", "nfs",
+ "noCursor", "noFill", "noise", "noiseDetail", "noiseSeed", "noLights",
+ "noLoop", "norm", "normal", "noSmooth", "noStroke", "noTint", "ortho",
+ "param", "parseBoolean", "parseByte", "parseChar", "parseFloat",
+ "parseInt", "parseXML", "peg", "perspective", "PImage", "pixels",
+ "PMatrix2D", "PMatrix3D", "PMatrixStack", "pmouseX", "pmouseY", "point",
+ "pointLight", "popMatrix", "popStyle", "pow", "print", "printCamera",
+ "println", "printMatrix", "printProjection", "PShape", "PShapeSVG",
+ "pushMatrix", "pushStyle", "quad", "radians", "random", "randomGaussian",
+ "randomSeed", "rect", "rectMode", "red", "redraw", "requestImage",
+ "resetMatrix", "reverse", "rotate", "rotateX", "rotateY", "rotateZ",
+ "round", "saturation", "save", "saveFrame", "saveStrings", "scale",
+ "screenX", "screenY", "screenZ", "second", "set", "setup", "shape",
+ "shapeMode", "shared", "shearX", "shearY", "shininess", "shorten", "sin", "size", "smooth",
+ "sort", "specular", "sphere", "sphereDetail", "splice", "split",
+ "splitTokens", "spotLight", "sq", "sqrt", "status", "str", "stroke",
+ "strokeCap", "strokeJoin", "strokeWeight", "subset", "tan", "text",
+ "textAlign", "textAscent", "textDescent", "textFont", "textLeading",
+ "textMode", "textSize", "texture", "textureMode", "textWidth", "tint", "toImageData",
+ "touchCancel", "touchEnd", "touchMove", "touchStart", "translate", "transform",
+ "triangle", "trim", "unbinary", "unhex", "updatePixels", "use3DContext",
+ "vertex", "width", "XMLElement", "XML", "year", "__contains", "__equals",
+ "__equalsIgnoreCase", "__frameRate", "__hashCode", "__int_cast",
+ "__instanceof", "__keyPressed", "__mousePressed", "__printStackTrace",
+ "__replace", "__replaceAll", "__replaceFirst", "__toCharArray", "__split",
+ "__codePointAt", "__startsWith", "__endsWith", "__matches"];
+
+ // custom functions and properties are added here
+ if(aFunctions) {
+ Object.keys(aFunctions).forEach(function(name) {
+ names.push(name);
+ });
+ }
+
+ // custom libraries that were attached to Processing
+ var members = {};
+ var i, l;
+ for (i = 0, l = names.length; i < l ; ++i) {
+ members[names[i]] = null;
+ }
+ for (var lib in Processing.lib) {
+ if (Processing.lib.hasOwnProperty(lib)) {
+ if (Processing.lib[lib].exports) {
+ var exportedNames = Processing.lib[lib].exports;
+ for (i = 0, l = exportedNames.length; i < l; ++i) {
+ members[exportedNames[i]] = null;
+ }
+ }
+ }
+ }
+ return members;
+ }
+
+ /*
+
+ Parser converts Java-like syntax into JavaScript.
+ Creates an Abstract Syntax Tree -- "Light AST" from the Java-like code.
+
+ It is an object tree. The root object is created from the AstRoot class, which contains statements.
+
+ A statement object can be of type: AstForStatement, AstCatchStatement, AstPrefixStatement, AstMethod, AstClass,
+ AstInterface, AstFunction, AstStatementBlock and AstLabel.
+
+ AstPrefixStatement can be a statement of type: if, switch, while, with, do, else, finally, return, throw, try, break, and continue.
+
+ These object's toString function returns the JavaScript code for the statement.
+
+ Any processing calls need "processing." prepended to them.
+
+ Similarly, calls from inside classes need "$this_1.", prepended to them,
+ with 1 being the depth level for inner classes.
+ This includes members passed down from inheritance.
+
+ The resulting code is then eval'd and run.
+
+ */
+
+ function parseProcessing(code) {
+ var globalMembers = getGlobalMembers();
+
+ // masks parentheses, brackets and braces with '"A5"'
+ // where A is the bracket type, and 5 is the index in an array containing all brackets split into atoms
+ // 'while(true){}' -> 'while"B1""A2"'
+ // parentheses() = B, brackets[] = C and braces{} = A
+ function splitToAtoms(code) {
+ var atoms = [];
+ var items = code.split(/([\{\[\(\)\]\}])/);
+ var result = items[0];
+
+ var stack = [];
+ for(var i=1; i < items.length; i += 2) {
+ var item = items[i];
+ if(item === '[' || item === '{' || item === '(') {
+ stack.push(result); result = item;
+ } else if(item === ']' || item === '}' || item === ')') {
+ var kind = item === '}' ? 'A' : item === ')' ? 'B' : 'C';
+ var index = atoms.length; atoms.push(result + item);
+ result = stack.pop() + '"' + kind + (index + 1) + '"';
+ }
+ result += items[i + 1];
+ }
+ atoms.unshift(result);
+ return atoms;
+ }
+
+ // replaces strings and regexs keyed by index with an array of strings
+ function injectStrings(code, strings) {
+ return code.replace(/'(\d+)'/g, function(all, index) {
+ var val = strings[index];
+ if(val.charAt(0) === "/") {
+ return val;
+ }
+ return (/^'((?:[^'\\\n])|(?:\\.[0-9A-Fa-f]*))'$/).test(val) ? "(new $p.Character(" + val + "))" : val;
+ });
+ }
+
+ // trims off leading and trailing spaces
+ // returns an object. object.left, object.middle, object.right, object.untrim
+ function trimSpaces(string) {
+ var m1 = /^\s*/.exec(string), result;
+ if(m1[0].length === string.length) {
+ result = {left: m1[0], middle: "", right: ""};
+ } else {
+ var m2 = /\s*$/.exec(string);
+ result = {left: m1[0], middle: string.substring(m1[0].length, m2.index), right: m2[0]};
+ }
+ result.untrim = function(t) { return this.left + t + this.right; };
+ return result;
+ }
+
+ // simple trim of leading and trailing spaces
+ function trim(string) {
+ return string.replace(/^\s+/,'').replace(/\s+$/,'');
+ }
+
+ function appendToLookupTable(table, array) {
+ for(var i=0,l=array.length;i<l;++i) {
+ table[array[i]] = null;
+ }
+ return table;
+ }
+
+ function isLookupTableEmpty(table) {
+ for(var i in table) {
+ if(table.hasOwnProperty(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function getAtomIndex(templ) { return templ.substring(2, templ.length - 1); }
+
+ // remove carriage returns "\r"
+ var codeWoExtraCr = code.replace(/\r\n?|\n\r/g, "\n");
+
+ // masks strings and regexs with "'5'", where 5 is the index in an array containing all strings and regexs
+ // also removes all comments
+ var strings = [];
+ var codeWoStrings = codeWoExtraCr.replace(/("(?:[^"\\\n]|\\.)*")|('(?:[^'\\\n]|\\.)*')|(([\[\(=|&!\^:?]\s*)(\/(?![*\/])(?:[^\/\\\n]|\\.)*\/[gim]*)\b)|(\/\/[^\n]*\n)|(\/\*(?:(?!\*\/)(?:.|\n))*\*\/)/g,
+ function(all, quoted, aposed, regexCtx, prefix, regex, singleComment, comment) {
+ var index;
+ if(quoted || aposed) { // replace strings
+ index = strings.length; strings.push(all);
+ return "'" + index + "'";
+ }
+ if(regexCtx) { // replace RegExps
+ index = strings.length; strings.push(regex);
+ return prefix + "'" + index + "'";
+ }
+ // kill comments
+ return comment !== "" ? " " : "\n";
+ });
+
+ // protect character codes from namespace collision
+ codeWoStrings = codeWoStrings.replace(/__x([0-9A-F]{4})/g, function(all, hexCode) {
+ // $ = __x0024
+ // _ = __x005F
+ // this protects existing character codes from conversion
+ // __x0024 = __x005F_x0024
+ return "__x005F_x" + hexCode;
+ });
+
+ // convert dollar sign to character code
+ codeWoStrings = codeWoStrings.replace(/\$/g, "__x0024");
+
+ // Remove newlines after return statements
+ codeWoStrings = codeWoStrings.replace(/return\s*[\n\r]+/g, "return ");
+
+ // removes generics
+ var genericsWereRemoved;
+ var codeWoGenerics = codeWoStrings;
+ var replaceFunc = function(all, before, types, after) {
+ if(!!before || !!after) {
+ return all;
+ }
+ genericsWereRemoved = true;
+ return "";
+ };
+
+ do {
+ genericsWereRemoved = false;
+ codeWoGenerics = codeWoGenerics.replace(/([<]?)<\s*((?:\?|[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\[\])*(?:\s+(?:extends|super)\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)?(?:\s*,\s*(?:\?|[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\[\])*(?:\s+(?:extends|super)\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)?)*)\s*>([=]?)/g, replaceFunc);
+ } while (genericsWereRemoved);
+
+ var atoms = splitToAtoms(codeWoGenerics);
+ var replaceContext;
+ var declaredClasses = {}, currentClassId, classIdSeed = 0;
+
+ function addAtom(text, type) {
+ var lastIndex = atoms.length;
+ atoms.push(text);
+ return '"' + type + lastIndex + '"';
+ }
+
+ function generateClassId() {
+ return "class" + (++classIdSeed);
+ }
+
+ function appendClass(class_, classId, scopeId) {
+ class_.classId = classId;
+ class_.scopeId = scopeId;
+ declaredClasses[classId] = class_;
+ }
+
+ // functions defined below
+ var transformClassBody, transformInterfaceBody, transformStatementsBlock, transformStatements, transformMain, transformExpression;
+
+ var classesRegex = /\b((?:(?:public|private|final|protected|static|abstract)\s+)*)(class|interface)\s+([A-Za-z_$][\w$]*\b)(\s+extends\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*\b)*)?(\s+implements\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*\b)*)?\s*("A\d+")/g;
+ var methodsRegex = /\b((?:(?:public|private|final|protected|static|abstract|synchronized)\s+)*)((?!(?:else|new|return|throw|function|public|private|protected)\b)[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*"C\d+")*)\s*([A-Za-z_$][\w$]*\b)\s*("B\d+")(\s*throws\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)*)?\s*("A\d+"|;)/g;
+ var fieldTest = /^((?:(?:public|private|final|protected|static)\s+)*)((?!(?:else|new|return|throw)\b)[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*"C\d+")*)\s*([A-Za-z_$][\w$]*\b)\s*(?:"C\d+"\s*)*([=,]|$)/;
+ var cstrsRegex = /\b((?:(?:public|private|final|protected|static|abstract)\s+)*)((?!(?:new|return|throw)\b)[A-Za-z_$][\w$]*\b)\s*("B\d+")(\s*throws\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)*)?\s*("A\d+")/g;
+ var attrAndTypeRegex = /^((?:(?:public|private|final|protected|static)\s+)*)((?!(?:new|return|throw)\b)[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*"C\d+")*)\s*/;
+ var functionsRegex = /\bfunction(?:\s+([A-Za-z_$][\w$]*))?\s*("B\d+")\s*("A\d+")/g;
+
+ // This converts classes, methods and functions into atoms, and adds them to the atoms array.
+ // classes = E, methods = D and functions = H
+ function extractClassesAndMethods(code) {
+ var s = code;
+ s = s.replace(classesRegex, function(all) {
+ return addAtom(all, 'E');
+ });
+ s = s.replace(methodsRegex, function(all) {
+ return addAtom(all, 'D');
+ });
+ s = s.replace(functionsRegex, function(all) {
+ return addAtom(all, 'H');
+ });
+ return s;
+ }
+
+ // This converts constructors into atoms, and adds them to the atoms array.
+ // constructors = G
+ function extractConstructors(code, className) {
+ var result = code.replace(cstrsRegex, function(all, attr, name, params, throws_, body) {
+ if(name !== className) {
+ return all;
+ }
+ return addAtom(all, 'G');
+ });
+ return result;
+ }
+
+ // AstParam contains the name of a parameter inside a function declaration
+ function AstParam(name) {
+ this.name = name;
+ }
+ AstParam.prototype.toString = function() {
+ return this.name;
+ };
+ // AstParams contains an array of AstParam objects
+ function AstParams(params, methodArgsParam) {
+ this.params = params;
+ this.methodArgsParam = methodArgsParam;
+ }
+ AstParams.prototype.getNames = function() {
+ var names = [];
+ for(var i=0,l=this.params.length;i<l;++i) {
+ names.push(this.params[i].name);
+ }
+ return names;
+ };
+ AstParams.prototype.prependMethodArgs = function(body) {
+ if (!this.methodArgsParam) {
+ return body;
+ }
+ return "{\nvar " + this.methodArgsParam.name +
+ " = Array.prototype.slice.call(arguments, " +
+ this.params.length + ");\n" + body.substring(1);
+ };
+ AstParams.prototype.toString = function() {
+ if(this.params.length === 0) {
+ return "()";
+ }
+ var result = "(";
+ for(var i=0,l=this.params.length;i<l;++i) {
+ result += this.params[i] + ", ";
+ }
+ return result.substring(0, result.length - 2) + ")";
+ };
+
+ function transformParams(params) {
+ var paramsWoPars = trim(params.substring(1, params.length - 1));
+ var result = [], methodArgsParam = null;
+ if(paramsWoPars !== "") {
+ var paramList = paramsWoPars.split(",");
+ for(var i=0; i < paramList.length; ++i) {
+ var param = /\b([A-Za-z_$][\w$]*\b)(\s*"[ABC][\d]*")*\s*$/.exec(paramList[i]);
+ if (i === paramList.length - 1 && paramList[i].indexOf('...') >= 0) {
+ methodArgsParam = new AstParam(param[1]);
+ break;
+ }
+ result.push(new AstParam(param[1]));
+ }
+ }
+ return new AstParams(result, methodArgsParam);
+ }
+
+ function preExpressionTransform(expr) {
+ var s = expr;
+ // new type[] {...} --> {...}
+ s = s.replace(/\bnew\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\s*"C\d+")+\s*("A\d+")/g, function(all, type, init) {
+ return init;
+ });
+ // new Runnable() {...} --> "F???"
+ s = s.replace(/\bnew\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\s*"B\d+")\s*("A\d+")/g, function(all, type, init) {
+ return addAtom(all, 'F');
+ });
+ // function(...) { } --> "H???"
+ s = s.replace(functionsRegex, function(all) {
+ return addAtom(all, 'H');
+ });
+ // new type[?] --> createJavaArray('type', [?])
+ s = s.replace(/\bnew\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)\s*("C\d+"(?:\s*"C\d+")*)/g, function(all, type, index) {
+ var args = index.replace(/"C(\d+)"/g, function(all, j) { return atoms[j]; })
+ .replace(/\[\s*\]/g, "[null]").replace(/\s*\]\s*\[\s*/g, ", ");
+ var arrayInitializer = "{" + args.substring(1, args.length - 1) + "}";
+ var createArrayArgs = "('" + type + "', " + addAtom(arrayInitializer, 'A') + ")";
+ return '$p.createJavaArray' + addAtom(createArrayArgs, 'B');
+ });
+ // .length() --> .length
+ s = s.replace(/(\.\s*length)\s*"B\d+"/g, "$1");
+ // #000000 --> 0x000000
+ s = s.replace(/#([0-9A-Fa-f]{6})\b/g, function(all, digits) {
+ return "0xFF" + digits;
+ });
+ // delete (type)???, except (int)???
+ s = s.replace(/"B(\d+)"(\s*(?:[\w$']|"B))/g, function(all, index, next) {
+ var atom = atoms[index];
+ if(!/^\(\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*\s*(?:"C\d+"\s*)*\)$/.test(atom)) {
+ return all;
+ }
+ if(/^\(\s*int\s*\)$/.test(atom)) {
+ return "(int)" + next;
+ }
+ var indexParts = atom.split(/"C(\d+)"/g);
+ if(indexParts.length > 1) {
+ // even items contains atom numbers, can check only first
+ if(! /^\[\s*\]$/.test(atoms[indexParts[1]])) {
+ return all; // fallback - not a cast
+ }
+ }
+ return "" + next;
+ });
+ // (int)??? -> __int_cast(???)
+ s = s.replace(/\(int\)([^,\]\)\}\?\:\*\+\-\/\^\|\%\&\~<\>\=]+)/g, function(all, arg) {
+ var trimmed = trimSpaces(arg);
+ return trimmed.untrim("__int_cast(" + trimmed.middle + ")");
+ });
+ // super() -> $superCstr(), super. -> $super.;
+ s = s.replace(/\bsuper(\s*"B\d+")/g, "$$superCstr$1").replace(/\bsuper(\s*\.)/g, "$$super$1");
+ // 000.43->0.43 and 0010f->10, but not 0010
+ s = s.replace(/\b0+((\d*)(?:\.[\d*])?(?:[eE][\-\+]?\d+)?[fF]?)\b/, function(all, numberWo0, intPart) {
+ if( numberWo0 === intPart) {
+ return all;
+ }
+ return intPart === "" ? "0" + numberWo0 : numberWo0;
+ });
+ // 3.0f -> 3.0
+ s = s.replace(/\b(\.?\d+\.?)[fF]\b/g, "$1");
+ // Weird (?) parsing errors with %
+ s = s.replace(/([^\s])%([^=\s])/g, "$1 % $2");
+ // Since frameRate() and frameRate are different things,
+ // we need to differentiate them somehow. So when we parse
+ // the Processing.js source, replace frameRate so it isn't
+ // confused with frameRate(), as well as keyPressed and mousePressed
+ s = s.replace(/\b(frameRate|keyPressed|mousePressed)\b(?!\s*"B)/g, "__$1");
+ // "boolean", "byte", "int", etc. => "parseBoolean", "parseByte", "parseInt", etc.
+ s = s.replace(/\b(boolean|byte|char|float|int)\s*"B/g, function(all, name) {
+ return "parse" + name.substring(0, 1).toUpperCase() + name.substring(1) + "\"B";
+ });
+ // "pixels" replacements:
+ // pixels[i] = c => pixels.setPixel(i,c) | pixels[i] => pixels.getPixel(i)
+ // pixels.length => pixels.getLength()
+ // pixels = ar => pixels.set(ar) | pixels => pixels.toArray()
+ s = s.replace(/\bpixels\b\s*(("C(\d+)")|\.length)?(\s*=(?!=)([^,\]\)\}]+))?/g,
+ function(all, indexOrLength, index, atomIndex, equalsPart, rightSide) {
+ if(index) {
+ var atom = atoms[atomIndex];
+ if(equalsPart) {
+ return "pixels.setPixel" + addAtom("(" +atom.substring(1, atom.length - 1) +
+ "," + rightSide + ")", 'B');
+ }
+ return "pixels.getPixel" + addAtom("(" + atom.substring(1, atom.length - 1) +
+ ")", 'B');
+ }
+ if(indexOrLength) {
+ // length
+ return "pixels.getLength" + addAtom("()", 'B');
+ }
+ if(equalsPart) {
+ return "pixels.set" + addAtom("(" + rightSide + ")", 'B');
+ }
+ return "pixels.toArray" + addAtom("()", 'B');
+ });
+ // Java method replacements for: replace, replaceAll, replaceFirst, equals, hashCode, etc.
+ // xxx.replace(yyy) -> __replace(xxx, yyy)
+ // "xx".replace(yyy) -> __replace("xx", yyy)
+ var repeatJavaReplacement;
+ function replacePrototypeMethods(all, subject, method, atomIndex) {
+ var atom = atoms[atomIndex];
+ repeatJavaReplacement = true;
+ var trimmed = trimSpaces(atom.substring(1, atom.length - 1));
+ return "__" + method + ( trimmed.middle === "" ? addAtom("(" + subject.replace(/\.\s*$/, "") + ")", 'B') :
+ addAtom("(" + subject.replace(/\.\s*$/, "") + "," + trimmed.middle + ")", 'B') );
+ }
+ do {
+ repeatJavaReplacement = false;
+ s = s.replace(/((?:'\d+'|\b[A-Za-z_$][\w$]*\s*(?:"[BC]\d+")*)\s*\.\s*(?:[A-Za-z_$][\w$]*\s*(?:"[BC]\d+"\s*)*\.\s*)*)(replace|replaceAll|replaceFirst|contains|equals|equalsIgnoreCase|hashCode|toCharArray|printStackTrace|split|startsWith|endsWith|codePointAt|matches)\s*"B(\d+)"/g,
+ replacePrototypeMethods);
+ } while (repeatJavaReplacement);
+ // xxx instanceof yyy -> __instanceof(xxx, yyy)
+ function replaceInstanceof(all, subject, type) {
+ repeatJavaReplacement = true;
+ return "__instanceof" + addAtom("(" + subject + ", " + type + ")", 'B');
+ }
+ do {
+ repeatJavaReplacement = false;
+ s = s.replace(/((?:'\d+'|\b[A-Za-z_$][\w$]*\s*(?:"[BC]\d+")*)\s*(?:\.\s*[A-Za-z_$][\w$]*\s*(?:"[BC]\d+"\s*)*)*)instanceof\s+([A-Za-z_$][\w$]*\s*(?:\.\s*[A-Za-z_$][\w$]*)*)/g,
+ replaceInstanceof);
+ } while (repeatJavaReplacement);
+ // this() -> $constr()
+ s = s.replace(/\bthis(\s*"B\d+")/g, "$$constr$1");
+
+ return s;
+ }
+
+ function AstInlineClass(baseInterfaceName, body) {
+ this.baseInterfaceName = baseInterfaceName;
+ this.body = body;
+ body.owner = this;
+ }
+ AstInlineClass.prototype.toString = function() {
+ return "new (" + this.body + ")";
+ };
+
+ function transformInlineClass(class_) {
+ var m = new RegExp(/\bnew\s*([A-Za-z_$][\w$]*\s*(?:\.\s*[A-Za-z_$][\w$]*)*)\s*"B\d+"\s*"A(\d+)"/).exec(class_);
+ var oldClassId = currentClassId, newClassId = generateClassId();
+ currentClassId = newClassId;
+ var uniqueClassName = m[1] + "$" + newClassId;
+ var inlineClass = new AstInlineClass(uniqueClassName,
+ transformClassBody(atoms[m[2]], uniqueClassName, "", "implements " + m[1]));
+ appendClass(inlineClass, newClassId, oldClassId);
+ currentClassId = oldClassId;
+ return inlineClass;
+ }
+
+ function AstFunction(name, params, body) {
+ this.name = name;
+ this.params = params;
+ this.body = body;
+ }
+ AstFunction.prototype.toString = function() {
+ var oldContext = replaceContext;
+ // saving "this." and parameters
+ var names = appendToLookupTable({"this":null}, this.params.getNames());
+ replaceContext = function (subject) {
+ return names.hasOwnProperty(subject.name) ? subject.name : oldContext(subject);
+ };
+ var result = "function";
+ if(this.name) {
+ result += " " + this.name;
+ }
+ var body = this.params.prependMethodArgs(this.body.toString());
+ result += this.params + " " + body;
+ replaceContext = oldContext;
+ return result;
+ };
+
+ function transformFunction(class_) {
+ var m = new RegExp(/\b([A-Za-z_$][\w$]*)\s*"B(\d+)"\s*"A(\d+)"/).exec(class_);
+ return new AstFunction( m[1] !== "function" ? m[1] : null,
+ transformParams(atoms[m[2]]), transformStatementsBlock(atoms[m[3]]));
+ }
+
+ function AstInlineObject(members) {
+ this.members = members;
+ }
+ AstInlineObject.prototype.toString = function() {
+ var oldContext = replaceContext;
+ replaceContext = function (subject) {
+ return subject.name === "this" ? "this" : oldContext(subject); // saving "this."
+ };
+ var result = "";
+ for(var i=0,l=this.members.length;i<l;++i) {
+ if(this.members[i].label) {
+ result += this.members[i].label + ": ";
+ }
+ result += this.members[i].value.toString() + ", ";
+ }
+ replaceContext = oldContext;
+ return result.substring(0, result.length - 2);
+ };
+
+ function transformInlineObject(obj) {
+ var members = obj.split(',');
+ for(var i=0; i < members.length; ++i) {
+ var label = members[i].indexOf(':');
+ if(label < 0) {
+ members[i] = { value: transformExpression(members[i]) };
+ } else {
+ members[i] = { label: trim(members[i].substring(0, label)),
+ value: transformExpression( trim(members[i].substring(label + 1)) ) };
+ }
+ }
+ return new AstInlineObject(members);
+ }
+
+ function expandExpression(expr) {
+ if(expr.charAt(0) === '(' || expr.charAt(0) === '[') {
+ return expr.charAt(0) + expandExpression(expr.substring(1, expr.length - 1)) + expr.charAt(expr.length - 1);
+ }
+ if(expr.charAt(0) === '{') {
+ if(/^\{\s*(?:[A-Za-z_$][\w$]*|'\d+')\s*:/.test(expr)) {
+ return "{" + addAtom(expr.substring(1, expr.length - 1), 'I') + "}";
+ }
+ return "[" + expandExpression(expr.substring(1, expr.length - 1)) + "]";
+ }
+ var trimmed = trimSpaces(expr);
+ var result = preExpressionTransform(trimmed.middle);
+ result = result.replace(/"[ABC](\d+)"/g, function(all, index) {
+ return expandExpression(atoms[index]);
+ });
+ return trimmed.untrim(result);
+ }
+
+ function replaceContextInVars(expr) {
+ return expr.replace(/(\.\s*)?((?:\b[A-Za-z_]|\$)[\w$]*)(\s*\.\s*([A-Za-z_$][\w$]*)(\s*\()?)?/g,
+ function(all, memberAccessSign, identifier, suffix, subMember, callSign) {
+ if(memberAccessSign) {
+ return all;
+ }
+ var subject = { name: identifier, member: subMember, callSign: !!callSign };
+ return replaceContext(subject) + (suffix === undef ? "" : suffix);
+ });
+ }
+
+ function AstExpression(expr, transforms) {
+ this.expr = expr;
+ this.transforms = transforms;
+ }
+ AstExpression.prototype.toString = function() {
+ var transforms = this.transforms;
+ var expr = replaceContextInVars(this.expr);
+ return expr.replace(/"!(\d+)"/g, function(all, index) {
+ return transforms[index].toString();
+ });
+ };
+
+ transformExpression = function(expr) {
+ var transforms = [];
+ var s = expandExpression(expr);
+ s = s.replace(/"H(\d+)"/g, function(all, index) {
+ transforms.push(transformFunction(atoms[index]));
+ return '"!' + (transforms.length - 1) + '"';
+ });
+ s = s.replace(/"F(\d+)"/g, function(all, index) {
+ transforms.push(transformInlineClass(atoms[index]));
+ return '"!' + (transforms.length - 1) + '"';
+ });
+ s = s.replace(/"I(\d+)"/g, function(all, index) {
+ transforms.push(transformInlineObject(atoms[index]));
+ return '"!' + (transforms.length - 1) + '"';
+ });
+
+ return new AstExpression(s, transforms);
+ };
+
+ function AstVarDefinition(name, value, isDefault) {
+ this.name = name;
+ this.value = value;
+ this.isDefault = isDefault;
+ }
+ AstVarDefinition.prototype.toString = function() {
+ return this.name + ' = ' + this.value;
+ };
+
+ function transformVarDefinition(def, defaultTypeValue) {
+ var eqIndex = def.indexOf("=");
+ var name, value, isDefault;
+ if(eqIndex < 0) {
+ name = def;
+ value = defaultTypeValue;
+ isDefault = true;
+ } else {
+ name = def.substring(0, eqIndex);
+ value = transformExpression(def.substring(eqIndex + 1));
+ isDefault = false;
+ }
+ return new AstVarDefinition( trim(name.replace(/(\s*"C\d+")+/g, "")),
+ value, isDefault);
+ }
+
+ function getDefaultValueForType(type) {
+ if(type === "int" || type === "float") {
+ return "0";
+ }
+ if(type === "boolean") {
+ return "false";
+ }
+ if(type === "color") {
+ return "0x00000000";
+ }
+ return "null";
+ }
+
+ function AstVar(definitions, varType) {
+ this.definitions = definitions;
+ this.varType = varType;
+ }
+ AstVar.prototype.getNames = function() {
+ var names = [];
+ for(var i=0,l=this.definitions.length;i<l;++i) {
+ names.push(this.definitions[i].name);
+ }
+ return names;
+ };
+ AstVar.prototype.toString = function() {
+ return "var " + this.definitions.join(",");
+ };
+ function AstStatement(expression) {
+ this.expression = expression;
+ }
+ AstStatement.prototype.toString = function() {
+ return this.expression.toString();
+ };
+
+ function transformStatement(statement) {
+ if(fieldTest.test(statement)) {
+ var attrAndType = attrAndTypeRegex.exec(statement);
+ var definitions = statement.substring(attrAndType[0].length).split(",");
+ var defaultTypeValue = getDefaultValueForType(attrAndType[2]);
+ for(var i=0; i < definitions.length; ++i) {
+ definitions[i] = transformVarDefinition(definitions[i], defaultTypeValue);
+ }
+ return new AstVar(definitions, attrAndType[2]);
+ }
+ return new AstStatement(transformExpression(statement));
+ }
+
+ function AstForExpression(initStatement, condition, step) {
+ this.initStatement = initStatement;
+ this.condition = condition;
+ this.step = step;
+ }
+ AstForExpression.prototype.toString = function() {
+ return "(" + this.initStatement + "; " + this.condition + "; " + this.step + ")";
+ };
+
+ function AstForInExpression(initStatement, container) {
+ this.initStatement = initStatement;
+ this.container = container;
+ }
+ AstForInExpression.prototype.toString = function() {
+ var init = this.initStatement.toString();
+ if(init.indexOf("=") >= 0) { // can be without var declaration
+ init = init.substring(0, init.indexOf("="));
+ }
+ return "(" + init + " in " + this.container + ")";
+ };
+
+ function AstForEachExpression(initStatement, container) {
+ this.initStatement = initStatement;
+ this.container = container;
+ }
+ AstForEachExpression.iteratorId = 0;
+ AstForEachExpression.prototype.toString = function() {
+ var init = this.initStatement.toString();
+ var iterator = "$it" + (AstForEachExpression.iteratorId++);
+ var variableName = init.replace(/^\s*var\s*/, "").split("=")[0];
+ var initIteratorAndVariable = "var " + iterator + " = new $p.ObjectIterator(" + this.container + "), " +
+ variableName + " = void(0)";
+ var nextIterationCondition = iterator + ".hasNext() && ((" +
+ variableName + " = " + iterator + ".next()) || true)";
+ return "(" + initIteratorAndVariable + "; " + nextIterationCondition + ";)";
+ };
+
+ function transformForExpression(expr) {
+ var content;
+ if (/\bin\b/.test(expr)) {
+ content = expr.substring(1, expr.length - 1).split(/\bin\b/g);
+ return new AstForInExpression( transformStatement(trim(content[0])),
+ transformExpression(content[1]));
+ }
+ if (expr.indexOf(":") >= 0 && expr.indexOf(";") < 0) {
+ content = expr.substring(1, expr.length - 1).split(":");
+ return new AstForEachExpression( transformStatement(trim(content[0])),
+ transformExpression(content[1]));
+ }
+ content = expr.substring(1, expr.length - 1).split(";");
+ return new AstForExpression( transformStatement(trim(content[0])),
+ transformExpression(content[1]), transformExpression(content[2]));
+ }
+
+ function sortByWeight(array) {
+ array.sort(function (a,b) {
+ return b.weight - a.weight;
+ });
+ }
+
+ function AstInnerInterface(name, body, isStatic) {
+ this.name = name;
+ this.body = body;
+ this.isStatic = isStatic;
+ body.owner = this;
+ }
+ AstInnerInterface.prototype.toString = function() {
+ return "" + this.body;
+ };
+ function AstInnerClass(name, body, isStatic) {
+ this.name = name;
+ this.body = body;
+ this.isStatic = isStatic;
+ body.owner = this;
+ }
+ AstInnerClass.prototype.toString = function() {
+ return "" + this.body;
+ };
+
+ function transformInnerClass(class_) {
+ var m = classesRegex.exec(class_); // 1 - attr, 2 - class|int, 3 - name, 4 - extends, 5 - implements, 6 - body
+ classesRegex.lastIndex = 0;
+ var isStatic = m[1].indexOf("static") >= 0;
+ var body = atoms[getAtomIndex(m[6])], innerClass;
+ var oldClassId = currentClassId, newClassId = generateClassId();
+ currentClassId = newClassId;
+ if(m[2] === "interface") {
+ innerClass = new AstInnerInterface(m[3], transformInterfaceBody(body, m[3], m[4]), isStatic);
+ } else {
+ innerClass = new AstInnerClass(m[3], transformClassBody(body, m[3], m[4], m[5]), isStatic);
+ }
+ appendClass(innerClass, newClassId, oldClassId);
+ currentClassId = oldClassId;
+ return innerClass;
+ }
+
+ function AstClassMethod(name, params, body, isStatic) {
+ this.name = name;
+ this.params = params;
+ this.body = body;
+ this.isStatic = isStatic;
+ }
+ AstClassMethod.prototype.toString = function(){
+ var paramNames = appendToLookupTable({}, this.params.getNames());
+ var oldContext = replaceContext;
+ replaceContext = function (subject) {
+ return paramNames.hasOwnProperty(subject.name) ? subject.name : oldContext(subject);
+ };
+ var body = this.params.prependMethodArgs(this.body.toString());
+ var result = "function " + this.methodId + this.params + " " + body +"\n";
+ replaceContext = oldContext;
+ return result;
+ };
+
+ function transformClassMethod(method) {
+ var m = methodsRegex.exec(method);
+ methodsRegex.lastIndex = 0;
+ var isStatic = m[1].indexOf("static") >= 0;
+ var body = m[6] !== ';' ? atoms[getAtomIndex(m[6])] : "{}";
+ return new AstClassMethod(m[3], transformParams(atoms[getAtomIndex(m[4])]),
+ transformStatementsBlock(body), isStatic );
+ }
+
+ function AstClassField(definitions, fieldType, isStatic) {
+ this.definitions = definitions;
+ this.fieldType = fieldType;
+ this.isStatic = isStatic;
+ }
+ AstClassField.prototype.getNames = function() {
+ var names = [];
+ for(var i=0,l=this.definitions.length;i<l;++i) {
+ names.push(this.definitions[i].name);
+ }
+ return names;
+ };
+ AstClassField.prototype.toString = function() {
+ var thisPrefix = replaceContext({ name: "[this]" });
+ if(this.isStatic) {
+ var className = this.owner.name;
+ var staticDeclarations = [];
+ for(var i=0,l=this.definitions.length;i<l;++i) {
+ var definition = this.definitions[i];
+ var name = definition.name, staticName = className + "." + name;
+ var declaration = "if(" + staticName + " === void(0)) {\n" +
+ " " + staticName + " = " + definition.value + "; }\n" +
+ "$p.defineProperty(" + thisPrefix + ", " +
+ "'" + name + "', { get: function(){return " + staticName + ";}, " +
+ "set: function(val){" + staticName + " = val;} });\n";
+ staticDeclarations.push(declaration);
+ }
+ return staticDeclarations.join("");
+ }
+ return thisPrefix + "." + this.definitions.join("; " + thisPrefix + ".");
+ };
+
+ function transformClassField(statement) {
+ var attrAndType = attrAndTypeRegex.exec(statement);
+ var isStatic = attrAndType[1].indexOf("static") >= 0;
+ var definitions = statement.substring(attrAndType[0].length).split(/,\s*/g);
+ var defaultTypeValue = getDefaultValueForType(attrAndType[2]);
+ for(var i=0; i < definitions.length; ++i) {
+ definitions[i] = transformVarDefinition(definitions[i], defaultTypeValue);
+ }
+ return new AstClassField(definitions, attrAndType[2], isStatic);
+ }
+
+ function AstConstructor(params, body) {
+ this.params = params;
+ this.body = body;
+ }
+ AstConstructor.prototype.toString = function() {
+ var paramNames = appendToLookupTable({}, this.params.getNames());
+ var oldContext = replaceContext;
+ replaceContext = function (subject) {
+ return paramNames.hasOwnProperty(subject.name) ? subject.name : oldContext(subject);
+ };
+ var prefix = "function $constr_" + this.params.params.length + this.params.toString();
+ var body = this.params.prependMethodArgs(this.body.toString());
+ if(!/\$(superCstr|constr)\b/.test(body)) {
+ body = "{\n$superCstr();\n" + body.substring(1);
+ }
+ replaceContext = oldContext;
+ return prefix + body + "\n";
+ };
+
+ function transformConstructor(cstr) {
+ var m = new RegExp(/"B(\d+)"\s*"A(\d+)"/).exec(cstr);
+ var params = transformParams(atoms[m[1]]);
+
+ return new AstConstructor(params, transformStatementsBlock(atoms[m[2]]));
+ }
+
+ function AstInterfaceBody(name, interfacesNames, methodsNames, fields, innerClasses, misc) {
+ var i,l;
+ this.name = name;
+ this.interfacesNames = interfacesNames;
+ this.methodsNames = methodsNames;
+ this.fields = fields;
+ this.innerClasses = innerClasses;
+ this.misc = misc;
+ for(i=0,l=fields.length; i<l; ++i) {
+ fields[i].owner = this;
+ }
+ }
+ AstInterfaceBody.prototype.getMembers = function(classFields, classMethods, classInners) {
+ if(this.owner.base) {
+ this.owner.base.body.getMembers(classFields, classMethods, classInners);
+ }
+ var i, j, l, m;
+ for(i=0,l=this.fields.length;i<l;++i) {
+ var fieldNames = this.fields[i].getNames();
+ for(j=0,m=fieldNames.length;j<m;++j) {
+ classFields[fieldNames[j]] = this.fields[i];
+ }
+ }
+ for(i=0,l=this.methodsNames.length;i<l;++i) {
+ var methodName = this.methodsNames[i];
+ classMethods[methodName] = true;
+ }
+ for(i=0,l=this.innerClasses.length;i<l;++i) {
+ var innerClass = this.innerClasses[i];
+ classInners[innerClass.name] = innerClass;
+ }
+ };
+ AstInterfaceBody.prototype.toString = function() {
+ function getScopeLevel(p) {
+ var i = 0;
+ while(p) {
+ ++i;
+ p=p.scope;
+ }
+ return i;
+ }
+
+ var scopeLevel = getScopeLevel(this.owner);
+
+ var className = this.name;
+ var staticDefinitions = "";
+ var metadata = "";
+
+ var thisClassFields = {}, thisClassMethods = {}, thisClassInners = {};
+ this.getMembers(thisClassFields, thisClassMethods, thisClassInners);
+
+ var i, l, j, m;
+
+ if (this.owner.interfaces) {
+ // interface name can be present, but interface is not
+ var resolvedInterfaces = [], resolvedInterface;
+ for (i = 0, l = this.interfacesNames.length; i < l; ++i) {
+ if (!this.owner.interfaces[i]) {
+ continue;
+ }
+ resolvedInterface = replaceContext({name: this.interfacesNames[i]});
+ resolvedInterfaces.push(resolvedInterface);
+ staticDefinitions += "$p.extendInterfaceMembers(" + className + ", " + resolvedInterface + ");\n";
+ }
+ metadata += className + ".$interfaces = [" + resolvedInterfaces.join(", ") + "];\n";
+ }
+ metadata += className + ".$isInterface = true;\n";
+ metadata += className + ".$methods = [\'" + this.methodsNames.join("\', \'") + "\'];\n";
+
+ sortByWeight(this.innerClasses);
+ for (i = 0, l = this.innerClasses.length; i < l; ++i) {
+ var innerClass = this.innerClasses[i];
+ if (innerClass.isStatic) {
+ staticDefinitions += className + "." + innerClass.name + " = " + innerClass + ";\n";
+ }
+ }
+
+ for (i = 0, l = this.fields.length; i < l; ++i) {
+ var field = this.fields[i];
+ if (field.isStatic) {
+ staticDefinitions += className + "." + field.definitions.join(";\n" + className + ".") + ";\n";
+ }
+ }
+
+ return "(function() {\n" +
+ "function " + className + "() { throw \'Unable to create the interface\'; }\n" +
+ staticDefinitions +
+ metadata +
+ "return " + className + ";\n" +
+ "})()";
+ };
+
+ transformInterfaceBody = function(body, name, baseInterfaces) {
+ var declarations = body.substring(1, body.length - 1);
+ declarations = extractClassesAndMethods(declarations);
+ declarations = extractConstructors(declarations, name);
+ var methodsNames = [], classes = [];
+ declarations = declarations.replace(/"([DE])(\d+)"/g, function(all, type, index) {
+ if(type === 'D') { methodsNames.push(index); }
+ else if(type === 'E') { classes.push(index); }
+ return "";
+ });
+ var fields = declarations.split(/;(?:\s*;)*/g);
+ var baseInterfaceNames;
+ var i, l;
+
+ if(baseInterfaces !== undef) {
+ baseInterfaceNames = baseInterfaces.replace(/^\s*extends\s+(.+?)\s*$/g, "$1").split(/\s*,\s*/g);
+ }
+
+ for(i = 0, l = methodsNames.length; i < l; ++i) {
+ var method = transformClassMethod(atoms[methodsNames[i]]);
+ methodsNames[i] = method.name;
+ }
+ for(i = 0, l = fields.length - 1; i < l; ++i) {
+ var field = trimSpaces(fields[i]);
+ fields[i] = transformClassField(field.middle);
+ }
+ var tail = fields.pop();
+ for(i = 0, l = classes.length; i < l; ++i) {
+ classes[i] = transformInnerClass(atoms[classes[i]]);
+ }
+
+ return new AstInterfaceBody(name, baseInterfaceNames, methodsNames, fields, classes, { tail: tail });
+ };
+
+ function AstClassBody(name, baseClassName, interfacesNames, functions, methods, fields, cstrs, innerClasses, misc) {
+ var i,l;
+ this.name = name;
+ this.baseClassName = baseClassName;
+ this.interfacesNames = interfacesNames;
+ this.functions = functions;
+ this.methods = methods;
+ this.fields = fields;
+ this.cstrs = cstrs;
+ this.innerClasses = innerClasses;
+ this.misc = misc;
+ for(i=0,l=fields.length; i<l; ++i) {
+ fields[i].owner = this;
+ }
+ }
+ AstClassBody.prototype.getMembers = function(classFields, classMethods, classInners) {
+ if(this.owner.base) {
+ this.owner.base.body.getMembers(classFields, classMethods, classInners);
+ }
+ var i, j, l, m;
+ for(i=0,l=this.fields.length;i<l;++i) {
+ var fieldNames = this.fields[i].getNames();
+ for(j=0,m=fieldNames.length;j<m;++j) {
+ classFields[fieldNames[j]] = this.fields[i];
+ }
+ }
+ for(i=0,l=this.methods.length;i<l;++i) {
+ var method = this.methods[i];
+ classMethods[method.name] = method;
+ }
+ for(i=0,l=this.innerClasses.length;i<l;++i) {
+ var innerClass = this.innerClasses[i];
+ classInners[innerClass.name] = innerClass;
+ }
+ };
+ AstClassBody.prototype.toString = function() {
+ function getScopeLevel(p) {
+ var i = 0;
+ while(p) {
+ ++i;
+ p=p.scope;
+ }
+ return i;
+ }
+
+ var scopeLevel = getScopeLevel(this.owner);
+
+ var selfId = "$this_" + scopeLevel;
+ var className = this.name;
+ var result = "var " + selfId + " = this;\n";
+ var staticDefinitions = "";
+ var metadata = "";
+
+ var thisClassFields = {}, thisClassMethods = {}, thisClassInners = {};
+ this.getMembers(thisClassFields, thisClassMethods, thisClassInners);
+
+ var oldContext = replaceContext;
+ replaceContext = function (subject) {
+ var name = subject.name;
+ if(name === "this") {
+ // returns "$this_N.$self" pointer instead of "this" in cases:
+ // "this()", "this.XXX()", "this", but not for "this.XXX"
+ return subject.callSign || !subject.member ? selfId + ".$self" : selfId;
+ }
+ if(thisClassFields.hasOwnProperty(name)) {
+ return thisClassFields[name].isStatic ? className + "." + name : selfId + "." + name;
+ }
+ if(thisClassInners.hasOwnProperty(name)) {
+ return selfId + "." + name;
+ }
+ if(thisClassMethods.hasOwnProperty(name)) {
+ return thisClassMethods[name].isStatic ? className + "." + name : selfId + ".$self." + name;
+ }
+ return oldContext(subject);
+ };
+
+ var resolvedBaseClassName;
+ if (this.baseClassName) {
+ resolvedBaseClassName = oldContext({name: this.baseClassName});
+ result += "var $super = { $upcast: " + selfId + " };\n";
+ result += "function $superCstr(){" + resolvedBaseClassName +
+ ".apply($super,arguments);if(!('$self' in $super)) $p.extendClassChain($super)}\n";
+ metadata += className + ".$base = " + resolvedBaseClassName + ";\n";
+ } else {
+ result += "function $superCstr(){$p.extendClassChain("+ selfId +")}\n";
+ }
+
+ if (this.owner.base) {
+ // base class name can be present, but class is not
+ staticDefinitions += "$p.extendStaticMembers(" + className + ", " + resolvedBaseClassName + ");\n";
+ }
+
+ var i, l, j, m;
+
+ if (this.owner.interfaces) {
+ // interface name can be present, but interface is not
+ var resolvedInterfaces = [], resolvedInterface;
+ for (i = 0, l = this.interfacesNames.length; i < l; ++i) {
+ if (!this.owner.interfaces[i]) {
+ continue;
+ }
+ resolvedInterface = oldContext({name: this.interfacesNames[i]});
+ resolvedInterfaces.push(resolvedInterface);
+ staticDefinitions += "$p.extendInterfaceMembers(" + className + ", " + resolvedInterface + ");\n";
+ }
+ metadata += className + ".$interfaces = [" + resolvedInterfaces.join(", ") + "];\n";
+ }
+
+ if (this.functions.length > 0) {
+ result += this.functions.join('\n') + '\n';
+ }
+
+ sortByWeight(this.innerClasses);
+ for (i = 0, l = this.innerClasses.length; i < l; ++i) {
+ var innerClass = this.innerClasses[i];
+ if (innerClass.isStatic) {
+ staticDefinitions += className + "." + innerClass.name + " = " + innerClass + ";\n";
+ result += selfId + "." + innerClass.name + " = " + className + "." + innerClass.name + ";\n";
+ } else {
+ result += selfId + "." + innerClass.name + " = " + innerClass + ";\n";
+ }
+ }
+
+ for (i = 0, l = this.fields.length; i < l; ++i) {
+ var field = this.fields[i];
+ if (field.isStatic) {
+ staticDefinitions += className + "." + field.definitions.join(";\n" + className + ".") + ";\n";
+ for (j = 0, m = field.definitions.length; j < m; ++j) {
+ var fieldName = field.definitions[j].name, staticName = className + "." + fieldName;
+ result += "$p.defineProperty(" + selfId + ", '" + fieldName + "', {" +
+ "get: function(){return " + staticName + "}, " +
+ "set: function(val){" + staticName + " = val}});\n";
+ }
+ } else {
+ result += selfId + "." + field.definitions.join(";\n" + selfId + ".") + ";\n";
+ }
+ }
+ var methodOverloads = {};
+ for (i = 0, l = this.methods.length; i < l; ++i) {
+ var method = this.methods[i];
+ var overload = methodOverloads[method.name];
+ var methodId = method.name + "$" + method.params.params.length;
+ var hasMethodArgs = !!method.params.methodArgsParam;
+ if (overload) {
+ ++overload;
+ methodId += "_" + overload;
+ } else {
+ overload = 1;
+ }
+ method.methodId = methodId;
+ methodOverloads[method.name] = overload;
+ if (method.isStatic) {
+ staticDefinitions += method;
+ staticDefinitions += "$p.addMethod(" + className + ", '" + method.name + "', " + methodId + ", " + hasMethodArgs + ");\n";
+ result += "$p.addMethod(" + selfId + ", '" + method.name + "', " + methodId + ", " + hasMethodArgs + ");\n";
+ } else {
+ result += method;
+ result += "$p.addMethod(" + selfId + ", '" + method.name + "', " + methodId + ", " + hasMethodArgs + ");\n";
+ }
+ }
+ result += trim(this.misc.tail);
+
+ if (this.cstrs.length > 0) {
+ result += this.cstrs.join('\n') + '\n';
+ }
+
+ result += "function $constr() {\n";
+ var cstrsIfs = [];
+ for (i = 0, l = this.cstrs.length; i < l; ++i) {
+ var paramsLength = this.cstrs[i].params.params.length;
+ var methodArgsPresent = !!this.cstrs[i].params.methodArgsParam;
+ cstrsIfs.push("if(arguments.length " + (methodArgsPresent ? ">=" : "===") +
+ " " + paramsLength + ") { " +
+ "$constr_" + paramsLength + ".apply(" + selfId + ", arguments); }");
+ }
+ if(cstrsIfs.length > 0) {
+ result += cstrsIfs.join(" else ") + " else ";
+ }
+ // ??? add check if length is 0, otherwise fail
+ result += "$superCstr();\n}\n";
+ result += "$constr.apply(null, arguments);\n";
+
+ replaceContext = oldContext;
+ return "(function() {\n" +
+ "function " + className + "() {\n" + result + "}\n" +
+ staticDefinitions +
+ metadata +
+ "return " + className + ";\n" +
+ "})()";
+ };
+
+ transformClassBody = function(body, name, baseName, interfaces) {
+ var declarations = body.substring(1, body.length - 1);
+ declarations = extractClassesAndMethods(declarations);
+ declarations = extractConstructors(declarations, name);
+ var methods = [], classes = [], cstrs = [], functions = [];
+ declarations = declarations.replace(/"([DEGH])(\d+)"/g, function(all, type, index) {
+ if(type === 'D') { methods.push(index); }
+ else if(type === 'E') { classes.push(index); }
+ else if(type === 'H') { functions.push(index); }
+ else { cstrs.push(index); }
+ return "";
+ });
+ var fields = declarations.replace(/^(?:\s*;)+/, "").split(/;(?:\s*;)*/g);
+ var baseClassName, interfacesNames;
+ var i;
+
+ if(baseName !== undef) {
+ baseClassName = baseName.replace(/^\s*extends\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)\s*$/g, "$1");
+ }
+
+ if(interfaces !== undef) {
+ interfacesNames = interfaces.replace(/^\s*implements\s+(.+?)\s*$/g, "$1").split(/\s*,\s*/g);
+ }
+
+ for(i = 0; i < functions.length; ++i) {
+ functions[i] = transformFunction(atoms[functions[i]]);
+ }
+ for(i = 0; i < methods.length; ++i) {
+ methods[i] = transformClassMethod(atoms[methods[i]]);
+ }
+ for(i = 0; i < fields.length - 1; ++i) {
+ var field = trimSpaces(fields[i]);
+ fields[i] = transformClassField(field.middle);
+ }
+ var tail = fields.pop();
+ for(i = 0; i < cstrs.length; ++i) {
+ cstrs[i] = transformConstructor(atoms[cstrs[i]]);
+ }
+ for(i = 0; i < classes.length; ++i) {
+ classes[i] = transformInnerClass(atoms[classes[i]]);
+ }
+
+ return new AstClassBody(name, baseClassName, interfacesNames, functions, methods, fields, cstrs,
+ classes, { tail: tail });
+ };
+
+ function AstInterface(name, body) {
+ this.name = name;
+ this.body = body;
+ body.owner = this;
+ }
+ AstInterface.prototype.toString = function() {
+ return "var " + this.name + " = " + this.body + ";\n" +
+ "$p." + this.name + " = " + this.name + ";\n";
+ };
+ function AstClass(name, body) {
+ this.name = name;
+ this.body = body;
+ body.owner = this;
+ }
+ AstClass.prototype.toString = function() {
+ return "var " + this.name + " = " + this.body + ";\n" +
+ "$p." + this.name + " = " + this.name + ";\n";
+ };
+
+ function transformGlobalClass(class_) {
+ var m = classesRegex.exec(class_); // 1 - attr, 2 - class|int, 3 - name, 4 - extends, 5 - implements, 6 - body
+ classesRegex.lastIndex = 0;
+ var body = atoms[getAtomIndex(m[6])];
+ var oldClassId = currentClassId, newClassId = generateClassId();
+ currentClassId = newClassId;
+ var globalClass;
+ if(m[2] === "interface") {
+ globalClass = new AstInterface(m[3], transformInterfaceBody(body, m[3], m[4]) );
+ } else {
+ globalClass = new AstClass(m[3], transformClassBody(body, m[3], m[4], m[5]) );
+ }
+ appendClass(globalClass, newClassId, oldClassId);
+ currentClassId = oldClassId;
+ return globalClass;
+ }
+
+ function AstMethod(name, params, body) {
+ this.name = name;
+ this.params = params;
+ this.body = body;
+ }
+ AstMethod.prototype.toString = function(){
+ var paramNames = appendToLookupTable({}, this.params.getNames());
+ var oldContext = replaceContext;
+ replaceContext = function (subject) {
+ return paramNames.hasOwnProperty(subject.name) ? subject.name : oldContext(subject);
+ };
+ var body = this.params.prependMethodArgs(this.body.toString());
+ var result = "function " + this.name + this.params + " " + body + "\n" +
+ "$p." + this.name + " = " + this.name + ";\n" +
+ this.name + " = " + this.name + ".bind($p);";
+// "$p." + this.name + " = " + this.name + ";";
+ replaceContext = oldContext;
+ return result;
+ };
+
+ function transformGlobalMethod(method) {
+ var m = methodsRegex.exec(method);
+ var result =
+ methodsRegex.lastIndex = 0;
+ return new AstMethod(m[3], transformParams(atoms[getAtomIndex(m[4])]),
+ transformStatementsBlock(atoms[getAtomIndex(m[6])]));
+ }
+
+ function preStatementsTransform(statements) {
+ var s = statements;
+ // turns multiple catch blocks into one, because we have no way to properly get into them anyway.
+ s = s.replace(/\b(catch\s*"B\d+"\s*"A\d+")(\s*catch\s*"B\d+"\s*"A\d+")+/g, "$1");
+ return s;
+ }
+
+ function AstForStatement(argument, misc) {
+ this.argument = argument;
+ this.misc = misc;
+ }
+ AstForStatement.prototype.toString = function() {
+ return this.misc.prefix + this.argument.toString();
+ };
+ function AstCatchStatement(argument, misc) {
+ this.argument = argument;
+ this.misc = misc;
+ }
+ AstCatchStatement.prototype.toString = function() {
+ return this.misc.prefix + this.argument.toString();
+ };
+ function AstPrefixStatement(name, argument, misc) {
+ this.name = name;
+ this.argument = argument;
+ this.misc = misc;
+ }
+ AstPrefixStatement.prototype.toString = function() {
+ var result = this.misc.prefix;
+ if(this.argument !== undef) {
+ result += this.argument.toString();
+ }
+ return result;
+ };
+ function AstSwitchCase(expr) {
+ this.expr = expr;
+ }
+ AstSwitchCase.prototype.toString = function() {
+ return "case " + this.expr + ":";
+ };
+ function AstLabel(label) {
+ this.label = label;
+ }
+ AstLabel.prototype.toString = function() {
+ return this.label;
+ };
+
+ transformStatements = function(statements, transformMethod, transformClass) {
+ var nextStatement = new RegExp(/\b(catch|for|if|switch|while|with)\s*"B(\d+)"|\b(do|else|finally|return|throw|try|break|continue)\b|("[ADEH](\d+)")|\b(case)\s+([^:]+):|\b([A-Za-z_$][\w$]*\s*:)|(;)/g);
+ var res = [];
+ statements = preStatementsTransform(statements);
+ var lastIndex = 0, m, space;
+ // m contains the matches from the nextStatement regexp, null if there are no matches.
+ // nextStatement.exec starts searching at nextStatement.lastIndex.
+ while((m = nextStatement.exec(statements)) !== null) {
+ if(m[1] !== undef) { // catch, for ...
+ var i = statements.lastIndexOf('"B', nextStatement.lastIndex);
+ var statementsPrefix = statements.substring(lastIndex, i);
+ if(m[1] === "for") {
+ res.push(new AstForStatement(transformForExpression(atoms[m[2]]),
+ { prefix: statementsPrefix }) );
+ } else if(m[1] === "catch") {
+ res.push(new AstCatchStatement(transformParams(atoms[m[2]]),
+ { prefix: statementsPrefix }) );
+ } else {
+ res.push(new AstPrefixStatement(m[1], transformExpression(atoms[m[2]]),
+ { prefix: statementsPrefix }) );
+ }
+ } else if(m[3] !== undef) { // do, else, ...
+ res.push(new AstPrefixStatement(m[3], undef,
+ { prefix: statements.substring(lastIndex, nextStatement.lastIndex) }) );
+ } else if(m[4] !== undef) { // block, class and methods
+ space = statements.substring(lastIndex, nextStatement.lastIndex - m[4].length);
+ if(trim(space).length !== 0) { continue; } // avoiding new type[] {} construct
+ res.push(space);
+ var kind = m[4].charAt(1), atomIndex = m[5];
+ if(kind === 'D') {
+ res.push(transformMethod(atoms[atomIndex]));
+ } else if(kind === 'E') {
+ res.push(transformClass(atoms[atomIndex]));
+ } else if(kind === 'H') {
+ res.push(transformFunction(atoms[atomIndex]));
+ } else {
+ res.push(transformStatementsBlock(atoms[atomIndex]));
+ }
+ } else if(m[6] !== undef) { // switch case
+ res.push(new AstSwitchCase(transformExpression(trim(m[7]))));
+ } else if(m[8] !== undef) { // label
+ space = statements.substring(lastIndex, nextStatement.lastIndex - m[8].length);
+ if(trim(space).length !== 0) { continue; } // avoiding ?: construct
+ res.push(new AstLabel(statements.substring(lastIndex, nextStatement.lastIndex)) );
+ } else { // semicolon
+ var statement = trimSpaces(statements.substring(lastIndex, nextStatement.lastIndex - 1));
+ res.push(statement.left);
+ res.push(transformStatement(statement.middle));
+ res.push(statement.right + ";");
+ }
+ lastIndex = nextStatement.lastIndex;
+ }
+ var statementsTail = trimSpaces(statements.substring(lastIndex));
+ res.push(statementsTail.left);
+ if(statementsTail.middle !== "") {
+ res.push(transformStatement(statementsTail.middle));
+ res.push(";" + statementsTail.right);
+ }
+ return res;
+ };
+
+ function getLocalNames(statements) {
+ var localNames = [];
+ for(var i=0,l=statements.length;i<l;++i) {
+ var statement = statements[i];
+ if(statement instanceof AstVar) {
+ localNames = localNames.concat(statement.getNames());
+ } else if(statement instanceof AstForStatement &&
+ statement.argument.initStatement instanceof AstVar) {
+ localNames = localNames.concat(statement.argument.initStatement.getNames());
+ } else if(statement instanceof AstInnerInterface || statement instanceof AstInnerClass ||
+ statement instanceof AstInterface || statement instanceof AstClass ||
+ statement instanceof AstMethod || statement instanceof AstFunction) {
+ localNames.push(statement.name);
+ }
+ }
+ return appendToLookupTable({}, localNames);
+ }
+
+ function AstStatementsBlock(statements) {
+ this.statements = statements;
+ }
+ AstStatementsBlock.prototype.toString = function() {
+ var localNames = getLocalNames(this.statements);
+ var oldContext = replaceContext;
+
+ // replacing context only when necessary
+ if(!isLookupTableEmpty(localNames)) {
+ replaceContext = function (subject) {
+ return localNames.hasOwnProperty(subject.name) ? subject.name : oldContext(subject);
+ };
+ }
+
+ var result = "{\n" + this.statements.join('') + "\n}";
+ replaceContext = oldContext;
+ return result;
+ };
+
+ transformStatementsBlock = function(block) {
+ var content = trimSpaces(block.substring(1, block.length - 1));
+ return new AstStatementsBlock(transformStatements(content.middle));
+ };
+
+ function AstRoot(statements) {
+ this.statements = statements;
+ }
+ AstRoot.prototype.toString = function() {
+ var classes = [], otherStatements = [], statement;
+ for (var i = 0, len = this.statements.length; i < len; ++i) {
+ statement = this.statements[i];
+ if (statement instanceof AstClass || statement instanceof AstInterface) {
+ classes.push(statement);
+ } else {
+ otherStatements.push(statement);
+ }
+ }
+ sortByWeight(classes);
+
+ var localNames = getLocalNames(this.statements);
+ replaceContext = function (subject) {
+ var name = subject.name;
+ if(localNames.hasOwnProperty(name)) {
+ return name;
+ }
+ if(globalMembers.hasOwnProperty(name) ||
+ PConstants.hasOwnProperty(name) ||
+ defaultScope.hasOwnProperty(name)) {
+ return "$p." + name;
+ }
+ return name;
+ };
+ var result = "// this code was autogenerated from PJS\n" +
+ "(function($p) {\n" +
+ classes.join('') + "\n" +
+ otherStatements.join('') + "\n})";
+ replaceContext = null;
+ return result;
+ };
+
+ transformMain = function() {
+ var statements = extractClassesAndMethods(atoms[0]);
+ statements = statements.replace(/\bimport\s+[^;]+;/g, "");
+ return new AstRoot( transformStatements(statements,
+ transformGlobalMethod, transformGlobalClass) );
+ };
+
+ function generateMetadata(ast) {
+ var globalScope = {};
+ var id, class_;
+ for(id in declaredClasses) {
+ if(declaredClasses.hasOwnProperty(id)) {
+ class_ = declaredClasses[id];
+ var scopeId = class_.scopeId, name = class_.name;
+ if(scopeId) {
+ var scope = declaredClasses[scopeId];
+ class_.scope = scope;
+ if(scope.inScope === undef) {
+ scope.inScope = {};
+ }
+ scope.inScope[name] = class_;
+ } else {
+ globalScope[name] = class_;
+ }
+ }
+ }
+
+ function findInScopes(class_, name) {
+ var parts = name.split('.');
+ var currentScope = class_.scope, found;
+ while(currentScope) {
+ if(currentScope.hasOwnProperty(parts[0])) {
+ found = currentScope[parts[0]]; break;
+ }
+ currentScope = currentScope.scope;
+ }
+ if(found === undef) {
+ found = globalScope[parts[0]];
+ }
+ for(var i=1,l=parts.length;i<l && found;++i) {
+ found = found.inScope[parts[i]];
+ }
+ return found;
+ }
+
+ for(id in declaredClasses) {
+ if(declaredClasses.hasOwnProperty(id)) {
+ class_ = declaredClasses[id];
+ var baseClassName = class_.body.baseClassName;
+ if(baseClassName) {
+ var parent = findInScopes(class_, baseClassName);
+ if (parent) {
+ class_.base = parent;
+ if (!parent.derived) {
+ parent.derived = [];
+ }
+ parent.derived.push(class_);
+ }
+ }
+ var interfacesNames = class_.body.interfacesNames,
+ interfaces = [], i, l;
+ if (interfacesNames && interfacesNames.length > 0) {
+ for (i = 0, l = interfacesNames.length; i < l; ++i) {
+ var interface_ = findInScopes(class_, interfacesNames[i]);
+ interfaces.push(interface_);
+ if (!interface_) {
+ continue;
+ }
+ if (!interface_.derived) {
+ interface_.derived = [];
+ }
+ interface_.derived.push(class_);
+ }
+ if (interfaces.length > 0) {
+ class_.interfaces = interfaces;
+ }
+ }
+ }
+ }
+ }
+
+ function setWeight(ast) {
+ var queue = [], tocheck = {};
+ var id, scopeId, class_;
+ // queue most inner and non-inherited
+ for (id in declaredClasses) {
+ if (declaredClasses.hasOwnProperty(id)) {
+ class_ = declaredClasses[id];
+ if (!class_.inScope && !class_.derived) {
+ queue.push(id);
+ class_.weight = 0;
+ } else {
+ var dependsOn = [];
+ if (class_.inScope) {
+ for (scopeId in class_.inScope) {
+ if (class_.inScope.hasOwnProperty(scopeId)) {
+ dependsOn.push(class_.inScope[scopeId]);
+ }
+ }
+ }
+ if (class_.derived) {
+ dependsOn = dependsOn.concat(class_.derived);
+ }
+ tocheck[id] = dependsOn;
+ }
+ }
+ }
+ function removeDependentAndCheck(targetId, from) {
+ var dependsOn = tocheck[targetId];
+ if (!dependsOn) {
+ return false; // no need to process
+ }
+ var i = dependsOn.indexOf(from);
+ if (i < 0) {
+ return false;
+ }
+ dependsOn.splice(i, 1);
+ if (dependsOn.length > 0) {
+ return false;
+ }
+ delete tocheck[targetId];
+ return true;
+ }
+ while (queue.length > 0) {
+ id = queue.shift();
+ class_ = declaredClasses[id];
+ if (class_.scopeId && removeDependentAndCheck(class_.scopeId, class_)) {
+ queue.push(class_.scopeId);
+ declaredClasses[class_.scopeId].weight = class_.weight + 1;
+ }
+ if (class_.base && removeDependentAndCheck(class_.base.classId, class_)) {
+ queue.push(class_.base.classId);
+ class_.base.weight = class_.weight + 1;
+ }
+ if (class_.interfaces) {
+ var i, l;
+ for (i = 0, l = class_.interfaces.length; i < l; ++i) {
+ if (!class_.interfaces[i] ||
+ !removeDependentAndCheck(class_.interfaces[i].classId, class_)) {
+ continue;
+ }
+ queue.push(class_.interfaces[i].classId);
+ class_.interfaces[i].weight = class_.weight + 1;
+ }
+ }
+ }
+ }
+
+ var transformed = transformMain();
+ generateMetadata(transformed);
+ setWeight(transformed);
+
+ var redendered = transformed.toString();
+
+ // remove empty extra lines with space
+ redendered = redendered.replace(/\s*\n(?:[\t ]*\n)+/g, "\n\n");
+
+ // convert character codes to characters
+ redendered = redendered.replace(/__x([0-9A-F]{4})/g, function(all, hexCode) {
+ return String.fromCharCode(parseInt(hexCode,16));
+ });
+
+ return injectStrings(redendered, strings);
+ }// Parser ends
+
+ function preprocessCode(aCode, sketch) {
+ // Parse out @pjs directive, if any.
+ var dm = new RegExp(/\/\*\s*@pjs\s+((?:[^\*]|\*+[^\*\/])*)\*\//g).exec(aCode);
+ if (dm && dm.length === 2) {
+ // masks contents of a JSON to be replaced later
+ // to protect the contents from further parsing
+ var jsonItems = [],
+ directives = dm.splice(1, 2)[0].replace(/\{([\s\S]*?)\}/g, (function() {
+ return function(all, item) {
+ jsonItems.push(item);
+ return "{" + (jsonItems.length-1) + "}";
+ };
+ }())).replace('\n', '').replace('\r', '').split(";");
+
+ // We'll L/RTrim, and also remove any surrounding double quotes (e.g., just take string contents)
+ var clean = function(s) {
+ return s.replace(/^\s*["']?/, '').replace(/["']?\s*$/, '');
+ };
+
+ for (var i = 0, dl = directives.length; i < dl; i++) {
+ var pair = directives[i].split('=');
+ if (pair && pair.length === 2) {
+ var key = clean(pair[0]),
+ value = clean(pair[1]),
+ list = [];
+ // A few directives require work beyond storying key/value pairings
+ if (key === "preload") {
+ list = value.split(',');
+ // All pre-loaded images will get put in imageCache, keyed on filename
+ for (var j = 0, jl = list.length; j < jl; j++) {
+ var imageName = clean(list[j]);
+ sketch.imageCache.add(imageName);
+ }
+ // fonts can be declared as a string containing a url,
+ // or a JSON object, containing a font name, and a url
+ } else if (key === "font") {
+ list = value.split(",");
+ for (var x = 0, xl = list.length; x < xl; x++) {
+ var fontName = clean(list[x]),
+ index = /^\{(\d*?)\}$/.exec(fontName);
+ // if index is not null, send JSON, otherwise, send string
+ PFont.preloading.add(index ? JSON.parse("{" + jsonItems[index[1]] + "}") : fontName);
+ }
+ } else if (key === "pauseOnBlur") {
+ sketch.options.pauseOnBlur = value === "true";
+ } else if (key === "globalKeyEvents") {
+ sketch.options.globalKeyEvents = value === "true";
+ } else if (key.substring(0, 6) === "param-") {
+ sketch.params[key.substring(6)] = value;
+ } else {
+ sketch.options[key] = value;
+ }
+ }
+ }
+ }
+ return aCode;
+ }
+
+ // Parse/compiles Processing (Java-like) syntax to JavaScript syntax
+ Processing.compile = function(pdeCode) {
+ var sketch = new Processing.Sketch();
+ var code = preprocessCode(pdeCode, sketch);
+ var compiledPde = parseProcessing(code);
+ sketch.sourceCode = compiledPde;
+ return sketch;
+ };
+
+ var PjsConsole = require("../Helpers/PjsConsole");
+ Processing.logger = new PjsConsole(document);
+
+ // done
+ return Processing;
+};
+
+},{"../Helpers/PjsConsole":5}],27:[function(require,module,exports){
+/**
+ * Processing.js object
+ */
+ module.exports = function(options, undef) {
+ var defaultScope = options.defaultScope,
+ extend = options.extend,
+ Browser = options.Browser,
+ ajax = Browser.ajax,
+ navigator = Browser.navigator,
+ window = Browser.window,
+ XMLHttpRequest = window.XMLHttpRequest,
+ document = Browser.document,
+ noop = options.noop,
+
+ PConstants = defaultScope.PConstants;
+ PFont = defaultScope.PFont,
+ PShapeSVG = defaultScope.PShapeSVG,
+ PVector = defaultScope.PVector,
+ Char = Character = defaultScope.Char,
+ ObjectIterator = defaultScope.ObjectIterator,
+ XMLElement = defaultScope.XMLElement,
+ XML = defaultScope.XML;
+
+ // fascinating "read only" jshint error if we don't start a new var block here.
+ var HTMLCanvasElement = window.HTMLCanvasElement,
+ HTMLImageElement = window.HTMLImageElement;
+
+ // window.localStorage cannot be accessed if a user is blocking cookies.
+ // In that case, we make it a temporary source cache object.
+ var localStorage;
+ try { localStorage = window.localStorage; } catch (e) { localStorage = {}; }
+
+ var isDOMPresent = ("document" in this) && !("fake" in this.document);
+
+ // document.head polyfill for the benefit of Firefox 3.6
+ if (!document.head) {
+ document.head = document.getElementsByTagName('head')[0];
+ }
+
+ var Float32Array = setupTypedArray("Float32Array", "WebGLFloatArray"),
+ Int32Array = setupTypedArray("Int32Array", "WebGLIntArray"),
+ Uint16Array = setupTypedArray("Uint16Array", "WebGLUnsignedShortArray"),
+ Uint8Array = setupTypedArray("Uint8Array", "WebGLUnsignedByteArray");
+
+ // Typed Arrays: fallback to WebGL arrays or Native JS arrays if unavailable
+ function setupTypedArray(name, fallback) {
+ // Check if TypedArray exists, and use if so.
+ if (name in window) {
+ return window[name];
+ }
+
+ // Check if WebGLArray exists
+ if (typeof window[fallback] === "function") {
+ return window[fallback];
+ }
+
+ // Use Native JS array
+ return function(obj) {
+ if (obj instanceof Array) {
+ return obj;
+ }
+ if (typeof obj === "number") {
+ var arr = [];
+ arr.length = obj;
+ return arr;
+ }
+ };
+ }
+
+ /* IE9+ quirks mode check - ticket #1606 */
+ if (document.documentMode >= 9 && !document.doctype) {
+ throw("The doctype directive is missing. The recommended doctype in Internet Explorer is the HTML5 doctype: <!DOCTYPE html>");
+ }
+
+ // Manage multiple Processing instances
+ var processingInstances = [];
+ var processingInstanceIds = {};
+
+ /**
+ * instance tracking - adding new instances
+ */
+ var addInstance = function(processing) {
+ if (processing.externals.canvas.id === undef || !processing.externals.canvas.id.length) {
+ processing.externals.canvas.id = "__processing" + processingInstances.length;
+ }
+ processingInstanceIds[processing.externals.canvas.id] = processingInstances.length;
+ processingInstances.push(processing);
+ };
+
+ /**
+ * instance tracking - removal
+ */
+ var removeInstance = function(id) {
+ processingInstances.splice(processingInstanceIds[id], 1);
+ delete processingInstanceIds[id];
+ };
+
+
+ /**
+ * The Processing object
+ */
+ var Processing = this.Processing = function(aCanvas, aCode, aFunctions) {
+
+ if (!(this instanceof Processing)) {
+ throw("called Processing constructor as if it were a function: missing 'new'.");
+ }
+
+ var curElement = {},
+ pgraphicsMode = (aCanvas === undef && aCode === undef);
+
+ if (pgraphicsMode) {
+ curElement = document.createElement("canvas");
+ } else {
+ // We'll take a canvas element or a string for a canvas element's id
+ curElement = typeof aCanvas === "string" ? document.getElementById(aCanvas) : aCanvas;
+ }
+
+ if (!('getContext' in curElement)) {
+ throw("called Processing constructor without passing canvas element reference or id.");
+ }
+
+ function unimplemented(s) {
+ Processing.debug('Unimplemented - ' + s);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ // JavaScript event binding and releasing
+ ////////////////////////////////////////////////////////////////////////////
+
+ var eventHandlers = [];
+
+ function attachEventHandler(elem, type, fn) {
+ if (elem.addEventListener) {
+ elem.addEventListener(type, fn, false);
+ } else {
+ elem.attachEvent("on" + type, fn);
+ }
+ eventHandlers.push({elem: elem, type: type, fn: fn});
+ }
+
+ function detachEventHandler(eventHandler) {
+ var elem = eventHandler.elem,
+ type = eventHandler.type,
+ fn = eventHandler.fn;
+ if (elem.removeEventListener) {
+ elem.removeEventListener(type, fn, false);
+ } else if (elem.detachEvent) {
+ elem.detachEvent("on" + type, fn);
+ }
+ }
+
+ function removeFirstArgument(args) {
+ return Array.prototype.slice.call(args, 1);
+ }
+
+ // When something new is added to "p." it must also be added to the "names" array.
+ // The names array contains the names of everything that is inside "p."
+ var p = this;
+
+ p.Char = p.Character = Char;
+
+ // add in the Processing API functions
+ extend.withCommonFunctions(p);
+ extend.withMath(p);
+ extend.withProxyFunctions(p, removeFirstArgument);
+ extend.withTouch(p, curElement, attachEventHandler, document, PConstants);
+
+ // custom functions and properties are added here
+ if(aFunctions) {
+ Object.keys(aFunctions).forEach(function(name) {
+ p[name] = aFunctions[name];
+ });
+ }
+
+ // PJS specific (non-p5) methods and properties to externalize
+ p.externals = {
+ canvas: curElement,
+ context: undef,
+ sketch: undef,
+ window: window
+ };
+
+ p.name = 'Processing.js Instance'; // Set Processing defaults / environment variables
+ p.use3DContext = false; // default '2d' canvas context
+
+ /**
+ * Confirms if a Processing program is "focused", meaning that it is
+ * active and will accept input from mouse or keyboard. This variable
+ * is "true" if it is focused and "false" if not. This variable is
+ * often used when you want to warn people they need to click on the
+ * browser before it will work.
+ */
+ p.focused = false;
+ p.breakShape = false;
+
+ // Glyph path storage for textFonts
+ p.glyphTable = {};
+
+ // Global vars for tracking mouse position
+ p.pmouseX = 0;
+ p.pmouseY = 0;
+ p.mouseX = 0;
+ p.mouseY = 0;
+ p.mouseButton = 0;
+ p.mouseScroll = 0;
+
+ // Undefined event handlers to be replaced by user when needed
+ p.mouseClicked = undef;
+ p.mouseDragged = undef;
+ p.mouseMoved = undef;
+ p.mousePressed = undef;
+ p.mouseReleased = undef;
+ p.mouseScrolled = undef;
+ p.mouseOver = undef;
+ p.mouseOut = undef;
+ p.touchStart = undef;
+ p.touchEnd = undef;
+ p.touchMove = undef;
+ p.touchCancel = undef;
+ p.key = undef;
+ p.keyCode = undef;
+ p.keyPressed = noop; // needed to remove function checks
+ p.keyReleased = noop;
+ p.keyTyped = noop;
+ p.draw = undef;
+ p.setup = undef;
+
+ // Remapped vars
+ p.__mousePressed = false;
+ p.__keyPressed = false;
+ p.__frameRate = 60;
+
+ // The current animation frame
+ p.frameCount = 0;
+
+ // The height/width of the canvas
+ p.width = 100;
+ p.height = 100;
+
+ // "Private" variables used to maintain state
+ var curContext,
+ curSketch,
+ drawing, // hold a Drawing2D or Drawing3D object
+ doFill = true,
+ fillStyle = [1.0, 1.0, 1.0, 1.0],
+ currentFillColor = 0xFFFFFFFF,
+ isFillDirty = true,
+ doStroke = true,
+ strokeStyle = [0.0, 0.0, 0.0, 1.0],
+ currentStrokeColor = 0xFF000000,
+ isStrokeDirty = true,
+ lineWidth = 1,
+ loopStarted = false,
+ renderSmooth = false,
+ doLoop = true,
+ looping = 0,
+ curRectMode = PConstants.CORNER,
+ curEllipseMode = PConstants.CENTER,
+ normalX = 0,
+ normalY = 0,
+ normalZ = 0,
+ normalMode = PConstants.NORMAL_MODE_AUTO,
+ curFrameRate = 60,
+ curMsPerFrame = 1000/curFrameRate,
+ curCursor = PConstants.ARROW,
+ oldCursor = curElement.style.cursor,
+ curShape = PConstants.POLYGON,
+ curShapeCount = 0,
+ curvePoints = [],
+ curTightness = 0,
+ curveDet = 20,
+ curveInited = false,
+ backgroundObj = -3355444, // rgb(204, 204, 204) is the default gray background colour
+ bezDetail = 20,
+ colorModeA = 255,
+ colorModeX = 255,
+ colorModeY = 255,
+ colorModeZ = 255,
+ pathOpen = false,
+ mouseDragging = false,
+ pmouseXLastFrame = 0,
+ pmouseYLastFrame = 0,
+ curColorMode = PConstants.RGB,
+ curTint = null,
+ curTint3d = null,
+ getLoaded = false,
+ start = Date.now(),
+ timeSinceLastFPS = start,
+ framesSinceLastFPS = 0,
+ textcanvas,
+ curveBasisMatrix,
+ curveToBezierMatrix,
+ curveDrawMatrix,
+ bezierDrawMatrix,
+ bezierBasisInverse,
+ bezierBasisMatrix,
+ curContextCache = { attributes: {}, locations: {} },
+ // Shaders
+ programObject3D,
+ programObject2D,
+ programObjectUnlitShape,
+ boxBuffer,
+ boxNormBuffer,
+ boxOutlineBuffer,
+ rectBuffer,
+ rectNormBuffer,
+ sphereBuffer,
+ lineBuffer,
+ fillBuffer,
+ fillColorBuffer,
+ strokeColorBuffer,
+ pointBuffer,
+ shapeTexVBO,
+ canTex, // texture for createGraphics
+ textTex, // texture for 3d tex
+ curTexture = {width:0,height:0},
+ curTextureMode = PConstants.IMAGE,
+ usingTexture = false,
+ textBuffer,
+ textureBuffer,
+ indexBuffer,
+ // Text alignment
+ horizontalTextAlignment = PConstants.LEFT,
+ verticalTextAlignment = PConstants.BASELINE,
+ textMode = PConstants.MODEL,
+ // Font state
+ curFontName = "Arial",
+ curTextSize = 12,
+ curTextAscent = 9,
+ curTextDescent = 2,
+ curTextLeading = 14,
+ curTextFont = PFont.get(curFontName, curTextSize),
+ // Pixels cache
+ originalContext,
+ proxyContext = null,
+ isContextReplaced = false,
+ setPixelsCached,
+ maxPixelsCached = 1000,
+ pressedKeysMap = [],
+ lastPressedKeyCode = null,
+ codedKeys = [ PConstants.SHIFT, PConstants.CONTROL, PConstants.ALT, PConstants.CAPSLK, PConstants.PGUP, PConstants.PGDN,
+ PConstants.END, PConstants.HOME, PConstants.LEFT, PConstants.UP, PConstants.RIGHT, PConstants.DOWN, PConstants.NUMLK,
+ PConstants.INSERT, PConstants.F1, PConstants.F2, PConstants.F3, PConstants.F4, PConstants.F5, PConstants.F6, PConstants.F7,
+ PConstants.F8, PConstants.F9, PConstants.F10, PConstants.F11, PConstants.F12, PConstants.META ];
+
+ // User can only have MAX_LIGHTS lights
+ var lightCount = 0;
+
+ //sphere stuff
+ var sphereDetailV = 0,
+ sphereDetailU = 0,
+ sphereX = [],
+ sphereY = [],
+ sphereZ = [],
+ sinLUT = new Float32Array(PConstants.SINCOS_LENGTH),
+ cosLUT = new Float32Array(PConstants.SINCOS_LENGTH),
+ sphereVerts,
+ sphereNorms;
+
+ // Camera defaults and settings
+ var cam,
+ cameraInv,
+ modelView,
+ modelViewInv,
+ userMatrixStack,
+ userReverseMatrixStack,
+ inverseCopy,
+ projection,
+ manipulatingCamera = false,
+ frustumMode = false,
+ cameraFOV = 60 * (Math.PI / 180),
+ cameraX = p.width / 2,
+ cameraY = p.height / 2,
+ cameraZ = cameraY / Math.tan(cameraFOV / 2),
+ cameraNear = cameraZ / 10,
+ cameraFar = cameraZ * 10,
+ cameraAspect = p.width / p.height;
+
+ var vertArray = [],
+ curveVertArray = [],
+ curveVertCount = 0,
+ isCurve = false,
+ isBezier = false,
+ firstVert = true;
+
+ //PShape stuff
+ var curShapeMode = PConstants.CORNER;
+
+ // Stores states for pushStyle() and popStyle().
+ var styleArray = [];
+
+ // The vertices for the box cannot be specified using a triangle strip since each
+ // side of the cube must have its own set of normals.
+ // Vertices are specified in a counter-clockwise order.
+ // Triangles are in this order: back, front, right, bottom, left, top.
+ var boxVerts = new Float32Array([
+ 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5,
+ 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5,
+ 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5,
+ -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5,
+ 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5]);
+
+ var boxOutlineVerts = new Float32Array([
+ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5,
+ -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5,
+ 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5,
+ -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5,
+ -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5]);
+
+ var boxNorms = new Float32Array([
+ 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1,
+ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0,
+ 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0,
+ -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0,
+ 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]);
+
+ // These verts are used for the fill and stroke using TRIANGLE_FAN and LINE_LOOP.
+ var rectVerts = new Float32Array([0,0,0, 0,1,0, 1,1,0, 1,0,0]);
+
+ var rectNorms = new Float32Array([0,0,1, 0,0,1, 0,0,1, 0,0,1]);
+
+ // Shader for points and lines in begin/endShape.
+ var vertexShaderSrcUnlitShape =
+ "varying vec4 vFrontColor;" +
+
+ "attribute vec3 aVertex;" +
+ "attribute vec4 aColor;" +
+
+ "uniform mat4 uView;" +
+ "uniform mat4 uProjection;" +
+ "uniform float uPointSize;" +
+
+ "void main(void) {" +
+ " vFrontColor = aColor;" +
+ " gl_PointSize = uPointSize;" +
+ " gl_Position = uProjection * uView * vec4(aVertex, 1.0);" +
+ "}";
+
+ var fragmentShaderSrcUnlitShape =
+ "#ifdef GL_ES\n" +
+ "precision highp float;\n" +
+ "#endif\n" +
+
+ "varying vec4 vFrontColor;" +
+ "uniform bool uSmooth;" +
+
+ "void main(void){" +
+ " if(uSmooth == true){" +
+ " float dist = distance(gl_PointCoord, vec2(0.5));" +
+ " if(dist > 0.5){" +
+ " discard;" +
+ " }" +
+ " }" +
+ " gl_FragColor = vFrontColor;" +
+ "}";
+
+ // Shader for rect, text, box outlines, sphere outlines, point() and line().
+ var vertexShaderSrc2D =
+ "varying vec4 vFrontColor;" +
+
+ "attribute vec3 aVertex;" +
+ "attribute vec2 aTextureCoord;" +
+ "uniform vec4 uColor;" +
+
+ "uniform mat4 uModel;" +
+ "uniform mat4 uView;" +
+ "uniform mat4 uProjection;" +
+ "uniform float uPointSize;" +
+ "varying vec2 vTextureCoord;"+
+
+ "void main(void) {" +
+ " gl_PointSize = uPointSize;" +
+ " vFrontColor = uColor;" +
+ " gl_Position = uProjection * uView * uModel * vec4(aVertex, 1.0);" +
+ " vTextureCoord = aTextureCoord;" +
+ "}";
+
+ var fragmentShaderSrc2D =
+ "#ifdef GL_ES\n" +
+ "precision highp float;\n" +
+ "#endif\n" +
+
+ "varying vec4 vFrontColor;" +
+ "varying vec2 vTextureCoord;"+
+
+ "uniform sampler2D uSampler;"+
+ "uniform int uIsDrawingText;"+
+ "uniform bool uSmooth;" +
+
+ "void main(void){" +
+ // WebGL does not support POINT_SMOOTH, so we do it ourselves
+ " if(uSmooth == true){" +
+ " float dist = distance(gl_PointCoord, vec2(0.5));" +
+ " if(dist > 0.5){" +
+ " discard;" +
+ " }" +
+ " }" +
+
+ " if(uIsDrawingText == 1){" +
+ " float alpha = texture2D(uSampler, vTextureCoord).a;"+
+ " gl_FragColor = vec4(vFrontColor.rgb * alpha, alpha);"+
+ " }" +
+ " else{" +
+ " gl_FragColor = vFrontColor;" +
+ " }" +
+ "}";
+
+ var webglMaxTempsWorkaround = /Windows/.test(navigator.userAgent);
+
+ // Vertex shader for boxes and spheres.
+ var vertexShaderSrc3D =
+ "varying vec4 vFrontColor;" +
+
+ "attribute vec3 aVertex;" +
+ "attribute vec3 aNormal;" +
+ "attribute vec4 aColor;" +
+ "attribute vec2 aTexture;" +
+ "varying vec2 vTexture;" +
+
+ "uniform vec4 uColor;" +
+
+ "uniform bool uUsingMat;" +
+ "uniform vec3 uSpecular;" +
+ "uniform vec3 uMaterialEmissive;" +
+ "uniform vec3 uMaterialAmbient;" +
+ "uniform vec3 uMaterialSpecular;" +
+ "uniform float uShininess;" +
+
+ "uniform mat4 uModel;" +
+ "uniform mat4 uView;" +
+ "uniform mat4 uProjection;" +
+ "uniform mat4 uNormalTransform;" +
+
+ "uniform int uLightCount;" +
+ "uniform vec3 uFalloff;" +
+
+ // Careful changing the order of these fields. Some cards
+ // have issues with memory alignment.
+ "struct Light {" +
+ " int type;" +
+ " vec3 color;" +
+ " vec3 position;" +
+ " vec3 direction;" +
+ " float angle;" +
+ " vec3 halfVector;" +
+ " float concentration;" +
+ "};" +
+
+ // nVidia cards have issues with arrays of structures
+ // so instead we create 8 instances of Light.
+ "uniform Light uLights0;" +
+ "uniform Light uLights1;" +
+ "uniform Light uLights2;" +
+ "uniform Light uLights3;" +
+ "uniform Light uLights4;" +
+ "uniform Light uLights5;" +
+ "uniform Light uLights6;" +
+ "uniform Light uLights7;" +
+
+ // GLSL does not support switch.
+ "Light getLight(int index){" +
+ " if(index == 0) return uLights0;" +
+ " if(index == 1) return uLights1;" +
+ " if(index == 2) return uLights2;" +
+ " if(index == 3) return uLights3;" +
+ " if(index == 4) return uLights4;" +
+ " if(index == 5) return uLights5;" +
+ " if(index == 6) return uLights6;" +
+ // Do not use a conditional for the last return statement
+ // because some video cards will fail and complain that
+ // "not all paths return".
+ " return uLights7;" +
+ "}" +
+
+ "void AmbientLight( inout vec3 totalAmbient, in vec3 ecPos, in Light light ) {" +
+ // Get the vector from the light to the vertex and
+ // get the distance from the current vector to the light position.
+ " float d = length( light.position - ecPos );" +
+ " float attenuation = 1.0 / ( uFalloff[0] + ( uFalloff[1] * d ) + ( uFalloff[2] * d * d ));" +
+ " totalAmbient += light.color * attenuation;" +
+ "}" +
+
+ /*
+ col - accumulated color
+ spec - accumulated specular highlight
+ vertNormal - Normal of the vertex
+ ecPos - eye coordinate position
+ light - light structure
+ */
+ "void DirectionalLight( inout vec3 col, inout vec3 spec, in vec3 vertNormal, in vec3 ecPos, in Light light ) {" +
+ " float powerFactor = 0.0;" +
+ " float nDotVP = max(0.0, dot( vertNormal, normalize(-light.position) ));" +
+ " float nDotVH = max(0.0, dot( vertNormal, normalize(-light.position-normalize(ecPos) )));" +
+
+ " if( nDotVP != 0.0 ){" +
+ " powerFactor = pow( nDotVH, uShininess );" +
+ " }" +
+
+ " col += light.color * nDotVP;" +
+ " spec += uSpecular * powerFactor;" +
+ "}" +
+
+ /*
+ col - accumulated color
+ spec - accumulated specular highlight
+ vertNormal - Normal of the vertex
+ ecPos - eye coordinate position
+ light - light structure
+ */
+ "void PointLight( inout vec3 col, inout vec3 spec, in vec3 vertNormal, in vec3 ecPos, in Light light ) {" +
+ " float powerFactor;" +
+
+ // Get the vector from the light to the vertex.
+ " vec3 VP = light.position - ecPos;" +
+
+ // Get the distance from the current vector to the light position.
+ " float d = length( VP ); " +
+
+ // Normalize the light ray so it can be used in the dot product operation.
+ " VP = normalize( VP );" +
+
+ " float attenuation = 1.0 / ( uFalloff[0] + ( uFalloff[1] * d ) + ( uFalloff[2] * d * d ));" +
+
+ " float nDotVP = max( 0.0, dot( vertNormal, VP ));" +
+ " vec3 halfVector = normalize( VP - normalize(ecPos) );" +
+ " float nDotHV = max( 0.0, dot( vertNormal, halfVector ));" +
+
+ " if( nDotVP == 0.0 ) {" +
+ " powerFactor = 0.0;" +
+ " }" +
+ " else {" +
+ " powerFactor = pow( nDotHV, uShininess );" +
+ " }" +
+
+ " spec += uSpecular * powerFactor * attenuation;" +
+ " col += light.color * nDotVP * attenuation;" +
+ "}" +
+
+ /*
+ col - accumulated color
+ spec - accumulated specular highlight
+ vertNormal - Normal of the vertex
+ ecPos - eye coordinate position
+ light - light structure
+ */
+ "void SpotLight( inout vec3 col, inout vec3 spec, in vec3 vertNormal, in vec3 ecPos, in Light light ) {" +
+ " float spotAttenuation;" +
+ " float powerFactor = 0.0;" +
+
+ // Calculate the vector from the current vertex to the light.
+ " vec3 VP = light.position - ecPos;" +
+ " vec3 ldir = normalize( -light.direction );" +
+
+ // Get the distance from the spotlight and the vertex
+ " float d = length( VP );" +
+ " VP = normalize( VP );" +
+
+ " float attenuation = 1.0 / ( uFalloff[0] + ( uFalloff[1] * d ) + ( uFalloff[2] * d * d ) );" +
+
+ // Dot product of the vector from vertex to light and light direction.
+ " float spotDot = dot( VP, ldir );" +
+
+ // If the vertex falls inside the cone
+ (webglMaxTempsWorkaround ? // Windows reports max temps error if light.angle is used
+ " spotAttenuation = 1.0; " :
+ " if( spotDot > cos( light.angle ) ) {" +
+ " spotAttenuation = pow( spotDot, light.concentration );" +
+ " }" +
+ " else{" +
+ " spotAttenuation = 0.0;" +
+ " }" +
+ " attenuation *= spotAttenuation;" +
+ "") +
+
+ " float nDotVP = max( 0.0, dot( vertNormal, VP ) );" +
+ " vec3 halfVector = normalize( VP - normalize(ecPos) );" +
+ " float nDotHV = max( 0.0, dot( vertNormal, halfVector ) );" +
+
+ " if( nDotVP != 0.0 ) {" +
+ " powerFactor = pow( nDotHV, uShininess );" +
+ " }" +
+
+ " spec += uSpecular * powerFactor * attenuation;" +
+ " col += light.color * nDotVP * attenuation;" +
+ "}" +
+
+ "void main(void) {" +
+ " vec3 finalAmbient = vec3( 0.0 );" +
+ " vec3 finalDiffuse = vec3( 0.0 );" +
+ " vec3 finalSpecular = vec3( 0.0 );" +
+
+ " vec4 col = uColor;" +
+
+ " if ( uColor[0] == -1.0 ){" +
+ " col = aColor;" +
+ " }" +
+
+ // We use the sphere vertices as the normals when we create the sphere buffer.
+ // But this only works if the sphere vertices are unit length, so we
+ // have to normalize the normals here. Since this is only required for spheres
+ // we could consider placing this in a conditional later on.
+ " vec3 norm = normalize(vec3( uNormalTransform * vec4( aNormal, 0.0 ) ));" +
+
+ " vec4 ecPos4 = uView * uModel * vec4(aVertex, 1.0);" +
+ " vec3 ecPos = (vec3(ecPos4))/ecPos4.w;" +
+
+ // If there were no lights this draw call, just use the
+ // assigned fill color of the shape and the specular value.
+ " if( uLightCount == 0 ) {" +
+ " vFrontColor = col + vec4(uMaterialSpecular, 1.0);" +
+ " }" +
+ " else {" +
+ // WebGL forces us to iterate over a constant value
+ // so we can't iterate using lightCount.
+ " for( int i = 0; i < 8; i++ ) {" +
+ " Light l = getLight(i);" +
+
+ // We can stop iterating if we know we have gone past
+ // the number of lights which are actually on. This gives us a
+ // significant performance increase with high vertex counts.
+ " if( i >= uLightCount ){" +
+ " break;" +
+ " }" +
+
+ " if( l.type == 0 ) {" +
+ " AmbientLight( finalAmbient, ecPos, l );" +
+ " }" +
+ " else if( l.type == 1 ) {" +
+ " DirectionalLight( finalDiffuse, finalSpecular, norm, ecPos, l );" +
+ " }" +
+ " else if( l.type == 2 ) {" +
+ " PointLight( finalDiffuse, finalSpecular, norm, ecPos, l );" +
+ " }" +
+ " else {" +
+ " SpotLight( finalDiffuse, finalSpecular, norm, ecPos, l );" +
+ " }" +
+ " }" +
+
+ " if( uUsingMat == false ) {" +
+ " vFrontColor = vec4(" +
+ " vec3( col ) * finalAmbient +" +
+ " vec3( col ) * finalDiffuse +" +
+ " vec3( col ) * finalSpecular," +
+ " col[3] );" +
+ " }" +
+ " else{" +
+ " vFrontColor = vec4( " +
+ " uMaterialEmissive + " +
+ " (vec3(col) * uMaterialAmbient * finalAmbient ) + " +
+ " (vec3(col) * finalDiffuse) + " +
+ " (uMaterialSpecular * finalSpecular), " +
+ " col[3] );" +
+ " }" +
+ " }" +
+
+ " vTexture.xy = aTexture.xy;" +
+ " gl_Position = uProjection * uView * uModel * vec4( aVertex, 1.0 );" +
+ "}";
+
+ var fragmentShaderSrc3D =
+ "#ifdef GL_ES\n" +
+ "precision highp float;\n" +
+ "#endif\n" +
+
+ "varying vec4 vFrontColor;" +
+
+ "uniform sampler2D uSampler;" +
+ "uniform bool uUsingTexture;" +
+ "varying vec2 vTexture;" +
+
+ // In Processing, when a texture is used, the fill color is ignored
+ // vec4(1.0,1.0,1.0,0.5)
+ "void main(void){" +
+ " if( uUsingTexture ){" +
+ " gl_FragColor = vec4(texture2D(uSampler, vTexture.xy)) * vFrontColor;" +
+ " }"+
+ " else{" +
+ " gl_FragColor = vFrontColor;" +
+ " }" +
+ "}";
+
+ ////////////////////////////////////////////////////////////////////////////
+ // 3D Functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /*
+ * Sets a uniform variable in a program object to a particular
+ * value. Before calling this function, ensure the correct
+ * program object has been installed as part of the current
+ * rendering state by calling useProgram.
+ *
+ * On some systems, if the variable exists in the shader but isn't used,
+ * the compiler will optimize it out and this function will fail.
+ *
+ * @param {String} cacheId
+ * @param {WebGLProgram} programObj program object returned from
+ * createProgramObject
+ * @param {String} varName the name of the variable in the shader
+ * @param {float | Array} varValue either a scalar value or an Array
+ *
+ * @returns none
+ *
+ * @see uniformi
+ * @see uniformMatrix
+ */
+ function uniformf(cacheId, programObj, varName, varValue) {
+ var varLocation = curContextCache.locations[cacheId];
+ if(varLocation === undef) {
+ varLocation = curContext.getUniformLocation(programObj, varName);
+ curContextCache.locations[cacheId] = varLocation;
+ }
+ // the variable won't be found if it was optimized out.
+ if (varLocation !== null) {
+ if (varValue.length === 4) {
+ curContext.uniform4fv(varLocation, varValue);
+ } else if (varValue.length === 3) {
+ curContext.uniform3fv(varLocation, varValue);
+ } else if (varValue.length === 2) {
+ curContext.uniform2fv(varLocation, varValue);
+ } else {
+ curContext.uniform1f(varLocation, varValue);
+ }
+ }
+ }
+
+ /**
+ * Sets a uniform int or int array in a program object to a particular
+ * value. Before calling this function, ensure the correct
+ * program object has been installed as part of the current
+ * rendering state.
+ *
+ * On some systems, if the variable exists in the shader but isn't used,
+ * the compiler will optimize it out and this function will fail.
+ *
+ * @param {String} cacheId
+ * @param {WebGLProgram} programObj program object returned from
+ * createProgramObject
+ * @param {String} varName the name of the variable in the shader
+ * @param {int | Array} varValue either a scalar value or an Array
+ *
+ * @returns none
+ *
+ * @see uniformf
+ * @see uniformMatrix
+ */
+ function uniformi(cacheId, programObj, varName, varValue) {
+ var varLocation = curContextCache.locations[cacheId];
+ if(varLocation === undef) {
+ varLocation = curContext.getUniformLocation(programObj, varName);
+ curContextCache.locations[cacheId] = varLocation;
+ }
+ // the variable won't be found if it was optimized out.
+ if (varLocation !== null) {
+ if (varValue.length === 4) {
+ curContext.uniform4iv(varLocation, varValue);
+ } else if (varValue.length === 3) {
+ curContext.uniform3iv(varLocation, varValue);
+ } else if (varValue.length === 2) {
+ curContext.uniform2iv(varLocation, varValue);
+ } else {
+ curContext.uniform1i(varLocation, varValue);
+ }
+ }
+ }
+
+ /**
+ * Sets the value of a uniform matrix variable in a program
+ * object. Before calling this function, ensure the correct
+ * program object has been installed as part of the current
+ * rendering state.
+ *
+ * On some systems, if the variable exists in the shader but
+ * isn't used, the compiler will optimize it out and this
+ * function will fail.
+ *
+ * @param {String} cacheId
+ * @param {WebGLProgram} programObj program object returned from
+ * createProgramObject
+ * @param {String} varName the name of the variable in the shader
+ * @param {boolean} transpose must be false
+ * @param {Array} matrix an array of 4, 9 or 16 values
+ *
+ * @returns none
+ *
+ * @see uniformi
+ * @see uniformf
+ */
+ function uniformMatrix(cacheId, programObj, varName, transpose, matrix) {
+ var varLocation = curContextCache.locations[cacheId];
+ if(varLocation === undef) {
+ varLocation = curContext.getUniformLocation(programObj, varName);
+ curContextCache.locations[cacheId] = varLocation;
+ }
+ // The variable won't be found if it was optimized out.
+ if (varLocation !== -1) {
+ if (matrix.length === 16) {
+ curContext.uniformMatrix4fv(varLocation, transpose, matrix);
+ } else if (matrix.length === 9) {
+ curContext.uniformMatrix3fv(varLocation, transpose, matrix);
+ } else {
+ curContext.uniformMatrix2fv(varLocation, transpose, matrix);
+ }
+ }
+ }
+
+ /**
+ * Binds the VBO, sets the vertex attribute data for the program
+ * object and enables the attribute.
+ *
+ * On some systems, if the attribute exists in the shader but
+ * isn't used, the compiler will optimize it out and this
+ * function will fail.
+ *
+ * @param {String} cacheId
+ * @param {WebGLProgram} programObj program object returned from
+ * createProgramObject
+ * @param {String} varName the name of the variable in the shader
+ * @param {int} size the number of components per vertex attribute
+ * @param {WebGLBuffer} VBO Vertex Buffer Object
+ *
+ * @returns none
+ *
+ * @see disableVertexAttribPointer
+ */
+ function vertexAttribPointer(cacheId, programObj, varName, size, VBO) {
+ var varLocation = curContextCache.attributes[cacheId];
+ if(varLocation === undef) {
+ varLocation = curContext.getAttribLocation(programObj, varName);
+ curContextCache.attributes[cacheId] = varLocation;
+ }
+ if (varLocation !== -1) {
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, VBO);
+ curContext.vertexAttribPointer(varLocation, size, curContext.FLOAT, false, 0, 0);
+ curContext.enableVertexAttribArray(varLocation);
+ }
+ }
+
+ /**
+ * Disables a program object attribute from being sent to WebGL.
+ *
+ * @param {String} cacheId
+ * @param {WebGLProgram} programObj program object returned from
+ * createProgramObject
+ * @param {String} varName name of the attribute
+ *
+ * @returns none
+ *
+ * @see vertexAttribPointer
+ */
+ function disableVertexAttribPointer(cacheId, programObj, varName){
+ var varLocation = curContextCache.attributes[cacheId];
+ if(varLocation === undef) {
+ varLocation = curContext.getAttribLocation(programObj, varName);
+ curContextCache.attributes[cacheId] = varLocation;
+ }
+ if (varLocation !== -1) {
+ curContext.disableVertexAttribArray(varLocation);
+ }
+ }
+
+ /**
+ * Creates a WebGL program object.
+ *
+ * @param {String} vetexShaderSource
+ * @param {String} fragmentShaderSource
+ *
+ * @returns {WebGLProgram} A program object
+ */
+ var createProgramObject = function(curContext, vetexShaderSource, fragmentShaderSource) {
+ var vertexShaderObject = curContext.createShader(curContext.VERTEX_SHADER);
+ curContext.shaderSource(vertexShaderObject, vetexShaderSource);
+ curContext.compileShader(vertexShaderObject);
+ if (!curContext.getShaderParameter(vertexShaderObject, curContext.COMPILE_STATUS)) {
+ throw curContext.getShaderInfoLog(vertexShaderObject);
+ }
+
+ var fragmentShaderObject = curContext.createShader(curContext.FRAGMENT_SHADER);
+ curContext.shaderSource(fragmentShaderObject, fragmentShaderSource);
+ curContext.compileShader(fragmentShaderObject);
+ if (!curContext.getShaderParameter(fragmentShaderObject, curContext.COMPILE_STATUS)) {
+ throw curContext.getShaderInfoLog(fragmentShaderObject);
+ }
+
+ var programObject = curContext.createProgram();
+ curContext.attachShader(programObject, vertexShaderObject);
+ curContext.attachShader(programObject, fragmentShaderObject);
+ curContext.linkProgram(programObject);
+ if (!curContext.getProgramParameter(programObject, curContext.LINK_STATUS)) {
+ throw "Error linking shaders.";
+ }
+
+ return programObject;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // 2D/3D drawing handling
+ ////////////////////////////////////////////////////////////////////////////
+ var imageModeCorner = function(x, y, w, h, whAreSizes) {
+ return {
+ x: x,
+ y: y,
+ w: w,
+ h: h
+ };
+ };
+ var imageModeConvert = imageModeCorner;
+
+ var imageModeCorners = function(x, y, w, h, whAreSizes) {
+ return {
+ x: x,
+ y: y,
+ w: whAreSizes ? w : w - x,
+ h: whAreSizes ? h : h - y
+ };
+ };
+
+ var imageModeCenter = function(x, y, w, h, whAreSizes) {
+ return {
+ x: x - w / 2,
+ y: y - h / 2,
+ w: w,
+ h: h
+ };
+ };
+
+ // Objects for shared, 2D and 3D contexts
+ var DrawingShared = function(){};
+ var Drawing2D = function(){};
+ var Drawing3D = function(){};
+ var DrawingPre = function(){};
+
+ // Setup the prototype chain
+ Drawing2D.prototype = new DrawingShared();
+ Drawing2D.prototype.constructor = Drawing2D;
+ Drawing3D.prototype = new DrawingShared();
+ Drawing3D.prototype.constructor = Drawing3D;
+ DrawingPre.prototype = new DrawingShared();
+ DrawingPre.prototype.constructor = DrawingPre;
+
+ // A no-op function for when the user calls 3D functions from a 2D sketch
+ // We can change this to a throw or console.error() later if we want
+ DrawingShared.prototype.a3DOnlyFunction = noop;
+
+ /**
+ * The shape() function displays shapes to the screen.
+ * Processing currently works with SVG shapes only.
+ * The <b>shape</b> parameter specifies the shape to display and the <b>x</b>
+ * and <b>y</b> parameters define the location of the shape from its
+ * upper-left corner.
+ * The shape is displayed at its original size unless the <b>width</b>
+ * and <b>height</b> parameters specify a different size.
+ * The <b>shapeMode()</b> function changes the way the parameters work.
+ * A call to <b>shapeMode(CORNERS)</b>, for example, will change the width
+ * and height parameters to define the x and y values of the opposite corner
+ * of the shape.
+ * <br><br>
+ * Note complex shapes may draw awkwardly with P2D, P3D, and OPENGL. Those
+ * renderers do not yet support shapes that have holes or complicated breaks.
+ *
+ * @param {PShape} shape the shape to display
+ * @param {int|float} x x-coordinate of the shape
+ * @param {int|float} y y-coordinate of the shape
+ * @param {int|float} width width to display the shape
+ * @param {int|float} height height to display the shape
+ *
+ * @see PShape
+ * @see loadShape()
+ * @see shapeMode()
+ */
+ p.shape = function(shape, x, y, width, height) {
+ if (arguments.length >= 1 && arguments[0] !== null) {
+ if (shape.isVisible()) {
+ p.pushMatrix();
+ if (curShapeMode === PConstants.CENTER) {
+ if (arguments.length === 5) {
+ p.translate(x - width/2, y - height/2);
+ p.scale(width / shape.getWidth(), height / shape.getHeight());
+ } else if (arguments.length === 3) {
+ p.translate(x - shape.getWidth()/2, - shape.getHeight()/2);
+ } else {
+ p.translate(-shape.getWidth()/2, -shape.getHeight()/2);
+ }
+ } else if (curShapeMode === PConstants.CORNER) {
+ if (arguments.length === 5) {
+ p.translate(x, y);
+ p.scale(width / shape.getWidth(), height / shape.getHeight());
+ } else if (arguments.length === 3) {
+ p.translate(x, y);
+ }
+ } else if (curShapeMode === PConstants.CORNERS) {
+ if (arguments.length === 5) {
+ width -= x;
+ height -= y;
+ p.translate(x, y);
+ p.scale(width / shape.getWidth(), height / shape.getHeight());
+ } else if (arguments.length === 3) {
+ p.translate(x, y);
+ }
+ }
+ shape.draw(p);
+ if ((arguments.length === 1 && curShapeMode === PConstants.CENTER ) || arguments.length > 1) {
+ p.popMatrix();
+ }
+ }
+ }
+ };
+
+ /**
+ * The shapeMode() function modifies the location from which shapes draw.
+ * The default mode is <b>shapeMode(CORNER)</b>, which specifies the
+ * location to be the upper left corner of the shape and uses the third
+ * and fourth parameters of <b>shape()</b> to specify the width and height.
+ * The syntax <b>shapeMode(CORNERS)</b> uses the first and second parameters
+ * of <b>shape()</b> to set the location of one corner and uses the third
+ * and fourth parameters to set the opposite corner.
+ * The syntax <b>shapeMode(CENTER)</b> draws the shape from its center point
+ * and uses the third and forth parameters of <b>shape()</b> to specify the
+ * width and height.
+ * The parameter must be written in "ALL CAPS" because Processing syntax
+ * is case sensitive.
+ *
+ * @param {int} mode One of CORNER, CORNERS, CENTER
+ *
+ * @see shape()
+ * @see rectMode()
+ */
+ p.shapeMode = function (mode) {
+ curShapeMode = mode;
+ };
+
+ /**
+ * The loadShape() function loads vector shapes into a variable of type PShape. Currently, only SVG files may be loaded.
+ * In most cases, <b>loadShape()</b> should be used inside <b>setup()</b> because loading shapes inside <b>draw()</b> will reduce the speed of a sketch.
+ *
+ * @param {String} filename an SVG file
+ *
+ * @return {PShape} a object of type PShape or null
+ * @see PShape
+ * @see PApplet#shape()
+ * @see PApplet#shapeMode()
+ */
+ p.loadShape = function (filename) {
+ if (arguments.length === 1) {
+ if (filename.indexOf(".svg") > -1) {
+ return new PShapeSVG(null, filename);
+ }
+ }
+ return null;
+ };
+
+ /**
+ * Processing 2.0 function for loading XML files.
+ *
+ * @param {String} uri The uri for the xml file to load.
+ *
+ * @return {XML} An XML object representing the xml data.
+ */
+ p.loadXML = function(uri) {
+ return new XML(p, uri);
+ };
+
+ /**
+ * Processing 2.0 function for creating XML elements from string
+ *
+ * @param {String} xml the XML source code
+ *
+ * @return {XML} An XML object representation of the input XML markup.
+ */
+ p.parseXML = function(xmlstring) {
+ var element = new XML();
+ element.parse(xmlstring);
+ return element;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // 2D Matrix
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Helper function for printMatrix(). Finds the largest scalar
+ * in the matrix, then number of digits left of the decimal.
+ * Call from PMatrix2D and PMatrix3D's print() function.
+ */
+ var printMatrixHelper = function(elements) {
+ var big = 0;
+ for (var i = 0; i < elements.length; i++) {
+ if (i !== 0) {
+ big = Math.max(big, Math.abs(elements[i]));
+ } else {
+ big = Math.abs(elements[i]);
+ }
+ }
+
+ var digits = (big + "").indexOf(".");
+ if (digits === 0) {
+ digits = 1;
+ } else if (digits === -1) {
+ digits = (big + "").length;
+ }
+
+ return digits;
+ };
+ /**
+ * PMatrix2D is a 3x2 affine matrix implementation. The constructor accepts another PMatrix2D or a list of six float elements.
+ * If no parameters are provided the matrix is set to the identity matrix.
+ *
+ * @param {PMatrix2D} matrix the initial matrix to set to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fifth element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ var PMatrix2D = p.PMatrix2D = function() {
+ if (arguments.length === 0) {
+ this.reset();
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ this.set(arguments[0].array());
+ } else if (arguments.length === 6) {
+ this.set(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
+ }
+ };
+ /**
+ * PMatrix2D methods
+ */
+ PMatrix2D.prototype = {
+ /**
+ * @member PMatrix2D
+ * The set() function sets the matrix elements. The function accepts either another PMatrix2D, an array of elements, or a list of six floats.
+ *
+ * @param {PMatrix2D} matrix the matrix to set this matrix to
+ * @param {float[]} elements an array of elements to set this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ set: function() {
+ if (arguments.length === 6) {
+ var a = arguments;
+ this.set([a[0], a[1], a[2],
+ a[3], a[4], a[5]]);
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ this.elements = arguments[0].array();
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ this.elements = arguments[0].slice();
+ }
+ },
+ /**
+ * @member PMatrix2D
+ * The get() function returns a copy of this PMatrix2D.
+ *
+ * @return {PMatrix2D} a copy of this PMatrix2D
+ */
+ get: function() {
+ var outgoing = new PMatrix2D();
+ outgoing.set(this.elements);
+ return outgoing;
+ },
+ /**
+ * @member PMatrix2D
+ * The reset() function sets this PMatrix2D to the identity matrix.
+ */
+ reset: function() {
+ this.set([1, 0, 0, 0, 1, 0]);
+ },
+ /**
+ * @member PMatrix2D
+ * The array() function returns a copy of the element values.
+ * @addon
+ *
+ * @return {float[]} returns a copy of the element values
+ */
+ array: function array() {
+ return this.elements.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The translate() function translates this matrix by moving the current coordinates to the location specified by tx and ty.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ */
+ translate: function(tx, ty) {
+ this.elements[2] = tx * this.elements[0] + ty * this.elements[1] + this.elements[2];
+ this.elements[5] = tx * this.elements[3] + ty * this.elements[4] + this.elements[5];
+ },
+ /**
+ * @member PMatrix2D
+ * The invTranslate() function translates this matrix by moving the current coordinates to the negative location specified by tx and ty.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ */
+ invTranslate: function(tx, ty) {
+ this.translate(-tx, -ty);
+ },
+ /**
+ * @member PMatrix2D
+ * The transpose() function is not used in processingjs.
+ */
+ transpose: function() {
+ // Does nothing in Processing.
+ },
+ /**
+ * @member PMatrix2D
+ * The mult() function multiplied this matrix.
+ * If two array elements are passed in the function will multiply a two element vector against this matrix.
+ * If target is null or not length four, a new float array will be returned.
+ * The values for vec and target can be the same (though that's less efficient).
+ * If two PVectors are passed in the function multiply the x and y coordinates of a PVector against this matrix.
+ *
+ * @param {PVector} source, target the PVectors used to multiply this matrix
+ * @param {float[]} source, target the arrays used to multiply this matrix
+ *
+ * @return {PVector|float[]} returns a PVector or an array representing the new matrix
+ */
+ mult: function(source, target) {
+ var x, y;
+ if (source instanceof PVector) {
+ x = source.x;
+ y = source.y;
+ if (!target) {
+ target = new PVector();
+ }
+ } else if (source instanceof Array) {
+ x = source[0];
+ y = source[1];
+ if (!target) {
+ target = [];
+ }
+ }
+ if (target instanceof Array) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2];
+ target[1] = this.elements[3] * x + this.elements[4] * y + this.elements[5];
+ } else if (target instanceof PVector) {
+ target.x = this.elements[0] * x + this.elements[1] * y + this.elements[2];
+ target.y = this.elements[3] * x + this.elements[4] * y + this.elements[5];
+ target.z = 0;
+ }
+ return target;
+ },
+ /**
+ * @member PMatrix2D
+ * The multX() function calculates the x component of a vector from a transformation.
+ *
+ * @param {float} x the x component of the vector being transformed
+ * @param {float} y the y component of the vector being transformed
+ *
+ * @return {float} returnes the result of the calculation
+ */
+ multX: function(x, y) {
+ return (x * this.elements[0] + y * this.elements[1] + this.elements[2]);
+ },
+ /**
+ * @member PMatrix2D
+ * The multY() function calculates the y component of a vector from a transformation.
+ *
+ * @param {float} x the x component of the vector being transformed
+ * @param {float} y the y component of the vector being transformed
+ *
+ * @return {float} returnes the result of the calculation
+ */
+ multY: function(x, y) {
+ return (x * this.elements[3] + y * this.elements[4] + this.elements[5]);
+ },
+ /**
+ * @member PMatrix2D
+ * The skewX() function skews the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewX: function(angle) {
+ this.apply(1, 0, 1, angle, 0, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The skewY() function skews the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewY: function(angle) {
+ this.apply(1, 0, 1, 0, angle, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The shearX() function shears the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ shearX: function(angle) {
+ this.apply(1, 0, 1, Math.tan(angle) , 0, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The shearY() function shears the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ shearY: function(angle) {
+ this.apply(1, 0, 1, 0, Math.tan(angle), 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The determinant() function calvculates the determinant of this matrix.
+ *
+ * @return {float} the determinant of the matrix
+ */
+ determinant: function() {
+ return (this.elements[0] * this.elements[4] - this.elements[1] * this.elements[3]);
+ },
+ /**
+ * @member PMatrix2D
+ * The invert() function inverts this matrix
+ *
+ * @return {boolean} true if successful
+ */
+ invert: function() {
+ var d = this.determinant();
+ if (Math.abs( d ) > PConstants.MIN_INT) {
+ var old00 = this.elements[0];
+ var old01 = this.elements[1];
+ var old02 = this.elements[2];
+ var old10 = this.elements[3];
+ var old11 = this.elements[4];
+ var old12 = this.elements[5];
+ this.elements[0] = old11 / d;
+ this.elements[3] = -old10 / d;
+ this.elements[1] = -old01 / d;
+ this.elements[4] = old00 / d;
+ this.elements[2] = (old01 * old12 - old11 * old02) / d;
+ this.elements[5] = (old10 * old02 - old00 * old12) / d;
+ return true;
+ }
+ return false;
+ },
+ /**
+ * @member PMatrix2D
+ * The scale() function increases or decreases the size of a shape by expanding and contracting vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a two parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ */
+ scale: function(sx, sy) {
+ if (sx && !sy) {
+ sy = sx;
+ }
+ if (sx && sy) {
+ this.elements[0] *= sx;
+ this.elements[1] *= sy;
+ this.elements[3] *= sx;
+ this.elements[4] *= sy;
+ }
+ },
+ /**
+ * @member PMatrix2D
+ * The invScale() function decreases or increases the size of a shape by contracting and expanding vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a two parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ */
+ invScale: function(sx, sy) {
+ if (sx && !sy) {
+ sy = sx;
+ }
+ this.scale(1 / sx, 1 / sy);
+ },
+ /**
+ * @member PMatrix2D
+ * The apply() function multiplies the current matrix by the one specified through the parameters. Note that either a PMatrix2D or a list of floats can be passed in.
+ *
+ * @param {PMatrix2D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ apply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 6) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, this.elements[2],
+ 0, 0, this.elements[5]];
+ var e = 0;
+ for (var row = 0; row < 2; row++) {
+ for (var col = 0; col < 3; col++, e++) {
+ result[e] += this.elements[row * 3 + 0] * source[col + 0] +
+ this.elements[row * 3 + 1] * source[col + 3];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The preApply() function applies another matrix to the left of this one. Note that either a PMatrix2D or elements of a matrix can be passed in.
+ *
+ * @param {PMatrix2D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ preApply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 6) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+ var result = [0, 0, source[2],
+ 0, 0, source[5]];
+ result[2] = source[2] + this.elements[2] * source[0] + this.elements[5] * source[1];
+ result[5] = source[5] + this.elements[2] * source[3] + this.elements[5] * source[4];
+ result[0] = this.elements[0] * source[0] + this.elements[3] * source[1];
+ result[3] = this.elements[0] * source[3] + this.elements[3] * source[4];
+ result[1] = this.elements[1] * source[0] + this.elements[4] * source[1];
+ result[4] = this.elements[1] * source[3] + this.elements[4] * source[4];
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The rotate() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotate: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ var temp1 = this.elements[0];
+ var temp2 = this.elements[1];
+ this.elements[0] = c * temp1 + s * temp2;
+ this.elements[1] = -s * temp1 + c * temp2;
+ temp1 = this.elements[3];
+ temp2 = this.elements[4];
+ this.elements[3] = c * temp1 + s * temp2;
+ this.elements[4] = -s * temp1 + c * temp2;
+ },
+ /**
+ * @member PMatrix2D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateZ: function(angle) {
+ this.rotate(angle);
+ },
+ /**
+ * @member PMatrix2D
+ * The invRotateZ() function rotates the matrix in opposite direction.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ invRotateZ: function(angle) {
+ this.rotateZ(angle - Math.PI);
+ },
+ /**
+ * @member PMatrix2D
+ * The print() function prints out the elements of this matrix
+ */
+ print: function() {
+ var digits = printMatrixHelper(this.elements);
+ var output = "" + p.nfs(this.elements[0], digits, 4) + " " +
+ p.nfs(this.elements[1], digits, 4) + " " +
+ p.nfs(this.elements[2], digits, 4) + "\n" +
+ p.nfs(this.elements[3], digits, 4) + " " +
+ p.nfs(this.elements[4], digits, 4) + " " +
+ p.nfs(this.elements[5], digits, 4) + "\n\n";
+ p.println(output);
+ }
+ };
+
+ /**
+ * PMatrix3D is a 4x4 matrix implementation. The constructor accepts another PMatrix3D or a list of six or sixteen float elements.
+ * If no parameters are provided the matrix is set to the identity matrix.
+ */
+ var PMatrix3D = p.PMatrix3D = function() {
+ // When a matrix is created, it is set to an identity matrix
+ this.reset();
+ };
+ /**
+ * PMatrix3D methods
+ */
+ PMatrix3D.prototype = {
+ /**
+ * @member PMatrix2D
+ * The set() function sets the matrix elements. The function accepts either another PMatrix3D, an array of elements, or a list of six or sixteen floats.
+ *
+ * @param {PMatrix3D} matrix the initial matrix to set to
+ * @param {float[]} elements an array of elements to set this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ set: function() {
+ if (arguments.length === 16) {
+ this.elements = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ this.elements = arguments[0].array();
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ this.elements = arguments[0].slice();
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The get() function returns a copy of this PMatrix3D.
+ *
+ * @return {PMatrix3D} a copy of this PMatrix3D
+ */
+ get: function() {
+ var outgoing = new PMatrix3D();
+ outgoing.set(this.elements);
+ return outgoing;
+ },
+ /**
+ * @member PMatrix3D
+ * The reset() function sets this PMatrix3D to the identity matrix.
+ */
+ reset: function() {
+ this.elements = [1,0,0,0,
+ 0,1,0,0,
+ 0,0,1,0,
+ 0,0,0,1];
+ },
+ /**
+ * @member PMatrix3D
+ * The array() function returns a copy of the element values.
+ * @addon
+ *
+ * @return {float[]} returns a copy of the element values
+ */
+ array: function array() {
+ return this.elements.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The translate() function translates this matrix by moving the current coordinates to the location specified by tx, ty, and tz.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ * @param {float} tz the z-axis coordinate to move to
+ */
+ translate: function(tx, ty, tz) {
+ if (tz === undef) {
+ tz = 0;
+ }
+
+ this.elements[3] += tx * this.elements[0] + ty * this.elements[1] + tz * this.elements[2];
+ this.elements[7] += tx * this.elements[4] + ty * this.elements[5] + tz * this.elements[6];
+ this.elements[11] += tx * this.elements[8] + ty * this.elements[9] + tz * this.elements[10];
+ this.elements[15] += tx * this.elements[12] + ty * this.elements[13] + tz * this.elements[14];
+ },
+ /**
+ * @member PMatrix3D
+ * The transpose() function transpose this matrix.
+ */
+ transpose: function() {
+ var temp = this.elements[4];
+ this.elements[4] = this.elements[1];
+ this.elements[1] = temp;
+
+ temp = this.elements[8];
+ this.elements[8] = this.elements[2];
+ this.elements[2] = temp;
+
+ temp = this.elements[6];
+ this.elements[6] = this.elements[9];
+ this.elements[9] = temp;
+
+ temp = this.elements[3];
+ this.elements[3] = this.elements[12];
+ this.elements[12] = temp;
+
+ temp = this.elements[7];
+ this.elements[7] = this.elements[13];
+ this.elements[13] = temp;
+
+ temp = this.elements[11];
+ this.elements[11] = this.elements[14];
+ this.elements[14] = temp;
+ },
+ /**
+ * @member PMatrix3D
+ * The mult() function multiplied this matrix.
+ * If two array elements are passed in the function will multiply a two element vector against this matrix.
+ * If target is null or not length four, a new float array will be returned.
+ * The values for vec and target can be the same (though that's less efficient).
+ * If two PVectors are passed in the function multiply the x and y coordinates of a PVector against this matrix.
+ *
+ * @param {PVector} source, target the PVectors used to multiply this matrix
+ * @param {float[]} source, target the arrays used to multiply this matrix
+ *
+ * @return {PVector|float[]} returns a PVector or an array representing the new matrix
+ */
+ mult: function(source, target) {
+ var x, y, z, w;
+ if (source instanceof PVector) {
+ x = source.x;
+ y = source.y;
+ z = source.z;
+ w = 1;
+ if (!target) {
+ target = new PVector();
+ }
+ } else if (source instanceof Array) {
+ x = source[0];
+ y = source[1];
+ z = source[2];
+ w = source[3] || 1;
+
+ if ( !target || (target.length !== 3 && target.length !== 4) ) {
+ target = [0, 0, 0];
+ }
+ }
+
+ if (target instanceof Array) {
+ if (target.length === 3) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ target[1] = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ target[2] = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ } else if (target.length === 4) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3] * w;
+ target[1] = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7] * w;
+ target[2] = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11] * w;
+ target[3] = this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15] * w;
+ }
+ }
+ if (target instanceof PVector) {
+ target.x = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ target.y = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ target.z = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ }
+ return target;
+ },
+ /**
+ * @member PMatrix3D
+ * The preApply() function applies another matrix to the left of this one. Note that either a PMatrix3D or elements of a matrix can be passed in.
+ *
+ * @param {PMatrix3D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ preApply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 16) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0];
+ var e = 0;
+ for (var row = 0; row < 4; row++) {
+ for (var col = 0; col < 4; col++, e++) {
+ result[e] += this.elements[col + 0] * source[row * 4 + 0] + this.elements[col + 4] *
+ source[row * 4 + 1] + this.elements[col + 8] * source[row * 4 + 2] +
+ this.elements[col + 12] * source[row * 4 + 3];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The apply() function multiplies the current matrix by the one specified through the parameters. Note that either a PMatrix3D or a list of floats can be passed in.
+ *
+ * @param {PMatrix3D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ apply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 16) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0];
+ var e = 0;
+ for (var row = 0; row < 4; row++) {
+ for (var col = 0; col < 4; col++, e++) {
+ result[e] += this.elements[row * 4 + 0] * source[col + 0] + this.elements[row * 4 + 1] *
+ source[col + 4] + this.elements[row * 4 + 2] * source[col + 8] +
+ this.elements[row * 4 + 3] * source[col + 12];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The rotate() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotate: function(angle, v0, v1, v2) {
+ if (arguments.length < 4) {
+ this.rotateZ(angle);
+ } else {
+ var v = new PVector(v0, v1, v2);
+ var m = v.mag();
+ if (m === 0) {
+ return;
+ } else if (m != 1) {
+ v.normalize();
+ v0 = v.x;
+ v1 = v.y;
+ v2 = v.z;
+ }
+ var c = p.cos(angle);
+ var s = p.sin(angle);
+ var t = 1.0 - c;
+
+ this.apply((t * v0 * v0) + c,
+ (t * v0 * v1) - (s * v2),
+ (t * v0 * v2) + (s * v1),
+ 0,
+ (t * v0 * v1) + (s * v2),
+ (t * v1 * v1) + c,
+ (t * v1 * v2) - (s * v0),
+ 0,
+ (t * v0 * v2) - (s * v1),
+ (t * v1 * v2) + (s * v0),
+ (t * v2 * v2) + c,
+ 0,
+ 0, 0, 0, 1);
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The invApply() function applies the inverted matrix to this matrix.
+ *
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ *
+ * @return {boolean} returns true if the operation was successful.
+ */
+ invApply: function() {
+ if (inverseCopy === undef) {
+ inverseCopy = new PMatrix3D();
+ }
+ var a = arguments;
+ inverseCopy.set(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8],
+ a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
+
+ if (!inverseCopy.invert()) {
+ return false;
+ }
+ this.preApply(inverseCopy);
+ return true;
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateX: function(angle) {
+ var c = p.cos(angle);
+ var s = p.sin(angle);
+ this.apply([1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateY() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateY: function(angle) {
+ var c = p.cos(angle);
+ var s = p.sin(angle);
+ this.apply([c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateZ: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ this.apply([c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The scale() function increases or decreases the size of a matrix by expanding and contracting vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a three parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ * @param {float} sz the amount to scale on the z-axis
+ */
+ scale: function(sx, sy, sz) {
+ if (sx && !sy && !sz) {
+ sy = sz = sx;
+ } else if (sx && sy && !sz) {
+ sz = 1;
+ }
+
+ if (sx && sy && sz) {
+ this.elements[0] *= sx;
+ this.elements[1] *= sy;
+ this.elements[2] *= sz;
+ this.elements[4] *= sx;
+ this.elements[5] *= sy;
+ this.elements[6] *= sz;
+ this.elements[8] *= sx;
+ this.elements[9] *= sy;
+ this.elements[10] *= sz;
+ this.elements[12] *= sx;
+ this.elements[13] *= sy;
+ this.elements[14] *= sz;
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The skewX() function skews the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewX: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, t, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The skewY() function skews the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewY: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, 0, 0, 0, t, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The shearX() function shears the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of shear specified in radians
+ */
+ shearX: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, t, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The shearY() function shears the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of shear specified in radians
+ */
+ shearY: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, 0, 0, 0, t, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ multX: function(x, y, z, w) {
+ if (!z) {
+ return this.elements[0] * x + this.elements[1] * y + this.elements[3];
+ }
+ if (!w) {
+ return this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ }
+ return this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3] * w;
+ },
+ multY: function(x, y, z, w) {
+ if (!z) {
+ return this.elements[4] * x + this.elements[5] * y + this.elements[7];
+ }
+ if (!w) {
+ return this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ }
+ return this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7] * w;
+ },
+ multZ: function(x, y, z, w) {
+ if (!w) {
+ return this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ }
+ return this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11] * w;
+ },
+ multW: function(x, y, z, w) {
+ if (!w) {
+ return this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15];
+ }
+ return this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15] * w;
+ },
+ /**
+ * @member PMatrix3D
+ * The invert() function inverts this matrix
+ *
+ * @return {boolean} true if successful
+ */
+ invert: function() {
+ var fA0 = this.elements[0] * this.elements[5] - this.elements[1] * this.elements[4];
+ var fA1 = this.elements[0] * this.elements[6] - this.elements[2] * this.elements[4];
+ var fA2 = this.elements[0] * this.elements[7] - this.elements[3] * this.elements[4];
+ var fA3 = this.elements[1] * this.elements[6] - this.elements[2] * this.elements[5];
+ var fA4 = this.elements[1] * this.elements[7] - this.elements[3] * this.elements[5];
+ var fA5 = this.elements[2] * this.elements[7] - this.elements[3] * this.elements[6];
+ var fB0 = this.elements[8] * this.elements[13] - this.elements[9] * this.elements[12];
+ var fB1 = this.elements[8] * this.elements[14] - this.elements[10] * this.elements[12];
+ var fB2 = this.elements[8] * this.elements[15] - this.elements[11] * this.elements[12];
+ var fB3 = this.elements[9] * this.elements[14] - this.elements[10] * this.elements[13];
+ var fB4 = this.elements[9] * this.elements[15] - this.elements[11] * this.elements[13];
+ var fB5 = this.elements[10] * this.elements[15] - this.elements[11] * this.elements[14];
+
+ // Determinant
+ var fDet = fA0 * fB5 - fA1 * fB4 + fA2 * fB3 + fA3 * fB2 - fA4 * fB1 + fA5 * fB0;
+
+ // Account for a very small value
+ // return false if not successful.
+ if (Math.abs(fDet) <= 1e-9) {
+ return false;
+ }
+
+ var kInv = [];
+ kInv[0] = +this.elements[5] * fB5 - this.elements[6] * fB4 + this.elements[7] * fB3;
+ kInv[4] = -this.elements[4] * fB5 + this.elements[6] * fB2 - this.elements[7] * fB1;
+ kInv[8] = +this.elements[4] * fB4 - this.elements[5] * fB2 + this.elements[7] * fB0;
+ kInv[12] = -this.elements[4] * fB3 + this.elements[5] * fB1 - this.elements[6] * fB0;
+ kInv[1] = -this.elements[1] * fB5 + this.elements[2] * fB4 - this.elements[3] * fB3;
+ kInv[5] = +this.elements[0] * fB5 - this.elements[2] * fB2 + this.elements[3] * fB1;
+ kInv[9] = -this.elements[0] * fB4 + this.elements[1] * fB2 - this.elements[3] * fB0;
+ kInv[13] = +this.elements[0] * fB3 - this.elements[1] * fB1 + this.elements[2] * fB0;
+ kInv[2] = +this.elements[13] * fA5 - this.elements[14] * fA4 + this.elements[15] * fA3;
+ kInv[6] = -this.elements[12] * fA5 + this.elements[14] * fA2 - this.elements[15] * fA1;
+ kInv[10] = +this.elements[12] * fA4 - this.elements[13] * fA2 + this.elements[15] * fA0;
+ kInv[14] = -this.elements[12] * fA3 + this.elements[13] * fA1 - this.elements[14] * fA0;
+ kInv[3] = -this.elements[9] * fA5 + this.elements[10] * fA4 - this.elements[11] * fA3;
+ kInv[7] = +this.elements[8] * fA5 - this.elements[10] * fA2 + this.elements[11] * fA1;
+ kInv[11] = -this.elements[8] * fA4 + this.elements[9] * fA2 - this.elements[11] * fA0;
+ kInv[15] = +this.elements[8] * fA3 - this.elements[9] * fA1 + this.elements[10] * fA0;
+
+ // Inverse using Determinant
+ var fInvDet = 1.0 / fDet;
+ kInv[0] *= fInvDet;
+ kInv[1] *= fInvDet;
+ kInv[2] *= fInvDet;
+ kInv[3] *= fInvDet;
+ kInv[4] *= fInvDet;
+ kInv[5] *= fInvDet;
+ kInv[6] *= fInvDet;
+ kInv[7] *= fInvDet;
+ kInv[8] *= fInvDet;
+ kInv[9] *= fInvDet;
+ kInv[10] *= fInvDet;
+ kInv[11] *= fInvDet;
+ kInv[12] *= fInvDet;
+ kInv[13] *= fInvDet;
+ kInv[14] *= fInvDet;
+ kInv[15] *= fInvDet;
+
+ this.elements = kInv.slice();
+ return true;
+ },
+ toString: function() {
+ var str = "";
+ for (var i = 0; i < 15; i++) {
+ str += this.elements[i] + ", ";
+ }
+ str += this.elements[15];
+ return str;
+ },
+ /**
+ * @member PMatrix3D
+ * The print() function prints out the elements of this matrix
+ */
+ print: function() {
+ var digits = printMatrixHelper(this.elements);
+
+ var output = "" + p.nfs(this.elements[0], digits, 4) + " " + p.nfs(this.elements[1], digits, 4) +
+ " " + p.nfs(this.elements[2], digits, 4) + " " + p.nfs(this.elements[3], digits, 4) +
+ "\n" + p.nfs(this.elements[4], digits, 4) + " " + p.nfs(this.elements[5], digits, 4) +
+ " " + p.nfs(this.elements[6], digits, 4) + " " + p.nfs(this.elements[7], digits, 4) +
+ "\n" + p.nfs(this.elements[8], digits, 4) + " " + p.nfs(this.elements[9], digits, 4) +
+ " " + p.nfs(this.elements[10], digits, 4) + " " + p.nfs(this.elements[11], digits, 4) +
+ "\n" + p.nfs(this.elements[12], digits, 4) + " " + p.nfs(this.elements[13], digits, 4) +
+ " " + p.nfs(this.elements[14], digits, 4) + " " + p.nfs(this.elements[15], digits, 4) + "\n\n";
+ p.println(output);
+ },
+ invTranslate: function(tx, ty, tz) {
+ this.preApply(1, 0, 0, -tx, 0, 1, 0, -ty, 0, 0, 1, -tz, 0, 0, 0, 1);
+ },
+ invRotateX: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1]);
+ },
+ invRotateY: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1]);
+ },
+ invRotateZ: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
+ },
+ invScale: function(x, y, z) {
+ this.preApply([1 / x, 0, 0, 0, 0, 1 / y, 0, 0, 0, 0, 1 / z, 0, 0, 0, 0, 1]);
+ }
+ };
+
+ /**
+ * @private
+ * The matrix stack stores the transformations and translations that occur within the space.
+ */
+ var PMatrixStack = p.PMatrixStack = function() {
+ this.matrixStack = [];
+ };
+
+ /**
+ * @member PMatrixStack
+ * load pushes the matrix given in the function into the stack
+ *
+ * @param {Object | Array} matrix the matrix to be pushed into the stack
+ */
+ PMatrixStack.prototype.load = function() {
+ var tmpMatrix = drawing.$newPMatrix();
+
+ if (arguments.length === 1) {
+ tmpMatrix.set(arguments[0]);
+ } else {
+ tmpMatrix.set(arguments);
+ }
+ this.matrixStack.push(tmpMatrix);
+ };
+
+ Drawing2D.prototype.$newPMatrix = function() {
+ return new PMatrix2D();
+ };
+
+ Drawing3D.prototype.$newPMatrix = function() {
+ return new PMatrix3D();
+ };
+
+ /**
+ * @member PMatrixStack
+ * push adds a duplicate of the top of the stack onto the stack - uses the peek function
+ */
+ PMatrixStack.prototype.push = function() {
+ this.matrixStack.push(this.peek());
+ };
+
+ /**
+ * @member PMatrixStack
+ * pop removes returns the matrix at the top of the stack
+ *
+ * @returns {Object} the matrix at the top of the stack
+ */
+ PMatrixStack.prototype.pop = function() {
+ return this.matrixStack.pop();
+ };
+
+ /**
+ * @member PMatrixStack
+ * peek returns but doesn't remove the matrix at the top of the stack
+ *
+ * @returns {Object} the matrix at the top of the stack
+ */
+ PMatrixStack.prototype.peek = function() {
+ var tmpMatrix = drawing.$newPMatrix();
+
+ tmpMatrix.set(this.matrixStack[this.matrixStack.length - 1]);
+ return tmpMatrix;
+ };
+
+ /**
+ * @member PMatrixStack
+ * this function multiplies the matrix at the top of the stack with the matrix given as a parameter
+ *
+ * @param {Object | Array} matrix the matrix to be multiplied into the stack
+ */
+ PMatrixStack.prototype.mult = function(matrix) {
+ this.matrixStack[this.matrixStack.length - 1].apply(matrix);
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Array handling
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * The split() function breaks a string into pieces using a character or string
+ * as the divider. The delim parameter specifies the character or characters that
+ * mark the boundaries between each piece. A String[] array is returned that contains
+ * each of the pieces.
+ * If the result is a set of numbers, you can convert the String[] array to to a float[]
+ * or int[] array using the datatype conversion functions int() and float() (see example above).
+ * The splitTokens() function works in a similar fashion, except that it splits using a range
+ * of characters instead of a specific character or sequence.
+ *
+ * @param {String} str the String to be split
+ * @param {String} delim the character or String used to separate the data
+ *
+ * @returns {string[]} The new string array
+ *
+ * @see splitTokens
+ * @see join
+ * @see trim
+ */
+ p.split = function(str, delim) {
+ return str.split(delim);
+ };
+
+ /**
+ * The splitTokens() function splits a String at one or many character "tokens." The tokens
+ * parameter specifies the character or characters to be used as a boundary.
+ * If no tokens character is specified, any whitespace character is used to split.
+ * Whitespace characters include tab (\t), line feed (\n), carriage return (\r), form
+ * feed (\f), and space. To convert a String to an array of integers or floats, use the
+ * datatype conversion functions int() and float() to convert the array of Strings.
+ *
+ * @param {String} str the String to be split
+ * @param {Char[]} tokens list of individual characters that will be used as separators
+ *
+ * @returns {string[]} The new string array
+ *
+ * @see split
+ * @see join
+ * @see trim
+ */
+ p.splitTokens = function(str, tokens) {
+ if (tokens === undef) {
+ return str.split(/\s+/g);
+ }
+
+ var chars = tokens.split(/()/g),
+ buffer = "",
+ len = str.length,
+ i, c,
+ tokenized = [];
+
+ for (i = 0; i < len; i++) {
+ c = str[i];
+ if (chars.indexOf(c) > -1) {
+ if (buffer !== "") {
+ tokenized.push(buffer);
+ }
+ buffer = "";
+ } else {
+ buffer += c;
+ }
+ }
+
+ if (buffer !== "") {
+ tokenized.push(buffer);
+ }
+
+ return tokenized;
+ };
+
+ /**
+ * Expands an array by one element and adds data to the new position. The datatype of
+ * the element parameter must be the same as the datatype of the array.
+ * When using an array of objects, the data returned from the function must be cast to
+ * the object array's data type. For example: SomeClass[] items = (SomeClass[])
+ * append(originalArray, element).
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array boolean[],
+ * byte[], char[], int[], float[], or String[], or an array of objects
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} element new data for the array
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see shorten
+ * @see expand
+ */
+ p.append = function(array, element) {
+ array[array.length] = element;
+ return array;
+ };
+
+ /**
+ * Concatenates two arrays. For example, concatenating the array { 1, 2, 3 } and the
+ * array { 4, 5, 6 } yields { 1, 2, 3, 4, 5, 6 }. Both parameters must be arrays of the
+ * same datatype.
+ * When using an array of objects, the data returned from the function must be cast to the
+ * object array's data type. For example: SomeClass[] items = (SomeClass[]) concat(array1, array2).
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array1 boolean[],
+ * byte[], char[], int[], float[], String[], or an array of objects
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array2 boolean[],
+ * byte[], char[], int[], float[], String[], or an array of objects
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see splice
+ */
+ p.concat = function(array1, array2) {
+ return array1.concat(array2);
+ };
+
+ /**
+ * Sorts an array of numbers from smallest to largest and puts an array of
+ * words in alphabetical order. The original array is not modified, a
+ * re-ordered array is returned. The count parameter states the number of
+ * elements to sort. For example if there are 12 elements in an array and
+ * if count is the value 5, only the first five elements on the array will
+ * be sorted. Alphabetical ordering is case insensitive.
+ *
+ * @param {String[] | int[] | float[]} array Array of elements to sort
+ * @param {int} numElem Number of elements to sort
+ *
+ * @returns {String[] | int[] | float[]} Array (same datatype as the input)
+ *
+ * @see reverse
+ */
+ p.sort = function(array, numElem) {
+ var ret = [];
+
+ // depending on the type used (int, float) or string
+ // we'll need to use a different compare function
+ if (array.length > 0) {
+ // copy since we need to return another array
+ var elemsToCopy = numElem > 0 ? numElem : array.length;
+ for (var i = 0; i < elemsToCopy; i++) {
+ ret.push(array[i]);
+ }
+ if (typeof array[0] === "string") {
+ ret.sort();
+ }
+ // int or float
+ else {
+ ret.sort(function(a, b) {
+ return a - b;
+ });
+ }
+
+ // copy on the rest of the elements that were not sorted in case the user
+ // only wanted a subset of an array to be sorted.
+ if (numElem > 0) {
+ for (var j = ret.length; j < array.length; j++) {
+ ret.push(array[j]);
+ }
+ }
+ }
+ return ret;
+ };
+
+ /**
+ * Inserts a value or array of values into an existing array. The first two parameters must
+ * be of the same datatype. The array parameter defines the array which will be modified
+ * and the second parameter defines the data which will be inserted. When using an array
+ * of objects, the data returned from the function must be cast to the object array's data
+ * type. For example: SomeClass[] items = (SomeClass[]) splice(array1, array2, index).
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array boolean[],
+ * byte[], char[], int[], float[], String[], or an array of objects
+ * @param {boolean|byte|char|int|float|String|boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects}
+ * value boolean, byte, char, int, float, String, boolean[], byte[], char[], int[],
+ * float[], String[], or other Object: value or an array of objects to be spliced in
+ * @param {int} index position in the array from which to insert data
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see contract
+ * @see subset
+ */
+ p.splice = function(array, value, index) {
+
+ // Trying to splice an empty array into "array" in P5 won't do
+ // anything, just return the original.
+ if(value.length === 0)
+ {
+ return array;
+ }
+
+ // If the second argument was an array, we'll need to iterate over all
+ // the "value" elements and add one by one because
+ // array.splice(index, 0, value);
+ // would create a multi-dimensional array which isn't what we want.
+ if(value instanceof Array) {
+ for(var i = 0, j = index; i < value.length; j++,i++) {
+ array.splice(j, 0, value[i]);
+ }
+ } else {
+ array.splice(index, 0, value);
+ }
+
+ return array;
+ };
+
+ /**
+ * Extracts an array of elements from an existing array. The array parameter defines the
+ * array from which the elements will be copied and the offset and length parameters determine
+ * which elements to extract. If no length is given, elements will be extracted from the offset
+ * to the end of the array. When specifying the offset remember the first array element is 0.
+ * This function does not change the source array.
+ * When using an array of objects, the data returned from the function must be cast to the
+ * object array's data type.
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array boolean[],
+ * byte[], char[], int[], float[], String[], or an array of objects
+ * @param {int} offset position to begin
+ * @param {int} length number of values to extract
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see splice
+ */
+ p.subset = function(array, offset, length) {
+ var end = (length !== undef) ? offset + length : array.length;
+ return array.slice(offset, end);
+ };
+
+ /**
+ * Combines an array of Strings into one String, each separated by the character(s) used for
+ * the separator parameter. To join arrays of ints or floats, it's necessary to first convert
+ * them to strings using nf() or nfs().
+ *
+ * @param {Array} array array of Strings
+ * @param {char|String} separator char or String to be placed between each item
+ *
+ * @returns {String} The combined string
+ *
+ * @see split
+ * @see trim
+ * @see nf
+ * @see nfs
+ */
+ p.join = function(array, seperator) {
+ return array.join(seperator);
+ };
+
+ /**
+ * Decreases an array by one element and returns the shortened array. When using an
+ * array of objects, the data returned from the function must be cast to the object array's
+ * data type. For example: SomeClass[] items = (SomeClass[]) shorten(originalArray).
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array
+ * boolean[], byte[], char[], int[], float[], or String[], or an array of objects
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see append
+ * @see expand
+ */
+ p.shorten = function(ary) {
+ var newary = [];
+
+ // copy array into new array
+ var len = ary.length;
+ for (var i = 0; i < len; i++) {
+ newary[i] = ary[i];
+ }
+ newary.pop();
+
+ return newary;
+ };
+
+ /**
+ * Increases the size of an array. By default, this function doubles the size of the array,
+ * but the optional newSize parameter provides precise control over the increase in size.
+ * When using an array of objects, the data returned from the function must be cast to the
+ * object array's data type. For example: SomeClass[] items = (SomeClass[]) expand(originalArray).
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} ary
+ * boolean[], byte[], char[], int[], float[], String[], or an array of objects
+ * @param {int} newSize positive int: new size for the array
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see contract
+ */
+ p.expand = function(ary, targetSize) {
+ var temp = ary.slice(0),
+ newSize = targetSize || ary.length * 2;
+ temp.length = newSize;
+ return temp;
+ };
+
+ /**
+ * Copies an array (or part of an array) to another array. The src array is copied to the
+ * dst array, beginning at the position specified by srcPos and into the position specified
+ * by dstPos. The number of elements to copy is determined by length. The simplified version
+ * with two arguments copies an entire array to another of the same size. It is equivalent
+ * to "arrayCopy(src, 0, dst, 0, src.length)". This function is far more efficient for copying
+ * array data than iterating through a for and copying each element.
+ *
+ * @param {Array} src an array of any data type: the source array
+ * @param {Array} dest an array of any data type (as long as it's the same as src): the destination array
+ * @param {int} srcPos starting position in the source array
+ * @param {int} destPos starting position in the destination array
+ * @param {int} length number of array elements to be copied
+ *
+ * @returns none
+ */
+ p.arrayCopy = function() { // src, srcPos, dest, destPos, length) {
+ var src, srcPos = 0, dest, destPos = 0, length;
+
+ if (arguments.length === 2) {
+ // recall itself and copy src to dest from start index 0 to 0 of src.length
+ src = arguments[0];
+ dest = arguments[1];
+ length = src.length;
+ } else if (arguments.length === 3) {
+ // recall itself and copy src to dest from start index 0 to 0 of length
+ src = arguments[0];
+ dest = arguments[1];
+ length = arguments[2];
+ } else if (arguments.length === 5) {
+ src = arguments[0];
+ srcPos = arguments[1];
+ dest = arguments[2];
+ destPos = arguments[3];
+ length = arguments[4];
+ }
+
+ // copy src to dest from index srcPos to index destPos of length recursivly on objects
+ for (var i = srcPos, j = destPos; i < length + srcPos; i++, j++) {
+ if (dest[j] !== undef) {
+ dest[j] = src[i];
+ } else {
+ throw "array index out of bounds exception";
+ }
+ }
+ };
+
+ /**
+ * Reverses the order of an array.
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]} array
+ * boolean[], byte[], char[], int[], float[], or String[]
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see sort
+ */
+ p.reverse = function(array) {
+ return array.reverse();
+ };
+
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Color functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ // helper functions for internal blending modes
+ p.mix = function(a, b, f) {
+ return a + (((b - a) * f) >> 8);
+ };
+
+ p.peg = function(n) {
+ return (n < 0) ? 0 : ((n > 255) ? 255 : n);
+ };
+
+ // blending modes
+ /**
+ * These are internal blending modes used for BlendColor()
+ *
+ * @param {Color} c1 First Color to blend
+ * @param {Color} c2 Second Color to blend
+ *
+ * @returns {Color} The blended Color
+ *
+ * @see BlendColor
+ * @see Blend
+ */
+ p.modes = (function() {
+ var ALPHA_MASK = PConstants.ALPHA_MASK,
+ RED_MASK = PConstants.RED_MASK,
+ GREEN_MASK = PConstants.GREEN_MASK,
+ BLUE_MASK = PConstants.BLUE_MASK,
+ min = Math.min,
+ max = Math.max;
+
+ function applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb) {
+ var a = min(((c1 & 0xff000000) >>> 24) + f, 0xff) << 24;
+
+ var r = (ar + (((cr - ar) * f) >> 8));
+ r = ((r < 0) ? 0 : ((r > 255) ? 255 : r)) << 16;
+
+ var g = (ag + (((cg - ag) * f) >> 8));
+ g = ((g < 0) ? 0 : ((g > 255) ? 255 : g)) << 8;
+
+ var b = ab + (((cb - ab) * f) >> 8);
+ b = (b < 0) ? 0 : ((b > 255) ? 255 : b);
+
+ return (a | r | g | b);
+ }
+
+ return {
+ replace: function(c1, c2) {
+ return c2;
+ },
+ blend: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK),
+ ag = (c1 & GREEN_MASK),
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK),
+ bg = (c2 & GREEN_MASK),
+ bb = (c2 & BLUE_MASK);
+
+ return (min(((c1 & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
+ (ar + (((br - ar) * f) >> 8)) & RED_MASK |
+ (ag + (((bg - ag) * f) >> 8)) & GREEN_MASK |
+ (ab + (((bb - ab) * f) >> 8)) & BLUE_MASK);
+ },
+ add: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24;
+ return (min(((c1 & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
+ min(((c1 & RED_MASK) + ((c2 & RED_MASK) >> 8) * f), RED_MASK) & RED_MASK |
+ min(((c1 & GREEN_MASK) + ((c2 & GREEN_MASK) >> 8) * f), GREEN_MASK) & GREEN_MASK |
+ min((c1 & BLUE_MASK) + (((c2 & BLUE_MASK) * f) >> 8), BLUE_MASK));
+ },
+ subtract: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24;
+ return (min(((c1 & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
+ max(((c1 & RED_MASK) - ((c2 & RED_MASK) >> 8) * f), GREEN_MASK) & RED_MASK |
+ max(((c1 & GREEN_MASK) - ((c2 & GREEN_MASK) >> 8) * f), BLUE_MASK) & GREEN_MASK |
+ max((c1 & BLUE_MASK) - (((c2 & BLUE_MASK) * f) >> 8), 0));
+ },
+ lightest: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24;
+ return (min(((c1 & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
+ max(c1 & RED_MASK, ((c2 & RED_MASK) >> 8) * f) & RED_MASK |
+ max(c1 & GREEN_MASK, ((c2 & GREEN_MASK) >> 8) * f) & GREEN_MASK |
+ max(c1 & BLUE_MASK, ((c2 & BLUE_MASK) * f) >> 8));
+ },
+ darkest: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK),
+ ag = (c1 & GREEN_MASK),
+ ab = (c1 & BLUE_MASK),
+ br = min(c1 & RED_MASK, ((c2 & RED_MASK) >> 8) * f),
+ bg = min(c1 & GREEN_MASK, ((c2 & GREEN_MASK) >> 8) * f),
+ bb = min(c1 & BLUE_MASK, ((c2 & BLUE_MASK) * f) >> 8);
+
+ return (min(((c1 & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
+ (ar + (((br - ar) * f) >> 8)) & RED_MASK |
+ (ag + (((bg - ag) * f) >> 8)) & GREEN_MASK |
+ (ab + (((bb - ab) * f) >> 8)) & BLUE_MASK);
+ },
+ difference: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = (ar > br) ? (ar - br) : (br - ar),
+ cg = (ag > bg) ? (ag - bg) : (bg - ag),
+ cb = (ab > bb) ? (ab - bb) : (bb - ab);
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ exclusion: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = ar + br - ((ar * br) >> 7),
+ cg = ag + bg - ((ag * bg) >> 7),
+ cb = ab + bb - ((ab * bb) >> 7);
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ multiply: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = (ar * br) >> 8,
+ cg = (ag * bg) >> 8,
+ cb = (ab * bb) >> 8;
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ screen: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = 255 - (((255 - ar) * (255 - br)) >> 8),
+ cg = 255 - (((255 - ag) * (255 - bg)) >> 8),
+ cb = 255 - (((255 - ab) * (255 - bb)) >> 8);
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ hard_light: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = (br < 128) ? ((ar * br) >> 7) : (255 - (((255 - ar) * (255 - br)) >> 7)),
+ cg = (bg < 128) ? ((ag * bg) >> 7) : (255 - (((255 - ag) * (255 - bg)) >> 7)),
+ cb = (bb < 128) ? ((ab * bb) >> 7) : (255 - (((255 - ab) * (255 - bb)) >> 7));
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ soft_light: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = ((ar * br) >> 7) + ((ar * ar) >> 8) - ((ar * ar * br) >> 15),
+ cg = ((ag * bg) >> 7) + ((ag * ag) >> 8) - ((ag * ag * bg) >> 15),
+ cb = ((ab * bb) >> 7) + ((ab * ab) >> 8) - ((ab * ab * bb) >> 15);
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ overlay: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = (ar < 128) ? ((ar * br) >> 7) : (255 - (((255 - ar) * (255 - br)) >> 7)),
+ cg = (ag < 128) ? ((ag * bg) >> 7) : (255 - (((255 - ag) * (255 - bg)) >> 7)),
+ cb = (ab < 128) ? ((ab * bb) >> 7) : (255 - (((255 - ab) * (255 - bb)) >> 7));
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ dodge: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK);
+
+ var cr = 255;
+ if (br !== 255) {
+ cr = (ar << 8) / (255 - br);
+ cr = (cr < 0) ? 0 : ((cr > 255) ? 255 : cr);
+ }
+
+ var cg = 255;
+ if (bg !== 255) {
+ cg = (ag << 8) / (255 - bg);
+ cg = (cg < 0) ? 0 : ((cg > 255) ? 255 : cg);
+ }
+
+ var cb = 255;
+ if (bb !== 255) {
+ cb = (ab << 8) / (255 - bb);
+ cb = (cb < 0) ? 0 : ((cb > 255) ? 255 : cb);
+ }
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ burn: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK);
+
+ var cr = 0;
+ if (br !== 0) {
+ cr = ((255 - ar) << 8) / br;
+ cr = 255 - ((cr < 0) ? 0 : ((cr > 255) ? 255 : cr));
+ }
+
+ var cg = 0;
+ if (bg !== 0) {
+ cg = ((255 - ag) << 8) / bg;
+ cg = 255 - ((cg < 0) ? 0 : ((cg > 255) ? 255 : cg));
+ }
+
+ var cb = 0;
+ if (bb !== 0) {
+ cb = ((255 - ab) << 8) / bb;
+ cb = 255 - ((cb < 0) ? 0 : ((cb > 255) ? 255 : cb));
+ }
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ }
+ };
+ }());
+
+ function color$4(aValue1, aValue2, aValue3, aValue4) {
+ var r, g, b, a;
+
+ if (curColorMode === PConstants.HSB) {
+ var rgb = p.color.toRGB(aValue1, aValue2, aValue3);
+ r = rgb[0];
+ g = rgb[1];
+ b = rgb[2];
+ } else {
+ r = Math.round(255 * (aValue1 / colorModeX));
+ g = Math.round(255 * (aValue2 / colorModeY));
+ b = Math.round(255 * (aValue3 / colorModeZ));
+ }
+
+ a = Math.round(255 * (aValue4 / colorModeA));
+
+ // Limit values less than 0 and greater than 255
+ r = (r < 0) ? 0 : r;
+ g = (g < 0) ? 0 : g;
+ b = (b < 0) ? 0 : b;
+ a = (a < 0) ? 0 : a;
+ r = (r > 255) ? 255 : r;
+ g = (g > 255) ? 255 : g;
+ b = (b > 255) ? 255 : b;
+ a = (a > 255) ? 255 : a;
+
+ // Create color int
+ return (a << 24) & PConstants.ALPHA_MASK | (r << 16) & PConstants.RED_MASK | (g << 8) & PConstants.GREEN_MASK | b & PConstants.BLUE_MASK;
+ }
+
+ function color$2(aValue1, aValue2) {
+ var a;
+
+ // Color int and alpha
+ if (aValue1 & PConstants.ALPHA_MASK) {
+ a = Math.round(255 * (aValue2 / colorModeA));
+ // Limit values less than 0 and greater than 255
+ a = (a > 255) ? 255 : a;
+ a = (a < 0) ? 0 : a;
+
+ return aValue1 - (aValue1 & PConstants.ALPHA_MASK) + ((a << 24) & PConstants.ALPHA_MASK);
+ }
+ // Grayscale and alpha
+ if (curColorMode === PConstants.RGB) {
+ return color$4(aValue1, aValue1, aValue1, aValue2);
+ }
+ if (curColorMode === PConstants.HSB) {
+ return color$4(0, 0, (aValue1 / colorModeX) * colorModeZ, aValue2);
+ }
+ }
+
+ function color$1(aValue1) {
+ // Grayscale
+ if (aValue1 <= colorModeX && aValue1 >= 0) {
+ if (curColorMode === PConstants.RGB) {
+ return color$4(aValue1, aValue1, aValue1, colorModeA);
+ }
+ if (curColorMode === PConstants.HSB) {
+ return color$4(0, 0, (aValue1 / colorModeX) * colorModeZ, colorModeA);
+ }
+ }
+ // Color int
+ if (aValue1) {
+ if (aValue1 > 2147483647) {
+ // Java Overflow
+ aValue1 -= 4294967296;
+ }
+ return aValue1;
+ }
+ }
+
+ /**
+ * Creates colors for storing in variables of the color datatype. The parameters are
+ * interpreted as RGB or HSB values depending on the current colorMode(). The default
+ * mode is RGB values from 0 to 255 and therefore, the function call color(255, 204, 0)
+ * will return a bright yellow color. More about how colors are stored can be found in
+ * the reference for the color datatype.
+ *
+ * @param {int|float} aValue1 red or hue or grey values relative to the current color range.
+ * Also can be color value in hexadecimal notation (i.e. #FFCC00 or 0xFFFFCC00)
+ * @param {int|float} aValue2 green or saturation values relative to the current color range
+ * @param {int|float} aValue3 blue or brightness values relative to the current color range
+ * @param {int|float} aValue4 relative to current color range. Represents alpha
+ *
+ * @returns {color} the color
+ *
+ * @see colorMode
+ */
+ p.color = function(aValue1, aValue2, aValue3, aValue4) {
+
+ // 4 arguments: (R, G, B, A) or (H, S, B, A)
+ if (aValue1 !== undef && aValue2 !== undef && aValue3 !== undef && aValue4 !== undef) {
+ return color$4(aValue1, aValue2, aValue3, aValue4);
+ }
+
+ // 3 arguments: (R, G, B) or (H, S, B)
+ if (aValue1 !== undef && aValue2 !== undef && aValue3 !== undef) {
+ return color$4(aValue1, aValue2, aValue3, colorModeA);
+ }
+
+ // 2 arguments: (Color, A) or (Grayscale, A)
+ if (aValue1 !== undef && aValue2 !== undef) {
+ return color$2(aValue1, aValue2);
+ }
+
+ // 1 argument: (Grayscale) or (Color)
+ if (typeof aValue1 === "number") {
+ return color$1(aValue1);
+ }
+
+ // Default
+ return color$4(colorModeX, colorModeY, colorModeZ, colorModeA);
+ };
+
+ // Ease of use function to extract the colour bits into a string
+ p.color.toString = function(colorInt) {
+ return "rgba(" + ((colorInt & PConstants.RED_MASK) >>> 16) + "," + ((colorInt & PConstants.GREEN_MASK) >>> 8) +
+ "," + ((colorInt & PConstants.BLUE_MASK)) + "," + ((colorInt & PConstants.ALPHA_MASK) >>> 24) / 255 + ")";
+ };
+
+ // Easy of use function to pack rgba values into a single bit-shifted color int.
+ p.color.toInt = function(r, g, b, a) {
+ return (a << 24) & PConstants.ALPHA_MASK | (r << 16) & PConstants.RED_MASK | (g << 8) & PConstants.GREEN_MASK | b & PConstants.BLUE_MASK;
+ };
+
+ // Creates a simple array in [R, G, B, A] format, [255, 255, 255, 255]
+ p.color.toArray = function(colorInt) {
+ return [(colorInt & PConstants.RED_MASK) >>> 16, (colorInt & PConstants.GREEN_MASK) >>> 8,
+ colorInt & PConstants.BLUE_MASK, (colorInt & PConstants.ALPHA_MASK) >>> 24];
+ };
+
+ // Creates a WebGL color array in [R, G, B, A] format. WebGL wants the color ranges between 0 and 1, [1, 1, 1, 1]
+ p.color.toGLArray = function(colorInt) {
+ return [((colorInt & PConstants.RED_MASK) >>> 16) / 255, ((colorInt & PConstants.GREEN_MASK) >>> 8) / 255,
+ (colorInt & PConstants.BLUE_MASK) / 255, ((colorInt & PConstants.ALPHA_MASK) >>> 24) / 255];
+ };
+
+ // HSB conversion function from Mootools, MIT Licensed
+ p.color.toRGB = function(h, s, b) {
+ // Limit values greater than range
+ h = (h > colorModeX) ? colorModeX : h;
+ s = (s > colorModeY) ? colorModeY : s;
+ b = (b > colorModeZ) ? colorModeZ : b;
+
+ h = (h / colorModeX) * 360;
+ s = (s / colorModeY) * 100;
+ b = (b / colorModeZ) * 100;
+
+ var br = Math.round(b / 100 * 255);
+
+ if (s === 0) { // Grayscale
+ return [br, br, br];
+ }
+ var hue = h % 360;
+ var f = hue % 60;
+ var p = Math.round((b * (100 - s)) / 10000 * 255);
+ var q = Math.round((b * (6000 - s * f)) / 600000 * 255);
+ var t = Math.round((b * (6000 - s * (60 - f))) / 600000 * 255);
+ switch (Math.floor(hue / 60)) {
+ case 0:
+ return [br, t, p];
+ case 1:
+ return [q, br, p];
+ case 2:
+ return [p, br, t];
+ case 3:
+ return [p, q, br];
+ case 4:
+ return [t, p, br];
+ case 5:
+ return [br, p, q];
+ }
+ };
+
+ function colorToHSB(colorInt) {
+ var red, green, blue;
+
+ red = ((colorInt & PConstants.RED_MASK) >>> 16) / 255;
+ green = ((colorInt & PConstants.GREEN_MASK) >>> 8) / 255;
+ blue = (colorInt & PConstants.BLUE_MASK) / 255;
+
+ var max = p.max(p.max(red,green), blue),
+ min = p.min(p.min(red,green), blue),
+ hue, saturation;
+
+ if (min === max) {
+ return [0, 0, max*colorModeZ];
+ }
+ saturation = (max - min) / max;
+
+ if (red === max) {
+ hue = (green - blue) / (max - min);
+ } else if (green === max) {
+ hue = 2 + ((blue - red) / (max - min));
+ } else {
+ hue = 4 + ((red - green) / (max - min));
+ }
+
+ hue /= 6;
+
+ if (hue < 0) {
+ hue += 1;
+ } else if (hue > 1) {
+ hue -= 1;
+ }
+ return [hue*colorModeX, saturation*colorModeY, max*colorModeZ];
+ }
+
+ /**
+ * Extracts the brightness value from a color.
+ *
+ * @param {color} colInt any value of the color datatype
+ *
+ * @returns {float} The brightness color value.
+ *
+ * @see red
+ * @see green
+ * @see blue
+ * @see hue
+ * @see saturation
+ */
+ p.brightness = function(colInt){
+ return colorToHSB(colInt)[2];
+ };
+
+ /**
+ * Extracts the saturation value from a color.
+ *
+ * @param {color} colInt any value of the color datatype
+ *
+ * @returns {float} The saturation color value.
+ *
+ * @see red
+ * @see green
+ * @see blue
+ * @see hue
+ * @see brightness
+ */
+ p.saturation = function(colInt){
+ return colorToHSB(colInt)[1];
+ };
+
+ /**
+ * Extracts the hue value from a color.
+ *
+ * @param {color} colInt any value of the color datatype
+ *
+ * @returns {float} The hue color value.
+ *
+ * @see red
+ * @see green
+ * @see blue
+ * @see saturation
+ * @see brightness
+ */
+ p.hue = function(colInt){
+ return colorToHSB(colInt)[0];
+ };
+
+ /**
+ * Extracts the red value from a color, scaled to match current colorMode().
+ * This value is always returned as a float so be careful not to assign it to an int value.
+ *
+ * @param {color} aColor any value of the color datatype
+ *
+ * @returns {float} The red color value.
+ *
+ * @see green
+ * @see blue
+ * @see alpha
+ * @see >> right shift
+ * @see hue
+ * @see saturation
+ * @see brightness
+ */
+ p.red = function(aColor) {
+ return ((aColor & PConstants.RED_MASK) >>> 16) / 255 * colorModeX;
+ };
+
+ /**
+ * Extracts the green value from a color, scaled to match current colorMode().
+ * This value is always returned as a float so be careful not to assign it to an int value.
+ *
+ * @param {color} aColor any value of the color datatype
+ *
+ * @returns {float} The green color value.
+ *
+ * @see red
+ * @see blue
+ * @see alpha
+ * @see >> right shift
+ * @see hue
+ * @see saturation
+ * @see brightness
+ */
+ p.green = function(aColor) {
+ return ((aColor & PConstants.GREEN_MASK) >>> 8) / 255 * colorModeY;
+ };
+
+ /**
+ * Extracts the blue value from a color, scaled to match current colorMode().
+ * This value is always returned as a float so be careful not to assign it to an int value.
+ *
+ * @param {color} aColor any value of the color datatype
+ *
+ * @returns {float} The blue color value.
+ *
+ * @see red
+ * @see green
+ * @see alpha
+ * @see >> right shift
+ * @see hue
+ * @see saturation
+ * @see brightness
+ */
+ p.blue = function(aColor) {
+ return (aColor & PConstants.BLUE_MASK) / 255 * colorModeZ;
+ };
+
+ /**
+ * Extracts the alpha value from a color, scaled to match current colorMode().
+ * This value is always returned as a float so be careful not to assign it to an int value.
+ *
+ * @param {color} aColor any value of the color datatype
+ *
+ * @returns {float} The alpha color value.
+ *
+ * @see red
+ * @see green
+ * @see blue
+ * @see >> right shift
+ * @see hue
+ * @see saturation
+ * @see brightness
+ */
+ p.alpha = function(aColor) {
+ return ((aColor & PConstants.ALPHA_MASK) >>> 24) / 255 * colorModeA;
+ };
+
+ /**
+ * Calculates a color or colors between two colors at a specific increment.
+ * The amt parameter is the amount to interpolate between the two values where 0.0
+ * equal to the first point, 0.1 is very near the first point, 0.5 is half-way in between, etc.
+ *
+ * @param {color} c1 interpolate from this color
+ * @param {color} c2 interpolate to this color
+ * @param {float} amt between 0.0 and 1.0
+ *
+ * @returns {float} The blended color.
+ *
+ * @see blendColor
+ * @see color
+ */
+ p.lerpColor = function(c1, c2, amt) {
+ var r, g, b, a, r1, g1, b1, a1, r2, g2, b2, a2;
+ var hsb1, hsb2, rgb, h, s;
+ var colorBits1 = p.color(c1);
+ var colorBits2 = p.color(c2);
+
+ if (curColorMode === PConstants.HSB) {
+ // Special processing for HSB mode.
+ // Get HSB and Alpha values for Color 1 and 2
+ hsb1 = colorToHSB(colorBits1);
+ a1 = ((colorBits1 & PConstants.ALPHA_MASK) >>> 24) / colorModeA;
+ hsb2 = colorToHSB(colorBits2);
+ a2 = ((colorBits2 & PConstants.ALPHA_MASK) >>> 24) / colorModeA;
+
+ // Return lerp value for each channel, for HSB components
+ h = p.lerp(hsb1[0], hsb2[0], amt);
+ s = p.lerp(hsb1[1], hsb2[1], amt);
+ b = p.lerp(hsb1[2], hsb2[2], amt);
+ rgb = p.color.toRGB(h, s, b);
+ // ... and for Alpha-range
+ a = (p.lerp(a1, a2, amt) * colorModeA + 0.5) | 0;
+
+ return (a << 24) & PConstants.ALPHA_MASK |
+ (rgb[0] << 16) & PConstants.RED_MASK |
+ (rgb[1] << 8) & PConstants.GREEN_MASK |
+ rgb[2] & PConstants.BLUE_MASK;
+ }
+
+ // Get RGBA values for Color 1 to floats
+ r1 = (colorBits1 & PConstants.RED_MASK) >>> 16;
+ g1 = (colorBits1 & PConstants.GREEN_MASK) >>> 8;
+ b1 = (colorBits1 & PConstants.BLUE_MASK);
+ a1 = ((colorBits1 & PConstants.ALPHA_MASK) >>> 24) / colorModeA;
+
+ // Get RGBA values for Color 2 to floats
+ r2 = (colorBits2 & PConstants.RED_MASK) >>> 16;
+ g2 = (colorBits2 & PConstants.GREEN_MASK) >>> 8;
+ b2 = (colorBits2 & PConstants.BLUE_MASK);
+ a2 = ((colorBits2 & PConstants.ALPHA_MASK) >>> 24) / colorModeA;
+
+ // Return lerp value for each channel, INT for color, Float for Alpha-range
+ r = (p.lerp(r1, r2, amt) + 0.5) | 0;
+ g = (p.lerp(g1, g2, amt) + 0.5) | 0;
+ b = (p.lerp(b1, b2, amt) + 0.5) | 0;
+ a = (p.lerp(a1, a2, amt) * colorModeA + 0.5) | 0;
+
+ return (a << 24) & PConstants.ALPHA_MASK |
+ (r << 16) & PConstants.RED_MASK |
+ (g << 8) & PConstants.GREEN_MASK |
+ b & PConstants.BLUE_MASK;
+ };
+
+ /**
+ * Changes the way Processing interprets color data. By default, fill(), stroke(), and background()
+ * colors are set by values between 0 and 255 using the RGB color model. It is possible to change the
+ * numerical range used for specifying colors and to switch color systems. For example, calling colorMode(RGB, 1.0)
+ * will specify that values are specified between 0 and 1. The limits for defining colors are altered by setting the
+ * parameters range1, range2, range3, and range 4.
+ *
+ * @param {MODE} mode Either RGB or HSB, corresponding to Red/Green/Blue and Hue/Saturation/Brightness
+ * @param {int|float} range range for all color elements
+ * @param {int|float} range1 range for the red or hue depending on the current color mode
+ * @param {int|float} range2 range for the green or saturation depending on the current color mode
+ * @param {int|float} range3 range for the blue or brightness depending on the current color mode
+ * @param {int|float} range4 range for the alpha
+ *
+ * @returns none
+ *
+ * @see background
+ * @see fill
+ * @see stroke
+ */
+ p.colorMode = function() { // mode, range1, range2, range3, range4
+ curColorMode = arguments[0];
+ if (arguments.length > 1) {
+ colorModeX = arguments[1];
+ colorModeY = arguments[2] || arguments[1];
+ colorModeZ = arguments[3] || arguments[1];
+ colorModeA = arguments[4] || arguments[1];
+ }
+ };
+
+ /**
+ * Blends two color values together based on the blending mode given as the MODE parameter.
+ * The possible modes are described in the reference for the blend() function.
+ *
+ * @param {color} c1 color: the first color to blend
+ * @param {color} c2 color: the second color to blend
+ * @param {MODE} MODE Either BLEND, ADD, SUBTRACT, DARKEST, LIGHTEST, DIFFERENCE, EXCLUSION, MULTIPLY,
+ * SCREEN, OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, or BURN
+ *
+ * @returns {float} The blended color.
+ *
+ * @see blend
+ * @see color
+ */
+ p.blendColor = function(c1, c2, mode) {
+ if (mode === PConstants.REPLACE) {
+ return p.modes.replace(c1, c2);
+ } else if (mode === PConstants.BLEND) {
+ return p.modes.blend(c1, c2);
+ } else if (mode === PConstants.ADD) {
+ return p.modes.add(c1, c2);
+ } else if (mode === PConstants.SUBTRACT) {
+ return p.modes.subtract(c1, c2);
+ } else if (mode === PConstants.LIGHTEST) {
+ return p.modes.lightest(c1, c2);
+ } else if (mode === PConstants.DARKEST) {
+ return p.modes.darkest(c1, c2);
+ } else if (mode === PConstants.DIFFERENCE) {
+ return p.modes.difference(c1, c2);
+ } else if (mode === PConstants.EXCLUSION) {
+ return p.modes.exclusion(c1, c2);
+ } else if (mode === PConstants.MULTIPLY) {
+ return p.modes.multiply(c1, c2);
+ } else if (mode === PConstants.SCREEN) {
+ return p.modes.screen(c1, c2);
+ } else if (mode === PConstants.HARD_LIGHT) {
+ return p.modes.hard_light(c1, c2);
+ } else if (mode === PConstants.SOFT_LIGHT) {
+ return p.modes.soft_light(c1, c2);
+ } else if (mode === PConstants.OVERLAY) {
+ return p.modes.overlay(c1, c2);
+ } else if (mode === PConstants.DODGE) {
+ return p.modes.dodge(c1, c2);
+ } else if (mode === PConstants.BURN) {
+ return p.modes.burn(c1, c2);
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Canvas-Matrix manipulation
+ ////////////////////////////////////////////////////////////////////////////
+
+ function saveContext() {
+ curContext.save();
+ }
+
+ function restoreContext() {
+ curContext.restore();
+ isStrokeDirty = true;
+ isFillDirty = true;
+ }
+
+ /**
+ * Prints the current matrix to the text window.
+ *
+ * @returns none
+ *
+ * @see pushMatrix
+ * @see popMatrix
+ * @see resetMatrix
+ * @see applyMatrix
+ */
+ p.printMatrix = function() {
+ modelView.print();
+ };
+
+ /**
+ * Specifies an amount to displace objects within the display window. The x parameter specifies left/right translation,
+ * the y parameter specifies up/down translation, and the z parameter specifies translations toward/away from the screen.
+ * Using this function with the z parameter requires using the P3D or OPENGL parameter in combination with size as shown
+ * in the above example. Transformations apply to everything that happens after and subsequent calls to the function
+ * accumulates the effect. For example, calling translate(50, 0) and then translate(20, 0) is the same as translate(70, 0).
+ * If translate() is called within draw(), the transformation is reset when the loop begins again.
+ * This function can be further controlled by the pushMatrix() and popMatrix().
+ *
+ * @param {int|float} x left/right translation
+ * @param {int|float} y up/down translation
+ * @param {int|float} z forward/back translation
+ *
+ * @returns none
+ *
+ * @see pushMatrix
+ * @see popMatrix
+ * @see scale
+ * @see rotate
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ */
+ Drawing2D.prototype.translate = function(x, y) {
+ modelView.translate(x, y);
+ modelViewInv.invTranslate(x, y);
+ curContext.translate(x, y);
+ };
+
+ Drawing3D.prototype.translate = function(x, y, z) {
+ modelView.translate(x, y, z);
+ modelViewInv.invTranslate(x, y, z);
+ };
+
+ /**
+ * Increases or decreases the size of a shape by expanding and contracting vertices. Objects always scale from their
+ * relative origin to the coordinate system. Scale values are specified as decimal percentages. For example, the
+ * function call scale(2.0) increases the dimension of a shape by 200%. Transformations apply to everything that
+ * happens after and subsequent calls to the function multiply the effect. For example, calling scale(2.0) and
+ * then scale(1.5) is the same as scale(3.0). If scale() is called within draw(), the transformation is reset when
+ * the loop begins again. Using this fuction with the z parameter requires passing P3D or OPENGL into the size()
+ * parameter as shown in the example above. This function can be further controlled by pushMatrix() and popMatrix().
+ *
+ * @param {int|float} size percentage to scale the object
+ * @param {int|float} x percentage to scale the object in the x-axis
+ * @param {int|float} y percentage to scale the object in the y-axis
+ * @param {int|float} z percentage to scale the object in the z-axis
+ *
+ * @returns none
+ *
+ * @see pushMatrix
+ * @see popMatrix
+ * @see translate
+ * @see rotate
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ */
+ Drawing2D.prototype.scale = function(x, y) {
+ modelView.scale(x, y);
+ modelViewInv.invScale(x, y);
+ curContext.scale(x, y || x);
+ };
+
+ Drawing3D.prototype.scale = function(x, y, z) {
+ modelView.scale(x, y, z);
+ modelViewInv.invScale(x, y, z);
+ };
+
+
+ /**
+ * helper function for applying a transfrom matrix to a 2D context.
+ */
+ Drawing2D.prototype.transform = function(pmatrix) {
+ var e = pmatrix.array();
+ curContext.transform(e[0],e[3],e[1],e[4],e[2],e[5]);
+ };
+
+ /**
+ * helper function for applying a transfrom matrix to a 3D context.
+ * not currently implemented.
+ */
+ Drawing3D.prototype.transformm = function(pmatrix3d) {
+ throw("p.transform is currently not supported in 3D mode");
+ };
+
+
+ /**
+ * Pushes the current transformation matrix onto the matrix stack. Understanding pushMatrix() and popMatrix()
+ * requires understanding the concept of a matrix stack. The pushMatrix() function saves the current coordinate
+ * system to the stack and popMatrix() restores the prior coordinate system. pushMatrix() and popMatrix() are
+ * used in conjuction with the other transformation methods and may be embedded to control the scope of
+ * the transformations.
+ *
+ * @returns none
+ *
+ * @see popMatrix
+ * @see translate
+ * @see rotate
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ */
+ Drawing2D.prototype.pushMatrix = function() {
+ userMatrixStack.load(modelView);
+ userReverseMatrixStack.load(modelViewInv);
+ saveContext();
+ };
+
+ Drawing3D.prototype.pushMatrix = function() {
+ userMatrixStack.load(modelView);
+ userReverseMatrixStack.load(modelViewInv);
+ };
+
+ /**
+ * Pops the current transformation matrix off the matrix stack. Understanding pushing and popping requires
+ * understanding the concept of a matrix stack. The pushMatrix() function saves the current coordinate system to
+ * the stack and popMatrix() restores the prior coordinate system. pushMatrix() and popMatrix() are used in
+ * conjuction with the other transformation methods and may be embedded to control the scope of the transformations.
+ *
+ * @returns none
+ *
+ * @see popMatrix
+ * @see pushMatrix
+ */
+ Drawing2D.prototype.popMatrix = function() {
+ modelView.set(userMatrixStack.pop());
+ modelViewInv.set(userReverseMatrixStack.pop());
+ restoreContext();
+ };
+
+ Drawing3D.prototype.popMatrix = function() {
+ modelView.set(userMatrixStack.pop());
+ modelViewInv.set(userReverseMatrixStack.pop());
+ };
+
+ /**
+ * Replaces the current matrix with the identity matrix. The equivalent function in OpenGL is glLoadIdentity().
+ *
+ * @returns none
+ *
+ * @see popMatrix
+ * @see pushMatrix
+ * @see applyMatrix
+ * @see printMatrix
+ */
+ Drawing2D.prototype.resetMatrix = function() {
+ modelView.reset();
+ modelViewInv.reset();
+ curContext.setTransform(1,0,0,1,0,0);
+ };
+
+ Drawing3D.prototype.resetMatrix = function() {
+ modelView.reset();
+ modelViewInv.reset();
+ };
+
+ /**
+ * Multiplies the current matrix by the one specified through the parameters. This is very slow because it will
+ * try to calculate the inverse of the transform, so avoid it whenever possible. The equivalent function
+ * in OpenGL is glMultMatrix().
+ *
+ * @param {int|float} n00-n15 numbers which define the 4x4 matrix to be multiplied
+ *
+ * @returns none
+ *
+ * @see popMatrix
+ * @see pushMatrix
+ * @see resetMatrix
+ * @see printMatrix
+ */
+ DrawingShared.prototype.applyMatrix = function() {
+ var a = arguments;
+ modelView.apply(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
+ modelViewInv.invApply(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
+ };
+
+ Drawing2D.prototype.applyMatrix = function() {
+ var a = arguments;
+ for (var cnt = a.length; cnt < 16; cnt++) {
+ a[cnt] = 0;
+ }
+ a[10] = a[15] = 1;
+ DrawingShared.prototype.applyMatrix.apply(this, a);
+ };
+
+ /**
+ * Rotates a shape around the x-axis the amount specified by the angle parameter. Angles should be
+ * specified in radians (values from 0 to PI*2) or converted to radians with the radians() function.
+ * Objects are always rotated around their relative position to the origin and positive numbers
+ * rotate objects in a counterclockwise direction. Transformations apply to everything that happens
+ * after and subsequent calls to the function accumulates the effect. For example, calling rotateX(PI/2)
+ * and then rotateX(PI/2) is the same as rotateX(PI). If rotateX() is called within the draw(), the
+ * transformation is reset when the loop begins again. This function requires passing P3D or OPENGL
+ * into the size() parameter as shown in the example above.
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateY
+ * @see rotateZ
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ */
+ p.rotateX = function(angleInRadians) {
+ modelView.rotateX(angleInRadians);
+ modelViewInv.invRotateX(angleInRadians);
+ };
+
+ /**
+ * Rotates a shape around the z-axis the amount specified by the angle parameter. Angles should be
+ * specified in radians (values from 0 to PI*2) or converted to radians with the radians() function.
+ * Objects are always rotated around their relative position to the origin and positive numbers
+ * rotate objects in a counterclockwise direction. Transformations apply to everything that happens
+ * after and subsequent calls to the function accumulates the effect. For example, calling rotateZ(PI/2)
+ * and then rotateZ(PI/2) is the same as rotateZ(PI). If rotateZ() is called within the draw(), the
+ * transformation is reset when the loop begins again. This function requires passing P3D or OPENGL
+ * into the size() parameter as shown in the example above.
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateX
+ * @see rotateY
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ */
+ Drawing2D.prototype.rotateZ = function() {
+ throw "rotateZ() is not supported in 2D mode. Use rotate(float) instead.";
+ };
+
+ Drawing3D.prototype.rotateZ = function(angleInRadians) {
+ modelView.rotateZ(angleInRadians);
+ modelViewInv.invRotateZ(angleInRadians);
+ };
+
+ /**
+ * Rotates a shape around the y-axis the amount specified by the angle parameter. Angles should be
+ * specified in radians (values from 0 to PI*2) or converted to radians with the radians() function.
+ * Objects are always rotated around their relative position to the origin and positive numbers
+ * rotate objects in a counterclockwise direction. Transformations apply to everything that happens
+ * after and subsequent calls to the function accumulates the effect. For example, calling rotateY(PI/2)
+ * and then rotateY(PI/2) is the same as rotateY(PI). If rotateY() is called within the draw(), the
+ * transformation is reset when the loop begins again. This function requires passing P3D or OPENGL
+ * into the size() parameter as shown in the example above.
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateX
+ * @see rotateZ
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ */
+ p.rotateY = function(angleInRadians) {
+ modelView.rotateY(angleInRadians);
+ modelViewInv.invRotateY(angleInRadians);
+ };
+
+ /**
+ * Rotates a shape the amount specified by the angle parameter. Angles should be specified in radians
+ * (values from 0 to TWO_PI) or converted to radians with the radians() function. Objects are always
+ * rotated around their relative position to the origin and positive numbers rotate objects in a
+ * clockwise direction. Transformations apply to everything that happens after and subsequent calls
+ * to the function accumulates the effect. For example, calling rotate(HALF_PI) and then rotate(HALF_PI)
+ * is the same as rotate(PI). All tranformations are reset when draw() begins again. Technically,
+ * rotate() multiplies the current transformation matrix by a rotation matrix. This function can be
+ * further controlled by the pushMatrix() and popMatrix().
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ */
+ Drawing2D.prototype.rotate = function(angleInRadians) {
+ modelView.rotateZ(angleInRadians);
+ modelViewInv.invRotateZ(angleInRadians);
+ curContext.rotate(angleInRadians);
+ };
+
+ Drawing3D.prototype.rotate = function(angleInRadians) {
+ if (arguments.length < 4) {
+ p.rotateZ(angleInRadians);
+ } else {
+ modelView.rotate(angleInRadians, arguments[1], arguments[2], arguments[3]);
+ modelViewInv.rotate((-angleInRadians), arguments[1], arguments[2], arguments[3]);
+ }
+ };
+
+ /**
+ * Shears a shape around the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians
+ * with the radians() function. Objects are always sheared around their relative position
+ * to the origin and positive numbers shear objects in a clockwise direction. Transformations
+ * apply to everything that happens after and subsequent calls to the function accumulates the
+ * effect. For example, calling shearX(PI/2) and then shearX(PI/2) is the same as shearX(PI)
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ */
+
+ Drawing2D.prototype.shearX = function(angleInRadians) {
+ modelView.shearX(angleInRadians);
+ curContext.transform(1,0,angleInRadians,1,0,0);
+ };
+
+ Drawing3D.prototype.shearX = function(angleInRadians) {
+ modelView.shearX(angleInRadians);
+ };
+
+ /**
+ * Shears a shape around the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to
+ * radians with the radians() function. Objects are always sheared around their
+ * relative position to the origin and positive numbers shear objects in a
+ * clockwise direction. Transformations apply to everything that happens after
+ * and subsequent calls to the function accumulates the effect. For example,
+ * calling shearY(PI/2) and then shearY(PI/2) is the same as shearY(PI).
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ * @see shearX
+ */
+
+ Drawing2D.prototype.shearY = function(angleInRadians) {
+ modelView.shearY(angleInRadians);
+ curContext.transform(1,angleInRadians,0,1,0,0);
+ };
+
+ Drawing3D.prototype.shearY = function(angleInRadians) {
+ modelView.shearY(angleInRadians);
+ };
+
+ /**
+ * The pushStyle() function saves the current style settings and popStyle() restores the prior settings.
+ * Note that these functions are always used together. They allow you to change the style settings and later
+ * return to what you had. When a new style is started with pushStyle(), it builds on the current style information.
+ * The pushStyle() and popStyle() functions can be embedded to provide more control (see the second example
+ * above for a demonstration.)
+ * The style information controlled by the following functions are included in the style: fill(), stroke(), tint(),
+ * strokeWeight(), strokeCap(), strokeJoin(), imageMode(), rectMode(), ellipseMode(), shapeMode(), colorMode(),
+ * textAlign(), textFont(), textMode(), textSize(), textLeading(), emissive(), specular(), shininess(), ambient()
+ *
+ * @returns none
+ *
+ * @see popStyle
+ */
+ p.pushStyle = function() {
+ // Save the canvas state.
+ saveContext();
+
+ p.pushMatrix();
+
+ var newState = {
+ 'doFill': doFill,
+ 'currentFillColor': currentFillColor,
+ 'doStroke': doStroke,
+ 'currentStrokeColor': currentStrokeColor,
+ 'curTint': curTint,
+ 'curRectMode': curRectMode,
+ 'curColorMode': curColorMode,
+ 'colorModeX': colorModeX,
+ 'colorModeZ': colorModeZ,
+ 'colorModeY': colorModeY,
+ 'colorModeA': colorModeA,
+ 'curTextFont': curTextFont,
+ 'horizontalTextAlignment': horizontalTextAlignment,
+ 'verticalTextAlignment': verticalTextAlignment,
+ 'textMode': textMode,
+ 'curFontName': curFontName,
+ 'curTextSize': curTextSize,
+ 'curTextAscent': curTextAscent,
+ 'curTextDescent': curTextDescent,
+ 'curTextLeading': curTextLeading
+ };
+
+ styleArray.push(newState);
+ };
+
+ /**
+ * The pushStyle() function saves the current style settings and popStyle() restores the prior settings; these
+ * functions are always used together. They allow you to change the style settings and later return to what you had.
+ * When a new style is started with pushStyle(), it builds on the current style information. The pushStyle() and
+ * popStyle() functions can be embedded to provide more control (see the second example above for a demonstration.)
+ *
+ * @returns none
+ *
+ * @see pushStyle
+ */
+ p.popStyle = function() {
+ var oldState = styleArray.pop();
+
+ if (oldState) {
+ restoreContext();
+
+ p.popMatrix();
+
+ doFill = oldState.doFill;
+ currentFillColor = oldState.currentFillColor;
+ doStroke = oldState.doStroke;
+ currentStrokeColor = oldState.currentStrokeColor;
+ curTint = oldState.curTint;
+ curRectMode = oldState.curRectMode;
+ curColorMode = oldState.curColorMode;
+ colorModeX = oldState.colorModeX;
+ colorModeZ = oldState.colorModeZ;
+ colorModeY = oldState.colorModeY;
+ colorModeA = oldState.colorModeA;
+ curTextFont = oldState.curTextFont;
+ curFontName = oldState.curFontName;
+ curTextSize = oldState.curTextSize;
+ horizontalTextAlignment = oldState.horizontalTextAlignment;
+ verticalTextAlignment = oldState.verticalTextAlignment;
+ textMode = oldState.textMode;
+ curTextAscent = oldState.curTextAscent;
+ curTextDescent = oldState.curTextDescent;
+ curTextLeading = oldState.curTextLeading;
+ } else {
+ throw "Too many popStyle() without enough pushStyle()";
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Time based functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Processing communicates with the clock on your computer.
+ * The year() function returns the current year as an integer (2003, 2004, 2005, etc).
+ *
+ * @returns {float} The current year.
+ *
+ * @see millis
+ * @see second
+ * @see minute
+ * @see hour
+ * @see day
+ * @see month
+ */
+ p.year = function() {
+ return new Date().getFullYear();
+ };
+ /**
+ * Processing communicates with the clock on your computer.
+ * The month() function returns the current month as a value from 1 - 12.
+ *
+ * @returns {float} The current month.
+ *
+ * @see millis
+ * @see second
+ * @see minute
+ * @see hour
+ * @see day
+ * @see year
+ */
+ p.month = function() {
+ return new Date().getMonth() + 1;
+ };
+ /**
+ * Processing communicates with the clock on your computer.
+ * The day() function returns the current day as a value from 1 - 31.
+ *
+ * @returns {float} The current day.
+ *
+ * @see millis
+ * @see second
+ * @see minute
+ * @see hour
+ * @see month
+ * @see year
+ */
+ p.day = function() {
+ return new Date().getDate();
+ };
+ /**
+ * Processing communicates with the clock on your computer.
+ * The hour() function returns the current hour as a value from 0 - 23.
+ *
+ * @returns {float} The current hour.
+ *
+ * @see millis
+ * @see second
+ * @see minute
+ * @see month
+ * @see day
+ * @see year
+ */
+ p.hour = function() {
+ return new Date().getHours();
+ };
+ /**
+ * Processing communicates with the clock on your computer.
+ * The minute() function returns the current minute as a value from 0 - 59.
+ *
+ * @returns {float} The current minute.
+ *
+ * @see millis
+ * @see second
+ * @see month
+ * @see hour
+ * @see day
+ * @see year
+ */
+ p.minute = function() {
+ return new Date().getMinutes();
+ };
+ /**
+ * Processing communicates with the clock on your computer.
+ * The second() function returns the current second as a value from 0 - 59.
+ *
+ * @returns {float} The current minute.
+ *
+ * @see millis
+ * @see month
+ * @see minute
+ * @see hour
+ * @see day
+ * @see year
+ */
+ p.second = function() {
+ return new Date().getSeconds();
+ };
+ /**
+ * Returns the number of milliseconds (thousandths of a second) since starting a sketch.
+ * This information is often used for timing animation sequences.
+ *
+ * @returns {long} The number of milliseconds since starting the sketch.
+ *
+ * @see month
+ * @see second
+ * @see minute
+ * @see hour
+ * @see day
+ * @see year
+ */
+ p.millis = function() {
+ return Date.now() - start;
+ };
+
+ /**
+ * Executes the code within draw() one time. This functions allows the program to update
+ * the display window only when necessary, for example when an event registered by
+ * mousePressed() or keyPressed() occurs.
+ * In structuring a program, it only makes sense to call redraw() within events such as
+ * mousePressed(). This is because redraw() does not run draw() immediately (it only sets
+ * a flag that indicates an update is needed).
+ * Calling redraw() within draw() has no effect because draw() is continuously called anyway.
+ *
+ * @returns none
+ *
+ * @see noLoop
+ * @see loop
+ */
+ function redrawHelper() {
+ var sec = (Date.now() - timeSinceLastFPS) / 1000;
+ framesSinceLastFPS++;
+ var fps = framesSinceLastFPS / sec;
+
+ // recalculate FPS every half second for better accuracy.
+ if (sec > 0.5) {
+ timeSinceLastFPS = Date.now();
+ framesSinceLastFPS = 0;
+ p.__frameRate = fps;
+ }
+
+ p.frameCount++;
+ }
+
+ Drawing2D.prototype.redraw = function() {
+ redrawHelper();
+
+ curContext.lineWidth = lineWidth;
+ var pmouseXLastEvent = p.pmouseX,
+ pmouseYLastEvent = p.pmouseY;
+ p.pmouseX = pmouseXLastFrame;
+ p.pmouseY = pmouseYLastFrame;
+
+ saveContext();
+ p.draw();
+ restoreContext();
+
+ pmouseXLastFrame = p.mouseX;
+ pmouseYLastFrame = p.mouseY;
+ p.pmouseX = pmouseXLastEvent;
+ p.pmouseY = pmouseYLastEvent;
+ };
+
+ Drawing3D.prototype.redraw = function() {
+ redrawHelper();
+
+ var pmouseXLastEvent = p.pmouseX,
+ pmouseYLastEvent = p.pmouseY;
+ p.pmouseX = pmouseXLastFrame;
+ p.pmouseY = pmouseYLastFrame;
+ // even if the color buffer isn't cleared with background(),
+ // the depth buffer needs to be cleared regardless.
+ curContext.clear(curContext.DEPTH_BUFFER_BIT);
+ curContextCache = { attributes: {}, locations: {} };
+ // Delete all the lighting states and the materials the
+ // user set in the last draw() call.
+ p.noLights();
+ p.lightFalloff(1, 0, 0);
+ p.shininess(1);
+ p.ambient(255, 255, 255);
+ p.specular(0, 0, 0);
+ p.emissive(0, 0, 0);
+ p.camera();
+ p.draw();
+
+ pmouseXLastFrame = p.mouseX;
+ pmouseYLastFrame = p.mouseY;
+ p.pmouseX = pmouseXLastEvent;
+ p.pmouseY = pmouseYLastEvent;
+ };
+
+ /**
+ * Stops Processing from continuously executing the code within draw(). If loop() is
+ * called, the code in draw() begin to run continuously again. If using noLoop() in
+ * setup(), it should be the last line inside the block.
+ * When noLoop() is used, it's not possible to manipulate or access the screen inside event
+ * handling functions such as mousePressed() or keyPressed(). Instead, use those functions
+ * to call redraw() or loop(), which will run draw(), which can update the screen properly.
+ * This means that when noLoop() has been called, no drawing can happen, and functions like
+ * saveFrame() or loadPixels() may not be used.
+ * Note that if the sketch is resized, redraw() will be called to update the sketch, even
+ * after noLoop() has been specified. Otherwise, the sketch would enter an odd state until
+ * loop() was called.
+ *
+ * @returns none
+ *
+ * @see redraw
+ * @see draw
+ * @see loop
+ */
+ p.noLoop = function() {
+ doLoop = false;
+ loopStarted = false;
+ clearInterval(looping);
+ curSketch.onPause();
+ };
+
+ /**
+ * Causes Processing to continuously execute the code within draw(). If noLoop() is called,
+ * the code in draw() stops executing.
+ *
+ * @returns none
+ *
+ * @see noLoop
+ */
+ p.loop = function() {
+ if (loopStarted) {
+ return;
+ }
+
+ timeSinceLastFPS = Date.now();
+ framesSinceLastFPS = 0;
+
+ looping = window.setInterval(function() {
+ try {
+ curSketch.onFrameStart();
+ p.redraw();
+ curSketch.onFrameEnd();
+ } catch(e_loop) {
+ window.clearInterval(looping);
+ throw e_loop;
+ }
+ }, curMsPerFrame);
+ doLoop = true;
+ loopStarted = true;
+ curSketch.onLoop();
+ };
+
+ /**
+ * Specifies the number of frames to be displayed every second. If the processor is not
+ * fast enough to maintain the specified rate, it will not be achieved. For example, the
+ * function call frameRate(30) will attempt to refresh 30 times a second. It is recommended
+ * to set the frame rate within setup(). The default rate is 60 frames per second.
+ *
+ * @param {int} aRate number of frames per second.
+ *
+ * @returns none
+ *
+ * @see delay
+ */
+ p.frameRate = function(aRate) {
+ curFrameRate = aRate;
+ curMsPerFrame = 1000 / curFrameRate;
+
+ // clear and reset interval
+ if (doLoop) {
+ p.noLoop();
+ p.loop();
+ }
+ };
+
+ /**
+ * Quits/stops/exits the program.
+ * Rather than terminating immediately, exit() will cause the sketch to exit after draw()
+ * has completed (or after setup() completes if called during the setup() method).
+ *
+ * @returns none
+ */
+ p.exit = function() {
+ // cleanup
+ window.clearInterval(looping);
+ removeInstance(p.externals.canvas.id);
+ delete(curElement.onmousedown);
+
+ // Step through the libraries to detach them
+ for (var lib in Processing.lib) {
+ if (Processing.lib.hasOwnProperty(lib)) {
+ if (Processing.lib[lib].hasOwnProperty("detach")) {
+ Processing.lib[lib].detach(p);
+ }
+ }
+ }
+
+ // clean up all event handling
+ var i = eventHandlers.length;
+ while (i--) {
+ detachEventHandler(eventHandlers[i]);
+ }
+ curSketch.onExit();
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // MISC functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sets the cursor to a predefined symbol, an image, or turns it on if already hidden.
+ * If you are trying to set an image as the cursor, it is recommended to make the size
+ * 16x16 or 32x32 pixels. It is not possible to load an image as the cursor if you are
+ * exporting your program for the Web. The values for parameters x and y must be less
+ * than the dimensions of the image.
+ *
+ * @param {MODE} MODE either ARROW, CROSS, HAND, MOVE, TEXT, WAIT
+ * @param {PImage} image any variable of type PImage
+ * @param {int} x the horizonal active spot of the cursor
+ * @param {int} y the vertical active spot of the cursor
+ *
+ * @returns none
+ *
+ * @see noCursor
+ */
+ p.cursor = function() {
+ if (arguments.length > 1 || (arguments.length === 1 && arguments[0] instanceof p.PImage)) {
+ var image = arguments[0],
+ x, y;
+ if (arguments.length >= 3) {
+ x = arguments[1];
+ y = arguments[2];
+ if (x < 0 || y < 0 || y >= image.height || x >= image.width) {
+ throw "x and y must be non-negative and less than the dimensions of the image";
+ }
+ } else {
+ x = image.width >>> 1;
+ y = image.height >>> 1;
+ }
+
+ // see https://developer.mozilla.org/en/Using_URL_values_for_the_cursor_property
+ var imageDataURL = image.toDataURL();
+ var style = "url(\"" + imageDataURL + "\") " + x + " " + y + ", default";
+ curCursor = curElement.style.cursor = style;
+ } else if (arguments.length === 1) {
+ var mode = arguments[0];
+ curCursor = curElement.style.cursor = mode;
+ } else {
+ curCursor = curElement.style.cursor = oldCursor;
+ }
+ };
+
+ /**
+ * Hides the cursor from view.
+ *
+ * @returns none
+ *
+ * @see cursor
+ */
+ p.noCursor = function() {
+ curCursor = curElement.style.cursor = PConstants.NOCURSOR;
+ };
+
+ /**
+ * Links to a webpage either in the same window or in a new window. The complete URL
+ * must be specified.
+ *
+ * @param {String} href complete url as a String in quotes
+ * @param {String} target name of the window to load the URL as a string in quotes
+ *
+ * @returns none
+ */
+ p.link = function(href, target) {
+ if (target !== undef) {
+ window.open(href, target);
+ } else {
+ window.location = href;
+ }
+ };
+
+ // PGraphics methods
+ // These functions exist only for compatibility with P5
+ p.beginDraw = noop;
+ p.endDraw = noop;
+
+ /**
+ * This function takes content from a canvas and turns it into an ImageData object to be used with a PImage
+ *
+ * @returns {ImageData} ImageData object to attach to a PImage (1D array of pixel data)
+ *
+ * @see PImage
+ */
+ Drawing2D.prototype.toImageData = function(x, y, w, h) {
+ x = x !== undef ? x : 0;
+ y = y !== undef ? y : 0;
+ w = w !== undef ? w : p.width;
+ h = h !== undef ? h : p.height;
+ return curContext.getImageData(x, y, w, h);
+ };
+
+ Drawing3D.prototype.toImageData = function(x, y, w, h) {
+ x = x !== undef ? x : 0;
+ y = y !== undef ? y : 0;
+ w = w !== undef ? w : p.width;
+ h = h !== undef ? h : p.height;
+ var c = document.createElement("canvas"),
+ ctx = c.getContext("2d"),
+ obj = ctx.createImageData(w, h),
+ uBuff = new Uint8Array(w * h * 4);
+ curContext.readPixels(x, y, w, h, curContext.RGBA, curContext.UNSIGNED_BYTE, uBuff);
+ for (var i=0, ul=uBuff.length, obj_data=obj.data; i < ul; i++) {
+ obj_data[i] = uBuff[(h - 1 - Math.floor(i / 4 / w)) * w * 4 + (i % (w * 4))];
+ }
+ return obj;
+ };
+
+ /**
+ * Displays message in the browser's status area. This is the text area in the lower
+ * left corner of the browser. The status() function will only work when the
+ * Processing program is running in a web browser.
+ *
+ * @param {String} text any valid String
+ *
+ * @returns none
+ */
+ p.status = function(text) {
+ window.status = text;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Binary Functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Converts a byte, char, int, or color to a String containing the equivalent binary
+ * notation. For example color(0, 102, 153, 255) will convert to the String
+ * "11111111000000000110011010011001". This function can help make your geeky debugging
+ * sessions much happier.
+ *
+ * @param {byte|char|int|color} num byte, char, int, color: value to convert
+ * @param {int} numBits number of digits to return
+ *
+ * @returns {String}
+ *
+ * @see unhex
+ * @see hex
+ * @see unbinary
+ */
+ p.binary = function(num, numBits) {
+ var bit;
+ if (numBits > 0) {
+ bit = numBits;
+ } else if(num instanceof Char) {
+ bit = 16;
+ num |= 0; // making it int
+ } else {
+ // autodetect, skipping zeros
+ bit = 32;
+ while (bit > 1 && !((num >>> (bit - 1)) & 1)) {
+ bit--;
+ }
+ }
+ var result = "";
+ while (bit > 0) {
+ result += ((num >>> (--bit)) & 1) ? "1" : "0";
+ }
+ return result;
+ };
+
+ /**
+ * Converts a String representation of a binary number to its equivalent integer value.
+ * For example, unbinary("00001000") will return 8.
+ *
+ * @param {String} binaryString String
+ *
+ * @returns {Int}
+ *
+ * @see hex
+ * @see binary
+ * @see unbinary
+ */
+ p.unbinary = function(binaryString) {
+ var i = binaryString.length - 1, mask = 1, result = 0;
+ while (i >= 0) {
+ var ch = binaryString[i--];
+ if (ch !== '0' && ch !== '1') {
+ throw "the value passed into unbinary was not an 8 bit binary number";
+ }
+ if (ch === '1') {
+ result += mask;
+ }
+ mask <<= 1;
+ }
+ return result;
+ };
+
+ var decimalToHex = function(d, padding) {
+ //if there is no padding value added, default padding to 8 else go into while statement.
+ padding = (padding === undef || padding === null) ? padding = 8 : padding;
+ if (d < 0) {
+ d = 0xFFFFFFFF + d + 1;
+ }
+ var hex = Number(d).toString(16).toUpperCase();
+ while (hex.length < padding) {
+ hex = "0" + hex;
+ }
+ if (hex.length >= padding) {
+ hex = hex.substring(hex.length - padding, hex.length);
+ }
+ return hex;
+ };
+
+ // note: since we cannot keep track of byte, int types by default the returned string is 8 chars long
+ // if no 2nd argument is passed. closest compromise we can use to match java implementation Feb 5 2010
+ // also the char parser has issues with chars that are not digits or letters IE: !@#$%^&*
+ /**
+ * Converts a byte, char, int, or color to a String containing the equivalent hexadecimal notation.
+ * For example color(0, 102, 153, 255) will convert to the String "FF006699". This function can help
+ * make your geeky debugging sessions much happier.
+ *
+ * @param {byte|char|int|Color} value the value to turn into a hex string
+ * @param {int} digits the number of digits to return
+ *
+ * @returns {String}
+ *
+ * @see unhex
+ * @see binary
+ * @see unbinary
+ */
+ p.hex = function(value, len) {
+ if (arguments.length === 1) {
+ if (value instanceof Char) {
+ len = 4;
+ } else { // int or byte, indistinguishable at the moment, default to 8
+ len = 8;
+ }
+ }
+ return decimalToHex(value, len);
+ };
+
+ function unhexScalar(hex) {
+ var value = parseInt("0x" + hex, 16);
+
+ // correct for int overflow java expectation
+ if (value > 2147483647) {
+ value -= 4294967296;
+ }
+ return value;
+ }
+
+ /**
+ * Converts a String representation of a hexadecimal number to its equivalent integer value.
+ *
+ * @param {String} hex the hex string to convert to an int
+ *
+ * @returns {int}
+ *
+ * @see hex
+ * @see binary
+ * @see unbinary
+ */
+ p.unhex = function(hex) {
+ if (hex instanceof Array) {
+ var arr = [];
+ for (var i = 0; i < hex.length; i++) {
+ arr.push(unhexScalar(hex[i]));
+ }
+ return arr;
+ }
+ return unhexScalar(hex);
+ };
+
+ // Load a file or URL into strings
+ /**
+ * Reads the contents of a file or url and creates a String array of its individual lines.
+ * The filename parameter can also be a URL to a file found online. If the file is not available or an error occurs,
+ * null will be returned and an error message will be printed to the console. The error message does not halt
+ * the program.
+ *
+ * @param {String} filename name of the file or url to load
+ *
+ * @returns {String[]}
+ *
+ * @see loadBytes
+ * @see saveStrings
+ * @see saveBytes
+ */
+ p.loadStrings = function(filename) {
+ if (localStorage[filename]) {
+ return localStorage[filename].split("\n");
+ }
+
+ var filecontent = ajax(filename);
+ if(typeof filecontent !== "string" || filecontent === "") {
+ return [];
+ }
+
+ // deal with the fact that Windows uses \r\n, Unix uses \n,
+ // Mac uses \r, and we actually expect \n
+ filecontent = filecontent.replace(/(\r\n?)/g,"\n").replace(/\n$/,"");
+
+ return filecontent.split("\n");
+ };
+
+ // Writes an array of strings to a file, one line per string
+ /**
+ * Writes an array of strings to a file, one line per string. This file is saved to the localStorage.
+ *
+ * @param {String} filename name of the file to save to localStorage
+ * @param {String[]} strings string array to be written
+ *
+ * @see loadBytes
+ * @see loadStrings
+ * @see saveBytes
+ */
+ p.saveStrings = function(filename, strings) {
+ localStorage[filename] = strings.join('\n');
+ };
+
+ /**
+ * Reads the contents of a file or url and places it in a byte array. If a file is specified, it must be located in the localStorage.
+ * The filename parameter can also be a URL to a file found online.
+ *
+ * @param {String} filename name of a file in the localStorage or a URL.
+ *
+ * @returns {byte[]}
+ *
+ * @see loadStrings
+ * @see saveStrings
+ * @see saveBytes
+ */
+ p.loadBytes = function(url) {
+ var string = ajax(url);
+ var ret = [];
+
+ for (var i = 0; i < string.length; i++) {
+ ret.push(string.charCodeAt(i));
+ }
+
+ return ret;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // String Functions
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * The matchAll() function is identical to match(), except that it returns an array of all matches in
+ * the specified String, rather than just the first.
+ *
+ * @param {String} aString the String to search inside
+ * @param {String} aRegExp the regexp to be used for matching
+ *
+ * @return {String[]} returns an array of matches
+ *
+ * @see #match
+ */
+ p.matchAll = function(aString, aRegExp) {
+ var results = [],
+ latest;
+ var regexp = new RegExp(aRegExp, "g");
+ while ((latest = regexp.exec(aString)) !== null) {
+ results.push(latest);
+ if (latest[0].length === 0) {
+ ++regexp.lastIndex;
+ }
+ }
+ return results.length > 0 ? results : null;
+ };
+ /**
+ * The match() function matches a string with a regular expression, and returns the match as an
+ * array. The first index is the matching expression, and array elements
+ * [1] and higher represent each of the groups (sequences found in parens).
+ *
+ * @param {String} str the String to be searched
+ * @param {String} regexp the regexp to be used for matching
+ *
+ * @return {String[]} an array of matching strings
+ */
+ p.match = function(str, regexp) {
+ return str.match(regexp);
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Other java specific functions
+ ////////////////////////////////////////////////////////////////////////////
+
+
+ var logBuffer = [];
+
+ /**
+ * The println() function writes to the console area of the Processing environment.
+ * Each call to this function creates a new line of output. Individual elements can be separated with quotes ("") and joined with the string concatenation operator (+).
+ *
+ * @param {String} message the string to write to the console
+ *
+ * @see #join
+ * @see #print
+ */
+ p.println = function() {
+ Processing.logger.println.apply(Processing.logger, arguments);
+ };
+ /**
+ * The print() function writes to the console area of the Processing environment.
+ *
+ * @param {String} message the string to write to the console
+ *
+ * @see #join
+ */
+ p.print = function() {
+ Processing.logger.print.apply(Processing.logger, arguments);
+ };
+
+ // Alphanumeric chars arguments automatically converted to numbers when
+ // passed in, and will come out as numbers.
+ p.str = function(val) {
+ if (val instanceof Array) {
+ var arr = [];
+ for (var i = 0; i < val.length; i++) {
+ arr.push(val[i].toString() + "");
+ }
+ return arr;
+ }
+ return (val.toString() + "");
+ };
+
+
+ // Conversion
+ function booleanScalar(val) {
+ if (typeof val === 'number') {
+ return val !== 0;
+ }
+ if (typeof val === 'boolean') {
+ return val;
+ }
+ if (typeof val === 'string') {
+ return val.toLowerCase() === 'true';
+ }
+ if (val instanceof Char) {
+ // 1, T or t
+ return val.code === 49 || val.code === 84 || val.code === 116;
+ }
+ }
+
+ /**
+ * Converts the passed parameter to the function to its boolean value.
+ * It will return an array of booleans if an array is passed in.
+ *
+ * @param {int, byte, string} val the parameter to be converted to boolean
+ * @param {int[], byte[], string[]} val the array to be converted to boolean[]
+ *
+ * @return {boolean|boolean[]} returns a boolean or an array of booleans
+ */
+ p.parseBoolean = function (val) {
+ if (val instanceof Array) {
+ var ret = [];
+ for (var i = 0; i < val.length; i++) {
+ ret.push(booleanScalar(val[i]));
+ }
+ return ret;
+ }
+ return booleanScalar(val);
+ };
+
+ /**
+ * Converts the passed parameter to the function to its byte value.
+ * A byte is a number between -128 and 127.
+ * It will return an array of bytes if an array is passed in.
+ *
+ * @param {int, char} what the parameter to be conveted to byte
+ * @param {int[], char[]} what the array to be converted to byte[]
+ *
+ * @return {byte|byte[]} returns a byte or an array of bytes
+ */
+ p.parseByte = function(what) {
+ if (what instanceof Array) {
+ var bytes = [];
+ for (var i = 0; i < what.length; i++) {
+ bytes.push((0 - (what[i] & 0x80)) | (what[i] & 0x7F));
+ }
+ return bytes;
+ }
+ return (0 - (what & 0x80)) | (what & 0x7F);
+ };
+
+ /**
+ * Converts the passed parameter to the function to its char value.
+ * It will return an array of chars if an array is passed in.
+ *
+ * @param {int, byte} key the parameter to be conveted to char
+ * @param {int[], byte[]} key the array to be converted to char[]
+ *
+ * @return {char|char[]} returns a char or an array of chars
+ */
+ p.parseChar = function(key) {
+ if (typeof key === "number") {
+ return new Char(String.fromCharCode(key & 0xFFFF));
+ }
+ if (key instanceof Array) {
+ var ret = [];
+ for (var i = 0; i < key.length; i++) {
+ ret.push(new Char(String.fromCharCode(key[i] & 0xFFFF)));
+ }
+ return ret;
+ }
+ throw "char() may receive only one argument of type int, byte, int[], or byte[].";
+ };
+
+ // Processing doc claims good argument types are: int, char, byte, boolean,
+ // String, int[], char[], byte[], boolean[], String[].
+ // floats should not work. However, floats with only zeroes right of the
+ // decimal will work because JS converts those to int.
+ function floatScalar(val) {
+ if (typeof val === 'number') {
+ return val;
+ }
+ if (typeof val === 'boolean') {
+ return val ? 1 : 0;
+ }
+ if (typeof val === 'string') {
+ return parseFloat(val);
+ }
+ if (val instanceof Char) {
+ return val.code;
+ }
+ }
+
+ /**
+ * Converts the passed parameter to the function to its float value.
+ * It will return an array of floats if an array is passed in.
+ *
+ * @param {int, char, boolean, string} val the parameter to be conveted to float
+ * @param {int[], char[], boolean[], string[]} val the array to be converted to float[]
+ *
+ * @return {float|float[]} returns a float or an array of floats
+ */
+ p.parseFloat = function(val) {
+ if (val instanceof Array) {
+ var ret = [];
+ for (var i = 0; i < val.length; i++) {
+ ret.push(floatScalar(val[i]));
+ }
+ return ret;
+ }
+ return floatScalar(val);
+ };
+
+ function intScalar(val, radix) {
+ if (typeof val === 'number') {
+ return val & 0xFFFFFFFF;
+ }
+ if (typeof val === 'boolean') {
+ return val ? 1 : 0;
+ }
+ if (typeof val === 'string') {
+ var number = parseInt(val, radix || 10); // Default to decimal radix.
+ return number & 0xFFFFFFFF;
+ }
+ if (val instanceof Char) {
+ return val.code;
+ }
+ }
+
+ /**
+ * Converts the passed parameter to the function to its int value.
+ * It will return an array of ints if an array is passed in.
+ *
+ * @param {string, char, boolean, float} val the parameter to be conveted to int
+ * @param {string[], char[], boolean[], float[]} val the array to be converted to int[]
+ * @param {int} radix optional the radix of the number (for js compatibility)
+ *
+ * @return {int|int[]} returns a int or an array of ints
+ */
+ p.parseInt = function(val, radix) {
+ if (val instanceof Array) {
+ var ret = [];
+ for (var i = 0; i < val.length; i++) {
+ if (typeof val[i] === 'string' && !/^\s*[+\-]?\d+\s*$/.test(val[i])) {
+ ret.push(0);
+ } else {
+ ret.push(intScalar(val[i], radix));
+ }
+ }
+ return ret;
+ }
+ return intScalar(val, radix);
+ };
+
+ p.__int_cast = function(val) {
+ return 0|val;
+ };
+
+ p.__instanceof = function(obj, type) {
+ if (typeof type !== "function") {
+ throw "Function is expected as type argument for instanceof operator";
+ }
+
+ if (typeof obj === "string") {
+ // special case for strings
+ return type === Object || type === String;
+ }
+
+ if (obj instanceof type) {
+ // fast check if obj is already of type instance
+ return true;
+ }
+
+ if (typeof obj !== "object" || obj === null) {
+ return false; // not an object or null
+ }
+
+ var objType = obj.constructor;
+ if (type.$isInterface) {
+ // expecting the interface
+ // queueing interfaces from type and its base classes
+ var interfaces = [];
+ while (objType) {
+ if (objType.$interfaces) {
+ interfaces = interfaces.concat(objType.$interfaces);
+ }
+ objType = objType.$base;
+ }
+ while (interfaces.length > 0) {
+ var i = interfaces.shift();
+ if (i === type) {
+ return true;
+ }
+ // wide search in base interfaces
+ if (i.$interfaces) {
+ interfaces = interfaces.concat(i.$interfaces);
+ }
+ }
+ return false;
+ }
+
+ while (objType.hasOwnProperty("$base")) {
+ objType = objType.$base;
+ if (objType === type) {
+ return true; // object was found
+ }
+ }
+
+ return false;
+ };
+
+ /**
+ * Defines the dimension of the display window in units of pixels. The size() function must
+ * be the first line in setup(). If size() is not called, the default size of the window is
+ * 100x100 pixels. The system variables width and height are set by the parameters passed to
+ * the size() function.
+ *
+ * @param {int} aWidth width of the display window in units of pixels
+ * @param {int} aHeight height of the display window in units of pixels
+ * @param {MODE} aMode Either P2D, P3D, JAVA2D, or OPENGL
+ *
+ * @see createGraphics
+ * @see screen
+ */
+ DrawingShared.prototype.size = function(aWidth, aHeight, aMode) {
+ if (doStroke) {
+ p.stroke(0);
+ }
+
+ if (doFill) {
+ p.fill(255);
+ }
+
+ // The default 2d context has already been created in the p.init() stage if
+ // a 3d context was not specified. This is so that a 2d context will be
+ // available if size() was not called.
+ var savedProperties = {
+ fillStyle: curContext.fillStyle,
+ strokeStyle: curContext.strokeStyle,
+ lineCap: curContext.lineCap,
+ lineJoin: curContext.lineJoin
+ };
+ // remove the style width and height properties to ensure that the canvas gets set to
+ // aWidth and aHeight coming in
+ if (curElement.style.length > 0 ) {
+ curElement.style.removeProperty("width");
+ curElement.style.removeProperty("height");
+ }
+
+ curElement.width = p.width = aWidth || 100;
+ curElement.height = p.height = aHeight || 100;
+
+ for (var prop in savedProperties) {
+ if (savedProperties.hasOwnProperty(prop)) {
+ curContext[prop] = savedProperties[prop];
+ }
+ }
+
+ // make sure to set the default font the first time round.
+ p.textFont(curTextFont);
+
+ // Set the background to whatever it was called last as if background() was called before size()
+ // If background() hasn't been called before, set background() to a light gray
+ p.background();
+
+ // set 5% for pixels to cache (or 1000)
+ maxPixelsCached = Math.max(1000, aWidth * aHeight * 0.05);
+
+ // Externalize the context
+ p.externals.context = curContext;
+
+ for (var i = 0; i < PConstants.SINCOS_LENGTH; i++) {
+ sinLUT[i] = p.sin(i * (PConstants.PI / 180) * 0.5);
+ cosLUT[i] = p.cos(i * (PConstants.PI / 180) * 0.5);
+ }
+ };
+
+ Drawing2D.prototype.size = function(aWidth, aHeight, aMode) {
+ if (curContext === undef) {
+ // size() was called without p.init() default context, i.e. p.createGraphics()
+ curContext = curElement.getContext("2d");
+ userMatrixStack = new PMatrixStack();
+ userReverseMatrixStack = new PMatrixStack();
+ modelView = new PMatrix2D();
+ modelViewInv = new PMatrix2D();
+ }
+
+ DrawingShared.prototype.size.apply(this, arguments);
+ };
+
+ Drawing3D.prototype.size = (function() {
+ var size3DCalled = false;
+
+ return function size(aWidth, aHeight, aMode) {
+ if (size3DCalled) {
+ throw "Multiple calls to size() for 3D renders are not allowed.";
+ }
+ size3DCalled = true;
+
+ function getGLContext(canvas) {
+ var ctxNames = ['experimental-webgl', 'webgl', 'webkit-3d'],
+ gl;
+
+ for (var i=0, l=ctxNames.length; i<l; i++) {
+ gl = canvas.getContext(ctxNames[i], {antialias: false, preserveDrawingBuffer: true});
+ if (gl) {
+ break;
+ }
+ }
+
+ return gl;
+ }
+
+ // Get the 3D rendering context.
+ try {
+ // If the HTML <canvas> dimensions differ from the
+ // dimensions specified in the size() call in the sketch, for
+ // 3D sketches, browsers will either not render or render the
+ // scene incorrectly. To fix this, we need to adjust the
+ // width and height attributes of the canvas.
+ curElement.width = p.width = aWidth || 100;
+ curElement.height = p.height = aHeight || 100;
+ curContext = getGLContext(curElement);
+ canTex = curContext.createTexture();
+ textTex = curContext.createTexture();
+ } catch(e_size) {
+ Processing.debug(e_size);
+ }
+
+ if (!curContext) {
+ throw "WebGL context is not supported on this browser.";
+ }
+
+ // Set defaults
+ curContext.viewport(0, 0, curElement.width, curElement.height);
+ curContext.enable(curContext.DEPTH_TEST);
+ curContext.enable(curContext.BLEND);
+ curContext.blendFunc(curContext.SRC_ALPHA, curContext.ONE_MINUS_SRC_ALPHA);
+
+ // Create the program objects to render 2D (points, lines) and
+ // 3D (spheres, boxes) shapes. Because 2D shapes are not lit,
+ // lighting calculations are ommitted from this program object.
+ programObject2D = createProgramObject(curContext, vertexShaderSrc2D, fragmentShaderSrc2D);
+
+ programObjectUnlitShape = createProgramObject(curContext, vertexShaderSrcUnlitShape, fragmentShaderSrcUnlitShape);
+
+ // Set the default point and line width for the 2D and unlit shapes.
+ p.strokeWeight(1);
+
+ // Now that the programs have been compiled, we can set the default
+ // states for the lights.
+ programObject3D = createProgramObject(curContext, vertexShaderSrc3D, fragmentShaderSrc3D);
+ curContext.useProgram(programObject3D);
+
+ // Assume we aren't using textures by default.
+ uniformi("usingTexture3d", programObject3D, "usingTexture", usingTexture);
+
+ // Set some defaults.
+ p.lightFalloff(1, 0, 0);
+ p.shininess(1);
+ p.ambient(255, 255, 255);
+ p.specular(0, 0, 0);
+ p.emissive(0, 0, 0);
+
+ // Create buffers for 3D primitives
+ boxBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, boxBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, boxVerts, curContext.STATIC_DRAW);
+
+ boxNormBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, boxNormBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, boxNorms, curContext.STATIC_DRAW);
+
+ boxOutlineBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, boxOutlineBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, boxOutlineVerts, curContext.STATIC_DRAW);
+
+ // used to draw the rectangle and the outline
+ rectBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, rectBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, rectVerts, curContext.STATIC_DRAW);
+
+ rectNormBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, rectNormBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, rectNorms, curContext.STATIC_DRAW);
+
+ // The sphere vertices are specified dynamically since the user
+ // can change the level of detail. Everytime the user does that
+ // using sphereDetail(), the new vertices are calculated.
+ sphereBuffer = curContext.createBuffer();
+
+ lineBuffer = curContext.createBuffer();
+
+ // Shape buffers
+ fillBuffer = curContext.createBuffer();
+ fillColorBuffer = curContext.createBuffer();
+ strokeColorBuffer = curContext.createBuffer();
+ shapeTexVBO = curContext.createBuffer();
+
+ pointBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, pointBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array([0, 0, 0]), curContext.STATIC_DRAW);
+
+ textBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, textBuffer );
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array([1,1,0,-1,1,0,-1,-1,0,1,-1,0]), curContext.STATIC_DRAW);
+
+ textureBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, textureBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array([0,0,1,0,1,1,0,1]), curContext.STATIC_DRAW);
+
+ indexBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ELEMENT_ARRAY_BUFFER, indexBuffer);
+ curContext.bufferData(curContext.ELEMENT_ARRAY_BUFFER, new Uint16Array([0,1,2,2,3,0]), curContext.STATIC_DRAW);
+
+ cam = new PMatrix3D();
+ cameraInv = new PMatrix3D();
+ modelView = new PMatrix3D();
+ modelViewInv = new PMatrix3D();
+ projection = new PMatrix3D();
+ p.camera();
+ p.perspective();
+
+ userMatrixStack = new PMatrixStack();
+ userReverseMatrixStack = new PMatrixStack();
+ // used by both curve and bezier, so just init here
+ curveBasisMatrix = new PMatrix3D();
+ curveToBezierMatrix = new PMatrix3D();
+ curveDrawMatrix = new PMatrix3D();
+ bezierDrawMatrix = new PMatrix3D();
+ bezierBasisInverse = new PMatrix3D();
+ bezierBasisMatrix = new PMatrix3D();
+ bezierBasisMatrix.set(-1, 3, -3, 1, 3, -6, 3, 0, -3, 3, 0, 0, 1, 0, 0, 0);
+
+ DrawingShared.prototype.size.apply(this, arguments);
+ };
+ }());
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Lights
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Adds an ambient light. Ambient light doesn't come from a specific direction,
+ * the rays have light have bounced around so much that objects are evenly lit
+ * from all sides. Ambient lights are almost always used in combination with
+ * other types of lights. Lights need to be included in the <b>draw()</b> to
+ * remain persistent in a looping program. Placing them in the <b>setup()</b>
+ * of a looping program will cause them to only have an effect the first time
+ * through the loop. The effect of the parameters is determined by the current
+ * color mode.
+ *
+ * @param {int | float} r red or hue value
+ * @param {int | float} g green or hue value
+ * @param {int | float} b blue or hue value
+ *
+ * @param {int | float} x x position of light (used for falloff)
+ * @param {int | float} y y position of light (used for falloff)
+ * @param {int | float} z z position of light (used for falloff)
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see directionalLight
+ * @see pointLight
+ * @see spotLight
+ */
+ Drawing2D.prototype.ambientLight = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.ambientLight = function(r, g, b, x, y, z) {
+ if (lightCount === PConstants.MAX_LIGHTS) {
+ throw "can only create " + PConstants.MAX_LIGHTS + " lights";
+ }
+
+ var pos = new PVector(x, y, z);
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.mult(pos, pos);
+
+ // Instead of calling p.color, we do the calculations ourselves to
+ // reduce property lookups.
+ var col = color$4(r, g, b, 0);
+ var normalizedCol = [ ((col & PConstants.RED_MASK) >>> 16) / 255,
+ ((col & PConstants.GREEN_MASK) >>> 8) / 255,
+ (col & PConstants.BLUE_MASK) / 255 ];
+
+ curContext.useProgram(programObject3D);
+ uniformf("uLights.color.3d." + lightCount, programObject3D, "uLights" + lightCount + ".color", normalizedCol);
+ uniformf("uLights.position.3d." + lightCount, programObject3D, "uLights" + lightCount + ".position", pos.array());
+ uniformi("uLights.type.3d." + lightCount, programObject3D, "uLights" + lightCount + ".type", 0);
+ uniformi("uLightCount3d", programObject3D, "uLightCount", ++lightCount);
+ };
+
+ /**
+ * Adds a directional light. Directional light comes from one direction and
+ * is stronger when hitting a surface squarely and weaker if it hits at a
+ * gentle angle. After hitting a surface, a directional lights scatters in
+ * all directions. Lights need to be included in the <b>draw()</b> to remain
+ * persistent in a looping program. Placing them in the <b>setup()</b> of a
+ * looping program will cause them to only have an effect the first time
+ * through the loop. The affect of the <br>r</b>, <br>g</b>, and <br>b</b>
+ * parameters is determined by the current color mode. The <b>nx</b>,
+ * <b>ny</b>, and <b>nz</b> parameters specify the direction the light is
+ * facing. For example, setting <b>ny</b> to -1 will cause the geometry to be
+ * lit from below (the light is facing directly upward).
+ *
+ * @param {int | float} r red or hue value
+ * @param {int | float} g green or hue value
+ * @param {int | float} b blue or hue value
+ *
+ * @param {int | float} nx direction along the x axis
+ * @param {int | float} ny direction along the y axis
+ * @param {int | float} nz direction along the z axis
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see ambientLight
+ * @see pointLight
+ * @see spotLight
+ */
+ Drawing2D.prototype.directionalLight = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.directionalLight = function(r, g, b, nx, ny, nz) {
+ if (lightCount === PConstants.MAX_LIGHTS) {
+ throw "can only create " + PConstants.MAX_LIGHTS + " lights";
+ }
+
+ curContext.useProgram(programObject3D);
+
+ var mvm = new PMatrix3D();
+ mvm.scale(1, -1, 1);
+ mvm.apply(modelView.array());
+ mvm = mvm.array();
+
+ // We need to multiply the direction by the model view matrix, but
+ // the mult function checks the w component of the vector, if it isn't
+ // present, it uses 1, so we manually multiply.
+ var dir = [
+ mvm[0] * nx + mvm[4] * ny + mvm[8] * nz,
+ mvm[1] * nx + mvm[5] * ny + mvm[9] * nz,
+ mvm[2] * nx + mvm[6] * ny + mvm[10] * nz
+ ];
+
+ // Instead of calling p.color, we do the calculations ourselves to
+ // reduce property lookups.
+ var col = color$4(r, g, b, 0);
+ var normalizedCol = [ ((col & PConstants.RED_MASK) >>> 16) / 255,
+ ((col & PConstants.GREEN_MASK) >>> 8) / 255,
+ (col & PConstants.BLUE_MASK) / 255 ];
+
+ uniformf("uLights.color.3d." + lightCount, programObject3D, "uLights" + lightCount + ".color", normalizedCol);
+ uniformf("uLights.position.3d." + lightCount, programObject3D, "uLights" + lightCount + ".position", dir);
+ uniformi("uLights.type.3d." + lightCount, programObject3D, "uLights" + lightCount + ".type", 1);
+ uniformi("uLightCount3d", programObject3D, "uLightCount", ++lightCount);
+ };
+
+ /**
+ * Sets the falloff rates for point lights, spot lights, and ambient lights.
+ * The parameters are used to determine the falloff with the following equation:
+ *
+ * d = distance from light position to vertex position
+ * falloff = 1 / (CONSTANT + d * LINEAR + (d*d) * QUADRATIC)
+ *
+ * Like <b>fill()</b>, it affects only the elements which are created after it in the
+ * code. The default value if <b>LightFalloff(1.0, 0.0, 0.0)</b>. Thinking about an
+ * ambient light with a falloff can be tricky. It is used, for example, if you
+ * wanted a region of your scene to be lit ambiently one color and another region
+ * to be lit ambiently by another color, you would use an ambient light with location
+ * and falloff. You can think of it as a point light that doesn't care which direction
+ * a surface is facing.
+ *
+ * @param {int | float} constant constant value for determining falloff
+ * @param {int | float} linear linear value for determining falloff
+ * @param {int | float} quadratic quadratic value for determining falloff
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see ambientLight
+ * @see pointLight
+ * @see spotLight
+ * @see lightSpecular
+ */
+ Drawing2D.prototype.lightFalloff = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.lightFalloff = function(constant, linear, quadratic) {
+ curContext.useProgram(programObject3D);
+ uniformf("uFalloff3d", programObject3D, "uFalloff", [constant, linear, quadratic]);
+ };
+
+ /**
+ * Sets the specular color for lights. Like <b>fill()</b>, it affects only the
+ * elements which are created after it in the code. Specular refers to light
+ * which bounces off a surface in a perferred direction (rather than bouncing
+ * in all directions like a diffuse light) and is used for creating highlights.
+ * The specular quality of a light interacts with the specular material qualities
+ * set through the <b>specular()</b> and <b>shininess()</b> functions.
+ *
+ * @param {int | float} r red or hue value
+ * @param {int | float} g green or hue value
+ * @param {int | float} b blue or hue value
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see ambientLight
+ * @see pointLight
+ * @see spotLight
+ */
+ Drawing2D.prototype.lightSpecular = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.lightSpecular = function(r, g, b) {
+
+ // Instead of calling p.color, we do the calculations ourselves to
+ // reduce property lookups.
+ var col = color$4(r, g, b, 0);
+ var normalizedCol = [ ((col & PConstants.RED_MASK) >>> 16) / 255,
+ ((col & PConstants.GREEN_MASK) >>> 8) / 255,
+ (col & PConstants.BLUE_MASK) / 255 ];
+
+ curContext.useProgram(programObject3D);
+ uniformf("uSpecular3d", programObject3D, "uSpecular", normalizedCol);
+ };
+
+ /**
+ * Sets the default ambient light, directional light, falloff, and specular
+ * values. The defaults are ambientLight(128, 128, 128) and
+ * directionalLight(128, 128, 128, 0, 0, -1), lightFalloff(1, 0, 0), and
+ * lightSpecular(0, 0, 0). Lights need to be included in the draw() to remain
+ * persistent in a looping program. Placing them in the setup() of a looping
+ * program will cause them to only have an effect the first time through the
+ * loop.
+ *
+ * @returns none
+ *
+ * @see ambientLight
+ * @see directionalLight
+ * @see pointLight
+ * @see spotLight
+ * @see noLights
+ *
+ */
+ p.lights = function() {
+ p.ambientLight(128, 128, 128);
+ p.directionalLight(128, 128, 128, 0, 0, -1);
+ p.lightFalloff(1, 0, 0);
+ p.lightSpecular(0, 0, 0);
+ };
+
+ /**
+ * Adds a point light. Lights need to be included in the <b>draw()</b> to remain
+ * persistent in a looping program. Placing them in the <b>setup()</b> of a
+ * looping program will cause them to only have an effect the first time through
+ * the loop. The affect of the <b>r</b>, <b>g</b>, and <b>b</b> parameters
+ * is determined by the current color mode. The <b>x</b>, <b>y</b>, and <b>z</b>
+ * parameters set the position of the light.
+ *
+ * @param {int | float} r red or hue value
+ * @param {int | float} g green or hue value
+ * @param {int | float} b blue or hue value
+ * @param {int | float} x x coordinate of the light
+ * @param {int | float} y y coordinate of the light
+ * @param {int | float} z z coordinate of the light
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see directionalLight
+ * @see ambientLight
+ * @see spotLight
+ */
+ Drawing2D.prototype.pointLight = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.pointLight = function(r, g, b, x, y, z) {
+ if (lightCount === PConstants.MAX_LIGHTS) {
+ throw "can only create " + PConstants.MAX_LIGHTS + " lights";
+ }
+
+ // Place the point in view space once instead of once per vertex
+ // in the shader.
+ var pos = new PVector(x, y, z);
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.mult(pos, pos);
+
+ // Instead of calling p.color, we do the calculations ourselves to
+ // reduce property lookups.
+ var col = color$4(r, g, b, 0);
+ var normalizedCol = [ ((col & PConstants.RED_MASK) >>> 16) / 255,
+ ((col & PConstants.GREEN_MASK) >>> 8) / 255,
+ (col & PConstants.BLUE_MASK) / 255 ];
+
+ curContext.useProgram(programObject3D);
+ uniformf("uLights.color.3d." + lightCount, programObject3D, "uLights" + lightCount + ".color", normalizedCol);
+ uniformf("uLights.position.3d." + lightCount, programObject3D, "uLights" + lightCount + ".position", pos.array());
+ uniformi("uLights.type.3d." + lightCount, programObject3D, "uLights" + lightCount + ".type", 2);
+ uniformi("uLightCount3d", programObject3D, "uLightCount", ++lightCount);
+ };
+
+ /**
+ * Disable all lighting. Lighting is turned off by default and enabled with
+ * the lights() method. This function can be used to disable lighting so
+ * that 2D geometry (which does not require lighting) can be drawn after a
+ * set of lighted 3D geometry.
+ *
+ * @returns none
+ *
+ * @see lights
+ */
+ Drawing2D.prototype.noLights = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.noLights = function() {
+ lightCount = 0;
+ curContext.useProgram(programObject3D);
+ uniformi("uLightCount3d", programObject3D, "uLightCount", lightCount);
+ };
+
+ /**
+ * Adds a spot light. Lights need to be included in the <b>draw()</b> to
+ * remain persistent in a looping program. Placing them in the <b>setup()</b>
+ * of a looping program will cause them to only have an effect the first time
+ * through the loop. The affect of the <b>r</b>, <b>g</b>, and <b>b</b> parameters
+ * is determined by the current color mode. The <b>x</b>, <b>y</b>, and <b>z</b>
+ * parameters specify the position of the light and <b>nx</b>, <b>ny</b>, <b>nz</b>
+ * specify the direction or light. The angle parameter affects <b>angle</b> of the
+ * spotlight cone.
+ *
+ * @param {int | float} r red or hue value
+ * @param {int | float} g green or hue value
+ * @param {int | float} b blue or hue value
+ * @param {int | float} x coordinate of the light
+ * @param {int | float} y coordinate of the light
+ * @param {int | float} z coordinate of the light
+ * @param {int | float} nx direction along the x axis
+ * @param {int | float} ny direction along the y axis
+ * @param {int | float} nz direction along the z axis
+ * @param {float} angle angle of the spotlight cone
+ * @param {float} concentration exponent determining the center bias of the cone
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see directionalLight
+ * @see ambientLight
+ * @see pointLight
+ */
+ Drawing2D.prototype.spotLight = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.spotLight = function(r, g, b, x, y, z, nx, ny, nz, angle, concentration) {
+ if (lightCount === PConstants.MAX_LIGHTS) {
+ throw "can only create " + PConstants.MAX_LIGHTS + " lights";
+ }
+
+ curContext.useProgram(programObject3D);
+
+ // multiply the position and direction by the model view matrix
+ // once per object rather than once per vertex.
+ var pos = new PVector(x, y, z);
+ var mvm = new PMatrix3D();
+ mvm.scale(1, -1, 1);
+ mvm.apply(modelView.array());
+ mvm.mult(pos, pos);
+
+ // Convert to array since we need to directly access the elements.
+ mvm = mvm.array();
+
+ // We need to multiply the direction by the model view matrix, but
+ // the mult function checks the w component of the vector, if it isn't
+ // present, it uses 1, so we use a very small value as a work around.
+ var dir = [
+ mvm[0] * nx + mvm[4] * ny + mvm[8] * nz,
+ mvm[1] * nx + mvm[5] * ny + mvm[9] * nz,
+ mvm[2] * nx + mvm[6] * ny + mvm[10] * nz
+ ];
+
+ // Instead of calling p.color, we do the calculations ourselves to
+ // reduce property lookups.
+ var col = color$4(r, g, b, 0);
+ var normalizedCol = [ ((col & PConstants.RED_MASK) >>> 16) / 255,
+ ((col & PConstants.GREEN_MASK) >>> 8) / 255,
+ (col & PConstants.BLUE_MASK) / 255 ];
+
+ uniformf("uLights.color.3d." + lightCount, programObject3D, "uLights" + lightCount + ".color", normalizedCol);
+ uniformf("uLights.position.3d." + lightCount, programObject3D, "uLights" + lightCount + ".position", pos.array());
+ uniformf("uLights.direction.3d." + lightCount, programObject3D, "uLights" + lightCount + ".direction", dir);
+ uniformf("uLights.concentration.3d." + lightCount, programObject3D, "uLights" + lightCount + ".concentration", concentration);
+ uniformf("uLights.angle.3d." + lightCount, programObject3D, "uLights" + lightCount + ".angle", angle);
+ uniformi("uLights.type.3d." + lightCount, programObject3D, "uLights" + lightCount + ".type", 3);
+ uniformi("uLightCount3d", programObject3D, "uLightCount", ++lightCount);
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Camera functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * The <b>beginCamera()</b> and <b>endCamera()</b> functions enable advanced customization of the camera space.
+ * The functions are useful if you want to more control over camera movement, however for most users, the <b>camera()</b>
+ * function will be sufficient.<br /><br />The camera functions will replace any transformations (such as <b>rotate()</b>
+ * or <b>translate()</b>) that occur before them in <b>draw()</b>, but they will not automatically replace the camera
+ * transform itself. For this reason, camera functions should be placed at the beginning of <b>draw()</b> (so that
+ * transformations happen afterwards), and the <b>camera()</b> function can be used after <b>beginCamera()</b> if
+ * you want to reset the camera before applying transformations.<br /><br />This function sets the matrix mode to the
+ * camera matrix so calls such as <b>translate()</b>, <b>rotate()</b>, applyMatrix() and resetMatrix() affect the camera.
+ * <b>beginCamera()</b> should always be used with a following <b>endCamera()</b> and pairs of <b>beginCamera()</b> and
+ * <b>endCamera()</b> cannot be nested.
+ *
+ * @see camera
+ * @see endCamera
+ * @see applyMatrix
+ * @see resetMatrix
+ * @see translate
+ * @see rotate
+ * @see scale
+ */
+ Drawing2D.prototype.beginCamera = function() {
+ throw ("beginCamera() is not available in 2D mode");
+ };
+
+ Drawing3D.prototype.beginCamera = function() {
+ if (manipulatingCamera) {
+ throw ("You cannot call beginCamera() again before calling endCamera()");
+ }
+ manipulatingCamera = true;
+ modelView = cameraInv;
+ modelViewInv = cam;
+ };
+
+ /**
+ * The <b>beginCamera()</b> and <b>endCamera()</b> functions enable advanced customization of the camera space.
+ * Please see the reference for <b>beginCamera()</b> for a description of how the functions are used.
+ *
+ * @see beginCamera
+ */
+ Drawing2D.prototype.endCamera = function() {
+ throw ("endCamera() is not available in 2D mode");
+ };
+
+ Drawing3D.prototype.endCamera = function() {
+ if (!manipulatingCamera) {
+ throw ("You cannot call endCamera() before calling beginCamera()");
+ }
+ modelView.set(cam);
+ modelViewInv.set(cameraInv);
+ manipulatingCamera = false;
+ };
+
+ /**
+ * Sets the position of the camera through setting the eye position, the center of the scene, and which axis is facing
+ * upward. Moving the eye position and the direction it is pointing (the center of the scene) allows the images to be
+ * seen from different angles. The version without any parameters sets the camera to the default position, pointing to
+ * the center of the display window with the Y axis as up. The default values are camera(width/2.0, height/2.0,
+ * (height/2.0) / tan(PI*60.0 / 360.0), width/2.0, height/2.0, 0, 0, 1, 0). This function is similar to gluLookAt()
+ * in OpenGL, but it first clears the current camera settings.
+ *
+ * @param {float} eyeX x-coordinate for the eye
+ * @param {float} eyeY y-coordinate for the eye
+ * @param {float} eyeZ z-coordinate for the eye
+ * @param {float} centerX x-coordinate for the center of the scene
+ * @param {float} centerY y-coordinate for the center of the scene
+ * @param {float} centerZ z-coordinate for the center of the scene
+ * @param {float} upX usually 0.0, 1.0, -1.0
+ * @param {float} upY usually 0.0, 1.0, -1.0
+ * @param {float} upZ usually 0.0, 1.0, -1.0
+ *
+ * @see beginCamera
+ * @see endCamera
+ * @see frustum
+ */
+ p.camera = function(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ) {
+ if (eyeX === undef) {
+ // Workaround if createGraphics is used.
+ cameraX = p.width / 2;
+ cameraY = p.height / 2;
+ cameraZ = cameraY / Math.tan(cameraFOV / 2);
+ eyeX = cameraX;
+ eyeY = cameraY;
+ eyeZ = cameraZ;
+ centerX = cameraX;
+ centerY = cameraY;
+ centerZ = 0;
+ upX = 0;
+ upY = 1;
+ upZ = 0;
+ }
+
+ var z = new PVector(eyeX - centerX, eyeY - centerY, eyeZ - centerZ);
+ var y = new PVector(upX, upY, upZ);
+ z.normalize();
+ var x = PVector.cross(y, z);
+ y = PVector.cross(z, x);
+ x.normalize();
+ y.normalize();
+
+ var xX = x.x,
+ xY = x.y,
+ xZ = x.z;
+
+ var yX = y.x,
+ yY = y.y,
+ yZ = y.z;
+
+ var zX = z.x,
+ zY = z.y,
+ zZ = z.z;
+
+ cam.set(xX, xY, xZ, 0, yX, yY, yZ, 0, zX, zY, zZ, 0, 0, 0, 0, 1);
+
+ cam.translate(-eyeX, -eyeY, -eyeZ);
+
+ cameraInv.reset();
+ cameraInv.invApply(xX, xY, xZ, 0, yX, yY, yZ, 0, zX, zY, zZ, 0, 0, 0, 0, 1);
+
+ cameraInv.translate(eyeX, eyeY, eyeZ);
+
+ modelView.set(cam);
+ modelViewInv.set(cameraInv);
+ };
+
+ /**
+ * Sets a perspective projection applying foreshortening, making distant objects appear smaller than closer ones. The
+ * parameters define a viewing volume with the shape of truncated pyramid. Objects near to the front of the volume appear
+ * their actual size, while farther objects appear smaller. This projection simulates the perspective of the world more
+ * accurately than orthographic projection. The version of perspective without parameters sets the default perspective and
+ * the version with four parameters allows the programmer to set the area precisely. The default values are:
+ * perspective(PI/3.0, width/height, cameraZ/10.0, cameraZ*10.0) where cameraZ is ((height/2.0) / tan(PI*60.0/360.0));
+ *
+ * @param {float} fov field-of-view angle (in radians) for vertical direction
+ * @param {float} aspect ratio of width to height
+ * @param {float} zNear z-position of nearest clipping plane
+ * @param {float} zFar z-positions of farthest clipping plane
+ */
+ p.perspective = function(fov, aspect, near, far) {
+ if (arguments.length === 0) {
+ //in case canvas is resized
+ cameraY = curElement.height / 2;
+ cameraZ = cameraY / Math.tan(cameraFOV / 2);
+ cameraNear = cameraZ / 10;
+ cameraFar = cameraZ * 10;
+ cameraAspect = p.width / p.height;
+ fov = cameraFOV;
+ aspect = cameraAspect;
+ near = cameraNear;
+ far = cameraFar;
+ }
+
+ var yMax, yMin, xMax, xMin;
+ yMax = near * Math.tan(fov / 2);
+ yMin = -yMax;
+ xMax = yMax * aspect;
+ xMin = yMin * aspect;
+ p.frustum(xMin, xMax, yMin, yMax, near, far);
+ };
+
+ /**
+ * Sets a perspective matrix defined through the parameters. Works like glFrustum, except it wipes out the current
+ * perspective matrix rather than muliplying itself with it.
+ *
+ * @param {float} left left coordinate of the clipping plane
+ * @param {float} right right coordinate of the clipping plane
+ * @param {float} bottom bottom coordinate of the clipping plane
+ * @param {float} top top coordinate of the clipping plane
+ * @param {float} near near coordinate of the clipping plane
+ * @param {float} far far coordinate of the clipping plane
+ *
+ * @see beginCamera
+ * @see camera
+ * @see endCamera
+ * @see perspective
+ */
+ Drawing2D.prototype.frustum = function() {
+ throw("Processing.js: frustum() is not supported in 2D mode");
+ };
+
+ Drawing3D.prototype.frustum = function(left, right, bottom, top, near, far) {
+ frustumMode = true;
+ projection = new PMatrix3D();
+ projection.set((2 * near) / (right - left), 0, (right + left) / (right - left),
+ 0, 0, (2 * near) / (top - bottom), (top + bottom) / (top - bottom),
+ 0, 0, 0, -(far + near) / (far - near), -(2 * far * near) / (far - near),
+ 0, 0, -1, 0);
+ var proj = new PMatrix3D();
+ proj.set(projection);
+ proj.transpose();
+ curContext.useProgram(programObject2D);
+ uniformMatrix("projection2d", programObject2D, "uProjection", false, proj.array());
+ curContext.useProgram(programObject3D);
+ uniformMatrix("projection3d", programObject3D, "uProjection", false, proj.array());
+ curContext.useProgram(programObjectUnlitShape);
+ uniformMatrix("uProjectionUS", programObjectUnlitShape, "uProjection", false, proj.array());
+ };
+
+ /**
+ * Sets an orthographic projection and defines a parallel clipping volume. All objects with the same dimension appear
+ * the same size, regardless of whether they are near or far from the camera. The parameters to this function specify
+ * the clipping volume where left and right are the minimum and maximum x values, top and bottom are the minimum and
+ * maximum y values, and near and far are the minimum and maximum z values. If no parameters are given, the default
+ * is used: ortho(0, width, 0, height, -10, 10).
+ *
+ * @param {float} left left plane of the clipping volume
+ * @param {float} right right plane of the clipping volume
+ * @param {float} bottom bottom plane of the clipping volume
+ * @param {float} top top plane of the clipping volume
+ * @param {float} near maximum distance from the origin to the viewer
+ * @param {float} far maximum distance from the origin away from the viewer
+ */
+ p.ortho = function(left, right, bottom, top, near, far) {
+ if (arguments.length === 0) {
+ left = 0;
+ right = p.width;
+ bottom = 0;
+ top = p.height;
+ near = -10;
+ far = 10;
+ }
+
+ var x = 2 / (right - left);
+ var y = 2 / (top - bottom);
+ var z = -2 / (far - near);
+
+ var tx = -(right + left) / (right - left);
+ var ty = -(top + bottom) / (top - bottom);
+ var tz = -(far + near) / (far - near);
+
+ projection = new PMatrix3D();
+ projection.set(x, 0, 0, tx, 0, y, 0, ty, 0, 0, z, tz, 0, 0, 0, 1);
+
+ var proj = new PMatrix3D();
+ proj.set(projection);
+ proj.transpose();
+ curContext.useProgram(programObject2D);
+ uniformMatrix("projection2d", programObject2D, "uProjection", false, proj.array());
+ curContext.useProgram(programObject3D);
+ uniformMatrix("projection3d", programObject3D, "uProjection", false, proj.array());
+ curContext.useProgram(programObjectUnlitShape);
+ uniformMatrix("uProjectionUS", programObjectUnlitShape, "uProjection", false, proj.array());
+ frustumMode = false;
+ };
+ /**
+ * The printProjection() prints the current projection matrix to the text window.
+ */
+ p.printProjection = function() {
+ projection.print();
+ };
+ /**
+ * The printCamera() function prints the current camera matrix.
+ */
+ p.printCamera = function() {
+ cam.print();
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Shapes
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * The box() function renders a box. A box is an extruded rectangle. A box with equal dimension on all sides is a cube.
+ * Calling this function with only one parameter will create a cube.
+ *
+ * @param {int|float} w dimension of the box in the x-dimension
+ * @param {int|float} h dimension of the box in the y-dimension
+ * @param {int|float} d dimension of the box in the z-dimension
+ */
+ Drawing2D.prototype.box = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.box = function(w, h, d) {
+ // user can uniformly scale the box by
+ // passing in only one argument.
+ if (!h || !d) {
+ h = d = w;
+ }
+
+ // Modeling transformation
+ var model = new PMatrix3D();
+ model.scale(w, h, d);
+
+ // Viewing transformation needs to have Y flipped
+ // becuase that's what Processing does.
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ if (doFill) {
+ curContext.useProgram(programObject3D);
+ uniformMatrix("model3d", programObject3D, "uModel", false, model.array());
+ uniformMatrix("view3d", programObject3D, "uView", false, view.array());
+ // Fix stitching problems. (lines get occluded by triangles
+ // since they share the same depth values). This is not entirely
+ // working, but it's a start for drawing the outline. So
+ // developers can start playing around with styles.
+ curContext.enable(curContext.POLYGON_OFFSET_FILL);
+ curContext.polygonOffset(1, 1);
+ uniformf("color3d", programObject3D, "uColor", fillStyle);
+
+ // Calculating the normal matrix can be expensive, so only
+ // do it if it's necessary.
+ if(lightCount > 0){
+ // Create the normal transformation matrix.
+ var v = new PMatrix3D();
+ v.set(view);
+
+ var m = new PMatrix3D();
+ m.set(model);
+
+ v.mult(m);
+
+ var normalMatrix = new PMatrix3D();
+ normalMatrix.set(v);
+ normalMatrix.invert();
+ normalMatrix.transpose();
+
+ uniformMatrix("uNormalTransform3d", programObject3D, "uNormalTransform", false, normalMatrix.array());
+ vertexAttribPointer("aNormal3d", programObject3D, "aNormal", 3, boxNormBuffer);
+ }
+ else{
+ disableVertexAttribPointer("aNormal3d", programObject3D, "aNormal");
+ }
+
+ vertexAttribPointer("aVertex3d", programObject3D, "aVertex", 3, boxBuffer);
+
+ // Turn off per vertex colors.
+ disableVertexAttribPointer("aColor3d", programObject3D, "aColor");
+ disableVertexAttribPointer("aTexture3d", programObject3D, "aTexture");
+
+ curContext.drawArrays(curContext.TRIANGLES, 0, boxVerts.length / 3);
+ curContext.disable(curContext.POLYGON_OFFSET_FILL);
+ }
+
+ // Draw the box outline.
+ if (lineWidth > 0 && doStroke) {
+ curContext.useProgram(programObject2D);
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, model.array());
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+ uniformf("uColor2d", programObject2D, "uColor", strokeStyle);
+ uniformi("uIsDrawingText2d", programObject2D, "uIsDrawingText", false);
+ vertexAttribPointer("vertex2d", programObject2D, "aVertex", 3, boxOutlineBuffer);
+ disableVertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord");
+ curContext.drawArrays(curContext.LINES, 0, boxOutlineVerts.length / 3);
+ }
+ };
+
+ /**
+ * The initSphere() function is a helper function used by <b>sphereDetail()</b>
+ * This function creates and stores sphere vertices every time the user changes sphere detail.
+ *
+ * @see #sphereDetail
+ */
+ var initSphere = function() {
+ var i;
+ sphereVerts = [];
+
+ for (i = 0; i < sphereDetailU; i++) {
+ sphereVerts.push(0);
+ sphereVerts.push(-1);
+ sphereVerts.push(0);
+ sphereVerts.push(sphereX[i]);
+ sphereVerts.push(sphereY[i]);
+ sphereVerts.push(sphereZ[i]);
+ }
+ sphereVerts.push(0);
+ sphereVerts.push(-1);
+ sphereVerts.push(0);
+ sphereVerts.push(sphereX[0]);
+ sphereVerts.push(sphereY[0]);
+ sphereVerts.push(sphereZ[0]);
+
+ var v1, v11, v2;
+
+ // middle rings
+ var voff = 0;
+ for (i = 2; i < sphereDetailV; i++) {
+ v1 = v11 = voff;
+ voff += sphereDetailU;
+ v2 = voff;
+ for (var j = 0; j < sphereDetailU; j++) {
+ sphereVerts.push(sphereX[v1]);
+ sphereVerts.push(sphereY[v1]);
+ sphereVerts.push(sphereZ[v1++]);
+ sphereVerts.push(sphereX[v2]);
+ sphereVerts.push(sphereY[v2]);
+ sphereVerts.push(sphereZ[v2++]);
+ }
+
+ // close each ring
+ v1 = v11;
+ v2 = voff;
+
+ sphereVerts.push(sphereX[v1]);
+ sphereVerts.push(sphereY[v1]);
+ sphereVerts.push(sphereZ[v1]);
+ sphereVerts.push(sphereX[v2]);
+ sphereVerts.push(sphereY[v2]);
+ sphereVerts.push(sphereZ[v2]);
+ }
+
+ // add the northern cap
+ for (i = 0; i < sphereDetailU; i++) {
+ v2 = voff + i;
+
+ sphereVerts.push(sphereX[v2]);
+ sphereVerts.push(sphereY[v2]);
+ sphereVerts.push(sphereZ[v2]);
+ sphereVerts.push(0);
+ sphereVerts.push(1);
+ sphereVerts.push(0);
+ }
+
+ sphereVerts.push(sphereX[voff]);
+ sphereVerts.push(sphereY[voff]);
+ sphereVerts.push(sphereZ[voff]);
+ sphereVerts.push(0);
+ sphereVerts.push(1);
+ sphereVerts.push(0);
+
+ //set the buffer data
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, sphereBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(sphereVerts), curContext.STATIC_DRAW);
+ };
+
+ /**
+ * The sphereDetail() function controls the detail used to render a sphere by adjusting the number of
+ * vertices of the sphere mesh. The default resolution is 30, which creates
+ * a fairly detailed sphere definition with vertices every 360/30 = 12
+ * degrees. If you're going to render a great number of spheres per frame,
+ * it is advised to reduce the level of detail using this function.
+ * The setting stays active until <b>sphereDetail()</b> is called again with
+ * a new parameter and so should <i>not</i> be called prior to every
+ * <b>sphere()</b> statement, unless you wish to render spheres with
+ * different settings, e.g. using less detail for smaller spheres or ones
+ * further away from the camera. To control the detail of the horizontal
+ * and vertical resolution independently, use the version of the functions
+ * with two parameters. Calling this function with one parameter sets the number of segments
+ *(minimum of 3) used per full circle revolution. This is equivalent to calling the function with
+ * two identical values.
+ *
+ * @param {int} ures number of segments used horizontally (longitudinally) per full circle revolution
+ * @param {int} vres number of segments used vertically (latitudinally) from top to bottom
+ *
+ * @see #sphere()
+ */
+ p.sphereDetail = function(ures, vres) {
+ var i;
+
+ if (arguments.length === 1) {
+ ures = vres = arguments[0];
+ }
+
+ if (ures < 3) {
+ ures = 3;
+ } // force a minimum res
+ if (vres < 2) {
+ vres = 2;
+ } // force a minimum res
+ // if it hasn't changed do nothing
+ if ((ures === sphereDetailU) && (vres === sphereDetailV)) {
+ return;
+ }
+
+ var delta = PConstants.SINCOS_LENGTH / ures;
+ var cx = new Float32Array(ures);
+ var cz = new Float32Array(ures);
+ // calc unit circle in XZ plane
+ for (i = 0; i < ures; i++) {
+ cx[i] = cosLUT[((i * delta) % PConstants.SINCOS_LENGTH) | 0];
+ cz[i] = sinLUT[((i * delta) % PConstants.SINCOS_LENGTH) | 0];
+ }
+
+ // computing vertexlist
+ // vertexlist starts at south pole
+ var vertCount = ures * (vres - 1) + 2;
+ var currVert = 0;
+
+ // re-init arrays to store vertices
+ sphereX = new Float32Array(vertCount);
+ sphereY = new Float32Array(vertCount);
+ sphereZ = new Float32Array(vertCount);
+
+ var angle_step = (PConstants.SINCOS_LENGTH * 0.5) / vres;
+ var angle = angle_step;
+
+ // step along Y axis
+ for (i = 1; i < vres; i++) {
+ var curradius = sinLUT[(angle % PConstants.SINCOS_LENGTH) | 0];
+ var currY = -cosLUT[(angle % PConstants.SINCOS_LENGTH) | 0];
+ for (var j = 0; j < ures; j++) {
+ sphereX[currVert] = cx[j] * curradius;
+ sphereY[currVert] = currY;
+ sphereZ[currVert++] = cz[j] * curradius;
+ }
+ angle += angle_step;
+ }
+ sphereDetailU = ures;
+ sphereDetailV = vres;
+
+ // make the sphere verts and norms
+ initSphere();
+ };
+
+ /**
+ * The sphere() function draws a sphere with radius r centered at coordinate 0, 0, 0.
+ * A sphere is a hollow ball made from tessellated triangles.
+ *
+ * @param {int|float} r the radius of the sphere
+ */
+ Drawing2D.prototype.sphere = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.sphere = function() {
+ var sRad = arguments[0];
+
+ if ((sphereDetailU < 3) || (sphereDetailV < 2)) {
+ p.sphereDetail(30);
+ }
+
+ // Modeling transformation.
+ var model = new PMatrix3D();
+ model.scale(sRad, sRad, sRad);
+
+ // viewing transformation needs to have Y flipped
+ // becuase that's what Processing does.
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ if (doFill) {
+ // Calculating the normal matrix can be expensive, so only
+ // do it if it's necessary.
+ if(lightCount > 0){
+ // Create a normal transformation matrix.
+ var v = new PMatrix3D();
+ v.set(view);
+
+ var m = new PMatrix3D();
+ m.set(model);
+
+ v.mult(m);
+
+ var normalMatrix = new PMatrix3D();
+ normalMatrix.set(v);
+ normalMatrix.invert();
+ normalMatrix.transpose();
+
+ uniformMatrix("uNormalTransform3d", programObject3D, "uNormalTransform", false, normalMatrix.array());
+ vertexAttribPointer("aNormal3d", programObject3D, "aNormal", 3, sphereBuffer);
+ }
+ else{
+ disableVertexAttribPointer("aNormal3d", programObject3D, "aNormal");
+ }
+
+ curContext.useProgram(programObject3D);
+ disableVertexAttribPointer("aTexture3d", programObject3D, "aTexture");
+
+ uniformMatrix("uModel3d", programObject3D, "uModel", false, model.array());
+ uniformMatrix("uView3d", programObject3D, "uView", false, view.array());
+ vertexAttribPointer("aVertex3d", programObject3D, "aVertex", 3, sphereBuffer);
+
+ // Turn off per vertex colors.
+ disableVertexAttribPointer("aColor3d", programObject3D, "aColor");
+
+ // fix stitching problems. (lines get occluded by triangles
+ // since they share the same depth values). This is not entirely
+ // working, but it's a start for drawing the outline. So
+ // developers can start playing around with styles.
+ curContext.enable(curContext.POLYGON_OFFSET_FILL);
+ curContext.polygonOffset(1, 1);
+ uniformf("uColor3d", programObject3D, "uColor", fillStyle);
+ curContext.drawArrays(curContext.TRIANGLE_STRIP, 0, sphereVerts.length / 3);
+ curContext.disable(curContext.POLYGON_OFFSET_FILL);
+ }
+
+ // Draw the sphere outline.
+ if (lineWidth > 0 && doStroke) {
+ curContext.useProgram(programObject2D);
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, model.array());
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+ vertexAttribPointer("aVertex2d", programObject2D, "aVertex", 3, sphereBuffer);
+ disableVertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord");
+ uniformf("uColor2d", programObject2D, "uColor", strokeStyle);
+ uniformi("uIsDrawingText", programObject2D, "uIsDrawingText", false);
+ curContext.drawArrays(curContext.LINE_STRIP, 0, sphereVerts.length / 3);
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Coordinates
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Returns the three-dimensional X, Y, Z position in model space. This returns
+ * the X value for a given coordinate based on the current set of transformations
+ * (scale, rotate, translate, etc.) The X value can be used to place an object
+ * in space relative to the location of the original point once the transformations
+ * are no longer in use.<br />
+ * <br />
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see modelY
+ * @see modelZ
+ */
+ p.modelX = function(x, y, z) {
+ var mv = modelView.array();
+ var ci = cameraInv.array();
+
+ var ax = mv[0] * x + mv[1] * y + mv[2] * z + mv[3];
+ var ay = mv[4] * x + mv[5] * y + mv[6] * z + mv[7];
+ var az = mv[8] * x + mv[9] * y + mv[10] * z + mv[11];
+ var aw = mv[12] * x + mv[13] * y + mv[14] * z + mv[15];
+
+ var ox = ci[0] * ax + ci[1] * ay + ci[2] * az + ci[3] * aw;
+ var ow = ci[12] * ax + ci[13] * ay + ci[14] * az + ci[15] * aw;
+
+ return (ow !== 0) ? ox / ow : ox;
+ };
+
+ /**
+ * Returns the three-dimensional X, Y, Z position in model space. This returns
+ * the Y value for a given coordinate based on the current set of transformations
+ * (scale, rotate, translate, etc.) The Y value can be used to place an object in
+ * space relative to the location of the original point once the transformations
+ * are no longer in use.<br />
+ * <br />
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see modelX
+ * @see modelZ
+ */
+ p.modelY = function(x, y, z) {
+ var mv = modelView.array();
+ var ci = cameraInv.array();
+
+ var ax = mv[0] * x + mv[1] * y + mv[2] * z + mv[3];
+ var ay = mv[4] * x + mv[5] * y + mv[6] * z + mv[7];
+ var az = mv[8] * x + mv[9] * y + mv[10] * z + mv[11];
+ var aw = mv[12] * x + mv[13] * y + mv[14] * z + mv[15];
+
+ var oy = ci[4] * ax + ci[5] * ay + ci[6] * az + ci[7] * aw;
+ var ow = ci[12] * ax + ci[13] * ay + ci[14] * az + ci[15] * aw;
+
+ return (ow !== 0) ? oy / ow : oy;
+ };
+
+ /**
+ * Returns the three-dimensional X, Y, Z position in model space. This returns
+ * the Z value for a given coordinate based on the current set of transformations
+ * (scale, rotate, translate, etc.) The Z value can be used to place an object in
+ * space relative to the location of the original point once the transformations
+ * are no longer in use.
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see modelX
+ * @see modelY
+ */
+ p.modelZ = function(x, y, z) {
+ var mv = modelView.array();
+ var ci = cameraInv.array();
+
+ var ax = mv[0] * x + mv[1] * y + mv[2] * z + mv[3];
+ var ay = mv[4] * x + mv[5] * y + mv[6] * z + mv[7];
+ var az = mv[8] * x + mv[9] * y + mv[10] * z + mv[11];
+ var aw = mv[12] * x + mv[13] * y + mv[14] * z + mv[15];
+
+ var oz = ci[8] * ax + ci[9] * ay + ci[10] * az + ci[11] * aw;
+ var ow = ci[12] * ax + ci[13] * ay + ci[14] * az + ci[15] * aw;
+
+ return (ow !== 0) ? oz / ow : oz;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Material Properties
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sets the ambient reflectance for shapes drawn to the screen. This is
+ * combined with the ambient light component of environment. The color
+ * components set through the parameters define the reflectance. For example in
+ * the default color mode, setting v1=255, v2=126, v3=0, would cause all the
+ * red light to reflect and half of the green light to reflect. Used in combination
+ * with <b>emissive()</b>, <b>specular()</b>, and <b>shininess()</b> in setting
+ * the materal properties of shapes.
+ *
+ * @param {int | float} gray
+ *
+ * @returns none
+ *
+ * @see emissive
+ * @see specular
+ * @see shininess
+ */
+ Drawing2D.prototype.ambient = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.ambient = function(v1, v2, v3) {
+ curContext.useProgram(programObject3D);
+ uniformi("uUsingMat3d", programObject3D, "uUsingMat", true);
+ var col = p.color(v1, v2, v3);
+ uniformf("uMaterialAmbient3d", programObject3D, "uMaterialAmbient", p.color.toGLArray(col).slice(0, 3));
+ };
+
+ /**
+ * Sets the emissive color of the material used for drawing shapes
+ * drawn to the screen. Used in combination with ambient(), specular(),
+ * and shininess() in setting the material properties of shapes.
+ *
+ * Can be called in the following ways:
+ *
+ * emissive(gray)
+ * @param {int | float} gray number specifying value between white and black
+ *
+ * emissive(color)
+ * @param {color} color any value of the color datatype
+ *
+ * emissive(v1, v2, v3)
+ * @param {int | float} v1 red or hue value
+ * @param {int | float} v2 green or saturation value
+ * @param {int | float} v3 blue or brightness value
+ *
+ * @returns none
+ *
+ * @see ambient
+ * @see specular
+ * @see shininess
+ */
+ Drawing2D.prototype.emissive = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.emissive = function(v1, v2, v3) {
+ curContext.useProgram(programObject3D);
+ uniformi("uUsingMat3d", programObject3D, "uUsingMat", true);
+ var col = p.color(v1, v2, v3);
+ uniformf("uMaterialEmissive3d", programObject3D, "uMaterialEmissive", p.color.toGLArray(col).slice(0, 3));
+ };
+
+ /**
+ * Sets the amount of gloss in the surface of shapes. Used in combination with
+ * <b>ambient()</b>, <b>specular()</b>, and <b>emissive()</b> in setting the
+ * material properties of shapes.
+ *
+ * @param {float} shine degree of shininess
+ *
+ * @returns none
+ */
+ Drawing2D.prototype.shininess = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.shininess = function(shine) {
+ curContext.useProgram(programObject3D);
+ uniformi("uUsingMat3d", programObject3D, "uUsingMat", true);
+ uniformf("uShininess3d", programObject3D, "uShininess", shine);
+ };
+
+ /**
+ * Sets the specular color of the materials used for shapes drawn to the screen,
+ * which sets the color of hightlights. Specular refers to light which bounces
+ * off a surface in a perferred direction (rather than bouncing in all directions
+ * like a diffuse light). Used in combination with emissive(), ambient(), and
+ * shininess() in setting the material properties of shapes.
+ *
+ * Can be called in the following ways:
+ *
+ * specular(gray)
+ * @param {int | float} gray number specifying value between white and black
+ *
+ * specular(gray, alpha)
+ * @param {int | float} gray number specifying value between white and black
+ * @param {int | float} alpha opacity
+ *
+ * specular(color)
+ * @param {color} color any value of the color datatype
+ *
+ * specular(v1, v2, v3)
+ * @param {int | float} v1 red or hue value
+ * @param {int | float} v2 green or saturation value
+ * @param {int | float} v3 blue or brightness value
+ *
+ * specular(v1, v2, v3, alpha)
+ * @param {int | float} v1 red or hue value
+ * @param {int | float} v2 green or saturation value
+ * @param {int | float} v3 blue or brightness value
+ * @param {int | float} alpha opacity
+ *
+ * @returns none
+ *
+ * @see ambient
+ * @see emissive
+ * @see shininess
+ */
+ Drawing2D.prototype.specular = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.specular = function(v1, v2, v3) {
+ curContext.useProgram(programObject3D);
+ uniformi("uUsingMat3d", programObject3D, "uUsingMat", true);
+ var col = p.color(v1, v2, v3);
+ uniformf("uMaterialSpecular3d", programObject3D, "uMaterialSpecular", p.color.toGLArray(col).slice(0, 3));
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Coordinates
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Takes a three-dimensional X, Y, Z position and returns the X value for
+ * where it will appear on a (two-dimensional) screen.
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z optional coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see screenY
+ * @see screenZ
+ */
+ p.screenX = function( x, y, z ) {
+ var mv = modelView.array();
+ if( mv.length === 16 )
+ {
+ var ax = mv[ 0]*x + mv[ 1]*y + mv[ 2]*z + mv[ 3];
+ var ay = mv[ 4]*x + mv[ 5]*y + mv[ 6]*z + mv[ 7];
+ var az = mv[ 8]*x + mv[ 9]*y + mv[10]*z + mv[11];
+ var aw = mv[12]*x + mv[13]*y + mv[14]*z + mv[15];
+
+ var pj = projection.array();
+
+ var ox = pj[ 0]*ax + pj[ 1]*ay + pj[ 2]*az + pj[ 3]*aw;
+ var ow = pj[12]*ax + pj[13]*ay + pj[14]*az + pj[15]*aw;
+
+ if ( ow !== 0 ){
+ ox /= ow;
+ }
+ return p.width * ( 1 + ox ) / 2.0;
+ }
+ // We assume that we're in 2D
+ return modelView.multX(x, y);
+ };
+
+ /**
+ * Takes a three-dimensional X, Y, Z position and returns the Y value for
+ * where it will appear on a (two-dimensional) screen.
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z optional coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see screenX
+ * @see screenZ
+ */
+ p.screenY = function screenY( x, y, z ) {
+ var mv = modelView.array();
+ if( mv.length === 16 ) {
+ var ax = mv[ 0]*x + mv[ 1]*y + mv[ 2]*z + mv[ 3];
+ var ay = mv[ 4]*x + mv[ 5]*y + mv[ 6]*z + mv[ 7];
+ var az = mv[ 8]*x + mv[ 9]*y + mv[10]*z + mv[11];
+ var aw = mv[12]*x + mv[13]*y + mv[14]*z + mv[15];
+
+ var pj = projection.array();
+
+ var oy = pj[ 4]*ax + pj[ 5]*ay + pj[ 6]*az + pj[ 7]*aw;
+ var ow = pj[12]*ax + pj[13]*ay + pj[14]*az + pj[15]*aw;
+
+ if ( ow !== 0 ){
+ oy /= ow;
+ }
+ return p.height * ( 1 + oy ) / 2.0;
+ }
+ // We assume that we're in 2D
+ return modelView.multY(x, y);
+ };
+
+ /**
+ * Takes a three-dimensional X, Y, Z position and returns the Z value for
+ * where it will appear on a (two-dimensional) screen.
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see screenX
+ * @see screenY
+ */
+ p.screenZ = function screenZ( x, y, z ) {
+ var mv = modelView.array();
+ if( mv.length !== 16 ) {
+ return 0;
+ }
+
+ var pj = projection.array();
+
+ var ax = mv[ 0]*x + mv[ 1]*y + mv[ 2]*z + mv[ 3];
+ var ay = mv[ 4]*x + mv[ 5]*y + mv[ 6]*z + mv[ 7];
+ var az = mv[ 8]*x + mv[ 9]*y + mv[10]*z + mv[11];
+ var aw = mv[12]*x + mv[13]*y + mv[14]*z + mv[15];
+
+ var oz = pj[ 8]*ax + pj[ 9]*ay + pj[10]*az + pj[11]*aw;
+ var ow = pj[12]*ax + pj[13]*ay + pj[14]*az + pj[15]*aw;
+
+ if ( ow !== 0 ) {
+ oz /= ow;
+ }
+ return ( oz + 1 ) / 2.0;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Style functions
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * The fill() function sets the color used to fill shapes. For example, if you run <b>fill(204, 102, 0)</b>, all subsequent shapes will be filled with orange.
+ * This color is either specified in terms of the RGB or HSB color depending on the current <b>colorMode()</b>
+ *(the default color space is RGB, with each value in the range from 0 to 255).
+ * <br><br>When using hexadecimal notation to specify a color, use "#" or "0x" before the values (e.g. #CCFFAA, 0xFFCCFFAA).
+ * The # syntax uses six digits to specify a color (the way colors are specified in HTML and CSS). When using the hexadecimal notation starting with "0x",
+ * the hexadecimal value must be specified with eight characters; the first two characters define the alpha component and the remainder the red, green, and blue components.
+ * <br><br>The value for the parameter "gray" must be less than or equal to the current maximum value as specified by <b>colorMode()</b>. The default maximum value is 255.
+ * <br><br>To change the color of an image (or a texture), use tint().
+ *
+ * @param {int|float} gray number specifying value between white and black
+ * @param {int|float} value1 red or hue value
+ * @param {int|float} value2 green or saturation value
+ * @param {int|float} value3 blue or brightness value
+ * @param {int|float} alpha opacity of the fill
+ * @param {Color} color any value of the color datatype
+ * @param {int} hex color value in hexadecimal notation (i.e. #FFCC00 or 0xFFFFCC00)
+ *
+ * @see #noFill()
+ * @see #stroke()
+ * @see #tint()
+ * @see #background()
+ * @see #colorMode()
+ */
+ DrawingShared.prototype.fill = function() {
+ var color = p.color.apply(this, arguments);
+ if(color === currentFillColor && doFill) {
+ return;
+ }
+ doFill = true;
+ currentFillColor = color;
+ };
+
+ Drawing2D.prototype.fill = function() {
+ DrawingShared.prototype.fill.apply(this, arguments);
+ isFillDirty = true;
+ };
+
+ Drawing3D.prototype.fill = function() {
+ DrawingShared.prototype.fill.apply(this, arguments);
+ fillStyle = p.color.toGLArray(currentFillColor);
+ };
+
+ function executeContextFill() {
+ if(doFill) {
+ if(isFillDirty) {
+ curContext.fillStyle = p.color.toString(currentFillColor);
+ isFillDirty = false;
+ }
+ curContext.fill();
+ }
+ }
+
+ /**
+ * The noFill() function disables filling geometry. If both <b>noStroke()</b> and <b>noFill()</b>
+ * are called, no shapes will be drawn to the screen.
+ *
+ * @see #fill()
+ *
+ */
+ p.noFill = function() {
+ doFill = false;
+ };
+
+ /**
+ * The stroke() function sets the color used to draw lines and borders around shapes. This color
+ * is either specified in terms of the RGB or HSB color depending on the
+ * current <b>colorMode()</b> (the default color space is RGB, with each
+ * value in the range from 0 to 255).
+ * <br><br>When using hexadecimal notation to specify a color, use "#" or
+ * "0x" before the values (e.g. #CCFFAA, 0xFFCCFFAA). The # syntax uses six
+ * digits to specify a color (the way colors are specified in HTML and CSS).
+ * When using the hexadecimal notation starting with "0x", the hexadecimal
+ * value must be specified with eight characters; the first two characters
+ * define the alpha component and the remainder the red, green, and blue
+ * components.
+ * <br><br>The value for the parameter "gray" must be less than or equal
+ * to the current maximum value as specified by <b>colorMode()</b>.
+ * The default maximum value is 255.
+ *
+ * @param {int|float} gray number specifying value between white and black
+ * @param {int|float} value1 red or hue value
+ * @param {int|float} value2 green or saturation value
+ * @param {int|float} value3 blue or brightness value
+ * @param {int|float} alpha opacity of the stroke
+ * @param {Color} color any value of the color datatype
+ * @param {int} hex color value in hexadecimal notation (i.e. #FFCC00 or 0xFFFFCC00)
+ *
+ * @see #fill()
+ * @see #noStroke()
+ * @see #tint()
+ * @see #background()
+ * @see #colorMode()
+ */
+ DrawingShared.prototype.stroke = function() {
+ var color = p.color.apply(this, arguments);
+ if(color === currentStrokeColor && doStroke) {
+ return;
+ }
+ doStroke = true;
+ currentStrokeColor = color;
+ };
+
+ Drawing2D.prototype.stroke = function() {
+ DrawingShared.prototype.stroke.apply(this, arguments);
+ isStrokeDirty = true;
+ };
+
+ Drawing3D.prototype.stroke = function() {
+ DrawingShared.prototype.stroke.apply(this, arguments);
+ strokeStyle = p.color.toGLArray(currentStrokeColor);
+ };
+
+ function executeContextStroke() {
+ if(doStroke) {
+ if(isStrokeDirty) {
+ curContext.strokeStyle = p.color.toString(currentStrokeColor);
+ isStrokeDirty = false;
+ }
+ curContext.stroke();
+ }
+ }
+
+ /**
+ * The noStroke() function disables drawing the stroke (outline). If both <b>noStroke()</b> and
+ * <b>noFill()</b> are called, no shapes will be drawn to the screen.
+ *
+ * @see #stroke()
+ */
+ p.noStroke = function() {
+ doStroke = false;
+ };
+
+ /**
+ * The strokeWeight() function sets the width of the stroke used for lines, points, and the border around shapes.
+ * All widths are set in units of pixels.
+ *
+ * @param {int|float} w the weight (in pixels) of the stroke
+ */
+ DrawingShared.prototype.strokeWeight = function(w) {
+ lineWidth = w;
+ };
+
+ Drawing2D.prototype.strokeWeight = function(w) {
+ DrawingShared.prototype.strokeWeight.apply(this, arguments);
+ curContext.lineWidth = w;
+ };
+
+ Drawing3D.prototype.strokeWeight = function(w) {
+ DrawingShared.prototype.strokeWeight.apply(this, arguments);
+
+ // Processing groups the weight of points and lines under this one function,
+ // but for WebGL, we need to set a uniform for points and call a function for line.
+
+ curContext.useProgram(programObject2D);
+ uniformf("pointSize2d", programObject2D, "uPointSize", w);
+
+ curContext.useProgram(programObjectUnlitShape);
+ uniformf("pointSizeUnlitShape", programObjectUnlitShape, "uPointSize", w);
+
+ curContext.lineWidth(w);
+ };
+
+ /**
+ * The strokeCap() function sets the style for rendering line endings. These ends are either squared, extended, or rounded and
+ * specified with the corresponding parameters SQUARE, PROJECT, and ROUND. The default cap is ROUND.
+ * This function is not available with the P2D, P3D, or OPENGL renderers
+ *
+ * @param {int} value Either SQUARE, PROJECT, or ROUND
+ */
+ p.strokeCap = function(value) {
+ drawing.$ensureContext().lineCap = value;
+ };
+
+ /**
+ * The strokeJoin() function sets the style of the joints which connect line segments.
+ * These joints are either mitered, beveled, or rounded and specified with the corresponding parameters MITER, BEVEL, and ROUND. The default joint is MITER.
+ * This function is not available with the P2D, P3D, or OPENGL renderers
+ *
+ * @param {int} value Either SQUARE, PROJECT, or ROUND
+ */
+ p.strokeJoin = function(value) {
+ drawing.$ensureContext().lineJoin = value;
+ };
+
+ /**
+ * The smooth() function draws all geometry with smooth (anti-aliased) edges. This will slow down the frame rate of the application,
+ * but will enhance the visual refinement. <br/><br/>
+ * Note that smooth() will also improve image quality of resized images, and noSmooth() will disable image (and font) smoothing altogether.
+ * When working with a 3D sketch, smooth will draw points as circles rather than squares.
+ *
+ * @see #noSmooth()
+ * @see #hint()
+ * @see #size()
+ */
+
+ Drawing2D.prototype.smooth = function() {
+ renderSmooth = true;
+ var style = curElement.style;
+ style.setProperty("image-rendering", "optimizeQuality", "important");
+ style.setProperty("-ms-interpolation-mode", "bicubic", "important");
+ if (curContext.hasOwnProperty("mozImageSmoothingEnabled")) {
+ curContext.mozImageSmoothingEnabled = true;
+ }
+ };
+
+ Drawing3D.prototype.smooth = function(){
+ renderSmooth = true;
+ };
+
+ /**
+ * The noSmooth() function draws all geometry with jagged (aliased) edges.
+ *
+ * @see #smooth()
+ */
+
+ Drawing2D.prototype.noSmooth = function() {
+ renderSmooth = false;
+ var style = curElement.style;
+ style.setProperty("image-rendering", "optimizeSpeed", "important");
+ style.setProperty("image-rendering", "-moz-crisp-edges", "important");
+ style.setProperty("image-rendering", "-webkit-optimize-contrast", "important");
+ style.setProperty("image-rendering", "optimize-contrast", "important");
+ style.setProperty("-ms-interpolation-mode", "nearest-neighbor", "important");
+ if (curContext.hasOwnProperty("mozImageSmoothingEnabled")) {
+ curContext.mozImageSmoothingEnabled = false;
+ }
+ };
+
+ Drawing3D.prototype.noSmooth = function(){
+ renderSmooth = false;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Vector drawing functions
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * The point() function draws a point, a coordinate in space at the dimension of one pixel.
+ * The first parameter is the horizontal value for the point, the second
+ * value is the vertical value for the point, and the optional third value
+ * is the depth value. Drawing this shape in 3D using the <b>z</b>
+ * parameter requires the P3D or OPENGL parameter in combination with
+ * size as shown in the above example.
+ *
+ * @param {int|float} x x-coordinate of the point
+ * @param {int|float} y y-coordinate of the point
+ * @param {int|float} z z-coordinate of the point
+ *
+ * @see #beginShape()
+ */
+ Drawing2D.prototype.point = function(x, y) {
+ if (!doStroke) {
+ return;
+ }
+ if (!renderSmooth) {
+ x = Math.round(x);
+ y = Math.round(y);
+ }
+ curContext.fillStyle = p.color.toString(currentStrokeColor);
+ isFillDirty = true;
+ // Draw a circle for any point larger than 1px
+ if (lineWidth > 1) {
+ curContext.beginPath();
+ curContext.arc(x, y, lineWidth / 2, 0, PConstants.TWO_PI, false);
+ curContext.fill();
+ } else {
+ curContext.fillRect(x, y, 1, 1);
+ }
+ };
+
+ Drawing3D.prototype.point = function(x, y, z) {
+ var model = new PMatrix3D();
+
+ // move point to position
+ model.translate(x, y, z || 0);
+ model.transpose();
+
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ curContext.useProgram(programObject2D);
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, model.array());
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+
+ if (lineWidth > 0 && doStroke) {
+ // this will be replaced with the new bit shifting color code
+ uniformf("uColor2d", programObject2D, "uColor", strokeStyle);
+ uniformi("uIsDrawingText2d", programObject2D, "uIsDrawingText", false);
+ uniformi("uSmooth2d", programObject2D, "uSmooth", renderSmooth);
+ vertexAttribPointer("aVertex2d", programObject2D, "aVertex", 3, pointBuffer);
+ disableVertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord");
+ curContext.drawArrays(curContext.POINTS, 0, 1);
+ }
+ };
+
+ /**
+ * Using the <b>beginShape()</b> and <b>endShape()</b> functions allow creating more complex forms.
+ * <b>beginShape()</b> begins recording vertices for a shape and <b>endShape()</b> stops recording.
+ * The value of the <b>MODE</b> parameter tells it which types of shapes to create from the provided vertices.
+ * With no mode specified, the shape can be any irregular polygon. After calling the <b>beginShape()</b> function,
+ * a series of <b>vertex()</b> commands must follow. To stop drawing the shape, call <b>endShape()</b>.
+ * The <b>vertex()</b> function with two parameters specifies a position in 2D and the <b>vertex()</b>
+ * function with three parameters specifies a position in 3D. Each shape will be outlined with the current
+ * stroke color and filled with the fill color.
+ *
+ * @param {int} MODE either POINTS, LINES, TRIANGLES, TRIANGLE_FAN, TRIANGLE_STRIP, QUADS, and QUAD_STRIP.
+ *
+ * @see endShape
+ * @see vertex
+ * @see curveVertex
+ * @see bezierVertex
+ */
+ p.beginShape = function(type) {
+ curShape = type;
+ curvePoints = [];
+ vertArray = [];
+ };
+
+ /**
+ * All shapes are constructed by connecting a series of vertices. <b>vertex()</b> is used to specify the vertex
+ * coordinates for points, lines, triangles, quads, and polygons and is used exclusively within the <b>beginShape()</b>
+ * and <b>endShape()</b> function. <br /><br />Drawing a vertex in 3D using the <b>z</b> parameter requires the P3D or
+ * OPENGL parameter in combination with size as shown in the above example.<br /><br />This function is also used to map a
+ * texture onto the geometry. The <b>texture()</b> function declares the texture to apply to the geometry and the <b>u</b>
+ * and <b>v</b> coordinates set define the mapping of this texture to the form. By default, the coordinates used for
+ * <b>u</b> and <b>v</b> are specified in relation to the image's size in pixels, but this relation can be changed with
+ * <b>textureMode()</b>.
+ *
+ * @param {int | float} x x-coordinate of the vertex
+ * @param {int | float} y y-coordinate of the vertex
+ * @param {boolean} moveto flag to indicate whether this is a new subpath
+ *
+ * @see beginShape
+ * @see endShape
+ * @see bezierVertex
+ * @see curveVertex
+ * @see texture
+ */
+
+ Drawing2D.prototype.vertex = function(x, y, moveTo) {
+ var vert = [];
+
+ if (firstVert) { firstVert = false; }
+ vert.isVert = true;
+
+ vert[0] = x;
+ vert[1] = y;
+ vert[2] = 0;
+ vert[3] = 0;
+ vert[4] = 0;
+
+ // fill and stroke color
+ vert[5] = currentFillColor;
+ vert[6] = currentStrokeColor;
+
+ vertArray.push(vert);
+ if (moveTo) {
+ vertArray[vertArray.length-1].moveTo = moveTo;
+ }
+ };
+
+ Drawing3D.prototype.vertex = function(x, y, z, u, v) {
+ var vert = [];
+
+ if (firstVert) { firstVert = false; }
+ vert.isVert = true;
+
+ if (v === undef && usingTexture) {
+ v = u;
+ u = z;
+ z = 0;
+ }
+
+ // Convert u and v to normalized coordinates
+ if (u !== undef && v !== undef) {
+ if (curTextureMode === PConstants.IMAGE) {
+ u /= curTexture.width;
+ v /= curTexture.height;
+ }
+ u = u > 1 ? 1 : u;
+ u = u < 0 ? 0 : u;
+ v = v > 1 ? 1 : v;
+ v = v < 0 ? 0 : v;
+ }
+
+ vert[0] = x;
+ vert[1] = y;
+ vert[2] = z || 0;
+ vert[3] = u || 0;
+ vert[4] = v || 0;
+
+ // fill rgba
+ vert[5] = fillStyle[0];
+ vert[6] = fillStyle[1];
+ vert[7] = fillStyle[2];
+ vert[8] = fillStyle[3];
+ // stroke rgba
+ vert[9] = strokeStyle[0];
+ vert[10] = strokeStyle[1];
+ vert[11] = strokeStyle[2];
+ vert[12] = strokeStyle[3];
+ //normals
+ vert[13] = normalX;
+ vert[14] = normalY;
+ vert[15] = normalZ;
+
+ vertArray.push(vert);
+ };
+
+ /**
+ * @private
+ * Renders 3D points created from calls to vertex and beginShape/endShape
+ *
+ * @param {Array} vArray an array of vertex coordinate
+ * @param {Array} cArray an array of colours used for the vertices
+ *
+ * @see beginShape
+ * @see endShape
+ * @see vertex
+ */
+ var point3D = function(vArray, cArray){
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ curContext.useProgram(programObjectUnlitShape);
+
+ uniformMatrix("uViewUS", programObjectUnlitShape, "uView", false, view.array());
+ uniformi("uSmoothUS", programObjectUnlitShape, "uSmooth", renderSmooth);
+
+ vertexAttribPointer("aVertexUS", programObjectUnlitShape, "aVertex", 3, pointBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(vArray), curContext.STREAM_DRAW);
+
+ vertexAttribPointer("aColorUS", programObjectUnlitShape, "aColor", 4, fillColorBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(cArray), curContext.STREAM_DRAW);
+
+ curContext.drawArrays(curContext.POINTS, 0, vArray.length/3);
+ };
+
+ /**
+ * @private
+ * Renders 3D lines created from calls to beginShape/vertex/endShape - based on the mode specified LINES, LINE_LOOP, etc.
+ *
+ * @param {Array} vArray an array of vertex coordinate
+ * @param {String} mode either LINES, LINE_LOOP, or LINE_STRIP
+ * @param {Array} cArray an array of colours used for the vertices
+ *
+ * @see beginShape
+ * @see endShape
+ * @see vertex
+ */
+ var line3D = function(vArray, mode, cArray){
+ var ctxMode;
+ if (mode === "LINES"){
+ ctxMode = curContext.LINES;
+ }
+ else if(mode === "LINE_LOOP"){
+ ctxMode = curContext.LINE_LOOP;
+ }
+ else{
+ ctxMode = curContext.LINE_STRIP;
+ }
+
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ curContext.useProgram(programObjectUnlitShape);
+ uniformMatrix("uViewUS", programObjectUnlitShape, "uView", false, view.array());
+ vertexAttribPointer("aVertexUS", programObjectUnlitShape, "aVertex", 3, lineBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(vArray), curContext.STREAM_DRAW);
+ vertexAttribPointer("aColorUS", programObjectUnlitShape, "aColor", 4, strokeColorBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(cArray), curContext.STREAM_DRAW);
+ curContext.drawArrays(ctxMode, 0, vArray.length/3);
+ };
+
+ /**
+ * @private
+ * Render filled shapes created from calls to beginShape/vertex/endShape - based on the mode specified TRIANGLES, etc.
+ *
+ * @param {Array} vArray an array of vertex coordinate
+ * @param {String} mode either LINES, LINE_LOOP, or LINE_STRIP
+ * @param {Array} cArray an array of colours used for the vertices
+ * @param {Array} tArray an array of u,v coordinates for textures
+ *
+ * @see beginShape
+ * @see endShape
+ * @see vertex
+ */
+ var fill3D = function(vArray, mode, cArray, tArray){
+ var ctxMode;
+ if (mode === "TRIANGLES") {
+ ctxMode = curContext.TRIANGLES;
+ } else if(mode === "TRIANGLE_FAN") {
+ ctxMode = curContext.TRIANGLE_FAN;
+ } else {
+ ctxMode = curContext.TRIANGLE_STRIP;
+ }
+
+ var view = new PMatrix3D();
+ view.scale( 1, -1, 1 );
+ view.apply( modelView.array() );
+ view.transpose();
+
+ curContext.useProgram( programObject3D );
+ uniformMatrix( "model3d", programObject3D, "uModel", false, [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1] );
+ uniformMatrix( "view3d", programObject3D, "uView", false, view.array() );
+ curContext.enable( curContext.POLYGON_OFFSET_FILL );
+ curContext.polygonOffset( 1, 1 );
+ uniformf( "color3d", programObject3D, "uColor", [-1,0,0,0] );
+ vertexAttribPointer( "vertex3d", programObject3D, "aVertex", 3, fillBuffer );
+ curContext.bufferData( curContext.ARRAY_BUFFER, new Float32Array(vArray), curContext.STREAM_DRAW );
+
+ // if we are using a texture and a tint, then overwrite the
+ // contents of the color buffer with the current tint
+ if ( usingTexture && curTint !== null ){
+ curTint3d( cArray );
+ }
+
+ vertexAttribPointer( "aColor3d", programObject3D, "aColor", 4, fillColorBuffer );
+ curContext.bufferData( curContext.ARRAY_BUFFER, new Float32Array(cArray), curContext.STREAM_DRAW );
+
+ // No support for lights....yet
+ disableVertexAttribPointer( "aNormal3d", programObject3D, "aNormal" );
+
+ if ( usingTexture ) {
+ uniformi( "uUsingTexture3d", programObject3D, "uUsingTexture", usingTexture );
+ vertexAttribPointer( "aTexture3d", programObject3D, "aTexture", 2, shapeTexVBO );
+ curContext.bufferData( curContext.ARRAY_BUFFER, new Float32Array(tArray), curContext.STREAM_DRAW );
+ }
+
+ curContext.drawArrays( ctxMode, 0, vArray.length/3 );
+ curContext.disable( curContext.POLYGON_OFFSET_FILL );
+ };
+
+ /**
+ * this series of three operations is used a lot in Drawing2D.prototype.endShape
+ * and has been split off as its own function, to tighten the code and allow for
+ * fewer bugs.
+ */
+ function fillStrokeClose() {
+ executeContextFill();
+ executeContextStroke();
+ curContext.closePath();
+ }
+
+ /**
+ * The endShape() function is the companion to beginShape() and may only be called after beginShape().
+ * When endshape() is called, all of image data defined since the previous call to beginShape() is written
+ * into the image buffer.
+ *
+ * @param {int} MODE Use CLOSE to close the shape
+ *
+ * @see beginShape
+ */
+ Drawing2D.prototype.endShape = function(mode) {
+ // Duplicated in Drawing3D; too many variables used
+ if (vertArray.length === 0) { return; }
+
+ var closeShape = mode === PConstants.CLOSE;
+
+ // if the shape is closed, the first element is also the last element
+ if (closeShape) {
+ vertArray.push(vertArray[0]);
+ }
+
+ var lineVertArray = [];
+ var fillVertArray = [];
+ var colorVertArray = [];
+ var strokeVertArray = [];
+ var texVertArray = [];
+ var cachedVertArray;
+
+ firstVert = true;
+ var i, j, k;
+ var vertArrayLength = vertArray.length;
+
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // 5,6,7,8
+ // R,G,B,A - fill colour
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // 9,10,11,12
+ // R, G, B, A - stroke colour
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // texture u,v
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ texVertArray.push(cachedVertArray[3]);
+ texVertArray.push(cachedVertArray[4]);
+ }
+
+ // curveVertex
+ if ( isCurve && (curShape === PConstants.POLYGON || curShape === undef) ) {
+ if (vertArrayLength > 3) {
+ var b = [],
+ s = 1 - curTightness;
+ curContext.beginPath();
+ curContext.moveTo(vertArray[1][0], vertArray[1][1]);
+ /*
+ * Matrix to convert from Catmull-Rom to cubic Bezier
+ * where t = curTightness
+ * |0 1 0 0 |
+ * |(t-1)/6 1 (1-t)/6 0 |
+ * |0 (1-t)/6 1 (t-1)/6 |
+ * |0 0 0 0 |
+ */
+ for (i = 1; (i+2) < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ b[0] = [cachedVertArray[0], cachedVertArray[1]];
+ b[1] = [cachedVertArray[0] + (s * vertArray[i+1][0] - s * vertArray[i-1][0]) / 6,
+ cachedVertArray[1] + (s * vertArray[i+1][1] - s * vertArray[i-1][1]) / 6];
+ b[2] = [vertArray[i+1][0] + (s * vertArray[i][0] - s * vertArray[i+2][0]) / 6,
+ vertArray[i+1][1] + (s * vertArray[i][1] - s * vertArray[i+2][1]) / 6];
+ b[3] = [vertArray[i+1][0], vertArray[i+1][1]];
+ curContext.bezierCurveTo(b[1][0], b[1][1], b[2][0], b[2][1], b[3][0], b[3][1]);
+ }
+ fillStrokeClose();
+ }
+ }
+
+ // bezierVertex
+ else if ( isBezier && (curShape === PConstants.POLYGON || curShape === undef) ) {
+ curContext.beginPath();
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ if (vertArray[i].isVert) { //if it is a vertex move to the position
+ if (vertArray[i].moveTo) {
+ curContext.moveTo(cachedVertArray[0], cachedVertArray[1]);
+ } else {
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+ }
+ } else { //otherwise continue drawing bezier
+ curContext.bezierCurveTo(vertArray[i][0], vertArray[i][1], vertArray[i][2], vertArray[i][3], vertArray[i][4], vertArray[i][5]);
+ }
+ }
+ fillStrokeClose();
+ }
+
+ // render the vertices provided
+ else {
+ if (curShape === PConstants.POINTS) {
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ if (doStroke) {
+ p.stroke(cachedVertArray[6]);
+ }
+ p.point(cachedVertArray[0], cachedVertArray[1]);
+ }
+ } else if (curShape === PConstants.LINES) {
+ for (i = 0; (i + 1) < vertArrayLength; i+=2) {
+ cachedVertArray = vertArray[i];
+ if (doStroke) {
+ p.stroke(vertArray[i+1][6]);
+ }
+ p.line(cachedVertArray[0], cachedVertArray[1], vertArray[i+1][0], vertArray[i+1][1]);
+ }
+ } else if (curShape === PConstants.TRIANGLES) {
+ for (i = 0; (i + 2) < vertArrayLength; i+=3) {
+ cachedVertArray = vertArray[i];
+ curContext.beginPath();
+ curContext.moveTo(cachedVertArray[0], cachedVertArray[1]);
+ curContext.lineTo(vertArray[i+1][0], vertArray[i+1][1]);
+ curContext.lineTo(vertArray[i+2][0], vertArray[i+2][1]);
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+
+ if (doFill) {
+ p.fill(vertArray[i+2][5]);
+ executeContextFill();
+ }
+ if (doStroke) {
+ p.stroke(vertArray[i+2][6]);
+ executeContextStroke();
+ }
+
+ curContext.closePath();
+ }
+ } else if (curShape === PConstants.TRIANGLE_STRIP) {
+ for (i = 0; (i+1) < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ curContext.beginPath();
+ curContext.moveTo(vertArray[i+1][0], vertArray[i+1][1]);
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+
+ if (doStroke) {
+ p.stroke(vertArray[i+1][6]);
+ }
+ if (doFill) {
+ p.fill(vertArray[i+1][5]);
+ }
+
+ if (i + 2 < vertArrayLength) {
+ curContext.lineTo(vertArray[i+2][0], vertArray[i+2][1]);
+ if (doStroke) {
+ p.stroke(vertArray[i+2][6]);
+ }
+ if (doFill) {
+ p.fill(vertArray[i+2][5]);
+ }
+ }
+ fillStrokeClose();
+ }
+ } else if (curShape === PConstants.TRIANGLE_FAN) {
+ if (vertArrayLength > 2) {
+ curContext.beginPath();
+ curContext.moveTo(vertArray[0][0], vertArray[0][1]);
+ curContext.lineTo(vertArray[1][0], vertArray[1][1]);
+ curContext.lineTo(vertArray[2][0], vertArray[2][1]);
+
+ if (doFill) {
+ p.fill(vertArray[2][5]);
+ executeContextFill();
+ }
+ if (doStroke) {
+ p.stroke(vertArray[2][6]);
+ executeContextStroke();
+ }
+
+ curContext.closePath();
+ for (i = 3; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ curContext.beginPath();
+ curContext.moveTo(vertArray[0][0], vertArray[0][1]);
+ curContext.lineTo(vertArray[i-1][0], vertArray[i-1][1]);
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+
+ if (doFill) {
+ p.fill(cachedVertArray[5]);
+ executeContextFill();
+ }
+ if (doStroke) {
+ p.stroke(cachedVertArray[6]);
+ executeContextStroke();
+ }
+
+ curContext.closePath();
+ }
+ }
+ } else if (curShape === PConstants.QUADS) {
+ for (i = 0; (i + 3) < vertArrayLength; i+=4) {
+ cachedVertArray = vertArray[i];
+ curContext.beginPath();
+ curContext.moveTo(cachedVertArray[0], cachedVertArray[1]);
+ for (j = 1; j < 4; j++) {
+ curContext.lineTo(vertArray[i+j][0], vertArray[i+j][1]);
+ }
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+
+ if (doFill) {
+ p.fill(vertArray[i+3][5]);
+ executeContextFill();
+ }
+ if (doStroke) {
+ p.stroke(vertArray[i+3][6]);
+ executeContextStroke();
+ }
+
+ curContext.closePath();
+ }
+ } else if (curShape === PConstants.QUAD_STRIP) {
+ if (vertArrayLength > 3) {
+ for (i = 0; (i+1) < vertArrayLength; i+=2) {
+ cachedVertArray = vertArray[i];
+ curContext.beginPath();
+ if (i+3 < vertArrayLength) {
+ curContext.moveTo(vertArray[i+2][0], vertArray[i+2][1]);
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+ curContext.lineTo(vertArray[i+1][0], vertArray[i+1][1]);
+ curContext.lineTo(vertArray[i+3][0], vertArray[i+3][1]);
+
+ if (doFill) {
+ p.fill(vertArray[i+3][5]);
+ }
+ if (doStroke) {
+ p.stroke(vertArray[i+3][6]);
+ }
+ } else {
+ curContext.moveTo(cachedVertArray[0], cachedVertArray[1]);
+ curContext.lineTo(vertArray[i+1][0], vertArray[i+1][1]);
+ }
+ fillStrokeClose();
+ }
+ }
+ } else {
+ curContext.beginPath();
+ curContext.moveTo(vertArray[0][0], vertArray[0][1]);
+ for (i = 1; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ if (cachedVertArray.isVert) { //if it is a vertex move to the position
+ if (cachedVertArray.moveTo) {
+ curContext.moveTo(cachedVertArray[0], cachedVertArray[1]);
+ } else {
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+ }
+ }
+ }
+ fillStrokeClose();
+ }
+ }
+
+ // Reset some settings
+ isCurve = false;
+ isBezier = false;
+ curveVertArray = [];
+ curveVertCount = 0;
+
+ // If the shape is closed, the first element was added as last element.
+ // We must remove it again to prevent the list of vertices from growing
+ // over successive calls to endShape(CLOSE)
+ if (closeShape) {
+ vertArray.pop();
+ }
+ };
+
+ Drawing3D.prototype.endShape = function(mode) {
+ // Duplicated in Drawing3D; too many variables used
+ if (vertArray.length === 0) { return; }
+
+ var closeShape = mode === PConstants.CLOSE;
+ var lineVertArray = [];
+ var fillVertArray = [];
+ var colorVertArray = [];
+ var strokeVertArray = [];
+ var texVertArray = [];
+ var cachedVertArray;
+
+ firstVert = true;
+ var i, j, k;
+ var vertArrayLength = vertArray.length;
+
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // 5,6,7,8
+ // R,G,B,A - fill colour
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // 9,10,11,12
+ // R, G, B, A - stroke colour
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // texture u,v
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ texVertArray.push(cachedVertArray[3]);
+ texVertArray.push(cachedVertArray[4]);
+ }
+
+ // if shape is closed, push the first point into the last point (including colours)
+ if (closeShape) {
+ fillVertArray.push(vertArray[0][0]);
+ fillVertArray.push(vertArray[0][1]);
+ fillVertArray.push(vertArray[0][2]);
+
+ for (i = 5; i < 9; i++) {
+ colorVertArray.push(vertArray[0][i]);
+ }
+
+ for (i = 9; i < 13; i++) {
+ strokeVertArray.push(vertArray[0][i]);
+ }
+
+ texVertArray.push(vertArray[0][3]);
+ texVertArray.push(vertArray[0][4]);
+ }
+ // End duplication
+
+ // curveVertex
+ if ( isCurve && (curShape === PConstants.POLYGON || curShape === undef) ) {
+ lineVertArray = fillVertArray;
+ if (doStroke) {
+ line3D(lineVertArray, null, strokeVertArray);
+ }
+ if (doFill) {
+ fill3D(fillVertArray, null, colorVertArray);
+ }
+ }
+ // bezierVertex
+ else if ( isBezier && (curShape === PConstants.POLYGON || curShape === undef) ) {
+ lineVertArray = fillVertArray;
+ lineVertArray.splice(lineVertArray.length - 3);
+ strokeVertArray.splice(strokeVertArray.length - 4);
+ if (doStroke) {
+ line3D(lineVertArray, null, strokeVertArray);
+ }
+ if (doFill) {
+ fill3D(fillVertArray, "TRIANGLES", colorVertArray);
+ }
+ }
+
+ // render the vertices provided
+ else {
+ if (curShape === PConstants.POINTS) { // if POINTS was the specified parameter in beginShape
+ for (i = 0; i < vertArrayLength; i++) { // loop through and push the point location information to the array
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(cachedVertArray[j]);
+ }
+ }
+ point3D(lineVertArray, strokeVertArray); // render function for points
+ } else if (curShape === PConstants.LINES) { // if LINES was the specified parameter in beginShape
+ for (i = 0; i < vertArrayLength; i++) { // loop through and push the point location information to the array
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(cachedVertArray[j]);
+ }
+ }
+ for (i = 0; i < vertArrayLength; i++) { // loop through and push the color information to the array
+ cachedVertArray = vertArray[i];
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(cachedVertArray[j]);
+ }
+ }
+ line3D(lineVertArray, "LINES", strokeVertArray); // render function for lines
+ } else if (curShape === PConstants.TRIANGLES) { // if TRIANGLES was the specified parameter in beginShape
+ if (vertArrayLength > 2) {
+ for (i = 0; (i+2) < vertArrayLength; i+=3) { // loop through the array per triangle
+ fillVertArray = [];
+ texVertArray = [];
+ lineVertArray = [];
+ colorVertArray = [];
+ strokeVertArray = [];
+ for (j = 0; j < 3; j++) {
+ for (k = 0; k < 3; k++) { // loop through and push
+ lineVertArray.push(vertArray[i+j][k]); // the line point location information
+ fillVertArray.push(vertArray[i+j][k]); // and fill point location information
+ }
+ }
+ for (j = 0; j < 3; j++) { // loop through and push the texture information
+ for (k = 3; k < 5; k++) {
+ texVertArray.push(vertArray[i+j][k]);
+ }
+ }
+ for (j = 0; j < 3; j++) {
+ for (k = 5; k < 9; k++) { // loop through and push
+ colorVertArray.push(vertArray[i+j][k]); // the colour information
+ strokeVertArray.push(vertArray[i+j][k+4]);// and the stroke information
+ }
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_LOOP", strokeVertArray ); // line render function
+ }
+ if (doFill || usingTexture) {
+ fill3D(fillVertArray, "TRIANGLES", colorVertArray, texVertArray); // fill shape render function
+ }
+ }
+ }
+ } else if (curShape === PConstants.TRIANGLE_STRIP) { // if TRIANGLE_STRIP was the specified parameter in beginShape
+ if (vertArrayLength > 2) {
+ for (i = 0; (i+2) < vertArrayLength; i++) {
+ lineVertArray = [];
+ fillVertArray = [];
+ strokeVertArray = [];
+ colorVertArray = [];
+ texVertArray = [];
+ for (j = 0; j < 3; j++) {
+ for (k = 0; k < 3; k++) {
+ lineVertArray.push(vertArray[i+j][k]);
+ fillVertArray.push(vertArray[i+j][k]);
+ }
+ }
+ for (j = 0; j < 3; j++) {
+ for (k = 3; k < 5; k++) {
+ texVertArray.push(vertArray[i+j][k]);
+ }
+ }
+ for (j = 0; j < 3; j++) {
+ for (k = 5; k < 9; k++) {
+ strokeVertArray.push(vertArray[i+j][k+4]);
+ colorVertArray.push(vertArray[i+j][k]);
+ }
+ }
+
+ if (doFill || usingTexture) {
+ fill3D(fillVertArray, "TRIANGLE_STRIP", colorVertArray, texVertArray);
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_LOOP", strokeVertArray);
+ }
+ }
+ }
+ } else if (curShape === PConstants.TRIANGLE_FAN) {
+ if (vertArrayLength > 2) {
+ for (i = 0; i < 3; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(cachedVertArray[j]);
+ }
+ }
+ for (i = 0; i < 3; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(cachedVertArray[j]);
+ }
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_LOOP", strokeVertArray);
+ }
+
+ for (i = 2; (i+1) < vertArrayLength; i++) {
+ lineVertArray = [];
+ strokeVertArray = [];
+ lineVertArray.push(vertArray[0][0]);
+ lineVertArray.push(vertArray[0][1]);
+ lineVertArray.push(vertArray[0][2]);
+
+ strokeVertArray.push(vertArray[0][9]);
+ strokeVertArray.push(vertArray[0][10]);
+ strokeVertArray.push(vertArray[0][11]);
+ strokeVertArray.push(vertArray[0][12]);
+
+ for (j = 0; j < 2; j++) {
+ for (k = 0; k < 3; k++) {
+ lineVertArray.push(vertArray[i+j][k]);
+ }
+ }
+ for (j = 0; j < 2; j++) {
+ for (k = 9; k < 13; k++) {
+ strokeVertArray.push(vertArray[i+j][k]);
+ }
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_STRIP",strokeVertArray);
+ }
+ }
+ if (doFill || usingTexture) {
+ fill3D(fillVertArray, "TRIANGLE_FAN", colorVertArray, texVertArray);
+ }
+ }
+ } else if (curShape === PConstants.QUADS) {
+ for (i = 0; (i + 3) < vertArrayLength; i+=4) {
+ lineVertArray = [];
+ for (j = 0; j < 4; j++) {
+ cachedVertArray = vertArray[i+j];
+ for (k = 0; k < 3; k++) {
+ lineVertArray.push(cachedVertArray[k]);
+ }
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_LOOP",strokeVertArray);
+ }
+
+ if (doFill) {
+ fillVertArray = [];
+ colorVertArray = [];
+ texVertArray = [];
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(vertArray[i][j]);
+ }
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(vertArray[i][j]);
+ }
+
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(vertArray[i+1][j]);
+ }
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(vertArray[i+1][j]);
+ }
+
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(vertArray[i+3][j]);
+ }
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(vertArray[i+3][j]);
+ }
+
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(vertArray[i+2][j]);
+ }
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(vertArray[i+2][j]);
+ }
+
+ if (usingTexture) {
+ texVertArray.push(vertArray[i+0][3]);
+ texVertArray.push(vertArray[i+0][4]);
+ texVertArray.push(vertArray[i+1][3]);
+ texVertArray.push(vertArray[i+1][4]);
+ texVertArray.push(vertArray[i+3][3]);
+ texVertArray.push(vertArray[i+3][4]);
+ texVertArray.push(vertArray[i+2][3]);
+ texVertArray.push(vertArray[i+2][4]);
+ }
+
+ fill3D(fillVertArray, "TRIANGLE_STRIP", colorVertArray, texVertArray);
+ }
+ }
+ } else if (curShape === PConstants.QUAD_STRIP) {
+ var tempArray = [];
+ if (vertArrayLength > 3) {
+ for (i = 0; i < 2; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ for (i = 0; i < 2; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ line3D(lineVertArray, "LINE_STRIP", strokeVertArray);
+ if (vertArrayLength > 4 && vertArrayLength % 2 > 0) {
+ tempArray = fillVertArray.splice(fillVertArray.length - 3);
+ vertArray.pop();
+ }
+ for (i = 0; (i+3) < vertArrayLength; i+=2) {
+ lineVertArray = [];
+ strokeVertArray = [];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(vertArray[i+1][j]);
+ }
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(vertArray[i+3][j]);
+ }
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(vertArray[i+2][j]);
+ }
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(vertArray[i+0][j]);
+ }
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(vertArray[i+1][j]);
+ }
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(vertArray[i+3][j]);
+ }
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(vertArray[i+2][j]);
+ }
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(vertArray[i+0][j]);
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_STRIP", strokeVertArray);
+ }
+ }
+
+ if (doFill || usingTexture) {
+ fill3D(fillVertArray, "TRIANGLE_LIST", colorVertArray, texVertArray);
+ }
+ }
+ }
+ // If the user didn't specify a type (LINES, TRIANGLES, etc)
+ else {
+ // If only one vertex was specified, it must be a point
+ if (vertArrayLength === 1) {
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(vertArray[0][j]);
+ }
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(vertArray[0][j]);
+ }
+ point3D(lineVertArray,strokeVertArray);
+ } else {
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(cachedVertArray[j]);
+ }
+ for (j = 5; j < 9; j++) {
+ strokeVertArray.push(cachedVertArray[j]);
+ }
+ }
+ if (doStroke && closeShape) {
+ line3D(lineVertArray, "LINE_LOOP", strokeVertArray);
+ } else if (doStroke && !closeShape) {
+ line3D(lineVertArray, "LINE_STRIP", strokeVertArray);
+ }
+
+ // fill is ignored if textures are used
+ if (doFill || usingTexture) {
+ fill3D(fillVertArray, "TRIANGLE_FAN", colorVertArray, texVertArray);
+ }
+ }
+ }
+ // everytime beginShape is followed by a call to
+ // texture(), texturing it turned back on. We do this to
+ // figure out if the shape should be textured or filled
+ // with a color.
+ usingTexture = false;
+ curContext.useProgram(programObject3D);
+ uniformi("usingTexture3d", programObject3D, "uUsingTexture", usingTexture);
+ }
+
+ // Reset some settings
+ isCurve = false;
+ isBezier = false;
+ curveVertArray = [];
+ curveVertCount = 0;
+ };
+
+ /**
+ * The function splineForward() setup forward-differencing matrix to be used for speedy
+ * curve rendering. It's based on using a specific number
+ * of curve segments and just doing incremental adds for each
+ * vertex of the segment, rather than running the mathematically
+ * expensive cubic equation. This function is used by both curveDetail and bezierDetail.
+ *
+ * @param {int} segments number of curve segments to use when drawing
+ * @param {PMatrix3D} matrix target object for the new matrix
+ */
+ var splineForward = function(segments, matrix) {
+ var f = 1.0 / segments;
+ var ff = f * f;
+ var fff = ff * f;
+
+ matrix.set(0, 0, 0, 1, fff, ff, f, 0, 6 * fff, 2 * ff, 0, 0, 6 * fff, 0, 0, 0);
+ };
+
+ /**
+ * The curveInit() function set the number of segments to use when drawing a Catmull-Rom
+ * curve, and setting the s parameter, which defines how tightly
+ * the curve fits to each vertex. Catmull-Rom curves are actually
+ * a subset of this curve type where the s is set to zero.
+ * This in an internal function used by curveDetail() and curveTightness().
+ */
+ var curveInit = function() {
+ // allocate only if/when used to save startup time
+ if (!curveDrawMatrix) {
+ curveBasisMatrix = new PMatrix3D();
+ curveDrawMatrix = new PMatrix3D();
+ curveInited = true;
+ }
+
+ var s = curTightness;
+ curveBasisMatrix.set((s - 1) / 2, (s + 3) / 2, (-3 - s) / 2, (1 - s) / 2,
+ (1 - s), (-5 - s) / 2, (s + 2), (s - 1) / 2,
+ (s - 1) / 2, 0, (1 - s) / 2, 0, 0, 1, 0, 0);
+
+ splineForward(curveDet, curveDrawMatrix);
+
+ if (!bezierBasisInverse) {
+ //bezierBasisInverse = bezierBasisMatrix.get();
+ //bezierBasisInverse.invert();
+ curveToBezierMatrix = new PMatrix3D();
+ }
+
+ // TODO only needed for PGraphicsJava2D? if so, move it there
+ // actually, it's generally useful for other renderers, so keep it
+ // or hide the implementation elsewhere.
+ curveToBezierMatrix.set(curveBasisMatrix);
+ curveToBezierMatrix.preApply(bezierBasisInverse);
+
+ // multiply the basis and forward diff matrices together
+ // saves much time since this needn't be done for each curve
+ curveDrawMatrix.apply(curveBasisMatrix);
+ };
+
+ /**
+ * Specifies vertex coordinates for Bezier curves. Each call to <b>bezierVertex()</b> defines the position of two control
+ * points and one anchor point of a Bezier curve, adding a new segment to a line or shape. The first time
+ * <b>bezierVertex()</b> is used within a <b>beginShape()</b> call, it must be prefaced with a call to <b>vertex()</b>
+ * to set the first anchor point. This function must be used between <b>beginShape()</b> and <b>endShape()</b> and only
+ * when there is no MODE parameter specified to <b>beginShape()</b>. Using the 3D version of requires rendering with P3D
+ * or OPENGL (see the Environment reference for more information). <br /> <br /> <b>NOTE: </b> Fill does not work properly yet.
+ *
+ * @param {float | int} cx1 The x-coordinate of 1st control point
+ * @param {float | int} cy1 The y-coordinate of 1st control point
+ * @param {float | int} cz1 The z-coordinate of 1st control point
+ * @param {float | int} cx2 The x-coordinate of 2nd control point
+ * @param {float | int} cy2 The y-coordinate of 2nd control point
+ * @param {float | int} cz2 The z-coordinate of 2nd control point
+ * @param {float | int} x The x-coordinate of the anchor point
+ * @param {float | int} y The y-coordinate of the anchor point
+ * @param {float | int} z The z-coordinate of the anchor point
+ *
+ * @see curveVertex
+ * @see vertex
+ * @see bezier
+ */
+ Drawing2D.prototype.bezierVertex = function() {
+ isBezier = true;
+ var vert = [];
+ if (firstVert) {
+ throw ("vertex() must be used at least once before calling bezierVertex()");
+ }
+
+ for (var i = 0; i < arguments.length; i++) {
+ vert[i] = arguments[i];
+ }
+ vertArray.push(vert);
+ vertArray[vertArray.length -1].isVert = false;
+ };
+
+ Drawing3D.prototype.bezierVertex = function() {
+ isBezier = true;
+ var vert = [];
+ if (firstVert) {
+ throw ("vertex() must be used at least once before calling bezierVertex()");
+ }
+
+ if (arguments.length === 9) {
+ if (bezierDrawMatrix === undef) {
+ bezierDrawMatrix = new PMatrix3D();
+ }
+ // setup matrix for forward differencing to speed up drawing
+ var lastPoint = vertArray.length - 1;
+ splineForward( bezDetail, bezierDrawMatrix );
+ bezierDrawMatrix.apply( bezierBasisMatrix );
+ var draw = bezierDrawMatrix.array();
+ var x1 = vertArray[lastPoint][0],
+ y1 = vertArray[lastPoint][1],
+ z1 = vertArray[lastPoint][2];
+ var xplot1 = draw[4] * x1 + draw[5] * arguments[0] + draw[6] * arguments[3] + draw[7] * arguments[6];
+ var xplot2 = draw[8] * x1 + draw[9] * arguments[0] + draw[10]* arguments[3] + draw[11]* arguments[6];
+ var xplot3 = draw[12]* x1 + draw[13]* arguments[0] + draw[14]* arguments[3] + draw[15]* arguments[6];
+
+ var yplot1 = draw[4] * y1 + draw[5] * arguments[1] + draw[6] * arguments[4] + draw[7] * arguments[7];
+ var yplot2 = draw[8] * y1 + draw[9] * arguments[1] + draw[10]* arguments[4] + draw[11]* arguments[7];
+ var yplot3 = draw[12]* y1 + draw[13]* arguments[1] + draw[14]* arguments[4] + draw[15]* arguments[7];
+
+ var zplot1 = draw[4] * z1 + draw[5] * arguments[2] + draw[6] * arguments[5] + draw[7] * arguments[8];
+ var zplot2 = draw[8] * z1 + draw[9] * arguments[2] + draw[10]* arguments[5] + draw[11]* arguments[8];
+ var zplot3 = draw[12]* z1 + draw[13]* arguments[2] + draw[14]* arguments[5] + draw[15]* arguments[8];
+ for (var j = 0; j < bezDetail; j++) {
+ x1 += xplot1; xplot1 += xplot2; xplot2 += xplot3;
+ y1 += yplot1; yplot1 += yplot2; yplot2 += yplot3;
+ z1 += zplot1; zplot1 += zplot2; zplot2 += zplot3;
+ p.vertex(x1, y1, z1);
+ }
+ p.vertex(arguments[6], arguments[7], arguments[8]);
+ }
+ };
+
+ /**
+ * Sets a texture to be applied to vertex points. The <b>texture()</b> function
+ * must be called between <b>beginShape()</b> and <b>endShape()</b> and before
+ * any calls to vertex().
+ *
+ * When textures are in use, the fill color is ignored. Instead, use tint() to
+ * specify the color of the texture as it is applied to the shape.
+ *
+ * @param {PImage} pimage the texture to apply
+ *
+ * @returns none
+ *
+ * @see textureMode
+ * @see beginShape
+ * @see endShape
+ * @see vertex
+ */
+ p.texture = function(pimage) {
+ var curContext = drawing.$ensureContext();
+
+ if (pimage.__texture) {
+ curContext.bindTexture(curContext.TEXTURE_2D, pimage.__texture);
+ } else if (pimage.localName === "canvas") {
+ curContext.bindTexture(curContext.TEXTURE_2D, canTex);
+ curContext.texImage2D(curContext.TEXTURE_2D, 0, curContext.RGBA, curContext.RGBA, curContext.UNSIGNED_BYTE, pimage);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MAG_FILTER, curContext.LINEAR);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MIN_FILTER, curContext.LINEAR);
+ curContext.generateMipmap(curContext.TEXTURE_2D);
+ curTexture.width = pimage.width;
+ curTexture.height = pimage.height;
+ } else {
+ var texture = curContext.createTexture(),
+ cvs = document.createElement('canvas'),
+ cvsTextureCtx = cvs.getContext('2d'),
+ pot;
+
+ // WebGL requires power of two textures
+ if (pimage.width & (pimage.width-1) === 0) {
+ cvs.width = pimage.width;
+ } else {
+ pot = 1;
+ while (pot < pimage.width) {
+ pot *= 2;
+ }
+ cvs.width = pot;
+ }
+
+ if (pimage.height & (pimage.height-1) === 0) {
+ cvs.height = pimage.height;
+ } else {
+ pot = 1;
+ while (pot < pimage.height) {
+ pot *= 2;
+ }
+ cvs.height = pot;
+ }
+
+ cvsTextureCtx.drawImage(pimage.sourceImg, 0, 0, pimage.width, pimage.height, 0, 0, cvs.width, cvs.height);
+
+ curContext.bindTexture(curContext.TEXTURE_2D, texture);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MIN_FILTER, curContext.LINEAR_MIPMAP_LINEAR);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MAG_FILTER, curContext.LINEAR);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_WRAP_T, curContext.CLAMP_TO_EDGE);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_WRAP_S, curContext.CLAMP_TO_EDGE);
+ curContext.texImage2D(curContext.TEXTURE_2D, 0, curContext.RGBA, curContext.RGBA, curContext.UNSIGNED_BYTE, cvs);
+ curContext.generateMipmap(curContext.TEXTURE_2D);
+
+ pimage.__texture = texture;
+ curTexture.width = pimage.width;
+ curTexture.height = pimage.height;
+ }
+
+ usingTexture = true;
+ curContext.useProgram(programObject3D);
+ uniformi("usingTexture3d", programObject3D, "uUsingTexture", usingTexture);
+ };
+
+ /**
+ * Sets the coordinate space for texture mapping. There are two options, IMAGE,
+ * which refers to the actual coordinates of the image, and NORMALIZED, which
+ * refers to a normalized space of values ranging from 0 to 1. The default mode
+ * is IMAGE. In IMAGE, if an image is 100 x 200 pixels, mapping the image onto
+ * the entire size of a quad would require the points (0,0) (0,100) (100,200) (0,200).
+ * The same mapping in NORMAL_SPACE is (0,0) (0,1) (1,1) (0,1).
+ *
+ * @param MODE either IMAGE or NORMALIZED
+ *
+ * @returns none
+ *
+ * @see texture
+ */
+ p.textureMode = function(mode){
+ curTextureMode = mode;
+ };
+ /**
+ * The curveVertexSegment() function handle emitting a specific segment of Catmull-Rom curve. Internal helper function used by <b>curveVertex()</b>.
+ */
+ var curveVertexSegment = function(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4) {
+ var x0 = x2;
+ var y0 = y2;
+ var z0 = z2;
+
+ var draw = curveDrawMatrix.array();
+
+ var xplot1 = draw[4] * x1 + draw[5] * x2 + draw[6] * x3 + draw[7] * x4;
+ var xplot2 = draw[8] * x1 + draw[9] * x2 + draw[10] * x3 + draw[11] * x4;
+ var xplot3 = draw[12] * x1 + draw[13] * x2 + draw[14] * x3 + draw[15] * x4;
+
+ var yplot1 = draw[4] * y1 + draw[5] * y2 + draw[6] * y3 + draw[7] * y4;
+ var yplot2 = draw[8] * y1 + draw[9] * y2 + draw[10] * y3 + draw[11] * y4;
+ var yplot3 = draw[12] * y1 + draw[13] * y2 + draw[14] * y3 + draw[15] * y4;
+
+ var zplot1 = draw[4] * z1 + draw[5] * z2 + draw[6] * z3 + draw[7] * z4;
+ var zplot2 = draw[8] * z1 + draw[9] * z2 + draw[10] * z3 + draw[11] * z4;
+ var zplot3 = draw[12] * z1 + draw[13] * z2 + draw[14] * z3 + draw[15] * z4;
+
+ p.vertex(x0, y0, z0);
+ for (var j = 0; j < curveDet; j++) {
+ x0 += xplot1; xplot1 += xplot2; xplot2 += xplot3;
+ y0 += yplot1; yplot1 += yplot2; yplot2 += yplot3;
+ z0 += zplot1; zplot1 += zplot2; zplot2 += zplot3;
+ p.vertex(x0, y0, z0);
+ }
+ };
+
+ /**
+ * Specifies vertex coordinates for curves. This function may only be used between <b>beginShape()</b> and
+ * <b>endShape()</b> and only when there is no MODE parameter specified to <b>beginShape()</b>. The first and last points
+ * in a series of <b>curveVertex()</b> lines will be used to guide the beginning and end of a the curve. A minimum of four
+ * points is required to draw a tiny curve between the second and third points. Adding a fifth point with
+ * <b>curveVertex()</b> will draw the curve between the second, third, and fourth points. The <b>curveVertex()</b> function
+ * is an implementation of Catmull-Rom splines. Using the 3D version of requires rendering with P3D or OPENGL (see the
+ * Environment reference for more information). <br /> <br /><b>NOTE: </b> Fill does not work properly yet.
+ *
+ * @param {float | int} x The x-coordinate of the vertex
+ * @param {float | int} y The y-coordinate of the vertex
+ * @param {float | int} z The z-coordinate of the vertex
+ *
+ * @see curve
+ * @see beginShape
+ * @see endShape
+ * @see vertex
+ * @see bezierVertex
+ */
+ Drawing2D.prototype.curveVertex = function(x, y) {
+ isCurve = true;
+
+ p.vertex(x, y);
+ };
+
+ Drawing3D.prototype.curveVertex = function(x, y, z) {
+ isCurve = true;
+
+ if (!curveInited) {
+ curveInit();
+ }
+ var vert = [];
+ vert[0] = x;
+ vert[1] = y;
+ vert[2] = z;
+ curveVertArray.push(vert);
+ curveVertCount++;
+
+ if (curveVertCount > 3) {
+ curveVertexSegment( curveVertArray[curveVertCount-4][0],
+ curveVertArray[curveVertCount-4][1],
+ curveVertArray[curveVertCount-4][2],
+ curveVertArray[curveVertCount-3][0],
+ curveVertArray[curveVertCount-3][1],
+ curveVertArray[curveVertCount-3][2],
+ curveVertArray[curveVertCount-2][0],
+ curveVertArray[curveVertCount-2][1],
+ curveVertArray[curveVertCount-2][2],
+ curveVertArray[curveVertCount-1][0],
+ curveVertArray[curveVertCount-1][1],
+ curveVertArray[curveVertCount-1][2] );
+ }
+ };
+
+ /**
+ * The curve() function draws a curved line on the screen. The first and second parameters
+ * specify the beginning control point and the last two parameters specify
+ * the ending control point. The middle parameters specify the start and
+ * stop of the curve. Longer curves can be created by putting a series of
+ * <b>curve()</b> functions together or using <b>curveVertex()</b>.
+ * An additional function called <b>curveTightness()</b> provides control
+ * for the visual quality of the curve. The <b>curve()</b> function is an
+ * implementation of Catmull-Rom splines. Using the 3D version of requires
+ * rendering with P3D or OPENGL (see the Environment reference for more
+ * information).
+ *
+ * @param {int|float} x1 coordinates for the beginning control point
+ * @param {int|float} y1 coordinates for the beginning control point
+ * @param {int|float} z1 coordinates for the beginning control point
+ * @param {int|float} x2 coordinates for the first point
+ * @param {int|float} y2 coordinates for the first point
+ * @param {int|float} z2 coordinates for the first point
+ * @param {int|float} x3 coordinates for the second point
+ * @param {int|float} y3 coordinates for the second point
+ * @param {int|float} z3 coordinates for the second point
+ * @param {int|float} x4 coordinates for the ending control point
+ * @param {int|float} y4 coordinates for the ending control point
+ * @param {int|float} z4 coordinates for the ending control point
+ *
+ * @see #curveVertex()
+ * @see #curveTightness()
+ * @see #bezier()
+ */
+ Drawing2D.prototype.curve = function(x1, y1, x2, y2, x3, y3, x4, y4) {
+ p.beginShape();
+ p.curveVertex(x1, y1);
+ p.curveVertex(x2, y2);
+ p.curveVertex(x3, y3);
+ p.curveVertex(x4, y4);
+ p.endShape();
+ };
+
+ Drawing3D.prototype.curve = function(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4) {
+ if (z4 !== undef) {
+ p.beginShape();
+ p.curveVertex(x1, y1, z1);
+ p.curveVertex(x2, y2, z2);
+ p.curveVertex(x3, y3, z3);
+ p.curveVertex(x4, y4, z4);
+ p.endShape();
+ return;
+ }
+ p.beginShape();
+ p.curveVertex(x1, y1);
+ p.curveVertex(z1, x2);
+ p.curveVertex(y2, z2);
+ p.curveVertex(x3, y3);
+ p.endShape();
+ };
+
+ /**
+ * The curveTightness() function modifies the quality of forms created with <b>curve()</b> and
+ * <b>curveVertex()</b>. The parameter <b>squishy</b> determines how the
+ * curve fits to the vertex points. The value 0.0 is the default value for
+ * <b>squishy</b> (this value defines the curves to be Catmull-Rom splines)
+ * and the value 1.0 connects all the points with straight lines.
+ * Values within the range -5.0 and 5.0 will deform the curves but
+ * will leave them recognizable and as values increase in magnitude,
+ * they will continue to deform.
+ *
+ * @param {float} tightness amount of deformation from the original vertices
+ *
+ * @see #curve()
+ * @see #curveVertex()
+ *
+ */
+ p.curveTightness = function(tightness) {
+ curTightness = tightness;
+ };
+
+ /**
+ * The curveDetail() function sets the resolution at which curves display. The default value is 20.
+ * This function is only useful when using the P3D or OPENGL renderer.
+ *
+ * @param {int} detail resolution of the curves
+ *
+ * @see curve()
+ * @see curveVertex()
+ * @see curveTightness()
+ */
+ p.curveDetail = function(detail) {
+ curveDet = detail;
+ curveInit();
+ };
+
+ /**
+ * Modifies the location from which rectangles draw. The default mode is rectMode(CORNER), which
+ * specifies the location to be the upper left corner of the shape and uses the third and fourth
+ * parameters of rect() to specify the width and height. The syntax rectMode(CORNERS) uses the
+ * first and second parameters of rect() to set the location of one corner and uses the third and
+ * fourth parameters to set the opposite corner. The syntax rectMode(CENTER) draws the image from
+ * its center point and uses the third and forth parameters of rect() to specify the image's width
+ * and height. The syntax rectMode(RADIUS) draws the image from its center point and uses the third
+ * and forth parameters of rect() to specify half of the image's width and height. The parameter must
+ * be written in ALL CAPS because Processing is a case sensitive language. Note: In version 125, the
+ * mode named CENTER_RADIUS was shortened to RADIUS.
+ *
+ * @param {MODE} MODE Either CORNER, CORNERS, CENTER, or RADIUS
+ *
+ * @see rect
+ */
+ p.rectMode = function(aRectMode) {
+ curRectMode = aRectMode;
+ };
+
+ /**
+ * Modifies the location from which images draw. The default mode is imageMode(CORNER), which specifies
+ * the location to be the upper left corner and uses the fourth and fifth parameters of image() to set
+ * the image's width and height. The syntax imageMode(CORNERS) uses the second and third parameters of
+ * image() to set the location of one corner of the image and uses the fourth and fifth parameters to
+ * set the opposite corner. Use imageMode(CENTER) to draw images centered at the given x and y position.
+ * The parameter to imageMode() must be written in ALL CAPS because Processing is a case sensitive language.
+ *
+ * @param {MODE} MODE Either CORNER, CORNERS, or CENTER
+ *
+ * @see loadImage
+ * @see PImage
+ * @see image
+ * @see background
+ */
+ p.imageMode = function(mode) {
+ switch (mode) {
+ case PConstants.CORNER:
+ imageModeConvert = imageModeCorner;
+ break;
+ case PConstants.CORNERS:
+ imageModeConvert = imageModeCorners;
+ break;
+ case PConstants.CENTER:
+ imageModeConvert = imageModeCenter;
+ break;
+ default:
+ throw "Invalid imageMode";
+ }
+ };
+
+ /**
+ * The origin of the ellipse is modified by the ellipseMode() function. The default configuration is
+ * ellipseMode(CENTER), which specifies the location of the ellipse as the center of the shape. The RADIUS
+ * mode is the same, but the width and height parameters to ellipse() specify the radius of the ellipse,
+ * rather than the diameter. The CORNER mode draws the shape from the upper-left corner of its bounding box.
+ * The CORNERS mode uses the four parameters to ellipse() to set two opposing corners of the ellipse's bounding
+ * box. The parameter must be written in "ALL CAPS" because Processing is a case sensitive language.
+ *
+ * @param {MODE} MODE Either CENTER, RADIUS, CORNER, or CORNERS.
+ *
+ * @see ellipse
+ */
+ p.ellipseMode = function(aEllipseMode) {
+ curEllipseMode = aEllipseMode;
+ };
+
+ /**
+ * The arc() function draws an arc in the display window.
+ * Arcs are drawn along the outer edge of an ellipse defined by the
+ * <b>x</b>, <b>y</b>, <b>width</b> and <b>height</b> parameters.
+ * The origin or the arc's ellipse may be changed with the
+ * <b>ellipseMode()</b> function.
+ * The <b>start</b> and <b>stop</b> parameters specify the angles
+ * at which to draw the arc.
+ *
+ * @param {float} a x-coordinate of the arc's ellipse
+ * @param {float} b y-coordinate of the arc's ellipse
+ * @param {float} c width of the arc's ellipse
+ * @param {float} d height of the arc's ellipse
+ * @param {float} start angle to start the arc, specified in radians
+ * @param {float} stop angle to stop the arc, specified in radians
+ * @param {enum} mode drawing mode (OPEN, CHORD, PIE)
+ *
+ * @see #ellipseMode()
+ * @see #ellipse()
+ */
+ p.arc = function(x, y, width, height, start, stop, mode) {
+ if (width <= 0 || stop < start) { return; }
+
+ if (curEllipseMode === PConstants.CORNERS) {
+ width = width - x;
+ height = height - y;
+ } else if (curEllipseMode === PConstants.RADIUS) {
+ x = x - width;
+ y = y - height;
+ width = width * 2;
+ height = height * 2;
+ } else if (curEllipseMode === PConstants.CENTER) {
+ x = x - width/2;
+ y = y - height/2;
+ }
+ // make sure that we're starting at a useful point
+ while (start < 0) {
+ start += PConstants.TWO_PI;
+ stop += PConstants.TWO_PI;
+ }
+ if (stop - start > PConstants.TWO_PI) {
+ // don't change start, it is visible in PIE mode
+ stop = start + PConstants.TWO_PI;
+ }
+ var hr = width / 2,
+ vr = height / 2,
+ centerX = x + hr,
+ centerY = y + vr,
+ step = 1/(hr+vr);
+
+ var drawSlice = (function(x, y, start, step, stop) {
+ return function(p, closed, i, a, e) {
+ i = 0;
+ a = start;
+ e = stop + step;
+ p.beginShape();
+ if(closed) { p.vertex(x-0.5, y-0.5); }
+ for (; a < e; i++, a = i*step + start) {
+ p.vertex(
+ (x + Math.cos(a) * hr)|0,
+ (y + Math.sin(a) * vr)|0
+ );
+ }
+
+ if (mode === PConstants.OPEN && doFill) {
+ p.vertex(centerX + Math.cos(start) * hr, centerY + Math.sin(start) * vr);
+ } else if (mode === PConstants.CHORD) {
+ p.vertex(centerX + Math.cos(start) * hr, centerY + Math.sin(start) * vr);
+ } else if (mode === PConstants.PIE) {
+ p.line(centerX + Math.cos(start) * hr, centerY + Math.sin(start) * vr, centerX, centerY);
+ p.line(centerX, centerY, centerX + Math.cos(stop) * hr, centerY + Math.sin(stop) * vr);
+ }
+
+ p.endShape(closed ? PConstants.CLOSE : undefined);
+ };
+ }(centerX+0.5, centerY+0.5, start, step, stop));
+
+ if (doFill) {
+ var savedStroke = doStroke;
+ doStroke = false;
+ drawSlice(p, true);
+ doStroke = savedStroke;
+ }
+
+ if (doStroke) {
+ var savedFill = doFill;
+ doFill = false;
+ drawSlice(p);
+ doFill = savedFill;
+ }
+ };
+
+ /**
+ * Draws a line (a direct path between two points) to the screen. The version of line() with four parameters
+ * draws the line in 2D. To color a line, use the stroke() function. A line cannot be filled, therefore the
+ * fill() method will not affect the color of a line. 2D lines are drawn with a width of one pixel by default,
+ * but this can be changed with the strokeWeight() function. The version with six parameters allows the line
+ * to be placed anywhere within XYZ space. Drawing this shape in 3D using the z parameter requires the P3D or
+ * OPENGL parameter in combination with size.
+ *
+ * @param {int|float} x1 x-coordinate of the first point
+ * @param {int|float} y1 y-coordinate of the first point
+ * @param {int|float} z1 z-coordinate of the first point
+ * @param {int|float} x2 x-coordinate of the second point
+ * @param {int|float} y2 y-coordinate of the second point
+ * @param {int|float} z2 z-coordinate of the second point
+ *
+ * @see strokeWeight
+ * @see strokeJoin
+ * @see strokeCap
+ * @see beginShape
+ */
+ Drawing2D.prototype.line = function(x1, y1, x2, y2) {
+ if (!doStroke) {
+ return;
+ }
+ if (!renderSmooth) {
+ x1 = Math.round(x1);
+ x2 = Math.round(x2);
+ y1 = Math.round(y1);
+ y2 = Math.round(y2);
+ }
+
+ // A line is only defined if it has different start and end coordinates.
+ // If they are the same, we call point instead.
+ if (x1 === x2 && y1 === y2) {
+ p.point(x1, y1);
+ return;
+ }
+
+ var swap = undef,
+ lineCap = undef,
+ drawCrisp = true,
+ currentModelView = modelView.array(),
+ identityMatrix = [1, 0, 0, 0, 1, 0];
+ // Test if any transformations have been applied to the sketch
+ for (var i = 0; i < 6 && drawCrisp; i++) {
+ drawCrisp = currentModelView[i] === identityMatrix[i];
+ }
+ /* Draw crisp lines if the line is vertical or horizontal with the following method
+ * If any transformations have been applied to the sketch, don't make the line crisp
+ * If the line is directed up or to the left, reverse it by swapping x1/x2 or y1/y2
+ * Make the line 1 pixel longer to work around cross-platform canvas implementations
+ * If the lineWidth is odd, translate the line by 0.5 in the perpendicular direction
+ * Even lineWidths do not need to be translated because the canvas will draw them on pixel boundaries
+ * Change the cap to butt-end to work around cross-platform canvas implementations
+ * Reverse the translate and lineCap canvas state changes after drawing the line
+ */
+ if (drawCrisp) {
+ if (x1 === x2) {
+ if (y1 > y2) {
+ swap = y1;
+ y1 = y2;
+ y2 = swap;
+ }
+ y2++;
+ if (lineWidth % 2 === 1) {
+ curContext.translate(0.5, 0.0);
+ }
+ } else if (y1 === y2) {
+ if (x1 > x2) {
+ swap = x1;
+ x1 = x2;
+ x2 = swap;
+ }
+ x2++;
+ if (lineWidth % 2 === 1) {
+ curContext.translate(0.0, 0.5);
+ }
+ }
+ if (lineWidth === 1) {
+ lineCap = curContext.lineCap;
+ curContext.lineCap = 'butt';
+ }
+ }
+ curContext.beginPath();
+ curContext.moveTo(x1 || 0, y1 || 0);
+ curContext.lineTo(x2 || 0, y2 || 0);
+ executeContextStroke();
+ if (drawCrisp) {
+ if (x1 === x2 && lineWidth % 2 === 1) {
+ curContext.translate(-0.5, 0.0);
+ } else if (y1 === y2 && lineWidth % 2 === 1) {
+ curContext.translate(0.0, -0.5);
+ }
+ if (lineWidth === 1) {
+ curContext.lineCap = lineCap;
+ }
+ }
+ };
+
+ Drawing3D.prototype.line = function(x1, y1, z1, x2, y2, z2) {
+ if (y2 === undef || z2 === undef) { // 2D line called in 3D context
+ z2 = 0;
+ y2 = x2;
+ x2 = z1;
+ z1 = 0;
+ }
+
+ // a line is only defined if it has different start and end coordinates.
+ // If they are the same, we call point instead.
+ if (x1===x2 && y1===y2 && z1===z2) {
+ p.point(x1,y1,z1);
+ return;
+ }
+
+ var lineVerts = [x1, y1, z1, x2, y2, z2];
+
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ if (lineWidth > 0 && doStroke) {
+ curContext.useProgram(programObject2D);
+
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+
+ uniformf("uColor2d", programObject2D, "uColor", strokeStyle);
+ uniformi("uIsDrawingText", programObject2D, "uIsDrawingText", false);
+
+ vertexAttribPointer("aVertex2d", programObject2D, "aVertex", 3, lineBuffer);
+ disableVertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord");
+
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(lineVerts), curContext.STREAM_DRAW);
+ curContext.drawArrays(curContext.LINES, 0, 2);
+ }
+ };
+
+ /**
+ * Draws a Bezier curve on the screen. These curves are defined by a series of anchor and control points. The first
+ * two parameters specify the first anchor point and the last two parameters specify the other anchor point. The
+ * middle parameters specify the control points which define the shape of the curve. Bezier curves were developed
+ * by French engineer Pierre Bezier. Using the 3D version of requires rendering with P3D or OPENGL (see the
+ * Environment reference for more information).
+ *
+ * @param {int | float} x1,y1,z1 coordinates for the first anchor point
+ * @param {int | float} cx1,cy1,cz1 coordinates for the first control point
+ * @param {int | float} cx2,cy2,cz2 coordinates for the second control point
+ * @param {int | float} x2,y2,z2 coordinates for the second anchor point
+ *
+ * @see bezierVertex
+ * @see curve
+ */
+ Drawing2D.prototype.bezier = function() {
+ if (arguments.length !== 8) {
+ throw("You must use 8 parameters for bezier() in 2D mode");
+ }
+
+ p.beginShape();
+ p.vertex( arguments[0], arguments[1] );
+ p.bezierVertex( arguments[2], arguments[3],
+ arguments[4], arguments[5],
+ arguments[6], arguments[7] );
+ p.endShape();
+ };
+
+ Drawing3D.prototype.bezier = function() {
+ if (arguments.length !== 12) {
+ throw("You must use 12 parameters for bezier() in 3D mode");
+ }
+
+ p.beginShape();
+ p.vertex( arguments[0], arguments[1], arguments[2] );
+ p.bezierVertex( arguments[3], arguments[4], arguments[5],
+ arguments[6], arguments[7], arguments[8],
+ arguments[9], arguments[10], arguments[11] );
+ p.endShape();
+ };
+
+ /**
+ * Sets the resolution at which Beziers display. The default value is 20. This function is only useful when using the P3D
+ * or OPENGL renderer as the default (JAVA2D) renderer does not use this information.
+ *
+ * @param {int} detail resolution of the curves
+ *
+ * @see curve
+ * @see curveVertex
+ * @see curveTightness
+ */
+ p.bezierDetail = function( detail ){
+ bezDetail = detail;
+ };
+
+ /**
+ * The bezierPoint() function evalutes quadratic bezier at point t for points a, b, c, d.
+ * The parameter t varies between 0 and 1. The a and d parameters are the
+ * on-curve points, b and c are the control points. To make a two-dimensional
+ * curve, call this function once with the x coordinates and a second time
+ * with the y coordinates to get the location of a bezier curve at t.
+ *
+ * @param {float} a coordinate of first point on the curve
+ * @param {float} b coordinate of first control point
+ * @param {float} c coordinate of second control point
+ * @param {float} d coordinate of second point on the curve
+ * @param {float} t value between 0 and 1
+ *
+ * @see #bezier()
+ * @see #bezierVertex()
+ * @see #curvePoint()
+ */
+ p.bezierPoint = function(a, b, c, d, t) {
+ return (1 - t) * (1 - t) * (1 - t) * a + 3 * (1 - t) * (1 - t) * t * b + 3 * (1 - t) * t * t * c + t * t * t * d;
+ };
+
+ /**
+ * The bezierTangent() function calculates the tangent of a point on a Bezier curve. There is a good
+ * definition of "tangent" at Wikipedia: <a href="http://en.wikipedia.org/wiki/Tangent" target="new">http://en.wikipedia.org/wiki/Tangent</a>
+ *
+ * @param {float} a coordinate of first point on the curve
+ * @param {float} b coordinate of first control point
+ * @param {float} c coordinate of second control point
+ * @param {float} d coordinate of second point on the curve
+ * @param {float} t value between 0 and 1
+ *
+ * @see #bezier()
+ * @see #bezierVertex()
+ * @see #curvePoint()
+ */
+ p.bezierTangent = function(a, b, c, d, t) {
+ return (3 * t * t * (-a + 3 * b - 3 * c + d) + 6 * t * (a - 2 * b + c) + 3 * (-a + b));
+ };
+
+ /**
+ * The curvePoint() function evalutes the Catmull-Rom curve at point t for points a, b, c, d. The
+ * parameter t varies between 0 and 1, a and d are points on the curve,
+ * and b and c are the control points. This can be done once with the x
+ * coordinates and a second time with the y coordinates to get the
+ * location of a curve at t.
+ *
+ * @param {int|float} a coordinate of first point on the curve
+ * @param {int|float} b coordinate of second point on the curve
+ * @param {int|float} c coordinate of third point on the curve
+ * @param {int|float} d coordinate of fourth point on the curve
+ * @param {float} t value between 0 and 1
+ *
+ * @see #curve()
+ * @see #curveVertex()
+ * @see #bezierPoint()
+ */
+ p.curvePoint = function(a, b, c, d, t) {
+ return 0.5 * ((2 * b) + (-a + c) * t + (2 * a - 5 * b + 4 * c - d) * t * t + (-a + 3 * b - 3 * c + d) * t * t * t);
+ };
+
+ /**
+ * The curveTangent() function calculates the tangent of a point on a Catmull-Rom curve.
+ * There is a good definition of "tangent" at Wikipedia: <a href="http://en.wikipedia.org/wiki/Tangent" target="new">http://en.wikipedia.org/wiki/Tangent</a>.
+ *
+ * @param {int|float} a coordinate of first point on the curve
+ * @param {int|float} b coordinate of first control point
+ * @param {int|float} c coordinate of second control point
+ * @param {int|float} d coordinate of second point on the curve
+ * @param {float} t value between 0 and 1
+ *
+ * @see #curve()
+ * @see #curveVertex()
+ * @see #curvePoint()
+ * @see #bezierTangent()
+ */
+ p.curveTangent = function(a, b, c, d, t) {
+ return 0.5 * ((-a + c) + 2 * (2 * a - 5 * b + 4 * c - d) * t + 3 * (-a + 3 * b - 3 * c + d) * t * t);
+ };
+
+ /**
+ * A triangle is a plane created by connecting three points. The first two arguments specify the first point,
+ * the middle two arguments specify the second point, and the last two arguments specify the third point.
+ *
+ * @param {int | float} x1 x-coordinate of the first point
+ * @param {int | float} y1 y-coordinate of the first point
+ * @param {int | float} x2 x-coordinate of the second point
+ * @param {int | float} y2 y-coordinate of the second point
+ * @param {int | float} x3 x-coordinate of the third point
+ * @param {int | float} y3 y-coordinate of the third point
+ */
+ p.triangle = function(x1, y1, x2, y2, x3, y3) {
+ p.beginShape(PConstants.TRIANGLES);
+ p.vertex(x1, y1, 0);
+ p.vertex(x2, y2, 0);
+ p.vertex(x3, y3, 0);
+ p.endShape();
+ };
+
+ /**
+ * A quad is a quadrilateral, a four sided polygon. It is similar to a rectangle, but the angles between its
+ * edges are not constrained to ninety degrees. The first pair of parameters (x1,y1) sets the first vertex
+ * and the subsequent pairs should proceed clockwise or counter-clockwise around the defined shape.
+ *
+ * @param {float | int} x1 x-coordinate of the first corner
+ * @param {float | int} y1 y-coordinate of the first corner
+ * @param {float | int} x2 x-coordinate of the second corner
+ * @param {float | int} y2 y-coordinate of the second corner
+ * @param {float | int} x3 x-coordinate of the third corner
+ * @param {float | int} y3 y-coordinate of the third corner
+ * @param {float | int} x4 x-coordinate of the fourth corner
+ * @param {float | int} y4 y-coordinate of the fourth corner
+ */
+ p.quad = function(x1, y1, x2, y2, x3, y3, x4, y4) {
+ p.beginShape(PConstants.QUADS);
+ p.vertex(x1, y1, 0);
+ p.vertex(x2, y2, 0);
+ p.vertex(x3, y3, 0);
+ p.vertex(x4, y4, 0);
+ p.endShape();
+ };
+
+ var roundedRect$2d = function(x, y, width, height, tl, tr, br, bl) {
+ if (bl === undef) {
+ tr = tl;
+ br = tl;
+ bl = tl;
+ }
+ var halfWidth = width / 2,
+ halfHeight = height / 2;
+ if (tl > halfWidth || tl > halfHeight) {
+ tl = Math.min(halfWidth, halfHeight);
+ }
+ if (tr > halfWidth || tr > halfHeight) {
+ tr = Math.min(halfWidth, halfHeight);
+ }
+ if (br > halfWidth || br > halfHeight) {
+ br = Math.min(halfWidth, halfHeight);
+ }
+ if (bl > halfWidth || bl > halfHeight) {
+ bl = Math.min(halfWidth, halfHeight);
+ }
+ // Translate the stroke by (0.5, 0.5) to draw a crisp border
+ if (!doFill || doStroke) {
+ curContext.translate(0.5, 0.5);
+ }
+ curContext.beginPath();
+ curContext.moveTo(x + tl, y);
+ curContext.lineTo(x + width - tr, y);
+ curContext.quadraticCurveTo(x + width, y, x + width, y + tr);
+ curContext.lineTo(x + width, y + height - br);
+ curContext.quadraticCurveTo(x + width, y + height, x + width - br, y + height);
+ curContext.lineTo(x + bl, y + height);
+ curContext.quadraticCurveTo(x, y + height, x, y + height - bl);
+ curContext.lineTo(x, y + tl);
+ curContext.quadraticCurveTo(x, y, x + tl, y);
+ if (!doFill || doStroke) {
+ curContext.translate(-0.5, -0.5);
+ }
+ executeContextFill();
+ executeContextStroke();
+ };
+
+ /**
+ * Draws a rectangle to the screen. A rectangle is a four-sided shape with every angle at ninety
+ * degrees. The first two parameters set the location, the third sets the width, and the fourth
+ * sets the height. The origin is changed with the rectMode() function.
+ *
+ * @param {int|float} x x-coordinate of the rectangle
+ * @param {int|float} y y-coordinate of the rectangle
+ * @param {int|float} width width of the rectangle
+ * @param {int|float} height height of the rectangle
+ *
+ * @see rectMode
+ * @see quad
+ */
+ Drawing2D.prototype.rect = function(x, y, width, height, tl, tr, br, bl) {
+ // width and height need to be defined, numerical values
+ if (width!=''+width && height!=''+height) {
+ return;
+ }
+
+ if (curRectMode === PConstants.CORNERS) {
+ width -= x;
+ height -= y;
+ } else if (curRectMode === PConstants.RADIUS) {
+ width *= 2;
+ height *= 2;
+ x -= width / 2;
+ y -= height / 2;
+ } else if (curRectMode === PConstants.CENTER) {
+ x -= width / 2;
+ y -= height / 2;
+ }
+
+ if (!renderSmooth) {
+ x = Math.round(x);
+ y = Math.round(y);
+ width = Math.round(width);
+ height = Math.round(height);
+ }
+ if (tl !== undef) {
+ roundedRect$2d(x, y, width, height, tl, tr, br, bl);
+ return;
+ }
+
+ // Translate the line by (0.5, 0.5) to draw a crisp rectangle border
+ if (doStroke && lineWidth % 2 === 1) {
+ curContext.translate(0.5, 0.5);
+ }
+ curContext.beginPath();
+ curContext.rect(x, y, width, height);
+ executeContextFill();
+ executeContextStroke();
+ if (doStroke && lineWidth % 2 === 1) {
+ curContext.translate(-0.5, -0.5);
+ }
+ };
+
+ Drawing3D.prototype.rect = function(x, y, width, height, tl, tr, br, bl) {
+ if (tl !== undef) {
+ throw "rect() with rounded corners is not supported in 3D mode";
+ }
+
+ if (curRectMode === PConstants.CORNERS) {
+ width -= x;
+ height -= y;
+ } else if (curRectMode === PConstants.RADIUS) {
+ width *= 2;
+ height *= 2;
+ x -= width / 2;
+ y -= height / 2;
+ } else if (curRectMode === PConstants.CENTER) {
+ x -= width / 2;
+ y -= height / 2;
+ }
+
+ // Modeling transformation
+ var model = new PMatrix3D();
+ model.translate(x, y, 0);
+ model.scale(width, height, 1);
+ model.transpose();
+
+ // viewing transformation needs to have Y flipped
+ // becuase that's what Processing does.
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ if (lineWidth > 0 && doStroke) {
+ curContext.useProgram(programObject2D);
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, model.array());
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+ uniformf("uColor2d", programObject2D, "uColor", strokeStyle);
+ uniformi("uIsDrawingText2d", programObject2D, "uIsDrawingText", false);
+ vertexAttribPointer("aVertex2d", programObject2D, "aVertex", 3, rectBuffer);
+ disableVertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord");
+ curContext.drawArrays(curContext.LINE_LOOP, 0, rectVerts.length / 3);
+ }
+
+ if (doFill) {
+ curContext.useProgram(programObject3D);
+ uniformMatrix("uModel3d", programObject3D, "uModel", false, model.array());
+ uniformMatrix("uView3d", programObject3D, "uView", false, view.array());
+
+ // fix stitching problems. (lines get occluded by triangles
+ // since they share the same depth values). This is not entirely
+ // working, but it's a start for drawing the outline. So
+ // developers can start playing around with styles.
+ curContext.enable(curContext.POLYGON_OFFSET_FILL);
+ curContext.polygonOffset(1, 1);
+
+ uniformf("color3d", programObject3D, "uColor", fillStyle);
+
+ if(lightCount > 0){
+ var v = new PMatrix3D();
+ v.set(view);
+
+ var m = new PMatrix3D();
+ m.set(model);
+
+ v.mult(m);
+
+ var normalMatrix = new PMatrix3D();
+ normalMatrix.set(v);
+ normalMatrix.invert();
+ normalMatrix.transpose();
+
+ uniformMatrix("uNormalTransform3d", programObject3D, "uNormalTransform", false, normalMatrix.array());
+ vertexAttribPointer("aNormal3d", programObject3D, "aNormal", 3, rectNormBuffer);
+ }
+ else{
+ disableVertexAttribPointer("normal3d", programObject3D, "aNormal");
+ }
+
+ vertexAttribPointer("vertex3d", programObject3D, "aVertex", 3, rectBuffer);
+
+ curContext.drawArrays(curContext.TRIANGLE_FAN, 0, rectVerts.length / 3);
+ curContext.disable(curContext.POLYGON_OFFSET_FILL);
+ }
+ };
+
+ /**
+ * Draws an ellipse (oval) in the display window. An ellipse with an equal <b>width</b> and <b>height</b> is a circle.
+ * The first two parameters set the location, the third sets the width, and the fourth sets the height. The origin may be
+ * changed with the <b>ellipseMode()</b> function.
+ *
+ * @param {float|int} x x-coordinate of the ellipse
+ * @param {float|int} y y-coordinate of the ellipse
+ * @param {float|int} width width of the ellipse
+ * @param {float|int} height height of the ellipse
+ *
+ * @see ellipseMode
+ */
+ Drawing2D.prototype.ellipse = function(x, y, width, height) {
+ x = x || 0;
+ y = y || 0;
+
+ if (width <= 0 && height <= 0) {
+ return;
+ }
+
+ if (curEllipseMode === PConstants.RADIUS) {
+ width *= 2;
+ height *= 2;
+ } else if (curEllipseMode === PConstants.CORNERS) {
+ width = width - x;
+ height = height - y;
+ x += width / 2;
+ y += height / 2;
+ } else if (curEllipseMode === PConstants.CORNER) {
+ x += width / 2;
+ y += height / 2;
+ }
+
+ // Shortcut for drawing a 2D circle
+ if (width === height) {
+ curContext.beginPath();
+ curContext.arc(x, y, width / 2, 0, PConstants.TWO_PI, false);
+ executeContextFill();
+ executeContextStroke();
+ } else {
+ var w = width / 2,
+ h = height / 2,
+ C = 0.5522847498307933,
+ c_x = C * w,
+ c_y = C * h;
+
+ p.beginShape();
+ p.vertex(x + w, y);
+ p.bezierVertex(x + w, y - c_y, x + c_x, y - h, x, y - h);
+ p.bezierVertex(x - c_x, y - h, x - w, y - c_y, x - w, y);
+ p.bezierVertex(x - w, y + c_y, x - c_x, y + h, x, y + h);
+ p.bezierVertex(x + c_x, y + h, x + w, y + c_y, x + w, y);
+ p.endShape();
+ }
+ };
+
+ Drawing3D.prototype.ellipse = function(x, y, width, height) {
+ x = x || 0;
+ y = y || 0;
+
+ if (width <= 0 && height <= 0) {
+ return;
+ }
+
+ if (curEllipseMode === PConstants.RADIUS) {
+ width *= 2;
+ height *= 2;
+ } else if (curEllipseMode === PConstants.CORNERS) {
+ width = width - x;
+ height = height - y;
+ x += width / 2;
+ y += height / 2;
+ } else if (curEllipseMode === PConstants.CORNER) {
+ x += width / 2;
+ y += height / 2;
+ }
+
+ var w = width / 2,
+ h = height / 2,
+ C = 0.5522847498307933,
+ c_x = C * w,
+ c_y = C * h;
+
+ p.beginShape();
+ p.vertex(x + w, y);
+ p.bezierVertex(x + w, y - c_y, 0, x + c_x, y - h, 0, x, y - h, 0);
+ p.bezierVertex(x - c_x, y - h, 0, x - w, y - c_y, 0, x - w, y, 0);
+ p.bezierVertex(x - w, y + c_y, 0, x - c_x, y + h, 0, x, y + h, 0);
+ p.bezierVertex(x + c_x, y + h, 0, x + w, y + c_y, 0, x + w, y, 0);
+ p.endShape();
+
+ if (doFill) {
+ //temporary workaround to not working fills for bezier -- will fix later
+ var xAv = 0, yAv = 0, i, j;
+ for (i = 0; i < vertArray.length; i++) {
+ xAv += vertArray[i][0];
+ yAv += vertArray[i][1];
+ }
+ xAv /= vertArray.length;
+ yAv /= vertArray.length;
+ var vert = [],
+ fillVertArray = [],
+ colorVertArray = [];
+ vert[0] = xAv;
+ vert[1] = yAv;
+ vert[2] = 0;
+ vert[3] = 0;
+ vert[4] = 0;
+ vert[5] = fillStyle[0];
+ vert[6] = fillStyle[1];
+ vert[7] = fillStyle[2];
+ vert[8] = fillStyle[3];
+ vert[9] = strokeStyle[0];
+ vert[10] = strokeStyle[1];
+ vert[11] = strokeStyle[2];
+ vert[12] = strokeStyle[3];
+ vert[13] = normalX;
+ vert[14] = normalY;
+ vert[15] = normalZ;
+ vertArray.unshift(vert);
+ for (i = 0; i < vertArray.length; i++) {
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(vertArray[i][j]);
+ }
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(vertArray[i][j]);
+ }
+ }
+ fill3D(fillVertArray, "TRIANGLE_FAN", colorVertArray);
+ }
+ };
+
+ /**
+ * Sets the current normal vector. This is for drawing three dimensional shapes and surfaces and
+ * specifies a vector perpendicular to the surface of the shape which determines how lighting affects
+ * it. Processing attempts to automatically assign normals to shapes, but since that's imperfect,
+ * this is a better option when you want more control. This function is identical to glNormal3f() in OpenGL.
+ *
+ * @param {float} nx x direction
+ * @param {float} ny y direction
+ * @param {float} nz z direction
+ *
+ * @see beginShape
+ * @see endShape
+ * @see lights
+ */
+ p.normal = function(nx, ny, nz) {
+ if (arguments.length !== 3 || !(typeof nx === "number" && typeof ny === "number" && typeof nz === "number")) {
+ throw "normal() requires three numeric arguments.";
+ }
+
+ normalX = nx;
+ normalY = ny;
+ normalZ = nz;
+
+ if (curShape !== 0) {
+ if (normalMode === PConstants.NORMAL_MODE_AUTO) {
+ normalMode = PConstants.NORMAL_MODE_SHAPE;
+ } else if (normalMode === PConstants.NORMAL_MODE_SHAPE) {
+ normalMode = PConstants.NORMAL_MODE_VERTEX;
+ }
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Raster drawing functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Saves an image from the display window. Images are saved in TIFF, TARGA, JPEG, and PNG format
+ * depending on the extension within the filename parameter. For example, "image.tif" will have
+ * a TIFF image and "image.png" will save a PNG image. If no extension is included in the filename,
+ * the image will save in TIFF format and .tif will be added to the name. These files are saved to
+ * the sketch's folder, which may be opened by selecting "Show sketch folder" from the "Sketch" menu.
+ * It is not possible to use save() while running the program in a web browser. All images saved
+ * from the main drawing window will be opaque. To save images without a background, use createGraphics().
+ *
+ * @param {String} filename any sequence of letters and numbers
+ *
+ * @see saveFrame
+ * @see createGraphics
+ */
+ p.save = function(file, img) {
+ // file is unused at the moment
+ // may implement this differently in later release
+ if (img !== undef) {
+ return window.open(img.toDataURL(),"_blank");
+ }
+ return window.open(p.externals.canvas.toDataURL(),"_blank");
+ };
+
+ var saveNumber = 0;
+
+ p.saveFrame = function(file) {
+ if(file === undef) {
+ // use default name template if parameter is not specified
+ file = "screen-####.png";
+ }
+ // Increment changeable part: screen-0000.png, screen-0001.png, ...
+ var frameFilename = file.replace(/#+/, function(all) {
+ var s = "" + (saveNumber++);
+ while(s.length < all.length) {
+ s = "0" + s;
+ }
+ return s;
+ });
+ p.save(frameFilename);
+ };
+
+ var utilityContext2d = document.createElement("canvas").getContext("2d");
+
+ var canvasDataCache = [undef, undef, undef]; // we need three for now
+
+ function getCanvasData(obj, w, h) {
+ var canvasData = canvasDataCache.shift();
+
+ if (canvasData === undef) {
+ canvasData = {};
+ canvasData.canvas = document.createElement("canvas");
+ canvasData.context = canvasData.canvas.getContext('2d');
+ }
+
+ canvasDataCache.push(canvasData);
+
+ var canvas = canvasData.canvas, context = canvasData.context,
+ width = w || obj.width, height = h || obj.height;
+
+ canvas.width = width;
+ canvas.height = height;
+
+ if (!obj) {
+ context.clearRect(0, 0, width, height);
+ } else if ("data" in obj) { // ImageData
+ context.putImageData(obj, 0, 0);
+ } else {
+ context.clearRect(0, 0, width, height);
+ context.drawImage(obj, 0, 0, width, height);
+ }
+ return canvasData;
+ }
+
+ /**
+ * Handle the sketch code for pixels[] and pixels.length
+ * parser code converts pixels[] to getPixels()
+ * or setPixels(), .length becomes getLength()
+ */
+ function buildPixelsObject(pImage) {
+ return {
+
+ getLength: (function(aImg) {
+ return function() {
+ if (aImg.isRemote) {
+ throw "Image is loaded remotely. Cannot get length.";
+ } else {
+ return aImg.imageData.data.length ? aImg.imageData.data.length/4 : 0;
+ }
+ };
+ }(pImage)),
+
+ getPixel: (function(aImg) {
+ return function(i) {
+ var offset = i*4,
+ data = aImg.imageData.data;
+
+ if (aImg.isRemote) {
+ throw "Image is loaded remotely. Cannot get pixels.";
+ }
+
+ return (data[offset+3] << 24) & PConstants.ALPHA_MASK |
+ (data[offset] << 16) & PConstants.RED_MASK |
+ (data[offset+1] << 8) & PConstants.GREEN_MASK |
+ data[offset+2] & PConstants.BLUE_MASK;
+ };
+ }(pImage)),
+
+ setPixel: (function(aImg) {
+ return function(i, c) {
+ var offset = i*4,
+ data = aImg.imageData.data;
+
+ if (aImg.isRemote) {
+ throw "Image is loaded remotely. Cannot set pixel.";
+ }
+
+ data[offset+0] = (c & PConstants.RED_MASK) >>> 16;
+ data[offset+1] = (c & PConstants.GREEN_MASK) >>> 8;
+ data[offset+2] = (c & PConstants.BLUE_MASK);
+ data[offset+3] = (c & PConstants.ALPHA_MASK) >>> 24;
+ aImg.__isDirty = true;
+ };
+ }(pImage)),
+
+ toArray: (function(aImg) {
+ return function() {
+ var arr = [],
+ data = aImg.imageData.data,
+ length = aImg.width * aImg.height;
+
+ if (aImg.isRemote) {
+ throw "Image is loaded remotely. Cannot get pixels.";
+ }
+
+ for (var i = 0, offset = 0; i < length; i++, offset += 4) {
+ arr.push( (data[offset+3] << 24) & PConstants.ALPHA_MASK |
+ (data[offset] << 16) & PConstants.RED_MASK |
+ (data[offset+1] << 8) & PConstants.GREEN_MASK |
+ data[offset+2] & PConstants.BLUE_MASK );
+ }
+ return arr;
+ };
+ }(pImage)),
+
+ set: (function(aImg) {
+ return function(arr) {
+ var offset,
+ data,
+ c;
+ if (this.isRemote) {
+ throw "Image is loaded remotely. Cannot set pixels.";
+ }
+
+ data = aImg.imageData.data;
+ for (var i = 0, aL = arr.length; i < aL; i++) {
+ c = arr[i];
+ offset = i*4;
+
+ data[offset+0] = (c & PConstants.RED_MASK) >>> 16;
+ data[offset+1] = (c & PConstants.GREEN_MASK) >>> 8;
+ data[offset+2] = (c & PConstants.BLUE_MASK);
+ data[offset+3] = (c & PConstants.ALPHA_MASK) >>> 24;
+ }
+ aImg.__isDirty = true;
+ };
+ }(pImage))
+
+ };
+ }
+
+ /**
+ * Datatype for storing images. Processing can display .gif, .jpg, .tga, and .png images. Images may be
+ * displayed in 2D and 3D space. Before an image is used, it must be loaded with the loadImage() function.
+ * The PImage object contains fields for the width and height of the image, as well as an array called
+ * pixels[] which contains the values for every pixel in the image. A group of methods, described below,
+ * allow easy access to the image's pixels and alpha channel and simplify the process of compositing.
+ * Before using the pixels[] array, be sure to use the loadPixels() method on the image to make sure that the
+ * pixel data is properly loaded. To create a new image, use the createImage() function (do not use new PImage()).
+ *
+ * @param {int} width image width
+ * @param {int} height image height
+ * @param {MODE} format Either RGB, ARGB, ALPHA (grayscale alpha channel)
+ *
+ * @returns {PImage}
+ *
+ * @see loadImage
+ * @see imageMode
+ * @see createImage
+ */
+ var PImage = function(aWidth, aHeight, aFormat) {
+
+ // Keep track of whether or not the cached imageData has been touched.
+ this.__isDirty = false;
+
+ if (aWidth instanceof HTMLImageElement) {
+ // convert an <img> to a PImage
+ this.fromHTMLImageData(aWidth);
+ } else if (aHeight || aFormat) {
+ this.width = aWidth || 1;
+ this.height = aHeight || 1;
+
+ // Stuff a canvas into sourceImg so image() calls can use drawImage like an <img>
+ var canvas = this.sourceImg = document.createElement("canvas");
+ canvas.width = this.width;
+ canvas.height = this.height;
+
+ var imageData = this.imageData = canvas.getContext('2d').createImageData(this.width, this.height);
+ this.format = (aFormat === PConstants.ARGB || aFormat === PConstants.ALPHA) ? aFormat : PConstants.RGB;
+ if (this.format === PConstants.RGB) {
+ // Set the alpha channel of an RGB image to opaque.
+ for (var i = 3, data = this.imageData.data, len = data.length; i < len; i += 4) {
+ data[i] = 255;
+ }
+ }
+
+ this.__isDirty = true;
+ this.updatePixels();
+ } else {
+ this.width = 0;
+ this.height = 0;
+ this.imageData = utilityContext2d.createImageData(1, 1);
+ this.format = PConstants.ARGB;
+ }
+
+ this.pixels = buildPixelsObject(this);
+ };
+ PImage.prototype = {
+
+ /**
+ * Temporary hack to deal with cross-Processing-instance created PImage. See
+ * tickets #1623 and #1644.
+ */
+ __isPImage: true,
+
+ /**
+ * @member PImage
+ * Updates the image with the data in its pixels[] array. Use in conjunction with loadPixels(). If
+ * you're only reading pixels from the array, there's no need to call updatePixels().
+ * Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the rule
+ * is that any time you want to manipulate the pixels[] array, you must first call loadPixels(), and
+ * after changes have been made, call updatePixels(). Even if the renderer may not seem to use this
+ * function in the current Processing release, this will always be subject to change.
+ * Currently, none of the renderers use the additional parameters to updatePixels().
+ */
+ updatePixels: function() {
+ var canvas = this.sourceImg;
+ if (canvas && canvas instanceof HTMLCanvasElement && this.__isDirty) {
+ canvas.getContext('2d').putImageData(this.imageData, 0, 0);
+ }
+ this.__isDirty = false;
+ },
+
+ fromHTMLImageData: function(htmlImg) {
+ // convert an <img> to a PImage
+ var canvasData = getCanvasData(htmlImg);
+ try {
+ var imageData = canvasData.context.getImageData(0, 0, htmlImg.width, htmlImg.height);
+ this.fromImageData(imageData);
+ } catch(e) {
+ if (htmlImg.width && htmlImg.height) {
+ this.isRemote = true;
+ this.width = htmlImg.width;
+ this.height = htmlImg.height;
+ }
+ }
+ this.sourceImg = htmlImg;
+ },
+
+ 'get': function(x, y, w, h) {
+ if (!arguments.length) {
+ return p.get(this);
+ }
+ if (arguments.length === 2) {
+ return p.get(x, y, this);
+ }
+ if (arguments.length === 4) {
+ return p.get(x, y, w, h, this);
+ }
+ },
+
+ /**
+ * @member PImage
+ * Changes the color of any pixel or writes an image directly into the image. The x and y parameter
+ * specify the pixel or the upper-left corner of the image. The color parameter specifies the color value.
+ * Setting the color of a single pixel with set(x, y) is easy, but not as fast as putting the data
+ * directly into pixels[]. The equivalent statement to "set(x, y, #000000)" using pixels[] is
+ * "pixels[y*width+x] = #000000". Processing requires calling loadPixels() to load the display window
+ * data into the pixels[] array before getting the values and calling updatePixels() to update the window.
+ *
+ * @param {int} x x-coordinate of the pixel or upper-left corner of the image
+ * @param {int} y y-coordinate of the pixel or upper-left corner of the image
+ * @param {color} color any value of the color datatype
+ *
+ * @see get
+ * @see pixels[]
+ * @see copy
+ */
+ 'set': function(x, y, c) {
+ p.set(x, y, c, this);
+ this.__isDirty = true;
+ },
+
+ /**
+ * @member PImage
+ * Blends a region of pixels into the image specified by the img parameter. These copies utilize full
+ * alpha channel support and a choice of the following modes to blend the colors of source pixels (A)
+ * with the ones of pixels in the destination image (B):
+ * BLEND - linear interpolation of colours: C = A*factor + B
+ * ADD - additive blending with white clip: C = min(A*factor + B, 255)
+ * SUBTRACT - subtractive blending with black clip: C = max(B - A*factor, 0)
+ * DARKEST - only the darkest colour succeeds: C = min(A*factor, B)
+ * LIGHTEST - only the lightest colour succeeds: C = max(A*factor, B)
+ * DIFFERENCE - subtract colors from underlying image.
+ * EXCLUSION - similar to DIFFERENCE, but less extreme.
+ * MULTIPLY - Multiply the colors, result will always be darker.
+ * SCREEN - Opposite multiply, uses inverse values of the colors.
+ * OVERLAY - A mix of MULTIPLY and SCREEN. Multiplies dark values, and screens light values.
+ * HARD_LIGHT - SCREEN when greater than 50% gray, MULTIPLY when lower.
+ * SOFT_LIGHT - Mix of DARKEST and LIGHTEST. Works like OVERLAY, but not as harsh.
+ * DODGE - Lightens light tones and increases contrast, ignores darks. Called "Color Dodge" in Illustrator and Photoshop.
+ * BURN - Darker areas are applied, increasing contrast, ignores lights. Called "Color Burn" in Illustrator and Photoshop.
+ * All modes use the alpha information (highest byte) of source image pixels as the blending factor.
+ * If the source and destination regions are different sizes, the image will be automatically resized to
+ * match the destination size. If the srcImg parameter is not used, the display window is used as the source image.
+ * This function ignores imageMode().
+ *
+ * @param {int} x X coordinate of the source's upper left corner
+ * @param {int} y Y coordinate of the source's upper left corner
+ * @param {int} width source image width
+ * @param {int} height source image height
+ * @param {int} dx X coordinate of the destinations's upper left corner
+ * @param {int} dy Y coordinate of the destinations's upper left corner
+ * @param {int} dwidth destination image width
+ * @param {int} dheight destination image height
+ * @param {PImage} srcImg an image variable referring to the source image
+ * @param {MODE} MODE Either BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, DIFFERENCE, EXCLUSION,
+ * MULTIPLY, SCREEN, OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, BURN
+ *
+ * @see alpha
+ * @see copy
+ */
+ blend: function(srcImg, x, y, width, height, dx, dy, dwidth, dheight, MODE) {
+ if (arguments.length === 9) {
+ p.blend(this, srcImg, x, y, width, height, dx, dy, dwidth, dheight, this);
+ } else if (arguments.length === 10) {
+ p.blend(srcImg, x, y, width, height, dx, dy, dwidth, dheight, MODE, this);
+ }
+ delete this.sourceImg;
+ },
+
+ /**
+ * @member PImage
+ * Copies a region of pixels from one image into another. If the source and destination regions
+ * aren't the same size, it will automatically resize source pixels to fit the specified target region.
+ * No alpha information is used in the process, however if the source image has an alpha channel set,
+ * it will be copied as well. This function ignores imageMode().
+ *
+ * @param {int} sx X coordinate of the source's upper left corner
+ * @param {int} sy Y coordinate of the source's upper left corner
+ * @param {int} swidth source image width
+ * @param {int} sheight source image height
+ * @param {int} dx X coordinate of the destinations's upper left corner
+ * @param {int} dy Y coordinate of the destinations's upper left corner
+ * @param {int} dwidth destination image width
+ * @param {int} dheight destination image height
+ * @param {PImage} srcImg an image variable referring to the source image
+ *
+ * @see alpha
+ * @see blend
+ */
+ copy: function(srcImg, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {
+ if (arguments.length === 8) {
+ p.blend(this, srcImg, sx, sy, swidth, sheight, dx, dy, dwidth, PConstants.REPLACE, this);
+ } else if (arguments.length === 9) {
+ p.blend(srcImg, sx, sy, swidth, sheight, dx, dy, dwidth, dheight, PConstants.REPLACE, this);
+ }
+ delete this.sourceImg;
+ },
+
+ /**
+ * @member PImage
+ * Filters an image as defined by one of the following modes:
+ * THRESHOLD - converts the image to black and white pixels depending if they are above or below
+ * the threshold defined by the level parameter. The level must be between 0.0 (black) and 1.0(white).
+ * If no level is specified, 0.5 is used.
+ * GRAY - converts any colors in the image to grayscale equivalents
+ * INVERT - sets each pixel to its inverse value
+ * POSTERIZE - limits each channel of the image to the number of colors specified as the level parameter
+ * BLUR - executes a Guassian blur with the level parameter specifying the extent of the blurring.
+ * If no level parameter is used, the blur is equivalent to Guassian blur of radius 1.
+ * OPAQUE - sets the alpha channel to entirely opaque.
+ * ERODE - reduces the light areas with the amount defined by the level parameter.
+ * DILATE - increases the light areas with the amount defined by the level parameter
+ *
+ * @param {MODE} MODE Either THRESHOLD, GRAY, INVERT, POSTERIZE, BLUR, OPAQUE, ERODE, or DILATE
+ * @param {int|float} param in the range from 0 to 1
+ */
+ filter: function(mode, param) {
+ if (arguments.length === 2) {
+ p.filter(mode, param, this);
+ } else if (arguments.length === 1) {
+ // no param specified, send null to show its invalid
+ p.filter(mode, null, this);
+ }
+ delete this.sourceImg;
+ },
+
+ /**
+ * @member PImage
+ * Saves the image into a file. Images are saved in TIFF, TARGA, JPEG, and PNG format depending on
+ * the extension within the filename parameter. For example, "image.tif" will have a TIFF image and
+ * "image.png" will save a PNG image. If no extension is included in the filename, the image will save
+ * in TIFF format and .tif will be added to the name. These files are saved to the sketch's folder,
+ * which may be opened by selecting "Show sketch folder" from the "Sketch" menu. It is not possible to
+ * use save() while running the program in a web browser.
+ * To save an image created within the code, rather than through loading, it's necessary to make the
+ * image with the createImage() function so it is aware of the location of the program and can therefore
+ * save the file to the right place. See the createImage() reference for more information.
+ *
+ * @param {String} filename a sequence of letters and numbers
+ */
+ save: function(file){
+ p.save(file,this);
+ },
+
+ /**
+ * @member PImage
+ * Resize the image to a new width and height. To make the image scale proportionally, use 0 as the
+ * value for the wide or high parameter.
+ *
+ * @param {int} wide the resized image width
+ * @param {int} high the resized image height
+ *
+ * @see get
+ */
+ resize: function(w, h) {
+ if (this.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot resize.";
+ }
+ if (this.width !== 0 || this.height !== 0) {
+ // make aspect ratio if w or h is 0
+ if (w === 0 && h !== 0) {
+ w = Math.floor(this.width / this.height * h);
+ } else if (h === 0 && w !== 0) {
+ h = Math.floor(this.height / this.width * w);
+ }
+ // put 'this.imageData' into a new canvas
+ var canvas = getCanvasData(this.imageData).canvas;
+ // pull imageData object out of canvas into ImageData object
+ var imageData = getCanvasData(canvas, w, h).context.getImageData(0, 0, w, h);
+ // set this as new pimage
+ this.fromImageData(imageData);
+ }
+ },
+
+ /**
+ * @member PImage
+ * Masks part of an image from displaying by loading another image and using it as an alpha channel.
+ * This mask image should only contain grayscale data, but only the blue color channel is used. The
+ * mask image needs to be the same size as the image to which it is applied.
+ * In addition to using a mask image, an integer array containing the alpha channel data can be
+ * specified directly. This method is useful for creating dynamically generated alpha masks. This
+ * array must be of the same length as the target image's pixels array and should contain only grayscale
+ * data of values between 0-255.
+ *
+ * @param {PImage} maskImg any PImage object used as the alpha channel for "img", needs to be same
+ * size as "img"
+ * @param {int[]} maskArray any array of Integer numbers used as the alpha channel, needs to be same
+ * length as the image's pixel array
+ */
+ mask: function(mask) {
+ var obj = this.toImageData(),
+ i,
+ size;
+
+ if (mask instanceof PImage || mask.__isPImage) {
+ if (mask.width === this.width && mask.height === this.height) {
+ mask = mask.toImageData();
+
+ for (i = 2, size = this.width * this.height * 4; i < size; i += 4) {
+ // using it as an alpha channel
+ obj.data[i + 1] = mask.data[i];
+ // but only the blue color channel
+ }
+ } else {
+ throw "mask must have the same dimensions as PImage.";
+ }
+ } else if (mask instanceof Array) {
+ if (this.width * this.height === mask.length) {
+ for (i = 0, size = mask.length; i < size; ++i) {
+ obj.data[i * 4 + 3] = mask[i];
+ }
+ } else {
+ throw "mask array must be the same length as PImage pixels array.";
+ }
+ }
+
+ this.fromImageData(obj);
+ },
+
+ // These are intentionally left blank for PImages, we work live with pixels and draw as necessary
+ /**
+ * @member PImage
+ * Loads the pixel data for the image into its pixels[] array. This function must always be called
+ * before reading from or writing to pixels[].
+ * Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the
+ * rule is that any time you want to manipulate the pixels[] array, you must first call loadPixels(),
+ * and after changes have been made, call updatePixels(). Even if the renderer may not seem to use
+ * this function in the current Processing release, this will always be subject to change.
+ */
+ loadPixels: noop,
+
+ toImageData: function() {
+ if (this.isRemote) {
+ return this.sourceImg;
+ }
+
+ if (!this.__isDirty) {
+ return this.imageData;
+ }
+
+ var canvasData = getCanvasData(this.sourceImg);
+ return canvasData.context.getImageData(0, 0, this.width, this.height);
+ },
+
+ toDataURL: function() {
+ if (this.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot create dataURI.";
+ }
+ var canvasData = getCanvasData(this.imageData);
+ return canvasData.canvas.toDataURL();
+ },
+
+ fromImageData: function(canvasImg) {
+ var w = canvasImg.width,
+ h = canvasImg.height,
+ canvas = document.createElement('canvas'),
+ ctx = canvas.getContext('2d');
+
+ this.width = canvas.width = w;
+ this.height = canvas.height = h;
+
+ ctx.putImageData(canvasImg, 0, 0);
+
+ // changed for 0.9
+ this.format = PConstants.ARGB;
+
+ this.imageData = canvasImg;
+ this.sourceImg = canvas;
+ }
+ };
+
+ p.PImage = PImage;
+
+ /**
+ * Creates a new PImage (the datatype for storing images). This provides a fresh buffer of pixels to play
+ * with. Set the size of the buffer with the width and height parameters. The format parameter defines how
+ * the pixels are stored. See the PImage reference for more information.
+ * Be sure to include all three parameters, specifying only the width and height (but no format) will
+ * produce a strange error.
+ * Advanced users please note that createImage() should be used instead of the syntax new PImage().
+ *
+ * @param {int} width image width
+ * @param {int} height image height
+ * @param {MODE} format Either RGB, ARGB, ALPHA (grayscale alpha channel)
+ *
+ * @returns {PImage}
+ *
+ * @see PImage
+ * @see PGraphics
+ */
+ p.createImage = function(w, h, mode) {
+ return new PImage(w,h,mode);
+ };
+
+ // Loads an image for display. Type is an extension. Callback is fired on load.
+ /**
+ * Loads an image into a variable of type PImage. Four types of images ( .gif, .jpg, .tga, .png) images may
+ * be loaded. To load correctly, images must be located in the data directory of the current sketch. In most
+ * cases, load all images in setup() to preload them at the start of the program. Loading images inside draw()
+ * will reduce the speed of a program.
+ * The filename parameter can also be a URL to a file found online. For security reasons, a Processing sketch
+ * found online can only download files from the same server from which it came. Getting around this restriction
+ * requires a signed applet.
+ * The extension parameter is used to determine the image type in cases where the image filename does not end
+ * with a proper extension. Specify the extension as the second parameter to loadImage(), as shown in the
+ * third example on this page.
+ * If an image is not loaded successfully, the null value is returned and an error message will be printed to
+ * the console. The error message does not halt the program, however the null value may cause a NullPointerException
+ * if your code does not check whether the value returned from loadImage() is null.
+ * Depending on the type of error, a PImage object may still be returned, but the width and height of the image
+ * will be set to -1. This happens if bad image data is returned or cannot be decoded properly. Sometimes this happens
+ * with image URLs that produce a 403 error or that redirect to a password prompt, because loadImage() will attempt
+ * to interpret the HTML as image data.
+ *
+ * @param {String} filename name of file to load, can be .gif, .jpg, .tga, or a handful of other image
+ * types depending on your platform.
+ * @param {String} extension the type of image to load, for example "png", "gif", "jpg"
+ *
+ * @returns {PImage}
+ *
+ * @see PImage
+ * @see image
+ * @see imageMode
+ * @see background
+ */
+ p.loadImage = function(file, type, callback) {
+ // if type is specified, we just ignore it
+
+ var pimg;
+ // if image is in the preloader cache return a new PImage
+ if (curSketch.imageCache.images[file]) {
+ pimg = new PImage(curSketch.imageCache.images[file]);
+ pimg.loaded = true;
+ return pimg;
+ }
+ // else async load it
+ pimg = new PImage();
+ var img = document.createElement('img');
+
+ pimg.sourceImg = img;
+
+ img.onload = (function(aImage, aPImage, aCallback) {
+ var image = aImage;
+ var pimg = aPImage;
+ var callback = aCallback;
+ return function() {
+ // change the <img> object into a PImage now that its loaded
+ pimg.fromHTMLImageData(image);
+ pimg.loaded = true;
+ if (callback) {
+ callback();
+ }
+ };
+ }(img, pimg, callback));
+
+ img.src = file; // needs to be called after the img.onload function is declared or it wont work in opera
+ return pimg;
+ };
+
+ // async loading of large images, same functionality as loadImage above
+ /**
+ * This function load images on a separate thread so that your sketch does not freeze while images load during
+ * setup(). While the image is loading, its width and height will be 0. If an error occurs while loading the image,
+ * its width and height will be set to -1. You'll know when the image has loaded properly because its width and
+ * height will be greater than 0. Asynchronous image loading (particularly when downloading from a server) can
+ * dramatically improve performance.
+ * The extension parameter is used to determine the image type in cases where the image filename does not end
+ * with a proper extension. Specify the extension as the second parameter to requestImage().
+ *
+ * @param {String} filename name of file to load, can be .gif, .jpg, .tga, or a handful of other image
+ * types depending on your platform.
+ * @param {String} extension the type of image to load, for example "png", "gif", "jpg"
+ *
+ * @returns {PImage}
+ *
+ * @see PImage
+ * @see loadImage
+ */
+ p.requestImage = p.loadImage;
+
+ function get$2(x,y) {
+ var data;
+ // return the color at x,y (int) of curContext
+ if (x >= p.width || x < 0 || y < 0 || y >= p.height) {
+ // x,y is outside image return transparent black
+ return 0;
+ }
+
+ // loadPixels() has been called
+ if (isContextReplaced) {
+ var offset = ((0|x) + p.width * (0|y)) * 4;
+ data = p.imageData.data;
+ return (data[offset + 3] << 24) & PConstants.ALPHA_MASK |
+ (data[offset] << 16) & PConstants.RED_MASK |
+ (data[offset + 1] << 8) & PConstants.GREEN_MASK |
+ data[offset + 2] & PConstants.BLUE_MASK;
+ }
+
+ // x,y is inside canvas space
+ data = p.toImageData(0|x, 0|y, 1, 1).data;
+ return (data[3] << 24) & PConstants.ALPHA_MASK |
+ (data[0] << 16) & PConstants.RED_MASK |
+ (data[1] << 8) & PConstants.GREEN_MASK |
+ data[2] & PConstants.BLUE_MASK;
+ }
+ function get$3(x,y,img) {
+ if (img.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot get x,y.";
+ }
+ // PImage.get(x,y) was called, return the color (int) at x,y of img
+ var offset = y * img.width * 4 + (x * 4),
+ data = img.imageData.data;
+ return (data[offset + 3] << 24) & PConstants.ALPHA_MASK |
+ (data[offset] << 16) & PConstants.RED_MASK |
+ (data[offset + 1] << 8) & PConstants.GREEN_MASK |
+ data[offset + 2] & PConstants.BLUE_MASK;
+ }
+ function get$4(x, y, w, h) {
+ // return a PImage of w and h from cood x,y of curContext
+ var c = new PImage(w, h, PConstants.ARGB);
+ c.fromImageData(p.toImageData(x, y, w, h));
+ return c;
+ }
+ function get$5(x, y, w, h, img) {
+ if (img.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot get x,y,w,h.";
+ }
+ // PImage.get(x,y,w,h) was called, return x,y,w,h PImage of img
+ // offset start point needs to be *4
+ var c = new PImage(w, h, PConstants.ARGB), cData = c.imageData.data,
+ imgWidth = img.width, imgHeight = img.height, imgData = img.imageData.data;
+ // Don't need to copy pixels from the image outside ranges.
+ var startRow = Math.max(0, -y), startColumn = Math.max(0, -x),
+ stopRow = Math.min(h, imgHeight - y), stopColumn = Math.min(w, imgWidth - x);
+ for (var i = startRow; i < stopRow; ++i) {
+ var sourceOffset = ((y + i) * imgWidth + (x + startColumn)) * 4;
+ var targetOffset = (i * w + startColumn) * 4;
+ for (var j = startColumn; j < stopColumn; ++j) {
+ cData[targetOffset++] = imgData[sourceOffset++];
+ cData[targetOffset++] = imgData[sourceOffset++];
+ cData[targetOffset++] = imgData[sourceOffset++];
+ cData[targetOffset++] = imgData[sourceOffset++];
+ }
+ }
+ c.__isDirty = true;
+ return c;
+ }
+
+ // Gets a single pixel or block of pixels from the current Canvas Context or a PImage
+ /**
+ * Reads the color of any pixel or grabs a section of an image. If no parameters are specified, the entire
+ * image is returned. Get the value of one pixel by specifying an x,y coordinate. Get a section of the display
+ * window by specifying an additional width and height parameter. If the pixel requested is outside of the image
+ * window, black is returned. The numbers returned are scaled according to the current color ranges, but only RGB
+ * values are returned by this function. For example, even though you may have drawn a shape with colorMode(HSB),
+ * the numbers returned will be in RGB.
+ * Getting the color of a single pixel with get(x, y) is easy, but not as fast as grabbing the data directly
+ * from pixels[]. The equivalent statement to "get(x, y)" using pixels[] is "pixels[y*width+x]". Processing
+ * requires calling loadPixels() to load the display window data into the pixels[] array before getting the values.
+ * This function ignores imageMode().
+ *
+ * @param {int} x x-coordinate of the pixel
+ * @param {int} y y-coordinate of the pixel
+ * @param {int} width width of pixel rectangle to get
+ * @param {int} height height of pixel rectangle to get
+ *
+ * @returns {Color|PImage}
+ *
+ * @see set
+ * @see pixels[]
+ * @see imageMode
+ */
+ p.get = function(x, y, w, h, img) {
+ // for 0 2 and 4 arguments use curContext, otherwise PImage.get was called
+ if (img !== undefined) {
+ return get$5(x, y, w, h, img);
+ }
+ if (h !== undefined) {
+ return get$4(x, y, w, h);
+ }
+ if (w !== undefined) {
+ return get$3(x, y, w);
+ }
+ if (y !== undefined) {
+ return get$2(x, y);
+ }
+ if (x !== undefined) {
+ // PImage.get() was called, return a new PImage
+ return get$5(0, 0, x.width, x.height, x);
+ }
+
+ return get$4(0, 0, p.width, p.height);
+ };
+
+ /**
+ * Creates and returns a new <b>PGraphics</b> object of the types P2D, P3D, and JAVA2D. Use this class if you need to draw
+ * into an off-screen graphics buffer. It's not possible to use <b>createGraphics()</b> with OPENGL, because it doesn't
+ * allow offscreen use. The DXF and PDF renderers require the filename parameter. <br /><br /> It's important to call
+ * any drawing commands between beginDraw() and endDraw() statements. This is also true for any commands that affect
+ * drawing, such as smooth() or colorMode().<br /><br /> Unlike the main drawing surface which is completely opaque,
+ * surfaces created with createGraphics() can have transparency. This makes it possible to draw into a graphics and
+ * maintain the alpha channel.
+ *
+ * @param {int} width width in pixels
+ * @param {int} height height in pixels
+ * @param {int} renderer Either P2D, P3D, JAVA2D, PDF, DXF
+ * @param {String} filename the name of the file (not supported yet)
+ */
+ p.createGraphics = function(w, h, render) {
+ var pg = new Processing();
+ pg.size(w, h, render);
+ pg.background(0,0);
+ return pg;
+ };
+
+ // pixels caching
+ function resetContext() {
+ if(isContextReplaced) {
+ curContext = originalContext;
+ isContextReplaced = false;
+
+ p.updatePixels();
+ }
+ }
+ function SetPixelContextWrapper() {
+ function wrapFunction(newContext, name) {
+ function wrapper() {
+ resetContext();
+ curContext[name].apply(curContext, arguments);
+ }
+ newContext[name] = wrapper;
+ }
+ function wrapProperty(newContext, name) {
+ function getter() {
+ resetContext();
+ return curContext[name];
+ }
+ function setter(value) {
+ resetContext();
+ curContext[name] = value;
+ }
+ p.defineProperty(newContext, name, { get: getter, set: setter });
+ }
+ for(var n in curContext) {
+ if(typeof curContext[n] === 'function') {
+ wrapFunction(this, n);
+ } else {
+ wrapProperty(this, n);
+ }
+ }
+ }
+ function replaceContext() {
+ if(isContextReplaced) {
+ return;
+ }
+ p.loadPixels();
+ if(proxyContext === null) {
+ originalContext = curContext;
+ proxyContext = new SetPixelContextWrapper();
+ }
+ isContextReplaced = true;
+ curContext = proxyContext;
+ setPixelsCached = 0;
+ }
+
+ function set$3(x, y, c) {
+ if (x < p.width && x >= 0 && y >= 0 && y < p.height) {
+ replaceContext();
+ p.pixels.setPixel((0|x)+p.width*(0|y), c);
+ if(++setPixelsCached > maxPixelsCached) {
+ resetContext();
+ }
+ }
+ }
+ function set$4(x, y, obj, img) {
+ if (img.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot set x,y.";
+ }
+ var c = p.color.toArray(obj);
+ var offset = y * img.width * 4 + (x*4);
+ var data = img.imageData.data;
+ data[offset] = c[0];
+ data[offset+1] = c[1];
+ data[offset+2] = c[2];
+ data[offset+3] = c[3];
+ }
+
+ // Paints a pixel array into the canvas
+ /**
+ * Changes the color of any pixel or writes an image directly into the display window. The x and y parameters
+ * specify the pixel to change and the color parameter specifies the color value. The color parameter is affected
+ * by the current color mode (the default is RGB values from 0 to 255). When setting an image, the x and y
+ * parameters define the coordinates for the upper-left corner of the image.
+ * Setting the color of a single pixel with set(x, y) is easy, but not as fast as putting the data directly
+ * into pixels[]. The equivalent statement to "set(x, y, #000000)" using pixels[] is "pixels[y*width+x] = #000000".
+ * You must call loadPixels() to load the display window data into the pixels[] array before setting the values
+ * and calling updatePixels() to update the window with any changes. This function ignores imageMode().
+ *
+ * @param {int} x x-coordinate of the pixel
+ * @param {int} y y-coordinate of the pixel
+ * @param {Color} obj any value of the color datatype
+ * @param {PImage} img any valid variable of type PImage
+ *
+ * @see get
+ * @see pixels[]
+ * @see imageMode
+ */
+ p.set = function(x, y, obj, img) {
+ var color, oldFill;
+ if (arguments.length === 3) {
+ // called p.set(), was it with a color or a img ?
+ if (typeof obj === "number") {
+ set$3(x, y, obj);
+ } else if (obj instanceof PImage || obj.__isPImage) {
+ p.image(obj, x, y);
+ }
+ } else if (arguments.length === 4) {
+ // PImage.set(x,y,c) was called, set coordinate x,y color to c of img
+ set$4(x, y, obj, img);
+ }
+ };
+ p.imageData = {};
+
+ // handle the sketch code for pixels[]
+ // parser code converts pixels[] to getPixels() or setPixels(),
+ // .length becomes getLength()
+ /**
+ * Array containing the values for all the pixels in the display window. These values are of the color datatype.
+ * This array is the size of the display window. For example, if the image is 100x100 pixels, there will be 10000
+ * values and if the window is 200x300 pixels, there will be 60000 values. The index value defines the position
+ * of a value within the array. For example, the statment color b = pixels[230] will set the variable b to be
+ * equal to the value at that location in the array.
+ * Before accessing this array, the data must loaded with the loadPixels() function. After the array data has
+ * been modified, the updatePixels() function must be run to update the changes.
+ *
+ * @param {int} index must not exceed the size of the array
+ *
+ * @see loadPixels
+ * @see updatePixels
+ * @see get
+ * @see set
+ * @see PImage
+ */
+ p.pixels = {
+ getLength: function() { return p.imageData.data.length ? p.imageData.data.length/4 : 0; },
+ getPixel: function(i) {
+ var offset = i*4, data = p.imageData.data;
+ return (data[offset+3] << 24) & 0xff000000 |
+ (data[offset+0] << 16) & 0x00ff0000 |
+ (data[offset+1] << 8) & 0x0000ff00 |
+ data[offset+2] & 0x000000ff;
+ },
+ setPixel: function(i,c) {
+ var offset = i*4, data = p.imageData.data;
+ data[offset+0] = (c & 0x00ff0000) >>> 16; // RED_MASK
+ data[offset+1] = (c & 0x0000ff00) >>> 8; // GREEN_MASK
+ data[offset+2] = (c & 0x000000ff); // BLUE_MASK
+ data[offset+3] = (c & 0xff000000) >>> 24; // ALPHA_MASK
+ },
+ toArray: function() {
+ var arr = [], length = p.imageData.width * p.imageData.height, data = p.imageData.data;
+ for (var i = 0, offset = 0; i < length; i++, offset += 4) {
+ arr.push((data[offset+3] << 24) & 0xff000000 |
+ (data[offset+0] << 16) & 0x00ff0000 |
+ (data[offset+1] << 8) & 0x0000ff00 |
+ data[offset+2] & 0x000000ff);
+ }
+ return arr;
+ },
+ set: function(arr) {
+ for (var i = 0, aL = arr.length; i < aL; i++) {
+ this.setPixel(i, arr[i]);
+ }
+ }
+ };
+
+ // Gets a 1-Dimensional pixel array from Canvas
+ /**
+ * Loads the pixel data for the display window into the pixels[] array. This function must always be called
+ * before reading from or writing to pixels[].
+ * Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the rule is that
+ * any time you want to manipulate the pixels[] array, you must first call loadPixels(), and after changes
+ * have been made, call updatePixels(). Even if the renderer may not seem to use this function in the current
+ * Processing release, this will always be subject to change.
+ *
+ * @see pixels[]
+ * @see updatePixels
+ */
+ p.loadPixels = function() {
+ p.imageData = drawing.$ensureContext().getImageData(0, 0, p.width, p.height);
+ };
+
+ // Draws a 1-Dimensional pixel array to Canvas
+ /**
+ * Updates the display window with the data in the pixels[] array. Use in conjunction with loadPixels(). If
+ * you're only reading pixels from the array, there's no need to call updatePixels() unless there are changes.
+ * Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the rule is that
+ * any time you want to manipulate the pixels[] array, you must first call loadPixels(), and after changes
+ * have been made, call updatePixels(). Even if the renderer may not seem to use this function in the current
+ * Processing release, this will always be subject to change.
+ * Currently, none of the renderers use the additional parameters to updatePixels(), however this may be
+ * implemented in the future.
+ *
+ * @see loadPixels
+ * @see pixels[]
+ */
+ p.updatePixels = function() {
+ if (p.imageData) {
+ drawing.$ensureContext().putImageData(p.imageData, 0, 0);
+ }
+ };
+
+ /**
+ * Set various hints and hacks for the renderer. This is used to handle obscure rendering features that cannot be
+ * implemented in a consistent manner across renderers. Many options will often graduate to standard features
+ * instead of hints over time.
+ * hint(ENABLE_OPENGL_4X_SMOOTH) - Enable 4x anti-aliasing for OpenGL. This can help force anti-aliasing if
+ * it has not been enabled by the user. On some graphics cards, this can also be set by the graphics driver's
+ * control panel, however not all cards make this available. This hint must be called immediately after the
+ * size() command because it resets the renderer, obliterating any settings and anything drawn (and like size(),
+ * re-running the code that came before it again).
+ * hint(DISABLE_OPENGL_2X_SMOOTH) - In Processing 1.0, Processing always enables 2x smoothing when the OpenGL
+ * renderer is used. This hint disables the default 2x smoothing and returns the smoothing behavior found in
+ * earlier releases, where smooth() and noSmooth() could be used to enable and disable smoothing, though the
+ * quality was inferior.
+ * hint(ENABLE_NATIVE_FONTS) - Use the native version fonts when they are installed, rather than the bitmapped
+ * version from a .vlw file. This is useful with the JAVA2D renderer setting, as it will improve font rendering
+ * speed. This is not enabled by default, because it can be misleading while testing because the type will look
+ * great on your machine (because you have the font installed) but lousy on others' machines if the identical
+ * font is unavailable. This option can only be set per-sketch, and must be called before any use of textFont().
+ * hint(DISABLE_DEPTH_TEST) - Disable the zbuffer, allowing you to draw on top of everything at will. When depth
+ * testing is disabled, items will be drawn to the screen sequentially, like a painting. This hint is most often
+ * used to draw in 3D, then draw in 2D on top of it (for instance, to draw GUI controls in 2D on top of a 3D
+ * interface). Starting in release 0149, this will also clear the depth buffer. Restore the default with
+ * hint(ENABLE_DEPTH_TEST), but note that with the depth buffer cleared, any 3D drawing that happens later in
+ * draw() will ignore existing shapes on the screen.
+ * hint(ENABLE_DEPTH_SORT) - Enable primitive z-sorting of triangles and lines in P3D and OPENGL. This can slow
+ * performance considerably, and the algorithm is not yet perfect. Restore the default with hint(DISABLE_DEPTH_SORT).
+ * hint(DISABLE_OPENGL_ERROR_REPORT) - Speeds up the OPENGL renderer setting by not checking for errors while
+ * running. Undo with hint(ENABLE_OPENGL_ERROR_REPORT).
+ * As of release 0149, unhint() has been removed in favor of adding additional ENABLE/DISABLE constants to reset
+ * the default behavior. This prevents the double negatives, and also reinforces which hints can be enabled or disabled.
+ *
+ * @param {MODE} item constant: name of the hint to be enabled or disabled
+ *
+ * @see PGraphics
+ * @see createGraphics
+ * @see size
+ */
+ p.hint = function(which) {
+ var curContext = drawing.$ensureContext();
+ if (which === PConstants.DISABLE_DEPTH_TEST) {
+ curContext.disable(curContext.DEPTH_TEST);
+ curContext.depthMask(false);
+ curContext.clear(curContext.DEPTH_BUFFER_BIT);
+ }
+ else if (which === PConstants.ENABLE_DEPTH_TEST) {
+ curContext.enable(curContext.DEPTH_TEST);
+ curContext.depthMask(true);
+ }
+ else if (which === PConstants.ENABLE_OPENGL_2X_SMOOTH ||
+ which === PConstants.ENABLE_OPENGL_4X_SMOOTH){
+ renderSmooth = true;
+ }
+ else if (which === PConstants.DISABLE_OPENGL_2X_SMOOTH){
+ renderSmooth = false;
+ }
+ };
+
+ /**
+ * The background() function sets the color used for the background of the Processing window.
+ * The default background is light gray. In the <b>draw()</b> function, the background color is used to clear the display window at the beginning of each frame.
+ * An image can also be used as the background for a sketch, however its width and height must be the same size as the sketch window.
+ * To resize an image 'b' to the size of the sketch window, use b.resize(width, height).
+ * Images used as background will ignore the current <b>tint()</b> setting.
+ * For the main drawing surface, the alpha value will be ignored. However,
+ * alpha can be used on PGraphics objects from <b>createGraphics()</b>. This is
+ * the only way to set all the pixels partially transparent, for instance.
+ * If the 'gray' parameter is passed in the function sets the background to a grayscale value, based on the
+ * current colorMode.
+ * <p>
+ * Note that background() should be called before any transformations occur,
+ * because some implementations may require the current transformation matrix
+ * to be identity before drawing.
+ *
+ * @param {int|float} gray specifies a value between white and black
+ * @param {int|float} value1 red or hue value (depending on the current color mode)
+ * @param {int|float} value2 green or saturation value (depending on the current color mode)
+ * @param {int|float} value3 blue or brightness value (depending on the current color mode)
+ * @param {int|float} alpha opacity of the background
+ * @param {Color} color any value of the color datatype
+ * @param {int} hex color value in hexadecimal notation (i.e. #FFCC00 or 0xFFFFCC00)
+ * @param {PImage} image an instance of a PImage to use as a background
+ *
+ * @see #stroke()
+ * @see #fill()
+ * @see #tint()
+ * @see #colorMode()
+ */
+ var backgroundHelper = function(arg1, arg2, arg3, arg4) {
+ var obj;
+
+ if (arg1 instanceof PImage || arg1.__isPImage) {
+ obj = arg1;
+
+ if (!obj.loaded) {
+ throw "Error using image in background(): PImage not loaded.";
+ }
+ if(obj.width !== p.width || obj.height !== p.height){
+ throw "Background image must be the same dimensions as the canvas.";
+ }
+ } else {
+ obj = p.color(arg1, arg2, arg3, arg4);
+ }
+
+ backgroundObj = obj;
+ };
+
+ Drawing2D.prototype.background = function(arg1, arg2, arg3, arg4) {
+ if (arg1 !== undef) {
+ backgroundHelper(arg1, arg2, arg3, arg4);
+ }
+
+ if (backgroundObj instanceof PImage || backgroundObj.__isPImage) {
+ saveContext();
+ curContext.setTransform(1, 0, 0, 1, 0, 0);
+ p.image(backgroundObj, 0, 0);
+ restoreContext();
+ } else {
+ saveContext();
+ curContext.setTransform(1, 0, 0, 1, 0, 0);
+
+ // If the background is transparent
+ if (p.alpha(backgroundObj) !== colorModeA) {
+ curContext.clearRect(0,0, p.width, p.height);
+ }
+ curContext.fillStyle = p.color.toString(backgroundObj);
+ curContext.fillRect(0, 0, p.width, p.height);
+ isFillDirty = true;
+ restoreContext();
+ }
+ };
+
+ Drawing3D.prototype.background = function(arg1, arg2, arg3, arg4) {
+ if (arguments.length > 0) {
+ backgroundHelper(arg1, arg2, arg3, arg4);
+ }
+
+ var c = p.color.toGLArray(backgroundObj);
+ curContext.clearColor(c[0], c[1], c[2], c[3]);
+ curContext.clear(curContext.COLOR_BUFFER_BIT | curContext.DEPTH_BUFFER_BIT);
+
+ // An image as a background in 3D is not implemented yet
+ };
+
+ // Draws an image to the Canvas
+ /**
+ * Displays images to the screen. The images must be in the sketch's "data" directory to load correctly. Select "Add
+ * file..." from the "Sketch" menu to add the image. Processing currently works with GIF, JPEG, and Targa images. The
+ * color of an image may be modified with the tint() function and if a GIF has transparency, it will maintain its
+ * transparency. The img parameter specifies the image to display and the x and y parameters define the location of
+ * the image from its upper-left corner. The image is displayed at its original size unless the width and height
+ * parameters specify a different size. The imageMode() function changes the way the parameters work. A call to
+ * imageMode(CORNERS) will change the width and height parameters to define the x and y values of the opposite
+ * corner of the image.
+ *
+ * @param {PImage} img the image to display
+ * @param {int|float} x x-coordinate of the image
+ * @param {int|float} y y-coordinate of the image
+ * @param {int|float} width width to display the image
+ * @param {int|float} height height to display the image
+ *
+ * @see loadImage
+ * @see PImage
+ * @see imageMode
+ * @see tint
+ * @see background
+ * @see alpha
+ */
+ Drawing2D.prototype.image = function(img, x, y, w, h) {
+ // Fix fractional positions
+ x = Math.round(x);
+ y = Math.round(y);
+
+ if (img.width > 0) {
+ var wid = w || img.width;
+ var hgt = h || img.height;
+
+ var bounds = imageModeConvert(x || 0, y || 0, w || img.width, h || img.height, arguments.length < 4);
+ var fastImage = !!img.sourceImg && curTint === null;
+ if (fastImage) {
+ var htmlElement = img.sourceImg;
+ if (img.__isDirty) {
+ img.updatePixels();
+ }
+ // Using HTML element's width and height in case if the image was resized.
+ curContext.drawImage(htmlElement, 0, 0,
+ htmlElement.width, htmlElement.height, bounds.x, bounds.y, bounds.w, bounds.h);
+ } else {
+ var obj = img.toImageData();
+
+ // Tint the image
+ if (curTint !== null) {
+ curTint(obj);
+ img.__isDirty = true;
+ }
+
+ curContext.drawImage(getCanvasData(obj).canvas, 0, 0,
+ img.width, img.height, bounds.x, bounds.y, bounds.w, bounds.h);
+ }
+ }
+ };
+
+ Drawing3D.prototype.image = function(img, x, y, w, h) {
+ if (img.width > 0) {
+ // Fix fractional positions
+ x = Math.round(x);
+ y = Math.round(y);
+ w = w || img.width;
+ h = h || img.height;
+
+ p.beginShape(p.QUADS);
+ p.texture(img);
+ p.vertex(x, y, 0, 0, 0);
+ p.vertex(x, y+h, 0, 0, h);
+ p.vertex(x+w, y+h, 0, w, h);
+ p.vertex(x+w, y, 0, w, 0);
+ p.endShape();
+ }
+ };
+
+ /**
+ * The tint() function sets the fill value for displaying images. Images can be tinted to
+ * specified colors or made transparent by setting the alpha.
+ * <br><br>To make an image transparent, but not change it's color,
+ * use white as the tint color and specify an alpha value. For instance,
+ * tint(255, 128) will make an image 50% transparent (unless
+ * <b>colorMode()</b> has been used).
+ *
+ * <br><br>When using hexadecimal notation to specify a color, use "#" or
+ * "0x" before the values (e.g. #CCFFAA, 0xFFCCFFAA). The # syntax uses six
+ * digits to specify a color (the way colors are specified in HTML and CSS).
+ * When using the hexadecimal notation starting with "0x", the hexadecimal
+ * value must be specified with eight characters; the first two characters
+ * define the alpha component and the remainder the red, green, and blue
+ * components.
+ * <br><br>The value for the parameter "gray" must be less than or equal
+ * to the current maximum value as specified by <b>colorMode()</b>.
+ * The default maximum value is 255.
+ * <br><br>The tint() method is also used to control the coloring of
+ * textures in 3D.
+ *
+ * @param {int|float} gray any valid number
+ * @param {int|float} alpha opacity of the image
+ * @param {int|float} value1 red or hue value
+ * @param {int|float} value2 green or saturation value
+ * @param {int|float} value3 blue or brightness value
+ * @param {int|float} color any value of the color datatype
+ * @param {int} hex color value in hexadecimal notation (i.e. #FFCC00 or 0xFFFFCC00)
+ *
+ * @see #noTint()
+ * @see #image()
+ */
+ p.tint = function(a1, a2, a3, a4) {
+ var tintColor = p.color(a1, a2, a3, a4);
+ var r = p.red(tintColor) / colorModeX;
+ var g = p.green(tintColor) / colorModeY;
+ var b = p.blue(tintColor) / colorModeZ;
+ var a = p.alpha(tintColor) / colorModeA;
+ curTint = function(obj) {
+ var data = obj.data,
+ length = 4 * obj.width * obj.height;
+ for (var i = 0; i < length;) {
+ data[i++] *= r;
+ data[i++] *= g;
+ data[i++] *= b;
+ data[i++] *= a;
+ }
+ };
+ // for overriding the color buffer when 3d rendering
+ curTint3d = function(data){
+ for (var i = 0; i < data.length;) {
+ data[i++] = r;
+ data[i++] = g;
+ data[i++] = b;
+ data[i++] = a;
+ }
+ };
+ };
+
+ /**
+ * The noTint() function removes the current fill value for displaying images and reverts to displaying images with their original hues.
+ *
+ * @see #tint()
+ * @see #image()
+ */
+ p.noTint = function() {
+ curTint = null;
+ curTint3d = null;
+ };
+
+ /**
+ * Copies a region of pixels from the display window to another area of the display window and copies a region of pixels from an
+ * image used as the srcImg parameter into the display window. If the source and destination regions aren't the same size, it will
+ * automatically resize the source pixels to fit the specified target region. No alpha information is used in the process, however
+ * if the source image has an alpha channel set, it will be copied as well. This function ignores imageMode().
+ *
+ * @param {int} x X coordinate of the source's upper left corner
+ * @param {int} y Y coordinate of the source's upper left corner
+ * @param {int} width source image width
+ * @param {int} height source image height
+ * @param {int} dx X coordinate of the destination's upper left corner
+ * @param {int} dy Y coordinate of the destination's upper left corner
+ * @param {int} dwidth destination image width
+ * @param {int} dheight destination image height
+ * @param {PImage} srcImg image variable referring to the source image
+ *
+ * @see blend
+ * @see get
+ */
+ p.copy = function(src, sx, sy, sw, sh, dx, dy, dw, dh) {
+ if (dh === undef) {
+ // shift everything, and introduce p
+ dh = dw;
+ dw = dy;
+ dy = dx;
+ dx = sh;
+ sh = sw;
+ sw = sy;
+ sy = sx;
+ sx = src;
+ src = p;
+ }
+ p.blend(src, sx, sy, sw, sh, dx, dy, dw, dh, PConstants.REPLACE);
+ };
+
+ /**
+ * Blends a region of pixels from one image into another (or in itself again) with full alpha channel support. There
+ * is a choice of the following modes to blend the source pixels (A) with the ones of pixels in the destination image (B):
+ * BLEND - linear interpolation of colours: C = A*factor + B
+ * ADD - additive blending with white clip: C = min(A*factor + B, 255)
+ * SUBTRACT - subtractive blending with black clip: C = max(B - A*factor, 0)
+ * DARKEST - only the darkest colour succeeds: C = min(A*factor, B)
+ * LIGHTEST - only the lightest colour succeeds: C = max(A*factor, B)
+ * DIFFERENCE - subtract colors from underlying image.
+ * EXCLUSION - similar to DIFFERENCE, but less extreme.
+ * MULTIPLY - Multiply the colors, result will always be darker.
+ * SCREEN - Opposite multiply, uses inverse values of the colors.
+ * OVERLAY - A mix of MULTIPLY and SCREEN. Multiplies dark values, and screens light values.
+ * HARD_LIGHT - SCREEN when greater than 50% gray, MULTIPLY when lower.
+ * SOFT_LIGHT - Mix of DARKEST and LIGHTEST. Works like OVERLAY, but not as harsh.
+ * DODGE - Lightens light tones and increases contrast, ignores darks. Called "Color Dodge" in Illustrator and Photoshop.
+ * BURN - Darker areas are applied, increasing contrast, ignores lights. Called "Color Burn" in Illustrator and Photoshop.
+ * All modes use the alpha information (highest byte) of source image pixels as the blending factor. If the source and
+ * destination regions are different sizes, the image will be automatically resized to match the destination size. If the
+ * srcImg parameter is not used, the display window is used as the source image. This function ignores imageMode().
+ *
+ * @param {int} x X coordinate of the source's upper left corner
+ * @param {int} y Y coordinate of the source's upper left corner
+ * @param {int} width source image width
+ * @param {int} height source image height
+ * @param {int} dx X coordinate of the destination's upper left corner
+ * @param {int} dy Y coordinate of the destination's upper left corner
+ * @param {int} dwidth destination image width
+ * @param {int} dheight destination image height
+ * @param {PImage} srcImg image variable referring to the source image
+ * @param {PImage} MODE Either BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, DIFFERENCE, EXCLUSION, MULTIPLY, SCREEN,
+ * OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, BURN
+ * @see filter
+ */
+ p.blend = function(src, sx, sy, sw, sh, dx, dy, dw, dh, mode, pimgdest) {
+ if (src.isRemote) {
+ throw "Image is loaded remotely. Cannot blend image.";
+ }
+
+ if (mode === undef) {
+ // shift everything, and introduce p
+ mode = dh;
+ dh = dw;
+ dw = dy;
+ dy = dx;
+ dx = sh;
+ sh = sw;
+ sw = sy;
+ sy = sx;
+ sx = src;
+ src = p;
+ }
+
+ var sx2 = sx + sw,
+ sy2 = sy + sh,
+ dx2 = dx + dw,
+ dy2 = dy + dh,
+ dest = pimgdest || p;
+
+ // check if pimgdest is there and pixels, if so this was a call from pimg.blend
+ if (pimgdest === undef || mode === undef) {
+ p.loadPixels();
+ }
+
+ src.loadPixels();
+
+ if (src === p && p.intersect(sx, sy, sx2, sy2, dx, dy, dx2, dy2)) {
+ p.blit_resize(p.get(sx, sy, sx2 - sx, sy2 - sy), 0, 0, sx2 - sx - 1, sy2 - sy - 1,
+ dest.imageData.data, dest.width, dest.height, dx, dy, dx2, dy2, mode);
+ } else {
+ p.blit_resize(src, sx, sy, sx2, sy2, dest.imageData.data, dest.width, dest.height, dx, dy, dx2, dy2, mode);
+ }
+
+ if (pimgdest === undef) {
+ p.updatePixels();
+ }
+ };
+
+ // helper function for filter()
+ var buildBlurKernel = function(r) {
+ var radius = p.floor(r * 3.5), i;
+ radius = (radius < 1) ? 1 : ((radius < 248) ? radius : 248);
+ if (p.shared.blurRadius !== radius) {
+ p.shared.blurRadius = radius;
+ p.shared.blurKernelSize = 1 + (p.shared.blurRadius<<1);
+ p.shared.blurKernel = new Float32Array(p.shared.blurKernelSize);
+ var sharedBlurKernal = p.shared.blurKernel;
+ var sharedBlurKernelSize = p.shared.blurKernelSize;
+ var sharedBlurRadius = p.shared.blurRadius;
+ // init blurKernel
+ for (i = 0; i < sharedBlurKernelSize; i++) {
+ sharedBlurKernal[i] = 0;
+ }
+ var radiusiSquared = (radius - 1) * (radius - 1);
+ for (i = 1; i < radius; i++) {
+ sharedBlurKernal[radius + i] = sharedBlurKernal[radius-i] = radiusiSquared;
+ }
+ sharedBlurKernal[radius] = radius * radius;
+ }
+ };
+
+ var blurARGB = function(r, aImg) {
+ var sum, cr, cg, cb, ca, c, m;
+ var read, ri, ym, ymi, bk0;
+ var wh = aImg.pixels.getLength();
+ var r2 = new Float32Array(wh);
+ var g2 = new Float32Array(wh);
+ var b2 = new Float32Array(wh);
+ var a2 = new Float32Array(wh);
+ var yi = 0;
+ var x, y, i, offset;
+
+ buildBlurKernel(r);
+
+ var aImgHeight = aImg.height;
+ var aImgWidth = aImg.width;
+ var sharedBlurKernelSize = p.shared.blurKernelSize;
+ var sharedBlurRadius = p.shared.blurRadius;
+ var sharedBlurKernal = p.shared.blurKernel;
+ var pix = aImg.imageData.data;
+
+ for (y = 0; y < aImgHeight; y++) {
+ for (x = 0; x < aImgWidth; x++) {
+ cb = cg = cr = ca = sum = 0;
+ read = x - sharedBlurRadius;
+ if (read<0) {
+ bk0 = -read;
+ read = 0;
+ } else {
+ if (read >= aImgWidth) {
+ break;
+ }
+ bk0=0;
+ }
+ for (i = bk0; i < sharedBlurKernelSize; i++) {
+ if (read >= aImgWidth) {
+ break;
+ }
+ offset = (read + yi) *4;
+ m = sharedBlurKernal[i];
+ ca += m * pix[offset + 3];
+ cr += m * pix[offset];
+ cg += m * pix[offset + 1];
+ cb += m * pix[offset + 2];
+ sum += m;
+ read++;
+ }
+ ri = yi + x;
+ a2[ri] = ca / sum;
+ r2[ri] = cr / sum;
+ g2[ri] = cg / sum;
+ b2[ri] = cb / sum;
+ }
+ yi += aImgWidth;
+ }
+
+ yi = 0;
+ ym = -sharedBlurRadius;
+ ymi = ym*aImgWidth;
+
+ for (y = 0; y < aImgHeight; y++) {
+ for (x = 0; x < aImgWidth; x++) {
+ cb = cg = cr = ca = sum = 0;
+ if (ym<0) {
+ bk0 = ri = -ym;
+ read = x;
+ } else {
+ if (ym >= aImgHeight) {
+ break;
+ }
+ bk0 = 0;
+ ri = ym;
+ read = x + ymi;
+ }
+ for (i = bk0; i < sharedBlurKernelSize; i++) {
+ if (ri >= aImgHeight) {
+ break;
+ }
+ m = sharedBlurKernal[i];
+ ca += m * a2[read];
+ cr += m * r2[read];
+ cg += m * g2[read];
+ cb += m * b2[read];
+ sum += m;
+ ri++;
+ read += aImgWidth;
+ }
+ offset = (x + yi) *4;
+ pix[offset] = cr / sum;
+ pix[offset + 1] = cg / sum;
+ pix[offset + 2] = cb / sum;
+ pix[offset + 3] = ca / sum;
+ }
+ yi += aImgWidth;
+ ymi += aImgWidth;
+ ym++;
+ }
+ };
+
+ // helper funtion for ERODE and DILATE modes of filter()
+ var dilate = function(isInverted, aImg) {
+ var currIdx = 0;
+ var maxIdx = aImg.pixels.getLength();
+ var out = new Int32Array(maxIdx);
+ var currRowIdx, maxRowIdx, colOrig, colOut, currLum;
+ var idxRight, idxLeft, idxUp, idxDown,
+ colRight, colLeft, colUp, colDown,
+ lumRight, lumLeft, lumUp, lumDown;
+
+ if (!isInverted) {
+ // erosion (grow light areas)
+ while (currIdx<maxIdx) {
+ currRowIdx = currIdx;
+ maxRowIdx = currIdx + aImg.width;
+ while (currIdx < maxRowIdx) {
+ colOrig = colOut = aImg.pixels.getPixel(currIdx);
+ idxLeft = currIdx - 1;
+ idxRight = currIdx + 1;
+ idxUp = currIdx - aImg.width;
+ idxDown = currIdx + aImg.width;
+ if (idxLeft < currRowIdx) {
+ idxLeft = currIdx;
+ }
+ if (idxRight >= maxRowIdx) {
+ idxRight = currIdx;
+ }
+ if (idxUp < 0) {
+ idxUp = 0;
+ }
+ if (idxDown >= maxIdx) {
+ idxDown = currIdx;
+ }
+ colUp = aImg.pixels.getPixel(idxUp);
+ colLeft = aImg.pixels.getPixel(idxLeft);
+ colDown = aImg.pixels.getPixel(idxDown);
+ colRight = aImg.pixels.getPixel(idxRight);
+
+ // compute luminance
+ currLum = 77*(colOrig>>16&0xff) + 151*(colOrig>>8&0xff) + 28*(colOrig&0xff);
+ lumLeft = 77*(colLeft>>16&0xff) + 151*(colLeft>>8&0xff) + 28*(colLeft&0xff);
+ lumRight = 77*(colRight>>16&0xff) + 151*(colRight>>8&0xff) + 28*(colRight&0xff);
+ lumUp = 77*(colUp>>16&0xff) + 151*(colUp>>8&0xff) + 28*(colUp&0xff);
+ lumDown = 77*(colDown>>16&0xff) + 151*(colDown>>8&0xff) + 28*(colDown&0xff);
+
+ if (lumLeft > currLum) {
+ colOut = colLeft;
+ currLum = lumLeft;
+ }
+ if (lumRight > currLum) {
+ colOut = colRight;
+ currLum = lumRight;
+ }
+ if (lumUp > currLum) {
+ colOut = colUp;
+ currLum = lumUp;
+ }
+ if (lumDown > currLum) {
+ colOut = colDown;
+ currLum = lumDown;
+ }
+ out[currIdx++] = colOut;
+ }
+ }
+ } else {
+ // dilate (grow dark areas)
+ while (currIdx < maxIdx) {
+ currRowIdx = currIdx;
+ maxRowIdx = currIdx + aImg.width;
+ while (currIdx < maxRowIdx) {
+ colOrig = colOut = aImg.pixels.getPixel(currIdx);
+ idxLeft = currIdx - 1;
+ idxRight = currIdx + 1;
+ idxUp = currIdx - aImg.width;
+ idxDown = currIdx + aImg.width;
+ if (idxLeft < currRowIdx) {
+ idxLeft = currIdx;
+ }
+ if (idxRight >= maxRowIdx) {
+ idxRight = currIdx;
+ }
+ if (idxUp < 0) {
+ idxUp = 0;
+ }
+ if (idxDown >= maxIdx) {
+ idxDown = currIdx;
+ }
+ colUp = aImg.pixels.getPixel(idxUp);
+ colLeft = aImg.pixels.getPixel(idxLeft);
+ colDown = aImg.pixels.getPixel(idxDown);
+ colRight = aImg.pixels.getPixel(idxRight);
+
+ // compute luminance
+ currLum = 77*(colOrig>>16&0xff) + 151*(colOrig>>8&0xff) + 28*(colOrig&0xff);
+ lumLeft = 77*(colLeft>>16&0xff) + 151*(colLeft>>8&0xff) + 28*(colLeft&0xff);
+ lumRight = 77*(colRight>>16&0xff) + 151*(colRight>>8&0xff) + 28*(colRight&0xff);
+ lumUp = 77*(colUp>>16&0xff) + 151*(colUp>>8&0xff) + 28*(colUp&0xff);
+ lumDown = 77*(colDown>>16&0xff) + 151*(colDown>>8&0xff) + 28*(colDown&0xff);
+
+ if (lumLeft < currLum) {
+ colOut = colLeft;
+ currLum = lumLeft;
+ }
+ if (lumRight < currLum) {
+ colOut = colRight;
+ currLum = lumRight;
+ }
+ if (lumUp < currLum) {
+ colOut = colUp;
+ currLum = lumUp;
+ }
+ if (lumDown < currLum) {
+ colOut = colDown;
+ currLum = lumDown;
+ }
+ out[currIdx++]=colOut;
+ }
+ }
+ }
+ aImg.pixels.set(out);
+ //p.arraycopy(out,0,pixels,0,maxIdx);
+ };
+
+ /**
+ * Filters the display window as defined by one of the following modes:
+ * THRESHOLD - converts the image to black and white pixels depending if they are above or below the threshold
+ * defined by the level parameter. The level must be between 0.0 (black) and 1.0(white). If no level is specified, 0.5 is used.
+ * GRAY - converts any colors in the image to grayscale equivalents
+ * INVERT - sets each pixel to its inverse value
+ * POSTERIZE - limits each channel of the image to the number of colors specified as the level parameter
+ * BLUR - executes a Guassian blur with the level parameter specifying the extent of the blurring. If no level parameter is
+ * used, the blur is equivalent to Guassian blur of radius 1.
+ * OPAQUE - sets the alpha channel to entirely opaque.
+ * ERODE - reduces the light areas with the amount defined by the level parameter.
+ * DILATE - increases the light areas with the amount defined by the level parameter.
+ *
+ * @param {MODE} MODE Either THRESHOLD, GRAY, INVERT, POSTERIZE, BLUR, OPAQUE, ERODE, or DILATE
+ * @param {int|float} level defines the quality of the filter
+ *
+ * @see blend
+ */
+ p.filter = function(kind, param, aImg){
+ var img, col, lum, i;
+
+ if (arguments.length === 3) {
+ aImg.loadPixels();
+ img = aImg;
+ } else {
+ p.loadPixels();
+ img = p;
+ }
+
+ if (param === undef) {
+ param = null;
+ }
+ if (img.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot filter image.";
+ }
+ // begin filter process
+ var imglen = img.pixels.getLength();
+ switch (kind) {
+ case PConstants.BLUR:
+ var radius = param || 1; // if no param specified, use 1 (default for p5)
+ blurARGB(radius, img);
+ break;
+
+ case PConstants.GRAY:
+ if (img.format === PConstants.ALPHA) { //trouble
+ // for an alpha image, convert it to an opaque grayscale
+ for (i = 0; i < imglen; i++) {
+ col = 255 - img.pixels.getPixel(i);
+ img.pixels.setPixel(i,(0xff000000 | (col << 16) | (col << 8) | col));
+ }
+ img.format = PConstants.RGB; //trouble
+ } else {
+ for (i = 0; i < imglen; i++) {
+ col = img.pixels.getPixel(i);
+ lum = (77*(col>>16&0xff) + 151*(col>>8&0xff) + 28*(col&0xff))>>8;
+ img.pixels.setPixel(i,((col & PConstants.ALPHA_MASK) | lum<<16 | lum<<8 | lum));
+ }
+ }
+ break;
+
+ case PConstants.INVERT:
+ for (i = 0; i < imglen; i++) {
+ img.pixels.setPixel(i, (img.pixels.getPixel(i) ^ 0xffffff));
+ }
+ break;
+
+ case PConstants.POSTERIZE:
+ if (param === null) {
+ throw "Use filter(POSTERIZE, int levels) instead of filter(POSTERIZE)";
+ }
+ var levels = p.floor(param);
+ if ((levels < 2) || (levels > 255)) {
+ throw "Levels must be between 2 and 255 for filter(POSTERIZE, levels)";
+ }
+ var levels1 = levels - 1;
+ for (i = 0; i < imglen; i++) {
+ var rlevel = (img.pixels.getPixel(i) >> 16) & 0xff;
+ var glevel = (img.pixels.getPixel(i) >> 8) & 0xff;
+ var blevel = img.pixels.getPixel(i) & 0xff;
+ rlevel = (((rlevel * levels) >> 8) * 255) / levels1;
+ glevel = (((glevel * levels) >> 8) * 255) / levels1;
+ blevel = (((blevel * levels) >> 8) * 255) / levels1;
+ img.pixels.setPixel(i, ((0xff000000 & img.pixels.getPixel(i)) | (rlevel << 16) | (glevel << 8) | blevel));
+ }
+ break;
+
+ case PConstants.OPAQUE:
+ for (i = 0; i < imglen; i++) {
+ img.pixels.setPixel(i, (img.pixels.getPixel(i) | 0xff000000));
+ }
+ img.format = PConstants.RGB; //trouble
+ break;
+
+ case PConstants.THRESHOLD:
+ if (param === null) {
+ param = 0.5;
+ }
+ if ((param < 0) || (param > 1)) {
+ throw "Level must be between 0 and 1 for filter(THRESHOLD, level)";
+ }
+ var thresh = p.floor(param * 255);
+ for (i = 0; i < imglen; i++) {
+ var max = p.max((img.pixels.getPixel(i) & PConstants.RED_MASK) >> 16, p.max((img.pixels.getPixel(i) & PConstants.GREEN_MASK) >> 8, (img.pixels.getPixel(i) & PConstants.BLUE_MASK)));
+ img.pixels.setPixel(i, ((img.pixels.getPixel(i) & PConstants.ALPHA_MASK) | ((max < thresh) ? 0x000000 : 0xffffff)));
+ }
+ break;
+
+ case PConstants.ERODE:
+ dilate(true, img);
+ break;
+
+ case PConstants.DILATE:
+ dilate(false, img);
+ break;
+ }
+ img.updatePixels();
+ };
+
+
+ // shared variables for blit_resize(), filter_new_scanline(), filter_bilinear(), filter()
+ // change this in the future to not be exposed to p
+ p.shared = {
+ fracU: 0,
+ ifU: 0,
+ fracV: 0,
+ ifV: 0,
+ u1: 0,
+ u2: 0,
+ v1: 0,
+ v2: 0,
+ sX: 0,
+ sY: 0,
+ iw: 0,
+ iw1: 0,
+ ih1: 0,
+ ul: 0,
+ ll: 0,
+ ur: 0,
+ lr: 0,
+ cUL: 0,
+ cLL: 0,
+ cUR: 0,
+ cLR: 0,
+ srcXOffset: 0,
+ srcYOffset: 0,
+ r: 0,
+ g: 0,
+ b: 0,
+ a: 0,
+ srcBuffer: null,
+ blurRadius: 0,
+ blurKernelSize: 0,
+ blurKernel: null
+ };
+
+ p.intersect = function(sx1, sy1, sx2, sy2, dx1, dy1, dx2, dy2) {
+ var sw = sx2 - sx1 + 1;
+ var sh = sy2 - sy1 + 1;
+ var dw = dx2 - dx1 + 1;
+ var dh = dy2 - dy1 + 1;
+ if (dx1 < sx1) {
+ dw += dx1 - sx1;
+ if (dw > sw) {
+ dw = sw;
+ }
+ } else {
+ var w = sw + sx1 - dx1;
+ if (dw > w) {
+ dw = w;
+ }
+ }
+ if (dy1 < sy1) {
+ dh += dy1 - sy1;
+ if (dh > sh) {
+ dh = sh;
+ }
+ } else {
+ var h = sh + sy1 - dy1;
+ if (dh > h) {
+ dh = h;
+ }
+ }
+ return ! (dw <= 0 || dh <= 0);
+ };
+
+ var blendFuncs = {};
+ blendFuncs[PConstants.BLEND] = p.modes.blend;
+ blendFuncs[PConstants.ADD] = p.modes.add;
+ blendFuncs[PConstants.SUBTRACT] = p.modes.subtract;
+ blendFuncs[PConstants.LIGHTEST] = p.modes.lightest;
+ blendFuncs[PConstants.DARKEST] = p.modes.darkest;
+ blendFuncs[PConstants.REPLACE] = p.modes.replace;
+ blendFuncs[PConstants.DIFFERENCE] = p.modes.difference;
+ blendFuncs[PConstants.EXCLUSION] = p.modes.exclusion;
+ blendFuncs[PConstants.MULTIPLY] = p.modes.multiply;
+ blendFuncs[PConstants.SCREEN] = p.modes.screen;
+ blendFuncs[PConstants.OVERLAY] = p.modes.overlay;
+ blendFuncs[PConstants.HARD_LIGHT] = p.modes.hard_light;
+ blendFuncs[PConstants.SOFT_LIGHT] = p.modes.soft_light;
+ blendFuncs[PConstants.DODGE] = p.modes.dodge;
+ blendFuncs[PConstants.BURN] = p.modes.burn;
+
+ p.blit_resize = function(img, srcX1, srcY1, srcX2, srcY2, destPixels,
+ screenW, screenH, destX1, destY1, destX2, destY2, mode) {
+ var x, y;
+ if (srcX1 < 0) {
+ srcX1 = 0;
+ }
+ if (srcY1 < 0) {
+ srcY1 = 0;
+ }
+ if (srcX2 >= img.width) {
+ srcX2 = img.width - 1;
+ }
+ if (srcY2 >= img.height) {
+ srcY2 = img.height - 1;
+ }
+ var srcW = srcX2 - srcX1;
+ var srcH = srcY2 - srcY1;
+ var destW = destX2 - destX1;
+ var destH = destY2 - destY1;
+
+ if (destW <= 0 || destH <= 0 || srcW <= 0 || srcH <= 0 || destX1 >= screenW ||
+ destY1 >= screenH || srcX1 >= img.width || srcY1 >= img.height) {
+ return;
+ }
+
+ var dx = Math.floor(srcW / destW * PConstants.PRECISIONF);
+ var dy = Math.floor(srcH / destH * PConstants.PRECISIONF);
+
+ var pshared = p.shared;
+
+ pshared.srcXOffset = Math.floor(destX1 < 0 ? -destX1 * dx : srcX1 * PConstants.PRECISIONF);
+ pshared.srcYOffset = Math.floor(destY1 < 0 ? -destY1 * dy : srcY1 * PConstants.PRECISIONF);
+ if (destX1 < 0) {
+ destW += destX1;
+ destX1 = 0;
+ }
+ if (destY1 < 0) {
+ destH += destY1;
+ destY1 = 0;
+ }
+ destW = Math.min(destW, screenW - destX1);
+ destH = Math.min(destH, screenH - destY1);
+
+ var destOffset = destY1 * screenW + destX1;
+ var destColor;
+
+ pshared.srcBuffer = img.imageData.data;
+ pshared.iw = img.width;
+ pshared.iw1 = img.width - 1;
+ pshared.ih1 = img.height - 1;
+
+ // cache for speed
+ var filterBilinear = p.filter_bilinear,
+ filterNewScanline = p.filter_new_scanline,
+ blendFunc = blendFuncs[mode],
+ blendedColor,
+ idx,
+ cULoffset,
+ cURoffset,
+ cLLoffset,
+ cLRoffset,
+ ALPHA_MASK = PConstants.ALPHA_MASK,
+ RED_MASK = PConstants.RED_MASK,
+ GREEN_MASK = PConstants.GREEN_MASK,
+ BLUE_MASK = PConstants.BLUE_MASK,
+ PREC_MAXVAL = PConstants.PREC_MAXVAL,
+ PRECISIONB = PConstants.PRECISIONB,
+ PREC_RED_SHIFT = PConstants.PREC_RED_SHIFT,
+ PREC_ALPHA_SHIFT = PConstants.PREC_ALPHA_SHIFT,
+ srcBuffer = pshared.srcBuffer,
+ min = Math.min;
+
+ for (y = 0; y < destH; y++) {
+
+ pshared.sX = pshared.srcXOffset;
+ pshared.fracV = pshared.srcYOffset & PREC_MAXVAL;
+ pshared.ifV = PREC_MAXVAL - pshared.fracV;
+ pshared.v1 = (pshared.srcYOffset >> PRECISIONB) * pshared.iw;
+ pshared.v2 = min((pshared.srcYOffset >> PRECISIONB) + 1, pshared.ih1) * pshared.iw;
+
+ for (x = 0; x < destW; x++) {
+ idx = (destOffset + x) * 4;
+
+ destColor = (destPixels[idx + 3] << 24) &
+ ALPHA_MASK | (destPixels[idx] << 16) &
+ RED_MASK | (destPixels[idx + 1] << 8) &
+ GREEN_MASK | destPixels[idx + 2] & BLUE_MASK;
+
+ pshared.fracU = pshared.sX & PREC_MAXVAL;
+ pshared.ifU = PREC_MAXVAL - pshared.fracU;
+ pshared.ul = (pshared.ifU * pshared.ifV) >> PRECISIONB;
+ pshared.ll = (pshared.ifU * pshared.fracV) >> PRECISIONB;
+ pshared.ur = (pshared.fracU * pshared.ifV) >> PRECISIONB;
+ pshared.lr = (pshared.fracU * pshared.fracV) >> PRECISIONB;
+ pshared.u1 = (pshared.sX >> PRECISIONB);
+ pshared.u2 = min(pshared.u1 + 1, pshared.iw1);
+
+ cULoffset = (pshared.v1 + pshared.u1) * 4;
+ cURoffset = (pshared.v1 + pshared.u2) * 4;
+ cLLoffset = (pshared.v2 + pshared.u1) * 4;
+ cLRoffset = (pshared.v2 + pshared.u2) * 4;
+
+ pshared.cUL = (srcBuffer[cULoffset + 3] << 24) &
+ ALPHA_MASK | (srcBuffer[cULoffset] << 16) &
+ RED_MASK | (srcBuffer[cULoffset + 1] << 8) &
+ GREEN_MASK | srcBuffer[cULoffset + 2] & BLUE_MASK;
+
+ pshared.cUR = (srcBuffer[cURoffset + 3] << 24) &
+ ALPHA_MASK | (srcBuffer[cURoffset] << 16) &
+ RED_MASK | (srcBuffer[cURoffset + 1] << 8) &
+ GREEN_MASK | srcBuffer[cURoffset + 2] & BLUE_MASK;
+
+ pshared.cLL = (srcBuffer[cLLoffset + 3] << 24) &
+ ALPHA_MASK | (srcBuffer[cLLoffset] << 16) &
+ RED_MASK | (srcBuffer[cLLoffset + 1] << 8) &
+ GREEN_MASK | srcBuffer[cLLoffset + 2] & BLUE_MASK;
+
+ pshared.cLR = (srcBuffer[cLRoffset + 3] << 24) &
+ ALPHA_MASK | (srcBuffer[cLRoffset] << 16) &
+ RED_MASK | (srcBuffer[cLRoffset + 1] << 8) &
+ GREEN_MASK | srcBuffer[cLRoffset + 2] & BLUE_MASK;
+
+ pshared.r = ((pshared.ul * ((pshared.cUL & RED_MASK) >> 16) +
+ pshared.ll * ((pshared.cLL & RED_MASK) >> 16) +
+ pshared.ur * ((pshared.cUR & RED_MASK) >> 16) +
+ pshared.lr * ((pshared.cLR & RED_MASK) >> 16)) << PREC_RED_SHIFT) & RED_MASK;
+ pshared.g = ((pshared.ul * (pshared.cUL & GREEN_MASK) +
+ pshared.ll * (pshared.cLL & GREEN_MASK) +
+ pshared.ur * (pshared.cUR & GREEN_MASK) +
+ pshared.lr * (pshared.cLR & GREEN_MASK)) >>> PRECISIONB) & GREEN_MASK;
+ pshared.b = (pshared.ul * (pshared.cUL & BLUE_MASK) +
+ pshared.ll * (pshared.cLL & BLUE_MASK) +
+ pshared.ur * (pshared.cUR & BLUE_MASK) +
+ pshared.lr * (pshared.cLR & BLUE_MASK)) >>> PRECISIONB;
+ pshared.a = ((pshared.ul * ((pshared.cUL & ALPHA_MASK) >>> 24) +
+ pshared.ll * ((pshared.cLL & ALPHA_MASK) >>> 24) +
+ pshared.ur * ((pshared.cUR & ALPHA_MASK) >>> 24) +
+ pshared.lr * ((pshared.cLR & ALPHA_MASK) >>> 24)) << PREC_ALPHA_SHIFT) & ALPHA_MASK;
+
+ blendedColor = blendFunc(destColor, (pshared.a | pshared.r | pshared.g | pshared.b));
+
+ destPixels[idx] = (blendedColor & RED_MASK) >>> 16;
+ destPixels[idx + 1] = (blendedColor & GREEN_MASK) >>> 8;
+ destPixels[idx + 2] = (blendedColor & BLUE_MASK);
+ destPixels[idx + 3] = (blendedColor & ALPHA_MASK) >>> 24;
+
+ pshared.sX += dx;
+ }
+ destOffset += screenW;
+ pshared.srcYOffset += dy;
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Font handling
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * loadFont() Loads a font into a variable of type PFont.
+ *
+ * @param {String} name filename of the font to load
+ * @param {int|float} size option font size (used internally)
+ *
+ * @returns {PFont} new PFont object
+ *
+ * @see #PFont
+ * @see #textFont
+ * @see #text
+ * @see #createFont
+ */
+ p.loadFont = function(name, size) {
+ if (name === undef) {
+ throw("font name required in loadFont.");
+ }
+ if (name.indexOf(".svg") === -1) {
+ if (size === undef) {
+ size = curTextFont.size;
+ }
+ return PFont.get(name, size);
+ }
+ // If the font is a glyph, calculate by SVG table
+ var font = p.loadGlyphs(name);
+
+ return {
+ name: name,
+ css: '12px sans-serif',
+ glyph: true,
+ units_per_em: font.units_per_em,
+ horiz_adv_x: 1 / font.units_per_em * font.horiz_adv_x,
+ ascent: font.ascent,
+ descent: font.descent,
+ width: function(str) {
+ var width = 0;
+ var len = str.length;
+ for (var i = 0; i < len; i++) {
+ try {
+ width += parseFloat(p.glyphLook(p.glyphTable[name], str[i]).horiz_adv_x);
+ }
+ catch(e) {
+ Processing.debug(e);
+ }
+ }
+ return width / p.glyphTable[name].units_per_em;
+ }
+ };
+ };
+
+ /**
+ * createFont() Loads a font into a variable of type PFont.
+ * Smooth and charset are ignored in Processing.js.
+ *
+ * @param {String} name filename of the font to load
+ * @param {int|float} size font size in pixels
+ * @param {boolean} smooth not used in Processing.js
+ * @param {char[]} charset not used in Processing.js
+ *
+ * @returns {PFont} new PFont object
+ *
+ * @see #PFont
+ * @see #textFont
+ * @see #text
+ * @see #loadFont
+ */
+ p.createFont = function(name, size) {
+ // because Processing.js only deals with real fonts,
+ // createFont is simply a wrapper for loadFont/2
+ return p.loadFont(name, size);
+ };
+
+ /**
+ * textFont() Sets the current font.
+ *
+ * @param {PFont} pfont the PFont to load as current text font
+ * @param {int|float} size optional font size in pixels
+ *
+ * @see #createFont
+ * @see #loadFont
+ * @see #PFont
+ * @see #text
+ */
+ p.textFont = function(pfont, size) {
+ if (size !== undef) {
+ // If we're using an SVG glyph font, don't load from cache
+ if (!pfont.glyph) {
+ pfont = PFont.get(pfont.name, size);
+ }
+ curTextSize = size;
+ }
+ curTextFont = pfont;
+ curFontName = curTextFont.name;
+ curTextAscent = curTextFont.ascent;
+ curTextDescent = curTextFont.descent;
+ curTextLeading = curTextFont.leading;
+ var curContext = drawing.$ensureContext();
+ curContext.font = curTextFont.css;
+ };
+
+ /**
+ * textSize() Sets the current font size in pixels.
+ *
+ * @param {int|float} size font size in pixels
+ *
+ * @see #textFont
+ * @see #loadFont
+ * @see #PFont
+ * @see #text
+ */
+ p.textSize = function(size) {
+ curTextFont = PFont.get(curFontName, size);
+ curTextSize = size;
+ // recache metrics
+ curTextAscent = curTextFont.ascent;
+ curTextDescent = curTextFont.descent;
+ curTextLeading = curTextFont.leading;
+ var curContext = drawing.$ensureContext();
+ curContext.font = curTextFont.css;
+ };
+
+ /**
+ * textAscent() returns the maximum height a character extends above the baseline of the
+ * current font at its current size, in pixels.
+ *
+ * @returns {float} height of the current font above the baseline, at its current size, in pixels
+ *
+ * @see #textDescent
+ */
+ p.textAscent = function() {
+ return curTextAscent;
+ };
+
+ /**
+ * textDescent() returns the maximum depth a character will protrude below the baseline of
+ * the current font at its current size, in pixels.
+ *
+ * @returns {float} depth of the current font below the baseline, at its current size, in pixels
+ *
+ * @see #textAscent
+ */
+ p.textDescent = function() {
+ return curTextDescent;
+ };
+
+ /**
+ * textLeading() Sets the current font's leading, which is the distance
+ * from baseline to baseline over consecutive lines, with additional vertical
+ * spacing taking into account. Usually this value is 1.2 or 1.25 times the
+ * textsize, but this value can be changed to effect vertically compressed
+ * or stretched text.
+ *
+ * @param {int|float} the desired baseline-to-baseline size in pixels
+ */
+ p.textLeading = function(leading) {
+ curTextLeading = leading;
+ };
+
+ /**
+ * textAlign() Sets the current alignment for drawing text.
+ *
+ * @param {int} ALIGN Horizontal alignment, either LEFT, CENTER, or RIGHT
+ * @param {int} YALIGN optional vertical alignment, either TOP, BOTTOM, CENTER, or BASELINE
+ *
+ * @see #loadFont
+ * @see #PFont
+ * @see #text
+ */
+ p.textAlign = function(xalign, yalign) {
+ horizontalTextAlignment = xalign;
+ verticalTextAlignment = yalign || PConstants.BASELINE;
+ };
+
+ /**
+ * toP5String converts things with arbitrary data type into
+ * string values, for text rendering.
+ *
+ * @param {any} any object that can be converted into a string
+ *
+ * @return {String} the string representation of the input
+ */
+ function toP5String(obj) {
+ if(obj instanceof String) {
+ return obj;
+ }
+ if(typeof obj === 'number') {
+ // check if an int
+ if(obj === (0 | obj)) {
+ return obj.toString();
+ }
+ return p.nf(obj, 0, 3);
+ }
+ if(obj === null || obj === undef) {
+ return "";
+ }
+ return obj.toString();
+ }
+
+ /**
+ * textWidth() Calculates and returns the width of any character or text string in pixels.
+ *
+ * @param {char|String} str char or String to be measured
+ *
+ * @return {float} width of char or String in pixels
+ *
+ * @see #loadFont
+ * @see #PFont
+ * @see #text
+ * @see #textFont
+ */
+ Drawing2D.prototype.textWidth = function(str) {
+ var lines = toP5String(str).split(/\r?\n/g), width = 0;
+ var i, linesCount = lines.length;
+
+ curContext.font = curTextFont.css;
+ for (i = 0; i < linesCount; ++i) {
+ width = Math.max(width, curTextFont.measureTextWidth(lines[i]));
+ }
+ return width | 0;
+ };
+
+ Drawing3D.prototype.textWidth = function(str) {
+ var lines = toP5String(str).split(/\r?\n/g), width = 0;
+ var i, linesCount = lines.length;
+ if (textcanvas === undef) {
+ textcanvas = document.createElement("canvas");
+ }
+
+ var textContext = textcanvas.getContext("2d");
+ textContext.font = curTextFont.css;
+
+ for (i = 0; i < linesCount; ++i) {
+ width = Math.max(width, textContext.measureText(lines[i]).width);
+ }
+ return width | 0;
+ };
+
+ // A lookup table for characters that can not be referenced by Object
+ p.glyphLook = function(font, chr) {
+ try {
+ switch (chr) {
+ case "1":
+ return font.one;
+ case "2":
+ return font.two;
+ case "3":
+ return font.three;
+ case "4":
+ return font.four;
+ case "5":
+ return font.five;
+ case "6":
+ return font.six;
+ case "7":
+ return font.seven;
+ case "8":
+ return font.eight;
+ case "9":
+ return font.nine;
+ case "0":
+ return font.zero;
+ case " ":
+ return font.space;
+ case "$":
+ return font.dollar;
+ case "!":
+ return font.exclam;
+ case '"':
+ return font.quotedbl;
+ case "#":
+ return font.numbersign;
+ case "%":
+ return font.percent;
+ case "&":
+ return font.ampersand;
+ case "'":
+ return font.quotesingle;
+ case "(":
+ return font.parenleft;
+ case ")":
+ return font.parenright;
+ case "*":
+ return font.asterisk;
+ case "+":
+ return font.plus;
+ case ",":
+ return font.comma;
+ case "-":
+ return font.hyphen;
+ case ".":
+ return font.period;
+ case "/":
+ return font.slash;
+ case "_":
+ return font.underscore;
+ case ":":
+ return font.colon;
+ case ";":
+ return font.semicolon;
+ case "<":
+ return font.less;
+ case "=":
+ return font.equal;
+ case ">":
+ return font.greater;
+ case "?":
+ return font.question;
+ case "@":
+ return font.at;
+ case "[":
+ return font.bracketleft;
+ case "\\":
+ return font.backslash;
+ case "]":
+ return font.bracketright;
+ case "^":
+ return font.asciicircum;
+ case "`":
+ return font.grave;
+ case "{":
+ return font.braceleft;
+ case "|":
+ return font.bar;
+ case "}":
+ return font.braceright;
+ case "~":
+ return font.asciitilde;
+ // If the character is not 'special', access it by object reference
+ default:
+ return font[chr];
+ }
+ } catch(e) {
+ Processing.debug(e);
+ }
+ };
+
+ // Print some text to the Canvas
+ Drawing2D.prototype.text$line = function(str, x, y, z, align) {
+ var textWidth = 0, xOffset = 0;
+ // If the font is a standard Canvas font...
+ if (!curTextFont.glyph) {
+ if (str && ("fillText" in curContext)) {
+ if (isFillDirty) {
+ curContext.fillStyle = p.color.toString(currentFillColor);
+ isFillDirty = false;
+ }
+
+ // horizontal offset/alignment
+ if(align === PConstants.RIGHT || align === PConstants.CENTER) {
+ textWidth = curTextFont.measureTextWidth(str);
+
+ if(align === PConstants.RIGHT) {
+ xOffset = -textWidth;
+ } else { // if(align === PConstants.CENTER)
+ xOffset = -textWidth/2;
+ }
+ }
+
+ curContext.fillText(str, x+xOffset, y);
+ }
+ } else {
+ // If the font is a Batik SVG font...
+ var font = p.glyphTable[curFontName];
+ saveContext();
+ curContext.translate(x, y + curTextSize);
+
+ // horizontal offset/alignment
+ if(align === PConstants.RIGHT || align === PConstants.CENTER) {
+ textWidth = font.width(str);
+
+ if(align === PConstants.RIGHT) {
+ xOffset = -textWidth;
+ } else { // if(align === PConstants.CENTER)
+ xOffset = -textWidth/2;
+ }
+ }
+
+ var upem = font.units_per_em,
+ newScale = 1 / upem * curTextSize;
+
+ curContext.scale(newScale, newScale);
+
+ for (var i=0, len=str.length; i < len; i++) {
+ // Test character against glyph table
+ try {
+ p.glyphLook(font, str[i]).draw();
+ } catch(e) {
+ Processing.debug(e);
+ }
+ }
+ restoreContext();
+ }
+ };
+
+ Drawing3D.prototype.text$line = function(str, x, y, z, align) {
+ // handle case for 3d text
+ if (textcanvas === undef) {
+ textcanvas = document.createElement("canvas");
+ }
+ var oldContext = curContext;
+ curContext = textcanvas.getContext("2d");
+ curContext.font = curTextFont.css;
+ var textWidth = curTextFont.measureTextWidth(str);
+ textcanvas.width = textWidth;
+ textcanvas.height = curTextSize;
+ curContext = textcanvas.getContext("2d"); // refreshes curContext
+ curContext.font = curTextFont.css;
+ curContext.textBaseline="top";
+
+ // paint on 2D canvas
+ Drawing2D.prototype.text$line(str,0,0,0,PConstants.LEFT);
+
+ // use it as a texture
+ var aspect = textcanvas.width/textcanvas.height;
+ curContext = oldContext;
+
+ curContext.bindTexture(curContext.TEXTURE_2D, textTex);
+ curContext.texImage2D(curContext.TEXTURE_2D, 0, curContext.RGBA, curContext.RGBA, curContext.UNSIGNED_BYTE, textcanvas);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MAG_FILTER, curContext.LINEAR);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MIN_FILTER, curContext.LINEAR);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_WRAP_T, curContext.CLAMP_TO_EDGE);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_WRAP_S, curContext.CLAMP_TO_EDGE);
+ // If we don't have a power of two texture, we can't mipmap it.
+ // curContext.generateMipmap(curContext.TEXTURE_2D);
+
+ // horizontal offset/alignment
+ var xOffset = 0;
+ if (align === PConstants.RIGHT) {
+ xOffset = -textWidth;
+ } else if(align === PConstants.CENTER) {
+ xOffset = -textWidth/2;
+ }
+ var model = new PMatrix3D();
+ var scalefactor = curTextSize * 0.5;
+ model.translate(x+xOffset-scalefactor/2, y-scalefactor, z);
+ model.scale(-aspect*scalefactor, -scalefactor, scalefactor);
+ model.translate(-1, -1, -1);
+ model.transpose();
+
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ curContext.useProgram(programObject2D);
+ vertexAttribPointer("aVertex2d", programObject2D, "aVertex", 3, textBuffer);
+ vertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord", 2, textureBuffer);
+ uniformi("uSampler2d", programObject2D, "uSampler", [0]);
+
+ uniformi("uIsDrawingText2d", programObject2D, "uIsDrawingText", true);
+
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, model.array());
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+ uniformf("uColor2d", programObject2D, "uColor", fillStyle);
+ curContext.bindBuffer(curContext.ELEMENT_ARRAY_BUFFER, indexBuffer);
+ curContext.drawElements(curContext.TRIANGLES, 6, curContext.UNSIGNED_SHORT, 0);
+ };
+
+
+ /**
+ * unbounded text function (z is an optional argument)
+ */
+ function text$4(str, x, y, z) {
+ var lines, linesCount;
+ if(str.indexOf('\n') < 0) {
+ lines = [str];
+ linesCount = 1;
+ } else {
+ lines = str.split(/\r?\n/g);
+ linesCount = lines.length;
+ }
+ // handle text line-by-line
+
+ var yOffset = 0;
+ if(verticalTextAlignment === PConstants.TOP) {
+ yOffset = curTextAscent + curTextDescent;
+ } else if(verticalTextAlignment === PConstants.CENTER) {
+ yOffset = curTextAscent/2 - (linesCount-1)*curTextLeading/2;
+ } else if(verticalTextAlignment === PConstants.BOTTOM) {
+ yOffset = -(curTextDescent + (linesCount-1)*curTextLeading);
+ }
+
+ for(var i=0;i<linesCount;++i) {
+ var line = lines[i];
+ drawing.text$line(line, x, y + yOffset, z, horizontalTextAlignment);
+ yOffset += curTextLeading;
+ }
+ }
+
+
+ /**
+ * box-bounded text function (z is an optional argument)
+ */
+ function text$6(str, x, y, width, height, z) {
+ // 'fail' on 0-valued dimensions
+ if (str.length === 0 || width === 0 || height === 0) {
+ return;
+ }
+ // also 'fail' if the text height is larger than the bounding height
+ if(curTextSize > height) {
+ return;
+ }
+
+ var spaceMark = -1;
+ var start = 0;
+ var lineWidth = 0;
+ var drawCommands = [];
+
+ // run through text, character-by-character
+ for (var charPos=0, len=str.length; charPos < len; charPos++)
+ {
+ var currentChar = str[charPos];
+ var spaceChar = (currentChar === " ");
+ var letterWidth = curTextFont.measureTextWidth(currentChar);
+
+ // if we aren't looking at a newline, and the text still fits, keep processing
+ if (currentChar !== "\n" && (lineWidth + letterWidth <= width)) {
+ if (spaceChar) { spaceMark = charPos; }
+ lineWidth += letterWidth;
+ }
+
+ // if we're looking at a newline, or the text no longer fits, push the section that fit into the drawcommand list
+ else
+ {
+ if (spaceMark + 1 === start) {
+ if(charPos>0) {
+ // Whole line without spaces so far.
+ spaceMark = charPos;
+ } else {
+ // 'fail', because the line can't even fit the first character
+ return;
+ }
+ }
+
+ if (currentChar === "\n") {
+ drawCommands.push({text:str.substring(start, charPos), width: lineWidth});
+ start = charPos + 1;
+ } else {
+ // current is not a newline, which means the line doesn't fit in box. push text.
+ // In Processing 1.5.1, the space is also pushed, so we push up to spaceMark+1,
+ // rather than up to spaceMark, as was the case for Processing 1.5 and earlier.
+ drawCommands.push({text:str.substring(start, spaceMark+1), width: lineWidth});
+ start = spaceMark + 1;
+ }
+
+ // newline + return
+ lineWidth = 0;
+ charPos = start - 1;
+ }
+ }
+
+ // push the remaining text
+ if (start < len) {
+ drawCommands.push({text:str.substring(start), width: lineWidth});
+ }
+
+ // resolve horizontal alignment
+ var xOffset = 1,
+ yOffset = curTextAscent;
+ if (horizontalTextAlignment === PConstants.CENTER) {
+ xOffset = width/2;
+ } else if (horizontalTextAlignment === PConstants.RIGHT) {
+ xOffset = width;
+ }
+
+ // resolve vertical alignment
+ var linesCount = drawCommands.length,
+ visibleLines = Math.min(linesCount, Math.floor(height/curTextLeading));
+ if(verticalTextAlignment === PConstants.TOP) {
+ yOffset = curTextAscent + curTextDescent;
+ } else if(verticalTextAlignment === PConstants.CENTER) {
+ yOffset = (height/2) - curTextLeading * (visibleLines/2 - 1);
+ } else if(verticalTextAlignment === PConstants.BOTTOM) {
+ yOffset = curTextDescent + curTextLeading;
+ }
+
+ var command,
+ drawCommand,
+ leading;
+ for (command = 0; command < linesCount; command++) {
+ leading = command * curTextLeading;
+ // stop if not enough space for one more line draw
+ if (yOffset + leading > height - curTextDescent) {
+ break;
+ }
+ drawCommand = drawCommands[command];
+ drawing.text$line(drawCommand.text, x + xOffset, y + yOffset + leading, z, horizontalTextAlignment);
+ }
+ }
+
+ /**
+ * text() Draws text to the screen.
+ *
+ * @param {String|char|int|float} data the alphanumeric symbols to be displayed
+ * @param {int|float} x x-coordinate of text
+ * @param {int|float} y y-coordinate of text
+ * @param {int|float} z optional z-coordinate of text
+ * @param {String} stringdata optional letters to be displayed
+ * @param {int|float} width optional width of text box
+ * @param {int|float} height optional height of text box
+ *
+ * @see #textAlign
+ * @see #textMode
+ * @see #loadFont
+ * @see #PFont
+ * @see #textFont
+ */
+ p.text = function() {
+ if (textMode === PConstants.SHAPE) {
+ // TODO: requires beginRaw function
+ return;
+ }
+ if (arguments.length === 3) { // for text( str, x, y)
+ text$4(toP5String(arguments[0]), arguments[1], arguments[2], 0);
+ } else if (arguments.length === 4) { // for text( str, x, y, z)
+ text$4(toP5String(arguments[0]), arguments[1], arguments[2], arguments[3]);
+ } else if (arguments.length === 5) { // for text( str, x, y , width, height)
+ text$6(toP5String(arguments[0]), arguments[1], arguments[2], arguments[3], arguments[4], 0);
+ } else if (arguments.length === 6) { // for text( stringdata, x, y , width, height, z)
+ text$6(toP5String(arguments[0]), arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
+ }
+ };
+
+ /**
+ * Sets the way text draws to the screen. In the default configuration (the MODEL mode), it's possible to rotate,
+ * scale, and place letters in two and three dimensional space. <br /><br /> Changing to SCREEN mode draws letters
+ * directly to the front of the window and greatly increases rendering quality and speed when used with the P2D and
+ * P3D renderers. textMode(SCREEN) with OPENGL and JAVA2D (the default) renderers will generally be slower, though
+ * pixel accurate with P2D and P3D. With textMode(SCREEN), the letters draw at the actual size of the font (in pixels)
+ * and therefore calls to <b>textSize()</b> will not affect the size of the letters. To create a font at the size you
+ * desire, use the "Create font..." option in the Tools menu, or use the createFont() function. When using textMode(SCREEN),
+ * any z-coordinate passed to a text() command will be ignored, because your computer screen is...flat!
+ *
+ * @param {int} MODE Either MODEL, SCREEN or SHAPE (not yet supported)
+ *
+ * @see loadFont
+ * @see PFont
+ * @see text
+ * @see textFont
+ * @see createFont
+ */
+ p.textMode = function(mode){
+ textMode = mode;
+ };
+
+ // Load Batik SVG Fonts and parse to pre-def objects for quick rendering
+ p.loadGlyphs = function(url) {
+ var x, y, cx, cy, nx, ny, d, a, lastCom, lenC, horiz_adv_x, getXY = '[0-9\\-]+', path;
+
+ // Return arrays of SVG commands and coords
+ // get this to use p.matchAll() - will need to work around the lack of null return
+ var regex = function(needle, hay) {
+ var i = 0,
+ results = [],
+ latest, regexp = new RegExp(needle, "g");
+ latest = results[i] = regexp.exec(hay);
+ while (latest) {
+ i++;
+ latest = results[i] = regexp.exec(hay);
+ }
+ return results;
+ };
+
+ var buildPath = function(d) {
+ var c = regex("[A-Za-z][0-9\\- ]+|Z", d);
+ var beforePathDraw = function() {
+ saveContext();
+ return drawing.$ensureContext();
+ };
+ var afterPathDraw = function() {
+ executeContextFill();
+ executeContextStroke();
+ restoreContext();
+ };
+
+ // Begin storing path object
+ path = "return {draw:function(){var curContext=beforePathDraw();curContext.beginPath();";
+
+ x = 0;
+ y = 0;
+ cx = 0;
+ cy = 0;
+ nx = 0;
+ ny = 0;
+ d = 0;
+ a = 0;
+ lastCom = "";
+ lenC = c.length - 1;
+
+ // Loop through SVG commands translating to canvas eqivs functions in path object
+ for (var j = 0; j < lenC; j++) {
+ var com = c[j][0], xy = regex(getXY, com);
+
+ switch (com[0]) {
+ case "M":
+ //curContext.moveTo(x,-y);
+ x = parseFloat(xy[0][0]);
+ y = parseFloat(xy[1][0]);
+ path += "curContext.moveTo(" + x + "," + (-y) + ");";
+ break;
+
+ case "L":
+ //curContext.lineTo(x,-y);
+ x = parseFloat(xy[0][0]);
+ y = parseFloat(xy[1][0]);
+ path += "curContext.lineTo(" + x + "," + (-y) + ");";
+ break;
+
+ case "H":
+ //curContext.lineTo(x,-y)
+ x = parseFloat(xy[0][0]);
+ path += "curContext.lineTo(" + x + "," + (-y) + ");";
+ break;
+
+ case "V":
+ //curContext.lineTo(x,-y);
+ y = parseFloat(xy[0][0]);
+ path += "curContext.lineTo(" + x + "," + (-y) + ");";
+ break;
+
+ case "T":
+ //curContext.quadraticCurveTo(cx,-cy,nx,-ny);
+ nx = parseFloat(xy[0][0]);
+ ny = parseFloat(xy[1][0]);
+
+ if (lastCom === "Q" || lastCom === "T") {
+ d = Math.sqrt(Math.pow(x - cx, 2) + Math.pow(cy - y, 2));
+ a = Math.PI + Math.atan2(cx - x, cy - y);
+ cx = x + (Math.sin(a) * (d));
+ cy = y + (Math.cos(a) * (d));
+ } else {
+ cx = x;
+ cy = y;
+ }
+
+ path += "curContext.quadraticCurveTo(" + cx + "," + (-cy) + "," + nx + "," + (-ny) + ");";
+ x = nx;
+ y = ny;
+ break;
+
+ case "Q":
+ //curContext.quadraticCurveTo(cx,-cy,nx,-ny);
+ cx = parseFloat(xy[0][0]);
+ cy = parseFloat(xy[1][0]);
+ nx = parseFloat(xy[2][0]);
+ ny = parseFloat(xy[3][0]);
+ path += "curContext.quadraticCurveTo(" + cx + "," + (-cy) + "," + nx + "," + (-ny) + ");";
+ x = nx;
+ y = ny;
+ break;
+
+ case "Z":
+ //curContext.closePath();
+ path += "curContext.closePath();";
+ break;
+ }
+ lastCom = com[0];
+ }
+
+ path += "afterPathDraw();";
+ path += "curContext.translate(" + horiz_adv_x + ",0);";
+ path += "}}";
+
+ return ((new Function("beforePathDraw", "afterPathDraw", path))(beforePathDraw, afterPathDraw));
+ };
+
+ // Parse SVG font-file into block of Canvas commands
+ var parseSVGFont = function(svg) {
+ // Store font attributes
+ var font = svg.getElementsByTagName("font");
+ p.glyphTable[url].horiz_adv_x = font[0].getAttribute("horiz-adv-x");
+
+ var font_face = svg.getElementsByTagName("font-face")[0];
+ p.glyphTable[url].units_per_em = parseFloat(font_face.getAttribute("units-per-em"));
+ p.glyphTable[url].ascent = parseFloat(font_face.getAttribute("ascent"));
+ p.glyphTable[url].descent = parseFloat(font_face.getAttribute("descent"));
+
+ var glyph = svg.getElementsByTagName("glyph"),
+ len = glyph.length;
+
+ // Loop through each glyph in the SVG
+ for (var i = 0; i < len; i++) {
+ // Store attributes for this glyph
+ var unicode = glyph[i].getAttribute("unicode");
+ var name = glyph[i].getAttribute("glyph-name");
+ horiz_adv_x = glyph[i].getAttribute("horiz-adv-x");
+ if (horiz_adv_x === null) {
+ horiz_adv_x = p.glyphTable[url].horiz_adv_x;
+ }
+ d = glyph[i].getAttribute("d");
+ // Split path commands in glpyh
+ if (d !== undef) {
+ path = buildPath(d);
+ // Store glyph data to table object
+ p.glyphTable[url][name] = {
+ name: name,
+ unicode: unicode,
+ horiz_adv_x: horiz_adv_x,
+ draw: path.draw
+ };
+ }
+ } // finished adding glyphs to table
+ };
+
+ // Load and parse Batik SVG font as XML into a Processing Glyph object
+ var loadXML = function() {
+ var xmlDoc;
+
+ try {
+ xmlDoc = document.implementation.createDocument("", "", null);
+ }
+ catch(e_fx_op) {
+ Processing.debug(e_fx_op.message);
+ return;
+ }
+
+ try {
+ xmlDoc.async = false;
+ xmlDoc.load(url);
+ parseSVGFont(xmlDoc.getElementsByTagName("svg")[0]);
+ }
+ catch(e_sf_ch) {
+ // Google Chrome, Safari etc.
+ Processing.debug(e_sf_ch);
+ try {
+ var xmlhttp = new window.XMLHttpRequest();
+ xmlhttp.open("GET", url, false);
+ xmlhttp.send(null);
+ parseSVGFont(xmlhttp.responseXML.documentElement);
+ }
+ catch(e) {
+ Processing.debug(e_sf_ch);
+ }
+ }
+ };
+
+ // Create a new object in glyphTable to store this font
+ p.glyphTable[url] = {};
+
+ // Begin loading the Batik SVG font...
+ loadXML(url);
+
+ // Return the loaded font for attribute grabbing
+ return p.glyphTable[url];
+ };
+
+ /**
+ * Gets the sketch parameter value. The parameter can be defined as the canvas attribute with
+ * the "data-processing-" prefix or provided in the pjs directive (e.g. param-test="52").
+ * The function tries the canvas attributes, then the pjs directive content.
+ *
+ * @param {String} name The name of the param to read.
+ *
+ * @returns {String} The parameter value, or null if parameter is not defined.
+ */
+ p.param = function(name) {
+ // trying attribute that was specified in CANVAS
+ var attributeName = "data-processing-" + name;
+ if (curElement.hasAttribute(attributeName)) {
+ return curElement.getAttribute(attributeName);
+ }
+ // trying child PARAM elements of the CANVAS
+ for (var i = 0, len = curElement.childNodes.length; i < len; ++i) {
+ var item = curElement.childNodes.item(i);
+ if (item.nodeType !== 1 || item.tagName.toLowerCase() !== "param") {
+ continue;
+ }
+ if (item.getAttribute("name") === name) {
+ return item.getAttribute("value");
+ }
+ }
+ // fallback to default params
+ if (curSketch.params.hasOwnProperty(name)) {
+ return curSketch.params[name];
+ }
+ return null;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // 2D/3D methods wiring utils
+ ////////////////////////////////////////////////////////////////////////////
+ function wireDimensionalFunctions(mode) {
+ // Drawing2D/Drawing3D
+ if (mode === '3D') {
+ drawing = new Drawing3D();
+ } else if (mode === '2D') {
+ drawing = new Drawing2D();
+ } else {
+ drawing = new DrawingPre();
+ }
+
+ // Wire up functions (Use DrawingPre properties names)
+ for (var i in DrawingPre.prototype) {
+ if (DrawingPre.prototype.hasOwnProperty(i) && i.indexOf("$") < 0) {
+ p[i] = drawing[i];
+ }
+ }
+
+ // Run initialization
+ drawing.$init();
+ }
+
+ function createDrawingPreFunction(name) {
+ return function() {
+ wireDimensionalFunctions("2D");
+ return drawing[name].apply(this, arguments);
+ };
+ }
+ DrawingPre.prototype.translate = createDrawingPreFunction("translate");
+ DrawingPre.prototype.transform = createDrawingPreFunction("transform");
+ DrawingPre.prototype.scale = createDrawingPreFunction("scale");
+ DrawingPre.prototype.pushMatrix = createDrawingPreFunction("pushMatrix");
+ DrawingPre.prototype.popMatrix = createDrawingPreFunction("popMatrix");
+ DrawingPre.prototype.resetMatrix = createDrawingPreFunction("resetMatrix");
+ DrawingPre.prototype.applyMatrix = createDrawingPreFunction("applyMatrix");
+ DrawingPre.prototype.rotate = createDrawingPreFunction("rotate");
+ DrawingPre.prototype.rotateZ = createDrawingPreFunction("rotateZ");
+ DrawingPre.prototype.shearX = createDrawingPreFunction("shearX");
+ DrawingPre.prototype.shearY = createDrawingPreFunction("shearY");
+ DrawingPre.prototype.redraw = createDrawingPreFunction("redraw");
+ DrawingPre.prototype.toImageData = createDrawingPreFunction("toImageData");
+ DrawingPre.prototype.ambientLight = createDrawingPreFunction("ambientLight");
+ DrawingPre.prototype.directionalLight = createDrawingPreFunction("directionalLight");
+ DrawingPre.prototype.lightFalloff = createDrawingPreFunction("lightFalloff");
+ DrawingPre.prototype.lightSpecular = createDrawingPreFunction("lightSpecular");
+ DrawingPre.prototype.pointLight = createDrawingPreFunction("pointLight");
+ DrawingPre.prototype.noLights = createDrawingPreFunction("noLights");
+ DrawingPre.prototype.spotLight = createDrawingPreFunction("spotLight");
+ DrawingPre.prototype.beginCamera = createDrawingPreFunction("beginCamera");
+ DrawingPre.prototype.endCamera = createDrawingPreFunction("endCamera");
+ DrawingPre.prototype.frustum = createDrawingPreFunction("frustum");
+ DrawingPre.prototype.box = createDrawingPreFunction("box");
+ DrawingPre.prototype.sphere = createDrawingPreFunction("sphere");
+ DrawingPre.prototype.ambient = createDrawingPreFunction("ambient");
+ DrawingPre.prototype.emissive = createDrawingPreFunction("emissive");
+ DrawingPre.prototype.shininess = createDrawingPreFunction("shininess");
+ DrawingPre.prototype.specular = createDrawingPreFunction("specular");
+ DrawingPre.prototype.fill = createDrawingPreFunction("fill");
+ DrawingPre.prototype.stroke = createDrawingPreFunction("stroke");
+ DrawingPre.prototype.strokeWeight = createDrawingPreFunction("strokeWeight");
+ DrawingPre.prototype.smooth = createDrawingPreFunction("smooth");
+ DrawingPre.prototype.noSmooth = createDrawingPreFunction("noSmooth");
+ DrawingPre.prototype.point = createDrawingPreFunction("point");
+ DrawingPre.prototype.vertex = createDrawingPreFunction("vertex");
+ DrawingPre.prototype.endShape = createDrawingPreFunction("endShape");
+ DrawingPre.prototype.bezierVertex = createDrawingPreFunction("bezierVertex");
+ DrawingPre.prototype.curveVertex = createDrawingPreFunction("curveVertex");
+ DrawingPre.prototype.curve = createDrawingPreFunction("curve");
+ DrawingPre.prototype.line = createDrawingPreFunction("line");
+ DrawingPre.prototype.bezier = createDrawingPreFunction("bezier");
+ DrawingPre.prototype.rect = createDrawingPreFunction("rect");
+ DrawingPre.prototype.ellipse = createDrawingPreFunction("ellipse");
+ DrawingPre.prototype.background = createDrawingPreFunction("background");
+ DrawingPre.prototype.image = createDrawingPreFunction("image");
+ DrawingPre.prototype.textWidth = createDrawingPreFunction("textWidth");
+ DrawingPre.prototype.text$line = createDrawingPreFunction("text$line");
+ DrawingPre.prototype.$ensureContext = createDrawingPreFunction("$ensureContext");
+ DrawingPre.prototype.$newPMatrix = createDrawingPreFunction("$newPMatrix");
+
+ DrawingPre.prototype.size = function(aWidth, aHeight, aMode) {
+ wireDimensionalFunctions(aMode === PConstants.WEBGL ? "3D" : "2D");
+ p.size(aWidth, aHeight, aMode);
+ };
+
+ DrawingPre.prototype.$init = noop;
+
+ Drawing2D.prototype.$init = function() {
+ // Setup default 2d canvas context.
+ // Moving this here removes the number of times we need to check the 3D variable
+ p.size(p.width, p.height);
+
+ curContext.lineCap = 'round';
+
+ // Set default stroke and fill color
+ p.noSmooth();
+ p.disableContextMenu();
+ };
+ Drawing3D.prototype.$init = function() {
+ // For ref/perf test compatibility until those are fixed
+ p.use3DContext = true;
+ p.disableContextMenu();
+ };
+
+ DrawingShared.prototype.$ensureContext = function() {
+ return curContext;
+ };
+
+ //////////////////////////////////////////////////////////////////////////
+ // Keyboard Events
+ //////////////////////////////////////////////////////////////////////////
+
+ // In order to catch key events in a canvas, it needs to be "specially focusable",
+ // by assigning it a tabindex. If no tabindex is specified on-page, set this to 0.
+ if (!curElement.getAttribute("tabindex")) {
+ curElement.setAttribute("tabindex", 0);
+ }
+
+ function getKeyCode(e) {
+ var code = e.which || e.keyCode;
+ switch (code) {
+ case 13: // ENTER
+ return 10;
+ case 91: // META L (Saf/Mac)
+ case 93: // META R (Saf/Mac)
+ case 224: // META (FF/Mac)
+ return 157;
+ case 57392: // CONTROL (Op/Mac)
+ return 17;
+ case 46: // DELETE
+ return 127;
+ case 45: // INSERT
+ return 155;
+ }
+ return code;
+ }
+
+ function getKeyChar(e) {
+ var c = e.which || e.keyCode;
+ var anyShiftPressed = e.shiftKey || e.ctrlKey || e.altKey || e.metaKey;
+ switch (c) {
+ case 13:
+ c = anyShiftPressed ? 13 : 10; // RETURN vs ENTER (Mac)
+ break;
+ case 8:
+ c = anyShiftPressed ? 127 : 8; // DELETE vs BACKSPACE (Mac)
+ break;
+ }
+ return new Char(c);
+ }
+
+ function suppressKeyEvent(e) {
+ if (typeof e.preventDefault === "function") {
+ e.preventDefault();
+ } else if (typeof e.stopPropagation === "function") {
+ e.stopPropagation();
+ }
+ return false;
+ }
+
+ function updateKeyPressed() {
+ var ch;
+ for (ch in pressedKeysMap) {
+ if (pressedKeysMap.hasOwnProperty(ch)) {
+ p.__keyPressed = true;
+ return;
+ }
+ }
+ p.__keyPressed = false;
+ }
+
+ function resetKeyPressed() {
+ p.__keyPressed = false;
+ pressedKeysMap = [];
+ lastPressedKeyCode = null;
+ }
+
+ function simulateKeyTyped(code, c) {
+ pressedKeysMap[code] = c;
+ lastPressedKeyCode = null;
+ p.key = c;
+ p.keyCode = code;
+ p.keyPressed();
+ p.keyCode = 0;
+ p.keyTyped();
+ updateKeyPressed();
+ }
+
+ function handleKeydown(e) {
+ var code = getKeyCode(e);
+ if (code === PConstants.DELETE) {
+ simulateKeyTyped(code, new Char(127));
+ return;
+ }
+ if (codedKeys.indexOf(code) < 0) {
+ lastPressedKeyCode = code;
+ return;
+ }
+ var c = new Char(PConstants.CODED);
+ p.key = c;
+ p.keyCode = code;
+ pressedKeysMap[code] = c;
+ p.keyPressed();
+ lastPressedKeyCode = null;
+ updateKeyPressed();
+ return suppressKeyEvent(e);
+ }
+
+ function handleKeypress(e) {
+ if (lastPressedKeyCode === null) {
+ return; // processed in handleKeydown
+ }
+ var code = lastPressedKeyCode, c = getKeyChar(e);
+ simulateKeyTyped(code, c);
+ return suppressKeyEvent(e);
+ }
+
+ function handleKeyup(e) {
+ var code = getKeyCode(e), c = pressedKeysMap[code];
+ if (c === undef) {
+ return; // no keyPressed event was generated.
+ }
+ p.key = c;
+ p.keyCode = code;
+ p.keyReleased();
+ delete pressedKeysMap[code];
+ updateKeyPressed();
+ }
+
+ // Send aCode Processing syntax to be converted to JavaScript
+ if (!pgraphicsMode) {
+ if (aCode instanceof Processing.Sketch) {
+ // Use sketch as is
+ curSketch = aCode;
+ } else if (typeof aCode === "function") {
+ // Wrap function with default sketch parameters
+ curSketch = new Processing.Sketch(aCode);
+ } else if (!aCode) {
+ // Empty sketch
+ curSketch = new Processing.Sketch(function (){});
+ } else {
+ //#if PARSER
+ // Compile the code
+ curSketch = Processing.compile(aCode);
+ //#else
+ // throw "PJS compile is not supported";
+ //#endif
+ }
+
+ // Expose internal field for diagnostics and testing
+ p.externals.sketch = curSketch;
+
+ wireDimensionalFunctions();
+
+ // the onfocus and onblur events are handled in two parts.
+ // 1) the p.focused property is handled per sketch
+ curElement.onfocus = function() {
+ p.focused = true;
+ };
+
+ curElement.onblur = function() {
+ p.focused = false;
+ if (!curSketch.options.globalKeyEvents) {
+ resetKeyPressed();
+ }
+ };
+
+ // 2) looping status is handled per page, based on the pauseOnBlur @pjs directive
+ if (curSketch.options.pauseOnBlur) {
+ attachEventHandler(window, 'focus', function() {
+ if (doLoop) {
+ p.loop();
+ }
+ });
+
+ attachEventHandler(window, 'blur', function() {
+ if (doLoop && loopStarted) {
+ p.noLoop();
+ doLoop = true; // make sure to keep this true after the noLoop call
+ }
+ resetKeyPressed();
+ });
+ }
+
+ // if keyboard events should be handled globally, the listeners should
+ // be bound to the document window, rather than to the current canvas
+ var keyTrigger = curSketch.options.globalKeyEvents ? window : curElement;
+ attachEventHandler(keyTrigger, "keydown", handleKeydown);
+ attachEventHandler(keyTrigger, "keypress", handleKeypress);
+ attachEventHandler(keyTrigger, "keyup", handleKeyup);
+
+ // Step through the libraries that were attached at doc load...
+ for (var i in Processing.lib) {
+ if (Processing.lib.hasOwnProperty(i)) {
+ if(Processing.lib[i].hasOwnProperty("attach")) {
+ // use attach function if present
+ Processing.lib[i].attach(p);
+ } else if(Processing.lib[i] instanceof Function) {
+ // Init the libraries in the context of this p_instance (legacy)
+ Processing.lib[i].call(this);
+ }
+ }
+ }
+
+ // sketch execute test interval, used to reschedule
+ // an execute when preloads have not yet finished.
+ var retryInterval = 100;
+
+ var executeSketch = function(processing) {
+ // Don't start until all specified images and fonts in the cache are preloaded
+ if (!(curSketch.imageCache.pending || PFont.preloading.pending(retryInterval))) {
+ // the opera preload cache can only be cleared once we start
+ if (window.opera) {
+ var link,
+ element,
+ operaCache=curSketch.imageCache.operaCache;
+ for (link in operaCache) {
+ if(operaCache.hasOwnProperty(link)) {
+ element = operaCache[link];
+ if (element !== null) {
+ document.body.removeChild(element);
+ }
+ delete(operaCache[link]);
+ }
+ }
+ }
+
+ curSketch.attach(processing, defaultScope);
+
+ // pass a reference to the p instance for this sketch.
+ curSketch.onLoad(processing);
+
+ // Run void setup()
+ if (processing.setup) {
+ processing.setup();
+ // if any transforms were performed in setup reset to identity matrix
+ // so draw loop is unpolluted
+ processing.resetMatrix();
+ curSketch.onSetup();
+ }
+
+ // some pixels can be cached, flushing
+ resetContext();
+
+ if (processing.draw) {
+ if (!doLoop) {
+ processing.redraw();
+ } else {
+ processing.loop();
+ }
+ }
+ } else {
+ window.setTimeout(function() { executeSketch(processing); }, retryInterval);
+ }
+ };
+
+ // Only store an instance of non-createGraphics instances.
+ addInstance(this);
+
+ // The parser adds custom methods to the processing context
+ // this renames p to processing so these methods will run
+ executeSketch(p);
+ } else {
+ // No executable sketch was specified
+ // or called via createGraphics
+ curSketch = new Processing.Sketch();
+
+ wireDimensionalFunctions();
+
+ // Hack to make PGraphics work again after splitting size()
+ p.size = function(w, h, render) {
+ if (render && render === PConstants.WEBGL) {
+ wireDimensionalFunctions('3D');
+ } else {
+ wireDimensionalFunctions('2D');
+ }
+
+ p.size(w, h, render);
+ };
+ }
+ };
+
+ // Place-holder for overridable debugging function
+ Processing.debug = (function() {
+ if ("console" in window) {
+ return function(msg) {
+ window.console.log('Processing.js: ' + msg);
+ };
+ }
+ return noop;
+ }());
+
+ // bind prototype
+ Processing.prototype = defaultScope;
+
+ /**
+ * instance store and lookup
+ */
+ Processing.instances = processingInstances;
+ Processing.getInstanceById = function(name) {
+ return processingInstances[processingInstanceIds[name]];
+ };
+
+ // Unsupported Processing File and I/O operations.
+ (function(Processing) {
+ var unsupportedP5 = ("open() createOutput() createInput() BufferedReader selectFolder() " +
+ "dataPath() createWriter() selectOutput() beginRecord() " +
+ "saveStream() endRecord() selectInput() saveBytes() createReader() " +
+ "beginRaw() endRaw() PrintWriter delay()").split(" "),
+ count = unsupportedP5.length,
+ prettyName,
+ p5Name;
+
+ function createUnsupportedFunc(n) {
+ return function() {
+ throw "Processing.js does not support " + n + ".";
+ };
+ }
+
+ while (count--) {
+ prettyName = unsupportedP5[count];
+ p5Name = prettyName.replace("()", "");
+ Processing[p5Name] = createUnsupportedFunc(prettyName);
+ }
+ }(defaultScope));
+
+ // we're done. Return our object.
+ return Processing;
+};
+
+},{}],28:[function(require,module,exports){
+// Base source files
+var source = {
+ virtEquals: require("./Helpers/virtEquals"),
+ virtHashCode: require("./Helpers/virtHashCode"),
+ ObjectIterator: require("./Helpers/ObjectIterator"),
+ PConstants: require("./Helpers/PConstants"),
+ ArrayList: require("./Objects/ArrayList"),
+ HashMap: require("./Objects/HashMap"),
+ PVector: require("./Objects/PVector"),
+ PFont: require("./Objects/PFont"),
+ Char: require("./Objects/Char"),
+ XMLAttribute: require("./Objects/XMLAttribute"),
+ XMLElement: require("./Objects/XMLElement"),
+ PMatrix2D: require("./Objects/PMatrix2D"),
+ PMatrix3D: require("./Objects/PMatrix3D"),
+ PShape: require("./Objects/PShape"),
+ colors: require("./Objects/webcolors"),
+ PShapeSVG: require("./Objects/PShapeSVG"),
+ CommonFunctions: require("./P5Functions/commonFunctions"),
+ defaultScope: require("./Helpers/defaultScope"),
+ Processing: require("./Processing"),
+ setupParser: require("./Parser/Parser"),
+ finalize: require("./Helpers/finalizeProcessing")
+};
+
+// Additional code that gets tacked onto "p" during
+// instantiation of a Processing sketch.
+source.extend = {
+ withMath: require("./P5Functions/Math.js"),
+ withProxyFunctions: require("./P5Functions/JavaProxyFunctions")(source.virtHashCode, source.virtEquals),
+ withTouch: require("./P5Functions/touchmouse"),
+ withCommonFunctions: source.CommonFunctions.withCommonFunctions
+};
+
+/**
+ * Processing.js building function
+ */
+module.exports = function buildProcessingJS(Browser, testHarness) {
+ var noop = function(){},
+ virtEquals = source.virtEquals,
+ virtHashCode = source.virtHashCode,
+ PConstants = source.PConstants,
+ CommonFunctions = source.CommonFunctions,
+ ObjectIterator = source.ObjectIterator,
+ Char = source.Char,
+ XMLAttribute = source.XMLAttribute(),
+
+ ArrayList = source.ArrayList({
+ virtHashCode: virtHashCode,
+ virtEquals: virtEquals
+ }),
+
+ HashMap = source.HashMap({
+ virtHashCode: virtHashCode,
+ virtEquals: virtEquals
+ }),
+
+ PVector = source.PVector({
+ PConstants: PConstants
+ }),
+
+ PFont = source.PFont({
+ Browser: Browser,
+ noop: noop
+ }),
+
+ XMLElement = source.XMLElement({
+ Browser: Browser,
+ XMLAttribute: XMLAttribute
+ }),
+
+ PMatrix2D = source.PMatrix2D({
+ p:CommonFunctions
+ }),
+
+ PMatrix3D = source.PMatrix3D({
+ p:CommonFunctions
+ }),
+
+ PShape = source.PShape({
+ PConstants: PConstants,
+ PMatrix2D: PMatrix2D,
+ PMatrix3D: PMatrix3D
+ }),
+
+ PShapeSVG = source.PShapeSVG({
+ CommonFunctions: CommonFunctions,
+ PConstants: PConstants,
+ PShape: PShape,
+ XMLElement: XMLElement,
+ colors: source.colors
+ }),
+
+ defaultScope = source.defaultScope({
+ ArrayList: ArrayList,
+ HashMap: HashMap,
+ PVector: PVector,
+ PFont: PFont,
+ PShapeSVG: PShapeSVG,
+ ObjectIterator: ObjectIterator,
+ PConstants: PConstants,
+ Char: Char,
+ XMLElement: XMLElement,
+ XML: XMLElement
+ }),
+
+ Processing = source.Processing({
+ defaultScope: defaultScope,
+ Browser: Browser,
+ extend: source.extend,
+ noop: noop
+ });
+
+ // set up the Processing syntax parser
+ Processing = source.setupParser(Processing, {
+ Browser: Browser,
+ aFunctions: testHarness,
+ defaultScope: defaultScope
+ });
+
+ // finalise the Processing object
+ Processing = source.finalize(Processing, {
+ version: require('../package.json').version,
+ isDomPresent: false || Browser.isDomPresent,
+ window: Browser.window,
+ document: Browser.document,
+ noop: noop
+ });
+
+ // done.
+ return Processing;
+};
+
+},{"../package.json":2,"./Helpers/ObjectIterator":3,"./Helpers/PConstants":4,"./Helpers/defaultScope":6,"./Helpers/finalizeProcessing":7,"./Helpers/virtEquals":8,"./Helpers/virtHashCode":9,"./Objects/ArrayList":10,"./Objects/Char":11,"./Objects/HashMap":12,"./Objects/PFont":13,"./Objects/PMatrix2D":14,"./Objects/PMatrix3D":15,"./Objects/PShape":16,"./Objects/PShapeSVG":17,"./Objects/PVector":18,"./Objects/XMLAttribute":19,"./Objects/XMLElement":20,"./Objects/webcolors":21,"./P5Functions/JavaProxyFunctions":22,"./P5Functions/Math.js":23,"./P5Functions/commonFunctions":24,"./P5Functions/touchmouse":25,"./Parser/Parser":26,"./Processing":27}]},{},[1]);
diff --git a/src/http/static/viz/1/quil/core.cljc b/src/http/static/viz/1/quil/core.cljc
new file mode 100644
index 0000000..dcdaa94
--- /dev/null
+++ b/src/http/static/viz/1/quil/core.cljc
@@ -0,0 +1,4993 @@
+(ns ^{:doc "Wrappers and extensions around the core Processing.org API."}
+ quil.core
+ #?(:clj
+ (:import [processing.core PApplet PImage PGraphics PFont PConstants PShape]
+ [processing.opengl PShader]
+ [java.awt.event KeyEvent]))
+ #?(:clj
+ (:require quil.sketch
+ [clojure.set]
+ [quil.helpers.docs :as docs]
+ [quil.util :as u]
+ [quil.applet :as ap])
+
+ :cljs
+ (:require clojure.string
+ org.processingjs.Processing
+ [quil.sketch :as ap :include-macros true]
+ [quil.util :as u :include-macros true])))
+
+(def ^{:dynamic true
+ :private true}
+ *graphics* nil)
+
+(def ^{:private true} no-fill-prop "no-fill-quil")
+
+(defn
+ ^{:requires-bindings true
+ :category "Environment"
+ :subcategory nil
+ :added "2.0"
+ :tag PGraphics}
+ current-graphics
+ "Graphics currently used for drawing. By default it is sketch graphics,
+ but if called inside with-graphics macro - graphics passed to the macro
+ is returned. This method should be used if you need to call some methods
+ that are not implemented by quil. Example:
+ (.beginDraw (current-graphics))."
+ []
+ (or *graphics*
+ #?(:clj (.-g (ap/current-applet))
+ :cljs (ap/current-applet))))
+
+;; -------------------- PConstants section -----------------------
+
+(u/generate-quil-constants #?(:clj :clj :cljs :cljs)
+ arc-modes (:open :chord :pie)
+ shape-modes (:points :lines :triangles :triangle-fan :triangle-strip :quads :quad-strip)
+ blend-modes (:blend :add :subtract :darkest :lightest :difference :exclusion :multiply
+ :screen :overlay :replace :hard-light :soft-light :dodge :burn)
+ color-modes (:rgb :hsb)
+ image-formats (:rgb :argb :alpha)
+ ellipse-modes (:center :radius :corner :corners)
+ hint-options (:enable-depth-test :disable-depth-test
+ :enable-depth-sort :disable-depth-sort
+ :enable-depth-mask :disable-depth-mask
+ :enable-opengl-errors :disable-opengl-errors
+ :enable-optimized-stroke :disable-optimized-stroke
+ :enable-stroke-perspective :disable-stroke-perspective
+ :enable-stroke-pure :disable-stroke-pure
+ :enable-texture-mipmaps :disable-texture-mipmaps)
+ image-modes (:corner :corners :center)
+ rect-modes (:corner :corners :center :radius)
+ p-shape-modes (:corner :corners :center)
+ stroke-cap-modes (:square :round :project :model)
+ stroke-join-modes (:miter :bevel :round)
+ horizontal-alignment-modes (:left :center :right)
+ vertical-alignment-modes (:top :bottom :center :baseline)
+ text-modes (:model :shape)
+ texture-modes (:image :normal)
+ texture-wrap-modes (:clamp :repeat)
+ filter-modes (:threshold :gray :invert :posterize :blur :opaque :erode :dilate)
+ cursor-modes (:arrow :cross :hand :move :text :wait))
+
+;;; Useful trig constants
+#?(:clj (def PI (float Math/PI))
+ :cljs (def PI (.-PI js/Math)))
+(def HALF-PI (/ PI (float 2.0)))
+(def THIRD-PI (/ PI (float 3.0)))
+(def QUARTER-PI (/ PI (float 4.0)))
+(def TWO-PI (* PI (float 2.0)))
+
+(def DEG-TO-RAD (/ PI (float 180.0)))
+(def RAD-TO-DEG (/ (float 180.0) PI))
+
+#?(:clj
+ (def ^{:private true}
+ KEY-CODES {KeyEvent/VK_UP :up
+ KeyEvent/VK_DOWN :down
+ KeyEvent/VK_LEFT :left
+ KeyEvent/VK_RIGHT :right
+ KeyEvent/VK_ALT :alt
+ KeyEvent/VK_CONTROL :control
+ KeyEvent/VK_SHIFT :shift
+ KeyEvent/VK_WINDOWS :command
+ KeyEvent/VK_META :command
+ KeyEvent/VK_F1 :f1
+ KeyEvent/VK_F2 :f2
+ KeyEvent/VK_F3 :f3
+ KeyEvent/VK_F4 :f4
+ KeyEvent/VK_F5 :f5
+ KeyEvent/VK_F6 :f6
+ KeyEvent/VK_F7 :f7
+ KeyEvent/VK_F8 :f8
+ KeyEvent/VK_F9 :f9
+ KeyEvent/VK_F10 :f10
+ KeyEvent/VK_F11 :f11
+ KeyEvent/VK_F12 :f12
+ KeyEvent/VK_F13 :f13
+ KeyEvent/VK_F14 :f14
+ KeyEvent/VK_F15 :f15
+ KeyEvent/VK_F16 :f16
+ KeyEvent/VK_F17 :f17
+ KeyEvent/VK_F18 :f18
+ KeyEvent/VK_F19 :f19
+ KeyEvent/VK_F20 :f20
+ KeyEvent/VK_F21 :f21
+ KeyEvent/VK_F22 :f22
+ KeyEvent/VK_F23 :f23
+ KeyEvent/VK_F24 :f24})
+
+ :cljs
+ (def ^{:private true}
+ KEY-CODES {38 :up
+ 40 :down
+ 37 :left
+ 39 :right
+ 18 :alt
+ 17 :control
+ 16 :shift
+ 157 :command
+ 112 :f1
+ 113 :f2
+ 114 :f3
+ 115 :f4
+ 116 :f5
+ 117 :f6
+ 118 :f7
+ 119 :f8
+ 120 :f9
+ 121 :f10
+ 122 :f11
+ 123 :f12}))
+
+;; ------------------ end PConstants section ---------------------
+
+#?(:cljs
+ (defn
+ ^{:require-bindings true
+ :category "Output"
+ :subcategory "Text area"
+ :added "1.0"}
+ prc-println
+ "Writes to the text area of the Processing environment's console.
+ This is often helpful for looking at the data a program is producing.
+ Each call to this function creates a new line of output.
+ Individual elements can be separated with quotes (\"\") and joined with the string concatenation operator (+).
+ Also writes the content of an array to the text area of the Processing environment.
+ This is often helpful for looking at the data a program is producing.
+ A new line is put between each element of the array. This function can only print 1D arrays,
+ but can test to see if the content are null or not null for 2+ dimensional arrays."
+ [msg]
+ (.println (ap/current-applet) msg)))
+
+#?(:cljs
+ (defn
+ ^{:require-bindings true
+ :category "Output"
+ :subcategory "Text area"
+ :added "1.0"}
+ prc-print
+ "Writes to the console area of the Processing environment.
+ This is often helpful for looking at the data a program is producing.
+ The companion function println() works like print(), but creates a new line of text for each call to the function.
+ Individual elements can be separated with quotes (\"\") and joined with the addition operator (+). "
+ [msg]
+ (.print (ap/current-applet) msg)))
+
+#?(:cljs
+ (defn
+ ^{:requires-bindings true
+ :processing-name "getSketchById()"
+ :category nil
+ :subcategory nil
+ :added "1.0"}
+ get-sketch-by-id
+ "Returns sketch object by id of canvas element of sketch."
+ [id]
+ (.getInstanceById js/Processing id)))
+
+(defmacro with-sketch [applet & body]
+ (when-not (u/clj-compilation?)
+ `(quil.sketch/with-sketch ~applet ~@body)))
+
+(defn
+ ^{:requires-bindings true
+ :category "State"
+ :subcategory nil
+ :added "1.0"}
+ state-atom
+ "Retrieve sketch-specific state-atom. All changes to the
+ atom will be reflected in the state.
+
+ (set-state! :foo 1)
+ (state :foo) ;=> 1
+ (swap! (state-atom) update-in [:foo] inc)
+ (state :foo) ;=> 2"
+ #?(:clj ([] (-> (ap/current-applet) meta :state))
+ :cljs ([] (. (ap/current-applet) -quil))))
+
+(defn
+ ^{:requires-bindings true
+ :category "State"
+ :subcategory nil
+ :added "1.0"}
+ state
+ "Retrieve sketch-specific state by key. Must initially call
+ set-state! to store state. If no parameter passed whole
+ state map is returned.
+
+ (set-state! :foo 1)
+ (state :foo) ;=> 1
+ (state) ;=> {:foo 1}"
+ ([] @(state-atom))
+
+ ([key] (let [state (state)]
+ (when-not (contains? state key)
+ (throw #?(:clj (Exception. (str "Unable to find state with key: " key))
+ :cljs (js/Error (str "Unable to find state with key: " key)))))
+ (get state key))))
+
+(defn
+ ^{:requires-bindings true
+ :category "State"
+ :subcategory nil
+ :added "1.0"}
+ set-state!
+ "Set sketch-specific state. May only be called once (ideally in the
+ setup fn). Subsequent calls have no effect.
+
+ Example:
+ (set-state! :foo 1 :bar (atom true) :baz (/ (width) 2))"
+ [& state-vals]
+ (let [state* (state-atom)]
+ (when-not @state*
+ (let [state-map (apply hash-map state-vals)]
+ (reset! state* state-map)))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name "abs()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ abs-int
+ "Calculates the absolute value (magnitude) of a number. The absolute
+ value of a number is always positive. Takes and returns an int."
+ [n]
+ (PApplet/abs (int n))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name "abs()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ abs-float
+ "Calculates the absolute value (magnitude) of a number. The absolute
+ value of a number is always positive. Takes and returns a float."
+ [n]
+ (PApplet/abs (float n))))
+
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "abs()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ abs
+ "Calculates the absolute value (magnitude) of a number. The
+ absolute value of a number is always positive. Dynamically casts to
+ an int or float appropriately"
+ [n]
+ #?(:clj
+ (if (u/int-like? n)
+ (abs-int n)
+ (abs-float n))
+ :cljs
+ (.abs (ap/current-applet) n)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "acos()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ acos
+ "The inverse of cos, returns the arc cosine of a value. This
+ function expects the values in the range of -1 to 1 and values are
+ returned in the range 0 to Math/PI (3.1415927)."
+ [n]
+ #?(:clj (PApplet/acos (float n))
+ :cljs (.acos (ap/current-applet) n)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "alpha()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ alpha
+ "Extracts the alpha value from a color."
+ [color]
+ (.alpha (current-graphics) (unchecked-int color)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ambient()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ ambient-float
+ "Sets the ambient reflectance for shapes drawn to the screen. This
+ is combined with the ambient light component of environment. The
+ color components set through the parameters define the
+ reflectance. For example in the default color mode, setting x=255,
+ y=126, z=0, would cause all the red light to reflect and half of the
+ green light to reflect. Used in combination with emissive, specular,
+ and shininess in setting the material properties of shapes."
+ ([gray] (.ambient (current-graphics) (float gray)))
+ ([x y z] (.ambient (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ambient()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ ambient-int
+ "Sets the ambient reflectance for shapes drawn to the screen. This
+ is combined with the ambient light component of environment. The rgb
+ color components set define the reflectance. Used in combination
+ with emissive, specular, and shininess in setting the material
+ properties of shapes."
+ [rgb]
+ (.ambient (current-graphics) (int rgb)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ambient()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ ambient
+ "Sets the ambient reflectance for shapes drawn to the screen. This
+ is combined with the ambient light component of environment. The
+ color components set through the parameters define the
+ reflectance. For example in the default color mode, setting x=255,
+ y=126, z=0, would cause all the red light to reflect and half of the
+ green light to reflect. Used in combination with emissive, specular,
+ and shininess in setting the material properties of shapes."
+ ([rgb]
+ #?(:clj (if (u/int-like? rgb) (ambient-int rgb) (ambient-float rgb))
+ :cljs (ambient-float rgb)))
+ ([x y z] (ambient-float x y z)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ambientLight()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ ambient-light
+ "Adds an ambient light. Ambient light doesn't come from a specific direction,
+ the rays have light have bounced around so much that objects are
+ evenly lit from all sides. Ambient lights are almost always used in
+ combination with other types of lights. Lights need to be included
+ in the draw to remain persistent in a looping program. Placing them
+ in the setup of a looping program will cause them to only have an
+ effect the first time through the loop. The effect of the
+ parameters is determined by the current color mode."
+ ([red green blue]
+ (.ambientLight (current-graphics) (float red) (float green) (float blue)))
+ ([red green blue x y z]
+ (.ambientLight (current-graphics) (float red) (float green) (float blue)
+ (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "applyMatrix()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ apply-matrix
+ "Multiplies the current matrix by the one specified through the
+ parameters. This is very slow because it will try to calculate the
+ inverse of the transform, so avoid it whenever possible. The
+ equivalent function in OpenGL is glMultMatrix()."
+ #?(:clj
+ ([n00 n01 n02 n10 n11 n12]
+ (.applyMatrix (current-graphics)
+ (float n00) (float n01) (float n02)
+ (float n10) (float n11) (float n12))))
+ ([n00 n01 n02 n03
+ n10 n11 n12 n13
+ n20 n21 n22 n23
+ n30 n31 n32 n33]
+ (.applyMatrix (current-graphics)
+ (float n00) (float n01) (float n02) (float n03)
+ (float n10) (float n11) (float n12) (float n13)
+ (float n20) (float n21) (float n22) (float n23)
+ (float n30) (float n31) (float n32) (float n33))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "arc()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ arc
+ "Draws an arc in the display window. Arcs are drawn along the outer
+ edge of an ellipse defined by the x, y, width and height
+ parameters. The origin or the arc's ellipse may be changed with the
+ ellipse-mode function. The start and stop parameters specify the
+ angles at which to draw the arc. The mode is either :open, :chord or :pie."
+ ([x y width height start stop]
+ (.arc (current-graphics) (float x) (float y) (float width) (float height)
+ (float start) (float stop)))
+
+ #?(:clj
+ ([x y width height start stop mode]
+ (let [arc-mode (u/resolve-constant-key mode arc-modes)]
+ (.arc (current-graphics) (float x) (float y) (float width) (float height)
+ (float start) (float stop) (int arc-mode))))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "asin()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ asin
+ "The inverse of sin, returns the arc sine of a value. This function
+ expects the values in the range of -1 to 1 and values are returned
+ in the range -PI/2 to PI/2."
+ [n]
+ #?(:clj (PApplet/asin (float n))
+ :cljs (.asin (ap/current-applet) n)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "atan()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ atan
+ "The inverse of tan, returns the arc tangent of a value. This
+ function expects the values in the range of -Infinity to
+ Infinity (exclusive) and values are returned in the range -PI/2 to
+ PI/2 ."
+ [n]
+ #?(:clj (PApplet/atan (float n))
+ :cljs (.atan (ap/current-applet) n)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "atan2()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ atan2
+ "Calculates the angle (in radians) from a specified point to the
+ coordinate origin as measured from the positive x-axis. Values are
+ returned as a float in the range from PI to -PI. The atan2 function
+ is most often used for orienting geometry to the position of the
+ cursor. Note: The y-coordinate of the point is the first parameter
+ and the x-coordinate is the second due to the structure of
+ calculating the tangent."
+ [y x]
+ #?(:clj (PApplet/atan2 (float y) (float x))
+ :cljs (.atan2 (ap/current-applet) y x)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "PFont.list()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ available-fonts
+ "A sequence of strings representing the fonts on this system
+ available for use.
+
+ Because of limitations in Java, not all fonts can be used and some
+ might work with one operating system and not others. When sharing a
+ sketch with other people or posting it on the web, you may need to
+ include a .ttf or .otf version of your font in the data directory of
+ the sketch because other people might not have the font installed on
+ their computer. Only fonts that can legally be distributed should be
+ included with a sketch."
+ []
+ #?(:clj (seq (PFont/list))
+ :cljs (seq (.list js/PFont))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "background()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ background-float
+ "Sets the color used for the background of the Processing
+ window. The default background is light gray. In the draw function,
+ the background color is used to clear the display window at the
+ beginning of each frame.
+
+ It is not possible to use transparency (alpha) in background colors
+ with the main drawing surface, however they will work properly with
+ create-graphics. Converts args to floats."
+ ([gray] (.background (current-graphics) (float gray)))
+ ([gray alpha] (.background (current-graphics) (float gray) (float alpha)))
+ ([r g b] (.background (current-graphics) (float r) (float g) (float b)))
+ ([r g b a] (.background (current-graphics) (float r) (float g) (float b) (float a))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "background()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ background-int
+ "Sets the color used for the background of the Processing
+ window. The default background is light gray. In the draw function,
+ the background color is used to clear the display window at the
+ beginning of each frame.
+
+ It is not possible to use transparency (alpha) in background colors
+ with the main drawing surface, however they will work properly with
+ create-graphics. Converts rgb to an int and alpha to a float."
+ ([rgb] (.background (current-graphics) (unchecked-int rgb)))
+ ([rgb alpha] (.background (current-graphics) (unchecked-int rgb) (float alpha))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "background()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ background
+ "Sets the color used for the background of the Processing
+ window. The default background is light gray. In the draw function,
+ the background color is used to clear the display window at the
+ beginning of each frame.
+
+ It is not possible to use transparency (alpha) in background colors
+ with the main drawing surface, however they will work properly with
+ create-graphics. Converts args to floats."
+ #?(:clj ([rgb] (if (u/int-like? rgb) (background-int rgb) (background-float rgb)))
+ :cljs ([rgb] (.background (current-graphics) rgb)))
+ #?(:clj ([rgb alpha] (if (u/int-like? rgb) (background-int rgb alpha) (background-float rgb alpha)))
+ :cljs ([rgb alpha] (.background (current-graphics) rgb alpha)))
+ ([r g b] (background-float r g b))
+ ([r g b a] (background-float r g b a)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "background()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ background-image
+ "Specify an image to be used as the background for a sketch. Its
+ width and height must be the same size as the sketch window. Images
+ used as background will ignore the current tint setting."
+ [^PImage img]
+ (.background (current-graphics) img))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "beginCamera()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ begin-camera
+ "Sets the matrix mode to the camera matrix so calls such as
+ translate, rotate, apply-matrix and reset-matrix affect the
+ camera. begin-camera should always be used with a following
+ end-camera and pairs of begin-camera and end-camera cannot be
+ nested.
+
+ For most situations the camera function will be sufficient."
+ []
+ (.beginCamera (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "beginContour()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "2.0"}
+ begin-contour
+ "Use the begin-contour and end-contour function to create negative
+ shapes within shapes. These functions can only be within a
+ begin-shape/end-shape pair and they only work with the :p2d and :p3d
+ renderers."
+ []
+ (.beginContour (current-graphics)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "beginRaw()"
+ :category "Output"
+ :subcategory "Files"
+ :added "1.0"}
+ begin-raw
+ "Enables the creation of vectors from 3D data. Requires
+ corresponding end-raw command. These commands will grab the shape
+ data just before it is rendered to the screen. At this stage, your
+ entire scene is nothing but a long list of individual lines and
+ triangles. This means that a shape created with sphere method will
+ be made up of hundreds of triangles, rather than a single object. Or
+ that a multi-segment line shape (such as a curve) will be rendered
+ as individual segments."
+ ([renderer filename]
+ (.beginRaw (ap/current-applet) (ap/resolve-renderer renderer) (u/absolute-path filename)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "beginShape()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ begin-shape
+ "Enables the creation of complex forms. begin-shape begins recording
+ vertices for a shape and end-shape stops recording. Use the mode
+ keyword to specify which shape create from the provided
+ vertices. With no mode specified, the shape can be any irregular
+ polygon.
+
+ The available mode keywords are :points, :lines, :triangles,
+ :triangle-fan, :triangle-strip,
+ :quads, :quad-strip.
+
+ After calling the begin-shape function, a series of vertex commands
+ must follow. To stop drawing the shape, call end-shape. The vertex
+ function with two parameters specifies a position in 2D and the
+ vertex function with three parameters specifies a position in
+ 3D. Each shape will be outlined with the current stroke color and
+ filled with the fill color.
+
+ Transformations such as translate, rotate, and scale do not work
+ within begin-shape. It is also not possible to use other shapes,
+ such as ellipse or rect within begin-shape."
+ ([] (.beginShape (current-graphics)))
+ ([mode]
+ (let [mode (u/resolve-constant-key mode shape-modes)]
+ (.beginShape (current-graphics) (int mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "bezier()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ bezier
+ "Draws a Bezier curve on the screen. These curves are defined by a
+ series of anchor and control points. The first two parameters
+ specify the first anchor point and the last two parameters specify
+ the other anchor point. The middle parameters specify the control
+ points which define the shape of the curve."
+ ([x1 y1 cx1 cy1 cx2 cy2 x2 y2]
+ (.bezier (current-graphics)
+ (float x1) (float y1)
+ (float cx1) (float cy1)
+ (float cx2) (float cy2)
+ (float x2) (float y2)))
+ ([x1 y1 z1 cx1 cy1 cz1 cx2 cy2 cz2 x2 y2 z2]
+ (.bezier (current-graphics)
+ (float x1) (float y1) (float z1)
+ (float cx1) (float cy1) (float cz1)
+ (float cx2) (float cy2) (float cz2)
+ (float x2) (float y2) (float z2))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "bezierDetail()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ bezier-detail
+ "Sets the resolution at which Beziers display. The default value is
+ 20. This function is only useful when using the :p3d or :opengl
+ renderer as the default (:java2d) renderer does not use this
+ information."
+ [detail]
+ (.bezierDetail (current-graphics) (int detail)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "bezierPoint()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ bezier-point
+ "Evaluates the Bezier at point t for points a, b, c, d. The
+ parameter t varies between 0 and 1, a and d are points on the curve,
+ and b and c are the control points. This can be done once with the x
+ coordinates and a second time with the y coordinates to get the
+ location of a bezier curve at t."
+ [a b c d t]
+ (.bezierPoint (current-graphics) (float a) (float b) (float c)
+ (float d) (float t)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "bezierTangent()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ bezier-tangent
+ "Calculates the tangent of a point on a Bezier curve.
+ (See http://en.wikipedia.org/wiki/Tangent)"
+ [a b c d t]
+ (.bezierTangent (current-graphics) (float a) (float b) (float c)
+ (float d) (float t)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "bezierVertex()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ bezier-vertex
+ "Specifies vertex coordinates for Bezier curves. Each call to
+ bezier-vertex defines the position of two control points and one
+ anchor point of a Bezier curve, adding a new segment to a line or
+ shape. The first time bezier-vertex is used within a begin-shape
+ call, it must be prefaced with a call to vertex to set the first
+ anchor point. This function must be used between begin-shape and
+ end-shape and only when there is no parameter specified to
+ begin-shape."
+ ([cx1 cy1 cx2 cy2 x y]
+ (.bezierVertex (current-graphics)
+ (float cx1) (float cy1)
+ (float cx2) (float cy2)
+ (float x) (float y)))
+ ([cx1 cy1 cz1 cx2 cy2 cz2 x y z]
+ (.bezierVertex (current-graphics)
+ (float cx1) (float cy1) (float cz1)
+ (float cx2) (float cy2) (float cz2)
+ (float x) (float y) (float z))))
+
+(defn
+ ^{:require-binding false
+ :processing-name "binary()"
+ :category "Data"
+ :subcategory "Conversion"
+ :added "1.0"}
+ binary
+ "Returns a string representing the binary value of an int, char or
+ byte. When converting an int to a string, it is possible to specify
+ the number of digits used."
+ ([val]
+ #?(:clj (PApplet/binary (int val))
+ :cljs (.binary (ap/current-applet) val)))
+ ([val num-digits]
+ #?(:clj (PApplet/binary (int val) (int num-digits))
+ :cljs (.binary (ap/current-applet) val num-digits))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "blend()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ blend
+ "Blends a region of pixels from one image into another with full alpha
+ channel support. If src is not specified it defaults to current-graphics.
+ If dest is not specified it defaults to current-graphics.
+
+ Note: blend-mode function is recommended to use instead of this one.
+
+ Available blend modes are:
+
+ :blend - linear interpolation of colours: C = A*factor + B
+ :add - additive blending with white clip:
+ C = min(A*factor + B, 255)
+ :subtract - subtractive blending with black clip:
+ C = max(B - A*factor, 0)
+ :darkest - only the darkest colour succeeds:
+ C = min(A*factor, B)
+ :lightest - only the lightest colour succeeds:
+ C = max(A*factor, B)
+ :difference - subtract colors from underlying image.
+ :exclusion - similar to :difference, but less extreme.
+ :multiply - Multiply the colors, result will always be darker.
+ :screen - Opposite multiply, uses inverse values of the colors.
+ :overlay - A mix of :multiply and :screen. Multiplies dark values
+ and screens light values.
+ :hard-light - :screen when greater than 50% gray, :multiply when
+ lower.
+ :soft-light - Mix of :darkest and :lightest. Works like :overlay,
+ but not as harsh.
+ :dodge - Lightens light tones and increases contrast, ignores
+ darks.
+ Called \"Color Dodge\" in Illustrator and Photoshop.
+ :burn - Darker areas are applied, increasing contrast, ignores
+ lights. Called \"Color Burn\" in Illustrator and
+ Photoshop."
+ ([x y width height dx dy dwidth dheight mode]
+ (blend (current-graphics) (current-graphics) x y width height dx dy dwidth dheight mode))
+ ([^PImage src-img x y width height dx dy dwidth dheight mode]
+ (blend src-img (current-graphics) x y width height dx dy dwidth dheight mode))
+ ([^PImage src-img ^PImage dest-img x y width height dx dy dwidth dheight mode]
+ (let [mode (u/resolve-constant-key mode blend-modes)]
+ (.blend dest-img src-img (int x) (int y) (int width) (int height)
+ (int dx) (int dy) (int dwidth) (int dheight) (int mode)))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "blendColor()"
+ :processing-link nil
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ blend-color
+ "Blends two color values together based on the blending mode given specified
+ with the mode keyword.
+
+ Available blend modes are:
+
+ :blend - linear interpolation of colours: C = A*factor + B
+ :add - additive blending with white clip:
+ C = min(A*factor + B, 255)
+ :subtract - subtractive blending with black clip:
+ C = max(B - A*factor, 0)
+ :darkest - only the darkest colour succeeds:
+ C = min(A*factor, B)
+ :lightest - only the lightest colour succeeds:
+ C = max(A*factor, B)
+ :difference - subtract colors from underlying image.
+ :exclusion - similar to :difference, but less extreme.
+ :multiply - Multiply the colors, result will always be darker.
+ :screen - Opposite multiply, uses inverse values of the colors.
+ :overlay - A mix of :multiply and :screen. Multiplies dark values
+ and screens light values.
+ :hard-light - :screen when greater than 50% gray, :multiply when
+ lower.
+ :soft-light - Mix of :darkest and :lightest. Works like :overlay,
+ but not as harsh.
+ :dodge - Lightens light tones and increases contrast, ignores
+ darks.
+ Called \"Color Dodge\" in Illustrator and Photoshop.
+ :burn - Darker areas are applied, increasing contrast, ignores
+ lights. Called \"Color Burn\" in Illustrator and
+ Photoshop."
+ [c1 c2 mode]
+ (let [mode (u/resolve-constant-key mode blend-modes)]
+ #?(:clj (PApplet/blendColor (unchecked-int c1) (unchecked-int c2) (int mode))
+ :cljs (.blendColor (current-graphics) c1 c2 mode))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "blendMode()"
+ :category "Image"
+ :subcategory "Rendering"
+ :added "2.0"}
+ blend-mode
+ "Blends the pixels in the display window according to the defined mode.
+ There is a choice of the following modes to blend the source pixels (A)
+ with the ones of pixels already in the display window (B):
+
+ :blend - linear interpolation of colours: C = A*factor + B
+ :add - additive blending with white clip:
+ C = min(A*factor + B, 255)
+ :subtract - subtractive blending with black clip:
+ C = max(B - A*factor, 0)
+ :darkest - only the darkest colour succeeds:
+ C = min(A*factor, B)
+ :lightest - only the lightest colour succeeds:
+ C = max(A*factor, B)
+ :exclusion - similar to :difference, but less extreme.
+ :multiply - Multiply the colors, result will always be darker.
+ :screen - Opposite multiply, uses inverse values of the colors.
+ :replace - the pixels entirely replace the others and don't utilize
+ alpha (transparency) values
+
+ Note: :hard-light, :soft-light, :dodge, :overlay, :dodge, :burn, :difference
+ modes are not supported by this function.
+
+ factor is alpha value of pixel being drawed"
+ ([mode]
+ (let [mode (u/resolve-constant-key mode blend-modes)]
+ (.blendMode (current-graphics) mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "blue()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ blue
+ "Extracts the blue value from a color, scaled to match current color-mode.
+ Returns a float."
+ [color]
+ (.blue (current-graphics) (unchecked-int color)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "box()"
+ :category "Shape"
+ :subcategory "3D Primitives"
+ :added "1.0"}
+ box
+ "Creates an extruded rectangle."
+ ([size] (.box (current-graphics) (float size)))
+ ([width height depth] (.box (current-graphics) (float width) (float height) (float depth))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "brightness()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ brightness
+ "Extracts the brightness value from a color. Returns a float."
+ [color]
+ (.brightness (current-graphics) (unchecked-int color)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "camera()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ camera
+ "Sets the position of the camera through setting the eye position,
+ the center of the scene, and which axis is facing upward. Moving the
+ eye position and the direction it is pointing (the center of the
+ scene) allows the images to be seen from different angles. The
+ version without any parameters sets the camera to the default
+ position, pointing to the center of the display window with the Y
+ axis as up. The default values are:
+
+ eyeX: (/ (width) 2.0)
+ eyeY: (/ (height) 2.0)
+ eyeZ: (/ (/ (height) 2.0) (tan (/ (* Math/PI 60.0) 360.0)))
+ centerX: (/ (width) 2.0)
+ centerY: (/ (height) 2.0)
+ centerZ: 0
+ upX: 0
+ upY: 1
+ upZ: 0
+
+ Similar imilar to gluLookAt() in OpenGL, but it first clears the
+ current camera settings."
+ ([] (.camera (current-graphics)))
+ ([eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ]
+ (.camera (current-graphics) (float eyeX) (float eyeY) (float eyeZ)
+ (float centerX) (float centerY) (float centerZ)
+ (float upX) (float upY) (float upZ))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "ceil()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ ceil
+ "Calculates the closest int value that is greater than or equal to
+ the value of the parameter. For example, (ceil 9.03) returns the
+ value 10."
+ [n]
+ #?(:clj (PApplet/ceil (float n))
+ :cljs (.ceil (ap/current-applet) n)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "clear()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "2.4.0"}
+ clear
+ "Clears the pixels within a buffer. This function only works on
+ graphics objects created with the (create-graphics) function meaning
+ that you should call it only inside (with-graphics) macro. Unlike
+ the main graphics context (the display window), pixels in additional
+ graphics areas created with (create-graphics) can be entirely or
+ partially transparent. This function clears everything in a graphics
+ object to make all of the pixels 100% transparent."
+ []
+ (.clear (current-graphics))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "clip()"
+ :category "Rendering"
+ :subcategory nil
+ :added "2.4.0"}
+ clip
+ "Limits the rendering to the boundaries of a rectangle defined by
+ the parameters. The boundaries are drawn based on the state of
+ the (image-mode) fuction, either :corner, :corners, or :center.
+ To disable use (no-clip)."
+ [x y w h]
+ (.clip (current-graphics) (float x) (float y) (float w) (float h))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "color()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ color
+ "Creates an integer representation of a color The parameters are
+ interpreted as RGB or HSB values depending on the current
+ color-mode. The default mode is RGB values from 0 to 255 and
+ therefore, the function call (color 255 204 0) will return a bright
+ yellow. Args are cast to floats.
+
+ r - red or hue value
+ g - green or saturation value
+ b - blue or brightness value
+ a - alpha value"
+ ([gray] (.color (current-graphics) (float gray)))
+ ([gray alpha] (.color (current-graphics) (float gray) (float alpha)))
+ ([r g b] (.color (current-graphics) (float r) (float g) (float b)))
+ ([r g b a] (.color (current-graphics) (float r) (float g) (float b) (float a))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "colorMode()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ color-mode
+ "Changes the way Processing interprets color data. Available modes
+ are :rgb and :hsb.By default, the parameters for fill, stroke,
+ background, and color are defined by values between 0 and 255 using
+ the :rgb color model. The color-mode fn is used to change the
+ numerical range used for specifying colors and to switch color
+ systems. For example, calling
+ (color-mode :rgb 1.0) will specify that values are specified between
+ 0 and 1. The limits for defining colors are altered by setting the
+ parameters range1, range2, range3, and range 4."
+ ([mode]
+ (let [mode (u/resolve-constant-key mode color-modes)]
+ (.colorMode (current-graphics) (int mode))))
+ ([mode max]
+ (let [mode (u/resolve-constant-key mode color-modes)]
+ (.colorMode (current-graphics) (int mode) (float max))))
+ ([mode max-x max-y max-z]
+ (let [mode (u/resolve-constant-key mode color-modes)]
+ (.colorMode (current-graphics) (int mode) (float max-x) (float max-y) (float max-z))))
+ ([mode max-x max-y max-z max-a]
+ (let [mode (u/resolve-constant-key mode color-modes)]
+ (.colorMode (current-graphics) (int mode) (float max-x) (float max-y) (float max-z) (float max-a)))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name "constrain()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ constrain-float
+ "Constrains a value to not exceed a maximum and minimum value. All
+ args are cast to floats."
+ [amt low high]
+ (PApplet/constrain (float amt) (float low) (float high))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name "constrain()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ constrain-int
+ "Constrains a value to not exceed a maximum and minimum value. All
+ args are cast to ints."
+ [amt low high]
+ (PApplet/constrain (int amt) (int low) (int high))))
+
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "constrain()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ constrain
+ "Constrains a value to not exceed a maximum and minimum value."
+ [amt low high]
+ #?(:clj
+ (if (u/int-like? amt)
+ (constrain-int amt low high)
+ (constrain-float amt low high))
+ :cljs (.constrain (ap/current-applet) amt low high)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "copy()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ copy
+ "Copies a region of pixels from the one image to another. If src-img
+ is not specified it defaults to current-graphics. If dest-img is not
+ specified - it defaults to current-graphics. If the source
+ and destination regions aren't the same size, it will automatically
+ resize the source pixels to fit the specified target region. No
+ alpha information is used in the process, however if the source
+ image has an alpha channel set, it will be copied as well. "
+ ([[sx sy swidth sheight] [dx dy dwidth dheight]]
+ (.copy (current-graphics)
+ (int sx) (int sy) (int swidth) (int sheight)
+ (int dx) (int dy) (int dwidth) (int dheight)))
+
+ ([^PImage src-img [sx sy swidth sheight] [dx dy dwidth dheight]]
+ (copy src-img (current-graphics) [sx sy swidth sheight] [dx dy dwidth dheight]))
+
+ ([^PImage src-img ^PImage dest-img [sx sy swidth sheight] [dx dy dwidth dheight]]
+ (.copy dest-img src-img (int sx) (int sy) (int swidth) (int sheight)
+ (int dx) (int dy) (int dwidth) (int dheight))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "cos()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ cos
+ "Calculates the cosine of an angle. This function expects the values
+ of the angle parameter to be provided in radians (values from 0 to
+ Math/PI*2). Values are returned in the range -1 to 1."
+ [angle]
+ #?(:clj (PApplet/cos (float angle))
+ :cljs (.cos (ap/current-applet) angle)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name nil
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ font-available?
+ "Returns true if font (specified as a string) is available on this
+ system, false otherwise"
+ [font-str]
+ (if (some #{font-str} (available-fonts))
+ true
+ false)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "createFont()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ create-font
+ "Dynamically converts a font to the format used by Processing (a
+ PFont) from either a font name that's installed on the computer, or
+ from a .ttf or .otf file inside the sketches 'data' folder. This
+ function is an advanced feature for precise control.
+
+ Use available-fonts to obtain the names for the fonts recognized by
+ the computer and are compatible with this function.
+
+ The size parameter states the font size you want to generate. The
+ smooth parameter specifies if the font should be antialiased or not,
+ and the charset parameter is an array of chars that specifies the
+ characters to generate.
+
+ This function creates a bitmapped version of a font It loads a font
+ by name, and converts it to a series of images based on the size of
+ the font. When possible, the text function will use a native font
+ rather than the bitmapped version created behind the scenes with
+ create-font. For instance, when using the default renderer
+ setting (JAVA2D), the actual native version of the font will be
+ employed by the sketch, improving drawing quality and
+ performance. With the :p2d, :p3d, and :opengl renderer settings, the
+ bitmapped version will be used. While this can drastically improve
+ speed and appearance, results are poor when exporting if the sketch
+ does not include the .otf or .ttf file, and the requested font is
+ not available on the machine running the sketch."
+ ([name size] (.createFont (ap/current-applet) (str name) (float size)))
+ ([name size smooth] (.createFont (ap/current-applet) (str name) (float size) smooth))
+ ([name size smooth ^chars charset]
+ (.createFont (ap/current-applet) (str name) (float size) smooth charset)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "createGraphics()"
+ :category "Image"
+ :subcategory "Rendering"
+ :added "1.0"}
+ create-graphics
+ "Creates and returns a new PGraphics object of the types :p2d, :p3d,
+ :java2d, :pdf. By default :java2d is used. Use this class if you
+ need to draw into an off-screen graphics buffer. It's not possible
+ to use create-graphics with the :opengl renderer, because it doesn't
+ allow offscreen use. The :pdf renderer requires the filename parameter.
+
+ Note: don't use create-graphics in draw in clojurescript, it leaks memory.
+ You should create graphic in setup and reuse it in draw instead of creating
+ a new one.
+
+ It's important to call any drawing commands between (.beginDraw graphics) and
+ (.endDraw graphics) statements or use with-graphics macro. This is also true
+ for any commands that affect drawing, such as smooth or color-mode.
+
+ If you're using :pdf renderer - don't forget to call (.dispose graphics)
+ as last command inside with-graphics macro, otherwise graphics won't be
+ saved.
+
+ Unlike the main drawing surface which is completely opaque, surfaces
+ created with create-graphics can have transparency. This makes it
+ possible to draw into a graphics and maintain the alpha channel. By
+ using save to write a PNG or TGA file, the transparency of the
+ graphics object will be honored."
+ ([w h]
+ (.createGraphics (ap/current-applet) (int w) (int h) #?(:cljs :p2d)))
+ ([w h renderer]
+ (.createGraphics (ap/current-applet) (int w) (int h) (ap/resolve-renderer renderer)))
+ ([w h renderer path]
+ (.createGraphics (ap/current-applet) (int w) (int h) (ap/resolve-renderer renderer)
+ #?(:clj (u/absolute-path path)
+ :cljs path))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "createImage()"
+ :category "Image"
+ :subcategory nil
+ :added "1.0"}
+ create-image
+ "Creates a new PImage (the datatype for storing images). This
+ provides a fresh buffer of pixels to play with. Set the size of the
+ buffer with the width and height parameters. The format parameter
+ defines how the pixels are stored. See the PImage reference for more
+ information.
+
+ Possible formats: :rgb, :argb, :alpha (grayscale alpha channel)
+
+ Prefer using create-image over initialising new PImage instances
+ directly."
+ [w h format]
+ (let [format (u/resolve-constant-key format image-formats)]
+ (.createImage (ap/current-applet) (int w) (int h) (int format))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "PGraphics.fillColor"
+ :processing-link "http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#fillColor"
+ :category "Color"
+ :subcategory "Creating & Reading"}
+ current-fill
+ "Return the current fill color."
+ []
+ (.-fillColor (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "PGraphics.strokeColor"
+ :processing-link "http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#strokeColor"
+ :category "Color"
+ :subcategory "Creating & Reading"}
+ current-stroke
+ "Return the current stroke color."
+ []
+ (.-strokeColor (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "cursor()"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ cursor
+ "Sets the cursor to a predefined symbol or makes it
+ visible if already hidden (after no-cursor was called).
+
+ Available modes: :arrow, :cross, :hand, :move, :text, :wait
+
+ See cursor-image for specifying a generic image as the cursor
+ symbol."
+ ([] (.cursor (ap/current-applet)))
+ ([cursor-mode]
+ (let [cursor-mode (u/resolve-constant-key cursor-mode cursor-modes)]
+ (.cursor (ap/current-applet)
+ #?(:clj (int cursor-mode)
+ :cljs (str cursor-mode))))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "cursor()"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ cursor-image
+ "Set the cursor to a predefined image. The horizontal and vertical
+ active spots of the cursor may be specified with hx and hy.
+ It is recommended to make the size 16x16 or 32x32 pixels."
+ ([^PImage img] (.cursor (ap/current-applet) img))
+ ([^PImage img hx hy] (.cursor (ap/current-applet) img (int hx) (int hy))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curve()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ curve
+ "Draws a curved line on the screen. The first and second parameters
+ specify the beginning control point and the last two parameters
+ specify the ending control point. The middle parameters specify the
+ start and stop of the curve. Longer curves can be created by putting
+ a series of curve fns together or using curve-vertex. An additional
+ fn called curve-tightness provides control for the visual quality of
+ the curve. The curve fn is an implementation of Catmull-Rom
+ splines."
+ ([x1 y1 x2 y2 x3 y3 x4 y4]
+ (.curve (current-graphics)
+ (float x1) (float y1)
+ (float x2) (float y2)
+ (float x3) (float y3)
+ (float x4) (float y4)))
+ ([x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4]
+ (.curve (current-graphics)
+ (float x1) (float y1) (float z1)
+ (float x2) (float y2) (float z2)
+ (float x3) (float y3) (float z3)
+ (float x4) (float y4) (float z4))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curveDetail()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ curve-detail
+ "Sets the resolution at which curves display. The default value is
+ 20. This function is only useful when using the :p3d or :opengl
+ renderer as the default (:java2d) renderer does not use this
+ information."
+ [detail]
+ (.curveDetail (current-graphics) (int detail)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curvePoint()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ curve-point
+ "Evalutes the curve at point t for points a, b, c, d. The parameter
+ t varies between 0 and 1, a and d are points on the curve, and b c
+ and are the control points. This can be done once with the x
+ coordinates and a second time with the y coordinates to get the
+ location of a curve at t."
+ [a b c d t]
+ (.curvePoint (current-graphics) (float a) (float b) (float c) (float d) (float t)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curveTangent()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ curve-tangent
+ "Calculates the tangent of a point on a curve.
+ See: http://en.wikipedia.org/wiki/Tangent"
+ [a b c d t]
+ (.curveTangent (current-graphics) (float a) (float b) (float c) (float d) (float t)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curveTightness()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ curve-tightness
+ "Modifies the quality of forms created with curve and
+ curve-vertex. The parameter squishy determines how the curve fits
+ to the vertex points. The value 0.0 is the default value for
+ squishy (this value defines the curves to be Catmull-Rom splines)
+ and the value 1.0 connects all the points with straight
+ lines. Values within the range -5.0 and 5.0 will deform the curves
+ but will leave them recognizable and as values increase in
+ magnitude, they will continue to deform."
+ [ti]
+ (.curveTightness (current-graphics) (float ti)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curveVertex()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ curve-vertex
+ "Specifies vertex coordinates for curves. This function may only be
+ used between begin-shape and end-shape and only when there is no
+ mode keyword specified to begin-shape. The first and last points in a
+ series of curve-vertex lines will be used to guide the beginning and
+ end of a the curve. A minimum of four points is required to draw a
+ tiny curve between the second and third points. Adding a fifth point
+ with curve-vertex will draw the curve between the second, third, and
+ fourth points. The curve-vertex function is an implementation of
+ Catmull-Rom splines."
+ ([x y] (.curveVertex (current-graphics) (float x) (float y)))
+ ([x y z] (.curveVertex (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "day()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ day
+ "Get the current day of the month (1 through 31)."
+ []
+ #?(:clj (PApplet/day)
+ :cljs (.day (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "degrees()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ degrees
+ "Converts a radian measurement to its corresponding value in
+ degrees. Radians and degrees are two ways of measuring the same
+ thing. There are 360 degrees in a circle and (* 2 Math/PI) radians
+ in a circle. For example, (= 90° (/ Math/PI 2) 1.5707964). All
+ trigonometric methods in Processing require their parameters to be
+ specified in radians."
+ [radians]
+ #?(:clj (PApplet/degrees (float radians))
+ :cljs (.degrees (ap/current-applet) radians)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "delay()"
+ :processing-link nil
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ delay-frame
+ "Forces the program to stop running for a specified time. Delay
+ times are specified in thousandths of a second, therefore the
+ function call (delay 3000) will stop the program for three
+ seconds. Because the screen is updated only at the end of draw,
+ the program may appear to 'freeze', because the screen will not
+ update when the delay fn is used. This function has no affect
+ inside setup."
+ [freeze-ms]
+ (.delay (ap/current-applet) (int freeze-ms)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "directionalLight()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ directional-light
+ "Adds a directional light. Directional light comes from one
+ direction and is stronger when hitting a surface squarely and weaker
+ if it hits at a gentle angle. After hitting a surface, a
+ directional lights scatters in all directions. Lights need to be
+ included in the draw fn to remain persistent in a looping
+ program. Placing them in the setup fn of a looping program will cause
+ them to only have an effect the first time through the loop. The
+ affect of the r, g, and b parameters is determined by the current
+ color mode. The nx, ny, and nz parameters specify the direction the
+ light is facing. For example, setting ny to -1 will cause the
+ geometry to be lit from below (the light is facing directly upward)"
+ [r g b nx ny nz]
+ (.directionalLight (current-graphics) (float r) (float g) (float b)
+ (float nx) (float ny) (float nz)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "dist()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ dist
+ "Calculates the distance between two points"
+ ([x1 y1 x2 y2]
+ #?(:clj (PApplet/dist (float x1) (float y1) (float x2) (float y2))
+ :cljs (.dist (ap/current-applet) x1 y1 x2 y2)))
+ ([x1 y1 z1 x2 y2 z2]
+ #?(:clj (PApplet/dist (float x1) (float y1) (float z1) (float x2) (float y2) (float z2))
+ :cljs (.dist (ap/current-applet) x1 y1 z1 x2 y2 z2))))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Output"
+ :subcategory "Files"
+ :added "2.5"}
+ do-record
+ "Macro for drawing on graphics which saves result in the file at the end.
+ Similar to 'with-graphics' macro. do-record assumed to be used with :pdf
+ graphics. Example:
+
+ (q/do-record (q/create-graphics 200 200 :pdf \"output.pdf\")
+ (q/fill 250 0 0)
+ (q/ellipse 100 100 150 150))
+ "
+ [graphics & body]
+ `(let [gr# ~graphics]
+ (with-graphics gr#
+ ~@body)
+ (.dispose gr#)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ellipse()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ ellipse
+ "Draws an ellipse (oval) in the display window. An ellipse with an
+ equal width and height is a circle. The origin may be changed with
+ the ellipse-mode function"
+ [x y width height]
+ (.ellipse (current-graphics) (float x) (float y) (float width) (float height)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ellipseMode()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ ellipse-mode
+ "Modifies the origin of the ellispse according to the specified mode:
+
+ :center - specifies the location of the ellipse as
+ the center of the shape. (Default).
+ :radius - similar to center, but the width and height parameters to
+ ellipse specify the radius of the ellipse, rather than the
+ diameter.
+ :corner - draws the shape from the upper-left corner of its bounding
+ box.
+ :corners - uses the four parameters to ellipse to set two opposing
+ corners of the ellipse's bounding box."
+ [mode]
+ (let [mode (u/resolve-constant-key mode ellipse-modes)]
+ (.ellipseMode (current-graphics) (int mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "emissive()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ emissive-float
+ "Sets the emissive color of the material used for drawing shapes
+ drawn to the screen. Used in combination with ambient, specular, and
+ shininess in setting the material properties of shapes. Converts all
+ args to floats"
+ ([float-val] (.emissive (current-graphics) (float float-val)))
+ ([r g b] (.emissive (current-graphics) (float r) (float g) (float b))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "emissive()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ emissive-int
+ "Sets the emissive color of the material used for drawing shapes
+ drawn to the screen. Used in combination with ambient, specular, and
+ shininess in setting the material properties of shapes. Converts all
+ args to ints"
+ [int-val] (.emissive (current-graphics) (int int-val)))
+
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "emissive()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ emissive
+ "Sets the emissive color of the material used for drawing shapes
+ drawn to the screen. Used in combination with ambient, specular, and
+ shininess in setting the material properties of shapes.
+
+ If passed one arg - it is assumed to be an int (i.e. a color),
+ multiple args are converted to floats."
+ ([c]
+ #?(:clj (if (u/int-like? c) (emissive-int c) (emissive-float c))
+ :cljs (emissive-float c)))
+ ([r g b] (emissive-float r g b)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "endCamera()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ end-camera
+ "Unsets the matrix mode from the camera matrix. See begin-camera."
+ []
+ (.endCamera (current-graphics)))
+
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "endContour()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "2.0"}
+ end-contour
+ "Use the begin-contour and end-contour function to create negative
+ shapes within shapes. These functions can only be within a
+ begin-shape/end-shape pair and they only work with the :p2d and :p3d
+ renderers."
+ []
+ (.endContour (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "endRaw()"
+ :category "Output"
+ :subcategory "Files"
+ :added "1.0"}
+ end-raw
+ "Complement to begin-raw; they must always be used together. See
+ the begin-raw docstring for details."
+ []
+ (.endRaw (current-graphics)))
+
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "endShape()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ end-shape
+ "May only be called after begin-shape. When end-shape is called,
+ all of image data defined since the previous call to begin-shape is
+ written into the image buffer. The keyword :close may be passed to
+ close the shape (to connect the beginning and the end)."
+ ([] (.endShape (current-graphics)))
+ ([mode]
+ (when-not (= :close mode)
+ #?(:clj (throw (Exception. (str "Unknown mode value: " mode ". Expected :close")))
+ :cljs nil))
+ (.endShape (current-graphics)
+ #?(:clj PApplet/CLOSE
+ :cljs 2))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "exit()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ exit
+ "Quits/stops/exits the program. Rather than terminating
+ immediately, exit will cause the sketch to exit after draw has
+ completed (or after setup completes if called during the setup
+ method). "
+ []
+ (.exit (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "exp()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ exp
+ "Returns Euler's number e (2.71828...) raised to the power of the
+ value parameter."
+ [val]
+ #?(:clj (PApplet/exp (float val))
+ :cljs (.exp (ap/current-applet) val)))
+
+#?(:cljs
+ (defn- clear-no-fill-cljs
+ "Sets custom property on graphcs object indicating that it has
+ fill color."
+ [graphics]
+ (aset graphics no-fill-prop false)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "fill()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ fill-float
+ "Sets the color used to fill shapes. For example, (fill 204 102 0),
+ will specify that all subsequent shapes will be filled with orange."
+ ([gray]
+ (.fill (current-graphics) (float gray))
+ #?(:cljs (clear-no-fill-cljs (current-graphics))))
+ ([gray alpha]
+ (.fill (current-graphics) (float gray) (float alpha))
+ #?(:cljs (clear-no-fill-cljs (current-graphics))))
+ ([r g b]
+ (.fill (current-graphics) (float r) (float g) (float b))
+ #?(:cljs (clear-no-fill-cljs (current-graphics))))
+ ([r g b alpha]
+ (.fill (current-graphics) (float r) (float g) (float b) (float alpha))
+ #?(:cljs (clear-no-fill-cljs (current-graphics)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "fill()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ fill-int
+ "Sets the color used to fill shapes."
+ ([rgb]
+ (.fill (current-graphics) (unchecked-int rgb))
+ #?(:cljs (clear-no-fill-cljs (current-graphics))))
+ ([rgb alpha]
+ (.fill (current-graphics) (unchecked-int rgb) (float alpha))
+ #?(:cljs (clear-no-fill-cljs (current-graphics)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "fill()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ fill
+ "Sets the color used to fill shapes."
+ ([rgb]
+ #?(:clj (if (u/int-like? rgb) (fill-int rgb) (fill-float rgb))
+ :cljs (fill-float rgb)))
+
+ ([rgb alpha]
+ #?(:clj (if (u/int-like? rgb) (fill-int rgb alpha) (fill-float rgb alpha))
+ :cljs (fill-float rgb alpha)))
+
+ ([r g b] (fill-float r g b))
+ ([r g b a] (fill-float r g b a)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "displayDensity()"
+ :category "Environment"
+ :subcategory nil
+ :added "2.4.0"}
+ display-density
+ "This function returns the number 2 if the screen is a high-density
+ screen (called a Retina display on OS X or high-dpi on Windows and
+ Linux) and a 1 if not. This information is useful for a program to
+ adapt to run at double the pixel density on a screen that supports
+ it. Can be used in conjunction with (pixel-density)"
+ ([] (.displayDensity (ap/current-applet)))
+ ([display] (PApplet/displayDensity display))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "filter()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ display-filter
+ "Originally named filter in Processing Language.
+ Filters the display window with the specified mode and level.
+ Level defines the quality of the filter and mode may be one of the
+ following keywords:
+
+ :threshold - converts the image to black and white pixels depending
+ if they are above or below the threshold defined by
+ the level parameter. The level must be between
+ 0.0 (black) and 1.0 (white). If no level is specified,
+ 0.5 is used.
+ :gray - converts any colors in the image to grayscale
+ equivalents. Doesn't work with level.
+ :invert - sets each pixel to its inverse value. Doesn't work with
+ level.
+ :posterize - limits each channel of the image to the number of
+ colors specified as the level parameter. The parameter can
+ be set to values between 2 and 255, but results are most
+ noticeable in the lower ranges.
+ :blur - executes a Guassian blur with the level parameter
+ specifying the extent of the blurring. If no level
+ parameter is used, the blur is equivalent to Guassian
+ blur of radius 1.
+ :opaque - sets the alpha channel to entirely opaque. Doesn't work
+ with level.
+ :erode - reduces the light areas. Doesn't work with level.
+ :dilate - increases the light areas. Doesn't work with level."
+ ([mode]
+ (.filter (current-graphics)
+ (int (u/resolve-constant-key mode filter-modes))))
+
+ ([mode level]
+ (let [mode (u/resolve-constant-key mode filter-modes)]
+ (.filter (current-graphics) (int mode) (float level)))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "filter()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "2.0"}
+ filter-shader
+ "Originally named filter in Processing Language.
+ Filters the display window with given shader (only in :p2d and :p3d modes)."
+ [^PShader shader-obj] (.filter (current-graphics) shader-obj)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "floor()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "2.0"}
+ floor
+ "Calculates the closest int value that is less than or equal to the
+ value of the parameter. For example, (floor 9.03) returns the value 9."
+ [n]
+ #?(:clj (PApplet/floor (float n))
+ :cljs (.floor (ap/current-applet) n)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "focused"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ focused
+ "Returns a boolean value representing whether the applet has focus."
+ [] (.-focused (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "frameCount"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ frame-count
+ "The system variable frameCount contains the number of frames
+ displayed since the program started. Inside setup() the value is 0
+ and after the first iteration of draw it is 1, etc."
+ []
+ #?(:clj (.frameCount (ap/current-applet))
+ :cljs (.-frameCount (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "frameRate"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ current-frame-rate
+ "Returns the current framerate"
+ []
+ #?(:clj (.frameRate (ap/current-applet))
+ :cljs (.-__frameRate (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "frameRate()"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ frame-rate
+ "Specifies a new target framerate (number of frames to be displayed every
+ second). If the processor is not fast enough to maintain the
+ specified rate, it will not be achieved. For example, the function
+ call (frame-rate 30) will attempt to refresh 30 times a second. It
+ is recommended to set the frame rate within setup. The default rate
+ is 60 frames per second."
+ [new-rate]
+ (do
+ #?(:cljs (reset! (.-target-frame-rate (ap/current-applet)) new-rate))
+ (.frameRate (ap/current-applet) (float new-rate))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "frustum()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ frustum
+ "Sets a perspective matrix defined through the parameters. Works
+ like glFrustum, except it wipes out the current perspective matrix
+ rather than muliplying itself with it."
+ [left right bottom top near far]
+ (.frustum (current-graphics) (float left) (float right) (float bottom) (float top)
+ (float near) (float far)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "get()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ get-pixel
+ "Reads the color of any pixel or grabs a section of an image. If no
+ parameters are specified, a copy of entire image is returned. Get the
+ value of one pixel by specifying an x,y coordinate. Get a section of
+ the image by specifying an additional width and height parameter.
+ If the pixel requested is outside of the image window, black is returned.
+ The numbers returned are scaled according to the current color ranges,
+ but only RGB values are returned by this function. For example, even though
+ you may have drawn a shape with (color-mode :hsb), the numbers returned
+ will be in RGB.
+
+ Getting the color of a single pixel with (get x y) is easy, but not
+ as fast as grabbing the data directly using the pixels fn.
+
+ If no img specified - current-graphics is used."
+ ([] (get-pixel (current-graphics)))
+ ([^PImage img] (.get img))
+ ([x y] (get-pixel (current-graphics) x y))
+ ([^PImage img x y] (.get img (int x) (int y)))
+ ([x y w h] (get-pixel (current-graphics) x y w h))
+ ([^PImage img x y w h] (.get img (int x) (int y) (int w) (int h))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "green()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ green
+ "Extracts the green value from a color, scaled to match current
+ color-mode. This value is always returned as a float so be careful
+ not to assign it to an int value."
+ [col]
+ (.green (current-graphics) (unchecked-int col)))
+
+(defn
+ ^{:require-binding false
+ :processing-name "hex()"
+ :category "Data"
+ :subcategory "Conversion"}
+ hex
+ "Converts a byte, char, int, or color to a String containing the
+ equivalent hexadecimal notation. For example color(0, 102, 153) will
+ convert to the String \"FF006699\". This function can help make your
+ geeky debugging sessions much happier. "
+ ([val]
+ #?(:clj (PApplet/hex (int val))
+ :cljs (.hex (ap/current-applet) val)))
+ ([val num-digits]
+ #?(:clj (PApplet/hex (int val) (int num-digits))
+ :cljs (.hex (ap/current-applet) val num-digits))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "getHeight()"
+ :processing-link nil
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ height
+ "Height of the display window. The value of height is zero until
+ size is called."
+ []
+ (.-height (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "hint()"
+ :processing-link nil
+ :category "Rendering"
+ :subcategory nil
+ :added "1.0"}
+ hint
+ "Set various hints and hacks for the renderer. This is used to
+ handle obscure rendering features that cannot be implemented in a
+ consistent manner across renderers. Many options will often graduate
+ to standard features instead of hints over time.
+
+ Options:
+
+ :enable-native-fonts - Use the native version fonts when they are
+ installed, rather than the bitmapped version from a .vlw
+ file. This is useful with the default (or JAVA2D) renderer
+ setting, as it will improve font rendering speed. This is not
+ enabled by default, because it can be misleading while testing
+ because the type will look great on your machine (because you have
+ the font installed) but lousy on others' machines if the identical
+ font is unavailable. This option can only be set per-sketch, and
+ must be called before any use of text-font.
+
+ :disable-native-fonts - Disables native font support.
+
+ :disable-depth-test - Disable the zbuffer, allowing you to draw on
+ top of everything at will. When depth testing is disabled, items
+ will be drawn to the screen sequentially, like a painting. This
+ hint is most often used to draw in 3D, then draw in 2D on top of
+ it (for instance, to draw GUI controls in 2D on top of a 3D
+ interface). Starting in release 0149, this will also clear the
+ depth buffer. Restore the default with :enable-depth-test
+ but note that with the depth buffer cleared, any 3D drawing that
+ happens later in draw will ignore existing shapes on the screen.
+
+ :enable-depth-test - Enables the zbuffer.
+
+ :enable-depth-sort - Enable primitive z-sorting of triangles and
+ lines in :p3d and :opengl rendering modes. This can slow
+ performance considerably, and the algorithm is not yet perfect.
+
+ :disable-depth-sort - Disables hint :enable-depth-sort
+
+ :disable-opengl-errors - Speeds up the OPENGL renderer setting
+ by not checking for errors while running.
+
+ :enable-opengl-errors - Turns on OpenGL error checking
+
+ :enable-depth-mask
+ :disable-depth-mask
+
+ :enable-optimized-stroke
+ :disable-optimized-stroke
+ :enable-retina-pixels
+ :disable-retina-pixels
+ :enable-stroke-perspective
+ :disable-stroke-perspective
+ :enable-stroke-pure
+ :disable-stroke-pure
+ :enable-texture-mipmaps
+ :disable-texture-mipmaps
+"
+ [hint-type]
+ (let [hint-type (if (keyword? hint-type)
+ (get hint-options hint-type)
+ hint-type)]
+ (.hint (current-graphics) (int hint-type))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "hour()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ hour
+ "Returns the current hour as a value from 0 - 23."
+ []
+ #?(:clj (PApplet/hour)
+ :cljs (.hour (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "hue()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ hue
+ "Extracts the hue value from a color."
+ [col]
+ (.hue (current-graphics) (unchecked-int col)))
+
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "image()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ image
+ "Displays images to the screen. Processing currently works with GIF,
+ JPEG, and Targa images. The color of an image may be modified with
+ the tint function and if a GIF has transparency, it will maintain
+ its transparency. The img parameter specifies the image to display
+ and the x and y parameters define the location of the image from its
+ upper-left corner. The image is displayed at its original size
+ unless the width and height parameters specify a different size. The
+ image-mode fn changes the way the parameters work. A call to
+ (image-mode :corners) will change the width and height parameters to
+ define the x and y values of the opposite corner of the image.
+
+ Starting with release 0124, when using the default (JAVA2D)
+ renderer, smooth will also improve image quality of resized
+ images."
+ (#?(:clj [^PImage img x y]
+ :cljs [img x y])
+ (.image (current-graphics) img (float x) (float y)))
+
+ (#?(:clj [^PImage img x y c d]
+ :cljs [img x y c d])
+ (.image (current-graphics) img (float x) (float y) (float c) (float d))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "PImage.filter()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "2.0"}
+ image-filter
+ "Originally named filter in Processing Language.
+ Filters given image with the specified mode and level.
+ Level defines the quality of the filter and mode may be one of
+ the following keywords:
+
+ :threshold - converts the image to black and white pixels depending
+ if they are above or below the threshold defined by
+ the level parameter. The level must be between
+ 0.0 (black) and 1.0 (white). If no level is specified,
+ 0.5 is used.
+ :gray - converts any colors in the image to grayscale
+ equivalents. Doesn't work with level.
+ :invert - sets each pixel to its inverse value. Doesn't work with
+ level.
+ :posterize - limits each channel of the image to the number of
+ colors specified as the level parameter. The parameter can
+ be set to values between 2 and 255, but results are most
+ noticeable in the lower ranges.
+ :blur - executes a Guassian blur with the level parameter
+ specifying the extent of the blurring. If no level
+ parameter is used, the blur is equivalent to Guassian
+ blur of radius 1.
+ :opaque - sets the alpha channel to entirely opaque. Doesn't work
+ with level.
+ :erode - reduces the light areas. Doesn't work with level.
+ :dilate - increases the light areas. Doesn't work with level."
+ ([^PImage img mode]
+ (let [mode (u/resolve-constant-key mode filter-modes)]
+ (.filter img (int mode))))
+ ([^PImage img mode level]
+ (let [mode (u/resolve-constant-key mode filter-modes)]
+ (.filter img (int mode) (float level)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "imageMode()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ image-mode
+ "Modifies the location from which images draw. The default mode is :corner.
+ Available modes are:
+
+ :corner - specifies the location to be the upper left corner and
+ uses the fourth and fifth parameters of image to set the
+ image's width and height.
+
+ :corners - uses the second and third parameters of image to set the
+ location of one corner of the image and uses the fourth
+ and fifth parameters to set the opposite corner.
+
+ :center - draw images centered at the given x and y position."
+ [mode]
+ (let [mode (u/resolve-constant-key mode image-modes)]
+ (.imageMode (current-graphics) (int mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "keyCode"
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "1.0"}
+ key-code
+ "The variable keyCode is used to detect special keys such as the UP,
+ DOWN, LEFT, RIGHT arrow keys and ALT, CONTROL, SHIFT. When checking
+ for these keys, it's first necessary to check and see if the key is
+ coded. This is done with the conditional (= (key) CODED).
+
+ The keys included in the ASCII specification (BACKSPACE, TAB, ENTER,
+ RETURN, ESC, and DELETE) do not require checking to see if they key
+ is coded, and you should simply use the key variable instead of
+ key-code If you're making cross-platform projects, note that the
+ ENTER key is commonly used on PCs and Unix and the RETURN key is
+ used instead on Macintosh. Check for both ENTER and RETURN to make
+ sure your program will work for all platforms.
+
+ For users familiar with Java, the values for UP and DOWN are simply
+ shorter versions of Java's KeyEvent.VK_UP and
+ KeyEvent.VK_DOWN. Other keyCode values can be found in the Java
+ KeyEvent reference."
+ []
+ (.-keyCode (ap/current-applet)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "2.4.0"}
+ key-modifiers
+ "Set of key modifiers that were pressed when event happened.
+ Possible modifiers :ctrl, :alt, :shift, :meta. Not available in
+ ClojureScript."
+ []
+ (let [modifiers
+ (if-let [^processing.event.Event
+ event (-> (ap/current-applet) meta :key-event deref)]
+ [(if (.isAltDown event) :alt nil)
+ (if (.isShiftDown event) :shift nil)
+ (if (.isControlDown event) :control nil)
+ (if (.isMetaDown event) :meta nil)]
+ [])]
+ (set (remove nil? modifiers)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "keyPressed"
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "1.0"}
+ key-pressed?
+ "true if any key is currently pressed, false otherwise."
+ []
+ #?(:clj (.-keyPressed (ap/current-applet))
+ :cljs (.-__keyPressed (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "lightFalloff()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ light-falloff
+ "Sets the falloff rates for point lights, spot lights, and ambient
+ lights. The parameters are used to determine the falloff with the
+ following equation:
+
+ d = distance from light position to vertex position
+ falloff = 1 / (CONSTANT + d * LINEAR + (d*d) * QUADRATIC)
+
+ Like fill, it affects only the elements which are created after it
+ in the code. The default value is (light-falloff 1.0 0.0 0.0).
+ Thinking about an ambient light with a falloff can be tricky. It is
+ used, for example, if you wanted a region of your scene to be lit
+ ambiently one color and another region to be lit ambiently by
+ another color, you would use an ambient light with location and
+ falloff. You can think of it as a point light that doesn't care
+ which direction a surface is facing."
+ [constant linear quadratic]
+ (.lightFalloff (current-graphics) (float constant) (float linear) (float quadratic)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "lerpColor()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ lerp-color
+ "Calculates a color or colors between two color at a specific
+ increment. The amt parameter is the amount to interpolate between
+ the two values where 0.0 equal to the first point, 0.1 is very near
+ the first point, 0.5 is half-way in between, etc."
+ [c1 c2 amt]
+ (.lerpColor (current-graphics) (unchecked-int c1) (unchecked-int c2) (float amt)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "lerp()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ lerp
+ "Calculates a number between two numbers at a specific
+ increment. The amt parameter is the amount to interpolate between
+ the two values where 0.0 equal to the first point, 0.1 is very near
+ the first point, 0.5 is half-way in between, etc. The lerp function
+ is convenient for creating motion along a straight path and for
+ drawing dotted lines."
+ [start stop amt]
+ #?(:clj (PApplet/lerp (float start) (float stop) (float amt))
+ :cljs (.lerp (ap/current-applet) start stop amt)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "lights()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ lights
+ "Sets the default ambient light, directional light, falloff, and
+ specular values. The defaults are:
+
+ (ambient-light 128 128 128)
+ (directional-light 128 128 128 0 0 -1)
+ (light-falloff 1 0 0)
+ (light-specular 0 0 0).
+
+ Lights need to be included in the draw to remain persistent in a
+ looping program. Placing them in the setup of a looping program
+ will cause them to only have an effect the first time through the
+ loop."
+ []
+ (.lights (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "lightSpecular()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ light-specular
+ "Sets the specular color for lights. Like fill, it affects only the
+ elements which are created after it in the code. Specular refers to
+ light which bounces off a surface in a perferred direction (rather
+ than bouncing in all directions like a diffuse light) and is used
+ for creating highlights. The specular quality of a light interacts
+ with the specular material qualities set through the specular and
+ shininess functions."
+ [r g b]
+ (.lightSpecular (current-graphics) (float r) (float g) (float b)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "line()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ line
+ "Draws a line (a direct path between two points) to the screen. The
+ version of line with four parameters draws the line in 2D. To color
+ a line, use the stroke function. A line cannot be filled, therefore
+ the fill method will not affect the color of a line. 2D lines are
+ drawn with a width of one pixel by default, but this can be changed
+ with the stroke-weight function. The version with six parameters
+ allows the line to be placed anywhere within XYZ space. "
+ ([p1 p2] (apply line (concat p1 p2)))
+ ([x1 y1 x2 y2] (.line (current-graphics) (float x1) (float y1) (float x2) (float y2)))
+ ([x1 y1 z1 x2 y2 z2]
+ (.line (current-graphics) (float x1) (float y1) (float z1)
+ (float x2) (float y2) (float z2))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "loadFont()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ load-font
+ "Loads a font into a variable of type PFont. To load correctly,
+ fonts must be located in the data directory of the current sketch.
+ To create a font to use with Processing use the create-font fn.
+
+ Like load-image and other methods that load data, the load-font fn
+ should not be used inside draw, because it will slow down the sketch
+ considerably, as the font will be re-loaded from the disk (or
+ network) on each frame.
+
+ For most renderers, Processing displays fonts using the .vlw font
+ format, which uses images for each letter, rather than defining them
+ through vector data. When hint :enable-native-fonts is used with the
+ JAVA2D renderer, the native version of a font will be used if it is
+ installed on the user's machine.
+
+ Using create-font (instead of load-font) enables vector data to be
+ used with the JAVA2D (default) renderer setting. This can be helpful
+ when many font sizes are needed, or when using any renderer based on
+ JAVA2D, such as the PDF library."
+ [filename]
+ (.loadFont (ap/current-applet) (str filename)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "loadImage()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ load-image
+ "Loads an image into a variable of type PImage. Four types of
+ images ( .gif, .jpg, .tga, .png) images may be loaded. To load
+ correctly, images must be located in the data directory of the
+ current sketch. In most cases, load all images in setup to preload
+ them at the start of the program. Loading images inside draw will
+ reduce the speed of a program.
+
+ The filename parameter can also be a URL to a file found online.
+
+ If an image is not loaded successfully, the null value is returned
+ and an error message will be printed to the console. The error
+ message does not halt the program, however the null value may cause
+ a NullPointerException if your code does not check whether the value
+ returned from load-image is nil.
+
+ Depending on the type of error, a PImage object may still be
+ returned, but the width and height of the image will be set to
+ -1. This happens if bad image data is returned or cannot be decoded
+ properly. Sometimes this happens with image URLs that produce a 403
+ error or that redirect to a password prompt, because load-image
+ will attempt to interpret the HTML as image data."
+ [filename]
+ (.loadImage (ap/current-applet) (str filename)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "loadShader()"
+ :category "Rendering"
+ :subcategory "Shaders"
+ :added "2.0"}
+ load-shader
+ "Loads a shader into the PShader object. Shaders are compatible with the
+ P2D and P3D renderers, but not with the default renderer."
+ ([fragment-filename]
+ (.loadShader (current-graphics) fragment-filename))
+ ([fragment-filename vertex-filename]
+ (.loadShader (current-graphics) fragment-filename vertex-filename)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "loadShape()"
+ :category "Shape"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ load-shape
+ "Load a geometry from a file as a PShape."
+ [filename]
+ (.loadShape (ap/current-applet) filename))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "log()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ log
+ "Calculates the natural logarithm (the base-e logarithm) of a
+ number. This function expects the values greater than 0.0."
+ [val]
+ #?(:clj (PApplet/log (float val))
+ :cljs (.log (ap/current-applet) val)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "mag()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ mag
+ "Calculates the magnitude (or length) of a vector. A vector is a
+ direction in space commonly used in computer graphics and linear
+ algebra. Because it has no start position, the magnitude of a vector
+ can be thought of as the distance from coordinate (0,0) to its (x,y)
+ value. Therefore, mag is a shortcut for writing (dist 0 0 x y)."
+ ([a b]
+ #?(:clj (PApplet/mag (float a) (float b))
+ :cljs (.mag (ap/current-applet) a b)))
+ ([a b c]
+ #?(:clj (PApplet/mag (float a) (float b) (float c))
+ :cljs (.mag (ap/current-applet) a b c))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "map()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ map-range
+ "Re-maps a number from one range to another.
+
+ Numbers outside the range are not clamped to 0 and 1, because
+ out-of-range values are often intentional and useful."
+ [val low1 high1 low2 high2]
+ #?(:clj (PApplet/map (float val) (float low1) (float high1) (float low2) (float high2))
+ :cljs (.map (ap/current-applet) val low1 high1 low2 high2)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name "PImage.mask()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ mask-image
+ "Masks part of an image from displaying by loading another image and
+ using it as an alpha channel. This mask image should only contain
+ grayscale data, but only the blue color channel is used. The mask
+ image needs to be the same size as the image to which it is
+ applied.
+
+ If single argument function is used - masked image is sketch itself
+ or graphics if used inside with-graphics macro. If you're passing
+ graphics to this function - it works only with :p3d and :opengl renderers.
+
+ This method is useful for creating dynamically generated alpha
+ masks."
+ ([^PImage mask] (mask-image (current-graphics) mask))
+ ([^PImage img ^PImage mask] (.mask img mask))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "millis()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ millis
+ "Returns the number of milliseconds (thousandths of a second) since
+ starting the sketch. This information is often used for timing
+ animation sequences."
+ []
+ (.millis (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "minute()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ minute
+ "Returns the current minute as a value from 0 - 59"
+ []
+ #?(:clj (PApplet/minute)
+ :cljs (.minute (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "modelX()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ model-x
+ "Returns the three-dimensional x, y, z position in model space. This
+ returns the x value for a given coordinate based on the current set
+ of transformations (scale, rotate, translate, etc.) The x value can
+ be used to place an object in space relative to the location of the
+ original point once the transformations are no longer in use."
+ [x y z]
+ (.modelX (current-graphics) (float x) (float y) (float z)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "modelY()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ model-y
+ "Returns the three-dimensional x, y, z position in model space. This
+ returns the y value for a given coordinate based on the current set
+ of transformations (scale, rotate, translate, etc.) The y value can
+ be used to place an object in space relative to the location of the
+ original point once the transformations are no longer in use."
+ [x y z]
+ (.modelY (current-graphics) (float x) (float y) (float z)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "modelZ()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ model-z
+ "Returns the three-dimensional x, y, z position in model space. This
+ returns the z value for a given coordinate based on the current set
+ of transformations (scale, rotate, translate, etc.) The z value can
+ be used to place an object in space relative to the location of the
+ original point once the transformations are no longer in use."
+ [x y z]
+ (.modelZ (current-graphics) (float x) (float y) (float z)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "month()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ month
+ "Returns the current month as a value from 1 - 12."
+ []
+ #?(:clj (PApplet/month)
+ :cljs (.month (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "mouseButton"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ mouse-button
+ "The value of the system variable mouseButton is either :left, :right,
+ or :center depending on which button is pressed. nil if no button pressed"
+ []
+ (let [button-code (.-mouseButton (ap/current-applet))]
+ #?(:clj
+ (condp = button-code
+ PConstants/LEFT :left
+ PConstants/RIGHT :right
+ PConstants/CENTER :center
+ nil)
+
+ :cljs
+ (condp = button-code
+ 37 :left
+ 39 :right
+ 3 :center
+ nil))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "mousePressed"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ mouse-pressed?
+ "Variable storing if a mouse button is pressed. The value of the
+ system variable mousePressed is true if a mouse button is pressed
+ and false if a button is not pressed."
+ []
+ #?(:clj (.-mousePressed (ap/current-applet))
+ :cljs (.-__mousePressed (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "mouseX"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ mouse-x
+ "Current horizontal coordinate of the mouse."
+ []
+ (.-mouseX (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "mouseY"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ mouse-y
+ "Current vertical coordinate of the mouse."
+ []
+ (.-mouseY (ap/current-applet)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "noClip()"
+ :category "Rendering"
+ :subcategory nil
+ :added "2.4.0"}
+ no-clip
+ "Disables the clipping previously started by the clip() function."
+ []
+ (.noClip (current-graphics))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noCursor()"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ no-cursor
+ "Hides the cursor from view. Will not work when running the in full
+ screen (Present) mode."
+ []
+ (.noCursor (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noFill()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ no-fill
+ "Disables filling geometry. If both no-stroke and no-fill are called,
+ nothing will be drawn to the screen." []
+ (.noFill (current-graphics))
+ #?(:cljs (aset (current-graphics) no-fill-prop true)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "random2d()"
+ :category "Math"
+ :subcategory "Random"
+ :added "2.6"}
+ random-2d
+ "Returns a new 2D unit vector in a random direction" []
+ (let [theta (.random (ap/current-applet) TWO-PI)]
+ [(Math/cos theta) (Math/sin theta)]))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "random3d()"
+ :category "Math"
+ :subcategory "Random"
+ :added "2.6"}
+ random-3d
+ "Returns a new 3D unit vector in a random direction" []
+ (let [theta (.random (ap/current-applet) TWO-PI)
+ phi (.random (ap/current-applet) (- HALF-PI) HALF-PI)
+ vx (* (Math/cos theta) (Math/sin phi))
+ vy (* (Math/sin theta) (Math/sin phi))
+ vz (Math/cos phi)]
+ [vx vy vz]))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noise()"
+ :category "Math"
+ :subcategory "Random"
+ :added "1.0"}
+ noise
+ "Returns the Perlin noise value at specified coordinates. Perlin
+ noise is a random sequence generator producing a more natural
+ ordered, harmonic succession of numbers compared to the standard
+ random function. It was invented by Ken Perlin in the 1980s and
+ been used since in graphical applications to produce procedural
+ textures, natural motion, shapes, terrains etc.
+
+ The main difference to the random function is that Perlin noise is
+ defined in an infinite n-dimensional space where each pair of
+ coordinates corresponds to a fixed semi-random value (fixed only for
+ the lifespan of the program). The resulting value will always be
+ between 0.0 and 1.0. Processing can compute 1D, 2D and 3D noise,
+ depending on the number of coordinates given. The noise value can be
+ animated by moving through the noise space and the 2nd and 3rd
+ dimensions can also be interpreted as time.
+
+ The actual noise is structured similar to an audio signal, in
+ respect to the function's use of frequencies. Similar to the concept
+ of harmonics in physics, perlin noise is computed over several
+ octaves which are added together for the final result.
+
+ Another way to adjust the character of the resulting sequence is the
+ scale of the input coordinates. As the function works within an
+ infinite space the value of the coordinates doesn't matter as such,
+ only the distance between successive coordinates does (eg. when
+ using noise within a loop). As a general rule the smaller the
+ difference between coordinates, the smoother the resulting noise
+ sequence will be. Steps of 0.005-0.03 work best for most
+ applications, but this will differ depending on use."
+ ([x] (.noise (ap/current-applet) (float x)))
+ ([x y] (.noise (ap/current-applet) (float x) (float y)))
+ ([x y z] (.noise (ap/current-applet) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noiseDetail()"
+ :category "Math"
+ :subcategory "Random"
+ :added "1.0"}
+ noise-detail
+ "Adjusts the character and level of detail produced by the Perlin
+ noise function. Similar to harmonics in physics, noise is computed
+ over several octaves. Lower octaves contribute more to the output
+ signal and as such define the overal intensity of the noise, whereas
+ higher octaves create finer grained details in the noise
+ sequence. By default, noise is computed over 4 octaves with each
+ octave contributing exactly half than its predecessor, starting at
+ 50% strength for the 1st octave. This falloff amount can be changed
+ by adding an additional function parameter. Eg. a falloff factor of
+ 0.75 means each octave will now have 75% impact (25% less) of the
+ previous lower octave. Any value between 0.0 and 1.0 is valid,
+ however note that values greater than 0.5 might result in greater
+ than 1.0 values returned by noise.
+
+ By changing these parameters, the signal created by the noise
+ function can be adapted to fit very specific needs and
+ characteristics."
+ ([octaves] (.noiseDetail (ap/current-applet) (int octaves)))
+ ([octaves falloff] (.noiseDetail (ap/current-applet) (int octaves) (float falloff))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noiseSeed()"
+ :category "Math"
+ :subcategory "Random"
+ :added "1.0"}
+ noise-seed
+ "Sets the seed value for noise. By default, noise produces different
+ results each time the program is run. Set the value parameter to a
+ constant to return the same pseudo-random numbers each time the
+ software is run."
+ [val]
+ (.noiseSeed (ap/current-applet) (int val)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noLights()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ no-lights
+ "Disable all lighting. Lighting is turned off by default and enabled
+ with the lights fn. This function can be used to disable lighting so
+ that 2D geometry (which does not require lighting) can be drawn
+ after a set of lighted 3D geometry."
+ []
+ (.noLights (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noLoop()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ no-loop
+ "Stops Processing from continuously executing the code within
+ draw. If start-loop is called, the code in draw will begin to run
+ continuously again. If using no-loop in setup, it should be the last
+ line inside the block.
+
+ When no-loop is used, it's not possible to manipulate or access the
+ screen inside event handling functions such as mouse-pressed or
+ key-pressed. Instead, use those functions to call redraw or
+ loop which will run draw, which can update the screen
+ properly. This means that when no-loop has been called, no drawing
+ can happen, and functions like save-frame may not be used.
+
+ Note that if the sketch is resized, redraw will be called to
+ update the sketch, even after no-oop has been
+ specified. Otherwise, the sketch would enter an odd state until
+ loop was called."
+ []
+ (.noLoop (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "norm()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ norm
+ "Normalize a value to exist between 0 and 1 (inclusive)."
+ [val start stop]
+ #?(:clj (PApplet/norm (float val) (float start) (float stop))
+ :cljs (.norm (ap/current-applet) val start stop)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "normal()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ normal
+ "Sets the current normal vector. This is for drawing three
+ dimensional shapes and surfaces and specifies a vector perpendicular
+ to the surface of the shape which determines how lighting affects
+ it. Processing attempts to automatically assign normals to shapes,
+ but since that's imperfect, this is a better option when you want
+ more control. This function is identical to glNormal3f() in OpenGL."
+ [nx ny nz]
+ (.normal (current-graphics) (float nx) (float ny) (float nz)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noSmooth()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ no-smooth
+ "Draws all geometry with jagged (aliased) edges. Must be called inside
+ :settings handler."
+ [] (.noSmooth (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noStroke()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ no-stroke
+ "Disables drawing the stroke (outline). If both no-stroke and
+ no-fill are called, nothing will be drawn to the screen."
+ []
+ (.noStroke (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noTint()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ no-tint
+ "Removes the current fill value for displaying images and reverts to
+ displaying images with their original hues."
+ []
+ (.noTint (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ortho()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ ortho
+ "Sets an orthographic projection and defines a parallel clipping
+ volume. All objects with the same dimension appear the same size,
+ regardless of whether they are near or far from the camera. The
+ parameters to this function specify the clipping volume where left
+ and right are the minimum and maximum x values, top and bottom are
+ the minimum and maximum y values, and near and far are the minimum
+ and maximum z values. If no parameters are given, the default is
+ used: (ortho 0 width 0 height -10 10)"
+ ([] (.ortho (current-graphics)))
+ ([left right bottom top]
+ (.ortho (current-graphics) (float left) (float right) (float bottom) (float top)))
+ ([left right bottom top near far]
+ (.ortho (current-graphics) (float left) (float right) (float bottom) (float top) (float near) (float far))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "perspective()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ perspective
+ "Sets a perspective projection applying foreshortening, making
+ distant objects appear smaller than closer ones. The parameters
+ define a viewing volume with the shape of truncated pyramid. Objects
+ near to the front of the volume appear their actual size, while
+ farther objects appear smaller. This projection simulates the
+ perspective of the world more accurately than orthographic
+ projection. The version of perspective without parameters sets the
+ default perspective and the version with four parameters allows the
+ programmer to set the area precisely. The default values are:
+ perspective(PI/3.0, width/height, cameraZ/10.0, cameraZ*10.0) where
+ cameraZ is ((height/2.0) / tan(PI*60.0/360.0));"
+ ([] (.perspective (current-graphics)))
+ ([fovy aspect z-near z-far]
+ (.perspective (current-graphics) (float fovy) (float aspect)
+ (float z-near) (float z-far))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "pixelDensity()"
+ :category "Environment"
+ :subcategory nil
+ :added "2.4.0"}
+ pixel-density
+ "It makes it possible for Processing to render using all of the pixels
+ on high resolutions screens like Apple Retina displays and Windows
+ High-DPI displays. Possible values 1 or 2. Must be called only from
+ :settings handler. To get density of the current screen you can use
+ (display-density) function."
+ [density]
+ (.pixelDensity (ap/current-applet) density)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pixels[]"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ pixels
+ "Array containing the values for all the pixels in the display
+ window or image. This array is therefore the size of the display window. If
+ this array is modified, the update-pixels fn must be called to update
+ the changes. Calls .loadPixels before obtaining the pixel array."
+ ([] (pixels (current-graphics)))
+
+ #?(:clj
+ ([^PImage img]
+ (.loadPixels img)
+ (.-pixels img))
+
+ :cljs
+ ([img]
+ (.loadPixels img)
+ (let [pix-array (.toArray (.-pixels img))]
+ (set! (.-stored-pix-array img) pix-array)
+ pix-array))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pmouseX"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ pmouse-x
+ "Horizontal coordinate of the mouse in the previous frame"
+ []
+ (.-pmouseX (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pmouseY"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ pmouse-y
+ "Vertical coordinate of the mouse in the previous frame"
+ []
+ (.-pmouseY (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "point()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ point
+ "Draws a point, a coordinate in space at the dimension of one
+ pixel. The first parameter is the horizontal value for the point,
+ the second value is the vertical value for the point, and the
+ optional third value is the depth value. Drawing this shape in 3D
+ using the z parameter requires the :P3D or :opengl renderer to be
+ used."
+ ([x y] (.point (current-graphics) (float x)(float y)))
+ ([x y z] (.point (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pointLight()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ point-light
+ "Adds a point light. Lights need to be included in the draw() to
+ remain persistent in a looping program. Placing them in the setup()
+ of a looping program will cause them to only have an effect the
+ first time through the loop. The affect of the r, g, and b
+ parameters is determined by the current color mode. The x, y, and z
+ parameters set the position of the light"
+ [r g b x y z]
+ (.pointLight (current-graphics) (float r) (float g) (float b) (float x) (float y) (float z)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "popMatrix()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ pop-matrix
+ "Pops the current transformation matrix off the matrix
+ stack. Understanding pushing and popping requires understanding the
+ concept of a matrix stack. The push-matrix fn saves the current
+ coordinate system to the stack and pop-matrix restores the prior
+ coordinate system. push-matrix and pop-matrix are used in conjuction
+ with the other transformation methods and may be embedded to control
+ the scope of the transformations."
+ []
+ (.popMatrix (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "popStyle()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ pop-style
+ "Restores the prior settings on the 'style stack'. Used in
+ conjunction with push-style. Together they allow you to change the
+ style settings and later return to what you had. When a new style is
+ started with push-style, it builds on the current style information.
+ The push-style and pop-style functions can be nested to provide more
+ control"
+ []
+ (.popStyle (current-graphics)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "pow()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ pow
+ "Facilitates exponential expressions. The pow() function is an
+ efficient way of multiplying numbers by themselves (or their
+ reciprocal) in large quantities. For example, (pow 3 5) is
+ equivalent to the expression (* 3 3 3 3 3) and (pow 3 -5) is
+ equivalent to (/ 1 (* 3 3 3 3 3))."
+ [num exponent]
+ #?(:clj (PApplet/pow (float num) (float exponent))
+ :cljs (.pow (ap/current-applet) num exponent)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "printCamera()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ print-camera
+ "Prints the current camera matrix to std out. Useful for debugging."
+ []
+ (.printCamera (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "printMatrix()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ print-matrix
+ "Prints the current matrix to std out. Useful for debugging."
+ []
+ (.printMatrix (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "printProjection()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ print-projection
+ "Prints the current projection matrix to std out. Useful for
+ debugging"
+ []
+ (.printProjection (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pushMatrix()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ push-matrix
+ "Pushes the current transformation matrix onto the matrix
+ stack. Understanding push-matrix and pop-matrix requires
+ understanding the concept of a matrix stack. The push-matrix
+ function saves the current coordinate system to the stack and
+ pop-matrix restores the prior coordinate system. push-matrix and
+ pop-matrix are used in conjuction with the other transformation
+ methods and may be embedded to control the scope of the
+ transformations."
+ []
+ (.pushMatrix (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pushStyle()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ push-style
+ "Saves the current style settings onto a 'style stack'. Use with
+ pop-style which restores the prior settings. Note that these
+ functions are always used together. They allow you to change the
+ style settings and later return to what you had. When a new style is
+ started with push-style, it builds on the current style
+ information. The push-style and pop-style fns can be embedded to
+ provide more control.
+
+ The style information controlled by the following functions are
+ included in the style: fill, stroke, tint, stroke-weight,
+ stroke-cap, stroke-join, image-mode, rect-mode, ellipse-mode,
+ shape-mode, color-mode, text-align, text-font, text-mode, text-size,
+ text-leading, emissive, specular, shininess, and ambient"
+ []
+ (.pushStyle (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "quad()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ quad
+ "A quad is a quadrilateral, a four sided polygon. It is similar to a
+ rectangle, but the angles between its edges are not constrained to
+ be ninety degrees. The first pair of parameters (x1,y1) sets the
+ first vertex and the subsequent pairs should proceed clockwise or
+ counter-clockwise around the defined shape."
+ [x1 y1 x2 y2 x3 y3 x4 y4]
+ (.quad (current-graphics)
+ (float x1) (float y1)
+ (float x2) (float y2)
+ (float x3) (float y3)
+ (float x4) (float y4)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "quadraticVertex()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "2.0"}
+ quadratic-vertex
+ "Specifies vertex coordinates for quadratic Bezier curves. Each call to
+ quadratic-vertex defines the position of one control points and one
+ anchor point of a Bezier curve, adding a new segment to a line or shape.
+ The first time quadratic-vertex is used within a begin-shape call, it
+ must be prefaced with a call to vertex to set the first anchor point.
+ This function must be used between begin-shape and end-shape and only
+ when there is no MODE parameter specified to begin-shape. Using the 3D
+ version requires rendering with :p3d."
+ ([cx cy x3 y3]
+ (.quadraticVertex (current-graphics) (float cx) (float cy) (float x3) (float y3)))
+ ([cx cy cz x3 y3 z3]
+ (.quadraticVertex (current-graphics) (float cx) (float cy) (float cz) (float x3) (float y3) (float z3))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "radians()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ radians
+ "Converts a degree measurement to its corresponding value in
+ radians. Radians and degrees are two ways of measuring the same
+ thing. There are 360 degrees in a circle and 2*PI radians in a
+ circle. For example, 90° = PI/2 = 1.5707964. All trigonometric
+ methods in Processing require their parameters to be specified in
+ radians."
+ [degrees]
+ #?(:clj (PApplet/radians (float degrees))
+ :cljs (.radians (ap/current-applet) degrees)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "random()"
+ :category "Math"
+ :subcategory "Random"
+ :added "1.0"}
+ random
+ "Generates random numbers. Each time the random function is called,
+ it returns an unexpected value within the specified range. If one
+ parameter is passed to the function it will return a float between
+ zero and the value of the high parameter. The function call (random
+ 5) returns values between 0 and 5 (starting at zero, up to but not
+ including 5). If two parameters are passed, it will return a float
+ with a value between the parameters. The function call
+ (random -5 10.2) returns values starting at -5 up to (but not
+ including) 10.2."
+ ([max] (.random (ap/current-applet) (float max)))
+ ([min max] (.random (ap/current-applet) (float min) (float max))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "randomGaussian()"
+ :category "Math"
+ :subcategory "Random"
+ :added "2.0"}
+ random-gaussian
+ "Returns a float from a random series of numbers having a mean of 0 and
+ standard deviation of 1. Each time the randomGaussian() function is called,
+ it returns a number fitting a Gaussian, or normal, distribution.
+ There is theoretically no minimum or maximum value that randomGaussian()
+ might return. Rather, there is just a very low probability that values far
+ from the mean will be returned; and a higher probability that numbers near
+ the mean will be returned. ."
+ []
+ (.randomGaussian (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "randomSeed()"
+ :category "Math"
+ :subcategory "Random"
+ :added "1.0"}
+ random-seed
+ "Sets the seed value for random. By default, random produces
+ different results each time the program is run. Set the value
+ parameter to a constant to return the same pseudo-random numbers
+ each time the software is run."
+ [w]
+ (.randomSeed (ap/current-applet) (float w)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "key"
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "1.0"}
+ raw-key
+ "Contains the value of the most recent key on the keyboard that was
+ used (either pressed or released).
+
+ For non-ASCII keys, use the keyCode variable. The keys included in
+ the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and
+ DELETE) do not require checking to see if they key is coded, and you
+ should simply use the key variable instead of keyCode If you're
+ making cross-platform projects, note that the ENTER key is commonly
+ used on PCs and Unix and the RETURN key is used instead on
+ Macintosh. Check for both ENTER and RETURN to make sure your program
+ will work for all platforms."
+ []
+ (.-key (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rect()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ rect
+ "Draws a rectangle to the screen. A rectangle is a four-sided shape
+ with every angle at ninety degrees. By default, the first two
+ parameters set the location of the upper-left corner, the third
+ sets the width, and the fourth sets the height. These parameters
+ may be changed with rect-mode.
+
+ To draw a rounded rectangle, add a fifth parameter, which is used as
+ the radius value for all four corners. To use a different radius value
+ for each corner, include eight parameters."
+ ([x y width height]
+ (.rect (current-graphics) (float x) (float y) (float width) (float height)))
+ ([x y width height r]
+ (.rect (current-graphics) (float x) (float y) (float width) (float height) (float r)))
+ ([x y width height top-left-r top-right-r bottom-right-r bottom-left-r]
+ (.rect (current-graphics) (float x) (float y) (float width) (float height)
+ (float top-left-r) (float top-right-r) (float bottom-right-r) (float bottom-left-r))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rectMode()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ rect-mode
+ "Modifies the location from which rectangles draw. The default mode
+ is :corner. Available modes are:
+
+
+ :corner - Specifies the location to be the upper left corner of the
+ shape and uses the third and fourth parameters of rect to
+ specify the width and height.
+
+ :corners - Uses the first and second parameters of rect to set the
+ location of one corner and uses the third and fourth
+ parameters to set the opposite corner.
+
+ :center - Draws the image from its center point and uses the third
+ and forth parameters of rect to specify the image's width
+ and height.
+
+ :radius - Draws the image from its center point and uses the third
+ and forth parameters of rect() to specify half of the
+ image's width and height."
+
+ [mode]
+ (let [mode (u/resolve-constant-key mode rect-modes)]
+ (.rectMode (current-graphics) (int mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "red()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ red
+ "Extracts the red value from a color, scaled to match current color-mode."
+ [c]
+ (.red (current-graphics) (unchecked-int c)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "redraw()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ redraw
+ "Executes the code within the draw fn one time. This functions
+ allows the program to update the display window only when necessary,
+ for example when an event registered by mouse-pressed or
+ key-pressed occurs.
+
+ In structuring a program, it only makes sense to call redraw
+ within events such as mouse-pressed. This is because redraw does
+ not run draw immediately (it only sets a flag that indicates an
+ update is needed).
+
+ Calling redraw within draw has no effect because draw is
+ continuously called anyway."
+ []
+ (.redraw (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "requestImage()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ request-image
+ "This function load images on a separate thread so that your sketch
+ does not freeze while images load during setup. While the image is
+ loading, its width and height will be 0. If an error occurs while
+ loading the image, its width and height will be set to -1. You'll
+ know when the image has loaded properly because its width and height
+ will be greater than 0. Asynchronous image loading (particularly
+ when downloading from a server) can dramatically improve
+ performance."
+ [filename] (.requestImage (ap/current-applet) (str filename)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "resetMatrix()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ reset-matrix
+ "Replaces the current matrix with the identity matrix. The
+ equivalent function in OpenGL is glLoadIdentity()"
+ []
+ (.resetMatrix (current-graphics)))
+
+#?(:clj
+ (def ^{:private true}
+ shader-modes {:points PApplet/POINTS
+ :lines PApplet/LINES
+ :triangles PApplet/TRIANGLES}))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "resetShader()"
+ :category "Rendering"
+ :subcategory "Shaders"
+ :added "2.0"}
+ reset-shader
+ "Restores the default shaders. Code that runs after (reset-shader) will
+ not be affected by previously defined shaders. Optional 'kind' parameter -
+ type of shader, either :points, :lines, or :triangles"
+ ([] (.resetShader (current-graphics)))
+ ([kind]
+ (let [mode (u/resolve-constant-key kind shader-modes)]
+ (.resetShader (current-graphics) mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "resize()"
+ :category "Image"
+ :processing-link "http://processing.org/reference/PImage_resize_.html"
+ :added "2.1.0"}
+ resize
+ "Resize the image to a new width and height.
+ To make the image scale proportionally, use 0 as the value for the wide or
+ high parameter. For instance, to make the width of an image 150 pixels,
+ and change the height using the same proportion, use resize(150, 0).
+
+ Even though a PGraphics is technically a PImage, it is not possible
+ to rescale the image data found in a PGraphics.
+ (It's simply not possible to do this consistently across renderers:
+ technically infeasible with P3D, or what would it even do with PDF?)
+ If you want to resize PGraphics content, first get a copy of its image data
+ using the get() method, and call resize() on the PImage that is returned."
+ [^PImage img w h]
+ (.resize img w h))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rotate()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ rotate
+ "Rotates a shape the amount specified by the angle parameter. Angles
+ should be specified in radians (values from 0 to TWO-PI) or
+ converted to radians with the radians function.
+
+ Objects are always rotated around their relative position to the
+ origin and positive numbers rotate objects in a clockwise
+ direction. Transformations apply to everything that happens after
+ and subsequent calls to the function accumulates the effect. For
+ example, calling (rotate HALF-PI) and then (rotate HALF-PI) is the
+ same as (rotate PI). All tranformations are reset when draw begins
+ again.
+
+ Technically, rotate multiplies the current transformation matrix by
+ a rotation matrix. This function can be further controlled by the
+ push-matrix and pop-matrix."
+ ([angle] (.rotate (current-graphics) (float angle)))
+ ([angle vx vy vz] (.rotate (current-graphics) (float angle)
+ (float vx) (float vy) (float vz))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rotateX()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ rotate-x
+ "Rotates a shape around the x-axis the amount specified by the angle
+ parameter. Angles should be specified in radians (values from 0 to
+ (* PI 2)) or converted to radians with the radians function. Objects
+ are always rotated around their relative position to the origin and
+ positive numbers rotate objects in a counterclockwise
+ direction. Transformations apply to everything that happens after
+ and subsequent calls to the function accumulates the effect. For
+ example, calling (rotate-x HALF-PI) and then (rotate-x HALF-PI) is
+ the same as (rotate-x PI). If rotate-x is called within the draw fn,
+ the transformation is reset when the loop begins again. This
+ function requires either the :p3d or :opengl renderer."
+ [angle]
+ (.rotateX (current-graphics) (float angle)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rotateY()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ rotate-y
+ "Rotates a shape around the y-axis the amount specified by the angle
+ parameter. Angles should be specified in radians (values from 0
+ to (* PI 2)) or converted to radians with the radians function.
+ Objects are always rotated around their relative position to the
+ origin and positive numbers rotate objects in a counterclockwise
+ direction. Transformations apply to everything that happens after
+ and subsequent calls to the function accumulates the effect. For
+ example, calling (rotate-y HALF-PI) and then (rotate-y HALF-PI) is
+ the same as (rotate-y PI). If rotate-y is called within the draw fn,
+ the transformation is reset when the loop begins again. This
+ function requires either the :p3d or :opengl renderer."
+ [angle]
+ (.rotateY (current-graphics) (float angle)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rotateZ()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ rotate-z
+ "Rotates a shape around the z-axis the amount specified by the angle
+ parameter. Angles should be specified in radians (values from 0
+ to (* PI 2)) or converted to radians with the radians function.
+ Objects are always rotated around their relative position to the
+ origin and positive numbers rotate objects in a counterclockwise
+ direction. Transformations apply to everything that happens after
+ and subsequent calls to the function accumulates the effect. For
+ example, calling (rotate-z HALF-PI) and then (rotate-z HALF-PI) is
+ the same as (rotate-z PI). If rotate-y is called within the draw fn,
+ the transformation is reset when the loop begins again. This
+ function requires either the :p3d or :opengl renderer."
+ [angle]
+ (.rotateZ (current-graphics) (float angle)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "round()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ round
+ "Calculates the integer closest to the value parameter. For example,
+ (round 9.2) returns the value 9."
+ [val]
+ #?(:clj (PApplet/round (float val))
+ :cljs (.round (ap/current-applet) val)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "saturation()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ saturation
+ "Extracts the saturation value from a color."
+ [c]
+ (.saturation (current-graphics) (unchecked-int c)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "save()"
+ :category "Output"
+ :subcategory "Image"
+ :added "1.0"}
+ save
+ "Saves an image from the display window. Images are saved in TIFF,
+ TARGA, JPEG, and PNG format depending on the extension within the
+ filename parameter. For example, image.tif will have a TIFF image
+ and image.png will save a PNG image. If no extension is included in
+ the filename, the image will save in TIFF format and .tif will be
+ added to the name. All images saved from the main drawing window
+ will be opaque. To save images without a background, use
+ create-graphics."
+ [filename]
+ (.save (current-graphics) (str filename)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "saveFrame()"
+ :category "Output"
+ :subcategory "Image"
+ :added "1.0"}
+ save-frame
+ "Saves an image identical to the current display window as a
+ file. May be called multple times - each file saved will have a
+ unique name. Name and image formate may be modified by passing a
+ string parameter of the form \"foo-####.ext\" where foo- can be any
+ arbitrary string, #### will be replaced with the current frame id
+ and .ext is one of .tiff, .targa, .png, .jpeg or .jpg
+
+ Examples:
+ (save-frame)
+ (save-frame \"pretty-pic-####.jpg\")"
+ ([] (.saveFrame (ap/current-applet)))
+ ([name] (.saveFrame (ap/current-applet) (str name))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "scale()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ scale
+ "Increases or decreases the size of a shape by expanding and
+ contracting vertices. Objects always scale from their relative
+ origin to the coordinate system. Scale values are specified as
+ decimal percentages. For example, the function call (scale 2)
+ increases the dimension of a shape by 200%. Transformations apply to
+ everything that happens after and subsequent calls to the function
+ multiply the effect. For example, calling (scale 2) and then
+ (scale 1.5) is the same as (scale 3). If scale is called within
+ draw, the transformation is reset when the loop begins again. Using
+ this fuction with the z parameter requires specfying :p3d or :opengl
+ as the renderer. This function can be further controlled by
+ push-matrix and pop-matrix."
+ ([s] (.scale (current-graphics) (float s)))
+ ([sx sy] (.scale (current-graphics) (float sx) (float sy)))
+ ([sx sy sz] (.scale (current-graphics) (float sx) (float sy) (float sz))))
+
+#?(:clj
+ (defn- ^java.awt.Dimension current-screen
+ []
+ (let [default-toolkit (java.awt.Toolkit/getDefaultToolkit)]
+ (.getScreenSize default-toolkit))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name nil
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ screen-width
+ "Returns the width of the main screen in pixels."
+ []
+ (.width (current-screen))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name nil
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ screen-height
+ "Returns the height of the main screen in pixels."
+ []
+ (.height (current-screen))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "screenX()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ screen-x
+ "Takes a three-dimensional x, y, z position and returns the x value
+ for where it will appear on a (two-dimensional) screen, once
+ affected by translate, scale or any other transformations"
+ ([x y] (.screenX (current-graphics) (float x) (float y)))
+ ([x y z] (.screenX (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "screenY()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ screen-y
+ "Takes a three-dimensional x, y, z position and returns the y value
+ for where it will appear on a (two-dimensional) screen, once
+ affected by translate, scale or any other transformations"
+ ([x y] (.screenY (current-graphics) (float x) (float y)))
+ ([x y z] (.screenY (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "screenZ()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ screen-z
+ "Given an x, y, z coordinate, returns its z value.
+ This value can be used to determine if an x, y, z coordinate is in
+ front or in back of another (x, y, z) coordinate. The units are
+ based on how the zbuffer is set up, and don't relate to anything
+ 'real'. They're only useful for in comparison to another value
+ obtained from screen-z, or directly out of the zbuffer"
+ [x y z]
+ (.screenZ (current-graphics) (float x) (float y) (float z)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "second()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ seconds
+ "Returns the current second as a value from 0 - 59."
+ []
+ #?(:clj (PApplet/second)
+ :cljs (.second (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "set()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ set-pixel
+ "Changes the color of any pixel in the display window. The x and y
+ parameters specify the pixel to change and the color parameter
+ specifies the color value. The color parameter is affected by the
+ current color mode (the default is RGB values from 0 to 255).
+
+ Setting the color of a single pixel with (set x, y) is easy, but not
+ as fast as putting the data directly into pixels[].
+
+ This function ignores imageMode().
+
+ Due to what appears to be a bug in Apple's Java implementation, the
+ point() and set() methods are extremely slow in some circumstances
+ when used with the default renderer. Using :p2d or :p3d will fix the
+ problem. Grouping many calls to point or set-pixel together can also
+ help. (Bug 1094)"
+ ([x y c] (set-pixel (current-graphics) x y c))
+ ([^PImage img x y c]
+ (.set img (int x) (int y) (int c))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "set()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ set-image
+ "Writes an image directly into the display window. The x and y
+ parameters define the coordinates for the upper-left corner of the
+ image."
+ [x y ^PImage src]
+ (.set (current-graphics) (int x) (int y) src))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "shader()"
+ :category "Rendering"
+ :subcategory "Shaders"
+ :added "2.0"}
+ shader
+ "Applies the shader specified by the parameters. It's compatible with the :p2d
+ and :p3drenderers, but not with the default :java2d renderer. Optional 'kind'
+ parameter - type of shader, either :points, :lines, or :triangles"
+ ([shader] (.shader (current-graphics) shader))
+ ([shader kind]
+ (let [mode (u/resolve-constant-key kind shader-modes)]
+ (.shader (current-graphics) shader mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "shape()"
+ :category "Shape"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ shape
+ "Displays shapes to the screen. The shapes must have been loaded
+ with load-shape. Processing currently works with SVG shapes
+ only. The sh parameter specifies the shape to display and the x and
+ y parameters define the location of the shape from its upper-left
+ corner. The shape is displayed at its original size unless the width
+ and height parameters specify a different size. The shape-mode
+ fn changes the way the parameters work. A call to
+ (shape-mode :corners), for example, will change the width and height
+ parameters to define the x and y values of the opposite corner of
+ the shape.
+
+ Note complex shapes may draw awkwardly with the renderers :p2d, :p3d, and
+ :opengl. Those renderers do not yet support shapes that have holes
+ or complicated breaks."
+ ([^PShape sh] (.shape (current-graphics) sh))
+ ([^PShape sh x y] (.shape (current-graphics) sh (float x) (float y)))
+ ([^PShape sh x y width height] (.shape (current-graphics) sh (float x) (float y) (float width) (float height))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "shearX()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ shear-x
+ "Shears a shape around the x-axis the amount specified by the angle
+ parameter. Angles should be specified in radians (values from 0 to
+ PI*2) or converted to radians with the radians() function. Objects
+ are always sheared around their relative position to the origin and
+ positive numbers shear objects in a clockwise direction.
+ Transformations apply to everything that happens after and
+ subsequent calls to the function accumulates the effect. For
+ example, calling (shear-x (/ PI 2)) and then (shear-x (/ PI 2)) is
+ the same as (shear-x PI). If shear-x is called within the draw fn,
+ the transformation is reset when the loop begins again. This
+ function works in P2D or JAVA2D mode.
+
+ Technically, shear-x multiplies the current transformation matrix
+ by a rotation matrix. This function can be further controlled by the
+ push-matrix and pop-matrix fns."
+ [angle]
+ (.shearX (current-graphics) (float angle)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "shearY()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ shear-y
+ "Shears a shape around the y-axis the amount specified by the angle
+ parameter. Angles should be specified in radians (values from 0 to
+ PI*2) or converted to radians with the radians() function. Objects
+ are always sheared around their relative position to the origin and
+ positive numbers shear objects in a clockwise direction.
+ Transformations apply to everything that happens after and
+ subsequent calls to the function accumulates the effect. For
+ example, calling (shear-y (/ PI 2)) and then (shear-y (/ PI 2)) is
+ the same as (shear-y PI). If shear-y is called within the draw fn,
+ the transformation is reset when the loop begins again. This
+ function works in P2D or JAVA2D mode.
+
+ Technically, shear-y multiplies the current transformation matrix
+ by a rotation matrix. This function can be further controlled by the
+ push-matrix and pop-matrix fns."
+ [angle]
+ (.shearY (current-graphics) (float angle)))
+
+(defn ^{:requires-bindings true
+ :processing-name "shapeMode()"
+ :category "Shape"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ shape-mode
+ "Modifies the location from which shapes draw. Available modes are
+ :corner, :corners and :center. Default is :corner.
+
+ :corner - specifies the location to be the upper left corner of the
+ shape and uses the third and fourth parameters of shape
+ to specify the width and height.
+
+ :corners - uses the first and second parameters of shape to set
+ the location of one corner and uses the third and fourth
+ parameters to set the opposite corner.
+
+ :center - draws the shape from its center point and uses the third
+ and forth parameters of shape to specify the width and
+ height. "
+ [mode]
+ (let [mode (u/resolve-constant-key mode p-shape-modes)]
+ (.shapeMode (current-graphics) (int mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "shininess()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ shininess
+ "Sets the amount of gloss in the surface of shapes. Used in
+ combination with ambient, specular, and emissive in setting
+ the material properties of shapes."
+ [shine]
+ (.shininess (current-graphics) (float shine)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "sin()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ sin
+ "Calculates the sine of an angle. This function expects the values
+ of the angle parameter to be provided in radians (values from 0 to
+ 6.28). A float within the range -1 to 1 is returned."
+ [angle]
+ #?(:clj (PApplet/sin (float angle))
+ :cljs (.sin (ap/current-applet) angle)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "smooth()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ smooth
+ "Draws all geometry with smooth (anti-aliased) edges. This will slow
+ down the frame rate of the application, but will enhance the visual
+ refinement.
+
+ Must be called inside :settings handler.
+
+ The level parameter (int) increases the level of smoothness with the
+ P2D and P3D renderers. This is the level of over sampling applied to
+ the graphics buffer. The value '2' will double the rendering size
+ before scaling it down to the display size. This is called '2x
+ anti-aliasing.' The value 4 is used for 4x anti-aliasing and 8 is
+ specified for 8x anti-aliasing. If level is set to 0, it will disable
+ all smoothing; it's the equivalent of the function noSmooth().
+ The maximum anti-aliasing level is determined by the hardware of the
+ machine that is running the software.
+
+ Note that smooth will also improve image quality of resized images."
+ ([] (.smooth #?(:clj (ap/current-applet)
+ :cljs (current-graphics))))
+ ([level] (.smooth #?(:clj (ap/current-applet)
+ :cljs (current-graphics))
+ (int level))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "specular()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ specular
+ "Sets the specular color of the materials used for shapes drawn to
+ the screen, which sets the color of hightlights. Specular refers to
+ light which bounces off a surface in a perferred direction (rather
+ than bouncing in all directions like a diffuse light). Used in
+ combination with emissive, ambient, and shininess in setting
+ the material properties of shapes."
+ ([gray] (.specular (current-graphics) (float gray)))
+ ([x y z] (.specular (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "sphere()"
+ :category "Shape"
+ :subcategory "3D Primitives"
+ :added "1.0"}
+ sphere
+ "Generates a hollow ball made from tessellated triangles."
+ [radius] (.sphere (current-graphics) (float radius)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "sphereDetail()"
+ :category "Shape"
+ :subcategory "3D Primitives"
+ :added "1.0"}
+ sphere-detail
+ "Controls the detail used to render a sphere by adjusting the number
+ of vertices of the sphere mesh. The default resolution is 30, which
+ creates a fairly detailed sphere definition with vertices every
+ 360/30 = 12 degrees. If you're going to render a great number of
+ spheres per frame, it is advised to reduce the level of detail using
+ this function. The setting stays active until sphere-detail is
+ called again with a new parameter and so should not be called prior
+ to every sphere statement, unless you wish to render spheres with
+ different settings, e.g. using less detail for smaller spheres or
+ ones further away from the camera. To controla the detail of the
+ horizontal and vertical resolution independently, use the version of
+ the functions with two parameters."
+ ([res] (.sphereDetail (current-graphics) (int res)))
+ ([ures vres] (.sphereDetail (current-graphics) (int ures) (int vres))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "spotLight()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ spot-light
+ "Adds a spot light. Lights need to be included in the draw to
+ remain persistent in a looping program. Placing them in the setup
+ of a looping program will cause them to only have an effect the
+ first time through the loop. The affect of the r, g, and b
+ parameters is determined by the current color mode. The x, y, and z
+ parameters specify the position of the light and nx, ny, nz specify
+ the direction or light. The angle parameter affects angle of the
+ spotlight cone."
+ ([r g b x y z nx ny nz angle concentration]
+ (.spotLight (current-graphics) r g b x y z nx ny nz angle concentration))
+ ([[r g b] [x y z] [nx ny nz] angle concentration]
+ (.spotLight (current-graphics) r g b x y z nx ny nz angle concentration)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "sq()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ sq
+ "Squares a number (multiplies a number by itself). The result is
+ always a positive number, as multiplying two negative numbers always
+ yields a positive result. For example, -1 * -1 = 1."
+ [a]
+ #?(:clj (PApplet/sq (float a))
+ :cljs (.sq (ap/current-applet) a)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "sqrt()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ sqrt
+ "Calculates the square root of a number. The square root of a number
+ is always positive, even though there may be a valid negative
+ root. The square root s of number a is such that (= a (* s s)) . It
+ is the opposite of squaring."
+ [a]
+ #?(:clj (PApplet/sqrt (float a))
+ :cljs (.sqrt (ap/current-applet) a)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "loop()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ start-loop
+ "Causes Processing to continuously execute the code within
+ draw. If no-loop is called, the code in draw stops executing."
+ []
+ (.loop (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "stroke()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ stroke-float
+ "Sets the color used to draw lines and borders around
+ shapes. Converts all args to floats"
+ ([gray] (.stroke (current-graphics) (float gray)))
+ ([gray alpha] (.stroke (current-graphics) (float gray) (float alpha)))
+ ([x y z] (.stroke (current-graphics) (float x) (float y) (float z)))
+ ([x y z a] (.stroke (current-graphics) (float x) (float y) (float z) (float a))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "stroke()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ stroke-int
+ "Sets the color used to draw lines and borders around
+ shapes. Converts rgb to int and alpha to a float."
+ ([rgb] (.stroke (current-graphics) (unchecked-int rgb)))
+ ([rgb alpha] (.stroke (current-graphics) (unchecked-int rgb) (float alpha))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "stroke()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ stroke
+ "Sets the color used to draw lines and borders around shapes. This
+ color is either specified in terms of the RGB or HSB color depending
+ on the current color-mode (the default color space is RGB, with
+ each value in the range from 0 to 255)."
+ ([rgb]
+ #?(:clj (if (u/int-like? rgb) (stroke-int rgb) (stroke-float rgb))
+ :cljs (stroke-float rgb)))
+
+ ([rgb alpha]
+ #?(:clj (if (u/int-like? rgb) (stroke-int rgb alpha) (stroke-float rgb alpha))
+ :cljs (stroke-float rgb alpha)))
+
+ ([x y z] (stroke-float x y z))
+ ([x y z a] (stroke-float x y z a)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "strokeCap()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ stroke-cap
+ "Sets the style for rendering line endings. These ends are either
+ squared, extended, or rounded and specified with the corresponding
+ parameters :square, :project, and :round. The default cap is :round."
+ [cap-mode]
+ (let [cap-mode (u/resolve-constant-key cap-mode stroke-cap-modes)]
+ (.strokeCap (current-graphics)
+ #?(:clj (int cap-mode)
+ :cljs (str cap-mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "strokeJoin()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ stroke-join
+ "Sets the style of the joints which connect line
+ segments. These joints are either mitered, beveled, or rounded and
+ specified with the corresponding parameters :miter, :bevel, and
+ :round. The default joint is :miter.
+
+ This function is not available with the :p2d, :p3d, or :opengl
+ renderers."
+ [join-mode]
+ (let [join-mode (u/resolve-constant-key join-mode stroke-join-modes)]
+ (.strokeJoin (current-graphics)
+ #?(:clj (int join-mode)
+ :cljs (str join-mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "strokeWeight()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ stroke-weight
+ "Sets the width of the stroke used for lines, points, and the border
+ around shapes. All widths are set in units of pixels. "
+ [weight]
+ (.strokeWeight (current-graphics) (float weight)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "tan()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ tan
+ "Calculates the ratio of the sine and cosine of an angle. This
+ function expects the values of the angle parameter to be provided in
+ radians (values from 0 to PI*2). Values are returned in the range
+ infinity to -infinity."
+ [angle]
+ #?(:clj (PApplet/tan (float angle))
+ :cljs (.tan (ap/current-applet) angle)))
+
+(defn
+ ^{:requires-bindings true
+ :category "Environment"
+ :subcategory nil
+ :added "1.5.0"}
+ target-frame-rate
+ "Returns the target framerate specified with the fn frame-rate"
+ []
+ #?(:clj @(ap/target-frame-rate)
+ :cljs @(.-target-frame-rate (ap/current-applet))))
+
+(defn- no-fill?
+ "Returns whether fill is disabled for current graphics."
+ [^PGraphics graphics]
+ #?(:clj (not (.-fill graphics))
+ :cljs (true? (aget graphics no-fill-prop))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "text()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ text-char
+ "Draws a char to the screen in the specified position. See text fn
+ for more details."
+ ([c x y]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) (char c) (float x) (float y))))
+ ([c x y z]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) (char c) (float x) (float y) (float z)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "text()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ text-num
+ "Draws a number to the screen in the specified position. See text fn
+ for more details."
+ ([num x y]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) (float num) (float x) (float y))))
+ ([num x y z]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) (float num) (float x) (float y) (float z)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "text()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ text
+ "Draws text to the screen in the position specified by the x and y
+ parameters and the optional z parameter. A default font will be used
+ unless a font is set with the text-font fn. Change the color of the
+ text with the fill fn. The text displays in relation to the
+ text-align fn, which gives the option to draw to the left, right, and
+ center of the coordinates.
+
+ The x1, y1, x2 and y2 parameters define a
+ rectangular area to display within and may only be used with string
+ data. For text drawn inside a rectangle, the coordinates are
+ interpreted based on the current rect-mode setting."
+ ([^String s x y]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) s (float x) (float y))))
+ ([^String s x y z]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) s (float x) (float y) (float z))))
+ ([^String s x1 y1 x2 y2]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) s (float x1) (float y1) (float x2) (float y2)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textAlign()"
+ :category "Typography"
+ :subcategory "Attributes"
+ :added "1.0"}
+ text-align
+ "Sets the current alignment for drawing text. Available modes are:
+
+ horizontal - :left, :center, and :right
+ vertical - :top, :bottom, :center, and :baseline
+
+ An optional second parameter specifies the vertical alignment
+ mode. :baseline is the default. The :top and :center parameters are
+ straightforward. The :bottom parameter offsets the line based on the
+ current text-descent. For multiple lines, the final line will be
+ aligned to the bottom, with the previous lines appearing above it.
+
+ When using text with width and height parameters, :baseline is
+ ignored, and treated as :top. (Otherwise, text would by default draw
+ outside the box, since :baseline is the default setting. :baseline is
+ not a useful drawing mode for text drawn in a rectangle.)
+
+ The vertical alignment is based on the value of text-ascent, which
+ many fonts do not specify correctly. It may be necessary to use a
+ hack and offset by a few pixels by hand so that the offset looks
+ correct. To do this as less of a hack, use some percentage of
+ text-ascent or text-descent so that the hack works even if you
+ change the size of the font."
+ ([align]
+ (let [align (u/resolve-constant-key align horizontal-alignment-modes)]
+ (.textAlign (current-graphics) (int align))))
+ ([align-x align-y]
+ (let [align-x (u/resolve-constant-key align-x horizontal-alignment-modes)
+ align-y (u/resolve-constant-key align-y vertical-alignment-modes)]
+ (.textAlign (current-graphics) (int align-x) (int align-y)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textAscent()"
+ :category "Typography"
+ :subcategory "Metrics"
+ :added "1.0"}
+ text-ascent
+ "Returns the ascent of the current font at its current size. This
+ information is useful for determining the height of the font above
+ the baseline. For example, adding the text-ascent and text-descent
+ values will give you the total height of the line."
+ []
+ (.textAscent (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textDescent()"
+ :category "Typography"
+ :subcategory "Metrics"
+ :added "1.0"}
+ text-descent
+ "Returns descent of the current font at its current size. This
+ information is useful for determining the height of the font below
+ the baseline. For example, adding the text-ascent and text-descent
+ values will give you the total height of the line."
+ []
+ (.textDescent (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textFont()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ text-font
+ "Sets the current font that will be drawn with the text
+ function. Fonts must be loaded with load-font before it can be
+ used. This font will be used in all subsequent calls to the text
+ function. If no size parameter is input, the font will appear at its
+ original size until it is changed with text-size.
+
+ Because fonts are usually bitmaped, you should create fonts at the
+ sizes that will be used most commonly. Using textFont without the
+ size parameter will result in the cleanest-looking text.
+
+ With the default (JAVA2D) and PDF renderers, it's also possible to
+ enable the use of native fonts via the command
+ (hint :enable-native-fonts). This will produce vector text in JAVA2D
+ sketches and PDF output in cases where the vector data is available:
+ when the font is still installed, or the font is created via the
+ create-font fn"
+ ([^PFont font] (.textFont (current-graphics) font))
+ ([^PFont font size] (.textFont (current-graphics) font (int size))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textLeading()"
+ :category "Typography"
+ :subcategory "Attributes"
+ :added "1.0"}
+ text-leading
+ "Sets the spacing between lines of text in units of pixels. This
+ setting will be used in all subsequent calls to the text function."
+ [leading]
+ (.textLeading (current-graphics) (float leading)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textMode()"
+ :category "Typography"
+ :subcategory "Attributes"
+ :added "1.0"}
+ text-mode
+ "Sets the way text draws to the screen - available modes
+ are :model and :shape
+
+ In the default configuration (the :model mode), it's possible to
+ rotate, scale, and place letters in two and three dimensional space.
+
+ The :shape mode draws text using the glyph outlines of individual
+ characters rather than as textures. This mode is only supported with
+ the PDF and OPENGL renderer settings. With the PDF renderer, you
+ must specify the :shape text-mode before any other drawing occurs.
+ If the outlines are not available, then :shape will be ignored and
+ :model will be used instead.
+
+ The :shape option in OPENGL mode can be combined with begin-raw to
+ write vector-accurate text to 2D and 3D output files, for instance
+ DXF or PDF. :shape is not currently optimized for OPENGL, so if
+ recording shape data, use :model until you're ready to capture the
+ geometry with begin-raw."
+ [mode]
+ (let [mode (u/resolve-constant-key mode text-modes)]
+ (.textMode (current-graphics) (int mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textSize()"
+ :category "Typography"
+ :subcategory "Attributes"
+ :added "1.0"}
+ text-size
+ "Sets the current font size. This size will be used in all
+ subsequent calls to the text fn. Font size is measured in
+ units of pixels."
+ [size]
+ (.textSize (current-graphics) (float size)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "texture()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ texture
+ "Sets a texture to be applied to vertex points. The texture fn must
+ be called between begin-shape and end-shape and before any calls to
+ vertex.
+
+ When textures are in use, the fill color is ignored. Instead, use
+ tint to specify the color of the texture as it is applied to the
+ shape."
+ #?(:clj [^PImage img]
+ :cljs [img])
+ (.texture (current-graphics) img))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textureMode()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ texture-mode
+ "Sets the coordinate space for texture mapping. There are two
+ options, :image and :normal.
+
+ :image refers to the actual coordinates of the image and :normal
+ refers to a normalized space of values ranging from 0 to 1. The
+ default mode is :image. In :image, if an image is 100 x 200 pixels,
+ mapping the image onto the entire size of a quad would require the
+ points (0,0) (0,100) (100,200) (0,200). The same mapping in
+ NORMAL_SPACE is (0,0) (0,1) (1,1) (0,1)."
+ [mode]
+ (let [mode (u/resolve-constant-key mode texture-modes)]
+ (.textureMode (current-graphics) (int mode))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "textureWrap()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "2.0"}
+ texture-wrap
+ "Defines if textures repeat or draw once within a texture map. The two
+ parameters are :clamp (the default behavior) and :repeat. This function
+ only works with the :p2d and :p3d renderers."
+ [mode]
+ (let [mode (u/resolve-constant-key mode texture-wrap-modes)]
+ (.textureWrap (current-graphics) mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textWidth()"
+ :category "Typography"
+ :subcategory "Attributes"
+ :added "1.0"}
+ text-width
+ "Calculates and returns the width of any text string."
+ [^String data]
+ (.textWidth (current-graphics) data))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "tint()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ tint-float
+ "Sets the fill value for displaying images. Images can be tinted to
+ specified colors or made transparent by setting the alpha.
+
+ To make an image transparent, but not change it's color, use white
+ as the tint color and specify an alpha value. For instance,
+ tint(255, 128) will make an image 50% transparent (unless
+ colorMode() has been used).
+
+ The value for the parameter gray must be less than or equal to the
+ current maximum value as specified by colorMode(). The default
+ maximum value is 255.
+
+ Also used to control the coloring of textures in 3D."
+ ([gray] (.tint (current-graphics) (float gray)))
+ ([gray alpha] (.tint (current-graphics) (float gray) (float alpha)))
+ ([r g b] (.tint (current-graphics) (float r)(float g) (float b)))
+ ([r g b a] (.tint (current-graphics) (float g) (float g) (float b) (float a))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "tint()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ tint-int
+ "Sets the fill value for displaying images. Images can be tinted to
+ specified colors or made transparent by setting the alpha.
+
+ To make an image transparent, but not change it's color, use white
+ as the tint color and specify an alpha value. For instance,
+ tint(255, 128) will make an image 50% transparent (unless
+ colorMode() has been used).
+
+ The value for the parameter gray must be less than or equal to the
+ current maximum value as specified by colorMode(). The default
+ maximum value is 255.
+
+ Also used to control the coloring of textures in 3D."
+ ([rgb] (.tint (current-graphics) (unchecked-int rgb)))
+ ([rgb alpha] (.tint (current-graphics) (unchecked-int rgb) (float alpha))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "tint()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ tint
+ "Sets the fill value for displaying images. Images can be tinted to
+ specified colors or made transparent by setting the alpha.
+
+ To make an image transparent, but not change it's color, use white
+ as the tint color and specify an alpha value. For instance,
+ tint(255, 128) will make an image 50% transparent (unless
+ colorMode() has been used).
+
+ The value for the parameter gray must be less than or equal to the
+ current maximum value as specified by colorMode(). The default
+ maximum value is 255.
+
+ Also used to control the coloring of textures in 3D."
+ #?(:clj ([rgb] (if (u/int-like? rgb) (tint-int rgb) (tint-float rgb)))
+ :cljs ([rgb] (.tint (current-graphics) rgb)))
+ #?(:clj ([rgb alpha] (if (u/int-like? rgb) (tint-int rgb alpha) (tint-float rgb alpha)))
+ :cljs ([rgb alpha] (.tint (current-graphics) rgb alpha)))
+ ([r g b] (tint-float r g b))
+ ([r g b a] (tint-float r g b a)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "translate()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ translate
+ "Specifies an amount to displace objects within the display
+ window. The x parameter specifies left/right translation, the y
+ parameter specifies up/down translation, and the z parameter
+ specifies translations toward/away from the screen. Transformations
+ apply to everything that happens after and subsequent calls to the
+ function accumulates the effect. For example, calling (translate 50
+ 0) and then (translate 20, 0) is the same as (translate 70, 0). If
+ translate is called within draw, the transformation is reset when
+ the loop begins again. This function can be further controlled by
+ the push-matrix and pop-matrix."
+ ([v] (apply translate v))
+ ([tx ty] (.translate (current-graphics) (float tx) (float ty)))
+ ([tx ty tz] (.translate (current-graphics) (float tx) (float ty) (float tz))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "triangle()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ triangle
+ "A triangle is a plane created by connecting three points. The first
+ two arguments specify the first point, the middle two arguments
+ specify the second point, and the last two arguments specify the
+ third point."
+ [x1 y1 x2 y2 x3 y3]
+ (.triangle (current-graphics)
+ (float x1) (float y1)
+ (float x2) (float y2)
+ (float x3) (float y3)))
+
+(defn
+ ^{:require-binding false
+ :processing-name "unbinary()"
+ :category "Data"
+ :subcategory "Conversion"
+ :added "1.0"}
+ unbinary
+ "Unpack a binary string to an integer. See binary for converting
+ integers to strings."
+ [str-val]
+ #?(:clj (PApplet/unbinary (str str-val))
+ :cljs (.unbinary (ap/current-applet) (str str-val))))
+
+(defn
+ ^{:require-binding false
+ :processing-name "hex()"
+ :category "Data"
+ :subcategory "Conversion"}
+ unhex
+ "Converts a String representation of a hexadecimal number to its
+ equivalent integer value."
+ [hex-str]
+ #?(:clj (PApplet/unhex (str hex-str))
+ :cljs (.unhex (ap/current-applet) (str hex-str))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "updatePixels()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ update-pixels
+ "Updates the display window or image with the data in the pixels array.
+ Use in conjunction with (pixels). If you're only reading pixels from
+ the array, there's no need to call update-pixels unless there are
+ changes.
+
+ Certain renderers may or may not seem to require pixels or
+ update-pixels. However, the rule is that any time you want to
+ manipulate the pixels array, you must first call pixels, and
+ after changes have been made, call update-pixels. Even if the
+ renderer may not seem to use this function in the current Processing
+ release, this will always be subject to change."
+ ([] (update-pixels (current-graphics)))
+ #?(:clj
+ ([^PImage img] (.updatePixels img))
+
+ :cljs
+ ([img]
+ (when-let [pix-array (.-stored-pix-array img)]
+ (.set (.-pixels img) pix-array)
+ (set! (.-stored-pix-array img) nil))
+ (.updatePixels img))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "vertex()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ vertex
+ "All shapes are constructed by connecting a series of
+ vertices. vertex is used to specify the vertex coordinates for
+ points, lines, triangles, quads, and polygons and is used
+ exclusively within the begin-shape and end-shape fns.
+
+ Drawing a vertex in 3D using the z parameter requires the :p3d or
+ :opengl renderers to be used.
+
+ This function is also used to map a texture onto the geometry. The
+ texture fn declares the texture to apply to the geometry and the u
+ and v coordinates set define the mapping of this texture to the
+ form. By default, the coordinates used for u and v are specified in
+ relation to the image's size in pixels, but this relation can be
+ changed with texture-mode."
+ ([x y] (.vertex (current-graphics) (float x) (float y)))
+ ([x y z] (.vertex (current-graphics) (float x) (float y) (float z)))
+ ([x y u v] (.vertex (current-graphics) (float x) (float y) (float u) (float v)))
+ ([x y z u v]
+ (.vertex (current-graphics) (float x) (float y) (float z) (float u) (float v))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "year()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ year
+ "Returns the current year as an integer (2003, 2004, 2005, etc)."
+ []
+ #?(:clj (PApplet/year)
+ :cljs (.year (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "getWidth()"
+ :processing-link nil
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ width
+ "Width of the display window. The value of width is zero until size is
+ called."
+ []
+ (.-width (ap/current-applet)))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Color"
+ :subcategory "Utility Macros"
+ :added "1.7"}
+ with-fill
+ "Temporarily set the fill color for the body of this macro.
+ The code outside of with-fill form will have the previous fill color set.
+
+ The fill color has to be in a vector!
+ Example: (with-fill [255] ...)
+ (with-fill [10 80 98] ...)"
+ [fill-args & body]
+ `(let [old-fill# (quil.core/current-fill)]
+ (apply quil.core/fill ~fill-args)
+ ~@body
+ (quil.core/fill old-fill#)))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Color"
+ :subcategory "Utility Macros"
+ :added "1.7"}
+ with-stroke
+ "Temporarily set the stroke color for the body of this macro.
+ The code outside of with-stroke form will have the previous stroke color set.
+
+ The stroke color has to be in a vector!
+ Example: (with-stroke [255] ...)
+ (with-stroke [10 80 98] ...)"
+ [stroke-args & body]
+ `(let [old-stroke# (quil.core/current-stroke)]
+ (apply quil.core/stroke ~stroke-args)
+ ~@body
+ (quil.core/stroke old-stroke#)))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Transform"
+ :subcategory "Utility Macros"
+ :added "1.0"}
+ with-translation
+ "Performs body with translation, restores current transformation on
+ exit."
+ [translation-vector & body]
+ `(let [tr# ~translation-vector]
+ (quil.core/push-matrix)
+ (try
+ (quil.core/translate tr#)
+ ~@body
+ (finally
+ (quil.core/pop-matrix)))))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Transform"
+ :subcategory "Utility Macros"
+ :added "1.0"}
+ with-rotation
+ "Performs body with rotation, restores current transformation on exit.
+ Accepts a vector [angle] or [angle x-axis y-axis z-axis].
+
+ Example:
+ (with-rotation [angle]
+ (vertex 1 2))"
+ [rotation & body]
+ `(let [tr# ~rotation]
+ (quil.core/push-matrix)
+ (try
+ (apply quil.core/rotate tr#)
+ ~@body
+ (finally
+ (quil.core/pop-matrix)))))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Rendering"
+ :added "1.7"}
+ with-graphics
+ "All subsequent calls of any drawing function will draw on given
+ graphics. 'with-graphics' cannot be nested (you can draw simultaneously
+ only on 1 graphics)"
+ [graphics & body]
+ `(let [gr# ~graphics]
+ (binding [quil.core/*graphics* gr#]
+ (.beginDraw gr#)
+ ~@body
+ (.endDraw gr#))))
+
+(defn ^{:requires-bindings false
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ sketch
+ "Create and start a new visualisation applet. Can be used to create
+ new sketches programmatically. See documentation for 'defsketch' for
+ list of available options."
+ [& opts]
+ #?(:clj (apply ap/applet opts)
+ :cljs (apply ap/sketch opts)))
+
+(defmacro ^{:requires-bindings false
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ defsketch
+ "Define and start a sketch and bind it to a var with the symbol
+ app-name. If any of the options to the various callbacks are
+ symbols, it wraps them in a call to var to ensure they aren't
+ inlined and that redefinitions to the original fns are reflected in
+ the visualisation.
+
+ Available options:
+
+ :size - A vector of width and height for the sketch or :fullscreen.
+ Defaults to [500 300]. If you're using :fullscreen you may
+ want to enable present mode - :features [:present]
+
+ :renderer - Specifies the renderer type. One of :p2d, :p3d, :java2d,
+ :opengl, :pdf). Defaults to :java2d. :dxf renderer
+ can't be used as sketch renderer. Use begin-raw method
+ instead. In clojurescript only :p2d and :p3d renderers
+ are supported.
+
+ :output-file - Specifies an output file path. Only used in :pdf mode.
+ Not supported in clojurescript.
+
+ :title - A string which will be displayed at the top of
+ the sketch window. Not supported in clojurescript.
+
+ :features - A vector of keywords customizing sketch behaviour.
+ Supported features:
+
+ :keep-on-top - Sketch window will always be above other
+ windows. Note: some platforms might not
+ support always-on-top windows.
+ Not supported in clojurescript.
+
+ :exit-on-close - Shutdown JVM when sketch is closed.
+ Not supported in clojurescript.
+
+ :resizable - Makes sketch resizable.
+ Not supported in clojurescript.
+
+ :no-safe-fns - Do not catch and print exceptions thrown
+ inside functions provided to sketch (like
+ draw, mouse-click, key-pressed and
+ other). By default all exceptions thrown
+ inside these functions are catched. This
+ prevents sketch from breaking when bad
+ function was provided and allows you to
+ fix it and reload it on fly. You can
+ disable this behaviour by enabling
+ :no-safe-fns feature.
+ Not supported in clojurescript.
+
+ :present - Switch to present mode (fullscreen without
+ borders, OS panels). You may want to use
+ this feature together with :size :fullscreen.
+ Not supported in clojurescript.
+
+ :no-start - Disables autostart if sketch was created using
+ defsketch macro. To start sketch you have to
+ call function created defsketch.
+ Supported only in clojurescript.
+
+ :global-key-events - Allows a sketch to receive any
+ keyboard event sent to the page,
+ regardless of whether the canvas it is
+ loaded in has focus or not.
+ Supported only in clojurescript.
+
+ Usage example: :features [:keep-on-top :present]
+
+ :bgcolor - Sets background color for unused space in present mode.
+ Color is specified in hex format: #XXXXXX.
+ Example: :bgcolor \"#00FFFF\" (cyan background)
+ Not supported in clojurescript.
+
+ :display - Sets what display should be used by this sketch.
+ Displays are numbered starting from 0. Example: :display 1.
+ Not supported in clojurescript.
+
+ :setup - A function to be called once when setting the sketch up.
+
+ :draw - A function to be repeatedly called at most n times per
+ second where n is the target frame-rate set for
+ the visualisation.
+
+ :host - String id of canvas element or DOM element itself.
+ Specifies host for the sketch. Must be specified in sketch,
+ may be omitted in defsketch. If ommitted in defsketch,
+ :host is set to the name of the sketch. If element with
+ specified id is not found on the page and page is empty -
+ new canvas element will be created. Used in clojurescript.
+
+ :focus-gained - Called when the sketch gains focus.
+ Not supported in clojurescript.
+
+ :focus-lost - Called when the sketch loses focus.
+ Not supported in clojurescript.
+
+ :mouse-entered - Called when the mouse enters the sketch window.
+
+ :mouse-exited - Called when the mouse leaves the sketch window
+
+ :mouse-pressed - Called every time a mouse button is pressed.
+
+ :mouse-released - Called every time a mouse button is released.
+
+ :mouse-clicked - called once after a mouse button has been pressed
+ and then released.
+
+ :mouse-moved - Called every time the mouse moves and a button is
+ not pressed.
+
+ :mouse-dragged - Called every time the mouse moves and a button is
+ pressed.
+
+ :mouse-wheel - Called every time mouse wheel is rotated.
+ Takes 1 argument - wheel rotation, an int.
+ Negative values if the mouse wheel was rotated
+ up/away from the user, and positive values
+ if the mouse wheel was rotated down/ towards the user
+
+ :key-pressed - Called every time any key is pressed.
+
+ :key-released - Called every time any key is released.
+
+ :key-typed - Called once every time non-modifier keys are
+ pressed.
+
+ :on-close - Called once, when sketch is closed
+ Not supported in clojurescript.
+
+ :middleware - Vector of middleware to be applied to the sketch.
+ Middleware will be applied in the same order as in comp
+ function: [f g] will be applied as (f (g options)).
+
+ :settings - cousin of :setup. A function to be called once when
+ setting sketch up. Should be used only for (smooth) and
+ (no-smooth). Due to Processing limitations these functions
+ cannot be used neither in :setup nor in :draw."
+ [app-name & options]
+ #?(:clj
+ (if (u/clj-compilation?)
+ `(ap/defapplet ~app-name ~@options)
+ `(quil.sketch/defsketch ~app-name ~@options))
+ :cljs
+ `(quil.sketch$macros/defsketch ~app-name ~@options)))
+
+(defn ^{:requires-bindings false
+ :processing-name nil
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "1.6"}
+ key-coded?
+ "Returns true if char c is a 'coded' char i.e. it is necessary to
+ fetch the key-code as an integer and use that to determine the
+ specific key pressed. See key-keyword."
+ [c]
+ #?(:clj (= PConstants/CODED (int c))
+ ; See https://github.com/google/closure-compiler/issues/1676
+ :cljs (= 65535 (.charCodeAt (js/String c)))))
+
+(defn ^{:requires-bindings true
+ :processing-name nil
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "1.6"}
+ key-as-keyword
+ "Returns a keyword representing the currently pressed key. Modifier
+ keys are represented as: :up, :down, :left, :right, :alt, :control,
+ :shift, :command, :f1-24"
+ []
+ (let [key-char (raw-key)
+ code (key-code)]
+ (if (key-coded? key-char)
+ (get KEY-CODES code :unknown-key)
+ ; Workaround for closure compiler incorrect string casts.
+ ; See https://github.com/google/closure-compiler/issues/1676
+ (keyword #?(:clj (str key-char)
+ :cljs (js/String key-char))))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name nil
+ :category "Debugging"
+ :added "1.6"}
+ debug
+ "Prints msg and then sleeps the current thread for delay-ms. Useful
+ for debugging live running sketches. delay-ms defaults to 300. "
+ ([msg] (debug msg 300))
+ ([msg delay-ms]
+ (println msg)
+ (Thread/sleep delay-ms))))
+
+;;; doc utils
+
+#?(:clj
+ (def ^{:private true}
+ fn-metas
+ "Returns a seq of metadata maps for all fns related to the original
+ Processing API (but may not have a direct Processing API equivalent)."
+ (->> *ns* ns-publics vals (map meta))))
+
+#?(:clj
+ (defn show-cats
+ "Print out a list of all the categories and subcategories,
+ associated index nums and fn count (in parens)."
+ []
+ (doseq [[cat-idx cat] (docs/sorted-category-map fn-metas)]
+ (println cat-idx (:name cat))
+ (doseq [[subcat-idx subcat] (:subcategories cat)]
+ (println " " subcat-idx (:name subcat))))))
+
+#?(:clj
+ (defn show-fns
+ "If given a number, print all the functions within category or
+ subcategory specified by the category index (use show-cats to see a
+ list of index nums).
+
+ If given a string or a regular expression, print all the functions
+ whose name or category name contains that string.
+
+ If a category is specified, it will not print out the fns in any of
+ cat's subcategories."
+ [q]
+ (letfn [(list-category [cid c & {:keys [only]}]
+ (let [category-fns (:fns c)
+ display-fns (if (nil? only)
+ category-fns
+ (clojure.set/intersection
+ (set only) (set category-fns)))
+ names (sort (map str display-fns))]
+ (when-not (empty? names))
+ (println cid (:name c))
+ (docs/pprint-wrapped-lines names :fromcolumn 4)))
+ (show-fns-by-cat-idx [cat-idx]
+ (let [c (get (docs/all-category-map fn-metas) (str cat-idx))]
+ (list-category cat-idx c)))
+ (show-fns-by-name-regex [re]
+ (doseq [[cid c] (sort-by key (docs/all-category-map fn-metas))]
+ (let [in-cat-name? (re-find re (:name c))
+ matching-fns (filter #(re-find re (str %)) (:fns c))
+ in-fn-names? (not (empty? matching-fns))]
+ (cond
+ in-cat-name? (list-category cid c) ;; print an entire category
+ in-fn-names? (list-category cid c :only matching-fns)))))]
+ (cond
+ (string? q) (show-fns-by-name-regex (re-pattern (str "(?i)" q)))
+ (isa? (type q) java.util.regex.Pattern) (show-fns-by-name-regex q)
+ :else (show-fns-by-cat-idx q)))))
+
+#?(:clj
+ (defn show-meths
+ "Takes a string representing the start of a method name in the
+ original Processing API and prints out all matches alongside the
+ Processing-core equivalent."
+ [orig-name]
+ (let [res (docs/matching-processing-methods fn-metas orig-name)]
+ (u/print-definition-list res))))
diff --git a/src/http/static/viz/1/quil/core.cljc.cache.edn b/src/http/static/viz/1/quil/core.cljc.cache.edn
new file mode 100644
index 0000000..8904416
--- /dev/null
+++ b/src/http/static/viz/1/quil/core.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {Processing {prototype {PConstants {}}, getInstanceById {}}, Math {PI {}}, Error {}, PFont {list {}}, String {}, Object {charCodeAt {}}}, :use-macros {}, :excludes #{}, :name quil.core, :imports nil, :requires {clojure.string clojure.string, org.processingjs.Processing org.processingjs.Processing, ap quil.sketch, quil.sketch quil.sketch, u quil.util, quil.util quil.util}, :uses nil, :defs {rotate-x {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :processing-name "rotateX()", :column 3, :requires-bindings true, :line 3464, :end-line 3464, :arglists (quote ([angle])), :doc "Rotates a shape around the x-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n (* PI 2)) or converted to radians with the radians function. Objects\n are always rotated around their relative position to the origin and\n positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-x HALF-PI) and then (rotate-x HALF-PI) is\n the same as (rotate-x PI). If rotate-x is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."}, :added "1.0", :name quil.core/rotate-x, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 11, :processing-name "rotateX()", :method-params ([angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3458, :end-line 3464, :max-fixed-arity 1, :fn-var true, :arglists (quote ([angle])), :doc "Rotates a shape around the x-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n (* PI 2)) or converted to radians with the radians function. Objects\n are always rotated around their relative position to the origin and\n positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-x HALF-PI) and then (rotate-x HALF-PI) is\n the same as (rotate-x PI). If rotate-x is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."}, text-modes {:name quil.core/text-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 68, :end-column 12, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 68, :column 2, :end-line 68, :end-column 12}, :tag cljs.core/IMap}, print-projection {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Camera", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 19, :processing-name "printProjection()", :column 3, :requires-bindings true, :line 3098, :end-line 3098, :arglists (quote ([])), :doc "Prints the current projection matrix to std out. Useful for\n debugging"}, :added "1.0", :name quil.core/print-projection, :variadic false, :subcategory "Camera", :file "out/quil/core.cljc", :end-column 19, :processing-name "printProjection()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3092, :end-line 3098, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Prints the current projection matrix to std out. Useful for\n debugging"}, raw-key {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Keyboard", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "key", :column 3, :requires-bindings true, :line 3257, :end-line 3257, :arglists (quote ([])), :doc "Contains the value of the most recent key on the keyboard that was\n used (either pressed or released).\n\n For non-ASCII keys, use the keyCode variable. The keys included in\n the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and\n DELETE) do not require checking to see if they key is coded, and you\n should simply use the key variable instead of keyCode If you're\n making cross-platform projects, note that the ENTER key is commonly\n used on PCs and Unix and the RETURN key is used instead on\n Macintosh. Check for both ENTER and RETURN to make sure your program\n will work for all platforms."}, :added "1.0", :name quil.core/raw-key, :variadic false, :subcategory "Keyboard", :file "out/quil/core.cljc", :end-column 10, :processing-name "key", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3251, :end-line 3257, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Contains the value of the most recent key on the keyboard that was\n used (either pressed or released).\n\n For non-ASCII keys, use the keyCode variable. The keys included in\n the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and\n DELETE) do not require checking to see if they key is coded, and you\n should simply use the key variable instead of keyCode If you're\n making cross-platform projects, note that the ENTER key is commonly\n used on PCs and Unix and the RETURN key is used instead on\n Macintosh. Check for both ENTER and RETURN to make sure your program\n will work for all platforms."}, text-char {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([c x y] [c x y z]), :arglists ([c x y] [c x y z]), :arglists-meta (nil nil)}, :processing-name "text()", :column 3, :requires-bindings true, :line 4144, :end-line 4144, :arglists (quote ([c x y] [c x y z])), :doc "Draws a char to the screen in the specified position. See text fn\n for more details."}, :added "1.0", :name quil.core/text-char, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([c x y] [c x y z]), :arglists ([c x y] [c x y z]), :arglists-meta (nil nil)}, :processing-name "text()", :method-params ([c x y] [c x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4138, :end-line 4144, :max-fixed-arity 4, :fn-var true, :arglists ([c x y] [c x y z]), :doc "Draws a char to the screen in the specified position. See text fn\n for more details."}, display-filter {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Pixels", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 17, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([mode] [mode level]), :arglists ([mode] [mode level]), :arglists-meta (nil nil)}, :processing-name "filter()", :column 3, :requires-bindings true, :line 1777, :end-line 1777, :arglists (quote ([mode] [mode level])), :doc "Originally named filter in Processing Language.\n Filters the display window with the specified mode and level.\n Level defines the quality of the filter and mode may be one of the\n following keywords:\n\n :threshold - converts the image to black and white pixels depending\n if they are above or below the threshold defined by\n the level parameter. The level must be between\n 0.0 (black) and 1.0 (white). If no level is specified,\n 0.5 is used.\n :gray - converts any colors in the image to grayscale\n equivalents. Doesn't work with level.\n :invert - sets each pixel to its inverse value. Doesn't work with\n level.\n :posterize - limits each channel of the image to the number of\n colors specified as the level parameter. The parameter can\n be set to values between 2 and 255, but results are most\n noticeable in the lower ranges.\n :blur - executes a Guassian blur with the level parameter\n specifying the extent of the blurring. If no level\n parameter is used, the blur is equivalent to Guassian\n blur of radius 1.\n :opaque - sets the alpha channel to entirely opaque. Doesn't work\n with level.\n :erode - reduces the light areas. Doesn't work with level.\n :dilate - increases the light areas. Doesn't work with level."}, :added "1.0", :name quil.core/display-filter, :variadic false, :subcategory "Pixels", :file "out/quil/core.cljc", :end-column 17, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([mode] [mode level]), :arglists ([mode] [mode level]), :arglists-meta (nil nil)}, :processing-name "filter()", :method-params ([mode] [mode level]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1771, :end-line 1777, :max-fixed-arity 2, :fn-var true, :arglists ([mode] [mode level]), :doc "Originally named filter in Processing Language.\n Filters the display window with the specified mode and level.\n Level defines the quality of the filter and mode may be one of the\n following keywords:\n\n :threshold - converts the image to black and white pixels depending\n if they are above or below the threshold defined by\n the level parameter. The level must be between\n 0.0 (black) and 1.0 (white). If no level is specified,\n 0.5 is used.\n :gray - converts any colors in the image to grayscale\n equivalents. Doesn't work with level.\n :invert - sets each pixel to its inverse value. Doesn't work with\n level.\n :posterize - limits each channel of the image to the number of\n colors specified as the level parameter. The parameter can\n be set to values between 2 and 255, but results are most\n noticeable in the lower ranges.\n :blur - executes a Guassian blur with the level parameter\n specifying the extent of the blurring. If no level\n parameter is used, the blur is equivalent to Guassian\n blur of radius 1.\n :opaque - sets the alpha channel to entirely opaque. Doesn't work\n with level.\n :erode - reduces the light areas. Doesn't work with level.\n :dilate - increases the light areas. Doesn't work with level."}, rotate-z {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :processing-name "rotateZ()", :column 3, :requires-bindings true, :line 3506, :end-line 3506, :arglists (quote ([angle])), :doc "Rotates a shape around the z-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0\n to (* PI 2)) or converted to radians with the radians function.\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-z HALF-PI) and then (rotate-z HALF-PI) is\n the same as (rotate-z PI). If rotate-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."}, :added "1.0", :name quil.core/rotate-z, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 11, :processing-name "rotateZ()", :method-params ([angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3500, :end-line 3506, :max-fixed-arity 1, :fn-var true, :arglists (quote ([angle])), :doc "Rotates a shape around the z-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0\n to (* PI 2)) or converted to radians with the radians function.\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-z HALF-PI) and then (rotate-z HALF-PI) is\n the same as (rotate-z PI). If rotate-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."}, random-gaussian {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "2.0", :subcategory "Random", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 18, :processing-name "randomGaussian()", :column 3, :requires-bindings true, :line 3226, :end-line 3226, :arglists (quote ([])), :doc "Returns a float from a random series of numbers having a mean of 0 and\n standard deviation of 1. Each time the randomGaussian() function is called,\n it returns a number fitting a Gaussian, or normal, distribution.\n There is theoretically no minimum or maximum value that randomGaussian()\n might return. Rather, there is just a very low probability that values far\n from the mean will be returned; and a higher probability that numbers near\n the mean will be returned. ."}, :added "2.0", :name quil.core/random-gaussian, :variadic false, :subcategory "Random", :file "out/quil/core.cljc", :end-column 18, :processing-name "randomGaussian()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3220, :end-line 3226, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns a float from a random series of numbers having a mean of 0 and\n standard deviation of 1. Each time the randomGaussian() function is called,\n it returns a number fitting a Gaussian, or normal, distribution.\n There is theoretically no minimum or maximum value that randomGaussian()\n might return. Rather, there is just a very low probability that values far\n from the mean will be returned; and a higher probability that numbers near\n the mean will be returned. ."}, blend {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Pixels", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 11, :method-params ([x y width height dx dy dwidth dheight mode] [src-img x y width height dx dy dwidth dheight mode] [src-img dest-img x y width height dx dy dwidth dheight mode]), :arglists ([x y width height dx dy dwidth dheight mode] [src-img x y width height dx dy dwidth dheight mode] [src-img dest-img x y width height dx dy dwidth dheight mode]), :arglists-meta (nil nil nil)}, :processing-name "blend()", :column 3, :requires-bindings true, :line 778, :end-line 778, :arglists (quote ([x y width height dx dy dwidth dheight mode] [src-img x y width height dx dy dwidth dheight mode] [src-img dest-img x y width height dx dy dwidth dheight mode])), :doc "Blends a region of pixels from one image into another with full alpha\n channel support. If src is not specified it defaults to current-graphics.\n If dest is not specified it defaults to current-graphics.\n\n Note: blend-mode function is recommended to use instead of this one.\n\n Available blend modes are:\n\n :blend - linear interpolation of colours: C = A*factor + B\n :add - additive blending with white clip:\n C = min(A*factor + B, 255)\n :subtract - subtractive blending with black clip:\n C = max(B - A*factor, 0)\n :darkest - only the darkest colour succeeds:\n C = min(A*factor, B)\n :lightest - only the lightest colour succeeds:\n C = max(A*factor, B)\n :difference - subtract colors from underlying image.\n :exclusion - similar to :difference, but less extreme.\n :multiply - Multiply the colors, result will always be darker.\n :screen - Opposite multiply, uses inverse values of the colors.\n :overlay - A mix of :multiply and :screen. Multiplies dark values\n and screens light values.\n :hard-light - :screen when greater than 50% gray, :multiply when\n lower.\n :soft-light - Mix of :darkest and :lightest. Works like :overlay,\n but not as harsh.\n :dodge - Lightens light tones and increases contrast, ignores\n darks.\n Called \"Color Dodge\" in Illustrator and Photoshop.\n :burn - Darker areas are applied, increasing contrast, ignores\n lights. Called \"Color Burn\" in Illustrator and\n Photoshop."}, :added "1.0", :name quil.core/blend, :variadic false, :subcategory "Pixels", :file "out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 11, :method-params ([x y width height dx dy dwidth dheight mode] [src-img x y width height dx dy dwidth dheight mode] [src-img dest-img x y width height dx dy dwidth dheight mode]), :arglists ([x y width height dx dy dwidth dheight mode] [src-img x y width height dx dy dwidth dheight mode] [src-img dest-img x y width height dx dy dwidth dheight mode]), :arglists-meta (nil nil nil)}, :processing-name "blend()", :method-params ([x y width height dx dy dwidth dheight mode] [src-img x y width height dx dy dwidth dheight mode] [src-img dest-img x y width height dx dy dwidth dheight mode]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 772, :end-line 778, :max-fixed-arity 11, :fn-var true, :arglists ([x y width height dx dy dwidth dheight mode] [src-img x y width height dx dy dwidth dheight mode] [src-img dest-img x y width height dx dy dwidth dheight mode]), :doc "Blends a region of pixels from one image into another with full alpha\n channel support. If src is not specified it defaults to current-graphics.\n If dest is not specified it defaults to current-graphics.\n\n Note: blend-mode function is recommended to use instead of this one.\n\n Available blend modes are:\n\n :blend - linear interpolation of colours: C = A*factor + B\n :add - additive blending with white clip:\n C = min(A*factor + B, 255)\n :subtract - subtractive blending with black clip:\n C = max(B - A*factor, 0)\n :darkest - only the darkest colour succeeds:\n C = min(A*factor, B)\n :lightest - only the lightest colour succeeds:\n C = max(A*factor, B)\n :difference - subtract colors from underlying image.\n :exclusion - similar to :difference, but less extreme.\n :multiply - Multiply the colors, result will always be darker.\n :screen - Opposite multiply, uses inverse values of the colors.\n :overlay - A mix of :multiply and :screen. Multiplies dark values\n and screens light values.\n :hard-light - :screen when greater than 50% gray, :multiply when\n lower.\n :soft-light - Mix of :darkest and :lightest. Works like :overlay,\n but not as harsh.\n :dodge - Lightens light tones and increases contrast, ignores\n darks.\n Called \"Color Dodge\" in Illustrator and Photoshop.\n :burn - Darker areas are applied, increasing contrast, ignores\n lights. Called \"Color Burn\" in Illustrator and\n Photoshop."}, frame-count {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "frameCount", :column 3, :requires-bindings true, :line 1853, :end-line 1853, :arglists (quote ([])), :doc "The system variable frameCount contains the number of frames\n displayed since the program started. Inside setup() the value is 0\n and after the first iteration of draw it is 1, etc."}, :added "1.0", :name quil.core/frame-count, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 14, :processing-name "frameCount", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1847, :end-line 1853, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "The system variable frameCount contains the number of frames\n displayed since the program started. Inside setup() the value is 0\n and after the first iteration of draw it is 1, etc."}, with-graphics {:category "Rendering", :protocol-inline nil, :meta {:category "Rendering", :added "1.7", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env graphics body)], :arglists ([&form &env graphics & body]), :arglists-meta (nil)}, :processing-name nil, :column 3, :requires-bindings true, :line 4709, :macro true, :end-line 4709, :arglists (quote ([graphics & body])), :doc "All subsequent calls of any drawing function will draw on given\n graphics. 'with-graphics' cannot be nested (you can draw simultaneously\n only on 1 graphics)"}, :added "1.7", :name quil.core/with-graphics, :variadic true, :file "out/quil/core.cljc", :end-column 16, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env graphics body)], :arglists ([&form &env graphics & body]), :arglists-meta (nil)}, :processing-name nil, :method-params [(&form &env graphics body)], :protocol-impl nil, :arglists-meta (nil), :column 1, :requires-bindings true, :line 4704, :macro true, :end-line 4709, :max-fixed-arity 3, :fn-var false, :arglists ([&form &env graphics & body]), :doc "All subsequent calls of any drawing function will draw on given\n graphics. 'with-graphics' cannot be nested (you can draw simultaneously\n only on 1 graphics)"}, model-y {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Coordinates", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "modelY()", :column 3, :requires-bindings true, :line 2539, :end-line 2539, :arglists (quote ([x y z])), :doc "Returns the three-dimensional x, y, z position in model space. This\n returns the y value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The y value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."}, :added "1.0", :name quil.core/model-y, :variadic false, :subcategory "Coordinates", :file "out/quil/core.cljc", :end-column 10, :processing-name "modelY()", :method-params ([x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2533, :end-line 2539, :max-fixed-arity 3, :fn-var true, :arglists (quote ([x y z])), :doc "Returns the three-dimensional x, y, z position in model space. This\n returns the y value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The y value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."}, set-image {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Pixels", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "set()", :column 3, :requires-bindings true, :line 3722, :end-line 3722, :arglists (quote ([x y src])), :doc "Writes an image directly into the display window. The x and y\n parameters define the coordinates for the upper-left corner of the\n image."}, :added "1.0", :name quil.core/set-image, :variadic false, :subcategory "Pixels", :file "out/quil/core.cljc", :end-column 12, :processing-name "set()", :method-params ([x y src]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3716, :end-line 3722, :max-fixed-arity 3, :fn-var true, :arglists (quote ([x y src])), :doc "Writes an image directly into the display window. The x and y\n parameters define the coordinates for the upper-left corner of the\n image."}, shape-mode {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "shapeMode()", :column 3, :requires-bindings true, :line 3825, :end-line 3825, :arglists (quote ([mode])), :doc "Modifies the location from which shapes draw. Available modes are\n :corner, :corners and :center. Default is :corner.\n\n :corner - specifies the location to be the upper left corner of the\n shape and uses the third and fourth parameters of shape\n to specify the width and height.\n\n :corners - uses the first and second parameters of shape to set\n the location of one corner and uses the third and fourth\n parameters to set the opposite corner.\n\n :center - draws the shape from its center point and uses the third\n and forth parameters of shape to specify the width and\n height. "}, :added "1.0", :name quil.core/shape-mode, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 13, :processing-name "shapeMode()", :method-params ([mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3820, :end-line 3825, :max-fixed-arity 1, :fn-var true, :arglists (quote ([mode])), :doc "Modifies the location from which shapes draw. Available modes are\n :corner, :corners and :center. Default is :corner.\n\n :corner - specifies the location to be the upper left corner of the\n shape and uses the third and fourth parameters of shape\n to specify the width and height.\n\n :corners - uses the first and second parameters of shape to set\n the location of one corner and uses the third and fourth\n parameters to set the opposite corner.\n\n :center - draws the shape from its center point and uses the third\n and forth parameters of shape to specify the width and\n height. "}, cursor-image {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 17, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([img] [img hx hy]), :arglists ([img] [img hx hy]), :arglists-meta (nil nil)}, :processing-name "cursor()", :column 5, :requires-bindings true, :line 1307, :end-line 1307, :arglists (quote ([img] [img hx hy])), :doc "Set the cursor to a predefined image. The horizontal and vertical\n active spots of the cursor may be specified with hx and hy.\n It is recommended to make the size 16x16 or 32x32 pixels."}, :added "1.0", :name quil.core/cursor-image, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 17, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([img] [img hx hy]), :arglists ([img] [img hx hy]), :arglists-meta (nil nil)}, :processing-name "cursor()", :method-params ([img] [img hx hy]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1301, :end-line 1307, :max-fixed-arity 3, :fn-var true, :arglists ([img] [img hx hy]), :doc "Set the cursor to a predefined image. The horizontal and vertical\n active spots of the cursor may be specified with hx and hy.\n It is recommended to make the size 16x16 or 32x32 pixels."}, create-graphics {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Rendering", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 18, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([w h] [w h renderer] [w h renderer path]), :arglists ([w h] [w h renderer] [w h renderer path]), :arglists-meta (nil nil nil)}, :processing-name "createGraphics()", :column 3, :requires-bindings true, :line 1204, :end-line 1204, :arglists (quote ([w h] [w h renderer] [w h renderer path])), :doc "Creates and returns a new PGraphics object of the types :p2d, :p3d,\n :java2d, :pdf. By default :java2d is used. Use this class if you\n need to draw into an off-screen graphics buffer. It's not possible\n to use create-graphics with the :opengl renderer, because it doesn't\n allow offscreen use. The :pdf renderer requires the filename parameter.\n\n Note: don't use create-graphics in draw in clojurescript, it leaks memory.\n You should create graphic in setup and reuse it in draw instead of creating\n a new one.\n\n It's important to call any drawing commands between (.beginDraw graphics) and\n (.endDraw graphics) statements or use with-graphics macro. This is also true\n for any commands that affect drawing, such as smooth or color-mode.\n\n If you're using :pdf renderer - don't forget to call (.dispose graphics)\n as last command inside with-graphics macro, otherwise graphics won't be\n saved.\n\n Unlike the main drawing surface which is completely opaque, surfaces\n created with create-graphics can have transparency. This makes it\n possible to draw into a graphics and maintain the alpha channel. By\n using save to write a PNG or TGA file, the transparency of the\n graphics object will be honored."}, :added "1.0", :name quil.core/create-graphics, :variadic false, :subcategory "Rendering", :file "out/quil/core.cljc", :end-column 18, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([w h] [w h renderer] [w h renderer path]), :arglists ([w h] [w h renderer] [w h renderer path]), :arglists-meta (nil nil nil)}, :processing-name "createGraphics()", :method-params ([w h] [w h renderer] [w h renderer path]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 1198, :end-line 1204, :max-fixed-arity 4, :fn-var true, :arglists ([w h] [w h renderer] [w h renderer path]), :doc "Creates and returns a new PGraphics object of the types :p2d, :p3d,\n :java2d, :pdf. By default :java2d is used. Use this class if you\n need to draw into an off-screen graphics buffer. It's not possible\n to use create-graphics with the :opengl renderer, because it doesn't\n allow offscreen use. The :pdf renderer requires the filename parameter.\n\n Note: don't use create-graphics in draw in clojurescript, it leaks memory.\n You should create graphic in setup and reuse it in draw instead of creating\n a new one.\n\n It's important to call any drawing commands between (.beginDraw graphics) and\n (.endDraw graphics) statements or use with-graphics macro. This is also true\n for any commands that affect drawing, such as smooth or color-mode.\n\n If you're using :pdf renderer - don't forget to call (.dispose graphics)\n as last command inside with-graphics macro, otherwise graphics won't be\n saved.\n\n Unlike the main drawing surface which is completely opaque, surfaces\n created with create-graphics can have transparency. This makes it\n possible to draw into a graphics and maintain the alpha channel. By\n using save to write a PNG or TGA file, the transparency of the\n graphics object will be honored."}, update-pixels {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Pixels", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [img]), :arglists ([] [img]), :arglists-meta (nil nil)}, :processing-name "updatePixels()", :column 3, :requires-bindings true, :line 4551, :end-line 4551, :arglists (quote ([] [img])), :doc "Updates the display window or image with the data in the pixels array.\n Use in conjunction with (pixels). If you're only reading pixels from\n the array, there's no need to call update-pixels unless there are\n changes.\n\n Certain renderers may or may not seem to require pixels or\n update-pixels. However, the rule is that any time you want to\n manipulate the pixels array, you must first call pixels, and\n after changes have been made, call update-pixels. Even if the\n renderer may not seem to use this function in the current Processing\n release, this will always be subject to change."}, :added "1.0", :name quil.core/update-pixels, :variadic false, :subcategory "Pixels", :file "out/quil/core.cljc", :end-column 16, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [img]), :arglists ([] [img]), :arglists-meta (nil nil)}, :processing-name "updatePixels()", :method-params ([] [img]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4545, :end-line 4551, :max-fixed-arity 1, :fn-var true, :arglists ([] [img]), :doc "Updates the display window or image with the data in the pixels array.\n Use in conjunction with (pixels). If you're only reading pixels from\n the array, there's no need to call update-pixels unless there are\n changes.\n\n Certain renderers may or may not seem to require pixels or\n update-pixels. However, the rule is that any time you want to\n manipulate the pixels array, you must first call pixels, and\n after changes have been made, call update-pixels. Even if the\n renderer may not seem to use this function in the current Processing\n release, this will always be subject to change."}, text-size {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "textSize()", :column 3, :requires-bindings true, :line 4336, :end-line 4336, :arglists (quote ([size])), :doc "Sets the current font size. This size will be used in all\n subsequent calls to the text fn. Font size is measured in\n units of pixels."}, :added "1.0", :name quil.core/text-size, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 12, :processing-name "textSize()", :method-params ([size]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4330, :end-line 4336, :max-fixed-arity 1, :fn-var true, :arglists (quote ([size])), :doc "Sets the current font size. This size will be used in all\n subsequent calls to the text fn. Font size is measured in\n units of pixels."}, pixels {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Pixels", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [img]), :arglists ([] [img]), :arglists-meta (nil nil)}, :processing-name "pixels[]", :column 3, :requires-bindings true, :line 2948, :end-line 2948, :arglists (quote ([] [img])), :doc "Array containing the values for all the pixels in the display\n window or image. This array is therefore the size of the display window. If\n this array is modified, the update-pixels fn must be called to update\n the changes. Calls .loadPixels before obtaining the pixel array."}, :added "1.0", :name quil.core/pixels, :variadic false, :subcategory "Pixels", :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [img]), :arglists ([] [img]), :arglists-meta (nil nil)}, :processing-name "pixels[]", :method-params ([] [img]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2942, :end-line 2948, :max-fixed-arity 1, :fn-var true, :arglists ([] [img]), :doc "Array containing the values for all the pixels in the display\n window or image. This array is therefore the size of the display window. If\n this array is modified, the update-pixels fn must be called to update\n the changes. Calls .loadPixels before obtaining the pixel array."}, stroke-float {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([gray] [gray alpha] [x y z] [x y z a]), :arglists ([gray] [gray alpha] [x y z] [x y z a]), :arglists-meta (nil nil nil nil)}, :processing-name "stroke()", :column 3, :requires-bindings true, :line 4016, :end-line 4016, :arglists (quote ([gray] [gray alpha] [x y z] [x y z a])), :doc "Sets the color used to draw lines and borders around\n shapes. Converts all args to floats"}, :added "1.0", :name quil.core/stroke-float, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 15, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([gray] [gray alpha] [x y z] [x y z a]), :arglists ([gray] [gray alpha] [x y z] [x y z a]), :arglists-meta (nil nil nil nil)}, :processing-name "stroke()", :method-params ([gray] [gray alpha] [x y z] [x y z a]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 4010, :end-line 4016, :max-fixed-arity 4, :fn-var true, :arglists ([gray] [gray alpha] [x y z] [x y z a]), :doc "Sets the color used to draw lines and borders around\n shapes. Converts all args to floats"}, constrain {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "constrain()", :column 3, :requires-bindings false, :line 1097, :end-line 1097, :arglists (quote ([amt low high])), :doc "Constrains a value to not exceed a maximum and minimum value."}, :added "1.0", :name quil.core/constrain, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 12, :processing-name "constrain()", :method-params ([amt low high]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 1091, :end-line 1097, :max-fixed-arity 3, :fn-var true, :arglists (quote ([amt low high])), :doc "Constrains a value to not exceed a maximum and minimum value."}, screen-y {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Coordinates", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([x y] [x y z]), :arglists ([x y] [x y z]), :arglists-meta (nil nil)}, :processing-name "screenY()", :column 3, :requires-bindings true, :line 3655, :end-line 3655, :arglists (quote ([x y] [x y z])), :doc "Takes a three-dimensional x, y, z position and returns the y value\n for where it will appear on a (two-dimensional) screen, once\n affected by translate, scale or any other transformations"}, :added "1.0", :name quil.core/screen-y, :variadic false, :subcategory "Coordinates", :file "out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([x y] [x y z]), :arglists ([x y] [x y z]), :arglists-meta (nil nil)}, :processing-name "screenY()", :method-params ([x y] [x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3649, :end-line 3655, :max-fixed-arity 3, :fn-var true, :arglists ([x y] [x y z]), :doc "Takes a three-dimensional x, y, z position and returns the y value\n for where it will appear on a (two-dimensional) screen, once\n affected by translate, scale or any other transformations"}, fill-float {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([gray] [gray alpha] [r g b] [r g b alpha]), :arglists ([gray] [gray alpha] [r g b] [r g b alpha]), :arglists-meta (nil nil nil nil)}, :processing-name "fill()", :column 3, :requires-bindings true, :line 1705, :end-line 1705, :arglists (quote ([gray] [gray alpha] [r g b] [r g b alpha])), :doc "Sets the color used to fill shapes. For example, (fill 204 102 0),\n will specify that all subsequent shapes will be filled with orange."}, :added "1.0", :name quil.core/fill-float, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([gray] [gray alpha] [r g b] [r g b alpha]), :arglists ([gray] [gray alpha] [r g b] [r g b alpha]), :arglists-meta (nil nil nil nil)}, :processing-name "fill()", :method-params ([gray] [gray alpha] [r g b] [r g b alpha]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 1699, :end-line 1705, :max-fixed-arity 4, :fn-var true, :arglists ([gray] [gray alpha] [r g b] [r g b alpha]), :doc "Sets the color used to fill shapes. For example, (fill 204 102 0),\n will specify that all subsequent shapes will be filled with orange."}, rect {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "2D Primitives", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 8, :method-params ([x y width height] [x y width height r] [x y width height top-left-r top-right-r bottom-right-r bottom-left-r]), :arglists ([x y width height] [x y width height r] [x y width height top-left-r top-right-r bottom-right-r bottom-left-r]), :arglists-meta (nil nil nil)}, :processing-name "rect()", :column 3, :requires-bindings true, :line 3278, :end-line 3278, :arglists (quote ([x y width height] [x y width height r] [x y width height top-left-r top-right-r bottom-right-r bottom-left-r])), :doc "Draws a rectangle to the screen. A rectangle is a four-sided shape\n with every angle at ninety degrees. By default, the first two\n parameters set the location of the upper-left corner, the third\n sets the width, and the fourth sets the height. These parameters\n may be changed with rect-mode.\n\n To draw a rounded rectangle, add a fifth parameter, which is used as\n the radius value for all four corners. To use a different radius value\n for each corner, include eight parameters."}, :added "1.0", :name quil.core/rect, :variadic false, :subcategory "2D Primitives", :file "out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 8, :method-params ([x y width height] [x y width height r] [x y width height top-left-r top-right-r bottom-right-r bottom-left-r]), :arglists ([x y width height] [x y width height r] [x y width height top-left-r top-right-r bottom-right-r bottom-left-r]), :arglists-meta (nil nil nil)}, :processing-name "rect()", :method-params ([x y width height] [x y width height r] [x y width height top-left-r top-right-r bottom-right-r bottom-left-r]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 3272, :end-line 3278, :max-fixed-arity 8, :fn-var true, :arglists ([x y width height] [x y width height r] [x y width height top-left-r top-right-r bottom-right-r bottom-left-r]), :doc "Draws a rectangle to the screen. A rectangle is a four-sided shape\n with every angle at ninety degrees. By default, the first two\n parameters set the location of the upper-left corner, the third\n sets the width, and the fourth sets the height. These parameters\n may be changed with rect-mode.\n\n To draw a rounded rectangle, add a fifth parameter, which is used as\n the radius value for all four corners. To use a different radius value\n for each corner, include eight parameters."}, log {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "log()", :column 3, :requires-bindings false, :line 2429, :end-line 2429, :arglists (quote ([val])), :doc "Calculates the natural logarithm (the base-e logarithm) of a\n number. This function expects the values greater than 0.0."}, :added "1.0", :name quil.core/log, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 6, :processing-name "log()", :method-params ([val]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 2423, :end-line 2429, :max-fixed-arity 1, :fn-var true, :arglists (quote ([val])), :doc "Calculates the natural logarithm (the base-e logarithm) of a\n number. This function expects the values greater than 0.0."}, with-stroke {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.7", :subcategory "Utility Macros", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env stroke-args body)], :arglists ([&form &env stroke-args & body]), :arglists-meta (nil)}, :processing-name nil, :column 4, :requires-bindings true, :line 4651, :macro true, :end-line 4651, :arglists (quote ([stroke-args & body])), :doc "Temporarily set the stroke color for the body of this macro.\n The code outside of with-stroke form will have the previous stroke color set.\n\n The stroke color has to be in a vector!\n Example: (with-stroke [255] ...)\n (with-stroke [10 80 98] ...)"}, :added "1.7", :name quil.core/with-stroke, :variadic true, :subcategory "Utility Macros", :file "out/quil/core.cljc", :end-column 15, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env stroke-args body)], :arglists ([&form &env stroke-args & body]), :arglists-meta (nil)}, :processing-name nil, :method-params [(&form &env stroke-args body)], :protocol-impl nil, :arglists-meta (nil), :column 1, :requires-bindings true, :line 4645, :macro true, :end-line 4651, :max-fixed-arity 3, :fn-var false, :arglists ([&form &env stroke-args & body]), :doc "Temporarily set the stroke color for the body of this macro.\n The code outside of with-stroke form will have the previous stroke color set.\n\n The stroke color has to be in a vector!\n Example: (with-stroke [255] ...)\n (with-stroke [10 80 98] ...)"}, ambient-float {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Material Properties", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([gray] [x y z]), :arglists ([gray] [x y z]), :arglists-meta (nil nil)}, :processing-name "ambient()", :column 3, :requires-bindings true, :line 324, :end-line 324, :arglists (quote ([gray] [x y z])), :doc "Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The\n color components set through the parameters define the\n reflectance. For example in the default color mode, setting x=255,\n y=126, z=0, would cause all the red light to reflect and half of the\n green light to reflect. Used in combination with emissive, specular,\n and shininess in setting the material properties of shapes."}, :added "1.0", :name quil.core/ambient-float, :variadic false, :subcategory "Material Properties", :file "out/quil/core.cljc", :end-column 16, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([gray] [x y z]), :arglists ([gray] [x y z]), :arglists-meta (nil nil)}, :processing-name "ambient()", :method-params ([gray] [x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 318, :end-line 324, :max-fixed-arity 3, :fn-var true, :arglists ([gray] [x y z]), :doc "Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The\n color components set through the parameters define the\n reflectance. For example in the default color mode, setting x=255,\n y=126, z=0, would cause all the red light to reflect and half of the\n green light to reflect. Used in combination with emissive, specular,\n and shininess in setting the material properties of shapes."}, end-raw {:category "Output", :protocol-inline nil, :meta {:category "Output", :added "1.0", :subcategory "Files", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "endRaw()", :column 3, :requires-bindings true, :line 1638, :end-line 1638, :arglists (quote ([])), :doc "Complement to begin-raw; they must always be used together. See\n the begin-raw docstring for details."}, :added "1.0", :name quil.core/end-raw, :variadic false, :subcategory "Files", :file "out/quil/core.cljc", :end-column 10, :processing-name "endRaw()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1632, :end-line 1638, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Complement to begin-raw; they must always be used together. See\n the begin-raw docstring for details."}, radians {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Trigonometry", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "radians()", :column 3, :requires-bindings false, :line 3190, :end-line 3190, :arglists (quote ([degrees])), :doc "Converts a degree measurement to its corresponding value in\n radians. Radians and degrees are two ways of measuring the same\n thing. There are 360 degrees in a circle and 2*PI radians in a\n circle. For example, 90° = PI/2 = 1.5707964. All trigonometric\n methods in Processing require their parameters to be specified in\n radians."}, :added "1.0", :name quil.core/radians, :variadic false, :subcategory "Trigonometry", :file "out/quil/core.cljc", :end-column 10, :processing-name "radians()", :method-params ([degrees]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 3184, :end-line 3190, :max-fixed-arity 1, :fn-var true, :arglists (quote ([degrees])), :doc "Converts a degree measurement to its corresponding value in\n radians. Radians and degrees are two ways of measuring the same\n thing. There are 360 degrees in a circle and 2*PI radians in a\n circle. For example, 90° = PI/2 = 1.5707964. All trigonometric\n methods in Processing require their parameters to be specified in\n radians."}, degrees {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Trigonometry", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "degrees()", :column 3, :requires-bindings false, :line 1438, :end-line 1438, :arglists (quote ([radians])), :doc "Converts a radian measurement to its corresponding value in\n degrees. Radians and degrees are two ways of measuring the same\n thing. There are 360 degrees in a circle and (* 2 Math/PI) radians\n in a circle. For example, (= 90° (/ Math/PI 2) 1.5707964). All\n trigonometric methods in Processing require their parameters to be\n specified in radians."}, :added "1.0", :name quil.core/degrees, :variadic false, :subcategory "Trigonometry", :file "out/quil/core.cljc", :end-column 10, :processing-name "degrees()", :method-params ([radians]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 1432, :end-line 1438, :max-fixed-arity 1, :fn-var true, :arglists (quote ([radians])), :doc "Converts a radian measurement to its corresponding value in\n degrees. Radians and degrees are two ways of measuring the same\n thing. There are 360 degrees in a circle and (* 2 Math/PI) radians\n in a circle. For example, (= 90° (/ Math/PI 2) 1.5707964). All\n trigonometric methods in Processing require their parameters to be\n specified in radians."}, acos {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Trigonometry", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "acos()", :column 3, :requires-bindings false, :line 299, :end-line 299, :arglists (quote ([n])), :doc "The inverse of cos, returns the arc cosine of a value. This\n function expects the values in the range of -1 to 1 and values are\n returned in the range 0 to Math/PI (3.1415927)."}, :added "1.0", :name quil.core/acos, :variadic false, :subcategory "Trigonometry", :file "out/quil/core.cljc", :end-column 7, :processing-name "acos()", :method-params ([n]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 293, :end-line 299, :max-fixed-arity 1, :fn-var true, :arglists (quote ([n])), :doc "The inverse of cos, returns the arc cosine of a value. This\n function expects the values in the range of -1 to 1 and values are\n returned in the range 0 to Math/PI (3.1415927)."}, bezier-detail {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Curves", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :processing-name "bezierDetail()", :column 3, :requires-bindings true, :line 692, :end-line 692, :arglists (quote ([detail])), :doc "Sets the resolution at which Beziers display. The default value is\n 20. This function is only useful when using the :p3d or :opengl\n renderer as the default (:java2d) renderer does not use this\n information."}, :added "1.0", :name quil.core/bezier-detail, :variadic false, :subcategory "Curves", :file "out/quil/core.cljc", :end-column 16, :processing-name "bezierDetail()", :method-params ([detail]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 686, :end-line 692, :max-fixed-arity 1, :fn-var true, :arglists (quote ([detail])), :doc "Sets the resolution at which Beziers display. The default value is\n 20. This function is only useful when using the :p3d or :opengl\n renderer as the default (:java2d) renderer does not use this\n information."}, texture {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Vertex", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "texture()", :column 3, :requires-bindings true, :line 4349, :end-line 4349, :arglists (quote ([img])), :doc "Sets a texture to be applied to vertex points. The texture fn must\n be called between begin-shape and end-shape and before any calls to\n vertex.\n\n When textures are in use, the fill color is ignored. Instead, use\n tint to specify the color of the texture as it is applied to the\n shape."}, :added "1.0", :name quil.core/texture, :variadic false, :subcategory "Vertex", :file "out/quil/core.cljc", :end-column 10, :processing-name "texture()", :method-params ([img]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4343, :end-line 4349, :max-fixed-arity 1, :fn-var true, :arglists (quote ([img])), :doc "Sets a texture to be applied to vertex points. The texture fn must\n be called between begin-shape and end-shape and before any calls to\n vertex.\n\n When textures are in use, the fill color is ignored. Instead, use\n tint to specify the color of the texture as it is applied to the\n shape."}, stroke-int {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([rgb] [rgb alpha]), :arglists ([rgb] [rgb alpha]), :arglists-meta (nil nil)}, :processing-name "stroke()", :column 3, :requires-bindings true, :line 4030, :end-line 4030, :arglists (quote ([rgb] [rgb alpha])), :doc "Sets the color used to draw lines and borders around\n shapes. Converts rgb to int and alpha to a float."}, :added "1.0", :name quil.core/stroke-int, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([rgb] [rgb alpha]), :arglists ([rgb] [rgb alpha]), :arglists-meta (nil nil)}, :processing-name "stroke()", :method-params ([rgb] [rgb alpha]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4024, :end-line 4030, :max-fixed-arity 2, :fn-var true, :arglists ([rgb] [rgb alpha]), :doc "Sets the color used to draw lines and borders around\n shapes. Converts rgb to int and alpha to a float."}, print-camera {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Camera", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "printCamera()", :column 3, :requires-bindings true, :line 3076, :end-line 3076, :arglists (quote ([])), :doc "Prints the current camera matrix to std out. Useful for debugging."}, :added "1.0", :name quil.core/print-camera, :variadic false, :subcategory "Camera", :file "out/quil/core.cljc", :end-column 15, :processing-name "printCamera()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3070, :end-line 3076, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Prints the current camera matrix to std out. Useful for debugging."}, floor {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "2.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :processing-name "floor()", :column 3, :requires-bindings false, :line 1830, :end-line 1830, :arglists (quote ([n])), :doc "Calculates the closest int value that is less than or equal to the\n value of the parameter. For example, (floor 9.03) returns the value 9."}, :added "2.0", :name quil.core/floor, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 8, :processing-name "floor()", :method-params ([n]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 1824, :end-line 1830, :max-fixed-arity 1, :fn-var true, :arglists (quote ([n])), :doc "Calculates the closest int value that is less than or equal to the\n value of the parameter. For example, (floor 9.03) returns the value 9."}, atan2 {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Trigonometry", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :processing-name "atan2()", :column 3, :requires-bindings false, :line 473, :end-line 473, :arglists (quote ([y x])), :doc "Calculates the angle (in radians) from a specified point to the\n coordinate origin as measured from the positive x-axis. Values are\n returned as a float in the range from PI to -PI. The atan2 function\n is most often used for orienting geometry to the position of the\n cursor. Note: The y-coordinate of the point is the first parameter\n and the x-coordinate is the second due to the structure of\n calculating the tangent."}, :added "1.0", :name quil.core/atan2, :variadic false, :subcategory "Trigonometry", :file "out/quil/core.cljc", :end-column 8, :processing-name "atan2()", :method-params ([y x]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 467, :end-line 473, :max-fixed-arity 2, :fn-var true, :arglists (quote ([y x])), :doc "Calculates the angle (in radians) from a specified point to the\n coordinate origin as measured from the positive x-axis. Values are\n returned as a float in the range from PI to -PI. The atan2 function\n is most often used for orienting geometry to the position of the\n cursor. Note: The y-coordinate of the point is the first parameter\n and the x-coordinate is the second due to the structure of\n calculating the tangent."}, millis {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Time & Date", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :processing-name "millis()", :column 3, :requires-bindings true, :line 2499, :end-line 2499, :arglists (quote ([])), :doc "Returns the number of milliseconds (thousandths of a second) since\n starting the sketch. This information is often used for timing\n animation sequences."}, :added "1.0", :name quil.core/millis, :variadic false, :subcategory "Time & Date", :file "out/quil/core.cljc", :end-column 9, :processing-name "millis()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2493, :end-line 2499, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns the number of milliseconds (thousandths of a second) since\n starting the sketch. This information is often used for timing\n animation sequences."}, lerp-color {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "lerpColor()", :column 3, :requires-bindings true, :line 2254, :end-line 2254, :arglists (quote ([c1 c2 amt])), :doc "Calculates a color or colors between two color at a specific\n increment. The amt parameter is the amount to interpolate between\n the two values where 0.0 equal to the first point, 0.1 is very near\n the first point, 0.5 is half-way in between, etc."}, :added "1.0", :name quil.core/lerp-color, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 13, :processing-name "lerpColor()", :method-params ([c1 c2 amt]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2248, :end-line 2254, :max-fixed-arity 3, :fn-var true, :arglists (quote ([c1 c2 amt])), :doc "Calculates a color or colors between two color at a specific\n increment. The amt parameter is the amount to interpolate between\n the two values where 0.0 equal to the first point, 0.1 is very near\n the first point, 0.5 is half-way in between, etc."}, image-modes {:name quil.core/image-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 61, :end-column 13, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 61, :column 2, :end-line 61, :end-column 13}, :tag cljs.core/IMap}, no-fill-prop {:name quil.core/no-fill-prop, :file "out/quil/core.cljc", :line 24, :column 1, :end-line 24, :end-column 35, :private true, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 24, :column 23, :end-line 24, :end-column 35, :private true}, :tag string}, color-mode {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([mode] [mode max] [mode max-x max-y max-z] [mode max-x max-y max-z max-a]), :arglists ([mode] [mode max] [mode max-x max-y max-z] [mode max-x max-y max-z max-a]), :arglists-meta (nil nil nil nil)}, :processing-name "colorMode()", :column 3, :requires-bindings true, :line 1041, :end-line 1041, :arglists (quote ([mode] [mode max] [mode max-x max-y max-z] [mode max-x max-y max-z max-a])), :doc "Changes the way Processing interprets color data. Available modes\n are :rgb and :hsb.By default, the parameters for fill, stroke,\n background, and color are defined by values between 0 and 255 using\n the :rgb color model. The color-mode fn is used to change the\n numerical range used for specifying colors and to switch color\n systems. For example, calling\n (color-mode :rgb 1.0) will specify that values are specified between\n 0 and 1. The limits for defining colors are altered by setting the\n parameters range1, range2, range3, and range 4."}, :added "1.0", :name quil.core/color-mode, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([mode] [mode max] [mode max-x max-y max-z] [mode max-x max-y max-z max-a]), :arglists ([mode] [mode max] [mode max-x max-y max-z] [mode max-x max-y max-z max-a]), :arglists-meta (nil nil nil nil)}, :processing-name "colorMode()", :method-params ([mode] [mode max] [mode max-x max-y max-z] [mode max-x max-y max-z max-a]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 1035, :end-line 1041, :max-fixed-arity 5, :fn-var true, :arglists ([mode] [mode max] [mode max-x max-y max-z] [mode max-x max-y max-z max-a]), :doc "Changes the way Processing interprets color data. Available modes\n are :rgb and :hsb.By default, the parameters for fill, stroke,\n background, and color are defined by values between 0 and 255 using\n the :rgb color model. The color-mode fn is used to change the\n numerical range used for specifying colors and to switch color\n systems. For example, calling\n (color-mode :rgb 1.0) will specify that values are specified between\n 0 and 1. The limits for defining colors are altered by setting the\n parameters range1, range2, range3, and range 4."}, create-image {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "createImage()", :column 3, :requires-bindings true, :line 1243, :end-line 1243, :arglists (quote ([w h format])), :doc "Creates a new PImage (the datatype for storing images). This\n provides a fresh buffer of pixels to play with. Set the size of the\n buffer with the width and height parameters. The format parameter\n defines how the pixels are stored. See the PImage reference for more\n information.\n\n Possible formats: :rgb, :argb, :alpha (grayscale alpha channel)\n\n Prefer using create-image over initialising new PImage instances\n directly."}, :added "1.0", :name quil.core/create-image, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 15, :processing-name "createImage()", :method-params ([w h format]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1237, :end-line 1243, :max-fixed-arity 3, :fn-var true, :arglists (quote ([w h format])), :doc "Creates a new PImage (the datatype for storing images). This\n provides a fresh buffer of pixels to play with. Set the size of the\n buffer with the width and height parameters. The format parameter\n defines how the pixels are stored. See the PImage reference for more\n information.\n\n Possible formats: :rgb, :argb, :alpha (grayscale alpha channel)\n\n Prefer using create-image over initialising new PImage instances\n directly."}, sq {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 5, :processing-name "sq()", :column 3, :requires-bindings false, :line 3975, :end-line 3975, :arglists (quote ([a])), :doc "Squares a number (multiplies a number by itself). The result is\n always a positive number, as multiplying two negative numbers always\n yields a positive result. For example, -1 * -1 = 1."}, :added "1.0", :name quil.core/sq, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 5, :processing-name "sq()", :method-params ([a]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 3969, :end-line 3975, :max-fixed-arity 1, :fn-var true, :arglists (quote ([a])), :doc "Squares a number (multiplies a number by itself). The result is\n always a positive number, as multiplying two negative numbers always\n yields a positive result. For example, -1 * -1 = 1."}, height {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :processing-name "getHeight()", :column 3, :processing-link nil, :requires-bindings true, :line 1970, :end-line 1970, :arglists (quote ([])), :doc "Height of the display window. The value of height is zero until\n size is called."}, :added "1.0", :name quil.core/height, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 9, :processing-name "getHeight()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :processing-link nil, :requires-bindings true, :line 1963, :end-line 1970, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Height of the display window. The value of height is zero until\n size is called."}, no-loop {:category "Structure", :protocol-inline nil, :meta {:category "Structure", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "noLoop()", :column 3, :requires-bindings true, :line 2799, :end-line 2799, :arglists (quote ([])), :doc "Stops Processing from continuously executing the code within\n draw. If start-loop is called, the code in draw will begin to run\n continuously again. If using no-loop in setup, it should be the last\n line inside the block.\n\n When no-loop is used, it's not possible to manipulate or access the\n screen inside event handling functions such as mouse-pressed or\n key-pressed. Instead, use those functions to call redraw or\n loop which will run draw, which can update the screen\n properly. This means that when no-loop has been called, no drawing\n can happen, and functions like save-frame may not be used.\n\n Note that if the sketch is resized, redraw will be called to\n update the sketch, even after no-oop has been\n specified. Otherwise, the sketch would enter an odd state until\n loop was called."}, :added "1.0", :name quil.core/no-loop, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 10, :processing-name "noLoop()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2793, :end-line 2799, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Stops Processing from continuously executing the code within\n draw. If start-loop is called, the code in draw will begin to run\n continuously again. If using no-loop in setup, it should be the last\n line inside the block.\n\n When no-loop is used, it's not possible to manipulate or access the\n screen inside event handling functions such as mouse-pressed or\n key-pressed. Instead, use those functions to call redraw or\n loop which will run draw, which can update the screen\n properly. This means that when no-loop has been called, no drawing\n can happen, and functions like save-frame may not be used.\n\n Note that if the sketch is resized, redraw will be called to\n update the sketch, even after no-oop has been\n specified. Otherwise, the sketch would enter an odd state until\n loop was called."}, minute {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Time & Date", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :processing-name "minute()", :column 3, :requires-bindings false, :line 2512, :end-line 2512, :arglists (quote ([])), :doc "Returns the current minute as a value from 0 - 59"}, :added "1.0", :name quil.core/minute, :variadic false, :subcategory "Time & Date", :file "out/quil/core.cljc", :end-column 9, :processing-name "minute()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 2506, :end-line 2512, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns the current minute as a value from 0 - 59"}, text {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([s x y] [s x y z] [s x1 y1 x2 y2]), :arglists ([s x y] [s x y z] [s x1 y1 x2 y2]), :arglists-meta (nil nil nil)}, :processing-name "text()", :column 3, :requires-bindings true, :line 4176, :end-line 4176, :arglists (quote ([s x y] [s x y z] [s x1 y1 x2 y2])), :doc "Draws text to the screen in the position specified by the x and y\n parameters and the optional z parameter. A default font will be used\n unless a font is set with the text-font fn. Change the color of the\n text with the fill fn. The text displays in relation to the\n text-align fn, which gives the option to draw to the left, right, and\n center of the coordinates.\n\n The x1, y1, x2 and y2 parameters define a\n rectangular area to display within and may only be used with string\n data. For text drawn inside a rectangle, the coordinates are\n interpreted based on the current rect-mode setting."}, :added "1.0", :name quil.core/text, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([s x y] [s x y z] [s x1 y1 x2 y2]), :arglists ([s x y] [s x y z] [s x1 y1 x2 y2]), :arglists-meta (nil nil nil)}, :processing-name "text()", :method-params ([s x y] [s x y z] [s x1 y1 x2 y2]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 4170, :end-line 4176, :max-fixed-arity 5, :fn-var true, :arglists ([s x y] [s x y z] [s x1 y1 x2 y2]), :doc "Draws text to the screen in the position specified by the x and y\n parameters and the optional z parameter. A default font will be used\n unless a font is set with the text-font fn. Change the color of the\n text with the fill fn. The text displays in relation to the\n text-align fn, which gives the option to draw to the left, right, and\n center of the coordinates.\n\n The x1, y1, x2 and y2 parameters define a\n rectangular area to display within and may only be used with string\n data. For text drawn inside a rectangle, the coordinates are\n interpreted based on the current rect-mode setting."}, available-fonts {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 18, :processing-name "PFont.list()", :column 3, :requires-bindings false, :line 491, :end-line 491, :arglists (quote ([])), :doc "A sequence of strings representing the fonts on this system\n available for use.\n\n Because of limitations in Java, not all fonts can be used and some\n might work with one operating system and not others. When sharing a\n sketch with other people or posting it on the web, you may need to\n include a .ttf or .otf version of your font in the data directory of\n the sketch because other people might not have the font installed on\n their computer. Only fonts that can legally be distributed should be\n included with a sketch."}, :added "1.0", :name quil.core/available-fonts, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 18, :processing-name "PFont.list()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 485, :end-line 491, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "A sequence of strings representing the fonts on this system\n available for use.\n\n Because of limitations in Java, not all fonts can be used and some\n might work with one operating system and not others. When sharing a\n sketch with other people or posting it on the web, you may need to\n include a .ttf or .otf version of your font in the data directory of\n the sketch because other people might not have the font installed on\n their computer. Only fonts that can legally be distributed should be\n included with a sketch."}, rect-modes {:name quil.core/rect-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 62, :end-column 12, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 62, :column 2, :end-line 62, :end-column 12}, :tag cljs.core/IMap}, THIRD-PI {:name quil.core/THIRD-PI, :file "out/quil/core.cljc", :line 78, :column 1, :end-line 78, :end-column 14, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 78, :column 6, :end-line 78, :end-column 14}, :tag number}, binary {:category "Data", :protocol-inline nil, :meta {:category "Data", :require-binding false, :added "1.0", :subcategory "Conversion", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([val] [val num-digits]), :arglists ([val] [val num-digits]), :arglists-meta (nil nil)}, :processing-name "binary()", :column 3, :line 761, :end-line 761, :arglists (quote ([val] [val num-digits])), :doc "Returns a string representing the binary value of an int, char or\n byte. When converting an int to a string, it is possible to specify\n the number of digits used."}, :require-binding false, :added "1.0", :name quil.core/binary, :variadic false, :subcategory "Conversion", :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([val] [val num-digits]), :arglists ([val] [val num-digits]), :arglists-meta (nil nil)}, :processing-name "binary()", :method-params ([val] [val num-digits]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 755, :end-line 761, :max-fixed-arity 2, :fn-var true, :arglists ([val] [val num-digits]), :doc "Returns a string representing the binary value of an int, char or\n byte. When converting an int to a string, it is possible to specify\n the number of digits used."}, random-2d {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "2.6", :subcategory "Random", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "random2d()", :column 3, :requires-bindings true, :line 2678, :end-line 2678, :arglists (quote ([])), :doc "Returns a new 2D unit vector in a random direction"}, :added "2.6", :name quil.core/random-2d, :variadic false, :subcategory "Random", :file "out/quil/core.cljc", :end-column 12, :processing-name "random2d()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2672, :end-line 2678, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns a new 2D unit vector in a random direction"}, pop-matrix {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "popMatrix()", :column 3, :requires-bindings true, :line 3027, :end-line 3027, :arglists (quote ([])), :doc "Pops the current transformation matrix off the matrix\n stack. Understanding pushing and popping requires understanding the\n concept of a matrix stack. The push-matrix fn saves the current\n coordinate system to the stack and pop-matrix restores the prior\n coordinate system. push-matrix and pop-matrix are used in conjuction\n with the other transformation methods and may be embedded to control\n the scope of the transformations."}, :added "1.0", :name quil.core/pop-matrix, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 13, :processing-name "popMatrix()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3021, :end-line 3027, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Pops the current transformation matrix off the matrix\n stack. Understanding pushing and popping requires understanding the\n concept of a matrix stack. The push-matrix fn saves the current\n coordinate system to the stack and pop-matrix restores the prior\n coordinate system. push-matrix and pop-matrix are used in conjuction\n with the other transformation methods and may be embedded to control\n the scope of the transformations."}, ceil {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "ceil()", :column 3, :requires-bindings false, :line 972, :end-line 972, :arglists (quote ([n])), :doc "Calculates the closest int value that is greater than or equal to\n the value of the parameter. For example, (ceil 9.03) returns the\n value 10."}, :added "1.0", :name quil.core/ceil, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 7, :processing-name "ceil()", :method-params ([n]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 966, :end-line 972, :max-fixed-arity 1, :fn-var true, :arglists (quote ([n])), :doc "Calculates the closest int value that is greater than or equal to\n the value of the parameter. For example, (ceil 9.03) returns the\n value 10."}, key-code {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Keyboard", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :processing-name "keyCode", :column 3, :requires-bindings true, :line 2168, :end-line 2168, :arglists (quote ([])), :doc "The variable keyCode is used to detect special keys such as the UP,\n DOWN, LEFT, RIGHT arrow keys and ALT, CONTROL, SHIFT. When checking\n for these keys, it's first necessary to check and see if the key is\n coded. This is done with the conditional (= (key) CODED).\n\n The keys included in the ASCII specification (BACKSPACE, TAB, ENTER,\n RETURN, ESC, and DELETE) do not require checking to see if they key\n is coded, and you should simply use the key variable instead of\n key-code If you're making cross-platform projects, note that the\n ENTER key is commonly used on PCs and Unix and the RETURN key is\n used instead on Macintosh. Check for both ENTER and RETURN to make\n sure your program will work for all platforms.\n\n For users familiar with Java, the values for UP and DOWN are simply\n shorter versions of Java's KeyEvent.VK_UP and\n KeyEvent.VK_DOWN. Other keyCode values can be found in the Java\n KeyEvent reference."}, :added "1.0", :name quil.core/key-code, :variadic false, :subcategory "Keyboard", :file "out/quil/core.cljc", :end-column 11, :processing-name "keyCode", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2162, :end-line 2168, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "The variable keyCode is used to detect special keys such as the UP,\n DOWN, LEFT, RIGHT arrow keys and ALT, CONTROL, SHIFT. When checking\n for these keys, it's first necessary to check and see if the key is\n coded. This is done with the conditional (= (key) CODED).\n\n The keys included in the ASCII specification (BACKSPACE, TAB, ENTER,\n RETURN, ESC, and DELETE) do not require checking to see if they key\n is coded, and you should simply use the key variable instead of\n key-code If you're making cross-platform projects, note that the\n ENTER key is commonly used on PCs and Unix and the RETURN key is\n used instead on Macintosh. Check for both ENTER and RETURN to make\n sure your program will work for all platforms.\n\n For users familiar with Java, the values for UP and DOWN are simply\n shorter versions of Java's KeyEvent.VK_UP and\n KeyEvent.VK_DOWN. Other keyCode values can be found in the Java\n KeyEvent reference."}, sphere {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "3D Primitives", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :processing-name "sphere()", :column 3, :requires-bindings true, :line 3923, :end-line 3923, :arglists (quote ([radius])), :doc "Generates a hollow ball made from tessellated triangles."}, :added "1.0", :name quil.core/sphere, :variadic false, :subcategory "3D Primitives", :file "out/quil/core.cljc", :end-column 9, :processing-name "sphere()", :method-params ([radius]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3917, :end-line 3923, :max-fixed-arity 1, :fn-var true, :arglists (quote ([radius])), :doc "Generates a hollow ball made from tessellated triangles."}, request-image {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :processing-name "requestImage()", :column 3, :requires-bindings true, :line 3366, :end-line 3366, :arglists (quote ([filename])), :doc "This function load images on a separate thread so that your sketch\n does not freeze while images load during setup. While the image is\n loading, its width and height will be 0. If an error occurs while\n loading the image, its width and height will be set to -1. You'll\n know when the image has loaded properly because its width and height\n will be greater than 0. Asynchronous image loading (particularly\n when downloading from a server) can dramatically improve\n performance."}, :added "1.0", :name quil.core/request-image, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 16, :processing-name "requestImage()", :method-params ([filename]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3360, :end-line 3366, :max-fixed-arity 1, :fn-var true, :arglists (quote ([filename])), :doc "This function load images on a separate thread so that your sketch\n does not freeze while images load during setup. While the image is\n loading, its width and height will be 0. If an error occurs while\n loading the image, its width and height will be set to -1. You'll\n know when the image has loaded properly because its width and height\n will be greater than 0. Asynchronous image loading (particularly\n when downloading from a server) can dramatically improve\n performance."}, hue {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "hue()", :column 3, :requires-bindings true, :line 2064, :end-line 2064, :arglists (quote ([col])), :doc "Extracts the hue value from a color."}, :added "1.0", :name quil.core/hue, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 6, :processing-name "hue()", :method-params ([col]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2058, :end-line 2064, :max-fixed-arity 1, :fn-var true, :arglists (quote ([col])), :doc "Extracts the hue value from a color."}, background-int {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 17, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([rgb] [rgb alpha]), :arglists ([rgb] [rgb alpha]), :arglists-meta (nil nil)}, :processing-name "background()", :column 3, :requires-bindings true, :line 532, :end-line 532, :arglists (quote ([rgb] [rgb alpha])), :doc "Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts rgb to an int and alpha to a float."}, :added "1.0", :name quil.core/background-int, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 17, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([rgb] [rgb alpha]), :arglists ([rgb] [rgb alpha]), :arglists-meta (nil nil)}, :processing-name "background()", :method-params ([rgb] [rgb alpha]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 526, :end-line 532, :max-fixed-arity 2, :fn-var true, :arglists ([rgb] [rgb alpha]), :doc "Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts rgb to an int and alpha to a float."}, start-loop {:category "Structure", :protocol-inline nil, :meta {:category "Structure", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "loop()", :column 3, :requires-bindings true, :line 4004, :end-line 4004, :arglists (quote ([])), :doc "Causes Processing to continuously execute the code within\n draw. If no-loop is called, the code in draw stops executing."}, :added "1.0", :name quil.core/start-loop, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 13, :processing-name "loop()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3998, :end-line 4004, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Causes Processing to continuously execute the code within\n draw. If no-loop is called, the code in draw stops executing."}, no-fill? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 4132, :column 8, :end-line 4132, :end-column 16, :private true, :arglists (quote ([graphics])), :doc "Returns whether fill is disabled for current graphics."}, :private true, :name quil.core/no-fill?, :variadic false, :file "out/quil/core.cljc", :end-column 16, :method-params ([graphics]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 4132, :end-line 4132, :max-fixed-arity 1, :fn-var true, :arglists (quote ([graphics])), :doc "Returns whether fill is disabled for current graphics."}, curve-vertex {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Vertex", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([x y] [x y z]), :arglists ([x y] [x y z]), :arglists-meta (nil nil)}, :processing-name "curveVertex()", :column 3, :requires-bindings true, :line 1407, :end-line 1407, :arglists (quote ([x y] [x y z])), :doc "Specifies vertex coordinates for curves. This function may only be\n used between begin-shape and end-shape and only when there is no\n mode keyword specified to begin-shape. The first and last points in a\n series of curve-vertex lines will be used to guide the beginning and\n end of a the curve. A minimum of four points is required to draw a\n tiny curve between the second and third points. Adding a fifth point\n with curve-vertex will draw the curve between the second, third, and\n fourth points. The curve-vertex function is an implementation of\n Catmull-Rom splines."}, :added "1.0", :name quil.core/curve-vertex, :variadic false, :subcategory "Vertex", :file "out/quil/core.cljc", :end-column 15, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([x y] [x y z]), :arglists ([x y] [x y z]), :arglists-meta (nil nil)}, :processing-name "curveVertex()", :method-params ([x y] [x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1401, :end-line 1407, :max-fixed-arity 3, :fn-var true, :arglists ([x y] [x y z]), :doc "Specifies vertex coordinates for curves. This function may only be\n used between begin-shape and end-shape and only when there is no\n mode keyword specified to begin-shape. The first and last points in a\n series of curve-vertex lines will be used to guide the beginning and\n end of a the curve. A minimum of four points is required to draw a\n tiny curve between the second and third points. Adding a fifth point\n with curve-vertex will draw the curve between the second, third, and\n fourth points. The curve-vertex function is an implementation of\n Catmull-Rom splines."}, state-atom {:category "State", :protocol-inline nil, :meta {:category "State", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :column 3, :requires-bindings true, :line 199, :end-line 199, :arglists (quote ([])), :doc "Retrieve sketch-specific state-atom. All changes to the\n atom will be reflected in the state.\n\n (set-state! :foo 1)\n (state :foo) ;=> 1\n (swap! (state-atom) update-in [:foo] inc)\n (state :foo) ;=> 2"}, :added "1.0", :name quil.core/state-atom, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 13, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 194, :end-line 199, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Retrieve sketch-specific state-atom. All changes to the\n atom will be reflected in the state.\n\n (set-state! :foo 1)\n (state :foo) ;=> 1\n (swap! (state-atom) update-in [:foo] inc)\n (state :foo) ;=> 2"}, load-image {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "loadImage()", :column 3, :requires-bindings true, :line 2373, :end-line 2373, :arglists (quote ([filename])), :doc "Loads an image into a variable of type PImage. Four types of\n images ( .gif, .jpg, .tga, .png) images may be loaded. To load\n correctly, images must be located in the data directory of the\n current sketch. In most cases, load all images in setup to preload\n them at the start of the program. Loading images inside draw will\n reduce the speed of a program.\n\n The filename parameter can also be a URL to a file found online.\n\n If an image is not loaded successfully, the null value is returned\n and an error message will be printed to the console. The error\n message does not halt the program, however the null value may cause\n a NullPointerException if your code does not check whether the value\n returned from load-image is nil.\n\n Depending on the type of error, a PImage object may still be\n returned, but the width and height of the image will be set to\n -1. This happens if bad image data is returned or cannot be decoded\n properly. Sometimes this happens with image URLs that produce a 403\n error or that redirect to a password prompt, because load-image\n will attempt to interpret the HTML as image data."}, :added "1.0", :name quil.core/load-image, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 13, :processing-name "loadImage()", :method-params ([filename]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2367, :end-line 2373, :max-fixed-arity 1, :fn-var true, :arglists (quote ([filename])), :doc "Loads an image into a variable of type PImage. Four types of\n images ( .gif, .jpg, .tga, .png) images may be loaded. To load\n correctly, images must be located in the data directory of the\n current sketch. In most cases, load all images in setup to preload\n them at the start of the program. Loading images inside draw will\n reduce the speed of a program.\n\n The filename parameter can also be a URL to a file found online.\n\n If an image is not loaded successfully, the null value is returned\n and an error message will be printed to the console. The error\n message does not halt the program, however the null value may cause\n a NullPointerException if your code does not check whether the value\n returned from load-image is nil.\n\n Depending on the type of error, a PImage object may still be\n returned, but the width and height of the image will be set to\n -1. This happens if bad image data is returned or cannot be decoded\n properly. Sometimes this happens with image URLs that produce a 403\n error or that redirect to a password prompt, because load-image\n will attempt to interpret the HTML as image data."}, bezier {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Curves", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 12, :method-params ([x1 y1 cx1 cy1 cx2 cy2 x2 y2] [x1 y1 z1 cx1 cy1 cz1 cx2 cy2 cz2 x2 y2 z2]), :arglists ([x1 y1 cx1 cy1 cx2 cy2 x2 y2] [x1 y1 z1 cx1 cy1 cz1 cx2 cy2 cz2 x2 y2 z2]), :arglists-meta (nil nil)}, :processing-name "bezier()", :column 3, :requires-bindings true, :line 667, :end-line 667, :arglists (quote ([x1 y1 cx1 cy1 cx2 cy2 x2 y2] [x1 y1 z1 cx1 cy1 cz1 cx2 cy2 cz2 x2 y2 z2])), :doc "Draws a Bezier curve on the screen. These curves are defined by a\n series of anchor and control points. The first two parameters\n specify the first anchor point and the last two parameters specify\n the other anchor point. The middle parameters specify the control\n points which define the shape of the curve."}, :added "1.0", :name quil.core/bezier, :variadic false, :subcategory "Curves", :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 12, :method-params ([x1 y1 cx1 cy1 cx2 cy2 x2 y2] [x1 y1 z1 cx1 cy1 cz1 cx2 cy2 cz2 x2 y2 z2]), :arglists ([x1 y1 cx1 cy1 cx2 cy2 x2 y2] [x1 y1 z1 cx1 cy1 cz1 cx2 cy2 cz2 x2 y2 z2]), :arglists-meta (nil nil)}, :processing-name "bezier()", :method-params ([x1 y1 cx1 cy1 cx2 cy2 x2 y2] [x1 y1 z1 cx1 cy1 cz1 cx2 cy2 cz2 x2 y2 z2]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 661, :end-line 667, :max-fixed-arity 12, :fn-var true, :arglists ([x1 y1 cx1 cy1 cx2 cy2 x2 y2] [x1 y1 z1 cx1 cy1 cz1 cx2 cy2 cz2 x2 y2 z2]), :doc "Draws a Bezier curve on the screen. These curves are defined by a\n series of anchor and control points. The first two parameters\n specify the first anchor point and the last two parameters specify\n the other anchor point. The middle parameters specify the control\n points which define the shape of the curve."}, smooth {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [level]), :arglists ([] [level]), :arglists-meta (nil nil)}, :processing-name "smooth()", :column 3, :requires-bindings true, :line 3877, :end-line 3877, :arglists (quote ([] [level])), :doc "Draws all geometry with smooth (anti-aliased) edges. This will slow\n down the frame rate of the application, but will enhance the visual\n refinement.\n\n Must be called inside :settings handler.\n\n The level parameter (int) increases the level of smoothness with the\n P2D and P3D renderers. This is the level of over sampling applied to\n the graphics buffer. The value '2' will double the rendering size\n before scaling it down to the display size. This is called '2x\n anti-aliasing.' The value 4 is used for 4x anti-aliasing and 8 is\n specified for 8x anti-aliasing. If level is set to 0, it will disable\n all smoothing; it's the equivalent of the function noSmooth().\n The maximum anti-aliasing level is determined by the hardware of the\n machine that is running the software.\n\n Note that smooth will also improve image quality of resized images."}, :added "1.0", :name quil.core/smooth, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [level]), :arglists ([] [level]), :arglists-meta (nil nil)}, :processing-name "smooth()", :method-params ([] [level]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3871, :end-line 3877, :max-fixed-arity 1, :fn-var true, :arglists ([] [level]), :doc "Draws all geometry with smooth (anti-aliased) edges. This will slow\n down the frame rate of the application, but will enhance the visual\n refinement.\n\n Must be called inside :settings handler.\n\n The level parameter (int) increases the level of smoothness with the\n P2D and P3D renderers. This is the level of over sampling applied to\n the graphics buffer. The value '2' will double the rendering size\n before scaling it down to the display size. This is called '2x\n anti-aliasing.' The value 4 is used for 4x anti-aliasing and 8 is\n specified for 8x anti-aliasing. If level is set to 0, it will disable\n all smoothing; it's the equivalent of the function noSmooth().\n The maximum anti-aliasing level is determined by the hardware of the\n machine that is running the software.\n\n Note that smooth will also improve image quality of resized images."}, filter-modes {:name quil.core/filter-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 71, :end-column 14, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 71, :column 2, :end-line 71, :end-column 14}, :tag cljs.core/IMap}, shear-x {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "shearX()", :column 3, :requires-bindings true, :line 3776, :end-line 3776, :arglists (quote ([angle])), :doc "Shears a shape around the x-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n PI*2) or converted to radians with the radians() function. Objects\n are always sheared around their relative position to the origin and\n positive numbers shear objects in a clockwise direction.\n Transformations apply to everything that happens after and\n subsequent calls to the function accumulates the effect. For\n example, calling (shear-x (/ PI 2)) and then (shear-x (/ PI 2)) is\n the same as (shear-x PI). If shear-x is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function works in P2D or JAVA2D mode.\n\n Technically, shear-x multiplies the current transformation matrix\n by a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix fns."}, :added "1.0", :name quil.core/shear-x, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 10, :processing-name "shearX()", :method-params ([angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3770, :end-line 3776, :max-fixed-arity 1, :fn-var true, :arglists (quote ([angle])), :doc "Shears a shape around the x-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n PI*2) or converted to radians with the radians() function. Objects\n are always sheared around their relative position to the origin and\n positive numbers shear objects in a clockwise direction.\n Transformations apply to everything that happens after and\n subsequent calls to the function accumulates the effect. For\n example, calling (shear-x (/ PI 2)) and then (shear-x (/ PI 2)) is\n the same as (shear-x PI). If shear-x is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function works in P2D or JAVA2D mode.\n\n Technically, shear-x multiplies the current transformation matrix\n by a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix fns."}, stroke-weight {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :processing-name "strokeWeight()", :column 3, :requires-bindings true, :line 4100, :end-line 4100, :arglists (quote ([weight])), :doc "Sets the width of the stroke used for lines, points, and the border\n around shapes. All widths are set in units of pixels. "}, :added "1.0", :name quil.core/stroke-weight, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 16, :processing-name "strokeWeight()", :method-params ([weight]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4094, :end-line 4100, :max-fixed-arity 1, :fn-var true, :arglists (quote ([weight])), :doc "Sets the width of the stroke used for lines, points, and the border\n around shapes. All widths are set in units of pixels. "}, directional-light {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Lights", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 20, :processing-name "directionalLight()", :column 3, :requires-bindings true, :line 1473, :end-line 1473, :arglists (quote ([r g b nx ny nz])), :doc "Adds a directional light. Directional light comes from one\n direction and is stronger when hitting a surface squarely and weaker\n if it hits at a gentle angle. After hitting a surface, a\n directional lights scatters in all directions. Lights need to be\n included in the draw fn to remain persistent in a looping\n program. Placing them in the setup fn of a looping program will cause\n them to only have an effect the first time through the loop. The\n affect of the r, g, and b parameters is determined by the current\n color mode. The nx, ny, and nz parameters specify the direction the\n light is facing. For example, setting ny to -1 will cause the\n geometry to be lit from below (the light is facing directly upward)"}, :added "1.0", :name quil.core/directional-light, :variadic false, :subcategory "Lights", :file "out/quil/core.cljc", :end-column 20, :processing-name "directionalLight()", :method-params ([r g b nx ny nz]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1467, :end-line 1473, :max-fixed-arity 6, :fn-var true, :arglists (quote ([r g b nx ny nz])), :doc "Adds a directional light. Directional light comes from one\n direction and is stronger when hitting a surface squarely and weaker\n if it hits at a gentle angle. After hitting a surface, a\n directional lights scatters in all directions. Lights need to be\n included in the draw fn to remain persistent in a looping\n program. Placing them in the setup fn of a looping program will cause\n them to only have an effect the first time through the loop. The\n affect of the r, g, and b parameters is determined by the current\n color mode. The nx, ny, and nz parameters specify the direction the\n light is facing. For example, setting ny to -1 will cause the\n geometry to be lit from below (the light is facing directly upward)"}, frame-rate {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "frameRate()", :column 3, :requires-bindings true, :line 1879, :end-line 1879, :arglists (quote ([new-rate])), :doc "Specifies a new target framerate (number of frames to be displayed every\n second). If the processor is not fast enough to maintain the\n specified rate, it will not be achieved. For example, the function\n call (frame-rate 30) will attempt to refresh 30 times a second. It\n is recommended to set the frame rate within setup. The default rate\n is 60 frames per second."}, :added "1.0", :name quil.core/frame-rate, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 13, :processing-name "frameRate()", :method-params ([new-rate]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1873, :end-line 1879, :max-fixed-arity 1, :fn-var true, :arglists (quote ([new-rate])), :doc "Specifies a new target framerate (number of frames to be displayed every\n second). If the processor is not fast enough to maintain the\n specified rate, it will not be achieved. For example, the function\n call (frame-rate 30) will attempt to refresh 30 times a second. It\n is recommended to set the frame rate within setup. The default rate\n is 60 frames per second."}, hour {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Time & Date", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "hour()", :column 3, :requires-bindings false, :line 2052, :end-line 2052, :arglists (quote ([])), :doc "Returns the current hour as a value from 0 - 23."}, :added "1.0", :name quil.core/hour, :variadic false, :subcategory "Time & Date", :file "out/quil/core.cljc", :end-column 7, :processing-name "hour()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 2046, :end-line 2052, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns the current hour as a value from 0 - 23."}, fill-int {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([rgb] [rgb alpha]), :arglists ([rgb] [rgb alpha]), :arglists-meta (nil nil)}, :processing-name "fill()", :column 3, :requires-bindings true, :line 1727, :end-line 1727, :arglists (quote ([rgb] [rgb alpha])), :doc "Sets the color used to fill shapes."}, :added "1.0", :name quil.core/fill-int, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([rgb] [rgb alpha]), :arglists ([rgb] [rgb alpha]), :arglists-meta (nil nil)}, :processing-name "fill()", :method-params ([rgb] [rgb alpha]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1721, :end-line 1727, :max-fixed-arity 2, :fn-var true, :arglists ([rgb] [rgb alpha]), :doc "Sets the color used to fill shapes."}, atan {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Trigonometry", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "atan()", :column 3, :requires-bindings false, :line 458, :end-line 458, :arglists (quote ([n])), :doc "The inverse of tan, returns the arc tangent of a value. This\n function expects the values in the range of -Infinity to\n Infinity (exclusive) and values are returned in the range -PI/2 to\n PI/2 ."}, :added "1.0", :name quil.core/atan, :variadic false, :subcategory "Trigonometry", :file "out/quil/core.cljc", :end-column 7, :processing-name "atan()", :method-params ([n]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 452, :end-line 458, :max-fixed-arity 1, :fn-var true, :arglists (quote ([n])), :doc "The inverse of tan, returns the arc tangent of a value. This\n function expects the values in the range of -Infinity to\n Infinity (exclusive) and values are returned in the range -PI/2 to\n PI/2 ."}, stroke-join-modes {:name quil.core/stroke-join-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 65, :end-column 19, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 65, :column 2, :end-line 65, :end-column 19}, :tag cljs.core/IMap}, rotate-y {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :processing-name "rotateY()", :column 3, :requires-bindings true, :line 3485, :end-line 3485, :arglists (quote ([angle])), :doc "Rotates a shape around the y-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0\n to (* PI 2)) or converted to radians with the radians function.\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-y HALF-PI) and then (rotate-y HALF-PI) is\n the same as (rotate-y PI). If rotate-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."}, :added "1.0", :name quil.core/rotate-y, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 11, :processing-name "rotateY()", :method-params ([angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3479, :end-line 3485, :max-fixed-arity 1, :fn-var true, :arglists (quote ([angle])), :doc "Rotates a shape around the y-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0\n to (* PI 2)) or converted to radians with the radians function.\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-y HALF-PI) and then (rotate-y HALF-PI) is\n the same as (rotate-y PI). If rotate-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."}, day {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Time & Date", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "day()", :column 3, :requires-bindings false, :line 1426, :end-line 1426, :arglists (quote ([])), :doc "Get the current day of the month (1 through 31)."}, :added "1.0", :name quil.core/day, :variadic false, :subcategory "Time & Date", :file "out/quil/core.cljc", :end-column 6, :processing-name "day()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 1420, :end-line 1426, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Get the current day of the month (1 through 31)."}, point-light {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Lights", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "pointLight()", :column 3, :requires-bindings true, :line 3011, :end-line 3011, :arglists (quote ([r g b x y z])), :doc "Adds a point light. Lights need to be included in the draw() to\n remain persistent in a looping program. Placing them in the setup()\n of a looping program will cause them to only have an effect the\n first time through the loop. The affect of the r, g, and b\n parameters is determined by the current color mode. The x, y, and z\n parameters set the position of the light"}, :added "1.0", :name quil.core/point-light, :variadic false, :subcategory "Lights", :file "out/quil/core.cljc", :end-column 14, :processing-name "pointLight()", :method-params ([r g b x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3005, :end-line 3011, :max-fixed-arity 6, :fn-var true, :arglists (quote ([r g b x y z])), :doc "Adds a point light. Lights need to be included in the draw() to\n remain persistent in a looping program. Placing them in the setup()\n of a looping program will cause them to only have an effect the\n first time through the loop. The affect of the r, g, and b\n parameters is determined by the current color mode. The x, y, and z\n parameters set the position of the light"}, pmouse-x {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Mouse", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :processing-name "pmouseX", :column 3, :requires-bindings true, :line 2973, :end-line 2973, :arglists (quote ([])), :doc "Horizontal coordinate of the mouse in the previous frame"}, :added "1.0", :name quil.core/pmouse-x, :variadic false, :subcategory "Mouse", :file "out/quil/core.cljc", :end-column 11, :processing-name "pmouseX", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2967, :end-line 2973, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Horizontal coordinate of the mouse in the previous frame"}, get-sketch-by-id {:category nil, :protocol-inline nil, :meta {:category nil, :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 22, :processing-name "getSketchById()", :column 6, :requires-bindings true, :line 185, :end-line 185, :arglists (quote ([id])), :doc "Returns sketch object by id of canvas element of sketch."}, :added "1.0", :name quil.core/get-sketch-by-id, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 22, :processing-name "getSketchById()", :method-params ([id]), :protocol-impl nil, :arglists-meta (nil nil), :column 4, :requires-bindings true, :line 179, :end-line 185, :max-fixed-arity 1, :fn-var true, :arglists (quote ([id])), :doc "Returns sketch object by id of canvas element of sketch."}, stroke {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([rgb] [rgb alpha] [x y z] [x y z a]), :arglists ([rgb] [rgb alpha] [x y z] [x y z a]), :arglists-meta (nil nil nil nil)}, :processing-name "stroke()", :column 3, :requires-bindings true, :line 4042, :end-line 4042, :arglists (quote ([rgb] [rgb alpha] [x y z] [x y z a])), :doc "Sets the color used to draw lines and borders around shapes. This\n color is either specified in terms of the RGB or HSB color depending\n on the current color-mode (the default color space is RGB, with\n each value in the range from 0 to 255)."}, :added "1.0", :name quil.core/stroke, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([rgb] [rgb alpha] [x y z] [x y z a]), :arglists ([rgb] [rgb alpha] [x y z] [x y z a]), :arglists-meta (nil nil nil nil)}, :processing-name "stroke()", :method-params ([rgb] [rgb alpha] [x y z] [x y z a]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 4036, :end-line 4042, :max-fixed-arity 4, :fn-var true, :arglists ([rgb] [rgb alpha] [x y z] [x y z a]), :doc "Sets the color used to draw lines and borders around shapes. This\n color is either specified in terms of the RGB or HSB color depending\n on the current color-mode (the default color space is RGB, with\n each value in the range from 0 to 255)."}, mouse-pressed? {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Mouse", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 17, :processing-name "mousePressed", :column 3, :requires-bindings true, :line 2606, :end-line 2606, :arglists (quote ([])), :doc "Variable storing if a mouse button is pressed. The value of the\n system variable mousePressed is true if a mouse button is pressed\n and false if a button is not pressed."}, :added "1.0", :name quil.core/mouse-pressed?, :variadic false, :subcategory "Mouse", :file "out/quil/core.cljc", :end-column 17, :processing-name "mousePressed", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2600, :end-line 2606, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Variable storing if a mouse button is pressed. The value of the\n system variable mousePressed is true if a mouse button is pressed\n and false if a button is not pressed."}, key-pressed? {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Keyboard", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "keyPressed", :column 3, :requires-bindings true, :line 2217, :end-line 2217, :arglists (quote ([])), :doc "true if any key is currently pressed, false otherwise."}, :added "1.0", :name quil.core/key-pressed?, :variadic false, :subcategory "Keyboard", :file "out/quil/core.cljc", :end-column 15, :processing-name "keyPressed", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2211, :end-line 2217, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "true if any key is currently pressed, false otherwise."}, quadratic-vertex {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "2.0", :subcategory "Vertex", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 19, :top-fn {:variadic false, :max-fixed-arity 6, :method-params ([cx cy x3 y3] [cx cy cz x3 y3 z3]), :arglists ([cx cy x3 y3] [cx cy cz x3 y3 z3]), :arglists-meta (nil nil)}, :processing-name "quadraticVertex()", :column 3, :requires-bindings true, :line 3170, :end-line 3170, :arglists (quote ([cx cy x3 y3] [cx cy cz x3 y3 z3])), :doc "Specifies vertex coordinates for quadratic Bezier curves. Each call to\n quadratic-vertex defines the position of one control points and one\n anchor point of a Bezier curve, adding a new segment to a line or shape.\n The first time quadratic-vertex is used within a begin-shape call, it\n must be prefaced with a call to vertex to set the first anchor point.\n This function must be used between begin-shape and end-shape and only\n when there is no MODE parameter specified to begin-shape. Using the 3D\n version requires rendering with :p3d."}, :added "2.0", :name quil.core/quadratic-vertex, :variadic false, :subcategory "Vertex", :file "out/quil/core.cljc", :end-column 19, :top-fn {:variadic false, :max-fixed-arity 6, :method-params ([cx cy x3 y3] [cx cy cz x3 y3 z3]), :arglists ([cx cy x3 y3] [cx cy cz x3 y3 z3]), :arglists-meta (nil nil)}, :processing-name "quadraticVertex()", :method-params ([cx cy x3 y3] [cx cy cz x3 y3 z3]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3164, :end-line 3170, :max-fixed-arity 6, :fn-var true, :arglists ([cx cy x3 y3] [cx cy cz x3 y3 z3]), :doc "Specifies vertex coordinates for quadratic Bezier curves. Each call to\n quadratic-vertex defines the position of one control points and one\n anchor point of a Bezier curve, adding a new segment to a line or shape.\n The first time quadratic-vertex is used within a begin-shape call, it\n must be prefaced with a call to vertex to set the first anchor point.\n This function must be used between begin-shape and end-shape and only\n when there is no MODE parameter specified to begin-shape. Using the 3D\n version requires rendering with :p3d."}, texture-wrap-modes {:name quil.core/texture-wrap-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 70, :end-column 20, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 70, :column 2, :end-line 70, :end-column 20}, :tag cljs.core/IMap}, noise-seed {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Random", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "noiseSeed()", :column 3, :requires-bindings true, :line 2771, :end-line 2771, :arglists (quote ([val])), :doc "Sets the seed value for noise. By default, noise produces different\n results each time the program is run. Set the value parameter to a\n constant to return the same pseudo-random numbers each time the\n software is run."}, :added "1.0", :name quil.core/noise-seed, :variadic false, :subcategory "Random", :file "out/quil/core.cljc", :end-column 13, :processing-name "noiseSeed()", :method-params ([val]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2765, :end-line 2771, :max-fixed-arity 1, :fn-var true, :arglists (quote ([val])), :doc "Sets the seed value for noise. By default, noise produces different\n results each time the program is run. Set the value parameter to a\n constant to return the same pseudo-random numbers each time the\n software is run."}, apply-matrix {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "applyMatrix()", :column 3, :requires-bindings true, :line 396, :end-line 396, :arglists (quote ([n00 n01 n02 n03 n10 n11 n12 n13 n20 n21 n22 n23 n30 n31 n32 n33])), :doc "Multiplies the current matrix by the one specified through the\n parameters. This is very slow because it will try to calculate the\n inverse of the transform, so avoid it whenever possible. The\n equivalent function in OpenGL is glMultMatrix()."}, :added "1.0", :name quil.core/apply-matrix, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 15, :processing-name "applyMatrix()", :method-params ([n00 n01 n02 n03 n10 n11 n12 n13 n20 n21 n22 n23 n30 n31 n32 n33]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 390, :end-line 396, :max-fixed-arity 16, :fn-var true, :arglists (quote ([n00 n01 n02 n03 n10 n11 n12 n13 n20 n21 n22 n23 n30 n31 n32 n33])), :doc "Multiplies the current matrix by the one specified through the\n parameters. This is very slow because it will try to calculate the\n inverse of the transform, so avoid it whenever possible. The\n equivalent function in OpenGL is glMultMatrix()."}, copy {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Pixels", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([[sx sy swidth sheight] [dx dy dwidth dheight]] [src-img [sx sy swidth sheight] [dx dy dwidth dheight]] [src-img dest-img [sx sy swidth sheight] [dx dy dwidth dheight]]), :arglists ([[sx sy swidth sheight] [dx dy dwidth dheight]] [src-img [sx sy swidth sheight] [dx dy dwidth dheight]] [src-img dest-img [sx sy swidth sheight] [dx dy dwidth dheight]]), :arglists-meta (nil nil nil)}, :processing-name "copy()", :column 3, :requires-bindings true, :line 1112, :end-line 1112, :arglists (quote ([[sx sy swidth sheight] [dx dy dwidth dheight]] [src-img [sx sy swidth sheight] [dx dy dwidth dheight]] [src-img dest-img [sx sy swidth sheight] [dx dy dwidth dheight]])), :doc "Copies a region of pixels from the one image to another. If src-img\n is not specified it defaults to current-graphics. If dest-img is not\n specified - it defaults to current-graphics. If the source\n and destination regions aren't the same size, it will automatically\n resize the source pixels to fit the specified target region. No\n alpha information is used in the process, however if the source\n image has an alpha channel set, it will be copied as well. "}, :added "1.0", :name quil.core/copy, :variadic false, :subcategory "Pixels", :file "out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([[sx sy swidth sheight] [dx dy dwidth dheight]] [src-img [sx sy swidth sheight] [dx dy dwidth dheight]] [src-img dest-img [sx sy swidth sheight] [dx dy dwidth dheight]]), :arglists ([[sx sy swidth sheight] [dx dy dwidth dheight]] [src-img [sx sy swidth sheight] [dx dy dwidth dheight]] [src-img dest-img [sx sy swidth sheight] [dx dy dwidth dheight]]), :arglists-meta (nil nil nil)}, :processing-name "copy()", :method-params ([[sx sy swidth sheight] [dx dy dwidth dheight]] [src-img [sx sy swidth sheight] [dx dy dwidth dheight]] [src-img dest-img [sx sy swidth sheight] [dx dy dwidth dheight]]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 1106, :end-line 1112, :max-fixed-arity 4, :fn-var true, :arglists ([[sx sy swidth sheight] [dx dy dwidth dheight]] [src-img [sx sy swidth sheight] [dx dy dwidth dheight]] [src-img dest-img [sx sy swidth sheight] [dx dy dwidth dheight]]), :doc "Copies a region of pixels from the one image to another. If src-img\n is not specified it defaults to current-graphics. If dest-img is not\n specified - it defaults to current-graphics. If the source\n and destination regions aren't the same size, it will automatically\n resize the source pixels to fit the specified target region. No\n alpha information is used in the process, however if the source\n image has an alpha channel set, it will be copied as well. "}, random-3d {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "2.6", :subcategory "Random", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "random3d()", :column 3, :requires-bindings true, :line 2689, :end-line 2689, :arglists (quote ([])), :doc "Returns a new 3D unit vector in a random direction"}, :added "2.6", :name quil.core/random-3d, :variadic false, :subcategory "Random", :file "out/quil/core.cljc", :end-column 12, :processing-name "random3d()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2683, :end-line 2689, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns a new 3D unit vector in a random direction"}, begin-shape {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Vertex", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [mode]), :arglists ([] [mode]), :arglists-meta (nil nil)}, :processing-name "beginShape()", :column 3, :requires-bindings true, :line 635, :end-line 635, :arglists (quote ([] [mode])), :doc "Enables the creation of complex forms. begin-shape begins recording\n vertices for a shape and end-shape stops recording. Use the mode\n keyword to specify which shape create from the provided\n vertices. With no mode specified, the shape can be any irregular\n polygon.\n\n The available mode keywords are :points, :lines, :triangles,\n :triangle-fan, :triangle-strip,\n :quads, :quad-strip.\n\n After calling the begin-shape function, a series of vertex commands\n must follow. To stop drawing the shape, call end-shape. The vertex\n function with two parameters specifies a position in 2D and the\n vertex function with three parameters specifies a position in\n 3D. Each shape will be outlined with the current stroke color and\n filled with the fill color.\n\n Transformations such as translate, rotate, and scale do not work\n within begin-shape. It is also not possible to use other shapes,\n such as ellipse or rect within begin-shape."}, :added "1.0", :name quil.core/begin-shape, :variadic false, :subcategory "Vertex", :file "out/quil/core.cljc", :end-column 14, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [mode]), :arglists ([] [mode]), :arglists-meta (nil nil)}, :processing-name "beginShape()", :method-params ([] [mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 629, :end-line 635, :max-fixed-arity 1, :fn-var true, :arglists ([] [mode]), :doc "Enables the creation of complex forms. begin-shape begins recording\n vertices for a shape and end-shape stops recording. Use the mode\n keyword to specify which shape create from the provided\n vertices. With no mode specified, the shape can be any irregular\n polygon.\n\n The available mode keywords are :points, :lines, :triangles,\n :triangle-fan, :triangle-strip,\n :quads, :quad-strip.\n\n After calling the begin-shape function, a series of vertex commands\n must follow. To stop drawing the shape, call end-shape. The vertex\n function with two parameters specifies a position in 2D and the\n vertex function with three parameters specifies a position in\n 3D. Each shape will be outlined with the current stroke color and\n filled with the fill color.\n\n Transformations such as translate, rotate, and scale do not work\n within begin-shape. It is also not possible to use other shapes,\n such as ellipse or rect within begin-shape."}, set-state! {:category "State", :protocol-inline nil, :meta {:category "State", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic true, :max-fixed-arity 0, :method-params [(state-vals)], :arglists ([& state-vals]), :arglists-meta (nil)}, :column 3, :requires-bindings true, :line 236, :end-line 236, :arglists (quote ([& state-vals])), :doc "Set sketch-specific state. May only be called once (ideally in the\n setup fn). Subsequent calls have no effect.\n\n Example:\n (set-state! :foo 1 :bar (atom true) :baz (/ (width) 2))"}, :added "1.0", :name quil.core/set-state!, :variadic true, :subcategory nil, :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic true, :max-fixed-arity 0, :method-params [(state-vals)], :arglists ([& state-vals]), :arglists-meta (nil)}, :method-params [(state-vals)], :protocol-impl nil, :arglists-meta (nil), :column 1, :requires-bindings true, :line 231, :end-line 236, :max-fixed-arity 0, :fn-var true, :arglists ([& state-vals]), :doc "Set sketch-specific state. May only be called once (ideally in the\n setup fn). Subsequent calls have no effect.\n\n Example:\n (set-state! :foo 1 :bar (atom true) :baz (/ (width) 2))"}, stroke-join {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "strokeJoin()", :column 3, :requires-bindings true, :line 4080, :end-line 4080, :arglists (quote ([join-mode])), :doc "Sets the style of the joints which connect line\n segments. These joints are either mitered, beveled, or rounded and\n specified with the corresponding parameters :miter, :bevel, and\n :round. The default joint is :miter.\n\n This function is not available with the :p2d, :p3d, or :opengl\n renderers."}, :added "1.0", :name quil.core/stroke-join, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 14, :processing-name "strokeJoin()", :method-params ([join-mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4074, :end-line 4080, :max-fixed-arity 1, :fn-var true, :arglists (quote ([join-mode])), :doc "Sets the style of the joints which connect line\n segments. These joints are either mitered, beveled, or rounded and\n specified with the corresponding parameters :miter, :bevel, and\n :round. The default joint is :miter.\n\n This function is not available with the :p2d, :p3d, or :opengl\n renderers."}, cos {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Trigonometry", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "cos()", :column 3, :requires-bindings false, :line 1138, :end-line 1138, :arglists (quote ([angle])), :doc "Calculates the cosine of an angle. This function expects the values\n of the angle parameter to be provided in radians (values from 0 to\n Math/PI*2). Values are returned in the range -1 to 1."}, :added "1.0", :name quil.core/cos, :variadic false, :subcategory "Trigonometry", :file "out/quil/core.cljc", :end-column 6, :processing-name "cos()", :method-params ([angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 1132, :end-line 1138, :max-fixed-arity 1, :fn-var true, :arglists (quote ([angle])), :doc "Calculates the cosine of an angle. This function expects the values\n of the angle parameter to be provided in radians (values from 0 to\n Math/PI*2). Values are returned in the range -1 to 1."}, curve-tightness {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Curves", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 18, :processing-name "curveTightness()", :column 3, :requires-bindings true, :line 1389, :end-line 1389, :arglists (quote ([ti])), :doc "Modifies the quality of forms created with curve and\n curve-vertex. The parameter squishy determines how the curve fits\n to the vertex points. The value 0.0 is the default value for\n squishy (this value defines the curves to be Catmull-Rom splines)\n and the value 1.0 connects all the points with straight\n lines. Values within the range -5.0 and 5.0 will deform the curves\n but will leave them recognizable and as values increase in\n magnitude, they will continue to deform."}, :added "1.0", :name quil.core/curve-tightness, :variadic false, :subcategory "Curves", :file "out/quil/core.cljc", :end-column 18, :processing-name "curveTightness()", :method-params ([ti]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1383, :end-line 1389, :max-fixed-arity 1, :fn-var true, :arglists (quote ([ti])), :doc "Modifies the quality of forms created with curve and\n curve-vertex. The parameter squishy determines how the curve fits\n to the vertex points. The value 0.0 is the default value for\n squishy (this value defines the curves to be Catmull-Rom splines)\n and the value 1.0 connects all the points with straight\n lines. Values within the range -5.0 and 5.0 will deform the curves\n but will leave them recognizable and as values increase in\n magnitude, they will continue to deform."}, tan {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Trigonometry", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "tan()", :column 3, :requires-bindings false, :line 4112, :end-line 4112, :arglists (quote ([angle])), :doc "Calculates the ratio of the sine and cosine of an angle. This\n function expects the values of the angle parameter to be provided in\n radians (values from 0 to PI*2). Values are returned in the range\n infinity to -infinity."}, :added "1.0", :name quil.core/tan, :variadic false, :subcategory "Trigonometry", :file "out/quil/core.cljc", :end-column 6, :processing-name "tan()", :method-params ([angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 4106, :end-line 4112, :max-fixed-arity 1, :fn-var true, :arglists (quote ([angle])), :doc "Calculates the ratio of the sine and cosine of an angle. This\n function expects the values of the angle parameter to be provided in\n radians (values from 0 to PI*2). Values are returned in the range\n infinity to -infinity."}, triangle {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "2D Primitives", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :processing-name "triangle()", :column 3, :requires-bindings true, :line 4509, :end-line 4509, :arglists (quote ([x1 y1 x2 y2 x3 y3])), :doc "A triangle is a plane created by connecting three points. The first\n two arguments specify the first point, the middle two arguments\n specify the second point, and the last two arguments specify the\n third point."}, :added "1.0", :name quil.core/triangle, :variadic false, :subcategory "2D Primitives", :file "out/quil/core.cljc", :end-column 11, :processing-name "triangle()", :method-params ([x1 y1 x2 y2 x3 y3]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4503, :end-line 4509, :max-fixed-arity 6, :fn-var true, :arglists (quote ([x1 y1 x2 y2 x3 y3])), :doc "A triangle is a plane created by connecting three points. The first\n two arguments specify the first point, the middle two arguments\n specify the second point, and the last two arguments specify the\n third point."}, emissive {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Material Properties", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([c] [r g b]), :arglists ([c] [r g b]), :arglists-meta (nil nil)}, :processing-name "emissive()", :column 3, :requires-bindings true, :line 1594, :end-line 1594, :arglists (quote ([c] [r g b])), :doc "Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes.\n\n If passed one arg - it is assumed to be an int (i.e. a color),\n multiple args are converted to floats."}, :added "1.0", :name quil.core/emissive, :variadic false, :subcategory "Material Properties", :file "out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([c] [r g b]), :arglists ([c] [r g b]), :arglists-meta (nil nil)}, :processing-name "emissive()", :method-params ([c] [r g b]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1588, :end-line 1594, :max-fixed-arity 3, :fn-var true, :arglists ([c] [r g b]), :doc "Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes.\n\n If passed one arg - it is assumed to be an int (i.e. a color),\n multiple args are converted to floats."}, clear-no-fill-cljs {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 1693, :column 11, :end-line 1693, :end-column 29, :private true, :arglists (quote ([graphics])), :doc "Sets custom property on graphcs object indicating that it has\n fill color."}, :private true, :name quil.core/clear-no-fill-cljs, :variadic false, :file "out/quil/core.cljc", :end-column 29, :method-params ([graphics]), :protocol-impl nil, :arglists-meta (nil nil), :column 4, :line 1693, :end-line 1693, :max-fixed-arity 1, :fn-var true, :arglists (quote ([graphics])), :doc "Sets custom property on graphcs object indicating that it has\n fill color."}, sketch {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic true, :max-fixed-arity 0, :method-params [(opts)], :arglists ([& opts]), :arglists-meta (nil)}, :column 3, :requires-bindings false, :line 4724, :end-line 4724, :arglists (quote ([& opts])), :doc "Create and start a new visualisation applet. Can be used to create\n new sketches programmatically. See documentation for 'defsketch' for\n list of available options."}, :added "1.0", :name quil.core/sketch, :variadic true, :subcategory nil, :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic true, :max-fixed-arity 0, :method-params [(opts)], :arglists ([& opts]), :arglists-meta (nil)}, :method-params [(opts)], :protocol-impl nil, :arglists-meta (nil), :column 1, :requires-bindings false, :line 4720, :end-line 4724, :max-fixed-arity 0, :fn-var true, :arglists ([& opts]), :doc "Create and start a new visualisation applet. Can be used to create\n new sketches programmatically. See documentation for 'defsketch' for\n list of available options."}, color {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([gray] [gray alpha] [r g b] [r g b a]), :arglists ([gray] [gray alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "color()", :column 3, :requires-bindings true, :line 1019, :end-line 1019, :arglists (quote ([gray] [gray alpha] [r g b] [r g b a])), :doc "Creates an integer representation of a color The parameters are\n interpreted as RGB or HSB values depending on the current\n color-mode. The default mode is RGB values from 0 to 255 and\n therefore, the function call (color 255 204 0) will return a bright\n yellow. Args are cast to floats.\n\n r - red or hue value\n g - green or saturation value\n b - blue or brightness value\n a - alpha value"}, :added "1.0", :name quil.core/color, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([gray] [gray alpha] [r g b] [r g b a]), :arglists ([gray] [gray alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "color()", :method-params ([gray] [gray alpha] [r g b] [r g b a]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 1013, :end-line 1019, :max-fixed-arity 4, :fn-var true, :arglists ([gray] [gray alpha] [r g b] [r g b a]), :doc "Creates an integer representation of a color The parameters are\n interpreted as RGB or HSB values depending on the current\n color-mode. The default mode is RGB values from 0 to 255 and\n therefore, the function call (color 255 204 0) will return a bright\n yellow. Args are cast to floats.\n\n r - red or hue value\n g - green or saturation value\n b - blue or brightness value\n a - alpha value"}, arc {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "2D Primitives", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "arc()", :column 3, :requires-bindings true, :line 422, :end-line 422, :arglists (quote ([x y width height start stop])), :doc "Draws an arc in the display window. Arcs are drawn along the outer\n edge of an ellipse defined by the x, y, width and height\n parameters. The origin or the arc's ellipse may be changed with the\n ellipse-mode function. The start and stop parameters specify the\n angles at which to draw the arc. The mode is either :open, :chord or :pie."}, :added "1.0", :name quil.core/arc, :variadic false, :subcategory "2D Primitives", :file "out/quil/core.cljc", :end-column 6, :processing-name "arc()", :method-params ([x y width height start stop]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 416, :end-line 422, :max-fixed-arity 6, :fn-var true, :arglists (quote ([x y width height start stop])), :doc "Draws an arc in the display window. Arcs are drawn along the outer\n edge of an ellipse defined by the x, y, width and height\n parameters. The origin or the arc's ellipse may be changed with the\n ellipse-mode function. The start and stop parameters specify the\n angles at which to draw the arc. The mode is either :open, :chord or :pie."}, text-align {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([align] [align-x align-y]), :arglists ([align] [align-x align-y]), :arglists-meta (nil nil)}, :processing-name "textAlign()", :column 3, :requires-bindings true, :line 4204, :end-line 4204, :arglists (quote ([align] [align-x align-y])), :doc "Sets the current alignment for drawing text. Available modes are:\n\n horizontal - :left, :center, and :right\n vertical - :top, :bottom, :center, and :baseline\n\n An optional second parameter specifies the vertical alignment\n mode. :baseline is the default. The :top and :center parameters are\n straightforward. The :bottom parameter offsets the line based on the\n current text-descent. For multiple lines, the final line will be\n aligned to the bottom, with the previous lines appearing above it.\n\n When using text with width and height parameters, :baseline is\n ignored, and treated as :top. (Otherwise, text would by default draw\n outside the box, since :baseline is the default setting. :baseline is\n not a useful drawing mode for text drawn in a rectangle.)\n\n The vertical alignment is based on the value of text-ascent, which\n many fonts do not specify correctly. It may be necessary to use a\n hack and offset by a few pixels by hand so that the offset looks\n correct. To do this as less of a hack, use some percentage of\n text-ascent or text-descent so that the hack works even if you\n change the size of the font."}, :added "1.0", :name quil.core/text-align, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([align] [align-x align-y]), :arglists ([align] [align-x align-y]), :arglists-meta (nil nil)}, :processing-name "textAlign()", :method-params ([align] [align-x align-y]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4198, :end-line 4204, :max-fixed-arity 2, :fn-var true, :arglists ([align] [align-x align-y]), :doc "Sets the current alignment for drawing text. Available modes are:\n\n horizontal - :left, :center, and :right\n vertical - :top, :bottom, :center, and :baseline\n\n An optional second parameter specifies the vertical alignment\n mode. :baseline is the default. The :top and :center parameters are\n straightforward. The :bottom parameter offsets the line based on the\n current text-descent. For multiple lines, the final line will be\n aligned to the bottom, with the previous lines appearing above it.\n\n When using text with width and height parameters, :baseline is\n ignored, and treated as :top. (Otherwise, text would by default draw\n outside the box, since :baseline is the default setting. :baseline is\n not a useful drawing mode for text drawn in a rectangle.)\n\n The vertical alignment is based on the value of text-ascent, which\n many fonts do not specify correctly. It may be necessary to use a\n hack and offset by a few pixels by hand so that the offset looks\n correct. To do this as less of a hack, use some percentage of\n text-ascent or text-descent so that the hack works even if you\n change the size of the font."}, text-width {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "textWidth()", :column 3, :requires-bindings true, :line 4402, :end-line 4402, :arglists (quote ([data])), :doc "Calculates and returns the width of any text string."}, :added "1.0", :name quil.core/text-width, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 13, :processing-name "textWidth()", :method-params ([data]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4396, :end-line 4402, :max-fixed-arity 1, :fn-var true, :arglists (quote ([data])), :doc "Calculates and returns the width of any text string."}, mouse-x {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Mouse", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "mouseX", :column 3, :requires-bindings true, :line 2620, :end-line 2620, :arglists (quote ([])), :doc "Current horizontal coordinate of the mouse."}, :added "1.0", :name quil.core/mouse-x, :variadic false, :subcategory "Mouse", :file "out/quil/core.cljc", :end-column 10, :processing-name "mouseX", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2614, :end-line 2620, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Current horizontal coordinate of the mouse."}, TWO-PI {:name quil.core/TWO-PI, :file "out/quil/core.cljc", :line 80, :column 1, :end-line 80, :end-column 12, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 80, :column 6, :end-line 80, :end-column 12}, :tag number}, mag {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([a b] [a b c]), :arglists ([a b] [a b c]), :arglists-meta (nil nil)}, :processing-name "mag()", :column 3, :requires-bindings false, :line 2442, :end-line 2442, :arglists (quote ([a b] [a b c])), :doc "Calculates the magnitude (or length) of a vector. A vector is a\n direction in space commonly used in computer graphics and linear\n algebra. Because it has no start position, the magnitude of a vector\n can be thought of as the distance from coordinate (0,0) to its (x,y)\n value. Therefore, mag is a shortcut for writing (dist 0 0 x y)."}, :added "1.0", :name quil.core/mag, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 6, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([a b] [a b c]), :arglists ([a b] [a b c]), :arglists-meta (nil nil)}, :processing-name "mag()", :method-params ([a b] [a b c]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 2436, :end-line 2442, :max-fixed-arity 3, :fn-var true, :arglists ([a b] [a b c]), :doc "Calculates the magnitude (or length) of a vector. A vector is a\n direction in space commonly used in computer graphics and linear\n algebra. Because it has no start position, the magnitude of a vector\n can be thought of as the distance from coordinate (0,0) to its (x,y)\n value. Therefore, mag is a shortcut for writing (dist 0 0 x y)."}, exit {:category "Structure", :protocol-inline nil, :meta {:category "Structure", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "exit()", :column 3, :requires-bindings true, :line 1671, :end-line 1671, :arglists (quote ([])), :doc "Quits/stops/exits the program. Rather than terminating\n immediately, exit will cause the sketch to exit after draw has\n completed (or after setup completes if called during the setup\n method). "}, :added "1.0", :name quil.core/exit, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 7, :processing-name "exit()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1665, :end-line 1671, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Quits/stops/exits the program. Rather than terminating\n immediately, exit will cause the sketch to exit after draw has\n completed (or after setup completes if called during the setup\n method). "}, map-range {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "map()", :column 3, :requires-bindings false, :line 2461, :end-line 2461, :arglists (quote ([val low1 high1 low2 high2])), :doc "Re-maps a number from one range to another.\n\n Numbers outside the range are not clamped to 0 and 1, because\n out-of-range values are often intentional and useful."}, :added "1.0", :name quil.core/map-range, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 12, :processing-name "map()", :method-params ([val low1 high1 low2 high2]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 2455, :end-line 2461, :max-fixed-arity 5, :fn-var true, :arglists (quote ([val low1 high1 low2 high2])), :doc "Re-maps a number from one range to another.\n\n Numbers outside the range are not clamped to 0 and 1, because\n out-of-range values are often intentional and useful."}, model-x {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Coordinates", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "modelX()", :column 3, :requires-bindings true, :line 2524, :end-line 2524, :arglists (quote ([x y z])), :doc "Returns the three-dimensional x, y, z position in model space. This\n returns the x value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The x value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."}, :added "1.0", :name quil.core/model-x, :variadic false, :subcategory "Coordinates", :file "out/quil/core.cljc", :end-column 10, :processing-name "modelX()", :method-params ([x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2518, :end-line 2524, :max-fixed-arity 3, :fn-var true, :arglists (quote ([x y z])), :doc "Returns the three-dimensional x, y, z position in model space. This\n returns the x value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The x value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."}, sqrt {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "sqrt()", :column 3, :requires-bindings false, :line 3989, :end-line 3989, :arglists (quote ([a])), :doc "Calculates the square root of a number. The square root of a number\n is always positive, even though there may be a valid negative\n root. The square root s of number a is such that (= a (* s s)) . It\n is the opposite of squaring."}, :added "1.0", :name quil.core/sqrt, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 7, :processing-name "sqrt()", :method-params ([a]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 3983, :end-line 3989, :max-fixed-arity 1, :fn-var true, :arglists (quote ([a])), :doc "Calculates the square root of a number. The square root of a number\n is always positive, even though there may be a valid negative\n root. The square root s of number a is such that (= a (* s s)) . It\n is the opposite of squaring."}, saturation {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "saturation()", :column 3, :requires-bindings true, :line 3540, :end-line 3540, :arglists (quote ([c])), :doc "Extracts the saturation value from a color."}, :added "1.0", :name quil.core/saturation, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 13, :processing-name "saturation()", :method-params ([c]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3534, :end-line 3540, :max-fixed-arity 1, :fn-var true, :arglists (quote ([c])), :doc "Extracts the saturation value from a color."}, prc-print {:category "Output", :protocol-inline nil, :meta {:category "Output", :added "1.0", :subcategory "Text area", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :column 6, :require-bindings true, :line 170, :end-line 170, :arglists (quote ([msg])), :doc "Writes to the console area of the Processing environment.\n This is often helpful for looking at the data a program is producing.\n The companion function println() works like print(), but creates a new line of text for each call to the function.\n Individual elements can be separated with quotes (\"\") and joined with the addition operator (+). "}, :added "1.0", :name quil.core/prc-print, :variadic false, :subcategory "Text area", :file "out/quil/core.cljc", :end-column 15, :method-params ([msg]), :protocol-impl nil, :arglists-meta (nil nil), :column 4, :require-bindings true, :line 165, :end-line 170, :max-fixed-arity 1, :fn-var true, :arglists (quote ([msg])), :doc "Writes to the console area of the Processing environment.\n This is often helpful for looking at the data a program is producing.\n The companion function println() works like print(), but creates a new line of text for each call to the function.\n Individual elements can be separated with quotes (\"\") and joined with the addition operator (+). "}, text-font {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([font] [font size]), :arglists ([font] [font size]), :arglists-meta (nil nil)}, :processing-name "textFont()", :column 3, :requires-bindings true, :line 4269, :end-line 4269, :arglists (quote ([font] [font size])), :doc "Sets the current font that will be drawn with the text\n function. Fonts must be loaded with load-font before it can be\n used. This font will be used in all subsequent calls to the text\n function. If no size parameter is input, the font will appear at its\n original size until it is changed with text-size.\n\n Because fonts are usually bitmaped, you should create fonts at the\n sizes that will be used most commonly. Using textFont without the\n size parameter will result in the cleanest-looking text.\n\n With the default (JAVA2D) and PDF renderers, it's also possible to\n enable the use of native fonts via the command\n (hint :enable-native-fonts). This will produce vector text in JAVA2D\n sketches and PDF output in cases where the vector data is available:\n when the font is still installed, or the font is created via the\n create-font fn"}, :added "1.0", :name quil.core/text-font, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([font] [font size]), :arglists ([font] [font size]), :arglists-meta (nil nil)}, :processing-name "textFont()", :method-params ([font] [font size]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4263, :end-line 4269, :max-fixed-arity 2, :fn-var true, :arglists ([font] [font size]), :doc "Sets the current font that will be drawn with the text\n function. Fonts must be loaded with load-font before it can be\n used. This font will be used in all subsequent calls to the text\n function. If no size parameter is input, the font will appear at its\n original size until it is changed with text-size.\n\n Because fonts are usually bitmaped, you should create fonts at the\n sizes that will be used most commonly. Using textFont without the\n size parameter will result in the cleanest-looking text.\n\n With the default (JAVA2D) and PDF renderers, it's also possible to\n enable the use of native fonts via the command\n (hint :enable-native-fonts). This will produce vector text in JAVA2D\n sketches and PDF output in cases where the vector data is available:\n when the font is still installed, or the font is created via the\n create-font fn"}, scale {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([s] [sx sy] [sx sy sz]), :arglists ([s] [sx sy] [sx sy sz]), :arglists-meta (nil nil nil)}, :processing-name "scale()", :column 3, :requires-bindings true, :line 3589, :end-line 3589, :arglists (quote ([s] [sx sy] [sx sy sz])), :doc "Increases or decreases the size of a shape by expanding and\n contracting vertices. Objects always scale from their relative\n origin to the coordinate system. Scale values are specified as\n decimal percentages. For example, the function call (scale 2)\n increases the dimension of a shape by 200%. Transformations apply to\n everything that happens after and subsequent calls to the function\n multiply the effect. For example, calling (scale 2) and then\n (scale 1.5) is the same as (scale 3). If scale is called within\n draw, the transformation is reset when the loop begins again. Using\n this fuction with the z parameter requires specfying :p3d or :opengl\n as the renderer. This function can be further controlled by\n push-matrix and pop-matrix."}, :added "1.0", :name quil.core/scale, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([s] [sx sy] [sx sy sz]), :arglists ([s] [sx sy] [sx sy sz]), :arglists-meta (nil nil nil)}, :processing-name "scale()", :method-params ([s] [sx sy] [sx sy sz]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 3583, :end-line 3589, :max-fixed-arity 3, :fn-var true, :arglists ([s] [sx sy] [sx sy sz]), :doc "Increases or decreases the size of a shape by expanding and\n contracting vertices. Objects always scale from their relative\n origin to the coordinate system. Scale values are specified as\n decimal percentages. For example, the function call (scale 2)\n increases the dimension of a shape by 200%. Transformations apply to\n everything that happens after and subsequent calls to the function\n multiply the effect. For example, calling (scale 2) and then\n (scale 1.5) is the same as (scale 3). If scale is called within\n draw, the transformation is reset when the loop begins again. Using\n this fuction with the z parameter requires specfying :p3d or :opengl\n as the renderer. This function can be further controlled by\n push-matrix and pop-matrix."}, defsketch {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env app-name options)], :arglists ([&form &env app-name & options]), :arglists-meta (nil)}, :column 4, :requires-bindings false, :line 4736, :macro true, :end-line 4736, :arglists (quote ([app-name & options])), :doc "Define and start a sketch and bind it to a var with the symbol\n app-name. If any of the options to the various callbacks are\n symbols, it wraps them in a call to var to ensure they aren't\n inlined and that redefinitions to the original fns are reflected in\n the visualisation.\n\n Available options:\n\n :size - A vector of width and height for the sketch or :fullscreen.\n Defaults to [500 300]. If you're using :fullscreen you may\n want to enable present mode - :features [:present]\n\n :renderer - Specifies the renderer type. One of :p2d, :p3d, :java2d,\n :opengl, :pdf). Defaults to :java2d. :dxf renderer\n can't be used as sketch renderer. Use begin-raw method\n instead. In clojurescript only :p2d and :p3d renderers\n are supported.\n\n :output-file - Specifies an output file path. Only used in :pdf mode.\n Not supported in clojurescript.\n\n :title - A string which will be displayed at the top of\n the sketch window. Not supported in clojurescript.\n\n :features - A vector of keywords customizing sketch behaviour.\n Supported features:\n\n :keep-on-top - Sketch window will always be above other\n windows. Note: some platforms might not\n support always-on-top windows.\n Not supported in clojurescript.\n\n :exit-on-close - Shutdown JVM when sketch is closed.\n Not supported in clojurescript.\n\n :resizable - Makes sketch resizable.\n Not supported in clojurescript.\n\n :no-safe-fns - Do not catch and print exceptions thrown\n inside functions provided to sketch (like\n draw, mouse-click, key-pressed and\n other). By default all exceptions thrown\n inside these functions are catched. This\n prevents sketch from breaking when bad\n function was provided and allows you to\n fix it and reload it on fly. You can\n disable this behaviour by enabling\n :no-safe-fns feature.\n Not supported in clojurescript.\n\n :present - Switch to present mode (fullscreen without\n borders, OS panels). You may want to use\n this feature together with :size :fullscreen.\n Not supported in clojurescript.\n\n :no-start - Disables autostart if sketch was created using\n defsketch macro. To start sketch you have to\n call function created defsketch.\n Supported only in clojurescript.\n\n :global-key-events - Allows a sketch to receive any\n keyboard event sent to the page,\n regardless of whether the canvas it is\n loaded in has focus or not.\n Supported only in clojurescript.\n\n Usage example: :features [:keep-on-top :present]\n\n :bgcolor - Sets background color for unused space in present mode.\n Color is specified in hex format: #XXXXXX.\n Example: :bgcolor \"#00FFFF\" (cyan background)\n Not supported in clojurescript.\n\n :display - Sets what display should be used by this sketch.\n Displays are numbered starting from 0. Example: :display 1.\n Not supported in clojurescript.\n\n :setup - A function to be called once when setting the sketch up.\n\n :draw - A function to be repeatedly called at most n times per\n second where n is the target frame-rate set for\n the visualisation.\n\n :host - String id of canvas element or DOM element itself.\n Specifies host for the sketch. Must be specified in sketch,\n may be omitted in defsketch. If ommitted in defsketch,\n :host is set to the name of the sketch. If element with\n specified id is not found on the page and page is empty -\n new canvas element will be created. Used in clojurescript.\n\n :focus-gained - Called when the sketch gains focus.\n Not supported in clojurescript.\n\n :focus-lost - Called when the sketch loses focus.\n Not supported in clojurescript.\n\n :mouse-entered - Called when the mouse enters the sketch window.\n\n :mouse-exited - Called when the mouse leaves the sketch window\n\n :mouse-pressed - Called every time a mouse button is pressed.\n\n :mouse-released - Called every time a mouse button is released.\n\n :mouse-clicked - called once after a mouse button has been pressed\n and then released.\n\n :mouse-moved - Called every time the mouse moves and a button is\n not pressed.\n\n :mouse-dragged - Called every time the mouse moves and a button is\n pressed.\n\n :mouse-wheel - Called every time mouse wheel is rotated.\n Takes 1 argument - wheel rotation, an int.\n Negative values if the mouse wheel was rotated\n up/away from the user, and positive values\n if the mouse wheel was rotated down/ towards the user\n\n :key-pressed - Called every time any key is pressed.\n\n :key-released - Called every time any key is released.\n\n :key-typed - Called once every time non-modifier keys are\n pressed.\n\n :on-close - Called once, when sketch is closed\n Not supported in clojurescript.\n\n :middleware - Vector of middleware to be applied to the sketch.\n Middleware will be applied in the same order as in comp\n function: [f g] will be applied as (f (g options)).\n\n :settings - cousin of :setup. A function to be called once when\n setting sketch up. Should be used only for (smooth) and\n (no-smooth). Due to Processing limitations these functions\n cannot be used neither in :setup nor in :draw."}, :added "1.0", :name quil.core/defsketch, :variadic true, :subcategory nil, :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env app-name options)], :arglists ([&form &env app-name & options]), :arglists-meta (nil)}, :method-params [(&form &env app-name options)], :protocol-impl nil, :arglists-meta (nil), :column 1, :requires-bindings false, :line 4732, :macro true, :end-line 4736, :max-fixed-arity 3, :fn-var false, :arglists ([&form &env app-name & options]), :doc "Define and start a sketch and bind it to a var with the symbol\n app-name. If any of the options to the various callbacks are\n symbols, it wraps them in a call to var to ensure they aren't\n inlined and that redefinitions to the original fns are reflected in\n the visualisation.\n\n Available options:\n\n :size - A vector of width and height for the sketch or :fullscreen.\n Defaults to [500 300]. If you're using :fullscreen you may\n want to enable present mode - :features [:present]\n\n :renderer - Specifies the renderer type. One of :p2d, :p3d, :java2d,\n :opengl, :pdf). Defaults to :java2d. :dxf renderer\n can't be used as sketch renderer. Use begin-raw method\n instead. In clojurescript only :p2d and :p3d renderers\n are supported.\n\n :output-file - Specifies an output file path. Only used in :pdf mode.\n Not supported in clojurescript.\n\n :title - A string which will be displayed at the top of\n the sketch window. Not supported in clojurescript.\n\n :features - A vector of keywords customizing sketch behaviour.\n Supported features:\n\n :keep-on-top - Sketch window will always be above other\n windows. Note: some platforms might not\n support always-on-top windows.\n Not supported in clojurescript.\n\n :exit-on-close - Shutdown JVM when sketch is closed.\n Not supported in clojurescript.\n\n :resizable - Makes sketch resizable.\n Not supported in clojurescript.\n\n :no-safe-fns - Do not catch and print exceptions thrown\n inside functions provided to sketch (like\n draw, mouse-click, key-pressed and\n other). By default all exceptions thrown\n inside these functions are catched. This\n prevents sketch from breaking when bad\n function was provided and allows you to\n fix it and reload it on fly. You can\n disable this behaviour by enabling\n :no-safe-fns feature.\n Not supported in clojurescript.\n\n :present - Switch to present mode (fullscreen without\n borders, OS panels). You may want to use\n this feature together with :size :fullscreen.\n Not supported in clojurescript.\n\n :no-start - Disables autostart if sketch was created using\n defsketch macro. To start sketch you have to\n call function created defsketch.\n Supported only in clojurescript.\n\n :global-key-events - Allows a sketch to receive any\n keyboard event sent to the page,\n regardless of whether the canvas it is\n loaded in has focus or not.\n Supported only in clojurescript.\n\n Usage example: :features [:keep-on-top :present]\n\n :bgcolor - Sets background color for unused space in present mode.\n Color is specified in hex format: #XXXXXX.\n Example: :bgcolor \"#00FFFF\" (cyan background)\n Not supported in clojurescript.\n\n :display - Sets what display should be used by this sketch.\n Displays are numbered starting from 0. Example: :display 1.\n Not supported in clojurescript.\n\n :setup - A function to be called once when setting the sketch up.\n\n :draw - A function to be repeatedly called at most n times per\n second where n is the target frame-rate set for\n the visualisation.\n\n :host - String id of canvas element or DOM element itself.\n Specifies host for the sketch. Must be specified in sketch,\n may be omitted in defsketch. If ommitted in defsketch,\n :host is set to the name of the sketch. If element with\n specified id is not found on the page and page is empty -\n new canvas element will be created. Used in clojurescript.\n\n :focus-gained - Called when the sketch gains focus.\n Not supported in clojurescript.\n\n :focus-lost - Called when the sketch loses focus.\n Not supported in clojurescript.\n\n :mouse-entered - Called when the mouse enters the sketch window.\n\n :mouse-exited - Called when the mouse leaves the sketch window\n\n :mouse-pressed - Called every time a mouse button is pressed.\n\n :mouse-released - Called every time a mouse button is released.\n\n :mouse-clicked - called once after a mouse button has been pressed\n and then released.\n\n :mouse-moved - Called every time the mouse moves and a button is\n not pressed.\n\n :mouse-dragged - Called every time the mouse moves and a button is\n pressed.\n\n :mouse-wheel - Called every time mouse wheel is rotated.\n Takes 1 argument - wheel rotation, an int.\n Negative values if the mouse wheel was rotated\n up/away from the user, and positive values\n if the mouse wheel was rotated down/ towards the user\n\n :key-pressed - Called every time any key is pressed.\n\n :key-released - Called every time any key is released.\n\n :key-typed - Called once every time non-modifier keys are\n pressed.\n\n :on-close - Called once, when sketch is closed\n Not supported in clojurescript.\n\n :middleware - Vector of middleware to be applied to the sketch.\n Middleware will be applied in the same order as in comp\n function: [f g] will be applied as (f (g options)).\n\n :settings - cousin of :setup. A function to be called once when\n setting sketch up. Should be used only for (smooth) and\n (no-smooth). Due to Processing limitations these functions\n cannot be used neither in :setup nor in :draw."}, no-stroke {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "noStroke()", :column 3, :requires-bindings true, :line 2864, :end-line 2864, :arglists (quote ([])), :doc "Disables drawing the stroke (outline). If both no-stroke and\n no-fill are called, nothing will be drawn to the screen."}, :added "1.0", :name quil.core/no-stroke, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 12, :processing-name "noStroke()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2858, :end-line 2864, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Disables drawing the stroke (outline). If both no-stroke and\n no-fill are called, nothing will be drawn to the screen."}, end-camera {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Camera", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "endCamera()", :column 3, :requires-bindings true, :line 1612, :end-line 1612, :arglists (quote ([])), :doc "Unsets the matrix mode from the camera matrix. See begin-camera."}, :added "1.0", :name quil.core/end-camera, :variadic false, :subcategory "Camera", :file "out/quil/core.cljc", :end-column 13, :processing-name "endCamera()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1606, :end-line 1612, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Unsets the matrix mode from the camera matrix. See begin-camera."}, random-seed {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Random", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "randomSeed()", :column 3, :requires-bindings true, :line 3243, :end-line 3243, :arglists (quote ([w])), :doc "Sets the seed value for random. By default, random produces\n different results each time the program is run. Set the value\n parameter to a constant to return the same pseudo-random numbers\n each time the software is run."}, :added "1.0", :name quil.core/random-seed, :variadic false, :subcategory "Random", :file "out/quil/core.cljc", :end-column 14, :processing-name "randomSeed()", :method-params ([w]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3237, :end-line 3243, :max-fixed-arity 1, :fn-var true, :arglists (quote ([w])), :doc "Sets the seed value for random. By default, random produces\n different results each time the program is run. Set the value\n parameter to a constant to return the same pseudo-random numbers\n each time the software is run."}, model-z {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Coordinates", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "modelZ()", :column 3, :requires-bindings true, :line 2554, :end-line 2554, :arglists (quote ([x y z])), :doc "Returns the three-dimensional x, y, z position in model space. This\n returns the z value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The z value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."}, :added "1.0", :name quil.core/model-z, :variadic false, :subcategory "Coordinates", :file "out/quil/core.cljc", :end-column 10, :processing-name "modelZ()", :method-params ([x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2548, :end-line 2554, :max-fixed-arity 3, :fn-var true, :arglists (quote ([x y z])), :doc "Returns the three-dimensional x, y, z position in model space. This\n returns the z value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The z value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."}, light-specular {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Lights", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 17, :processing-name "lightSpecular()", :column 3, :requires-bindings true, :line 2307, :end-line 2307, :arglists (quote ([r g b])), :doc "Sets the specular color for lights. Like fill, it affects only the\n elements which are created after it in the code. Specular refers to\n light which bounces off a surface in a perferred direction (rather\n than bouncing in all directions like a diffuse light) and is used\n for creating highlights. The specular quality of a light interacts\n with the specular material qualities set through the specular and\n shininess functions."}, :added "1.0", :name quil.core/light-specular, :variadic false, :subcategory "Lights", :file "out/quil/core.cljc", :end-column 17, :processing-name "lightSpecular()", :method-params ([r g b]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2301, :end-line 2307, :max-fixed-arity 3, :fn-var true, :arglists (quote ([r g b])), :doc "Sets the specular color for lights. Like fill, it affects only the\n elements which are created after it in the code. Specular refers to\n light which bounces off a surface in a perferred direction (rather\n than bouncing in all directions like a diffuse light) and is used\n for creating highlights. The specular quality of a light interacts\n with the specular material qualities set through the specular and\n shininess functions."}, key-as-keyword {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.6", :subcategory "Keyboard", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 17, :processing-name nil, :column 3, :requires-bindings true, :line 4901, :end-line 4901, :arglists (quote ([])), :doc "Returns a keyword representing the currently pressed key. Modifier\n keys are represented as: :up, :down, :left, :right, :alt, :control,\n :shift, :command, :f1-24"}, :added "1.6", :name quil.core/key-as-keyword, :variadic false, :subcategory "Keyboard", :file "out/quil/core.cljc", :end-column 17, :processing-name nil, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4896, :end-line 4901, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns a keyword representing the currently pressed key. Modifier\n keys are represented as: :up, :down, :left, :right, :alt, :control,\n :shift, :command, :f1-24"}, dist {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 6, :method-params ([x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :arglists ([x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :arglists-meta (nil nil)}, :processing-name "dist()", :column 3, :requires-bindings false, :line 1495, :end-line 1495, :arglists (quote ([x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2])), :doc "Calculates the distance between two points"}, :added "1.0", :name quil.core/dist, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 6, :method-params ([x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :arglists ([x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :arglists-meta (nil nil)}, :processing-name "dist()", :method-params ([x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 1489, :end-line 1495, :max-fixed-arity 6, :fn-var true, :arglists ([x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :doc "Calculates the distance between two points"}, PI {:name quil.core/PI, :file "out/quil/core.cljc", :line 76, :column 10, :end-line 76, :end-column 17, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 76, :column 15, :end-line 76, :end-column 17}, :tag js}, norm {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "norm()", :column 3, :requires-bindings true, :line 2825, :end-line 2825, :arglists (quote ([val start stop])), :doc "Normalize a value to exist between 0 and 1 (inclusive)."}, :added "1.0", :name quil.core/norm, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 7, :processing-name "norm()", :method-params ([val start stop]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2819, :end-line 2825, :max-fixed-arity 3, :fn-var true, :arglists (quote ([val start stop])), :doc "Normalize a value to exist between 0 and 1 (inclusive)."}, end-shape {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Vertex", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [mode]), :arglists ([] [mode]), :arglists-meta (nil nil)}, :processing-name "endShape()", :column 3, :requires-bindings true, :line 1651, :end-line 1651, :arglists (quote ([] [mode])), :doc "May only be called after begin-shape. When end-shape is called,\n all of image data defined since the previous call to begin-shape is\n written into the image buffer. The keyword :close may be passed to\n close the shape (to connect the beginning and the end)."}, :added "1.0", :name quil.core/end-shape, :variadic false, :subcategory "Vertex", :file "out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [mode]), :arglists ([] [mode]), :arglists-meta (nil nil)}, :processing-name "endShape()", :method-params ([] [mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1645, :end-line 1651, :max-fixed-arity 1, :fn-var true, :arglists ([] [mode]), :doc "May only be called after begin-shape. When end-shape is called,\n all of image data defined since the previous call to begin-shape is\n written into the image buffer. The keyword :close may be passed to\n close the shape (to connect the beginning and the end)."}, fill {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "fill()", :column 3, :requires-bindings true, :line 1742, :end-line 1742, :arglists (quote ([rgb] [rgb alpha] [r g b] [r g b a])), :doc "Sets the color used to fill shapes."}, :added "1.0", :name quil.core/fill, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "fill()", :method-params ([rgb] [rgb alpha] [r g b] [r g b a]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 1736, :end-line 1742, :max-fixed-arity 4, :fn-var true, :arglists ([rgb] [rgb alpha] [r g b] [r g b a]), :doc "Sets the color used to fill shapes."}, with-translation {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory "Utility Macros", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 19, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env translation-vector body)], :arglists ([&form &env translation-vector & body]), :arglists-meta (nil)}, :processing-name nil, :column 3, :requires-bindings true, :line 4670, :macro true, :end-line 4670, :arglists (quote ([translation-vector & body])), :doc "Performs body with translation, restores current transformation on\n exit."}, :added "1.0", :name quil.core/with-translation, :variadic true, :subcategory "Utility Macros", :file "out/quil/core.cljc", :end-column 19, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env translation-vector body)], :arglists ([&form &env translation-vector & body]), :arglists-meta (nil)}, :processing-name nil, :method-params [(&form &env translation-vector body)], :protocol-impl nil, :arglists-meta (nil), :column 1, :requires-bindings true, :line 4664, :macro true, :end-line 4670, :max-fixed-arity 3, :fn-var false, :arglists ([&form &env translation-vector & body]), :doc "Performs body with translation, restores current transformation on\n exit."}, reset-matrix {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "resetMatrix()", :column 3, :requires-bindings true, :line 3383, :end-line 3383, :arglists (quote ([])), :doc "Replaces the current matrix with the identity matrix. The\n equivalent function in OpenGL is glLoadIdentity()"}, :added "1.0", :name quil.core/reset-matrix, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 15, :processing-name "resetMatrix()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3377, :end-line 3383, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Replaces the current matrix with the identity matrix. The\n equivalent function in OpenGL is glLoadIdentity()"}, emissive-float {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Material Properties", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 17, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([float-val] [r g b]), :arglists ([float-val] [r g b]), :arglists-meta (nil nil)}, :processing-name "emissive()", :column 3, :requires-bindings true, :line 1566, :end-line 1566, :arglists (quote ([float-val] [r g b])), :doc "Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes. Converts all\n args to floats"}, :added "1.0", :name quil.core/emissive-float, :variadic false, :subcategory "Material Properties", :file "out/quil/core.cljc", :end-column 17, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([float-val] [r g b]), :arglists ([float-val] [r g b]), :arglists-meta (nil nil)}, :processing-name "emissive()", :method-params ([float-val] [r g b]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1560, :end-line 1566, :max-fixed-arity 3, :fn-var true, :arglists ([float-val] [r g b]), :doc "Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes. Converts all\n args to floats"}, shape-modes {:name quil.core/shape-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 47, :end-column 13, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 47, :column 2, :end-line 47, :end-column 13}, :tag cljs.core/IMap}, green {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :processing-name "green()", :column 3, :requires-bindings true, :line 1939, :end-line 1939, :arglists (quote ([col])), :doc "Extracts the green value from a color, scaled to match current\n color-mode. This value is always returned as a float so be careful\n not to assign it to an int value."}, :added "1.0", :name quil.core/green, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 8, :processing-name "green()", :method-params ([col]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1933, :end-line 1939, :max-fixed-arity 1, :fn-var true, :arglists (quote ([col])), :doc "Extracts the green value from a color, scaled to match current\n color-mode. This value is always returned as a float so be careful\n not to assign it to an int value."}, HALF-PI {:name quil.core/HALF-PI, :file "out/quil/core.cljc", :line 77, :column 1, :end-line 77, :end-column 13, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 77, :column 6, :end-line 77, :end-column 13}, :tag number}, begin-contour {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "2.0", :subcategory "Vertex", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :processing-name "beginContour()", :column 3, :requires-bindings true, :line 602, :end-line 602, :arglists (quote ([])), :doc "Use the begin-contour and end-contour function to create negative\n shapes within shapes. These functions can only be within a\n begin-shape/end-shape pair and they only work with the :p2d and :p3d\n renderers."}, :added "2.0", :name quil.core/begin-contour, :variadic false, :subcategory "Vertex", :file "out/quil/core.cljc", :end-column 16, :processing-name "beginContour()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 596, :end-line 602, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Use the begin-contour and end-contour function to create negative\n shapes within shapes. These functions can only be within a\n begin-shape/end-shape pair and they only work with the :p2d and :p3d\n renderers."}, DEG-TO-RAD {:name quil.core/DEG-TO-RAD, :file "out/quil/core.cljc", :line 82, :column 1, :end-line 82, :end-column 16, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 82, :column 6, :end-line 82, :end-column 16}, :tag number}, pow {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "pow()", :column 3, :requires-bindings false, :line 3060, :end-line 3060, :arglists (quote ([num exponent])), :doc "Facilitates exponential expressions. The pow() function is an\n efficient way of multiplying numbers by themselves (or their\n reciprocal) in large quantities. For example, (pow 3 5) is\n equivalent to the expression (* 3 3 3 3 3) and (pow 3 -5) is\n equivalent to (/ 1 (* 3 3 3 3 3))."}, :added "1.0", :name quil.core/pow, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 6, :processing-name "pow()", :method-params ([num exponent]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 3054, :end-line 3060, :max-fixed-arity 2, :fn-var true, :arglists (quote ([num exponent])), :doc "Facilitates exponential expressions. The pow() function is an\n efficient way of multiplying numbers by themselves (or their\n reciprocal) in large quantities. For example, (pow 3 5) is\n equivalent to the expression (* 3 3 3 3 3) and (pow 3 -5) is\n equivalent to (/ 1 (* 3 3 3 3 3))."}, box {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "3D Primitives", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([size] [width height depth]), :arglists ([size] [width height depth]), :arglists-meta (nil nil)}, :processing-name "box()", :column 3, :requires-bindings true, :line 917, :end-line 917, :arglists (quote ([size] [width height depth])), :doc "Creates an extruded rectangle."}, :added "1.0", :name quil.core/box, :variadic false, :subcategory "3D Primitives", :file "out/quil/core.cljc", :end-column 6, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([size] [width height depth]), :arglists ([size] [width height depth]), :arglists-meta (nil nil)}, :processing-name "box()", :method-params ([size] [width height depth]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 911, :end-line 917, :max-fixed-arity 3, :fn-var true, :arglists ([size] [width height depth]), :doc "Creates an extruded rectangle."}, exp {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "exp()", :column 3, :requires-bindings false, :line 1685, :end-line 1685, :arglists (quote ([val])), :doc "Returns Euler's number e (2.71828...) raised to the power of the\n value parameter."}, :added "1.0", :name quil.core/exp, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 6, :processing-name "exp()", :method-params ([val]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 1679, :end-line 1685, :max-fixed-arity 1, :fn-var true, :arglists (quote ([val])), :doc "Returns Euler's number e (2.71828...) raised to the power of the\n value parameter."}, with-sketch {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 190, :column 11, :end-line 190, :end-column 22, :macro true, :arglists (quote ([applet & body])), :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env applet body)], :arglists ([&form &env applet & body]), :arglists-meta (nil)}}, :name quil.core/with-sketch, :variadic true, :file "out/quil/core.cljc", :end-column 22, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env applet body)], :arglists ([&form &env applet & body]), :arglists-meta (nil)}, :method-params [(&form &env applet body)], :protocol-impl nil, :arglists-meta (nil), :column 1, :line 190, :macro true, :end-line 190, :max-fixed-arity 3, :fn-var false, :arglists ([&form &env applet & body])}, text-ascent {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Metrics", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "textAscent()", :column 3, :requires-bindings true, :line 4241, :end-line 4241, :arglists (quote ([])), :doc "Returns the ascent of the current font at its current size. This\n information is useful for determining the height of the font above\n the baseline. For example, adding the text-ascent and text-descent\n values will give you the total height of the line."}, :added "1.0", :name quil.core/text-ascent, :variadic false, :subcategory "Metrics", :file "out/quil/core.cljc", :end-column 14, :processing-name "textAscent()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4235, :end-line 4241, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns the ascent of the current font at its current size. This\n information is useful for determining the height of the font above\n the baseline. For example, adding the text-ascent and text-descent\n values will give you the total height of the line."}, tint-int {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([rgb] [rgb alpha]), :arglists ([rgb] [rgb alpha]), :arglists-meta (nil nil)}, :processing-name "tint()", :column 3, :requires-bindings true, :line 4438, :end-line 4438, :arglists (quote ([rgb] [rgb alpha])), :doc "Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."}, :added "1.0", :name quil.core/tint-int, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([rgb] [rgb alpha]), :arglists ([rgb] [rgb alpha]), :arglists-meta (nil nil)}, :processing-name "tint()", :method-params ([rgb] [rgb alpha]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4432, :end-line 4438, :max-fixed-arity 2, :fn-var true, :arglists ([rgb] [rgb alpha]), :doc "Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."}, shininess {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Material Properties", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "shininess()", :column 3, :requires-bindings true, :line 3850, :end-line 3850, :arglists (quote ([shine])), :doc "Sets the amount of gloss in the surface of shapes. Used in\n combination with ambient, specular, and emissive in setting\n the material properties of shapes."}, :added "1.0", :name quil.core/shininess, :variadic false, :subcategory "Material Properties", :file "out/quil/core.cljc", :end-column 12, :processing-name "shininess()", :method-params ([shine]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3844, :end-line 3850, :max-fixed-arity 1, :fn-var true, :arglists (quote ([shine])), :doc "Sets the amount of gloss in the surface of shapes. Used in\n combination with ambient, specular, and emissive in setting\n the material properties of shapes."}, rect-mode {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "rectMode()", :column 3, :requires-bindings true, :line 3302, :end-line 3302, :arglists (quote ([mode])), :doc "Modifies the location from which rectangles draw. The default mode\n is :corner. Available modes are:\n\n\n :corner - Specifies the location to be the upper left corner of the\n shape and uses the third and fourth parameters of rect to\n specify the width and height.\n\n :corners - Uses the first and second parameters of rect to set the\n location of one corner and uses the third and fourth\n parameters to set the opposite corner.\n\n :center - Draws the image from its center point and uses the third\n and forth parameters of rect to specify the image's width\n and height.\n\n :radius - Draws the image from its center point and uses the third\n and forth parameters of rect() to specify half of the\n image's width and height."}, :added "1.0", :name quil.core/rect-mode, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 12, :processing-name "rectMode()", :method-params ([mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3296, :end-line 3302, :max-fixed-arity 1, :fn-var true, :arglists (quote ([mode])), :doc "Modifies the location from which rectangles draw. The default mode\n is :corner. Available modes are:\n\n\n :corner - Specifies the location to be the upper left corner of the\n shape and uses the third and fourth parameters of rect to\n specify the width and height.\n\n :corners - Uses the first and second parameters of rect to set the\n location of one corner and uses the third and fourth\n parameters to set the opposite corner.\n\n :center - Draws the image from its center point and uses the third\n and forth parameters of rect to specify the image's width\n and height.\n\n :radius - Draws the image from its center point and uses the third\n and forth parameters of rect() to specify half of the\n image's width and height."}, ellipse-mode {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "ellipseMode()", :column 3, :requires-bindings true, :line 1544, :end-line 1544, :arglists (quote ([mode])), :doc "Modifies the origin of the ellispse according to the specified mode:\n\n :center - specifies the location of the ellipse as\n the center of the shape. (Default).\n :radius - similar to center, but the width and height parameters to\n ellipse specify the radius of the ellipse, rather than the\n diameter.\n :corner - draws the shape from the upper-left corner of its bounding\n box.\n :corners - uses the four parameters to ellipse to set two opposing\n corners of the ellipse's bounding box."}, :added "1.0", :name quil.core/ellipse-mode, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 15, :processing-name "ellipseMode()", :method-params ([mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1538, :end-line 1544, :max-fixed-arity 1, :fn-var true, :arglists (quote ([mode])), :doc "Modifies the origin of the ellispse according to the specified mode:\n\n :center - specifies the location of the ellipse as\n the center of the shape. (Default).\n :radius - similar to center, but the width and height parameters to\n ellipse specify the radius of the ellipse, rather than the\n diameter.\n :corner - draws the shape from the upper-left corner of its bounding\n box.\n :corners - uses the four parameters to ellipse to set two opposing\n corners of the ellipse's bounding box."}, month {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Time & Date", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :processing-name "month()", :column 3, :requires-bindings false, :line 2569, :end-line 2569, :arglists (quote ([])), :doc "Returns the current month as a value from 1 - 12."}, :added "1.0", :name quil.core/month, :variadic false, :subcategory "Time & Date", :file "out/quil/core.cljc", :end-column 8, :processing-name "month()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 2563, :end-line 2569, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns the current month as a value from 1 - 12."}, texture-modes {:name quil.core/texture-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 69, :end-column 15, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 69, :column 2, :end-line 69, :end-column 15}, :tag cljs.core/IMap}, tint-float {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([gray] [gray alpha] [r g b] [r g b a]), :arglists ([gray] [gray alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "tint()", :column 3, :requires-bindings true, :line 4413, :end-line 4413, :arglists (quote ([gray] [gray alpha] [r g b] [r g b a])), :doc "Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."}, :added "1.0", :name quil.core/tint-float, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([gray] [gray alpha] [r g b] [r g b a]), :arglists ([gray] [gray alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "tint()", :method-params ([gray] [gray alpha] [r g b] [r g b a]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 4407, :end-line 4413, :max-fixed-arity 4, :fn-var true, :arglists ([gray] [gray alpha] [r g b] [r g b a]), :doc "Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."}, width {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :processing-name "getWidth()", :column 3, :processing-link nil, :requires-bindings true, :line 4620, :end-line 4620, :arglists (quote ([])), :doc "Width of the display window. The value of width is zero until size is\n called."}, :added "1.0", :name quil.core/width, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 8, :processing-name "getWidth()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :processing-link nil, :requires-bindings true, :line 4613, :end-line 4620, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Width of the display window. The value of width is zero until size is\n called."}, background {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "background()", :column 3, :requires-bindings true, :line 550, :end-line 550, :arglists (quote ([rgb] [rgb alpha] [r g b] [r g b a])), :doc "Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts args to floats."}, :added "1.0", :name quil.core/background, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "background()", :method-params ([rgb] [rgb alpha] [r g b] [r g b a]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 544, :end-line 550, :max-fixed-arity 4, :fn-var true, :arglists ([rgb] [rgb alpha] [r g b] [r g b a]), :doc "Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts args to floats."}, ortho {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Camera", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 6, :method-params ([] [left right bottom top] [left right bottom top near far]), :arglists ([] [left right bottom top] [left right bottom top near far]), :arglists-meta (nil nil nil)}, :processing-name "ortho()", :column 3, :requires-bindings true, :line 2888, :end-line 2888, :arglists (quote ([] [left right bottom top] [left right bottom top near far])), :doc "Sets an orthographic projection and defines a parallel clipping\n volume. All objects with the same dimension appear the same size,\n regardless of whether they are near or far from the camera. The\n parameters to this function specify the clipping volume where left\n and right are the minimum and maximum x values, top and bottom are\n the minimum and maximum y values, and near and far are the minimum\n and maximum z values. If no parameters are given, the default is\n used: (ortho 0 width 0 height -10 10)"}, :added "1.0", :name quil.core/ortho, :variadic false, :subcategory "Camera", :file "out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 6, :method-params ([] [left right bottom top] [left right bottom top near far]), :arglists ([] [left right bottom top] [left right bottom top near far]), :arglists-meta (nil nil nil)}, :processing-name "ortho()", :method-params ([] [left right bottom top] [left right bottom top near far]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 2882, :end-line 2888, :max-fixed-arity 6, :fn-var true, :arglists ([] [left right bottom top] [left right bottom top near far]), :doc "Sets an orthographic projection and defines a parallel clipping\n volume. All objects with the same dimension appear the same size,\n regardless of whether they are near or far from the camera. The\n parameters to this function specify the clipping volume where left\n and right are the minimum and maximum x values, top and bottom are\n the minimum and maximum y values, and near and far are the minimum\n and maximum z values. If no parameters are given, the default is\n used: (ortho 0 width 0 height -10 10)"}, hint-options {:name quil.core/hint-options, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 53, :end-column 14, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 53, :column 2, :end-line 53, :end-column 14}, :tag cljs.core/IMap}, prc-println {:category "Output", :protocol-inline nil, :meta {:category "Output", :added "1.0", :subcategory "Text area", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 17, :column 6, :require-bindings true, :line 152, :end-line 152, :arglists (quote ([msg])), :doc "Writes to the text area of the Processing environment's console.\n This is often helpful for looking at the data a program is producing.\n Each call to this function creates a new line of output.\n Individual elements can be separated with quotes (\"\") and joined with the string concatenation operator (+).\n Also writes the content of an array to the text area of the Processing environment.\n This is often helpful for looking at the data a program is producing.\n A new line is put between each element of the array. This function can only print 1D arrays,\n but can test to see if the content are null or not null for 2+ dimensional arrays."}, :added "1.0", :name quil.core/prc-println, :variadic false, :subcategory "Text area", :file "out/quil/core.cljc", :end-column 17, :method-params ([msg]), :protocol-impl nil, :arglists-meta (nil nil), :column 4, :require-bindings true, :line 147, :end-line 152, :max-fixed-arity 1, :fn-var true, :arglists (quote ([msg])), :doc "Writes to the text area of the Processing environment's console.\n This is often helpful for looking at the data a program is producing.\n Each call to this function creates a new line of output.\n Individual elements can be separated with quotes (\"\") and joined with the string concatenation operator (+).\n Also writes the content of an array to the text area of the Processing environment.\n This is often helpful for looking at the data a program is producing.\n A new line is put between each element of the array. This function can only print 1D arrays,\n but can test to see if the content are null or not null for 2+ dimensional arrays."}, brightness {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "brightness()", :column 3, :requires-bindings true, :line 928, :end-line 928, :arglists (quote ([color])), :doc "Extracts the brightness value from a color. Returns a float."}, :added "1.0", :name quil.core/brightness, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 13, :processing-name "brightness()", :method-params ([color]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 922, :end-line 928, :max-fixed-arity 1, :fn-var true, :arglists (quote ([color])), :doc "Extracts the brightness value from a color. Returns a float."}, arc-modes {:name quil.core/arc-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 46, :end-column 11, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 46, :column 2, :end-line 46, :end-column 11}, :tag cljs.core/IMap}, specular {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Material Properties", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([gray] [x y z]), :arglists ([gray] [x y z]), :arglists-meta (nil nil)}, :processing-name "specular()", :column 3, :requires-bindings true, :line 3907, :end-line 3907, :arglists (quote ([gray] [x y z])), :doc "Sets the specular color of the materials used for shapes drawn to\n the screen, which sets the color of hightlights. Specular refers to\n light which bounces off a surface in a perferred direction (rather\n than bouncing in all directions like a diffuse light). Used in\n combination with emissive, ambient, and shininess in setting\n the material properties of shapes."}, :added "1.0", :name quil.core/specular, :variadic false, :subcategory "Material Properties", :file "out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([gray] [x y z]), :arglists ([gray] [x y z]), :arglists-meta (nil nil)}, :processing-name "specular()", :method-params ([gray] [x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3901, :end-line 3907, :max-fixed-arity 3, :fn-var true, :arglists ([gray] [x y z]), :doc "Sets the specular color of the materials used for shapes drawn to\n the screen, which sets the color of hightlights. Specular refers to\n light which bounces off a surface in a perferred direction (rather\n than bouncing in all directions like a diffuse light). Used in\n combination with emissive, ambient, and shininess in setting\n the material properties of shapes."}, save-frame {:category "Output", :protocol-inline nil, :meta {:category "Output", :added "1.0", :subcategory "Image", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [name]), :arglists ([] [name]), :arglists-meta (nil nil)}, :processing-name "saveFrame()", :column 3, :requires-bindings true, :line 3569, :end-line 3569, :arglists (quote ([] [name])), :doc "Saves an image identical to the current display window as a\n file. May be called multple times - each file saved will have a\n unique name. Name and image formate may be modified by passing a\n string parameter of the form \"foo-####.ext\" where foo- can be any\n arbitrary string, #### will be replaced with the current frame id\n and .ext is one of .tiff, .targa, .png, .jpeg or .jpg\n\n Examples:\n (save-frame)\n (save-frame \"pretty-pic-####.jpg\")"}, :added "1.0", :name quil.core/save-frame, :variadic false, :subcategory "Image", :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [name]), :arglists ([] [name]), :arglists-meta (nil nil)}, :processing-name "saveFrame()", :method-params ([] [name]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3563, :end-line 3569, :max-fixed-arity 1, :fn-var true, :arglists ([] [name]), :doc "Saves an image identical to the current display window as a\n file. May be called multple times - each file saved will have a\n unique name. Name and image formate may be modified by passing a\n string parameter of the form \"foo-####.ext\" where foo- can be any\n arbitrary string, #### will be replaced with the current frame id\n and .ext is one of .tiff, .targa, .png, .jpeg or .jpg\n\n Examples:\n (save-frame)\n (save-frame \"pretty-pic-####.jpg\")"}, cursor {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [cursor-mode]), :arglists ([] [cursor-mode]), :arglists-meta (nil nil)}, :processing-name "cursor()", :column 3, :requires-bindings true, :line 1286, :end-line 1286, :arglists (quote ([] [cursor-mode])), :doc "Sets the cursor to a predefined symbol or makes it\n visible if already hidden (after no-cursor was called).\n\n Available modes: :arrow, :cross, :hand, :move, :text, :wait\n\n See cursor-image for specifying a generic image as the cursor\n symbol."}, :added "1.0", :name quil.core/cursor, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [cursor-mode]), :arglists ([] [cursor-mode]), :arglists-meta (nil nil)}, :processing-name "cursor()", :method-params ([] [cursor-mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1280, :end-line 1286, :max-fixed-arity 1, :fn-var true, :arglists ([] [cursor-mode]), :doc "Sets the cursor to a predefined symbol or makes it\n visible if already hidden (after no-cursor was called).\n\n Available modes: :arrow, :cross, :hand, :move, :text, :wait\n\n See cursor-image for specifying a generic image as the cursor\n symbol."}, noise {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Random", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([x] [x y] [x y z]), :arglists ([x] [x y] [x y z]), :arglists-meta (nil nil nil)}, :processing-name "noise()", :column 3, :requires-bindings true, :line 2704, :end-line 2704, :arglists (quote ([x] [x y] [x y z])), :doc "Returns the Perlin noise value at specified coordinates. Perlin\n noise is a random sequence generator producing a more natural\n ordered, harmonic succession of numbers compared to the standard\n random function. It was invented by Ken Perlin in the 1980s and\n been used since in graphical applications to produce procedural\n textures, natural motion, shapes, terrains etc.\n\n The main difference to the random function is that Perlin noise is\n defined in an infinite n-dimensional space where each pair of\n coordinates corresponds to a fixed semi-random value (fixed only for\n the lifespan of the program). The resulting value will always be\n between 0.0 and 1.0. Processing can compute 1D, 2D and 3D noise,\n depending on the number of coordinates given. The noise value can be\n animated by moving through the noise space and the 2nd and 3rd\n dimensions can also be interpreted as time.\n\n The actual noise is structured similar to an audio signal, in\n respect to the function's use of frequencies. Similar to the concept\n of harmonics in physics, perlin noise is computed over several\n octaves which are added together for the final result.\n\n Another way to adjust the character of the resulting sequence is the\n scale of the input coordinates. As the function works within an\n infinite space the value of the coordinates doesn't matter as such,\n only the distance between successive coordinates does (eg. when\n using noise within a loop). As a general rule the smaller the\n difference between coordinates, the smoother the resulting noise\n sequence will be. Steps of 0.005-0.03 work best for most\n applications, but this will differ depending on use."}, :added "1.0", :name quil.core/noise, :variadic false, :subcategory "Random", :file "out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([x] [x y] [x y z]), :arglists ([x] [x y] [x y z]), :arglists-meta (nil nil nil)}, :processing-name "noise()", :method-params ([x] [x y] [x y z]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 2698, :end-line 2704, :max-fixed-arity 3, :fn-var true, :arglists ([x] [x y] [x y z]), :doc "Returns the Perlin noise value at specified coordinates. Perlin\n noise is a random sequence generator producing a more natural\n ordered, harmonic succession of numbers compared to the standard\n random function. It was invented by Ken Perlin in the 1980s and\n been used since in graphical applications to produce procedural\n textures, natural motion, shapes, terrains etc.\n\n The main difference to the random function is that Perlin noise is\n defined in an infinite n-dimensional space where each pair of\n coordinates corresponds to a fixed semi-random value (fixed only for\n the lifespan of the program). The resulting value will always be\n between 0.0 and 1.0. Processing can compute 1D, 2D and 3D noise,\n depending on the number of coordinates given. The noise value can be\n animated by moving through the noise space and the 2nd and 3rd\n dimensions can also be interpreted as time.\n\n The actual noise is structured similar to an audio signal, in\n respect to the function's use of frequencies. Similar to the concept\n of harmonics in physics, perlin noise is computed over several\n octaves which are added together for the final result.\n\n Another way to adjust the character of the resulting sequence is the\n scale of the input coordinates. As the function works within an\n infinite space the value of the coordinates doesn't matter as such,\n only the distance between successive coordinates does (eg. when\n using noise within a loop). As a general rule the smaller the\n difference between coordinates, the smoother the resulting noise\n sequence will be. Steps of 0.005-0.03 work best for most\n applications, but this will differ depending on use."}, push-style {:category "Structure", :protocol-inline nil, :meta {:category "Structure", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "pushStyle()", :column 3, :requires-bindings true, :line 3128, :end-line 3128, :arglists (quote ([])), :doc "Saves the current style settings onto a 'style stack'. Use with\n pop-style which restores the prior settings. Note that these\n functions are always used together. They allow you to change the\n style settings and later return to what you had. When a new style is\n started with push-style, it builds on the current style\n information. The push-style and pop-style fns can be embedded to\n provide more control.\n\n The style information controlled by the following functions are\n included in the style: fill, stroke, tint, stroke-weight,\n stroke-cap, stroke-join, image-mode, rect-mode, ellipse-mode,\n shape-mode, color-mode, text-align, text-font, text-mode, text-size,\n text-leading, emissive, specular, shininess, and ambient"}, :added "1.0", :name quil.core/push-style, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 13, :processing-name "pushStyle()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3122, :end-line 3128, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Saves the current style settings onto a 'style stack'. Use with\n pop-style which restores the prior settings. Note that these\n functions are always used together. They allow you to change the\n style settings and later return to what you had. When a new style is\n started with push-style, it builds on the current style\n information. The push-style and pop-style fns can be embedded to\n provide more control.\n\n The style information controlled by the following functions are\n included in the style: fill, stroke, tint, stroke-weight,\n stroke-cap, stroke-join, image-mode, rect-mode, ellipse-mode,\n shape-mode, color-mode, text-align, text-font, text-mode, text-size,\n text-leading, emissive, specular, shininess, and ambient"}, bezier-vertex {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Vertex", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :top-fn {:variadic false, :max-fixed-arity 9, :method-params ([cx1 cy1 cx2 cy2 x y] [cx1 cy1 cz1 cx2 cy2 cz2 x y z]), :arglists ([cx1 cy1 cx2 cy2 x y] [cx1 cy1 cz1 cx2 cy2 cz2 x y z]), :arglists-meta (nil nil)}, :processing-name "bezierVertex()", :column 3, :requires-bindings true, :line 735, :end-line 735, :arglists (quote ([cx1 cy1 cx2 cy2 x y] [cx1 cy1 cz1 cx2 cy2 cz2 x y z])), :doc "Specifies vertex coordinates for Bezier curves. Each call to\n bezier-vertex defines the position of two control points and one\n anchor point of a Bezier curve, adding a new segment to a line or\n shape. The first time bezier-vertex is used within a begin-shape\n call, it must be prefaced with a call to vertex to set the first\n anchor point. This function must be used between begin-shape and\n end-shape and only when there is no parameter specified to\n begin-shape."}, :added "1.0", :name quil.core/bezier-vertex, :variadic false, :subcategory "Vertex", :file "out/quil/core.cljc", :end-column 16, :top-fn {:variadic false, :max-fixed-arity 9, :method-params ([cx1 cy1 cx2 cy2 x y] [cx1 cy1 cz1 cx2 cy2 cz2 x y z]), :arglists ([cx1 cy1 cx2 cy2 x y] [cx1 cy1 cz1 cx2 cy2 cz2 x y z]), :arglists-meta (nil nil)}, :processing-name "bezierVertex()", :method-params ([cx1 cy1 cx2 cy2 x y] [cx1 cy1 cz1 cx2 cy2 cz2 x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 729, :end-line 735, :max-fixed-arity 9, :fn-var true, :arglists ([cx1 cy1 cx2 cy2 x y] [cx1 cy1 cz1 cx2 cy2 cz2 x y z]), :doc "Specifies vertex coordinates for Bezier curves. Each call to\n bezier-vertex defines the position of two control points and one\n anchor point of a Bezier curve, adding a new segment to a line or\n shape. The first time bezier-vertex is used within a begin-shape\n call, it must be prefaced with a call to vertex to set the first\n anchor point. This function must be used between begin-shape and\n end-shape and only when there is no parameter specified to\n begin-shape."}, light-falloff {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Lights", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :processing-name "lightFalloff()", :column 3, :requires-bindings true, :line 2229, :end-line 2229, :arglists (quote ([constant linear quadratic])), :doc "Sets the falloff rates for point lights, spot lights, and ambient\n lights. The parameters are used to determine the falloff with the\n following equation:\n\n d = distance from light position to vertex position\n falloff = 1 / (CONSTANT + d * LINEAR + (d*d) * QUADRATIC)\n\n Like fill, it affects only the elements which are created after it\n in the code. The default value is (light-falloff 1.0 0.0 0.0).\n Thinking about an ambient light with a falloff can be tricky. It is\n used, for example, if you wanted a region of your scene to be lit\n ambiently one color and another region to be lit ambiently by\n another color, you would use an ambient light with location and\n falloff. You can think of it as a point light that doesn't care\n which direction a surface is facing."}, :added "1.0", :name quil.core/light-falloff, :variadic false, :subcategory "Lights", :file "out/quil/core.cljc", :end-column 16, :processing-name "lightFalloff()", :method-params ([constant linear quadratic]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2223, :end-line 2229, :max-fixed-arity 3, :fn-var true, :arglists (quote ([constant linear quadratic])), :doc "Sets the falloff rates for point lights, spot lights, and ambient\n lights. The parameters are used to determine the falloff with the\n following equation:\n\n d = distance from light position to vertex position\n falloff = 1 / (CONSTANT + d * LINEAR + (d*d) * QUADRATIC)\n\n Like fill, it affects only the elements which are created after it\n in the code. The default value is (light-falloff 1.0 0.0 0.0).\n Thinking about an ambient light with a falloff can be tricky. It is\n used, for example, if you wanted a region of your scene to be lit\n ambiently one color and another region to be lit ambiently by\n another color, you would use an ambient light with location and\n falloff. You can think of it as a point light that doesn't care\n which direction a surface is facing."}, noise-detail {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Random", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([octaves] [octaves falloff]), :arglists ([octaves] [octaves falloff]), :arglists-meta (nil nil)}, :processing-name "noiseDetail()", :column 3, :requires-bindings true, :line 2744, :end-line 2744, :arglists (quote ([octaves] [octaves falloff])), :doc "Adjusts the character and level of detail produced by the Perlin\n noise function. Similar to harmonics in physics, noise is computed\n over several octaves. Lower octaves contribute more to the output\n signal and as such define the overal intensity of the noise, whereas\n higher octaves create finer grained details in the noise\n sequence. By default, noise is computed over 4 octaves with each\n octave contributing exactly half than its predecessor, starting at\n 50% strength for the 1st octave. This falloff amount can be changed\n by adding an additional function parameter. Eg. a falloff factor of\n 0.75 means each octave will now have 75% impact (25% less) of the\n previous lower octave. Any value between 0.0 and 1.0 is valid,\n however note that values greater than 0.5 might result in greater\n than 1.0 values returned by noise.\n\n By changing these parameters, the signal created by the noise\n function can be adapted to fit very specific needs and\n characteristics."}, :added "1.0", :name quil.core/noise-detail, :variadic false, :subcategory "Random", :file "out/quil/core.cljc", :end-column 15, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([octaves] [octaves falloff]), :arglists ([octaves] [octaves falloff]), :arglists-meta (nil nil)}, :processing-name "noiseDetail()", :method-params ([octaves] [octaves falloff]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2738, :end-line 2744, :max-fixed-arity 2, :fn-var true, :arglists ([octaves] [octaves falloff]), :doc "Adjusts the character and level of detail produced by the Perlin\n noise function. Similar to harmonics in physics, noise is computed\n over several octaves. Lower octaves contribute more to the output\n signal and as such define the overal intensity of the noise, whereas\n higher octaves create finer grained details in the noise\n sequence. By default, noise is computed over 4 octaves with each\n octave contributing exactly half than its predecessor, starting at\n 50% strength for the 1st octave. This falloff amount can be changed\n by adding an additional function parameter. Eg. a falloff factor of\n 0.75 means each octave will now have 75% impact (25% less) of the\n previous lower octave. Any value between 0.0 and 1.0 is valid,\n however note that values greater than 0.5 might result in greater\n than 1.0 values returned by noise.\n\n By changing these parameters, the signal created by the noise\n function can be adapted to fit very specific needs and\n characteristics."}, save {:category "Output", :protocol-inline nil, :meta {:category "Output", :added "1.0", :subcategory "Image", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "save()", :column 3, :requires-bindings true, :line 3551, :end-line 3551, :arglists (quote ([filename])), :doc "Saves an image from the display window. Images are saved in TIFF,\n TARGA, JPEG, and PNG format depending on the extension within the\n filename parameter. For example, image.tif will have a TIFF image\n and image.png will save a PNG image. If no extension is included in\n the filename, the image will save in TIFF format and .tif will be\n added to the name. All images saved from the main drawing window\n will be opaque. To save images without a background, use\n create-graphics."}, :added "1.0", :name quil.core/save, :variadic false, :subcategory "Image", :file "out/quil/core.cljc", :end-column 7, :processing-name "save()", :method-params ([filename]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3545, :end-line 3551, :max-fixed-arity 1, :fn-var true, :arglists (quote ([filename])), :doc "Saves an image from the display window. Images are saved in TIFF,\n TARGA, JPEG, and PNG format depending on the extension within the\n filename parameter. For example, image.tif will have a TIFF image\n and image.png will save a PNG image. If no extension is included in\n the filename, the image will save in TIFF format and .tif will be\n added to the name. All images saved from the main drawing window\n will be opaque. To save images without a background, use\n create-graphics."}, curve-point {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Curves", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "curvePoint()", :column 3, :requires-bindings true, :line 1362, :end-line 1362, :arglists (quote ([a b c d t])), :doc "Evalutes the curve at point t for points a, b, c, d. The parameter\n t varies between 0 and 1, a and d are points on the curve, and b c\n and are the control points. This can be done once with the x\n coordinates and a second time with the y coordinates to get the\n location of a curve at t."}, :added "1.0", :name quil.core/curve-point, :variadic false, :subcategory "Curves", :file "out/quil/core.cljc", :end-column 14, :processing-name "curvePoint()", :method-params ([a b c d t]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1356, :end-line 1362, :max-fixed-arity 5, :fn-var true, :arglists (quote ([a b c d t])), :doc "Evalutes the curve at point t for points a, b, c, d. The parameter\n t varies between 0 and 1, a and d are points on the curve, and b c\n and are the control points. This can be done once with the x\n coordinates and a second time with the y coordinates to get the\n location of a curve at t."}, state {:category "State", :protocol-inline nil, :meta {:category "State", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [key]), :arglists ([] [key]), :arglists-meta (nil nil)}, :column 3, :requires-bindings true, :line 215, :end-line 215, :arglists (quote ([] [key])), :doc "Retrieve sketch-specific state by key. Must initially call\n set-state! to store state. If no parameter passed whole\n state map is returned.\n\n (set-state! :foo 1)\n (state :foo) ;=> 1\n (state) ;=> {:foo 1}"}, :added "1.0", :name quil.core/state, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 1, :method-params ([] [key]), :arglists ([] [key]), :arglists-meta (nil nil)}, :method-params ([] [key]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 210, :end-line 215, :max-fixed-arity 1, :fn-var true, :arglists ([] [key]), :doc "Retrieve sketch-specific state by key. Must initially call\n set-state! to store state. If no parameter passed whole\n state map is returned.\n\n (set-state! :foo 1)\n (state :foo) ;=> 1\n (state) ;=> {:foo 1}"}, load-shader {:category "Rendering", :protocol-inline nil, :meta {:category "Rendering", :added "2.0", :subcategory "Shaders", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([fragment-filename] [fragment-filename vertex-filename]), :arglists ([fragment-filename] [fragment-filename vertex-filename]), :arglists-meta (nil nil)}, :processing-name "loadShader()", :column 3, :requires-bindings true, :line 2404, :end-line 2404, :arglists (quote ([fragment-filename] [fragment-filename vertex-filename])), :doc "Loads a shader into the PShader object. Shaders are compatible with the\n P2D and P3D renderers, but not with the default renderer."}, :added "2.0", :name quil.core/load-shader, :variadic false, :subcategory "Shaders", :file "out/quil/core.cljc", :end-column 14, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([fragment-filename] [fragment-filename vertex-filename]), :arglists ([fragment-filename] [fragment-filename vertex-filename]), :arglists-meta (nil nil)}, :processing-name "loadShader()", :method-params ([fragment-filename] [fragment-filename vertex-filename]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2398, :end-line 2404, :max-fixed-arity 2, :fn-var true, :arglists ([fragment-filename] [fragment-filename vertex-filename]), :doc "Loads a shader into the PShader object. Shaders are compatible with the\n P2D and P3D renderers, but not with the default renderer."}, resize {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "2.1.0", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :processing-name "resize()", :column 3, :processing-link "http://processing.org/reference/PImage_resize_.html", :requires-bindings true, :line 3417, :end-line 3417, :arglists (quote ([img w h])), :doc "Resize the image to a new width and height.\n To make the image scale proportionally, use 0 as the value for the wide or\n high parameter. For instance, to make the width of an image 150 pixels,\n and change the height using the same proportion, use resize(150, 0).\n\n Even though a PGraphics is technically a PImage, it is not possible\n to rescale the image data found in a PGraphics.\n (It's simply not possible to do this consistently across renderers:\n technically infeasible with P3D, or what would it even do with PDF?)\n If you want to resize PGraphics content, first get a copy of its image data\n using the get() method, and call resize() on the PImage that is returned."}, :added "2.1.0", :name quil.core/resize, :variadic false, :file "out/quil/core.cljc", :end-column 9, :processing-name "resize()", :method-params ([img w h]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :processing-link "http://processing.org/reference/PImage_resize_.html", :requires-bindings true, :line 3411, :end-line 3417, :max-fixed-arity 3, :fn-var true, :arglists (quote ([img w h])), :doc "Resize the image to a new width and height.\n To make the image scale proportionally, use 0 as the value for the wide or\n high parameter. For instance, to make the width of an image 150 pixels,\n and change the height using the same proportion, use resize(150, 0).\n\n Even though a PGraphics is technically a PImage, it is not possible\n to rescale the image data found in a PGraphics.\n (It's simply not possible to do this consistently across renderers:\n technically infeasible with P3D, or what would it even do with PDF?)\n If you want to resize PGraphics content, first get a copy of its image data\n using the get() method, and call resize() on the PImage that is returned."}, normal {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Lights", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :processing-name "normal()", :column 3, :requires-bindings true, :line 2837, :end-line 2837, :arglists (quote ([nx ny nz])), :doc "Sets the current normal vector. This is for drawing three\n dimensional shapes and surfaces and specifies a vector perpendicular\n to the surface of the shape which determines how lighting affects\n it. Processing attempts to automatically assign normals to shapes,\n but since that's imperfect, this is a better option when you want\n more control. This function is identical to glNormal3f() in OpenGL."}, :added "1.0", :name quil.core/normal, :variadic false, :subcategory "Lights", :file "out/quil/core.cljc", :end-column 9, :processing-name "normal()", :method-params ([nx ny nz]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2831, :end-line 2837, :max-fixed-arity 3, :fn-var true, :arglists (quote ([nx ny nz])), :doc "Sets the current normal vector. This is for drawing three\n dimensional shapes and surfaces and specifies a vector perpendicular\n to the surface of the shape which determines how lighting affects\n it. Processing attempts to automatically assign normals to shapes,\n but since that's imperfect, this is a better option when you want\n more control. This function is identical to glNormal3f() in OpenGL."}, perspective {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Camera", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([] [fovy aspect z-near z-far]), :arglists ([] [fovy aspect z-near z-far]), :arglists-meta (nil nil)}, :processing-name "perspective()", :column 3, :requires-bindings true, :line 2909, :end-line 2909, :arglists (quote ([] [fovy aspect z-near z-far])), :doc "Sets a perspective projection applying foreshortening, making\n distant objects appear smaller than closer ones. The parameters\n define a viewing volume with the shape of truncated pyramid. Objects\n near to the front of the volume appear their actual size, while\n farther objects appear smaller. This projection simulates the\n perspective of the world more accurately than orthographic\n projection. The version of perspective without parameters sets the\n default perspective and the version with four parameters allows the\n programmer to set the area precisely. The default values are:\n perspective(PI/3.0, width/height, cameraZ/10.0, cameraZ*10.0) where\n cameraZ is ((height/2.0) / tan(PI*60.0/360.0));"}, :added "1.0", :name quil.core/perspective, :variadic false, :subcategory "Camera", :file "out/quil/core.cljc", :end-column 14, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([] [fovy aspect z-near z-far]), :arglists ([] [fovy aspect z-near z-far]), :arglists-meta (nil nil)}, :processing-name "perspective()", :method-params ([] [fovy aspect z-near z-far]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2903, :end-line 2909, :max-fixed-arity 4, :fn-var true, :arglists ([] [fovy aspect z-near z-far]), :doc "Sets a perspective projection applying foreshortening, making\n distant objects appear smaller than closer ones. The parameters\n define a viewing volume with the shape of truncated pyramid. Objects\n near to the front of the volume appear their actual size, while\n farther objects appear smaller. This projection simulates the\n perspective of the world more accurately than orthographic\n projection. The version of perspective without parameters sets the\n default perspective and the version with four parameters allows the\n programmer to set the area precisely. The default values are:\n perspective(PI/3.0, width/height, cameraZ/10.0, cameraZ*10.0) where\n cameraZ is ((height/2.0) / tan(PI*60.0/360.0));"}, seconds {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Time & Date", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "second()", :column 3, :requires-bindings false, :line 3684, :end-line 3684, :arglists (quote ([])), :doc "Returns the current second as a value from 0 - 59."}, :added "1.0", :name quil.core/seconds, :variadic false, :subcategory "Time & Date", :file "out/quil/core.cljc", :end-column 10, :processing-name "second()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 3678, :end-line 3684, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns the current second as a value from 0 - 59."}, hint {:category "Rendering", :protocol-inline nil, :meta {:category "Rendering", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "hint()", :column 3, :processing-link nil, :requires-bindings true, :line 1983, :end-line 1983, :arglists (quote ([hint-type])), :doc "Set various hints and hacks for the renderer. This is used to\n handle obscure rendering features that cannot be implemented in a\n consistent manner across renderers. Many options will often graduate\n to standard features instead of hints over time.\n\n Options:\n\n :enable-native-fonts - Use the native version fonts when they are\n installed, rather than the bitmapped version from a .vlw\n file. This is useful with the default (or JAVA2D) renderer\n setting, as it will improve font rendering speed. This is not\n enabled by default, because it can be misleading while testing\n because the type will look great on your machine (because you have\n the font installed) but lousy on others' machines if the identical\n font is unavailable. This option can only be set per-sketch, and\n must be called before any use of text-font.\n\n :disable-native-fonts - Disables native font support.\n\n :disable-depth-test - Disable the zbuffer, allowing you to draw on\n top of everything at will. When depth testing is disabled, items\n will be drawn to the screen sequentially, like a painting. This\n hint is most often used to draw in 3D, then draw in 2D on top of\n it (for instance, to draw GUI controls in 2D on top of a 3D\n interface). Starting in release 0149, this will also clear the\n depth buffer. Restore the default with :enable-depth-test\n but note that with the depth buffer cleared, any 3D drawing that\n happens later in draw will ignore existing shapes on the screen.\n\n :enable-depth-test - Enables the zbuffer.\n\n :enable-depth-sort - Enable primitive z-sorting of triangles and\n lines in :p3d and :opengl rendering modes. This can slow\n performance considerably, and the algorithm is not yet perfect.\n\n :disable-depth-sort - Disables hint :enable-depth-sort\n\n :disable-opengl-errors - Speeds up the OPENGL renderer setting\n by not checking for errors while running.\n\n :enable-opengl-errors - Turns on OpenGL error checking\n\n :enable-depth-mask\n :disable-depth-mask\n\n :enable-optimized-stroke\n :disable-optimized-stroke\n :enable-retina-pixels\n :disable-retina-pixels\n :enable-stroke-perspective\n :disable-stroke-perspective\n :enable-stroke-pure\n :disable-stroke-pure\n :enable-texture-mipmaps\n :disable-texture-mipmaps\n"}, :added "1.0", :name quil.core/hint, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 7, :processing-name "hint()", :method-params ([hint-type]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :processing-link nil, :requires-bindings true, :line 1976, :end-line 1983, :max-fixed-arity 1, :fn-var true, :arglists (quote ([hint-type])), :doc "Set various hints and hacks for the renderer. This is used to\n handle obscure rendering features that cannot be implemented in a\n consistent manner across renderers. Many options will often graduate\n to standard features instead of hints over time.\n\n Options:\n\n :enable-native-fonts - Use the native version fonts when they are\n installed, rather than the bitmapped version from a .vlw\n file. This is useful with the default (or JAVA2D) renderer\n setting, as it will improve font rendering speed. This is not\n enabled by default, because it can be misleading while testing\n because the type will look great on your machine (because you have\n the font installed) but lousy on others' machines if the identical\n font is unavailable. This option can only be set per-sketch, and\n must be called before any use of text-font.\n\n :disable-native-fonts - Disables native font support.\n\n :disable-depth-test - Disable the zbuffer, allowing you to draw on\n top of everything at will. When depth testing is disabled, items\n will be drawn to the screen sequentially, like a painting. This\n hint is most often used to draw in 3D, then draw in 2D on top of\n it (for instance, to draw GUI controls in 2D on top of a 3D\n interface). Starting in release 0149, this will also clear the\n depth buffer. Restore the default with :enable-depth-test\n but note that with the depth buffer cleared, any 3D drawing that\n happens later in draw will ignore existing shapes on the screen.\n\n :enable-depth-test - Enables the zbuffer.\n\n :enable-depth-sort - Enable primitive z-sorting of triangles and\n lines in :p3d and :opengl rendering modes. This can slow\n performance considerably, and the algorithm is not yet perfect.\n\n :disable-depth-sort - Disables hint :enable-depth-sort\n\n :disable-opengl-errors - Speeds up the OPENGL renderer setting\n by not checking for errors while running.\n\n :enable-opengl-errors - Turns on OpenGL error checking\n\n :enable-depth-mask\n :disable-depth-mask\n\n :enable-optimized-stroke\n :disable-optimized-stroke\n :enable-retina-pixels\n :disable-retina-pixels\n :enable-stroke-perspective\n :disable-stroke-perspective\n :enable-stroke-pure\n :disable-stroke-pure\n :enable-texture-mipmaps\n :disable-texture-mipmaps\n"}, sphere-detail {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "3D Primitives", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([res] [ures vres]), :arglists ([res] [ures vres]), :arglists-meta (nil nil)}, :processing-name "sphereDetail()", :column 3, :requires-bindings true, :line 3933, :end-line 3933, :arglists (quote ([res] [ures vres])), :doc "Controls the detail used to render a sphere by adjusting the number\n of vertices of the sphere mesh. The default resolution is 30, which\n creates a fairly detailed sphere definition with vertices every\n 360/30 = 12 degrees. If you're going to render a great number of\n spheres per frame, it is advised to reduce the level of detail using\n this function. The setting stays active until sphere-detail is\n called again with a new parameter and so should not be called prior\n to every sphere statement, unless you wish to render spheres with\n different settings, e.g. using less detail for smaller spheres or\n ones further away from the camera. To controla the detail of the\n horizontal and vertical resolution independently, use the version of\n the functions with two parameters."}, :added "1.0", :name quil.core/sphere-detail, :variadic false, :subcategory "3D Primitives", :file "out/quil/core.cljc", :end-column 16, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([res] [ures vres]), :arglists ([res] [ures vres]), :arglists-meta (nil nil)}, :processing-name "sphereDetail()", :method-params ([res] [ures vres]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3927, :end-line 3933, :max-fixed-arity 2, :fn-var true, :arglists ([res] [ures vres]), :doc "Controls the detail used to render a sphere by adjusting the number\n of vertices of the sphere mesh. The default resolution is 30, which\n creates a fairly detailed sphere definition with vertices every\n 360/30 = 12 degrees. If you're going to render a great number of\n spheres per frame, it is advised to reduce the level of detail using\n this function. The setting stays active until sphere-detail is\n called again with a new parameter and so should not be called prior\n to every sphere statement, unless you wish to render spheres with\n different settings, e.g. using less detail for smaller spheres or\n ones further away from the camera. To controla the detail of the\n horizontal and vertical resolution independently, use the version of\n the functions with two parameters."}, vertex {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Vertex", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([x y] [x y z] [x y u v] [x y z u v]), :arglists ([x y] [x y z] [x y u v] [x y z u v]), :arglists-meta (nil nil nil nil)}, :processing-name "vertex()", :column 3, :requires-bindings true, :line 4580, :end-line 4580, :arglists (quote ([x y] [x y z] [x y u v] [x y z u v])), :doc "All shapes are constructed by connecting a series of\n vertices. vertex is used to specify the vertex coordinates for\n points, lines, triangles, quads, and polygons and is used\n exclusively within the begin-shape and end-shape fns.\n\n Drawing a vertex in 3D using the z parameter requires the :p3d or\n :opengl renderers to be used.\n\n This function is also used to map a texture onto the geometry. The\n texture fn declares the texture to apply to the geometry and the u\n and v coordinates set define the mapping of this texture to the\n form. By default, the coordinates used for u and v are specified in\n relation to the image's size in pixels, but this relation can be\n changed with texture-mode."}, :added "1.0", :name quil.core/vertex, :variadic false, :subcategory "Vertex", :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([x y] [x y z] [x y u v] [x y z u v]), :arglists ([x y] [x y z] [x y u v] [x y z u v]), :arglists-meta (nil nil nil nil)}, :processing-name "vertex()", :method-params ([x y] [x y z] [x y u v] [x y z u v]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 4574, :end-line 4580, :max-fixed-arity 5, :fn-var true, :arglists ([x y] [x y z] [x y u v] [x y z u v]), :doc "All shapes are constructed by connecting a series of\n vertices. vertex is used to specify the vertex coordinates for\n points, lines, triangles, quads, and polygons and is used\n exclusively within the begin-shape and end-shape fns.\n\n Drawing a vertex in 3D using the z parameter requires the :p3d or\n :opengl renderers to be used.\n\n This function is also used to map a texture onto the geometry. The\n texture fn declares the texture to apply to the geometry and the u\n and v coordinates set define the mapping of this texture to the\n form. By default, the coordinates used for u and v are specified in\n relation to the image's size in pixels, but this relation can be\n changed with texture-mode."}, delay-frame {:category "Structure", :protocol-inline nil, :meta {:category "Structure", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "delay()", :column 3, :processing-link nil, :requires-bindings true, :line 1456, :end-line 1456, :arglists (quote ([freeze-ms])), :doc "Forces the program to stop running for a specified time. Delay\n times are specified in thousandths of a second, therefore the\n function call (delay 3000) will stop the program for three\n seconds. Because the screen is updated only at the end of draw,\n the program may appear to 'freeze', because the screen will not\n update when the delay fn is used. This function has no affect\n inside setup."}, :added "1.0", :name quil.core/delay-frame, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 14, :processing-name "delay()", :method-params ([freeze-ms]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :processing-link nil, :requires-bindings true, :line 1449, :end-line 1456, :max-fixed-arity 1, :fn-var true, :arglists (quote ([freeze-ms])), :doc "Forces the program to stop running for a specified time. Delay\n times are specified in thousandths of a second, therefore the\n function call (delay 3000) will stop the program for three\n seconds. Because the screen is updated only at the end of draw,\n the program may appear to 'freeze', because the screen will not\n update when the delay fn is used. This function has no affect\n inside setup."}, horizontal-alignment-modes {:name quil.core/horizontal-alignment-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 66, :end-column 28, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 66, :column 2, :end-line 66, :end-column 28}, :tag cljs.core/IMap}, spot-light {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Lights", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 11, :method-params ([r g b x y z nx ny nz angle concentration] [[r g b] [x y z] [nx ny nz] angle concentration]), :arglists ([r g b x y z nx ny nz angle concentration] [[r g b] [x y z] [nx ny nz] angle concentration]), :arglists-meta (nil nil)}, :processing-name "spotLight()", :column 3, :requires-bindings true, :line 3955, :end-line 3955, :arglists (quote ([r g b x y z nx ny nz angle concentration] [[r g b] [x y z] [nx ny nz] angle concentration])), :doc "Adds a spot light. Lights need to be included in the draw to\n remain persistent in a looping program. Placing them in the setup\n of a looping program will cause them to only have an effect the\n first time through the loop. The affect of the r, g, and b\n parameters is determined by the current color mode. The x, y, and z\n parameters specify the position of the light and nx, ny, nz specify\n the direction or light. The angle parameter affects angle of the\n spotlight cone."}, :added "1.0", :name quil.core/spot-light, :variadic false, :subcategory "Lights", :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic false, :max-fixed-arity 11, :method-params ([r g b x y z nx ny nz angle concentration] [[r g b] [x y z] [nx ny nz] angle concentration]), :arglists ([r g b x y z nx ny nz angle concentration] [[r g b] [x y z] [nx ny nz] angle concentration]), :arglists-meta (nil nil)}, :processing-name "spotLight()", :method-params ([r g b x y z nx ny nz angle concentration] [[r g b] [x y z] [nx ny nz] angle concentration]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3949, :end-line 3955, :max-fixed-arity 11, :fn-var true, :arglists ([r g b x y z nx ny nz angle concentration] [[r g b] [x y z] [nx ny nz] angle concentration]), :doc "Adds a spot light. Lights need to be included in the draw to\n remain persistent in a looping program. Placing them in the setup\n of a looping program will cause them to only have an effect the\n first time through the loop. The affect of the r, g, and b\n parameters is determined by the current color mode. The x, y, and z\n parameters specify the position of the light and nx, ny, nz specify\n the direction or light. The angle parameter affects angle of the\n spotlight cone."}, target-frame-rate {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.5.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 20, :column 3, :requires-bindings true, :line 4126, :end-line 4126, :arglists (quote ([])), :doc "Returns the target framerate specified with the fn frame-rate"}, :added "1.5.0", :name quil.core/target-frame-rate, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 20, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4121, :end-line 4126, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns the target framerate specified with the fn frame-rate"}, tint {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "tint()", :column 3, :requires-bindings true, :line 4461, :end-line 4461, :arglists (quote ([rgb] [rgb alpha] [r g b] [r g b a])), :doc "Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."}, :added "1.0", :name quil.core/tint, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists ([rgb] [rgb alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "tint()", :method-params ([rgb] [rgb alpha] [r g b] [r g b a]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 4455, :end-line 4461, :max-fixed-arity 4, :fn-var true, :arglists ([rgb] [rgb alpha] [r g b] [r g b a]), :doc "Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."}, bezier-tangent {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Curves", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 17, :processing-name "bezierTangent()", :column 3, :requires-bindings true, :line 722, :end-line 722, :arglists (quote ([a b c d t])), :doc "Calculates the tangent of a point on a Bezier curve.\n (See http://en.wikipedia.org/wiki/Tangent)"}, :added "1.0", :name quil.core/bezier-tangent, :variadic false, :subcategory "Curves", :file "out/quil/core.cljc", :end-column 17, :processing-name "bezierTangent()", :method-params ([a b c d t]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 716, :end-line 722, :max-fixed-arity 5, :fn-var true, :arglists (quote ([a b c d t])), :doc "Calculates the tangent of a point on a Bezier curve.\n (See http://en.wikipedia.org/wiki/Tangent)"}, asin {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Trigonometry", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "asin()", :column 3, :requires-bindings false, :line 444, :end-line 444, :arglists (quote ([n])), :doc "The inverse of sin, returns the arc sine of a value. This function\n expects the values in the range of -1 to 1 and values are returned\n in the range -PI/2 to PI/2."}, :added "1.0", :name quil.core/asin, :variadic false, :subcategory "Trigonometry", :file "out/quil/core.cljc", :end-column 7, :processing-name "asin()", :method-params ([n]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 438, :end-line 444, :max-fixed-arity 1, :fn-var true, :arglists (quote ([n])), :doc "The inverse of sin, returns the arc sine of a value. This function\n expects the values in the range of -1 to 1 and values are returned\n in the range -PI/2 to PI/2."}, lerp {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "lerp()", :column 3, :requires-bindings false, :line 2268, :end-line 2268, :arglists (quote ([start stop amt])), :doc "Calculates a number between two numbers at a specific\n increment. The amt parameter is the amount to interpolate between\n the two values where 0.0 equal to the first point, 0.1 is very near\n the first point, 0.5 is half-way in between, etc. The lerp function\n is convenient for creating motion along a straight path and for\n drawing dotted lines."}, :added "1.0", :name quil.core/lerp, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 7, :processing-name "lerp()", :method-params ([start stop amt]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 2262, :end-line 2268, :max-fixed-arity 3, :fn-var true, :arglists (quote ([start stop amt])), :doc "Calculates a number between two numbers at a specific\n increment. The amt parameter is the amount to interpolate between\n the two values where 0.0 equal to the first point, 0.1 is very near\n the first point, 0.5 is half-way in between, etc. The lerp function\n is convenient for creating motion along a straight path and for\n drawing dotted lines."}, unhex {:category "Data", :protocol-inline nil, :meta {:category "Data", :require-binding false, :subcategory "Conversion", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :processing-name "hex()", :column 3, :line 4538, :end-line 4538, :arglists (quote ([hex-str])), :doc "Converts a String representation of a hexadecimal number to its\n equivalent integer value."}, :require-binding false, :name quil.core/unhex, :variadic false, :subcategory "Conversion", :file "out/quil/core.cljc", :end-column 8, :processing-name "hex()", :method-params ([hex-str]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 4533, :end-line 4538, :max-fixed-arity 1, :fn-var true, :arglists (quote ([hex-str])), :doc "Converts a String representation of a hexadecimal number to its\n equivalent integer value."}, begin-camera {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Camera", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "beginCamera()", :column 3, :requires-bindings true, :line 585, :end-line 585, :arglists (quote ([])), :doc "Sets the matrix mode to the camera matrix so calls such as\n translate, rotate, apply-matrix and reset-matrix affect the\n camera. begin-camera should always be used with a following\n end-camera and pairs of begin-camera and end-camera cannot be\n nested.\n\n For most situations the camera function will be sufficient."}, :added "1.0", :name quil.core/begin-camera, :variadic false, :subcategory "Camera", :file "out/quil/core.cljc", :end-column 15, :processing-name "beginCamera()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 579, :end-line 585, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Sets the matrix mode to the camera matrix so calls such as\n translate, rotate, apply-matrix and reset-matrix affect the\n camera. begin-camera should always be used with a following\n end-camera and pairs of begin-camera and end-camera cannot be\n nested.\n\n For most situations the camera function will be sufficient."}, text-num {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([num x y] [num x y z]), :arglists ([num x y] [num x y z]), :arglists-meta (nil nil)}, :processing-name "text()", :column 3, :requires-bindings true, :line 4160, :end-line 4160, :arglists (quote ([num x y] [num x y z])), :doc "Draws a number to the screen in the specified position. See text fn\n for more details."}, :added "1.0", :name quil.core/text-num, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([num x y] [num x y z]), :arglists ([num x y] [num x y z]), :arglists-meta (nil nil)}, :processing-name "text()", :method-params ([num x y] [num x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4154, :end-line 4160, :max-fixed-arity 4, :fn-var true, :arglists ([num x y] [num x y z]), :doc "Draws a number to the screen in the specified position. See text fn\n for more details."}, round {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :processing-name "round()", :column 3, :requires-bindings false, :line 3527, :end-line 3527, :arglists (quote ([val])), :doc "Calculates the integer closest to the value parameter. For example,\n (round 9.2) returns the value 9."}, :added "1.0", :name quil.core/round, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 8, :processing-name "round()", :method-params ([val]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 3521, :end-line 3527, :max-fixed-arity 1, :fn-var true, :arglists (quote ([val])), :doc "Calculates the integer closest to the value parameter. For example,\n (round 9.2) returns the value 9."}, background-image {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 19, :processing-name "background()", :column 3, :requires-bindings true, :line 572, :end-line 572, :arglists (quote ([img])), :doc "Specify an image to be used as the background for a sketch. Its\n width and height must be the same size as the sketch window. Images\n used as background will ignore the current tint setting."}, :added "1.0", :name quil.core/background-image, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 19, :processing-name "background()", :method-params ([img]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 566, :end-line 572, :max-fixed-arity 1, :fn-var true, :arglists (quote ([img])), :doc "Specify an image to be used as the background for a sketch. Its\n width and height must be the same size as the sketch window. Images\n used as background will ignore the current tint setting."}, load-shape {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "loadShape()", :column 3, :requires-bindings true, :line 2418, :end-line 2418, :arglists (quote ([filename])), :doc "Load a geometry from a file as a PShape."}, :added "1.0", :name quil.core/load-shape, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 13, :processing-name "loadShape()", :method-params ([filename]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2412, :end-line 2418, :max-fixed-arity 1, :fn-var true, :arglists (quote ([filename])), :doc "Load a geometry from a file as a PShape."}, vertical-alignment-modes {:name quil.core/vertical-alignment-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 67, :end-column 26, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 67, :column 2, :end-line 67, :end-column 26}, :tag cljs.core/IMap}, blend-color {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "blendColor()", :column 3, :processing-link nil, :requires-bindings false, :line 828, :end-line 828, :arglists (quote ([c1 c2 mode])), :doc "Blends two color values together based on the blending mode given specified\n with the mode keyword.\n\n Available blend modes are:\n\n :blend - linear interpolation of colours: C = A*factor + B\n :add - additive blending with white clip:\n C = min(A*factor + B, 255)\n :subtract - subtractive blending with black clip:\n C = max(B - A*factor, 0)\n :darkest - only the darkest colour succeeds:\n C = min(A*factor, B)\n :lightest - only the lightest colour succeeds:\n C = max(A*factor, B)\n :difference - subtract colors from underlying image.\n :exclusion - similar to :difference, but less extreme.\n :multiply - Multiply the colors, result will always be darker.\n :screen - Opposite multiply, uses inverse values of the colors.\n :overlay - A mix of :multiply and :screen. Multiplies dark values\n and screens light values.\n :hard-light - :screen when greater than 50% gray, :multiply when\n lower.\n :soft-light - Mix of :darkest and :lightest. Works like :overlay,\n but not as harsh.\n :dodge - Lightens light tones and increases contrast, ignores\n darks.\n Called \"Color Dodge\" in Illustrator and Photoshop.\n :burn - Darker areas are applied, increasing contrast, ignores\n lights. Called \"Color Burn\" in Illustrator and\n Photoshop."}, :added "1.0", :name quil.core/blend-color, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 14, :processing-name "blendColor()", :method-params ([c1 c2 mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :processing-link nil, :requires-bindings false, :line 821, :end-line 828, :max-fixed-arity 3, :fn-var true, :arglists (quote ([c1 c2 mode])), :doc "Blends two color values together based on the blending mode given specified\n with the mode keyword.\n\n Available blend modes are:\n\n :blend - linear interpolation of colours: C = A*factor + B\n :add - additive blending with white clip:\n C = min(A*factor + B, 255)\n :subtract - subtractive blending with black clip:\n C = max(B - A*factor, 0)\n :darkest - only the darkest colour succeeds:\n C = min(A*factor, B)\n :lightest - only the lightest colour succeeds:\n C = max(A*factor, B)\n :difference - subtract colors from underlying image.\n :exclusion - similar to :difference, but less extreme.\n :multiply - Multiply the colors, result will always be darker.\n :screen - Opposite multiply, uses inverse values of the colors.\n :overlay - A mix of :multiply and :screen. Multiplies dark values\n and screens light values.\n :hard-light - :screen when greater than 50% gray, :multiply when\n lower.\n :soft-light - Mix of :darkest and :lightest. Works like :overlay,\n but not as harsh.\n :dodge - Lightens light tones and increases contrast, ignores\n darks.\n Called \"Color Dodge\" in Illustrator and Photoshop.\n :burn - Darker areas are applied, increasing contrast, ignores\n lights. Called \"Color Burn\" in Illustrator and\n Photoshop."}, QUARTER-PI {:name quil.core/QUARTER-PI, :file "out/quil/core.cljc", :line 79, :column 1, :end-line 79, :end-column 16, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 79, :column 6, :end-line 79, :end-column 16}, :tag number}, stroke-cap {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "strokeCap()", :column 3, :requires-bindings true, :line 4064, :end-line 4064, :arglists (quote ([cap-mode])), :doc "Sets the style for rendering line endings. These ends are either\n squared, extended, or rounded and specified with the corresponding\n parameters :square, :project, and :round. The default cap is :round."}, :added "1.0", :name quil.core/stroke-cap, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 13, :processing-name "strokeCap()", :method-params ([cap-mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4058, :end-line 4064, :max-fixed-arity 1, :fn-var true, :arglists (quote ([cap-mode])), :doc "Sets the style for rendering line endings. These ends are either\n squared, extended, or rounded and specified with the corresponding\n parameters :square, :project, and :round. The default cap is :round."}, blend-modes {:name quil.core/blend-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 48, :end-column 13, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 48, :column 2, :end-line 48, :end-column 13}, :tag cljs.core/IMap}, no-fill {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "noFill()", :column 3, :requires-bindings true, :line 2666, :end-line 2666, :arglists (quote ([])), :doc "Disables filling geometry. If both no-stroke and no-fill are called,\n nothing will be drawn to the screen."}, :added "1.0", :name quil.core/no-fill, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 10, :processing-name "noFill()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2660, :end-line 2666, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Disables filling geometry. If both no-stroke and no-fill are called,\n nothing will be drawn to the screen."}, year {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Time & Date", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "year()", :column 3, :requires-bindings false, :line 4607, :end-line 4607, :arglists (quote ([])), :doc "Returns the current year as an integer (2003, 2004, 2005, etc)."}, :added "1.0", :name quil.core/year, :variadic false, :subcategory "Time & Date", :file "out/quil/core.cljc", :end-column 7, :processing-name "year()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 4601, :end-line 4607, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns the current year as an integer (2003, 2004, 2005, etc)."}, key-coded? {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.6", :subcategory "Keyboard", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name nil, :column 3, :requires-bindings false, :line 4887, :end-line 4887, :arglists (quote ([c])), :doc "Returns true if char c is a 'coded' char i.e. it is necessary to\n fetch the key-code as an integer and use that to determine the\n specific key pressed. See key-keyword."}, :added "1.6", :name quil.core/key-coded?, :variadic false, :subcategory "Keyboard", :file "out/quil/core.cljc", :end-column 13, :processing-name nil, :method-params ([c]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 4882, :end-line 4887, :max-fixed-arity 1, :fn-var true, :arglists (quote ([c])), :doc "Returns true if char c is a 'coded' char i.e. it is necessary to\n fetch the key-code as an integer and use that to determine the\n specific key pressed. See key-keyword."}, curve-tangent {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Curves", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :processing-name "curveTangent()", :column 3, :requires-bindings true, :line 1377, :end-line 1377, :arglists (quote ([a b c d t])), :doc "Calculates the tangent of a point on a curve.\n See: http://en.wikipedia.org/wiki/Tangent"}, :added "1.0", :name quil.core/curve-tangent, :variadic false, :subcategory "Curves", :file "out/quil/core.cljc", :end-column 16, :processing-name "curveTangent()", :method-params ([a b c d t]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1371, :end-line 1377, :max-fixed-arity 5, :fn-var true, :arglists (quote ([a b c d t])), :doc "Calculates the tangent of a point on a curve.\n See: http://en.wikipedia.org/wiki/Tangent"}, ellipse-modes {:name quil.core/ellipse-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 52, :end-column 15, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 52, :column 2, :end-line 52, :end-column 15}, :tag cljs.core/IMap}, pmouse-y {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Mouse", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :processing-name "pmouseY", :column 3, :requires-bindings true, :line 2984, :end-line 2984, :arglists (quote ([])), :doc "Vertical coordinate of the mouse in the previous frame"}, :added "1.0", :name quil.core/pmouse-y, :variadic false, :subcategory "Mouse", :file "out/quil/core.cljc", :end-column 11, :processing-name "pmouseY", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2978, :end-line 2984, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Vertical coordinate of the mouse in the previous frame"}, hex {:category "Data", :protocol-inline nil, :meta {:category "Data", :require-binding false, :subcategory "Conversion", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([val] [val num-digits]), :arglists ([val] [val num-digits]), :arglists-meta (nil nil)}, :processing-name "hex()", :column 3, :line 1951, :end-line 1951, :arglists (quote ([val] [val num-digits])), :doc "Converts a byte, char, int, or color to a String containing the\n equivalent hexadecimal notation. For example color(0, 102, 153) will\n convert to the String \"FF006699\". This function can help make your\n geeky debugging sessions much happier. "}, :require-binding false, :name quil.core/hex, :variadic false, :subcategory "Conversion", :file "out/quil/core.cljc", :end-column 6, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([val] [val num-digits]), :arglists ([val] [val num-digits]), :arglists-meta (nil nil)}, :processing-name "hex()", :method-params ([val] [val num-digits]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 1946, :end-line 1951, :max-fixed-arity 2, :fn-var true, :arglists ([val] [val num-digits]), :doc "Converts a byte, char, int, or color to a String containing the\n equivalent hexadecimal notation. For example color(0, 102, 153) will\n convert to the String \"FF006699\". This function can help make your\n geeky debugging sessions much happier. "}, with-fill {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.7", :subcategory "Utility Macros", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env fill-args body)], :arglists ([&form &env fill-args & body]), :arglists-meta (nil)}, :processing-name nil, :column 4, :requires-bindings true, :line 4632, :macro true, :end-line 4632, :arglists (quote ([fill-args & body])), :doc "Temporarily set the fill color for the body of this macro.\n The code outside of with-fill form will have the previous fill color set.\n\n The fill color has to be in a vector!\n Example: (with-fill [255] ...)\n (with-fill [10 80 98] ...)"}, :added "1.7", :name quil.core/with-fill, :variadic true, :subcategory "Utility Macros", :file "out/quil/core.cljc", :end-column 13, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env fill-args body)], :arglists ([&form &env fill-args & body]), :arglists-meta (nil)}, :processing-name nil, :method-params [(&form &env fill-args body)], :protocol-impl nil, :arglists-meta (nil), :column 1, :requires-bindings true, :line 4626, :macro true, :end-line 4632, :max-fixed-arity 3, :fn-var false, :arglists ([&form &env fill-args & body]), :doc "Temporarily set the fill color for the body of this macro.\n The code outside of with-fill form will have the previous fill color set.\n\n The fill color has to be in a vector!\n Example: (with-fill [255] ...)\n (with-fill [10 80 98] ...)"}, no-cursor {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "noCursor()", :column 3, :requires-bindings true, :line 2654, :end-line 2654, :arglists (quote ([])), :doc "Hides the cursor from view. Will not work when running the in full\n screen (Present) mode."}, :added "1.0", :name quil.core/no-cursor, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 12, :processing-name "noCursor()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2648, :end-line 2654, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Hides the cursor from view. Will not work when running the in full\n screen (Present) mode."}, create-font {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([name size] [name size smooth] [name size smooth charset]), :arglists ([name size] [name size smooth] [name size smooth charset]), :arglists-meta (nil nil nil)}, :processing-name "createFont()", :column 3, :requires-bindings true, :line 1167, :end-line 1167, :arglists (quote ([name size] [name size smooth] [name size smooth charset])), :doc "Dynamically converts a font to the format used by Processing (a\n PFont) from either a font name that's installed on the computer, or\n from a .ttf or .otf file inside the sketches 'data' folder. This\n function is an advanced feature for precise control.\n\n Use available-fonts to obtain the names for the fonts recognized by\n the computer and are compatible with this function.\n\n The size parameter states the font size you want to generate. The\n smooth parameter specifies if the font should be antialiased or not,\n and the charset parameter is an array of chars that specifies the\n characters to generate.\n\n This function creates a bitmapped version of a font It loads a font\n by name, and converts it to a series of images based on the size of\n the font. When possible, the text function will use a native font\n rather than the bitmapped version created behind the scenes with\n create-font. For instance, when using the default renderer\n setting (JAVA2D), the actual native version of the font will be\n employed by the sketch, improving drawing quality and\n performance. With the :p2d, :p3d, and :opengl renderer settings, the\n bitmapped version will be used. While this can drastically improve\n speed and appearance, results are poor when exporting if the sketch\n does not include the .otf or .ttf file, and the requested font is\n not available on the machine running the sketch."}, :added "1.0", :name quil.core/create-font, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 14, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([name size] [name size smooth] [name size smooth charset]), :arglists ([name size] [name size smooth] [name size smooth charset]), :arglists-meta (nil nil nil)}, :processing-name "createFont()", :method-params ([name size] [name size smooth] [name size smooth charset]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 1161, :end-line 1167, :max-fixed-arity 4, :fn-var true, :arglists ([name size] [name size smooth] [name size smooth charset]), :doc "Dynamically converts a font to the format used by Processing (a\n PFont) from either a font name that's installed on the computer, or\n from a .ttf or .otf file inside the sketches 'data' folder. This\n function is an advanced feature for precise control.\n\n Use available-fonts to obtain the names for the fonts recognized by\n the computer and are compatible with this function.\n\n The size parameter states the font size you want to generate. The\n smooth parameter specifies if the font should be antialiased or not,\n and the charset parameter is an array of chars that specifies the\n characters to generate.\n\n This function creates a bitmapped version of a font It loads a font\n by name, and converts it to a series of images based on the size of\n the font. When possible, the text function will use a native font\n rather than the bitmapped version created behind the scenes with\n create-font. For instance, when using the default renderer\n setting (JAVA2D), the actual native version of the font will be\n employed by the sketch, improving drawing quality and\n performance. With the :p2d, :p3d, and :opengl renderer settings, the\n bitmapped version will be used. While this can drastically improve\n speed and appearance, results are poor when exporting if the sketch\n does not include the .otf or .ttf file, and the requested font is\n not available on the machine running the sketch."}, current-graphics {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "2.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 19, :column 3, :requires-bindings true, :line 32, :end-line 32, :tag PGraphics, :arglists (quote ([])), :doc "Graphics currently used for drawing. By default it is sketch graphics,\n but if called inside with-graphics macro - graphics passed to the macro\n is returned. This method should be used if you need to call some methods\n that are not implemented by quil. Example:\n (.beginDraw (current-graphics))."}, :added "2.0", :name quil.core/current-graphics, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 19, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 26, :ret-tag PGraphics, :end-line 32, :max-fixed-arity 0, :tag PGraphics, :fn-var true, :arglists (quote ([])), :doc "Graphics currently used for drawing. By default it is sketch graphics,\n but if called inside with-graphics macro - graphics passed to the macro\n is returned. This method should be used if you need to call some methods\n that are not implemented by quil. Example:\n (.beginDraw (current-graphics))."}, abs {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Calculation", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "abs()", :column 3, :requires-bindings false, :line 281, :end-line 281, :arglists (quote ([n])), :doc "Calculates the absolute value (magnitude) of a number. The\n absolute value of a number is always positive. Dynamically casts to\n an int or float appropriately"}, :added "1.0", :name quil.core/abs, :variadic false, :subcategory "Calculation", :file "out/quil/core.cljc", :end-column 6, :processing-name "abs()", :method-params ([n]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 275, :end-line 281, :max-fixed-arity 1, :fn-var true, :arglists (quote ([n])), :doc "Calculates the absolute value (magnitude) of a number. The\n absolute value of a number is always positive. Dynamically casts to\n an int or float appropriately"}, pop-style {:category "Structure", :protocol-inline nil, :meta {:category "Structure", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "popStyle()", :column 3, :requires-bindings true, :line 3044, :end-line 3044, :arglists (quote ([])), :doc "Restores the prior settings on the 'style stack'. Used in\n conjunction with push-style. Together they allow you to change the\n style settings and later return to what you had. When a new style is\n started with push-style, it builds on the current style information.\n The push-style and pop-style functions can be nested to provide more\n control"}, :added "1.0", :name quil.core/pop-style, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 12, :processing-name "popStyle()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3038, :end-line 3044, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Restores the prior settings on the 'style stack'. Used in\n conjunction with push-style. Together they allow you to change the\n style settings and later return to what you had. When a new style is\n started with push-style, it builds on the current style information.\n The push-style and pop-style functions can be nested to provide more\n control"}, focused {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "focused", :column 3, :requires-bindings true, :line 1843, :end-line 1843, :arglists (quote ([])), :doc "Returns a boolean value representing whether the applet has focus."}, :added "1.0", :name quil.core/focused, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 10, :processing-name "focused", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1837, :end-line 1843, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns a boolean value representing whether the applet has focus."}, background-float {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Setting", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 19, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([gray] [gray alpha] [r g b] [r g b a]), :arglists ([gray] [gray alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "background()", :column 3, :requires-bindings true, :line 512, :end-line 512, :arglists (quote ([gray] [gray alpha] [r g b] [r g b a])), :doc "Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts args to floats."}, :added "1.0", :name quil.core/background-float, :variadic false, :subcategory "Setting", :file "out/quil/core.cljc", :end-column 19, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([gray] [gray alpha] [r g b] [r g b a]), :arglists ([gray] [gray alpha] [r g b] [r g b a]), :arglists-meta (nil nil nil nil)}, :processing-name "background()", :method-params ([gray] [gray alpha] [r g b] [r g b a]), :protocol-impl nil, :arglists-meta (nil nil nil nil), :column 1, :requires-bindings true, :line 506, :end-line 512, :max-fixed-arity 4, :fn-var true, :arglists ([gray] [gray alpha] [r g b] [r g b a]), :doc "Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts args to floats."}, text-mode {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "textMode()", :column 3, :requires-bindings true, :line 4307, :end-line 4307, :arglists (quote ([mode])), :doc "Sets the way text draws to the screen - available modes\n are :model and :shape\n\n In the default configuration (the :model mode), it's possible to\n rotate, scale, and place letters in two and three dimensional space.\n\n The :shape mode draws text using the glyph outlines of individual\n characters rather than as textures. This mode is only supported with\n the PDF and OPENGL renderer settings. With the PDF renderer, you\n must specify the :shape text-mode before any other drawing occurs.\n If the outlines are not available, then :shape will be ignored and\n :model will be used instead.\n\n The :shape option in OPENGL mode can be combined with begin-raw to\n write vector-accurate text to 2D and 3D output files, for instance\n DXF or PDF. :shape is not currently optimized for OPENGL, so if\n recording shape data, use :model until you're ready to capture the\n geometry with begin-raw."}, :added "1.0", :name quil.core/text-mode, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 12, :processing-name "textMode()", :method-params ([mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4301, :end-line 4307, :max-fixed-arity 1, :fn-var true, :arglists (quote ([mode])), :doc "Sets the way text draws to the screen - available modes\n are :model and :shape\n\n In the default configuration (the :model mode), it's possible to\n rotate, scale, and place letters in two and three dimensional space.\n\n The :shape mode draws text using the glyph outlines of individual\n characters rather than as textures. This mode is only supported with\n the PDF and OPENGL renderer settings. With the PDF renderer, you\n must specify the :shape text-mode before any other drawing occurs.\n If the outlines are not available, then :shape will be ignored and\n :model will be used instead.\n\n The :shape option in OPENGL mode can be combined with begin-raw to\n write vector-accurate text to 2D and 3D output files, for instance\n DXF or PDF. :shape is not currently optimized for OPENGL, so if\n recording shape data, use :model until you're ready to capture the\n geometry with begin-raw."}, image-mode {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 13, :processing-name "imageMode()", :column 3, :requires-bindings true, :line 2145, :end-line 2145, :arglists (quote ([mode])), :doc "Modifies the location from which images draw. The default mode is :corner.\n Available modes are:\n\n :corner - specifies the location to be the upper left corner and\n uses the fourth and fifth parameters of image to set the\n image's width and height.\n\n :corners - uses the second and third parameters of image to set the\n location of one corner of the image and uses the fourth\n and fifth parameters to set the opposite corner.\n\n :center - draw images centered at the given x and y position."}, :added "1.0", :name quil.core/image-mode, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 13, :processing-name "imageMode()", :method-params ([mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2139, :end-line 2145, :max-fixed-arity 1, :fn-var true, :arglists (quote ([mode])), :doc "Modifies the location from which images draw. The default mode is :corner.\n Available modes are:\n\n :corner - specifies the location to be the upper left corner and\n uses the fourth and fifth parameters of image to set the\n image's width and height.\n\n :corners - uses the second and third parameters of image to set the\n location of one corner of the image and uses the fourth\n and fifth parameters to set the opposite corner.\n\n :center - draw images centered at the given x and y position."}, line {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "2D Primitives", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 6, :method-params ([p1 p2] [x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :arglists ([p1 p2] [x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :arglists-meta (nil nil nil)}, :processing-name "line()", :column 3, :requires-bindings true, :line 2324, :end-line 2324, :arglists (quote ([p1 p2] [x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2])), :doc "Draws a line (a direct path between two points) to the screen. The\n version of line with four parameters draws the line in 2D. To color\n a line, use the stroke function. A line cannot be filled, therefore\n the fill method will not affect the color of a line. 2D lines are\n drawn with a width of one pixel by default, but this can be changed\n with the stroke-weight function. The version with six parameters\n allows the line to be placed anywhere within XYZ space. "}, :added "1.0", :name quil.core/line, :variadic false, :subcategory "2D Primitives", :file "out/quil/core.cljc", :end-column 7, :top-fn {:variadic false, :max-fixed-arity 6, :method-params ([p1 p2] [x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :arglists ([p1 p2] [x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :arglists-meta (nil nil nil)}, :processing-name "line()", :method-params ([p1 p2] [x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 2318, :end-line 2324, :max-fixed-arity 6, :fn-var true, :arglists ([p1 p2] [x1 y1 x2 y2] [x1 y1 z1 x2 y2 z2]), :doc "Draws a line (a direct path between two points) to the screen. The\n version of line with four parameters draws the line in 2D. To color\n a line, use the stroke function. A line cannot be filled, therefore\n the fill method will not affect the color of a line. 2D lines are\n drawn with a width of one pixel by default, but this can be changed\n with the stroke-weight function. The version with six parameters\n allows the line to be placed anywhere within XYZ space. "}, do-record {:category "Output", :protocol-inline nil, :meta {:category "Output", :added "2.5", :subcategory "Files", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env graphics body)], :arglists ([&form &env graphics & body]), :arglists-meta (nil)}, :processing-name nil, :column 3, :requires-bindings true, :line 1510, :macro true, :end-line 1510, :arglists (quote ([graphics & body])), :doc "Macro for drawing on graphics which saves result in the file at the end.\n Similar to 'with-graphics' macro. do-record assumed to be used with :pdf\n graphics. Example:\n\n (q/do-record (q/create-graphics 200 200 :pdf \"output.pdf\")\n (q/fill 250 0 0)\n (q/ellipse 100 100 150 150))\n "}, :added "2.5", :name quil.core/do-record, :variadic true, :subcategory "Files", :file "out/quil/core.cljc", :end-column 12, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env graphics body)], :arglists ([&form &env graphics & body]), :arglists-meta (nil)}, :processing-name nil, :method-params [(&form &env graphics body)], :protocol-impl nil, :arglists-meta (nil), :column 1, :requires-bindings true, :line 1504, :macro true, :end-line 1510, :max-fixed-arity 3, :fn-var false, :arglists ([&form &env graphics & body]), :doc "Macro for drawing on graphics which saves result in the file at the end.\n Similar to 'with-graphics' macro. do-record assumed to be used with :pdf\n graphics. Example:\n\n (q/do-record (q/create-graphics 200 200 :pdf \"output.pdf\")\n (q/fill 250 0 0)\n (q/ellipse 100 100 150 150))\n "}, red {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "red()", :column 3, :requires-bindings true, :line 3333, :end-line 3333, :arglists (quote ([c])), :doc "Extracts the red value from a color, scaled to match current color-mode."}, :added "1.0", :name quil.core/red, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 6, :processing-name "red()", :method-params ([c]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3327, :end-line 3333, :max-fixed-arity 1, :fn-var true, :arglists (quote ([c])), :doc "Extracts the red value from a color, scaled to match current color-mode."}, current-fill {:category "Color", :protocol-inline nil, :meta {:category "Color", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "PGraphics.fillColor", :column 3, :processing-link "http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#fillColor", :requires-bindings true, :line 1264, :end-line 1264, :arglists (quote ([])), :doc "Return the current fill color."}, :name quil.core/current-fill, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 15, :processing-name "PGraphics.fillColor", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :processing-link "http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#fillColor", :requires-bindings true, :line 1258, :end-line 1264, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Return the current fill color."}, color-modes {:name quil.core/color-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 50, :end-column 13, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 50, :column 2, :end-line 50, :end-column 13}, :tag cljs.core/IMap}, blue {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "blue()", :column 3, :requires-bindings true, :line 905, :end-line 905, :arglists (quote ([color])), :doc "Extracts the blue value from a color, scaled to match current color-mode.\n Returns a float."}, :added "1.0", :name quil.core/blue, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 7, :processing-name "blue()", :method-params ([color]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 899, :end-line 905, :max-fixed-arity 1, :fn-var true, :arglists (quote ([color])), :doc "Extracts the blue value from a color, scaled to match current color-mode.\n Returns a float."}, frustum {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Camera", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "frustum()", :column 3, :requires-bindings true, :line 1897, :end-line 1897, :arglists (quote ([left right bottom top near far])), :doc "Sets a perspective matrix defined through the parameters. Works\n like glFrustum, except it wipes out the current perspective matrix\n rather than muliplying itself with it."}, :added "1.0", :name quil.core/frustum, :variadic false, :subcategory "Camera", :file "out/quil/core.cljc", :end-column 10, :processing-name "frustum()", :method-params ([left right bottom top near far]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1891, :end-line 1897, :max-fixed-arity 6, :fn-var true, :arglists (quote ([left right bottom top near far])), :doc "Sets a perspective matrix defined through the parameters. Works\n like glFrustum, except it wipes out the current perspective matrix\n rather than muliplying itself with it."}, with-rotation {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory "Utility Macros", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env rotation body)], :arglists ([&form &env rotation & body]), :arglists-meta (nil)}, :processing-name nil, :column 3, :requires-bindings true, :line 4688, :macro true, :end-line 4688, :arglists (quote ([rotation & body])), :doc "Performs body with rotation, restores current transformation on exit.\n Accepts a vector [angle] or [angle x-axis y-axis z-axis].\n\n Example:\n (with-rotation [angle]\n (vertex 1 2))"}, :added "1.0", :name quil.core/with-rotation, :variadic true, :subcategory "Utility Macros", :file "out/quil/core.cljc", :end-column 16, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env rotation body)], :arglists ([&form &env rotation & body]), :arglists-meta (nil)}, :processing-name nil, :method-params [(&form &env rotation body)], :protocol-impl nil, :arglists-meta (nil), :column 1, :requires-bindings true, :line 4682, :macro true, :end-line 4688, :max-fixed-arity 3, :fn-var false, :arglists ([&form &env rotation & body]), :doc "Performs body with rotation, restores current transformation on exit.\n Accepts a vector [angle] or [angle x-axis y-axis z-axis].\n\n Example:\n (with-rotation [angle]\n (vertex 1 2))"}, print-matrix {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "printMatrix()", :column 3, :requires-bindings true, :line 3087, :end-line 3087, :arglists (quote ([])), :doc "Prints the current matrix to std out. Useful for debugging."}, :added "1.0", :name quil.core/print-matrix, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 15, :processing-name "printMatrix()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3081, :end-line 3087, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Prints the current matrix to std out. Useful for debugging."}, ambient-light {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Lights", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 16, :top-fn {:variadic false, :max-fixed-arity 6, :method-params ([red green blue] [red green blue x y z]), :arglists ([red green blue] [red green blue x y z]), :arglists-meta (nil nil)}, :processing-name "ambientLight()", :column 3, :requires-bindings true, :line 375, :end-line 375, :arglists (quote ([red green blue] [red green blue x y z])), :doc "Adds an ambient light. Ambient light doesn't come from a specific direction,\n the rays have light have bounced around so much that objects are\n evenly lit from all sides. Ambient lights are almost always used in\n combination with other types of lights. Lights need to be included\n in the draw to remain persistent in a looping program. Placing them\n in the setup of a looping program will cause them to only have an\n effect the first time through the loop. The effect of the\n parameters is determined by the current color mode."}, :added "1.0", :name quil.core/ambient-light, :variadic false, :subcategory "Lights", :file "out/quil/core.cljc", :end-column 16, :top-fn {:variadic false, :max-fixed-arity 6, :method-params ([red green blue] [red green blue x y z]), :arglists ([red green blue] [red green blue x y z]), :arglists-meta (nil nil)}, :processing-name "ambientLight()", :method-params ([red green blue] [red green blue x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 369, :end-line 375, :max-fixed-arity 6, :fn-var true, :arglists ([red green blue] [red green blue x y z]), :doc "Adds an ambient light. Ambient light doesn't come from a specific direction,\n the rays have light have bounced around so much that objects are\n evenly lit from all sides. Ambient lights are almost always used in\n combination with other types of lights. Lights need to be included\n in the draw to remain persistent in a looping program. Placing them\n in the setup of a looping program will cause them to only have an\n effect the first time through the loop. The effect of the\n parameters is determined by the current color mode."}, bezier-point {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Curves", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "bezierPoint()", :column 3, :requires-bindings true, :line 706, :end-line 706, :arglists (quote ([a b c d t])), :doc "Evaluates the Bezier at point t for points a, b, c, d. The\n parameter t varies between 0 and 1, a and d are points on the curve,\n and b and c are the control points. This can be done once with the x\n coordinates and a second time with the y coordinates to get the\n location of a bezier curve at t."}, :added "1.0", :name quil.core/bezier-point, :variadic false, :subcategory "Curves", :file "out/quil/core.cljc", :end-column 15, :processing-name "bezierPoint()", :method-params ([a b c d t]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 700, :end-line 706, :max-fixed-arity 5, :fn-var true, :arglists (quote ([a b c d t])), :doc "Evaluates the Bezier at point t for points a, b, c, d. The\n parameter t varies between 0 and 1, a and d are points on the curve,\n and b and c are the control points. This can be done once with the x\n coordinates and a second time with the y coordinates to get the\n location of a bezier curve at t."}, stroke-cap-modes {:name quil.core/stroke-cap-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 64, :end-column 18, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 64, :column 2, :end-line 64, :end-column 18}, :tag cljs.core/IMap}, quad {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "2D Primitives", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 7, :processing-name "quad()", :column 3, :requires-bindings true, :line 3151, :end-line 3151, :arglists (quote ([x1 y1 x2 y2 x3 y3 x4 y4])), :doc "A quad is a quadrilateral, a four sided polygon. It is similar to a\n rectangle, but the angles between its edges are not constrained to\n be ninety degrees. The first pair of parameters (x1,y1) sets the\n first vertex and the subsequent pairs should proceed clockwise or\n counter-clockwise around the defined shape."}, :added "1.0", :name quil.core/quad, :variadic false, :subcategory "2D Primitives", :file "out/quil/core.cljc", :end-column 7, :processing-name "quad()", :method-params ([x1 y1 x2 y2 x3 y3 x4 y4]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3145, :end-line 3151, :max-fixed-arity 8, :fn-var true, :arglists (quote ([x1 y1 x2 y2 x3 y3 x4 y4])), :doc "A quad is a quadrilateral, a four sided polygon. It is similar to a\n rectangle, but the angles between its edges are not constrained to\n be ninety degrees. The first pair of parameters (x1,y1) sets the\n first vertex and the subsequent pairs should proceed clockwise or\n counter-clockwise around the defined shape."}, screen-x {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Coordinates", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([x y] [x y z]), :arglists ([x y] [x y z]), :arglists-meta (nil nil)}, :processing-name "screenX()", :column 3, :requires-bindings true, :line 3642, :end-line 3642, :arglists (quote ([x y] [x y z])), :doc "Takes a three-dimensional x, y, z position and returns the x value\n for where it will appear on a (two-dimensional) screen, once\n affected by translate, scale or any other transformations"}, :added "1.0", :name quil.core/screen-x, :variadic false, :subcategory "Coordinates", :file "out/quil/core.cljc", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([x y] [x y z]), :arglists ([x y] [x y z]), :arglists-meta (nil nil)}, :processing-name "screenX()", :method-params ([x y] [x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3636, :end-line 3642, :max-fixed-arity 3, :fn-var true, :arglists ([x y] [x y z]), :doc "Takes a three-dimensional x, y, z position and returns the x value\n for where it will appear on a (two-dimensional) screen, once\n affected by translate, scale or any other transformations"}, lights {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Lights", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :processing-name "lights()", :column 3, :requires-bindings true, :line 2285, :end-line 2285, :arglists (quote ([])), :doc "Sets the default ambient light, directional light, falloff, and\n specular values. The defaults are:\n\n (ambient-light 128 128 128)\n (directional-light 128 128 128 0 0 -1)\n (light-falloff 1 0 0)\n (light-specular 0 0 0).\n\n Lights need to be included in the draw to remain persistent in a\n looping program. Placing them in the setup of a looping program\n will cause them to only have an effect the first time through the\n loop."}, :added "1.0", :name quil.core/lights, :variadic false, :subcategory "Lights", :file "out/quil/core.cljc", :end-column 9, :processing-name "lights()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2279, :end-line 2285, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Sets the default ambient light, directional light, falloff, and\n specular values. The defaults are:\n\n (ambient-light 128 128 128)\n (directional-light 128 128 128 0 0 -1)\n (light-falloff 1 0 0)\n (light-specular 0 0 0).\n\n Lights need to be included in the draw to remain persistent in a\n looping program. Placing them in the setup of a looping program\n will cause them to only have an effect the first time through the\n loop."}, *graphics* {:meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 22, :column 3, :end-line 22, :end-column 13, :dynamic true, :private true}, :private true, :name quil.core/*graphics*, :file "out/quil/core.cljc", :end-column 13, :column 1, :dynamic true, :line 20, :end-line 22, :tag clj-nil}, KEY-CODES {:name quil.core/KEY-CODES, :file "out/quil/core.cljc", :line 122, :column 4, :end-line 123, :end-column 15, :private true, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 123, :column 6, :end-line 123, :end-column 15, :private true}, :tag cljs.core/IMap}, curve-detail {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Curves", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "curveDetail()", :column 3, :requires-bindings true, :line 1348, :end-line 1348, :arglists (quote ([detail])), :doc "Sets the resolution at which curves display. The default value is\n 20. This function is only useful when using the :p3d or :opengl\n renderer as the default (:java2d) renderer does not use this\n information."}, :added "1.0", :name quil.core/curve-detail, :variadic false, :subcategory "Curves", :file "out/quil/core.cljc", :end-column 15, :processing-name "curveDetail()", :method-params ([detail]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1342, :end-line 1348, :max-fixed-arity 1, :fn-var true, :arglists (quote ([detail])), :doc "Sets the resolution at which curves display. The default value is\n 20. This function is only useful when using the :p3d or :opengl\n renderer as the default (:java2d) renderer does not use this\n information."}, current-frame-rate {:category "Environment", :protocol-inline nil, :meta {:category "Environment", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 21, :processing-name "frameRate", :column 3, :requires-bindings true, :line 1867, :end-line 1867, :arglists (quote ([])), :doc "Returns the current framerate"}, :added "1.0", :name quil.core/current-frame-rate, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 21, :processing-name "frameRate", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1861, :end-line 1867, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns the current framerate"}, end-contour {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "2.0", :subcategory "Vertex", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "endContour()", :column 3, :requires-bindings true, :line 1624, :end-line 1624, :arglists (quote ([])), :doc "Use the begin-contour and end-contour function to create negative\n shapes within shapes. These functions can only be within a\n begin-shape/end-shape pair and they only work with the :p2d and :p3d\n renderers."}, :added "2.0", :name quil.core/end-contour, :variadic false, :subcategory "Vertex", :file "out/quil/core.cljc", :end-column 14, :processing-name "endContour()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1618, :end-line 1624, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Use the begin-contour and end-contour function to create negative\n shapes within shapes. These functions can only be within a\n begin-shape/end-shape pair and they only work with the :p2d and :p3d\n renderers."}, sin {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Trigonometry", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 6, :processing-name "sin()", :column 3, :requires-bindings false, :line 3863, :end-line 3863, :arglists (quote ([angle])), :doc "Calculates the sine of an angle. This function expects the values\n of the angle parameter to be provided in radians (values from 0 to\n 6.28). A float within the range -1 to 1 is returned."}, :added "1.0", :name quil.core/sin, :variadic false, :subcategory "Trigonometry", :file "out/quil/core.cljc", :end-column 6, :processing-name "sin()", :method-params ([angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 3857, :end-line 3863, :max-fixed-arity 1, :fn-var true, :arglists (quote ([angle])), :doc "Calculates the sine of an angle. This function expects the values\n of the angle parameter to be provided in radians (values from 0 to\n 6.28). A float within the range -1 to 1 is returned."}, current-stroke {:category "Color", :protocol-inline nil, :meta {:category "Color", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 17, :processing-name "PGraphics.strokeColor", :column 3, :processing-link "http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#strokeColor", :requires-bindings true, :line 1275, :end-line 1275, :arglists (quote ([])), :doc "Return the current stroke color."}, :name quil.core/current-stroke, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 17, :processing-name "PGraphics.strokeColor", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :processing-link "http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#strokeColor", :requires-bindings true, :line 1269, :end-line 1275, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Return the current stroke color."}, curve {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Curves", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 12, :method-params ([x1 y1 x2 y2 x3 y3 x4 y4] [x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4]), :arglists ([x1 y1 x2 y2 x3 y3 x4 y4] [x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4]), :arglists-meta (nil nil)}, :processing-name "curve()", :column 3, :requires-bindings true, :line 1320, :end-line 1320, :arglists (quote ([x1 y1 x2 y2 x3 y3 x4 y4] [x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4])), :doc "Draws a curved line on the screen. The first and second parameters\n specify the beginning control point and the last two parameters\n specify the ending control point. The middle parameters specify the\n start and stop of the curve. Longer curves can be created by putting\n a series of curve fns together or using curve-vertex. An additional\n fn called curve-tightness provides control for the visual quality of\n the curve. The curve fn is an implementation of Catmull-Rom\n splines."}, :added "1.0", :name quil.core/curve, :variadic false, :subcategory "Curves", :file "out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 12, :method-params ([x1 y1 x2 y2 x3 y3 x4 y4] [x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4]), :arglists ([x1 y1 x2 y2 x3 y3 x4 y4] [x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4]), :arglists-meta (nil nil)}, :processing-name "curve()", :method-params ([x1 y1 x2 y2 x3 y3 x4 y4] [x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1314, :end-line 1320, :max-fixed-arity 12, :fn-var true, :arglists ([x1 y1 x2 y2 x3 y3 x4 y4] [x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4]), :doc "Draws a curved line on the screen. The first and second parameters\n specify the beginning control point and the last two parameters\n specify the ending control point. The middle parameters specify the\n start and stop of the curve. Longer curves can be created by putting\n a series of curve fns together or using curve-vertex. An additional\n fn called curve-tightness provides control for the visual quality of\n the curve. The curve fn is an implementation of Catmull-Rom\n splines."}, shape {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([sh] [sh x y] [sh x y width height]), :arglists ([sh] [sh x y] [sh x y width height]), :arglists-meta (nil nil nil)}, :processing-name "shape()", :column 3, :requires-bindings true, :line 3751, :end-line 3751, :arglists (quote ([sh] [sh x y] [sh x y width height])), :doc "Displays shapes to the screen. The shapes must have been loaded\n with load-shape. Processing currently works with SVG shapes\n only. The sh parameter specifies the shape to display and the x and\n y parameters define the location of the shape from its upper-left\n corner. The shape is displayed at its original size unless the width\n and height parameters specify a different size. The shape-mode\n fn changes the way the parameters work. A call to\n (shape-mode :corners), for example, will change the width and height\n parameters to define the x and y values of the opposite corner of\n the shape.\n\n Note complex shapes may draw awkwardly with the renderers :p2d, :p3d, and\n :opengl. Those renderers do not yet support shapes that have holes\n or complicated breaks."}, :added "1.0", :name quil.core/shape, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([sh] [sh x y] [sh x y width height]), :arglists ([sh] [sh x y] [sh x y width height]), :arglists-meta (nil nil nil)}, :processing-name "shape()", :method-params ([sh] [sh x y] [sh x y width height]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 3745, :end-line 3751, :max-fixed-arity 5, :fn-var true, :arglists ([sh] [sh x y] [sh x y width height]), :doc "Displays shapes to the screen. The shapes must have been loaded\n with load-shape. Processing currently works with SVG shapes\n only. The sh parameter specifies the shape to display and the x and\n y parameters define the location of the shape from its upper-left\n corner. The shape is displayed at its original size unless the width\n and height parameters specify a different size. The shape-mode\n fn changes the way the parameters work. A call to\n (shape-mode :corners), for example, will change the width and height\n parameters to define the x and y values of the opposite corner of\n the shape.\n\n Note complex shapes may draw awkwardly with the renderers :p2d, :p3d, and\n :opengl. Those renderers do not yet support shapes that have holes\n or complicated breaks."}, image-formats {:name quil.core/image-formats, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 51, :end-column 15, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 51, :column 2, :end-line 51, :end-column 15}, :tag cljs.core/IMap}, text-descent {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Metrics", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "textDescent()", :column 3, :requires-bindings true, :line 4255, :end-line 4255, :arglists (quote ([])), :doc "Returns descent of the current font at its current size. This\n information is useful for determining the height of the font below\n the baseline. For example, adding the text-ascent and text-descent\n values will give you the total height of the line."}, :added "1.0", :name quil.core/text-descent, :variadic false, :subcategory "Metrics", :file "out/quil/core.cljc", :end-column 15, :processing-name "textDescent()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4249, :end-line 4255, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Returns descent of the current font at its current size. This\n information is useful for determining the height of the font below\n the baseline. For example, adding the text-ascent and text-descent\n values will give you the total height of the line."}, screen-z {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Coordinates", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :processing-name "screenZ()", :column 3, :requires-bindings true, :line 3668, :end-line 3668, :arglists (quote ([x y z])), :doc "Given an x, y, z coordinate, returns its z value.\n This value can be used to determine if an x, y, z coordinate is in\n front or in back of another (x, y, z) coordinate. The units are\n based on how the zbuffer is set up, and don't relate to anything\n 'real'. They're only useful for in comparison to another value\n obtained from screen-z, or directly out of the zbuffer"}, :added "1.0", :name quil.core/screen-z, :variadic false, :subcategory "Coordinates", :file "out/quil/core.cljc", :end-column 11, :processing-name "screenZ()", :method-params ([x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3662, :end-line 3668, :max-fixed-arity 3, :fn-var true, :arglists (quote ([x y z])), :doc "Given an x, y, z coordinate, returns its z value.\n This value can be used to determine if an x, y, z coordinate is in\n front or in back of another (x, y, z) coordinate. The units are\n based on how the zbuffer is set up, and don't relate to anything\n 'real'. They're only useful for in comparison to another value\n obtained from screen-z, or directly out of the zbuffer"}, ambient-int {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Material Properties", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "ambient()", :column 3, :requires-bindings true, :line 341, :end-line 341, :arglists (quote ([rgb])), :doc "Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The rgb\n color components set define the reflectance. Used in combination\n with emissive, specular, and shininess in setting the material\n properties of shapes."}, :added "1.0", :name quil.core/ambient-int, :variadic false, :subcategory "Material Properties", :file "out/quil/core.cljc", :end-column 14, :processing-name "ambient()", :method-params ([rgb]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 335, :end-line 341, :max-fixed-arity 1, :fn-var true, :arglists (quote ([rgb])), :doc "Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The rgb\n color components set define the reflectance. Used in combination\n with emissive, specular, and shininess in setting the material\n properties of shapes."}, ellipse {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "2D Primitives", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "ellipse()", :column 3, :requires-bindings true, :line 1531, :end-line 1531, :arglists (quote ([x y width height])), :doc "Draws an ellipse (oval) in the display window. An ellipse with an\n equal width and height is a circle. The origin may be changed with\n the ellipse-mode function"}, :added "1.0", :name quil.core/ellipse, :variadic false, :subcategory "2D Primitives", :file "out/quil/core.cljc", :end-column 10, :processing-name "ellipse()", :method-params ([x y width height]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1525, :end-line 1531, :max-fixed-arity 4, :fn-var true, :arglists (quote ([x y width height])), :doc "Draws an ellipse (oval) in the display window. An ellipse with an\n equal width and height is a circle. The origin may be changed with\n the ellipse-mode function"}, text-leading {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "textLeading()", :column 3, :requires-bindings true, :line 4295, :end-line 4295, :arglists (quote ([leading])), :doc "Sets the spacing between lines of text in units of pixels. This\n setting will be used in all subsequent calls to the text function."}, :added "1.0", :name quil.core/text-leading, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 15, :processing-name "textLeading()", :method-params ([leading]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4289, :end-line 4295, :max-fixed-arity 1, :fn-var true, :arglists (quote ([leading])), :doc "Sets the spacing between lines of text in units of pixels. This\n setting will be used in all subsequent calls to the text function."}, image-filter {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "2.0", :subcategory "Pixels", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([img mode] [img mode level]), :arglists ([img mode] [img mode level]), :arglists-meta (nil nil)}, :processing-name "PImage.filter()", :column 3, :requires-bindings true, :line 2105, :end-line 2105, :arglists (quote ([img mode] [img mode level])), :doc "Originally named filter in Processing Language.\n Filters given image with the specified mode and level.\n Level defines the quality of the filter and mode may be one of\n the following keywords:\n\n :threshold - converts the image to black and white pixels depending\n if they are above or below the threshold defined by\n the level parameter. The level must be between\n 0.0 (black) and 1.0 (white). If no level is specified,\n 0.5 is used.\n :gray - converts any colors in the image to grayscale\n equivalents. Doesn't work with level.\n :invert - sets each pixel to its inverse value. Doesn't work with\n level.\n :posterize - limits each channel of the image to the number of\n colors specified as the level parameter. The parameter can\n be set to values between 2 and 255, but results are most\n noticeable in the lower ranges.\n :blur - executes a Guassian blur with the level parameter\n specifying the extent of the blurring. If no level\n parameter is used, the blur is equivalent to Guassian\n blur of radius 1.\n :opaque - sets the alpha channel to entirely opaque. Doesn't work\n with level.\n :erode - reduces the light areas. Doesn't work with level.\n :dilate - increases the light areas. Doesn't work with level."}, :added "2.0", :name quil.core/image-filter, :variadic false, :subcategory "Pixels", :file "out/quil/core.cljc", :end-column 15, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([img mode] [img mode level]), :arglists ([img mode] [img mode level]), :arglists-meta (nil nil)}, :processing-name "PImage.filter()", :method-params ([img mode] [img mode level]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2099, :end-line 2105, :max-fixed-arity 3, :fn-var true, :arglists ([img mode] [img mode level]), :doc "Originally named filter in Processing Language.\n Filters given image with the specified mode and level.\n Level defines the quality of the filter and mode may be one of\n the following keywords:\n\n :threshold - converts the image to black and white pixels depending\n if they are above or below the threshold defined by\n the level parameter. The level must be between\n 0.0 (black) and 1.0 (white). If no level is specified,\n 0.5 is used.\n :gray - converts any colors in the image to grayscale\n equivalents. Doesn't work with level.\n :invert - sets each pixel to its inverse value. Doesn't work with\n level.\n :posterize - limits each channel of the image to the number of\n colors specified as the level parameter. The parameter can\n be set to values between 2 and 255, but results are most\n noticeable in the lower ranges.\n :blur - executes a Guassian blur with the level parameter\n specifying the extent of the blurring. If no level\n parameter is used, the blur is equivalent to Guassian\n blur of radius 1.\n :opaque - sets the alpha channel to entirely opaque. Doesn't work\n with level.\n :erode - reduces the light areas. Doesn't work with level.\n :dilate - increases the light areas. Doesn't work with level."}, random {:category "Math", :protocol-inline nil, :meta {:category "Math", :added "1.0", :subcategory "Random", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([max] [min max]), :arglists ([max] [min max]), :arglists-meta (nil nil)}, :processing-name "random()", :column 3, :requires-bindings true, :line 3207, :end-line 3207, :arglists (quote ([max] [min max])), :doc "Generates random numbers. Each time the random function is called,\n it returns an unexpected value within the specified range. If one\n parameter is passed to the function it will return a float between\n zero and the value of the high parameter. The function call (random\n 5) returns values between 0 and 5 (starting at zero, up to but not\n including 5). If two parameters are passed, it will return a float\n with a value between the parameters. The function call\n (random -5 10.2) returns values starting at -5 up to (but not\n including) 10.2."}, :added "1.0", :name quil.core/random, :variadic false, :subcategory "Random", :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 2, :method-params ([max] [min max]), :arglists ([max] [min max]), :arglists-meta (nil nil)}, :processing-name "random()", :method-params ([max] [min max]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3201, :end-line 3207, :max-fixed-arity 2, :fn-var true, :arglists ([max] [min max]), :doc "Generates random numbers. Each time the random function is called,\n it returns an unexpected value within the specified range. If one\n parameter is passed to the function it will return a float between\n zero and the value of the high parameter. The function call (random\n 5) returns values between 0 and 5 (starting at zero, up to but not\n including 5). If two parameters are passed, it will return a float\n with a value between the parameters. The function call\n (random -5 10.2) returns values starting at -5 up to (but not\n including) 10.2."}, texture-mode {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Vertex", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "textureMode()", :column 3, :requires-bindings true, :line 4367, :end-line 4367, :arglists (quote ([mode])), :doc "Sets the coordinate space for texture mapping. There are two\n options, :image and :normal.\n\n :image refers to the actual coordinates of the image and :normal\n refers to a normalized space of values ranging from 0 to 1. The\n default mode is :image. In :image, if an image is 100 x 200 pixels,\n mapping the image onto the entire size of a quad would require the\n points (0,0) (0,100) (100,200) (0,200). The same mapping in\n NORMAL_SPACE is (0,0) (0,1) (1,1) (0,1)."}, :added "1.0", :name quil.core/texture-mode, :variadic false, :subcategory "Vertex", :file "out/quil/core.cljc", :end-column 15, :processing-name "textureMode()", :method-params ([mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 4361, :end-line 4367, :max-fixed-arity 1, :fn-var true, :arglists (quote ([mode])), :doc "Sets the coordinate space for texture mapping. There are two\n options, :image and :normal.\n\n :image refers to the actual coordinates of the image and :normal\n refers to a normalized space of values ranging from 0 to 1. The\n default mode is :image. In :image, if an image is 100 x 200 pixels,\n mapping the image onto the entire size of a quad would require the\n points (0,0) (0,100) (100,200) (0,200). The same mapping in\n NORMAL_SPACE is (0,0) (0,1) (1,1) (0,1)."}, redraw {:category "Structure", :protocol-inline nil, :meta {:category "Structure", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :processing-name "redraw()", :column 3, :requires-bindings true, :line 3344, :end-line 3344, :arglists (quote ([])), :doc "Executes the code within the draw fn one time. This functions\n allows the program to update the display window only when necessary,\n for example when an event registered by mouse-pressed or\n key-pressed occurs.\n\n In structuring a program, it only makes sense to call redraw\n within events such as mouse-pressed. This is because redraw does\n not run draw immediately (it only sets a flag that indicates an\n update is needed).\n\n Calling redraw within draw has no effect because draw is\n continuously called anyway."}, :added "1.0", :name quil.core/redraw, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 9, :processing-name "redraw()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3338, :end-line 3344, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Executes the code within the draw fn one time. This functions\n allows the program to update the display window only when necessary,\n for example when an event registered by mouse-pressed or\n key-pressed occurs.\n\n In structuring a program, it only makes sense to call redraw\n within events such as mouse-pressed. This is because redraw does\n not run draw immediately (it only sets a flag that indicates an\n update is needed).\n\n Calling redraw within draw has no effect because draw is\n continuously called anyway."}, RAD-TO-DEG {:name quil.core/RAD-TO-DEG, :file "out/quil/core.cljc", :line 83, :column 1, :end-line 83, :end-column 16, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 83, :column 6, :end-line 83, :end-column 16}, :tag number}, get-pixel {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Pixels", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([] [img] [x y] [img x y] [x y w h] [img x y w h]), :arglists ([] [img] [x y] [img x y] [x y w h] [img x y w h]), :arglists-meta (nil nil nil nil nil nil)}, :processing-name "get()", :column 3, :requires-bindings true, :line 1911, :end-line 1911, :arglists (quote ([] [img] [x y] [img x y] [x y w h] [img x y w h])), :doc "Reads the color of any pixel or grabs a section of an image. If no\n parameters are specified, a copy of entire image is returned. Get the\n value of one pixel by specifying an x,y coordinate. Get a section of\n the image by specifying an additional width and height parameter.\n If the pixel requested is outside of the image window, black is returned.\n The numbers returned are scaled according to the current color ranges,\n but only RGB values are returned by this function. For example, even though\n you may have drawn a shape with (color-mode :hsb), the numbers returned\n will be in RGB.\n\n Getting the color of a single pixel with (get x y) is easy, but not\n as fast as grabbing the data directly using the pixels fn.\n\n If no img specified - current-graphics is used."}, :added "1.0", :name quil.core/get-pixel, :variadic false, :subcategory "Pixels", :file "out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([] [img] [x y] [img x y] [x y w h] [img x y w h]), :arglists ([] [img] [x y] [img x y] [x y w h] [img x y w h]), :arglists-meta (nil nil nil nil nil nil)}, :processing-name "get()", :method-params ([] [img] [x y] [img x y] [x y w h] [img x y w h]), :protocol-impl nil, :arglists-meta (nil nil nil nil nil nil), :column 1, :requires-bindings true, :line 1905, :end-line 1911, :max-fixed-arity 5, :fn-var true, :arglists ([] [img] [x y] [img x y] [x y w h] [img x y w h]), :doc "Reads the color of any pixel or grabs a section of an image. If no\n parameters are specified, a copy of entire image is returned. Get the\n value of one pixel by specifying an x,y coordinate. Get a section of\n the image by specifying an additional width and height parameter.\n If the pixel requested is outside of the image window, black is returned.\n The numbers returned are scaled according to the current color ranges,\n but only RGB values are returned by this function. For example, even though\n you may have drawn a shape with (color-mode :hsb), the numbers returned\n will be in RGB.\n\n Getting the color of a single pixel with (get x y) is easy, but not\n as fast as grabbing the data directly using the pixels fn.\n\n If no img specified - current-graphics is used."}, rotate {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([angle] [angle vx vy vz]), :arglists ([angle] [angle vx vy vz]), :arglists-meta (nil nil)}, :processing-name "rotate()", :column 3, :requires-bindings true, :line 3438, :end-line 3438, :arglists (quote ([angle] [angle vx vy vz])), :doc "Rotates a shape the amount specified by the angle parameter. Angles\n should be specified in radians (values from 0 to TWO-PI) or\n converted to radians with the radians function.\n\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a clockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate HALF-PI) and then (rotate HALF-PI) is the\n same as (rotate PI). All tranformations are reset when draw begins\n again.\n\n Technically, rotate multiplies the current transformation matrix by\n a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix."}, :added "1.0", :name quil.core/rotate, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([angle] [angle vx vy vz]), :arglists ([angle] [angle vx vy vz]), :arglists-meta (nil nil)}, :processing-name "rotate()", :method-params ([angle] [angle vx vy vz]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3432, :end-line 3438, :max-fixed-arity 4, :fn-var true, :arglists ([angle] [angle vx vy vz]), :doc "Rotates a shape the amount specified by the angle parameter. Angles\n should be specified in radians (values from 0 to TWO-PI) or\n converted to radians with the radians function.\n\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a clockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate HALF-PI) and then (rotate HALF-PI) is the\n same as (rotate PI). All tranformations are reset when draw begins\n again.\n\n Technically, rotate multiplies the current transformation matrix by\n a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix."}, set-pixel {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Pixels", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([x y c] [img x y c]), :arglists ([x y c] [img x y c]), :arglists-meta (nil nil)}, :processing-name "set()", :column 3, :requires-bindings true, :line 3696, :end-line 3696, :arglists (quote ([x y c] [img x y c])), :doc "Changes the color of any pixel in the display window. The x and y\n parameters specify the pixel to change and the color parameter\n specifies the color value. The color parameter is affected by the\n current color mode (the default is RGB values from 0 to 255).\n\n Setting the color of a single pixel with (set x, y) is easy, but not\n as fast as putting the data directly into pixels[].\n\n This function ignores imageMode().\n\n Due to what appears to be a bug in Apple's Java implementation, the\n point() and set() methods are extremely slow in some circumstances\n when used with the default renderer. Using :p2d or :p3d will fix the\n problem. Grouping many calls to point or set-pixel together can also\n help. (Bug 1094)"}, :added "1.0", :name quil.core/set-pixel, :variadic false, :subcategory "Pixels", :file "out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 4, :method-params ([x y c] [img x y c]), :arglists ([x y c] [img x y c]), :arglists-meta (nil nil)}, :processing-name "set()", :method-params ([x y c] [img x y c]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3690, :end-line 3696, :max-fixed-arity 4, :fn-var true, :arglists ([x y c] [img x y c]), :doc "Changes the color of any pixel in the display window. The x and y\n parameters specify the pixel to change and the color parameter\n specifies the color value. The color parameter is affected by the\n current color mode (the default is RGB values from 0 to 255).\n\n Setting the color of a single pixel with (set x, y) is easy, but not\n as fast as putting the data directly into pixels[].\n\n This function ignores imageMode().\n\n Due to what appears to be a bug in Apple's Java implementation, the\n point() and set() methods are extremely slow in some circumstances\n when used with the default renderer. Using :p2d or :p3d will fix the\n problem. Grouping many calls to point or set-pixel together can also\n help. (Bug 1094)"}, push-matrix {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 14, :processing-name "pushMatrix()", :column 3, :requires-bindings true, :line 3110, :end-line 3110, :arglists (quote ([])), :doc "Pushes the current transformation matrix onto the matrix\n stack. Understanding push-matrix and pop-matrix requires\n understanding the concept of a matrix stack. The push-matrix\n function saves the current coordinate system to the stack and\n pop-matrix restores the prior coordinate system. push-matrix and\n pop-matrix are used in conjuction with the other transformation\n methods and may be embedded to control the scope of the\n transformations."}, :added "1.0", :name quil.core/push-matrix, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 14, :processing-name "pushMatrix()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3104, :end-line 3110, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Pushes the current transformation matrix onto the matrix\n stack. Understanding push-matrix and pop-matrix requires\n understanding the concept of a matrix stack. The push-matrix\n function saves the current coordinate system to the stack and\n pop-matrix restores the prior coordinate system. push-matrix and\n pop-matrix are used in conjuction with the other transformation\n methods and may be embedded to control the scope of the\n transformations."}, no-smooth {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "Attributes", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "noSmooth()", :column 3, :requires-bindings true, :line 2853, :end-line 2853, :arglists (quote ([])), :doc "Draws all geometry with jagged (aliased) edges. Must be called inside\n :settings handler."}, :added "1.0", :name quil.core/no-smooth, :variadic false, :subcategory "Attributes", :file "out/quil/core.cljc", :end-column 12, :processing-name "noSmooth()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2847, :end-line 2853, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Draws all geometry with jagged (aliased) edges. Must be called inside\n :settings handler."}, alpha {:category "Color", :protocol-inline nil, :meta {:category "Color", :added "1.0", :subcategory "Creating & Reading", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :processing-name "alpha()", :column 3, :requires-bindings true, :line 313, :end-line 313, :arglists (quote ([color])), :doc "Extracts the alpha value from a color."}, :added "1.0", :name quil.core/alpha, :variadic false, :subcategory "Creating & Reading", :file "out/quil/core.cljc", :end-column 8, :processing-name "alpha()", :method-params ([color]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 307, :end-line 313, :max-fixed-arity 1, :fn-var true, :arglists (quote ([color])), :doc "Extracts the alpha value from a color."}, camera {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Camera", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 9, :method-params ([] [eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ]), :arglists ([] [eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ]), :arglists-meta (nil nil)}, :processing-name "camera()", :column 3, :requires-bindings true, :line 939, :end-line 939, :arglists (quote ([] [eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ])), :doc "Sets the position of the camera through setting the eye position,\n the center of the scene, and which axis is facing upward. Moving the\n eye position and the direction it is pointing (the center of the\n scene) allows the images to be seen from different angles. The\n version without any parameters sets the camera to the default\n position, pointing to the center of the display window with the Y\n axis as up. The default values are:\n\n eyeX: (/ (width) 2.0)\n eyeY: (/ (height) 2.0)\n eyeZ: (/ (/ (height) 2.0) (tan (/ (* Math/PI 60.0) 360.0)))\n centerX: (/ (width) 2.0)\n centerY: (/ (height) 2.0)\n centerZ: 0\n upX: 0\n upY: 1\n upZ: 0\n\n Similar imilar to gluLookAt() in OpenGL, but it first clears the\n current camera settings."}, :added "1.0", :name quil.core/camera, :variadic false, :subcategory "Camera", :file "out/quil/core.cljc", :end-column 9, :top-fn {:variadic false, :max-fixed-arity 9, :method-params ([] [eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ]), :arglists ([] [eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ]), :arglists-meta (nil nil)}, :processing-name "camera()", :method-params ([] [eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 933, :end-line 939, :max-fixed-arity 9, :fn-var true, :arglists ([] [eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ]), :doc "Sets the position of the camera through setting the eye position,\n the center of the scene, and which axis is facing upward. Moving the\n eye position and the direction it is pointing (the center of the\n scene) allows the images to be seen from different angles. The\n version without any parameters sets the camera to the default\n position, pointing to the center of the display window with the Y\n axis as up. The default values are:\n\n eyeX: (/ (width) 2.0)\n eyeY: (/ (height) 2.0)\n eyeZ: (/ (/ (height) 2.0) (tan (/ (* Math/PI 60.0) 360.0)))\n centerX: (/ (width) 2.0)\n centerY: (/ (height) 2.0)\n centerZ: 0\n upX: 0\n upY: 1\n upZ: 0\n\n Similar imilar to gluLookAt() in OpenGL, but it first clears the\n current camera settings."}, translate {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([v] [tx ty] [tx ty tz]), :arglists ([v] [tx ty] [tx ty tz]), :arglists-meta (nil nil nil)}, :processing-name "translate()", :column 3, :requires-bindings true, :line 4488, :end-line 4488, :arglists (quote ([v] [tx ty] [tx ty tz])), :doc "Specifies an amount to displace objects within the display\n window. The x parameter specifies left/right translation, the y\n parameter specifies up/down translation, and the z parameter\n specifies translations toward/away from the screen. Transformations\n apply to everything that happens after and subsequent calls to the\n function accumulates the effect. For example, calling (translate 50\n 0) and then (translate 20, 0) is the same as (translate 70, 0). If\n translate is called within draw, the transformation is reset when\n the loop begins again. This function can be further controlled by\n the push-matrix and pop-matrix."}, :added "1.0", :name quil.core/translate, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 12, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([v] [tx ty] [tx ty tz]), :arglists ([v] [tx ty] [tx ty tz]), :arglists-meta (nil nil nil)}, :processing-name "translate()", :method-params ([v] [tx ty] [tx ty tz]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :requires-bindings true, :line 4482, :end-line 4488, :max-fixed-arity 3, :fn-var true, :arglists ([v] [tx ty] [tx ty tz]), :doc "Specifies an amount to displace objects within the display\n window. The x parameter specifies left/right translation, the y\n parameter specifies up/down translation, and the z parameter\n specifies translations toward/away from the screen. Transformations\n apply to everything that happens after and subsequent calls to the\n function accumulates the effect. For example, calling (translate 50\n 0) and then (translate 20, 0) is the same as (translate 70, 0). If\n translate is called within draw, the transformation is reset when\n the loop begins again. This function can be further controlled by\n the push-matrix and pop-matrix."}, load-font {:category "Typography", :protocol-inline nil, :meta {:category "Typography", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "loadFont()", :column 3, :requires-bindings true, :line 2344, :end-line 2344, :arglists (quote ([filename])), :doc "Loads a font into a variable of type PFont. To load correctly,\n fonts must be located in the data directory of the current sketch.\n To create a font to use with Processing use the create-font fn.\n\n Like load-image and other methods that load data, the load-font fn\n should not be used inside draw, because it will slow down the sketch\n considerably, as the font will be re-loaded from the disk (or\n network) on each frame.\n\n For most renderers, Processing displays fonts using the .vlw font\n format, which uses images for each letter, rather than defining them\n through vector data. When hint :enable-native-fonts is used with the\n JAVA2D renderer, the native version of a font will be used if it is\n installed on the user's machine.\n\n Using create-font (instead of load-font) enables vector data to be\n used with the JAVA2D (default) renderer setting. This can be helpful\n when many font sizes are needed, or when using any renderer based on\n JAVA2D, such as the PDF library."}, :added "1.0", :name quil.core/load-font, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 12, :processing-name "loadFont()", :method-params ([filename]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2338, :end-line 2344, :max-fixed-arity 1, :fn-var true, :arglists (quote ([filename])), :doc "Loads a font into a variable of type PFont. To load correctly,\n fonts must be located in the data directory of the current sketch.\n To create a font to use with Processing use the create-font fn.\n\n Like load-image and other methods that load data, the load-font fn\n should not be used inside draw, because it will slow down the sketch\n considerably, as the font will be re-loaded from the disk (or\n network) on each frame.\n\n For most renderers, Processing displays fonts using the .vlw font\n format, which uses images for each letter, rather than defining them\n through vector data. When hint :enable-native-fonts is used with the\n JAVA2D renderer, the native version of a font will be used if it is\n installed on the user's machine.\n\n Using create-font (instead of load-font) enables vector data to be\n used with the JAVA2D (default) renderer setting. This can be helpful\n when many font sizes are needed, or when using any renderer based on\n JAVA2D, such as the PDF library."}, ambient {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Material Properties", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([rgb] [x y z]), :arglists ([rgb] [x y z]), :arglists-meta (nil nil)}, :processing-name "ambient()", :column 3, :requires-bindings true, :line 356, :end-line 356, :arglists (quote ([rgb] [x y z])), :doc "Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The\n color components set through the parameters define the\n reflectance. For example in the default color mode, setting x=255,\n y=126, z=0, would cause all the red light to reflect and half of the\n green light to reflect. Used in combination with emissive, specular,\n and shininess in setting the material properties of shapes."}, :added "1.0", :name quil.core/ambient, :variadic false, :subcategory "Material Properties", :file "out/quil/core.cljc", :end-column 10, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([rgb] [x y z]), :arglists ([rgb] [x y z]), :arglists-meta (nil nil)}, :processing-name "ambient()", :method-params ([rgb] [x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 350, :end-line 356, :max-fixed-arity 3, :fn-var true, :arglists ([rgb] [x y z]), :doc "Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The\n color components set through the parameters define the\n reflectance. For example in the default color mode, setting x=255,\n y=126, z=0, would cause all the red light to reflect and half of the\n green light to reflect. Used in combination with emissive, specular,\n and shininess in setting the material properties of shapes."}, shear-y {:category "Transform", :protocol-inline nil, :meta {:category "Transform", :added "1.0", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "shearY()", :column 3, :requires-bindings true, :line 3801, :end-line 3801, :arglists (quote ([angle])), :doc "Shears a shape around the y-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n PI*2) or converted to radians with the radians() function. Objects\n are always sheared around their relative position to the origin and\n positive numbers shear objects in a clockwise direction.\n Transformations apply to everything that happens after and\n subsequent calls to the function accumulates the effect. For\n example, calling (shear-y (/ PI 2)) and then (shear-y (/ PI 2)) is\n the same as (shear-y PI). If shear-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function works in P2D or JAVA2D mode.\n\n Technically, shear-y multiplies the current transformation matrix\n by a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix fns."}, :added "1.0", :name quil.core/shear-y, :variadic false, :subcategory nil, :file "out/quil/core.cljc", :end-column 10, :processing-name "shearY()", :method-params ([angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 3795, :end-line 3801, :max-fixed-arity 1, :fn-var true, :arglists (quote ([angle])), :doc "Shears a shape around the y-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n PI*2) or converted to radians with the radians() function. Objects\n are always sheared around their relative position to the origin and\n positive numbers shear objects in a clockwise direction.\n Transformations apply to everything that happens after and\n subsequent calls to the function accumulates the effect. For\n example, calling (shear-y (/ PI 2)) and then (shear-y (/ PI 2)) is\n the same as (shear-y PI). If shear-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function works in P2D or JAVA2D mode.\n\n Technically, shear-y multiplies the current transformation matrix\n by a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix fns."}, cursor-modes {:name quil.core/cursor-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 72, :end-column 14, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 72, :column 2, :end-line 72, :end-column 14}, :tag cljs.core/IMap}, mouse-y {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Mouse", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "mouseY", :column 3, :requires-bindings true, :line 2631, :end-line 2631, :arglists (quote ([])), :doc "Current vertical coordinate of the mouse."}, :added "1.0", :name quil.core/mouse-y, :variadic false, :subcategory "Mouse", :file "out/quil/core.cljc", :end-column 10, :processing-name "mouseY", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2625, :end-line 2631, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Current vertical coordinate of the mouse."}, mouse-button {:category "Input", :protocol-inline nil, :meta {:category "Input", :added "1.0", :subcategory "Mouse", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "mouseButton", :column 3, :requires-bindings true, :line 2581, :end-line 2581, :arglists (quote ([])), :doc "The value of the system variable mouseButton is either :left, :right,\n or :center depending on which button is pressed. nil if no button pressed"}, :added "1.0", :name quil.core/mouse-button, :variadic false, :subcategory "Mouse", :file "out/quil/core.cljc", :end-column 15, :processing-name "mouseButton", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2575, :end-line 2581, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "The value of the system variable mouseButton is either :left, :right,\n or :center depending on which button is pressed. nil if no button pressed"}, p-shape-modes {:name quil.core/p-shape-modes, :file "out/quil/core.cljc", :line 45, :column 1, :end-line 63, :end-column 15, :meta {:file "/home/mediocregopher/src/viz/out/quil/core.cljc", :line 63, :column 2, :end-line 63, :end-column 15}, :tag cljs.core/IMap}, image {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([img x y] [img x y c d]), :arglists ([img x y] [img x y c d]), :arglists-meta (nil nil)}, :processing-name "image()", :column 3, :requires-bindings true, :line 2076, :end-line 2076, :arglists (quote ([img x y] [img x y c d])), :doc "Displays images to the screen. Processing currently works with GIF,\n JPEG, and Targa images. The color of an image may be modified with\n the tint function and if a GIF has transparency, it will maintain\n its transparency. The img parameter specifies the image to display\n and the x and y parameters define the location of the image from its\n upper-left corner. The image is displayed at its original size\n unless the width and height parameters specify a different size. The\n image-mode fn changes the way the parameters work. A call to\n (image-mode :corners) will change the width and height parameters to\n define the x and y values of the opposite corner of the image.\n\n Starting with release 0124, when using the default (JAVA2D)\n renderer, smooth will also improve image quality of resized\n images."}, :added "1.0", :name quil.core/image, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 5, :method-params ([img x y] [img x y c d]), :arglists ([img x y] [img x y c d]), :arglists-meta (nil nil)}, :processing-name "image()", :method-params ([img x y] [img x y c d]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2070, :end-line 2076, :max-fixed-arity 5, :fn-var true, :arglists ([img x y] [img x y c d]), :doc "Displays images to the screen. Processing currently works with GIF,\n JPEG, and Targa images. The color of an image may be modified with\n the tint function and if a GIF has transparency, it will maintain\n its transparency. The img parameter specifies the image to display\n and the x and y parameters define the location of the image from its\n upper-left corner. The image is displayed at its original size\n unless the width and height parameters specify a different size. The\n image-mode fn changes the way the parameters work. A call to\n (image-mode :corners) will change the width and height parameters to\n define the x and y values of the opposite corner of the image.\n\n Starting with release 0124, when using the default (JAVA2D)\n renderer, smooth will also improve image quality of resized\n images."}, unbinary {:category "Data", :protocol-inline nil, :meta {:category "Data", :require-binding false, :added "1.0", :subcategory "Conversion", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 11, :processing-name "unbinary()", :column 3, :line 4526, :end-line 4526, :arglists (quote ([str-val])), :doc "Unpack a binary string to an integer. See binary for converting\n integers to strings."}, :require-binding false, :added "1.0", :name quil.core/unbinary, :variadic false, :subcategory "Conversion", :file "out/quil/core.cljc", :end-column 11, :processing-name "unbinary()", :method-params ([str-val]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 4520, :end-line 4526, :max-fixed-arity 1, :fn-var true, :arglists (quote ([str-val])), :doc "Unpack a binary string to an integer. See binary for converting\n integers to strings."}, no-tint {:category "Image", :protocol-inline nil, :meta {:category "Image", :added "1.0", :subcategory "Loading & Displaying", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 10, :processing-name "noTint()", :column 3, :requires-bindings true, :line 2876, :end-line 2876, :arglists (quote ([])), :doc "Removes the current fill value for displaying images and reverts to\n displaying images with their original hues."}, :added "1.0", :name quil.core/no-tint, :variadic false, :subcategory "Loading & Displaying", :file "out/quil/core.cljc", :end-column 10, :processing-name "noTint()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2870, :end-line 2876, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Removes the current fill value for displaying images and reverts to\n displaying images with their original hues."}, no-lights {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Lights", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 12, :processing-name "noLights()", :column 3, :requires-bindings true, :line 2785, :end-line 2785, :arglists (quote ([])), :doc "Disable all lighting. Lighting is turned off by default and enabled\n with the lights fn. This function can be used to disable lighting so\n that 2D geometry (which does not require lighting) can be drawn\n after a set of lighted 3D geometry."}, :added "1.0", :name quil.core/no-lights, :variadic false, :subcategory "Lights", :file "out/quil/core.cljc", :end-column 12, :processing-name "noLights()", :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2779, :end-line 2785, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Disable all lighting. Lighting is turned off by default and enabled\n with the lights fn. This function can be used to disable lighting so\n that 2D geometry (which does not require lighting) can be drawn\n after a set of lighted 3D geometry."}, emissive-int {:category "Lights, Camera", :protocol-inline nil, :meta {:category "Lights, Camera", :added "1.0", :subcategory "Material Properties", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 15, :processing-name "emissive()", :column 3, :requires-bindings true, :line 1580, :end-line 1580, :arglists (quote ([int-val])), :doc "Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes. Converts all\n args to ints"}, :added "1.0", :name quil.core/emissive-int, :variadic false, :subcategory "Material Properties", :file "out/quil/core.cljc", :end-column 15, :processing-name "emissive()", :method-params ([int-val]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 1574, :end-line 1580, :max-fixed-arity 1, :fn-var true, :arglists (quote ([int-val])), :doc "Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes. Converts all\n args to ints"}, point {:category "Shape", :protocol-inline nil, :meta {:category "Shape", :added "1.0", :subcategory "2D Primitives", :file "/home/mediocregopher/src/viz/out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([x y] [x y z]), :arglists ([x y] [x y z]), :arglists-meta (nil nil)}, :processing-name "point()", :column 3, :requires-bindings true, :line 2995, :end-line 2995, :arglists (quote ([x y] [x y z])), :doc "Draws a point, a coordinate in space at the dimension of one\n pixel. The first parameter is the horizontal value for the point,\n the second value is the vertical value for the point, and the\n optional third value is the depth value. Drawing this shape in 3D\n using the z parameter requires the :P3D or :opengl renderer to be\n used."}, :added "1.0", :name quil.core/point, :variadic false, :subcategory "2D Primitives", :file "out/quil/core.cljc", :end-column 8, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([x y] [x y z]), :arglists ([x y] [x y z]), :arglists-meta (nil nil)}, :processing-name "point()", :method-params ([x y] [x y z]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings true, :line 2989, :end-line 2995, :max-fixed-arity 3, :fn-var true, :arglists ([x y] [x y z]), :doc "Draws a point, a coordinate in space at the dimension of one\n pixel. The first parameter is the horizontal value for the point,\n the second value is the vertical value for the point, and the\n optional third value is the depth value. Drawing this shape in 3D\n using the z parameter requires the :P3D or :opengl renderer to be\n used."}}, :require-macros {ap quil.sketch, quil.sketch quil.sketch, u quil.util, quil.util quil.util}, :cljs.analyzer/constants {:seen #{:shift .endDraw :open :baseline gr__8476__auto__ :disable-stroke-perspective :hsb :quads :arrow :dilate quil.core/current-fill try quil.core/*graphics* :quad-strip :down :disable-depth-mask cljs.core/binding :burn :posterize quil.sketch/with-sketch old-stroke__8848__auto__ :f8 quil.core/translate :screen :enable-depth-test :gray :enable-depth-sort :f1 :corner :disable-texture-mipmaps :darkest :f10 :dodge :bottom :bevel :disable-stroke-pure :replace :alt :top cljs.core/apply :disable-depth-test finally :pie quil.core/pop-matrix :enable-stroke-perspective :chord :rgb .dispose :lines :argb :move :f5 :command quil.core/stroke :miter :points old-fill__8840__auto__ :hand :close :radius :normal :threshold :up :center :round :disable-optimized-stroke cljs.core/let :corners :f11 :opaque gr__8872__auto__ :overlay :enable-opengl-errors :enable-stroke-pure :blur :project :triangle-fan :f3 :enable-depth-mask :f2 :control :difference quil.core/push-matrix :square :enable-optimized-stroke :p2d :shape :f12 :exclusion quil.core/fill :disable-opengl-errors :unknown-key :alpha :wait :right quil.core/current-stroke :repeat :hard-light quil.sketch$macros/defsketch :image :multiply :lightest quil.core/rotate tr__8864__auto__ :f7 :blend :disable-depth-sort :f9 :erode :add :soft-light quil.core/with-graphics :subtract :clamp :f6 :f4 :triangle-strip :cross tr__8856__auto__ :triangles .beginDraw :left :invert :text :enable-texture-mipmaps :model}, :order [:open :chord :pie :points :lines :triangles :triangle-fan :triangle-strip :quads :quad-strip :burn :screen :darkest :dodge :replace :overlay :difference :exclusion :hard-light :multiply :lightest :blend :add :soft-light :subtract :rgb :hsb :argb :alpha :center :radius :corner :corners :disable-stroke-perspective :disable-depth-mask :enable-depth-test :enable-depth-sort :disable-texture-mipmaps :disable-stroke-pure :disable-depth-test :enable-stroke-perspective :disable-optimized-stroke :enable-opengl-errors :enable-stroke-pure :enable-depth-mask :enable-optimized-stroke :disable-opengl-errors :disable-depth-sort :enable-texture-mipmaps :square :round :project :model :miter :bevel :left :right :top :bottom :baseline :shape :image :normal :clamp :repeat :threshold :gray :invert :posterize :blur :opaque :erode :dilate :arrow :cross :hand :move :text :wait :f10 :command :f8 :f5 :f2 :down :f6 :f7 :f11 :control :f4 :f1 :f12 :shift :f9 :up :alt :f3 quil.sketch/with-sketch :p2d cljs.core/let gr__8476__auto__ quil.core/with-graphics .dispose :close old-fill__8840__auto__ quil.core/current-fill cljs.core/apply quil.core/fill old-stroke__8848__auto__ quil.core/current-stroke quil.core/stroke tr__8856__auto__ quil.core/push-matrix try quil.core/translate finally quil.core/pop-matrix tr__8864__auto__ quil.core/rotate gr__8872__auto__ cljs.core/binding quil.core/*graphics* .beginDraw .endDraw quil.sketch$macros/defsketch :unknown-key]}, :doc "Wrappers and extensions around the core Processing.org API."} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/core.js b/src/http/static/viz/1/quil/core.js
new file mode 100644
index 0000000..87f3457
--- /dev/null
+++ b/src/http/static/viz/1/quil/core.js
@@ -0,0 +1,6643 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.core');
+goog.require('cljs.core');
+goog.require('clojure.string');
+goog.require('org.processingjs.Processing');
+goog.require('quil.sketch');
+goog.require('quil.util');
+quil.core._STAR_graphics_STAR_ = null;
+quil.core.no_fill_prop = "no-fill-quil";
+/**
+ * Graphics currently used for drawing. By default it is sketch graphics,
+ * but if called inside with-graphics macro - graphics passed to the macro
+ * is returned. This method should be used if you need to call some methods
+ * that are not implemented by quil. Example:
+ * (.beginDraw (current-graphics)).
+ */
+quil.core.current_graphics = (function quil$core$current_graphics(){
+var or__6814__auto__ = quil.core._STAR_graphics_STAR_;
+if(cljs.core.truth_(or__6814__auto__)){
+return or__6814__auto__;
+} else {
+return quil.sketch.current_applet.call(null);
+}
+});
+quil.core.arc_modes = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"open","open",-1763596448),(Processing.prototype.PConstants["OPEN"]),new cljs.core.Keyword(null,"chord","chord",-696248342),(Processing.prototype.PConstants["CHORD"]),new cljs.core.Keyword(null,"pie","pie",1530441672),(Processing.prototype.PConstants["PIE"])], null);
+
+quil.core.shape_modes = new cljs.core.PersistentArrayMap(null, 7, [new cljs.core.Keyword(null,"points","points",-1486596883),(Processing.prototype.PConstants["POINTS"]),new cljs.core.Keyword(null,"lines","lines",-700165781),(Processing.prototype.PConstants["LINES"]),new cljs.core.Keyword(null,"triangles","triangles",-1525417058),(Processing.prototype.PConstants["TRIANGLES"]),new cljs.core.Keyword(null,"triangle-fan","triangle-fan",1743150739),(Processing.prototype.PConstants["TRIANGLE_FAN"]),new cljs.core.Keyword(null,"triangle-strip","triangle-strip",221845500),(Processing.prototype.PConstants["TRIANGLE_STRIP"]),new cljs.core.Keyword(null,"quads","quads",1347497505),(Processing.prototype.PConstants["QUADS"]),new cljs.core.Keyword(null,"quad-strip","quad-strip",-1297270686),(Processing.prototype.PConstants["QUAD_STRIP"])], null);
+
+quil.core.blend_modes = cljs.core.PersistentHashMap.fromArrays([new cljs.core.Keyword(null,"burn","burn",-458179293),new cljs.core.Keyword(null,"screen","screen",1990059748),new cljs.core.Keyword(null,"darkest","darkest",68197253),new cljs.core.Keyword(null,"dodge","dodge",-1556666427),new cljs.core.Keyword(null,"replace","replace",-786587770),new cljs.core.Keyword(null,"overlay","overlay",-139131598),new cljs.core.Keyword(null,"difference","difference",1916101396),new cljs.core.Keyword(null,"exclusion","exclusion",531897910),new cljs.core.Keyword(null,"hard-light","hard-light",-37591145),new cljs.core.Keyword(null,"multiply","multiply",-1036907048),new cljs.core.Keyword(null,"lightest","lightest",-2043115912),new cljs.core.Keyword(null,"blend","blend",249565561),new cljs.core.Keyword(null,"add","add",235287739),new cljs.core.Keyword(null,"soft-light","soft-light",513207899),new cljs.core.Keyword(null,"subtract","subtract",2136988635)],[(Processing.prototype.PConstants["BURN"]),(Processing.prototype.PConstants["SCREEN"]),(Processing.prototype.PConstants["DARKEST"]),(Processing.prototype.PConstants["DODGE"]),(Processing.prototype.PConstants["REPLACE"]),(Processing.prototype.PConstants["OVERLAY"]),(Processing.prototype.PConstants["DIFFERENCE"]),(Processing.prototype.PConstants["EXCLUSION"]),(Processing.prototype.PConstants["HARD_LIGHT"]),(Processing.prototype.PConstants["MULTIPLY"]),(Processing.prototype.PConstants["LIGHTEST"]),(Processing.prototype.PConstants["BLEND"]),(Processing.prototype.PConstants["ADD"]),(Processing.prototype.PConstants["SOFT_LIGHT"]),(Processing.prototype.PConstants["SUBTRACT"])]);
+
+quil.core.color_modes = new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"rgb","rgb",1432123467),(Processing.prototype.PConstants["RGB"]),new cljs.core.Keyword(null,"hsb","hsb",-753472031),(Processing.prototype.PConstants["HSB"])], null);
+
+quil.core.image_formats = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"rgb","rgb",1432123467),(Processing.prototype.PConstants["RGB"]),new cljs.core.Keyword(null,"argb","argb",633844107),(Processing.prototype.PConstants["ARGB"]),new cljs.core.Keyword(null,"alpha","alpha",-1574982441),(Processing.prototype.PConstants["ALPHA"])], null);
+
+quil.core.ellipse_modes = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"]),new cljs.core.Keyword(null,"radius","radius",-2073122258),(Processing.prototype.PConstants["RADIUS"]),new cljs.core.Keyword(null,"corner","corner",1296717125),(Processing.prototype.PConstants["CORNER"]),new cljs.core.Keyword(null,"corners","corners",-137817903),(Processing.prototype.PConstants["CORNERS"])], null);
+
+quil.core.hint_options = cljs.core.PersistentHashMap.fromArrays([new cljs.core.Keyword(null,"disable-stroke-perspective","disable-stroke-perspective",479198433),new cljs.core.Keyword(null,"disable-depth-mask","disable-depth-mask",3298562),new cljs.core.Keyword(null,"enable-depth-test","enable-depth-test",1519326084),new cljs.core.Keyword(null,"enable-depth-sort","enable-depth-sort",-383089627),new cljs.core.Keyword(null,"disable-texture-mipmaps","disable-texture-mipmaps",1697917541),new cljs.core.Keyword(null,"disable-stroke-pure","disable-stroke-pure",735493926),new cljs.core.Keyword(null,"disable-depth-test","disable-depth-test",284606407),new cljs.core.Keyword(null,"enable-stroke-perspective","enable-stroke-perspective",-259923319),new cljs.core.Keyword(null,"disable-optimized-stroke","disable-optimized-stroke",74038544),new cljs.core.Keyword(null,"enable-opengl-errors","enable-opengl-errors",89998962),new cljs.core.Keyword(null,"enable-stroke-pure","enable-stroke-pure",881345587),new cljs.core.Keyword(null,"enable-depth-mask","enable-depth-mask",872785875),new cljs.core.Keyword(null,"enable-optimized-stroke","enable-optimized-stroke",1537575253),new cljs.core.Keyword(null,"disable-opengl-errors","disable-opengl-errors",506822839),new cljs.core.Keyword(null,"disable-depth-sort","disable-depth-sort",-1568352839),new cljs.core.Keyword(null,"enable-texture-mipmaps","enable-texture-mipmaps",1241892671)],[(Processing.prototype.PConstants["DISABLE_STROKE_PERSPECTIVE"]),(Processing.prototype.PConstants["DISABLE_DEPTH_MASK"]),(Processing.prototype.PConstants["ENABLE_DEPTH_TEST"]),(Processing.prototype.PConstants["ENABLE_DEPTH_SORT"]),(Processing.prototype.PConstants["DISABLE_TEXTURE_MIPMAPS"]),(Processing.prototype.PConstants["DISABLE_STROKE_PURE"]),(Processing.prototype.PConstants["DISABLE_DEPTH_TEST"]),(Processing.prototype.PConstants["ENABLE_STROKE_PERSPECTIVE"]),(Processing.prototype.PConstants["DISABLE_OPTIMIZED_STROKE"]),(Processing.prototype.PConstants["ENABLE_OPENGL_ERRORS"]),(Processing.prototype.PConstants["ENABLE_STROKE_PURE"]),(Processing.prototype.PConstants["ENABLE_DEPTH_MASK"]),(Processing.prototype.PConstants["ENABLE_OPTIMIZED_STROKE"]),(Processing.prototype.PConstants["DISABLE_OPENGL_ERRORS"]),(Processing.prototype.PConstants["DISABLE_DEPTH_SORT"]),(Processing.prototype.PConstants["ENABLE_TEXTURE_MIPMAPS"])]);
+
+quil.core.image_modes = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"corner","corner",1296717125),(Processing.prototype.PConstants["CORNER"]),new cljs.core.Keyword(null,"corners","corners",-137817903),(Processing.prototype.PConstants["CORNERS"]),new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"])], null);
+
+quil.core.rect_modes = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"corner","corner",1296717125),(Processing.prototype.PConstants["CORNER"]),new cljs.core.Keyword(null,"corners","corners",-137817903),(Processing.prototype.PConstants["CORNERS"]),new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"]),new cljs.core.Keyword(null,"radius","radius",-2073122258),(Processing.prototype.PConstants["RADIUS"])], null);
+
+quil.core.p_shape_modes = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"corner","corner",1296717125),(Processing.prototype.PConstants["CORNER"]),new cljs.core.Keyword(null,"corners","corners",-137817903),(Processing.prototype.PConstants["CORNERS"]),new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"])], null);
+
+quil.core.stroke_cap_modes = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"square","square",812434677),(Processing.prototype.PConstants["SQUARE"]),new cljs.core.Keyword(null,"round","round",2009433328),(Processing.prototype.PConstants["ROUND"]),new cljs.core.Keyword(null,"project","project",1124394579),(Processing.prototype.PConstants["PROJECT"]),new cljs.core.Keyword(null,"model","model",331153215),(Processing.prototype.PConstants["MODEL"])], null);
+
+quil.core.stroke_join_modes = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"miter","miter",327727052),(Processing.prototype.PConstants["MITER"]),new cljs.core.Keyword(null,"bevel","bevel",2090515654),(Processing.prototype.PConstants["BEVEL"]),new cljs.core.Keyword(null,"round","round",2009433328),(Processing.prototype.PConstants["ROUND"])], null);
+
+quil.core.horizontal_alignment_modes = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"left","left",-399115937),(Processing.prototype.PConstants["LEFT"]),new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"]),new cljs.core.Keyword(null,"right","right",-452581833),(Processing.prototype.PConstants["RIGHT"])], null);
+
+quil.core.vertical_alignment_modes = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"top","top",-1856271961),(Processing.prototype.PConstants["TOP"]),new cljs.core.Keyword(null,"bottom","bottom",-1550509018),(Processing.prototype.PConstants["BOTTOM"]),new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"]),new cljs.core.Keyword(null,"baseline","baseline",1151033280),(Processing.prototype.PConstants["BASELINE"])], null);
+
+quil.core.text_modes = new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"model","model",331153215),(Processing.prototype.PConstants["MODEL"]),new cljs.core.Keyword(null,"shape","shape",1190694006),(Processing.prototype.PConstants["SHAPE"])], null);
+
+quil.core.texture_modes = new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"image","image",-58725096),(Processing.prototype.PConstants["IMAGE"]),new cljs.core.Keyword(null,"normal","normal",-1519123858),(Processing.prototype.PConstants["NORMAL"])], null);
+
+quil.core.texture_wrap_modes = new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"clamp","clamp",1803814940),(Processing.prototype.PConstants["CLAMP"]),new cljs.core.Keyword(null,"repeat","repeat",832692087),(Processing.prototype.PConstants["REPEAT"])], null);
+
+quil.core.filter_modes = new cljs.core.PersistentArrayMap(null, 8, [new cljs.core.Keyword(null,"threshold","threshold",204221583),(Processing.prototype.PConstants["THRESHOLD"]),new cljs.core.Keyword(null,"gray","gray",1013268388),(Processing.prototype.PConstants["GRAY"]),new cljs.core.Keyword(null,"invert","invert",1553577503),(Processing.prototype.PConstants["INVERT"]),new cljs.core.Keyword(null,"posterize","posterize",-148251901),(Processing.prototype.PConstants["POSTERIZE"]),new cljs.core.Keyword(null,"blur","blur",-453500461),(Processing.prototype.PConstants["BLUR"]),new cljs.core.Keyword(null,"opaque","opaque",-1243552654),(Processing.prototype.PConstants["OPAQUE"]),new cljs.core.Keyword(null,"erode","erode",1539530618),(Processing.prototype.PConstants["ERODE"]),new cljs.core.Keyword(null,"dilate","dilate",1504745153),(Processing.prototype.PConstants["DILATE"])], null);
+
+quil.core.cursor_modes = new cljs.core.PersistentArrayMap(null, 6, [new cljs.core.Keyword(null,"arrow","arrow",1071351425),(Processing.prototype.PConstants["ARROW"]),new cljs.core.Keyword(null,"cross","cross",194557789),(Processing.prototype.PConstants["CROSS"]),new cljs.core.Keyword(null,"hand","hand",791601933),(Processing.prototype.PConstants["HAND"]),new cljs.core.Keyword(null,"move","move",-2110884309),(Processing.prototype.PConstants["MOVE"]),new cljs.core.Keyword(null,"text","text",-1790561697),(Processing.prototype.PConstants["TEXT"]),new cljs.core.Keyword(null,"wait","wait",-260664777),(Processing.prototype.PConstants["WAIT"])], null);
+quil.core.PI = Math.PI;
+quil.core.HALF_PI = (quil.core.PI / 2.0);
+quil.core.THIRD_PI = (quil.core.PI / 3.0);
+quil.core.QUARTER_PI = (quil.core.PI / 4.0);
+quil.core.TWO_PI = (quil.core.PI * 2.0);
+quil.core.DEG_TO_RAD = (quil.core.PI / 180.0);
+quil.core.RAD_TO_DEG = (180.0 / quil.core.PI);
+quil.core.KEY_CODES = cljs.core.PersistentHashMap.fromArrays([(121),(39),(157),(119),(116),(113),(40),(117),(118),(122),(17),(115),(112),(123),(16),(120),(38),(18),(114),(37)],[new cljs.core.Keyword(null,"f10","f10",627525541),new cljs.core.Keyword(null,"right","right",-452581833),new cljs.core.Keyword(null,"command","command",-894540724),new cljs.core.Keyword(null,"f8","f8",-2141475484),new cljs.core.Keyword(null,"f5","f5",1587057387),new cljs.core.Keyword(null,"f2","f2",396168596),new cljs.core.Keyword(null,"down","down",1565245570),new cljs.core.Keyword(null,"f6","f6",2103080604),new cljs.core.Keyword(null,"f7","f7",356150168),new cljs.core.Keyword(null,"f11","f11",-1417398799),new cljs.core.Keyword(null,"control","control",1892578036),new cljs.core.Keyword(null,"f4","f4",990968764),new cljs.core.Keyword(null,"f1","f1",1714532389),new cljs.core.Keyword(null,"f12","f12",853352790),new cljs.core.Keyword(null,"shift","shift",997140064),new cljs.core.Keyword(null,"f9","f9",704633338),new cljs.core.Keyword(null,"up","up",-269712113),new cljs.core.Keyword(null,"alt","alt",-3214426),new cljs.core.Keyword(null,"f3","f3",1954829043),new cljs.core.Keyword(null,"left","left",-399115937)]);
+/**
+ * Writes to the text area of the Processing environment's console.
+ * This is often helpful for looking at the data a program is producing.
+ * Each call to this function creates a new line of output.
+ * Individual elements can be separated with quotes ("") and joined with the string concatenation operator (+).
+ * Also writes the content of an array to the text area of the Processing environment.
+ * This is often helpful for looking at the data a program is producing.
+ * A new line is put between each element of the array. This function can only print 1D arrays,
+ * but can test to see if the content are null or not null for 2+ dimensional arrays.
+ */
+quil.core.prc_println = (function quil$core$prc_println(msg){
+return quil.sketch.current_applet.call(null).println(msg);
+});
+/**
+ * Writes to the console area of the Processing environment.
+ * This is often helpful for looking at the data a program is producing.
+ * The companion function println() works like print(), but creates a new line of text for each call to the function.
+ * Individual elements can be separated with quotes ("") and joined with the addition operator (+).
+ */
+quil.core.prc_print = (function quil$core$prc_print(msg){
+return quil.sketch.current_applet.call(null).print(msg);
+});
+/**
+ * Returns sketch object by id of canvas element of sketch.
+ */
+quil.core.get_sketch_by_id = (function quil$core$get_sketch_by_id(id){
+return Processing.getInstanceById(id);
+});
+quil.core.with_sketch = (function quil$core$with_sketch(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8277 = arguments.length;
+var i__7928__auto___8278 = (0);
+while(true){
+if((i__7928__auto___8278 < len__7927__auto___8277)){
+args__7934__auto__.push((arguments[i__7928__auto___8278]));
+
+var G__8279 = (i__7928__auto___8278 + (1));
+i__7928__auto___8278 = G__8279;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((3) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((3)),(0),null)):null);
+return quil.core.with_sketch.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7935__auto__);
+});
+
+quil.core.with_sketch.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,applet,body){
+if(cljs.core.truth_(quil.util.clj_compilation_QMARK_.call(null))){
+return null;
+} else {
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.sketch","with-sketch","quil.sketch/with-sketch",-634067708,null)),(function (){var x__7656__auto__ = applet;
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),body)));
+}
+});
+
+quil.core.with_sketch.cljs$lang$maxFixedArity = (3);
+
+quil.core.with_sketch.cljs$lang$applyTo = (function (seq8273){
+var G__8274 = cljs.core.first.call(null,seq8273);
+var seq8273__$1 = cljs.core.next.call(null,seq8273);
+var G__8275 = cljs.core.first.call(null,seq8273__$1);
+var seq8273__$2 = cljs.core.next.call(null,seq8273__$1);
+var G__8276 = cljs.core.first.call(null,seq8273__$2);
+var seq8273__$3 = cljs.core.next.call(null,seq8273__$2);
+return quil.core.with_sketch.cljs$core$IFn$_invoke$arity$variadic(G__8274,G__8275,G__8276,seq8273__$3);
+});
+
+
+quil.core.with_sketch.cljs$lang$macro = true;
+/**
+ * Retrieve sketch-specific state-atom. All changes to the
+ * atom will be reflected in the state.
+ *
+ * (set-state! :foo 1)
+ * (state :foo) ;=> 1
+ * (swap! (state-atom) update-in [:foo] inc)
+ * (state :foo) ;=> 2
+ */
+quil.core.state_atom = (function quil$core$state_atom(){
+return quil.sketch.current_applet.call(null).quil;
+});
+/**
+ * Retrieve sketch-specific state by key. Must initially call
+ * set-state! to store state. If no parameter passed whole
+ * state map is returned.
+ *
+ * (set-state! :foo 1)
+ * (state :foo) ;=> 1
+ * (state) ;=> {:foo 1}
+ */
+quil.core.state = (function quil$core$state(var_args){
+var args8280 = [];
+var len__7927__auto___8283 = arguments.length;
+var i__7928__auto___8284 = (0);
+while(true){
+if((i__7928__auto___8284 < len__7927__auto___8283)){
+args8280.push((arguments[i__7928__auto___8284]));
+
+var G__8285 = (i__7928__auto___8284 + (1));
+i__7928__auto___8284 = G__8285;
+continue;
+} else {
+}
+break;
+}
+
+var G__8282 = args8280.length;
+switch (G__8282) {
+case 0:
+return quil.core.state.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.state.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8280.length)].join('')));
+
+}
+});
+
+quil.core.state.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.deref.call(null,quil.core.state_atom.call(null));
+});
+
+quil.core.state.cljs$core$IFn$_invoke$arity$1 = (function (key){
+var state = quil.core.state.call(null);
+if(cljs.core.contains_QMARK_.call(null,state,key)){
+} else {
+throw Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Unable to find state with key: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(key)].join(''));
+}
+
+return cljs.core.get.call(null,state,key);
+});
+
+quil.core.state.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Set sketch-specific state. May only be called once (ideally in the
+ * setup fn). Subsequent calls have no effect.
+ *
+ * Example:
+ * (set-state! :foo 1 :bar (atom true) :baz (/ (width) 2))
+ */
+quil.core.set_state_BANG_ = (function quil$core$set_state_BANG_(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8288 = arguments.length;
+var i__7928__auto___8289 = (0);
+while(true){
+if((i__7928__auto___8289 < len__7927__auto___8288)){
+args__7934__auto__.push((arguments[i__7928__auto___8289]));
+
+var G__8290 = (i__7928__auto___8289 + (1));
+i__7928__auto___8289 = G__8290;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((0) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((0)),(0),null)):null);
+return quil.core.set_state_BANG_.cljs$core$IFn$_invoke$arity$variadic(argseq__7935__auto__);
+});
+
+quil.core.set_state_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (state_vals){
+var state_STAR_ = quil.core.state_atom.call(null);
+if(cljs.core.truth_(cljs.core.deref.call(null,state_STAR_))){
+return null;
+} else {
+var state_map = cljs.core.apply.call(null,cljs.core.hash_map,state_vals);
+return cljs.core.reset_BANG_.call(null,state_STAR_,state_map);
+}
+});
+
+quil.core.set_state_BANG_.cljs$lang$maxFixedArity = (0);
+
+quil.core.set_state_BANG_.cljs$lang$applyTo = (function (seq8287){
+return quil.core.set_state_BANG_.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq8287));
+});
+
+/**
+ * Calculates the absolute value (magnitude) of a number. The
+ * absolute value of a number is always positive. Dynamically casts to
+ * an int or float appropriately
+ */
+quil.core.abs = (function quil$core$abs(n){
+return quil.sketch.current_applet.call(null).abs(n);
+});
+/**
+ * The inverse of cos, returns the arc cosine of a value. This
+ * function expects the values in the range of -1 to 1 and values are
+ * returned in the range 0 to Math/PI (3.1415927).
+ */
+quil.core.acos = (function quil$core$acos(n){
+return quil.sketch.current_applet.call(null).acos(n);
+});
+/**
+ * Extracts the alpha value from a color.
+ */
+quil.core.alpha = (function quil$core$alpha(color){
+return quil.core.current_graphics.call(null).alpha(cljs.core.unchecked_int.call(null,color));
+});
+/**
+ * Sets the ambient reflectance for shapes drawn to the screen. This
+ * is combined with the ambient light component of environment. The
+ * color components set through the parameters define the
+ * reflectance. For example in the default color mode, setting x=255,
+ * y=126, z=0, would cause all the red light to reflect and half of the
+ * green light to reflect. Used in combination with emissive, specular,
+ * and shininess in setting the material properties of shapes.
+ */
+quil.core.ambient_float = (function quil$core$ambient_float(var_args){
+var args8291 = [];
+var len__7927__auto___8294 = arguments.length;
+var i__7928__auto___8295 = (0);
+while(true){
+if((i__7928__auto___8295 < len__7927__auto___8294)){
+args8291.push((arguments[i__7928__auto___8295]));
+
+var G__8296 = (i__7928__auto___8295 + (1));
+i__7928__auto___8295 = G__8296;
+continue;
+} else {
+}
+break;
+}
+
+var G__8293 = args8291.length;
+switch (G__8293) {
+case 1:
+return quil.core.ambient_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.ambient_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8291.length)].join('')));
+
+}
+});
+
+quil.core.ambient_float.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).ambient(gray);
+});
+
+quil.core.ambient_float.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).ambient(x,y,z);
+});
+
+quil.core.ambient_float.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Sets the ambient reflectance for shapes drawn to the screen. This
+ * is combined with the ambient light component of environment. The rgb
+ * color components set define the reflectance. Used in combination
+ * with emissive, specular, and shininess in setting the material
+ * properties of shapes.
+ */
+quil.core.ambient_int = (function quil$core$ambient_int(rgb){
+return quil.core.current_graphics.call(null).ambient((rgb | (0)));
+});
+/**
+ * Sets the ambient reflectance for shapes drawn to the screen. This
+ * is combined with the ambient light component of environment. The
+ * color components set through the parameters define the
+ * reflectance. For example in the default color mode, setting x=255,
+ * y=126, z=0, would cause all the red light to reflect and half of the
+ * green light to reflect. Used in combination with emissive, specular,
+ * and shininess in setting the material properties of shapes.
+ */
+quil.core.ambient = (function quil$core$ambient(var_args){
+var args8298 = [];
+var len__7927__auto___8301 = arguments.length;
+var i__7928__auto___8302 = (0);
+while(true){
+if((i__7928__auto___8302 < len__7927__auto___8301)){
+args8298.push((arguments[i__7928__auto___8302]));
+
+var G__8303 = (i__7928__auto___8302 + (1));
+i__7928__auto___8302 = G__8303;
+continue;
+} else {
+}
+break;
+}
+
+var G__8300 = args8298.length;
+switch (G__8300) {
+case 1:
+return quil.core.ambient.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.ambient.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8298.length)].join('')));
+
+}
+});
+
+quil.core.ambient.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.ambient_float.call(null,rgb);
+});
+
+quil.core.ambient.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.ambient_float.call(null,x,y,z);
+});
+
+quil.core.ambient.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Adds an ambient light. Ambient light doesn't come from a specific direction,
+ * the rays have light have bounced around so much that objects are
+ * evenly lit from all sides. Ambient lights are almost always used in
+ * combination with other types of lights. Lights need to be included
+ * in the draw to remain persistent in a looping program. Placing them
+ * in the setup of a looping program will cause them to only have an
+ * effect the first time through the loop. The effect of the
+ * parameters is determined by the current color mode.
+ */
+quil.core.ambient_light = (function quil$core$ambient_light(var_args){
+var args8305 = [];
+var len__7927__auto___8308 = arguments.length;
+var i__7928__auto___8309 = (0);
+while(true){
+if((i__7928__auto___8309 < len__7927__auto___8308)){
+args8305.push((arguments[i__7928__auto___8309]));
+
+var G__8310 = (i__7928__auto___8309 + (1));
+i__7928__auto___8309 = G__8310;
+continue;
+} else {
+}
+break;
+}
+
+var G__8307 = args8305.length;
+switch (G__8307) {
+case 3:
+return quil.core.ambient_light.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 6:
+return quil.core.ambient_light.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8305.length)].join('')));
+
+}
+});
+
+quil.core.ambient_light.cljs$core$IFn$_invoke$arity$3 = (function (red,green,blue){
+return quil.core.current_graphics.call(null).ambientLight(red,green,blue);
+});
+
+quil.core.ambient_light.cljs$core$IFn$_invoke$arity$6 = (function (red,green,blue,x,y,z){
+return quil.core.current_graphics.call(null).ambientLight(red,green,blue,x,y,z);
+});
+
+quil.core.ambient_light.cljs$lang$maxFixedArity = 6;
+
+/**
+ * Multiplies the current matrix by the one specified through the
+ * parameters. This is very slow because it will try to calculate the
+ * inverse of the transform, so avoid it whenever possible. The
+ * equivalent function in OpenGL is glMultMatrix().
+ */
+quil.core.apply_matrix = (function quil$core$apply_matrix(n00,n01,n02,n03,n10,n11,n12,n13,n20,n21,n22,n23,n30,n31,n32,n33){
+return quil.core.current_graphics.call(null).applyMatrix(n00,n01,n02,n03,n10,n11,n12,n13,n20,n21,n22,n23,n30,n31,n32,n33);
+});
+/**
+ * Draws an arc in the display window. Arcs are drawn along the outer
+ * edge of an ellipse defined by the x, y, width and height
+ * parameters. The origin or the arc's ellipse may be changed with the
+ * ellipse-mode function. The start and stop parameters specify the
+ * angles at which to draw the arc. The mode is either :open, :chord or :pie.
+ */
+quil.core.arc = (function quil$core$arc(x,y,width,height,start,stop){
+return quil.core.current_graphics.call(null).arc(x,y,width,height,start,stop);
+});
+/**
+ * The inverse of sin, returns the arc sine of a value. This function
+ * expects the values in the range of -1 to 1 and values are returned
+ * in the range -PI/2 to PI/2.
+ */
+quil.core.asin = (function quil$core$asin(n){
+return quil.sketch.current_applet.call(null).asin(n);
+});
+/**
+ * The inverse of tan, returns the arc tangent of a value. This
+ * function expects the values in the range of -Infinity to
+ * Infinity (exclusive) and values are returned in the range -PI/2 to
+ * PI/2 .
+ */
+quil.core.atan = (function quil$core$atan(n){
+return quil.sketch.current_applet.call(null).atan(n);
+});
+/**
+ * Calculates the angle (in radians) from a specified point to the
+ * coordinate origin as measured from the positive x-axis. Values are
+ * returned as a float in the range from PI to -PI. The atan2 function
+ * is most often used for orienting geometry to the position of the
+ * cursor. Note: The y-coordinate of the point is the first parameter
+ * and the x-coordinate is the second due to the structure of
+ * calculating the tangent.
+ */
+quil.core.atan2 = (function quil$core$atan2(y,x){
+return quil.sketch.current_applet.call(null).atan2(y,x);
+});
+/**
+ * A sequence of strings representing the fonts on this system
+ * available for use.
+ *
+ * Because of limitations in Java, not all fonts can be used and some
+ * might work with one operating system and not others. When sharing a
+ * sketch with other people or posting it on the web, you may need to
+ * include a .ttf or .otf version of your font in the data directory of
+ * the sketch because other people might not have the font installed on
+ * their computer. Only fonts that can legally be distributed should be
+ * included with a sketch.
+ */
+quil.core.available_fonts = (function quil$core$available_fonts(){
+return cljs.core.seq.call(null,PFont.list());
+});
+/**
+ * Sets the color used for the background of the Processing
+ * window. The default background is light gray. In the draw function,
+ * the background color is used to clear the display window at the
+ * beginning of each frame.
+ *
+ * It is not possible to use transparency (alpha) in background colors
+ * with the main drawing surface, however they will work properly with
+ * create-graphics. Converts args to floats.
+ */
+quil.core.background_float = (function quil$core$background_float(var_args){
+var args8312 = [];
+var len__7927__auto___8315 = arguments.length;
+var i__7928__auto___8316 = (0);
+while(true){
+if((i__7928__auto___8316 < len__7927__auto___8315)){
+args8312.push((arguments[i__7928__auto___8316]));
+
+var G__8317 = (i__7928__auto___8316 + (1));
+i__7928__auto___8316 = G__8317;
+continue;
+} else {
+}
+break;
+}
+
+var G__8314 = args8312.length;
+switch (G__8314) {
+case 1:
+return quil.core.background_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.background_float.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.background_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.background_float.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8312.length)].join('')));
+
+}
+});
+
+quil.core.background_float.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).background(gray);
+});
+
+quil.core.background_float.cljs$core$IFn$_invoke$arity$2 = (function (gray,alpha){
+return quil.core.current_graphics.call(null).background(gray,alpha);
+});
+
+quil.core.background_float.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.current_graphics.call(null).background(r,g,b);
+});
+
+quil.core.background_float.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.current_graphics.call(null).background(r,g,b,a);
+});
+
+quil.core.background_float.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Sets the color used for the background of the Processing
+ * window. The default background is light gray. In the draw function,
+ * the background color is used to clear the display window at the
+ * beginning of each frame.
+ *
+ * It is not possible to use transparency (alpha) in background colors
+ * with the main drawing surface, however they will work properly with
+ * create-graphics. Converts rgb to an int and alpha to a float.
+ */
+quil.core.background_int = (function quil$core$background_int(var_args){
+var args8319 = [];
+var len__7927__auto___8322 = arguments.length;
+var i__7928__auto___8323 = (0);
+while(true){
+if((i__7928__auto___8323 < len__7927__auto___8322)){
+args8319.push((arguments[i__7928__auto___8323]));
+
+var G__8324 = (i__7928__auto___8323 + (1));
+i__7928__auto___8323 = G__8324;
+continue;
+} else {
+}
+break;
+}
+
+var G__8321 = args8319.length;
+switch (G__8321) {
+case 1:
+return quil.core.background_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.background_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8319.length)].join('')));
+
+}
+});
+
+quil.core.background_int.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.current_graphics.call(null).background(cljs.core.unchecked_int.call(null,rgb));
+});
+
+quil.core.background_int.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.current_graphics.call(null).background(cljs.core.unchecked_int.call(null,rgb),alpha);
+});
+
+quil.core.background_int.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the color used for the background of the Processing
+ * window. The default background is light gray. In the draw function,
+ * the background color is used to clear the display window at the
+ * beginning of each frame.
+ *
+ * It is not possible to use transparency (alpha) in background colors
+ * with the main drawing surface, however they will work properly with
+ * create-graphics. Converts args to floats.
+ */
+quil.core.background = (function quil$core$background(var_args){
+var args8326 = [];
+var len__7927__auto___8329 = arguments.length;
+var i__7928__auto___8330 = (0);
+while(true){
+if((i__7928__auto___8330 < len__7927__auto___8329)){
+args8326.push((arguments[i__7928__auto___8330]));
+
+var G__8331 = (i__7928__auto___8330 + (1));
+i__7928__auto___8330 = G__8331;
+continue;
+} else {
+}
+break;
+}
+
+var G__8328 = args8326.length;
+switch (G__8328) {
+case 1:
+return quil.core.background.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.background.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.background.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.background.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8326.length)].join('')));
+
+}
+});
+
+quil.core.background.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.current_graphics.call(null).background(rgb);
+});
+
+quil.core.background.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.current_graphics.call(null).background(rgb,alpha);
+});
+
+quil.core.background.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.background_float.call(null,r,g,b);
+});
+
+quil.core.background.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.background_float.call(null,r,g,b,a);
+});
+
+quil.core.background.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Specify an image to be used as the background for a sketch. Its
+ * width and height must be the same size as the sketch window. Images
+ * used as background will ignore the current tint setting.
+ */
+quil.core.background_image = (function quil$core$background_image(img){
+return quil.core.current_graphics.call(null).background(img);
+});
+/**
+ * Sets the matrix mode to the camera matrix so calls such as
+ * translate, rotate, apply-matrix and reset-matrix affect the
+ * camera. begin-camera should always be used with a following
+ * end-camera and pairs of begin-camera and end-camera cannot be
+ * nested.
+ *
+ * For most situations the camera function will be sufficient.
+ */
+quil.core.begin_camera = (function quil$core$begin_camera(){
+return quil.core.current_graphics.call(null).beginCamera();
+});
+/**
+ * Use the begin-contour and end-contour function to create negative
+ * shapes within shapes. These functions can only be within a
+ * begin-shape/end-shape pair and they only work with the :p2d and :p3d
+ * renderers.
+ */
+quil.core.begin_contour = (function quil$core$begin_contour(){
+return quil.core.current_graphics.call(null).beginContour();
+});
+/**
+ * Enables the creation of complex forms. begin-shape begins recording
+ * vertices for a shape and end-shape stops recording. Use the mode
+ * keyword to specify which shape create from the provided
+ * vertices. With no mode specified, the shape can be any irregular
+ * polygon.
+ *
+ * The available mode keywords are :points, :lines, :triangles,
+ * :triangle-fan, :triangle-strip,
+ * :quads, :quad-strip.
+ *
+ * After calling the begin-shape function, a series of vertex commands
+ * must follow. To stop drawing the shape, call end-shape. The vertex
+ * function with two parameters specifies a position in 2D and the
+ * vertex function with three parameters specifies a position in
+ * 3D. Each shape will be outlined with the current stroke color and
+ * filled with the fill color.
+ *
+ * Transformations such as translate, rotate, and scale do not work
+ * within begin-shape. It is also not possible to use other shapes,
+ * such as ellipse or rect within begin-shape.
+ */
+quil.core.begin_shape = (function quil$core$begin_shape(var_args){
+var args8333 = [];
+var len__7927__auto___8336 = arguments.length;
+var i__7928__auto___8337 = (0);
+while(true){
+if((i__7928__auto___8337 < len__7927__auto___8336)){
+args8333.push((arguments[i__7928__auto___8337]));
+
+var G__8338 = (i__7928__auto___8337 + (1));
+i__7928__auto___8337 = G__8338;
+continue;
+} else {
+}
+break;
+}
+
+var G__8335 = args8333.length;
+switch (G__8335) {
+case 0:
+return quil.core.begin_shape.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.begin_shape.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8333.length)].join('')));
+
+}
+});
+
+quil.core.begin_shape.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).beginShape();
+});
+
+quil.core.begin_shape.cljs$core$IFn$_invoke$arity$1 = (function (mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.shape_modes);
+return quil.core.current_graphics.call(null).beginShape((mode__$1 | (0)));
+});
+
+quil.core.begin_shape.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Draws a Bezier curve on the screen. These curves are defined by a
+ * series of anchor and control points. The first two parameters
+ * specify the first anchor point and the last two parameters specify
+ * the other anchor point. The middle parameters specify the control
+ * points which define the shape of the curve.
+ */
+quil.core.bezier = (function quil$core$bezier(var_args){
+var args8340 = [];
+var len__7927__auto___8343 = arguments.length;
+var i__7928__auto___8344 = (0);
+while(true){
+if((i__7928__auto___8344 < len__7927__auto___8343)){
+args8340.push((arguments[i__7928__auto___8344]));
+
+var G__8345 = (i__7928__auto___8344 + (1));
+i__7928__auto___8344 = G__8345;
+continue;
+} else {
+}
+break;
+}
+
+var G__8342 = args8340.length;
+switch (G__8342) {
+case 8:
+return quil.core.bezier.cljs$core$IFn$_invoke$arity$8((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]));
+
+break;
+case 12:
+return quil.core.bezier.cljs$core$IFn$_invoke$arity$12((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8340.length)].join('')));
+
+}
+});
+
+quil.core.bezier.cljs$core$IFn$_invoke$arity$8 = (function (x1,y1,cx1,cy1,cx2,cy2,x2,y2){
+return quil.core.current_graphics.call(null).bezier(x1,y1,cx1,cy1,cx2,cy2,x2,y2);
+});
+
+quil.core.bezier.cljs$core$IFn$_invoke$arity$12 = (function (x1,y1,z1,cx1,cy1,cz1,cx2,cy2,cz2,x2,y2,z2){
+return quil.core.current_graphics.call(null).bezier(x1,y1,z1,cx1,cy1,cz1,cx2,cy2,cz2,x2,y2,z2);
+});
+
+quil.core.bezier.cljs$lang$maxFixedArity = 12;
+
+/**
+ * Sets the resolution at which Beziers display. The default value is
+ * 20. This function is only useful when using the :p3d or :opengl
+ * renderer as the default (:java2d) renderer does not use this
+ * information.
+ */
+quil.core.bezier_detail = (function quil$core$bezier_detail(detail){
+return quil.core.current_graphics.call(null).bezierDetail((detail | (0)));
+});
+/**
+ * Evaluates the Bezier at point t for points a, b, c, d. The
+ * parameter t varies between 0 and 1, a and d are points on the curve,
+ * and b and c are the control points. This can be done once with the x
+ * coordinates and a second time with the y coordinates to get the
+ * location of a bezier curve at t.
+ */
+quil.core.bezier_point = (function quil$core$bezier_point(a,b,c,d,t){
+return quil.core.current_graphics.call(null).bezierPoint(a,b,c,d,t);
+});
+/**
+ * Calculates the tangent of a point on a Bezier curve.
+ * (See http://en.wikipedia.org/wiki/Tangent)
+ */
+quil.core.bezier_tangent = (function quil$core$bezier_tangent(a,b,c,d,t){
+return quil.core.current_graphics.call(null).bezierTangent(a,b,c,d,t);
+});
+/**
+ * Specifies vertex coordinates for Bezier curves. Each call to
+ * bezier-vertex defines the position of two control points and one
+ * anchor point of a Bezier curve, adding a new segment to a line or
+ * shape. The first time bezier-vertex is used within a begin-shape
+ * call, it must be prefaced with a call to vertex to set the first
+ * anchor point. This function must be used between begin-shape and
+ * end-shape and only when there is no parameter specified to
+ * begin-shape.
+ */
+quil.core.bezier_vertex = (function quil$core$bezier_vertex(var_args){
+var args8347 = [];
+var len__7927__auto___8350 = arguments.length;
+var i__7928__auto___8351 = (0);
+while(true){
+if((i__7928__auto___8351 < len__7927__auto___8350)){
+args8347.push((arguments[i__7928__auto___8351]));
+
+var G__8352 = (i__7928__auto___8351 + (1));
+i__7928__auto___8351 = G__8352;
+continue;
+} else {
+}
+break;
+}
+
+var G__8349 = args8347.length;
+switch (G__8349) {
+case 6:
+return quil.core.bezier_vertex.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+case 9:
+return quil.core.bezier_vertex.cljs$core$IFn$_invoke$arity$9((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8347.length)].join('')));
+
+}
+});
+
+quil.core.bezier_vertex.cljs$core$IFn$_invoke$arity$6 = (function (cx1,cy1,cx2,cy2,x,y){
+return quil.core.current_graphics.call(null).bezierVertex(cx1,cy1,cx2,cy2,x,y);
+});
+
+quil.core.bezier_vertex.cljs$core$IFn$_invoke$arity$9 = (function (cx1,cy1,cz1,cx2,cy2,cz2,x,y,z){
+return quil.core.current_graphics.call(null).bezierVertex(cx1,cy1,cz1,cx2,cy2,cz2,x,y,z);
+});
+
+quil.core.bezier_vertex.cljs$lang$maxFixedArity = 9;
+
+/**
+ * Returns a string representing the binary value of an int, char or
+ * byte. When converting an int to a string, it is possible to specify
+ * the number of digits used.
+ */
+quil.core.binary = (function quil$core$binary(var_args){
+var args8354 = [];
+var len__7927__auto___8357 = arguments.length;
+var i__7928__auto___8358 = (0);
+while(true){
+if((i__7928__auto___8358 < len__7927__auto___8357)){
+args8354.push((arguments[i__7928__auto___8358]));
+
+var G__8359 = (i__7928__auto___8358 + (1));
+i__7928__auto___8358 = G__8359;
+continue;
+} else {
+}
+break;
+}
+
+var G__8356 = args8354.length;
+switch (G__8356) {
+case 1:
+return quil.core.binary.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.binary.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8354.length)].join('')));
+
+}
+});
+
+quil.core.binary.cljs$core$IFn$_invoke$arity$1 = (function (val){
+return quil.sketch.current_applet.call(null).binary(val);
+});
+
+quil.core.binary.cljs$core$IFn$_invoke$arity$2 = (function (val,num_digits){
+return quil.sketch.current_applet.call(null).binary(val,num_digits);
+});
+
+quil.core.binary.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Blends a region of pixels from one image into another with full alpha
+ * channel support. If src is not specified it defaults to current-graphics.
+ * If dest is not specified it defaults to current-graphics.
+ *
+ * Note: blend-mode function is recommended to use instead of this one.
+ *
+ * Available blend modes are:
+ *
+ * :blend - linear interpolation of colours: C = A*factor + B
+ * :add - additive blending with white clip:
+ * C = min(A*factor + B, 255)
+ * :subtract - subtractive blending with black clip:
+ * C = max(B - A*factor, 0)
+ * :darkest - only the darkest colour succeeds:
+ * C = min(A*factor, B)
+ * :lightest - only the lightest colour succeeds:
+ * C = max(A*factor, B)
+ * :difference - subtract colors from underlying image.
+ * :exclusion - similar to :difference, but less extreme.
+ * :multiply - Multiply the colors, result will always be darker.
+ * :screen - Opposite multiply, uses inverse values of the colors.
+ * :overlay - A mix of :multiply and :screen. Multiplies dark values
+ * and screens light values.
+ * :hard-light - :screen when greater than 50% gray, :multiply when
+ * lower.
+ * :soft-light - Mix of :darkest and :lightest. Works like :overlay,
+ * but not as harsh.
+ * :dodge - Lightens light tones and increases contrast, ignores
+ * darks.
+ * Called "Color Dodge" in Illustrator and Photoshop.
+ * :burn - Darker areas are applied, increasing contrast, ignores
+ * lights. Called "Color Burn" in Illustrator and
+ * Photoshop.
+ */
+quil.core.blend = (function quil$core$blend(var_args){
+var args8361 = [];
+var len__7927__auto___8364 = arguments.length;
+var i__7928__auto___8365 = (0);
+while(true){
+if((i__7928__auto___8365 < len__7927__auto___8364)){
+args8361.push((arguments[i__7928__auto___8365]));
+
+var G__8366 = (i__7928__auto___8365 + (1));
+i__7928__auto___8365 = G__8366;
+continue;
+} else {
+}
+break;
+}
+
+var G__8363 = args8361.length;
+switch (G__8363) {
+case 9:
+return quil.core.blend.cljs$core$IFn$_invoke$arity$9((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]));
+
+break;
+case 10:
+return quil.core.blend.cljs$core$IFn$_invoke$arity$10((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]));
+
+break;
+case 11:
+return quil.core.blend.cljs$core$IFn$_invoke$arity$11((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8361.length)].join('')));
+
+}
+});
+
+quil.core.blend.cljs$core$IFn$_invoke$arity$9 = (function (x,y,width,height,dx,dy,dwidth,dheight,mode){
+return quil.core.blend.call(null,quil.core.current_graphics.call(null),quil.core.current_graphics.call(null),x,y,width,height,dx,dy,dwidth,dheight,mode);
+});
+
+quil.core.blend.cljs$core$IFn$_invoke$arity$10 = (function (src_img,x,y,width,height,dx,dy,dwidth,dheight,mode){
+return quil.core.blend.call(null,src_img,quil.core.current_graphics.call(null),x,y,width,height,dx,dy,dwidth,dheight,mode);
+});
+
+quil.core.blend.cljs$core$IFn$_invoke$arity$11 = (function (src_img,dest_img,x,y,width,height,dx,dy,dwidth,dheight,mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.blend_modes);
+return dest_img.blend(src_img,(x | (0)),(y | (0)),(width | (0)),(height | (0)),(dx | (0)),(dy | (0)),(dwidth | (0)),(dheight | (0)),(mode__$1 | (0)));
+});
+
+quil.core.blend.cljs$lang$maxFixedArity = 11;
+
+/**
+ * Blends two color values together based on the blending mode given specified
+ * with the mode keyword.
+ *
+ * Available blend modes are:
+ *
+ * :blend - linear interpolation of colours: C = A*factor + B
+ * :add - additive blending with white clip:
+ * C = min(A*factor + B, 255)
+ * :subtract - subtractive blending with black clip:
+ * C = max(B - A*factor, 0)
+ * :darkest - only the darkest colour succeeds:
+ * C = min(A*factor, B)
+ * :lightest - only the lightest colour succeeds:
+ * C = max(A*factor, B)
+ * :difference - subtract colors from underlying image.
+ * :exclusion - similar to :difference, but less extreme.
+ * :multiply - Multiply the colors, result will always be darker.
+ * :screen - Opposite multiply, uses inverse values of the colors.
+ * :overlay - A mix of :multiply and :screen. Multiplies dark values
+ * and screens light values.
+ * :hard-light - :screen when greater than 50% gray, :multiply when
+ * lower.
+ * :soft-light - Mix of :darkest and :lightest. Works like :overlay,
+ * but not as harsh.
+ * :dodge - Lightens light tones and increases contrast, ignores
+ * darks.
+ * Called "Color Dodge" in Illustrator and Photoshop.
+ * :burn - Darker areas are applied, increasing contrast, ignores
+ * lights. Called "Color Burn" in Illustrator and
+ * Photoshop.
+ */
+quil.core.blend_color = (function quil$core$blend_color(c1,c2,mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.blend_modes);
+return quil.core.current_graphics.call(null).blendColor(c1,c2,mode__$1);
+});
+/**
+ * Extracts the blue value from a color, scaled to match current color-mode.
+ * Returns a float.
+ */
+quil.core.blue = (function quil$core$blue(color){
+return quil.core.current_graphics.call(null).blue(cljs.core.unchecked_int.call(null,color));
+});
+/**
+ * Creates an extruded rectangle.
+ */
+quil.core.box = (function quil$core$box(var_args){
+var args8368 = [];
+var len__7927__auto___8371 = arguments.length;
+var i__7928__auto___8372 = (0);
+while(true){
+if((i__7928__auto___8372 < len__7927__auto___8371)){
+args8368.push((arguments[i__7928__auto___8372]));
+
+var G__8373 = (i__7928__auto___8372 + (1));
+i__7928__auto___8372 = G__8373;
+continue;
+} else {
+}
+break;
+}
+
+var G__8370 = args8368.length;
+switch (G__8370) {
+case 1:
+return quil.core.box.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.box.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8368.length)].join('')));
+
+}
+});
+
+quil.core.box.cljs$core$IFn$_invoke$arity$1 = (function (size){
+return quil.core.current_graphics.call(null).box(size);
+});
+
+quil.core.box.cljs$core$IFn$_invoke$arity$3 = (function (width,height,depth){
+return quil.core.current_graphics.call(null).box(width,height,depth);
+});
+
+quil.core.box.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Extracts the brightness value from a color. Returns a float.
+ */
+quil.core.brightness = (function quil$core$brightness(color){
+return quil.core.current_graphics.call(null).brightness(cljs.core.unchecked_int.call(null,color));
+});
+/**
+ * Sets the position of the camera through setting the eye position,
+ * the center of the scene, and which axis is facing upward. Moving the
+ * eye position and the direction it is pointing (the center of the
+ * scene) allows the images to be seen from different angles. The
+ * version without any parameters sets the camera to the default
+ * position, pointing to the center of the display window with the Y
+ * axis as up. The default values are:
+ *
+ * eyeX: (/ (width) 2.0)
+ * eyeY: (/ (height) 2.0)
+ * eyeZ: (/ (/ (height) 2.0) (tan (/ (* Math/PI 60.0) 360.0)))
+ * centerX: (/ (width) 2.0)
+ * centerY: (/ (height) 2.0)
+ * centerZ: 0
+ * upX: 0
+ * upY: 1
+ * upZ: 0
+ *
+ * Similar imilar to gluLookAt() in OpenGL, but it first clears the
+ * current camera settings.
+ */
+quil.core.camera = (function quil$core$camera(var_args){
+var args8375 = [];
+var len__7927__auto___8378 = arguments.length;
+var i__7928__auto___8379 = (0);
+while(true){
+if((i__7928__auto___8379 < len__7927__auto___8378)){
+args8375.push((arguments[i__7928__auto___8379]));
+
+var G__8380 = (i__7928__auto___8379 + (1));
+i__7928__auto___8379 = G__8380;
+continue;
+} else {
+}
+break;
+}
+
+var G__8377 = args8375.length;
+switch (G__8377) {
+case 0:
+return quil.core.camera.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 9:
+return quil.core.camera.cljs$core$IFn$_invoke$arity$9((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8375.length)].join('')));
+
+}
+});
+
+quil.core.camera.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).camera();
+});
+
+quil.core.camera.cljs$core$IFn$_invoke$arity$9 = (function (eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ){
+return quil.core.current_graphics.call(null).camera(eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ);
+});
+
+quil.core.camera.cljs$lang$maxFixedArity = 9;
+
+/**
+ * Calculates the closest int value that is greater than or equal to
+ * the value of the parameter. For example, (ceil 9.03) returns the
+ * value 10.
+ */
+quil.core.ceil = (function quil$core$ceil(n){
+return quil.sketch.current_applet.call(null).ceil(n);
+});
+/**
+ * Creates an integer representation of a color The parameters are
+ * interpreted as RGB or HSB values depending on the current
+ * color-mode. The default mode is RGB values from 0 to 255 and
+ * therefore, the function call (color 255 204 0) will return a bright
+ * yellow. Args are cast to floats.
+ *
+ * r - red or hue value
+ * g - green or saturation value
+ * b - blue or brightness value
+ * a - alpha value
+ */
+quil.core.color = (function quil$core$color(var_args){
+var args8382 = [];
+var len__7927__auto___8385 = arguments.length;
+var i__7928__auto___8386 = (0);
+while(true){
+if((i__7928__auto___8386 < len__7927__auto___8385)){
+args8382.push((arguments[i__7928__auto___8386]));
+
+var G__8387 = (i__7928__auto___8386 + (1));
+i__7928__auto___8386 = G__8387;
+continue;
+} else {
+}
+break;
+}
+
+var G__8384 = args8382.length;
+switch (G__8384) {
+case 1:
+return quil.core.color.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.color.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.color.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.color.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8382.length)].join('')));
+
+}
+});
+
+quil.core.color.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).color(gray);
+});
+
+quil.core.color.cljs$core$IFn$_invoke$arity$2 = (function (gray,alpha){
+return quil.core.current_graphics.call(null).color(gray,alpha);
+});
+
+quil.core.color.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.current_graphics.call(null).color(r,g,b);
+});
+
+quil.core.color.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.current_graphics.call(null).color(r,g,b,a);
+});
+
+quil.core.color.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Changes the way Processing interprets color data. Available modes
+ * are :rgb and :hsb.By default, the parameters for fill, stroke,
+ * background, and color are defined by values between 0 and 255 using
+ * the :rgb color model. The color-mode fn is used to change the
+ * numerical range used for specifying colors and to switch color
+ * systems. For example, calling
+ * (color-mode :rgb 1.0) will specify that values are specified between
+ * 0 and 1. The limits for defining colors are altered by setting the
+ * parameters range1, range2, range3, and range 4.
+ */
+quil.core.color_mode = (function quil$core$color_mode(var_args){
+var args8389 = [];
+var len__7927__auto___8392 = arguments.length;
+var i__7928__auto___8393 = (0);
+while(true){
+if((i__7928__auto___8393 < len__7927__auto___8392)){
+args8389.push((arguments[i__7928__auto___8393]));
+
+var G__8394 = (i__7928__auto___8393 + (1));
+i__7928__auto___8393 = G__8394;
+continue;
+} else {
+}
+break;
+}
+
+var G__8391 = args8389.length;
+switch (G__8391) {
+case 1:
+return quil.core.color_mode.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.color_mode.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 4:
+return quil.core.color_mode.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return quil.core.color_mode.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8389.length)].join('')));
+
+}
+});
+
+quil.core.color_mode.cljs$core$IFn$_invoke$arity$1 = (function (mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.color_modes);
+return quil.core.current_graphics.call(null).colorMode((mode__$1 | (0)));
+});
+
+quil.core.color_mode.cljs$core$IFn$_invoke$arity$2 = (function (mode,max){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.color_modes);
+return quil.core.current_graphics.call(null).colorMode((mode__$1 | (0)),max);
+});
+
+quil.core.color_mode.cljs$core$IFn$_invoke$arity$4 = (function (mode,max_x,max_y,max_z){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.color_modes);
+return quil.core.current_graphics.call(null).colorMode((mode__$1 | (0)),max_x,max_y,max_z);
+});
+
+quil.core.color_mode.cljs$core$IFn$_invoke$arity$5 = (function (mode,max_x,max_y,max_z,max_a){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.color_modes);
+return quil.core.current_graphics.call(null).colorMode((mode__$1 | (0)),max_x,max_y,max_z,max_a);
+});
+
+quil.core.color_mode.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Constrains a value to not exceed a maximum and minimum value.
+ */
+quil.core.constrain = (function quil$core$constrain(amt,low,high){
+return quil.sketch.current_applet.call(null).constrain(amt,low,high);
+});
+/**
+ * Copies a region of pixels from the one image to another. If src-img
+ * is not specified it defaults to current-graphics. If dest-img is not
+ * specified - it defaults to current-graphics. If the source
+ * and destination regions aren't the same size, it will automatically
+ * resize the source pixels to fit the specified target region. No
+ * alpha information is used in the process, however if the source
+ * image has an alpha channel set, it will be copied as well.
+ */
+quil.core.copy = (function quil$core$copy(var_args){
+var args8396 = [];
+var len__7927__auto___8423 = arguments.length;
+var i__7928__auto___8424 = (0);
+while(true){
+if((i__7928__auto___8424 < len__7927__auto___8423)){
+args8396.push((arguments[i__7928__auto___8424]));
+
+var G__8425 = (i__7928__auto___8424 + (1));
+i__7928__auto___8424 = G__8425;
+continue;
+} else {
+}
+break;
+}
+
+var G__8398 = args8396.length;
+switch (G__8398) {
+case 2:
+return quil.core.copy.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.copy.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.copy.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8396.length)].join('')));
+
+}
+});
+
+quil.core.copy.cljs$core$IFn$_invoke$arity$2 = (function (p__8399,p__8400){
+var vec__8401 = p__8399;
+var sx = cljs.core.nth.call(null,vec__8401,(0),null);
+var sy = cljs.core.nth.call(null,vec__8401,(1),null);
+var swidth = cljs.core.nth.call(null,vec__8401,(2),null);
+var sheight = cljs.core.nth.call(null,vec__8401,(3),null);
+var vec__8404 = p__8400;
+var dx = cljs.core.nth.call(null,vec__8404,(0),null);
+var dy = cljs.core.nth.call(null,vec__8404,(1),null);
+var dwidth = cljs.core.nth.call(null,vec__8404,(2),null);
+var dheight = cljs.core.nth.call(null,vec__8404,(3),null);
+return quil.core.current_graphics.call(null).copy((sx | (0)),(sy | (0)),(swidth | (0)),(sheight | (0)),(dx | (0)),(dy | (0)),(dwidth | (0)),(dheight | (0)));
+});
+
+quil.core.copy.cljs$core$IFn$_invoke$arity$3 = (function (src_img,p__8407,p__8408){
+var vec__8409 = p__8407;
+var sx = cljs.core.nth.call(null,vec__8409,(0),null);
+var sy = cljs.core.nth.call(null,vec__8409,(1),null);
+var swidth = cljs.core.nth.call(null,vec__8409,(2),null);
+var sheight = cljs.core.nth.call(null,vec__8409,(3),null);
+var vec__8412 = p__8408;
+var dx = cljs.core.nth.call(null,vec__8412,(0),null);
+var dy = cljs.core.nth.call(null,vec__8412,(1),null);
+var dwidth = cljs.core.nth.call(null,vec__8412,(2),null);
+var dheight = cljs.core.nth.call(null,vec__8412,(3),null);
+return quil.core.copy.call(null,src_img,quil.core.current_graphics.call(null),new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [sx,sy,swidth,sheight], null),new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [dx,dy,dwidth,dheight], null));
+});
+
+quil.core.copy.cljs$core$IFn$_invoke$arity$4 = (function (src_img,dest_img,p__8415,p__8416){
+var vec__8417 = p__8415;
+var sx = cljs.core.nth.call(null,vec__8417,(0),null);
+var sy = cljs.core.nth.call(null,vec__8417,(1),null);
+var swidth = cljs.core.nth.call(null,vec__8417,(2),null);
+var sheight = cljs.core.nth.call(null,vec__8417,(3),null);
+var vec__8420 = p__8416;
+var dx = cljs.core.nth.call(null,vec__8420,(0),null);
+var dy = cljs.core.nth.call(null,vec__8420,(1),null);
+var dwidth = cljs.core.nth.call(null,vec__8420,(2),null);
+var dheight = cljs.core.nth.call(null,vec__8420,(3),null);
+return dest_img.copy(src_img,(sx | (0)),(sy | (0)),(swidth | (0)),(sheight | (0)),(dx | (0)),(dy | (0)),(dwidth | (0)),(dheight | (0)));
+});
+
+quil.core.copy.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Calculates the cosine of an angle. This function expects the values
+ * of the angle parameter to be provided in radians (values from 0 to
+ * Math/PI*2). Values are returned in the range -1 to 1.
+ */
+quil.core.cos = (function quil$core$cos(angle){
+return quil.sketch.current_applet.call(null).cos(angle);
+});
+/**
+ * Dynamically converts a font to the format used by Processing (a
+ * PFont) from either a font name that's installed on the computer, or
+ * from a .ttf or .otf file inside the sketches 'data' folder. This
+ * function is an advanced feature for precise control.
+ *
+ * Use available-fonts to obtain the names for the fonts recognized by
+ * the computer and are compatible with this function.
+ *
+ * The size parameter states the font size you want to generate. The
+ * smooth parameter specifies if the font should be antialiased or not,
+ * and the charset parameter is an array of chars that specifies the
+ * characters to generate.
+ *
+ * This function creates a bitmapped version of a font It loads a font
+ * by name, and converts it to a series of images based on the size of
+ * the font. When possible, the text function will use a native font
+ * rather than the bitmapped version created behind the scenes with
+ * create-font. For instance, when using the default renderer
+ * setting (JAVA2D), the actual native version of the font will be
+ * employed by the sketch, improving drawing quality and
+ * performance. With the :p2d, :p3d, and :opengl renderer settings, the
+ * bitmapped version will be used. While this can drastically improve
+ * speed and appearance, results are poor when exporting if the sketch
+ * does not include the .otf or .ttf file, and the requested font is
+ * not available on the machine running the sketch.
+ */
+quil.core.create_font = (function quil$core$create_font(var_args){
+var args8427 = [];
+var len__7927__auto___8430 = arguments.length;
+var i__7928__auto___8431 = (0);
+while(true){
+if((i__7928__auto___8431 < len__7927__auto___8430)){
+args8427.push((arguments[i__7928__auto___8431]));
+
+var G__8432 = (i__7928__auto___8431 + (1));
+i__7928__auto___8431 = G__8432;
+continue;
+} else {
+}
+break;
+}
+
+var G__8429 = args8427.length;
+switch (G__8429) {
+case 2:
+return quil.core.create_font.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.create_font.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.create_font.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8427.length)].join('')));
+
+}
+});
+
+quil.core.create_font.cljs$core$IFn$_invoke$arity$2 = (function (name,size){
+return quil.sketch.current_applet.call(null).createFont([cljs.core.str.cljs$core$IFn$_invoke$arity$1(name)].join(''),size);
+});
+
+quil.core.create_font.cljs$core$IFn$_invoke$arity$3 = (function (name,size,smooth){
+return quil.sketch.current_applet.call(null).createFont([cljs.core.str.cljs$core$IFn$_invoke$arity$1(name)].join(''),size,smooth);
+});
+
+quil.core.create_font.cljs$core$IFn$_invoke$arity$4 = (function (name,size,smooth,charset){
+return quil.sketch.current_applet.call(null).createFont([cljs.core.str.cljs$core$IFn$_invoke$arity$1(name)].join(''),size,smooth,charset);
+});
+
+quil.core.create_font.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Creates and returns a new PGraphics object of the types :p2d, :p3d,
+ * :java2d, :pdf. By default :java2d is used. Use this class if you
+ * need to draw into an off-screen graphics buffer. It's not possible
+ * to use create-graphics with the :opengl renderer, because it doesn't
+ * allow offscreen use. The :pdf renderer requires the filename parameter.
+ *
+ * Note: don't use create-graphics in draw in clojurescript, it leaks memory.
+ * You should create graphic in setup and reuse it in draw instead of creating
+ * a new one.
+ *
+ * It's important to call any drawing commands between (.beginDraw graphics) and
+ * (.endDraw graphics) statements or use with-graphics macro. This is also true
+ * for any commands that affect drawing, such as smooth or color-mode.
+ *
+ * If you're using :pdf renderer - don't forget to call (.dispose graphics)
+ * as last command inside with-graphics macro, otherwise graphics won't be
+ * saved.
+ *
+ * Unlike the main drawing surface which is completely opaque, surfaces
+ * created with create-graphics can have transparency. This makes it
+ * possible to draw into a graphics and maintain the alpha channel. By
+ * using save to write a PNG or TGA file, the transparency of the
+ * graphics object will be honored.
+ */
+quil.core.create_graphics = (function quil$core$create_graphics(var_args){
+var args8434 = [];
+var len__7927__auto___8437 = arguments.length;
+var i__7928__auto___8438 = (0);
+while(true){
+if((i__7928__auto___8438 < len__7927__auto___8437)){
+args8434.push((arguments[i__7928__auto___8438]));
+
+var G__8439 = (i__7928__auto___8438 + (1));
+i__7928__auto___8438 = G__8439;
+continue;
+} else {
+}
+break;
+}
+
+var G__8436 = args8434.length;
+switch (G__8436) {
+case 2:
+return quil.core.create_graphics.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.create_graphics.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.create_graphics.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8434.length)].join('')));
+
+}
+});
+
+quil.core.create_graphics.cljs$core$IFn$_invoke$arity$2 = (function (w,h){
+return quil.sketch.current_applet.call(null).createGraphics((w | (0)),(h | (0)),new cljs.core.Keyword(null,"p2d","p2d",-2106175755));
+});
+
+quil.core.create_graphics.cljs$core$IFn$_invoke$arity$3 = (function (w,h,renderer){
+return quil.sketch.current_applet.call(null).createGraphics((w | (0)),(h | (0)),quil.sketch.resolve_renderer.call(null,renderer));
+});
+
+quil.core.create_graphics.cljs$core$IFn$_invoke$arity$4 = (function (w,h,renderer,path){
+return quil.sketch.current_applet.call(null).createGraphics((w | (0)),(h | (0)),quil.sketch.resolve_renderer.call(null,renderer),path);
+});
+
+quil.core.create_graphics.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Creates a new PImage (the datatype for storing images). This
+ * provides a fresh buffer of pixels to play with. Set the size of the
+ * buffer with the width and height parameters. The format parameter
+ * defines how the pixels are stored. See the PImage reference for more
+ * information.
+ *
+ * Possible formats: :rgb, :argb, :alpha (grayscale alpha channel)
+ *
+ * Prefer using create-image over initialising new PImage instances
+ * directly.
+ */
+quil.core.create_image = (function quil$core$create_image(w,h,format){
+var format__$1 = quil.util.resolve_constant_key.call(null,format,quil.core.image_formats);
+return quil.sketch.current_applet.call(null).createImage((w | (0)),(h | (0)),(format__$1 | (0)));
+});
+/**
+ * Return the current fill color.
+ */
+quil.core.current_fill = (function quil$core$current_fill(){
+return quil.core.current_graphics.call(null).fillColor;
+});
+/**
+ * Return the current stroke color.
+ */
+quil.core.current_stroke = (function quil$core$current_stroke(){
+return quil.core.current_graphics.call(null).strokeColor;
+});
+/**
+ * Sets the cursor to a predefined symbol or makes it
+ * visible if already hidden (after no-cursor was called).
+ *
+ * Available modes: :arrow, :cross, :hand, :move, :text, :wait
+ *
+ * See cursor-image for specifying a generic image as the cursor
+ * symbol.
+ */
+quil.core.cursor = (function quil$core$cursor(var_args){
+var args8441 = [];
+var len__7927__auto___8444 = arguments.length;
+var i__7928__auto___8445 = (0);
+while(true){
+if((i__7928__auto___8445 < len__7927__auto___8444)){
+args8441.push((arguments[i__7928__auto___8445]));
+
+var G__8446 = (i__7928__auto___8445 + (1));
+i__7928__auto___8445 = G__8446;
+continue;
+} else {
+}
+break;
+}
+
+var G__8443 = args8441.length;
+switch (G__8443) {
+case 0:
+return quil.core.cursor.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.cursor.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8441.length)].join('')));
+
+}
+});
+
+quil.core.cursor.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.sketch.current_applet.call(null).cursor();
+});
+
+quil.core.cursor.cljs$core$IFn$_invoke$arity$1 = (function (cursor_mode){
+var cursor_mode__$1 = quil.util.resolve_constant_key.call(null,cursor_mode,quil.core.cursor_modes);
+return quil.sketch.current_applet.call(null).cursor([cljs.core.str.cljs$core$IFn$_invoke$arity$1(cursor_mode__$1)].join(''));
+});
+
+quil.core.cursor.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Set the cursor to a predefined image. The horizontal and vertical
+ * active spots of the cursor may be specified with hx and hy.
+ * It is recommended to make the size 16x16 or 32x32 pixels.
+ */
+quil.core.cursor_image = (function quil$core$cursor_image(var_args){
+var args8448 = [];
+var len__7927__auto___8451 = arguments.length;
+var i__7928__auto___8452 = (0);
+while(true){
+if((i__7928__auto___8452 < len__7927__auto___8451)){
+args8448.push((arguments[i__7928__auto___8452]));
+
+var G__8453 = (i__7928__auto___8452 + (1));
+i__7928__auto___8452 = G__8453;
+continue;
+} else {
+}
+break;
+}
+
+var G__8450 = args8448.length;
+switch (G__8450) {
+case 1:
+return quil.core.cursor_image.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.cursor_image.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8448.length)].join('')));
+
+}
+});
+
+quil.core.cursor_image.cljs$core$IFn$_invoke$arity$1 = (function (img){
+return quil.sketch.current_applet.call(null).cursor(img);
+});
+
+quil.core.cursor_image.cljs$core$IFn$_invoke$arity$3 = (function (img,hx,hy){
+return quil.sketch.current_applet.call(null).cursor(img,(hx | (0)),(hy | (0)));
+});
+
+quil.core.cursor_image.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Draws a curved line on the screen. The first and second parameters
+ * specify the beginning control point and the last two parameters
+ * specify the ending control point. The middle parameters specify the
+ * start and stop of the curve. Longer curves can be created by putting
+ * a series of curve fns together or using curve-vertex. An additional
+ * fn called curve-tightness provides control for the visual quality of
+ * the curve. The curve fn is an implementation of Catmull-Rom
+ * splines.
+ */
+quil.core.curve = (function quil$core$curve(var_args){
+var args8455 = [];
+var len__7927__auto___8458 = arguments.length;
+var i__7928__auto___8459 = (0);
+while(true){
+if((i__7928__auto___8459 < len__7927__auto___8458)){
+args8455.push((arguments[i__7928__auto___8459]));
+
+var G__8460 = (i__7928__auto___8459 + (1));
+i__7928__auto___8459 = G__8460;
+continue;
+} else {
+}
+break;
+}
+
+var G__8457 = args8455.length;
+switch (G__8457) {
+case 8:
+return quil.core.curve.cljs$core$IFn$_invoke$arity$8((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]));
+
+break;
+case 12:
+return quil.core.curve.cljs$core$IFn$_invoke$arity$12((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8455.length)].join('')));
+
+}
+});
+
+quil.core.curve.cljs$core$IFn$_invoke$arity$8 = (function (x1,y1,x2,y2,x3,y3,x4,y4){
+return quil.core.current_graphics.call(null).curve(x1,y1,x2,y2,x3,y3,x4,y4);
+});
+
+quil.core.curve.cljs$core$IFn$_invoke$arity$12 = (function (x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4){
+return quil.core.current_graphics.call(null).curve(x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4);
+});
+
+quil.core.curve.cljs$lang$maxFixedArity = 12;
+
+/**
+ * Sets the resolution at which curves display. The default value is
+ * 20. This function is only useful when using the :p3d or :opengl
+ * renderer as the default (:java2d) renderer does not use this
+ * information.
+ */
+quil.core.curve_detail = (function quil$core$curve_detail(detail){
+return quil.core.current_graphics.call(null).curveDetail((detail | (0)));
+});
+/**
+ * Evalutes the curve at point t for points a, b, c, d. The parameter
+ * t varies between 0 and 1, a and d are points on the curve, and b c
+ * and are the control points. This can be done once with the x
+ * coordinates and a second time with the y coordinates to get the
+ * location of a curve at t.
+ */
+quil.core.curve_point = (function quil$core$curve_point(a,b,c,d,t){
+return quil.core.current_graphics.call(null).curvePoint(a,b,c,d,t);
+});
+/**
+ * Calculates the tangent of a point on a curve.
+ * See: http://en.wikipedia.org/wiki/Tangent
+ */
+quil.core.curve_tangent = (function quil$core$curve_tangent(a,b,c,d,t){
+return quil.core.current_graphics.call(null).curveTangent(a,b,c,d,t);
+});
+/**
+ * Modifies the quality of forms created with curve and
+ * curve-vertex. The parameter squishy determines how the curve fits
+ * to the vertex points. The value 0.0 is the default value for
+ * squishy (this value defines the curves to be Catmull-Rom splines)
+ * and the value 1.0 connects all the points with straight
+ * lines. Values within the range -5.0 and 5.0 will deform the curves
+ * but will leave them recognizable and as values increase in
+ * magnitude, they will continue to deform.
+ */
+quil.core.curve_tightness = (function quil$core$curve_tightness(ti){
+return quil.core.current_graphics.call(null).curveTightness(ti);
+});
+/**
+ * Specifies vertex coordinates for curves. This function may only be
+ * used between begin-shape and end-shape and only when there is no
+ * mode keyword specified to begin-shape. The first and last points in a
+ * series of curve-vertex lines will be used to guide the beginning and
+ * end of a the curve. A minimum of four points is required to draw a
+ * tiny curve between the second and third points. Adding a fifth point
+ * with curve-vertex will draw the curve between the second, third, and
+ * fourth points. The curve-vertex function is an implementation of
+ * Catmull-Rom splines.
+ */
+quil.core.curve_vertex = (function quil$core$curve_vertex(var_args){
+var args8462 = [];
+var len__7927__auto___8465 = arguments.length;
+var i__7928__auto___8466 = (0);
+while(true){
+if((i__7928__auto___8466 < len__7927__auto___8465)){
+args8462.push((arguments[i__7928__auto___8466]));
+
+var G__8467 = (i__7928__auto___8466 + (1));
+i__7928__auto___8466 = G__8467;
+continue;
+} else {
+}
+break;
+}
+
+var G__8464 = args8462.length;
+switch (G__8464) {
+case 2:
+return quil.core.curve_vertex.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.curve_vertex.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8462.length)].join('')));
+
+}
+});
+
+quil.core.curve_vertex.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.current_graphics.call(null).curveVertex(x,y);
+});
+
+quil.core.curve_vertex.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).curveVertex(x,y,z);
+});
+
+quil.core.curve_vertex.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Get the current day of the month (1 through 31).
+ */
+quil.core.day = (function quil$core$day(){
+return quil.sketch.current_applet.call(null).day();
+});
+/**
+ * Converts a radian measurement to its corresponding value in
+ * degrees. Radians and degrees are two ways of measuring the same
+ * thing. There are 360 degrees in a circle and (* 2 Math/PI) radians
+ * in a circle. For example, (= 90° (/ Math/PI 2) 1.5707964). All
+ * trigonometric methods in Processing require their parameters to be
+ * specified in radians.
+ */
+quil.core.degrees = (function quil$core$degrees(radians){
+return quil.sketch.current_applet.call(null).degrees(radians);
+});
+/**
+ * Forces the program to stop running for a specified time. Delay
+ * times are specified in thousandths of a second, therefore the
+ * function call (delay 3000) will stop the program for three
+ * seconds. Because the screen is updated only at the end of draw,
+ * the program may appear to 'freeze', because the screen will not
+ * update when the delay fn is used. This function has no affect
+ * inside setup.
+ */
+quil.core.delay_frame = (function quil$core$delay_frame(freeze_ms){
+return quil.sketch.current_applet.call(null).delay((freeze_ms | (0)));
+});
+/**
+ * Adds a directional light. Directional light comes from one
+ * direction and is stronger when hitting a surface squarely and weaker
+ * if it hits at a gentle angle. After hitting a surface, a
+ * directional lights scatters in all directions. Lights need to be
+ * included in the draw fn to remain persistent in a looping
+ * program. Placing them in the setup fn of a looping program will cause
+ * them to only have an effect the first time through the loop. The
+ * affect of the r, g, and b parameters is determined by the current
+ * color mode. The nx, ny, and nz parameters specify the direction the
+ * light is facing. For example, setting ny to -1 will cause the
+ * geometry to be lit from below (the light is facing directly upward)
+ */
+quil.core.directional_light = (function quil$core$directional_light(r,g,b,nx,ny,nz){
+return quil.core.current_graphics.call(null).directionalLight(r,g,b,nx,ny,nz);
+});
+/**
+ * Calculates the distance between two points
+ */
+quil.core.dist = (function quil$core$dist(var_args){
+var args8469 = [];
+var len__7927__auto___8472 = arguments.length;
+var i__7928__auto___8473 = (0);
+while(true){
+if((i__7928__auto___8473 < len__7927__auto___8472)){
+args8469.push((arguments[i__7928__auto___8473]));
+
+var G__8474 = (i__7928__auto___8473 + (1));
+i__7928__auto___8473 = G__8474;
+continue;
+} else {
+}
+break;
+}
+
+var G__8471 = args8469.length;
+switch (G__8471) {
+case 4:
+return quil.core.dist.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 6:
+return quil.core.dist.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8469.length)].join('')));
+
+}
+});
+
+quil.core.dist.cljs$core$IFn$_invoke$arity$4 = (function (x1,y1,x2,y2){
+return quil.sketch.current_applet.call(null).dist(x1,y1,x2,y2);
+});
+
+quil.core.dist.cljs$core$IFn$_invoke$arity$6 = (function (x1,y1,z1,x2,y2,z2){
+return quil.sketch.current_applet.call(null).dist(x1,y1,z1,x2,y2,z2);
+});
+
+quil.core.dist.cljs$lang$maxFixedArity = 6;
+
+/**
+ * Macro for drawing on graphics which saves result in the file at the end.
+ * Similar to 'with-graphics' macro. do-record assumed to be used with :pdf
+ * graphics. Example:
+ *
+ * (q/do-record (q/create-graphics 200 200 :pdf "output.pdf")
+ * (q/fill 250 0 0)
+ * (q/ellipse 100 100 150 150))
+ *
+ */
+quil.core.do_record = (function quil$core$do_record(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8481 = arguments.length;
+var i__7928__auto___8482 = (0);
+while(true){
+if((i__7928__auto___8482 < len__7927__auto___8481)){
+args__7934__auto__.push((arguments[i__7928__auto___8482]));
+
+var G__8483 = (i__7928__auto___8482 + (1));
+i__7928__auto___8482 = G__8483;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((3) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((3)),(0),null)):null);
+return quil.core.do_record.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7935__auto__);
+});
+
+quil.core.do_record.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,graphics,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null)),(function (){var x__7656__auto__ = cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"gr__8476__auto__","gr__8476__auto__",1999766593,null)),(function (){var x__7656__auto__ = graphics;
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})()))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","with-graphics","quil.core/with-graphics",481277883,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"gr__8476__auto__","gr__8476__auto__",1999766593,null)),body)));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,".dispose",".dispose",-1697594101,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"gr__8476__auto__","gr__8476__auto__",1999766593,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+});
+
+quil.core.do_record.cljs$lang$maxFixedArity = (3);
+
+quil.core.do_record.cljs$lang$applyTo = (function (seq8477){
+var G__8478 = cljs.core.first.call(null,seq8477);
+var seq8477__$1 = cljs.core.next.call(null,seq8477);
+var G__8479 = cljs.core.first.call(null,seq8477__$1);
+var seq8477__$2 = cljs.core.next.call(null,seq8477__$1);
+var G__8480 = cljs.core.first.call(null,seq8477__$2);
+var seq8477__$3 = cljs.core.next.call(null,seq8477__$2);
+return quil.core.do_record.cljs$core$IFn$_invoke$arity$variadic(G__8478,G__8479,G__8480,seq8477__$3);
+});
+
+
+quil.core.do_record.cljs$lang$macro = true;
+/**
+ * Draws an ellipse (oval) in the display window. An ellipse with an
+ * equal width and height is a circle. The origin may be changed with
+ * the ellipse-mode function
+ */
+quil.core.ellipse = (function quil$core$ellipse(x,y,width,height){
+return quil.core.current_graphics.call(null).ellipse(x,y,width,height);
+});
+/**
+ * Modifies the origin of the ellispse according to the specified mode:
+ *
+ * :center - specifies the location of the ellipse as
+ * the center of the shape. (Default).
+ * :radius - similar to center, but the width and height parameters to
+ * ellipse specify the radius of the ellipse, rather than the
+ * diameter.
+ * :corner - draws the shape from the upper-left corner of its bounding
+ * box.
+ * :corners - uses the four parameters to ellipse to set two opposing
+ * corners of the ellipse's bounding box.
+ */
+quil.core.ellipse_mode = (function quil$core$ellipse_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.ellipse_modes);
+return quil.core.current_graphics.call(null).ellipseMode((mode__$1 | (0)));
+});
+/**
+ * Sets the emissive color of the material used for drawing shapes
+ * drawn to the screen. Used in combination with ambient, specular, and
+ * shininess in setting the material properties of shapes. Converts all
+ * args to floats
+ */
+quil.core.emissive_float = (function quil$core$emissive_float(var_args){
+var args8484 = [];
+var len__7927__auto___8487 = arguments.length;
+var i__7928__auto___8488 = (0);
+while(true){
+if((i__7928__auto___8488 < len__7927__auto___8487)){
+args8484.push((arguments[i__7928__auto___8488]));
+
+var G__8489 = (i__7928__auto___8488 + (1));
+i__7928__auto___8488 = G__8489;
+continue;
+} else {
+}
+break;
+}
+
+var G__8486 = args8484.length;
+switch (G__8486) {
+case 1:
+return quil.core.emissive_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.emissive_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8484.length)].join('')));
+
+}
+});
+
+quil.core.emissive_float.cljs$core$IFn$_invoke$arity$1 = (function (float_val){
+return quil.core.current_graphics.call(null).emissive(float_val);
+});
+
+quil.core.emissive_float.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.current_graphics.call(null).emissive(r,g,b);
+});
+
+quil.core.emissive_float.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Sets the emissive color of the material used for drawing shapes
+ * drawn to the screen. Used in combination with ambient, specular, and
+ * shininess in setting the material properties of shapes. Converts all
+ * args to ints
+ */
+quil.core.emissive_int = (function quil$core$emissive_int(int_val){
+return quil.core.current_graphics.call(null).emissive((int_val | (0)));
+});
+/**
+ * Sets the emissive color of the material used for drawing shapes
+ * drawn to the screen. Used in combination with ambient, specular, and
+ * shininess in setting the material properties of shapes.
+ *
+ * If passed one arg - it is assumed to be an int (i.e. a color),
+ * multiple args are converted to floats.
+ */
+quil.core.emissive = (function quil$core$emissive(var_args){
+var args8491 = [];
+var len__7927__auto___8494 = arguments.length;
+var i__7928__auto___8495 = (0);
+while(true){
+if((i__7928__auto___8495 < len__7927__auto___8494)){
+args8491.push((arguments[i__7928__auto___8495]));
+
+var G__8496 = (i__7928__auto___8495 + (1));
+i__7928__auto___8495 = G__8496;
+continue;
+} else {
+}
+break;
+}
+
+var G__8493 = args8491.length;
+switch (G__8493) {
+case 1:
+return quil.core.emissive.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.emissive.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8491.length)].join('')));
+
+}
+});
+
+quil.core.emissive.cljs$core$IFn$_invoke$arity$1 = (function (c){
+return quil.core.emissive_float.call(null,c);
+});
+
+quil.core.emissive.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.emissive_float.call(null,r,g,b);
+});
+
+quil.core.emissive.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Unsets the matrix mode from the camera matrix. See begin-camera.
+ */
+quil.core.end_camera = (function quil$core$end_camera(){
+return quil.core.current_graphics.call(null).endCamera();
+});
+/**
+ * Use the begin-contour and end-contour function to create negative
+ * shapes within shapes. These functions can only be within a
+ * begin-shape/end-shape pair and they only work with the :p2d and :p3d
+ * renderers.
+ */
+quil.core.end_contour = (function quil$core$end_contour(){
+return quil.core.current_graphics.call(null).endContour();
+});
+/**
+ * Complement to begin-raw; they must always be used together. See
+ * the begin-raw docstring for details.
+ */
+quil.core.end_raw = (function quil$core$end_raw(){
+return quil.core.current_graphics.call(null).endRaw();
+});
+/**
+ * May only be called after begin-shape. When end-shape is called,
+ * all of image data defined since the previous call to begin-shape is
+ * written into the image buffer. The keyword :close may be passed to
+ * close the shape (to connect the beginning and the end).
+ */
+quil.core.end_shape = (function quil$core$end_shape(var_args){
+var args8498 = [];
+var len__7927__auto___8501 = arguments.length;
+var i__7928__auto___8502 = (0);
+while(true){
+if((i__7928__auto___8502 < len__7927__auto___8501)){
+args8498.push((arguments[i__7928__auto___8502]));
+
+var G__8503 = (i__7928__auto___8502 + (1));
+i__7928__auto___8502 = G__8503;
+continue;
+} else {
+}
+break;
+}
+
+var G__8500 = args8498.length;
+switch (G__8500) {
+case 0:
+return quil.core.end_shape.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.end_shape.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8498.length)].join('')));
+
+}
+});
+
+quil.core.end_shape.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).endShape();
+});
+
+quil.core.end_shape.cljs$core$IFn$_invoke$arity$1 = (function (mode){
+if(cljs.core._EQ_.call(null,new cljs.core.Keyword(null,"close","close",1835149582),mode)){
+} else {
+}
+
+return quil.core.current_graphics.call(null).endShape((2));
+});
+
+quil.core.end_shape.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Quits/stops/exits the program. Rather than terminating
+ * immediately, exit will cause the sketch to exit after draw has
+ * completed (or after setup completes if called during the setup
+ * method).
+ */
+quil.core.exit = (function quil$core$exit(){
+return quil.sketch.current_applet.call(null).exit();
+});
+/**
+ * Returns Euler's number e (2.71828...) raised to the power of the
+ * value parameter.
+ */
+quil.core.exp = (function quil$core$exp(val){
+return quil.sketch.current_applet.call(null).exp(val);
+});
+/**
+ * Sets custom property on graphcs object indicating that it has
+ * fill color.
+ */
+quil.core.clear_no_fill_cljs = (function quil$core$clear_no_fill_cljs(graphics){
+return (graphics[quil.core.no_fill_prop] = false);
+});
+/**
+ * Sets the color used to fill shapes. For example, (fill 204 102 0),
+ * will specify that all subsequent shapes will be filled with orange.
+ */
+quil.core.fill_float = (function quil$core$fill_float(var_args){
+var args8505 = [];
+var len__7927__auto___8508 = arguments.length;
+var i__7928__auto___8509 = (0);
+while(true){
+if((i__7928__auto___8509 < len__7927__auto___8508)){
+args8505.push((arguments[i__7928__auto___8509]));
+
+var G__8510 = (i__7928__auto___8509 + (1));
+i__7928__auto___8509 = G__8510;
+continue;
+} else {
+}
+break;
+}
+
+var G__8507 = args8505.length;
+switch (G__8507) {
+case 1:
+return quil.core.fill_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.fill_float.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.fill_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.fill_float.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8505.length)].join('')));
+
+}
+});
+
+quil.core.fill_float.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+quil.core.current_graphics.call(null).fill(gray);
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_float.cljs$core$IFn$_invoke$arity$2 = (function (gray,alpha){
+quil.core.current_graphics.call(null).fill(gray,alpha);
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_float.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+quil.core.current_graphics.call(null).fill(r,g,b);
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_float.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,alpha){
+quil.core.current_graphics.call(null).fill(r,g,b,alpha);
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_float.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Sets the color used to fill shapes.
+ */
+quil.core.fill_int = (function quil$core$fill_int(var_args){
+var args8512 = [];
+var len__7927__auto___8515 = arguments.length;
+var i__7928__auto___8516 = (0);
+while(true){
+if((i__7928__auto___8516 < len__7927__auto___8515)){
+args8512.push((arguments[i__7928__auto___8516]));
+
+var G__8517 = (i__7928__auto___8516 + (1));
+i__7928__auto___8516 = G__8517;
+continue;
+} else {
+}
+break;
+}
+
+var G__8514 = args8512.length;
+switch (G__8514) {
+case 1:
+return quil.core.fill_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.fill_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8512.length)].join('')));
+
+}
+});
+
+quil.core.fill_int.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+quil.core.current_graphics.call(null).fill(cljs.core.unchecked_int.call(null,rgb));
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_int.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+quil.core.current_graphics.call(null).fill(cljs.core.unchecked_int.call(null,rgb),alpha);
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_int.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the color used to fill shapes.
+ */
+quil.core.fill = (function quil$core$fill(var_args){
+var args8519 = [];
+var len__7927__auto___8522 = arguments.length;
+var i__7928__auto___8523 = (0);
+while(true){
+if((i__7928__auto___8523 < len__7927__auto___8522)){
+args8519.push((arguments[i__7928__auto___8523]));
+
+var G__8524 = (i__7928__auto___8523 + (1));
+i__7928__auto___8523 = G__8524;
+continue;
+} else {
+}
+break;
+}
+
+var G__8521 = args8519.length;
+switch (G__8521) {
+case 1:
+return quil.core.fill.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.fill.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.fill.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.fill.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8519.length)].join('')));
+
+}
+});
+
+quil.core.fill.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.fill_float.call(null,rgb);
+});
+
+quil.core.fill.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.fill_float.call(null,rgb,alpha);
+});
+
+quil.core.fill.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.fill_float.call(null,r,g,b);
+});
+
+quil.core.fill.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.fill_float.call(null,r,g,b,a);
+});
+
+quil.core.fill.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Originally named filter in Processing Language.
+ * Filters the display window with the specified mode and level.
+ * Level defines the quality of the filter and mode may be one of the
+ * following keywords:
+ *
+ * :threshold - converts the image to black and white pixels depending
+ * if they are above or below the threshold defined by
+ * the level parameter. The level must be between
+ * 0.0 (black) and 1.0 (white). If no level is specified,
+ * 0.5 is used.
+ * :gray - converts any colors in the image to grayscale
+ * equivalents. Doesn't work with level.
+ * :invert - sets each pixel to its inverse value. Doesn't work with
+ * level.
+ * :posterize - limits each channel of the image to the number of
+ * colors specified as the level parameter. The parameter can
+ * be set to values between 2 and 255, but results are most
+ * noticeable in the lower ranges.
+ * :blur - executes a Guassian blur with the level parameter
+ * specifying the extent of the blurring. If no level
+ * parameter is used, the blur is equivalent to Guassian
+ * blur of radius 1.
+ * :opaque - sets the alpha channel to entirely opaque. Doesn't work
+ * with level.
+ * :erode - reduces the light areas. Doesn't work with level.
+ * :dilate - increases the light areas. Doesn't work with level.
+ */
+quil.core.display_filter = (function quil$core$display_filter(var_args){
+var args8526 = [];
+var len__7927__auto___8529 = arguments.length;
+var i__7928__auto___8530 = (0);
+while(true){
+if((i__7928__auto___8530 < len__7927__auto___8529)){
+args8526.push((arguments[i__7928__auto___8530]));
+
+var G__8531 = (i__7928__auto___8530 + (1));
+i__7928__auto___8530 = G__8531;
+continue;
+} else {
+}
+break;
+}
+
+var G__8528 = args8526.length;
+switch (G__8528) {
+case 1:
+return quil.core.display_filter.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.display_filter.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8526.length)].join('')));
+
+}
+});
+
+quil.core.display_filter.cljs$core$IFn$_invoke$arity$1 = (function (mode){
+return quil.core.current_graphics.call(null).filter((quil.util.resolve_constant_key.call(null,mode,quil.core.filter_modes) | (0)));
+});
+
+quil.core.display_filter.cljs$core$IFn$_invoke$arity$2 = (function (mode,level){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.filter_modes);
+return quil.core.current_graphics.call(null).filter((mode__$1 | (0)),level);
+});
+
+quil.core.display_filter.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Calculates the closest int value that is less than or equal to the
+ * value of the parameter. For example, (floor 9.03) returns the value 9.
+ */
+quil.core.floor = (function quil$core$floor(n){
+return quil.sketch.current_applet.call(null).floor(n);
+});
+/**
+ * Returns a boolean value representing whether the applet has focus.
+ */
+quil.core.focused = (function quil$core$focused(){
+return quil.sketch.current_applet.call(null).focused;
+});
+/**
+ * The system variable frameCount contains the number of frames
+ * displayed since the program started. Inside setup() the value is 0
+ * and after the first iteration of draw it is 1, etc.
+ */
+quil.core.frame_count = (function quil$core$frame_count(){
+return quil.sketch.current_applet.call(null).frameCount;
+});
+/**
+ * Returns the current framerate
+ */
+quil.core.current_frame_rate = (function quil$core$current_frame_rate(){
+return quil.sketch.current_applet.call(null).__frameRate;
+});
+/**
+ * Specifies a new target framerate (number of frames to be displayed every
+ * second). If the processor is not fast enough to maintain the
+ * specified rate, it will not be achieved. For example, the function
+ * call (frame-rate 30) will attempt to refresh 30 times a second. It
+ * is recommended to set the frame rate within setup. The default rate
+ * is 60 frames per second.
+ */
+quil.core.frame_rate = (function quil$core$frame_rate(new_rate){
+cljs.core.reset_BANG_.call(null,quil.sketch.current_applet.call(null).target_frame_rate,new_rate);
+
+return quil.sketch.current_applet.call(null).frameRate(new_rate);
+});
+/**
+ * Sets a perspective matrix defined through the parameters. Works
+ * like glFrustum, except it wipes out the current perspective matrix
+ * rather than muliplying itself with it.
+ */
+quil.core.frustum = (function quil$core$frustum(left,right,bottom,top,near,far){
+return quil.core.current_graphics.call(null).frustum(left,right,bottom,top,near,far);
+});
+/**
+ * Reads the color of any pixel or grabs a section of an image. If no
+ * parameters are specified, a copy of entire image is returned. Get the
+ * value of one pixel by specifying an x,y coordinate. Get a section of
+ * the image by specifying an additional width and height parameter.
+ * If the pixel requested is outside of the image window, black is returned.
+ * The numbers returned are scaled according to the current color ranges,
+ * but only RGB values are returned by this function. For example, even though
+ * you may have drawn a shape with (color-mode :hsb), the numbers returned
+ * will be in RGB.
+ *
+ * Getting the color of a single pixel with (get x y) is easy, but not
+ * as fast as grabbing the data directly using the pixels fn.
+ *
+ * If no img specified - current-graphics is used.
+ */
+quil.core.get_pixel = (function quil$core$get_pixel(var_args){
+var args8533 = [];
+var len__7927__auto___8536 = arguments.length;
+var i__7928__auto___8537 = (0);
+while(true){
+if((i__7928__auto___8537 < len__7927__auto___8536)){
+args8533.push((arguments[i__7928__auto___8537]));
+
+var G__8538 = (i__7928__auto___8537 + (1));
+i__7928__auto___8537 = G__8538;
+continue;
+} else {
+}
+break;
+}
+
+var G__8535 = args8533.length;
+switch (G__8535) {
+case 0:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8533.length)].join('')));
+
+}
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.get_pixel.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$1 = (function (img){
+return img.get();
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.get_pixel.call(null,quil.core.current_graphics.call(null),x,y);
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$3 = (function (img,x,y){
+return img.get((x | (0)),(y | (0)));
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$4 = (function (x,y,w,h){
+return quil.core.get_pixel.call(null,quil.core.current_graphics.call(null),x,y,w,h);
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$5 = (function (img,x,y,w,h){
+return img.get((x | (0)),(y | (0)),(w | (0)),(h | (0)));
+});
+
+quil.core.get_pixel.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Extracts the green value from a color, scaled to match current
+ * color-mode. This value is always returned as a float so be careful
+ * not to assign it to an int value.
+ */
+quil.core.green = (function quil$core$green(col){
+return quil.core.current_graphics.call(null).green(cljs.core.unchecked_int.call(null,col));
+});
+/**
+ * Converts a byte, char, int, or color to a String containing the
+ * equivalent hexadecimal notation. For example color(0, 102, 153) will
+ * convert to the String "FF006699". This function can help make your
+ * geeky debugging sessions much happier.
+ */
+quil.core.hex = (function quil$core$hex(var_args){
+var args8540 = [];
+var len__7927__auto___8543 = arguments.length;
+var i__7928__auto___8544 = (0);
+while(true){
+if((i__7928__auto___8544 < len__7927__auto___8543)){
+args8540.push((arguments[i__7928__auto___8544]));
+
+var G__8545 = (i__7928__auto___8544 + (1));
+i__7928__auto___8544 = G__8545;
+continue;
+} else {
+}
+break;
+}
+
+var G__8542 = args8540.length;
+switch (G__8542) {
+case 1:
+return quil.core.hex.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.hex.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8540.length)].join('')));
+
+}
+});
+
+quil.core.hex.cljs$core$IFn$_invoke$arity$1 = (function (val){
+return quil.sketch.current_applet.call(null).hex(val);
+});
+
+quil.core.hex.cljs$core$IFn$_invoke$arity$2 = (function (val,num_digits){
+return quil.sketch.current_applet.call(null).hex(val,num_digits);
+});
+
+quil.core.hex.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Height of the display window. The value of height is zero until
+ * size is called.
+ */
+quil.core.height = (function quil$core$height(){
+return quil.sketch.current_applet.call(null).height;
+});
+/**
+ * Set various hints and hacks for the renderer. This is used to
+ * handle obscure rendering features that cannot be implemented in a
+ * consistent manner across renderers. Many options will often graduate
+ * to standard features instead of hints over time.
+ *
+ * Options:
+ *
+ * :enable-native-fonts - Use the native version fonts when they are
+ * installed, rather than the bitmapped version from a .vlw
+ * file. This is useful with the default (or JAVA2D) renderer
+ * setting, as it will improve font rendering speed. This is not
+ * enabled by default, because it can be misleading while testing
+ * because the type will look great on your machine (because you have
+ * the font installed) but lousy on others' machines if the identical
+ * font is unavailable. This option can only be set per-sketch, and
+ * must be called before any use of text-font.
+ *
+ * :disable-native-fonts - Disables native font support.
+ *
+ * :disable-depth-test - Disable the zbuffer, allowing you to draw on
+ * top of everything at will. When depth testing is disabled, items
+ * will be drawn to the screen sequentially, like a painting. This
+ * hint is most often used to draw in 3D, then draw in 2D on top of
+ * it (for instance, to draw GUI controls in 2D on top of a 3D
+ * interface). Starting in release 0149, this will also clear the
+ * depth buffer. Restore the default with :enable-depth-test
+ * but note that with the depth buffer cleared, any 3D drawing that
+ * happens later in draw will ignore existing shapes on the screen.
+ *
+ * :enable-depth-test - Enables the zbuffer.
+ *
+ * :enable-depth-sort - Enable primitive z-sorting of triangles and
+ * lines in :p3d and :opengl rendering modes. This can slow
+ * performance considerably, and the algorithm is not yet perfect.
+ *
+ * :disable-depth-sort - Disables hint :enable-depth-sort
+ *
+ * :disable-opengl-errors - Speeds up the OPENGL renderer setting
+ * by not checking for errors while running.
+ *
+ * :enable-opengl-errors - Turns on OpenGL error checking
+ *
+ * :enable-depth-mask
+ * :disable-depth-mask
+ *
+ * :enable-optimized-stroke
+ * :disable-optimized-stroke
+ * :enable-retina-pixels
+ * :disable-retina-pixels
+ * :enable-stroke-perspective
+ * :disable-stroke-perspective
+ * :enable-stroke-pure
+ * :disable-stroke-pure
+ * :enable-texture-mipmaps
+ * :disable-texture-mipmaps
+ */
+quil.core.hint = (function quil$core$hint(hint_type){
+var hint_type__$1 = (((hint_type instanceof cljs.core.Keyword))?cljs.core.get.call(null,quil.core.hint_options,hint_type):hint_type);
+return quil.core.current_graphics.call(null).hint((hint_type__$1 | (0)));
+});
+/**
+ * Returns the current hour as a value from 0 - 23.
+ */
+quil.core.hour = (function quil$core$hour(){
+return quil.sketch.current_applet.call(null).hour();
+});
+/**
+ * Extracts the hue value from a color.
+ */
+quil.core.hue = (function quil$core$hue(col){
+return quil.core.current_graphics.call(null).hue(cljs.core.unchecked_int.call(null,col));
+});
+/**
+ * Displays images to the screen. Processing currently works with GIF,
+ * JPEG, and Targa images. The color of an image may be modified with
+ * the tint function and if a GIF has transparency, it will maintain
+ * its transparency. The img parameter specifies the image to display
+ * and the x and y parameters define the location of the image from its
+ * upper-left corner. The image is displayed at its original size
+ * unless the width and height parameters specify a different size. The
+ * image-mode fn changes the way the parameters work. A call to
+ * (image-mode :corners) will change the width and height parameters to
+ * define the x and y values of the opposite corner of the image.
+ *
+ * Starting with release 0124, when using the default (JAVA2D)
+ * renderer, smooth will also improve image quality of resized
+ * images.
+ */
+quil.core.image = (function quil$core$image(var_args){
+var args8547 = [];
+var len__7927__auto___8550 = arguments.length;
+var i__7928__auto___8551 = (0);
+while(true){
+if((i__7928__auto___8551 < len__7927__auto___8550)){
+args8547.push((arguments[i__7928__auto___8551]));
+
+var G__8552 = (i__7928__auto___8551 + (1));
+i__7928__auto___8551 = G__8552;
+continue;
+} else {
+}
+break;
+}
+
+var G__8549 = args8547.length;
+switch (G__8549) {
+case 3:
+return quil.core.image.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 5:
+return quil.core.image.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8547.length)].join('')));
+
+}
+});
+
+quil.core.image.cljs$core$IFn$_invoke$arity$3 = (function (img,x,y){
+return quil.core.current_graphics.call(null).image(img,x,y);
+});
+
+quil.core.image.cljs$core$IFn$_invoke$arity$5 = (function (img,x,y,c,d){
+return quil.core.current_graphics.call(null).image(img,x,y,c,d);
+});
+
+quil.core.image.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Originally named filter in Processing Language.
+ * Filters given image with the specified mode and level.
+ * Level defines the quality of the filter and mode may be one of
+ * the following keywords:
+ *
+ * :threshold - converts the image to black and white pixels depending
+ * if they are above or below the threshold defined by
+ * the level parameter. The level must be between
+ * 0.0 (black) and 1.0 (white). If no level is specified,
+ * 0.5 is used.
+ * :gray - converts any colors in the image to grayscale
+ * equivalents. Doesn't work with level.
+ * :invert - sets each pixel to its inverse value. Doesn't work with
+ * level.
+ * :posterize - limits each channel of the image to the number of
+ * colors specified as the level parameter. The parameter can
+ * be set to values between 2 and 255, but results are most
+ * noticeable in the lower ranges.
+ * :blur - executes a Guassian blur with the level parameter
+ * specifying the extent of the blurring. If no level
+ * parameter is used, the blur is equivalent to Guassian
+ * blur of radius 1.
+ * :opaque - sets the alpha channel to entirely opaque. Doesn't work
+ * with level.
+ * :erode - reduces the light areas. Doesn't work with level.
+ * :dilate - increases the light areas. Doesn't work with level.
+ */
+quil.core.image_filter = (function quil$core$image_filter(var_args){
+var args8554 = [];
+var len__7927__auto___8557 = arguments.length;
+var i__7928__auto___8558 = (0);
+while(true){
+if((i__7928__auto___8558 < len__7927__auto___8557)){
+args8554.push((arguments[i__7928__auto___8558]));
+
+var G__8559 = (i__7928__auto___8558 + (1));
+i__7928__auto___8558 = G__8559;
+continue;
+} else {
+}
+break;
+}
+
+var G__8556 = args8554.length;
+switch (G__8556) {
+case 2:
+return quil.core.image_filter.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.image_filter.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8554.length)].join('')));
+
+}
+});
+
+quil.core.image_filter.cljs$core$IFn$_invoke$arity$2 = (function (img,mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.filter_modes);
+return img.filter((mode__$1 | (0)));
+});
+
+quil.core.image_filter.cljs$core$IFn$_invoke$arity$3 = (function (img,mode,level){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.filter_modes);
+return img.filter((mode__$1 | (0)),level);
+});
+
+quil.core.image_filter.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Modifies the location from which images draw. The default mode is :corner.
+ * Available modes are:
+ *
+ * :corner - specifies the location to be the upper left corner and
+ * uses the fourth and fifth parameters of image to set the
+ * image's width and height.
+ *
+ * :corners - uses the second and third parameters of image to set the
+ * location of one corner of the image and uses the fourth
+ * and fifth parameters to set the opposite corner.
+ *
+ * :center - draw images centered at the given x and y position.
+ */
+quil.core.image_mode = (function quil$core$image_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.image_modes);
+return quil.core.current_graphics.call(null).imageMode((mode__$1 | (0)));
+});
+/**
+ * The variable keyCode is used to detect special keys such as the UP,
+ * DOWN, LEFT, RIGHT arrow keys and ALT, CONTROL, SHIFT. When checking
+ * for these keys, it's first necessary to check and see if the key is
+ * coded. This is done with the conditional (= (key) CODED).
+ *
+ * The keys included in the ASCII specification (BACKSPACE, TAB, ENTER,
+ * RETURN, ESC, and DELETE) do not require checking to see if they key
+ * is coded, and you should simply use the key variable instead of
+ * key-code If you're making cross-platform projects, note that the
+ * ENTER key is commonly used on PCs and Unix and the RETURN key is
+ * used instead on Macintosh. Check for both ENTER and RETURN to make
+ * sure your program will work for all platforms.
+ *
+ * For users familiar with Java, the values for UP and DOWN are simply
+ * shorter versions of Java's KeyEvent.VK_UP and
+ * KeyEvent.VK_DOWN. Other keyCode values can be found in the Java
+ * KeyEvent reference.
+ */
+quil.core.key_code = (function quil$core$key_code(){
+return quil.sketch.current_applet.call(null).keyCode;
+});
+/**
+ * true if any key is currently pressed, false otherwise.
+ */
+quil.core.key_pressed_QMARK_ = (function quil$core$key_pressed_QMARK_(){
+return quil.sketch.current_applet.call(null).__keyPressed;
+});
+/**
+ * Sets the falloff rates for point lights, spot lights, and ambient
+ * lights. The parameters are used to determine the falloff with the
+ * following equation:
+ *
+ * d = distance from light position to vertex position
+ * falloff = 1 / (CONSTANT + d * LINEAR + (d*d) * QUADRATIC)
+ *
+ * Like fill, it affects only the elements which are created after it
+ * in the code. The default value is (light-falloff 1.0 0.0 0.0).
+ * Thinking about an ambient light with a falloff can be tricky. It is
+ * used, for example, if you wanted a region of your scene to be lit
+ * ambiently one color and another region to be lit ambiently by
+ * another color, you would use an ambient light with location and
+ * falloff. You can think of it as a point light that doesn't care
+ * which direction a surface is facing.
+ */
+quil.core.light_falloff = (function quil$core$light_falloff(constant,linear,quadratic){
+return quil.core.current_graphics.call(null).lightFalloff(constant,linear,quadratic);
+});
+/**
+ * Calculates a color or colors between two color at a specific
+ * increment. The amt parameter is the amount to interpolate between
+ * the two values where 0.0 equal to the first point, 0.1 is very near
+ * the first point, 0.5 is half-way in between, etc.
+ */
+quil.core.lerp_color = (function quil$core$lerp_color(c1,c2,amt){
+return quil.core.current_graphics.call(null).lerpColor(cljs.core.unchecked_int.call(null,c1),cljs.core.unchecked_int.call(null,c2),amt);
+});
+/**
+ * Calculates a number between two numbers at a specific
+ * increment. The amt parameter is the amount to interpolate between
+ * the two values where 0.0 equal to the first point, 0.1 is very near
+ * the first point, 0.5 is half-way in between, etc. The lerp function
+ * is convenient for creating motion along a straight path and for
+ * drawing dotted lines.
+ */
+quil.core.lerp = (function quil$core$lerp(start,stop,amt){
+return quil.sketch.current_applet.call(null).lerp(start,stop,amt);
+});
+/**
+ * Sets the default ambient light, directional light, falloff, and
+ * specular values. The defaults are:
+ *
+ * (ambient-light 128 128 128)
+ * (directional-light 128 128 128 0 0 -1)
+ * (light-falloff 1 0 0)
+ * (light-specular 0 0 0).
+ *
+ * Lights need to be included in the draw to remain persistent in a
+ * looping program. Placing them in the setup of a looping program
+ * will cause them to only have an effect the first time through the
+ * loop.
+ */
+quil.core.lights = (function quil$core$lights(){
+return quil.core.current_graphics.call(null).lights();
+});
+/**
+ * Sets the specular color for lights. Like fill, it affects only the
+ * elements which are created after it in the code. Specular refers to
+ * light which bounces off a surface in a perferred direction (rather
+ * than bouncing in all directions like a diffuse light) and is used
+ * for creating highlights. The specular quality of a light interacts
+ * with the specular material qualities set through the specular and
+ * shininess functions.
+ */
+quil.core.light_specular = (function quil$core$light_specular(r,g,b){
+return quil.core.current_graphics.call(null).lightSpecular(r,g,b);
+});
+/**
+ * Draws a line (a direct path between two points) to the screen. The
+ * version of line with four parameters draws the line in 2D. To color
+ * a line, use the stroke function. A line cannot be filled, therefore
+ * the fill method will not affect the color of a line. 2D lines are
+ * drawn with a width of one pixel by default, but this can be changed
+ * with the stroke-weight function. The version with six parameters
+ * allows the line to be placed anywhere within XYZ space.
+ */
+quil.core.line = (function quil$core$line(var_args){
+var args8561 = [];
+var len__7927__auto___8564 = arguments.length;
+var i__7928__auto___8565 = (0);
+while(true){
+if((i__7928__auto___8565 < len__7927__auto___8564)){
+args8561.push((arguments[i__7928__auto___8565]));
+
+var G__8566 = (i__7928__auto___8565 + (1));
+i__7928__auto___8565 = G__8566;
+continue;
+} else {
+}
+break;
+}
+
+var G__8563 = args8561.length;
+switch (G__8563) {
+case 2:
+return quil.core.line.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 4:
+return quil.core.line.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 6:
+return quil.core.line.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8561.length)].join('')));
+
+}
+});
+
+quil.core.line.cljs$core$IFn$_invoke$arity$2 = (function (p1,p2){
+return cljs.core.apply.call(null,quil.core.line,cljs.core.concat.call(null,p1,p2));
+});
+
+quil.core.line.cljs$core$IFn$_invoke$arity$4 = (function (x1,y1,x2,y2){
+return quil.core.current_graphics.call(null).line(x1,y1,x2,y2);
+});
+
+quil.core.line.cljs$core$IFn$_invoke$arity$6 = (function (x1,y1,z1,x2,y2,z2){
+return quil.core.current_graphics.call(null).line(x1,y1,z1,x2,y2,z2);
+});
+
+quil.core.line.cljs$lang$maxFixedArity = 6;
+
+/**
+ * Loads a font into a variable of type PFont. To load correctly,
+ * fonts must be located in the data directory of the current sketch.
+ * To create a font to use with Processing use the create-font fn.
+ *
+ * Like load-image and other methods that load data, the load-font fn
+ * should not be used inside draw, because it will slow down the sketch
+ * considerably, as the font will be re-loaded from the disk (or
+ * network) on each frame.
+ *
+ * For most renderers, Processing displays fonts using the .vlw font
+ * format, which uses images for each letter, rather than defining them
+ * through vector data. When hint :enable-native-fonts is used with the
+ * JAVA2D renderer, the native version of a font will be used if it is
+ * installed on the user's machine.
+ *
+ * Using create-font (instead of load-font) enables vector data to be
+ * used with the JAVA2D (default) renderer setting. This can be helpful
+ * when many font sizes are needed, or when using any renderer based on
+ * JAVA2D, such as the PDF library.
+ */
+quil.core.load_font = (function quil$core$load_font(filename){
+return quil.sketch.current_applet.call(null).loadFont([cljs.core.str.cljs$core$IFn$_invoke$arity$1(filename)].join(''));
+});
+/**
+ * Loads an image into a variable of type PImage. Four types of
+ * images ( .gif, .jpg, .tga, .png) images may be loaded. To load
+ * correctly, images must be located in the data directory of the
+ * current sketch. In most cases, load all images in setup to preload
+ * them at the start of the program. Loading images inside draw will
+ * reduce the speed of a program.
+ *
+ * The filename parameter can also be a URL to a file found online.
+ *
+ * If an image is not loaded successfully, the null value is returned
+ * and an error message will be printed to the console. The error
+ * message does not halt the program, however the null value may cause
+ * a NullPointerException if your code does not check whether the value
+ * returned from load-image is nil.
+ *
+ * Depending on the type of error, a PImage object may still be
+ * returned, but the width and height of the image will be set to
+ * -1. This happens if bad image data is returned or cannot be decoded
+ * properly. Sometimes this happens with image URLs that produce a 403
+ * error or that redirect to a password prompt, because load-image
+ * will attempt to interpret the HTML as image data.
+ */
+quil.core.load_image = (function quil$core$load_image(filename){
+return quil.sketch.current_applet.call(null).loadImage([cljs.core.str.cljs$core$IFn$_invoke$arity$1(filename)].join(''));
+});
+/**
+ * Loads a shader into the PShader object. Shaders are compatible with the
+ * P2D and P3D renderers, but not with the default renderer.
+ */
+quil.core.load_shader = (function quil$core$load_shader(var_args){
+var args8568 = [];
+var len__7927__auto___8571 = arguments.length;
+var i__7928__auto___8572 = (0);
+while(true){
+if((i__7928__auto___8572 < len__7927__auto___8571)){
+args8568.push((arguments[i__7928__auto___8572]));
+
+var G__8573 = (i__7928__auto___8572 + (1));
+i__7928__auto___8572 = G__8573;
+continue;
+} else {
+}
+break;
+}
+
+var G__8570 = args8568.length;
+switch (G__8570) {
+case 1:
+return quil.core.load_shader.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.load_shader.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8568.length)].join('')));
+
+}
+});
+
+quil.core.load_shader.cljs$core$IFn$_invoke$arity$1 = (function (fragment_filename){
+return quil.core.current_graphics.call(null).loadShader(fragment_filename);
+});
+
+quil.core.load_shader.cljs$core$IFn$_invoke$arity$2 = (function (fragment_filename,vertex_filename){
+return quil.core.current_graphics.call(null).loadShader(fragment_filename,vertex_filename);
+});
+
+quil.core.load_shader.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Load a geometry from a file as a PShape.
+ */
+quil.core.load_shape = (function quil$core$load_shape(filename){
+return quil.sketch.current_applet.call(null).loadShape(filename);
+});
+/**
+ * Calculates the natural logarithm (the base-e logarithm) of a
+ * number. This function expects the values greater than 0.0.
+ */
+quil.core.log = (function quil$core$log(val){
+return quil.sketch.current_applet.call(null).log(val);
+});
+/**
+ * Calculates the magnitude (or length) of a vector. A vector is a
+ * direction in space commonly used in computer graphics and linear
+ * algebra. Because it has no start position, the magnitude of a vector
+ * can be thought of as the distance from coordinate (0,0) to its (x,y)
+ * value. Therefore, mag is a shortcut for writing (dist 0 0 x y).
+ */
+quil.core.mag = (function quil$core$mag(var_args){
+var args8575 = [];
+var len__7927__auto___8578 = arguments.length;
+var i__7928__auto___8579 = (0);
+while(true){
+if((i__7928__auto___8579 < len__7927__auto___8578)){
+args8575.push((arguments[i__7928__auto___8579]));
+
+var G__8580 = (i__7928__auto___8579 + (1));
+i__7928__auto___8579 = G__8580;
+continue;
+} else {
+}
+break;
+}
+
+var G__8577 = args8575.length;
+switch (G__8577) {
+case 2:
+return quil.core.mag.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.mag.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8575.length)].join('')));
+
+}
+});
+
+quil.core.mag.cljs$core$IFn$_invoke$arity$2 = (function (a,b){
+return quil.sketch.current_applet.call(null).mag(a,b);
+});
+
+quil.core.mag.cljs$core$IFn$_invoke$arity$3 = (function (a,b,c){
+return quil.sketch.current_applet.call(null).mag(a,b,c);
+});
+
+quil.core.mag.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Re-maps a number from one range to another.
+ *
+ * Numbers outside the range are not clamped to 0 and 1, because
+ * out-of-range values are often intentional and useful.
+ */
+quil.core.map_range = (function quil$core$map_range(val,low1,high1,low2,high2){
+return quil.sketch.current_applet.call(null).map(val,low1,high1,low2,high2);
+});
+/**
+ * Returns the number of milliseconds (thousandths of a second) since
+ * starting the sketch. This information is often used for timing
+ * animation sequences.
+ */
+quil.core.millis = (function quil$core$millis(){
+return quil.sketch.current_applet.call(null).millis();
+});
+/**
+ * Returns the current minute as a value from 0 - 59
+ */
+quil.core.minute = (function quil$core$minute(){
+return quil.sketch.current_applet.call(null).minute();
+});
+/**
+ * Returns the three-dimensional x, y, z position in model space. This
+ * returns the x value for a given coordinate based on the current set
+ * of transformations (scale, rotate, translate, etc.) The x value can
+ * be used to place an object in space relative to the location of the
+ * original point once the transformations are no longer in use.
+ */
+quil.core.model_x = (function quil$core$model_x(x,y,z){
+return quil.core.current_graphics.call(null).modelX(x,y,z);
+});
+/**
+ * Returns the three-dimensional x, y, z position in model space. This
+ * returns the y value for a given coordinate based on the current set
+ * of transformations (scale, rotate, translate, etc.) The y value can
+ * be used to place an object in space relative to the location of the
+ * original point once the transformations are no longer in use.
+ */
+quil.core.model_y = (function quil$core$model_y(x,y,z){
+return quil.core.current_graphics.call(null).modelY(x,y,z);
+});
+/**
+ * Returns the three-dimensional x, y, z position in model space. This
+ * returns the z value for a given coordinate based on the current set
+ * of transformations (scale, rotate, translate, etc.) The z value can
+ * be used to place an object in space relative to the location of the
+ * original point once the transformations are no longer in use.
+ */
+quil.core.model_z = (function quil$core$model_z(x,y,z){
+return quil.core.current_graphics.call(null).modelZ(x,y,z);
+});
+/**
+ * Returns the current month as a value from 1 - 12.
+ */
+quil.core.month = (function quil$core$month(){
+return quil.sketch.current_applet.call(null).month();
+});
+/**
+ * The value of the system variable mouseButton is either :left, :right,
+ * or :center depending on which button is pressed. nil if no button pressed
+ */
+quil.core.mouse_button = (function quil$core$mouse_button(){
+var button_code = quil.sketch.current_applet.call(null).mouseButton;
+var pred__8585 = cljs.core._EQ_;
+var expr__8586 = button_code;
+if(cljs.core.truth_(pred__8585.call(null,(37),expr__8586))){
+return new cljs.core.Keyword(null,"left","left",-399115937);
+} else {
+if(cljs.core.truth_(pred__8585.call(null,(39),expr__8586))){
+return new cljs.core.Keyword(null,"right","right",-452581833);
+} else {
+if(cljs.core.truth_(pred__8585.call(null,(3),expr__8586))){
+return new cljs.core.Keyword(null,"center","center",-748944368);
+} else {
+return null;
+}
+}
+}
+});
+/**
+ * Variable storing if a mouse button is pressed. The value of the
+ * system variable mousePressed is true if a mouse button is pressed
+ * and false if a button is not pressed.
+ */
+quil.core.mouse_pressed_QMARK_ = (function quil$core$mouse_pressed_QMARK_(){
+return quil.sketch.current_applet.call(null).__mousePressed;
+});
+/**
+ * Current horizontal coordinate of the mouse.
+ */
+quil.core.mouse_x = (function quil$core$mouse_x(){
+return quil.sketch.current_applet.call(null).mouseX;
+});
+/**
+ * Current vertical coordinate of the mouse.
+ */
+quil.core.mouse_y = (function quil$core$mouse_y(){
+return quil.sketch.current_applet.call(null).mouseY;
+});
+/**
+ * Hides the cursor from view. Will not work when running the in full
+ * screen (Present) mode.
+ */
+quil.core.no_cursor = (function quil$core$no_cursor(){
+return quil.sketch.current_applet.call(null).noCursor();
+});
+/**
+ * Disables filling geometry. If both no-stroke and no-fill are called,
+ * nothing will be drawn to the screen.
+ */
+quil.core.no_fill = (function quil$core$no_fill(){
+quil.core.current_graphics.call(null).noFill();
+
+return (quil.core.current_graphics.call(null)[quil.core.no_fill_prop] = true);
+});
+/**
+ * Returns a new 2D unit vector in a random direction
+ */
+quil.core.random_2d = (function quil$core$random_2d(){
+var theta = quil.sketch.current_applet.call(null).random(quil.core.TWO_PI);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [Math.cos(theta),Math.sin(theta)], null);
+});
+/**
+ * Returns a new 3D unit vector in a random direction
+ */
+quil.core.random_3d = (function quil$core$random_3d(){
+var theta = quil.sketch.current_applet.call(null).random(quil.core.TWO_PI);
+var phi = quil.sketch.current_applet.call(null).random((- quil.core.HALF_PI),quil.core.HALF_PI);
+var vx = (Math.cos(theta) * Math.sin(phi));
+var vy = (Math.sin(theta) * Math.sin(phi));
+var vz = Math.cos(phi);
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [vx,vy,vz], null);
+});
+/**
+ * Returns the Perlin noise value at specified coordinates. Perlin
+ * noise is a random sequence generator producing a more natural
+ * ordered, harmonic succession of numbers compared to the standard
+ * random function. It was invented by Ken Perlin in the 1980s and
+ * been used since in graphical applications to produce procedural
+ * textures, natural motion, shapes, terrains etc.
+ *
+ * The main difference to the random function is that Perlin noise is
+ * defined in an infinite n-dimensional space where each pair of
+ * coordinates corresponds to a fixed semi-random value (fixed only for
+ * the lifespan of the program). The resulting value will always be
+ * between 0.0 and 1.0. Processing can compute 1D, 2D and 3D noise,
+ * depending on the number of coordinates given. The noise value can be
+ * animated by moving through the noise space and the 2nd and 3rd
+ * dimensions can also be interpreted as time.
+ *
+ * The actual noise is structured similar to an audio signal, in
+ * respect to the function's use of frequencies. Similar to the concept
+ * of harmonics in physics, perlin noise is computed over several
+ * octaves which are added together for the final result.
+ *
+ * Another way to adjust the character of the resulting sequence is the
+ * scale of the input coordinates. As the function works within an
+ * infinite space the value of the coordinates doesn't matter as such,
+ * only the distance between successive coordinates does (eg. when
+ * using noise within a loop). As a general rule the smaller the
+ * difference between coordinates, the smoother the resulting noise
+ * sequence will be. Steps of 0.005-0.03 work best for most
+ * applications, but this will differ depending on use.
+ */
+quil.core.noise = (function quil$core$noise(var_args){
+var args8588 = [];
+var len__7927__auto___8591 = arguments.length;
+var i__7928__auto___8592 = (0);
+while(true){
+if((i__7928__auto___8592 < len__7927__auto___8591)){
+args8588.push((arguments[i__7928__auto___8592]));
+
+var G__8593 = (i__7928__auto___8592 + (1));
+i__7928__auto___8592 = G__8593;
+continue;
+} else {
+}
+break;
+}
+
+var G__8590 = args8588.length;
+switch (G__8590) {
+case 1:
+return quil.core.noise.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.noise.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.noise.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8588.length)].join('')));
+
+}
+});
+
+quil.core.noise.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return quil.sketch.current_applet.call(null).noise(x);
+});
+
+quil.core.noise.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.sketch.current_applet.call(null).noise(x,y);
+});
+
+quil.core.noise.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.sketch.current_applet.call(null).noise(x,y,z);
+});
+
+quil.core.noise.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Adjusts the character and level of detail produced by the Perlin
+ * noise function. Similar to harmonics in physics, noise is computed
+ * over several octaves. Lower octaves contribute more to the output
+ * signal and as such define the overal intensity of the noise, whereas
+ * higher octaves create finer grained details in the noise
+ * sequence. By default, noise is computed over 4 octaves with each
+ * octave contributing exactly half than its predecessor, starting at
+ * 50% strength for the 1st octave. This falloff amount can be changed
+ * by adding an additional function parameter. Eg. a falloff factor of
+ * 0.75 means each octave will now have 75% impact (25% less) of the
+ * previous lower octave. Any value between 0.0 and 1.0 is valid,
+ * however note that values greater than 0.5 might result in greater
+ * than 1.0 values returned by noise.
+ *
+ * By changing these parameters, the signal created by the noise
+ * function can be adapted to fit very specific needs and
+ * characteristics.
+ */
+quil.core.noise_detail = (function quil$core$noise_detail(var_args){
+var args8595 = [];
+var len__7927__auto___8598 = arguments.length;
+var i__7928__auto___8599 = (0);
+while(true){
+if((i__7928__auto___8599 < len__7927__auto___8598)){
+args8595.push((arguments[i__7928__auto___8599]));
+
+var G__8600 = (i__7928__auto___8599 + (1));
+i__7928__auto___8599 = G__8600;
+continue;
+} else {
+}
+break;
+}
+
+var G__8597 = args8595.length;
+switch (G__8597) {
+case 1:
+return quil.core.noise_detail.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.noise_detail.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8595.length)].join('')));
+
+}
+});
+
+quil.core.noise_detail.cljs$core$IFn$_invoke$arity$1 = (function (octaves){
+return quil.sketch.current_applet.call(null).noiseDetail((octaves | (0)));
+});
+
+quil.core.noise_detail.cljs$core$IFn$_invoke$arity$2 = (function (octaves,falloff){
+return quil.sketch.current_applet.call(null).noiseDetail((octaves | (0)),falloff);
+});
+
+quil.core.noise_detail.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the seed value for noise. By default, noise produces different
+ * results each time the program is run. Set the value parameter to a
+ * constant to return the same pseudo-random numbers each time the
+ * software is run.
+ */
+quil.core.noise_seed = (function quil$core$noise_seed(val){
+return quil.sketch.current_applet.call(null).noiseSeed((val | (0)));
+});
+/**
+ * Disable all lighting. Lighting is turned off by default and enabled
+ * with the lights fn. This function can be used to disable lighting so
+ * that 2D geometry (which does not require lighting) can be drawn
+ * after a set of lighted 3D geometry.
+ */
+quil.core.no_lights = (function quil$core$no_lights(){
+return quil.core.current_graphics.call(null).noLights();
+});
+/**
+ * Stops Processing from continuously executing the code within
+ * draw. If start-loop is called, the code in draw will begin to run
+ * continuously again. If using no-loop in setup, it should be the last
+ * line inside the block.
+ *
+ * When no-loop is used, it's not possible to manipulate or access the
+ * screen inside event handling functions such as mouse-pressed or
+ * key-pressed. Instead, use those functions to call redraw or
+ * loop which will run draw, which can update the screen
+ * properly. This means that when no-loop has been called, no drawing
+ * can happen, and functions like save-frame may not be used.
+ *
+ * Note that if the sketch is resized, redraw will be called to
+ * update the sketch, even after no-oop has been
+ * specified. Otherwise, the sketch would enter an odd state until
+ * loop was called.
+ */
+quil.core.no_loop = (function quil$core$no_loop(){
+return quil.sketch.current_applet.call(null).noLoop();
+});
+/**
+ * Normalize a value to exist between 0 and 1 (inclusive).
+ */
+quil.core.norm = (function quil$core$norm(val,start,stop){
+return quil.sketch.current_applet.call(null).norm(val,start,stop);
+});
+/**
+ * Sets the current normal vector. This is for drawing three
+ * dimensional shapes and surfaces and specifies a vector perpendicular
+ * to the surface of the shape which determines how lighting affects
+ * it. Processing attempts to automatically assign normals to shapes,
+ * but since that's imperfect, this is a better option when you want
+ * more control. This function is identical to glNormal3f() in OpenGL.
+ */
+quil.core.normal = (function quil$core$normal(nx,ny,nz){
+return quil.core.current_graphics.call(null).normal(nx,ny,nz);
+});
+/**
+ * Draws all geometry with jagged (aliased) edges. Must be called inside
+ * :settings handler.
+ */
+quil.core.no_smooth = (function quil$core$no_smooth(){
+return quil.core.current_graphics.call(null).noSmooth();
+});
+/**
+ * Disables drawing the stroke (outline). If both no-stroke and
+ * no-fill are called, nothing will be drawn to the screen.
+ */
+quil.core.no_stroke = (function quil$core$no_stroke(){
+return quil.core.current_graphics.call(null).noStroke();
+});
+/**
+ * Removes the current fill value for displaying images and reverts to
+ * displaying images with their original hues.
+ */
+quil.core.no_tint = (function quil$core$no_tint(){
+return quil.core.current_graphics.call(null).noTint();
+});
+/**
+ * Sets an orthographic projection and defines a parallel clipping
+ * volume. All objects with the same dimension appear the same size,
+ * regardless of whether they are near or far from the camera. The
+ * parameters to this function specify the clipping volume where left
+ * and right are the minimum and maximum x values, top and bottom are
+ * the minimum and maximum y values, and near and far are the minimum
+ * and maximum z values. If no parameters are given, the default is
+ * used: (ortho 0 width 0 height -10 10)
+ */
+quil.core.ortho = (function quil$core$ortho(var_args){
+var args8602 = [];
+var len__7927__auto___8605 = arguments.length;
+var i__7928__auto___8606 = (0);
+while(true){
+if((i__7928__auto___8606 < len__7927__auto___8605)){
+args8602.push((arguments[i__7928__auto___8606]));
+
+var G__8607 = (i__7928__auto___8606 + (1));
+i__7928__auto___8606 = G__8607;
+continue;
+} else {
+}
+break;
+}
+
+var G__8604 = args8602.length;
+switch (G__8604) {
+case 0:
+return quil.core.ortho.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 4:
+return quil.core.ortho.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 6:
+return quil.core.ortho.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8602.length)].join('')));
+
+}
+});
+
+quil.core.ortho.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).ortho();
+});
+
+quil.core.ortho.cljs$core$IFn$_invoke$arity$4 = (function (left,right,bottom,top){
+return quil.core.current_graphics.call(null).ortho(left,right,bottom,top);
+});
+
+quil.core.ortho.cljs$core$IFn$_invoke$arity$6 = (function (left,right,bottom,top,near,far){
+return quil.core.current_graphics.call(null).ortho(left,right,bottom,top,near,far);
+});
+
+quil.core.ortho.cljs$lang$maxFixedArity = 6;
+
+/**
+ * Sets a perspective projection applying foreshortening, making
+ * distant objects appear smaller than closer ones. The parameters
+ * define a viewing volume with the shape of truncated pyramid. Objects
+ * near to the front of the volume appear their actual size, while
+ * farther objects appear smaller. This projection simulates the
+ * perspective of the world more accurately than orthographic
+ * projection. The version of perspective without parameters sets the
+ * default perspective and the version with four parameters allows the
+ * programmer to set the area precisely. The default values are:
+ * perspective(PI/3.0, width/height, cameraZ/10.0, cameraZ*10.0) where
+ * cameraZ is ((height/2.0) / tan(PI*60.0/360.0));
+ */
+quil.core.perspective = (function quil$core$perspective(var_args){
+var args8609 = [];
+var len__7927__auto___8612 = arguments.length;
+var i__7928__auto___8613 = (0);
+while(true){
+if((i__7928__auto___8613 < len__7927__auto___8612)){
+args8609.push((arguments[i__7928__auto___8613]));
+
+var G__8614 = (i__7928__auto___8613 + (1));
+i__7928__auto___8613 = G__8614;
+continue;
+} else {
+}
+break;
+}
+
+var G__8611 = args8609.length;
+switch (G__8611) {
+case 0:
+return quil.core.perspective.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 4:
+return quil.core.perspective.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8609.length)].join('')));
+
+}
+});
+
+quil.core.perspective.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).perspective();
+});
+
+quil.core.perspective.cljs$core$IFn$_invoke$arity$4 = (function (fovy,aspect,z_near,z_far){
+return quil.core.current_graphics.call(null).perspective(fovy,aspect,z_near,z_far);
+});
+
+quil.core.perspective.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Array containing the values for all the pixels in the display
+ * window or image. This array is therefore the size of the display window. If
+ * this array is modified, the update-pixels fn must be called to update
+ * the changes. Calls .loadPixels before obtaining the pixel array.
+ */
+quil.core.pixels = (function quil$core$pixels(var_args){
+var args8616 = [];
+var len__7927__auto___8619 = arguments.length;
+var i__7928__auto___8620 = (0);
+while(true){
+if((i__7928__auto___8620 < len__7927__auto___8619)){
+args8616.push((arguments[i__7928__auto___8620]));
+
+var G__8621 = (i__7928__auto___8620 + (1));
+i__7928__auto___8620 = G__8621;
+continue;
+} else {
+}
+break;
+}
+
+var G__8618 = args8616.length;
+switch (G__8618) {
+case 0:
+return quil.core.pixels.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.pixels.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8616.length)].join('')));
+
+}
+});
+
+quil.core.pixels.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.pixels.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.pixels.cljs$core$IFn$_invoke$arity$1 = (function (img){
+img.loadPixels();
+
+var pix_array = img.pixels.toArray();
+img.stored_pix_array = pix_array;
+
+return pix_array;
+});
+
+quil.core.pixels.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Horizontal coordinate of the mouse in the previous frame
+ */
+quil.core.pmouse_x = (function quil$core$pmouse_x(){
+return quil.sketch.current_applet.call(null).pmouseX;
+});
+/**
+ * Vertical coordinate of the mouse in the previous frame
+ */
+quil.core.pmouse_y = (function quil$core$pmouse_y(){
+return quil.sketch.current_applet.call(null).pmouseY;
+});
+/**
+ * Draws a point, a coordinate in space at the dimension of one
+ * pixel. The first parameter is the horizontal value for the point,
+ * the second value is the vertical value for the point, and the
+ * optional third value is the depth value. Drawing this shape in 3D
+ * using the z parameter requires the :P3D or :opengl renderer to be
+ * used.
+ */
+quil.core.point = (function quil$core$point(var_args){
+var args8623 = [];
+var len__7927__auto___8626 = arguments.length;
+var i__7928__auto___8627 = (0);
+while(true){
+if((i__7928__auto___8627 < len__7927__auto___8626)){
+args8623.push((arguments[i__7928__auto___8627]));
+
+var G__8628 = (i__7928__auto___8627 + (1));
+i__7928__auto___8627 = G__8628;
+continue;
+} else {
+}
+break;
+}
+
+var G__8625 = args8623.length;
+switch (G__8625) {
+case 2:
+return quil.core.point.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.point.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8623.length)].join('')));
+
+}
+});
+
+quil.core.point.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.current_graphics.call(null).point(x,y);
+});
+
+quil.core.point.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).point(x,y,z);
+});
+
+quil.core.point.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Adds a point light. Lights need to be included in the draw() to
+ * remain persistent in a looping program. Placing them in the setup()
+ * of a looping program will cause them to only have an effect the
+ * first time through the loop. The affect of the r, g, and b
+ * parameters is determined by the current color mode. The x, y, and z
+ * parameters set the position of the light
+ */
+quil.core.point_light = (function quil$core$point_light(r,g,b,x,y,z){
+return quil.core.current_graphics.call(null).pointLight(r,g,b,x,y,z);
+});
+/**
+ * Pops the current transformation matrix off the matrix
+ * stack. Understanding pushing and popping requires understanding the
+ * concept of a matrix stack. The push-matrix fn saves the current
+ * coordinate system to the stack and pop-matrix restores the prior
+ * coordinate system. push-matrix and pop-matrix are used in conjuction
+ * with the other transformation methods and may be embedded to control
+ * the scope of the transformations.
+ */
+quil.core.pop_matrix = (function quil$core$pop_matrix(){
+return quil.core.current_graphics.call(null).popMatrix();
+});
+/**
+ * Restores the prior settings on the 'style stack'. Used in
+ * conjunction with push-style. Together they allow you to change the
+ * style settings and later return to what you had. When a new style is
+ * started with push-style, it builds on the current style information.
+ * The push-style and pop-style functions can be nested to provide more
+ * control
+ */
+quil.core.pop_style = (function quil$core$pop_style(){
+return quil.core.current_graphics.call(null).popStyle();
+});
+/**
+ * Facilitates exponential expressions. The pow() function is an
+ * efficient way of multiplying numbers by themselves (or their
+ * reciprocal) in large quantities. For example, (pow 3 5) is
+ * equivalent to the expression (* 3 3 3 3 3) and (pow 3 -5) is
+ * equivalent to (/ 1 (* 3 3 3 3 3)).
+ */
+quil.core.pow = (function quil$core$pow(num,exponent){
+return quil.sketch.current_applet.call(null).pow(num,exponent);
+});
+/**
+ * Prints the current camera matrix to std out. Useful for debugging.
+ */
+quil.core.print_camera = (function quil$core$print_camera(){
+return quil.core.current_graphics.call(null).printCamera();
+});
+/**
+ * Prints the current matrix to std out. Useful for debugging.
+ */
+quil.core.print_matrix = (function quil$core$print_matrix(){
+return quil.core.current_graphics.call(null).printMatrix();
+});
+/**
+ * Prints the current projection matrix to std out. Useful for
+ * debugging
+ */
+quil.core.print_projection = (function quil$core$print_projection(){
+return quil.core.current_graphics.call(null).printProjection();
+});
+/**
+ * Pushes the current transformation matrix onto the matrix
+ * stack. Understanding push-matrix and pop-matrix requires
+ * understanding the concept of a matrix stack. The push-matrix
+ * function saves the current coordinate system to the stack and
+ * pop-matrix restores the prior coordinate system. push-matrix and
+ * pop-matrix are used in conjuction with the other transformation
+ * methods and may be embedded to control the scope of the
+ * transformations.
+ */
+quil.core.push_matrix = (function quil$core$push_matrix(){
+return quil.core.current_graphics.call(null).pushMatrix();
+});
+/**
+ * Saves the current style settings onto a 'style stack'. Use with
+ * pop-style which restores the prior settings. Note that these
+ * functions are always used together. They allow you to change the
+ * style settings and later return to what you had. When a new style is
+ * started with push-style, it builds on the current style
+ * information. The push-style and pop-style fns can be embedded to
+ * provide more control.
+ *
+ * The style information controlled by the following functions are
+ * included in the style: fill, stroke, tint, stroke-weight,
+ * stroke-cap, stroke-join, image-mode, rect-mode, ellipse-mode,
+ * shape-mode, color-mode, text-align, text-font, text-mode, text-size,
+ * text-leading, emissive, specular, shininess, and ambient
+ */
+quil.core.push_style = (function quil$core$push_style(){
+return quil.core.current_graphics.call(null).pushStyle();
+});
+/**
+ * A quad is a quadrilateral, a four sided polygon. It is similar to a
+ * rectangle, but the angles between its edges are not constrained to
+ * be ninety degrees. The first pair of parameters (x1,y1) sets the
+ * first vertex and the subsequent pairs should proceed clockwise or
+ * counter-clockwise around the defined shape.
+ */
+quil.core.quad = (function quil$core$quad(x1,y1,x2,y2,x3,y3,x4,y4){
+return quil.core.current_graphics.call(null).quad(x1,y1,x2,y2,x3,y3,x4,y4);
+});
+/**
+ * Specifies vertex coordinates for quadratic Bezier curves. Each call to
+ * quadratic-vertex defines the position of one control points and one
+ * anchor point of a Bezier curve, adding a new segment to a line or shape.
+ * The first time quadratic-vertex is used within a begin-shape call, it
+ * must be prefaced with a call to vertex to set the first anchor point.
+ * This function must be used between begin-shape and end-shape and only
+ * when there is no MODE parameter specified to begin-shape. Using the 3D
+ * version requires rendering with :p3d.
+ */
+quil.core.quadratic_vertex = (function quil$core$quadratic_vertex(var_args){
+var args8630 = [];
+var len__7927__auto___8633 = arguments.length;
+var i__7928__auto___8634 = (0);
+while(true){
+if((i__7928__auto___8634 < len__7927__auto___8633)){
+args8630.push((arguments[i__7928__auto___8634]));
+
+var G__8635 = (i__7928__auto___8634 + (1));
+i__7928__auto___8634 = G__8635;
+continue;
+} else {
+}
+break;
+}
+
+var G__8632 = args8630.length;
+switch (G__8632) {
+case 4:
+return quil.core.quadratic_vertex.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 6:
+return quil.core.quadratic_vertex.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8630.length)].join('')));
+
+}
+});
+
+quil.core.quadratic_vertex.cljs$core$IFn$_invoke$arity$4 = (function (cx,cy,x3,y3){
+return quil.core.current_graphics.call(null).quadraticVertex(cx,cy,x3,y3);
+});
+
+quil.core.quadratic_vertex.cljs$core$IFn$_invoke$arity$6 = (function (cx,cy,cz,x3,y3,z3){
+return quil.core.current_graphics.call(null).quadraticVertex(cx,cy,cz,x3,y3,z3);
+});
+
+quil.core.quadratic_vertex.cljs$lang$maxFixedArity = 6;
+
+/**
+ * Converts a degree measurement to its corresponding value in
+ * radians. Radians and degrees are two ways of measuring the same
+ * thing. There are 360 degrees in a circle and 2*PI radians in a
+ * circle. For example, 90° = PI/2 = 1.5707964. All trigonometric
+ * methods in Processing require their parameters to be specified in
+ * radians.
+ */
+quil.core.radians = (function quil$core$radians(degrees){
+return quil.sketch.current_applet.call(null).radians(degrees);
+});
+/**
+ * Generates random numbers. Each time the random function is called,
+ * it returns an unexpected value within the specified range. If one
+ * parameter is passed to the function it will return a float between
+ * zero and the value of the high parameter. The function call (random
+ * 5) returns values between 0 and 5 (starting at zero, up to but not
+ * including 5). If two parameters are passed, it will return a float
+ * with a value between the parameters. The function call
+ * (random -5 10.2) returns values starting at -5 up to (but not
+ * including) 10.2.
+ */
+quil.core.random = (function quil$core$random(var_args){
+var args8637 = [];
+var len__7927__auto___8640 = arguments.length;
+var i__7928__auto___8641 = (0);
+while(true){
+if((i__7928__auto___8641 < len__7927__auto___8640)){
+args8637.push((arguments[i__7928__auto___8641]));
+
+var G__8642 = (i__7928__auto___8641 + (1));
+i__7928__auto___8641 = G__8642;
+continue;
+} else {
+}
+break;
+}
+
+var G__8639 = args8637.length;
+switch (G__8639) {
+case 1:
+return quil.core.random.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.random.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8637.length)].join('')));
+
+}
+});
+
+quil.core.random.cljs$core$IFn$_invoke$arity$1 = (function (max){
+return quil.sketch.current_applet.call(null).random(max);
+});
+
+quil.core.random.cljs$core$IFn$_invoke$arity$2 = (function (min,max){
+return quil.sketch.current_applet.call(null).random(min,max);
+});
+
+quil.core.random.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a float from a random series of numbers having a mean of 0 and
+ * standard deviation of 1. Each time the randomGaussian() function is called,
+ * it returns a number fitting a Gaussian, or normal, distribution.
+ * There is theoretically no minimum or maximum value that randomGaussian()
+ * might return. Rather, there is just a very low probability that values far
+ * from the mean will be returned; and a higher probability that numbers near
+ * the mean will be returned. .
+ */
+quil.core.random_gaussian = (function quil$core$random_gaussian(){
+return quil.sketch.current_applet.call(null).randomGaussian();
+});
+/**
+ * Sets the seed value for random. By default, random produces
+ * different results each time the program is run. Set the value
+ * parameter to a constant to return the same pseudo-random numbers
+ * each time the software is run.
+ */
+quil.core.random_seed = (function quil$core$random_seed(w){
+return quil.sketch.current_applet.call(null).randomSeed(w);
+});
+/**
+ * Contains the value of the most recent key on the keyboard that was
+ * used (either pressed or released).
+ *
+ * For non-ASCII keys, use the keyCode variable. The keys included in
+ * the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and
+ * DELETE) do not require checking to see if they key is coded, and you
+ * should simply use the key variable instead of keyCode If you're
+ * making cross-platform projects, note that the ENTER key is commonly
+ * used on PCs and Unix and the RETURN key is used instead on
+ * Macintosh. Check for both ENTER and RETURN to make sure your program
+ * will work for all platforms.
+ */
+quil.core.raw_key = (function quil$core$raw_key(){
+return quil.sketch.current_applet.call(null).key;
+});
+/**
+ * Draws a rectangle to the screen. A rectangle is a four-sided shape
+ * with every angle at ninety degrees. By default, the first two
+ * parameters set the location of the upper-left corner, the third
+ * sets the width, and the fourth sets the height. These parameters
+ * may be changed with rect-mode.
+ *
+ * To draw a rounded rectangle, add a fifth parameter, which is used as
+ * the radius value for all four corners. To use a different radius value
+ * for each corner, include eight parameters.
+ */
+quil.core.rect = (function quil$core$rect(var_args){
+var args8644 = [];
+var len__7927__auto___8647 = arguments.length;
+var i__7928__auto___8648 = (0);
+while(true){
+if((i__7928__auto___8648 < len__7927__auto___8647)){
+args8644.push((arguments[i__7928__auto___8648]));
+
+var G__8649 = (i__7928__auto___8648 + (1));
+i__7928__auto___8648 = G__8649;
+continue;
+} else {
+}
+break;
+}
+
+var G__8646 = args8644.length;
+switch (G__8646) {
+case 4:
+return quil.core.rect.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return quil.core.rect.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 8:
+return quil.core.rect.cljs$core$IFn$_invoke$arity$8((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8644.length)].join('')));
+
+}
+});
+
+quil.core.rect.cljs$core$IFn$_invoke$arity$4 = (function (x,y,width,height){
+return quil.core.current_graphics.call(null).rect(x,y,width,height);
+});
+
+quil.core.rect.cljs$core$IFn$_invoke$arity$5 = (function (x,y,width,height,r){
+return quil.core.current_graphics.call(null).rect(x,y,width,height,r);
+});
+
+quil.core.rect.cljs$core$IFn$_invoke$arity$8 = (function (x,y,width,height,top_left_r,top_right_r,bottom_right_r,bottom_left_r){
+return quil.core.current_graphics.call(null).rect(x,y,width,height,top_left_r,top_right_r,bottom_right_r,bottom_left_r);
+});
+
+quil.core.rect.cljs$lang$maxFixedArity = 8;
+
+/**
+ * Modifies the location from which rectangles draw. The default mode
+ * is :corner. Available modes are:
+ *
+ *
+ * :corner - Specifies the location to be the upper left corner of the
+ * shape and uses the third and fourth parameters of rect to
+ * specify the width and height.
+ *
+ * :corners - Uses the first and second parameters of rect to set the
+ * location of one corner and uses the third and fourth
+ * parameters to set the opposite corner.
+ *
+ * :center - Draws the image from its center point and uses the third
+ * and forth parameters of rect to specify the image's width
+ * and height.
+ *
+ * :radius - Draws the image from its center point and uses the third
+ * and forth parameters of rect() to specify half of the
+ * image's width and height.
+ */
+quil.core.rect_mode = (function quil$core$rect_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.rect_modes);
+return quil.core.current_graphics.call(null).rectMode((mode__$1 | (0)));
+});
+/**
+ * Extracts the red value from a color, scaled to match current color-mode.
+ */
+quil.core.red = (function quil$core$red(c){
+return quil.core.current_graphics.call(null).red(cljs.core.unchecked_int.call(null,c));
+});
+/**
+ * Executes the code within the draw fn one time. This functions
+ * allows the program to update the display window only when necessary,
+ * for example when an event registered by mouse-pressed or
+ * key-pressed occurs.
+ *
+ * In structuring a program, it only makes sense to call redraw
+ * within events such as mouse-pressed. This is because redraw does
+ * not run draw immediately (it only sets a flag that indicates an
+ * update is needed).
+ *
+ * Calling redraw within draw has no effect because draw is
+ * continuously called anyway.
+ */
+quil.core.redraw = (function quil$core$redraw(){
+return quil.sketch.current_applet.call(null).redraw();
+});
+/**
+ * This function load images on a separate thread so that your sketch
+ * does not freeze while images load during setup. While the image is
+ * loading, its width and height will be 0. If an error occurs while
+ * loading the image, its width and height will be set to -1. You'll
+ * know when the image has loaded properly because its width and height
+ * will be greater than 0. Asynchronous image loading (particularly
+ * when downloading from a server) can dramatically improve
+ * performance.
+ */
+quil.core.request_image = (function quil$core$request_image(filename){
+return quil.sketch.current_applet.call(null).requestImage([cljs.core.str.cljs$core$IFn$_invoke$arity$1(filename)].join(''));
+});
+/**
+ * Replaces the current matrix with the identity matrix. The
+ * equivalent function in OpenGL is glLoadIdentity()
+ */
+quil.core.reset_matrix = (function quil$core$reset_matrix(){
+return quil.core.current_graphics.call(null).resetMatrix();
+});
+/**
+ * Resize the image to a new width and height.
+ * To make the image scale proportionally, use 0 as the value for the wide or
+ * high parameter. For instance, to make the width of an image 150 pixels,
+ * and change the height using the same proportion, use resize(150, 0).
+ *
+ * Even though a PGraphics is technically a PImage, it is not possible
+ * to rescale the image data found in a PGraphics.
+ * (It's simply not possible to do this consistently across renderers:
+ * technically infeasible with P3D, or what would it even do with PDF?)
+ * If you want to resize PGraphics content, first get a copy of its image data
+ * using the get() method, and call resize() on the PImage that is returned.
+ */
+quil.core.resize = (function quil$core$resize(img,w,h){
+return img.resize(w,h);
+});
+/**
+ * Rotates a shape the amount specified by the angle parameter. Angles
+ * should be specified in radians (values from 0 to TWO-PI) or
+ * converted to radians with the radians function.
+ *
+ * Objects are always rotated around their relative position to the
+ * origin and positive numbers rotate objects in a clockwise
+ * direction. Transformations apply to everything that happens after
+ * and subsequent calls to the function accumulates the effect. For
+ * example, calling (rotate HALF-PI) and then (rotate HALF-PI) is the
+ * same as (rotate PI). All tranformations are reset when draw begins
+ * again.
+ *
+ * Technically, rotate multiplies the current transformation matrix by
+ * a rotation matrix. This function can be further controlled by the
+ * push-matrix and pop-matrix.
+ */
+quil.core.rotate = (function quil$core$rotate(var_args){
+var args8651 = [];
+var len__7927__auto___8654 = arguments.length;
+var i__7928__auto___8655 = (0);
+while(true){
+if((i__7928__auto___8655 < len__7927__auto___8654)){
+args8651.push((arguments[i__7928__auto___8655]));
+
+var G__8656 = (i__7928__auto___8655 + (1));
+i__7928__auto___8655 = G__8656;
+continue;
+} else {
+}
+break;
+}
+
+var G__8653 = args8651.length;
+switch (G__8653) {
+case 1:
+return quil.core.rotate.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 4:
+return quil.core.rotate.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8651.length)].join('')));
+
+}
+});
+
+quil.core.rotate.cljs$core$IFn$_invoke$arity$1 = (function (angle){
+return quil.core.current_graphics.call(null).rotate(angle);
+});
+
+quil.core.rotate.cljs$core$IFn$_invoke$arity$4 = (function (angle,vx,vy,vz){
+return quil.core.current_graphics.call(null).rotate(angle,vx,vy,vz);
+});
+
+quil.core.rotate.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Rotates a shape around the x-axis the amount specified by the angle
+ * parameter. Angles should be specified in radians (values from 0 to
+ * (* PI 2)) or converted to radians with the radians function. Objects
+ * are always rotated around their relative position to the origin and
+ * positive numbers rotate objects in a counterclockwise
+ * direction. Transformations apply to everything that happens after
+ * and subsequent calls to the function accumulates the effect. For
+ * example, calling (rotate-x HALF-PI) and then (rotate-x HALF-PI) is
+ * the same as (rotate-x PI). If rotate-x is called within the draw fn,
+ * the transformation is reset when the loop begins again. This
+ * function requires either the :p3d or :opengl renderer.
+ */
+quil.core.rotate_x = (function quil$core$rotate_x(angle){
+return quil.core.current_graphics.call(null).rotateX(angle);
+});
+/**
+ * Rotates a shape around the y-axis the amount specified by the angle
+ * parameter. Angles should be specified in radians (values from 0
+ * to (* PI 2)) or converted to radians with the radians function.
+ * Objects are always rotated around their relative position to the
+ * origin and positive numbers rotate objects in a counterclockwise
+ * direction. Transformations apply to everything that happens after
+ * and subsequent calls to the function accumulates the effect. For
+ * example, calling (rotate-y HALF-PI) and then (rotate-y HALF-PI) is
+ * the same as (rotate-y PI). If rotate-y is called within the draw fn,
+ * the transformation is reset when the loop begins again. This
+ * function requires either the :p3d or :opengl renderer.
+ */
+quil.core.rotate_y = (function quil$core$rotate_y(angle){
+return quil.core.current_graphics.call(null).rotateY(angle);
+});
+/**
+ * Rotates a shape around the z-axis the amount specified by the angle
+ * parameter. Angles should be specified in radians (values from 0
+ * to (* PI 2)) or converted to radians with the radians function.
+ * Objects are always rotated around their relative position to the
+ * origin and positive numbers rotate objects in a counterclockwise
+ * direction. Transformations apply to everything that happens after
+ * and subsequent calls to the function accumulates the effect. For
+ * example, calling (rotate-z HALF-PI) and then (rotate-z HALF-PI) is
+ * the same as (rotate-z PI). If rotate-y is called within the draw fn,
+ * the transformation is reset when the loop begins again. This
+ * function requires either the :p3d or :opengl renderer.
+ */
+quil.core.rotate_z = (function quil$core$rotate_z(angle){
+return quil.core.current_graphics.call(null).rotateZ(angle);
+});
+/**
+ * Calculates the integer closest to the value parameter. For example,
+ * (round 9.2) returns the value 9.
+ */
+quil.core.round = (function quil$core$round(val){
+return quil.sketch.current_applet.call(null).round(val);
+});
+/**
+ * Extracts the saturation value from a color.
+ */
+quil.core.saturation = (function quil$core$saturation(c){
+return quil.core.current_graphics.call(null).saturation(cljs.core.unchecked_int.call(null,c));
+});
+/**
+ * Saves an image from the display window. Images are saved in TIFF,
+ * TARGA, JPEG, and PNG format depending on the extension within the
+ * filename parameter. For example, image.tif will have a TIFF image
+ * and image.png will save a PNG image. If no extension is included in
+ * the filename, the image will save in TIFF format and .tif will be
+ * added to the name. All images saved from the main drawing window
+ * will be opaque. To save images without a background, use
+ * create-graphics.
+ */
+quil.core.save = (function quil$core$save(filename){
+return quil.core.current_graphics.call(null).save([cljs.core.str.cljs$core$IFn$_invoke$arity$1(filename)].join(''));
+});
+/**
+ * Saves an image identical to the current display window as a
+ * file. May be called multple times - each file saved will have a
+ * unique name. Name and image formate may be modified by passing a
+ * string parameter of the form "foo-####.ext" where foo- can be any
+ * arbitrary string, #### will be replaced with the current frame id
+ * and .ext is one of .tiff, .targa, .png, .jpeg or .jpg
+ *
+ * Examples:
+ * (save-frame)
+ * (save-frame "pretty-pic-####.jpg")
+ */
+quil.core.save_frame = (function quil$core$save_frame(var_args){
+var args8658 = [];
+var len__7927__auto___8661 = arguments.length;
+var i__7928__auto___8662 = (0);
+while(true){
+if((i__7928__auto___8662 < len__7927__auto___8661)){
+args8658.push((arguments[i__7928__auto___8662]));
+
+var G__8663 = (i__7928__auto___8662 + (1));
+i__7928__auto___8662 = G__8663;
+continue;
+} else {
+}
+break;
+}
+
+var G__8660 = args8658.length;
+switch (G__8660) {
+case 0:
+return quil.core.save_frame.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.save_frame.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8658.length)].join('')));
+
+}
+});
+
+quil.core.save_frame.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.sketch.current_applet.call(null).saveFrame();
+});
+
+quil.core.save_frame.cljs$core$IFn$_invoke$arity$1 = (function (name){
+return quil.sketch.current_applet.call(null).saveFrame([cljs.core.str.cljs$core$IFn$_invoke$arity$1(name)].join(''));
+});
+
+quil.core.save_frame.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Increases or decreases the size of a shape by expanding and
+ * contracting vertices. Objects always scale from their relative
+ * origin to the coordinate system. Scale values are specified as
+ * decimal percentages. For example, the function call (scale 2)
+ * increases the dimension of a shape by 200%. Transformations apply to
+ * everything that happens after and subsequent calls to the function
+ * multiply the effect. For example, calling (scale 2) and then
+ * (scale 1.5) is the same as (scale 3). If scale is called within
+ * draw, the transformation is reset when the loop begins again. Using
+ * this fuction with the z parameter requires specfying :p3d or :opengl
+ * as the renderer. This function can be further controlled by
+ * push-matrix and pop-matrix.
+ */
+quil.core.scale = (function quil$core$scale(var_args){
+var args8665 = [];
+var len__7927__auto___8668 = arguments.length;
+var i__7928__auto___8669 = (0);
+while(true){
+if((i__7928__auto___8669 < len__7927__auto___8668)){
+args8665.push((arguments[i__7928__auto___8669]));
+
+var G__8670 = (i__7928__auto___8669 + (1));
+i__7928__auto___8669 = G__8670;
+continue;
+} else {
+}
+break;
+}
+
+var G__8667 = args8665.length;
+switch (G__8667) {
+case 1:
+return quil.core.scale.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.scale.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.scale.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8665.length)].join('')));
+
+}
+});
+
+quil.core.scale.cljs$core$IFn$_invoke$arity$1 = (function (s){
+return quil.core.current_graphics.call(null).scale(s);
+});
+
+quil.core.scale.cljs$core$IFn$_invoke$arity$2 = (function (sx,sy){
+return quil.core.current_graphics.call(null).scale(sx,sy);
+});
+
+quil.core.scale.cljs$core$IFn$_invoke$arity$3 = (function (sx,sy,sz){
+return quil.core.current_graphics.call(null).scale(sx,sy,sz);
+});
+
+quil.core.scale.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Takes a three-dimensional x, y, z position and returns the x value
+ * for where it will appear on a (two-dimensional) screen, once
+ * affected by translate, scale or any other transformations
+ */
+quil.core.screen_x = (function quil$core$screen_x(var_args){
+var args8672 = [];
+var len__7927__auto___8675 = arguments.length;
+var i__7928__auto___8676 = (0);
+while(true){
+if((i__7928__auto___8676 < len__7927__auto___8675)){
+args8672.push((arguments[i__7928__auto___8676]));
+
+var G__8677 = (i__7928__auto___8676 + (1));
+i__7928__auto___8676 = G__8677;
+continue;
+} else {
+}
+break;
+}
+
+var G__8674 = args8672.length;
+switch (G__8674) {
+case 2:
+return quil.core.screen_x.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.screen_x.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8672.length)].join('')));
+
+}
+});
+
+quil.core.screen_x.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.current_graphics.call(null).screenX(x,y);
+});
+
+quil.core.screen_x.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).screenX(x,y,z);
+});
+
+quil.core.screen_x.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Takes a three-dimensional x, y, z position and returns the y value
+ * for where it will appear on a (two-dimensional) screen, once
+ * affected by translate, scale or any other transformations
+ */
+quil.core.screen_y = (function quil$core$screen_y(var_args){
+var args8679 = [];
+var len__7927__auto___8682 = arguments.length;
+var i__7928__auto___8683 = (0);
+while(true){
+if((i__7928__auto___8683 < len__7927__auto___8682)){
+args8679.push((arguments[i__7928__auto___8683]));
+
+var G__8684 = (i__7928__auto___8683 + (1));
+i__7928__auto___8683 = G__8684;
+continue;
+} else {
+}
+break;
+}
+
+var G__8681 = args8679.length;
+switch (G__8681) {
+case 2:
+return quil.core.screen_y.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.screen_y.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8679.length)].join('')));
+
+}
+});
+
+quil.core.screen_y.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.current_graphics.call(null).screenY(x,y);
+});
+
+quil.core.screen_y.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).screenY(x,y,z);
+});
+
+quil.core.screen_y.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Given an x, y, z coordinate, returns its z value.
+ * This value can be used to determine if an x, y, z coordinate is in
+ * front or in back of another (x, y, z) coordinate. The units are
+ * based on how the zbuffer is set up, and don't relate to anything
+ * 'real'. They're only useful for in comparison to another value
+ * obtained from screen-z, or directly out of the zbuffer
+ */
+quil.core.screen_z = (function quil$core$screen_z(x,y,z){
+return quil.core.current_graphics.call(null).screenZ(x,y,z);
+});
+/**
+ * Returns the current second as a value from 0 - 59.
+ */
+quil.core.seconds = (function quil$core$seconds(){
+return quil.sketch.current_applet.call(null).second();
+});
+/**
+ * Changes the color of any pixel in the display window. The x and y
+ * parameters specify the pixel to change and the color parameter
+ * specifies the color value. The color parameter is affected by the
+ * current color mode (the default is RGB values from 0 to 255).
+ *
+ * Setting the color of a single pixel with (set x, y) is easy, but not
+ * as fast as putting the data directly into pixels[].
+ *
+ * This function ignores imageMode().
+ *
+ * Due to what appears to be a bug in Apple's Java implementation, the
+ * point() and set() methods are extremely slow in some circumstances
+ * when used with the default renderer. Using :p2d or :p3d will fix the
+ * problem. Grouping many calls to point or set-pixel together can also
+ * help. (Bug 1094)
+ */
+quil.core.set_pixel = (function quil$core$set_pixel(var_args){
+var args8686 = [];
+var len__7927__auto___8689 = arguments.length;
+var i__7928__auto___8690 = (0);
+while(true){
+if((i__7928__auto___8690 < len__7927__auto___8689)){
+args8686.push((arguments[i__7928__auto___8690]));
+
+var G__8691 = (i__7928__auto___8690 + (1));
+i__7928__auto___8690 = G__8691;
+continue;
+} else {
+}
+break;
+}
+
+var G__8688 = args8686.length;
+switch (G__8688) {
+case 3:
+return quil.core.set_pixel.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.set_pixel.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8686.length)].join('')));
+
+}
+});
+
+quil.core.set_pixel.cljs$core$IFn$_invoke$arity$3 = (function (x,y,c){
+return quil.core.set_pixel.call(null,quil.core.current_graphics.call(null),x,y,c);
+});
+
+quil.core.set_pixel.cljs$core$IFn$_invoke$arity$4 = (function (img,x,y,c){
+return img.set((x | (0)),(y | (0)),(c | (0)));
+});
+
+quil.core.set_pixel.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Writes an image directly into the display window. The x and y
+ * parameters define the coordinates for the upper-left corner of the
+ * image.
+ */
+quil.core.set_image = (function quil$core$set_image(x,y,src){
+return quil.core.current_graphics.call(null).set((x | (0)),(y | (0)),src);
+});
+/**
+ * Displays shapes to the screen. The shapes must have been loaded
+ * with load-shape. Processing currently works with SVG shapes
+ * only. The sh parameter specifies the shape to display and the x and
+ * y parameters define the location of the shape from its upper-left
+ * corner. The shape is displayed at its original size unless the width
+ * and height parameters specify a different size. The shape-mode
+ * fn changes the way the parameters work. A call to
+ * (shape-mode :corners), for example, will change the width and height
+ * parameters to define the x and y values of the opposite corner of
+ * the shape.
+ *
+ * Note complex shapes may draw awkwardly with the renderers :p2d, :p3d, and
+ * :opengl. Those renderers do not yet support shapes that have holes
+ * or complicated breaks.
+ */
+quil.core.shape = (function quil$core$shape(var_args){
+var args8693 = [];
+var len__7927__auto___8696 = arguments.length;
+var i__7928__auto___8697 = (0);
+while(true){
+if((i__7928__auto___8697 < len__7927__auto___8696)){
+args8693.push((arguments[i__7928__auto___8697]));
+
+var G__8698 = (i__7928__auto___8697 + (1));
+i__7928__auto___8697 = G__8698;
+continue;
+} else {
+}
+break;
+}
+
+var G__8695 = args8693.length;
+switch (G__8695) {
+case 1:
+return quil.core.shape.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.shape.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 5:
+return quil.core.shape.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8693.length)].join('')));
+
+}
+});
+
+quil.core.shape.cljs$core$IFn$_invoke$arity$1 = (function (sh){
+return quil.core.current_graphics.call(null).shape(sh);
+});
+
+quil.core.shape.cljs$core$IFn$_invoke$arity$3 = (function (sh,x,y){
+return quil.core.current_graphics.call(null).shape(sh,x,y);
+});
+
+quil.core.shape.cljs$core$IFn$_invoke$arity$5 = (function (sh,x,y,width,height){
+return quil.core.current_graphics.call(null).shape(sh,x,y,width,height);
+});
+
+quil.core.shape.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Shears a shape around the x-axis the amount specified by the angle
+ * parameter. Angles should be specified in radians (values from 0 to
+ * PI*2) or converted to radians with the radians() function. Objects
+ * are always sheared around their relative position to the origin and
+ * positive numbers shear objects in a clockwise direction.
+ * Transformations apply to everything that happens after and
+ * subsequent calls to the function accumulates the effect. For
+ * example, calling (shear-x (/ PI 2)) and then (shear-x (/ PI 2)) is
+ * the same as (shear-x PI). If shear-x is called within the draw fn,
+ * the transformation is reset when the loop begins again. This
+ * function works in P2D or JAVA2D mode.
+ *
+ * Technically, shear-x multiplies the current transformation matrix
+ * by a rotation matrix. This function can be further controlled by the
+ * push-matrix and pop-matrix fns.
+ */
+quil.core.shear_x = (function quil$core$shear_x(angle){
+return quil.core.current_graphics.call(null).shearX(angle);
+});
+/**
+ * Shears a shape around the y-axis the amount specified by the angle
+ * parameter. Angles should be specified in radians (values from 0 to
+ * PI*2) or converted to radians with the radians() function. Objects
+ * are always sheared around their relative position to the origin and
+ * positive numbers shear objects in a clockwise direction.
+ * Transformations apply to everything that happens after and
+ * subsequent calls to the function accumulates the effect. For
+ * example, calling (shear-y (/ PI 2)) and then (shear-y (/ PI 2)) is
+ * the same as (shear-y PI). If shear-y is called within the draw fn,
+ * the transformation is reset when the loop begins again. This
+ * function works in P2D or JAVA2D mode.
+ *
+ * Technically, shear-y multiplies the current transformation matrix
+ * by a rotation matrix. This function can be further controlled by the
+ * push-matrix and pop-matrix fns.
+ */
+quil.core.shear_y = (function quil$core$shear_y(angle){
+return quil.core.current_graphics.call(null).shearY(angle);
+});
+/**
+ * Modifies the location from which shapes draw. Available modes are
+ * :corner, :corners and :center. Default is :corner.
+ *
+ * :corner - specifies the location to be the upper left corner of the
+ * shape and uses the third and fourth parameters of shape
+ * to specify the width and height.
+ *
+ * :corners - uses the first and second parameters of shape to set
+ * the location of one corner and uses the third and fourth
+ * parameters to set the opposite corner.
+ *
+ * :center - draws the shape from its center point and uses the third
+ * and forth parameters of shape to specify the width and
+ * height.
+ */
+quil.core.shape_mode = (function quil$core$shape_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.p_shape_modes);
+return quil.core.current_graphics.call(null).shapeMode((mode__$1 | (0)));
+});
+/**
+ * Sets the amount of gloss in the surface of shapes. Used in
+ * combination with ambient, specular, and emissive in setting
+ * the material properties of shapes.
+ */
+quil.core.shininess = (function quil$core$shininess(shine){
+return quil.core.current_graphics.call(null).shininess(shine);
+});
+/**
+ * Calculates the sine of an angle. This function expects the values
+ * of the angle parameter to be provided in radians (values from 0 to
+ * 6.28). A float within the range -1 to 1 is returned.
+ */
+quil.core.sin = (function quil$core$sin(angle){
+return quil.sketch.current_applet.call(null).sin(angle);
+});
+/**
+ * Draws all geometry with smooth (anti-aliased) edges. This will slow
+ * down the frame rate of the application, but will enhance the visual
+ * refinement.
+ *
+ * Must be called inside :settings handler.
+ *
+ * The level parameter (int) increases the level of smoothness with the
+ * P2D and P3D renderers. This is the level of over sampling applied to
+ * the graphics buffer. The value '2' will double the rendering size
+ * before scaling it down to the display size. This is called '2x
+ * anti-aliasing.' The value 4 is used for 4x anti-aliasing and 8 is
+ * specified for 8x anti-aliasing. If level is set to 0, it will disable
+ * all smoothing; it's the equivalent of the function noSmooth().
+ * The maximum anti-aliasing level is determined by the hardware of the
+ * machine that is running the software.
+ *
+ * Note that smooth will also improve image quality of resized images.
+ */
+quil.core.smooth = (function quil$core$smooth(var_args){
+var args8700 = [];
+var len__7927__auto___8703 = arguments.length;
+var i__7928__auto___8704 = (0);
+while(true){
+if((i__7928__auto___8704 < len__7927__auto___8703)){
+args8700.push((arguments[i__7928__auto___8704]));
+
+var G__8705 = (i__7928__auto___8704 + (1));
+i__7928__auto___8704 = G__8705;
+continue;
+} else {
+}
+break;
+}
+
+var G__8702 = args8700.length;
+switch (G__8702) {
+case 0:
+return quil.core.smooth.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.smooth.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8700.length)].join('')));
+
+}
+});
+
+quil.core.smooth.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).smooth();
+});
+
+quil.core.smooth.cljs$core$IFn$_invoke$arity$1 = (function (level){
+return quil.core.current_graphics.call(null).smooth((level | (0)));
+});
+
+quil.core.smooth.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Sets the specular color of the materials used for shapes drawn to
+ * the screen, which sets the color of hightlights. Specular refers to
+ * light which bounces off a surface in a perferred direction (rather
+ * than bouncing in all directions like a diffuse light). Used in
+ * combination with emissive, ambient, and shininess in setting
+ * the material properties of shapes.
+ */
+quil.core.specular = (function quil$core$specular(var_args){
+var args8707 = [];
+var len__7927__auto___8710 = arguments.length;
+var i__7928__auto___8711 = (0);
+while(true){
+if((i__7928__auto___8711 < len__7927__auto___8710)){
+args8707.push((arguments[i__7928__auto___8711]));
+
+var G__8712 = (i__7928__auto___8711 + (1));
+i__7928__auto___8711 = G__8712;
+continue;
+} else {
+}
+break;
+}
+
+var G__8709 = args8707.length;
+switch (G__8709) {
+case 1:
+return quil.core.specular.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.specular.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8707.length)].join('')));
+
+}
+});
+
+quil.core.specular.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).specular(gray);
+});
+
+quil.core.specular.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).specular(x,y,z);
+});
+
+quil.core.specular.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Generates a hollow ball made from tessellated triangles.
+ */
+quil.core.sphere = (function quil$core$sphere(radius){
+return quil.core.current_graphics.call(null).sphere(radius);
+});
+/**
+ * Controls the detail used to render a sphere by adjusting the number
+ * of vertices of the sphere mesh. The default resolution is 30, which
+ * creates a fairly detailed sphere definition with vertices every
+ * 360/30 = 12 degrees. If you're going to render a great number of
+ * spheres per frame, it is advised to reduce the level of detail using
+ * this function. The setting stays active until sphere-detail is
+ * called again with a new parameter and so should not be called prior
+ * to every sphere statement, unless you wish to render spheres with
+ * different settings, e.g. using less detail for smaller spheres or
+ * ones further away from the camera. To controla the detail of the
+ * horizontal and vertical resolution independently, use the version of
+ * the functions with two parameters.
+ */
+quil.core.sphere_detail = (function quil$core$sphere_detail(var_args){
+var args8714 = [];
+var len__7927__auto___8717 = arguments.length;
+var i__7928__auto___8718 = (0);
+while(true){
+if((i__7928__auto___8718 < len__7927__auto___8717)){
+args8714.push((arguments[i__7928__auto___8718]));
+
+var G__8719 = (i__7928__auto___8718 + (1));
+i__7928__auto___8718 = G__8719;
+continue;
+} else {
+}
+break;
+}
+
+var G__8716 = args8714.length;
+switch (G__8716) {
+case 1:
+return quil.core.sphere_detail.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.sphere_detail.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8714.length)].join('')));
+
+}
+});
+
+quil.core.sphere_detail.cljs$core$IFn$_invoke$arity$1 = (function (res){
+return quil.core.current_graphics.call(null).sphereDetail((res | (0)));
+});
+
+quil.core.sphere_detail.cljs$core$IFn$_invoke$arity$2 = (function (ures,vres){
+return quil.core.current_graphics.call(null).sphereDetail((ures | (0)),(vres | (0)));
+});
+
+quil.core.sphere_detail.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Adds a spot light. Lights need to be included in the draw to
+ * remain persistent in a looping program. Placing them in the setup
+ * of a looping program will cause them to only have an effect the
+ * first time through the loop. The affect of the r, g, and b
+ * parameters is determined by the current color mode. The x, y, and z
+ * parameters specify the position of the light and nx, ny, nz specify
+ * the direction or light. The angle parameter affects angle of the
+ * spotlight cone.
+ */
+quil.core.spot_light = (function quil$core$spot_light(var_args){
+var args8721 = [];
+var len__7927__auto___8736 = arguments.length;
+var i__7928__auto___8737 = (0);
+while(true){
+if((i__7928__auto___8737 < len__7927__auto___8736)){
+args8721.push((arguments[i__7928__auto___8737]));
+
+var G__8738 = (i__7928__auto___8737 + (1));
+i__7928__auto___8737 = G__8738;
+continue;
+} else {
+}
+break;
+}
+
+var G__8723 = args8721.length;
+switch (G__8723) {
+case 11:
+return quil.core.spot_light.cljs$core$IFn$_invoke$arity$11((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]));
+
+break;
+case 5:
+return quil.core.spot_light.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8721.length)].join('')));
+
+}
+});
+
+quil.core.spot_light.cljs$core$IFn$_invoke$arity$11 = (function (r,g,b,x,y,z,nx,ny,nz,angle,concentration){
+return quil.core.current_graphics.call(null).spotLight(r,g,b,x,y,z,nx,ny,nz,angle,concentration);
+});
+
+quil.core.spot_light.cljs$core$IFn$_invoke$arity$5 = (function (p__8724,p__8725,p__8726,angle,concentration){
+var vec__8727 = p__8724;
+var r = cljs.core.nth.call(null,vec__8727,(0),null);
+var g = cljs.core.nth.call(null,vec__8727,(1),null);
+var b = cljs.core.nth.call(null,vec__8727,(2),null);
+var vec__8730 = p__8725;
+var x = cljs.core.nth.call(null,vec__8730,(0),null);
+var y = cljs.core.nth.call(null,vec__8730,(1),null);
+var z = cljs.core.nth.call(null,vec__8730,(2),null);
+var vec__8733 = p__8726;
+var nx = cljs.core.nth.call(null,vec__8733,(0),null);
+var ny = cljs.core.nth.call(null,vec__8733,(1),null);
+var nz = cljs.core.nth.call(null,vec__8733,(2),null);
+return quil.core.current_graphics.call(null).spotLight(r,g,b,x,y,z,nx,ny,nz,angle,concentration);
+});
+
+quil.core.spot_light.cljs$lang$maxFixedArity = 11;
+
+/**
+ * Squares a number (multiplies a number by itself). The result is
+ * always a positive number, as multiplying two negative numbers always
+ * yields a positive result. For example, -1 * -1 = 1.
+ */
+quil.core.sq = (function quil$core$sq(a){
+return quil.sketch.current_applet.call(null).sq(a);
+});
+/**
+ * Calculates the square root of a number. The square root of a number
+ * is always positive, even though there may be a valid negative
+ * root. The square root s of number a is such that (= a (* s s)) . It
+ * is the opposite of squaring.
+ */
+quil.core.sqrt = (function quil$core$sqrt(a){
+return quil.sketch.current_applet.call(null).sqrt(a);
+});
+/**
+ * Causes Processing to continuously execute the code within
+ * draw. If no-loop is called, the code in draw stops executing.
+ */
+quil.core.start_loop = (function quil$core$start_loop(){
+return quil.sketch.current_applet.call(null).loop();
+});
+/**
+ * Sets the color used to draw lines and borders around
+ * shapes. Converts all args to floats
+ */
+quil.core.stroke_float = (function quil$core$stroke_float(var_args){
+var args8740 = [];
+var len__7927__auto___8743 = arguments.length;
+var i__7928__auto___8744 = (0);
+while(true){
+if((i__7928__auto___8744 < len__7927__auto___8743)){
+args8740.push((arguments[i__7928__auto___8744]));
+
+var G__8745 = (i__7928__auto___8744 + (1));
+i__7928__auto___8744 = G__8745;
+continue;
+} else {
+}
+break;
+}
+
+var G__8742 = args8740.length;
+switch (G__8742) {
+case 1:
+return quil.core.stroke_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.stroke_float.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.stroke_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.stroke_float.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8740.length)].join('')));
+
+}
+});
+
+quil.core.stroke_float.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).stroke(gray);
+});
+
+quil.core.stroke_float.cljs$core$IFn$_invoke$arity$2 = (function (gray,alpha){
+return quil.core.current_graphics.call(null).stroke(gray,alpha);
+});
+
+quil.core.stroke_float.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).stroke(x,y,z);
+});
+
+quil.core.stroke_float.cljs$core$IFn$_invoke$arity$4 = (function (x,y,z,a){
+return quil.core.current_graphics.call(null).stroke(x,y,z,a);
+});
+
+quil.core.stroke_float.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Sets the color used to draw lines and borders around
+ * shapes. Converts rgb to int and alpha to a float.
+ */
+quil.core.stroke_int = (function quil$core$stroke_int(var_args){
+var args8747 = [];
+var len__7927__auto___8750 = arguments.length;
+var i__7928__auto___8751 = (0);
+while(true){
+if((i__7928__auto___8751 < len__7927__auto___8750)){
+args8747.push((arguments[i__7928__auto___8751]));
+
+var G__8752 = (i__7928__auto___8751 + (1));
+i__7928__auto___8751 = G__8752;
+continue;
+} else {
+}
+break;
+}
+
+var G__8749 = args8747.length;
+switch (G__8749) {
+case 1:
+return quil.core.stroke_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.stroke_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8747.length)].join('')));
+
+}
+});
+
+quil.core.stroke_int.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.current_graphics.call(null).stroke(cljs.core.unchecked_int.call(null,rgb));
+});
+
+quil.core.stroke_int.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.current_graphics.call(null).stroke(cljs.core.unchecked_int.call(null,rgb),alpha);
+});
+
+quil.core.stroke_int.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the color used to draw lines and borders around shapes. This
+ * color is either specified in terms of the RGB or HSB color depending
+ * on the current color-mode (the default color space is RGB, with
+ * each value in the range from 0 to 255).
+ */
+quil.core.stroke = (function quil$core$stroke(var_args){
+var args8754 = [];
+var len__7927__auto___8757 = arguments.length;
+var i__7928__auto___8758 = (0);
+while(true){
+if((i__7928__auto___8758 < len__7927__auto___8757)){
+args8754.push((arguments[i__7928__auto___8758]));
+
+var G__8759 = (i__7928__auto___8758 + (1));
+i__7928__auto___8758 = G__8759;
+continue;
+} else {
+}
+break;
+}
+
+var G__8756 = args8754.length;
+switch (G__8756) {
+case 1:
+return quil.core.stroke.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.stroke.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.stroke.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.stroke.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8754.length)].join('')));
+
+}
+});
+
+quil.core.stroke.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.stroke_float.call(null,rgb);
+});
+
+quil.core.stroke.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.stroke_float.call(null,rgb,alpha);
+});
+
+quil.core.stroke.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.stroke_float.call(null,x,y,z);
+});
+
+quil.core.stroke.cljs$core$IFn$_invoke$arity$4 = (function (x,y,z,a){
+return quil.core.stroke_float.call(null,x,y,z,a);
+});
+
+quil.core.stroke.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Sets the style for rendering line endings. These ends are either
+ * squared, extended, or rounded and specified with the corresponding
+ * parameters :square, :project, and :round. The default cap is :round.
+ */
+quil.core.stroke_cap = (function quil$core$stroke_cap(cap_mode){
+var cap_mode__$1 = quil.util.resolve_constant_key.call(null,cap_mode,quil.core.stroke_cap_modes);
+return quil.core.current_graphics.call(null).strokeCap([cljs.core.str.cljs$core$IFn$_invoke$arity$1(cap_mode__$1)].join(''));
+});
+/**
+ * Sets the style of the joints which connect line
+ * segments. These joints are either mitered, beveled, or rounded and
+ * specified with the corresponding parameters :miter, :bevel, and
+ * :round. The default joint is :miter.
+ *
+ * This function is not available with the :p2d, :p3d, or :opengl
+ * renderers.
+ */
+quil.core.stroke_join = (function quil$core$stroke_join(join_mode){
+var join_mode__$1 = quil.util.resolve_constant_key.call(null,join_mode,quil.core.stroke_join_modes);
+return quil.core.current_graphics.call(null).strokeJoin([cljs.core.str.cljs$core$IFn$_invoke$arity$1(join_mode__$1)].join(''));
+});
+/**
+ * Sets the width of the stroke used for lines, points, and the border
+ * around shapes. All widths are set in units of pixels.
+ */
+quil.core.stroke_weight = (function quil$core$stroke_weight(weight){
+return quil.core.current_graphics.call(null).strokeWeight(weight);
+});
+/**
+ * Calculates the ratio of the sine and cosine of an angle. This
+ * function expects the values of the angle parameter to be provided in
+ * radians (values from 0 to PI*2). Values are returned in the range
+ * infinity to -infinity.
+ */
+quil.core.tan = (function quil$core$tan(angle){
+return quil.sketch.current_applet.call(null).tan(angle);
+});
+/**
+ * Returns the target framerate specified with the fn frame-rate
+ */
+quil.core.target_frame_rate = (function quil$core$target_frame_rate(){
+return cljs.core.deref.call(null,quil.sketch.current_applet.call(null).target_frame_rate);
+});
+/**
+ * Returns whether fill is disabled for current graphics.
+ */
+quil.core.no_fill_QMARK_ = (function quil$core$no_fill_QMARK_(graphics){
+return (graphics[quil.core.no_fill_prop]) === true;
+});
+/**
+ * Draws a char to the screen in the specified position. See text fn
+ * for more details.
+ */
+quil.core.text_char = (function quil$core$text_char(var_args){
+var args8761 = [];
+var len__7927__auto___8764 = arguments.length;
+var i__7928__auto___8765 = (0);
+while(true){
+if((i__7928__auto___8765 < len__7927__auto___8764)){
+args8761.push((arguments[i__7928__auto___8765]));
+
+var G__8766 = (i__7928__auto___8765 + (1));
+i__7928__auto___8765 = G__8766;
+continue;
+} else {
+}
+break;
+}
+
+var G__8763 = args8761.length;
+switch (G__8763) {
+case 3:
+return quil.core.text_char.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.text_char.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8761.length)].join('')));
+
+}
+});
+
+quil.core.text_char.cljs$core$IFn$_invoke$arity$3 = (function (c,x,y){
+if(cljs.core.truth_(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null)))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(cljs.core.char$.call(null,c),x,y);
+}
+});
+
+quil.core.text_char.cljs$core$IFn$_invoke$arity$4 = (function (c,x,y,z){
+if(cljs.core.truth_(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null)))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(cljs.core.char$.call(null,c),x,y,z);
+}
+});
+
+quil.core.text_char.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Draws a number to the screen in the specified position. See text fn
+ * for more details.
+ */
+quil.core.text_num = (function quil$core$text_num(var_args){
+var args8768 = [];
+var len__7927__auto___8771 = arguments.length;
+var i__7928__auto___8772 = (0);
+while(true){
+if((i__7928__auto___8772 < len__7927__auto___8771)){
+args8768.push((arguments[i__7928__auto___8772]));
+
+var G__8773 = (i__7928__auto___8772 + (1));
+i__7928__auto___8772 = G__8773;
+continue;
+} else {
+}
+break;
+}
+
+var G__8770 = args8768.length;
+switch (G__8770) {
+case 3:
+return quil.core.text_num.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.text_num.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8768.length)].join('')));
+
+}
+});
+
+quil.core.text_num.cljs$core$IFn$_invoke$arity$3 = (function (num,x,y){
+if(cljs.core.truth_(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null)))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(num,x,y);
+}
+});
+
+quil.core.text_num.cljs$core$IFn$_invoke$arity$4 = (function (num,x,y,z){
+if(cljs.core.truth_(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null)))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(num,x,y,z);
+}
+});
+
+quil.core.text_num.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Draws text to the screen in the position specified by the x and y
+ * parameters and the optional z parameter. A default font will be used
+ * unless a font is set with the text-font fn. Change the color of the
+ * text with the fill fn. The text displays in relation to the
+ * text-align fn, which gives the option to draw to the left, right, and
+ * center of the coordinates.
+ *
+ * The x1, y1, x2 and y2 parameters define a
+ * rectangular area to display within and may only be used with string
+ * data. For text drawn inside a rectangle, the coordinates are
+ * interpreted based on the current rect-mode setting.
+ */
+quil.core.text = (function quil$core$text(var_args){
+var args8775 = [];
+var len__7927__auto___8778 = arguments.length;
+var i__7928__auto___8779 = (0);
+while(true){
+if((i__7928__auto___8779 < len__7927__auto___8778)){
+args8775.push((arguments[i__7928__auto___8779]));
+
+var G__8780 = (i__7928__auto___8779 + (1));
+i__7928__auto___8779 = G__8780;
+continue;
+} else {
+}
+break;
+}
+
+var G__8777 = args8775.length;
+switch (G__8777) {
+case 3:
+return quil.core.text.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.text.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return quil.core.text.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8775.length)].join('')));
+
+}
+});
+
+quil.core.text.cljs$core$IFn$_invoke$arity$3 = (function (s,x,y){
+if(cljs.core.truth_(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null)))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(s,x,y);
+}
+});
+
+quil.core.text.cljs$core$IFn$_invoke$arity$4 = (function (s,x,y,z){
+if(cljs.core.truth_(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null)))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(s,x,y,z);
+}
+});
+
+quil.core.text.cljs$core$IFn$_invoke$arity$5 = (function (s,x1,y1,x2,y2){
+if(cljs.core.truth_(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null)))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(s,x1,y1,x2,y2);
+}
+});
+
+quil.core.text.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Sets the current alignment for drawing text. Available modes are:
+ *
+ * horizontal - :left, :center, and :right
+ * vertical - :top, :bottom, :center, and :baseline
+ *
+ * An optional second parameter specifies the vertical alignment
+ * mode. :baseline is the default. The :top and :center parameters are
+ * straightforward. The :bottom parameter offsets the line based on the
+ * current text-descent. For multiple lines, the final line will be
+ * aligned to the bottom, with the previous lines appearing above it.
+ *
+ * When using text with width and height parameters, :baseline is
+ * ignored, and treated as :top. (Otherwise, text would by default draw
+ * outside the box, since :baseline is the default setting. :baseline is
+ * not a useful drawing mode for text drawn in a rectangle.)
+ *
+ * The vertical alignment is based on the value of text-ascent, which
+ * many fonts do not specify correctly. It may be necessary to use a
+ * hack and offset by a few pixels by hand so that the offset looks
+ * correct. To do this as less of a hack, use some percentage of
+ * text-ascent or text-descent so that the hack works even if you
+ * change the size of the font.
+ */
+quil.core.text_align = (function quil$core$text_align(var_args){
+var args8782 = [];
+var len__7927__auto___8785 = arguments.length;
+var i__7928__auto___8786 = (0);
+while(true){
+if((i__7928__auto___8786 < len__7927__auto___8785)){
+args8782.push((arguments[i__7928__auto___8786]));
+
+var G__8787 = (i__7928__auto___8786 + (1));
+i__7928__auto___8786 = G__8787;
+continue;
+} else {
+}
+break;
+}
+
+var G__8784 = args8782.length;
+switch (G__8784) {
+case 1:
+return quil.core.text_align.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.text_align.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8782.length)].join('')));
+
+}
+});
+
+quil.core.text_align.cljs$core$IFn$_invoke$arity$1 = (function (align){
+var align__$1 = quil.util.resolve_constant_key.call(null,align,quil.core.horizontal_alignment_modes);
+return quil.core.current_graphics.call(null).textAlign((align__$1 | (0)));
+});
+
+quil.core.text_align.cljs$core$IFn$_invoke$arity$2 = (function (align_x,align_y){
+var align_x__$1 = quil.util.resolve_constant_key.call(null,align_x,quil.core.horizontal_alignment_modes);
+var align_y__$1 = quil.util.resolve_constant_key.call(null,align_y,quil.core.vertical_alignment_modes);
+return quil.core.current_graphics.call(null).textAlign((align_x__$1 | (0)),(align_y__$1 | (0)));
+});
+
+quil.core.text_align.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns the ascent of the current font at its current size. This
+ * information is useful for determining the height of the font above
+ * the baseline. For example, adding the text-ascent and text-descent
+ * values will give you the total height of the line.
+ */
+quil.core.text_ascent = (function quil$core$text_ascent(){
+return quil.core.current_graphics.call(null).textAscent();
+});
+/**
+ * Returns descent of the current font at its current size. This
+ * information is useful for determining the height of the font below
+ * the baseline. For example, adding the text-ascent and text-descent
+ * values will give you the total height of the line.
+ */
+quil.core.text_descent = (function quil$core$text_descent(){
+return quil.core.current_graphics.call(null).textDescent();
+});
+/**
+ * Sets the current font that will be drawn with the text
+ * function. Fonts must be loaded with load-font before it can be
+ * used. This font will be used in all subsequent calls to the text
+ * function. If no size parameter is input, the font will appear at its
+ * original size until it is changed with text-size.
+ *
+ * Because fonts are usually bitmaped, you should create fonts at the
+ * sizes that will be used most commonly. Using textFont without the
+ * size parameter will result in the cleanest-looking text.
+ *
+ * With the default (JAVA2D) and PDF renderers, it's also possible to
+ * enable the use of native fonts via the command
+ * (hint :enable-native-fonts). This will produce vector text in JAVA2D
+ * sketches and PDF output in cases where the vector data is available:
+ * when the font is still installed, or the font is created via the
+ * create-font fn
+ */
+quil.core.text_font = (function quil$core$text_font(var_args){
+var args8789 = [];
+var len__7927__auto___8792 = arguments.length;
+var i__7928__auto___8793 = (0);
+while(true){
+if((i__7928__auto___8793 < len__7927__auto___8792)){
+args8789.push((arguments[i__7928__auto___8793]));
+
+var G__8794 = (i__7928__auto___8793 + (1));
+i__7928__auto___8793 = G__8794;
+continue;
+} else {
+}
+break;
+}
+
+var G__8791 = args8789.length;
+switch (G__8791) {
+case 1:
+return quil.core.text_font.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.text_font.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8789.length)].join('')));
+
+}
+});
+
+quil.core.text_font.cljs$core$IFn$_invoke$arity$1 = (function (font){
+return quil.core.current_graphics.call(null).textFont(font);
+});
+
+quil.core.text_font.cljs$core$IFn$_invoke$arity$2 = (function (font,size){
+return quil.core.current_graphics.call(null).textFont(font,(size | (0)));
+});
+
+quil.core.text_font.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the spacing between lines of text in units of pixels. This
+ * setting will be used in all subsequent calls to the text function.
+ */
+quil.core.text_leading = (function quil$core$text_leading(leading){
+return quil.core.current_graphics.call(null).textLeading(leading);
+});
+/**
+ * Sets the way text draws to the screen - available modes
+ * are :model and :shape
+ *
+ * In the default configuration (the :model mode), it's possible to
+ * rotate, scale, and place letters in two and three dimensional space.
+ *
+ * The :shape mode draws text using the glyph outlines of individual
+ * characters rather than as textures. This mode is only supported with
+ * the PDF and OPENGL renderer settings. With the PDF renderer, you
+ * must specify the :shape text-mode before any other drawing occurs.
+ * If the outlines are not available, then :shape will be ignored and
+ * :model will be used instead.
+ *
+ * The :shape option in OPENGL mode can be combined with begin-raw to
+ * write vector-accurate text to 2D and 3D output files, for instance
+ * DXF or PDF. :shape is not currently optimized for OPENGL, so if
+ * recording shape data, use :model until you're ready to capture the
+ * geometry with begin-raw.
+ */
+quil.core.text_mode = (function quil$core$text_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.text_modes);
+return quil.core.current_graphics.call(null).textMode((mode__$1 | (0)));
+});
+/**
+ * Sets the current font size. This size will be used in all
+ * subsequent calls to the text fn. Font size is measured in
+ * units of pixels.
+ */
+quil.core.text_size = (function quil$core$text_size(size){
+return quil.core.current_graphics.call(null).textSize(size);
+});
+/**
+ * Sets a texture to be applied to vertex points. The texture fn must
+ * be called between begin-shape and end-shape and before any calls to
+ * vertex.
+ *
+ * When textures are in use, the fill color is ignored. Instead, use
+ * tint to specify the color of the texture as it is applied to the
+ * shape.
+ */
+quil.core.texture = (function quil$core$texture(img){
+return quil.core.current_graphics.call(null).texture(img);
+});
+/**
+ * Sets the coordinate space for texture mapping. There are two
+ * options, :image and :normal.
+ *
+ * :image refers to the actual coordinates of the image and :normal
+ * refers to a normalized space of values ranging from 0 to 1. The
+ * default mode is :image. In :image, if an image is 100 x 200 pixels,
+ * mapping the image onto the entire size of a quad would require the
+ * points (0,0) (0,100) (100,200) (0,200). The same mapping in
+ * NORMAL_SPACE is (0,0) (0,1) (1,1) (0,1).
+ */
+quil.core.texture_mode = (function quil$core$texture_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.texture_modes);
+return quil.core.current_graphics.call(null).textureMode((mode__$1 | (0)));
+});
+/**
+ * Calculates and returns the width of any text string.
+ */
+quil.core.text_width = (function quil$core$text_width(data){
+return quil.core.current_graphics.call(null).textWidth(data);
+});
+/**
+ * Sets the fill value for displaying images. Images can be tinted to
+ * specified colors or made transparent by setting the alpha.
+ *
+ * To make an image transparent, but not change it's color, use white
+ * as the tint color and specify an alpha value. For instance,
+ * tint(255, 128) will make an image 50% transparent (unless
+ * colorMode() has been used).
+ *
+ * The value for the parameter gray must be less than or equal to the
+ * current maximum value as specified by colorMode(). The default
+ * maximum value is 255.
+ *
+ * Also used to control the coloring of textures in 3D.
+ */
+quil.core.tint_float = (function quil$core$tint_float(var_args){
+var args8796 = [];
+var len__7927__auto___8799 = arguments.length;
+var i__7928__auto___8800 = (0);
+while(true){
+if((i__7928__auto___8800 < len__7927__auto___8799)){
+args8796.push((arguments[i__7928__auto___8800]));
+
+var G__8801 = (i__7928__auto___8800 + (1));
+i__7928__auto___8800 = G__8801;
+continue;
+} else {
+}
+break;
+}
+
+var G__8798 = args8796.length;
+switch (G__8798) {
+case 1:
+return quil.core.tint_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.tint_float.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.tint_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.tint_float.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8796.length)].join('')));
+
+}
+});
+
+quil.core.tint_float.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).tint(gray);
+});
+
+quil.core.tint_float.cljs$core$IFn$_invoke$arity$2 = (function (gray,alpha){
+return quil.core.current_graphics.call(null).tint(gray,alpha);
+});
+
+quil.core.tint_float.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.current_graphics.call(null).tint(r,g,b);
+});
+
+quil.core.tint_float.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.current_graphics.call(null).tint(g,g,b,a);
+});
+
+quil.core.tint_float.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Sets the fill value for displaying images. Images can be tinted to
+ * specified colors or made transparent by setting the alpha.
+ *
+ * To make an image transparent, but not change it's color, use white
+ * as the tint color and specify an alpha value. For instance,
+ * tint(255, 128) will make an image 50% transparent (unless
+ * colorMode() has been used).
+ *
+ * The value for the parameter gray must be less than or equal to the
+ * current maximum value as specified by colorMode(). The default
+ * maximum value is 255.
+ *
+ * Also used to control the coloring of textures in 3D.
+ */
+quil.core.tint_int = (function quil$core$tint_int(var_args){
+var args8803 = [];
+var len__7927__auto___8806 = arguments.length;
+var i__7928__auto___8807 = (0);
+while(true){
+if((i__7928__auto___8807 < len__7927__auto___8806)){
+args8803.push((arguments[i__7928__auto___8807]));
+
+var G__8808 = (i__7928__auto___8807 + (1));
+i__7928__auto___8807 = G__8808;
+continue;
+} else {
+}
+break;
+}
+
+var G__8805 = args8803.length;
+switch (G__8805) {
+case 1:
+return quil.core.tint_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.tint_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8803.length)].join('')));
+
+}
+});
+
+quil.core.tint_int.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.current_graphics.call(null).tint(cljs.core.unchecked_int.call(null,rgb));
+});
+
+quil.core.tint_int.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.current_graphics.call(null).tint(cljs.core.unchecked_int.call(null,rgb),alpha);
+});
+
+quil.core.tint_int.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the fill value for displaying images. Images can be tinted to
+ * specified colors or made transparent by setting the alpha.
+ *
+ * To make an image transparent, but not change it's color, use white
+ * as the tint color and specify an alpha value. For instance,
+ * tint(255, 128) will make an image 50% transparent (unless
+ * colorMode() has been used).
+ *
+ * The value for the parameter gray must be less than or equal to the
+ * current maximum value as specified by colorMode(). The default
+ * maximum value is 255.
+ *
+ * Also used to control the coloring of textures in 3D.
+ */
+quil.core.tint = (function quil$core$tint(var_args){
+var args8810 = [];
+var len__7927__auto___8813 = arguments.length;
+var i__7928__auto___8814 = (0);
+while(true){
+if((i__7928__auto___8814 < len__7927__auto___8813)){
+args8810.push((arguments[i__7928__auto___8814]));
+
+var G__8815 = (i__7928__auto___8814 + (1));
+i__7928__auto___8814 = G__8815;
+continue;
+} else {
+}
+break;
+}
+
+var G__8812 = args8810.length;
+switch (G__8812) {
+case 1:
+return quil.core.tint.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.tint.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.tint.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.tint.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8810.length)].join('')));
+
+}
+});
+
+quil.core.tint.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.current_graphics.call(null).tint(rgb);
+});
+
+quil.core.tint.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.current_graphics.call(null).tint(rgb,alpha);
+});
+
+quil.core.tint.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.tint_float.call(null,r,g,b);
+});
+
+quil.core.tint.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.tint_float.call(null,r,g,b,a);
+});
+
+quil.core.tint.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Specifies an amount to displace objects within the display
+ * window. The x parameter specifies left/right translation, the y
+ * parameter specifies up/down translation, and the z parameter
+ * specifies translations toward/away from the screen. Transformations
+ * apply to everything that happens after and subsequent calls to the
+ * function accumulates the effect. For example, calling (translate 50
+ * 0) and then (translate 20, 0) is the same as (translate 70, 0). If
+ * translate is called within draw, the transformation is reset when
+ * the loop begins again. This function can be further controlled by
+ * the push-matrix and pop-matrix.
+ */
+quil.core.translate = (function quil$core$translate(var_args){
+var args8817 = [];
+var len__7927__auto___8820 = arguments.length;
+var i__7928__auto___8821 = (0);
+while(true){
+if((i__7928__auto___8821 < len__7927__auto___8820)){
+args8817.push((arguments[i__7928__auto___8821]));
+
+var G__8822 = (i__7928__auto___8821 + (1));
+i__7928__auto___8821 = G__8822;
+continue;
+} else {
+}
+break;
+}
+
+var G__8819 = args8817.length;
+switch (G__8819) {
+case 1:
+return quil.core.translate.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.translate.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.translate.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8817.length)].join('')));
+
+}
+});
+
+quil.core.translate.cljs$core$IFn$_invoke$arity$1 = (function (v){
+return cljs.core.apply.call(null,quil.core.translate,v);
+});
+
+quil.core.translate.cljs$core$IFn$_invoke$arity$2 = (function (tx,ty){
+return quil.core.current_graphics.call(null).translate(tx,ty);
+});
+
+quil.core.translate.cljs$core$IFn$_invoke$arity$3 = (function (tx,ty,tz){
+return quil.core.current_graphics.call(null).translate(tx,ty,tz);
+});
+
+quil.core.translate.cljs$lang$maxFixedArity = 3;
+
+/**
+ * A triangle is a plane created by connecting three points. The first
+ * two arguments specify the first point, the middle two arguments
+ * specify the second point, and the last two arguments specify the
+ * third point.
+ */
+quil.core.triangle = (function quil$core$triangle(x1,y1,x2,y2,x3,y3){
+return quil.core.current_graphics.call(null).triangle(x1,y1,x2,y2,x3,y3);
+});
+/**
+ * Unpack a binary string to an integer. See binary for converting
+ * integers to strings.
+ */
+quil.core.unbinary = (function quil$core$unbinary(str_val){
+return quil.sketch.current_applet.call(null).unbinary([cljs.core.str.cljs$core$IFn$_invoke$arity$1(str_val)].join(''));
+});
+/**
+ * Converts a String representation of a hexadecimal number to its
+ * equivalent integer value.
+ */
+quil.core.unhex = (function quil$core$unhex(hex_str){
+return quil.sketch.current_applet.call(null).unhex([cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex_str)].join(''));
+});
+/**
+ * Updates the display window or image with the data in the pixels array.
+ * Use in conjunction with (pixels). If you're only reading pixels from
+ * the array, there's no need to call update-pixels unless there are
+ * changes.
+ *
+ * Certain renderers may or may not seem to require pixels or
+ * update-pixels. However, the rule is that any time you want to
+ * manipulate the pixels array, you must first call pixels, and
+ * after changes have been made, call update-pixels. Even if the
+ * renderer may not seem to use this function in the current Processing
+ * release, this will always be subject to change.
+ */
+quil.core.update_pixels = (function quil$core$update_pixels(var_args){
+var args8824 = [];
+var len__7927__auto___8827 = arguments.length;
+var i__7928__auto___8828 = (0);
+while(true){
+if((i__7928__auto___8828 < len__7927__auto___8827)){
+args8824.push((arguments[i__7928__auto___8828]));
+
+var G__8829 = (i__7928__auto___8828 + (1));
+i__7928__auto___8828 = G__8829;
+continue;
+} else {
+}
+break;
+}
+
+var G__8826 = args8824.length;
+switch (G__8826) {
+case 0:
+return quil.core.update_pixels.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.update_pixels.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8824.length)].join('')));
+
+}
+});
+
+quil.core.update_pixels.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.update_pixels.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.update_pixels.cljs$core$IFn$_invoke$arity$1 = (function (img){
+var temp__4657__auto___8831 = img.stored_pix_array;
+if(cljs.core.truth_(temp__4657__auto___8831)){
+var pix_array_8832 = temp__4657__auto___8831;
+img.pixels.set(pix_array_8832);
+
+img.stored_pix_array = null;
+} else {
+}
+
+return img.updatePixels();
+});
+
+quil.core.update_pixels.cljs$lang$maxFixedArity = 1;
+
+/**
+ * All shapes are constructed by connecting a series of
+ * vertices. vertex is used to specify the vertex coordinates for
+ * points, lines, triangles, quads, and polygons and is used
+ * exclusively within the begin-shape and end-shape fns.
+ *
+ * Drawing a vertex in 3D using the z parameter requires the :p3d or
+ * :opengl renderers to be used.
+ *
+ * This function is also used to map a texture onto the geometry. The
+ * texture fn declares the texture to apply to the geometry and the u
+ * and v coordinates set define the mapping of this texture to the
+ * form. By default, the coordinates used for u and v are specified in
+ * relation to the image's size in pixels, but this relation can be
+ * changed with texture-mode.
+ */
+quil.core.vertex = (function quil$core$vertex(var_args){
+var args8833 = [];
+var len__7927__auto___8836 = arguments.length;
+var i__7928__auto___8837 = (0);
+while(true){
+if((i__7928__auto___8837 < len__7927__auto___8836)){
+args8833.push((arguments[i__7928__auto___8837]));
+
+var G__8838 = (i__7928__auto___8837 + (1));
+i__7928__auto___8837 = G__8838;
+continue;
+} else {
+}
+break;
+}
+
+var G__8835 = args8833.length;
+switch (G__8835) {
+case 2:
+return quil.core.vertex.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.vertex.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.vertex.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return quil.core.vertex.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8833.length)].join('')));
+
+}
+});
+
+quil.core.vertex.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.current_graphics.call(null).vertex(x,y);
+});
+
+quil.core.vertex.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).vertex(x,y,z);
+});
+
+quil.core.vertex.cljs$core$IFn$_invoke$arity$4 = (function (x,y,u,v){
+return quil.core.current_graphics.call(null).vertex(x,y,u,v);
+});
+
+quil.core.vertex.cljs$core$IFn$_invoke$arity$5 = (function (x,y,z,u,v){
+return quil.core.current_graphics.call(null).vertex(x,y,z,u,v);
+});
+
+quil.core.vertex.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Returns the current year as an integer (2003, 2004, 2005, etc).
+ */
+quil.core.year = (function quil$core$year(){
+return quil.sketch.current_applet.call(null).year();
+});
+/**
+ * Width of the display window. The value of width is zero until size is
+ * called.
+ */
+quil.core.width = (function quil$core$width(){
+return quil.sketch.current_applet.call(null).width;
+});
+/**
+ * Temporarily set the fill color for the body of this macro.
+ * The code outside of with-fill form will have the previous fill color set.
+ *
+ * The fill color has to be in a vector!
+ * Example: (with-fill [255] ...)
+ * (with-fill [10 80 98] ...)
+ */
+quil.core.with_fill = (function quil$core$with_fill(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8845 = arguments.length;
+var i__7928__auto___8846 = (0);
+while(true){
+if((i__7928__auto___8846 < len__7927__auto___8845)){
+args__7934__auto__.push((arguments[i__7928__auto___8846]));
+
+var G__8847 = (i__7928__auto___8846 + (1));
+i__7928__auto___8846 = G__8847;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((3) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((3)),(0),null)):null);
+return quil.core.with_fill.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7935__auto__);
+});
+
+quil.core.with_fill.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,fill_args,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null)),(function (){var x__7656__auto__ = cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"old-fill__8840__auto__","old-fill__8840__auto__",-359378547,null)),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","current-fill","quil.core/current-fill",269663137,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})()))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","apply","cljs.core/apply",1757277831,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","fill","quil.core/fill",814613078,null)),(function (){var x__7656__auto__ = fill_args;
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),body,(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","fill","quil.core/fill",814613078,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"old-fill__8840__auto__","old-fill__8840__auto__",-359378547,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+});
+
+quil.core.with_fill.cljs$lang$maxFixedArity = (3);
+
+quil.core.with_fill.cljs$lang$applyTo = (function (seq8841){
+var G__8842 = cljs.core.first.call(null,seq8841);
+var seq8841__$1 = cljs.core.next.call(null,seq8841);
+var G__8843 = cljs.core.first.call(null,seq8841__$1);
+var seq8841__$2 = cljs.core.next.call(null,seq8841__$1);
+var G__8844 = cljs.core.first.call(null,seq8841__$2);
+var seq8841__$3 = cljs.core.next.call(null,seq8841__$2);
+return quil.core.with_fill.cljs$core$IFn$_invoke$arity$variadic(G__8842,G__8843,G__8844,seq8841__$3);
+});
+
+
+quil.core.with_fill.cljs$lang$macro = true;
+/**
+ * Temporarily set the stroke color for the body of this macro.
+ * The code outside of with-stroke form will have the previous stroke color set.
+ *
+ * The stroke color has to be in a vector!
+ * Example: (with-stroke [255] ...)
+ * (with-stroke [10 80 98] ...)
+ */
+quil.core.with_stroke = (function quil$core$with_stroke(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8853 = arguments.length;
+var i__7928__auto___8854 = (0);
+while(true){
+if((i__7928__auto___8854 < len__7927__auto___8853)){
+args__7934__auto__.push((arguments[i__7928__auto___8854]));
+
+var G__8855 = (i__7928__auto___8854 + (1));
+i__7928__auto___8854 = G__8855;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((3) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((3)),(0),null)):null);
+return quil.core.with_stroke.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7935__auto__);
+});
+
+quil.core.with_stroke.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,stroke_args,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null)),(function (){var x__7656__auto__ = cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"old-stroke__8848__auto__","old-stroke__8848__auto__",1761539364,null)),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","current-stroke","quil.core/current-stroke",-1148124489,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})()))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","apply","cljs.core/apply",1757277831,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","stroke","quil.core/stroke",577473004,null)),(function (){var x__7656__auto__ = stroke_args;
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),body,(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","stroke","quil.core/stroke",577473004,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"old-stroke__8848__auto__","old-stroke__8848__auto__",1761539364,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+});
+
+quil.core.with_stroke.cljs$lang$maxFixedArity = (3);
+
+quil.core.with_stroke.cljs$lang$applyTo = (function (seq8849){
+var G__8850 = cljs.core.first.call(null,seq8849);
+var seq8849__$1 = cljs.core.next.call(null,seq8849);
+var G__8851 = cljs.core.first.call(null,seq8849__$1);
+var seq8849__$2 = cljs.core.next.call(null,seq8849__$1);
+var G__8852 = cljs.core.first.call(null,seq8849__$2);
+var seq8849__$3 = cljs.core.next.call(null,seq8849__$2);
+return quil.core.with_stroke.cljs$core$IFn$_invoke$arity$variadic(G__8850,G__8851,G__8852,seq8849__$3);
+});
+
+
+quil.core.with_stroke.cljs$lang$macro = true;
+/**
+ * Performs body with translation, restores current transformation on
+ * exit.
+ */
+quil.core.with_translation = (function quil$core$with_translation(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8861 = arguments.length;
+var i__7928__auto___8862 = (0);
+while(true){
+if((i__7928__auto___8862 < len__7927__auto___8861)){
+args__7934__auto__.push((arguments[i__7928__auto___8862]));
+
+var G__8863 = (i__7928__auto___8862 + (1));
+i__7928__auto___8862 = G__8863;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((3) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((3)),(0),null)):null);
+return quil.core.with_translation.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7935__auto__);
+});
+
+quil.core.with_translation.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,translation_vector,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null)),(function (){var x__7656__auto__ = cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"tr__8856__auto__","tr__8856__auto__",-1965577474,null)),(function (){var x__7656__auto__ = translation_vector;
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})()))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","push-matrix","quil.core/push-matrix",1356326676,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"try","try",-1273693247,null)),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","translate","quil.core/translate",150889028,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"tr__8856__auto__","tr__8856__auto__",-1965577474,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),body,(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"finally","finally",-1065347064,null)),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","pop-matrix","quil.core/pop-matrix",310892617,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+});
+
+quil.core.with_translation.cljs$lang$maxFixedArity = (3);
+
+quil.core.with_translation.cljs$lang$applyTo = (function (seq8857){
+var G__8858 = cljs.core.first.call(null,seq8857);
+var seq8857__$1 = cljs.core.next.call(null,seq8857);
+var G__8859 = cljs.core.first.call(null,seq8857__$1);
+var seq8857__$2 = cljs.core.next.call(null,seq8857__$1);
+var G__8860 = cljs.core.first.call(null,seq8857__$2);
+var seq8857__$3 = cljs.core.next.call(null,seq8857__$2);
+return quil.core.with_translation.cljs$core$IFn$_invoke$arity$variadic(G__8858,G__8859,G__8860,seq8857__$3);
+});
+
+
+quil.core.with_translation.cljs$lang$macro = true;
+/**
+ * Performs body with rotation, restores current transformation on exit.
+ * Accepts a vector [angle] or [angle x-axis y-axis z-axis].
+ *
+ * Example:
+ * (with-rotation [angle]
+ * (vertex 1 2))
+ */
+quil.core.with_rotation = (function quil$core$with_rotation(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8869 = arguments.length;
+var i__7928__auto___8870 = (0);
+while(true){
+if((i__7928__auto___8870 < len__7927__auto___8869)){
+args__7934__auto__.push((arguments[i__7928__auto___8870]));
+
+var G__8871 = (i__7928__auto___8870 + (1));
+i__7928__auto___8870 = G__8871;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((3) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((3)),(0),null)):null);
+return quil.core.with_rotation.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7935__auto__);
+});
+
+quil.core.with_rotation.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,rotation,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null)),(function (){var x__7656__auto__ = cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"tr__8864__auto__","tr__8864__auto__",370582360,null)),(function (){var x__7656__auto__ = rotation;
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})()))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","push-matrix","quil.core/push-matrix",1356326676,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"try","try",-1273693247,null)),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","apply","cljs.core/apply",1757277831,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","rotate","quil.core/rotate",-1944995048,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"tr__8864__auto__","tr__8864__auto__",370582360,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),body,(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"finally","finally",-1065347064,null)),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","pop-matrix","quil.core/pop-matrix",310892617,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+});
+
+quil.core.with_rotation.cljs$lang$maxFixedArity = (3);
+
+quil.core.with_rotation.cljs$lang$applyTo = (function (seq8865){
+var G__8866 = cljs.core.first.call(null,seq8865);
+var seq8865__$1 = cljs.core.next.call(null,seq8865);
+var G__8867 = cljs.core.first.call(null,seq8865__$1);
+var seq8865__$2 = cljs.core.next.call(null,seq8865__$1);
+var G__8868 = cljs.core.first.call(null,seq8865__$2);
+var seq8865__$3 = cljs.core.next.call(null,seq8865__$2);
+return quil.core.with_rotation.cljs$core$IFn$_invoke$arity$variadic(G__8866,G__8867,G__8868,seq8865__$3);
+});
+
+
+quil.core.with_rotation.cljs$lang$macro = true;
+/**
+ * All subsequent calls of any drawing function will draw on given
+ * graphics. 'with-graphics' cannot be nested (you can draw simultaneously
+ * only on 1 graphics)
+ */
+quil.core.with_graphics = (function quil$core$with_graphics(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8877 = arguments.length;
+var i__7928__auto___8878 = (0);
+while(true){
+if((i__7928__auto___8878 < len__7927__auto___8877)){
+args__7934__auto__.push((arguments[i__7928__auto___8878]));
+
+var G__8879 = (i__7928__auto___8878 + (1));
+i__7928__auto___8878 = G__8879;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((3) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((3)),(0),null)):null);
+return quil.core.with_graphics.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7935__auto__);
+});
+
+quil.core.with_graphics.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,graphics,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null)),(function (){var x__7656__auto__ = cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"gr__8872__auto__","gr__8872__auto__",-1886717774,null)),(function (){var x__7656__auto__ = graphics;
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})()))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","binding","cljs.core/binding",2050379843,null)),(function (){var x__7656__auto__ = cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.core","*graphics*","quil.core/*graphics*",-1088142302,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"gr__8872__auto__","gr__8872__auto__",-1886717774,null))))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,".beginDraw",".beginDraw",1110767550,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"gr__8872__auto__","gr__8872__auto__",-1886717774,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),body,(function (){var x__7656__auto__ = cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,".endDraw",".endDraw",795589408,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"gr__8872__auto__","gr__8872__auto__",-1886717774,null)))));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+});
+
+quil.core.with_graphics.cljs$lang$maxFixedArity = (3);
+
+quil.core.with_graphics.cljs$lang$applyTo = (function (seq8873){
+var G__8874 = cljs.core.first.call(null,seq8873);
+var seq8873__$1 = cljs.core.next.call(null,seq8873);
+var G__8875 = cljs.core.first.call(null,seq8873__$1);
+var seq8873__$2 = cljs.core.next.call(null,seq8873__$1);
+var G__8876 = cljs.core.first.call(null,seq8873__$2);
+var seq8873__$3 = cljs.core.next.call(null,seq8873__$2);
+return quil.core.with_graphics.cljs$core$IFn$_invoke$arity$variadic(G__8874,G__8875,G__8876,seq8873__$3);
+});
+
+
+quil.core.with_graphics.cljs$lang$macro = true;
+/**
+ * Create and start a new visualisation applet. Can be used to create
+ * new sketches programmatically. See documentation for 'defsketch' for
+ * list of available options.
+ */
+quil.core.sketch = (function quil$core$sketch(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8881 = arguments.length;
+var i__7928__auto___8882 = (0);
+while(true){
+if((i__7928__auto___8882 < len__7927__auto___8881)){
+args__7934__auto__.push((arguments[i__7928__auto___8882]));
+
+var G__8883 = (i__7928__auto___8882 + (1));
+i__7928__auto___8882 = G__8883;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((0) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((0)),(0),null)):null);
+return quil.core.sketch.cljs$core$IFn$_invoke$arity$variadic(argseq__7935__auto__);
+});
+
+quil.core.sketch.cljs$core$IFn$_invoke$arity$variadic = (function (opts){
+return cljs.core.apply.call(null,quil.sketch.sketch,opts);
+});
+
+quil.core.sketch.cljs$lang$maxFixedArity = (0);
+
+quil.core.sketch.cljs$lang$applyTo = (function (seq8880){
+return quil.core.sketch.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq8880));
+});
+
+/**
+ * Define and start a sketch and bind it to a var with the symbol
+ * app-name. If any of the options to the various callbacks are
+ * symbols, it wraps them in a call to var to ensure they aren't
+ * inlined and that redefinitions to the original fns are reflected in
+ * the visualisation.
+ *
+ * Available options:
+ *
+ * :size - A vector of width and height for the sketch or :fullscreen.
+ * Defaults to [500 300]. If you're using :fullscreen you may
+ * want to enable present mode - :features [:present]
+ *
+ * :renderer - Specifies the renderer type. One of :p2d, :p3d, :java2d,
+ * :opengl, :pdf). Defaults to :java2d. :dxf renderer
+ * can't be used as sketch renderer. Use begin-raw method
+ * instead. In clojurescript only :p2d and :p3d renderers
+ * are supported.
+ *
+ * :output-file - Specifies an output file path. Only used in :pdf mode.
+ * Not supported in clojurescript.
+ *
+ * :title - A string which will be displayed at the top of
+ * the sketch window. Not supported in clojurescript.
+ *
+ * :features - A vector of keywords customizing sketch behaviour.
+ * Supported features:
+ *
+ * :keep-on-top - Sketch window will always be above other
+ * windows. Note: some platforms might not
+ * support always-on-top windows.
+ * Not supported in clojurescript.
+ *
+ * :exit-on-close - Shutdown JVM when sketch is closed.
+ * Not supported in clojurescript.
+ *
+ * :resizable - Makes sketch resizable.
+ * Not supported in clojurescript.
+ *
+ * :no-safe-fns - Do not catch and print exceptions thrown
+ * inside functions provided to sketch (like
+ * draw, mouse-click, key-pressed and
+ * other). By default all exceptions thrown
+ * inside these functions are catched. This
+ * prevents sketch from breaking when bad
+ * function was provided and allows you to
+ * fix it and reload it on fly. You can
+ * disable this behaviour by enabling
+ * :no-safe-fns feature.
+ * Not supported in clojurescript.
+ *
+ * :present - Switch to present mode (fullscreen without
+ * borders, OS panels). You may want to use
+ * this feature together with :size :fullscreen.
+ * Not supported in clojurescript.
+ *
+ * :no-start - Disables autostart if sketch was created using
+ * defsketch macro. To start sketch you have to
+ * call function created defsketch.
+ * Supported only in clojurescript.
+ *
+ * :global-key-events - Allows a sketch to receive any
+ * keyboard event sent to the page,
+ * regardless of whether the canvas it is
+ * loaded in has focus or not.
+ * Supported only in clojurescript.
+ *
+ * Usage example: :features [:keep-on-top :present]
+ *
+ * :bgcolor - Sets background color for unused space in present mode.
+ * Color is specified in hex format: #XXXXXX.
+ * Example: :bgcolor "#00FFFF" (cyan background)
+ * Not supported in clojurescript.
+ *
+ * :display - Sets what display should be used by this sketch.
+ * Displays are numbered starting from 0. Example: :display 1.
+ * Not supported in clojurescript.
+ *
+ * :setup - A function to be called once when setting the sketch up.
+ *
+ * :draw - A function to be repeatedly called at most n times per
+ * second where n is the target frame-rate set for
+ * the visualisation.
+ *
+ * :host - String id of canvas element or DOM element itself.
+ * Specifies host for the sketch. Must be specified in sketch,
+ * may be omitted in defsketch. If ommitted in defsketch,
+ * :host is set to the name of the sketch. If element with
+ * specified id is not found on the page and page is empty -
+ * new canvas element will be created. Used in clojurescript.
+ *
+ * :focus-gained - Called when the sketch gains focus.
+ * Not supported in clojurescript.
+ *
+ * :focus-lost - Called when the sketch loses focus.
+ * Not supported in clojurescript.
+ *
+ * :mouse-entered - Called when the mouse enters the sketch window.
+ *
+ * :mouse-exited - Called when the mouse leaves the sketch window
+ *
+ * :mouse-pressed - Called every time a mouse button is pressed.
+ *
+ * :mouse-released - Called every time a mouse button is released.
+ *
+ * :mouse-clicked - called once after a mouse button has been pressed
+ * and then released.
+ *
+ * :mouse-moved - Called every time the mouse moves and a button is
+ * not pressed.
+ *
+ * :mouse-dragged - Called every time the mouse moves and a button is
+ * pressed.
+ *
+ * :mouse-wheel - Called every time mouse wheel is rotated.
+ * Takes 1 argument - wheel rotation, an int.
+ * Negative values if the mouse wheel was rotated
+ * up/away from the user, and positive values
+ * if the mouse wheel was rotated down/ towards the user
+ *
+ * :key-pressed - Called every time any key is pressed.
+ *
+ * :key-released - Called every time any key is released.
+ *
+ * :key-typed - Called once every time non-modifier keys are
+ * pressed.
+ *
+ * :on-close - Called once, when sketch is closed
+ * Not supported in clojurescript.
+ *
+ * :middleware - Vector of middleware to be applied to the sketch.
+ * Middleware will be applied in the same order as in comp
+ * function: [f g] will be applied as (f (g options)).
+ *
+ * :settings - cousin of :setup. A function to be called once when
+ * setting sketch up. Should be used only for (smooth) and
+ * (no-smooth). Due to Processing limitations these functions
+ * cannot be used neither in :setup nor in :draw.
+ */
+quil.core.defsketch = (function quil$core$defsketch(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8888 = arguments.length;
+var i__7928__auto___8889 = (0);
+while(true){
+if((i__7928__auto___8889 < len__7927__auto___8888)){
+args__7934__auto__.push((arguments[i__7928__auto___8889]));
+
+var G__8890 = (i__7928__auto___8889 + (1));
+i__7928__auto___8889 = G__8890;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((3) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((3)),(0),null)):null);
+return quil.core.defsketch.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7935__auto__);
+});
+
+quil.core.defsketch.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,app_name,options){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("quil.sketch$macros","defsketch","quil.sketch$macros/defsketch",2065609719,null)),(function (){var x__7656__auto__ = app_name;
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),options)));
+});
+
+quil.core.defsketch.cljs$lang$maxFixedArity = (3);
+
+quil.core.defsketch.cljs$lang$applyTo = (function (seq8884){
+var G__8885 = cljs.core.first.call(null,seq8884);
+var seq8884__$1 = cljs.core.next.call(null,seq8884);
+var G__8886 = cljs.core.first.call(null,seq8884__$1);
+var seq8884__$2 = cljs.core.next.call(null,seq8884__$1);
+var G__8887 = cljs.core.first.call(null,seq8884__$2);
+var seq8884__$3 = cljs.core.next.call(null,seq8884__$2);
+return quil.core.defsketch.cljs$core$IFn$_invoke$arity$variadic(G__8885,G__8886,G__8887,seq8884__$3);
+});
+
+
+quil.core.defsketch.cljs$lang$macro = true;
+/**
+ * Returns true if char c is a 'coded' char i.e. it is necessary to
+ * fetch the key-code as an integer and use that to determine the
+ * specific key pressed. See key-keyword.
+ */
+quil.core.key_coded_QMARK_ = (function quil$core$key_coded_QMARK_(c){
+return cljs.core._EQ_.call(null,(65535),String(c).charCodeAt());
+});
+/**
+ * Returns a keyword representing the currently pressed key. Modifier
+ * keys are represented as: :up, :down, :left, :right, :alt, :control,
+ * :shift, :command, :f1-24
+ */
+quil.core.key_as_keyword = (function quil$core$key_as_keyword(){
+var key_char = quil.core.raw_key.call(null);
+var code = quil.core.key_code.call(null);
+if(cljs.core.truth_(quil.core.key_coded_QMARK_.call(null,key_char))){
+return cljs.core.get.call(null,quil.core.KEY_CODES,code,new cljs.core.Keyword(null,"unknown-key","unknown-key",255305911));
+} else {
+return cljs.core.keyword.call(null,String(key_char));
+}
+});
+
+//# sourceMappingURL=core.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/core.js.map b/src/http/static/viz/1/quil/core.js.map
new file mode 100644
index 0000000..42db417
--- /dev/null
+++ b/src/http/static/viz/1/quil/core.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/core.js","sources":["core.cljc"],"lineCount":6643,"mappings":";AAAA;;;;;;AAmBA,iCAAA,jCAEEA;AAEF,yBAAA,zBAAsBC;AAEtB;;;;;;;6BAAA,7BAMEC;AANF,AAaE,IAAAC,mBAAIH;AAAJ,AAAA,oBAAAG;AAAAA;;AAEa,OAACC;;;AAIhB,AAAA,sBAAA,2CAAA,sDAAA,CAAAC,gCAAA,SAAA,uDAAA,CAAAA,gCAAA,UAAA,mDAAA,CAAAA,gCAAA,vVACCC;;AADD,wBAAA,2CAAA,0DAAA,CAAAD,gCAAA,WAAA,uDAAA,CAAAA,gCAAA,UAAA,gEAAA,CAAAA,gCAAA,cAAA,qEAAA,CAAAA,gCAAA,iBAAA,wEAAA,CAAAA,gCAAA,mBAAA,uDAAA,CAAAA,gCAAA,UAAA,kEAAA,CAAAA,gCAAA,lzBAECE;;AAFD,wBAAA,wCAAA,qDAAA,yDAAA,yDAAA,wDAAA,2DAAA,2DAAA,iEAAA,8DAAA,gEAAA,8DAAA,8DAAA,sDAAA,kDAAA,gEAAA,+DAAA,CAAAF,gCAAA,SAAA,CAAAA,gCAAA,WAAA,CAAAA,gCAAA,YAAA,CAAAA,gCAAA,UAAA,CAAAA,gCAAA,YAAA,CAAAA,gCAAA,YAAA,CAAAA,gCAAA,eAAA,CAAAA,gCAAA,cAAA,CAAAA,gCAAA,eAAA,CAAAA,gCAAA,aAAA,CAAAA,gCAAA,aAAA,CAAAA,gCAAA,UAAA,CAAAA,gCAAA,QAAA,CAAAA,gCAAA,eAAA,CAAAA,gCAAA,\/kDAGCG;;AAHD,wBAAA,2CAAA,mDAAA,CAAAH,gCAAA,QAAA,mDAAA,CAAAA,gCAAA,nPAKCI;;AALD,0BAAA,2CAAA,mDAAA,CAAAJ,gCAAA,QAAA,oDAAA,CAAAA,gCAAA,SAAA,wDAAA,CAAAA,gCAAA,xVAMCK;;AAND,0BAAA,2CAAA,yDAAA,CAAAL,gCAAA,WAAA,0DAAA,CAAAA,gCAAA,WAAA,yDAAA,CAAAA,gCAAA,WAAA,2DAAA,CAAAA,gCAAA,jdAOCM;;AAPD,yBAAA,wCAAA,gGAAA,8EAAA,+EAAA,+EAAA,2FAAA,kFAAA,gFAAA,+FAAA,2FAAA,mFAAA,gFAAA,8EAAA,2FAAA,sFAAA,kFAAA,2FAAA,CAAAN,gCAAA,+BAAA,CAAAA,gCAAA,uBAAA,CAAAA,gCAAA,sBAAA,CAAAA,gCAAA,sBAAA,CAAAA,gCAAA,4BAAA,CAAAA,gCAAA,wBAAA,CAAAA,gCAAA,uBAAA,CAAAA,gCAAA,8BAAA,CAAAA,gCAAA,6BAAA,CAAAA,gCAAA,yBAAA,CAAAA,gCAAA,uBAAA,CAAAA,gCAAA,sBAAA,CAAAA,gCAAA,4BAAA,CAAAA,gCAAA,0BAAA,CAAAA,gCAAA,uBAAA,CAAAA,gCAAA,9xEAQCO;;AARD,wBAAA,2CAAA,yDAAA,CAAAP,gCAAA,WAAA,2DAAA,CAAAA,gCAAA,YAAA,yDAAA,CAAAA,gCAAA,1WAgBCQ;;AAhBD,uBAAA,2CAAA,yDAAA,CAAAR,gCAAA,WAAA,2DAAA,CAAAA,gCAAA,YAAA,yDAAA,CAAAA,gCAAA,WAAA,0DAAA,CAAAA,gCAAA,\/cAiBCS;;AAjBD,0BAAA,2CAAA,yDAAA,CAAAT,gCAAA,WAAA,2DAAA,CAAAA,gCAAA,YAAA,yDAAA,CAAAA,gCAAA,5WAkBCU;;AAlBD,6BAAA,2CAAA,wDAAA,CAAAV,gCAAA,WAAA,uDAAA,CAAAA,gCAAA,UAAA,2DAAA,CAAAA,gCAAA,YAAA,sDAAA,CAAAA,gCAAA,7cAmBCW;;AAnBD,8BAAA,2CAAA,sDAAA,CAAAX,gCAAA,UAAA,uDAAA,CAAAA,gCAAA,UAAA,uDAAA,CAAAA,gCAAA,pWAoBCY;;AApBD,uCAAA,2CAAA,qDAAA,CAAAZ,gCAAA,SAAA,yDAAA,CAAAA,gCAAA,WAAA,uDAAA,CAAAA,gCAAA,9WAqBCa;;AArBD,qCAAA,2CAAA,oDAAA,CAAAb,gCAAA,QAAA,0DAAA,CAAAA,gCAAA,WAAA,yDAAA,CAAAA,gCAAA,WAAA,6DAAA,CAAAA,gCAAA,tdAsBCc;;AAtBD,uBAAA,2CAAA,sDAAA,CAAAd,gCAAA,UAAA,uDAAA,CAAAA,gCAAA,3PAuBCe;;AAvBD,0BAAA,2CAAA,sDAAA,CAAAf,gCAAA,UAAA,0DAAA,CAAAA,gCAAA,jQAwBCgB;;AAxBD,+BAAA,2CAAA,uDAAA,CAAAhB,gCAAA,UAAA,wDAAA,CAAAA,gCAAA,rQAyBCiB;;AAzBD,yBAAA,2CAAA,8DAAA,CAAAjB,gCAAA,cAAA,qDAAA,CAAAA,gCAAA,SAAA,yDAAA,CAAAA,gCAAA,WAAA,+DAAA,CAAAA,gCAAA,cAAA,qDAAA,CAAAA,gCAAA,SAAA,0DAAA,CAAAA,gCAAA,WAAA,uDAAA,CAAAA,gCAAA,UAAA,yDAAA,CAAAA,gCAAA,p2BA0BCkB;;AA1BD,yBAAA,2CAAA,uDAAA,CAAAlB,gCAAA,UAAA,sDAAA,CAAAA,gCAAA,UAAA,oDAAA,CAAAA,gCAAA,SAAA,sDAAA,CAAAA,gCAAA,SAAA,sDAAA,CAAAA,gCAAA,SAAA,qDAAA,CAAAA,gCAAA,3nBA2BCmB;AAIQ,AAAKC,eAAI,AAAMC;AACxB,AAAKC,oBAAW,CAAGF,eAAG;AACtB,AAAKG,qBAAW,CAAGH,eAAG;AACtB,AAAKI,uBAAW,CAAGJ,eAAG;AACtB,AAAKK,mBAAW,CAAGL,eAAG;AAEtB,AAAKM,uBAAW,CAAGN,eAAG;AACtB,AAAKO,uBAAW,CAAG,QAAcP;AAuC9B,sBAAA,wCAAA,MAAA,KAAA,MAAA,MAAA,MAAA,MAAA,KAAA,MAAA,MAAA,MAAA,KAAA,MAAA,MAAA,MAAA,KAAA,MAAA,KAAA,KAAA,MAAA,OAAA,kDAAA,uDAAA,2DAAA,kDAAA,iDAAA,gDAAA,qDAAA,iDAAA,gDAAA,oDAAA,2DAAA,gDAAA,iDAAA,kDAAA,sDAAA,gDAAA,iDAAA,iDAAA,iDAAA,znCACEQ;AAwBF;;;;;;;;;;wBAAA,xBAKEC,wDASCC;AAdH,AAeE,OAAU,AAAC\/B,8CAAmB+B;;AAGhC;;;;;;sBAAA,tBAKEC,oDAKCD;AAVH,AAWE,OAAQ,AAAC\/B,4CAAmB+B;;AAG9B;;;6BAAA,7BAMEE,kEAECC;AARH,AASE,OAAkBC,2BAAcD;;AAErC,AAAA,AAAA,wBAAA,gCAAAE,xDAAUM;AAAV,AAAA,IAAAL,qBAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,wBAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,uBAAA,EAAA,CAAA,MAAA,AAAAH,4BAAA,AAAA,KAAAI,qBAAA,AAAAJ,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAK,2DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAF;;;AAAA,AAAA,AAAA,AAAAE,6DAAA,WAAAC,gBAAAC,eAAuBO,OAASC;AAAhC,AACG,oBAAU,AAACM;AAAX;;AAAA,AAAA,OAAAL,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,6FAAA,iBAAAC,kBAC6BN,rJAgsE5B,AAAAmW;AAjsED,AAAA,OAAA9V,+CAAAC,rBAisEC,AAAA6V;KAhsEqClW;;;;AAFzC,AAAA,AAAAV,gDAAA;;AAAA,AAAA,AAAAA,0CAAA,WAAAG;AAAA,AAAA,IAAAC,UAAA,AAAAC,0BAAAF;IAAAA,cAAA,AAAAG,yBAAAH;IAAAI,UAAA,AAAAF,0BAAAF;IAAAA,cAAA,AAAAG,yBAAAH;IAAAK,UAAA,AAAAH,0BAAAF;IAAAA,cAAA,AAAAG,yBAAAH;AAAA,AAAA,OAAAH,2DAAAI,QAAAG,QAAAC,QAAAL;;;AAAA;AAAA,AAAA,wCAAA,xCAAUH;AAIV;;;;;;;;;uBAAA,vBAKEiB;AALF,AAce,OAAG,AAAC3D;;AAEnB,AAAA;;;;;;;;;kBAAA,0BAAAoC,5CAKE0B;AALF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAtB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAsB,cAAA,CAAA,UAAArB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAsB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC;;;KAAA;AAAA,OAAAA,8CAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAC,MAAA,6CAAA,+DAAA,AAAAH;;;;;AAAA,AAAA,gDAAA,hDAKEE;AALF,AAAA,OAAAE,0BAaO,AAACL;;;AAbR,AAAA,gDAAA,hDAKEG,2DAUEG;AAfJ,AAeS,IAAMC,QAAM,AAACJ;AAAb,AACE,GAAU,AAACK,oCAAUD,MAAMD;AAA3B;AAAA,AACE,MACgB,AAACF,MAAS,6CAAA,+EAAuCE;;;AACnE,OAACG,wBAAIF,MAAMD;;;AAnBtB,AAAA,0CAAA,1CAKEH;;AALF,AAqBA,AAAA;;;;;;;4BAAA,oCAAA1B,hEAKEiC;AALF,AAAA,IAAAhC,qBAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,wBAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,uBAAA,EAAA,CAAA,MAAA,AAAAH,4BAAA,AAAA,KAAAI,qBAAA,AAAAJ,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAgC,+DAAA7B;;;AAAA,AAAA,AAAA,AAAA6B,iEAAA,WAWKE;AAXL,AAYE,IAAMC,cAAO,AAACb;AAAd,AACE,oBAAA,AAAAK,0BAAWQ;AAAX;;AAAA,AACE,IAAMC,YAAU,AAACC,0BAAMC,mBAASJ;AAAhC,AACE,OAACK,gCAAOJ,YAAOC;;;;AAfvB,AAAA,AAAAJ,oDAAA;;AAAA,AAAA,AAAAA,8CAAA,WAAAC;AAAA,AAAA,OAAAD,+DAAA,AAAAf,wBAAAgB;;;AAAA,AA4CA;;;;;gBAAA,hBAMEO,wCAICC;AAVH,AAgBK,OAAM,AAAC9E,0CAAmB8E;;AAE\/B;;;;;iBAAA,jBAMEC,0CAICD;AAVH,AAYW,OAAO,AAAC9E,2CAAmB8E;;AAEtC;;;kBAAA,lBAMEE,4CAECC;AARH,AASE,OAAQ,AAACnF,4CAAkB,AAACoF,kCAAcD;;AAE5C,AAAA;;;;;;;;;0BAAA,kCAAA7C,5DAMEiD;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA7C,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA6C,cAAA,CAAA,UAAA5C;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA6C,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,sDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAtB,MAAA,6CAAA,+DAAA,AAAAoB;;;;;AAAA,AAAA,wDAAA,xDAMEE,mEAQEC;AAdJ,AAcU,OAAU,AAACxF,8CAAyBwF;;;AAd9C,AAAA,wDAAA,xDAMED,mEASEE,EAAEC,EAAEC;AAfR,AAeW,OAAU,AAAC3F,8CAAyByF,EAAUC,EAAUC;;;AAfnE,AAAA,kDAAA,lDAMEJ;;AANF,AAiBA;;;;;;;wBAAA,xBAMEK,wDAMCC;AAZH,AAaE,OAAU,AAAC7F,8CAAkB,OAAA,NAAK6F;;AAEpC,AAAA;;;;;;;;;oBAAA,4BAAAvD,hDAME0D;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAtD,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAsD,cAAA,CAAA,UAAArD;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAsD,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,gDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,gDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA\/B,MAAA,6CAAA,+DAAA,AAAA6B;;;;;AAAA,AAAA,kDAAA,lDAMEE,6DAQEH;AAdJ,AAgBY,OAACN,kCAAcM;;;AAhB3B,AAAA,kDAAA,lDAMEG,6DAWEP,EAAEC,EAAEC;AAjBR,AAiBW,OAACJ,kCAAcE,EAAEC,EAAEC;;;AAjB9B,AAAA,4CAAA,5CAMEK;;AANF,AAmBA,AAAA;;;;;;;;;;0BAAA,kCAAA1D,5DAME6D;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAzD,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAyD,cAAA,CAAA,UAAAxD;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAyD,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAlC,MAAA,6CAAA,+DAAA,AAAAgC;;;;;AAAA,AAAA,wDAAA,xDAMEE,mEASEC,IAAIC,MAAMC;AAfd,AAgBK,OAAe,AAACtG,mDAAyBoG,IAAYC,MAAcC;;;AAhBxE,AAAA,wDAAA,xDAMEH,mEAWEC,IAAIC,MAAMC,KAAKb,EAAEC,EAAEC;AAjBvB,AAkBK,OAAe,AAAC3F,mDAAyBoG,IAAYC,MAAcC,KAC7Cb,EAAUC,EAAUC;;;AAnB\/C,AAAA,kDAAA,lDAMEQ;;AANF,AAqBA;;;;;;yBAAA,zBAMEI,0DAUEC,IAAIC,IAAIC,IAAIC,IACZC,IAAIC,IAAIC,IAAIC,IACZC,IAAIC,IAAIC,IAAIC,IACZC,IAAIC,IAAIC,IAAIC;AAnBhB,AAoBK,OAAc,AAACvH,kDACMwG,IAAYC,IAAYC,IAAYC,IACpCC,IAAYC,IAAYC,IAAYC,IACpCC,IAAYC,IAAYC,IAAYC,IACpCC,IAAYC,IAAYC,IAAYC;;AAE9D;;;;;;;gBAAA,hBAMEC,wCAME\/B,EAAEC,EAAE+B,MAAMC,OAAOC,MAAMC;AAZ3B,AAaI,OAAM,AAAC5H,0CAAyByF,EAAUC,EAAU+B,MAAcC,OACvDC,MAAcC;;AAQ7B;;;;;iBAAA,jBAMEC,0CAIC7C;AAVH,AAYW,OAAO,AAAC9E,2CAAmB8E;;AAEtC;;;;;;iBAAA,jBAME8C,0CAKC9C;AAXH,AAaW,OAAO,AAAC9E,2CAAmB8E;;AAEtC;;;;;;;;;kBAAA,lBAME+C,4CAQCrC,EAAED;AAdL,AAgBW,OAAQ,AAACvF,4CAAmBwF,EAAED;;AAEzC;;;;;;;;;;;;4BAAA,5BAMEuC;AANF,AAmBW,OAACxE,wBAAI,AAAOyE;;AAEvB,AAAA;;;;;;;;;;6BAAA,qCAAA3F,lEAME8F;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA1F,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA0F,cAAA,CAAA,UAAAzF;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA0F,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,yDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,yDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,yDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,yDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAnE,MAAA,6CAAA,+DAAA,AAAAiE;;;;;AAAA,AAAA,2DAAA,3DAMEE,sEASE5C;AAfJ,AAeU,OAAa,AAACxF,iDAAyBwF;;;AAfjD,AAAA,2DAAA,3DAME4C,sEAUE5C,KAAK6C;AAhBT,AAgBgB,OAAa,AAACrI,iDAAyBwF,KAAa6C;;;AAhBpE,AAAA,2DAAA,3DAMED,sEAWEE,EAAEC,EAAEC;AAjBR,AAiBW,OAAa,AAACxI,iDAAyBsI,EAAUC,EAAUC;;;AAjBtE,AAAA,2DAAA,3DAMEJ,sEAYEE,EAAEC,EAAEC,EAAEC;AAlBV,AAkBa,OAAa,AAACzI,iDAAyBsI,EAAUC,EAAUC,EAAUC;;;AAlBlF,AAAA,qDAAA,rDAMEL;;AANF,AAoBA,AAAA;;;;;;;;;;2BAAA,mCAAA9F,9DAMEsG;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAlG,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAkG,cAAA,CAAA,UAAAjG;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAkG,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,uDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,uDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA3E,MAAA,6CAAA,+DAAA,AAAAyE;;;;;AAAA,AAAA,yDAAA,zDAMEE,oEASE\/C;AAfJ,AAeS,OAAa,AAAC7F,iDAAkB,AAACoF,kCAAcS;;;AAfxD,AAAA,yDAAA,zDAME+C,oEAUE\/C,IAAIwC;AAhBR,AAgBe,OAAa,AAACrI,iDAAkB,AAACoF,kCAAcS,KAAYwC;;;AAhB1E,AAAA,mDAAA,nDAMEO;;AANF,AAkBA,AAAA;;;;;;;;;;uBAAA,+BAAAtG,tDAMEyG;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAArG,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAqG,cAAA,CAAA,UAAApG;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAqG,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,mDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA9E,MAAA,6CAAA,+DAAA,AAAA4E;;;;;AAAA,AAAA,qDAAA,rDAMEE,gEAUWlD;AAhBb,AAgBkB,OAAa,AAAC7F,iDAAkB6F;;;AAhBlD,AAAA,qDAAA,rDAMEkD,gEAYWlD,IAAIwC;AAlBjB,AAkBwB,OAAa,AAACrI,iDAAkB6F,IAAIwC;;;AAlB5D,AAAA,qDAAA,rDAMEU,gEAaET,EAAEC,EAAEC;AAnBR,AAmBW,OAACJ,qCAAiBE,EAAEC,EAAEC;;;AAnBjC,AAAA,qDAAA,rDAMEO,gEAcET,EAAEC,EAAEC,EAAEC;AApBV,AAoBa,OAACL,qCAAiBE,EAAEC,EAAEC,EAAEC;;;AApBrC,AAAA,+CAAA,\/CAMEM;;AANF,AAsBA;;;;;6BAAA,7BAMEC,kEAISC;AAVX,AAWE,OAAa,AAACjJ,iDAAkBiJ;;AAElC;;;;;;;;;yBAAA,zBAMEC;AANF,AAeE,OAAc,AAAClJ;;AAEjB;;;;;;0BAAA,1BAMEmJ;AANF,AAYE,OAAe,AAACnJ;;AAqBlB,AAAA;;;;;;;;;;;;;;;;;;;;;;wBAAA,gCAAAsC,xDAMEgH;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA5G,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA4G,cAAA,CAAA,UAAA3G;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA4G,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC;;;KAAA;AAAA,OAAAA,oDAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAArF,MAAA,6CAAA,+DAAA,AAAAmF;;;;;AAAA,AAAA,sDAAA,tDAMEE;AANF,AA2BM,OAAa,AAACtJ;;;AA3BpB,AAAA,sDAAA,tDAMEsJ,iEAsBEC;AA5BJ,AA6BK,IAAMA,WAAK,AAACC,yCAAuBD,KAAKlJ;AAAxC,AACE,OAAa,AAACL,iDAAkB,YAAA,XAAKuJ;;;AA9B5C,AAAA,gDAAA,hDAMED;;AANF,AAgCA,AAAA;;;;;;;mBAAA,2BAAAhH,9CAMEqH;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAjH,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAiH,cAAA,CAAA,UAAAhH;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAiH,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,gDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA1F,MAAA,6CAAA,+DAAA,AAAAwF;;;;;AAAA,AAAA,iDAAA,jDAMEE,4DAMEC,GAAGC,GAAGC,IAAIC,IAAIC,IAAIC,IAAIC,GAAGC;AAZ7B,AAaK,OAAS,AAACnK,6CACM4J,GAAWC,GACXC,IAAYC,IACZC,IAAYC,IACZC,GAAWC;;;AAjBhC,AAAA,kDAAA,lDAMER,6DAYEC,GAAGC,GAAGO,GAAGN,IAAIC,IAAIM,IAAIL,IAAIC,IAAIK,IAAIJ,GAAGC,GAAGI;AAlB3C,AAmBK,OAAS,AAACvK,6CACM4J,GAAWC,GAAWO,GACtBN,IAAYC,IAAYM,IACxBL,IAAYC,IAAYK,IACxBJ,GAAWC,GAAWI;;;AAvB3C,AAAA,2CAAA,3CAMEZ;;AANF,AAyBA;;;;;;0BAAA,1BAMEa,4DAKCC;AAXH,AAYE,OAAe,AAACzK,mDAAkB,UAAA,TAAKyK;;AAEzC;;;;;;;yBAAA,zBAMEC,0DAMCjC,EAAED,EAAEmC,EAAEC,EAAEC;AAZX,AAaE,OAAc,AAAC7K,kDAAyByI,EAAUD,EAAUmC,EACvCC,EAAUC;;AAEjC;;;;2BAAA,3BAMEC,8DAGCrC,EAAED,EAAEmC,EAAEC,EAAEC;AATX,AAUE,OAAgB,AAAC7K,oDAAyByI,EAAUD,EAAUmC,EACvCC,EAAUC;;AAEnC,AAAA;;;;;;;;;;0BAAA,kCAAAvI,5DAME2I;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAvI,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAuI,cAAA,CAAA,UAAAtI;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAuI,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAhH,MAAA,6CAAA,+DAAA,AAAA8G;;;;;AAAA,AAAA,wDAAA,xDAMEE,mEASEnB,IAAIC,IAAIC,IAAIC,IAAIxE,EAAEC;AAftB,AAgBK,OAAe,AAAC1F,mDACM8J,IAAYC,IACZC,IAAYC,IACZxE,EAAUC;;;AAnBrC,AAAA,wDAAA,xDAMEuF,mEAcEnB,IAAIC,IAAIM,IAAIL,IAAIC,IAAIK,IAAI7E,EAAEC,EAAEC;AApBhC,AAqBK,OAAe,AAAC3F,mDACM8J,IAAYC,IAAYM,IACxBL,IAAYC,IAAYK,IACxB7E,EAAUC,EAAUC;;;AAxB\/C,AAAA,kDAAA,lDAMEsF;;AANF,AA0BA,AAAA;;;;;mBAAA,2BAAA3I,9CAME8I;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA1I,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA0I,cAAA,CAAA,UAAAzI;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA0I,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,+CAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAnH,MAAA,6CAAA,+DAAA,AAAAiH;;;;;AAAA,AAAA,iDAAA,jDAMEE,4DAIEC;AAVJ,AAYY,OAAS,AAACnL,6CAAmBmL;;;AAZzC,AAAA,iDAAA,jDAMED,4DAOEC,IAAIC;AAbR,AAeY,OAAS,AAACpL,6CAAmBmL,IAAIC;;;AAf7C,AAAA,2CAAA,3CAMEF;;AANF,AAiBA,AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAA,0BAAA9I,5CAMEmJ;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA\/I,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA+I,cAAA,CAAA,UAAA9I;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA+I,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,8CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAxH,MAAA,6CAAA,+DAAA,AAAAsH;;;;;AAAA,AAAA,gDAAA,hDAMEE,2DAkCEhG,EAAEC,EAAE+B,MAAMC,OAAOgE,GAAGC,GAAGC,OAAOC,QAAQtC;AAxC1C,AAyCG,OAACkC,0BAAM,AAACzL,sCAAkB,AAACA,sCAAkByF,EAAEC,EAAE+B,MAAMC,OAAOgE,GAAGC,GAAGC,OAAOC,QAAQtC;;;AAzCtF,AAAA,iDAAA,jDAMEkC,4DAoCUK,QAAQrG,EAAEC,EAAE+B,MAAMC,OAAOgE,GAAGC,GAAGC,OAAOC,QAAQtC;AA1C1D,AA2CG,OAACkC,0BAAMK,QAAQ,AAAC9L,sCAAkByF,EAAEC,EAAE+B,MAAMC,OAAOgE,GAAGC,GAAGC,OAAOC,QAAQtC;;;AA3C3E,AAAA,iDAAA,jDAMEkC,4DAsCUK,QAAgBC,SAAStG,EAAEC,EAAE+B,MAAMC,OAAOgE,GAAGC,GAAGC,OAAOC,QAAQtC;AA5C3E,AA6CK,IAAMA,WAAK,AAACC,yCAAuBD,KAAKjJ;AAAxC,AACE,OAAQyL,eAASD,QAAQ,KAAA,JAAKrG,SAAG,KAAA,JAAKC,SAAG,SAAA,RAAK+B,aAAO,UAAA,TAAKC,cAClD,MAAA,LAAKgE,UAAI,MAAA,LAAKC,UAAI,UAAA,TAAKC,cAAQ,WAAA,VAAKC,eAAS,YAAA,XAAKtC;;;AA\/CjE,AAAA,0CAAA,1CAMEkC;;AANF,AAiDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAAA,xBAOEO,wDA+BCC,GAAGC,GAAG3C;AAtCT,AAuCE,IAAMA,WAAK,AAACC,yCAAuBD,KAAKjJ;AAAxC,AAEW,OAAa,AAACN,iDAAkBiM,GAAGC,GAAG3C;;AAqCnD;;;;iBAAA,jBAME4C,0CAGChH;AATH,AAUE,OAAO,AAACnF,2CAAkB,AAACoF,kCAAcD;;AAE3C,AAAA;;;gBAAA,wBAAA7C,xCAMEgK;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA5J,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA4J,cAAA,CAAA,UAAA3J;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA4J,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,4CAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,4CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAArI,MAAA,6CAAA,+DAAA,AAAAmI;;;;;AAAA,AAAA,8CAAA,9CAMEE,yDAEEC;AARJ,AAQU,OAAM,AAACvM,0CAAyBuM;;;AAR1C,AAAA,8CAAA,9CAMED,yDAGE7E,MAAMC,OAAO8E;AATjB,AASwB,OAAM,AAACxM,0CAAyByH,MAAcC,OAAe8E;;;AATrF,AAAA,wCAAA,xCAMEF;;AANF,AAWA;;;uBAAA,vBAMEG,sDAECtH;AARH,AASE,OAAa,AAACnF,iDAAkB,AAACoF,kCAAcD;;AAEjD,AAAA;;;;;;;;;;;;;;;;;;;;;;mBAAA,2BAAA7C,9CAMEsK;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAlK,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAkK,cAAA,CAAA,UAAAjK;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAkK,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA3I,MAAA,6CAAA,+DAAA,AAAAyI;;;;;AAAA,AAAA,iDAAA,jDAMEE;AANF,AA2BM,OAAS,AAAC5M;;;AA3BhB,AAAA,iDAAA,jDAME4M,4DAsBEC,KAAKC,KAAKC,KAAKC,QAAQC,QAAQC,QAAQC,IAAIC,IAAIC;AA5BnD,AA6BK,OAAS,AAACrN,6CAAyB6M,KAAaC,KAAaC,KAC7CC,QAAgBC,QAAgBC,QAChCC,IAAYC,IAAYC;;;AA\/B7C,AAAA,2CAAA,3CAMET;;AANF,AAiCA;;;;;iBAAA,jBAMEU,0CAICtI;AAVH,AAYW,OAAO,AAAC9E,2CAAmB8E;;AAmCtC,AAAA;;;;;;;;;;;;kBAAA,0BAAA1C,5CAMEmL;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA\/K,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA+K,cAAA,CAAA,UAAA9K;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA+K,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,8CAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,8CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,8CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,8CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAxJ,MAAA,6CAAA,+DAAA,AAAAsJ;;;;;AAAA,AAAA,gDAAA,hDAMEE,2DAWEjI;AAjBJ,AAiBU,OAAQ,AAACxF,4CAAyBwF;;;AAjB5C,AAAA,gDAAA,hDAMEiI,2DAYEjI,KAAK6C;AAlBT,AAkBgB,OAAQ,AAACrI,4CAAyBwF,KAAa6C;;;AAlB\/D,AAAA,gDAAA,hDAMEoF,2DAaEnF,EAAEC,EAAEC;AAnBR,AAmBW,OAAQ,AAACxI,4CAAyBsI,EAAUC,EAAUC;;;AAnBjE,AAAA,gDAAA,hDAMEiF,2DAcEnF,EAAEC,EAAEC,EAAEC;AApBV,AAoBa,OAAQ,AAACzI,4CAAyBsI,EAAUC,EAAUC,EAAUC;;;AApB7E,AAAA,0CAAA,1CAMEgF;;AANF,AAsBA,AAAA;;;;;;;;;;;uBAAA,+BAAAnL,tDAMEsL;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAlL,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAkL,cAAA,CAAA,UAAAjL;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAkL,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,mDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA3J,MAAA,6CAAA,+DAAA,AAAAyJ;;;;;AAAA,AAAA,qDAAA,rDAMEE,gEAUErE;AAhBJ,AAiBK,IAAMA,WAAK,AAACC,yCAAuBD,KAAKhJ;AAAxC,AACE,OAAY,AAACP,gDAAkB,YAAA,XAAKuJ;;;AAlB3C,AAAA,qDAAA,rDAMEqE,gEAaErE,KAAKsE;AAnBT,AAoBK,IAAMtE,WAAK,AAACC,yCAAuBD,KAAKhJ;AAAxC,AACE,OAAY,AAACP,gDAAkB,YAAA,XAAKuJ,gBAAasE;;;AArBxD,AAAA,qDAAA,rDAMED,gEAgBErE,KAAKuE,MAAMC,MAAMC;AAtBrB,AAuBK,IAAMzE,WAAK,AAACC,yCAAuBD,KAAKhJ;AAAxC,AACE,OAAY,AAACP,gDAAkB,YAAA,XAAKuJ,gBAAauE,MAAcC,MAAcC;;;AAxBpF,AAAA,qDAAA,rDAMEJ,gEAmBErE,KAAKuE,MAAMC,MAAMC,MAAMC;AAzB3B,AA0BK,IAAM1E,WAAK,AAACC,yCAAuBD,KAAKhJ;AAAxC,AACE,OAAY,AAACP,gDAAkB,YAAA,XAAKuJ,gBAAauE,MAAcC,MAAcC,MAAcC;;;AA3BlG,AAAA,+CAAA,\/CAMEL;;AANF,AAwDA;;;sBAAA,tBAMEM,oDAECC,IAAIC,IAAIC;AARX,AAaW,OAAY,AAACnO,gDAAmBiO,IAAIC,IAAIC;;AAEnD,AAAA;;;;;;;;;iBAAA,yBAAA\/L,1CAMEkM;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA9L,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA8L,cAAA,CAAA,UAAA7L;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA8L,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAvK,MAAA,6CAAA,+DAAA,AAAAqK;;;;;AAAA,AAAA,+CAAA,WAAAG,QAAAC,lEAMEF;AANF,AAAA,IAAAG,YAAAF;SAAA,AAAAG,wBAAAD,UAAA,IAAA,3CAcKW;SAdL,AAAAV,wBAAAD,UAAA,IAAA,3CAcQY;aAdR,AAAAX,wBAAAD,UAAA,IAAA,\/CAcWa;cAdX,AAAAZ,wBAAAD,UAAA,IAAA,hDAckBc;IAdlBZ,YAAAH;SAAA,AAAAE,wBAAAC,UAAA,IAAA,3CAc4BnD;SAd5B,AAAAkD,wBAAAC,UAAA,IAAA,3CAc+BlD;aAd\/B,AAAAiD,wBAAAC,UAAA,IAAA,\/CAckCjD;cAdlC,AAAAgD,wBAAAC,UAAA,IAAA,hDAcyChD;AAdzC,AAeG,OAAO,AAAC7L,2CACD,MAAA,LAAKsP,UAAI,MAAA,LAAKC,UAAI,UAAA,TAAKC,cAAQ,WAAA,VAAKC,eACpC,MAAA,LAAK\/D,UAAI,MAAA,LAAKC,UAAI,UAAA,TAAKC,cAAQ,WAAA,VAAKC;;;AAjB9C,AAAA,+CAAA,mBAAAiD,QAAAC,1EAMEP,0DAaU1C;AAnBZ,AAAA,IAAAkD,YAAAF;SAAA,AAAAF,wBAAAI,UAAA,IAAA,3CAmBqBM;SAnBrB,AAAAV,wBAAAI,UAAA,IAAA,3CAmBwBO;aAnBxB,AAAAX,wBAAAI,UAAA,IAAA,\/CAmB2BQ;cAnB3B,AAAAZ,wBAAAI,UAAA,IAAA,hDAmBkCS;IAnBlCR,YAAAF;SAAA,AAAAH,wBAAAK,UAAA,IAAA,3CAmB4CvD;SAnB5C,AAAAkD,wBAAAK,UAAA,IAAA,3CAmB+CtD;aAnB\/C,AAAAiD,wBAAAK,UAAA,IAAA,\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\/U;;;AApBjC,AAAA,+CAAA,\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\/CAMEF,0DASE\/O,GAAGC,GAAGK,GAAGC;AAfb,AAeiB,OAAO,AAACnK,2CAAyB4J,GAAWC,GAAWK,GAAWC;;;AAfnF,AAAA,+CAAA,\/CAMEwO,0DAUE\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\/C,AAAA,+CAAA,\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\/D,AAAA,+CAAA,\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\/CAMEE,0DAYU\/E,EAAE1b,EAAEC;AAlBhB,AAmBG,oBAAU,AAAC8f,mCAAS,AAACxlB;AAArB;;AAAA,AACE,OAAO,AAACA,2CAAkBmhB,EAAS1b,EAAUC;;;;AApBlD,AAAA,+CAAA,\/CAMEwgB,0DAeU\/E,EAAE1b,EAAEC,EAAEC;AArBlB,AAsBG,oBAAU,AAAC6f,mCAAS,AAACxlB;AAArB;;AAAA,AACE,OAAO,AAACA,2CAAkBmhB,EAAS1b,EAAUC,EAAUC;;;;AAvB5D,AAAA,+CAAA,\/CAMEugB,0DAkBU\/E,EAAEvX,GAAGC,GAAGK,GAAGC;AAxBvB,AAyBG,oBAAU,AAACqb,mCAAS,AAACxlB;AAArB;;AAAA,AACE,OAAO,AAACA,2CAAkBmhB,EAASvX,GAAWC,GAAWK,GAAWC;;;;AA1BzE,AAAA,yCAAA,zCAME+b;;AANF,AA4BA,AAAA;;;;;;;;;;;;;;;;;;;;;;;;uBAAA,+BAAA5jB,tDAME+jB;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA3jB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA2jB,cAAA,CAAA,UAAA1jB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA2jB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,mDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAApiB,MAAA,6CAAA,+DAAA,AAAAkiB;;;;;AAAA,AAAA,qDAAA,rDAMEE,gEAuBEC;AA7BJ,AA8BK,IAAMA,YAAM,AAAC9c,yCAAuB8c,MAAMtlB;AAA1C,AACE,OAAY,AAAChB,gDAAkB,aAAA,ZAAKsmB;;;AA\/B3C,AAAA,qDAAA,rDAMED,gEA0BEE,QAAQC;AAhCZ,AAiCK,IAAMD,cAAQ,AAAC\/c,yCAAuB+c,QAAQvlB;IACxCwlB,cAAQ,AAAChd,yCAAuBgd,QAAQvlB;AAD9C,AAEE,OAAY,AAACjB,gDAAkB,eAAA,dAAKumB,mBAAS,eAAA,dAAKC;;;AAnCzD,AAAA,+CAAA,\/CAMEH;;AANF,AAqCA;;;;;;wBAAA,xBAMEI;AANF,AAYE,OAAa,AAACzmB;;AAEhB;;;;;;yBAAA,zBAME0mB;AANF,AAYE,OAAc,AAAC1mB;;AAEjB,AAAA;;;;;;;;;;;;;;;;;;sBAAA,8BAAAsC,pDAMEukB;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAnkB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAmkB,cAAA,CAAA,UAAAlkB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAmkB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,kDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA5iB,MAAA,6CAAA,+DAAA,AAAA0iB;;;;;AAAA,AAAA,oDAAA,pDAMEE,+DAiBSC;AAvBX,AAuBiB,OAAW,AAAC9mB,+CAAkB8mB;;;AAvB\/C,AAAA,oDAAA,pDAMED,+DAkBSC,KAAKva;AAxBhB,AAwBsB,OAAW,AAACvM,+CAAkB8mB,KAAK,QAAA,PAAKva;;;AAxB9D,AAAA,8CAAA,9CAMEsa;;AANF,AA0BA;;;;yBAAA,zBAMEE,0DAGCC;AATH,AAUE,OAAc,AAAChnB,kDAAyBgnB;;AAE1C;;;;;;;;;;;;;;;;;;;;sBAAA,tBAMEC,oDAmBC1d;AAzBH,AA0BE,IAAMA,WAAK,AAACC,yCAAuBD,KAAKrI;AAAxC,AACE,OAAW,AAAClB,+CAAkB,YAAA,XAAKuJ;;AAEvC;;;;;sBAAA,tBAME2d,oDAIC3a;AAVH,AAWE,OAAW,AAACvM,+CAAyBuM;;AAEvC;;;;;;;;;oBAAA,pBAME4a,gDASUle;AAfZ,AAgBE,OAAU,AAACjJ,8CAAkBiJ;;AAE\/B;;;;;;;;;;;yBAAA,zBAMEme,0DAUC7d;AAhBH,AAiBE,IAAMA,WAAK,AAACC,yCAAuBD,KAAKpI;AAAxC,AACE,OAAc,AAACnB,kDAAkB,YAAA,XAAKuJ;;AAiB1C;;;uBAAA,vBAME8d,sDAESC;AARX,AASE,OAAY,AAACtnB,gDAAkBsnB;;AAEjC,AAAA;;;;;;;;;;;;;;;uBAAA,+BAAAhlB,tDAMEmlB;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAA\/kB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAA+kB,cAAA,CAAA,UAAA9kB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA+kB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,mDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,mDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAxjB,MAAA,6CAAA,+DAAA,AAAAsjB;;;;;AAAA,AAAA,qDAAA,rDAMEE,gEAcEjiB;AApBJ,AAoBU,OAAO,AAACxF,2CAAyBwF;;;AApB3C,AAAA,qDAAA,rDAMEiiB,gEAeEjiB,KAAK6C;AArBT,AAqBgB,OAAO,AAACrI,2CAAyBwF,KAAa6C;;;AArB9D,AAAA,qDAAA,rDAMEof,gEAgBEnf,EAAEC,EAAEC;AAtBR,AAsBW,OAAO,AAACxI,2CAAyBsI,EAASC,EAAUC;;;AAtB\/D,AAAA,qDAAA,rDAMEif,gEAiBEnf,EAAEC,EAAEC,EAAEC;AAvBV,AAuBa,OAAO,AAACzI,2CAAyBuI,EAAUA,EAAUC,EAAUC;;;AAvB5E,AAAA,+CAAA,\/CAMEgf;;AANF,AAyBA,AAAA;;;;;;;;;;;;;;;qBAAA,6BAAAnlB,lDAMEslB;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAllB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAklB,cAAA,CAAA,UAAAjlB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAklB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,iDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA3jB,MAAA,6CAAA,+DAAA,AAAAyjB;;;;;AAAA,AAAA,mDAAA,nDAMEE,8DAcE\/hB;AApBJ,AAoBS,OAAO,AAAC7F,2CAAkB,AAACoF,kCAAcS;;;AApBlD,AAAA,mDAAA,nDAME+hB,8DAeE\/hB,IAAIwC;AArBR,AAqBe,OAAO,AAACrI,2CAAkB,AAACoF,kCAAcS,KAAYwC;;;AArBpE,AAAA,6CAAA,7CAMEuf;;AANF,AAuBA,AAAA;;;;;;;;;;;;;;;iBAAA,yBAAAtlB,1CAMEylB;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAArlB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAqlB,cAAA,CAAA,UAAAplB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAqlB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,6CAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA9jB,MAAA,6CAAA,+DAAA,AAAA4jB;;;;;AAAA,AAAA,+CAAA,\/CAMEE,0DAeWliB;AArBb,AAqBkB,OAAO,AAAC7F,2CAAkB6F;;;AArB5C,AAAA,+CAAA,\/CAMEkiB,0DAiBWliB,IAAIwC;AAvBjB,AAuBwB,OAAO,AAACrI,2CAAkB6F,IAAIwC;;;AAvBtD,AAAA,+CAAA,\/CAME0f,0DAkBEzf,EAAEC,EAAEC;AAxBR,AAwBW,OAACif,+BAAWnf,EAAEC,EAAEC;;;AAxB3B,AAAA,+CAAA,\/CAMEuf,0DAmBEzf,EAAEC,EAAEC,EAAEC;AAzBV,AAyBa,OAACgf,+BAAWnf,EAAEC,EAAEC,EAAEC;;;AAzB\/B,AAAA,yCAAA,zCAMEsf;;AANF,AA2BA,AAAA;;;;;;;;;;;;sBAAA,8BAAAzlB,pDAME4lB;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAxlB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAwlB,cAAA,CAAA,UAAAvlB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAwlB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,kDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAjkB,MAAA,6CAAA,+DAAA,AAAA+jB;;;;;AAAA,AAAA,oDAAA,pDAMEE,+DAWEC;AAjBJ,AAiBO,OAACvjB,0BAAMsjB,oBAAUC;;;AAjBxB,AAAA,oDAAA,pDAMED,+DAYEE,GAAGC;AAlBP,AAkBW,OAAY,AAACroB,gDAAyBooB,GAAWC;;;AAlB5D,AAAA,oDAAA,pDAMEH,+DAaEE,GAAGC,GAAGC;AAnBV,AAmBc,OAAY,AAACtoB,gDAAyBooB,GAAWC,GAAWC;;;AAnB1E,AAAA,8CAAA,9CAMEJ;;AANF,AAqBA;;;;;;qBAAA,rBAMEK,kDAKC3e,GAAGC,GAAGK,GAAGC,GAAGuH,GAAGC;AAXlB,AAYE,OAAW,AAAC3R,+CACM4J,GAAWC,GACXK,GAAWC,GACXuH,GAAWC;;AAE\/B;;;;qBAAA,rBAME6W,kDAGCC;AATH,AAWW,OAAW,AAACvoB,+CAAmB,6CAAKuoB;;AAE\/C;;;;kBAAA,lBAKEC,4CAGCC;AARH,AAUW,OAAQ,AAACzoB,4CAAmB,6CAAKyoB;;AAE5C,AAAA;;;;;;;;;;;;;0BAAA,kCAAArmB,5DAMEwmB;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAApmB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAomB,cAAA,CAAA,UAAAnmB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAomB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC;;;KAAA;AAAA,OAAAA,sDAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA7kB,MAAA,6CAAA,+DAAA,AAAA2kB;;;;;AAAA,AAAA,wDAAA,xDAMEE;AANF,AAkBM,OAACA,kCAAc,AAAC9oB;;;AAlBtB,AAAA,wDAAA,xDAME8oB,mEAiBK7f;AAvBP,AAwBM,IAAA8f,0BAAqB,AAAoB9f;AAAzC,AAAA,oBAAA8f;AAAA,AAAA,qBAAAA,jBAAWzL;AAAX,AACE,AAAM,AAAUrU,eAAKqU;;AACrB,uBAAA,vBAAM,AAAoBrU;;AAF5B;;AAGA,OAAeA;;;AA3BrB,AAAA,kDAAA,lDAME6f;;AANF,AA6BA,AAAA;;;;;;;;;;;;;;;;mBAAA,2BAAAxmB,9CAME4mB;AANF,AAAA,IAAAF,WAAA;AAAA,AAAA,IAAAxmB,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAwmB,cAAA,CAAA,UAAAvmB;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAwmB,UAAA,AAAAD;AAAA,AAAA,QAAAC;KAAA;AAAA,OAAAC,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAjlB,MAAA,6CAAA,+DAAA,AAAA+kB;;;;;AAAA,AAAA,iDAAA,jDAMEE,4DAeEzjB,EAAEC;AArBN,AAqBS,OAAS,AAAC1F,6CAAyByF,EAAUC;;;AArBtD,AAAA,iDAAA,jDAMEwjB,4DAgBEzjB,EAAEC,EAAEC;AAtBR,AAsBW,OAAS,AAAC3F,6CAAyByF,EAAUC,EAAUC;;;AAtBlE,AAAA,iDAAA,jDAMEujB,4DAiBEzjB,EAAEC,EAAEyjB,EAAEhB;AAvBV,AAuBa,OAAS,AAACnoB,6CAAyByF,EAAUC,EAAUyjB,EAAUhB;;;AAvB9E,AAAA,iDAAA,jDAMEe,4DAkBEzjB,EAAEC,EAAEC,EAAEwjB,EAAEhB;AAxBZ,AAyBK,OAAS,AAACnoB,6CAAyByF,EAAUC,EAAUC,EAAUwjB,EAAUhB;;;AAzBhF,AAAA,2CAAA,3CAMEe;;AANF,AA2BA;;;iBAAA,jBAMEE;AANF,AAUW,OAAO,AAAClpB;;AAEnB;;;;kBAAA,lBAOEmpB;AAPF,AAWE,OAAS,AAACnpB;;AAEZ,AAAA,AAAA;;;;;;;;sBAAA,8BAAAoC,pDAMGgnB;AANH,AAAA,IAAA\/mB,qBAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,wBAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,uBAAA,EAAA,CAAA,MAAA,AAAAH,4BAAA,AAAA,KAAAI,qBAAA,AAAAJ,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAA+mB,yDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA5mB;;;AAAA,AAAA,AAAA,AAAA4mB,2DAAA,WAAAzmB,gBAAAC,eAaI6mB,UAAYrmB;iHA\/pEZ,AAAAkW,mQAAA,AAAAA,gQAAA,AAAAA,pnBAkpEJ,AAAA,OAAAjW,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,yEAAA,iBAAAC,kBAAA,AAAA0P,wBAAA,AAAA9P,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,8FAAA,iBAAAC,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA;iCAlpEI,AAAA8V,jCAkpEJ,AAAA,OAAA9V,+CAAAC;;iCAlpEI,AAAA6V,jCAkpEJ,AAAA,OAAA9V,+CAAAC;kJAlpEI,AAAA6V,4HAAA,AAAAA,zQAkpEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,6EAAA,AAAAA,+CAAA,0EAAA,iBAAAC,kBAe6BgmB;iCAjqEzB,AAAAnQ,jCAkpEJ,AAAA,OAAA9V,+CAAAC;;iCAlpEI,AAAA6V,jCAkpEJ,AAAA,OAAA9V,+CAAAC;uJAlpEI,AAAA6V,yHAAA,AAAAA,tQAkpEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,0EAAA,AAAAA,+CAAA,hSAgBQJ;iCAlqEJ,AAAAkW,jCAkpEJ,AAAA,OAAA9V,+CAAAC;;;;AAAA,AAAA,AAAA2lB,8CAAA;;AAAA,AAAA,AAAAA,wCAAA,WAAAC;AAAA,AAAA,IAAAC,UAAA,AAAAvmB,0BAAAsmB;IAAAA,cAAA,AAAArmB,yBAAAqmB;IAAAE,UAAA,AAAAxmB,0BAAAsmB;IAAAA,cAAA,AAAArmB,yBAAAqmB;IAAAG,UAAA,AAAAzmB,0BAAAsmB;IAAAA,cAAA,AAAArmB,yBAAAqmB;AAAA,AAAA,OAAAD,yDAAAE,QAAAC,QAAAC,QAAAH;;;AAAA;AAAA,AAAA,sCAAA,tCAMGD;AAaH,AAAA,AAAA;;;;;;;;wBAAA,gCAAAhnB,xDAMGsnB;AANH,AAAA,IAAArnB,qBAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,wBAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,uBAAA,EAAA,CAAA,MAAA,AAAAH,4BAAA,AAAA,KAAAI,qBAAA,AAAAJ,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAqnB,2DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAlnB;;;AAAA,AAAA,AAAA,AAAAknB,6DAAA,WAAA\/mB,gBAAAC,eAaImnB,YAAc3mB;iHAlrEd,AAAAkW,mQAAA,AAAAA,oQAAA,AAAAA,xnBAqqEJ,AAAA,OAAAjW,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,yEAAA,iBAAAC,kBAAA,AAAA0P,wBAAA,AAAA9P,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,kGAAA,iBAAAC,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA;iCArqEI,AAAA8V,jCAqqEJ,AAAA,OAAA9V,+CAAAC;;iCArqEI,AAAA6V,jCAqqEJ,AAAA,OAAA9V,+CAAAC;kJArqEI,AAAA6V,4HAAA,AAAAA,zQAqqEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,6EAAA,AAAAA,+CAAA,8EAAA,iBAAAC,kBAe+BsmB;iCAprE3B,AAAAzQ,jCAqqEJ,AAAA,OAAA9V,+CAAAC;;iCArqEI,AAAA6V,jCAqqEJ,AAAA,OAAA9V,+CAAAC;uJArqEI,AAAA6V,6HAAA,AAAAA,1QAqqEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,8EAAA,AAAAA,+CAAA,pSAgBQJ;iCArrEJ,AAAAkW,jCAqqEJ,AAAA,OAAA9V,+CAAAC;;;;AAAA,AAAA,AAAAimB,gDAAA;;AAAA,AAAA,AAAAA,0CAAA,WAAAC;AAAA,AAAA,IAAAC,UAAA,AAAA7mB,0BAAA4mB;IAAAA,cAAA,AAAA3mB,yBAAA2mB;IAAAE,UAAA,AAAA9mB,0BAAA4mB;IAAAA,cAAA,AAAA3mB,yBAAA2mB;IAAAG,UAAA,AAAA\/mB,0BAAA4mB;IAAAA,cAAA,AAAA3mB,yBAAA2mB;AAAA,AAAA,OAAAD,2DAAAE,QAAAC,QAAAC,QAAAH;;;AAAA;AAAA,AAAA,wCAAA,xCAMGD;AAaH,AAAA,AAAA;;;;6BAAA,qCAAAtnB,lEAME4nB;AANF,AAAA,IAAA3nB,qBAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,wBAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,uBAAA,EAAA,CAAA,MAAA,AAAAH,4BAAA,AAAA,KAAAI,qBAAA,AAAAJ,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAA2nB,gEAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAxnB;;;AAAA,AAAA,AAAA,AAAAwnB,kEAAA,WAAArnB,gBAAAC,eASGynB,mBAAqBjnB;iHAjsEpB,AAAAkW,mQAAA,AAAAA,pXAwrEJ,AAAA,OAAAjW,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,yEAAA,iBAAAC,kBAAA,AAAA0P,wBAAA,AAAA9P,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,mFAAA,iBAAAC,kBAUc4mB;iCAlsEV,AAAA\/Q,jCAwrEJ,AAAA,OAAA9V,+CAAAC;;iCAxrEI,AAAA6V,jCAwrEJ,AAAA,OAAA9V,+CAAAC;kJAxrEI,AAAA6V,7IAwrEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA;iCAxrEI,AAAA8V,jCAwrEJ,AAAA,OAAA9V,+CAAAC;kJAxrEI,AAAA6V,2NAAA,AAAAA,mIAAA,AAAAA,3eAwrEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,yDAAA,iBAAAC,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,oFAAA,AAAAA,+CAAA;iCAxrEI,AAAA8V,jCAwrEJ,AAAA,OAAA9V,+CAAAC;uJAxrEI,AAAA6V,mOAAA,AAAAA,hXAwrEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,iEAAA,iBAAAC,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,1YAcSJ;iCAtsEL,AAAAkW,jCAwrEJ,AAAA,OAAA9V,+CAAAC;;iCAxrEI,AAAA6V,jCAwrEJ,AAAA,OAAA9V,+CAAAC;;iCAxrEI,AAAA6V,jCAwrEJ,AAAA,OAAA9V,+CAAAC;;;;AAAA,AAAA,AAAAumB,qDAAA;;AAAA,AAAA,AAAAA,+CAAA,WAAAC;AAAA,AAAA,IAAAC,UAAA,AAAAnnB,0BAAAknB;IAAAA,cAAA,AAAAjnB,yBAAAinB;IAAAE,UAAA,AAAApnB,0BAAAknB;IAAAA,cAAA,AAAAjnB,yBAAAinB;IAAAG,UAAA,AAAArnB,0BAAAknB;IAAAA,cAAA,AAAAjnB,yBAAAinB;AAAA,AAAA,OAAAD,gEAAAE,QAAAC,QAAAC,QAAAH;;;AAAA;AAAA,AAAA,6CAAA,7CAMED;AAYF,AAAA,AAAA;;;;;;;;0BAAA,kCAAA5nB,5DAMEkoB;AANF,AAAA,IAAAjoB,qBAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,wBAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,uBAAA,EAAA,CAAA,MAAA,AAAAH,4BAAA,AAAA,KAAAI,qBAAA,AAAAJ,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAioB,6DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA9nB;;;AAAA,AAAA,AAAA,AAAA8nB,+DAAA,WAAA3nB,gBAAAC,eAaG+nB,SAAWvnB;iHAvtEV,AAAAkW,mQAAA,AAAAA,pXA0sEJ,AAAA,OAAAjW,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,yEAAA,iBAAAC,kBAAA,AAAA0P,wBAAA,AAAA9P,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,iFAAA,iBAAAC,kBAccknB;iCAxtEV,AAAArR,jCA0sEJ,AAAA,OAAA9V,+CAAAC;;iCA1sEI,AAAA6V,jCA0sEJ,AAAA,OAAA9V,+CAAAC;kJA1sEI,AAAA6V,7IA0sEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA;iCA1sEI,AAAA8V,jCA0sEJ,AAAA,OAAA9V,+CAAAC;kJA1sEI,AAAA6V,2NAAA,AAAAA,4HAAA,AAAAA,+HAAA,AAAAA,nmBA0sEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,yDAAA,iBAAAC,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,6EAAA,AAAAA,+CAAA,gFAAA,AAAAA,+CAAA;iCA1sEI,AAAA8V,jCA0sEJ,AAAA,OAAA9V,+CAAAC;uJA1sEI,AAAA6V,mOAAA,AAAAA,hXA0sEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,iEAAA,iBAAAC,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,1YAkBSJ;iCA5tEL,AAAAkW,jCA0sEJ,AAAA,OAAA9V,+CAAAC;;iCA1sEI,AAAA6V,jCA0sEJ,AAAA,OAAA9V,+CAAAC;;iCA1sEI,AAAA6V,jCA0sEJ,AAAA,OAAA9V,+CAAAC;;;;AAAA,AAAA,AAAA6mB,kDAAA;;AAAA,AAAA,AAAAA,4CAAA,WAAAC;AAAA,AAAA,IAAAC,UAAA,AAAAznB,0BAAAwnB;IAAAA,cAAA,AAAAvnB,yBAAAunB;IAAAE,UAAA,AAAA1nB,0BAAAwnB;IAAAA,cAAA,AAAAvnB,yBAAAunB;IAAAG,UAAA,AAAA3nB,0BAAAwnB;IAAAA,cAAA,AAAAvnB,yBAAAunB;AAAA,AAAA,OAAAD,6DAAAE,QAAAC,QAAAC,QAAAH;;;AAAA;AAAA,AAAA,0CAAA,1CAMED;AAgBF,AAAA,AAAA;;;;;0BAAA,kCAAAloB,5DAKEwoB;AALF,AAAA,IAAAvoB,qBAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,wBAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,uBAAA,EAAA,CAAA,MAAA,AAAAH,4BAAA,AAAA,KAAAI,qBAAA,AAAAJ,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAuoB,6DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAApoB;;;AAAA,AAAA,AAAA,AAAAooB,+DAAA,WAAAjoB,gBAAAC,eASG4Q,SAAWpQ;iHAzuEV,AAAAkW,mQAAA,AAAAA,pXAguEJ,AAAA,OAAAjW,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,yEAAA,iBAAAC,kBAAA,AAAA0P,wBAAA,AAAA9P,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,mFAAA,iBAAAC,kBAUc+P;iCA1uEV,AAAA8F,jCAguEJ,AAAA,OAAA9V,+CAAAC;;iCAhuEI,AAAA6V,jCAguEJ,AAAA,OAAA9V,+CAAAC;kJAhuEI,AAAA6V,2QAAA,AAAAA,uIAAA,AAAAA,\/hBAguEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,iFAAA,iBAAAC,kBAAA,AAAA0P,wBAAA,AAAA9P,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,wFAAA,AAAAA,+CAAA;iCAhuEI,AAAA8V,jCAguEJ,AAAA,OAAA9V,+CAAAC;kJAhuEI,AAAA6V,qHAAA,AAAAA,lQAguEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,sEAAA,AAAAA,+CAAA;iCAhuEI,AAAA8V,jCAguEJ,AAAA,OAAA9V,+CAAAC;uJAhuEI,AAAA6V,gHAAA,AAAAA,7PAguEJ,iBAAA7V,kBAAA,AAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,iEAAA,AAAAA,+CAAA,vRAaSJ;iCA7uEL,AAAAkW,jCAguEJ,AAAA,OAAA9V,+CAAAC;;iCAhuEI,AAAA6V,jCAguEJ,AAAA,OAAA9V,+CAAAC;;;;AAAA,AAAA,AAAAmnB,kDAAA;;AAAA,AAAA,AAAAA,4CAAA,WAAAC;AAAA,AAAA,IAAAC,UAAA,AAAA\/nB,0BAAA8nB;IAAAA,cAAA,AAAA7nB,yBAAA6nB;IAAAE,UAAA,AAAAhoB,0BAAA8nB;IAAAA,cAAA,AAAA7nB,yBAAA6nB;IAAAG,UAAA,AAAAjoB,0BAAA8nB;IAAAA,cAAA,AAAA7nB,yBAAA6nB;AAAA,AAAA,OAAAD,6DAAAE,QAAAC,QAAAC,QAAAH;;;AAAA;AAAA,AAAA,0CAAA,1CAKED;AAWF,AAAA;;;;;mBAAA,2BAAAxoB,9CAIE6oB;AAJF,AAAA,IAAA5oB,qBAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,wBAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,uBAAA,EAAA,CAAA,MAAA,AAAAH,4BAAA,AAAA,KAAAI,qBAAA,AAAAJ,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAA4oB,sDAAAzoB;;;AAAA,AAAA,AAAA,AAAAyoB,wDAAA,WAQKE;AARL,AAUW,OAACzmB,0BAAM0mB,mBAAUD;;;AAV5B,AAAA,AAAAF,2CAAA;;AAAA,AAAA,AAAAA,qCAAA,WAAAC;AAAA,AAAA,OAAAD,sDAAA,AAAA3nB,wBAAA4nB;;;AAAA,AAYA,AAAA,AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAAA,8BAAA9oB,pDAIGipB;AAJH,AAAA,IAAAhpB,qBAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,wBAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,uBAAA,EAAA,CAAA,MAAA,AAAAH,4BAAA,AAAA,KAAAI,qBAAA,AAAAJ,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAgpB,yDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA7oB;;;AAAA,AAAA,AAAA,AAAA6oB,2DAAA,WAAA1oB,gBAAAC,eA8II8oB,SAAWC;iHA14EX,AAAArS,jHA4vEJ,AAAA,OAAAjW,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,AAAAC,+CAAA,uGAAA,iBAAAC,kBAoJqCioB;iCAh5EjC,AAAApS,jCA4vEJ,AAAA,OAAA9V,+CAAAC;KAoJgDkoB;;;AApJhD,AAAA,AAAAN,8CAAA;;AAAA,AAAA,AAAAA,wCAAA,WAAAC;AAAA,AAAA,IAAAC,UAAA,AAAAxoB,0BAAAuoB;IAAAA,cAAA,AAAAtoB,yBAAAsoB;IAAAE,UAAA,AAAAzoB,0BAAAuoB;IAAAA,cAAA,AAAAtoB,yBAAAsoB;IAAAG,UAAA,AAAA1oB,0BAAAuoB;IAAAA,cAAA,AAAAtoB,yBAAAsoB;AAAA,AAAA,OAAAD,yDAAAE,QAAAC,QAAAC,QAAAH;;;AAAA;AAAA,AAAA,sCAAA,tCAIGD;AAkJH;;;;;6BAAA,7BAKEO,kEAICnhB;AATH,AAYW,gCAAA,zBAACiK,iCAAQ,AAAa,AAACmX,OAAUphB;;AAE5C;;;;;2BAAA,3BAKEqhB;AALF,AAUE,IAAMC,WAAS,AAAC3M;IACV4M,OAAS,AAACnU;AADhB,AAEE,oBAAI,AAAC+T,qCAAWG;AACd,wDAAA,jDAAC3nB,wBAAIvC,oBAAUmqB;;AAGf,OAACC,4BACiB,AAACJ,OAAUE","names":["quil.core\/*graphics*","quil.core\/no-fill-prop","quil.core\/current-graphics","or__6814__auto__","quil.sketch\/current-applet","js\/Processing.prototype.PConstants","quil.core\/arc-modes","quil.core\/shape-modes","quil.core\/blend-modes","quil.core\/color-modes","quil.core\/image-formats","quil.core\/ellipse-modes","quil.core\/hint-options","quil.core\/image-modes","quil.core\/rect-modes","quil.core\/p-shape-modes","quil.core\/stroke-cap-modes","quil.core\/stroke-join-modes","quil.core\/horizontal-alignment-modes","quil.core\/vertical-alignment-modes","quil.core\/text-modes","quil.core\/texture-modes","quil.core\/texture-wrap-modes","quil.core\/filter-modes","quil.core\/cursor-modes","quil.core\/PI","js\/Math","quil.core\/HALF-PI","quil.core\/THIRD-PI","quil.core\/QUARTER-PI","quil.core\/TWO-PI","quil.core\/DEG-TO-RAD","quil.core\/RAD-TO-DEG","quil.core\/KEY-CODES","quil.core\/prc-println","msg","quil.core\/prc-print","quil.core\/get-sketch-by-id","id","js\/Processing","var_args","args__7934__auto__","len__7927__auto__","i__7928__auto__","argseq__7935__auto__","cljs.core\/IndexedSeq","quil.core\/with-sketch","&form","&env","seq8273","G__8274","cljs.core\/first","cljs.core\/next","G__8275","G__8276","applet","body","cljs.core\/sequence","cljs.core\/seq","cljs.core\/concat","cljs.core\/-conj","x__7656__auto__","quil.util\/clj-compilation?","quil.core\/state-atom","args8280","G__8282","quil.core\/state","js\/Error","cljs.core\/deref","key","state","cljs.core\/contains?","cljs.core\/get","quil.core\/set-state!","seq8287","state-vals","state*","state-map","cljs.core\/apply","cljs.core\/hash-map","cljs.core\/reset!","quil.core\/abs","n","quil.core\/acos","quil.core\/alpha","color","cljs.core\/unchecked-int","args8291","G__8293","quil.core\/ambient-float","gray","x","y","z","quil.core\/ambient-int","rgb","args8298","G__8300","quil.core\/ambient","args8305","G__8307","quil.core\/ambient-light","red","green","blue","quil.core\/apply-matrix","n00","n01","n02","n03","n10","n11","n12","n13","n20","n21","n22","n23","n30","n31","n32","n33","quil.core\/arc","width","height","start","stop","quil.core\/asin","quil.core\/atan","quil.core\/atan2","quil.core\/available-fonts","js\/PFont","args8312","G__8314","quil.core\/background-float","alpha","r","g","b","a","args8319","G__8321","quil.core\/background-int","args8326","G__8328","quil.core\/background","quil.core\/background-image","img","quil.core\/begin-camera","quil.core\/begin-contour","args8333","G__8335","quil.core\/begin-shape","mode","quil.util\/resolve-constant-key","args8340","G__8342","quil.core\/bezier","x1","y1","cx1","cy1","cx2","cy2","x2","y2","z1","cz1","cz2","z2","quil.core\/bezier-detail","detail","quil.core\/bezier-point","c","d","t","quil.core\/bezier-tangent","args8347","G__8349","quil.core\/bezier-vertex","args8354","G__8356","quil.core\/binary","val","num-digits","args8361","G__8363","quil.core\/blend","dx","dy","dwidth","dheight","src-img","dest-img","quil.core\/blend-color","c1","c2","quil.core\/blue","args8368","G__8370","quil.core\/box","size","depth","quil.core\/brightness","args8375","G__8377","quil.core\/camera","eyeX","eyeY","eyeZ","centerX","centerY","centerZ","upX","upY","upZ","quil.core\/ceil","args8382","G__8384","quil.core\/color","args8389","G__8391","quil.core\/color-mode","max","max-x","max-y","max-z","max-a","quil.core\/constrain","amt","low","high","args8396","G__8398","quil.core\/copy","p__8399","p__8400","vec__8401","cljs.core\/nth","vec__8404","p__8407","p__8408","vec__8409","vec__8412","p__8415","p__8416","vec__8417","vec__8420","sx","sy","swidth","sheight","quil.core\/cos","angle","args8427","G__8429","quil.core\/create-font","name","smooth","charset","args8434","G__8436","quil.core\/create-graphics","w","h","renderer","quil.sketch\/resolve-renderer","path","quil.core\/create-image","format","quil.core\/current-fill","quil.core\/current-stroke","args8441","G__8443","quil.core\/cursor","cursor-mode","args8448","G__8450","quil.core\/cursor-image","hx","hy","args8455","G__8457","quil.core\/curve","x3","y3","x4","y4","z3","z4","quil.core\/curve-detail","quil.core\/curve-point","quil.core\/curve-tangent","quil.core\/curve-tightness","ti","args8462","G__8464","quil.core\/curve-vertex","quil.core\/day","quil.core\/degrees","radians","quil.core\/delay-frame","freeze-ms","quil.core\/directional-light","nx","ny","nz","args8469","G__8471","quil.core\/dist","quil.core\/do-record","cljs.core\/vec","seq8477","G__8478","G__8479","G__8480","graphics","quil.core\/ellipse","quil.core\/ellipse-mode","args8484","G__8486","quil.core\/emissive-float","float-val","quil.core\/emissive-int","int-val","args8491","G__8493","quil.core\/emissive","quil.core\/end-camera","quil.core\/end-contour","quil.core\/end-raw","args8498","G__8500","quil.core\/end-shape","cljs.core\/=","quil.core\/exit","quil.core\/exp","quil.core\/clear-no-fill-cljs","args8505","G__8507","quil.core\/fill-float","args8512","G__8514","quil.core\/fill-int","args8519","G__8521","quil.core\/fill","args8526","G__8528","quil.core\/display-filter","level","quil.core\/floor","quil.core\/focused","quil.core\/frame-count","quil.core\/current-frame-rate","quil.core\/frame-rate","new-rate","quil.core\/frustum","left","right","bottom","top","near","far","args8533","G__8535","quil.core\/get-pixel","quil.core\/green","col","args8540","G__8542","quil.core\/hex","quil.core\/height","quil.core\/hint","hint-type","cljs.core\/Keyword","quil.core\/hour","quil.core\/hue","args8547","G__8549","quil.core\/image","args8554","G__8556","quil.core\/image-filter","quil.core\/image-mode","quil.core\/key-code","quil.core\/key-pressed?","quil.core\/light-falloff","constant","linear","quadratic","quil.core\/lerp-color","quil.core\/lerp","quil.core\/lights","quil.core\/light-specular","args8561","G__8563","quil.core\/line","p1","p2","quil.core\/load-font","filename","quil.core\/load-image","args8568","G__8570","quil.core\/load-shader","fragment-filename","vertex-filename","quil.core\/load-shape","quil.core\/log","cljs.core\/List","args8575","G__8577","quil.core\/mag","quil.core\/map-range","low1","high1","low2","high2","quil.core\/millis","quil.core\/minute","quil.core\/model-x","quil.core\/model-y","quil.core\/model-z","quil.core\/month","quil.core\/mouse-button","button-code","pred__8585","expr__8586","quil.core\/mouse-pressed?","quil.core\/mouse-x","quil.core\/mouse-y","quil.core\/no-cursor","quil.core\/no-fill","quil.core\/random-2d","theta","Math\/cos","Math\/sin","quil.core\/random-3d","phi","vx","vy","vz","args8588","G__8590","quil.core\/noise","args8595","G__8597","quil.core\/noise-detail","octaves","falloff","quil.core\/noise-seed","quil.core\/no-lights","quil.core\/no-loop","quil.core\/norm","quil.core\/normal","quil.core\/no-smooth","quil.core\/no-stroke","quil.core\/no-tint","args8602","G__8604","quil.core\/ortho","args8609","G__8611","quil.core\/perspective","fovy","aspect","z-near","z-far","args8616","G__8618","quil.core\/pixels","pix-array","quil.core\/pmouse-x","quil.core\/pmouse-y","args8623","G__8625","quil.core\/point","quil.core\/point-light","quil.core\/pop-matrix","quil.core\/pop-style","quil.core\/pow","num","exponent","quil.core\/print-camera","quil.core\/print-matrix","quil.core\/print-projection","quil.core\/push-matrix","quil.core\/push-style","quil.core\/quad","args8630","G__8632","quil.core\/quadratic-vertex","cx","cy","cz","quil.core\/radians","degrees","args8637","G__8639","quil.core\/random","min","quil.core\/random-gaussian","quil.core\/random-seed","quil.core\/raw-key","args8644","G__8646","quil.core\/rect","top-left-r","top-right-r","bottom-right-r","bottom-left-r","quil.core\/rect-mode","quil.core\/red","quil.core\/redraw","quil.core\/request-image","quil.core\/reset-matrix","quil.core\/resize","args8651","G__8653","quil.core\/rotate","quil.core\/rotate-x","quil.core\/rotate-y","quil.core\/rotate-z","quil.core\/round","quil.core\/saturation","quil.core\/save","args8658","G__8660","quil.core\/save-frame","args8665","G__8667","quil.core\/scale","s","sz","args8672","G__8674","quil.core\/screen-x","args8679","G__8681","quil.core\/screen-y","quil.core\/screen-z","quil.core\/seconds","args8686","G__8688","quil.core\/set-pixel","quil.core\/set-image","src","args8693","G__8695","quil.core\/shape","sh","quil.core\/shear-x","quil.core\/shear-y","quil.core\/shape-mode","quil.core\/shininess","shine","quil.core\/sin","args8700","G__8702","quil.core\/smooth","args8707","G__8709","quil.core\/specular","quil.core\/sphere","radius","args8714","G__8716","quil.core\/sphere-detail","res","ures","vres","args8721","G__8723","quil.core\/spot-light","p__8724","p__8725","p__8726","vec__8727","vec__8730","vec__8733","concentration","quil.core\/sq","quil.core\/sqrt","quil.core\/start-loop","args8740","G__8742","quil.core\/stroke-float","args8747","G__8749","quil.core\/stroke-int","args8754","G__8756","quil.core\/stroke","quil.core\/stroke-cap","cap-mode","quil.core\/stroke-join","join-mode","quil.core\/stroke-weight","weight","quil.core\/tan","quil.core\/target-frame-rate","quil.core\/no-fill?","args8761","G__8763","quil.core\/text-char","cljs.core\/char","args8768","G__8770","quil.core\/text-num","args8775","G__8777","quil.core\/text","args8782","G__8784","quil.core\/text-align","align","align-x","align-y","quil.core\/text-ascent","quil.core\/text-descent","args8789","G__8791","quil.core\/text-font","font","quil.core\/text-leading","leading","quil.core\/text-mode","quil.core\/text-size","quil.core\/texture","quil.core\/texture-mode","quil.core\/text-width","data","args8796","G__8798","quil.core\/tint-float","args8803","G__8805","quil.core\/tint-int","args8810","G__8812","quil.core\/tint","args8817","G__8819","quil.core\/translate","v","tx","ty","tz","quil.core\/triangle","quil.core\/unbinary","str-val","quil.core\/unhex","hex-str","args8824","G__8826","quil.core\/update-pixels","temp__4657__auto__","args8833","G__8835","quil.core\/vertex","u","quil.core\/year","quil.core\/width","quil.core\/with-fill","seq8841","G__8842","G__8843","G__8844","fill-args","quil.core\/with-stroke","seq8849","G__8850","G__8851","G__8852","stroke-args","quil.core\/with-translation","seq8857","G__8858","G__8859","G__8860","translation-vector","quil.core\/with-rotation","seq8865","G__8866","G__8867","G__8868","rotation","quil.core\/with-graphics","seq8873","G__8874","G__8875","G__8876","quil.core\/sketch","seq8880","opts","quil.sketch\/sketch","quil.core\/defsketch","seq8884","G__8885","G__8886","G__8887","app-name","options","quil.core\/key-coded?","js\/String","quil.core\/key-as-keyword","key-char","code","cljs.core\/keyword"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middleware.cljc b/src/http/static/viz/1/quil/middleware.cljc
new file mode 100644
index 0000000..a8f5672
--- /dev/null
+++ b/src/http/static/viz/1/quil/middleware.cljc
@@ -0,0 +1,144 @@
+(ns ^{:doc "Quil middleware."}
+ quil.middleware
+ (:require [quil.middlewares.fun-mode :as fun-mode]
+ #?(:clj [quil.middlewares.pause-on-error :as pause-on-error])
+ [quil.middlewares.navigation-3d :as navigation-3d]
+ [quil.middlewares.navigation-2d :as navigation-2d]
+ ))
+
+(defn ^{:requires-bindings false
+ :category "Middleware"
+ :subcategory nil
+ :ns "quil.middleware"
+ :added "2.1.0"}
+ fun-mode
+ "Introduces function mode. Adds 'update' function which takes current
+ state and returns new state. Makes all other functions (setup, draw,
+ mouse-click, etc) state-aware. See wiki for more details."
+ [options]
+ (fun-mode/fun-mode options))
+
+#?(:clj
+(defn ^{:requires-bindings false
+ :category "Middleware"
+ :subcategory nil
+ :ns "quil.middleware"
+ :added "2.2.0"}
+ pause-on-error
+ "Pauses sketch if any of user-provided handlers throws error.
+ It allows to fix the error on the fly and continue sketch.
+ May be good alternative to default '500ms pause if exception'
+ behaviour."
+ [options]
+ (pause-on-error/pause-on-error options)))
+
+(defn ^{:requires-bindings false
+ :category "Middleware"
+ :subcategory nil
+ :ns "quil.middleware"
+ :added "2.2.0"}
+ navigation-3d
+ "Enables navigation in 3D space. Similar to how it is done in
+ shooters: WASD navigation, space is go up, drag mouse to look around.
+ This middleware requires fun-mode.
+
+
+ Navigation
+
+ * Drag mouse to look around. You can change settings to bind
+ mouse-moved instead of mouse-dragged to look around. See
+ customization info below.
+
+ * Keyboard:
+ * w - go forward
+ * s - go backward
+ * a - strafe left
+ * d - strafe right
+ * space - go up
+ * z - go down, can't bind to ctrl, limitation of Processing
+
+
+ Customization
+
+ You can customize this middleware by providing map as
+ :navigation-3d option in defsketch/sketch. Map can have following
+ optional keys:
+
+ :position - vector of 3 numbers, initial camera position. Default
+ is the same as in 'camera' function.
+
+ :straight - vector of 3 numbers, direction you'll be looking at.
+ Default is [0 0 -1] (looking down).
+
+ :up - vector of 3 numbers, 'up' direction. Default is [0 1 0].
+
+ :pixels-in-360 - number, mouse sensitivity. Defines how many pixels
+ you need to move/drag you mouse to rotate 360 degrees.
+ The less the number the more sensitive is mouse.
+ Default is 1000.
+
+ :step-size - number, number of pixels you move on each key event (wasd).
+ Default is 20.
+
+ :rotate-on - keyword, either :mouse-dragged or :mouse-moved. Specifies
+ on which mouse event camera should rotate. Default is
+ :mouse-dragged.
+
+
+ Accessing position information from sketch
+
+ navigation-3d uses fun-mode under the hood so all position-related
+ information is stored in the state map. It means that you can access in
+ draw/update/any handler and modify it if you need to. Position
+ information is a map which is stored under :navigation-3d key in the
+ state map. Position consists of 3 values: :position, :straight and :up.
+ See \"Customization\" section above for more details.
+
+ Usage example:
+
+ (q/defsketch my-sketch
+ ...
+ :middleware [m/fun-mode m/navigation-3d])
+
+ See wiki article for more(?) details:
+ https://github.com/quil/quil/wiki/Navigation-3D"
+ [options]
+ (navigation-3d/navigation-3d options))
+
+(defn ^{:requires-bindings false
+ :category "Middleware"
+ :subcategory nil
+ :ns "quil.middleware"
+ :added "2.2.6"}
+ navigation-2d
+ "Enables navigation over 2D sketch. Drag mouse to change the center of the
+ sketch and mouse wheel controls zoom. This middleware requires fun-mode.
+
+ Customization
+
+ You can customize this middleware by providing map as
+ :navigation-2d option in defsketch/sketch. Map can have following
+ optional keys:
+
+ :position - vector of 2 numbers, x and y - center of the screen.
+ Default is width/2, height/2.
+
+ :zoom - number indicating current zoom level. Default is 1.
+
+ Accessing position information from sketch
+
+ navigation-2d uses fun-mode under the hood so all position-related
+ information is stored in the state map. It means that you can access in
+ draw/update/any handler and modify it if you need to. Position
+ information is a map which is stored under :navigation-2d key in the
+ state map. Position consists of 2 values: :position and :zoom.
+ See \"Customization\" section above for more details.
+
+ Usage example:
+
+ (q/defsketch my-sketch
+ ...
+ :middleware [m/fun-mode m/navigation-2d])
+"
+ [options]
+ (navigation-2d/navigation-2d options))
diff --git a/src/http/static/viz/1/quil/middleware.cljc.cache.edn b/src/http/static/viz/1/quil/middleware.cljc.cache.edn
new file mode 100644
index 0000000..1fbb263
--- /dev/null
+++ b/src/http/static/viz/1/quil/middleware.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :use-macros {}, :excludes #{}, :name quil.middleware, :imports nil, :requires {fun-mode quil.middlewares.fun-mode, quil.middlewares.fun-mode quil.middlewares.fun-mode, navigation-3d quil.middlewares.navigation-3d, quil.middlewares.navigation-3d quil.middlewares.navigation-3d, navigation-2d quil.middlewares.navigation-2d, quil.middlewares.navigation-2d quil.middlewares.navigation-2d}, :uses nil, :defs {fun-mode {:category "Middleware", :protocol-inline nil, :meta {:category "Middleware", :added "2.1.0", :ns "quil.middleware", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/middleware.cljc", :end-column 11, :column 3, :requires-bindings false, :line 14, :end-line 14, :arglists (quote ([options])), :doc "Introduces function mode. Adds 'update' function which takes current\n state and returns new state. Makes all other functions (setup, draw,\n mouse-click, etc) state-aware. See wiki for more details."}, :added "2.1.0", :ns "quil.middleware", :name quil.middleware/fun-mode, :variadic false, :subcategory nil, :file "out/quil/middleware.cljc", :end-column 11, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 9, :end-line 14, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Introduces function mode. Adds 'update' function which takes current\n state and returns new state. Makes all other functions (setup, draw,\n mouse-click, etc) state-aware. See wiki for more details."}, navigation-3d {:category "Middleware", :protocol-inline nil, :meta {:category "Middleware", :added "2.2.0", :ns "quil.middleware", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/middleware.cljc", :end-column 16, :column 3, :requires-bindings false, :line 40, :end-line 40, :arglists (quote ([options])), :doc "Enables navigation in 3D space. Similar to how it is done in\n shooters: WASD navigation, space is go up, drag mouse to look around.\n This middleware requires fun-mode.\n\n\n Navigation\n\n * Drag mouse to look around. You can change settings to bind\n mouse-moved instead of mouse-dragged to look around. See\n customization info below.\n\n * Keyboard:\n * w - go forward\n * s - go backward\n * a - strafe left\n * d - strafe right\n * space - go up\n * z - go down, can't bind to ctrl, limitation of Processing\n\n\n Customization\n\n You can customize this middleware by providing map as\n :navigation-3d option in defsketch/sketch. Map can have following\n optional keys:\n\n :position - vector of 3 numbers, initial camera position. Default\n is the same as in 'camera' function.\n\n :straight - vector of 3 numbers, direction you'll be looking at.\n Default is [0 0 -1] (looking down).\n\n :up - vector of 3 numbers, 'up' direction. Default is [0 1 0].\n\n :pixels-in-360 - number, mouse sensitivity. Defines how many pixels\n you need to move/drag you mouse to rotate 360 degrees.\n The less the number the more sensitive is mouse.\n Default is 1000.\n\n :step-size - number, number of pixels you move on each key event (wasd).\n Default is 20.\n\n :rotate-on - keyword, either :mouse-dragged or :mouse-moved. Specifies\n on which mouse event camera should rotate. Default is\n :mouse-dragged.\n\n\n Accessing position information from sketch\n\n navigation-3d uses fun-mode under the hood so all position-related\n information is stored in the state map. It means that you can access in\n draw/update/any handler and modify it if you need to. Position\n information is a map which is stored under :navigation-3d key in the\n state map. Position consists of 3 values: :position, :straight and :up.\n See \"Customization\" section above for more details.\n\n Usage example:\n\n (q/defsketch my-sketch\n ...\n :middleware [m/fun-mode m/navigation-3d])\n\n See wiki article for more(?) details:\n https://github.com/quil/quil/wiki/Navigation-3D"}, :added "2.2.0", :ns "quil.middleware", :name quil.middleware/navigation-3d, :variadic false, :subcategory nil, :file "out/quil/middleware.cljc", :end-column 16, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 35, :end-line 40, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Enables navigation in 3D space. Similar to how it is done in\n shooters: WASD navigation, space is go up, drag mouse to look around.\n This middleware requires fun-mode.\n\n\n Navigation\n\n * Drag mouse to look around. You can change settings to bind\n mouse-moved instead of mouse-dragged to look around. See\n customization info below.\n\n * Keyboard:\n * w - go forward\n * s - go backward\n * a - strafe left\n * d - strafe right\n * space - go up\n * z - go down, can't bind to ctrl, limitation of Processing\n\n\n Customization\n\n You can customize this middleware by providing map as\n :navigation-3d option in defsketch/sketch. Map can have following\n optional keys:\n\n :position - vector of 3 numbers, initial camera position. Default\n is the same as in 'camera' function.\n\n :straight - vector of 3 numbers, direction you'll be looking at.\n Default is [0 0 -1] (looking down).\n\n :up - vector of 3 numbers, 'up' direction. Default is [0 1 0].\n\n :pixels-in-360 - number, mouse sensitivity. Defines how many pixels\n you need to move/drag you mouse to rotate 360 degrees.\n The less the number the more sensitive is mouse.\n Default is 1000.\n\n :step-size - number, number of pixels you move on each key event (wasd).\n Default is 20.\n\n :rotate-on - keyword, either :mouse-dragged or :mouse-moved. Specifies\n on which mouse event camera should rotate. Default is\n :mouse-dragged.\n\n\n Accessing position information from sketch\n\n navigation-3d uses fun-mode under the hood so all position-related\n information is stored in the state map. It means that you can access in\n draw/update/any handler and modify it if you need to. Position\n information is a map which is stored under :navigation-3d key in the\n state map. Position consists of 3 values: :position, :straight and :up.\n See \"Customization\" section above for more details.\n\n Usage example:\n\n (q/defsketch my-sketch\n ...\n :middleware [m/fun-mode m/navigation-3d])\n\n See wiki article for more(?) details:\n https://github.com/quil/quil/wiki/Navigation-3D"}, navigation-2d {:category "Middleware", :protocol-inline nil, :meta {:category "Middleware", :added "2.2.6", :ns "quil.middleware", :subcategory nil, :file "/home/mediocregopher/src/viz/out/quil/middleware.cljc", :end-column 16, :column 3, :requires-bindings false, :line 113, :end-line 113, :arglists (quote ([options])), :doc "Enables navigation over 2D sketch. Drag mouse to change the center of the\n sketch and mouse wheel controls zoom. This middleware requires fun-mode.\n\n Customization\n\n You can customize this middleware by providing map as\n :navigation-2d option in defsketch/sketch. Map can have following\n optional keys:\n\n :position - vector of 2 numbers, x and y - center of the screen.\n Default is width/2, height/2.\n\n :zoom - number indicating current zoom level. Default is 1.\n\n Accessing position information from sketch\n\n navigation-2d uses fun-mode under the hood so all position-related\n information is stored in the state map. It means that you can access in\n draw/update/any handler and modify it if you need to. Position\n information is a map which is stored under :navigation-2d key in the\n state map. Position consists of 2 values: :position and :zoom.\n See \"Customization\" section above for more details.\n\n Usage example:\n\n (q/defsketch my-sketch\n ...\n :middleware [m/fun-mode m/navigation-2d])\n"}, :added "2.2.6", :ns "quil.middleware", :name quil.middleware/navigation-2d, :variadic false, :subcategory nil, :file "out/quil/middleware.cljc", :end-column 16, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :requires-bindings false, :line 108, :end-line 113, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Enables navigation over 2D sketch. Drag mouse to change the center of the\n sketch and mouse wheel controls zoom. This middleware requires fun-mode.\n\n Customization\n\n You can customize this middleware by providing map as\n :navigation-2d option in defsketch/sketch. Map can have following\n optional keys:\n\n :position - vector of 2 numbers, x and y - center of the screen.\n Default is width/2, height/2.\n\n :zoom - number indicating current zoom level. Default is 1.\n\n Accessing position information from sketch\n\n navigation-2d uses fun-mode under the hood so all position-related\n information is stored in the state map. It means that you can access in\n draw/update/any handler and modify it if you need to. Position\n information is a map which is stored under :navigation-2d key in the\n state map. Position consists of 2 values: :position and :zoom.\n See \"Customization\" section above for more details.\n\n Usage example:\n\n (q/defsketch my-sketch\n ...\n :middleware [m/fun-mode m/navigation-2d])\n"}}, :require-macros nil, :doc "Quil middleware."} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middleware.js b/src/http/static/viz/1/quil/middleware.js
new file mode 100644
index 0000000..d807b5a
--- /dev/null
+++ b/src/http/static/viz/1/quil/middleware.js
@@ -0,0 +1,118 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.middleware');
+goog.require('cljs.core');
+goog.require('quil.middlewares.fun_mode');
+goog.require('quil.middlewares.navigation_3d');
+goog.require('quil.middlewares.navigation_2d');
+/**
+ * Introduces function mode. Adds 'update' function which takes current
+ * state and returns new state. Makes all other functions (setup, draw,
+ * mouse-click, etc) state-aware. See wiki for more details.
+ */
+quil.middleware.fun_mode = (function quil$middleware$fun_mode(options){
+return quil.middlewares.fun_mode.fun_mode.call(null,options);
+});
+/**
+ * Enables navigation in 3D space. Similar to how it is done in
+ * shooters: WASD navigation, space is go up, drag mouse to look around.
+ * This middleware requires fun-mode.
+ *
+ *
+ * Navigation
+ *
+ * * Drag mouse to look around. You can change settings to bind
+ * mouse-moved instead of mouse-dragged to look around. See
+ * customization info below.
+ *
+ * * Keyboard:
+ * * w - go forward
+ * * s - go backward
+ * * a - strafe left
+ * * d - strafe right
+ * * space - go up
+ * * z - go down, can't bind to ctrl, limitation of Processing
+ *
+ *
+ * Customization
+ *
+ * You can customize this middleware by providing map as
+ * :navigation-3d option in defsketch/sketch. Map can have following
+ * optional keys:
+ *
+ * :position - vector of 3 numbers, initial camera position. Default
+ * is the same as in 'camera' function.
+ *
+ * :straight - vector of 3 numbers, direction you'll be looking at.
+ * Default is [0 0 -1] (looking down).
+ *
+ * :up - vector of 3 numbers, 'up' direction. Default is [0 1 0].
+ *
+ * :pixels-in-360 - number, mouse sensitivity. Defines how many pixels
+ * you need to move/drag you mouse to rotate 360 degrees.
+ * The less the number the more sensitive is mouse.
+ * Default is 1000.
+ *
+ * :step-size - number, number of pixels you move on each key event (wasd).
+ * Default is 20.
+ *
+ * :rotate-on - keyword, either :mouse-dragged or :mouse-moved. Specifies
+ * on which mouse event camera should rotate. Default is
+ * :mouse-dragged.
+ *
+ *
+ * Accessing position information from sketch
+ *
+ * navigation-3d uses fun-mode under the hood so all position-related
+ * information is stored in the state map. It means that you can access in
+ * draw/update/any handler and modify it if you need to. Position
+ * information is a map which is stored under :navigation-3d key in the
+ * state map. Position consists of 3 values: :position, :straight and :up.
+ * See "Customization" section above for more details.
+ *
+ * Usage example:
+ *
+ * (q/defsketch my-sketch
+ * ...
+ * :middleware [m/fun-mode m/navigation-3d])
+ *
+ * See wiki article for more(?) details:
+ * https://github.com/quil/quil/wiki/Navigation-3D
+ */
+quil.middleware.navigation_3d = (function quil$middleware$navigation_3d(options){
+return quil.middlewares.navigation_3d.navigation_3d.call(null,options);
+});
+/**
+ * Enables navigation over 2D sketch. Drag mouse to change the center of the
+ * sketch and mouse wheel controls zoom. This middleware requires fun-mode.
+ *
+ * Customization
+ *
+ * You can customize this middleware by providing map as
+ * :navigation-2d option in defsketch/sketch. Map can have following
+ * optional keys:
+ *
+ * :position - vector of 2 numbers, x and y - center of the screen.
+ * Default is width/2, height/2.
+ *
+ * :zoom - number indicating current zoom level. Default is 1.
+ *
+ * Accessing position information from sketch
+ *
+ * navigation-2d uses fun-mode under the hood so all position-related
+ * information is stored in the state map. It means that you can access in
+ * draw/update/any handler and modify it if you need to. Position
+ * information is a map which is stored under :navigation-2d key in the
+ * state map. Position consists of 2 values: :position and :zoom.
+ * See "Customization" section above for more details.
+ *
+ * Usage example:
+ *
+ * (q/defsketch my-sketch
+ * ...
+ * :middleware [m/fun-mode m/navigation-2d])
+ */
+quil.middleware.navigation_2d = (function quil$middleware$navigation_2d(options){
+return quil.middlewares.navigation_2d.navigation_2d.call(null,options);
+});
+
+//# sourceMappingURL=middleware.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middleware.js.map b/src/http/static/viz/1/quil/middleware.js.map
new file mode 100644
index 0000000..ea10d2f
--- /dev/null
+++ b/src/http/static/viz/1/quil/middleware.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middleware.js","sources":["middleware.cljc"],"lineCount":118,"mappings":";AAAA;;;;;AAQA;;;;;2BAAA,3BAKEA,8DAICC;AATH,AAUE,OAACC,6CAAkBD;;AAgBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAAA,hCAKEE,wEAiECF;AAtEH,AAuEE,OAACG,uDAA4BH;;AAE\/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAAA,hCAKEI,wEA8BCJ;AAnCH,AAoCE,OAACK,uDAA4BL","names":["quil.middleware\/fun-mode","options","quil.middlewares.fun-mode\/fun-mode","quil.middleware\/navigation-3d","quil.middlewares.navigation-3d\/navigation-3d","quil.middleware\/navigation-2d","quil.middlewares.navigation-2d\/navigation-2d"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/deprecated_options.cljc b/src/http/static/viz/1/quil/middlewares/deprecated_options.cljc
new file mode 100644
index 0000000..6ed40d2
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/deprecated_options.cljc
@@ -0,0 +1,26 @@
+(ns quil.middlewares.deprecated-options)
+
+(def ^:private deprecated
+ {:decor ["2.0" "Try :features [:present] for similar effect"]
+ :target ["2.0" "Use :features [:keep-on-top] instead."]
+ :safe-draw-fn ["2.0" "Use :features [:no-safe-fns] instead."]})
+
+(defn- check-features-vector [features]
+ (let [features (set features)]
+ (when (features :no-safe-draw)
+ (println "Feature :no-safe-draw was renamed to :no-safe-fns in Quil 2.1."
+ "Use :feature [:no-safe-fns] now."))
+ (disj features :no-safe-draw)))
+
+(defn deprecated-options
+ "Checks if options map contains deprected options and removes them.
+ Prints messages how to fix deprecated functions."
+ [options]
+ (let [options (update-in options [:features] check-features-vector)]
+ (->> (for [[name value] options]
+ (if-let [[version message] (deprecated name)]
+ (do (println name "option was removed in Quil" version "." message)
+ nil)
+ [name value]))
+ (remove nil?)
+ (into {}))))
diff --git a/src/http/static/viz/1/quil/middlewares/deprecated_options.cljc.cache.edn b/src/http/static/viz/1/quil/middlewares/deprecated_options.cljc.cache.edn
new file mode 100644
index 0000000..0af4bd9
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/deprecated_options.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :use-macros {}, :excludes #{}, :name quil.middlewares.deprecated-options, :imports nil, :requires nil, :uses nil, :defs {deprecated {:name quil.middlewares.deprecated-options/deprecated, :file "out/quil/middlewares/deprecated_options.cljc", :line 3, :column 1, :end-line 3, :end-column 26, :private true, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/deprecated_options.cljc", :line 3, :column 16, :end-line 3, :end-column 26, :private true}, :tag cljs.core/IMap}, check-features-vector {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/deprecated_options.cljc", :line 8, :column 8, :end-line 8, :end-column 29, :private true, :arglists (quote ([features]))}, :private true, :name quil.middlewares.deprecated-options/check-features-vector, :variadic false, :file "out/quil/middlewares/deprecated_options.cljc", :end-column 29, :method-params ([features]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 8, :end-line 8, :max-fixed-arity 1, :fn-var true, :arglists (quote ([features]))}, deprecated-options {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/deprecated_options.cljc", :line 15, :column 7, :end-line 15, :end-column 25, :arglists (quote ([options])), :doc "Checks if options map contains deprected options and removes them.\n Prints messages how to fix deprecated functions."}, :name quil.middlewares.deprecated-options/deprecated-options, :variadic false, :file "out/quil/middlewares/deprecated_options.cljc", :end-column 25, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 15, :end-line 15, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Checks if options map contains deprected options and removes them.\n Prints messages how to fix deprecated functions."}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:features :decor :safe-draw-fn :no-safe-draw :target}, :order [:decor :target :safe-draw-fn :no-safe-draw :features]}, :doc nil} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/deprecated_options.js b/src/http/static/viz/1/quil/middlewares/deprecated_options.js
new file mode 100644
index 0000000..2c1658d
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/deprecated_options.js
@@ -0,0 +1,95 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.middlewares.deprecated_options');
+goog.require('cljs.core');
+quil.middlewares.deprecated_options.deprecated = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"decor","decor",-1730969431),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["2.0","Try :features [:present] for similar effect"], null),new cljs.core.Keyword(null,"target","target",253001721),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["2.0","Use :features [:keep-on-top] instead."], null),new cljs.core.Keyword(null,"safe-draw-fn","safe-draw-fn",1454900202),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["2.0","Use :features [:no-safe-fns] instead."], null)], null);
+quil.middlewares.deprecated_options.check_features_vector = (function quil$middlewares$deprecated_options$check_features_vector(features){
+var features__$1 = cljs.core.set.call(null,features);
+if(cljs.core.truth_(features__$1.call(null,new cljs.core.Keyword(null,"no-safe-draw","no-safe-draw",-1157778157)))){
+cljs.core.println.call(null,"Feature :no-safe-draw was renamed to :no-safe-fns in Quil 2.1.","Use :feature [:no-safe-fns] now.");
+} else {
+}
+
+return cljs.core.disj.call(null,features__$1,new cljs.core.Keyword(null,"no-safe-draw","no-safe-draw",-1157778157));
+});
+/**
+ * Checks if options map contains deprected options and removes them.
+ * Prints messages how to fix deprecated functions.
+ */
+quil.middlewares.deprecated_options.deprecated_options = (function quil$middlewares$deprecated_options$deprecated_options(options){
+var options__$1 = cljs.core.update_in.call(null,options,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"features","features",-1146962336)], null),quil.middlewares.deprecated_options.check_features_vector);
+return cljs.core.into.call(null,cljs.core.PersistentArrayMap.EMPTY,cljs.core.remove.call(null,cljs.core.nil_QMARK_,(function (){var iter__7602__auto__ = ((function (options__$1){
+return (function quil$middlewares$deprecated_options$deprecated_options_$_iter__8042(s__8043){
+return (new cljs.core.LazySeq(null,((function (options__$1){
+return (function (){
+var s__8043__$1 = s__8043;
+while(true){
+var temp__4657__auto__ = cljs.core.seq.call(null,s__8043__$1);
+if(temp__4657__auto__){
+var s__8043__$2 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_.call(null,s__8043__$2)){
+var c__7600__auto__ = cljs.core.chunk_first.call(null,s__8043__$2);
+var size__7601__auto__ = cljs.core.count.call(null,c__7600__auto__);
+var b__8045 = cljs.core.chunk_buffer.call(null,size__7601__auto__);
+if((function (){var i__8044 = (0);
+while(true){
+if((i__8044 < size__7601__auto__)){
+var vec__8058 = cljs.core._nth.call(null,c__7600__auto__,i__8044);
+var name = cljs.core.nth.call(null,vec__8058,(0),null);
+var value = cljs.core.nth.call(null,vec__8058,(1),null);
+cljs.core.chunk_append.call(null,b__8045,(function (){var temp__4655__auto__ = quil.middlewares.deprecated_options.deprecated.call(null,name);
+if(cljs.core.truth_(temp__4655__auto__)){
+var vec__8061 = temp__4655__auto__;
+var version = cljs.core.nth.call(null,vec__8061,(0),null);
+var message = cljs.core.nth.call(null,vec__8061,(1),null);
+cljs.core.println.call(null,name,"option was removed in Quil",version,".",message);
+
+return null;
+} else {
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [name,value], null);
+}
+})());
+
+var G__8070 = (i__8044 + (1));
+i__8044 = G__8070;
+continue;
+} else {
+return true;
+}
+break;
+}
+})()){
+return cljs.core.chunk_cons.call(null,cljs.core.chunk.call(null,b__8045),quil$middlewares$deprecated_options$deprecated_options_$_iter__8042.call(null,cljs.core.chunk_rest.call(null,s__8043__$2)));
+} else {
+return cljs.core.chunk_cons.call(null,cljs.core.chunk.call(null,b__8045),null);
+}
+} else {
+var vec__8064 = cljs.core.first.call(null,s__8043__$2);
+var name = cljs.core.nth.call(null,vec__8064,(0),null);
+var value = cljs.core.nth.call(null,vec__8064,(1),null);
+return cljs.core.cons.call(null,(function (){var temp__4655__auto__ = quil.middlewares.deprecated_options.deprecated.call(null,name);
+if(cljs.core.truth_(temp__4655__auto__)){
+var vec__8067 = temp__4655__auto__;
+var version = cljs.core.nth.call(null,vec__8067,(0),null);
+var message = cljs.core.nth.call(null,vec__8067,(1),null);
+cljs.core.println.call(null,name,"option was removed in Quil",version,".",message);
+
+return null;
+} else {
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [name,value], null);
+}
+})(),quil$middlewares$deprecated_options$deprecated_options_$_iter__8042.call(null,cljs.core.rest.call(null,s__8043__$2)));
+}
+} else {
+return null;
+}
+break;
+}
+});})(options__$1))
+,null,null));
+});})(options__$1))
+;
+return iter__7602__auto__.call(null,options__$1);
+})()));
+});
+
+//# sourceMappingURL=deprecated_options.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/deprecated_options.js.map b/src/http/static/viz/1/quil/middlewares/deprecated_options.js.map
new file mode 100644
index 0000000..e093f8c
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/deprecated_options.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/deprecated_options.js","sources":["deprecated_options.cljc"],"lineCount":95,"mappings":";AAAA;;AAEA,iDAAA,2CAAA,wDAAA,mFAAA,MAAA,sDAAA,wDAAA,mFAAA,MAAA,gDAAA,qEAAA,mFAAA,MAAA,loBAAeA;AAKf,4DAAA,5DAAOC,gIAAuBC;AAA9B,AACE,IAAMA,eAAS,AAACC,wBAAID;AAApB,AACE,oBAAM,uBAAA,vBAACA;AAAP,AACE,4BAAA,iEAAA,7FAACE;;AADH;;AAGA,6CAAA,tCAACC,yBAAKH;;AAEV;;;;yDAAA,zDAAMI,0HAGHC;AAHH,AAIE,IAAMA,cAAQ,sCAAA,mFAAA,zHAACC,8BAAUD,iKAAoBN;AAA7C,mHACO,iBAAAQ,qBAAA,tFAKA,AAAC+B,2BAAOC,9FACR,gCAAA,zBAACC;qFANDhC;AAAA,AAAA,YAAAC,kBAAA,KAAA;;AAAA,AAAA,IAAAD,cAAAA;;AAAA,AAAA,IAAAE,qBAAA,AAAAC,wBAAAH;AAAA,AAAA,GAAAE;AAAA,AAAA,IAAAF,cAAAE;AAAA,AAAA,GAAA,AAAAE,uCAAAJ;AAAA,IAAAK,kBAqwE0C,AAAA4B,gCAAAjC;IArwE1CM,qBAAA,AAAAC,0BAAAF;IAAAG,UAAA,AAAAC,iCAAAH;AAAA,AAAA,GAAA,AAAA,iBAAAI,UAAA;;AAAA,AAAA,GAAA,CAAAA,UAAAJ;AAAA,IAAAK,YAAA,AAAAC,yBAAAP,gBAAAK;WAAA,AAAAG,wBAAAF,UAAA,IAAA,7CAAOY;YAAP,AAAAV,wBAAAF,UAAA,IAAA,9CAAYa;AAAZ,AAAA,AAAA,AAAAV,iCAAAN,QACE,iBAAAiB,qBAA2B,AAACnC,yDAAWiC;AAAvC,AAAA,oBAAAE;AAAA,IAAAC,YAAAD;cAAA,AAAAZ,wBAAAa,UAAA,IAAA,hDAAUE;cAAV,AAAAf,wBAAAa,UAAA,IAAA,hDAAkBG;AAAlB,AACE,AAAI,iCAAA,qCAAA,tEAACnC,4BAAQ6B,kCAAkCK,YAAYC;;AAA3D;;AADF,0FAGGN,KAAKC;;;;AAJV,cAAA,CAAAd,UAAA;;;;AAAA;;;;;AAAA,OAAAK,+BAAA,AAAAC,0BAAAR,SAAA,AAAAS,8EAAA,AAAAC,+BAAAlB;;AAAA,OAAAe,+BAAA,AAAAC,0BAAAR,SAAA;;;AAAA,IAAAW,YAAA,AAAAC,0BAAApB;WAAA,AAAAa,wBAAAM,UAAA,IAAA,7CAAOI;YAAP,AAAAV,wBAAAM,UAAA,IAAA,9CAAYK;AAAZ,AAAA,OAAAH,yBACE,iBAAAI,qBAA2B,AAACnC,yDAAWiC;AAAvC,AAAA,oBAAAE;AAAA,IAAAE,YAAAF;cAAA,AAAAZ,wBAAAc,UAAA,IAAA,hDAAUC;cAAV,AAAAf,wBAAAc,UAAA,IAAA,hDAAkBE;AAAlB,AACE,AAAI,iCAAA,qCAAA,tEAACnC,4BAAQ6B,kCAAkCK,YAAYC;;AAA3D;;AADF,0FAGGN,KAAKC;;KAJV,AAAAP,8EAAA,AAAAK,yBAAAtB;;;AAAA;;;;;CAAA,KAAA;;;AAAA,AAAA,OAAAD,6BAAmBF","names":["quil.middlewares.deprecated-options\/deprecated","quil.middlewares.deprecated-options\/check-features-vector","features","cljs.core\/set","cljs.core\/println","cljs.core\/disj","quil.middlewares.deprecated-options\/deprecated-options","options","cljs.core\/update-in","iter__7602__auto__","s__8043","cljs.core\/LazySeq","temp__4657__auto__","cljs.core\/seq","cljs.core\/chunked-seq?","c__7600__auto__","size__7601__auto__","cljs.core\/count","b__8045","cljs.core\/chunk-buffer","i__8044","vec__8058","cljs.core\/-nth","cljs.core\/nth","cljs.core\/chunk-append","cljs.core\/chunk-cons","cljs.core\/chunk","iter__8042","cljs.core\/chunk-rest","vec__8064","cljs.core\/first","cljs.core\/cons","cljs.core\/rest","name","value","temp__4655__auto__","vec__8061","vec__8067","version","message","cljs.core\/remove","cljs.core\/nil?","cljs.core\/into","cljs.core\/chunk-first"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/fun_mode.cljc b/src/http/static/viz/1/quil/middlewares/fun_mode.cljc
new file mode 100644
index 0000000..14330c7
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/fun_mode.cljc
@@ -0,0 +1,78 @@
+(ns quil.middlewares.fun-mode
+ (:require [quil.core :as q]))
+
+(defn- wrap-setup [options]
+ (let [setup (:setup options (fn [] nil))]
+ (assoc options
+ :setup #(reset! (q/state-atom) (setup)))))
+
+(defn- wrap-draw-update [options]
+ (let [draw (:draw options (fn [_]))
+ update (:update options identity)
+ quil-draw #(-> (q/state-atom)
+ (swap! (if (= (q/frame-count) 1)
+ identity
+ update))
+ (draw))]
+ (-> options
+ (dissoc :update)
+ (assoc :draw quil-draw))))
+
+(defn- mouse-event []
+ {:x (q/mouse-x)
+ :y (q/mouse-y)})
+
+(defn- mouse-event-full []
+ {:x (q/mouse-x)
+ :y (q/mouse-y)
+ :button (q/mouse-button)})
+
+(defn- key-event []
+ {:key (q/key-as-keyword)
+ :key-code (q/key-code)
+ :raw-key (q/raw-key)
+ #?@(:clj [:modifiers (q/key-modifiers)])})
+
+(defn- wrap-handler
+ ([options handler-key]
+ (wrap-handler options handler-key nil))
+ ([options handler-key event-fn]
+ (if-let [handler (options handler-key)]
+ (assoc options handler-key
+ (if event-fn
+ #(swap! (q/state-atom) handler (event-fn))
+ #(swap! (q/state-atom) handler)))
+ options)))
+
+(defn- wrap-handlers [options & handlers]
+ (reduce (fn [options handler]
+ (if (keyword? handler)
+ (wrap-handler options handler)
+ (apply wrap-handler options handler)))
+ options handlers))
+
+(defn- wrap-mouse-wheel [options]
+ (if-let [handler (:mouse-wheel options)]
+ (assoc options :mouse-wheel
+ (fn [rotation]
+ (swap! (q/state-atom) handler rotation)))
+ options))
+
+(defn fun-mode
+ "Introduces function mode making all handlers (setup, draw, mouse-click, etc)
+ state-aware. Adds support for 'update' function."
+ [options]
+ (-> options
+ wrap-setup
+ wrap-draw-update
+ (wrap-handlers :focus-gained :focus-lost [:mouse-entered mouse-event]
+ [:mouse-exited mouse-event] [:mouse-pressed mouse-event-full]
+ [:mouse-released mouse-event] [:mouse-clicked mouse-event-full]
+ [:mouse-moved (fn [] {:x (q/mouse-x) :y (q/mouse-y)
+ :p-x (q/pmouse-x) :p-y (q/pmouse-y)})]
+ [:mouse-dragged (fn [] {:x (q/mouse-x) :y (q/mouse-y)
+ :p-x (q/pmouse-x) :p-y (q/pmouse-y)
+ :button (q/mouse-button)})]
+ [:key-pressed key-event] :key-released [:key-typed key-event]
+ :on-close)
+ wrap-mouse-wheel))
diff --git a/src/http/static/viz/1/quil/middlewares/fun_mode.cljc.cache.edn b/src/http/static/viz/1/quil/middlewares/fun_mode.cljc.cache.edn
new file mode 100644
index 0000000..bde2282
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/fun_mode.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {Error {}}, :use-macros {}, :excludes #{}, :name quil.middlewares.fun-mode, :imports nil, :requires {q quil.core, quil.core quil.core}, :uses nil, :defs {wrap-setup {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 4, :column 8, :end-line 4, :end-column 18, :private true, :arglists (quote ([options]))}, :private true, :name quil.middlewares.fun-mode/wrap-setup, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 18, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 4, :end-line 4, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options]))}, wrap-draw-update {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 9, :column 8, :end-line 9, :end-column 24, :private true, :arglists (quote ([options]))}, :private true, :name quil.middlewares.fun-mode/wrap-draw-update, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 24, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 9, :end-line 9, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options]))}, mouse-event {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 21, :column 8, :end-line 21, :end-column 19, :private true, :arglists (quote ([]))}, :private true, :name quil.middlewares.fun-mode/mouse-event, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 19, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 21, :end-line 21, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, mouse-event-full {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 25, :column 8, :end-line 25, :end-column 24, :private true, :arglists (quote ([]))}, :private true, :name quil.middlewares.fun-mode/mouse-event-full, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 24, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 25, :end-line 25, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, key-event {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 30, :column 8, :end-line 30, :end-column 17, :private true, :arglists (quote ([]))}, :private true, :name quil.middlewares.fun-mode/key-event, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 17, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 30, :end-line 30, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, wrap-handler {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 36, :column 8, :end-line 36, :end-column 20, :private true, :arglists (quote ([options handler-key] [options handler-key event-fn])), :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([options handler-key] [options handler-key event-fn]), :arglists ([options handler-key] [options handler-key event-fn]), :arglists-meta (nil nil)}}, :private true, :name quil.middlewares.fun-mode/wrap-handler, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 20, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([options handler-key] [options handler-key event-fn]), :arglists ([options handler-key] [options handler-key event-fn]), :arglists-meta (nil nil)}, :method-params ([options handler-key] [options handler-key event-fn]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 36, :end-line 36, :max-fixed-arity 3, :fn-var true, :arglists ([options handler-key] [options handler-key event-fn])}, wrap-handlers {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 47, :column 8, :end-line 47, :end-column 21, :private true, :arglists (quote ([options & handlers])), :top-fn {:variadic true, :max-fixed-arity 1, :method-params [(options handlers)], :arglists ([options & handlers]), :arglists-meta (nil)}}, :private true, :name quil.middlewares.fun-mode/wrap-handlers, :variadic true, :file "out/quil/middlewares/fun_mode.cljc", :end-column 21, :top-fn {:variadic true, :max-fixed-arity 1, :method-params [(options handlers)], :arglists ([options & handlers]), :arglists-meta (nil)}, :method-params [(options handlers)], :protocol-impl nil, :arglists-meta (nil), :column 1, :line 47, :end-line 47, :max-fixed-arity 1, :fn-var true, :arglists ([options & handlers])}, wrap-mouse-wheel {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 54, :column 8, :end-line 54, :end-column 24, :private true, :arglists (quote ([options]))}, :private true, :name quil.middlewares.fun-mode/wrap-mouse-wheel, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 24, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 54, :end-line 54, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options]))}, fun-mode {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 61, :column 7, :end-line 61, :end-column 15, :arglists (quote ([options])), :doc "Introduces function mode making all handlers (setup, draw, mouse-click, etc)\n state-aware. Adds support for 'update' function."}, :name quil.middlewares.fun-mode/fun-mode, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 15, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 61, :end-line 61, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Introduces function mode making all handlers (setup, draw, mouse-click, etc)\n state-aware. Adds support for 'update' function."}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:y :key-code :p-y :key-typed :mouse-clicked :mouse-released :mouse-exited :key :on-close :button :mouse-wheel :mouse-moved :update :setup :mouse-pressed :focus-gained :mouse-entered :focus-lost :key-pressed :key-released :p-x :x :raw-key :draw :mouse-dragged}, :order [:setup :draw :update :x :y :button :key :key-code :raw-key :mouse-wheel :focus-gained :focus-lost :mouse-entered :mouse-exited :mouse-pressed :mouse-released :mouse-clicked :mouse-moved :p-x :p-y :mouse-dragged :key-pressed :key-released :key-typed :on-close]}, :doc nil} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/fun_mode.js b/src/http/static/viz/1/quil/middlewares/fun_mode.js
new file mode 100644
index 0000000..d6db370
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/fun_mode.js
@@ -0,0 +1,155 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.middlewares.fun_mode');
+goog.require('cljs.core');
+goog.require('quil.core');
+quil.middlewares.fun_mode.wrap_setup = (function quil$middlewares$fun_mode$wrap_setup(options){
+var setup = new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$2(options,(function (){
+return null;
+}));
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"setup","setup",1987730512),((function (setup){
+return (function (){
+return cljs.core.reset_BANG_.call(null,quil.core.state_atom.call(null),setup.call(null));
+});})(setup))
+);
+});
+quil.middlewares.fun_mode.wrap_draw_update = (function quil$middlewares$fun_mode$wrap_draw_update(options){
+var draw = new cljs.core.Keyword(null,"draw","draw",1358331674).cljs$core$IFn$_invoke$arity$2(options,(function (_){
+return null;
+}));
+var update = new cljs.core.Keyword(null,"update","update",1045576396).cljs$core$IFn$_invoke$arity$2(options,cljs.core.identity);
+var quil_draw = ((function (draw,update){
+return (function (){
+return draw.call(null,cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),((cljs.core._EQ_.call(null,quil.core.frame_count.call(null),(1)))?cljs.core.identity:update)));
+});})(draw,update))
+;
+return cljs.core.assoc.call(null,cljs.core.dissoc.call(null,options,new cljs.core.Keyword(null,"update","update",1045576396)),new cljs.core.Keyword(null,"draw","draw",1358331674),quil_draw);
+});
+quil.middlewares.fun_mode.mouse_event = (function quil$middlewares$fun_mode$mouse_event(){
+return new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null)], null);
+});
+quil.middlewares.fun_mode.mouse_event_full = (function quil$middlewares$fun_mode$mouse_event_full(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null),new cljs.core.Keyword(null,"button","button",1456579943),quil.core.mouse_button.call(null)], null);
+});
+quil.middlewares.fun_mode.key_event = (function quil$middlewares$fun_mode$key_event(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"key","key",-1516042587),quil.core.key_as_keyword.call(null),new cljs.core.Keyword(null,"key-code","key-code",-1732114304),quil.core.key_code.call(null),new cljs.core.Keyword(null,"raw-key","raw-key",-162482279),quil.core.raw_key.call(null)], null);
+});
+quil.middlewares.fun_mode.wrap_handler = (function quil$middlewares$fun_mode$wrap_handler(var_args){
+var args9435 = [];
+var len__7927__auto___9438 = arguments.length;
+var i__7928__auto___9439 = (0);
+while(true){
+if((i__7928__auto___9439 < len__7927__auto___9438)){
+args9435.push((arguments[i__7928__auto___9439]));
+
+var G__9440 = (i__7928__auto___9439 + (1));
+i__7928__auto___9439 = G__9440;
+continue;
+} else {
+}
+break;
+}
+
+var G__9437 = args9435.length;
+switch (G__9437) {
+case 2:
+return quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9435.length)].join('')));
+
+}
+});
+
+quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$2 = (function (options,handler_key){
+return quil.middlewares.fun_mode.wrap_handler.call(null,options,handler_key,null);
+});
+
+quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$3 = (function (options,handler_key,event_fn){
+var temp__4655__auto__ = options.call(null,handler_key);
+if(cljs.core.truth_(temp__4655__auto__)){
+var handler = temp__4655__auto__;
+return cljs.core.assoc.call(null,options,handler_key,(cljs.core.truth_(event_fn)?((function (handler,temp__4655__auto__){
+return (function (){
+return cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),handler,event_fn.call(null));
+});})(handler,temp__4655__auto__))
+:((function (handler,temp__4655__auto__){
+return (function (){
+return cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),handler);
+});})(handler,temp__4655__auto__))
+));
+} else {
+return options;
+}
+});
+
+quil.middlewares.fun_mode.wrap_handler.cljs$lang$maxFixedArity = 3;
+
+quil.middlewares.fun_mode.wrap_handlers = (function quil$middlewares$fun_mode$wrap_handlers(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___9444 = arguments.length;
+var i__7928__auto___9445 = (0);
+while(true){
+if((i__7928__auto___9445 < len__7927__auto___9444)){
+args__7934__auto__.push((arguments[i__7928__auto___9445]));
+
+var G__9446 = (i__7928__auto___9445 + (1));
+i__7928__auto___9445 = G__9446;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((1) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((1)),(0),null)):null);
+return quil.middlewares.fun_mode.wrap_handlers.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7935__auto__);
+});
+
+quil.middlewares.fun_mode.wrap_handlers.cljs$core$IFn$_invoke$arity$variadic = (function (options,handlers){
+return cljs.core.reduce.call(null,(function (options__$1,handler){
+if((handler instanceof cljs.core.Keyword)){
+return quil.middlewares.fun_mode.wrap_handler.call(null,options__$1,handler);
+} else {
+return cljs.core.apply.call(null,quil.middlewares.fun_mode.wrap_handler,options__$1,handler);
+}
+}),options,handlers);
+});
+
+quil.middlewares.fun_mode.wrap_handlers.cljs$lang$maxFixedArity = (1);
+
+quil.middlewares.fun_mode.wrap_handlers.cljs$lang$applyTo = (function (seq9442){
+var G__9443 = cljs.core.first.call(null,seq9442);
+var seq9442__$1 = cljs.core.next.call(null,seq9442);
+return quil.middlewares.fun_mode.wrap_handlers.cljs$core$IFn$_invoke$arity$variadic(G__9443,seq9442__$1);
+});
+
+quil.middlewares.fun_mode.wrap_mouse_wheel = (function quil$middlewares$fun_mode$wrap_mouse_wheel(options){
+var temp__4655__auto__ = new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439).cljs$core$IFn$_invoke$arity$1(options);
+if(cljs.core.truth_(temp__4655__auto__)){
+var handler = temp__4655__auto__;
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439),((function (handler,temp__4655__auto__){
+return (function (rotation){
+return cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),handler,rotation);
+});})(handler,temp__4655__auto__))
+);
+} else {
+return options;
+}
+});
+/**
+ * Introduces function mode making all handlers (setup, draw, mouse-click, etc)
+ * state-aware. Adds support for 'update' function.
+ */
+quil.middlewares.fun_mode.fun_mode = (function quil$middlewares$fun_mode$fun_mode(options){
+return quil.middlewares.fun_mode.wrap_mouse_wheel.call(null,quil.middlewares.fun_mode.wrap_handlers.call(null,quil.middlewares.fun_mode.wrap_draw_update.call(null,quil.middlewares.fun_mode.wrap_setup.call(null,options)),new cljs.core.Keyword(null,"focus-gained","focus-gained",-857086384),new cljs.core.Keyword(null,"focus-lost","focus-lost",-554849613),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-entered","mouse-entered",811350322),quil.middlewares.fun_mode.mouse_event], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-exited","mouse-exited",-483205244),quil.middlewares.fun_mode.mouse_event], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-pressed","mouse-pressed",736955536),quil.middlewares.fun_mode.mouse_event_full], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-released","mouse-released",-664480061),quil.middlewares.fun_mode.mouse_event], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-clicked","mouse-clicked",-199339421),quil.middlewares.fun_mode.mouse_event_full], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-moved","mouse-moved",-1918152310),(function (){
+return new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null),new cljs.core.Keyword(null,"p-x","p-x",-1721211211),quil.core.pmouse_x.call(null),new cljs.core.Keyword(null,"p-y","p-y",-530704830),quil.core.pmouse_y.call(null)], null);
+})], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441),(function (){
+return new cljs.core.PersistentArrayMap(null, 5, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null),new cljs.core.Keyword(null,"p-x","p-x",-1721211211),quil.core.pmouse_x.call(null),new cljs.core.Keyword(null,"p-y","p-y",-530704830),quil.core.pmouse_y.call(null),new cljs.core.Keyword(null,"button","button",1456579943),quil.core.mouse_button.call(null)], null);
+})], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364),quil.middlewares.fun_mode.key_event], null),new cljs.core.Keyword(null,"key-released","key-released",215919828),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"key-typed","key-typed",-876037597),quil.middlewares.fun_mode.key_event], null),new cljs.core.Keyword(null,"on-close","on-close",-761178394)));
+});
+
+//# sourceMappingURL=fun_mode.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/fun_mode.js.map b/src/http/static/viz/1/quil/middlewares/fun_mode.js.map
new file mode 100644
index 0000000..a4854ee
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/fun_mode.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/fun_mode.js","sources":["fun_mode.cljc"],"lineCount":155,"mappings":"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","names":["quil.middlewares.fun-mode\/wrap-setup","options","setup","cljs.core\/assoc","cljs.core\/reset!","quil.core\/state-atom","quil.middlewares.fun-mode\/wrap-draw-update","draw","_","update","cljs.core\/identity","quil-draw","cljs.core\/swap!","cljs.core\/=","quil.core\/frame-count","cljs.core\/dissoc","quil.middlewares.fun-mode\/mouse-event","quil.core\/mouse-x","quil.core\/mouse-y","quil.middlewares.fun-mode\/mouse-event-full","quil.core\/mouse-button","quil.middlewares.fun-mode\/key-event","quil.core\/key-as-keyword","quil.core\/key-code","quil.core\/raw-key","var_args","args9435","len__7927__auto__","i__7928__auto__","G__9437","quil.middlewares.fun-mode\/wrap-handler","js\/Error","handler-key","event-fn","temp__4655__auto__","handler","args__7934__auto__","argseq__7935__auto__","cljs.core\/IndexedSeq","quil.middlewares.fun-mode\/wrap-handlers","seq9442","G__9443","cljs.core\/first","cljs.core\/next","handlers","cljs.core\/reduce","cljs.core\/Keyword","cljs.core\/apply","quil.middlewares.fun-mode\/wrap-mouse-wheel","rotation","quil.middlewares.fun-mode\/fun-mode","quil.core\/pmouse-x","quil.core\/pmouse-y"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/navigation_2d.cljc b/src/http/static/viz/1/quil/middlewares/navigation_2d.cljc
new file mode 100644
index 0000000..cd03710
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/navigation_2d.cljc
@@ -0,0 +1,89 @@
+(ns quil.middlewares.navigation-2d
+ (:require [quil.core :as q :include-macros true]))
+
+(def ^:private missing-navigation-key-error
+ (str "state map is missing :navigation-2d key. "
+ "Did you accidentally removed it from the state in "
+ ":update or any other handler?"))
+
+(defn- assert-state-has-navigation
+ "Asserts that state map contains :navigation-2d object."
+ [state]
+ (when-not (:navigation-2d state)
+ (throw #?(:clj (RuntimeException. missing-navigation-key-error)
+ :cljs (js/Error. missing-navigation-key-error)))))
+
+(defn- default-position
+ "Default position configuration: zoom is neutral and central point is
+ width/2, height/2."
+ []
+ {:position [(/ (q/width) 2.0)
+ (/ (q/height) 2.0)]
+ :zoom 1})
+
+(defn- setup-2d-nav
+ "Custom 'setup' function which creates initial position
+ configuration and puts it to the state map."
+ [user-setup user-settings]
+ (let [initial-state (-> user-settings
+ (select-keys [:position :zoom])
+ (->> (merge (default-position))))]
+ (update-in (user-setup) [:navigation-2d]
+ #(merge initial-state %))))
+
+(defn- mouse-dragged
+ "Changes center of the sketch depending on the last mouse move. Takes
+ zoom into account as well."
+ [state event]
+ (assert-state-has-navigation state)
+ (let [dx (- (:p-x event) (:x event))
+ dy (- (:p-y event) (:y event))
+ zoom (-> state :navigation-2d :zoom)]
+ (-> state
+ (update-in [:navigation-2d :position 0] + (/ dx zoom))
+ (update-in [:navigation-2d :position 1] + (/ dy zoom)))))
+
+(defn- mouse-wheel
+ "Changes zoom settings based on scroll."
+ [state event]
+ (assert-state-has-navigation state)
+ (update-in state [:navigation-2d :zoom] * (+ 1 (* -0.1 event))))
+
+(defn- draw
+ "Calls user draw function with necessary all transformations (position
+ and zoom) applied."
+ [user-draw state]
+ (assert-state-has-navigation state)
+ (q/push-matrix)
+ (let [nav-2d (:navigation-2d state)
+ zoom (:zoom nav-2d)
+ pos (:position nav-2d)]
+ (q/scale zoom)
+ (q/with-translation [(- (/ (q/width) 2 zoom) (first pos))
+ (- (/ (q/height) 2 zoom) (second pos))]
+ (user-draw state)))
+ (q/pop-matrix))
+
+(defn navigation-2d
+ "Enables navigation over 2D sketch. Dragging mouse will move center of the
+ skecth and mouse wheel controls zoom."
+ [options]
+ (let [; 2d-navigation related user settings
+ user-settings (:navigation-2d options)
+
+ ; user-provided handlers which will be overridden
+ ; by 3d-navigation
+ user-draw (:draw options (fn [state]))
+ user-mouse-dragged (:mouse-dragged options (fn [state _] state))
+ user-mouse-wheel (:mouse-wheel options (fn [state _] state))
+ setup (:setup options (fn [] {}))]
+ (assoc options
+
+ :setup (partial setup-2d-nav setup user-settings)
+
+ :draw (partial draw user-draw)
+
+ :mouse-dragged (fn [state event]
+ (user-mouse-dragged (mouse-dragged state event) event))
+ :mouse-wheel (fn [state event]
+ (user-mouse-wheel (mouse-wheel state event) event)))))
diff --git a/src/http/static/viz/1/quil/middlewares/navigation_2d.cljc.cache.edn b/src/http/static/viz/1/quil/middlewares/navigation_2d.cljc.cache.edn
new file mode 100644
index 0000000..865d7b4
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/navigation_2d.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {Error {}}, :use-macros {}, :excludes #{}, :name quil.middlewares.navigation-2d, :imports nil, :requires {q quil.core, quil.core quil.core}, :uses nil, :defs {missing-navigation-key-error {:name quil.middlewares.navigation-2d/missing-navigation-key-error, :file "out/quil/middlewares/navigation_2d.cljc", :line 4, :column 1, :end-line 4, :end-column 44, :private true, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 4, :column 16, :end-line 4, :end-column 44, :private true}, :tag any}, assert-state-has-navigation {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 9, :column 8, :end-line 9, :end-column 35, :private true, :arglists (quote ([state])), :doc "Asserts that state map contains :navigation-2d object."}, :private true, :name quil.middlewares.navigation-2d/assert-state-has-navigation, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 35, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 9, :end-line 9, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state])), :doc "Asserts that state map contains :navigation-2d object."}, default-position {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 16, :column 8, :end-line 16, :end-column 24, :private true, :arglists (quote ([])), :doc "Default position configuration: zoom is neutral and central point is\n width/2, height/2."}, :private true, :name quil.middlewares.navigation-2d/default-position, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 24, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 16, :end-line 16, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Default position configuration: zoom is neutral and central point is\n width/2, height/2."}, setup-2d-nav {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 24, :column 8, :end-line 24, :end-column 20, :private true, :arglists (quote ([user-setup user-settings])), :doc "Custom 'setup' function which creates initial position\n configuration and puts it to the state map."}, :private true, :name quil.middlewares.navigation-2d/setup-2d-nav, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 20, :method-params ([user-setup user-settings]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 24, :end-line 24, :max-fixed-arity 2, :fn-var true, :arglists (quote ([user-setup user-settings])), :doc "Custom 'setup' function which creates initial position\n configuration and puts it to the state map."}, mouse-dragged {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 34, :column 8, :end-line 34, :end-column 21, :private true, :arglists (quote ([state event])), :doc "Changes center of the sketch depending on the last mouse move. Takes\n zoom into account as well."}, :private true, :name quil.middlewares.navigation-2d/mouse-dragged, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 21, :method-params ([state event]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 34, :end-line 34, :max-fixed-arity 2, :fn-var true, :arglists (quote ([state event])), :doc "Changes center of the sketch depending on the last mouse move. Takes\n zoom into account as well."}, mouse-wheel {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 46, :column 8, :end-line 46, :end-column 19, :private true, :arglists (quote ([state event])), :doc "Changes zoom settings based on scroll."}, :private true, :name quil.middlewares.navigation-2d/mouse-wheel, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 19, :method-params ([state event]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 46, :end-line 46, :max-fixed-arity 2, :fn-var true, :arglists (quote ([state event])), :doc "Changes zoom settings based on scroll."}, draw {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 52, :column 8, :end-line 52, :end-column 12, :private true, :arglists (quote ([user-draw state])), :doc "Calls user draw function with necessary all transformations (position\n and zoom) applied."}, :private true, :name quil.middlewares.navigation-2d/draw, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 12, :method-params ([user-draw state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 52, :end-line 52, :max-fixed-arity 2, :fn-var true, :arglists (quote ([user-draw state])), :doc "Calls user draw function with necessary all transformations (position\n and zoom) applied."}, navigation-2d {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 67, :column 7, :end-line 67, :end-column 20, :arglists (quote ([options])), :doc "Enables navigation over 2D sketch. Dragging mouse will move center of the\n skecth and mouse wheel controls zoom."}, :name quil.middlewares.navigation-2d/navigation-2d, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 20, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 67, :end-line 67, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Enables navigation over 2D sketch. Dragging mouse will move center of the\n skecth and mouse wheel controls zoom."}}, :require-macros {q quil.core, quil.core quil.core}, :cljs.analyzer/constants {:seen #{:y :p-y :zoom :mouse-wheel :setup :p-x :position :x :draw :navigation-2d :mouse-dragged}, :order [:navigation-2d :position :zoom :p-x :x :p-y :y :draw :mouse-dragged :mouse-wheel :setup]}, :doc nil} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/navigation_2d.js b/src/http/static/viz/1/quil/middlewares/navigation_2d.js
new file mode 100644
index 0000000..5659fe1
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/navigation_2d.js
@@ -0,0 +1,116 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.middlewares.navigation_2d');
+goog.require('cljs.core');
+goog.require('quil.core');
+quil.middlewares.navigation_2d.missing_navigation_key_error = [cljs.core.str.cljs$core$IFn$_invoke$arity$1("state map is missing :navigation-2d key. "),cljs.core.str.cljs$core$IFn$_invoke$arity$1("Did you accidentally removed it from the state in "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(":update or any other handler?")].join('');
+/**
+ * Asserts that state map contains :navigation-2d object.
+ */
+quil.middlewares.navigation_2d.assert_state_has_navigation = (function quil$middlewares$navigation_2d$assert_state_has_navigation(state){
+if(cljs.core.truth_(new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(state))){
+return null;
+} else {
+throw (new Error(quil.middlewares.navigation_2d.missing_navigation_key_error));
+}
+});
+/**
+ * Default position configuration: zoom is neutral and central point is
+ * width/2, height/2.
+ */
+quil.middlewares.navigation_2d.default_position = (function quil$middlewares$navigation_2d$default_position(){
+return new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"position","position",-2011731912),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(quil.core.width.call(null) / 2.0),(quil.core.height.call(null) / 2.0)], null),new cljs.core.Keyword(null,"zoom","zoom",-1827487038),(1)], null);
+});
+/**
+ * Custom 'setup' function which creates initial position
+ * configuration and puts it to the state map.
+ */
+quil.middlewares.navigation_2d.setup_2d_nav = (function quil$middlewares$navigation_2d$setup_2d_nav(user_setup,user_settings){
+var initial_state = cljs.core.merge.call(null,quil.middlewares.navigation_2d.default_position.call(null),cljs.core.select_keys.call(null,user_settings,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"position","position",-2011731912),new cljs.core.Keyword(null,"zoom","zoom",-1827487038)], null)));
+return cljs.core.update_in.call(null,user_setup.call(null),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611)], null),((function (initial_state){
+return (function (p1__9428_SHARP_){
+return cljs.core.merge.call(null,initial_state,p1__9428_SHARP_);
+});})(initial_state))
+);
+});
+/**
+ * Changes center of the sketch depending on the last mouse move. Takes
+ * zoom into account as well.
+ */
+quil.middlewares.navigation_2d.mouse_dragged = (function quil$middlewares$navigation_2d$mouse_dragged(state,event){
+quil.middlewares.navigation_2d.assert_state_has_navigation.call(null,state);
+
+var dx = (new cljs.core.Keyword(null,"p-x","p-x",-1721211211).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"x","x",2099068185).cljs$core$IFn$_invoke$arity$1(event));
+var dy = (new cljs.core.Keyword(null,"p-y","p-y",-530704830).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"y","y",-1757859776).cljs$core$IFn$_invoke$arity$1(event));
+var zoom = new cljs.core.Keyword(null,"zoom","zoom",-1827487038).cljs$core$IFn$_invoke$arity$1(new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(state));
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611),new cljs.core.Keyword(null,"position","position",-2011731912),(0)], null),cljs.core._PLUS_,(dx / zoom)),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611),new cljs.core.Keyword(null,"position","position",-2011731912),(1)], null),cljs.core._PLUS_,(dy / zoom));
+});
+/**
+ * Changes zoom settings based on scroll.
+ */
+quil.middlewares.navigation_2d.mouse_wheel = (function quil$middlewares$navigation_2d$mouse_wheel(state,event){
+quil.middlewares.navigation_2d.assert_state_has_navigation.call(null,state);
+
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611),new cljs.core.Keyword(null,"zoom","zoom",-1827487038)], null),cljs.core._STAR_,((1) + (-0.1 * event)));
+});
+/**
+ * Calls user draw function with necessary all transformations (position
+ * and zoom) applied.
+ */
+quil.middlewares.navigation_2d.draw = (function quil$middlewares$navigation_2d$draw(user_draw,state){
+quil.middlewares.navigation_2d.assert_state_has_navigation.call(null,state);
+
+quil.core.push_matrix.call(null);
+
+var nav_2d_9429 = new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(state);
+var zoom_9430 = new cljs.core.Keyword(null,"zoom","zoom",-1827487038).cljs$core$IFn$_invoke$arity$1(nav_2d_9429);
+var pos_9431 = new cljs.core.Keyword(null,"position","position",-2011731912).cljs$core$IFn$_invoke$arity$1(nav_2d_9429);
+quil.core.scale.call(null,zoom_9430);
+
+var tr__9351__auto___9432 = new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(((quil.core.width.call(null) / (2)) / zoom_9430) - cljs.core.first.call(null,pos_9431)),(((quil.core.height.call(null) / (2)) / zoom_9430) - cljs.core.second.call(null,pos_9431))], null);
+quil.core.push_matrix.call(null);
+
+try{quil.core.translate.call(null,tr__9351__auto___9432);
+
+user_draw.call(null,state);
+}finally {quil.core.pop_matrix.call(null);
+}
+return quil.core.pop_matrix.call(null);
+});
+/**
+ * Enables navigation over 2D sketch. Dragging mouse will move center of the
+ * skecth and mouse wheel controls zoom.
+ */
+quil.middlewares.navigation_2d.navigation_2d = (function quil$middlewares$navigation_2d$navigation_2d(options){
+var user_settings = new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(options);
+var user_draw = new cljs.core.Keyword(null,"draw","draw",1358331674).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings){
+return (function (state){
+return null;
+});})(user_settings))
+);
+var user_mouse_dragged = new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,user_draw){
+return (function (state,_){
+return state;
+});})(user_settings,user_draw))
+);
+var user_mouse_wheel = new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,user_draw,user_mouse_dragged){
+return (function (state,_){
+return state;
+});})(user_settings,user_draw,user_mouse_dragged))
+);
+var setup = new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,user_draw,user_mouse_dragged,user_mouse_wheel){
+return (function (){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(user_settings,user_draw,user_mouse_dragged,user_mouse_wheel))
+);
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"setup","setup",1987730512),cljs.core.partial.call(null,quil.middlewares.navigation_2d.setup_2d_nav,setup,user_settings),new cljs.core.Keyword(null,"draw","draw",1358331674),cljs.core.partial.call(null,quil.middlewares.navigation_2d.draw,user_draw),new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441),((function (user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup){
+return (function (state,event){
+return user_mouse_dragged.call(null,quil.middlewares.navigation_2d.mouse_dragged.call(null,state,event),event);
+});})(user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup))
+,new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439),((function (user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup){
+return (function (state,event){
+return user_mouse_wheel.call(null,quil.middlewares.navigation_2d.mouse_wheel.call(null,state,event),event);
+});})(user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup))
+);
+});
+
+//# sourceMappingURL=navigation_2d.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/navigation_2d.js.map b/src/http/static/viz/1/quil/middlewares/navigation_2d.js.map
new file mode 100644
index 0000000..12c44fc
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/navigation_2d.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/navigation_2d.js","sources":["navigation_2d.cljc"],"lineCount":116,"mappings":";AAAA;;;AAGA,AAAeA,8DACb,6CAAA,yFAAA,kGAAA;AAIF;;;6DAAA,7DAAOC,kIAEJC;AAFH,AAGE,oBAAU,AAAA,sGAAgBA;AAA1B;;AAAA,AACE,MACgB,KAAAC,MAAWH;;;AAE\/B;;;;kDAAA,lDAAOI;AAAP,AAAA,kDAAA,8DAAA,kKAAA,sDAAA,rIAIc,8BAAA,7BAAG,AAACC,kCACJ,+BAAA,9BAAG,AAACC;;AAGlB;;;;8CAAA,9CAAOC,oGAGJC,WAAWC;AAHd,AAIE,IAAMC,qIAAkBD,hCACA,8CAAA,mFAAA,8DAAA,\/LAACE,rFACI,AAACC,0BAAM,AAACR;AAFrC,AAGE,2DAAA,mFAAA,gFAAA,vNAACU,8BAAU,AAACN;kBAAZK;AAAA,AACY,+CAAAA,xCAACD,0BAAMF;;;;AAEvB;;;;+CAAA,\/CAAOK,sGAGJb,MAAMc;AAHT,AAIE,AAACf,qEAA4BC;;AAC7B,IAAMe,KAAG,CAAG,AAAA,kFAAMD,SAAO,AAAA,6EAAIA;IACvBE,KAAG,CAAG,AAAA,iFAAMF,SAAO,AAAA,8EAAIA;IACvBG,OAAK,AAAA,oFAAA,AAAA,sGAAIjB;AAFf,mEAGKA,9BACA,oCAAA,mFAAA,wEAAA,8DAAA,7PAACY,yQAAuCM,iBAAE,CAAGH,KAAGE,rUAChD,4UAAA,mFAAA,wEAAA,8DAAA,9hBAACL,0iBAAuCM,iBAAE,CAAGF,KAAGC;;AAEvD;;;6CAAA,7CAAOE,kGAEJnB,MAAMc;AAFT,AAGE,AAACf,qEAA4BC;;AAC7B,2CAAA,mFAAA,wEAAA,\/LAACY,8BAAUZ,+NAA6BoB,iBAAE,CAAA,MAAK,CAAA,OAAQN;;AAEzD;;;;sCAAA,tCAAOO,oFAGJC,UAAUtB;AAHb,AAIE,AAACD,qEAA4BC;;AAC7B,AAACuB;;AACD,IAAMC,cAAO,AAAA,sGAAgBxB;IACvBiB,YAAK,AAAA,oFAAOO;IACZC,WAAI,AAAA,4FAAWD;AAFrB,AAGE,AAACE,0BAAQT;;AACT,IAAAU,wBAAA,mFAAqB,CAAG,CAAA,8BAAA,7BAAG,AAACxB,oCAAWc,aAAM,AAACa,0BAAML,WAC\/B,CAAG,CAAA,+BAAA,9BAAG,AAACrB,qCAAYa,aAAM,AAACc,2BAAON;AADtD,AAAA,AAAAF;;AAAA,IAAA,AAAA,AAAAK,8BAAAD;;AAEE,AAACL,oBAAUtB;UAFb,AAAA,AAAA6B;;AAGF,OAACA;;AAEH;;;;+CAAA,\/CAAMG,sGAGHC;AAHH,AAIE,IACM1B,gBAAc,AAAA,sGAAgB0B;IAI9BX,YAAU,AAAA,mFAAOW,QAAQ;kBAAKjC;AAAL,AAAA;;;IACzBkC,qBAAmB,AAAA,sGAAgBD,QAAQ;kBAAKjC,MAAMmC;AAAX,AAAcnC;;;IACzDoC,mBAAiB,AAAA,iGAAcH,QAAQ;kBAAKjC,MAAMmC;AAAX,AAAcnC;;;IACrDqC,QAAM,AAAA,qFAAQJ,QAAQ;;AAAA,AAAA;;;AAR5B,AASE,yCAAA,oJAAA,gIAAA,tTAACK,0BAAML,+DAEE,AAACM,4BAAQlC,4CAAagC,MAAM9B,oEAE7B,AAACgC,4BAAQlB,oCAAKC,mFAEL;kBAAKtB,MAAMc;AAAX,AACE,OAACoB,6BAAmB,AAACrB,uDAAcb,MAAMc,OAAOA;;CAPnE,mEAQe;kBAAKd,MAAMc;AAAX,AACE,OAACsB,2BAAiB,AAACjB,qDAAYnB,MAAMc,OAAOA","names":["quil.middlewares.navigation-2d\/missing-navigation-key-error","quil.middlewares.navigation-2d\/assert-state-has-navigation","state","js\/Error","quil.middlewares.navigation-2d\/default-position","quil.core\/width","quil.core\/height","quil.middlewares.navigation-2d\/setup-2d-nav","user-setup","user-settings","initial-state","cljs.core\/select-keys","cljs.core\/merge","p1__9428#","cljs.core\/update-in","quil.middlewares.navigation-2d\/mouse-dragged","event","dx","dy","zoom","cljs.core\/+","quil.middlewares.navigation-2d\/mouse-wheel","cljs.core\/*","quil.middlewares.navigation-2d\/draw","user-draw","quil.core\/push-matrix","nav-2d","pos","quil.core\/scale","tr__9351__auto__","quil.core\/translate","quil.core\/pop-matrix","cljs.core\/first","cljs.core\/second","quil.middlewares.navigation-2d\/navigation-2d","options","user-mouse-dragged","_","user-mouse-wheel","setup","cljs.core\/assoc","cljs.core\/partial"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/navigation_3d.cljc b/src/http/static/viz/1/quil/middlewares/navigation_3d.cljc
new file mode 100644
index 0000000..3471cfd
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/navigation_3d.cljc
@@ -0,0 +1,188 @@
+(ns quil.middlewares.navigation-3d
+ (:require [quil.core :as q]))
+
+(def ^:private missing-navigation-key-error
+ (str "state map is missing :navigation-3d key. "
+ "Did you accidentally removed it from the state in "
+ ":update or any other handler?"))
+
+(defn- assert-state-has-navigation
+ "Asserts that state map contains :navigation-2d object."
+ [state]
+ (when-not (:navigation-3d state)
+ (throw #?(:clj (RuntimeException. missing-navigation-key-error)
+ :cljs (js/Error. missing-navigation-key-error)))))
+
+(defn- default-position
+ "Default position configuration. Check default configuration in
+ 'camera' function."
+ []
+ {:position [(/ (q/width) 2.0)
+ (/ (q/height) 2.0)
+ (/ (q/height) 2.0 (q/tan (/ (* q/PI 60.0) 360.0)))]
+ :straight [0 0 -1]
+ :up [0 1 0]})
+
+(defn- rotate-by-axis-and-angle
+ "Rotates vector v by angle with axis.
+ Formula is taken from wiki:
+ http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle"
+ [v axis angle]
+ (let [[a-x a-y a-z] axis
+ [x y z] v
+ cs (q/cos angle)
+ -cs (- 1 cs)
+ sn (q/sin angle)
+ ; Matrix is
+ ; [a b c]
+ ; [d e f]
+ ; [g h i]
+ a (+ cs (* a-x a-x -cs))
+ b (- (* a-x a-y -cs)
+ (* a-z sn))
+ c (+ (* a-x a-z -cs)
+ (* a-y sn))
+ d (+ (* a-x a-y -cs)
+ (* a-z sn))
+ e (+ cs (* a-y a-y -cs))
+ f (- (* a-y a-z -cs)
+ (* a-x sn))
+ g (- (* a-x a-z -cs)
+ (* a-y sn))
+ h (+ (* a-y a-z -cs)
+ (* a-x sn))
+ i (+ cs (* a-z a-z -cs))]
+ [(+ (* a x) (* b y) (* c z))
+ (+ (* d x) (* e y) (* f z))
+ (+ (* g x) (* h y) (* i z))]))
+
+(defn- rotate-lr
+ "Rotates nav-3d configuration left-right. angle positive - rotate right,
+ negative - left."
+ [nav-3d angle]
+ (update-in nav-3d [:straight] rotate-by-axis-and-angle (:up nav-3d) angle))
+
+(defn- cross-product
+ "Vector cross-product: http://en.wikipedia.org/wiki/Cross_product"
+ [[u1 u2 u3] [v1 v2 v3]]
+ [(- (* u2 v3) (* u3 v2))
+ (- (* u3 v1) (* u1 v3))
+ (- (* u1 v2) (* u2 v1))])
+
+(defn- v-mult
+ "Multiply vector v by scalar mult."
+ [v mult]
+ (mapv #(* % mult) v))
+
+(defn- v-plus
+ "Sum of 2 vectors."
+ [v1 v2]
+ (mapv + v1 v2))
+
+(defn- v-opposite
+ "Returns vector opposite to vector v."
+ [v]
+ (v-mult v -1))
+
+(defn- v-normalize
+ "Normalize vector, returning vector
+ which has same direction but with norm equals to 1."
+ [v]
+ (let [norm (->> (map q/sq v)
+ (apply +)
+ (q/sqrt))]
+ (v-mult v (/ norm))))
+
+(defn- rotate-ud
+ "Rotates nav-3d configuration up-down."
+ [nav-3d angle]
+ (let [axis (cross-product (:straight nav-3d) (:up nav-3d))
+ rotate #(rotate-by-axis-and-angle % axis angle)]
+ (-> nav-3d
+ (update-in [:straight] rotate)
+ (update-in [:up] rotate))))
+
+(defn- rotate
+ "Mouse handler function which rotates nav-3d configuration.
+ It uses mouse from event object and pixels-in-360 to calculate
+ angles to rotate."
+ [state event pixels-in-360]
+ (assert-state-has-navigation state)
+ (if (= 0 (:p-x event) (:p-y event))
+ state
+ (let [dx (- (:p-x event) (:x event))
+ dy (- (:y event) (:p-y event))
+ angle-lr (q/map-range dx 0 pixels-in-360 0 q/TWO-PI)
+ angle-ud (q/map-range dy 0 pixels-in-360 0 q/TWO-PI)]
+ (update-in state [:navigation-3d]
+ #(-> %
+ (rotate-lr angle-lr)
+ (rotate-ud angle-ud))))))
+
+(def ^:private space (keyword " "))
+
+(defn- move
+ "Keyboard handler function which moves nav-3d configuration.
+ It uses keyboard key from event object to determing in which
+ direction to move."
+ [state event step-size]
+ (assert-state-has-navigation state)
+ (let [{:keys [up straight]} (:navigation-3d state)]
+ (if-let [dir (condp = (:key event)
+ :w straight
+ :s (v-opposite straight)
+ space (v-opposite up)
+ :z up
+ :d (cross-product straight up)
+ :a (cross-product up straight)
+ nil)]
+ (update-in state [:navigation-3d :position]
+ #(v-plus % (v-mult dir step-size)))
+ state)))
+
+(defn- setup-3d-nav
+ "Custom 'setup' function which creates initial position
+ configuration and puts it to the state map."
+ [user-setup user-settings]
+ (let [initial-state (-> user-settings
+ (select-keys [:straight :up :position])
+ (->> (merge (default-position)))
+ (update-in [:straight] v-normalize)
+ (update-in [:up] v-normalize))]
+ (update-in (user-setup) [:navigation-3d]
+ #(merge initial-state %))))
+
+(defn navigation-3d
+ "Enables navigation in 3D space. Similar to how it is done in
+ shooters: WASD navigation, space is go up, z is go down,
+ drag mouse to look around."
+ [options]
+ (let [; 3d-navigation related user settings
+ user-settings (:navigation-3d options)
+ pixels-in-360 (:pixels-in-360 user-settings 1000)
+ step-size (:step-size user-settings 20)
+ rotate-on (:rotate-on user-settings :mouse-dragged)
+
+ ; user-provided handlers which will be overridden
+ ; by 3d-navigation
+ draw (:draw options (fn [state]))
+ key-pressed (:key-pressed options (fn [state _] state))
+ rotate-on-fn (rotate-on options (fn [state _] state))
+ setup (:setup options (fn [] {}))]
+ (assoc options
+
+ :setup (partial setup-3d-nav setup user-settings)
+
+ :draw (fn [state]
+ (assert-state-has-navigation state)
+ (let [{[c-x c-y c-z] :straight
+ [u-x u-y u-z] :up
+ [p-x p-y p-z] :position} (:navigation-3d state)]
+ (q/camera p-x p-y p-z (+ p-x c-x) (+ p-y c-y) (+ p-z c-z) u-x u-y u-z))
+ (draw state))
+
+ :key-pressed (fn [state event]
+ (key-pressed (move state event step-size) event))
+
+ rotate-on (fn [state event]
+ (rotate-on-fn (rotate state event pixels-in-360) event)) )))
diff --git a/src/http/static/viz/1/quil/middlewares/navigation_3d.cljc.cache.edn b/src/http/static/viz/1/quil/middlewares/navigation_3d.cljc.cache.edn
new file mode 100644
index 0000000..d0089cf
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/navigation_3d.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {Error {}}, :use-macros {}, :excludes #{}, :name quil.middlewares.navigation-3d, :imports nil, :requires {q quil.core, quil.core quil.core}, :uses nil, :defs {missing-navigation-key-error {:name quil.middlewares.navigation-3d/missing-navigation-key-error, :file "out/quil/middlewares/navigation_3d.cljc", :line 4, :column 1, :end-line 4, :end-column 44, :private true, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 4, :column 16, :end-line 4, :end-column 44, :private true}, :tag any}, v-normalize {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 87, :column 8, :end-line 87, :end-column 19, :private true, :arglists (quote ([v])), :doc "Normalize vector, returning vector\n which has same direction but with norm equals to 1."}, :private true, :name quil.middlewares.navigation-3d/v-normalize, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 19, :method-params ([v]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 87, :end-line 87, :max-fixed-arity 1, :fn-var true, :arglists (quote ([v])), :doc "Normalize vector, returning vector\n which has same direction but with norm equals to 1."}, v-opposite {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 82, :column 8, :end-line 82, :end-column 18, :private true, :arglists (quote ([v])), :doc "Returns vector opposite to vector v."}, :private true, :name quil.middlewares.navigation-3d/v-opposite, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 18, :method-params ([v]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 82, :end-line 82, :max-fixed-arity 1, :fn-var true, :arglists (quote ([v])), :doc "Returns vector opposite to vector v."}, v-plus {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 77, :column 8, :end-line 77, :end-column 14, :private true, :arglists (quote ([v1 v2])), :doc "Sum of 2 vectors."}, :private true, :name quil.middlewares.navigation-3d/v-plus, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 14, :method-params ([v1 v2]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 77, :end-line 77, :max-fixed-arity 2, :fn-var true, :arglists (quote ([v1 v2])), :doc "Sum of 2 vectors."}, v-mult {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 72, :column 8, :end-line 72, :end-column 14, :private true, :arglists (quote ([v mult])), :doc "Multiply vector v by scalar mult."}, :private true, :name quil.middlewares.navigation-3d/v-mult, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 14, :method-params ([v mult]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 72, :end-line 72, :max-fixed-arity 2, :fn-var true, :arglists (quote ([v mult])), :doc "Multiply vector v by scalar mult."}, space {:name quil.middlewares.navigation-3d/space, :file "out/quil/middlewares/navigation_3d.cljc", :line 122, :column 1, :end-line 122, :end-column 21, :private true, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 122, :column 16, :end-line 122, :end-column 21, :private true}, :tag any}, setup-3d-nav {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 143, :column 8, :end-line 143, :end-column 20, :private true, :arglists (quote ([user-setup user-settings])), :doc "Custom 'setup' function which creates initial position\n configuration and puts it to the state map."}, :private true, :name quil.middlewares.navigation-3d/setup-3d-nav, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 20, :method-params ([user-setup user-settings]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 143, :end-line 143, :max-fixed-arity 2, :fn-var true, :arglists (quote ([user-setup user-settings])), :doc "Custom 'setup' function which creates initial position\n configuration and puts it to the state map."}, move {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 124, :column 8, :end-line 124, :end-column 12, :private true, :arglists (quote ([state event step-size])), :doc "Keyboard handler function which moves nav-3d configuration.\n It uses keyboard key from event object to determing in which\n direction to move."}, :private true, :name quil.middlewares.navigation-3d/move, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 12, :method-params ([state event step-size]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 124, :end-line 124, :max-fixed-arity 3, :fn-var true, :arglists (quote ([state event step-size])), :doc "Keyboard handler function which moves nav-3d configuration.\n It uses keyboard key from event object to determing in which\n direction to move."}, rotate-lr {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 59, :column 8, :end-line 59, :end-column 17, :private true, :arglists (quote ([nav-3d angle])), :doc "Rotates nav-3d configuration left-right. angle positive - rotate right,\n negative - left."}, :private true, :name quil.middlewares.navigation-3d/rotate-lr, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 17, :method-params ([nav-3d angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 59, :end-line 59, :max-fixed-arity 2, :fn-var true, :arglists (quote ([nav-3d angle])), :doc "Rotates nav-3d configuration left-right. angle positive - rotate right,\n negative - left."}, cross-product {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 65, :column 8, :end-line 65, :end-column 21, :private true, :arglists (quote ([[u1 u2 u3] [v1 v2 v3]])), :doc "Vector cross-product: http://en.wikipedia.org/wiki/Cross_product"}, :private true, :name quil.middlewares.navigation-3d/cross-product, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 21, :method-params ([p__8906 p__8907]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 65, :end-line 65, :max-fixed-arity 2, :fn-var true, :arglists (quote ([[u1 u2 u3] [v1 v2 v3]])), :doc "Vector cross-product: http://en.wikipedia.org/wiki/Cross_product"}, rotate-by-axis-and-angle {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 26, :column 8, :end-line 26, :end-column 32, :private true, :arglists (quote ([v axis angle])), :doc "Rotates vector v by angle with axis.\n Formula is taken from wiki:\n http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle"}, :private true, :name quil.middlewares.navigation-3d/rotate-by-axis-and-angle, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 32, :method-params ([v axis angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 26, :end-line 26, :max-fixed-arity 3, :fn-var true, :arglists (quote ([v axis angle])), :doc "Rotates vector v by angle with axis.\n Formula is taken from wiki:\n http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle"}, assert-state-has-navigation {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 9, :column 8, :end-line 9, :end-column 35, :private true, :arglists (quote ([state])), :doc "Asserts that state map contains :navigation-2d object."}, :private true, :name quil.middlewares.navigation-3d/assert-state-has-navigation, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 35, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 9, :end-line 9, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state])), :doc "Asserts that state map contains :navigation-2d object."}, navigation-3d {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 155, :column 7, :end-line 155, :end-column 20, :arglists (quote ([options])), :doc "Enables navigation in 3D space. Similar to how it is done in\n shooters: WASD navigation, space is go up, z is go down,\n drag mouse to look around."}, :name quil.middlewares.navigation-3d/navigation-3d, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 20, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 155, :end-line 155, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Enables navigation in 3D space. Similar to how it is done in\n shooters: WASD navigation, space is go up, z is go down,\n drag mouse to look around."}, default-position {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 16, :column 8, :end-line 16, :end-column 24, :private true, :arglists (quote ([])), :doc "Default position configuration. Check default configuration in\n 'camera' function."}, :private true, :name quil.middlewares.navigation-3d/default-position, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 24, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 16, :end-line 16, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Default position configuration. Check default configuration in\n 'camera' function."}, rotate {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 105, :column 8, :end-line 105, :end-column 14, :private true, :arglists (quote ([state event pixels-in-360])), :doc "Mouse handler function which rotates nav-3d configuration.\n It uses mouse from event object and pixels-in-360 to calculate\n angles to rotate."}, :private true, :name quil.middlewares.navigation-3d/rotate, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 14, :method-params ([state event pixels-in-360]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 105, :end-line 105, :max-fixed-arity 3, :fn-var true, :arglists (quote ([state event pixels-in-360])), :doc "Mouse handler function which rotates nav-3d configuration.\n It uses mouse from event object and pixels-in-360 to calculate\n angles to rotate."}, rotate-ud {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 96, :column 8, :end-line 96, :end-column 17, :private true, :arglists (quote ([nav-3d angle])), :doc "Rotates nav-3d configuration up-down."}, :private true, :name quil.middlewares.navigation-3d/rotate-ud, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 17, :method-params ([nav-3d angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 96, :end-line 96, :max-fixed-arity 2, :fn-var true, :arglists (quote ([nav-3d angle])), :doc "Rotates nav-3d configuration up-down."}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:y :pixels-in-360 :p-y :step-size :key :w :s :rotate-on :up :setup :z :straight :key-pressed :p-x :navigation-3d :position :d :x :draw :a :mouse-dragged}, :order [:navigation-3d :position :straight :up :p-x :p-y :x :y :key :w :s :z :d :a :pixels-in-360 :step-size :rotate-on :mouse-dragged :draw :key-pressed :setup]}, :doc nil} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/navigation_3d.js b/src/http/static/viz/1/quil/middlewares/navigation_3d.js
new file mode 100644
index 0000000..19eb935
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/navigation_3d.js
@@ -0,0 +1,261 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.middlewares.navigation_3d');
+goog.require('cljs.core');
+goog.require('quil.core');
+quil.middlewares.navigation_3d.missing_navigation_key_error = [cljs.core.str.cljs$core$IFn$_invoke$arity$1("state map is missing :navigation-3d key. "),cljs.core.str.cljs$core$IFn$_invoke$arity$1("Did you accidentally removed it from the state in "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(":update or any other handler?")].join('');
+/**
+ * Asserts that state map contains :navigation-2d object.
+ */
+quil.middlewares.navigation_3d.assert_state_has_navigation = (function quil$middlewares$navigation_3d$assert_state_has_navigation(state){
+if(cljs.core.truth_(new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(state))){
+return null;
+} else {
+throw (new Error(quil.middlewares.navigation_3d.missing_navigation_key_error));
+}
+});
+/**
+ * Default position configuration. Check default configuration in
+ * 'camera' function.
+ */
+quil.middlewares.navigation_3d.default_position = (function quil$middlewares$navigation_3d$default_position(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"position","position",-2011731912),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(quil.core.width.call(null) / 2.0),(quil.core.height.call(null) / 2.0),((quil.core.height.call(null) / 2.0) / quil.core.tan.call(null,((quil.core.PI * 60.0) / 360.0)))], null),new cljs.core.Keyword(null,"straight","straight",-1252567854),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(0),(-1)], null),new cljs.core.Keyword(null,"up","up",-269712113),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1),(0)], null)], null);
+});
+/**
+ * Rotates vector v by angle with axis.
+ * Formula is taken from wiki:
+ * http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle
+ */
+quil.middlewares.navigation_3d.rotate_by_axis_and_angle = (function quil$middlewares$navigation_3d$rotate_by_axis_and_angle(v,axis,angle){
+var vec__8900 = axis;
+var a_x = cljs.core.nth.call(null,vec__8900,(0),null);
+var a_y = cljs.core.nth.call(null,vec__8900,(1),null);
+var a_z = cljs.core.nth.call(null,vec__8900,(2),null);
+var vec__8903 = v;
+var x = cljs.core.nth.call(null,vec__8903,(0),null);
+var y = cljs.core.nth.call(null,vec__8903,(1),null);
+var z = cljs.core.nth.call(null,vec__8903,(2),null);
+var cs = quil.core.cos.call(null,angle);
+var _cs = ((1) - cs);
+var sn = quil.core.sin.call(null,angle);
+var a = (cs + ((a_x * a_x) * _cs));
+var b = (((a_x * a_y) * _cs) - (a_z * sn));
+var c = (((a_x * a_z) * _cs) + (a_y * sn));
+var d = (((a_x * a_y) * _cs) + (a_z * sn));
+var e = (cs + ((a_y * a_y) * _cs));
+var f = (((a_y * a_z) * _cs) - (a_x * sn));
+var g = (((a_x * a_z) * _cs) - (a_y * sn));
+var h = (((a_y * a_z) * _cs) + (a_x * sn));
+var i = (cs + ((a_z * a_z) * _cs));
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(((a * x) + (b * y)) + (c * z)),(((d * x) + (e * y)) + (f * z)),(((g * x) + (h * y)) + (i * z))], null);
+});
+/**
+ * Rotates nav-3d configuration left-right. angle positive - rotate right,
+ * negative - left.
+ */
+quil.middlewares.navigation_3d.rotate_lr = (function quil$middlewares$navigation_3d$rotate_lr(nav_3d,angle){
+return cljs.core.update_in.call(null,nav_3d,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854)], null),quil.middlewares.navigation_3d.rotate_by_axis_and_angle,new cljs.core.Keyword(null,"up","up",-269712113).cljs$core$IFn$_invoke$arity$1(nav_3d),angle);
+});
+/**
+ * Vector cross-product: http://en.wikipedia.org/wiki/Cross_product
+ */
+quil.middlewares.navigation_3d.cross_product = (function quil$middlewares$navigation_3d$cross_product(p__8906,p__8907){
+var vec__8914 = p__8906;
+var u1 = cljs.core.nth.call(null,vec__8914,(0),null);
+var u2 = cljs.core.nth.call(null,vec__8914,(1),null);
+var u3 = cljs.core.nth.call(null,vec__8914,(2),null);
+var vec__8917 = p__8907;
+var v1 = cljs.core.nth.call(null,vec__8917,(0),null);
+var v2 = cljs.core.nth.call(null,vec__8917,(1),null);
+var v3 = cljs.core.nth.call(null,vec__8917,(2),null);
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [((u2 * v3) - (u3 * v2)),((u3 * v1) - (u1 * v3)),((u1 * v2) - (u2 * v1))], null);
+});
+/**
+ * Multiply vector v by scalar mult.
+ */
+quil.middlewares.navigation_3d.v_mult = (function quil$middlewares$navigation_3d$v_mult(v,mult){
+return cljs.core.mapv.call(null,(function (p1__8920_SHARP_){
+return (p1__8920_SHARP_ * mult);
+}),v);
+});
+/**
+ * Sum of 2 vectors.
+ */
+quil.middlewares.navigation_3d.v_plus = (function quil$middlewares$navigation_3d$v_plus(v1,v2){
+return cljs.core.mapv.call(null,cljs.core._PLUS_,v1,v2);
+});
+/**
+ * Returns vector opposite to vector v.
+ */
+quil.middlewares.navigation_3d.v_opposite = (function quil$middlewares$navigation_3d$v_opposite(v){
+return quil.middlewares.navigation_3d.v_mult.call(null,v,(-1));
+});
+/**
+ * Normalize vector, returning vector
+ * which has same direction but with norm equals to 1.
+ */
+quil.middlewares.navigation_3d.v_normalize = (function quil$middlewares$navigation_3d$v_normalize(v){
+var norm = quil.core.sqrt.call(null,cljs.core.apply.call(null,cljs.core._PLUS_,cljs.core.map.call(null,quil.core.sq,v)));
+return quil.middlewares.navigation_3d.v_mult.call(null,v,((1) / norm));
+});
+/**
+ * Rotates nav-3d configuration up-down.
+ */
+quil.middlewares.navigation_3d.rotate_ud = (function quil$middlewares$navigation_3d$rotate_ud(nav_3d,angle){
+var axis = quil.middlewares.navigation_3d.cross_product.call(null,new cljs.core.Keyword(null,"straight","straight",-1252567854).cljs$core$IFn$_invoke$arity$1(nav_3d),new cljs.core.Keyword(null,"up","up",-269712113).cljs$core$IFn$_invoke$arity$1(nav_3d));
+var rotate = ((function (axis){
+return (function (p1__8921_SHARP_){
+return quil.middlewares.navigation_3d.rotate_by_axis_and_angle.call(null,p1__8921_SHARP_,axis,angle);
+});})(axis))
+;
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,nav_3d,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854)], null),rotate),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"up","up",-269712113)], null),rotate);
+});
+/**
+ * Mouse handler function which rotates nav-3d configuration.
+ * It uses mouse from event object and pixels-in-360 to calculate
+ * angles to rotate.
+ */
+quil.middlewares.navigation_3d.rotate = (function quil$middlewares$navigation_3d$rotate(state,event,pixels_in_360){
+quil.middlewares.navigation_3d.assert_state_has_navigation.call(null,state);
+
+if(cljs.core._EQ_.call(null,(0),new cljs.core.Keyword(null,"p-x","p-x",-1721211211).cljs$core$IFn$_invoke$arity$1(event),new cljs.core.Keyword(null,"p-y","p-y",-530704830).cljs$core$IFn$_invoke$arity$1(event))){
+return state;
+} else {
+var dx = (new cljs.core.Keyword(null,"p-x","p-x",-1721211211).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"x","x",2099068185).cljs$core$IFn$_invoke$arity$1(event));
+var dy = (new cljs.core.Keyword(null,"y","y",-1757859776).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"p-y","p-y",-530704830).cljs$core$IFn$_invoke$arity$1(event));
+var angle_lr = quil.core.map_range.call(null,dx,(0),pixels_in_360,(0),quil.core.TWO_PI);
+var angle_ud = quil.core.map_range.call(null,dy,(0),pixels_in_360,(0),quil.core.TWO_PI);
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301)], null),((function (dx,dy,angle_lr,angle_ud){
+return (function (p1__8922_SHARP_){
+return quil.middlewares.navigation_3d.rotate_ud.call(null,quil.middlewares.navigation_3d.rotate_lr.call(null,p1__8922_SHARP_,angle_lr),angle_ud);
+});})(dx,dy,angle_lr,angle_ud))
+);
+}
+});
+quil.middlewares.navigation_3d.space = cljs.core.keyword.call(null," ");
+/**
+ * Keyboard handler function which moves nav-3d configuration.
+ * It uses keyboard key from event object to determing in which
+ * direction to move.
+ */
+quil.middlewares.navigation_3d.move = (function quil$middlewares$navigation_3d$move(state,event,step_size){
+quil.middlewares.navigation_3d.assert_state_has_navigation.call(null,state);
+
+var map__8929 = new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(state);
+var map__8929__$1 = ((((!((map__8929 == null)))?((((map__8929.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__8929.cljs$core$ISeq$)))?true:false):false))?cljs.core.apply.call(null,cljs.core.hash_map,map__8929):map__8929);
+var up = cljs.core.get.call(null,map__8929__$1,new cljs.core.Keyword(null,"up","up",-269712113));
+var straight = cljs.core.get.call(null,map__8929__$1,new cljs.core.Keyword(null,"straight","straight",-1252567854));
+var temp__4655__auto__ = (function (){var pred__8931 = cljs.core._EQ_;
+var expr__8932 = new cljs.core.Keyword(null,"key","key",-1516042587).cljs$core$IFn$_invoke$arity$1(event);
+if(cljs.core.truth_(pred__8931.call(null,new cljs.core.Keyword(null,"w","w",354169001),expr__8932))){
+return straight;
+} else {
+if(cljs.core.truth_(pred__8931.call(null,new cljs.core.Keyword(null,"s","s",1705939918),expr__8932))){
+return quil.middlewares.navigation_3d.v_opposite.call(null,straight);
+} else {
+if(cljs.core.truth_(pred__8931.call(null,quil.middlewares.navigation_3d.space,expr__8932))){
+return quil.middlewares.navigation_3d.v_opposite.call(null,up);
+} else {
+if(cljs.core.truth_(pred__8931.call(null,new cljs.core.Keyword(null,"z","z",-789527183),expr__8932))){
+return up;
+} else {
+if(cljs.core.truth_(pred__8931.call(null,new cljs.core.Keyword(null,"d","d",1972142424),expr__8932))){
+return quil.middlewares.navigation_3d.cross_product.call(null,straight,up);
+} else {
+if(cljs.core.truth_(pred__8931.call(null,new cljs.core.Keyword(null,"a","a",-2123407586),expr__8932))){
+return quil.middlewares.navigation_3d.cross_product.call(null,up,straight);
+} else {
+return null;
+}
+}
+}
+}
+}
+}
+})();
+if(cljs.core.truth_(temp__4655__auto__)){
+var dir = temp__4655__auto__;
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301),new cljs.core.Keyword(null,"position","position",-2011731912)], null),((function (dir,temp__4655__auto__,map__8929,map__8929__$1,up,straight){
+return (function (p1__8923_SHARP_){
+return quil.middlewares.navigation_3d.v_plus.call(null,p1__8923_SHARP_,quil.middlewares.navigation_3d.v_mult.call(null,dir,step_size));
+});})(dir,temp__4655__auto__,map__8929,map__8929__$1,up,straight))
+);
+} else {
+return state;
+}
+});
+/**
+ * Custom 'setup' function which creates initial position
+ * configuration and puts it to the state map.
+ */
+quil.middlewares.navigation_3d.setup_3d_nav = (function quil$middlewares$navigation_3d$setup_3d_nav(user_setup,user_settings){
+var initial_state = cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.merge.call(null,quil.middlewares.navigation_3d.default_position.call(null),cljs.core.select_keys.call(null,user_settings,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854),new cljs.core.Keyword(null,"up","up",-269712113),new cljs.core.Keyword(null,"position","position",-2011731912)], null))),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854)], null),quil.middlewares.navigation_3d.v_normalize),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"up","up",-269712113)], null),quil.middlewares.navigation_3d.v_normalize);
+return cljs.core.update_in.call(null,user_setup.call(null),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301)], null),((function (initial_state){
+return (function (p1__8934_SHARP_){
+return cljs.core.merge.call(null,initial_state,p1__8934_SHARP_);
+});})(initial_state))
+);
+});
+/**
+ * Enables navigation in 3D space. Similar to how it is done in
+ * shooters: WASD navigation, space is go up, z is go down,
+ * drag mouse to look around.
+ */
+quil.middlewares.navigation_3d.navigation_3d = (function quil$middlewares$navigation_3d$navigation_3d(options){
+var user_settings = new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(options);
+var pixels_in_360 = new cljs.core.Keyword(null,"pixels-in-360","pixels-in-360",1789567298).cljs$core$IFn$_invoke$arity$2(user_settings,(1000));
+var step_size = new cljs.core.Keyword(null,"step-size","step-size",1545609922).cljs$core$IFn$_invoke$arity$2(user_settings,(20));
+var rotate_on = new cljs.core.Keyword(null,"rotate-on","rotate-on",-1282225937).cljs$core$IFn$_invoke$arity$2(user_settings,new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441));
+var draw = new cljs.core.Keyword(null,"draw","draw",1358331674).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,pixels_in_360,step_size,rotate_on){
+return (function (state){
+return null;
+});})(user_settings,pixels_in_360,step_size,rotate_on))
+);
+var key_pressed = new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,pixels_in_360,step_size,rotate_on,draw){
+return (function (state,_){
+return state;
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw))
+);
+var rotate_on_fn = rotate_on.call(null,options,((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed){
+return (function (state,_){
+return state;
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed))
+);
+var setup = new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn){
+return (function (){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn))
+);
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"setup","setup",1987730512),cljs.core.partial.call(null,quil.middlewares.navigation_3d.setup_3d_nav,setup,user_settings),new cljs.core.Keyword(null,"draw","draw",1358331674),((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup){
+return (function (state){
+quil.middlewares.navigation_3d.assert_state_has_navigation.call(null,state);
+
+var map__8946_8957 = new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(state);
+var map__8946_8958__$1 = ((((!((map__8946_8957 == null)))?((((map__8946_8957.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__8946_8957.cljs$core$ISeq$)))?true:false):false))?cljs.core.apply.call(null,cljs.core.hash_map,map__8946_8957):map__8946_8957);
+var vec__8947_8959 = cljs.core.get.call(null,map__8946_8958__$1,new cljs.core.Keyword(null,"straight","straight",-1252567854));
+var c_x_8960 = cljs.core.nth.call(null,vec__8947_8959,(0),null);
+var c_y_8961 = cljs.core.nth.call(null,vec__8947_8959,(1),null);
+var c_z_8962 = cljs.core.nth.call(null,vec__8947_8959,(2),null);
+var vec__8950_8963 = cljs.core.get.call(null,map__8946_8958__$1,new cljs.core.Keyword(null,"up","up",-269712113));
+var u_x_8964 = cljs.core.nth.call(null,vec__8950_8963,(0),null);
+var u_y_8965 = cljs.core.nth.call(null,vec__8950_8963,(1),null);
+var u_z_8966 = cljs.core.nth.call(null,vec__8950_8963,(2),null);
+var vec__8953_8967 = cljs.core.get.call(null,map__8946_8958__$1,new cljs.core.Keyword(null,"position","position",-2011731912));
+var p_x_8968 = cljs.core.nth.call(null,vec__8953_8967,(0),null);
+var p_y_8969 = cljs.core.nth.call(null,vec__8953_8967,(1),null);
+var p_z_8970 = cljs.core.nth.call(null,vec__8953_8967,(2),null);
+quil.core.camera.call(null,p_x_8968,p_y_8969,p_z_8970,(p_x_8968 + c_x_8960),(p_y_8969 + c_y_8961),(p_z_8970 + c_z_8962),u_x_8964,u_y_8965,u_z_8966);
+
+return draw.call(null,state);
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup))
+,new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364),((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup){
+return (function (state,event){
+return key_pressed.call(null,quil.middlewares.navigation_3d.move.call(null,state,event,step_size),event);
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup))
+,rotate_on,((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup){
+return (function (state,event){
+return rotate_on_fn.call(null,quil.middlewares.navigation_3d.rotate.call(null,state,event,pixels_in_360),event);
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup))
+);
+});
+
+//# sourceMappingURL=navigation_3d.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/middlewares/navigation_3d.js.map b/src/http/static/viz/1/quil/middlewares/navigation_3d.js.map
new file mode 100644
index 0000000..0ce580a
--- /dev/null
+++ b/src/http/static/viz/1/quil/middlewares/navigation_3d.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/navigation_3d.js","sources":["navigation_3d.cljc"],"lineCount":261,"mappings":"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","names":["quil.middlewares.navigation-3d\/missing-navigation-key-error","quil.middlewares.navigation-3d\/assert-state-has-navigation","state","js\/Error","quil.middlewares.navigation-3d\/default-position","quil.core\/width","quil.core\/height","quil.core\/tan","quil.core\/PI","quil.middlewares.navigation-3d\/rotate-by-axis-and-angle","v","axis","angle","vec__8900","cljs.core\/nth","vec__8903","a-x","a-y","a-z","x","y","z","cs","quil.core\/cos","-cs","sn","quil.core\/sin","a","b","c","d","e","f","g","h","i","quil.middlewares.navigation-3d\/rotate-lr","nav-3d","cljs.core\/update-in","p__8906","p__8907","vec__8914","vec__8917","quil.middlewares.navigation-3d\/cross-product","u1","u2","u3","v1","v2","v3","quil.middlewares.navigation-3d\/v-mult","mult","p1__8920#","cljs.core\/mapv","quil.middlewares.navigation-3d\/v-plus","cljs.core\/+","quil.middlewares.navigation-3d\/v-opposite","quil.middlewares.navigation-3d\/v-normalize","norm","cljs.core\/map","quil.core\/sq","cljs.core\/apply","quil.core\/sqrt","quil.middlewares.navigation-3d\/rotate-ud","p1__8921#","rotate","quil.middlewares.navigation-3d\/rotate","event","pixels-in-360","cljs.core\/=","dx","dy","angle-lr","quil.core\/map-range","quil.core\/TWO-PI","angle-ud","p1__8922#","quil.middlewares.navigation-3d\/space","cljs.core\/keyword","quil.middlewares.navigation-3d\/move","step-size","map__8929","cljs.core\/PROTOCOL_SENTINEL","cljs.core\/hash-map","cljs.core\/get","up","straight","temp__4655__auto__","dir","pred__8931","expr__8932","p1__8923#","quil.middlewares.navigation-3d\/setup-3d-nav","user-setup","user-settings","initial-state","cljs.core\/select-keys","cljs.core\/merge","p1__8934#","quil.middlewares.navigation-3d\/navigation-3d","options","rotate-on","draw","key-pressed","_","rotate-on-fn","setup","cljs.core\/assoc","cljs.core\/partial","map__8946","vec__8947","vec__8950","vec__8953","c-x","c-y","c-z","u-x","u-y","u-z","p-x","p-y","p-z","quil.core\/camera"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/sketch.cljs b/src/http/static/viz/1/quil/sketch.cljs
new file mode 100644
index 0000000..4e48038
--- /dev/null
+++ b/src/http/static/viz/1/quil/sketch.cljs
@@ -0,0 +1,128 @@
+(ns quil.sketch
+ (:require [quil.util :as u :include-macros true]
+ [quil.middlewares.deprecated-options :as do]
+ [goog.dom :as dom]
+ [goog.events :as events]
+ [goog.events.EventType :as EventType])
+ (:require-macros [quil.sketch]))
+
+(def ^:dynamic
+ *applet* nil)
+
+(defn current-applet [] *applet*)
+
+(u/generate-quil-constants :cljs
+ rendering-modes (:java2d :p2d :p3d :opengl))
+
+(defn resolve-renderer [mode]
+ (u/resolve-constant-key mode rendering-modes))
+
+(defn size
+ ([width height]
+ (.size (current-applet) (int width) (int height)))
+
+ ([width height mode]
+ (.size (current-applet) (int width) (int height) (u/resolve-constant-key mode rendering-modes))))
+
+(defn- bind-handlers [prc opts]
+ (doseq [[processing-name quil-name] {:setup :setup
+ :draw :draw
+
+ :keyPressed :key-pressed
+ :keyReleased :key-released
+ :keyTyped :key-typed
+
+ :mouseClicked :mouse-clicked
+ :mouseDragged :mouse-dragged
+ :mouseMoved :mouse-moved
+ :mousePressed :mouse-pressed
+ :mouseReleased :mouse-released
+ :mouseOut :mouse-exited
+ :mouseOver :mouse-entered
+ :mouseScrolled :mouse-wheel}]
+ (when-let [handler (opts quil-name)]
+ (aset prc (name processing-name)
+ (fn []
+ (quil.sketch/with-sketch prc
+ (handler)))))))
+
+(defn make-sketch [options]
+ (let [opts (->> (:middleware options [])
+ (cons do/deprecated-options)
+ (apply comp)
+ (#(% options))
+ (merge {:size [500 300]}))
+
+ sketch-size (or (:size opts) [200 200])
+ renderer (:renderer opts)
+ features (set (:features opts))
+
+ setup (fn []
+ (->> (if renderer [renderer] [])
+ (concat sketch-size)
+ (apply size))
+ (when (:settings opts) ((:settings opts)))
+ (when (:setup opts) ((:setup opts))))
+ mouse-wheel (when (:mouse-wheel opts)
+ ;; -1 need for compability with Clojure version
+ #((:mouse-wheel opts) (* -1 (.-mouseScroll *applet*))))
+
+ opts (assoc opts
+ :setup setup
+ :mouse-wheel mouse-wheel)
+ attach-function (fn [prc]
+ (bind-handlers prc opts)
+ (set! (.-quil prc) (atom nil))
+ (set! (.-target-frame-rate prc) (atom 60)))
+ sketch (js/Processing.Sketch. attach-function)]
+ (when (contains? features :global-key-events)
+ (aset (aget sketch "options") "globalKeyEvents" true))
+ sketch))
+
+(defn destroy-previous-sketch [host-elem]
+ (when-let [proc-obj (.-processing-obj host-elem)]
+ (.exit proc-obj)))
+
+(defn sketch [& opts]
+ (let [opts-map (apply hash-map opts)
+ host-elem (dom/getElement (:host opts-map))
+ renderer (or (:renderer opts-map) :p2d)]
+ (if host-elem
+ (do
+ (if (.-processing-context host-elem)
+ (when-not (= renderer (.-processing-context host-elem))
+ (.warn js/console "WARNING: Using different context on one canvas!"))
+ (set! (.-processing-context host-elem) renderer))
+ (destroy-previous-sketch host-elem)
+ (set! (.-processing-obj host-elem)
+ (js/Processing. host-elem (make-sketch opts-map))))
+ (.error js/console "ERROR: Cannot create sketch. :host is not specified."))))
+
+(def sketch-init-list (atom (list )))
+
+(defn empty-body? []
+ (let [child (.-childNodes (.-body js/document))]
+ ; seems hacky, we should come up with better way of
+ ; checking whether body is empty or not
+ (<= (.-length child) 1)))
+
+(defn add-canvas [canvas-id]
+ (let [canvas (.createElement js/document "canvas")]
+ (.setAttribute canvas "id" canvas-id)
+ (.appendChild (.-body js/document) canvas)))
+
+(defn init-sketches []
+ (let [add-elem? (empty-body?)]
+ (doseq [sk @sketch-init-list]
+ (when add-elem?
+ (add-canvas (:host-id sk)))
+ ((:fn sk))))
+ (reset! sketch-init-list []))
+
+(defn add-sketch-to-init-list [sk]
+ (swap! sketch-init-list conj sk)
+ ; if page already loaded immediately init sketch we just added
+ (when (= (.-readyState js/document) "complete")
+ (init-sketches)))
+
+(events/listenOnce js/window EventType/LOAD init-sketches)
diff --git a/src/http/static/viz/1/quil/sketch.cljs.cache.edn b/src/http/static/viz/1/quil/sketch.cljs.cache.edn
new file mode 100644
index 0000000..4911e31
--- /dev/null
+++ b/src/http/static/viz/1/quil/sketch.cljs.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {Processing {prototype {PConstants {}}, Sketch {}}, Error {}, console {warn {}, error {}}, document {body {childNodes {length {}}, appendChild {}}, createElement {}, readyState {}}, Object {setAttribute {}}, window {}}, :use-macros {}, :excludes #{}, :name quil.sketch, :imports nil, :requires {goog.dom goog.dom, dom goog.dom, u quil.util, EventType goog.events.EventType, quil.middlewares.deprecated-options quil.middlewares.deprecated-options, do quil.middlewares.deprecated-options, goog.events.EventType goog.events.EventType, events goog.events, goog.events goog.events, quil.util quil.util}, :uses nil, :defs {current-applet {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 12, :column 7, :end-line 12, :end-column 21, :arglists (quote ([]))}, :name quil.sketch/current-applet, :variadic false, :file "out/quil/sketch.cljs", :end-column 21, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 12, :end-line 12, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, make-sketch {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 49, :column 7, :end-line 49, :end-column 18, :arglists (quote ([options]))}, :name quil.sketch/make-sketch, :variadic false, :file "out/quil/sketch.cljs", :end-column 18, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 49, :end-line 49, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options]))}, sketch {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 86, :column 7, :end-line 86, :end-column 13, :arglists (quote ([& opts])), :top-fn {:variadic true, :max-fixed-arity 0, :method-params [(opts)], :arglists ([& opts]), :arglists-meta (nil)}}, :name quil.sketch/sketch, :variadic true, :file "out/quil/sketch.cljs", :end-column 13, :top-fn {:variadic true, :max-fixed-arity 0, :method-params [(opts)], :arglists ([& opts]), :arglists-meta (nil)}, :method-params [(opts)], :protocol-impl nil, :arglists-meta (nil), :column 1, :line 86, :end-line 86, :max-fixed-arity 0, :fn-var true, :arglists ([& opts])}, bind-handlers {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 27, :column 8, :end-line 27, :end-column 21, :private true, :arglists (quote ([prc opts]))}, :private true, :name quil.sketch/bind-handlers, :variadic false, :file "out/quil/sketch.cljs", :end-column 21, :method-params ([prc opts]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 27, :end-line 27, :max-fixed-arity 2, :fn-var true, :arglists (quote ([prc opts]))}, empty-body? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 103, :column 7, :end-line 103, :end-column 18, :arglists (quote ([]))}, :name quil.sketch/empty-body?, :variadic false, :file "out/quil/sketch.cljs", :end-column 18, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 103, :end-line 103, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, rendering-modes {:name quil.sketch/rendering-modes, :file "out/quil/sketch.cljs", :line 14, :column 1, :end-line 15, :end-column 18, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 15, :column 3, :end-line 15, :end-column 18}, :tag cljs.core/IMap}, size {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 20, :column 7, :end-line 20, :end-column 11, :arglists (quote ([width height] [width height mode])), :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([width height] [width height mode]), :arglists ([width height] [width height mode]), :arglists-meta (nil nil)}}, :name quil.sketch/size, :variadic false, :file "out/quil/sketch.cljs", :end-column 11, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([width height] [width height mode]), :arglists ([width height] [width height mode]), :arglists-meta (nil nil)}, :method-params ([width height] [width height mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 20, :end-line 20, :max-fixed-arity 3, :fn-var true, :arglists ([width height] [width height mode])}, add-sketch-to-init-list {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 122, :column 7, :end-line 122, :end-column 30, :arglists (quote ([sk]))}, :name quil.sketch/add-sketch-to-init-list, :variadic false, :file "out/quil/sketch.cljs", :end-column 30, :method-params ([sk]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 122, :end-line 122, :max-fixed-arity 1, :fn-var true, :arglists (quote ([sk]))}, sketch-init-list {:name quil.sketch/sketch-init-list, :file "out/quil/sketch.cljs", :line 101, :column 1, :end-line 101, :end-column 22, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 101, :column 6, :end-line 101, :end-column 22}, :tag any}, init-sketches {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 114, :column 7, :end-line 114, :end-column 20, :arglists (quote ([]))}, :name quil.sketch/init-sketches, :variadic false, :file "out/quil/sketch.cljs", :end-column 20, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 114, :end-line 114, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, destroy-previous-sketch {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 82, :column 7, :end-line 82, :end-column 30, :arglists (quote ([host-elem]))}, :name quil.sketch/destroy-previous-sketch, :variadic false, :file "out/quil/sketch.cljs", :end-column 30, :method-params ([host-elem]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 82, :end-line 82, :max-fixed-arity 1, :fn-var true, :arglists (quote ([host-elem]))}, resolve-renderer {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 17, :column 7, :end-line 17, :end-column 23, :arglists (quote ([mode]))}, :name quil.sketch/resolve-renderer, :variadic false, :file "out/quil/sketch.cljs", :end-column 23, :method-params ([mode]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 17, :end-line 17, :max-fixed-arity 1, :fn-var true, :arglists (quote ([mode]))}, *applet* {:name quil.sketch/*applet*, :file "out/quil/sketch.cljs", :line 9, :column 1, :end-line 10, :end-column 11, :dynamic true, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 10, :column 3, :end-line 10, :end-column 11, :dynamic true}, :tag clj-nil}, add-canvas {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/sketch.cljs", :line 109, :column 7, :end-line 109, :end-column 17, :arglists (quote ([canvas-id]))}, :name quil.sketch/add-canvas, :variadic false, :file "out/quil/sketch.cljs", :end-column 17, :method-params ([canvas-id]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 109, :end-line 109, :max-fixed-arity 1, :fn-var true, :arglists (quote ([canvas-id]))}}, :require-macros {quil.sketch quil.sketch, u quil.util, quil.util quil.util}, :cljs.analyzer/constants {:seen #{:features :key-typed :mouse-clicked :mouse-released :fn :mouse-exited :java2d :mouse-wheel :keyPressed :opengl :mouse-moved :mouseOut :settings :mouseScrolled :mouseDragged :renderer :size :setup :mouse-pressed :middleware :global-key-events :host :mouse-entered :key-pressed :key-released :keyReleased :mouseClicked :p2d :mouseReleased :mousePressed :mouseMoved :mouseOver :host-id :keyTyped :draw :p3d :mouse-dragged}, :order [:java2d :p2d :p3d :opengl :keyPressed :mouseOut :mouseScrolled :mouseDragged :setup :keyReleased :mouseClicked :mouseReleased :mousePressed :mouseMoved :mouseOver :keyTyped :draw :key-pressed :mouse-exited :mouse-wheel :mouse-dragged :key-released :mouse-clicked :mouse-released :mouse-pressed :mouse-moved :mouse-entered :key-typed :size :middleware :renderer :features :settings :global-key-events :host :host-id :fn]}, :doc nil} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/sketch.js b/src/http/static/viz/1/quil/sketch.js
new file mode 100644
index 0000000..1ed6d8a
--- /dev/null
+++ b/src/http/static/viz/1/quil/sketch.js
@@ -0,0 +1,348 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.sketch');
+goog.require('cljs.core');
+goog.require('quil.util');
+goog.require('quil.middlewares.deprecated_options');
+goog.require('goog.dom');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+quil.sketch._STAR_applet_STAR_ = null;
+quil.sketch.current_applet = (function quil$sketch$current_applet(){
+return quil.sketch._STAR_applet_STAR_;
+});
+quil.sketch.rendering_modes = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"java2d","java2d",166099237),(Processing.prototype.PConstants["JAVA2D"]),new cljs.core.Keyword(null,"p2d","p2d",-2106175755),(Processing.prototype.PConstants["P2D"]),new cljs.core.Keyword(null,"p3d","p3d",-850380194),(Processing.prototype.PConstants["P3D"]),new cljs.core.Keyword(null,"opengl","opengl",-614998103),(Processing.prototype.PConstants["OPENGL"])], null);
+quil.sketch.resolve_renderer = (function quil$sketch$resolve_renderer(mode){
+return quil.util.resolve_constant_key.call(null,mode,quil.sketch.rendering_modes);
+});
+quil.sketch.size = (function quil$sketch$size(var_args){
+var args8189 = [];
+var len__7927__auto___8192 = arguments.length;
+var i__7928__auto___8193 = (0);
+while(true){
+if((i__7928__auto___8193 < len__7927__auto___8192)){
+args8189.push((arguments[i__7928__auto___8193]));
+
+var G__8194 = (i__7928__auto___8193 + (1));
+i__7928__auto___8193 = G__8194;
+continue;
+} else {
+}
+break;
+}
+
+var G__8191 = args8189.length;
+switch (G__8191) {
+case 2:
+return quil.sketch.size.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.sketch.size.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8189.length)].join('')));
+
+}
+});
+
+quil.sketch.size.cljs$core$IFn$_invoke$arity$2 = (function (width,height){
+return quil.sketch.current_applet.call(null).size((width | (0)),(height | (0)));
+});
+
+quil.sketch.size.cljs$core$IFn$_invoke$arity$3 = (function (width,height,mode){
+return quil.sketch.current_applet.call(null).size((width | (0)),(height | (0)),quil.util.resolve_constant_key.call(null,mode,quil.sketch.rendering_modes));
+});
+
+quil.sketch.size.cljs$lang$maxFixedArity = 3;
+
+quil.sketch.bind_handlers = (function quil$sketch$bind_handlers(prc,opts){
+var seq__8208 = cljs.core.seq.call(null,cljs.core.PersistentHashMap.fromArrays([new cljs.core.Keyword(null,"keyPressed","keyPressed",1791025256),new cljs.core.Keyword(null,"mouseOut","mouseOut",-386669045),new cljs.core.Keyword(null,"mouseScrolled","mouseScrolled",31878252),new cljs.core.Keyword(null,"mouseDragged","mouseDragged",129975181),new cljs.core.Keyword(null,"setup","setup",1987730512),new cljs.core.Keyword(null,"keyReleased","keyReleased",541714964),new cljs.core.Keyword(null,"mouseClicked","mouseClicked",1764302965),new cljs.core.Keyword(null,"mouseReleased","mouseReleased",1116234838),new cljs.core.Keyword(null,"mousePressed","mousePressed",1776186454),new cljs.core.Keyword(null,"mouseMoved","mouseMoved",-1936954058),new cljs.core.Keyword(null,"mouseOver","mouseOver",-1334461930),new cljs.core.Keyword(null,"keyTyped","keyTyped",1437329399),new cljs.core.Keyword(null,"draw","draw",1358331674)],[new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364),new cljs.core.Keyword(null,"mouse-exited","mouse-exited",-483205244),new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439),new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441),new cljs.core.Keyword(null,"setup","setup",1987730512),new cljs.core.Keyword(null,"key-released","key-released",215919828),new cljs.core.Keyword(null,"mouse-clicked","mouse-clicked",-199339421),new cljs.core.Keyword(null,"mouse-released","mouse-released",-664480061),new cljs.core.Keyword(null,"mouse-pressed","mouse-pressed",736955536),new cljs.core.Keyword(null,"mouse-moved","mouse-moved",-1918152310),new cljs.core.Keyword(null,"mouse-entered","mouse-entered",811350322),new cljs.core.Keyword(null,"key-typed","key-typed",-876037597),new cljs.core.Keyword(null,"draw","draw",1358331674)]));
+var chunk__8209 = null;
+var count__8210 = (0);
+var i__8211 = (0);
+while(true){
+if((i__8211 < count__8210)){
+var vec__8212 = cljs.core._nth.call(null,chunk__8209,i__8211);
+var processing_name = cljs.core.nth.call(null,vec__8212,(0),null);
+var quil_name = cljs.core.nth.call(null,vec__8212,(1),null);
+var temp__4657__auto___8220 = opts.call(null,quil_name);
+if(cljs.core.truth_(temp__4657__auto___8220)){
+var handler_8221 = temp__4657__auto___8220;
+(prc[cljs.core.name.call(null,processing_name)] = ((function (seq__8208,chunk__8209,count__8210,i__8211,handler_8221,temp__4657__auto___8220,vec__8212,processing_name,quil_name){
+return (function (){
+var _STAR_applet_STAR_8215 = quil.sketch._STAR_applet_STAR_;
+quil.sketch._STAR_applet_STAR_ = prc;
+
+try{return handler_8221.call(null);
+}finally {quil.sketch._STAR_applet_STAR_ = _STAR_applet_STAR_8215;
+}});})(seq__8208,chunk__8209,count__8210,i__8211,handler_8221,temp__4657__auto___8220,vec__8212,processing_name,quil_name))
+);
+} else {
+}
+
+var G__8222 = seq__8208;
+var G__8223 = chunk__8209;
+var G__8224 = count__8210;
+var G__8225 = (i__8211 + (1));
+seq__8208 = G__8222;
+chunk__8209 = G__8223;
+count__8210 = G__8224;
+i__8211 = G__8225;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq.call(null,seq__8208);
+if(temp__4657__auto__){
+var seq__8208__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__8208__$1)){
+var c__7633__auto__ = cljs.core.chunk_first.call(null,seq__8208__$1);
+var G__8226 = cljs.core.chunk_rest.call(null,seq__8208__$1);
+var G__8227 = c__7633__auto__;
+var G__8228 = cljs.core.count.call(null,c__7633__auto__);
+var G__8229 = (0);
+seq__8208 = G__8226;
+chunk__8209 = G__8227;
+count__8210 = G__8228;
+i__8211 = G__8229;
+continue;
+} else {
+var vec__8216 = cljs.core.first.call(null,seq__8208__$1);
+var processing_name = cljs.core.nth.call(null,vec__8216,(0),null);
+var quil_name = cljs.core.nth.call(null,vec__8216,(1),null);
+var temp__4657__auto___8230__$1 = opts.call(null,quil_name);
+if(cljs.core.truth_(temp__4657__auto___8230__$1)){
+var handler_8231 = temp__4657__auto___8230__$1;
+(prc[cljs.core.name.call(null,processing_name)] = ((function (seq__8208,chunk__8209,count__8210,i__8211,handler_8231,temp__4657__auto___8230__$1,vec__8216,processing_name,quil_name,seq__8208__$1,temp__4657__auto__){
+return (function (){
+var _STAR_applet_STAR_8219 = quil.sketch._STAR_applet_STAR_;
+quil.sketch._STAR_applet_STAR_ = prc;
+
+try{return handler_8231.call(null);
+}finally {quil.sketch._STAR_applet_STAR_ = _STAR_applet_STAR_8219;
+}});})(seq__8208,chunk__8209,count__8210,i__8211,handler_8231,temp__4657__auto___8230__$1,vec__8216,processing_name,quil_name,seq__8208__$1,temp__4657__auto__))
+);
+} else {
+}
+
+var G__8232 = cljs.core.next.call(null,seq__8208__$1);
+var G__8233 = null;
+var G__8234 = (0);
+var G__8235 = (0);
+seq__8208 = G__8232;
+chunk__8209 = G__8233;
+count__8210 = G__8234;
+i__8211 = G__8235;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+quil.sketch.make_sketch = (function quil$sketch$make_sketch(options){
+var opts = cljs.core.merge.call(null,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"size","size",1098693007),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(500),(300)], null)], null),(function (p1__8236_SHARP_){
+return p1__8236_SHARP_.call(null,options);
+}).call(null,cljs.core.apply.call(null,cljs.core.comp,cljs.core.cons.call(null,quil.middlewares.deprecated_options.deprecated_options,new cljs.core.Keyword(null,"middleware","middleware",1462115504).cljs$core$IFn$_invoke$arity$2(options,cljs.core.PersistentVector.EMPTY)))));
+var sketch_size = (function (){var or__6814__auto__ = new cljs.core.Keyword(null,"size","size",1098693007).cljs$core$IFn$_invoke$arity$1(opts);
+if(cljs.core.truth_(or__6814__auto__)){
+return or__6814__auto__;
+} else {
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(200),(200)], null);
+}
+})();
+var renderer = new cljs.core.Keyword(null,"renderer","renderer",336841071).cljs$core$IFn$_invoke$arity$1(opts);
+var features = cljs.core.set.call(null,new cljs.core.Keyword(null,"features","features",-1146962336).cljs$core$IFn$_invoke$arity$1(opts));
+var setup = ((function (opts,sketch_size,renderer,features){
+return (function (){
+cljs.core.apply.call(null,quil.sketch.size,cljs.core.concat.call(null,sketch_size,(cljs.core.truth_(renderer)?new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [renderer], null):cljs.core.PersistentVector.EMPTY)));
+
+if(cljs.core.truth_(new cljs.core.Keyword(null,"settings","settings",1556144875).cljs$core$IFn$_invoke$arity$1(opts))){
+new cljs.core.Keyword(null,"settings","settings",1556144875).cljs$core$IFn$_invoke$arity$1(opts).call(null);
+} else {
+}
+
+if(cljs.core.truth_(new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$1(opts))){
+return new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$1(opts).call(null);
+} else {
+return null;
+}
+});})(opts,sketch_size,renderer,features))
+;
+var mouse_wheel = (cljs.core.truth_(new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439).cljs$core$IFn$_invoke$arity$1(opts))?((function (opts,sketch_size,renderer,features,setup){
+return (function (){
+return new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439).cljs$core$IFn$_invoke$arity$1(opts).call(null,((-1) * quil.sketch._STAR_applet_STAR_.mouseScroll));
+});})(opts,sketch_size,renderer,features,setup))
+:null);
+var opts__$1 = cljs.core.assoc.call(null,opts,new cljs.core.Keyword(null,"setup","setup",1987730512),setup,new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439),mouse_wheel);
+var attach_function = ((function (opts,sketch_size,renderer,features,setup,mouse_wheel,opts__$1){
+return (function (prc){
+quil.sketch.bind_handlers.call(null,prc,opts__$1);
+
+prc.quil = cljs.core.atom.call(null,null);
+
+return prc.target_frame_rate = cljs.core.atom.call(null,(60));
+});})(opts,sketch_size,renderer,features,setup,mouse_wheel,opts__$1))
+;
+var sketch = (new Processing.Sketch(attach_function));
+if(cljs.core.contains_QMARK_.call(null,features,new cljs.core.Keyword(null,"global-key-events","global-key-events",335064944))){
+((sketch["options"])["globalKeyEvents"] = true);
+} else {
+}
+
+return sketch;
+});
+quil.sketch.destroy_previous_sketch = (function quil$sketch$destroy_previous_sketch(host_elem){
+var temp__4657__auto__ = host_elem.processing_obj;
+if(cljs.core.truth_(temp__4657__auto__)){
+var proc_obj = temp__4657__auto__;
+return proc_obj.exit();
+} else {
+return null;
+}
+});
+quil.sketch.sketch = (function quil$sketch$sketch(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8238 = arguments.length;
+var i__7928__auto___8239 = (0);
+while(true){
+if((i__7928__auto___8239 < len__7927__auto___8238)){
+args__7934__auto__.push((arguments[i__7928__auto___8239]));
+
+var G__8240 = (i__7928__auto___8239 + (1));
+i__7928__auto___8239 = G__8240;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((0) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((0)),(0),null)):null);
+return quil.sketch.sketch.cljs$core$IFn$_invoke$arity$variadic(argseq__7935__auto__);
+});
+
+quil.sketch.sketch.cljs$core$IFn$_invoke$arity$variadic = (function (opts){
+var opts_map = cljs.core.apply.call(null,cljs.core.hash_map,opts);
+var host_elem = goog.dom.getElement(new cljs.core.Keyword(null,"host","host",-1558485167).cljs$core$IFn$_invoke$arity$1(opts_map));
+var renderer = (function (){var or__6814__auto__ = new cljs.core.Keyword(null,"renderer","renderer",336841071).cljs$core$IFn$_invoke$arity$1(opts_map);
+if(cljs.core.truth_(or__6814__auto__)){
+return or__6814__auto__;
+} else {
+return new cljs.core.Keyword(null,"p2d","p2d",-2106175755);
+}
+})();
+if(cljs.core.truth_(host_elem)){
+if(cljs.core.truth_(host_elem.processing_context)){
+if(cljs.core._EQ_.call(null,renderer,host_elem.processing_context)){
+} else {
+console.warn("WARNING: Using different context on one canvas!");
+}
+} else {
+host_elem.processing_context = renderer;
+}
+
+quil.sketch.destroy_previous_sketch.call(null,host_elem);
+
+return host_elem.processing_obj = (new Processing(host_elem,quil.sketch.make_sketch.call(null,opts_map)));
+} else {
+return console.error("ERROR: Cannot create sketch. :host is not specified.");
+}
+});
+
+quil.sketch.sketch.cljs$lang$maxFixedArity = (0);
+
+quil.sketch.sketch.cljs$lang$applyTo = (function (seq8237){
+return quil.sketch.sketch.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq8237));
+});
+
+quil.sketch.sketch_init_list = cljs.core.atom.call(null,cljs.core.List.EMPTY);
+quil.sketch.empty_body_QMARK_ = (function quil$sketch$empty_body_QMARK_(){
+var child = document.body.childNodes;
+return (child.length <= (1));
+});
+quil.sketch.add_canvas = (function quil$sketch$add_canvas(canvas_id){
+var canvas = document.createElement("canvas");
+canvas.setAttribute("id",canvas_id);
+
+return document.body.appendChild(canvas);
+});
+quil.sketch.init_sketches = (function quil$sketch$init_sketches(){
+var add_elem_QMARK__8249 = quil.sketch.empty_body_QMARK_.call(null);
+var seq__8245_8250 = cljs.core.seq.call(null,cljs.core.deref.call(null,quil.sketch.sketch_init_list));
+var chunk__8246_8251 = null;
+var count__8247_8252 = (0);
+var i__8248_8253 = (0);
+while(true){
+if((i__8248_8253 < count__8247_8252)){
+var sk_8254 = cljs.core._nth.call(null,chunk__8246_8251,i__8248_8253);
+if(cljs.core.truth_(add_elem_QMARK__8249)){
+quil.sketch.add_canvas.call(null,new cljs.core.Keyword(null,"host-id","host-id",742376279).cljs$core$IFn$_invoke$arity$1(sk_8254));
+} else {
+}
+
+new cljs.core.Keyword(null,"fn","fn",-1175266204).cljs$core$IFn$_invoke$arity$1(sk_8254).call(null);
+
+var G__8255 = seq__8245_8250;
+var G__8256 = chunk__8246_8251;
+var G__8257 = count__8247_8252;
+var G__8258 = (i__8248_8253 + (1));
+seq__8245_8250 = G__8255;
+chunk__8246_8251 = G__8256;
+count__8247_8252 = G__8257;
+i__8248_8253 = G__8258;
+continue;
+} else {
+var temp__4657__auto___8259 = cljs.core.seq.call(null,seq__8245_8250);
+if(temp__4657__auto___8259){
+var seq__8245_8260__$1 = temp__4657__auto___8259;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__8245_8260__$1)){
+var c__7633__auto___8261 = cljs.core.chunk_first.call(null,seq__8245_8260__$1);
+var G__8262 = cljs.core.chunk_rest.call(null,seq__8245_8260__$1);
+var G__8263 = c__7633__auto___8261;
+var G__8264 = cljs.core.count.call(null,c__7633__auto___8261);
+var G__8265 = (0);
+seq__8245_8250 = G__8262;
+chunk__8246_8251 = G__8263;
+count__8247_8252 = G__8264;
+i__8248_8253 = G__8265;
+continue;
+} else {
+var sk_8266 = cljs.core.first.call(null,seq__8245_8260__$1);
+if(cljs.core.truth_(add_elem_QMARK__8249)){
+quil.sketch.add_canvas.call(null,new cljs.core.Keyword(null,"host-id","host-id",742376279).cljs$core$IFn$_invoke$arity$1(sk_8266));
+} else {
+}
+
+new cljs.core.Keyword(null,"fn","fn",-1175266204).cljs$core$IFn$_invoke$arity$1(sk_8266).call(null);
+
+var G__8267 = cljs.core.next.call(null,seq__8245_8260__$1);
+var G__8268 = null;
+var G__8269 = (0);
+var G__8270 = (0);
+seq__8245_8250 = G__8267;
+chunk__8246_8251 = G__8268;
+count__8247_8252 = G__8269;
+i__8248_8253 = G__8270;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+return cljs.core.reset_BANG_.call(null,quil.sketch.sketch_init_list,cljs.core.PersistentVector.EMPTY);
+});
+quil.sketch.add_sketch_to_init_list = (function quil$sketch$add_sketch_to_init_list(sk){
+cljs.core.swap_BANG_.call(null,quil.sketch.sketch_init_list,cljs.core.conj,sk);
+
+if(cljs.core._EQ_.call(null,document.readyState,"complete")){
+return quil.sketch.init_sketches.call(null);
+} else {
+return null;
+}
+});
+goog.events.listenOnce(window,goog.events.EventType.LOAD,quil.sketch.init_sketches);
+
+//# sourceMappingURL=sketch.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/sketch.js.map b/src/http/static/viz/1/quil/sketch.js.map
new file mode 100644
index 0000000..3af57f2
--- /dev/null
+++ b/src/http/static/viz/1/quil/sketch.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/sketch.js","sources":["sketch.cljs"],"lineCount":348,"mappings":"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","names":["quil.sketch\/*applet*","quil.sketch\/current-applet","js\/Processing.prototype.PConstants","quil.sketch\/rendering-modes","quil.sketch\/resolve-renderer","mode","quil.util\/resolve-constant-key","var_args","args8189","len__7927__auto__","i__7928__auto__","G__8191","quil.sketch\/size","js\/Error","width","height","quil.sketch\/bind-handlers","prc","opts","seq__8208","cljs.core\/seq","chunk__8209","count__8210","i__8211","vec__8212","cljs.core\/-nth","cljs.core\/nth","temp__4657__auto__","cljs.core\/chunked-seq?","c__7633__auto__","cljs.core\/chunk-first","cljs.core\/chunk-rest","cljs.core\/count","vec__8216","cljs.core\/first","cljs.core\/next","processing-name","quil-name","handler","cljs.core\/name","*applet*8215","*applet*8219","quil.sketch\/make-sketch","options","cljs.core\/cons","quil.middlewares.deprecated-options\/deprecated-options","cljs.core\/apply","cljs.core\/comp","p1__8236#","cljs.core\/merge","sketch-size","or__6814__auto__","renderer","features","cljs.core\/set","setup","cljs.core\/concat","mouse-wheel","cljs.core\/assoc","attach-function","cljs.core\/atom","sketch","js\/Processing.Sketch","cljs.core\/contains?","quil.sketch\/destroy-previous-sketch","host-elem","proc-obj","args__7934__auto__","argseq__7935__auto__","cljs.core\/IndexedSeq","quil.sketch\/sketch","seq8237","opts-map","cljs.core\/hash-map","goog.dom\/getElement","cljs.core\/=","js\/console","js\/Processing","quil.sketch\/sketch-init-list","quil.sketch\/empty-body?","child","js\/document","quil.sketch\/add-canvas","canvas-id","canvas","quil.sketch\/init-sketches","add-elem?","seq__8245","cljs.core\/deref","chunk__8246","count__8247","i__8248","sk","cljs.core\/reset!","quil.sketch\/add-sketch-to-init-list","cljs.core\/swap!","cljs.core\/conj","goog.events\/listenOnce","js\/window","goog.events.EventType\/LOAD","cljs.core\/List"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/util.cljc b/src/http/static/viz/1/quil/util.cljc
new file mode 100644
index 0000000..3cd0739
--- /dev/null
+++ b/src/http/static/viz/1/quil/util.cljc
@@ -0,0 +1,109 @@
+(ns ^{:doc "Utility fns"}
+ quil.util
+ (:require [clojure.string :as cstr]))
+
+(defn no-fn
+ "Function that does nothing."
+ [])
+
+#?(:clj
+ (defn callable? [value]
+ (or (fn? value)
+ (var? value))))
+
+#?(:clj
+ (defn absolute-path [path]
+ (-> (str path)
+ (java.io.File.)
+ (.getAbsolutePath))))
+
+#?(:clj
+ (defn int-like?
+ [val]
+ (let [t (type val)]
+ (or (= java.lang.Long t)
+ (= java.lang.Integer t)))))
+
+(defn resolve-constant-key
+ "Returns the val associated with key in mappings or key directly if it
+ is one of the vals in mappings. Otherwise throws an exception."
+ [key mappings]
+ (cond
+ (get mappings key) (get mappings key)
+ (some #{key} (vals mappings)) key
+
+ :else (throw (#?(:clj Exception.
+ :cljs js/Error.)
+ (str "Expecting a keyword, got: " key ". Expected one of: " (vec (sort (keys mappings))))))))
+
+(defn- length-of-longest-key
+ "Returns the length of the longest key of map m. Assumes m's keys are strings
+ and returns 0 if map is empty:
+ (length-of-longest-key {\"foo\" 1 \"barr\" 2 \"bazzz\" 3}) ;=> 5
+ (length-of-longest-key {}) ;=> 0"
+ [m]
+ (or (last (sort (map #(.length %) (keys m))))
+ 0))
+
+(defn- gen-padding
+ "Generates a padding string starting concatting s with len times pad:
+ (gen-padding \"\" 5 \"b\") ;=> \"bbbbb\"
+ May be called without starting string s in which case it defaults to the
+ empty string and also without pad in which case it defaults to a single space"
+ ([len] (gen-padding "" len " "))
+ ([len pad] (gen-padding "" len pad))
+ ([s len pad]
+ (if (> len 0)
+ (gen-padding (str s pad) (dec len) pad)
+ s)))
+
+(defn print-definition-list
+ [definitions]
+ (let [longest-key (length-of-longest-key definitions)]
+ (dorun
+ (map (fn [[k v]]
+ (let [len (.length k)
+ diff (- longest-key len)
+ pad (gen-padding diff)]
+ (println k pad "- " v)))
+ definitions))))
+
+(defn clj-compilation? []
+ #?(:clj
+ (not
+ (boolean
+ (when-let [n (find-ns 'cljs.analyzer)]
+ (when-let [v (ns-resolve n '*cljs-file*)]
+ @v))))
+ :cljs false))
+
+
+(defn prepare-quil-name [const-keyword]
+ (cstr/replace
+ (cstr/upper-case (name const-keyword))
+ #"-" "_"))
+
+(defn prepare-quil-clj-constants [constants]
+ (into {}
+ (map
+ #(vector % (symbol (str "PConstants/" (prepare-quil-name %))))
+ constants)))
+
+(defn prepare-quil-cljs-constants [constants]
+ (into {}
+ (map
+ #(vector % `(aget js/Processing.prototype.PConstants ~(prepare-quil-name %)))
+ constants)))
+
+(defn make-quil-constant-map [target const-map-name const-map]
+ `(def ^{:private true}
+ ~const-map-name
+ ~(if (= target :clj)
+ (prepare-quil-clj-constants const-map)
+ (prepare-quil-cljs-constants const-map))))
+
+(defmacro generate-quil-constants [target & opts]
+ `(do
+ ~@(map
+ #(make-quil-constant-map target (first %) (second %))
+ (partition 2 opts))))
diff --git a/src/http/static/viz/1/quil/util.cljc.cache.edn b/src/http/static/viz/1/quil/util.cljc.cache.edn
new file mode 100644
index 0000000..0eb6abe
--- /dev/null
+++ b/src/http/static/viz/1/quil/util.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {Error {}, Processing {prototype {PConstants {}}}}, :use-macros {}, :excludes #{}, :name quil.util, :imports nil, :requires {cstr clojure.string, clojure.string clojure.string}, :uses nil, :defs {clj-compilation? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 71, :column 7, :end-line 71, :end-column 23, :arglists (quote ([]))}, :name quil.util/clj-compilation?, :variadic false, :file "out/quil/util.cljc", :end-column 23, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 71, :end-line 71, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, make-quil-constant-map {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 98, :column 7, :end-line 98, :end-column 29, :arglists (quote ([target const-map-name const-map]))}, :name quil.util/make-quil-constant-map, :variadic false, :file "out/quil/util.cljc", :end-column 29, :method-params ([target const-map-name const-map]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 98, :end-line 98, :max-fixed-arity 3, :fn-var true, :arglists (quote ([target const-map-name const-map]))}, print-definition-list {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 60, :column 7, :end-line 60, :end-column 28, :arglists (quote ([definitions]))}, :name quil.util/print-definition-list, :variadic false, :file "out/quil/util.cljc", :end-column 28, :method-params ([definitions]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 60, :end-line 60, :max-fixed-arity 1, :fn-var true, :arglists (quote ([definitions]))}, generate-quil-constants {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 105, :column 11, :end-line 105, :end-column 34, :macro true, :arglists (quote ([target & opts])), :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env target opts)], :arglists ([&form &env target & opts]), :arglists-meta (nil)}}, :name quil.util/generate-quil-constants, :variadic true, :file "out/quil/util.cljc", :end-column 34, :top-fn {:variadic true, :max-fixed-arity 3, :method-params [(&form &env target opts)], :arglists ([&form &env target & opts]), :arglists-meta (nil)}, :method-params [(&form &env target opts)], :protocol-impl nil, :arglists-meta (nil), :column 1, :line 105, :macro true, :end-line 105, :max-fixed-arity 3, :fn-var false, :arglists ([&form &env target & opts])}, resolve-constant-key {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 27, :column 7, :end-line 27, :end-column 27, :arglists (quote ([key mappings])), :doc "Returns the val associated with key in mappings or key directly if it\n is one of the vals in mappings. Otherwise throws an exception."}, :name quil.util/resolve-constant-key, :variadic false, :file "out/quil/util.cljc", :end-column 27, :method-params ([key mappings]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 27, :end-line 27, :max-fixed-arity 2, :fn-var true, :arglists (quote ([key mappings])), :doc "Returns the val associated with key in mappings or key directly if it\n is one of the vals in mappings. Otherwise throws an exception."}, no-fn {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 5, :column 7, :end-line 5, :end-column 12, :arglists (quote ([])), :doc "Function that does nothing."}, :name quil.util/no-fn, :variadic false, :file "out/quil/util.cljc", :end-column 12, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 5, :end-line 5, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Function that does nothing."}, prepare-quil-clj-constants {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 86, :column 7, :end-line 86, :end-column 33, :arglists (quote ([constants]))}, :name quil.util/prepare-quil-clj-constants, :variadic false, :file "out/quil/util.cljc", :end-column 33, :method-params ([constants]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 86, :end-line 86, :max-fixed-arity 1, :fn-var true, :arglists (quote ([constants]))}, prepare-quil-cljs-constants {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 92, :column 7, :end-line 92, :end-column 34, :arglists (quote ([constants]))}, :name quil.util/prepare-quil-cljs-constants, :variadic false, :file "out/quil/util.cljc", :end-column 34, :method-params ([constants]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 92, :end-line 92, :max-fixed-arity 1, :fn-var true, :arglists (quote ([constants]))}, length-of-longest-key {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 39, :column 8, :end-line 39, :end-column 29, :private true, :arglists (quote ([m])), :doc "Returns the length of the longest key of map m. Assumes m's keys are strings\n and returns 0 if map is empty:\n (length-of-longest-key {\"foo\" 1 \"barr\" 2 \"bazzz\" 3}) ;=> 5\n (length-of-longest-key {}) ;=> 0"}, :private true, :name quil.util/length-of-longest-key, :variadic false, :file "out/quil/util.cljc", :end-column 29, :method-params ([m]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 39, :end-line 39, :max-fixed-arity 1, :fn-var true, :arglists (quote ([m])), :doc "Returns the length of the longest key of map m. Assumes m's keys are strings\n and returns 0 if map is empty:\n (length-of-longest-key {\"foo\" 1 \"barr\" 2 \"bazzz\" 3}) ;=> 5\n (length-of-longest-key {}) ;=> 0"}, gen-padding {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 48, :column 8, :end-line 48, :end-column 19, :private true, :arglists (quote ([len] [len pad] [s len pad])), :doc "Generates a padding string starting concatting s with len times pad:\n (gen-padding \"\" 5 \"b\") ;=> \"bbbbb\"\n May be called without starting string s in which case it defaults to the\n empty string and also without pad in which case it defaults to a single space", :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([len] [len pad] [s len pad]), :arglists ([len] [len pad] [s len pad]), :arglists-meta (nil nil nil)}}, :private true, :name quil.util/gen-padding, :variadic false, :file "out/quil/util.cljc", :end-column 19, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([len] [len pad] [s len pad]), :arglists ([len] [len pad] [s len pad]), :arglists-meta (nil nil nil)}, :method-params ([len] [len pad] [s len pad]), :protocol-impl nil, :arglists-meta (nil nil nil), :column 1, :line 48, :end-line 48, :max-fixed-arity 3, :fn-var true, :arglists ([len] [len pad] [s len pad]), :doc "Generates a padding string starting concatting s with len times pad:\n (gen-padding \"\" 5 \"b\") ;=> \"bbbbb\"\n May be called without starting string s in which case it defaults to the\n empty string and also without pad in which case it defaults to a single space"}, prepare-quil-name {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/util.cljc", :line 81, :column 7, :end-line 81, :end-column 24, :arglists (quote ([const-keyword]))}, :name quil.util/prepare-quil-name, :variadic false, :file "out/quil/util.cljc", :end-column 24, :method-params ([const-keyword]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 81, :end-line 81, :max-fixed-arity 1, :fn-var true, :arglists (quote ([const-keyword]))}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:else do js/Processing.prototype.PConstants :clj cljs.core/aget def}, :order [:else cljs.core/aget js/Processing.prototype.PConstants def :clj do]}, :doc "Utility fns"} \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/util.js b/src/http/static/viz/1/quil/util.js
new file mode 100644
index 0000000..0f241ea
--- /dev/null
+++ b/src/http/static/viz/1/quil/util.js
@@ -0,0 +1,183 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.util');
+goog.require('cljs.core');
+goog.require('clojure.string');
+/**
+ * Function that does nothing.
+ */
+quil.util.no_fn = (function quil$util$no_fn(){
+return null;
+});
+/**
+ * Returns the val associated with key in mappings or key directly if it
+ * is one of the vals in mappings. Otherwise throws an exception.
+ */
+quil.util.resolve_constant_key = (function quil$util$resolve_constant_key(key,mappings){
+if(cljs.core.truth_(cljs.core.get.call(null,mappings,key))){
+return cljs.core.get.call(null,mappings,key);
+} else {
+if(cljs.core.truth_(cljs.core.some.call(null,cljs.core.PersistentHashSet.createAsIfByAssoc([key], true),cljs.core.vals.call(null,mappings)))){
+return key;
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Expecting a keyword, got: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(key),cljs.core.str.cljs$core$IFn$_invoke$arity$1(". Expected one of: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.vec.call(null,cljs.core.sort.call(null,cljs.core.keys.call(null,mappings))))].join('')));
+
+}
+}
+});
+/**
+ * Returns the length of the longest key of map m. Assumes m's keys are strings
+ * and returns 0 if map is empty:
+ * (length-of-longest-key {"foo" 1 "barr" 2 "bazzz" 3}) ;=> 5
+ * (length-of-longest-key {}) ;=> 0
+ */
+quil.util.length_of_longest_key = (function quil$util$length_of_longest_key(m){
+var or__6814__auto__ = cljs.core.last.call(null,cljs.core.sort.call(null,cljs.core.map.call(null,(function (p1__8122_SHARP_){
+return p1__8122_SHARP_.length();
+}),cljs.core.keys.call(null,m))));
+if(cljs.core.truth_(or__6814__auto__)){
+return or__6814__auto__;
+} else {
+return (0);
+}
+});
+/**
+ * Generates a padding string starting concatting s with len times pad:
+ * (gen-padding "" 5 "b") ;=> "bbbbb"
+ * May be called without starting string s in which case it defaults to the
+ * empty string and also without pad in which case it defaults to a single space
+ */
+quil.util.gen_padding = (function quil$util$gen_padding(var_args){
+var args8123 = [];
+var len__7927__auto___8126 = arguments.length;
+var i__7928__auto___8127 = (0);
+while(true){
+if((i__7928__auto___8127 < len__7927__auto___8126)){
+args8123.push((arguments[i__7928__auto___8127]));
+
+var G__8128 = (i__7928__auto___8127 + (1));
+i__7928__auto___8127 = G__8128;
+continue;
+} else {
+}
+break;
+}
+
+var G__8125 = args8123.length;
+switch (G__8125) {
+case 1:
+return quil.util.gen_padding.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.util.gen_padding.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.util.gen_padding.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args8123.length)].join('')));
+
+}
+});
+
+quil.util.gen_padding.cljs$core$IFn$_invoke$arity$1 = (function (len){
+return quil.util.gen_padding.call(null,"",len," ");
+});
+
+quil.util.gen_padding.cljs$core$IFn$_invoke$arity$2 = (function (len,pad){
+return quil.util.gen_padding.call(null,"",len,pad);
+});
+
+quil.util.gen_padding.cljs$core$IFn$_invoke$arity$3 = (function (s,len,pad){
+if((len > (0))){
+return quil.util.gen_padding.call(null,[cljs.core.str.cljs$core$IFn$_invoke$arity$1(s),cljs.core.str.cljs$core$IFn$_invoke$arity$1(pad)].join(''),(len - (1)),pad);
+} else {
+return s;
+}
+});
+
+quil.util.gen_padding.cljs$lang$maxFixedArity = 3;
+
+quil.util.print_definition_list = (function quil$util$print_definition_list(definitions){
+var longest_key = quil.util.length_of_longest_key.call(null,definitions);
+return cljs.core.dorun.call(null,cljs.core.map.call(null,((function (longest_key){
+return (function (p__8134){
+var vec__8135 = p__8134;
+var k = cljs.core.nth.call(null,vec__8135,(0),null);
+var v = cljs.core.nth.call(null,vec__8135,(1),null);
+var len = k.length();
+var diff = (longest_key - len);
+var pad = quil.util.gen_padding.call(null,diff);
+return cljs.core.println.call(null,k,pad,"- ",v);
+});})(longest_key))
+,definitions));
+});
+quil.util.clj_compilation_QMARK_ = (function quil$util$clj_compilation_QMARK_(){
+return false;
+});
+quil.util.prepare_quil_name = (function quil$util$prepare_quil_name(const_keyword){
+return clojure.string.replace.call(null,clojure.string.upper_case.call(null,cljs.core.name.call(null,const_keyword)),/-/,"_");
+});
+quil.util.prepare_quil_clj_constants = (function quil$util$prepare_quil_clj_constants(constants){
+return cljs.core.into.call(null,cljs.core.PersistentArrayMap.EMPTY,cljs.core.map.call(null,(function (p1__8138_SHARP_){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[p1__8138_SHARP_,cljs.core.symbol.call(null,[cljs.core.str.cljs$core$IFn$_invoke$arity$1("PConstants/"),cljs.core.str.cljs$core$IFn$_invoke$arity$1(quil.util.prepare_quil_name.call(null,p1__8138_SHARP_))].join(''))],null));
+}),constants));
+});
+quil.util.prepare_quil_cljs_constants = (function quil$util$prepare_quil_cljs_constants(constants){
+return cljs.core.into.call(null,cljs.core.PersistentArrayMap.EMPTY,cljs.core.map.call(null,(function (p1__8139_SHARP_){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[p1__8139_SHARP_,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("cljs.core","aget","cljs.core/aget",6345791,null)),cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol("js","Processing.prototype.PConstants","js/Processing.prototype.PConstants",2034048972,null)),(function (){var x__7656__auto__ = quil.util.prepare_quil_name.call(null,p1__8139_SHARP_);
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())))],null));
+}),constants));
+});
+quil.util.make_quil_constant_map = (function quil$util$make_quil_constant_map(target,const_map_name,const_map){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"def","def",597100991,null)),(function (){var x__7656__auto__ = const_map_name;
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})(),(function (){var x__7656__auto__ = ((cljs.core._EQ_.call(null,target,new cljs.core.Keyword(null,"clj","clj",-660495428)))?quil.util.prepare_quil_clj_constants.call(null,const_map):quil.util.prepare_quil_cljs_constants.call(null,const_map));
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto__);
+})())));
+});
+quil.util.generate_quil_constants = (function quil$util$generate_quil_constants(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___8145 = arguments.length;
+var i__7928__auto___8146 = (0);
+while(true){
+if((i__7928__auto___8146 < len__7927__auto___8145)){
+args__7934__auto__.push((arguments[i__7928__auto___8146]));
+
+var G__8147 = (i__7928__auto___8146 + (1));
+i__7928__auto___8146 = G__8147;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((3) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((3)),(0),null)):null);
+return quil.util.generate_quil_constants.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__7935__auto__);
+});
+
+quil.util.generate_quil_constants.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,target,opts){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,cljs.core._conj.call(null,cljs.core.List.EMPTY,new cljs.core.Symbol(null,"do","do",1686842252,null)),cljs.core.map.call(null,(function (p1__8140_SHARP_){
+return quil.util.make_quil_constant_map.call(null,target,cljs.core.first.call(null,p1__8140_SHARP_),cljs.core.second.call(null,p1__8140_SHARP_));
+}),cljs.core.partition.call(null,(2),opts)))));
+});
+
+quil.util.generate_quil_constants.cljs$lang$maxFixedArity = (3);
+
+quil.util.generate_quil_constants.cljs$lang$applyTo = (function (seq8141){
+var G__8142 = cljs.core.first.call(null,seq8141);
+var seq8141__$1 = cljs.core.next.call(null,seq8141);
+var G__8143 = cljs.core.first.call(null,seq8141__$1);
+var seq8141__$2 = cljs.core.next.call(null,seq8141__$1);
+var G__8144 = cljs.core.first.call(null,seq8141__$2);
+var seq8141__$3 = cljs.core.next.call(null,seq8141__$2);
+return quil.util.generate_quil_constants.cljs$core$IFn$_invoke$arity$variadic(G__8142,G__8143,G__8144,seq8141__$3);
+});
+
+
+quil.util.generate_quil_constants.cljs$lang$macro = true;
+
+//# sourceMappingURL=util.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/quil/util.js.map b/src/http/static/viz/1/quil/util.js.map
new file mode 100644
index 0000000..1b314df
--- /dev/null
+++ b/src/http/static/viz/1/quil/util.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/util.js","sources":["util.cljc"],"lineCount":183,"mappings":"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","names":["quil.util\/no-fn","quil.util\/resolve-constant-key","key","mappings","cljs.core\/get","cljs.core\/some","cljs.core\/vals","js\/Error","cljs.core\/vec","cljs.core\/sort","cljs.core\/keys","quil.util\/length-of-longest-key","m","or__6814__auto__","cljs.core\/last","p1__8122#","cljs.core\/map","var_args","args8123","len__7927__auto__","i__7928__auto__","G__8125","quil.util\/gen-padding","len","pad","s","quil.util\/print-definition-list","definitions","longest-key","cljs.core\/dorun","p__8134","vec__8135","cljs.core\/nth","k","v","diff","cljs.core\/println","quil.util\/clj-compilation?","quil.util\/prepare-quil-name","const-keyword","clojure.string\/replace","clojure.string\/upper-case","cljs.core\/name","quil.util\/prepare-quil-clj-constants","constants","cljs.core\/into","p1__8138#","cljs.core\/PersistentVector","cljs.core\/symbol","quil.util\/prepare-quil-cljs-constants","p1__8139#","cljs.core\/sequence","cljs.core\/seq","cljs.core\/concat","cljs.core\/-conj","x__7656__auto__","quil.util\/make-quil-constant-map","target","const-map-name","const-map","cljs.core\/=","args__7934__auto__","argseq__7935__auto__","cljs.core\/IndexedSeq","quil.util\/generate-quil-constants","&form","&env","seq8141","G__8142","cljs.core\/first","cljs.core\/next","G__8143","G__8144","opts","p1__8140#","cljs.core\/second","cljs.core\/partition","cljs.core\/List"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/core.cljs b/src/http/static/viz/1/viz/core.cljs
new file mode 100644
index 0000000..913cab4
--- /dev/null
+++ b/src/http/static/viz/1/viz/core.cljs
@@ -0,0 +1,204 @@
+(ns viz.core
+ (:require [quil.core :as q :include-macros true]
+ [quil.middleware :as m]
+ [viz.forest :as forest]
+ [viz.grid :as grid]
+ [viz.ghost :as ghost]
+ [goog.string :as gstring]
+ [goog.string.format]
+ ;[gil.core :as gil]
+ ))
+
+(defn- debug [& args]
+ (.log js/console (clojure.string/join " " (map str args))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defn- window-partial [k]
+ (int (* (aget js/document "documentElement" k) 0.95)))
+
+(def window-size [ (min 1025 (window-partial "clientWidth"))
+ (int (* (window-partial "clientHeight") 0.75))
+ ])
+(def window-half-size (apply vector (map #(float (/ %1 2)) window-size)))
+
+(defn- new-state []
+ {:frame-rate 15
+ :exit-wait-frames 40
+ :tail-length 15
+ :frame 0
+ :gif-seconds 0
+ :grid-width 30 ; from the center
+ :ghost (-> (ghost/new-ghost grid/euclidean)
+ (ghost/new-active-node [0 0])
+ )
+ })
+
+(defn- curr-second [state]
+ (float (/ (:frame state) (:frame-rate state))))
+
+(defn- grid-size [state]
+ (let [h (int (* (window-size 1)
+ (float (/ (:grid-width state) (window-size 0)))))]
+ [(:grid-width state) h]))
+
+(defn- positive [n] (if (> 0 n) (- n) n))
+
+(defn- spawn-chance [state]
+ (let [period-seconds 1
+ period-frames (* (:frame-rate state) period-seconds)]
+ (if (zero? (rem (:frame state) period-frames))
+ 1 100)
+ ))
+
+ ;(let [period-seconds 1
+ ; rad-per-second (float (/ (/ Math/PI 2) period-seconds))
+ ; rad (* rad-per-second (curr-second state))
+ ; chance-raw (positive (q/sin rad))
+ ; ]
+ ; (if (> chance-raw 0.97) 3 50)
+ ; ))
+
+
+;(defn- mk-poss-fn [state]
+; (let [chance (spawn-chance state)]
+; (fn [pos adj-poss]
+; (if (zero? (rand-int chance))
+; adj-poss
+; (take 1 (shuffle adj-poss))))
+; ))
+
+(defn- mk-poss-fn [state]
+ (fn [pos adj-poss]
+ (take 2 (random-sample 0.6 adj-poss))))
+
+(defn setup []
+ (let [state (new-state)]
+ (q/frame-rate (:frame-rate state))
+ state))
+
+(defn- scale [state xy]
+ (map-indexed #(* %2 (float (/ (window-half-size %1)
+ ((grid-size state) %1)))) xy))
+
+; each bound is a position vector
+(defn- in-bounds? [min-bound max-bound pos]
+ (let [pos-k (keep-indexed #(let [mini (min-bound %1)
+ maxi (max-bound %1)]
+ (when (and (>= %2 mini) (<= %2 maxi)) %2)) pos)]
+ (= (count pos) (count pos-k))))
+
+(defn- quil-bounds [state buffer]
+ (let [[w h] (apply vector (map #(- % buffer) (grid-size state)))]
+ [[(- w) (- h)] [w h]]))
+
+(defn- ghost-incr [state]
+ (assoc state :ghost
+ (ghost/filter-active-nodes (ghost/incr (:ghost state) (mk-poss-fn state))
+ #(let [[minb maxb] (quil-bounds state 2)]
+ (in-bounds? minb maxb (:pos %1))))))
+
+(defn- ghost-expire-roots [state]
+ (if-not (< (:tail-length state) (:frame state)) state
+ (update-in state [:ghost] ghost/remove-roots)))
+
+(defn- maybe-exit [state]
+ (if (empty? (get-in state [:ghost :active-node-ids]))
+ (if (zero? (:exit-wait-frames state)) (new-state)
+ (update-in state [:exit-wait-frames] dec))
+ state))
+
+(defn update-state [state]
+ (-> state
+ (ghost-incr)
+ (ghost-expire-roots)
+ (update-in [:frame] inc)
+ (maybe-exit)))
+
+(defn- draw-ellipse [state pos size] ; size is [w h]
+ (let [scaled-pos (scale state pos)
+ scaled-size (map int (scale state size))]
+ (apply q/ellipse (concat scaled-pos scaled-size))))
+
+(defn- in-line? [& nodes]
+ (apply = (map #(apply map - %1)
+ (partition 2 1 (map :pos nodes)))))
+
+(defn draw-lines [state forest parent node]
+ "Draws the lines of all children leading from the node, recursively"
+ (q/stroke 0xFF000000)
+ (q/fill 0xFFFFFFFF)
+ (let [children (map #(forest/get-node forest %) (:child-ids node))]
+
+ (if-not parent
+ (doseq [child children] (draw-lines state forest node child))
+ (let [in-line-child (some #(if (in-line? parent node %) %) children)
+ ]
+ (doseq [child children]
+ (if (and in-line-child (= in-line-child child))
+ (draw-lines state forest parent child)
+ (draw-lines state forest node child)))
+ (when-not in-line-child
+ (apply q/line (apply concat
+ (map #(scale state %)
+ (map :pos (list parent node))))))
+ ))
+
+ ; we also take the opportunity to draw the leaves
+ (when (empty? children)
+ (draw-ellipse state (:pos node) [0.3 0.3]))
+
+ ))
+
+(defn draw-state [state]
+ ; Clear the sketch by filling it with light-grey color.
+ (q/background 0xFFFFFFFF)
+ (q/with-translation [(/ (window-size 0) 2)
+ (/ (window-size 1) 2)]
+ (let [lines (forest/lines (get-in state [:ghost :forest]))
+ leaves (forest/leaves (get-in state [:ghost :forest]))
+ active (ghost/active-nodes (:ghost state))
+ roots (forest/roots (get-in state [:ghost :forest]))
+ ]
+
+ (q/stroke 0xFF000000)
+ (doseq [root roots]
+ (draw-lines state (get-in state [:ghost :forest]) nil root))
+
+ (q/stroke 0xFF000000)
+ (q/fill 0xFF000000)
+ (doseq [active-node active]
+ (let [pos (:pos active-node)]
+ (draw-ellipse state pos [0.35 0.35])
+ ))
+
+ ))
+
+ ;(when-not (zero? (:gif-seconds state))
+ ; (let [anim-frames (* (:gif-seconds state) (:frame-rate state))]
+ ; (gil/save-animation "quil.gif" anim-frames 0)
+ ; (when (> (:frame state) anim-frames) (q/exit))))
+
+ ;(q/text (clojure.string/join
+ ; "\n"
+ ; (list
+ ; (gstring/format "frame:%d" (:frame state))
+ ; (gstring/format "second:%f" (curr-second state))
+ ; (gstring/format "spawn-chance:%d" (spawn-chance state))))
+ ; 30 30)
+ )
+
+(q/defsketch viz
+ :title ""
+ :host "viz"
+ :size window-size
+ ; setup function called only once, during sketch initialization.
+ :setup setup
+ ; update-state is called on each iteration before draw-state.
+ :update update-state
+ :draw draw-state
+ :features [:keep-on-top]
+ ; This sketch uses functional-mode middleware.
+ ; Check quil wiki for more info about middlewares and particularly
+ ; fun-mode.
+ :middleware [m/fun-mode])
diff --git a/src/http/static/viz/1/viz/core.cljs.cache.edn b/src/http/static/viz/1/viz/core.cljs.cache.edn
new file mode 100644
index 0000000..2156790
--- /dev/null
+++ b/src/http/static/viz/1/viz/core.cljs.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {console {log {}}, document {}}, :use-macros {}, :excludes #{}, :name viz.core, :imports nil, :requires {gstring goog.string, goog.string goog.string, q quil.core, viz.forest viz.forest, grid viz.grid, m quil.middleware, quil.core quil.core, quil.middleware quil.middleware, goog.string.format goog.string.format, viz.ghost viz.ghost, forest viz.forest, viz.grid viz.grid, ghost viz.ghost}, :uses nil, :defs {draw-state {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 153, :column 7, :end-line 153, :end-column 17, :arglists (quote ([state]))}, :name viz.core/draw-state, :variadic false, :file "src/viz/core.cljs", :end-column 17, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 153, :end-line 153, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state]))}, ghost-expire-roots {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 101, :column 8, :end-line 101, :end-column 26, :private true, :arglists (quote ([state]))}, :private true, :name viz.core/ghost-expire-roots, :variadic false, :file "src/viz/core.cljs", :end-column 26, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 101, :end-line 101, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state]))}, viz {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 191, :column 14, :end-line 191, :end-column 17, :export true, :arglists (quote ([]))}, :name viz.core/viz, :variadic false, :file "src/viz/core.cljs", :end-column 17, :method-params ([]), :protocol-impl nil, :export true, :arglists-meta (nil nil), :column 1, :line 191, :end-line 191, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, update-state {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 111, :column 7, :end-line 111, :end-column 19, :arglists (quote ([state]))}, :name viz.core/update-state, :variadic false, :file "src/viz/core.cljs", :end-column 19, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 111, :end-line 111, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state]))}, maybe-exit {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 105, :column 8, :end-line 105, :end-column 18, :private true, :arglists (quote ([state]))}, :private true, :name viz.core/maybe-exit, :variadic false, :file "src/viz/core.cljs", :end-column 18, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 105, :end-line 105, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state]))}, quil-bounds {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 91, :column 8, :end-line 91, :end-column 19, :private true, :arglists (quote ([state buffer]))}, :private true, :name viz.core/quil-bounds, :variadic false, :file "src/viz/core.cljs", :end-column 19, :method-params ([state buffer]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 91, :end-line 91, :max-fixed-arity 2, :fn-var true, :arglists (quote ([state buffer]))}, draw-ellipse {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 118, :column 8, :end-line 118, :end-column 20, :private true, :arglists (quote ([state pos size]))}, :private true, :name viz.core/draw-ellipse, :variadic false, :file "src/viz/core.cljs", :end-column 20, :method-params ([state pos size]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 118, :end-line 118, :max-fixed-arity 3, :fn-var true, :arglists (quote ([state pos size]))}, spawn-chance {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 47, :column 8, :end-line 47, :end-column 20, :private true, :arglists (quote ([state]))}, :private true, :name viz.core/spawn-chance, :variadic false, :file "src/viz/core.cljs", :end-column 20, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 47, :end-line 47, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state]))}, window-partial {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 17, :column 8, :end-line 17, :end-column 22, :private true, :arglists (quote ([k]))}, :private true, :name viz.core/window-partial, :variadic false, :file "src/viz/core.cljs", :end-column 22, :method-params ([k]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 17, :end-line 17, :max-fixed-arity 1, :fn-var true, :arglists (quote ([k]))}, mk-poss-fn {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 71, :column 8, :end-line 71, :end-column 18, :private true, :arglists (quote ([state]))}, :private true, :name viz.core/mk-poss-fn, :variadic false, :file "src/viz/core.cljs", :end-column 18, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 71, :end-line 71, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state]))}, new-state {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 25, :column 8, :end-line 25, :end-column 17, :private true, :arglists (quote ([]))}, :private true, :name viz.core/new-state, :variadic false, :file "src/viz/core.cljs", :end-column 17, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 25, :end-line 25, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, window-half-size {:name viz.core/window-half-size, :file "src/viz/core.cljs", :line 23, :column 1, :end-line 23, :end-column 22, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 23, :column 6, :end-line 23, :end-column 22}, :tag any}, window-size {:name viz.core/window-size, :file "src/viz/core.cljs", :line 20, :column 1, :end-line 20, :end-column 17, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 20, :column 6, :end-line 20, :end-column 17}, :tag cljs.core/IVector}, scale {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 80, :column 8, :end-line 80, :end-column 13, :private true, :arglists (quote ([state xy]))}, :private true, :name viz.core/scale, :variadic false, :file "src/viz/core.cljs", :end-column 13, :method-params ([state xy]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 80, :end-line 80, :max-fixed-arity 2, :fn-var true, :arglists (quote ([state xy]))}, in-line? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 123, :column 8, :end-line 123, :end-column 16, :private true, :arglists (quote ([& nodes])), :top-fn {:variadic true, :max-fixed-arity 0, :method-params [(nodes)], :arglists ([& nodes]), :arglists-meta (nil)}}, :private true, :name viz.core/in-line?, :variadic true, :file "src/viz/core.cljs", :end-column 16, :top-fn {:variadic true, :max-fixed-arity 0, :method-params [(nodes)], :arglists ([& nodes]), :arglists-meta (nil)}, :method-params [(nodes)], :protocol-impl nil, :arglists-meta (nil), :column 1, :line 123, :end-line 123, :max-fixed-arity 0, :fn-var true, :arglists ([& nodes])}, positive {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 45, :column 8, :end-line 45, :end-column 16, :private true, :arglists (quote ([n]))}, :private true, :name viz.core/positive, :variadic false, :file "src/viz/core.cljs", :end-column 16, :method-params ([n]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 45, :end-line 45, :max-fixed-arity 1, :fn-var true, :arglists (quote ([n]))}, debug {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 12, :column 8, :end-line 12, :end-column 13, :private true, :arglists (quote ([& args])), :top-fn {:variadic true, :max-fixed-arity 0, :method-params [(args)], :arglists ([& args]), :arglists-meta (nil)}}, :private true, :name viz.core/debug, :variadic true, :file "src/viz/core.cljs", :end-column 13, :top-fn {:variadic true, :max-fixed-arity 0, :method-params [(args)], :arglists ([& args]), :arglists-meta (nil)}, :method-params [(args)], :protocol-impl nil, :arglists-meta (nil), :column 1, :line 12, :end-line 12, :max-fixed-arity 0, :fn-var true, :arglists ([& args])}, grid-size {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 40, :column 8, :end-line 40, :end-column 17, :private true, :arglists (quote ([state]))}, :private true, :name viz.core/grid-size, :variadic false, :file "src/viz/core.cljs", :end-column 17, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 40, :end-line 40, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state]))}, setup {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 75, :column 7, :end-line 75, :end-column 12, :arglists (quote ([]))}, :name viz.core/setup, :variadic false, :file "src/viz/core.cljs", :end-column 12, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 75, :end-line 75, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, in-bounds? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 85, :column 8, :end-line 85, :end-column 18, :private true, :arglists (quote ([min-bound max-bound pos]))}, :private true, :name viz.core/in-bounds?, :variadic false, :file "src/viz/core.cljs", :end-column 18, :method-params ([min-bound max-bound pos]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 85, :end-line 85, :max-fixed-arity 3, :fn-var true, :arglists (quote ([min-bound max-bound pos]))}, draw-lines {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 127, :column 7, :end-line 127, :end-column 17, :arglists (quote ([state forest parent node]))}, :name viz.core/draw-lines, :variadic false, :file "src/viz/core.cljs", :end-column 17, :method-params ([state forest parent node]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 127, :end-line 127, :max-fixed-arity 4, :fn-var true, :arglists (quote ([state forest parent node]))}, ghost-incr {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 95, :column 8, :end-line 95, :end-column 18, :private true, :arglists (quote ([state]))}, :private true, :name viz.core/ghost-incr, :variadic false, :file "src/viz/core.cljs", :end-column 18, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 95, :end-line 95, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state]))}, curr-second {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/core.cljs", :line 37, :column 8, :end-line 37, :end-column 19, :private true, :arglists (quote ([state]))}, :private true, :name viz.core/curr-second, :variadic false, :file "src/viz/core.cljs", :end-column 19, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 37, :end-line 37, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state]))}}, :require-macros {q quil.core, quil.core quil.core}, :cljs.analyzer/constants {:seen #{:features :active-node-ids :grid-width :frame-rate :fn :frame :exit-wait-frames :pos :gif-seconds :update :size :title :tail-length :setup :middleware :host :forest :keep-on-top :host-id :no-start :ghost :draw :child-ids}, :order [:frame-rate :exit-wait-frames :tail-length :frame :gif-seconds :grid-width :ghost :pos :active-node-ids :child-ids :forest :host :features :keep-on-top :update :size :title :setup :middleware :draw :no-start :fn :host-id]}, :doc nil} \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/core.js b/src/http/static/viz/1/viz/core.js
new file mode 100644
index 0000000..ddc336c
--- /dev/null
+++ b/src/http/static/viz/1/viz/core.js
@@ -0,0 +1,564 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('viz.core');
+goog.require('cljs.core');
+goog.require('quil.core');
+goog.require('quil.middleware');
+goog.require('viz.forest');
+goog.require('viz.grid');
+goog.require('viz.ghost');
+goog.require('goog.string');
+goog.require('goog.string.format');
+viz.core.debug = (function viz$core$debug(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___18287 = arguments.length;
+var i__7928__auto___18288 = (0);
+while(true){
+if((i__7928__auto___18288 < len__7927__auto___18287)){
+args__7934__auto__.push((arguments[i__7928__auto___18288]));
+
+var G__18289 = (i__7928__auto___18288 + (1));
+i__7928__auto___18288 = G__18289;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((0) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((0)),(0),null)):null);
+return viz.core.debug.cljs$core$IFn$_invoke$arity$variadic(argseq__7935__auto__);
+});
+
+viz.core.debug.cljs$core$IFn$_invoke$arity$variadic = (function (args){
+return console.log(clojure.string.join.call(null," ",cljs.core.map.call(null,cljs.core.str,args)));
+});
+
+viz.core.debug.cljs$lang$maxFixedArity = (0);
+
+viz.core.debug.cljs$lang$applyTo = (function (seq18286){
+return viz.core.debug.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq18286));
+});
+
+viz.core.window_partial = (function viz$core$window_partial(k){
+return (((document["documentElement"][k]) * 0.95) | (0));
+});
+viz.core.window_size = new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(function (){var x__7157__auto__ = (1025);
+var y__7158__auto__ = viz.core.window_partial.call(null,"clientWidth");
+return ((x__7157__auto__ < y__7158__auto__) ? x__7157__auto__ : y__7158__auto__);
+})(),((viz.core.window_partial.call(null,"clientHeight") * 0.75) | (0))], null);
+viz.core.window_half_size = cljs.core.apply.call(null,cljs.core.vector,cljs.core.map.call(null,(function (p1__18290_SHARP_){
+return (p1__18290_SHARP_ / (2));
+}),viz.core.window_size));
+viz.core.new_state = (function viz$core$new_state(){
+return new cljs.core.PersistentArrayMap(null, 7, [new cljs.core.Keyword(null,"frame-rate","frame-rate",-994918942),(15),new cljs.core.Keyword(null,"exit-wait-frames","exit-wait-frames",1417213098),(40),new cljs.core.Keyword(null,"tail-length","tail-length",-2007115089),(15),new cljs.core.Keyword(null,"frame","frame",-1711082588),(0),new cljs.core.Keyword(null,"gif-seconds","gif-seconds",1861397548),(0),new cljs.core.Keyword(null,"grid-width","grid-width",837583106),(30),new cljs.core.Keyword(null,"ghost","ghost",-1531157576),viz.ghost.new_active_node.call(null,viz.ghost.new_ghost.call(null,viz.grid.euclidean),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(0)], null))], null);
+});
+viz.core.curr_second = (function viz$core$curr_second(state){
+return (new cljs.core.Keyword(null,"frame","frame",-1711082588).cljs$core$IFn$_invoke$arity$1(state) / new cljs.core.Keyword(null,"frame-rate","frame-rate",-994918942).cljs$core$IFn$_invoke$arity$1(state));
+});
+viz.core.grid_size = (function viz$core$grid_size(state){
+var h = ((viz.core.window_size.call(null,(1)) * (new cljs.core.Keyword(null,"grid-width","grid-width",837583106).cljs$core$IFn$_invoke$arity$1(state) / viz.core.window_size.call(null,(0)))) | (0));
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"grid-width","grid-width",837583106).cljs$core$IFn$_invoke$arity$1(state),h], null);
+});
+viz.core.positive = (function viz$core$positive(n){
+if(((0) > n)){
+return (- n);
+} else {
+return n;
+}
+});
+viz.core.spawn_chance = (function viz$core$spawn_chance(state){
+var period_seconds = (1);
+var period_frames = (new cljs.core.Keyword(null,"frame-rate","frame-rate",-994918942).cljs$core$IFn$_invoke$arity$1(state) * period_seconds);
+if((cljs.core.rem.call(null,new cljs.core.Keyword(null,"frame","frame",-1711082588).cljs$core$IFn$_invoke$arity$1(state),period_frames) === (0))){
+return (1);
+} else {
+return (100);
+}
+});
+viz.core.mk_poss_fn = (function viz$core$mk_poss_fn(state){
+return (function (pos,adj_poss){
+return cljs.core.take.call(null,(2),cljs.core.random_sample.call(null,0.6,adj_poss));
+});
+});
+viz.core.setup = (function viz$core$setup(){
+var state = viz.core.new_state.call(null);
+quil.core.frame_rate.call(null,new cljs.core.Keyword(null,"frame-rate","frame-rate",-994918942).cljs$core$IFn$_invoke$arity$1(state));
+
+return state;
+});
+viz.core.scale = (function viz$core$scale(state,xy){
+return cljs.core.map_indexed.call(null,(function (p1__18292_SHARP_,p2__18291_SHARP_){
+return (p2__18291_SHARP_ * (viz.core.window_half_size.call(null,p1__18292_SHARP_) / viz.core.grid_size.call(null,state).call(null,p1__18292_SHARP_)));
+}),xy);
+});
+viz.core.in_bounds_QMARK_ = (function viz$core$in_bounds_QMARK_(min_bound,max_bound,pos){
+var pos_k = cljs.core.keep_indexed.call(null,(function (p1__18293_SHARP_,p2__18294_SHARP_){
+var mini = min_bound.call(null,p1__18293_SHARP_);
+var maxi = max_bound.call(null,p1__18293_SHARP_);
+if(((p2__18294_SHARP_ >= mini)) && ((p2__18294_SHARP_ <= maxi))){
+return p2__18294_SHARP_;
+} else {
+return null;
+}
+}),pos);
+return cljs.core._EQ_.call(null,cljs.core.count.call(null,pos),cljs.core.count.call(null,pos_k));
+});
+viz.core.quil_bounds = (function viz$core$quil_bounds(state,buffer){
+var vec__18299 = cljs.core.apply.call(null,cljs.core.vector,cljs.core.map.call(null,(function (p1__18295_SHARP_){
+return (p1__18295_SHARP_ - buffer);
+}),viz.core.grid_size.call(null,state)));
+var w = cljs.core.nth.call(null,vec__18299,(0),null);
+var h = cljs.core.nth.call(null,vec__18299,(1),null);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(- w),(- h)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [w,h], null)], null);
+});
+viz.core.ghost_incr = (function viz$core$ghost_incr(state){
+return cljs.core.assoc.call(null,state,new cljs.core.Keyword(null,"ghost","ghost",-1531157576),viz.ghost.filter_active_nodes.call(null,viz.ghost.incr.call(null,new cljs.core.Keyword(null,"ghost","ghost",-1531157576).cljs$core$IFn$_invoke$arity$1(state),viz.core.mk_poss_fn.call(null,state)),(function (p1__18302_SHARP_){
+var vec__18306 = viz.core.quil_bounds.call(null,state,(2));
+var minb = cljs.core.nth.call(null,vec__18306,(0),null);
+var maxb = cljs.core.nth.call(null,vec__18306,(1),null);
+return viz.core.in_bounds_QMARK_.call(null,minb,maxb,new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(p1__18302_SHARP_));
+})));
+});
+viz.core.ghost_expire_roots = (function viz$core$ghost_expire_roots(state){
+if(!((new cljs.core.Keyword(null,"tail-length","tail-length",-2007115089).cljs$core$IFn$_invoke$arity$1(state) < new cljs.core.Keyword(null,"frame","frame",-1711082588).cljs$core$IFn$_invoke$arity$1(state)))){
+return state;
+} else {
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"ghost","ghost",-1531157576)], null),viz.ghost.remove_roots);
+}
+});
+viz.core.maybe_exit = (function viz$core$maybe_exit(state){
+if(cljs.core.empty_QMARK_.call(null,cljs.core.get_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"ghost","ghost",-1531157576),new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751)], null)))){
+if((new cljs.core.Keyword(null,"exit-wait-frames","exit-wait-frames",1417213098).cljs$core$IFn$_invoke$arity$1(state) === (0))){
+return viz.core.new_state.call(null);
+} else {
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"exit-wait-frames","exit-wait-frames",1417213098)], null),cljs.core.dec);
+}
+} else {
+return state;
+}
+});
+viz.core.update_state = (function viz$core$update_state(state){
+return viz.core.maybe_exit.call(null,cljs.core.update_in.call(null,viz.core.ghost_expire_roots.call(null,viz.core.ghost_incr.call(null,state)),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"frame","frame",-1711082588)], null),cljs.core.inc));
+});
+viz.core.draw_ellipse = (function viz$core$draw_ellipse(state,pos,size){
+var scaled_pos = viz.core.scale.call(null,state,pos);
+var scaled_size = cljs.core.map.call(null,cljs.core.int$,viz.core.scale.call(null,state,size));
+return cljs.core.apply.call(null,quil.core.ellipse,cljs.core.concat.call(null,scaled_pos,scaled_size));
+});
+viz.core.in_line_QMARK_ = (function viz$core$in_line_QMARK_(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___18311 = arguments.length;
+var i__7928__auto___18312 = (0);
+while(true){
+if((i__7928__auto___18312 < len__7927__auto___18311)){
+args__7934__auto__.push((arguments[i__7928__auto___18312]));
+
+var G__18313 = (i__7928__auto___18312 + (1));
+i__7928__auto___18312 = G__18313;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((0) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((0)),(0),null)):null);
+return viz.core.in_line_QMARK_.cljs$core$IFn$_invoke$arity$variadic(argseq__7935__auto__);
+});
+
+viz.core.in_line_QMARK_.cljs$core$IFn$_invoke$arity$variadic = (function (nodes){
+return cljs.core.apply.call(null,cljs.core._EQ_,cljs.core.map.call(null,(function (p1__18309_SHARP_){
+return cljs.core.apply.call(null,cljs.core.map,cljs.core._,p1__18309_SHARP_);
+}),cljs.core.partition.call(null,(2),(1),cljs.core.map.call(null,new cljs.core.Keyword(null,"pos","pos",-864607220),nodes))));
+});
+
+viz.core.in_line_QMARK_.cljs$lang$maxFixedArity = (0);
+
+viz.core.in_line_QMARK_.cljs$lang$applyTo = (function (seq18310){
+return viz.core.in_line_QMARK_.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq18310));
+});
+
+viz.core.draw_lines = (function viz$core$draw_lines(state,forest,parent,node){
+
+quil.core.stroke.call(null,(4278190080));
+
+quil.core.fill.call(null,(4294967295));
+
+var children = cljs.core.map.call(null,(function (p1__18314_SHARP_){
+return viz.forest.get_node.call(null,forest,p1__18314_SHARP_);
+}),new cljs.core.Keyword(null,"child-ids","child-ids",-604525861).cljs$core$IFn$_invoke$arity$1(node));
+if(cljs.core.not.call(null,parent)){
+var seq__18325_18333 = cljs.core.seq.call(null,children);
+var chunk__18326_18334 = null;
+var count__18327_18335 = (0);
+var i__18328_18336 = (0);
+while(true){
+if((i__18328_18336 < count__18327_18335)){
+var child_18337 = cljs.core._nth.call(null,chunk__18326_18334,i__18328_18336);
+viz.core.draw_lines.call(null,state,forest,node,child_18337);
+
+var G__18338 = seq__18325_18333;
+var G__18339 = chunk__18326_18334;
+var G__18340 = count__18327_18335;
+var G__18341 = (i__18328_18336 + (1));
+seq__18325_18333 = G__18338;
+chunk__18326_18334 = G__18339;
+count__18327_18335 = G__18340;
+i__18328_18336 = G__18341;
+continue;
+} else {
+var temp__4657__auto___18342 = cljs.core.seq.call(null,seq__18325_18333);
+if(temp__4657__auto___18342){
+var seq__18325_18343__$1 = temp__4657__auto___18342;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__18325_18343__$1)){
+var c__7633__auto___18344 = cljs.core.chunk_first.call(null,seq__18325_18343__$1);
+var G__18345 = cljs.core.chunk_rest.call(null,seq__18325_18343__$1);
+var G__18346 = c__7633__auto___18344;
+var G__18347 = cljs.core.count.call(null,c__7633__auto___18344);
+var G__18348 = (0);
+seq__18325_18333 = G__18345;
+chunk__18326_18334 = G__18346;
+count__18327_18335 = G__18347;
+i__18328_18336 = G__18348;
+continue;
+} else {
+var child_18349 = cljs.core.first.call(null,seq__18325_18343__$1);
+viz.core.draw_lines.call(null,state,forest,node,child_18349);
+
+var G__18350 = cljs.core.next.call(null,seq__18325_18343__$1);
+var G__18351 = null;
+var G__18352 = (0);
+var G__18353 = (0);
+seq__18325_18333 = G__18350;
+chunk__18326_18334 = G__18351;
+count__18327_18335 = G__18352;
+i__18328_18336 = G__18353;
+continue;
+}
+} else {
+}
+}
+break;
+}
+} else {
+var in_line_child_18354 = cljs.core.some.call(null,((function (children){
+return (function (p1__18315_SHARP_){
+if(cljs.core.truth_(viz.core.in_line_QMARK_.call(null,parent,node,p1__18315_SHARP_))){
+return p1__18315_SHARP_;
+} else {
+return null;
+}
+});})(children))
+,children);
+var seq__18329_18355 = cljs.core.seq.call(null,children);
+var chunk__18330_18356 = null;
+var count__18331_18357 = (0);
+var i__18332_18358 = (0);
+while(true){
+if((i__18332_18358 < count__18331_18357)){
+var child_18359 = cljs.core._nth.call(null,chunk__18330_18356,i__18332_18358);
+if(cljs.core.truth_((function (){var and__6802__auto__ = in_line_child_18354;
+if(cljs.core.truth_(and__6802__auto__)){
+return cljs.core._EQ_.call(null,in_line_child_18354,child_18359);
+} else {
+return and__6802__auto__;
+}
+})())){
+viz.core.draw_lines.call(null,state,forest,parent,child_18359);
+} else {
+viz.core.draw_lines.call(null,state,forest,node,child_18359);
+}
+
+var G__18360 = seq__18329_18355;
+var G__18361 = chunk__18330_18356;
+var G__18362 = count__18331_18357;
+var G__18363 = (i__18332_18358 + (1));
+seq__18329_18355 = G__18360;
+chunk__18330_18356 = G__18361;
+count__18331_18357 = G__18362;
+i__18332_18358 = G__18363;
+continue;
+} else {
+var temp__4657__auto___18364 = cljs.core.seq.call(null,seq__18329_18355);
+if(temp__4657__auto___18364){
+var seq__18329_18365__$1 = temp__4657__auto___18364;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__18329_18365__$1)){
+var c__7633__auto___18366 = cljs.core.chunk_first.call(null,seq__18329_18365__$1);
+var G__18367 = cljs.core.chunk_rest.call(null,seq__18329_18365__$1);
+var G__18368 = c__7633__auto___18366;
+var G__18369 = cljs.core.count.call(null,c__7633__auto___18366);
+var G__18370 = (0);
+seq__18329_18355 = G__18367;
+chunk__18330_18356 = G__18368;
+count__18331_18357 = G__18369;
+i__18332_18358 = G__18370;
+continue;
+} else {
+var child_18371 = cljs.core.first.call(null,seq__18329_18365__$1);
+if(cljs.core.truth_((function (){var and__6802__auto__ = in_line_child_18354;
+if(cljs.core.truth_(and__6802__auto__)){
+return cljs.core._EQ_.call(null,in_line_child_18354,child_18371);
+} else {
+return and__6802__auto__;
+}
+})())){
+viz.core.draw_lines.call(null,state,forest,parent,child_18371);
+} else {
+viz.core.draw_lines.call(null,state,forest,node,child_18371);
+}
+
+var G__18372 = cljs.core.next.call(null,seq__18329_18365__$1);
+var G__18373 = null;
+var G__18374 = (0);
+var G__18375 = (0);
+seq__18329_18355 = G__18372;
+chunk__18330_18356 = G__18373;
+count__18331_18357 = G__18374;
+i__18332_18358 = G__18375;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+if(cljs.core.truth_(in_line_child_18354)){
+} else {
+cljs.core.apply.call(null,quil.core.line,cljs.core.apply.call(null,cljs.core.concat,cljs.core.map.call(null,((function (in_line_child_18354,children){
+return (function (p1__18316_SHARP_){
+return viz.core.scale.call(null,state,p1__18316_SHARP_);
+});})(in_line_child_18354,children))
+,cljs.core.map.call(null,new cljs.core.Keyword(null,"pos","pos",-864607220),(function (){var x__7656__auto__ = parent;
+return cljs.core._conj.call(null,(function (){var x__7656__auto____$1 = node;
+return cljs.core._conj.call(null,cljs.core.List.EMPTY,x__7656__auto____$1);
+})(),x__7656__auto__);
+})()))));
+}
+}
+
+if(cljs.core.empty_QMARK_.call(null,children)){
+return viz.core.draw_ellipse.call(null,state,new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(node),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [0.3,0.3], null));
+} else {
+return null;
+}
+});
+viz.core.draw_state = (function viz$core$draw_state(state){
+quil.core.background.call(null,(4294967295));
+
+var tr__8398__auto__ = new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(viz.core.window_size.call(null,(0)) / (2)),(viz.core.window_size.call(null,(1)) / (2))], null);
+quil.core.push_matrix.call(null);
+
+try{quil.core.translate.call(null,tr__8398__auto__);
+
+var lines = viz.forest.lines.call(null,cljs.core.get_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"ghost","ghost",-1531157576),new cljs.core.Keyword(null,"forest","forest",278860306)], null)));
+var leaves = viz.forest.leaves.call(null,cljs.core.get_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"ghost","ghost",-1531157576),new cljs.core.Keyword(null,"forest","forest",278860306)], null)));
+var active = viz.ghost.active_nodes.call(null,new cljs.core.Keyword(null,"ghost","ghost",-1531157576).cljs$core$IFn$_invoke$arity$1(state));
+var roots = viz.forest.roots.call(null,cljs.core.get_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"ghost","ghost",-1531157576),new cljs.core.Keyword(null,"forest","forest",278860306)], null)));
+quil.core.stroke.call(null,(4278190080));
+
+var seq__18384_18392 = cljs.core.seq.call(null,roots);
+var chunk__18385_18393 = null;
+var count__18386_18394 = (0);
+var i__18387_18395 = (0);
+while(true){
+if((i__18387_18395 < count__18386_18394)){
+var root_18396 = cljs.core._nth.call(null,chunk__18385_18393,i__18387_18395);
+viz.core.draw_lines.call(null,state,cljs.core.get_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"ghost","ghost",-1531157576),new cljs.core.Keyword(null,"forest","forest",278860306)], null)),null,root_18396);
+
+var G__18397 = seq__18384_18392;
+var G__18398 = chunk__18385_18393;
+var G__18399 = count__18386_18394;
+var G__18400 = (i__18387_18395 + (1));
+seq__18384_18392 = G__18397;
+chunk__18385_18393 = G__18398;
+count__18386_18394 = G__18399;
+i__18387_18395 = G__18400;
+continue;
+} else {
+var temp__4657__auto___18401 = cljs.core.seq.call(null,seq__18384_18392);
+if(temp__4657__auto___18401){
+var seq__18384_18402__$1 = temp__4657__auto___18401;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__18384_18402__$1)){
+var c__7633__auto___18403 = cljs.core.chunk_first.call(null,seq__18384_18402__$1);
+var G__18404 = cljs.core.chunk_rest.call(null,seq__18384_18402__$1);
+var G__18405 = c__7633__auto___18403;
+var G__18406 = cljs.core.count.call(null,c__7633__auto___18403);
+var G__18407 = (0);
+seq__18384_18392 = G__18404;
+chunk__18385_18393 = G__18405;
+count__18386_18394 = G__18406;
+i__18387_18395 = G__18407;
+continue;
+} else {
+var root_18408 = cljs.core.first.call(null,seq__18384_18402__$1);
+viz.core.draw_lines.call(null,state,cljs.core.get_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"ghost","ghost",-1531157576),new cljs.core.Keyword(null,"forest","forest",278860306)], null)),null,root_18408);
+
+var G__18409 = cljs.core.next.call(null,seq__18384_18402__$1);
+var G__18410 = null;
+var G__18411 = (0);
+var G__18412 = (0);
+seq__18384_18392 = G__18409;
+chunk__18385_18393 = G__18410;
+count__18386_18394 = G__18411;
+i__18387_18395 = G__18412;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+quil.core.stroke.call(null,(4278190080));
+
+quil.core.fill.call(null,(4278190080));
+
+var seq__18388 = cljs.core.seq.call(null,active);
+var chunk__18389 = null;
+var count__18390 = (0);
+var i__18391 = (0);
+while(true){
+if((i__18391 < count__18390)){
+var active_node = cljs.core._nth.call(null,chunk__18389,i__18391);
+var pos_18413 = new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(active_node);
+viz.core.draw_ellipse.call(null,state,pos_18413,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [0.35,0.35], null));
+
+var G__18414 = seq__18388;
+var G__18415 = chunk__18389;
+var G__18416 = count__18390;
+var G__18417 = (i__18391 + (1));
+seq__18388 = G__18414;
+chunk__18389 = G__18415;
+count__18390 = G__18416;
+i__18391 = G__18417;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq.call(null,seq__18388);
+if(temp__4657__auto__){
+var seq__18388__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__18388__$1)){
+var c__7633__auto__ = cljs.core.chunk_first.call(null,seq__18388__$1);
+var G__18418 = cljs.core.chunk_rest.call(null,seq__18388__$1);
+var G__18419 = c__7633__auto__;
+var G__18420 = cljs.core.count.call(null,c__7633__auto__);
+var G__18421 = (0);
+seq__18388 = G__18418;
+chunk__18389 = G__18419;
+count__18390 = G__18420;
+i__18391 = G__18421;
+continue;
+} else {
+var active_node = cljs.core.first.call(null,seq__18388__$1);
+var pos_18422 = new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(active_node);
+viz.core.draw_ellipse.call(null,state,pos_18422,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [0.35,0.35], null));
+
+var G__18423 = cljs.core.next.call(null,seq__18388__$1);
+var G__18424 = null;
+var G__18425 = (0);
+var G__18426 = (0);
+seq__18388 = G__18423;
+chunk__18389 = G__18424;
+count__18390 = G__18425;
+i__18391 = G__18426;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+}finally {quil.core.pop_matrix.call(null);
+}});
+viz.core.viz = (function viz$core$viz(){
+return quil.sketch.sketch.call(null,new cljs.core.Keyword(null,"host","host",-1558485167),"viz",new cljs.core.Keyword(null,"features","features",-1146962336),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"keep-on-top","keep-on-top",-970284267)], null),new cljs.core.Keyword(null,"update","update",1045576396),((cljs.core.fn_QMARK_.call(null,viz.core.update_state))?(function() {
+var G__18427__delegate = function (args){
+return cljs.core.apply.call(null,viz.core.update_state,args);
+};
+var G__18427 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__18428__i = 0, G__18428__a = new Array(arguments.length - 0);
+while (G__18428__i < G__18428__a.length) {G__18428__a[G__18428__i] = arguments[G__18428__i + 0]; ++G__18428__i;}
+ args = new cljs.core.IndexedSeq(G__18428__a,0);
+}
+return G__18427__delegate.call(this,args);};
+G__18427.cljs$lang$maxFixedArity = 0;
+G__18427.cljs$lang$applyTo = (function (arglist__18429){
+var args = cljs.core.seq(arglist__18429);
+return G__18427__delegate(args);
+});
+G__18427.cljs$core$IFn$_invoke$arity$variadic = G__18427__delegate;
+return G__18427;
+})()
+:viz.core.update_state),new cljs.core.Keyword(null,"size","size",1098693007),((cljs.core.fn_QMARK_.call(null,viz.core.window_size))?(function() {
+var G__18430__delegate = function (args){
+return cljs.core.apply.call(null,viz.core.window_size,args);
+};
+var G__18430 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__18431__i = 0, G__18431__a = new Array(arguments.length - 0);
+while (G__18431__i < G__18431__a.length) {G__18431__a[G__18431__i] = arguments[G__18431__i + 0]; ++G__18431__i;}
+ args = new cljs.core.IndexedSeq(G__18431__a,0);
+}
+return G__18430__delegate.call(this,args);};
+G__18430.cljs$lang$maxFixedArity = 0;
+G__18430.cljs$lang$applyTo = (function (arglist__18432){
+var args = cljs.core.seq(arglist__18432);
+return G__18430__delegate(args);
+});
+G__18430.cljs$core$IFn$_invoke$arity$variadic = G__18430__delegate;
+return G__18430;
+})()
+:viz.core.window_size),new cljs.core.Keyword(null,"title","title",636505583),"",new cljs.core.Keyword(null,"setup","setup",1987730512),((cljs.core.fn_QMARK_.call(null,viz.core.setup))?(function() {
+var G__18433__delegate = function (args){
+return cljs.core.apply.call(null,viz.core.setup,args);
+};
+var G__18433 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__18434__i = 0, G__18434__a = new Array(arguments.length - 0);
+while (G__18434__i < G__18434__a.length) {G__18434__a[G__18434__i] = arguments[G__18434__i + 0]; ++G__18434__i;}
+ args = new cljs.core.IndexedSeq(G__18434__a,0);
+}
+return G__18433__delegate.call(this,args);};
+G__18433.cljs$lang$maxFixedArity = 0;
+G__18433.cljs$lang$applyTo = (function (arglist__18435){
+var args = cljs.core.seq(arglist__18435);
+return G__18433__delegate(args);
+});
+G__18433.cljs$core$IFn$_invoke$arity$variadic = G__18433__delegate;
+return G__18433;
+})()
+:viz.core.setup),new cljs.core.Keyword(null,"middleware","middleware",1462115504),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [quil.middleware.fun_mode], null),new cljs.core.Keyword(null,"draw","draw",1358331674),((cljs.core.fn_QMARK_.call(null,viz.core.draw_state))?(function() {
+var G__18436__delegate = function (args){
+return cljs.core.apply.call(null,viz.core.draw_state,args);
+};
+var G__18436 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__18437__i = 0, G__18437__a = new Array(arguments.length - 0);
+while (G__18437__i < G__18437__a.length) {G__18437__a[G__18437__i] = arguments[G__18437__i + 0]; ++G__18437__i;}
+ args = new cljs.core.IndexedSeq(G__18437__a,0);
+}
+return G__18436__delegate.call(this,args);};
+G__18436.cljs$lang$maxFixedArity = 0;
+G__18436.cljs$lang$applyTo = (function (arglist__18438){
+var args = cljs.core.seq(arglist__18438);
+return G__18436__delegate(args);
+});
+G__18436.cljs$core$IFn$_invoke$arity$variadic = G__18436__delegate;
+return G__18436;
+})()
+:viz.core.draw_state));
+});
+goog.exportSymbol('viz.core.viz', viz.core.viz);
+
+if(cljs.core.truth_(cljs.core.some.call(null,(function (p1__8011__8012__auto__){
+return cljs.core._EQ_.call(null,new cljs.core.Keyword(null,"no-start","no-start",1381488856),p1__8011__8012__auto__);
+}),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"keep-on-top","keep-on-top",-970284267)], null)))){
+} else {
+quil.sketch.add_sketch_to_init_list.call(null,new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"fn","fn",-1175266204),viz.core.viz,new cljs.core.Keyword(null,"host-id","host-id",742376279),"viz"], null));
+}
+
+//# sourceMappingURL=core.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/core.js.map b/src/http/static/viz/1/viz/core.js.map
new file mode 100644
index 0000000..3f7a997
--- /dev/null
+++ b/src/http/static/viz/1/viz/core.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/viz\/core.js","sources":["core.cljs"],"lineCount":564,"mappings":";AAAA;;;;;;;;;AAWA,AAAA,iBAAA,yBAAAA,1CAAOM;AAAP,AAAA,IAAAL,qBAAA;AAAA,AAAA,IAAAC,0BAAA,AAAA;AAAA,AAAA,IAAAC,wBAAA;;AAAA,AAAA,GAAA,CAAAA,wBAAAD;AAAA,AAAA,AAAAD,wBAAA,CAAA,UAAAE;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAAC,uBAAA,EAAA,CAAA,MAAA,AAAAH,4BAAA,AAAA,KAAAI,qBAAA,AAAAJ,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAK,oDAAAF;;;AAAA,AAAA,AAAA,AAAAE,sDAAA,WAAgBG;AAAhB,AACE,OAAMC,YAAW,8BAAA,9BAACC,kCAAwB,AAACC,wBAAIC,cAAIJ;;;AADrD,AAAA,AAAAH,yCAAA;;AAAA,AAAA,AAAAA,mCAAA,WAAAC;AAAA,AAAA,OAAAD,oDAAA,AAAAE,wBAAAD;;;AAAA,AAKA,0BAAA,1BAAOO,4DAAgBC;AAAvB,AACE,oDAAA,5CAAK,oCAAA,nCAAG,UAAA,TAAMC,4BAA8BD;;AAE9C,uBAAA,vBAAKE,0GAAc,iBAAAC,kBAAA;IAAAC,kBAAU,kCAAA,lCAACL;AAAX,AAAA,SAAAI,kBAAAC,mBAAAD,kBAAAC;KACA,8DAAA,7DAAK,qDAAA,pDAAG,kCAAA,lCAACL;AAE5B,AAAKM,4BAAiB,AAACC,0BAAMC,iBAAO,wBAAA,WAAAC,nCAACX;AAAD,AAAa,QAAAW,mBAAA;GAAUN;AAE3D,qBAAA,rBAAOO;AAAP,AAAA,kDAAA,iEAAA,KAAA,6EAAA,KAAA,oEAAA,KAAA,wDAAA,IAAA,mEAAA,IAAA,gEAAA,KAAA,4FAOc,AAACC,8BAAgBC,lEACjB,sFAAA,mFAAA,IAAA,7KAACC;;AAIf,uBAAA,vBAAOC,sDAAaC;AAApB,AACS,QAAG,AAAA,sFAAQA,SAAO,AAAA,+FAAaA;;AAExC,qBAAA,rBAAOC,kDAAWD;AAAlB,AACE,IAAME,IAAE,wLAAA,vLAAK,CAAG,+BAAA,\/BAACd,sCACM,CAAG,AAAA,8FAAaY,SAAO,+BAAA,\/BAACZ;AAD\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\/BAACrH,2CACJ,uCAAA,tCAAG,+BAAA,\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","names":["var_args","args__7934__auto__","len__7927__auto__","i__7928__auto__","argseq__7935__auto__","cljs.core\/IndexedSeq","viz.core\/debug","seq18286","cljs.core\/seq","args","js\/console","clojure.string\/join","cljs.core\/map","cljs.core\/str","viz.core\/window-partial","k","js\/document","viz.core\/window-size","x__7157__auto__","y__7158__auto__","viz.core\/window-half-size","cljs.core\/apply","cljs.core\/vector","p1__18290#","viz.core\/new-state","viz.ghost\/new-ghost","viz.grid\/euclidean","viz.ghost\/new-active-node","viz.core\/curr-second","state","viz.core\/grid-size","h","viz.core\/positive","n","viz.core\/spawn-chance","period-seconds","period-frames","cljs.core\/rem","viz.core\/mk-poss-fn","pos","adj-poss","cljs.core\/take","cljs.core\/random-sample","viz.core\/setup","quil.core\/frame-rate","viz.core\/scale","xy","p1__18292#","p2__18291#","cljs.core\/map-indexed","viz.core\/in-bounds?","min-bound","max-bound","pos-k","p1__18293#","p2__18294#","cljs.core\/keep-indexed","mini","maxi","cljs.core\/=","cljs.core\/count","viz.core\/quil-bounds","buffer","vec__18299","cljs.core\/nth","w","p1__18295#","viz.core\/ghost-incr","cljs.core\/assoc","p1__18302#","viz.ghost\/filter-active-nodes","viz.ghost\/incr","vec__18306","minb","maxb","viz.core\/ghost-expire-roots","cljs.core\/update-in","viz.ghost\/remove-roots","viz.core\/maybe-exit","cljs.core\/empty?","cljs.core\/get-in","cljs.core\/dec","viz.core\/update-state","cljs.core\/inc","viz.core\/draw-ellipse","size","scaled-pos","scaled-size","cljs.core\/int","quil.core\/ellipse","cljs.core\/concat","viz.core\/in-line?","seq18310","nodes","p1__18309#","cljs.core\/-","cljs.core\/partition","viz.core\/draw-lines","forest","parent","node","quil.core\/stroke","quil.core\/fill","children","p1__18314#","viz.forest\/get-node","cljs.core\/not","seq__18325","chunk__18326","count__18327","i__18328","cljs.core\/-nth","temp__4657__auto__","cljs.core\/chunked-seq?","c__7633__auto__","cljs.core\/chunk-first","cljs.core\/chunk-rest","cljs.core\/first","cljs.core\/next","child","in-line-child","p1__18315#","cljs.core\/some","seq__18329","chunk__18330","count__18331","i__18332","and__6802__auto__","quil.core\/line","p1__18316#","x__7656__auto__","cljs.core\/-conj","viz.core\/draw-state","quil.core\/background","tr__8398__auto__","quil.core\/push-matrix","quil.core\/translate","quil.core\/pop-matrix","lines","viz.forest\/lines","leaves","viz.forest\/leaves","active","viz.ghost\/active-nodes","roots","viz.forest\/roots","seq__18384","chunk__18385","count__18386","i__18387","root","seq__18388","chunk__18389","count__18390","i__18391","active-node","quil.sketch\/sketch","cljs.core\/fn?","p1__8011__8012__auto__","quil.sketch\/add-sketch-to-init-list","viz.core\/viz","quil.middleware\/fun-mode","cljs.core\/List"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/forest.cljs b/src/http/static/viz/1/viz/forest.cljs
new file mode 100644
index 0000000..9810089
--- /dev/null
+++ b/src/http/static/viz/1/viz/forest.cljs
@@ -0,0 +1,96 @@
+(ns viz.forest)
+
+(defn new-forest []
+ {:nodes {}
+ :roots #{}
+ :leaves #{}
+ :next-id 0})
+
+(defn- new-id [forest]
+ (let [id (:next-id forest)]
+ [(assoc forest :next-id (inc id))
+ id]))
+
+(defn- unset-parent [forest id parent-id]
+ (-> forest
+ (update-in [:nodes id] dissoc :parent-id :parent-pos)
+ (update-in [:nodes parent-id :child-ids] disj id)
+ (update-in [:roots] conj id)
+ (update-in [:leaves] conj parent-id)
+ ))
+
+(defn- set-parent [forest id parent-id]
+ (let [parent-pos (get-in forest [:nodes parent-id :pos])
+ prev-parent-id (get-in forest [:nodes id :parent-id])
+ ]
+ (-> forest
+ (assoc-in [:nodes id :parent-id] parent-id)
+ (assoc-in [:nodes id :parent-pos] parent-pos)
+ (update-in [:nodes parent-id :child-ids] #(if %1 (conj %1 id) #{id}))
+ (update-in [:roots] disj id)
+ (update-in [:leaves] disj parent-id)
+ ;; If there was a previous parent of the child, unset that shit
+ (#(if prev-parent-id (unset-parent %1 id prev-parent-id) %1))
+ )))
+
+(defn add-node [forest pos]
+ (let [[forest id] (new-id forest)
+ forest (-> forest
+ (assoc-in [:nodes id] {:id id :pos pos})
+ (update-in [:roots] conj id)
+ (update-in [:leaves] conj id)
+ )
+ ]
+ [forest id]))
+
+(defn remove-node [forest id]
+ (let [child-ids (get-in forest [:nodes id :child-ids])
+ parent-id (get-in forest [:nodes id :parent-id])]
+ (-> forest
+ ;; unset this node's parent, if it has one
+ (#(if parent-id (unset-parent %1 id parent-id) %1))
+ ;; unset this node's children, if it has any
+ ((fn [forest] (reduce #(unset-parent %1 %2 id) forest child-ids)))
+ ;; remove from all top-level sets
+ (update-in [:nodes] dissoc id)
+ (update-in [:roots] disj id)
+ (update-in [:leaves] disj id)
+ )))
+
+(defn get-node [forest id]
+ (get-in forest [:nodes id]))
+
+(defn spawn-child [forest parent-id pos]
+ (let [[forest id] (add-node forest pos)
+ forest (-> forest
+ (set-parent id parent-id)
+ )
+ ]
+ [forest id]))
+
+(defn roots [forest] (-> forest :nodes (select-keys (:roots forest)) (vals)))
+(defn root? [node] (not (boolean (:parent-id node))))
+
+(defn leaves [forest] (-> forest :nodes (select-keys (:leaves forest)) (vals)))
+(defn leaf? [node] (empty? (:child-ids node)))
+
+(defn lines [forest]
+ (->> forest
+ (:nodes)
+ (vals)
+ (remove #(empty? (:parent-pos %)))
+ (map #(vector (:pos %) (:parent-pos %)))
+ ))
+
+(def my-forest
+ (let [forest (new-forest)
+ [forest id0] (add-node forest [0 0])
+ [forest id1] (spawn-child forest id0 [1 1])
+ [forest id2] (spawn-child forest id0 [-1 -1])
+ [forest id3] (spawn-child forest id1 [2 2])
+ forest (remove-node forest id1)
+ ]
+ forest))
+
+(identity my-forest)
+(lines my-forest)
diff --git a/src/http/static/viz/1/viz/forest.cljs.cache.edn b/src/http/static/viz/1/viz/forest.cljs.cache.edn
new file mode 100644
index 0000000..61b1a40
--- /dev/null
+++ b/src/http/static/viz/1/viz/forest.cljs.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :use-macros {}, :excludes #{}, :name viz.forest, :imports nil, :requires nil, :uses nil, :defs {get-node {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 60, :column 7, :end-line 60, :end-column 15, :arglists (quote ([forest id]))}, :name viz.forest/get-node, :variadic false, :file "src/viz/forest.cljs", :end-column 15, :method-params ([forest id]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 60, :end-line 60, :max-fixed-arity 2, :fn-var true, :arglists (quote ([forest id]))}, add-node {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 36, :column 7, :end-line 36, :end-column 15, :arglists (quote ([forest pos]))}, :name viz.forest/add-node, :variadic false, :file "src/viz/forest.cljs", :end-column 15, :method-params ([forest pos]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 36, :end-line 36, :max-fixed-arity 2, :fn-var true, :arglists (quote ([forest pos]))}, set-parent {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 22, :column 8, :end-line 22, :end-column 18, :private true, :arglists (quote ([forest id parent-id]))}, :private true, :name viz.forest/set-parent, :variadic false, :file "src/viz/forest.cljs", :end-column 18, :method-params ([forest id parent-id]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 22, :end-line 22, :max-fixed-arity 3, :fn-var true, :arglists (quote ([forest id parent-id]))}, new-id {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 9, :column 8, :end-line 9, :end-column 14, :private true, :arglists (quote ([forest]))}, :private true, :name viz.forest/new-id, :variadic false, :file "src/viz/forest.cljs", :end-column 14, :method-params ([forest]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 9, :end-line 9, :max-fixed-arity 1, :fn-var true, :arglists (quote ([forest]))}, root? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 72, :column 7, :end-line 72, :end-column 12, :arglists (quote ([node]))}, :name viz.forest/root?, :variadic false, :file "src/viz/forest.cljs", :end-column 12, :method-params ([node]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 72, :end-line 72, :max-fixed-arity 1, :fn-var true, :arglists (quote ([node]))}, my-forest {:name viz.forest/my-forest, :file "src/viz/forest.cljs", :line 85, :column 1, :end-line 85, :end-column 15, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 85, :column 6, :end-line 85, :end-column 15}, :tag any}, new-forest {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 3, :column 7, :end-line 3, :end-column 17, :arglists (quote ([]))}, :name viz.forest/new-forest, :variadic false, :file "src/viz/forest.cljs", :end-column 17, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 3, :end-line 3, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, remove-node {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 46, :column 7, :end-line 46, :end-column 18, :arglists (quote ([forest id]))}, :name viz.forest/remove-node, :variadic false, :file "src/viz/forest.cljs", :end-column 18, :method-params ([forest id]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 46, :end-line 46, :max-fixed-arity 2, :fn-var true, :arglists (quote ([forest id]))}, spawn-child {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 63, :column 7, :end-line 63, :end-column 18, :arglists (quote ([forest parent-id pos]))}, :name viz.forest/spawn-child, :variadic false, :file "src/viz/forest.cljs", :end-column 18, :method-params ([forest parent-id pos]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 63, :end-line 63, :max-fixed-arity 3, :fn-var true, :arglists (quote ([forest parent-id pos]))}, lines {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 77, :column 7, :end-line 77, :end-column 12, :arglists (quote ([forest]))}, :name viz.forest/lines, :variadic false, :file "src/viz/forest.cljs", :end-column 12, :method-params ([forest]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 77, :end-line 77, :max-fixed-arity 1, :fn-var true, :arglists (quote ([forest]))}, unset-parent {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 14, :column 8, :end-line 14, :end-column 20, :private true, :arglists (quote ([forest id parent-id]))}, :private true, :name viz.forest/unset-parent, :variadic false, :file "src/viz/forest.cljs", :end-column 20, :method-params ([forest id parent-id]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 14, :end-line 14, :max-fixed-arity 3, :fn-var true, :arglists (quote ([forest id parent-id]))}, roots {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 71, :column 7, :end-line 71, :end-column 12, :arglists (quote ([forest]))}, :name viz.forest/roots, :variadic false, :file "src/viz/forest.cljs", :end-column 12, :method-params ([forest]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 71, :end-line 71, :max-fixed-arity 1, :fn-var true, :arglists (quote ([forest]))}, leaves {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 74, :column 7, :end-line 74, :end-column 13, :arglists (quote ([forest]))}, :name viz.forest/leaves, :variadic false, :file "src/viz/forest.cljs", :end-column 13, :method-params ([forest]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 74, :end-line 74, :max-fixed-arity 1, :fn-var true, :arglists (quote ([forest]))}, leaf? {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/forest.cljs", :line 75, :column 7, :end-line 75, :end-column 12, :arglists (quote ([node]))}, :name viz.forest/leaf?, :variadic false, :file "src/viz/forest.cljs", :end-column 12, :method-params ([node]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 75, :end-line 75, :max-fixed-arity 1, :fn-var true, :arglists (quote ([node]))}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:next-id :parent-pos :pos :roots :leaves :nodes :id :parent-id :child-ids}, :order [:nodes :roots :leaves :next-id :parent-id :parent-pos :child-ids :pos :id]}, :doc nil} \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/forest.js b/src/http/static/viz/1/viz/forest.js
new file mode 100644
index 0000000..0eb043a
--- /dev/null
+++ b/src/http/static/viz/1/viz/forest.js
@@ -0,0 +1,111 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('viz.forest');
+goog.require('cljs.core');
+viz.forest.new_forest = (function viz$forest$new_forest(){
+return new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),cljs.core.PersistentArrayMap.EMPTY,new cljs.core.Keyword(null,"roots","roots",-1088919250),cljs.core.PersistentHashSet.EMPTY,new cljs.core.Keyword(null,"leaves","leaves",-2143630574),cljs.core.PersistentHashSet.EMPTY,new cljs.core.Keyword(null,"next-id","next-id",-224240762),(0)], null);
+});
+viz.forest.new_id = (function viz$forest$new_id(forest){
+var id = new cljs.core.Keyword(null,"next-id","next-id",-224240762).cljs$core$IFn$_invoke$arity$1(forest);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.assoc.call(null,forest,new cljs.core.Keyword(null,"next-id","next-id",-224240762),(id + (1))),id], null);
+});
+viz.forest.unset_parent = (function viz$forest$unset_parent(forest,id,parent_id){
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,forest,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id], null),cljs.core.dissoc,new cljs.core.Keyword(null,"parent-id","parent-id",-1400729131),new cljs.core.Keyword(null,"parent-pos","parent-pos",-282368566)),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),parent_id,new cljs.core.Keyword(null,"child-ids","child-ids",-604525861)], null),cljs.core.disj,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"roots","roots",-1088919250)], null),cljs.core.conj,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"leaves","leaves",-2143630574)], null),cljs.core.conj,parent_id);
+});
+viz.forest.set_parent = (function viz$forest$set_parent(forest,id,parent_id){
+var parent_pos = cljs.core.get_in.call(null,forest,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),parent_id,new cljs.core.Keyword(null,"pos","pos",-864607220)], null));
+var prev_parent_id = cljs.core.get_in.call(null,forest,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id,new cljs.core.Keyword(null,"parent-id","parent-id",-1400729131)], null));
+return ((function (parent_pos,prev_parent_id){
+return (function (p1__7982_SHARP_){
+if(cljs.core.truth_(prev_parent_id)){
+return viz.forest.unset_parent.call(null,p1__7982_SHARP_,id,prev_parent_id);
+} else {
+return p1__7982_SHARP_;
+}
+});})(parent_pos,prev_parent_id))
+.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.assoc_in.call(null,cljs.core.assoc_in.call(null,forest,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id,new cljs.core.Keyword(null,"parent-id","parent-id",-1400729131)], null),parent_id),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id,new cljs.core.Keyword(null,"parent-pos","parent-pos",-282368566)], null),parent_pos),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),parent_id,new cljs.core.Keyword(null,"child-ids","child-ids",-604525861)], null),((function (parent_pos,prev_parent_id){
+return (function (p1__7981_SHARP_){
+if(cljs.core.truth_(p1__7981_SHARP_)){
+return cljs.core.conj.call(null,p1__7981_SHARP_,id);
+} else {
+return cljs.core.PersistentHashSet.createAsIfByAssoc([id], true);
+}
+});})(parent_pos,prev_parent_id))
+),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"roots","roots",-1088919250)], null),cljs.core.disj,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"leaves","leaves",-2143630574)], null),cljs.core.disj,parent_id));
+});
+viz.forest.add_node = (function viz$forest$add_node(forest,pos){
+var vec__7986 = viz.forest.new_id.call(null,forest);
+var forest__$1 = cljs.core.nth.call(null,vec__7986,(0),null);
+var id = cljs.core.nth.call(null,vec__7986,(1),null);
+var forest__$2 = cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.assoc_in.call(null,forest__$1,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id], null),new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"id","id",-1388402092),id,new cljs.core.Keyword(null,"pos","pos",-864607220),pos], null)),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"roots","roots",-1088919250)], null),cljs.core.conj,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"leaves","leaves",-2143630574)], null),cljs.core.conj,id);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [forest__$2,id], null);
+});
+viz.forest.remove_node = (function viz$forest$remove_node(forest,id){
+var child_ids = cljs.core.get_in.call(null,forest,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id,new cljs.core.Keyword(null,"child-ids","child-ids",-604525861)], null));
+var parent_id = cljs.core.get_in.call(null,forest,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id,new cljs.core.Keyword(null,"parent-id","parent-id",-1400729131)], null));
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,((function (child_ids,parent_id){
+return (function (forest__$1){
+return cljs.core.reduce.call(null,((function (child_ids,parent_id){
+return (function (p1__7990_SHARP_,p2__7991_SHARP_){
+return viz.forest.unset_parent.call(null,p1__7990_SHARP_,p2__7991_SHARP_,id);
+});})(child_ids,parent_id))
+,forest__$1,child_ids);
+});})(child_ids,parent_id))
+.call(null,((function (child_ids,parent_id){
+return (function (p1__7989_SHARP_){
+if(cljs.core.truth_(parent_id)){
+return viz.forest.unset_parent.call(null,p1__7989_SHARP_,id,parent_id);
+} else {
+return p1__7989_SHARP_;
+}
+});})(child_ids,parent_id))
+.call(null,forest)),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805)], null),cljs.core.dissoc,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"roots","roots",-1088919250)], null),cljs.core.disj,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"leaves","leaves",-2143630574)], null),cljs.core.disj,id);
+});
+viz.forest.get_node = (function viz$forest$get_node(forest,id){
+return cljs.core.get_in.call(null,forest,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id], null));
+});
+viz.forest.spawn_child = (function viz$forest$spawn_child(forest,parent_id,pos){
+var vec__7995 = viz.forest.add_node.call(null,forest,pos);
+var forest__$1 = cljs.core.nth.call(null,vec__7995,(0),null);
+var id = cljs.core.nth.call(null,vec__7995,(1),null);
+var forest__$2 = viz.forest.set_parent.call(null,forest__$1,id,parent_id);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [forest__$2,id], null);
+});
+viz.forest.roots = (function viz$forest$roots(forest){
+return cljs.core.vals.call(null,cljs.core.select_keys.call(null,new cljs.core.Keyword(null,"nodes","nodes",-2099585805).cljs$core$IFn$_invoke$arity$1(forest),new cljs.core.Keyword(null,"roots","roots",-1088919250).cljs$core$IFn$_invoke$arity$1(forest)));
+});
+viz.forest.root_QMARK_ = (function viz$forest$root_QMARK_(node){
+return !(cljs.core.boolean$.call(null,new cljs.core.Keyword(null,"parent-id","parent-id",-1400729131).cljs$core$IFn$_invoke$arity$1(node)));
+});
+viz.forest.leaves = (function viz$forest$leaves(forest){
+return cljs.core.vals.call(null,cljs.core.select_keys.call(null,new cljs.core.Keyword(null,"nodes","nodes",-2099585805).cljs$core$IFn$_invoke$arity$1(forest),new cljs.core.Keyword(null,"leaves","leaves",-2143630574).cljs$core$IFn$_invoke$arity$1(forest)));
+});
+viz.forest.leaf_QMARK_ = (function viz$forest$leaf_QMARK_(node){
+return cljs.core.empty_QMARK_.call(null,new cljs.core.Keyword(null,"child-ids","child-ids",-604525861).cljs$core$IFn$_invoke$arity$1(node));
+});
+viz.forest.lines = (function viz$forest$lines(forest){
+return cljs.core.map.call(null,(function (p1__7999_SHARP_){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(p1__7999_SHARP_),new cljs.core.Keyword(null,"parent-pos","parent-pos",-282368566).cljs$core$IFn$_invoke$arity$1(p1__7999_SHARP_)],null));
+}),cljs.core.remove.call(null,(function (p1__7998_SHARP_){
+return cljs.core.empty_QMARK_.call(null,new cljs.core.Keyword(null,"parent-pos","parent-pos",-282368566).cljs$core$IFn$_invoke$arity$1(p1__7998_SHARP_));
+}),cljs.core.vals.call(null,new cljs.core.Keyword(null,"nodes","nodes",-2099585805).cljs$core$IFn$_invoke$arity$1(forest))));
+});
+viz.forest.my_forest = (function (){var forest = viz.forest.new_forest.call(null);
+var vec__8000 = viz.forest.add_node.call(null,forest,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(0)], null));
+var forest__$1 = cljs.core.nth.call(null,vec__8000,(0),null);
+var id0 = cljs.core.nth.call(null,vec__8000,(1),null);
+var vec__8003 = viz.forest.spawn_child.call(null,forest__$1,id0,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(1),(1)], null));
+var forest__$2 = cljs.core.nth.call(null,vec__8003,(0),null);
+var id1 = cljs.core.nth.call(null,vec__8003,(1),null);
+var vec__8006 = viz.forest.spawn_child.call(null,forest__$2,id0,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(-1),(-1)], null));
+var forest__$3 = cljs.core.nth.call(null,vec__8006,(0),null);
+var id2 = cljs.core.nth.call(null,vec__8006,(1),null);
+var vec__8009 = viz.forest.spawn_child.call(null,forest__$3,id1,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(2),(2)], null));
+var forest__$4 = cljs.core.nth.call(null,vec__8009,(0),null);
+var id3 = cljs.core.nth.call(null,vec__8009,(1),null);
+var forest__$5 = viz.forest.remove_node.call(null,forest__$4,id1);
+return forest__$5;
+})();
+cljs.core.identity.call(null,viz.forest.my_forest);
+viz.forest.lines.call(null,viz.forest.my_forest);
+
+//# sourceMappingURL=forest.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/forest.js.map b/src/http/static/viz/1/viz/forest.js.map
new file mode 100644
index 0000000..e531b5e
--- /dev/null
+++ b/src/http/static/viz/1/viz/forest.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/viz\/forest.js","sources":["forest.cljs"],"lineCount":111,"mappings":";AAAA;;AAEA,wBAAA,xBAAMA;AAAN,AAAA,kDAAA,wDAAA,mCAAA,wDAAA,kCAAA,0DAAA,kCAAA,2DAAA;;AAMA,oBAAA,pBAAOC,gDAAQC;AAAf,AACE,IAAMC,KAAG,AAAA,yFAAUD;AAAnB,AAAA,0FACG,iCAAA,jCAACE,0BAAMF,kEAAgB,MAAA,LAAKC,WAC5BA;;AAEL,0BAAA,1BAAOE,4DAAcH,OAAOC,GAAGG;AAA\/B,+HACMJ,9BACA,qCAAA,mFAAA,oFAAA,gEAAA,5QAACK,gLAAkBJ,WAAIK,zNACvB,4WAAA,mFAAA,kEAAA,jgBAACD,ufAAkBD,iFAAsBG,eAAKN,rnBAC9C,ynBAAA,mFAAA,5sBAACI,4wBAAmBG,eAAKP,h0BACzB,o0BAAA,mFAAA,h5BAACI,k9BAAoBG,eAAKJ;;AAGhC,wBAAA,xBAAOK,wDAAYT,OAAOC,GAAGG;AAA7B,AACE,IAAMM,aAAW,kCAAA,mFAAA,kEAAA,vLAACC,2BAAOX,kJAAeI;IAClCQ,iBAAe,kCAAA,mFAAA,2DAAA,hLAACD,2BAAOX,kJAAeC;AAD5C,AAUM,OAAA;kBAAAc;AAAA,AAAE,oBAAIH;AAAe,yCAAAG,lCAACZ,kDAAgBF,GAAGW;;AAAvCG;;;+JAPFf,7BACA,oCAAA,mFAAA,2DAAA,lLAACa,+KAAiBZ,2EAAeG,vRACjC,kSAAA,mFAAA,2DAAA,hbAACS,6aAAiBZ,4EAAgBS,vhBAClC,miBAAA,mFAAA,kEAAA,uEAAA,\/vBAACL,8qBAAkBD,5sBACnB,AAACC,9BACD,AAACA;kBAFDS;AAAA,AAA0C,oBAAAA;AAAO,gCAAAA,zBAACN,yCAAQP;;AAAhB,sDAAsBA;;;EAChE,mFAAA,gEAAoBM,eAAKN,IACzB,mFAAA,kEAAqBM,eAAKH;;AAKlC,sBAAA,tBAAMY,oDAAUhB,OAAOiB;AAAvB,AACE,IAAAC,YAAkB,AAACnB,4BAAOC;iBAA1B,AAAAmB,wBAAAD,UAAA,IAAA,nDAAOlB;SAAP,AAAAmB,wBAAAD,UAAA,IAAA,3CAAcjB;IACRD,sGAAWA,7BACA,wCAAA,mFAAA,mEAAA,2CAAA,qDAAA,9RAACa,mLAAiBZ,wGAASA,sDAAQgB,\/WACnC,4XAAA,mFAAA,\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","names":["viz.forest\/new-forest","viz.forest\/new-id","forest","id","cljs.core\/assoc","viz.forest\/unset-parent","parent-id","cljs.core\/update-in","cljs.core\/dissoc","cljs.core\/disj","cljs.core\/conj","viz.forest\/set-parent","parent-pos","cljs.core\/get-in","prev-parent-id","cljs.core\/assoc-in","p1__7981#","p1__7982#","viz.forest\/add-node","pos","vec__7986","cljs.core\/nth","viz.forest\/remove-node","child-ids","p1__7989#","p1__7990#","p2__7991#","cljs.core\/reduce","viz.forest\/get-node","viz.forest\/spawn-child","vec__7995","viz.forest\/roots","cljs.core\/select-keys","cljs.core\/vals","viz.forest\/root?","node","cljs.core\/boolean","viz.forest\/leaves","viz.forest\/leaf?","cljs.core\/empty?","viz.forest\/lines","p1__7998#","cljs.core\/remove","p1__7999#","cljs.core\/map","cljs.core\/PersistentVector","viz.forest\/my-forest","vec__8000","vec__8003","vec__8006","vec__8009","id0","id1","id2","id3","cljs.core\/identity"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/ghost.cljs b/src/http/static/viz/1/viz/ghost.cljs
new file mode 100644
index 0000000..ca6f86c
--- /dev/null
+++ b/src/http/static/viz/1/viz/ghost.cljs
@@ -0,0 +1,72 @@
+(ns viz.ghost
+ (:require [viz.forest :as forest]
+ [viz.grid :as grid]
+ clojure.set))
+
+(defn new-ghost [grid-def]
+ { :grid (grid/new-grid grid-def)
+ :forest (forest/new-forest)
+ :active-node-ids #{}
+ })
+
+(defn new-active-node [ghost pos]
+ (let [[forest id] (forest/add-node (:forest ghost) pos)
+ grid (grid/add-point (:grid ghost) pos)]
+ (-> ghost
+ (assoc :grid grid :forest forest)
+ (update-in [:active-node-ids] conj id))))
+
+(defn- gen-new-poss [ghost poss-fn id]
+ "generates new positions branching from the given node"
+ (let [pos (:pos (forest/get-node (:forest ghost) id))
+ adj-poss (grid/empty-adjacent-points (:grid ghost) pos)]
+ (poss-fn pos adj-poss)))
+
+(defn- spawn-children [ghost poss-fn id]
+ (reduce (fn [[ghost new-ids] pos]
+ (let [[forest new-id] (forest/spawn-child (:forest ghost) id pos)
+ grid (grid/add-point (:grid ghost) pos)]
+ [(assoc ghost :forest forest :grid grid) (conj new-ids new-id)]))
+ [ghost #{}]
+ (gen-new-poss ghost poss-fn id)))
+
+(defn- spawn-children-multi [ghost poss-fn ids]
+ (reduce (fn [[ghost new-ids] id]
+ (let [[ghost this-new-ids] (spawn-children ghost poss-fn id)]
+ [ghost (clojure.set/union new-ids this-new-ids)]))
+ [ghost #{}]
+ ids))
+
+(defn incr [ghost poss-fn]
+ (let [[ghost new-ids] (spawn-children-multi ghost poss-fn (:active-node-ids ghost))]
+ (assoc ghost :active-node-ids new-ids)))
+
+(defn active-nodes [ghost]
+ (map #(get-in ghost [:forest :nodes %]) (:active-node-ids ghost)))
+
+(defn filter-active-nodes [ghost pred]
+ (assoc ghost :active-node-ids
+ (reduce #(if (pred %2) (conj %1 (:id %2)) %1) #{}
+ (active-nodes ghost))))
+
+(defn remove-roots [ghost]
+ (let [roots (forest/roots (:forest ghost))
+ root-ids (map :id roots)
+ root-poss (map :pos roots)
+ ]
+ (-> ghost
+ (update-in [:active-node-ids] #(reduce disj %1 root-ids))
+ (update-in [:forest] #(reduce forest/remove-node %1 root-ids))
+ (update-in [:grid] #(reduce grid/rm-point %1 root-poss))
+ )))
+
+(defn- eg-poss-fn [pos adj-poss]
+ (take 2 (random-sample 0.6 adj-poss)))
+
+(-> (new-ghost grid/euclidean)
+ (new-active-node [0 0])
+ (incr eg-poss-fn)
+ (incr eg-poss-fn)
+ (incr eg-poss-fn)
+ (remove-roots)
+ )
diff --git a/src/http/static/viz/1/viz/ghost.cljs.cache.edn b/src/http/static/viz/1/viz/ghost.cljs.cache.edn
new file mode 100644
index 0000000..5762f9a
--- /dev/null
+++ b/src/http/static/viz/1/viz/ghost.cljs.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :use-macros {}, :excludes #{}, :name viz.ghost, :imports nil, :requires {forest viz.forest, viz.forest viz.forest, grid viz.grid, viz.grid viz.grid, clojure.set clojure.set}, :uses nil, :defs {active-nodes {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :line 44, :column 7, :end-line 44, :end-column 19, :arglists (quote ([ghost]))}, :name viz.ghost/active-nodes, :variadic false, :file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :end-column 19, :method-params ([ghost]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 44, :end-line 44, :max-fixed-arity 1, :fn-var true, :arglists (quote ([ghost]))}, filter-active-nodes {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :line 47, :column 7, :end-line 47, :end-column 26, :arglists (quote ([ghost pred]))}, :name viz.ghost/filter-active-nodes, :variadic false, :file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :end-column 26, :method-params ([ghost pred]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 47, :end-line 47, :max-fixed-arity 2, :fn-var true, :arglists (quote ([ghost pred]))}, spawn-children {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :line 25, :column 8, :end-line 25, :end-column 22, :private true, :arglists (quote ([ghost poss-fn id]))}, :private true, :name viz.ghost/spawn-children, :variadic false, :file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :end-column 22, :method-params ([ghost poss-fn id]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 25, :end-line 25, :max-fixed-arity 3, :fn-var true, :arglists (quote ([ghost poss-fn id]))}, spawn-children-multi {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :line 33, :column 8, :end-line 33, :end-column 28, :private true, :arglists (quote ([ghost poss-fn ids]))}, :private true, :name viz.ghost/spawn-children-multi, :variadic false, :file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :end-column 28, :method-params ([ghost poss-fn ids]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 33, :end-line 33, :max-fixed-arity 3, :fn-var true, :arglists (quote ([ghost poss-fn ids]))}, incr {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :line 40, :column 7, :end-line 40, :end-column 11, :arglists (quote ([ghost poss-fn]))}, :name viz.ghost/incr, :variadic false, :file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :end-column 11, :method-params ([ghost poss-fn]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 40, :end-line 40, :max-fixed-arity 2, :fn-var true, :arglists (quote ([ghost poss-fn]))}, eg-poss-fn {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :line 63, :column 8, :end-line 63, :end-column 18, :private true, :arglists (quote ([pos adj-poss]))}, :private true, :name viz.ghost/eg-poss-fn, :variadic false, :file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :end-column 18, :method-params ([pos adj-poss]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 63, :end-line 63, :max-fixed-arity 2, :fn-var true, :arglists (quote ([pos adj-poss]))}, gen-new-poss {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :line 19, :column 8, :end-line 19, :end-column 20, :private true, :arglists (quote ([ghost poss-fn id]))}, :private true, :name viz.ghost/gen-new-poss, :variadic false, :file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :end-column 20, :method-params ([ghost poss-fn id]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 19, :end-line 19, :max-fixed-arity 3, :fn-var true, :arglists (quote ([ghost poss-fn id]))}, new-ghost {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :line 6, :column 7, :end-line 6, :end-column 16, :arglists (quote ([grid-def]))}, :name viz.ghost/new-ghost, :variadic false, :file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :end-column 16, :method-params ([grid-def]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 6, :end-line 6, :max-fixed-arity 1, :fn-var true, :arglists (quote ([grid-def]))}, remove-roots {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :line 52, :column 7, :end-line 52, :end-column 19, :arglists (quote ([ghost]))}, :name viz.ghost/remove-roots, :variadic false, :file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :end-column 19, :method-params ([ghost]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 52, :end-line 52, :max-fixed-arity 1, :fn-var true, :arglists (quote ([ghost]))}, new-active-node {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :line 12, :column 7, :end-line 12, :end-column 22, :arglists (quote ([ghost pos]))}, :name viz.ghost/new-active-node, :variadic false, :file "/home/mediocregopher/src/viz/src/viz/ghost.cljs", :end-column 22, :method-params ([ghost pos]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 12, :end-line 12, :max-fixed-arity 2, :fn-var true, :arglists (quote ([ghost pos]))}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:active-node-ids :grid :pos :forest :nodes :id}, :order [:grid :forest :active-node-ids :pos :nodes :id]}, :doc nil} \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/ghost.js b/src/http/static/viz/1/viz/ghost.js
new file mode 100644
index 0000000..50b8157
--- /dev/null
+++ b/src/http/static/viz/1/viz/ghost.js
@@ -0,0 +1,89 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('viz.ghost');
+goog.require('cljs.core');
+goog.require('viz.forest');
+goog.require('viz.grid');
+goog.require('clojure.set');
+viz.ghost.new_ghost = (function viz$ghost$new_ghost(grid_def){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"grid","grid",402978600),viz.grid.new_grid.call(null,grid_def),new cljs.core.Keyword(null,"forest","forest",278860306),viz.forest.new_forest.call(null),new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751),cljs.core.PersistentHashSet.EMPTY], null);
+});
+viz.ghost.new_active_node = (function viz$ghost$new_active_node(ghost,pos){
+var vec__8057 = viz.forest.add_node.call(null,new cljs.core.Keyword(null,"forest","forest",278860306).cljs$core$IFn$_invoke$arity$1(ghost),pos);
+var forest = cljs.core.nth.call(null,vec__8057,(0),null);
+var id = cljs.core.nth.call(null,vec__8057,(1),null);
+var grid = viz.grid.add_point.call(null,new cljs.core.Keyword(null,"grid","grid",402978600).cljs$core$IFn$_invoke$arity$1(ghost),pos);
+return cljs.core.update_in.call(null,cljs.core.assoc.call(null,ghost,new cljs.core.Keyword(null,"grid","grid",402978600),grid,new cljs.core.Keyword(null,"forest","forest",278860306),forest),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751)], null),cljs.core.conj,id);
+});
+viz.ghost.gen_new_poss = (function viz$ghost$gen_new_poss(ghost,poss_fn,id){
+
+var pos = new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(viz.forest.get_node.call(null,new cljs.core.Keyword(null,"forest","forest",278860306).cljs$core$IFn$_invoke$arity$1(ghost),id));
+var adj_poss = viz.grid.empty_adjacent_points.call(null,new cljs.core.Keyword(null,"grid","grid",402978600).cljs$core$IFn$_invoke$arity$1(ghost),pos);
+return poss_fn.call(null,pos,adj_poss);
+});
+viz.ghost.spawn_children = (function viz$ghost$spawn_children(ghost,poss_fn,id){
+return cljs.core.reduce.call(null,(function (p__8067,pos){
+var vec__8068 = p__8067;
+var ghost__$1 = cljs.core.nth.call(null,vec__8068,(0),null);
+var new_ids = cljs.core.nth.call(null,vec__8068,(1),null);
+var vec__8071 = viz.forest.spawn_child.call(null,new cljs.core.Keyword(null,"forest","forest",278860306).cljs$core$IFn$_invoke$arity$1(ghost__$1),id,pos);
+var forest = cljs.core.nth.call(null,vec__8071,(0),null);
+var new_id = cljs.core.nth.call(null,vec__8071,(1),null);
+var grid = viz.grid.add_point.call(null,new cljs.core.Keyword(null,"grid","grid",402978600).cljs$core$IFn$_invoke$arity$1(ghost__$1),pos);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.assoc.call(null,ghost__$1,new cljs.core.Keyword(null,"forest","forest",278860306),forest,new cljs.core.Keyword(null,"grid","grid",402978600),grid),cljs.core.conj.call(null,new_ids,new_id)], null);
+}),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [ghost,cljs.core.PersistentHashSet.EMPTY], null),viz.ghost.gen_new_poss.call(null,ghost,poss_fn,id));
+});
+viz.ghost.spawn_children_multi = (function viz$ghost$spawn_children_multi(ghost,poss_fn,ids){
+return cljs.core.reduce.call(null,(function (p__8081,id){
+var vec__8082 = p__8081;
+var ghost__$1 = cljs.core.nth.call(null,vec__8082,(0),null);
+var new_ids = cljs.core.nth.call(null,vec__8082,(1),null);
+var vec__8085 = viz.ghost.spawn_children.call(null,ghost__$1,poss_fn,id);
+var ghost__$2 = cljs.core.nth.call(null,vec__8085,(0),null);
+var this_new_ids = cljs.core.nth.call(null,vec__8085,(1),null);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [ghost__$2,clojure.set.union.call(null,new_ids,this_new_ids)], null);
+}),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [ghost,cljs.core.PersistentHashSet.EMPTY], null),ids);
+});
+viz.ghost.incr = (function viz$ghost$incr(ghost,poss_fn){
+var vec__8091 = viz.ghost.spawn_children_multi.call(null,ghost,poss_fn,new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751).cljs$core$IFn$_invoke$arity$1(ghost));
+var ghost__$1 = cljs.core.nth.call(null,vec__8091,(0),null);
+var new_ids = cljs.core.nth.call(null,vec__8091,(1),null);
+return cljs.core.assoc.call(null,ghost__$1,new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751),new_ids);
+});
+viz.ghost.active_nodes = (function viz$ghost$active_nodes(ghost){
+return cljs.core.map.call(null,(function (p1__8094_SHARP_){
+return cljs.core.get_in.call(null,ghost,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"forest","forest",278860306),new cljs.core.Keyword(null,"nodes","nodes",-2099585805),p1__8094_SHARP_], null));
+}),new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751).cljs$core$IFn$_invoke$arity$1(ghost));
+});
+viz.ghost.filter_active_nodes = (function viz$ghost$filter_active_nodes(ghost,pred){
+return cljs.core.assoc.call(null,ghost,new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751),cljs.core.reduce.call(null,(function (p1__8096_SHARP_,p2__8095_SHARP_){
+if(cljs.core.truth_(pred.call(null,p2__8095_SHARP_))){
+return cljs.core.conj.call(null,p1__8096_SHARP_,new cljs.core.Keyword(null,"id","id",-1388402092).cljs$core$IFn$_invoke$arity$1(p2__8095_SHARP_));
+} else {
+return p1__8096_SHARP_;
+}
+}),cljs.core.PersistentHashSet.EMPTY,viz.ghost.active_nodes.call(null,ghost)));
+});
+viz.ghost.remove_roots = (function viz$ghost$remove_roots(ghost){
+var roots = viz.forest.roots.call(null,new cljs.core.Keyword(null,"forest","forest",278860306).cljs$core$IFn$_invoke$arity$1(ghost));
+var root_ids = cljs.core.map.call(null,new cljs.core.Keyword(null,"id","id",-1388402092),roots);
+var root_poss = cljs.core.map.call(null,new cljs.core.Keyword(null,"pos","pos",-864607220),roots);
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,ghost,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751)], null),((function (roots,root_ids,root_poss){
+return (function (p1__8097_SHARP_){
+return cljs.core.reduce.call(null,cljs.core.disj,p1__8097_SHARP_,root_ids);
+});})(roots,root_ids,root_poss))
+),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"forest","forest",278860306)], null),((function (roots,root_ids,root_poss){
+return (function (p1__8098_SHARP_){
+return cljs.core.reduce.call(null,viz.forest.remove_node,p1__8098_SHARP_,root_ids);
+});})(roots,root_ids,root_poss))
+),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"grid","grid",402978600)], null),((function (roots,root_ids,root_poss){
+return (function (p1__8099_SHARP_){
+return cljs.core.reduce.call(null,viz.grid.rm_point,p1__8099_SHARP_,root_poss);
+});})(roots,root_ids,root_poss))
+);
+});
+viz.ghost.eg_poss_fn = (function viz$ghost$eg_poss_fn(pos,adj_poss){
+return cljs.core.take.call(null,(2),cljs.core.random_sample.call(null,0.6,adj_poss));
+});
+viz.ghost.remove_roots.call(null,viz.ghost.incr.call(null,viz.ghost.incr.call(null,viz.ghost.incr.call(null,viz.ghost.new_active_node.call(null,viz.ghost.new_ghost.call(null,viz.grid.euclidean),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(0)], null)),viz.ghost.eg_poss_fn),viz.ghost.eg_poss_fn),viz.ghost.eg_poss_fn));
+
+//# sourceMappingURL=ghost.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/ghost.js.map b/src/http/static/viz/1/viz/ghost.js.map
new file mode 100644
index 0000000..fa62e77
--- /dev/null
+++ b/src/http/static/viz/1/viz/ghost.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/viz\/ghost.js","sources":["ghost.cljs"],"lineCount":89,"mappings":";AAAA;;;;;AAKA,sBAAA,tBAAMA,oDAAWC;AAAjB,AAAA,kDAAA,0FAAA,yFAAA,2EAAA,1MACU,AAACC,4BAAcD,kEACd,AAACE;;AAIZ,4BAAA,5BAAMC,gEAAiBC,MAAMC;AAA7B,AACE,IAAAC,YAAkB,AAACI,8BAAgB,AAAA,sFAASN,OAAOC;aAAnD,AAAAE,wBAAAD,UAAA,IAAA,\/CAAOE;SAAP,AAAAD,wBAAAD,UAAA,IAAA,3CAAcG;IACRE,OAAK,AAACC,6BAAe,AAAA,kFAAOR,OAAOC;AADzC,+DAEMD,1BACA,gCAAA,yDAAA,zFAACS,oFAAYF,6DAAaH,tLAC1B,8LAAA,mFAAA,1QAACM,6VAA6BC,eAAKN;;AAE3C,yBAAA,zBAAOO,0DAAcZ,MAAMa,QAAQR;AAAnC,AAAA;AAEE,IAAMJ,MAAI,AAAA,iFAAM,AAACa,8BAAgB,AAAA,sFAASd,OAAOK;IAC3CU,WAAS,AAACC,yCAA2B,AAAA,kFAAOhB,OAAOC;AADzD,AAEE,OAACY,kBAAQZ,IAAIc;;AAEjB,2BAAA,3BAAOE,8DAAgBjB,MAAMa,QAAQR;AAArC,AACE,OAACa,2BAAO,WAAAC,QAAqBlB;AAArB,AAAA,IAAAmB,YAAAD;gBAAA,AAAAhB,wBAAAiB,UAAA,IAAA,lDAAMpB;cAAN,AAAAG,wBAAAiB,UAAA,IAAA,hDAAYC;AAAZ,AACE,IAAAC,YAAsB,AAACE,iCAAmB,AAAA,sFAASxB,WAAOK,GAAGJ;aAA7D,AAAAE,wBAAAmB,UAAA,IAAA,\/CAAOlB;aAAP,AAAAD,wBAAAmB,UAAA,IAAA,\/CAAcC;IACRhB,OAAK,AAACC,6BAAe,AAAA,kFAAOR,WAAOC;AADzC,AAAA,0FAEG,oCAAA,+DAAA,nGAACQ,0BAAMT,kEAAcI,2DAAaG,MAAM,AAACI,yBAAKU,QAAQE;GAHnE,yFAAA,NAISvB,gDACD,AAACY,iCAAaZ,MAAMa,QAAQR;;AAEtC,iCAAA,jCAAOoB,0EAAsBzB,MAAMa,QAAQa;AAA3C,AACE,OAACR,2BAAO,WAAAS,QAAqBtB;AAArB,AAAA,IAAAuB,YAAAD;gBAAA,AAAAxB,wBAAAyB,UAAA,IAAA,lDAAM5B;cAAN,AAAAG,wBAAAyB,UAAA,IAAA,hDAAYP;AAAZ,AACE,IAAAQ,YAA2B,AAACZ,mCAAejB,UAAMa,QAAQR;gBAAzD,AAAAF,wBAAA0B,UAAA,IAAA,lDAAO7B;mBAAP,AAAAG,wBAAA0B,UAAA,IAAA,rDAAaC;AAAb,AAAA,0FACG9B,UAAM,AAAC+B,4BAAkBV,QAAQS;GAF9C,yFAAA,NAGS9B,gDACD0B;;AAEV,iBAAA,jBAAMM,0CAAMhC,MAAMa;AAAlB,AACE,IAAAoB,YAAsB,AAACR,yCAAqBzB,MAAMa,QAAQ,AAAA,yGAAkBb;gBAA5E,AAAAG,wBAAA8B,UAAA,IAAA,lDAAOjC;cAAP,AAAAG,wBAAA8B,UAAA,IAAA,hDAAaZ;AAAb,AACE,2CAAA,pCAACZ,0BAAMT,qFAAuBqB;;AAElC,yBAAA,zBAAMa,0DAAclC;AAApB,AACE,+BAAA,WAAAmC,nCAACC;AAAD,AAAM,wCAAA,mFAAA,wDAAA,wDAAAD,pOAACE,2BAAOrC;GAA0B,AAAA,yGAAkBA;;AAE5D,gCAAA,hCAAMsC,wEAAqBtC,MAAMuC;AAAjC,AACE,uCAAA,hCAAC9B,0BAAMT,iFACA,2BAAA,WAAAwC,gBAAAC,tDAACvB;AAAD,AAAS,oBAAI,eAAAuB,fAACF;AAAS,gCAAAC,zBAAC7B,yCAAQ,AAAA,gFAAA8B;;AAAvBD;;GAAT,kCACQ,AAACN,iCAAalC;;AAE\/B,yBAAA,zBAAM0C,0DAAc1C;AAApB,AACE,IAAM2C,QAAM,AAACC,2BAAa,AAAA,sFAAS5C;IAC7B6C,WAAS,wBAAA,xBAACT,0EAAQO;IAClBG,YAAU,wBAAA,xBAACV,2EAASO;AAF1B,iGAIM3C,9BACA,oCAAA,mFAAA,mFAAA,1MAACU,9BACD,AAACA,rCACD,OAACA;kBAFDqC;AAAA,AAA+B,iDAAAA,1CAAC7B,2BAAO8B,+BAAQH;;EAC\/C,mFAAA,gEAAA;kBAAAI;AAAA,AAAsB,yDAAAA,lDAAC\/B,2BAAOgC,uCAAsBL;;EACpD,mFAAA,4DAAA;kBAAAM;AAAA,AAAoB,oDAAAA,7CAACjC,2BAAOkC,kCAAiBN;;;;AAGrD,uBAAA,vBAAOO,sDAAYpD,IAAIc;AAAvB,AACE,gCAAA,zBAACuC,6BAAO,kCAAA,lCAACC,sCAAkBxC;;gJAEzB,AAACpB,8BAAU6D,lEACX,sFAAA,mFAAA,IAAA,7KAACzD,zBACD,AAACiC,mNAAKqB,5OACN,AAACrB,kQAAKqB,3RACN,AAACrB,iTAAKqB,lVACN,AAACX","names":["viz.ghost\/new-ghost","grid-def","viz.grid\/new-grid","viz.forest\/new-forest","viz.ghost\/new-active-node","ghost","pos","vec__8057","cljs.core\/nth","forest","id","viz.forest\/add-node","grid","viz.grid\/add-point","cljs.core\/assoc","cljs.core\/update-in","cljs.core\/conj","viz.ghost\/gen-new-poss","poss-fn","viz.forest\/get-node","adj-poss","viz.grid\/empty-adjacent-points","viz.ghost\/spawn-children","cljs.core\/reduce","p__8067","vec__8068","new-ids","vec__8071","new-id","viz.forest\/spawn-child","viz.ghost\/spawn-children-multi","ids","p__8081","vec__8082","vec__8085","this-new-ids","clojure.set\/union","viz.ghost\/incr","vec__8091","viz.ghost\/active-nodes","p1__8094#","cljs.core\/map","cljs.core\/get-in","viz.ghost\/filter-active-nodes","pred","p1__8096#","p2__8095#","viz.ghost\/remove-roots","roots","viz.forest\/roots","root-ids","root-poss","p1__8097#","cljs.core\/disj","p1__8098#","viz.forest\/remove-node","p1__8099#","viz.grid\/rm-point","viz.ghost\/eg-poss-fn","cljs.core\/take","cljs.core\/random-sample","viz.grid\/euclidean"]} \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/grid.cljs b/src/http/static/viz/1/viz/grid.cljs
new file mode 100644
index 0000000..6e31443
--- /dev/null
+++ b/src/http/static/viz/1/viz/grid.cljs
@@ -0,0 +1,63 @@
+(ns viz.grid)
+
+;; grid set of points relative to a common origin
+
+(def euclidean [ [0 -1]
+ [-1 0] , [1 0]
+ [0 1] ])
+
+(def isometric [[-1 -1] [0 -2] [1 -1]
+ ,
+ [-1 1] [0 2] [1 1]])
+
+(def hexagonal [ [0 -1]
+ ,
+ [-1 1] [1 1]])
+
+(defn new-grid [grid-def]
+ { :grid-def grid-def
+ :points #{} })
+
+(defn add-point [grid point]
+ (update-in grid [:points] conj point))
+
+(def my-grid (-> (new-grid euclidean)
+ (add-point [0 1])))
+
+;; TODO this could be useful, but it's not needed now, as long as all points we
+;; use are generated from adjacent-points
+;;(defn valid-point? [grid point]
+;; (letfn [(ordered-dim-points [dim order]
+;; (->> (:grid-def grid)
+;; (map #(%1 dim))
+;; (sort (if (= order :asc) < > ))
+;; (filter (if (= order :asc) #(> %1 0) #(< %1 0)))
+;; ))
+;; (closest-in-dim [dim-i dim-jj]
+;; (reduce (fn [curr dim-j]
+;; (let [next (+ curr dim-j)]
+;; (reduce #(if (= ;; TODO wat
+;; (if (> 0 dim-i)
+;; (min dim-i next)
+;; (max dim-i next))))
+;; 0 dim-jj))
+;;
+;; ]
+;; (closest-in-dim 4 [1])))
+;; ;;(ordered-dim 1 :asc)))
+;;
+;;(valid-point? my-grid [0 1])
+
+(defn rm-point [grid point]
+ (update-in grid [:points] disj point))
+
+(defn adjacent-points [grid point]
+ (map #(map + %1 point) (:grid-def grid)))
+
+(defn empty-adjacent-points [grid point]
+ (remove (:points grid) (adjacent-points grid point)))
+
+(-> (new-grid isometric)
+ (add-point [0 0])
+ (add-point [0 1])
+ (empty-adjacent-points [0 1]))
diff --git a/src/http/static/viz/1/viz/grid.cljs.cache.edn b/src/http/static/viz/1/viz/grid.cljs.cache.edn
new file mode 100644
index 0000000..60052ff
--- /dev/null
+++ b/src/http/static/viz/1/viz/grid.cljs.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :use-macros {}, :excludes #{}, :name viz.grid, :imports nil, :requires nil, :uses nil, :defs {euclidean {:name viz.grid/euclidean, :file "src/viz/grid.cljs", :line 5, :column 1, :end-line 5, :end-column 15, :meta {:file "/home/mediocregopher/src/viz/src/viz/grid.cljs", :line 5, :column 6, :end-line 5, :end-column 15}, :tag cljs.core/IVector}, isometric {:name viz.grid/isometric, :file "src/viz/grid.cljs", :line 9, :column 1, :end-line 9, :end-column 15, :meta {:file "/home/mediocregopher/src/viz/src/viz/grid.cljs", :line 9, :column 6, :end-line 9, :end-column 15}, :tag cljs.core/IVector}, hexagonal {:name viz.grid/hexagonal, :file "src/viz/grid.cljs", :line 13, :column 1, :end-line 13, :end-column 15, :meta {:file "/home/mediocregopher/src/viz/src/viz/grid.cljs", :line 13, :column 6, :end-line 13, :end-column 15}, :tag cljs.core/IVector}, new-grid {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/grid.cljs", :line 17, :column 7, :end-line 17, :end-column 15, :arglists (quote ([grid-def]))}, :name viz.grid/new-grid, :variadic false, :file "src/viz/grid.cljs", :end-column 15, :method-params ([grid-def]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 17, :end-line 17, :max-fixed-arity 1, :fn-var true, :arglists (quote ([grid-def]))}, add-point {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/grid.cljs", :line 21, :column 7, :end-line 21, :end-column 16, :arglists (quote ([grid point]))}, :name viz.grid/add-point, :variadic false, :file "src/viz/grid.cljs", :end-column 16, :method-params ([grid point]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 21, :end-line 21, :max-fixed-arity 2, :fn-var true, :arglists (quote ([grid point]))}, my-grid {:name viz.grid/my-grid, :file "src/viz/grid.cljs", :line 24, :column 1, :end-line 24, :end-column 13, :meta {:file "/home/mediocregopher/src/viz/src/viz/grid.cljs", :line 24, :column 6, :end-line 24, :end-column 13}, :tag any}, rm-point {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/grid.cljs", :line 51, :column 7, :end-line 51, :end-column 15, :arglists (quote ([grid point]))}, :name viz.grid/rm-point, :variadic false, :file "src/viz/grid.cljs", :end-column 15, :method-params ([grid point]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 51, :end-line 51, :max-fixed-arity 2, :fn-var true, :arglists (quote ([grid point]))}, adjacent-points {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/grid.cljs", :line 54, :column 7, :end-line 54, :end-column 22, :arglists (quote ([grid point]))}, :name viz.grid/adjacent-points, :variadic false, :file "src/viz/grid.cljs", :end-column 22, :method-params ([grid point]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 54, :end-line 54, :max-fixed-arity 2, :fn-var true, :arglists (quote ([grid point]))}, empty-adjacent-points {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/src/viz/grid.cljs", :line 57, :column 7, :end-line 57, :end-column 28, :arglists (quote ([grid point]))}, :name viz.grid/empty-adjacent-points, :variadic false, :file "src/viz/grid.cljs", :end-column 28, :method-params ([grid point]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 57, :end-line 57, :max-fixed-arity 2, :fn-var true, :arglists (quote ([grid point]))}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:grid-def :points}, :order [:grid-def :points]}, :doc nil} \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/grid.js b/src/http/static/viz/1/viz/grid.js
new file mode 100644
index 0000000..7bf4971
--- /dev/null
+++ b/src/http/static/viz/1/viz/grid.js
@@ -0,0 +1,27 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('viz.grid');
+goog.require('cljs.core');
+viz.grid.euclidean = new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(-1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(-1),(0)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(1),(0)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1)], null)], null);
+viz.grid.isometric = new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(-1),(-1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(-2)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(1),(-1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(-1),(1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(2)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(1),(1)], null)], null);
+viz.grid.hexagonal = new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(-1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(-1),(1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(1),(1)], null)], null);
+viz.grid.new_grid = (function viz$grid$new_grid(grid_def){
+return new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"grid-def","grid-def",-392588768),grid_def,new cljs.core.Keyword(null,"points","points",-1486596883),cljs.core.PersistentHashSet.EMPTY], null);
+});
+viz.grid.add_point = (function viz$grid$add_point(grid,point){
+return cljs.core.update_in.call(null,grid,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"points","points",-1486596883)], null),cljs.core.conj,point);
+});
+viz.grid.my_grid = viz.grid.add_point.call(null,viz.grid.new_grid.call(null,viz.grid.euclidean),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1)], null));
+viz.grid.rm_point = (function viz$grid$rm_point(grid,point){
+return cljs.core.update_in.call(null,grid,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"points","points",-1486596883)], null),cljs.core.disj,point);
+});
+viz.grid.adjacent_points = (function viz$grid$adjacent_points(grid,point){
+return cljs.core.map.call(null,(function (p1__9451_SHARP_){
+return cljs.core.map.call(null,cljs.core._PLUS_,p1__9451_SHARP_,point);
+}),new cljs.core.Keyword(null,"grid-def","grid-def",-392588768).cljs$core$IFn$_invoke$arity$1(grid));
+});
+viz.grid.empty_adjacent_points = (function viz$grid$empty_adjacent_points(grid,point){
+return cljs.core.remove.call(null,new cljs.core.Keyword(null,"points","points",-1486596883).cljs$core$IFn$_invoke$arity$1(grid),viz.grid.adjacent_points.call(null,grid,point));
+});
+viz.grid.empty_adjacent_points.call(null,viz.grid.add_point.call(null,viz.grid.add_point.call(null,viz.grid.new_grid.call(null,viz.grid.isometric),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(0)], null)),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1)], null)),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1)], null));
+
+//# sourceMappingURL=grid.js.map \ No newline at end of file
diff --git a/src/http/static/viz/1/viz/grid.js.map b/src/http/static/viz/1/viz/grid.js.map
new file mode 100644
index 0000000..46886eb
--- /dev/null
+++ b/src/http/static/viz/1/viz/grid.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/viz\/grid.js","sources":["grid.cljs"],"lineCount":27,"mappings":";AAAA;;AAIA,qBAAA,mFAAA,mFAAA,IAAA,aAAA,mFAAA,KAAA,YAAA,mFAAA,IAAA,YAAA,mFAAA,IAAA,1eAAKA;AAIL,qBAAA,mFAAA,mFAAA,KAAA,aAAA,mFAAA,IAAA,aAAA,mFAAA,IAAA,aAAA,mFAAA,KAAA,YAAA,mFAAA,IAAA,YAAA,mFAAA,IAAA,nrBAAKC;AAIL,qBAAA,mFAAA,mFAAA,IAAA,aAAA,mFAAA,KAAA,YAAA,mFAAA,IAAA,vYAAKC;AAIL,oBAAA,pBAAMC,gDAAUC;AAAhB,AAAA,kDAAA,sEAAA,0DAAA,nEACcA;;AAGd,qBAAA,rBAAMC,kDAAWC,KAAKC;AAAtB,AACE,0CAAA,mFAAA,tHAACC,8BAAUF,0JAAeG,eAAKF;;AAEjC,AAAKG,gDAAY,AAACP,4BAASH,zDACV,6EAAA,mFAAA,IAAA,pKAACK;AA0BlB,oBAAA,pBAAMM,gDAAUL,KAAKC;AAArB,AACE,0CAAA,mFAAA,tHAACC,8BAAUF,0JAAeM,eAAKL;;AAEjC,2BAAA,3BAAMM,8DAAiBP,KAAKC;AAA5B,AACE,+BAAA,WAAAO,nCAACC;AAAD,AAAM,gDAAAD,zCAACC,wBAAIC,iCAAKT;GAAO,AAAA,2FAAWD;;AAEpC,iCAAA,jCAAMW,0EAAuBX,KAAKC;AAAlC,AACE,OAACW,2BAAO,AAAA,wFAASZ,MAAM,AAACO,mCAAgBP,KAAKC;;mGAE3C,AAACJ,4BAASF,zDACV,6EAAA,mFAAA,IAAA,pKAACI,7BACD,8MAAA,mFAAA,IAAA,rSAACA,zCACD,2VAAA,mFAAA,IAAA,lbAACY","names":["viz.grid\/euclidean","viz.grid\/isometric","viz.grid\/hexagonal","viz.grid\/new-grid","grid-def","viz.grid\/add-point","grid","point","cljs.core\/update-in","cljs.core\/conj","viz.grid\/my-grid","viz.grid\/rm-point","cljs.core\/disj","viz.grid\/adjacent-points","p1__9451#","cljs.core\/map","cljs.core\/+","viz.grid\/empty-adjacent-points","cljs.core\/remove"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/cljs/core.cljs b/src/http/static/viz/2/cljs/core.cljs
new file mode 100644
index 0000000..c7f6d9a
--- /dev/null
+++ b/src/http/static/viz/2/cljs/core.cljs
@@ -0,0 +1,11565 @@
+; Copyright (c) Rich Hickey. All rights reserved.
+; The use and distribution terms for this software are covered by the
+; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
+; which can be found in the file epl-v10.html at the root of this distribution.
+; By using this software in any fashion, you are agreeing to be bound by
+; the terms of this license.
+; You must not remove this notice, or any other, from this software.
+
+(ns cljs.core
+ (:require goog.math.Long
+ goog.math.Integer
+ [goog.string :as gstring]
+ [goog.object :as gobject]
+ [goog.array :as garray]
+ [goog.Uri])
+ (:import [goog.string StringBuffer]))
+
+;; next line is auto-generated by the build-script - Do not edit!
+(def *clojurescript-version* "1.10.439")
+
+;; Setting of these Vars is in ClojureScript code is associated with intrinsics
+;; that affect compilation state, but otherwise turn into no-ops in the emitted
+;; JavaScript.
+
+;; The scope of *unchecked-if* is controlled by balanced pairs of set! calls.
+(def *unchecked-if* false)
+;; The scope of *unchecked-arrays* is file-scope: In JVM ClojureScript its side-
+;; effect is to set same-named analyzer dynamic Var, which is unset via binding
+;; scopes. In self-hosted it is cleared via cljs.js/post-file-side-effects.
+(def *unchecked-arrays* false)
+;; The scope of *warn-on-infer* is file-scope: Its side effect is to set the
+;; cljs.analyzer/*cljs-warnings* dynamic Var, which is unset via binding scopes.
+(def *warn-on-infer* false)
+
+(set! *unchecked-arrays* true)
+
+(defonce PROTOCOL_SENTINEL #js {})
+
+(def MODULE_URIS nil) ;; set by compiler
+(def MODULE_INFOS nil) ;; set by compiler
+
+(goog-define
+ ^{:dynamic true
+ :doc "Var bound to the name value of the compiler build :target option.
+ For example, if the compiler build :target is :nodejs, *target* will be bound
+ to \"nodejs\". *target* is a Google Closure define and can be set by compiler
+ :closure-defines option."}
+ *target* "default")
+
+(def
+ ^{:dynamic true
+ :doc "Var bound to the current namespace. Only used for bootstrapping."
+ :jsdoc ["@type {*}"]}
+ *ns* nil)
+
+(def
+ ^{:dynamic true
+ :jsdoc ["@type {*}"]}
+ *out* nil)
+
+(def
+ ^{:dynamic true}
+ *assert* true)
+
+(defonce
+ ^{:doc "Each runtime environment provides a different way to print output.
+ Whatever function *print-fn* is bound to will be passed any
+ Strings which should be printed." :dynamic true}
+ *print-fn* nil)
+
+(defn ^{:doc "Arranges to have tap functions executed via the supplied f, a
+ function of no arguments. Returns true if successful, false otherwise." :dynamic true}
+ *exec-tap-fn*
+ [f]
+ (and
+ (exists? js/setTimeout)
+ (js/setTimeout f 0)
+ true))
+
+(defonce
+ ^{:doc "Each runtime environment provides a different way to print error output.
+ Whatever function *print-err-fn* is bound to will be passed any
+ Strings which should be printed." :dynamic true}
+ *print-err-fn* nil)
+
+(defn set-print-fn!
+ "Set *print-fn* to f."
+ [f] (set! *print-fn* f))
+
+(defn set-print-err-fn!
+ "Set *print-err-fn* to f."
+ [f] (set! *print-err-fn* f))
+
+(def
+ ^{:dynamic true
+ :doc "When set to true, output will be flushed whenever a newline is printed.
+
+ Defaults to true."}
+ *flush-on-newline* true)
+
+(def
+ ^{:dynamic true
+ :doc "When set to logical false will drop newlines from printing calls.
+ This is to work around the implicit newlines emitted by standard JavaScript
+ console objects."}
+ *print-newline* true)
+
+(def
+ ^{:dynamic true
+ :doc "When set to logical false, strings and characters will be printed with
+ non-alphanumeric characters converted to the appropriate escape sequences.
+
+ Defaults to true"}
+ *print-readably* true)
+
+(def
+ ^{:dynamic true
+ :doc "If set to logical true, when printing an object, its metadata will also
+ be printed in a form that can be read back by the reader.
+
+ Defaults to false."}
+ *print-meta* false)
+
+(def
+ ^{:dynamic true
+ :doc "When set to logical true, objects will be printed in a way that preserves
+ their type when read in later.
+
+ Defaults to false."}
+ *print-dup* false)
+
+(def
+ ^{:dynamic true
+ :doc "*print-namespace-maps* controls whether the printer will print
+ namespace map literal syntax.
+
+ Defaults to false, but the REPL binds it to true."}
+ *print-namespace-maps* false)
+
+(def
+ ^{:dynamic true
+ :doc "*print-length* controls how many items of each collection the
+ printer will print. If it is bound to logical false, there is no
+ limit. Otherwise, it must be bound to an integer indicating the maximum
+ number of items of each collection to print. If a collection contains
+ more items, the printer will print items up to the limit followed by
+ '...' to represent the remaining items. The root binding is nil
+ indicating no limit."
+ :jsdoc ["@type {null|number}"]}
+ *print-length* nil)
+
+(def
+ ^{:dynamic true
+ :doc "*print-level* controls how many levels deep the printer will
+ print nested objects. If it is bound to logical false, there is no
+ limit. Otherwise, it must be bound to an integer indicating the maximum
+ level to print. Each argument to print is at level 0; if an argument is a
+ collection, its items are at level 1; and so on. If an object is a
+ collection and is at a level greater than or equal to the value bound to
+ *print-level*, the printer prints '#' to represent it. The root binding
+ is nil indicating no limit."
+ :jsdoc ["@type {null|number}"]}
+ *print-level* nil)
+
+(def
+ ^{:dynamic true
+ :doc "*print-fns-bodies* controls whether functions print their source or
+ only their names."}
+ *print-fn-bodies* false)
+
+(defonce
+ ^{:dynamic true
+ :jsdoc ["@type {*}"]}
+ *loaded-libs* nil)
+
+(defn- pr-opts []
+ {:flush-on-newline *flush-on-newline*
+ :readably *print-readably*
+ :meta *print-meta*
+ :dup *print-dup*
+ :print-length *print-length*})
+
+(declare into-array)
+
+(defn enable-console-print!
+ "Set *print-fn* to console.log"
+ []
+ (set! *print-newline* false)
+ (set-print-fn!
+ (fn []
+ (let [xs (js-arguments)]
+ (.apply (.-log js/console) js/console (garray/clone xs)))))
+ (set-print-err-fn!
+ (fn []
+ (let [xs (js-arguments)]
+ (.apply (.-error js/console) js/console (garray/clone xs)))))
+ nil)
+
+(def
+ ^{:doc "bound in a repl thread to the most recent value printed"}
+ *1)
+
+(def
+ ^{:doc "bound in a repl thread to the second most recent value printed"}
+ *2)
+
+(def
+ ^{:doc "bound in a repl thread to the third most recent value printed"}
+ *3)
+
+(def
+ ^{:doc "bound in a repl thread to the most recent exception caught by the repl"}
+ *e)
+
+(defn truth_
+ "Internal - do not use!"
+ [x]
+ (cljs.core/truth_ x))
+
+(def not-native nil)
+
+(declare instance? Keyword)
+
+(defn ^boolean identical?
+ "Tests if 2 arguments are the same object"
+ [x y]
+ (cljs.core/identical? x y))
+
+(defn ^boolean nil?
+ "Returns true if x is nil, false otherwise."
+ [x]
+ (coercive-= x nil))
+
+(defn ^boolean array?
+ "Returns true if x is a JavaScript array."
+ [x]
+ (if (identical? *target* "nodejs")
+ (.isArray js/Array x)
+ (instance? js/Array x)))
+
+(defn ^boolean number?
+ "Returns true if x is a JavaScript number."
+ [x]
+ (cljs.core/number? x))
+
+(defn ^boolean not
+ "Returns true if x is logical false, false otherwise."
+ [x]
+ (cond
+ (nil? x) true
+ (false? x) true
+ :else false))
+
+(defn ^boolean some?
+ "Returns true if x is not nil, false otherwise."
+ [x] (not (nil? x)))
+
+(defn ^boolean object?
+ "Returns true if x's constructor is Object"
+ [x]
+ (if-not (nil? x)
+ (identical? (.-constructor x) js/Object)
+ false))
+
+(defn ^boolean string?
+ "Returns true if x is a JavaScript string."
+ [x]
+ (goog/isString x))
+
+(defn ^boolean char?
+ "Returns true if x is a JavaScript string of length one."
+ [x]
+ (and (string? x) (== 1 (.-length x))))
+
+(defn ^boolean any?
+ "Returns true if given any argument."
+ [x] true)
+
+(set! *unchecked-if* true)
+(defn ^boolean native-satisfies?
+ "Internal - do not use!"
+ [p x]
+ (let [x (if (nil? x) nil x)]
+ (cond
+ (unchecked-get p (goog/typeOf x)) true
+ (unchecked-get p "_") true
+ :else false)))
+(set! *unchecked-if* false)
+
+(defn is_proto_
+ [x]
+ (identical? (.-prototype (.-constructor x)) x))
+
+(def
+ ^{:doc "When compiled for a command-line target, whatever function
+ *main-cli-fn* is set to will be called with the command-line
+ argv as arguments"}
+ *main-cli-fn* nil)
+
+(def
+ ^{:doc "A sequence of the supplied command line arguments, or nil if
+ none were supplied"}
+ *command-line-args* nil)
+
+(defn type
+ "Return x's constructor."
+ [x]
+ (when-not (nil? x)
+ (.-constructor x)))
+
+(defn missing-protocol [proto obj]
+ (let [ty (type obj)
+ ty (if (and ty (.-cljs$lang$type ty))
+ (.-cljs$lang$ctorStr ty)
+ (goog/typeOf obj))]
+ (js/Error.
+ (.join (array "No protocol method " proto
+ " defined for type " ty ": " obj) ""))))
+
+(defn type->str [ty]
+ (if-let [s (.-cljs$lang$ctorStr ty)]
+ s
+ (str ty)))
+
+;; INTERNAL - do not use, only for Node.js
+(defn load-file [file]
+ (when-not js/COMPILED
+ (cljs.core/load-file* file)))
+
+(if (and (exists? js/Symbol)
+ (identical? (goog/typeOf js/Symbol) "function"))
+ (def ITER_SYMBOL (.-iterator js/Symbol))
+ (def ITER_SYMBOL "@@iterator"))
+
+(def ^{:jsdoc ["@enum {string}"]}
+ CHAR_MAP
+ #js {"-" "_"
+ ":" "_COLON_"
+ "+" "_PLUS_"
+ ">" "_GT_"
+ "<" "_LT_"
+ "=" "_EQ_"
+ "~" "_TILDE_"
+ "!" "_BANG_"
+ "@" "_CIRCA_"
+ "#" "_SHARP_"
+ "'" "_SINGLEQUOTE_"
+ "\\\"" "_DOUBLEQUOTE_"
+ "%" "_PERCENT_"
+ "^" "_CARET_"
+ "&" "_AMPERSAND_"
+ "*" "_STAR_"
+ "|" "_BAR_"
+ "{" "_LBRACE_"
+ "}" "_RBRACE_"
+ "[" "_LBRACK_"
+ "]" "_RBRACK_"
+ "/" "_SLASH_"
+ "\\\\" "_BSLASH_"
+ "?" "_QMARK_"})
+
+(def ^{:jsdoc ["@enum {string}"]}
+ DEMUNGE_MAP
+ #js {"_" "-"
+ "_COLON_" ":"
+ "_PLUS_" "+"
+ "_GT_" ">"
+ "_LT_" "<"
+ "_EQ_" "="
+ "_TILDE_" "~"
+ "_BANG_" "!"
+ "_CIRCA_" "@"
+ "_SHARP_" "#"
+ "_SINGLEQUOTE_" "'"
+ "_DOUBLEQUOTE_" "\\\""
+ "_PERCENT_" "%"
+ "_CARET_" "^"
+ "_AMPERSAND_" "&"
+ "_STAR_" "*"
+ "_BAR_" "|"
+ "_LBRACE_" "{"
+ "_RBRACE_" "}"
+ "_LBRACK_" "["
+ "_RBRACK_" "]"
+ "_SLASH_" "/"
+ "_BSLASH_" "\\\\"
+ "_QMARK_" "?"})
+
+(def DEMUNGE_PATTERN nil)
+
+(defn system-time
+ "Returns highest resolution time offered by host in milliseconds."
+ []
+ (cond
+ (and (exists? js/performance)
+ (not (nil? (. js/performance -now))))
+ (.now js/performance)
+
+ (and (exists? js/process)
+ (not (nil? (. js/process -hrtime))))
+ (let [t (.hrtime js/process)]
+ (/ (+ (* (aget t 0) 1e9) (aget t 1)) 1e6))
+
+ :else (.getTime (js/Date.))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; arrays ;;;;;;;;;;;;;;;;
+
+(declare apply)
+
+(defn ^array make-array
+ "Construct a JavaScript array of the specified dimensions. Accepts ignored
+ type argument for compatibility with Clojure. Note that there is no efficient
+ way to allocate multi-dimensional arrays in JavaScript; as such, this function
+ will run in polynomial time when called with 3 or more arguments."
+ ([size]
+ (js/Array. size))
+ ([type size]
+ (make-array size))
+ ([type size & more-sizes]
+ (let [dims more-sizes
+ dimarray (make-array size)]
+ (dotimes [i (alength dimarray)]
+ (aset dimarray i (apply make-array nil dims)))
+ dimarray)))
+
+(defn aclone
+ "Returns a javascript array, cloned from the passed in array"
+ [arr]
+ (let [len (alength arr)
+ new-arr (make-array len)]
+ (dotimes [i len]
+ (aset new-arr i (aget arr i)))
+ new-arr))
+
+(defn ^array array
+ "Creates a new javascript array.
+@param {...*} var_args" ;;array is a special case, don't emulate this doc string
+ [var-args] ;; [& items]
+ (let [a (js/Array. (alength (cljs.core/js-arguments)))]
+ (loop [i 0]
+ (if (< i (alength a))
+ (do
+ (aset a i (aget (cljs.core/js-arguments) i))
+ (recur (inc i)))
+ a))))
+
+(defn- maybe-warn
+ [e]
+ (when *print-err-fn*
+ (*print-err-fn* e)))
+
+(defn- checked-aget
+ ([array idx]
+ (when-assert
+ (try
+ (assert (or (array? array) (goog/isArrayLike array)))
+ (assert (number? idx))
+ (assert (not (neg? idx)))
+ (assert (< idx (alength array)))
+ (catch :default e
+ (maybe-warn e))))
+ (unchecked-get array idx))
+ ([array idx & idxs]
+ (apply checked-aget (checked-aget array idx) idxs)))
+
+(defn- checked-aset
+ ([array idx val]
+ (when-assert
+ (try
+ (assert (or (array? array) (goog/isArrayLike array)))
+ (assert (number? idx))
+ (assert (not (neg? idx)))
+ (assert (< idx (alength array)))
+ (catch :default e
+ (maybe-warn e))))
+ (unchecked-set array idx val))
+ ([array idx idx2 & idxv]
+ (apply checked-aset (checked-aget array idx) idx2 idxv)))
+
+(defn- checked-aget'
+ ([array idx]
+ {:pre [(or (array? array) (goog/isArrayLike array))
+ (number? idx) (not (neg? idx)) (< idx (alength array))]}
+ (unchecked-get array idx))
+ ([array idx & idxs]
+ (apply checked-aget' (checked-aget' array idx) idxs)))
+
+(defn- checked-aset'
+ ([array idx val]
+ {:pre [(or (array? array) (goog/isArrayLike array))
+ (number? idx) (not (neg? idx)) (< idx (alength array))]}
+ (unchecked-set array idx val))
+ ([array idx idx2 & idxv]
+ (apply checked-aset' (checked-aget' array idx) idx2 idxv)))
+
+(defn aget
+ "Returns the value at the index/indices. Works on JavaScript arrays."
+ ([array idx]
+ (cljs.core/aget array idx))
+ ([array idx & idxs]
+ (apply aget (aget array idx) idxs)))
+
+(defn aset
+ "Sets the value at the index/indices. Works on JavaScript arrays.
+ Returns val."
+ ([array idx val]
+ (cljs.core/aset array idx val))
+ ([array idx idx2 & idxv]
+ (apply aset (aget array idx) idx2 idxv)))
+
+(defn ^number alength
+ "Returns the length of the array. Works on arrays of all types."
+ [array]
+ (cljs.core/alength array))
+
+(declare reduce)
+
+(defn ^array into-array
+ "Returns an array with components set to the values in aseq. Optional type
+ argument accepted for compatibility with Clojure."
+ ([aseq]
+ (into-array nil aseq))
+ ([type aseq]
+ (reduce (fn [a x] (.push a x) a) (array) aseq)))
+
+(defn js-invoke
+ "Invoke JavaScript object method via string. Needed when the
+ string is not a valid unquoted property name."
+ [obj s & args]
+ (.apply (unchecked-get obj s) obj (into-array args)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;; core protocols ;;;;;;;;;;;;;
+
+(defprotocol Fn
+ "Marker protocol")
+
+(defprotocol IFn
+ "Protocol for adding the ability to invoke an object as a function.
+ For example, a vector can also be used to look up a value:
+ ([1 2 3 4] 1) => 2"
+ (-invoke
+ [this]
+ [this a]
+ [this a b]
+ [this a b c]
+ [this a b c d]
+ [this a b c d e]
+ [this a b c d e f]
+ [this a b c d e f g]
+ [this a b c d e f g h]
+ [this a b c d e f g h i]
+ [this a b c d e f g h i j]
+ [this a b c d e f g h i j k]
+ [this a b c d e f g h i j k l]
+ [this a b c d e f g h i j k l m]
+ [this a b c d e f g h i j k l m n]
+ [this a b c d e f g h i j k l m n o]
+ [this a b c d e f g h i j k l m n o p]
+ [this a b c d e f g h i j k l m n o p q]
+ [this a b c d e f g h i j k l m n o p q r]
+ [this a b c d e f g h i j k l m n o p q r s]
+ [this a b c d e f g h i j k l m n o p q r s t]
+ [this a b c d e f g h i j k l m n o p q r s t rest]))
+
+(defprotocol ICloneable
+ "Protocol for cloning a value."
+ (^clj -clone [value]
+ "Creates a clone of value."))
+
+(defprotocol ICounted
+ "Protocol for adding the ability to count a collection in constant time."
+ (^number -count [coll]
+ "Calculates the count of coll in constant time. Used by cljs.core/count."))
+
+(defprotocol IEmptyableCollection
+ "Protocol for creating an empty collection."
+ (-empty [coll]
+ "Returns an empty collection of the same category as coll. Used
+ by cljs.core/empty."))
+
+(defprotocol ICollection
+ "Protocol for adding to a collection."
+ (^clj -conj [coll o]
+ "Returns a new collection of coll with o added to it. The new item
+ should be added to the most efficient place, e.g.
+ (conj [1 2 3 4] 5) => [1 2 3 4 5]
+ (conj '(2 3 4 5) 1) => '(1 2 3 4 5)"))
+
+#_(defprotocol IOrdinal
+ (-index [coll]))
+
+(defprotocol IIndexed
+ "Protocol for collections to provide indexed-based access to their items."
+ (-nth [coll n] [coll n not-found]
+ "Returns the value at the index n in the collection coll.
+ Returns not-found if index n is out of bounds and not-found is supplied."))
+
+(defprotocol ASeq
+ "Marker protocol indicating an array sequence.")
+
+(defprotocol ISeq
+ "Protocol for collections to provide access to their items as sequences."
+ (-first [coll]
+ "Returns the first item in the collection coll. Used by cljs.core/first.")
+ (^clj -rest [coll]
+ "Returns a new collection of coll without the first item. It should
+ always return a seq, e.g.
+ (rest []) => ()
+ (rest nil) => ()"))
+
+(defprotocol INext
+ "Protocol for accessing the next items of a collection."
+ (^clj-or-nil -next [coll]
+ "Returns a new collection of coll without the first item. In contrast to
+ rest, it should return nil if there are no more items, e.g.
+ (next []) => nil
+ (next nil) => nil"))
+
+(defprotocol ILookup
+ "Protocol for looking up a value in a data structure."
+ (-lookup [o k] [o k not-found]
+ "Use k to look up a value in o. If not-found is supplied and k is not
+ a valid value that can be used for look up, not-found is returned."))
+
+(defprotocol IAssociative
+ "Protocol for adding associativity to collections."
+ (^boolean -contains-key? [coll k]
+ "Returns true if k is a key in coll.")
+ #_(-entry-at [coll k])
+ (^clj -assoc [coll k v]
+ "Returns a new collection of coll with a mapping from key k to
+ value v added to it."))
+
+(defprotocol IFind
+ "Protocol for implementing entry finding in collections."
+ (-find [coll k] "Returns the map entry for key, or nil if key not present."))
+
+(defprotocol IMap
+ "Protocol for adding mapping functionality to collections."
+ #_(-assoc-ex [coll k v])
+ (^clj -dissoc [coll k]
+ "Returns a new collection of coll without the mapping for key k."))
+
+(defprotocol IMapEntry
+ "Protocol for examining a map entry."
+ (-key [coll]
+ "Returns the key of the map entry.")
+ (-val [coll]
+ "Returns the value of the map entry."))
+
+(defprotocol ISet
+ "Protocol for adding set functionality to a collection."
+ (^clj -disjoin [coll v]
+ "Returns a new collection of coll that does not contain v."))
+
+(defprotocol IStack
+ "Protocol for collections to provide access to their items as stacks. The top
+ of the stack should be accessed in the most efficient way for the different
+ data structures."
+ (-peek [coll]
+ "Returns the item from the top of the stack. Is used by cljs.core/peek.")
+ (^clj -pop [coll]
+ "Returns a new stack without the item on top of the stack. Is used
+ by cljs.core/pop."))
+
+(defprotocol IVector
+ "Protocol for adding vector functionality to collections."
+ (^clj -assoc-n [coll n val]
+ "Returns a new vector with value val added at position n."))
+
+(defprotocol IDeref
+ "Protocol for adding dereference functionality to a reference."
+ (-deref [o]
+ "Returns the value of the reference o."))
+
+(defprotocol IDerefWithTimeout
+ (-deref-with-timeout [o msec timeout-val]))
+
+(defprotocol IMeta
+ "Protocol for accessing the metadata of an object."
+ (^clj-or-nil -meta [o]
+ "Returns the metadata of object o."))
+
+(defprotocol IWithMeta
+ "Protocol for adding metadata to an object."
+ (^clj -with-meta [o meta]
+ "Returns a new object with value of o and metadata meta added to it."))
+
+(defprotocol IReduce
+ "Protocol for seq types that can reduce themselves.
+ Called by cljs.core/reduce."
+ (-reduce [coll f] [coll f start]
+ "f should be a function of 2 arguments. If start is not supplied,
+ returns the result of applying f to the first 2 items in coll, then
+ applying f to that result and the 3rd item, etc."))
+
+(defprotocol IKVReduce
+ "Protocol for associative types that can reduce themselves
+ via a function of key and val. Called by cljs.core/reduce-kv."
+ (-kv-reduce [coll f init]
+ "Reduces an associative collection and returns the result. f should be
+ a function that takes three arguments."))
+
+(defprotocol IEquiv
+ "Protocol for adding value comparison functionality to a type."
+ (^boolean -equiv [o other]
+ "Returns true if o and other are equal, false otherwise."))
+
+(defprotocol IHash
+ "Protocol for adding hashing functionality to a type."
+ (-hash [o]
+ "Returns the hash code of o."))
+
+(defprotocol ISeqable
+ "Protocol for adding the ability to a type to be transformed into a sequence."
+ (^clj-or-nil -seq [o]
+ "Returns a seq of o, or nil if o is empty."))
+
+(defprotocol ISequential
+ "Marker interface indicating a persistent collection of sequential items")
+
+(defprotocol IList
+ "Marker interface indicating a persistent list")
+
+(defprotocol IRecord
+ "Marker interface indicating a record object")
+
+(defprotocol IReversible
+ "Protocol for reversing a seq."
+ (^clj -rseq [coll]
+ "Returns a seq of the items in coll in reversed order."))
+
+(defprotocol ISorted
+ "Protocol for a collection which can represent their items
+ in a sorted manner. "
+ (^clj -sorted-seq [coll ascending?]
+ "Returns a sorted seq from coll in either ascending or descending order.")
+ (^clj -sorted-seq-from [coll k ascending?]
+ "Returns a sorted seq from coll in either ascending or descending order.
+ If ascending is true, the result should contain all items which are > or >=
+ than k. If ascending is false, the result should contain all items which
+ are < or <= than k, e.g.
+ (-sorted-seq-from (sorted-set 1 2 3 4 5) 3 true) => (3 4 5)
+ (-sorted-seq-from (sorted-set 1 2 3 4 5) 3 false) => (3 2 1)")
+ (-entry-key [coll entry]
+ "Returns the key for entry.")
+ (-comparator [coll]
+ "Returns the comparator for coll."))
+
+(defprotocol IWriter
+ "Protocol for writing. Currently only implemented by StringBufferWriter."
+ (-write [writer s]
+ "Writes s with writer and returns the result.")
+ (-flush [writer]
+ "Flush writer."))
+
+(defprotocol IPrintWithWriter
+ "The old IPrintable protocol's implementation consisted of building a giant
+ list of strings to concatenate. This involved lots of concat calls,
+ intermediate vectors, and lazy-seqs, and was very slow in some older JS
+ engines. IPrintWithWriter implements printing via the IWriter protocol, so it
+ be implemented efficiently in terms of e.g. a StringBuffer append."
+ (-pr-writer [o writer opts]))
+
+(defprotocol IPending
+ "Protocol for types which can have a deferred realization. Currently only
+ implemented by Delay and LazySeq."
+ (^boolean -realized? [x]
+ "Returns true if a value for x has been produced, false otherwise."))
+
+(defprotocol IWatchable
+ "Protocol for types that can be watched. Currently only implemented by Atom."
+ (-notify-watches [this oldval newval]
+ "Calls all watchers with this, oldval and newval.")
+ (-add-watch [this key f]
+ "Adds a watcher function f to this. Keys must be unique per reference,
+ and can be used to remove the watch with -remove-watch.")
+ (-remove-watch [this key]
+ "Removes watcher that corresponds to key from this."))
+
+(defprotocol IEditableCollection
+ "Protocol for collections which can transformed to transients."
+ (^clj -as-transient [coll]
+ "Returns a new, transient version of the collection, in constant time."))
+
+(defprotocol ITransientCollection
+ "Protocol for adding basic functionality to transient collections."
+ (^clj -conj! [tcoll val]
+ "Adds value val to tcoll and returns tcoll.")
+ (^clj -persistent! [tcoll]
+ "Creates a persistent data structure from tcoll and returns it."))
+
+(defprotocol ITransientAssociative
+ "Protocol for adding associativity to transient collections."
+ (^clj -assoc! [tcoll key val]
+ "Returns a new transient collection of tcoll with a mapping from key to
+ val added to it."))
+
+(defprotocol ITransientMap
+ "Protocol for adding mapping functionality to transient collections."
+ (^clj -dissoc! [tcoll key]
+ "Returns a new transient collection of tcoll without the mapping for key."))
+
+(defprotocol ITransientVector
+ "Protocol for adding vector functionality to transient collections."
+ (^clj -assoc-n! [tcoll n val]
+ "Returns tcoll with value val added at position n.")
+ (^clj -pop! [tcoll]
+ "Returns tcoll with the last item removed from it."))
+
+(defprotocol ITransientSet
+ "Protocol for adding set functionality to a transient collection."
+ (^clj -disjoin! [tcoll v]
+ "Returns tcoll without v."))
+
+(defprotocol IComparable
+ "Protocol for values that can be compared."
+ (^number -compare [x y]
+ "Returns a negative number, zero, or a positive number when x is logically
+ 'less than', 'equal to', or 'greater than' y."))
+
+(defprotocol IChunk
+ "Protocol for accessing the items of a chunk."
+ (-drop-first [coll]
+ "Return a new chunk of coll with the first item removed."))
+
+(defprotocol IChunkedSeq
+ "Protocol for accessing a collection as sequential chunks."
+ (-chunked-first [coll]
+ "Returns the first chunk in coll.")
+ (-chunked-rest [coll]
+ "Return a new collection of coll with the first chunk removed."))
+
+(defprotocol IChunkedNext
+ "Protocol for accessing the chunks of a collection."
+ (-chunked-next [coll]
+ "Returns a new collection of coll without the first chunk."))
+
+(defprotocol INamed
+ "Protocol for adding a name."
+ (^string -name [x]
+ "Returns the name String of x.")
+ (^string -namespace [x]
+ "Returns the namespace String of x."))
+
+(defprotocol IAtom
+ "Marker protocol indicating an atom.")
+
+(defprotocol IReset
+ "Protocol for adding resetting functionality."
+ (-reset! [o new-value]
+ "Sets the value of o to new-value."))
+
+(defprotocol ISwap
+ "Protocol for adding swapping functionality."
+ (-swap! [o f] [o f a] [o f a b] [o f a b xs]
+ "Swaps the value of o to be (apply f current-value-of-atom args)."))
+
+(defprotocol IVolatile
+ "Protocol for adding volatile functionality."
+ (-vreset! [o new-value]
+ "Sets the value of volatile o to new-value without regard for the
+ current value. Returns new-value."))
+
+(defprotocol IIterable
+ "Protocol for iterating over a collection."
+ (-iterator [coll]
+ "Returns an iterator for coll."))
+
+;; Printing support
+
+(deftype StringBufferWriter [sb]
+ IWriter
+ (-write [_ s] (.append sb s))
+ (-flush [_] nil))
+
+(defn pr-str*
+ "Support so that collections can implement toString without
+ loading all the printing machinery."
+ [^not-native obj]
+ (let [sb (StringBuffer.)
+ writer (StringBufferWriter. sb)]
+ (-pr-writer obj writer (pr-opts))
+ (-flush writer)
+ (str sb)))
+
+;;;;;;;;;;;;;;;;;;; Murmur3 ;;;;;;;;;;;;;;;
+
+;;http://hg.openjdk.java.net/jdk7u/jdk7u6/jdk/file/8c2c5d63a17e/src/share/classes/java/lang/Integer.java
+(defn ^number int-rotate-left [x n]
+ (bit-or
+ (bit-shift-left x n)
+ (unsigned-bit-shift-right x (- n))))
+
+;; http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul
+(if (and (exists? Math/imul)
+ (not (zero? (Math/imul 0xffffffff 5))))
+ (defn ^number imul [a b] (Math/imul a b))
+ (defn ^number imul [a b]
+ (let [ah (bit-and (unsigned-bit-shift-right a 16) 0xffff)
+ al (bit-and a 0xffff)
+ bh (bit-and (unsigned-bit-shift-right b 16) 0xffff)
+ bl (bit-and b 0xffff)]
+ (bit-or
+ (+ (* al bl)
+ (unsigned-bit-shift-right
+ (bit-shift-left (+ (* ah bl) (* al bh)) 16) 0)) 0))))
+
+;; http://smhasher.googlecode.com/svn/trunk/MurmurHash3.cpp
+(def m3-seed 0)
+(def m3-C1 (int 0xcc9e2d51))
+(def m3-C2 (int 0x1b873593))
+
+(defn ^number m3-mix-K1 [k1]
+ (-> (int k1) (imul m3-C1) (int-rotate-left 15) (imul m3-C2)))
+
+(defn ^number m3-mix-H1 [h1 k1]
+ (int (-> (int h1) (bit-xor (int k1)) (int-rotate-left 13) (imul 5) (+ (int 0xe6546b64)))))
+
+(defn ^number m3-fmix [h1 len]
+ (as-> (int h1) h1
+ (bit-xor h1 len)
+ (bit-xor h1 (unsigned-bit-shift-right h1 16))
+ (imul h1 (int 0x85ebca6b))
+ (bit-xor h1 (unsigned-bit-shift-right h1 13))
+ (imul h1 (int 0xc2b2ae35))
+ (bit-xor h1 (unsigned-bit-shift-right h1 16))))
+
+(defn ^number m3-hash-int [in]
+ (if (zero? in)
+ in
+ (let [k1 (m3-mix-K1 in)
+ h1 (m3-mix-H1 m3-seed k1)]
+ (m3-fmix h1 4))))
+
+(defn ^number m3-hash-unencoded-chars [in]
+ (let [h1 (loop [i 1 h1 m3-seed]
+ (if (< i (.-length in))
+ (recur (+ i 2)
+ (m3-mix-H1 h1
+ (m3-mix-K1
+ (bit-or (.charCodeAt in (dec i))
+ (bit-shift-left (.charCodeAt in i) 16)))))
+ h1))
+ h1 (if (== (bit-and (.-length in) 1) 1)
+ (bit-xor h1 (m3-mix-K1 (.charCodeAt in (dec (.-length in)))))
+ h1)]
+ (m3-fmix h1 (imul 2 (.-length in)))))
+
+;;;;;;;;;;;;;;;;;;; symbols ;;;;;;;;;;;;;;;
+
+(declare list Symbol = compare)
+
+;; Simple caching of string hashcode
+(def string-hash-cache (js-obj))
+(def string-hash-cache-count 0)
+
+;;http://hg.openjdk.java.net/jdk7u/jdk7u6/jdk/file/8c2c5d63a17e/src/share/classes/java/lang/String.java
+(defn hash-string* [s]
+ (if-not (nil? s)
+ (let [len (.-length s)]
+ (if (pos? len)
+ (loop [i 0 hash 0]
+ (if (< i len)
+ (recur (inc i) (+ (imul 31 hash) (.charCodeAt s i)))
+ hash))
+ 0))
+ 0))
+
+(defn add-to-string-hash-cache [k]
+ (let [h (hash-string* k)]
+ (gobject/set string-hash-cache k h)
+ (set! string-hash-cache-count (inc string-hash-cache-count))
+ h))
+
+(defn hash-string [k]
+ (when (> string-hash-cache-count 255)
+ (set! string-hash-cache (js-obj))
+ (set! string-hash-cache-count 0))
+ (if (nil? k)
+ 0
+ (let [h (unchecked-get string-hash-cache k)]
+ (if (number? h)
+ h
+ (add-to-string-hash-cache k)))))
+
+(defn hash
+ "Returns the hash code of its argument. Note this is the hash code
+ consistent with =."
+ [o]
+ (cond
+ (implements? IHash o)
+ (bit-xor (-hash ^not-native o) 0)
+
+ (number? o)
+ (if (js/isFinite o)
+ (js-mod (Math/floor o) 2147483647)
+ (case o
+ ##Inf
+ 2146435072
+ ##-Inf
+ -1048576
+ 2146959360))
+
+ ;; note: mirrors Clojure's behavior on the JVM, where the hashCode is
+ ;; 1231 for true and 1237 for false
+ ;; http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html#hashCode%28%29
+ (true? o) 1231
+
+ (false? o) 1237
+
+ (string? o)
+ (m3-hash-int (hash-string o))
+
+ (instance? js/Date o)
+ (bit-xor (.valueOf o) 0)
+
+ (nil? o) 0
+
+ :else
+ (bit-xor (-hash o) 0)))
+
+(defn hash-combine [seed hash]
+ ; a la boost
+ (bit-xor seed
+ (+ hash 0x9e3779b9
+ (bit-shift-left seed 6)
+ (bit-shift-right seed 2))))
+
+(defn ^boolean instance?
+ "Evaluates x and tests if it is an instance of the type
+ c. Returns true or false"
+ [c x]
+ (cljs.core/instance? c x))
+
+(defn ^boolean symbol?
+ "Return true if x is a Symbol"
+ [x]
+ (instance? Symbol x))
+
+(defn- hash-symbol [sym]
+ (hash-combine
+ (m3-hash-unencoded-chars (.-name sym))
+ (hash-string (.-ns sym))))
+
+(defn- compare-symbols [a b]
+ (cond
+ (identical? (.-str a) (.-str b)) 0
+ (and (not (.-ns a)) (.-ns b)) -1
+ (.-ns a) (if-not (.-ns b)
+ 1
+ (let [nsc (garray/defaultCompare (.-ns a) (.-ns b))]
+ (if (== 0 nsc)
+ (garray/defaultCompare (.-name a) (.-name b))
+ nsc)))
+ :default (garray/defaultCompare (.-name a) (.-name b))))
+
+(declare get)
+
+(deftype Symbol [ns name str ^:mutable _hash _meta]
+ Object
+ (toString [_] str)
+ (equiv [this other] (-equiv this other))
+
+ IEquiv
+ (-equiv [_ other]
+ (if (instance? Symbol other)
+ (identical? str (.-str other))
+ false))
+
+ IFn
+ (-invoke [sym coll]
+ (get coll sym))
+ (-invoke [sym coll not-found]
+ (get coll sym not-found))
+
+ IMeta
+ (-meta [_] _meta)
+
+ IWithMeta
+ (-with-meta [_ new-meta] (Symbol. ns name str _hash new-meta))
+
+ IHash
+ (-hash [sym]
+ (caching-hash sym hash-symbol _hash))
+
+ INamed
+ (-name [_] name)
+ (-namespace [_] ns)
+
+ IPrintWithWriter
+ (-pr-writer [o writer _] (-write writer str)))
+
+(defn symbol
+ "Returns a Symbol with the given namespace and name."
+ ([name]
+ (if (symbol? name)
+ name
+ (let [idx (.indexOf name "/")]
+ (if (< idx 1)
+ (symbol nil name)
+ (symbol (.substring name 0 idx)
+ (.substring name (inc idx) (. name -length)))))))
+ ([ns name]
+ (let [sym-str (if-not (nil? ns)
+ (str ns "/" name)
+ name)]
+ (Symbol. ns name sym-str nil nil))))
+
+(deftype Var [val sym _meta]
+ Object
+ (isMacro [_]
+ (. (val) -cljs$lang$macro))
+ (toString [_]
+ (str "#'" sym))
+ IDeref
+ (-deref [_] (val))
+ IMeta
+ (-meta [_] _meta)
+ IWithMeta
+ (-with-meta [_ new-meta]
+ (Var. val sym new-meta))
+ IEquiv
+ (-equiv [this other]
+ (if (instance? Var other)
+ (= (.-sym this) (.-sym other))
+ false))
+ IHash
+ (-hash [_]
+ (hash-symbol sym))
+ Fn
+ IFn
+ (-invoke [_]
+ ((val)))
+ (-invoke [_ a]
+ ((val) a))
+ (-invoke [_ a b]
+ ((val) a b))
+ (-invoke [_ a b c]
+ ((val) a b c))
+ (-invoke [_ a b c d]
+ ((val) a b c d))
+ (-invoke [_ a b c d e]
+ ((val) a b c d e))
+ (-invoke [_ a b c d e f]
+ ((val) a b c d e f))
+ (-invoke [_ a b c d e f g]
+ ((val) a b c d e f g))
+ (-invoke [_ a b c d e f g h]
+ ((val) a b c d e f g h))
+ (-invoke [_ a b c d e f g h i]
+ ((val) a b c d e f g h i))
+ (-invoke [_ a b c d e f g h i j]
+ ((val) a b c d e f g h i j))
+ (-invoke [_ a b c d e f g h i j k]
+ ((val) a b c d e f g h i j k))
+ (-invoke [_ a b c d e f g h i j k l]
+ ((val) a b c d e f g h i j k l))
+ (-invoke [_ a b c d e f g h i j k l m]
+ ((val) a b c d e f g h i j k l m))
+ (-invoke [_ a b c d e f g h i j k l m n]
+ ((val) a b c d e f g h i j k l m n))
+ (-invoke [_ a b c d e f g h i j k l m n o]
+ ((val) a b c d e f g h i j k l m n o))
+ (-invoke [_ a b c d e f g h i j k l m n o p]
+ ((val) a b c d e f g h i j k l m n o p))
+ (-invoke [_ a b c d e f g h i j k l m n o p q]
+ ((val) a b c d e f g h i j k l m n o p q))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r]
+ ((val) a b c d e f g h i j k l m n o p q r))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s]
+ ((val) a b c d e f g h i j k l m n o p q r s))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s t]
+ ((val) a b c d e f g h i j k l m n o p q r s t))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s t rest]
+ (apply (val) a b c d e f g h i j k l m n o p q r s t rest)))
+
+(defn ^boolean var?
+ "Returns true if v is of type cljs.core.Var"
+ [v]
+ (instance? cljs.core.Var v))
+
+;;;;;;;;;;;;;;;;;;; fundamentals ;;;;;;;;;;;;;;;
+
+(declare array-seq prim-seq IndexedSeq)
+
+(defn ^boolean iterable?
+ "Return true if x implements IIterable protocol."
+ [x]
+ (satisfies? IIterable x))
+
+(defn clone
+ "Clone the supplied value which must implement ICloneable."
+ [value]
+ (-clone value))
+
+(defn ^boolean cloneable?
+ "Return true if x implements ICloneable protocol."
+ [value]
+ (satisfies? ICloneable value))
+
+(defn ^seq seq
+ "Returns a seq on the collection. If the collection is
+ empty, returns nil. (seq nil) returns nil. seq also works on
+ Strings."
+ [coll]
+ (when-not (nil? coll)
+ (cond
+ (implements? ISeqable coll)
+ (-seq ^not-native coll)
+
+ (array? coll)
+ (when-not (zero? (alength coll))
+ (IndexedSeq. coll 0 nil))
+
+ (string? coll)
+ (when-not (zero? (.-length coll))
+ (IndexedSeq. coll 0 nil))
+
+ (native-satisfies? ISeqable coll)
+ (-seq coll)
+
+ :else (throw (js/Error. (str coll " is not ISeqable"))))))
+
+(defn first
+ "Returns the first item in the collection. Calls seq on its
+ argument. If coll is nil, returns nil."
+ [coll]
+ (when-not (nil? coll)
+ (if (implements? ISeq coll)
+ (-first ^not-native coll)
+ (let [s (seq coll)]
+ (when-not (nil? s)
+ (-first s))))))
+
+(defn ^seq rest
+ "Returns a possibly empty seq of the items after the first. Calls seq on its
+ argument."
+ [coll]
+ (if-not (nil? coll)
+ (if (implements? ISeq coll)
+ (-rest ^not-native coll)
+ (let [s (seq coll)]
+ (if s
+ (-rest ^not-native s)
+ ())))
+ ()))
+
+(defn ^seq next
+ "Returns a seq of the items after the first. Calls seq on its
+ argument. If there are no more items, returns nil"
+ [coll]
+ (when-not (nil? coll)
+ (if (implements? INext coll)
+ (-next ^not-native coll)
+ (seq (rest coll)))))
+
+(defn ^boolean =
+ "Equality. Returns true if x equals y, false if not. Compares
+ numbers and collections in a type-independent manner. Clojure's immutable data
+ structures define -equiv (and thus =) as a value, not an identity,
+ comparison."
+ ([x] true)
+ ([x y]
+ (if (nil? x)
+ (nil? y)
+ (or (identical? x y)
+ ^boolean (-equiv x y))))
+ ([x y & more]
+ (if (= x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (= y (first more)))
+ false)))
+
+;; EXPERIMENTAL: subject to change
+(deftype ES6Iterator [^:mutable s]
+ Object
+ (next [_]
+ (if-not (nil? s)
+ (let [x (first s)]
+ (set! s (next s))
+ #js {:value x :done false})
+ #js {:value nil :done true})))
+
+(defn es6-iterator
+ "EXPERIMENTAL: Return a ES2015 compatible iterator for coll."
+ [coll]
+ (ES6Iterator. (seq coll)))
+
+(declare es6-iterator-seq)
+
+(deftype ES6IteratorSeq [value iter ^:mutable _rest]
+ ISeqable
+ (-seq [this] this)
+ ISeq
+ (-first [_] value)
+ (-rest [_]
+ (when (nil? _rest)
+ (set! _rest (es6-iterator-seq iter)))
+ _rest))
+
+(defn es6-iterator-seq
+ "EXPERIMENTAL: Given an ES2015 compatible iterator return a seq."
+ [iter]
+ (let [v (.next iter)]
+ (if (.-done v)
+ ()
+ (ES6IteratorSeq. (.-value v) iter nil))))
+
+;;;;;;;;;;;;;;;;;;; Murmur3 Helpers ;;;;;;;;;;;;;;;;
+
+(defn ^number mix-collection-hash
+ "Mix final collection hash for ordered or unordered collections.
+ hash-basis is the combined collection hash, count is the number
+ of elements included in the basis. Note this is the hash code
+ consistent with =, different from .hashCode.
+ See http://clojure.org/data_structures#hash for full algorithms."
+ [hash-basis count]
+ (let [h1 m3-seed
+ k1 (m3-mix-K1 hash-basis)
+ h1 (m3-mix-H1 h1 k1)]
+ (m3-fmix h1 count)))
+
+(defn ^number hash-ordered-coll
+ "Returns the hash code, consistent with =, for an external ordered
+ collection implementing Iterable.
+ See http://clojure.org/data_structures#hash for full algorithms."
+ [coll]
+ (loop [n 0 hash-code 1 coll (seq coll)]
+ (if-not (nil? coll)
+ (recur (inc n) (bit-or (+ (imul 31 hash-code) (hash (first coll))) 0)
+ (next coll))
+ (mix-collection-hash hash-code n))))
+
+(def ^:private empty-ordered-hash
+ (mix-collection-hash 1 0))
+
+(defn ^number hash-unordered-coll
+ "Returns the hash code, consistent with =, for an external unordered
+ collection implementing Iterable. For maps, the iterator should
+ return map entries whose hash is computed as
+ (hash-ordered-coll [k v]).
+ See http://clojure.org/data_structures#hash for full algorithms."
+ [coll]
+ (loop [n 0 hash-code 0 coll (seq coll)]
+ (if-not (nil? coll)
+ (recur (inc n) (bit-or (+ hash-code (hash (first coll))) 0) (next coll))
+ (mix-collection-hash hash-code n))))
+
+(def ^:private empty-unordered-hash
+ (mix-collection-hash 0 0))
+
+;;;;;;;;;;;;;;;;;;; protocols on primitives ;;;;;;;;
+(declare hash-map list equiv-sequential)
+
+(extend-type nil
+ ICounted
+ (-count [_] 0))
+
+;; TODO: we should remove this and handle date equality checking
+;; by some other means, probably by adding a new primitive type
+;; case to the hash table lookup - David
+
+(extend-type js/Date
+ IEquiv
+ (-equiv [o other]
+ (and (instance? js/Date other)
+ (== (.valueOf o) (.valueOf other))))
+
+ IComparable
+ (-compare [this other]
+ (if (instance? js/Date other)
+ (garray/defaultCompare (.valueOf this) (.valueOf other))
+ (throw (js/Error. (str "Cannot compare " this " to " other))))))
+
+(defprotocol Inst
+ (inst-ms* [inst]))
+
+(extend-protocol Inst
+ js/Date
+ (inst-ms* [inst] (.getTime inst)))
+
+(defn inst-ms
+ "Return the number of milliseconds since January 1, 1970, 00:00:00 GMT"
+ [inst]
+ (inst-ms* inst))
+
+(defn ^boolean inst?
+ "Return true if x satisfies Inst"
+ [x]
+ (satisfies? Inst x))
+
+(extend-type number
+ IEquiv
+ (-equiv [x o] (identical? x o)))
+
+(declare with-meta)
+
+(extend-type function
+ Fn
+ IMeta
+ (-meta [_] nil))
+
+(extend-type default
+ IHash
+ (-hash [o]
+ (goog/getUid o)))
+
+;;this is primitive because & emits call to array-seq
+(defn inc
+ "Returns a number one greater than num."
+ [x] (cljs.core/+ x 1))
+
+(declare deref)
+
+(deftype Reduced [val]
+ IDeref
+ (-deref [o] val))
+
+(defn reduced
+ "Wraps x in a way such that a reduce will terminate with the value x"
+ [x]
+ (Reduced. x))
+
+(defn ^boolean reduced?
+ "Returns true if x is the result of a call to reduced"
+ [r]
+ (instance? Reduced r))
+
+(defn ensure-reduced
+ "If x is already reduced?, returns it, else returns (reduced x)"
+ [x]
+ (if (reduced? x) x (reduced x)))
+
+(defn unreduced
+ "If x is reduced?, returns (deref x), else returns x"
+ [x]
+ (if (reduced? x) (deref x) x))
+
+;; generic to all refs
+;; (but currently hard-coded to atom!)
+(defn deref
+ "Also reader macro: @var/@atom/@delay. Returns the
+ most-recently-committed value of ref. When applied to a var
+ or atom, returns its current state. When applied to a delay, forces
+ it if not already forced. See also - realized?."
+ [o]
+ (-deref o))
+
+(defn- ci-reduce
+ "Accepts any collection which satisfies the ICount and IIndexed protocols and
+reduces them without incurring seq initialization"
+ ([cicoll f]
+ (let [cnt (-count cicoll)]
+ (if (zero? cnt)
+ (f)
+ (loop [val (-nth cicoll 0), n 1]
+ (if (< n cnt)
+ (let [nval (f val (-nth cicoll n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val)))))
+ ([cicoll f val]
+ (let [cnt (-count cicoll)]
+ (loop [val val, n 0]
+ (if (< n cnt)
+ (let [nval (f val (-nth cicoll n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val))))
+ ([cicoll f val idx]
+ (let [cnt (-count cicoll)]
+ (loop [val val, n idx]
+ (if (< n cnt)
+ (let [nval (f val (-nth cicoll n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val)))))
+
+(defn- array-reduce
+ ([arr f]
+ (let [cnt (alength arr)]
+ (if (zero? (alength arr))
+ (f)
+ (loop [val (aget arr 0), n 1]
+ (if (< n cnt)
+ (let [nval (f val (aget arr n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val)))))
+ ([arr f val]
+ (let [cnt (alength arr)]
+ (loop [val val, n 0]
+ (if (< n cnt)
+ (let [nval (f val (aget arr n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val))))
+ ([arr f val idx]
+ (let [cnt (alength arr)]
+ (loop [val val, n idx]
+ (if (< n cnt)
+ (let [nval (f val (aget arr n))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (inc n))))
+ val)))))
+
+(declare hash-coll cons drop count nth RSeq List)
+
+(defn ^boolean counted?
+ "Returns true if coll implements count in constant time"
+ [x] (satisfies? ICounted x))
+
+(defn ^boolean indexed?
+ "Returns true if coll implements nth in constant time"
+ [x] (satisfies? IIndexed x))
+
+(defn- -indexOf
+ ([coll x]
+ (-indexOf coll x 0))
+ ([coll x start]
+ (let [len (count coll)]
+ (if (>= start len)
+ -1
+ (loop [idx (cond
+ (pos? start) start
+ (neg? start) (max 0 (+ start len))
+ :else start)]
+ (if (< idx len)
+ (if (= (nth coll idx) x)
+ idx
+ (recur (inc idx)))
+ -1))))))
+
+(defn- -lastIndexOf
+ ([coll x]
+ (-lastIndexOf coll x (count coll)))
+ ([coll x start]
+ (let [len (count coll)]
+ (if (zero? len)
+ -1
+ (loop [idx (cond
+ (pos? start) (min (dec len) start)
+ (neg? start) (+ len start)
+ :else start)]
+ (if (>= idx 0)
+ (if (= (nth coll idx) x)
+ idx
+ (recur (dec idx)))
+ -1))))))
+
+(deftype IndexedSeqIterator [arr ^:mutable i]
+ Object
+ (hasNext [_]
+ (< i (alength arr)))
+ (next [_]
+ (let [ret (aget arr i)]
+ (set! i (inc i))
+ ret)))
+
+(deftype IndexedSeq [arr i meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [_] (IndexedSeq. arr i meta))
+
+ ISeqable
+ (-seq [this]
+ (when (< i (alength arr))
+ this))
+
+ IMeta
+ (-meta [coll] meta)
+ IWithMeta
+ (-with-meta [coll new-meta]
+ (IndexedSeq. arr i new-meta))
+
+ ASeq
+ ISeq
+ (-first [_] (aget arr i))
+ (-rest [_] (if (< (inc i) (alength arr))
+ (IndexedSeq. arr (inc i) nil)
+ (list)))
+
+ INext
+ (-next [_] (if (< (inc i) (alength arr))
+ (IndexedSeq. arr (inc i) nil)
+ nil))
+
+ ICounted
+ (-count [_]
+ (max 0 (- (alength arr) i)))
+
+ IIndexed
+ (-nth [coll n]
+ (let [i (+ n i)]
+ (if (and (<= 0 i) (< i (alength arr)))
+ (aget arr i)
+ (throw (js/Error. "Index out of bounds")))))
+ (-nth [coll n not-found]
+ (let [i (+ n i)]
+ (if (and (<= 0 i) (< i (alength arr)))
+ (aget arr i)
+ not-found)))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IIterable
+ (-iterator [coll]
+ (IndexedSeqIterator. arr i))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (.-EMPTY List))
+
+ IReduce
+ (-reduce [coll f]
+ (array-reduce arr f (aget arr i) (inc i)))
+ (-reduce [coll f start]
+ (array-reduce arr f start i))
+
+ IHash
+ (-hash [coll] (hash-ordered-coll coll))
+
+ IReversible
+ (-rseq [coll]
+ (let [c (-count coll)]
+ (if (pos? c)
+ (RSeq. coll (dec c) nil)))))
+
+(es6-iterable IndexedSeq)
+
+(defn prim-seq
+ "Create seq from a primitive JavaScript Array-like."
+ ([prim]
+ (prim-seq prim 0))
+ ([prim i]
+ (when (< i (alength prim))
+ (IndexedSeq. prim i nil))))
+
+(defn array-seq
+ "Create a seq from a JavaScript array."
+ ([array]
+ (prim-seq array 0))
+ ([array i]
+ (prim-seq array i)))
+
+(declare with-meta seq-reduce)
+
+(deftype RSeq [ci i meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [_] (RSeq. ci i meta))
+
+ IMeta
+ (-meta [coll] meta)
+ IWithMeta
+ (-with-meta [coll new-meta]
+ (RSeq. ci i new-meta))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ISeq
+ (-first [coll]
+ (-nth ci i))
+ (-rest [coll]
+ (if (pos? i)
+ (RSeq. ci (dec i) nil)
+ ()))
+
+ INext
+ (-next [coll]
+ (when (pos? i)
+ (RSeq. ci (dec i) nil)))
+
+ ICounted
+ (-count [coll] (inc i))
+
+ ICollection
+ (-conj [coll o]
+ (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ IHash
+ (-hash [coll] (hash-ordered-coll coll))
+
+ IReduce
+ (-reduce [col f] (seq-reduce f col))
+ (-reduce [col f start] (seq-reduce f start col)))
+
+(es6-iterable RSeq)
+
+(defn second
+ "Same as (first (next x))"
+ [coll]
+ (first (next coll)))
+
+(defn ffirst
+ "Same as (first (first x))"
+ [coll]
+ (first (first coll)))
+
+(defn nfirst
+ "Same as (next (first x))"
+ [coll]
+ (next (first coll)))
+
+(defn fnext
+ "Same as (first (next x))"
+ [coll]
+ (first (next coll)))
+
+(defn nnext
+ "Same as (next (next x))"
+ [coll]
+ (next (next coll)))
+
+(defn last
+ "Return the last item in coll, in linear time"
+ [s]
+ (let [sn (next s)]
+ (if-not (nil? sn)
+ (recur sn)
+ (first s))))
+
+(extend-type default
+ IEquiv
+ (-equiv [x o] (identical? x o)))
+
+(defn conj
+ "conj[oin]. Returns a new collection with the xs
+ 'added'. (conj nil item) returns (item). The 'addition' may
+ happen at different 'places' depending on the concrete type."
+ ([] [])
+ ([coll] coll)
+ ([coll x]
+ (if-not (nil? coll)
+ (-conj coll x)
+ (list x)))
+ ([coll x & xs]
+ (if xs
+ (recur (conj coll x) (first xs) (next xs))
+ (conj coll x))))
+
+(defn empty
+ "Returns an empty collection of the same category as coll, or nil"
+ [coll]
+ (when-not (nil? coll)
+ (-empty coll)))
+
+(defn- accumulating-seq-count [coll]
+ (loop [s (seq coll) acc 0]
+ (if (counted? s) ; assumes nil is counted, which it currently is
+ (+ acc (-count s))
+ (recur (next s) (inc acc)))))
+
+(defn count
+ "Returns the number of items in the collection. (count nil) returns
+ 0. Also works on strings, arrays, and Maps"
+ [coll]
+ (if-not (nil? coll)
+ (cond
+ (implements? ICounted coll)
+ (-count ^not-native coll)
+
+ (array? coll)
+ (alength coll)
+
+ (string? coll)
+ (.-length coll)
+
+ (implements? ISeqable coll)
+ (accumulating-seq-count coll)
+
+ :else (-count coll))
+ 0))
+
+(defn- linear-traversal-nth
+ ([coll n]
+ (cond
+ (nil? coll) (throw (js/Error. "Index out of bounds"))
+ (zero? n) (if (seq coll)
+ (first coll)
+ (throw (js/Error. "Index out of bounds")))
+ (indexed? coll) (-nth coll n)
+ (seq coll) (recur (next coll) (dec n))
+ :else (throw (js/Error. "Index out of bounds"))))
+ ([coll n not-found]
+ (cond
+ (nil? coll) not-found
+ (zero? n) (if (seq coll)
+ (first coll)
+ not-found)
+ (indexed? coll) (-nth coll n not-found)
+ (seq coll) (recur (next coll) (dec n) not-found)
+ :else not-found)))
+
+(defn nth
+ "Returns the value at the index. get returns nil if index out of
+ bounds, nth throws an exception unless not-found is supplied. nth
+ also works for strings, arrays, regex Matchers and Lists, and,
+ in O(n) time, for sequences."
+ ([coll n]
+ (cond
+ (not (number? n))
+ (throw (js/Error. "Index argument to nth must be a number"))
+
+ (nil? coll)
+ coll
+
+ (implements? IIndexed coll)
+ (-nth ^not-native coll n)
+
+ (array? coll)
+ (if (and (>= n 0) (< n (.-length coll)))
+ (aget coll n)
+ (throw (js/Error. "Index out of bounds")))
+
+ (string? coll)
+ (if (and (>= n 0) (< n (.-length coll)))
+ (.charAt coll n)
+ (throw (js/Error. "Index out of bounds")))
+
+ (or (implements? ISeq coll)
+ (implements? ISequential coll))
+ (if (neg? n)
+ (throw (js/Error. "Index out of bounds"))
+ (linear-traversal-nth coll n))
+
+ (native-satisfies? IIndexed coll)
+ (-nth coll n)
+
+ :else
+ (throw (js/Error. (str "nth not supported on this type "
+ (type->str (type coll)))))))
+ ([coll n not-found]
+ (cond
+ (not (number? n))
+ (throw (js/Error. "Index argument to nth must be a number."))
+
+ (nil? coll)
+ not-found
+
+ (implements? IIndexed coll)
+ (-nth ^not-native coll n not-found)
+
+ (array? coll)
+ (if (and (>= n 0) (< n (.-length coll)))
+ (aget coll n)
+ not-found)
+
+ (string? coll)
+ (if (and (>= n 0) (< n (.-length coll)))
+ (.charAt coll n)
+ not-found)
+
+ (or (implements? ISeq coll)
+ (implements? ISequential coll))
+ (if (neg? n)
+ not-found
+ (linear-traversal-nth coll n not-found))
+
+ (native-satisfies? IIndexed coll)
+ (-nth coll n not-found)
+
+ :else
+ (throw (js/Error. (str "nth not supported on this type "
+ (type->str (type coll))))))))
+
+(defn nthrest
+ "Returns the nth rest of coll, coll when n is 0."
+ [coll n]
+ (loop [n n xs coll]
+ (if-let [xs (and (pos? n) (seq xs))]
+ (recur (dec n) (rest xs))
+ xs)))
+
+(defn get
+ "Returns the value mapped to key, not-found or nil if key not present."
+ ([o k]
+ (when-not (nil? o)
+ (cond
+ (implements? ILookup o)
+ (-lookup ^not-native o k)
+
+ (array? o)
+ (when (and (some? k) (< k (.-length o)))
+ (aget o (int k)))
+
+ (string? o)
+ (when (and (some? k) (< k (.-length o)))
+ (.charAt o (int k)))
+
+ (native-satisfies? ILookup o)
+ (-lookup o k)
+
+ :else nil)))
+ ([o k not-found]
+ (if-not (nil? o)
+ (cond
+ (implements? ILookup o)
+ (-lookup ^not-native o k not-found)
+
+ (array? o)
+ (if (and (some? k) (>= k 0) (< k (.-length o)))
+ (aget o (int k))
+ not-found)
+
+ (string? o)
+ (if (and (some? k) (>= k 0) (< k (.-length o)))
+ (.charAt o (int k))
+ not-found)
+
+ (native-satisfies? ILookup o)
+ (-lookup o k not-found)
+
+ :else not-found)
+ not-found)))
+
+(declare PersistentHashMap PersistentArrayMap MapEntry)
+
+(defn assoc
+ "assoc[iate]. When applied to a map, returns a new map of the
+ same (hashed/sorted) type, that contains the mapping of key(s) to
+ val(s). When applied to a vector, returns a new vector that
+ contains val at index."
+ ([coll k v]
+ (if-not (nil? coll)
+ (-assoc coll k v)
+ (array-map k v)))
+ ([coll k v & kvs]
+ (let [ret (assoc coll k v)]
+ (if kvs
+ (recur ret (first kvs) (second kvs) (nnext kvs))
+ ret))))
+
+(defn dissoc
+ "dissoc[iate]. Returns a new map of the same (hashed/sorted) type,
+ that does not contain a mapping for key(s)."
+ ([coll] coll)
+ ([coll k]
+ (when-not (nil? coll)
+ (-dissoc coll k)))
+ ([coll k & ks]
+ (when-not (nil? coll)
+ (let [ret (dissoc coll k)]
+ (if ks
+ (recur ret (first ks) (next ks))
+ ret)))))
+
+(defn ^boolean fn?
+ "Return true if f is a JavaScript function or satisfies the Fn protocol."
+ [f]
+ (or ^boolean (goog/isFunction f) (satisfies? Fn f)))
+
+(deftype MetaFn [afn meta]
+ IMeta
+ (-meta [_] meta)
+ IWithMeta
+ (-with-meta [_ new-meta]
+ (MetaFn. afn new-meta))
+ Fn
+ IFn
+ (-invoke [_]
+ (afn))
+ (-invoke [_ a]
+ (afn a))
+ (-invoke [_ a b]
+ (afn a b))
+ (-invoke [_ a b c]
+ (afn a b c))
+ (-invoke [_ a b c d]
+ (afn a b c d))
+ (-invoke [_ a b c d e]
+ (afn a b c d e))
+ (-invoke [_ a b c d e f]
+ (afn a b c d e f))
+ (-invoke [_ a b c d e f g]
+ (afn a b c d e f g))
+ (-invoke [_ a b c d e f g h]
+ (afn a b c d e f g h))
+ (-invoke [_ a b c d e f g h i]
+ (afn a b c d e f g h i))
+ (-invoke [_ a b c d e f g h i j]
+ (afn a b c d e f g h i j))
+ (-invoke [_ a b c d e f g h i j k]
+ (afn a b c d e f g h i j k))
+ (-invoke [_ a b c d e f g h i j k l]
+ (afn a b c d e f g h i j k l))
+ (-invoke [_ a b c d e f g h i j k l m]
+ (afn a b c d e f g h i j k l m))
+ (-invoke [_ a b c d e f g h i j k l m n]
+ (afn a b c d e f g h i j k l m n))
+ (-invoke [_ a b c d e f g h i j k l m n o]
+ (afn a b c d e f g h i j k l m n o))
+ (-invoke [_ a b c d e f g h i j k l m n o p]
+ (afn a b c d e f g h i j k l m n o p))
+ (-invoke [_ a b c d e f g h i j k l m n o p q]
+ (afn a b c d e f g h i j k l m n o p q))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r]
+ (afn a b c d e f g h i j k l m n o p q r))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s]
+ (afn a b c d e f g h i j k l m n o p q r s))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s t]
+ (afn a b c d e f g h i j k l m n o p q r s t))
+ (-invoke [_ a b c d e f g h i j k l m n o p q r s t rest]
+ (apply afn a b c d e f g h i j k l m n o p q r s t rest)))
+
+(defn with-meta
+ "Returns an object of the same type and value as obj, with
+ map m as its metadata."
+ [o meta]
+ (if ^boolean (goog/isFunction o)
+ (MetaFn. o meta)
+ (when-not (nil? o)
+ (-with-meta o meta))))
+
+(defn meta
+ "Returns the metadata of obj, returns nil if there is no metadata."
+ [o]
+ (when (and (not (nil? o))
+ (satisfies? IMeta o))
+ (-meta o)))
+
+(defn peek
+ "For a list or queue, same as first, for a vector, same as, but much
+ more efficient than, last. If the collection is empty, returns nil."
+ [coll]
+ (when-not (nil? coll)
+ (-peek coll)))
+
+(defn pop
+ "For a list or queue, returns a new list/queue without the first
+ item, for a vector, returns a new vector without the last item.
+ Note - not the same as next/butlast."
+ [coll]
+ (when-not (nil? coll)
+ (-pop coll)))
+
+(defn disj
+ "disj[oin]. Returns a new set of the same (hashed/sorted) type, that
+ does not contain key(s)."
+ ([coll] coll)
+ ([coll k]
+ (when-not (nil? coll)
+ (-disjoin coll k)))
+ ([coll k & ks]
+ (when-not (nil? coll)
+ (let [ret (disj coll k)]
+ (if ks
+ (recur ret (first ks) (next ks))
+ ret)))))
+
+(defn ^boolean empty?
+ "Returns true if coll has no items - same as (not (seq coll)).
+ Please use the idiom (seq x) rather than (not (empty? x))"
+ [coll] (or (nil? coll)
+ (not (seq coll))))
+
+(defn ^boolean coll?
+ "Returns true if x satisfies ICollection"
+ [x]
+ (if (nil? x)
+ false
+ (satisfies? ICollection x)))
+
+(defn ^boolean set?
+ "Returns true if x satisfies ISet"
+ [x]
+ (if (nil? x)
+ false
+ (satisfies? ISet x)))
+
+(defn ^boolean associative?
+ "Returns true if coll implements IAssociative"
+ [x] (satisfies? IAssociative x))
+
+(defn ^boolean ifind?
+ "Returns true if coll implements IFind"
+ [x] (satisfies? IFind x))
+
+(defn ^boolean sequential?
+ "Returns true if coll satisfies ISequential"
+ [x] (satisfies? ISequential x))
+
+(defn ^boolean sorted?
+ "Returns true if coll satisfies ISorted"
+ [x] (satisfies? ISorted x))
+
+(defn ^boolean reduceable?
+ "Returns true if coll satisfies IReduce"
+ [x] (satisfies? IReduce x))
+
+(defn ^boolean map?
+ "Return true if x satisfies IMap"
+ [x]
+ (if (nil? x)
+ false
+ (satisfies? IMap x)))
+
+(defn ^boolean record?
+ "Return true if x satisfies IRecord"
+ [x]
+ (satisfies? IRecord x))
+
+(defn ^boolean vector?
+ "Return true if x satisfies IVector"
+ [x] (satisfies? IVector x))
+
+(declare ChunkedCons ChunkedSeq)
+
+(defn ^boolean chunked-seq?
+ "Return true if x is satisfies IChunkedSeq."
+ [x] (implements? IChunkedSeq x))
+
+;;;;;;;;;;;;;;;;;;;; js primitives ;;;;;;;;;;;;
+(defn js-obj
+ "Create JavaSript object from an even number arguments representing
+ interleaved keys and values."
+ ([]
+ (cljs.core/js-obj))
+ ([& keyvals]
+ (apply gobject/create keyvals)))
+
+(defn js-keys
+ "Return the JavaScript keys for an object."
+ [obj]
+ (gobject/getKeys obj))
+
+(defn js-delete
+ "Delete a property from a JavaScript object.
+ Returns true upon success, false otherwise."
+ [obj key]
+ (cljs.core/js-delete obj key))
+
+(defn- array-copy
+ ([from i to j len]
+ (loop [i i j j len len]
+ (if (zero? len)
+ to
+ (do (aset to j (aget from i))
+ (recur (inc i) (inc j) (dec len)))))))
+
+(defn- array-copy-downward
+ ([from i to j len]
+ (loop [i (+ i (dec len)) j (+ j (dec len)) len len]
+ (if (zero? len)
+ to
+ (do (aset to j (aget from i))
+ (recur (dec i) (dec j) (dec len)))))))
+
+;;;;;;;;;;;;;;;; preds ;;;;;;;;;;;;;;;;;;
+
+(def ^:private lookup-sentinel (js-obj))
+
+(defn ^boolean false?
+ "Returns true if x is the value false, false otherwise."
+ [x] (cljs.core/false? x))
+
+(defn ^boolean true?
+ "Returns true if x is the value true, false otherwise."
+ [x] (cljs.core/true? x))
+
+(defn ^boolean boolean?
+ "Return true if x is a Boolean"
+ [x] (or (cljs.core/true? x) (cljs.core/false? x)))
+
+(defn ^boolean undefined?
+ "Returns true if x identical to the JavaScript undefined value."
+ [x]
+ (cljs.core/undefined? x))
+
+(defn ^boolean seq?
+ "Return true if s satisfies ISeq"
+ [s]
+ (if (nil? s)
+ false
+ (satisfies? ISeq s)))
+
+(defn ^boolean seqable?
+ "Return true if the seq function is supported for s"
+ [s]
+ (or
+ (nil? s)
+ (satisfies? ISeqable s)
+ (array? s)
+ (string? s)))
+
+(defn ^boolean boolean
+ "Coerce to boolean"
+ [x]
+ (cond
+ (nil? x) false
+ (false? x) false
+ :else true))
+
+(defn ^boolean ifn?
+ "Returns true if f returns true for fn? or satisfies IFn."
+ [f]
+ (or (fn? f) (satisfies? IFn f)))
+
+(defn ^boolean integer?
+ "Returns true if n is a JavaScript number with no decimal part."
+ [n]
+ (and (number? n)
+ (not ^boolean (js/isNaN n))
+ (not (identical? n js/Infinity))
+ (== (js/parseFloat n) (js/parseInt n 10))))
+
+(defn ^boolean int?
+ "Return true if x satisfies integer? or is an instance of goog.math.Integer
+ or goog.math.Long."
+ [x]
+ (or (integer? x)
+ (instance? goog.math.Integer x)
+ (instance? goog.math.Long x)))
+
+(defn ^boolean pos-int?
+ "Return true if x satisfies int? and is positive."
+ [x]
+ (cond
+ (integer? x) (pos? x)
+
+ (instance? goog.math.Integer x)
+ (and (not (.isNegative x))
+ (not (.isZero x)))
+
+ (instance? goog.math.Long x)
+ (and (not (.isNegative x))
+ (not (.isZero x)))
+
+ :else false))
+
+(defn ^boolean neg-int?
+ "Return true if x satisfies int? and is negative."
+ [x]
+ (cond
+ (integer? x) (neg? x)
+
+ (instance? goog.math.Integer x)
+ (.isNegative x)
+
+ (instance? goog.math.Long x)
+ (.isNegative x)
+
+ :else false))
+
+(defn ^boolean nat-int?
+ "Return true if x satisfies int? and is a natural integer value."
+ [x]
+ (cond
+ (integer? x)
+ (not (neg? x))
+
+ (instance? goog.math.Integer x)
+ (not (.isNegative x))
+
+ (instance? goog.math.Long x)
+ (not (.isNegative x))
+
+ :else false))
+
+(defn ^boolean float?
+ "Returns true for JavaScript numbers, false otherwise."
+ [x]
+ (number? x))
+
+(defn ^boolean double?
+ "Returns true for JavaScript numbers, false otherwise."
+ [x]
+ (number? x))
+
+(defn ^boolean infinite?
+ "Returns true for Infinity and -Infinity values."
+ [x]
+ (or (identical? x js/Number.POSITIVE_INFINITY)
+ (identical? x js/Number.NEGATIVE_INFINITY)))
+
+(defn ^boolean contains?
+ "Returns true if key is present in the given collection, otherwise
+ returns false. Note that for numerically indexed collections like
+ vectors and arrays, this tests if the numeric key is within the
+ range of indexes. 'contains?' operates constant or logarithmic time;
+ it will not perform a linear search for a value. See also 'some'."
+ [coll v]
+ (if (identical? (get coll v lookup-sentinel) lookup-sentinel)
+ false
+ true))
+
+(defn find
+ "Returns the map entry for key, or nil if key not present."
+ [coll k]
+ (if (ifind? coll)
+ (-find coll k)
+ (when (and (not (nil? coll))
+ (associative? coll)
+ (contains? coll k))
+ (MapEntry. k (get coll k) nil))))
+
+(defn ^boolean distinct?
+ "Returns true if no two of the arguments are ="
+ ([x] true)
+ ([x y] (not (= x y)))
+ ([x y & more]
+ (if (not (= x y))
+ (loop [s #{x y} xs more]
+ (let [x (first xs)
+ etc (next xs)]
+ (if xs
+ (if (contains? s x)
+ false
+ (recur (conj s x) etc))
+ true)))
+ false)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Seq fns ;;;;;;;;;;;;;;;;
+
+(defn ^number compare
+ "Comparator. Returns a negative number, zero, or a positive number
+ when x is logically 'less than', 'equal to', or 'greater than'
+ y. Uses IComparable if available and google.array.defaultCompare for objects
+ of the same type and special-cases nil to be less than any other object."
+ [x y]
+ (cond
+ (identical? x y) 0
+
+ (nil? x) -1
+
+ (nil? y) 1
+
+ (number? x) (if (number? y)
+ (garray/defaultCompare x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y))))
+
+ (satisfies? IComparable x)
+ (-compare x y)
+
+ :else
+ (if (and (or (string? x) (array? x) (true? x) (false? x))
+ (identical? (type x) (type y)))
+ (garray/defaultCompare x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y))))))
+
+(defn ^:private compare-indexed
+ "Compare indexed collection."
+ ([xs ys]
+ (let [xl (count xs)
+ yl (count ys)]
+ (cond
+ (< xl yl) -1
+ (> xl yl) 1
+ (== xl 0) 0
+ :else (compare-indexed xs ys xl 0))))
+ ([xs ys len n]
+ (let [d (compare (nth xs n) (nth ys n))]
+ (if (and (zero? d) (< (+ n 1) len))
+ (recur xs ys len (inc n))
+ d))))
+
+(defn ^:private fn->comparator
+ "Given a fn that might be boolean valued or a comparator,
+ return a fn that is a comparator."
+ [f]
+ (if (= f compare)
+ compare
+ (fn [x y]
+ (let [r (f x y)]
+ (if (number? r)
+ r
+ (if r
+ -1
+ (if (f y x) 1 0)))))))
+
+(declare to-array)
+
+(defn sort
+ "Returns a sorted sequence of the items in coll. Comp can be
+ boolean-valued comparison function, or a -/0/+ valued comparator.
+ Comp defaults to compare."
+ ([coll]
+ (sort compare coll))
+ ([comp coll]
+ (if (seq coll)
+ (let [a (to-array coll)]
+ ;; matching Clojure's stable sort, though docs don't promise it
+ (garray/stableSort a (fn->comparator comp))
+ (seq a))
+ ())))
+
+(defn sort-by
+ "Returns a sorted sequence of the items in coll, where the sort
+ order is determined by comparing (keyfn item). Comp can be
+ boolean-valued comparison function, or a -/0/+ valued comparator.
+ Comp defaults to compare."
+ ([keyfn coll]
+ (sort-by keyfn compare coll))
+ ([keyfn comp coll]
+ (sort (fn [x y] ((fn->comparator comp) (keyfn x) (keyfn y))) coll)))
+
+; simple reduce based on seqs, used as default
+(defn- seq-reduce
+ ([f coll]
+ (if-let [s (seq coll)]
+ (reduce f (first s) (next s))
+ (f)))
+ ([f val coll]
+ (loop [val val, coll (seq coll)]
+ (if coll
+ (let [nval (f val (first coll))]
+ (if (reduced? nval)
+ @nval
+ (recur nval (next coll))))
+ val))))
+
+(declare vec)
+
+(defn shuffle
+ "Return a random permutation of coll"
+ [coll]
+ (let [a (to-array coll)]
+ (garray/shuffle a)
+ (vec a)))
+
+(defn- iter-reduce
+ ([coll f]
+ (let [iter (-iterator coll)]
+ (if (.hasNext iter)
+ (let [init (.next iter)]
+ (loop [acc init]
+ (if ^boolean (.hasNext iter)
+ (let [nacc (f acc (.next iter))]
+ (if (reduced? nacc)
+ @nacc
+ (recur nacc)))
+ acc)))
+ (f))))
+ ([coll f init]
+ (let [iter (-iterator coll)]
+ (loop [acc init]
+ (if ^boolean (.hasNext iter)
+ (let [nacc (f acc (.next iter))]
+ (if (reduced? nacc)
+ @nacc
+ (recur nacc)))
+ acc)))))
+
+(defn reduce
+ "f should be a function of 2 arguments. If val is not supplied,
+ returns the result of applying f to the first 2 items in coll, then
+ applying f to that result and the 3rd item, etc. If coll contains no
+ items, f must accept no arguments as well, and reduce returns the
+ result of calling f with no arguments. If coll has only 1 item, it
+ is returned and f is not called. If val is supplied, returns the
+ result of applying f to val and the first item in coll, then
+ applying f to that result and the 2nd item, etc. If coll contains no
+ items, returns val and f is not called."
+ ([f coll]
+ (cond
+ (implements? IReduce coll)
+ (-reduce ^not-native coll f)
+
+ (array? coll)
+ (array-reduce coll f)
+
+ (string? coll)
+ (array-reduce coll f)
+
+ (native-satisfies? IReduce coll)
+ (-reduce coll f)
+
+ (iterable? coll)
+ (iter-reduce coll f)
+
+ :else
+ (seq-reduce f coll)))
+ ([f val coll]
+ (cond
+ (implements? IReduce coll)
+ (-reduce ^not-native coll f val)
+
+ (array? coll)
+ (array-reduce coll f val)
+
+ (string? coll)
+ (array-reduce coll f val)
+
+ (native-satisfies? IReduce coll)
+ (-reduce coll f val)
+
+ (iterable? coll)
+ (iter-reduce coll f val)
+
+ :else
+ (seq-reduce f val coll))))
+
+(defn reduce-kv
+ "Reduces an associative collection. f should be a function of 3
+ arguments. Returns the result of applying f to init, the first key
+ and the first value in coll, then applying f to that result and the
+ 2nd key and value, etc. If coll contains no entries, returns init
+ and f is not called. Note that reduce-kv is supported on vectors,
+ where the keys will be the ordinals."
+ ([f init coll]
+ (if-not (nil? coll)
+ (-kv-reduce coll f init)
+ init)))
+
+(defn identity
+ "Returns its argument."
+ [x] x)
+
+(defn completing
+ "Takes a reducing function f of 2 args and returns a fn suitable for
+ transduce by adding an arity-1 signature that calls cf (default -
+ identity) on the result argument."
+ ([f] (completing f identity))
+ ([f cf]
+ (fn
+ ([] (f))
+ ([x] (cf x))
+ ([x y] (f x y)))))
+
+(defn transduce
+ "reduce with a transformation of f (xf). If init is not
+ supplied, (f) will be called to produce it. f should be a reducing
+ step function that accepts both 1 and 2 arguments, if it accepts
+ only 2 you can add the arity-1 with 'completing'. Returns the result
+ of applying (the transformed) xf to init and the first item in coll,
+ then applying xf to that result and the 2nd item, etc. If coll
+ contains no items, returns init and f is not called. Note that
+ certain transforms may inject or skip items."
+ ([xform f coll] (transduce xform f (f) coll))
+ ([xform f init coll]
+ (let [f (xform f)
+ ret (reduce f init coll)]
+ (f ret))))
+
+;;; Math - variadic forms will not work until the following implemented:
+;;; first, next, reduce
+
+(defn ^number +
+ "Returns the sum of nums. (+) returns 0."
+ ([] 0)
+ ([x] x)
+ ([x y] (cljs.core/+ x y))
+ ([x y & more]
+ (reduce + (cljs.core/+ x y) more)))
+
+(defn ^number -
+ "If no ys are supplied, returns the negation of x, else subtracts
+ the ys from x and returns the result."
+ ([x] (cljs.core/- x))
+ ([x y] (cljs.core/- x y))
+ ([x y & more] (reduce - (cljs.core/- x y) more)))
+
+(defn ^number *
+ "Returns the product of nums. (*) returns 1."
+ ([] 1)
+ ([x] x)
+ ([x y] (cljs.core/* x y))
+ ([x y & more] (reduce * (cljs.core/* x y) more)))
+
+(declare divide)
+
+(defn ^number /
+ "If no denominators are supplied, returns 1/numerator,
+ else returns numerator divided by all of the denominators."
+ ([x] (/ 1 x))
+ ([x y] (cljs.core/divide x y)) ;; FIXME: waiting on cljs.core//
+ ([x y & more] (reduce / (/ x y) more)))
+
+(defn ^boolean <
+ "Returns non-nil if nums are in monotonically increasing order,
+ otherwise false."
+ ([x] true)
+ ([x y] (cljs.core/< x y))
+ ([x y & more]
+ (if (cljs.core/< x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (cljs.core/< y (first more)))
+ false)))
+
+(defn ^boolean <=
+ "Returns non-nil if nums are in monotonically non-decreasing order,
+ otherwise false."
+ ([x] true)
+ ([x y] (cljs.core/<= x y))
+ ([x y & more]
+ (if (cljs.core/<= x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (cljs.core/<= y (first more)))
+ false)))
+
+(defn ^boolean >
+ "Returns non-nil if nums are in monotonically decreasing order,
+ otherwise false."
+ ([x] true)
+ ([x y] (cljs.core/> x y))
+ ([x y & more]
+ (if (cljs.core/> x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (cljs.core/> y (first more)))
+ false)))
+
+(defn ^boolean >=
+ "Returns non-nil if nums are in monotonically non-increasing order,
+ otherwise false."
+ ([x] true)
+ ([x y] (cljs.core/>= x y))
+ ([x y & more]
+ (if (cljs.core/>= x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (cljs.core/>= y (first more)))
+ false)))
+
+(defn dec
+ "Returns a number one less than num."
+ [x] (- x 1))
+
+(defn ^number max
+ "Returns the greatest of the nums."
+ ([x] x)
+ ([x y] (cljs.core/max x y))
+ ([x y & more]
+ (reduce max (cljs.core/max x y) more)))
+
+(defn ^number min
+ "Returns the least of the nums."
+ ([x] x)
+ ([x y] (cljs.core/min x y))
+ ([x y & more]
+ (reduce min (cljs.core/min x y) more)))
+
+(defn ^number byte [x] x)
+
+(defn char
+ "Coerce to char"
+ [x]
+ (cond
+ (number? x) (.fromCharCode js/String x)
+ (and (string? x) (== (.-length x) 1)) x
+ :else (throw (js/Error. "Argument to char must be a character or number"))))
+
+(defn ^number short [x] x)
+(defn ^number float [x] x)
+(defn ^number double [x] x)
+
+(defn ^number unchecked-byte [x] x)
+(defn ^number unchecked-char [x] x)
+(defn ^number unchecked-short [x] x)
+(defn ^number unchecked-float [x] x)
+(defn ^number unchecked-double [x] x)
+
+(defn ^number unchecked-add
+ "Returns the sum of nums. (+) returns 0."
+ ([] 0)
+ ([x] x)
+ ([x y] (cljs.core/unchecked-add x y))
+ ([x y & more] (reduce unchecked-add (cljs.core/unchecked-add x y) more)))
+
+(defn ^number unchecked-add-int
+ "Returns the sum of nums. (+) returns 0."
+ ([] 0)
+ ([x] x)
+ ([x y] (cljs.core/unchecked-add-int x y))
+ ([x y & more] (reduce unchecked-add-int (cljs.core/unchecked-add-int x y) more)))
+
+(defn unchecked-dec
+ "Returns a number one less than x, an int."
+ [x]
+ (cljs.core/unchecked-dec x))
+
+(defn unchecked-dec-int
+ "Returns a number one less than x, an int."
+ [x]
+ (cljs.core/unchecked-dec-int x))
+
+(defn ^number unchecked-divide-int
+ "If no denominators are supplied, returns 1/numerator,
+ else returns numerator divided by all of the denominators."
+ ([x] (unchecked-divide-int 1 x))
+ ([x y] (cljs.core/divide x y)) ;; FIXME: waiting on cljs.core//
+ ([x y & more] (reduce unchecked-divide-int (unchecked-divide-int x y) more)))
+
+(defn unchecked-inc [x]
+ (cljs.core/unchecked-inc x))
+
+(defn unchecked-inc-int [x]
+ (cljs.core/unchecked-inc-int x))
+
+(defn ^number unchecked-multiply
+ "Returns the product of nums. (*) returns 1."
+ ([] 1)
+ ([x] x)
+ ([x y] (cljs.core/unchecked-multiply x y))
+ ([x y & more] (reduce unchecked-multiply (cljs.core/unchecked-multiply x y) more)))
+
+(defn ^number unchecked-multiply-int
+ "Returns the product of nums. (*) returns 1."
+ ([] 1)
+ ([x] x)
+ ([x y] (cljs.core/unchecked-multiply-int x y))
+ ([x y & more] (reduce unchecked-multiply-int (cljs.core/unchecked-multiply-int x y) more)))
+
+(defn unchecked-negate [x]
+ (cljs.core/unchecked-negate x))
+
+(defn unchecked-negate-int [x]
+ (cljs.core/unchecked-negate-int x))
+
+(declare mod)
+
+(defn unchecked-remainder-int [x n]
+ (cljs.core/unchecked-remainder-int x n))
+
+(defn ^number unchecked-subtract
+ "If no ys are supplied, returns the negation of x, else subtracts
+ the ys from x and returns the result."
+ ([x] (cljs.core/unchecked-subtract x))
+ ([x y] (cljs.core/unchecked-subtract x y))
+ ([x y & more] (reduce unchecked-subtract (cljs.core/unchecked-subtract x y) more)))
+
+(defn ^number unchecked-subtract-int
+ "If no ys are supplied, returns the negation of x, else subtracts
+ the ys from x and returns the result."
+ ([x] (cljs.core/unchecked-subtract-int x))
+ ([x y] (cljs.core/unchecked-subtract-int x y))
+ ([x y & more] (reduce unchecked-subtract-int (cljs.core/unchecked-subtract-int x y) more)))
+
+(defn- ^number fix [q]
+ (if (>= q 0)
+ (Math/floor q)
+ (Math/ceil q)))
+
+(defn int
+ "Coerce to int by stripping decimal places."
+ [x]
+ (bit-or x 0))
+
+(defn unchecked-int
+ "Coerce to int by stripping decimal places."
+ [x]
+ (fix x))
+
+(defn long
+ "Coerce to long by stripping decimal places. Identical to `int'."
+ [x]
+ (fix x))
+
+(defn unchecked-long
+ "Coerce to long by stripping decimal places. Identical to `int'."
+ [x]
+ (fix x))
+
+(defn booleans [x] x)
+(defn bytes [x] x)
+(defn chars [x] x)
+(defn shorts [x] x)
+(defn ints [x] x)
+(defn floats [x] x)
+(defn doubles [x] x)
+(defn longs [x] x)
+
+(defn js-mod
+ "Modulus of num and div with original javascript behavior. i.e. bug for negative numbers"
+ [n d]
+ (cljs.core/js-mod n d))
+
+(defn mod
+ "Modulus of num and div. Truncates toward negative infinity."
+ [n d]
+ (js-mod (+ (js-mod n d) d) d))
+
+(defn quot
+ "quot[ient] of dividing numerator by denominator."
+ [n d]
+ (let [rem (js-mod n d)]
+ (fix (/ (- n rem) d))))
+
+(defn rem
+ "remainder of dividing numerator by denominator."
+ [n d]
+ (let [q (quot n d)]
+ (- n (* d q))))
+
+(defn bit-xor
+ "Bitwise exclusive or"
+ ([x y] (cljs.core/bit-xor x y))
+ ([x y & more]
+ (reduce bit-xor (cljs.core/bit-xor x y) more)))
+
+(defn bit-and
+ "Bitwise and"
+ ([x y] (cljs.core/bit-and x y))
+ ([x y & more]
+ (reduce bit-and (cljs.core/bit-and x y) more)))
+
+(defn bit-or
+ "Bitwise or"
+ ([x y] (cljs.core/bit-or x y))
+ ([x y & more]
+ (reduce bit-or (cljs.core/bit-or x y) more)))
+
+(defn bit-and-not
+ "Bitwise and with complement"
+ ([x y] (cljs.core/bit-and-not x y))
+ ([x y & more]
+ (reduce bit-and-not (cljs.core/bit-and-not x y) more)))
+
+(defn bit-clear
+ "Clear bit at index n"
+ [x n]
+ (cljs.core/bit-clear x n))
+
+(defn bit-flip
+ "Flip bit at index n"
+ [x n]
+ (cljs.core/bit-flip x n))
+
+(defn bit-not
+ "Bitwise complement"
+ [x] (cljs.core/bit-not x))
+
+(defn bit-set
+ "Set bit at index n"
+ [x n]
+ (cljs.core/bit-set x n))
+
+(defn ^boolean bit-test
+ "Test bit at index n"
+ [x n]
+ (cljs.core/bit-test x n))
+
+(defn bit-shift-left
+ "Bitwise shift left"
+ [x n] (cljs.core/bit-shift-left x n))
+
+(defn bit-shift-right
+ "Bitwise shift right"
+ [x n] (cljs.core/bit-shift-right x n))
+
+(defn bit-shift-right-zero-fill
+ "DEPRECATED: Bitwise shift right with zero fill"
+ [x n] (cljs.core/bit-shift-right-zero-fill x n))
+
+(defn unsigned-bit-shift-right
+ "Bitwise shift right with zero fill"
+ [x n] (cljs.core/unsigned-bit-shift-right x n))
+
+(defn bit-count
+ "Counts the number of bits set in n"
+ [v]
+ (let [v (- v (bit-and (bit-shift-right v 1) 0x55555555))
+ v (+ (bit-and v 0x33333333) (bit-and (bit-shift-right v 2) 0x33333333))]
+ (bit-shift-right (* (bit-and (+ v (bit-shift-right v 4)) 0xF0F0F0F) 0x1010101) 24)))
+
+(defn ^boolean ==
+ "Returns non-nil if nums all have the equivalent
+ value, otherwise false. Behavior on non nums is
+ undefined."
+ ([x] true)
+ ([x y] (-equiv x y))
+ ([x y & more]
+ (if (== x y)
+ (if (next more)
+ (recur y (first more) (next more))
+ (== y (first more)))
+ false)))
+
+(defn ^boolean pos?
+ "Returns true if num is greater than zero, else false"
+ [x] (cljs.core/pos? x))
+
+(defn ^boolean zero?
+ "Returns true if num is zero, else false"
+ [x]
+ (cljs.core/zero? x))
+
+(defn ^boolean neg?
+ "Returns true if num is less than zero, else false"
+ [x] (cljs.core/neg? x))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; protocols for host types ;;;;;;
+
+(defn nthnext
+ "Returns the nth next of coll, (seq coll) when n is 0."
+ [coll n]
+ (loop [n n xs (seq coll)]
+ (if (and xs (pos? n))
+ (recur (dec n) (next xs))
+ xs)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;; basics ;;;;;;;;;;;;;;;;;;
+
+(defn str
+ "With no args, returns the empty string. With one arg x, returns
+ x.toString(). (str nil) returns the empty string. With more than
+ one arg, returns the concatenation of the str values of the args."
+ ([] "")
+ ([x] (if (nil? x)
+ ""
+ (.join #js [x] "")))
+ ([x & ys]
+ (loop [sb (StringBuffer. (str x)) more ys]
+ (if more
+ (recur (. sb (append (str (first more)))) (next more))
+ (.toString sb)))))
+
+(defn subs
+ "Returns the substring of s beginning at start inclusive, and ending
+ at end (defaults to length of string), exclusive."
+ ([s start] (.substring s start))
+ ([s start end] (.substring s start end)))
+
+(declare map name)
+
+(defn- equiv-sequential
+ "Assumes x is sequential. Returns true if x equals y, otherwise
+ returns false."
+ [x y]
+ (boolean
+ (when (sequential? y)
+ (if (and (counted? x) (counted? y)
+ (not (== (count x) (count y))))
+ false
+ (loop [xs (seq x) ys (seq y)]
+ (cond (nil? xs) (nil? ys)
+ (nil? ys) false
+ (= (first xs) (first ys)) (recur (next xs) (next ys))
+ :else false))))))
+
+(defn- hash-coll [coll]
+ (if (seq coll)
+ (loop [res (hash (first coll)) s (next coll)]
+ (if (nil? s)
+ res
+ (recur (hash-combine res (hash (first s))) (next s))))
+ 0))
+
+(declare key val)
+
+(defn- hash-imap [m]
+ ;; a la clojure.lang.APersistentMap
+ (loop [h 0 s (seq m)]
+ (if s
+ (let [e (first s)]
+ (recur (js-mod (+ h (bit-xor (hash (key e)) (hash (val e))))
+ 4503599627370496)
+ (next s)))
+ h)))
+
+(defn- hash-iset [s]
+ ;; a la clojure.lang.APersistentSet
+ (loop [h 0 s (seq s)]
+ (if s
+ (let [e (first s)]
+ (recur (js-mod (+ h (hash e)) 4503599627370496)
+ (next s)))
+ h)))
+
+(declare name chunk-first chunk-rest)
+
+(defn- extend-object!
+ "Takes a JavaScript object and a map of names to functions and
+ attaches said functions as methods on the object. Any references to
+ JavaScript's implicit this (via the this-as macro) will resolve to the
+ object that the function is attached."
+ [obj fn-map]
+ (doseq [[key-name f] fn-map]
+ (let [str-name (name key-name)]
+ (gobject/set obj str-name f)))
+ obj)
+
+;;;;;;;;;;;;;;;; cons ;;;;;;;;;;;;;;;;
+(deftype List [meta first rest count ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x count))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IList
+
+ ICloneable
+ (-clone [_] (List. meta first rest count __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (List. meta first rest count __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ASeq
+ ISeq
+ (-first [coll] first)
+ (-rest [coll]
+ (if (== count 1)
+ ()
+ rest))
+
+ INext
+ (-next [coll]
+ (if (== count 1)
+ nil
+ rest))
+
+ IStack
+ (-peek [coll] first)
+ (-pop [coll] (-rest coll))
+
+ ICollection
+ (-conj [coll o] (List. meta o coll (inc count) nil))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ICounted
+ (-count [coll] count)
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(defn ^boolean list?
+ "Returns true if x implements IList"
+ [x]
+ (satisfies? IList x))
+
+(es6-iterable List)
+
+(deftype EmptyList [meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IList
+
+ ICloneable
+ (-clone [_] (EmptyList. meta))
+
+ IWithMeta
+ (-with-meta [coll meta] (EmptyList. meta))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll] nil)
+ (-rest [coll] ())
+
+ INext
+ (-next [coll] nil)
+
+ IStack
+ (-peek [coll] nil)
+ (-pop [coll] (throw (js/Error. "Can't pop empty list")))
+
+ ICollection
+ (-conj [coll o] (List. meta o nil 1 nil))
+
+ IEmptyableCollection
+ (-empty [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other]
+ (if (or (list? other)
+ (sequential? other))
+ (nil? (seq other))
+ false))
+
+ IHash
+ (-hash [coll] empty-ordered-hash)
+
+ ISeqable
+ (-seq [coll] nil)
+
+ ICounted
+ (-count [coll] 0)
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(set! (.-EMPTY List) (EmptyList. nil))
+
+(es6-iterable EmptyList)
+
+(defn ^boolean reversible?
+ "Returns true if coll satisfies? IReversible."
+ [coll]
+ (satisfies? IReversible coll))
+
+(defn ^seq rseq
+ "Returns, in constant time, a seq of the items in rev (which
+ can be a vector or sorted-map), in reverse order. If rev is empty returns nil"
+ [rev]
+ (-rseq rev))
+
+(defn reverse
+ "Returns a seq of the items in coll in reverse order. Not lazy."
+ [coll]
+ (if (reversible? coll)
+ (or (rseq coll) ())
+ (reduce conj () coll)))
+
+(defn list
+ "Creates a new list containing the items."
+ [& xs]
+ (let [arr (if (and (instance? IndexedSeq xs) (zero? (.-i xs)))
+ (.-arr xs)
+ (let [arr (array)]
+ (loop [^not-native xs xs]
+ (if-not (nil? xs)
+ (do
+ (.push arr (-first xs))
+ (recur (-next xs)))
+ arr))))]
+ (loop [i (alength arr) ^not-native r ()]
+ (if (> i 0)
+ (recur (dec i) (-conj r (aget arr (dec i))))
+ r))))
+
+(deftype Cons [meta first rest ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IList
+
+ ICloneable
+ (-clone [_] (Cons. meta first rest __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (Cons. meta first rest __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ASeq
+ ISeq
+ (-first [coll] first)
+ (-rest [coll] (if (nil? rest) () rest))
+
+ INext
+ (-next [coll]
+ (if (nil? rest) nil (seq rest)))
+
+ ICollection
+ (-conj [coll o] (Cons. nil o coll nil))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable Cons)
+
+(defn cons
+ "Returns a new seq where x is the first element and coll is the rest."
+ [x coll]
+ (if (or (nil? coll)
+ (implements? ISeq coll))
+ (Cons. nil x coll nil)
+ (Cons. nil x (seq coll) nil)))
+
+(defn hash-keyword [k]
+ (int (+ (hash-symbol k) 0x9e3779b9)))
+
+(defn- compare-keywords [a b]
+ (cond
+ (identical? (.-fqn a) (.-fqn b)) 0
+ (and (not (.-ns a)) (.-ns b)) -1
+ (.-ns a) (if-not (.-ns b)
+ 1
+ (let [nsc (garray/defaultCompare (.-ns a) (.-ns b))]
+ (if (== 0 nsc)
+ (garray/defaultCompare (.-name a) (.-name b))
+ nsc)))
+ :default (garray/defaultCompare (.-name a) (.-name b))))
+
+(deftype Keyword [ns name fqn ^:mutable _hash]
+ Object
+ (toString [_] (str ":" fqn))
+ (equiv [this other]
+ (-equiv this other))
+
+ IEquiv
+ (-equiv [_ other]
+ (if (instance? Keyword other)
+ (identical? fqn (.-fqn other))
+ false))
+ IFn
+ (-invoke [kw coll]
+ (get coll kw))
+ (-invoke [kw coll not-found]
+ (get coll kw not-found))
+
+ IHash
+ (-hash [this]
+ (caching-hash this hash-keyword _hash))
+
+ INamed
+ (-name [_] name)
+ (-namespace [_] ns)
+
+ IPrintWithWriter
+ (-pr-writer [o writer _] (-write writer (str ":" fqn))))
+
+(defn ^boolean keyword?
+ "Return true if x is a Keyword"
+ [x]
+ (instance? Keyword x))
+
+(defn ^boolean keyword-identical?
+ "Efficient test to determine that two keywords are identical."
+ [x y]
+ (if (identical? x y)
+ true
+ (if (and (keyword? x) (keyword? y))
+ (identical? (.-fqn x) (.-fqn y))
+ false)))
+
+(defn ^boolean symbol-identical?
+ "Efficient test to determine that two symbols are identical."
+ [x y]
+ (if (identical? x y)
+ true
+ (if (and (symbol? x) (symbol? y))
+ (identical? (.-str x) (.-str y))
+ false)))
+
+(defn namespace
+ "Returns the namespace String of a symbol or keyword, or nil if not present."
+ [x]
+ (if (implements? INamed x)
+ (-namespace ^not-native x)
+ (throw (js/Error. (str "Doesn't support namespace: " x)))))
+
+(defn ^boolean ident?
+ "Return true if x is a symbol or keyword"
+ [x] (or (keyword? x) (symbol? x)))
+
+(defn ^boolean simple-ident?
+ "Return true if x is a symbol or keyword without a namespace"
+ [x] (and (ident? x) (nil? (namespace x))))
+
+(defn ^boolean qualified-ident?
+ "Return true if x is a symbol or keyword with a namespace"
+ [x] (boolean (and (ident? x) (namespace x) true)))
+
+(defn ^boolean simple-symbol?
+ "Return true if x is a symbol without a namespace"
+ [x] (and (symbol? x) (nil? (namespace x))))
+
+(defn ^boolean qualified-symbol?
+ "Return true if x is a symbol with a namespace"
+ [x] (boolean (and (symbol? x) (namespace x) true)))
+
+(defn ^boolean simple-keyword?
+ "Return true if x is a keyword without a namespace"
+ [x] (and (keyword? x) (nil? (namespace x))))
+
+(defn ^boolean qualified-keyword?
+ "Return true if x is a keyword with a namespace"
+ [x] (boolean (and (keyword? x) (namespace x) true)))
+
+(defn keyword
+ "Returns a Keyword with the given namespace and name. Do not use :
+ in the keyword strings, it will be added automatically."
+ ([name] (cond
+ (keyword? name) name
+ (symbol? name) (Keyword.
+ (cljs.core/namespace name)
+ (cljs.core/name name) (.-str name) nil)
+ (string? name) (let [parts (.split name "/")]
+ (if (== (alength parts) 2)
+ (Keyword. (aget parts 0) (aget parts 1) name nil)
+ (Keyword. nil (aget parts 0) name nil)))))
+ ([ns name]
+ (let [ns (cond
+ (keyword? ns) (cljs.core/name ns)
+ (symbol? ns) (cljs.core/name ns)
+ :else ns)
+ name (cond
+ (keyword? name) (cljs.core/name name)
+ (symbol? name) (cljs.core/name name)
+ :else name)]
+ (Keyword. ns name (str (when ns (str ns "/")) name) nil))))
+
+
+(deftype LazySeq [meta ^:mutable fn ^:mutable s ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (sval [coll]
+ (if (nil? fn)
+ s
+ (do
+ (set! s (fn))
+ (set! fn nil)
+ s)))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IPending
+ (-realized? [coll]
+ (not fn))
+
+ IWithMeta
+ (-with-meta [coll meta] (LazySeq. meta #(-seq coll) nil __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll]
+ (-seq coll)
+ (when-not (nil? s)
+ (first s)))
+ (-rest [coll]
+ (-seq coll)
+ (if-not (nil? s)
+ (rest s)
+ ()))
+
+ INext
+ (-next [coll]
+ (-seq coll)
+ (when-not (nil? s)
+ (next s)))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (.sval coll)
+ (when-not (nil? s)
+ (loop [ls s]
+ (if (instance? LazySeq ls)
+ (recur (.sval ls))
+ (do (set! s ls)
+ (seq s))))))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable LazySeq)
+
+(declare ArrayChunk)
+
+(deftype ChunkBuffer [^:mutable buf ^:mutable end]
+ Object
+ (add [_ o]
+ (aset buf end o)
+ (set! end (inc end)))
+
+ (chunk [_]
+ (let [ret (ArrayChunk. buf 0 end)]
+ (set! buf nil)
+ ret))
+
+ ICounted
+ (-count [_] end))
+
+(defn chunk-buffer [capacity]
+ (ChunkBuffer. (make-array capacity) 0))
+
+(deftype ArrayChunk [arr off end]
+ ICounted
+ (-count [_] (- end off))
+
+ IIndexed
+ (-nth [coll i]
+ (aget arr (+ off i)))
+ (-nth [coll i not-found]
+ (if (and (>= i 0) (< i (- end off)))
+ (aget arr (+ off i))
+ not-found))
+
+ IChunk
+ (-drop-first [coll]
+ (if (== off end)
+ (throw (js/Error. "-drop-first of empty chunk"))
+ (ArrayChunk. arr (inc off) end)))
+
+ IReduce
+ (-reduce [coll f]
+ (array-reduce arr f (aget arr off) (inc off)))
+ (-reduce [coll f start]
+ (array-reduce arr f start off)))
+
+(defn array-chunk
+ ([arr]
+ (ArrayChunk. arr 0 (alength arr)))
+ ([arr off]
+ (ArrayChunk. arr off (alength arr)))
+ ([arr off end]
+ (ArrayChunk. arr off end)))
+
+(deftype ChunkedCons [chunk more meta ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IWithMeta
+ (-with-meta [coll m]
+ (ChunkedCons. chunk more m __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ASeq
+ ISeq
+ (-first [coll] (-nth chunk 0))
+ (-rest [coll]
+ (if (> (-count chunk) 1)
+ (ChunkedCons. (-drop-first chunk) more meta nil)
+ (if (nil? more)
+ ()
+ more)))
+
+ INext
+ (-next [coll]
+ (if (> (-count chunk) 1)
+ (ChunkedCons. (-drop-first chunk) more meta nil)
+ (when-not (nil? more)
+ (-seq more))))
+
+ IChunkedSeq
+ (-chunked-first [coll] chunk)
+ (-chunked-rest [coll]
+ (if (nil? more)
+ ()
+ more))
+
+ IChunkedNext
+ (-chunked-next [coll]
+ (if (nil? more)
+ nil
+ more))
+
+ ICollection
+ (-conj [this o]
+ (cons o this))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash)))
+
+(es6-iterable ChunkedCons)
+
+(defn chunk-cons [chunk rest]
+ (if (zero? (-count chunk))
+ rest
+ (ChunkedCons. chunk rest nil nil)))
+
+(defn chunk-append [b x]
+ (.add b x))
+
+(defn chunk [b]
+ (.chunk b))
+
+(defn chunk-first [s]
+ (-chunked-first s))
+
+(defn chunk-rest [s]
+ (-chunked-rest s))
+
+(defn chunk-next [s]
+ (if (implements? IChunkedNext s)
+ (-chunked-next s)
+ (seq (-chunked-rest s))))
+
+;;;;;;;;;;;;;;;;
+
+(defn to-array
+ "Returns an array containing the contents of coll."
+ [coll]
+ (let [ary (array)]
+ (loop [s (seq coll)]
+ (if-not (nil? s)
+ (do (. ary push (first s))
+ (recur (next s)))
+ ary))))
+
+(defn to-array-2d
+ "Returns a (potentially-ragged) 2-dimensional array
+ containing the contents of coll."
+ [coll]
+ (let [ret (make-array (count coll))]
+ (loop [i 0 xs (seq coll)]
+ (when-not (nil? xs)
+ (aset ret i (to-array (first xs)))
+ (recur (inc i) (next xs))))
+ ret))
+
+(defn int-array
+ "Creates an array of ints. Does not coerce array, provided for compatibility
+ with Clojure."
+ ([size-or-seq]
+ (if (number? size-or-seq)
+ (int-array size-or-seq nil)
+ (into-array size-or-seq)))
+ ([size init-val-or-seq]
+ (let [a (make-array size)]
+ (if (seq? init-val-or-seq)
+ (let [s (seq init-val-or-seq)]
+ (loop [i 0 s s]
+ (if (and s (< i size))
+ (do
+ (aset a i (first s))
+ (recur (inc i) (next s)))
+ a)))
+ (do
+ (dotimes [i size]
+ (aset a i init-val-or-seq))
+ a)))))
+
+(defn long-array
+ "Creates an array of longs. Does not coerce array, provided for compatibility
+ with Clojure."
+ ([size-or-seq]
+ (if (number? size-or-seq)
+ (long-array size-or-seq nil)
+ (into-array size-or-seq)))
+ ([size init-val-or-seq]
+ (let [a (make-array size)]
+ (if (seq? init-val-or-seq)
+ (let [s (seq init-val-or-seq)]
+ (loop [i 0 s s]
+ (if (and s (< i size))
+ (do
+ (aset a i (first s))
+ (recur (inc i) (next s)))
+ a)))
+ (do
+ (dotimes [i size]
+ (aset a i init-val-or-seq))
+ a)))))
+
+(defn double-array
+ "Creates an array of doubles. Does not coerce array, provided for compatibility
+ with Clojure."
+ ([size-or-seq]
+ (if (number? size-or-seq)
+ (double-array size-or-seq nil)
+ (into-array size-or-seq)))
+ ([size init-val-or-seq]
+ (let [a (make-array size)]
+ (if (seq? init-val-or-seq)
+ (let [s (seq init-val-or-seq)]
+ (loop [i 0 s s]
+ (if (and s (< i size))
+ (do
+ (aset a i (first s))
+ (recur (inc i) (next s)))
+ a)))
+ (do
+ (dotimes [i size]
+ (aset a i init-val-or-seq))
+ a)))))
+
+(defn object-array
+ "Creates an array of objects. Does not coerce array, provided for compatibility
+ with Clojure."
+ ([size-or-seq]
+ (if (number? size-or-seq)
+ (object-array size-or-seq nil)
+ (into-array size-or-seq)))
+ ([size init-val-or-seq]
+ (let [a (make-array size)]
+ (if (seq? init-val-or-seq)
+ (let [s (seq init-val-or-seq)]
+ (loop [i 0 s s]
+ (if (and s (< i size))
+ (do
+ (aset a i (first s))
+ (recur (inc i) (next s)))
+ a)))
+ (do
+ (dotimes [i size]
+ (aset a i init-val-or-seq))
+ a)))))
+
+(defn bounded-count
+ "If coll is counted? returns its count, else will count at most the first n
+ elements of coll using its seq"
+ {:added "1.9"}
+ [n coll]
+ (if (counted? coll)
+ (count coll)
+ (loop [i 0 s (seq coll)]
+ (if (and (not (nil? s)) (< i n))
+ (recur (inc i) (next s))
+ i))))
+
+(defn spread
+ [arglist]
+ (when-not (nil? arglist)
+ (let [n (next arglist)]
+ (if (nil? n)
+ (seq (first arglist))
+ (cons (first arglist)
+ (spread n))))))
+
+(defn concat
+ "Returns a lazy seq representing the concatenation of the elements in the supplied colls."
+ ([] (lazy-seq nil))
+ ([x] (lazy-seq x))
+ ([x y]
+ (lazy-seq
+ (let [s (seq x)]
+ (if s
+ (if (chunked-seq? s)
+ (chunk-cons (chunk-first s) (concat (chunk-rest s) y))
+ (cons (first s) (concat (rest s) y)))
+ y))))
+ ([x y & zs]
+ (let [cat (fn cat [xys zs]
+ (lazy-seq
+ (let [xys (seq xys)]
+ (if xys
+ (if (chunked-seq? xys)
+ (chunk-cons (chunk-first xys)
+ (cat (chunk-rest xys) zs))
+ (cons (first xys) (cat (rest xys) zs)))
+ (when zs
+ (cat (first zs) (next zs)))))))]
+ (cat (concat x y) zs))))
+
+(defn list*
+ "Creates a new list containing the items prepended to the rest, the
+ last of which will be treated as a sequence."
+ ([args] (seq args))
+ ([a args] (cons a args))
+ ([a b args] (cons a (cons b args)))
+ ([a b c args] (cons a (cons b (cons c args))))
+ ([a b c d & more]
+ (cons a (cons b (cons c (cons d (spread more)))))))
+
+
+;;; Transients
+
+(defn transient
+ "Returns a new, transient version of the collection, in constant time."
+ [coll]
+ (-as-transient coll))
+
+(defn persistent!
+ "Returns a new, persistent version of the transient collection, in
+ constant time. The transient collection cannot be used after this
+ call, any such use will throw an exception."
+ [tcoll]
+ (-persistent! tcoll))
+
+(defn conj!
+ "Adds val to the transient collection, and return tcoll. The 'addition'
+ may happen at different 'places' depending on the concrete type."
+ ([] (transient []))
+ ([tcoll] tcoll)
+ ([tcoll val]
+ (-conj! tcoll val))
+ ([tcoll val & vals]
+ (let [ntcoll (-conj! tcoll val)]
+ (if vals
+ (recur ntcoll (first vals) (next vals))
+ ntcoll))))
+
+(defn assoc!
+ "When applied to a transient map, adds mapping of key(s) to
+ val(s). When applied to a transient vector, sets the val at index.
+ Note - index must be <= (count vector). Returns coll."
+ ([tcoll key val]
+ (-assoc! tcoll key val))
+ ([tcoll key val & kvs]
+ (let [ntcoll (-assoc! tcoll key val)]
+ (if kvs
+ (recur ntcoll (first kvs) (second kvs) (nnext kvs))
+ ntcoll))))
+
+(defn dissoc!
+ "Returns a transient map that doesn't contain a mapping for key(s)."
+ ([tcoll key]
+ (-dissoc! tcoll key))
+ ([tcoll key & ks]
+ (let [ntcoll (-dissoc! tcoll key)]
+ (if ks
+ (recur ntcoll (first ks) (next ks))
+ ntcoll))))
+
+(defn pop!
+ "Removes the last item from a transient vector. If
+ the collection is empty, throws an exception. Returns tcoll"
+ [tcoll]
+ (-pop! tcoll))
+
+(defn disj!
+ "disj[oin]. Returns a transient set of the same (hashed/sorted) type, that
+ does not contain key(s)."
+ ([tcoll val]
+ (-disjoin! tcoll val))
+ ([tcoll val & vals]
+ (let [ntcoll (-disjoin! tcoll val)]
+ (if vals
+ (recur ntcoll (first vals) (next vals))
+ ntcoll))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; apply ;;;;;;;;;;;;;;;;
+
+;; see core.clj
+(gen-apply-to)
+
+(set! *unchecked-if* true)
+
+(defn- apply-to-simple
+ "Internal. DO NOT USE!
+ Assumes args was already called with seq beforehand!"
+ ([f ^seq args]
+ (if (nil? args)
+ (if (.-cljs$core$IFn$_invoke$arity$0 f)
+ (.cljs$core$IFn$_invoke$arity$0 f)
+ (.call f f))
+ (apply-to-simple f (-first args) (next args))))
+ ([f a0 ^seq args]
+ (if (nil? args)
+ (if (.-cljs$core$IFn$_invoke$arity$1 f)
+ (.cljs$core$IFn$_invoke$arity$1 f a0)
+ (.call f f a0))
+ (apply-to-simple f a0 (-first args) (next args))))
+ ([f a0 a1 ^seq args]
+ (if (nil? args)
+ (if (.-cljs$core$IFn$_invoke$arity$2 f)
+ (.cljs$core$IFn$_invoke$arity$2 f a0 a1)
+ (.call f f a0 a1))
+ (apply-to-simple f a0 a1 (-first args) (next args))))
+ ([f a0 a1 a2 ^seq args]
+ (if (nil? args)
+ (if (.-cljs$core$IFn$_invoke$arity$3 f)
+ (.cljs$core$IFn$_invoke$arity$3 f a0 a1 a2)
+ (.call f f a0 a1 a2))
+ (apply-to-simple f a0 a1 a2 (-first args) (next args))))
+ ([f a0 a1 a2 a3 ^seq args]
+ (if (nil? args)
+ (if (.-cljs$core$IFn$_invoke$arity$4 f)
+ (.cljs$core$IFn$_invoke$arity$4 f a0 a1 a2 a3)
+ (.call f f a0 a1 a2 a3))
+ (gen-apply-to-simple f 4 args))))
+
+(defn apply
+ "Applies fn f to the argument list formed by prepending intervening arguments to args."
+ ([f args]
+ (if (.-cljs$lang$applyTo f)
+ (let [fixed-arity (.-cljs$lang$maxFixedArity f)
+ bc (bounded-count (inc fixed-arity) args)]
+ (if (<= bc fixed-arity)
+ (apply-to f bc args)
+ (.cljs$lang$applyTo f args)))
+ (apply-to-simple f (seq args))))
+ ([f x args]
+ (if (.-cljs$lang$applyTo f)
+ (let [arglist (list* x args)
+ fixed-arity (.-cljs$lang$maxFixedArity f)
+ bc (inc (bounded-count fixed-arity args))]
+ (if (<= bc fixed-arity)
+ (apply-to f bc arglist)
+ (.cljs$lang$applyTo f arglist)))
+ (apply-to-simple f x (seq args))))
+ ([f x y args]
+ (if (.-cljs$lang$applyTo f)
+ (let [arglist (list* x y args)
+ fixed-arity (.-cljs$lang$maxFixedArity f)
+ bc (+ 2 (bounded-count (dec fixed-arity) args))]
+ (if (<= bc fixed-arity)
+ (apply-to f bc arglist)
+ (.cljs$lang$applyTo f arglist)))
+ (apply-to-simple f x y (seq args))))
+ ([f x y z args]
+ (if (.-cljs$lang$applyTo f)
+ (let [arglist (list* x y z args)
+ fixed-arity (.-cljs$lang$maxFixedArity f)
+ bc (+ 3 (bounded-count (- fixed-arity 2) args))]
+ (if (<= bc fixed-arity)
+ (apply-to f bc arglist)
+ (.cljs$lang$applyTo f arglist)))
+ (apply-to-simple f x y z (seq args))))
+ ([f a b c d & args]
+ (if (.-cljs$lang$applyTo f)
+ (let [spread-args (spread args)
+ arglist (cons a (cons b (cons c (cons d spread-args))))
+ fixed-arity (.-cljs$lang$maxFixedArity f)
+ bc (+ 4 (bounded-count (- fixed-arity 3) spread-args))]
+ (if (<= bc fixed-arity)
+ (apply-to f bc arglist)
+ (.cljs$lang$applyTo f arglist)))
+ (apply-to-simple f a b c d (spread args)))))
+
+(set! *unchecked-if* false)
+
+(defn vary-meta
+ "Returns an object of the same type and value as obj, with
+ (apply f (meta obj) args) as its metadata."
+ ([obj f]
+ (with-meta obj (f (meta obj))))
+ ([obj f a]
+ (with-meta obj (f (meta obj) a)))
+ ([obj f a b]
+ (with-meta obj (f (meta obj) a b)))
+ ([obj f a b c]
+ (with-meta obj (f (meta obj) a b c)))
+ ([obj f a b c d]
+ (with-meta obj (f (meta obj) a b c d)))
+ ([obj f a b c d & args]
+ (with-meta obj (apply f (meta obj) a b c d args))))
+
+(defn ^boolean not=
+ "Same as (not (= obj1 obj2))"
+ ([x] false)
+ ([x y] (not (= x y)))
+ ([x y & more]
+ (not (apply = x y more))))
+
+(defn not-empty
+ "If coll is empty, returns nil, else coll"
+ [coll] (when (seq coll) coll))
+
+(defn nil-iter []
+ (reify
+ Object
+ (hasNext [_] false)
+ (next [_] (js/Error. "No such element"))
+ (remove [_] (js/Error. "Unsupported operation"))))
+
+(deftype StringIter [s ^:mutable i]
+ Object
+ (hasNext [_] (< i (.-length s)))
+ (next [_]
+ (let [ret (.charAt s i)]
+ (set! i (inc i))
+ ret))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(defn string-iter [x]
+ (StringIter. x 0))
+
+(deftype ArrayIter [arr ^:mutable i]
+ Object
+ (hasNext [_] (< i (alength arr)))
+ (next [_]
+ (let [ret (aget arr i)]
+ (set! i (inc i))
+ ret))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(defn array-iter [x]
+ (ArrayIter. x 0))
+
+(def INIT #js {})
+(def START #js {})
+
+(deftype SeqIter [^:mutable _seq ^:mutable _next]
+ Object
+ (hasNext [_]
+ (if (identical? _seq INIT)
+ (do
+ (set! _seq START)
+ (set! _next (seq _next)))
+ (if (identical? _seq _next)
+ (set! _next (next _seq))))
+ (not (nil? _next)))
+ (next [this]
+ (if-not ^boolean (.hasNext this)
+ (throw (js/Error. "No such element"))
+ (do
+ (set! _seq _next)
+ (first _next))))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(defn seq-iter [coll]
+ (SeqIter. INIT coll))
+
+(defn iter [coll]
+ (cond
+ (iterable? coll) (-iterator coll)
+ (nil? coll) (nil-iter)
+ (string? coll) (string-iter coll)
+ (array? coll) (array-iter coll)
+ (seqable? coll) (seq-iter coll)
+ :else (throw (js/Error. (str "Cannot create iterator from " coll)))))
+
+(deftype Many [vals]
+ Object
+ (add [this o]
+ (.push vals o)
+ this)
+ (remove [this]
+ (.shift vals))
+ (isEmpty [this]
+ (zero? (.-length vals)))
+ (toString [this]
+ (str "Many: " vals)))
+
+(def ^:private NONE #js {})
+
+(deftype Single [^:mutable val]
+ Object
+ (add [this o]
+ (if (identical? val NONE)
+ (do
+ (set! val o)
+ this)
+ (Many. #js [val o])))
+ (remove [this]
+ (if (identical? val NONE)
+ (throw (js/Error. (str "Removing object from empty buffer")))
+ (let [ret val]
+ (set! val NONE)
+ ret)))
+ (isEmpty [this]
+ (identical? val NONE))
+ (toString [this]
+ (str "Single: " val)))
+
+(deftype Empty []
+ Object
+ (add [this o]
+ (Single. o))
+ (remove [this]
+ (throw (js/Error. (str "Removing object from empty buffer"))))
+ (isEmpty [this]
+ true)
+ (toString [this]
+ "Empty"))
+
+(def ^:private EMPTY (Empty.))
+
+(deftype MultiIterator [iters]
+ Object
+ (hasNext [_]
+ (loop [iters (seq iters)]
+ (if-not (nil? iters)
+ (let [iter (first iters)]
+ (if-not ^boolean (.hasNext iter)
+ false
+ (recur (next iters))))
+ true)))
+ (next [_]
+ (let [nexts (array)]
+ (dotimes [i (alength iters)]
+ (aset nexts i (.next (aget iters i))))
+ (prim-seq nexts 0))))
+
+(defn- chunkIteratorSeq [iter]
+ (lazy-seq
+ (when ^boolean (.hasNext iter)
+ (let [arr (array)]
+ (loop [n 0]
+ (if (and (.hasNext iter) (< n 32))
+ (do
+ (aset arr n (.next iter))
+ (recur (inc n)))
+ (chunk-cons (array-chunk arr 0 n) (chunkIteratorSeq iter))))))))
+
+(deftype TransformerIterator [^:mutable buffer ^:mutable _next ^:mutable completed ^:mutable xf sourceIter multi]
+ Object
+ (step [this]
+ (if-not (identical? _next NONE)
+ true
+ (loop []
+ (if (identical? _next NONE)
+ (if ^boolean (.isEmpty buffer)
+ (if ^boolean completed
+ false
+ (if ^boolean (.hasNext sourceIter)
+ (let [iter (if ^boolean multi
+ (apply xf (cons nil (.next sourceIter)))
+ (xf nil (.next sourceIter)))]
+ (when (reduced? iter)
+ (xf nil)
+ (set! completed true))
+ (recur))
+ (do
+ (xf nil)
+ (set! completed true)
+ (recur))))
+ (do
+ (set! _next (.remove buffer))
+ (recur)))
+ true))))
+ (hasNext [this]
+ (.step this))
+ (next [this]
+ (if ^boolean (.hasNext this)
+ (let [ret _next]
+ (set! _next NONE)
+ ret)
+ (throw (js/Error. "No such element"))))
+ (remove [_]
+ (js/Error. "Unsupported operation")))
+
+(es6-iterable TransformerIterator)
+
+(defn transformer-iterator
+ [xform sourceIter multi]
+ (let [iterator (TransformerIterator. EMPTY NONE false nil sourceIter multi)]
+ (set! (.-xf iterator)
+ (xform (fn
+ ([] nil)
+ ([acc] acc)
+ ([acc o]
+ (set! (.-buffer iterator) (.add (.-buffer iterator) o))
+ acc))))
+ iterator))
+
+(set! (.-create TransformerIterator)
+ (fn [xform source]
+ (transformer-iterator xform source false)))
+
+(set! (.-createMulti TransformerIterator)
+ (fn [xform sources]
+ (transformer-iterator xform (MultiIterator. (to-array sources)) true)))
+
+(defn sequence
+ "Coerces coll to a (possibly empty) sequence, if it is not already
+ one. Will not force a lazy seq. (sequence nil) yields (), When a
+ transducer is supplied, returns a lazy sequence of applications of
+ the transform to the items in coll(s), i.e. to the set of first
+ items of each coll, followed by the set of second
+ items in each coll, until any one of the colls is exhausted. Any
+ remaining items in other colls are ignored. The transform should accept
+ number-of-colls arguments"
+ ([coll]
+ (if (seq? coll)
+ coll
+ (or (seq coll) ())))
+ ([xform coll]
+ (or (chunkIteratorSeq
+ (.create TransformerIterator xform (iter coll)))
+ ()))
+ ([xform coll & colls]
+ (or (chunkIteratorSeq
+ (.createMulti TransformerIterator xform (map iter (cons coll colls))))
+ ())))
+
+(defn ^boolean every?
+ "Returns true if (pred x) is logical true for every x in coll, else
+ false."
+ [pred coll]
+ (cond
+ (nil? (seq coll)) true
+ (pred (first coll)) (recur pred (next coll))
+ :else false))
+
+(defn ^boolean not-every?
+ "Returns false if (pred x) is logical true for every x in
+ coll, else true."
+ [pred coll] (not (every? pred coll)))
+
+(defn some
+ "Returns the first logical true value of (pred x) for any x in coll,
+ else nil. One common idiom is to use a set as pred, for example
+ this will return :fred if :fred is in the sequence, otherwise nil:
+ (some #{:fred} coll)"
+ [pred coll]
+ (when (seq coll)
+ (or (pred (first coll)) (recur pred (next coll)))))
+
+(defn ^boolean not-any?
+ "Returns false if (pred x) is logical true for any x in coll,
+ else true."
+ [pred coll] (not (some pred coll)))
+
+(defn ^boolean even?
+ "Returns true if n is even, throws an exception if n is not an integer"
+ [n] (if (integer? n)
+ (zero? (bit-and n 1))
+ (throw (js/Error. (str "Argument must be an integer: " n)))))
+
+(defn ^boolean odd?
+ "Returns true if n is odd, throws an exception if n is not an integer"
+ [n] (not (even? n)))
+
+(defn complement
+ "Takes a fn f and returns a fn that takes the same arguments as f,
+ has the same effects, if any, and returns the opposite truth value."
+ [f]
+ (fn
+ ([] (not (f)))
+ ([x] (not (f x)))
+ ([x y] (not (f x y)))
+ ([x y & zs] (not (apply f x y zs)))))
+
+(defn constantly
+ "Returns a function that takes any number of arguments and returns x."
+ [x] (fn [& args] x))
+
+(defn comp
+ "Takes a set of functions and returns a fn that is the composition
+ of those fns. The returned fn takes a variable number of args,
+ applies the rightmost of fns to the args, the next
+ fn (right-to-left) to the result, etc."
+ ([] identity)
+ ([f] f)
+ ([f g]
+ (fn
+ ([] (f (g)))
+ ([x] (f (g x)))
+ ([x y] (f (g x y)))
+ ([x y z] (f (g x y z)))
+ ([x y z & args] (f (apply g x y z args)))))
+ ([f g h]
+ (fn
+ ([] (f (g (h))))
+ ([x] (f (g (h x))))
+ ([x y] (f (g (h x y))))
+ ([x y z] (f (g (h x y z))))
+ ([x y z & args] (f (g (apply h x y z args))))))
+ ([f1 f2 f3 & fs]
+ (let [fs (reverse (list* f1 f2 f3 fs))]
+ (fn [& args]
+ (loop [ret (apply (first fs) args) fs (next fs)]
+ (if fs
+ (recur ((first fs) ret) (next fs))
+ ret))))))
+
+(defn partial
+ "Takes a function f and fewer than the normal arguments to f, and
+ returns a fn that takes a variable number of additional args. When
+ called, the returned function calls f with args + additional args."
+ ([f] f)
+ ([f arg1]
+ (fn
+ ([] (f arg1))
+ ([x] (f arg1 x))
+ ([x y] (f arg1 x y))
+ ([x y z] (f arg1 x y z))
+ ([x y z & args] (apply f arg1 x y z args))))
+ ([f arg1 arg2]
+ (fn
+ ([] (f arg1 arg2))
+ ([x] (f arg1 arg2 x))
+ ([x y] (f arg1 arg2 x y))
+ ([x y z] (f arg1 arg2 x y z))
+ ([x y z & args] (apply f arg1 arg2 x y z args))))
+ ([f arg1 arg2 arg3]
+ (fn
+ ([] (f arg1 arg2 arg3))
+ ([x] (f arg1 arg2 arg3 x))
+ ([x y] (f arg1 arg2 arg3 x y))
+ ([x y z] (f arg1 arg2 arg3 x y z))
+ ([x y z & args] (apply f arg1 arg2 arg3 x y z args))))
+ ([f arg1 arg2 arg3 & more]
+ (fn [& args] (apply f arg1 arg2 arg3 (concat more args)))))
+
+(defn fnil
+ "Takes a function f, and returns a function that calls f, replacing
+ a nil first argument to f with the supplied value x. Higher arity
+ versions can replace arguments in the second and third
+ positions (y, z). Note that the function f can take any number of
+ arguments, not just the one(s) being nil-patched."
+ ([f x]
+ (fn
+ ([a] (f (if (nil? a) x a)))
+ ([a b] (f (if (nil? a) x a) b))
+ ([a b c] (f (if (nil? a) x a) b c))
+ ([a b c & ds] (apply f (if (nil? a) x a) b c ds))))
+ ([f x y]
+ (fn
+ ([a b] (f (if (nil? a) x a) (if (nil? b) y b)))
+ ([a b c] (f (if (nil? a) x a) (if (nil? b) y b) c))
+ ([a b c & ds] (apply f (if (nil? a) x a) (if (nil? b) y b) c ds))))
+ ([f x y z]
+ (fn
+ ([a b] (f (if (nil? a) x a) (if (nil? b) y b)))
+ ([a b c] (f (if (nil? a) x a) (if (nil? b) y b) (if (nil? c) z c)))
+ ([a b c & ds] (apply f (if (nil? a) x a) (if (nil? b) y b) (if (nil? c) z c) ds)))))
+
+(declare volatile!)
+
+(defn map-indexed
+ "Returns a lazy sequence consisting of the result of applying f to 0
+ and the first item of coll, followed by applying f to 1 and the second
+ item in coll, etc, until coll is exhausted. Thus function f should
+ accept 2 arguments, index and item. Returns a stateful transducer when
+ no collection is provided."
+ ([f]
+ (fn [rf]
+ (let [i (volatile! -1)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (rf result (f (vswap! i inc) input)))))))
+ ([f coll]
+ (letfn [(mapi [idx coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (if (chunked-seq? s)
+ (let [c (chunk-first s)
+ size (count c)
+ b (chunk-buffer size)]
+ (dotimes [i size]
+ (chunk-append b (f (+ idx i) (-nth c i))))
+ (chunk-cons (chunk b) (mapi (+ idx size) (chunk-rest s))))
+ (cons (f idx (first s)) (mapi (inc idx) (rest s)))))))]
+ (mapi 0 coll))))
+
+(defn keep
+ "Returns a lazy sequence of the non-nil results of (f item). Note,
+ this means false return values will be included. f must be free of
+ side-effects. Returns a transducer when no collection is provided."
+ ([f]
+ (fn [rf]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [v (f input)]
+ (if (nil? v)
+ result
+ (rf result v)))))))
+ ([f coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (if (chunked-seq? s)
+ (let [c (chunk-first s)
+ size (count c)
+ b (chunk-buffer size)]
+ (dotimes [i size]
+ (let [x (f (-nth c i))]
+ (when-not (nil? x)
+ (chunk-append b x))))
+ (chunk-cons (chunk b) (keep f (chunk-rest s))))
+ (let [x (f (first s))]
+ (if (nil? x)
+ (keep f (rest s))
+ (cons x (keep f (rest s))))))))))
+
+;; =============================================================================
+;; Atom
+
+(deftype Atom [state meta validator watches]
+ Object
+ (equiv [this other]
+ (-equiv this other))
+
+ IAtom
+
+ IEquiv
+ (-equiv [o other] (identical? o other))
+
+ IDeref
+ (-deref [_] state)
+
+ IMeta
+ (-meta [_] meta)
+
+ IWatchable
+ (-notify-watches [this oldval newval]
+ (doseq [[key f] watches]
+ (f key this oldval newval)))
+ (-add-watch [this key f]
+ (set! (.-watches this) (assoc watches key f))
+ this)
+ (-remove-watch [this key]
+ (set! (.-watches this) (dissoc watches key)))
+
+ IHash
+ (-hash [this] (goog/getUid this)))
+
+(defn atom
+ "Creates and returns an Atom with an initial value of x and zero or
+ more options (in any order):
+
+ :meta metadata-map
+
+ :validator validate-fn
+
+ If metadata-map is supplied, it will be come the metadata on the
+ atom. validate-fn must be nil or a side-effect-free fn of one
+ argument, which will be passed the intended new state on any state
+ change. If the new state is unacceptable, the validate-fn should
+ return false or throw an Error. If either of these error conditions
+ occur, then the value of the atom will not change."
+ ([x] (Atom. x nil nil nil))
+ ([x & {:keys [meta validator]}] (Atom. x meta validator nil)))
+
+(declare pr-str)
+
+(defn reset!
+ "Sets the value of atom to newval without regard for the
+ current value. Returns new-value."
+ [a new-value]
+ (if (instance? Atom a)
+ (let [validate (.-validator a)]
+ (when-not (nil? validate)
+ (when-not (validate new-value)
+ (throw (js/Error. "Validator rejected reference state"))))
+ (let [old-value (.-state a)]
+ (set! (.-state a) new-value)
+ (when-not (nil? (.-watches a))
+ (-notify-watches a old-value new-value))
+ new-value))
+ (-reset! a new-value)))
+
+(defn reset-vals!
+ "Sets the value of atom to newval. Returns [old new], the value of the
+ atom before and after the reset."
+ {:added "1.9"}
+ [a new-value]
+ (let [validate (.-validator a)]
+ (when-not (nil? validate)
+ (when-not (validate new-value)
+ (throw (js/Error. "Validator rejected reference state"))))
+ (let [old-value (.-state a)]
+ (set! (.-state a) new-value)
+ (when-not (nil? (.-watches a))
+ (-notify-watches a old-value new-value))
+ [old-value new-value])))
+
+(defn swap!
+ "Atomically swaps the value of atom to be:
+ (apply f current-value-of-atom args). Note that f may be called
+ multiple times, and thus should be free of side effects. Returns
+ the value that was swapped in."
+ ([a f]
+ (if (instance? Atom a)
+ (reset! a (f (.-state a)))
+ (-swap! a f)))
+ ([a f x]
+ (if (instance? Atom a)
+ (reset! a (f (.-state a) x))
+ (-swap! a f x)))
+ ([a f x y]
+ (if (instance? Atom a)
+ (reset! a (f (.-state a) x y))
+ (-swap! a f x y)))
+ ([a f x y & more]
+ (if (instance? Atom a)
+ (reset! a (apply f (.-state a) x y more))
+ (-swap! a f x y more))))
+
+(defn swap-vals!
+ "Atomically swaps the value of atom to be:
+ (apply f current-value-of-atom args). Note that f may be called
+ multiple times, and thus should be free of side effects.
+ Returns [old new], the value of the atom before and after the swap."
+ {:added "1.9"}
+ ([a f]
+ (reset-vals! a (f (.-state a))))
+ ([a f x]
+ (reset-vals! a (f (.-state a) x)))
+ ([a f x y]
+ (reset-vals! a (f (.-state a) x y)))
+ ([a f x y & more]
+ (reset-vals! a (apply f (.-state a) x y more))))
+
+(defn compare-and-set!
+ "Atomically sets the value of atom to newval if and only if the
+ current value of the atom is equal to oldval. Returns true if
+ set happened, else false."
+ [^not-native a oldval newval]
+ (if (= (-deref a) oldval)
+ (do (reset! a newval) true)
+ false))
+
+(defn set-validator!
+ "Sets the validator-fn for an atom. validator-fn must be nil or a
+ side-effect-free fn of one argument, which will be passed the intended
+ new state on any state change. If the new state is unacceptable, the
+ validator-fn should return false or throw an Error. If the current state
+ is not acceptable to the new validator, an Error will be thrown and the
+ validator will not be changed."
+ [iref val]
+ (when (and (some? val)
+ (not (val (-deref iref))))
+ (throw (js/Error. "Validator rejected reference state")))
+ (set! (.-validator iref) val))
+
+(defn get-validator
+ "Gets the validator-fn for a var/ref/agent/atom."
+ [iref]
+ (.-validator iref))
+
+(deftype Volatile [^:mutable state]
+ IVolatile
+ (-vreset! [_ new-state]
+ (set! state new-state))
+
+ IDeref
+ (-deref [_] state))
+
+(defn volatile!
+ "Creates and returns a Volatile with an initial value of val."
+ [val]
+ (Volatile. val))
+
+(defn ^boolean volatile?
+ "Returns true if x is a volatile."
+ [x] (instance? Volatile x))
+
+(defn vreset!
+ "Sets the value of volatile to newval without regard for the
+ current value. Returns newval."
+ [vol newval] (-vreset! vol newval))
+
+(defn keep-indexed
+ "Returns a lazy sequence of the non-nil results of (f index item). Note,
+ this means false return values will be included. f must be free of
+ side-effects. Returns a stateful transducer when no collection is
+ provided."
+ ([f]
+ (fn [rf]
+ (let [ia (volatile! -1)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [i (vswap! ia inc)
+ v (f i input)]
+ (if (nil? v)
+ result
+ (rf result v))))))))
+ ([f coll]
+ (letfn [(keepi [idx coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (if (chunked-seq? s)
+ (let [c (chunk-first s)
+ size (count c)
+ b (chunk-buffer size)]
+ (dotimes [i size]
+ (let [x (f (+ idx i) (-nth c i))]
+ (when-not (nil? x)
+ (chunk-append b x))))
+ (chunk-cons (chunk b) (keepi (+ idx size) (chunk-rest s))))
+ (let [x (f idx (first s))]
+ (if (nil? x)
+ (keepi (inc idx) (rest s))
+ (cons x (keepi (inc idx) (rest s)))))))))]
+ (keepi 0 coll))))
+
+(defn every-pred
+ "Takes a set of predicates and returns a function f that returns true if all of its
+ composing predicates return a logical true value against all of its arguments, else it returns
+ false. Note that f is short-circuiting in that it will stop execution on the first
+ argument that triggers a logical false result against the original predicates."
+ ([p]
+ (fn ep1
+ ([] true)
+ ([x] (boolean (p x)))
+ ([x y] (boolean (and (p x) (p y))))
+ ([x y z] (boolean (and (p x) (p y) (p z))))
+ ([x y z & args] (boolean (and (ep1 x y z)
+ (every? p args))))))
+ ([p1 p2]
+ (fn ep2
+ ([] true)
+ ([x] (boolean (and (p1 x) (p2 x))))
+ ([x y] (boolean (and (p1 x) (p1 y) (p2 x) (p2 y))))
+ ([x y z] (boolean (and (p1 x) (p1 y) (p1 z) (p2 x) (p2 y) (p2 z))))
+ ([x y z & args] (boolean (and (ep2 x y z)
+ (every? #(and (p1 %) (p2 %)) args))))))
+ ([p1 p2 p3]
+ (fn ep3
+ ([] true)
+ ([x] (boolean (and (p1 x) (p2 x) (p3 x))))
+ ([x y] (boolean (and (p1 x) (p2 x) (p3 x) (p1 y) (p2 y) (p3 y))))
+ ([x y z] (boolean (and (p1 x) (p2 x) (p3 x) (p1 y) (p2 y) (p3 y) (p1 z) (p2 z) (p3 z))))
+ ([x y z & args] (boolean (and (ep3 x y z)
+ (every? #(and (p1 %) (p2 %) (p3 %)) args))))))
+ ([p1 p2 p3 & ps]
+ (let [ps (list* p1 p2 p3 ps)]
+ (fn epn
+ ([] true)
+ ([x] (every? #(% x) ps))
+ ([x y] (every? #(and (% x) (% y)) ps))
+ ([x y z] (every? #(and (% x) (% y) (% z)) ps))
+ ([x y z & args] (boolean (and (epn x y z)
+ (every? #(every? % args) ps))))))))
+
+(defn some-fn
+ "Takes a set of predicates and returns a function f that returns the first logical true value
+ returned by one of its composing predicates against any of its arguments, else it returns
+ logical false. Note that f is short-circuiting in that it will stop execution on the first
+ argument that triggers a logical true result against the original predicates."
+ ([p]
+ (fn sp1
+ ([] nil)
+ ([x] (p x))
+ ([x y] (or (p x) (p y)))
+ ([x y z] (or (p x) (p y) (p z)))
+ ([x y z & args] (or (sp1 x y z)
+ (some p args)))))
+ ([p1 p2]
+ (fn sp2
+ ([] nil)
+ ([x] (or (p1 x) (p2 x)))
+ ([x y] (or (p1 x) (p1 y) (p2 x) (p2 y)))
+ ([x y z] (or (p1 x) (p1 y) (p1 z) (p2 x) (p2 y) (p2 z)))
+ ([x y z & args] (or (sp2 x y z)
+ (some #(or (p1 %) (p2 %)) args)))))
+ ([p1 p2 p3]
+ (fn sp3
+ ([] nil)
+ ([x] (or (p1 x) (p2 x) (p3 x)))
+ ([x y] (or (p1 x) (p2 x) (p3 x) (p1 y) (p2 y) (p3 y)))
+ ([x y z] (or (p1 x) (p2 x) (p3 x) (p1 y) (p2 y) (p3 y) (p1 z) (p2 z) (p3 z)))
+ ([x y z & args] (or (sp3 x y z)
+ (some #(or (p1 %) (p2 %) (p3 %)) args)))))
+ ([p1 p2 p3 & ps]
+ (let [ps (list* p1 p2 p3 ps)]
+ (fn spn
+ ([] nil)
+ ([x] (some #(% x) ps))
+ ([x y] (some #(or (% x) (% y)) ps))
+ ([x y z] (some #(or (% x) (% y) (% z)) ps))
+ ([x y z & args] (or (spn x y z)
+ (some #(some % args) ps)))))))
+
+(defn map
+ "Returns a lazy sequence consisting of the result of applying f to
+ the set of first items of each coll, followed by applying f to the
+ set of second items in each coll, until any one of the colls is
+ exhausted. Any remaining items in other colls are ignored. Function
+ f should accept number-of-colls arguments. Returns a transducer when
+ no collection is provided."
+ ([f]
+ (fn [rf]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (rf result (f input)))
+ ([result input & inputs]
+ (rf result (apply f input inputs))))))
+ ([f coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (if (chunked-seq? s)
+ (let [c (chunk-first s)
+ size (count c)
+ b (chunk-buffer size)]
+ (dotimes [i size]
+ (chunk-append b (f (-nth c i))))
+ (chunk-cons (chunk b) (map f (chunk-rest s))))
+ (cons (f (first s)) (map f (rest s)))))))
+ ([f c1 c2]
+ (lazy-seq
+ (let [s1 (seq c1) s2 (seq c2)]
+ (when (and s1 s2)
+ (cons (f (first s1) (first s2))
+ (map f (rest s1) (rest s2)))))))
+ ([f c1 c2 c3]
+ (lazy-seq
+ (let [s1 (seq c1) s2 (seq c2) s3 (seq c3)]
+ (when (and s1 s2 s3)
+ (cons (f (first s1) (first s2) (first s3))
+ (map f (rest s1) (rest s2) (rest s3)))))))
+ ([f c1 c2 c3 & colls]
+ (let [step (fn step [cs]
+ (lazy-seq
+ (let [ss (map seq cs)]
+ (when (every? identity ss)
+ (cons (map first ss) (step (map rest ss)))))))]
+ (map #(apply f %) (step (conj colls c3 c2 c1))))))
+
+(defn take
+ "Returns a lazy sequence of the first n items in coll, or all items if
+ there are fewer than n. Returns a stateful transducer when
+ no collection is provided."
+ ([n]
+ {:pre [(number? n)]}
+ (fn [rf]
+ (let [na (volatile! n)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [n @na
+ nn (vswap! na dec)
+ result (if (pos? n)
+ (rf result input)
+ result)]
+ (if (not (pos? nn))
+ (ensure-reduced result)
+ result)))))))
+ ([n coll]
+ {:pre [(number? n)]}
+ (lazy-seq
+ (when (pos? n)
+ (when-let [s (seq coll)]
+ (cons (first s) (take (dec n) (rest s))))))))
+
+(defn drop
+ "Returns a lazy sequence of all but the first n items in coll.
+ Returns a stateful transducer when no collection is provided."
+ ([n]
+ {:pre [(number? n)]}
+ (fn [rf]
+ (let [na (volatile! n)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [n @na]
+ (vswap! na dec)
+ (if (pos? n)
+ result
+ (rf result input))))))))
+ ([n coll]
+ {:pre [(number? n)]}
+ (let [step (fn [n coll]
+ (let [s (seq coll)]
+ (if (and (pos? n) s)
+ (recur (dec n) (rest s))
+ s)))]
+ (lazy-seq (step n coll)))))
+
+(defn drop-last
+ "Return a lazy sequence of all but the last n (default 1) items in coll"
+ ([s] (drop-last 1 s))
+ ([n s] (map (fn [x _] x) s (drop n s))))
+
+(defn take-last
+ "Returns a seq of the last n items in coll. Depending on the type
+ of coll may be no better than linear time. For vectors, see also subvec."
+ [n coll]
+ (loop [s (seq coll), lead (seq (drop n coll))]
+ (if lead
+ (recur (next s) (next lead))
+ s)))
+
+(defn drop-while
+ "Returns a lazy sequence of the items in coll starting from the
+ first item for which (pred item) returns logical false. Returns a
+ stateful transducer when no collection is provided."
+ ([pred]
+ (fn [rf]
+ (let [da (volatile! true)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [drop? @da]
+ (if (and drop? (pred input))
+ result
+ (do
+ (vreset! da nil)
+ (rf result input)))))))))
+ ([pred coll]
+ (let [step (fn [pred coll]
+ (let [s (seq coll)]
+ (if (and s (pred (first s)))
+ (recur pred (rest s))
+ s)))]
+ (lazy-seq (step pred coll)))))
+
+(deftype Cycle [meta all prev ^:mutable current ^:mutable _next]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (currentval [coll]
+ (when-not ^seq current
+ (if-let [c (next prev)]
+ (set! current c)
+ (set! current all)))
+ current)
+
+ IPending
+ (-realized? [coll]
+ (some? current))
+
+ IWithMeta
+ (-with-meta [coll meta] (Cycle. meta all prev current _next))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll]
+ (first (.currentval coll)))
+ (-rest [coll]
+ (when (nil? _next)
+ (set! _next (Cycle. nil all (.currentval coll) nil nil)))
+ _next)
+
+ INext
+ (-next [coll]
+ (-rest coll))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ ISequential
+ ISeqable
+ (-seq [coll] coll)
+
+ IReduce
+ (-reduce [coll f]
+ (loop [s (.currentval coll) ret (first s)]
+ (let [s (or (next s) all)
+ ret (f ret (first s))]
+ (if (reduced? ret)
+ @ret
+ (recur s ret)))))
+ (-reduce [coll f start]
+ (loop [s (.currentval coll) ret start]
+ (let [ret (f ret (first s))]
+ (if (reduced? ret)
+ @ret
+ (recur (or (next s) all) ret))))))
+
+(defn cycle
+ "Returns a lazy (infinite!) sequence of repetitions of the items in coll."
+ [coll] (if-let [vals (seq coll)]
+ (Cycle. nil vals nil vals nil)
+ (.-EMPTY List)))
+
+(defn split-at
+ "Returns a vector of [(take n coll) (drop n coll)]"
+ [n coll]
+ [(take n coll) (drop n coll)])
+
+(deftype Repeat [meta count val ^:mutable next ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x count))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IPending
+ (-realized? [coll] false)
+
+ IWithMeta
+ (-with-meta [coll meta] (Repeat. meta count val next nil))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll]
+ val)
+ (-rest [coll]
+ (if (nil? next)
+ (if (> count 1)
+ (do
+ (set! next (Repeat. nil (dec count) val nil nil))
+ next)
+ (if (== -1 count)
+ coll
+ ()))
+ next))
+
+ INext
+ (-next [coll]
+ (if (nil? next)
+ (if (> count 1)
+ (do
+ (set! next (Repeat. nil (dec count) val nil nil))
+ next)
+ (if (== -1 count)
+ coll
+ nil))
+ next))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISequential
+ ISeqable
+ (-seq [coll] coll)
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IReduce
+ (-reduce [coll f]
+ (if (== count -1)
+ (loop [ret (f val val)]
+ (if (reduced? ret)
+ @ret
+ (recur (f ret val))))
+ (loop [i 1 ret val]
+ (if (< i count)
+ (let [ret (f ret val)]
+ (if (reduced? ret)
+ @ret
+ (recur (inc i) ret)))
+ ret))))
+ (-reduce [coll f start]
+ (if (== count -1)
+ (loop [ret (f start val)]
+ (if (reduced? ret)
+ @ret
+ (recur (f ret val))))
+ (loop [i 0 ret start]
+ (if (< i count)
+ (let [ret (f ret val)]
+ (if (reduced? ret)
+ @ret
+ (recur (inc i) ret)))
+ ret)))))
+
+(defn repeat
+ "Returns a lazy (infinite!, or length n if supplied) sequence of xs."
+ ([x] (Repeat. nil -1 x nil nil))
+ ([n x] (if (pos? n)
+ (Repeat. nil n x nil nil)
+ (.-EMPTY List))))
+
+(defn replicate
+ "DEPRECATED: Use 'repeat' instead.
+ Returns a lazy seq of n xs."
+ [n x] (take n (repeat x)))
+
+(defn repeatedly
+ "Takes a function of no args, presumably with side effects, and
+ returns an infinite (or length n if supplied) lazy sequence of calls
+ to it"
+ ([f] (lazy-seq (cons (f) (repeatedly f))))
+ ([n f] (take n (repeatedly f))))
+
+(def ^:private UNREALIZED-SEED #js {})
+
+(deftype Iterate [meta f prev-seed ^:mutable seed ^:mutable next]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+
+ IPending
+ (-realized? [coll]
+ (not (identical? seed UNREALIZED-SEED)))
+
+ IWithMeta
+ (-with-meta [coll meta] (Iterate. meta f prev-seed seed next))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll]
+ (when (identical? UNREALIZED-SEED seed)
+ (set! seed (f prev-seed)))
+ seed)
+ (-rest [coll]
+ (when (nil? next)
+ (set! next (Iterate. nil f (-first coll) UNREALIZED-SEED nil)))
+ next)
+
+ INext
+ (-next [coll]
+ (-rest coll))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ ISequential
+ ISeqable
+ (-seq [coll] coll)
+
+ IReduce
+ (-reduce [coll rf]
+ (let [first (-first coll)
+ v (f first)]
+ (loop [ret (rf first v) v v]
+ (if (reduced? ret)
+ @ret
+ (let [v (f v)]
+ (recur (rf ret v) v))))))
+ (-reduce [coll rf start]
+ (let [v (-first coll)]
+ (loop [ret (rf start v) v v]
+ (if (reduced? ret)
+ @ret
+ (let [v (f v)]
+ (recur (rf ret v) v)))))))
+
+(defn iterate
+ "Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects"
+ {:added "1.0"}
+ [f x] (Iterate. nil f nil x nil))
+
+(defn interleave
+ "Returns a lazy seq of the first item in each coll, then the second etc."
+ ([] ())
+ ([c1] (lazy-seq c1))
+ ([c1 c2]
+ (lazy-seq
+ (let [s1 (seq c1) s2 (seq c2)]
+ (when (and s1 s2)
+ (cons (first s1) (cons (first s2)
+ (interleave (rest s1) (rest s2))))))))
+ ([c1 c2 & colls]
+ (lazy-seq
+ (let [ss (map seq (conj colls c2 c1))]
+ (when (every? identity ss)
+ (concat (map first ss) (apply interleave (map rest ss))))))))
+
+(defn interpose
+ "Returns a lazy seq of the elements of coll separated by sep.
+ Returns a stateful transducer when no collection is provided."
+ ([sep]
+ (fn [rf]
+ (let [started (volatile! false)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (if @started
+ (let [sepr (rf result sep)]
+ (if (reduced? sepr)
+ sepr
+ (rf sepr input)))
+ (do
+ (vreset! started true)
+ (rf result input))))))))
+ ([sep coll] (drop 1 (interleave (repeat sep) coll))))
+
+
+
+(defn- flatten1
+ "Take a collection of collections, and return a lazy seq
+ of items from the inner collection"
+ [colls]
+ (let [cat (fn cat [coll colls]
+ (lazy-seq
+ (if-let [coll (seq coll)]
+ (cons (first coll) (cat (rest coll) colls))
+ (when (seq colls)
+ (cat (first colls) (rest colls))))))]
+ (cat nil colls)))
+
+(declare cat)
+
+(defn mapcat
+ "Returns the result of applying concat to the result of applying map
+ to f and colls. Thus function f should return a collection. Returns
+ a transducer when no collections are provided"
+ {:added "1.0"
+ :static true}
+ ([f] (comp (map f) cat))
+ ([f & colls]
+ (apply concat (apply map f colls))))
+
+(defn filter
+ "Returns a lazy sequence of the items in coll for which
+ (pred item) returns logical true. pred must be free of side-effects.
+ Returns a transducer when no collection is provided."
+ ([pred]
+ (fn [rf]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (if (pred input)
+ (rf result input)
+ result)))))
+ ([pred coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (if (chunked-seq? s)
+ (let [c (chunk-first s)
+ size (count c)
+ b (chunk-buffer size)]
+ (dotimes [i size]
+ (when (pred (-nth c i))
+ (chunk-append b (-nth c i))))
+ (chunk-cons (chunk b) (filter pred (chunk-rest s))))
+ (let [f (first s) r (rest s)]
+ (if (pred f)
+ (cons f (filter pred r))
+ (filter pred r))))))))
+
+(defn remove
+ "Returns a lazy sequence of the items in coll for which
+ (pred item) returns logical false. pred must be free of side-effects.
+ Returns a transducer when no collection is provided."
+ ([pred] (filter (complement pred)))
+ ([pred coll]
+ (filter (complement pred) coll)))
+
+(defn tree-seq
+ "Returns a lazy sequence of the nodes in a tree, via a depth-first walk.
+ branch? must be a fn of one arg that returns true if passed a node
+ that can have children (but may not). children must be a fn of one
+ arg that returns a sequence of the children. Will only be called on
+ nodes for which branch? returns true. Root is the root node of the
+ tree."
+ [branch? children root]
+ (let [walk (fn walk [node]
+ (lazy-seq
+ (cons node
+ (when (branch? node)
+ (mapcat walk (children node))))))]
+ (walk root)))
+
+(defn flatten
+ "Takes any nested combination of sequential things (lists, vectors,
+ etc.) and returns their contents as a single, flat sequence.
+ (flatten nil) returns nil."
+ [x]
+ (filter #(not (sequential? %))
+ (rest (tree-seq sequential? seq x))))
+
+(defn into
+ "Returns a new coll consisting of to-coll with all of the items of
+ from-coll conjoined. A transducer may be supplied."
+ ([] [])
+ ([to] to)
+ ([to from]
+ (if-not (nil? to)
+ (if (implements? IEditableCollection to)
+ (-with-meta (persistent! (reduce -conj! (transient to) from)) (meta to))
+ (reduce -conj to from))
+ (reduce conj () from)))
+ ([to xform from]
+ (if (implements? IEditableCollection to)
+ (-with-meta (persistent! (transduce xform conj! (transient to) from)) (meta to))
+ (transduce xform conj to from))))
+
+(defn mapv
+ "Returns a vector consisting of the result of applying f to the
+ set of first items of each coll, followed by applying f to the set
+ of second items in each coll, until any one of the colls is
+ exhausted. Any remaining items in other colls are ignored. Function
+ f should accept number-of-colls arguments."
+ ([f coll]
+ (-> (reduce (fn [v o] (conj! v (f o))) (transient []) coll)
+ persistent!))
+ ([f c1 c2]
+ (into [] (map f c1 c2)))
+ ([f c1 c2 c3]
+ (into [] (map f c1 c2 c3)))
+ ([f c1 c2 c3 & colls]
+ (into [] (apply map f c1 c2 c3 colls))))
+
+(defn filterv
+ "Returns a vector of the items in coll for which
+ (pred item) returns logical true. pred must be free of side-effects."
+ [pred coll]
+ (-> (reduce (fn [v o] (if (pred o) (conj! v o) v))
+ (transient [])
+ coll)
+ persistent!))
+
+(defn partition
+ "Returns a lazy sequence of lists of n items each, at offsets step
+ apart. If step is not supplied, defaults to n, i.e. the partitions
+ do not overlap. If a pad collection is supplied, use its elements as
+ necessary to complete last partition up to n items. In case there are
+ not enough padding elements, return a partition with less than n items."
+ ([n coll]
+ (partition n n coll))
+ ([n step coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (let [p (take n s)]
+ (when (== n (count p))
+ (cons p (partition n step (drop step s))))))))
+ ([n step pad coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (let [p (take n s)]
+ (if (== n (count p))
+ (cons p (partition n step pad (drop step s)))
+ (list (take n (concat p pad)))))))))
+
+(defn get-in
+ "Returns the value in a nested associative structure,
+ where ks is a sequence of keys. Returns nil if the key is not present,
+ or the not-found value if supplied."
+ {:added "1.2"
+ :static true}
+ ([m ks]
+ (reduce get m ks))
+ ([m ks not-found]
+ (loop [sentinel lookup-sentinel
+ m m
+ ks (seq ks)]
+ (if-not (nil? ks)
+ (let [m (get m (first ks) sentinel)]
+ (if (identical? sentinel m)
+ not-found
+ (recur sentinel m (next ks))))
+ m))))
+
+(defn assoc-in
+ "Associates a value in a nested associative structure, where ks is a
+ sequence of keys and v is the new value and returns a new nested structure.
+ If any levels do not exist, hash-maps will be created."
+ [m [k & ks] v]
+ (if ks
+ (assoc m k (assoc-in (get m k) ks v))
+ (assoc m k v)))
+
+(defn update-in
+ "'Updates' a value in a nested associative structure, where ks is a
+ sequence of keys and f is a function that will take the old value
+ and any supplied args and return the new value, and returns a new
+ nested structure. If any levels do not exist, hash-maps will be
+ created."
+ ([m [k & ks] f]
+ (if ks
+ (assoc m k (update-in (get m k) ks f))
+ (assoc m k (f (get m k)))))
+ ([m [k & ks] f a]
+ (if ks
+ (assoc m k (update-in (get m k) ks f a))
+ (assoc m k (f (get m k) a))))
+ ([m [k & ks] f a b]
+ (if ks
+ (assoc m k (update-in (get m k) ks f a b))
+ (assoc m k (f (get m k) a b))))
+ ([m [k & ks] f a b c]
+ (if ks
+ (assoc m k (update-in (get m k) ks f a b c))
+ (assoc m k (f (get m k) a b c))))
+ ([m [k & ks] f a b c & args]
+ (if ks
+ (assoc m k (apply update-in (get m k) ks f a b c args))
+ (assoc m k (apply f (get m k) a b c args)))))
+
+(defn update
+ "'Updates' a value in an associative structure, where k is a
+ key and f is a function that will take the old value
+ and any supplied args and return the new value, and returns a new
+ structure. If the key does not exist, nil is passed as the old value."
+ ([m k f]
+ (assoc m k (f (get m k))))
+ ([m k f x]
+ (assoc m k (f (get m k) x)))
+ ([m k f x y]
+ (assoc m k (f (get m k) x y)))
+ ([m k f x y z]
+ (assoc m k (f (get m k) x y z)))
+ ([m k f x y z & more]
+ (assoc m k (apply f (get m k) x y z more))))
+
+;;; PersistentVector
+
+(deftype VectorNode [edit arr])
+
+(defn- pv-fresh-node [edit]
+ (VectorNode. edit (make-array 32)))
+
+(defn- pv-aget [node idx]
+ (aget (.-arr node) idx))
+
+(defn- pv-aset [node idx val]
+ (aset (.-arr node) idx val))
+
+(defn- pv-clone-node [node]
+ (VectorNode. (.-edit node) (aclone (.-arr node))))
+
+(defn- tail-off [pv]
+ (let [cnt (.-cnt pv)]
+ (if (< cnt 32)
+ 0
+ (bit-shift-left (bit-shift-right-zero-fill (dec cnt) 5) 5))))
+
+(defn- new-path [edit level node]
+ (loop [ll level
+ ret node]
+ (if (zero? ll)
+ ret
+ (let [embed ret
+ r (pv-fresh-node edit)
+ _ (pv-aset r 0 embed)]
+ (recur (- ll 5) r)))))
+
+(defn- push-tail [pv level parent tailnode]
+ (let [ret (pv-clone-node parent)
+ subidx (bit-and (bit-shift-right-zero-fill (dec (.-cnt pv)) level) 0x01f)]
+ (if (== 5 level)
+ (do
+ (pv-aset ret subidx tailnode)
+ ret)
+ (let [child (pv-aget parent subidx)]
+ (if-not (nil? child)
+ (let [node-to-insert (push-tail pv (- level 5) child tailnode)]
+ (pv-aset ret subidx node-to-insert)
+ ret)
+ (let [node-to-insert (new-path nil (- level 5) tailnode)]
+ (pv-aset ret subidx node-to-insert)
+ ret))))))
+
+(defn- vector-index-out-of-bounds [i cnt]
+ (throw (js/Error. (str "No item " i " in vector of length " cnt))))
+
+(defn- first-array-for-longvec [pv]
+ ;; invariants: (count pv) > 32.
+ (loop [node (.-root pv)
+ level (.-shift pv)]
+ (if (pos? level)
+ (recur (pv-aget node 0) (- level 5))
+ (.-arr node))))
+
+(defn- unchecked-array-for [pv i]
+ ;; invariant: i is a valid index of pv (use array-for if unknown).
+ (if (>= i (tail-off pv))
+ (.-tail pv)
+ (loop [node (.-root pv)
+ level (.-shift pv)]
+ (if (pos? level)
+ (recur (pv-aget node (bit-and (bit-shift-right-zero-fill i level) 0x01f))
+ (- level 5))
+ (.-arr node)))))
+
+(defn- array-for [pv i]
+ (if (and (<= 0 i) (< i (.-cnt pv)))
+ (unchecked-array-for pv i)
+ (vector-index-out-of-bounds i (.-cnt pv))))
+
+(defn- do-assoc [pv level node i val]
+ (let [ret (pv-clone-node node)]
+ (if (zero? level)
+ (do
+ (pv-aset ret (bit-and i 0x01f) val)
+ ret)
+ (let [subidx (bit-and (bit-shift-right-zero-fill i level) 0x01f)]
+ (pv-aset ret subidx (do-assoc pv (- level 5) (pv-aget node subidx) i val))
+ ret))))
+
+(defn- pop-tail [pv level node]
+ (let [subidx (bit-and (bit-shift-right-zero-fill (- (.-cnt pv) 2) level) 0x01f)]
+ (cond
+ (> level 5) (let [new-child (pop-tail pv (- level 5) (pv-aget node subidx))]
+ (if (and (nil? new-child) (zero? subidx))
+ nil
+ (let [ret (pv-clone-node node)]
+ (pv-aset ret subidx new-child)
+ ret)))
+ (zero? subidx) nil
+ :else (let [ret (pv-clone-node node)]
+ (pv-aset ret subidx nil)
+ ret))))
+
+(deftype RangedIterator [^:mutable i ^:mutable base ^:mutable arr v start end]
+ Object
+ (hasNext [this]
+ (< i end))
+ (next [this]
+ (when (== (- i base) 32)
+ (set! arr (unchecked-array-for v i))
+ (set! base (+ base 32)))
+ (let [ret (aget arr (bit-and i 0x01f))]
+ (set! i (inc i))
+ ret)))
+
+(defn ranged-iterator [v start end]
+ (let [i start]
+ (RangedIterator. i (- i (js-mod i 32))
+ (when (< start (count v))
+ (unchecked-array-for v i))
+ v start end)))
+
+(defn- pv-reduce
+ ([pv f start end]
+ (if (< start end)
+ (pv-reduce pv f (nth pv start) (inc start) end)
+ (f)))
+ ([pv f init start end]
+ (loop [acc init i start arr (unchecked-array-for pv start)]
+ (if (< i end)
+ (let [j (bit-and i 0x01f)
+ arr (if (zero? j) (unchecked-array-for pv i) arr)
+ nacc (f acc (aget arr j))]
+ (if (reduced? nacc)
+ @nacc
+ (recur nacc (inc i) arr)))
+ acc))))
+
+(declare tv-editable-root tv-editable-tail TransientVector deref
+ pr-sequential-writer pr-writer chunked-seq)
+
+(defprotocol APersistentVector
+ "Marker protocol")
+
+(deftype PersistentVector [meta cnt shift root tail ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [_] (PersistentVector. meta cnt shift root tail __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentVector. meta cnt shift root tail __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ IStack
+ (-peek [coll]
+ (when (> cnt 0)
+ (-nth coll (dec cnt))))
+ (-pop [coll]
+ (cond
+ (zero? cnt) (throw (js/Error. "Can't pop empty vector"))
+ (== 1 cnt) (-with-meta (.-EMPTY PersistentVector) meta)
+ (< 1 (- cnt (tail-off coll)))
+ (PersistentVector. meta (dec cnt) shift root (.slice tail 0 -1) nil)
+ :else (let [new-tail (unchecked-array-for coll (- cnt 2))
+ nr (pop-tail coll shift root)
+ new-root (if (nil? nr) (.-EMPTY-NODE PersistentVector) nr)
+ cnt-1 (dec cnt)]
+ (if (and (< 5 shift) (nil? (pv-aget new-root 1)))
+ (PersistentVector. meta cnt-1 (- shift 5) (pv-aget new-root 0) new-tail nil)
+ (PersistentVector. meta cnt-1 shift new-root new-tail nil)))))
+
+ ICollection
+ (-conj [coll o]
+ (if (< (- cnt (tail-off coll)) 32)
+ (let [len (alength tail)
+ new-tail (make-array (inc len))]
+ (dotimes [i len]
+ (aset new-tail i (aget tail i)))
+ (aset new-tail len o)
+ (PersistentVector. meta (inc cnt) shift root new-tail nil))
+ (let [root-overflow? (> (bit-shift-right-zero-fill cnt 5) (bit-shift-left 1 shift))
+ new-shift (if root-overflow? (+ shift 5) shift)
+ new-root (if root-overflow?
+ (let [n-r (pv-fresh-node nil)]
+ (pv-aset n-r 0 root)
+ (pv-aset n-r 1 (new-path nil shift (VectorNode. nil tail)))
+ n-r)
+ (push-tail coll shift root (VectorNode. nil tail)))]
+ (PersistentVector. meta (inc cnt) new-shift new-root (array o) nil))))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY PersistentVector) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other]
+ (if (instance? PersistentVector other)
+ (if (== cnt (count other))
+ (let [me-iter (-iterator coll)
+ you-iter (-iterator other)]
+ (loop []
+ (if ^boolean (.hasNext me-iter)
+ (let [x (.next me-iter)
+ y (.next you-iter)]
+ (if (= x y)
+ (recur)
+ false))
+ true)))
+ false)
+ (equiv-sequential coll other)))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (cond
+ (zero? cnt) nil
+ (<= cnt 32) (IndexedSeq. tail 0 nil)
+ :else (chunked-seq coll (first-array-for-longvec coll) 0 0)))
+
+ ICounted
+ (-count [coll] cnt)
+
+ IIndexed
+ (-nth [coll n]
+ (aget (array-for coll n) (bit-and n 0x01f)))
+ (-nth [coll n not-found]
+ (if (and (<= 0 n) (< n cnt))
+ (aget (unchecked-array-for coll n) (bit-and n 0x01f))
+ not-found))
+
+ ILookup
+ (-lookup [coll k] (-lookup coll k nil))
+ (-lookup [coll k not-found] (if (number? k)
+ (-nth coll k not-found)
+ not-found))
+
+ IAssociative
+ (-assoc [coll k v]
+ (if (number? k)
+ (-assoc-n coll k v)
+ (throw (js/Error. "Vector's key for assoc must be a number."))))
+ (-contains-key? [coll k]
+ (if (integer? k)
+ (and (<= 0 k) (< k cnt))
+ false))
+
+ IFind
+ (-find [coll n]
+ (when (and (<= 0 n) (< n cnt))
+ (MapEntry. n (aget (unchecked-array-for coll n) (bit-and n 0x01f)) nil)))
+
+ APersistentVector
+ IVector
+ (-assoc-n [coll n val]
+ (cond
+ (and (<= 0 n) (< n cnt))
+ (if (<= (tail-off coll) n)
+ (let [new-tail (aclone tail)]
+ (aset new-tail (bit-and n 0x01f) val)
+ (PersistentVector. meta cnt shift root new-tail nil))
+ (PersistentVector. meta cnt shift (do-assoc coll shift root n val) tail nil))
+ (== n cnt) (-conj coll val)
+ :else (throw (js/Error. (str "Index " n " out of bounds [0," cnt "]")))))
+
+ IReduce
+ (-reduce [v f]
+ (pv-reduce v f 0 cnt))
+ (-reduce [v f init]
+ (loop [i 0 init init]
+ (if (< i cnt)
+ (let [arr (unchecked-array-for v i)
+ len (alength arr)
+ init (loop [j 0 init init]
+ (if (< j len)
+ (let [init (f init (aget arr j))]
+ (if (reduced? init)
+ init
+ (recur (inc j) init)))
+ init))]
+ (if (reduced? init)
+ @init
+ (recur (+ i len) init)))
+ init)))
+
+ IKVReduce
+ (-kv-reduce [v f init]
+ (loop [i 0 init init]
+ (if (< i cnt)
+ (let [arr (unchecked-array-for v i)
+ len (alength arr)
+ init (loop [j 0 init init]
+ (if (< j len)
+ (let [init (f init (+ j i) (aget arr j))]
+ (if (reduced? init)
+ init
+ (recur (inc j) init)))
+ init))]
+ (if (reduced? init)
+ @init
+ (recur (+ i len) init)))
+ init)))
+
+ IFn
+ (-invoke [coll k]
+ (-nth coll k))
+ (-invoke [coll k not-found]
+ (-nth coll k not-found))
+
+ IEditableCollection
+ (-as-transient [coll]
+ (TransientVector. cnt shift (tv-editable-root root) (tv-editable-tail tail)))
+
+ IReversible
+ (-rseq [coll]
+ (when (pos? cnt)
+ (RSeq. coll (dec cnt) nil)))
+
+ IIterable
+ (-iterator [this]
+ (ranged-iterator this 0 cnt)))
+
+(set! (.-EMPTY-NODE PersistentVector) (VectorNode. nil (make-array 32)))
+
+(set! (.-EMPTY PersistentVector)
+ (PersistentVector. nil 0 5 (.-EMPTY-NODE PersistentVector) (array) empty-ordered-hash))
+
+(set! (.-fromArray PersistentVector)
+ (fn [xs ^boolean no-clone]
+ (let [l (alength xs)
+ xs (if no-clone xs (aclone xs))]
+ (if (< l 32)
+ (PersistentVector. nil l 5 (.-EMPTY-NODE PersistentVector) xs nil)
+ (let [node (.slice xs 0 32)
+ v (PersistentVector. nil 32 5 (.-EMPTY-NODE PersistentVector) node nil)]
+ (loop [i 32 out (-as-transient v)]
+ (if (< i l)
+ (recur (inc i) (conj! out (aget xs i)))
+ (persistent! out))))))))
+
+(es6-iterable PersistentVector)
+
+(declare map-entry?)
+
+(defn vec
+ "Creates a new vector containing the contents of coll. JavaScript arrays
+ will be aliased and should not be modified."
+ [coll]
+ (cond
+ (map-entry? coll)
+ [(key coll) (val coll)]
+
+ (vector? coll)
+ (with-meta coll nil)
+
+ (array? coll)
+ (.fromArray PersistentVector coll true)
+
+ :else
+ (-persistent!
+ (reduce -conj!
+ (-as-transient (.-EMPTY PersistentVector))
+ coll))))
+
+(defn vector
+ "Creates a new vector containing the args."
+ [& args]
+ (if (and (instance? IndexedSeq args) (zero? (.-i args)))
+ (.fromArray PersistentVector (.-arr args) true)
+ (vec args)))
+
+(declare subvec)
+
+(deftype ChunkedSeq [vec node i off meta ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IWithMeta
+ (-with-meta [coll m]
+ (chunked-seq vec node i off m))
+ IMeta
+ (-meta [coll] meta)
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ASeq
+ ISeq
+ (-first [coll]
+ (aget node off))
+ (-rest [coll]
+ (if (< (inc off) (alength node))
+ (let [s (chunked-seq vec node i (inc off))]
+ (if (nil? s)
+ ()
+ s))
+ (-chunked-rest coll)))
+
+ INext
+ (-next [coll]
+ (if (< (inc off) (alength node))
+ (let [s (chunked-seq vec node i (inc off))]
+ (if (nil? s)
+ nil
+ s))
+ (-chunked-next coll)))
+
+ ICollection
+ (-conj [coll o]
+ (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll]
+ ())
+
+ IChunkedSeq
+ (-chunked-first [coll]
+ (array-chunk node off))
+ (-chunked-rest [coll]
+ (let [end (+ i (alength node))]
+ (if (< end (-count vec))
+ (chunked-seq vec (unchecked-array-for vec end) end 0)
+ ())))
+
+ IChunkedNext
+ (-chunked-next [coll]
+ (let [end (+ i (alength node))]
+ (when (< end (-count vec))
+ (chunked-seq vec (unchecked-array-for vec end) end 0))))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IReduce
+ (-reduce [coll f]
+ (pv-reduce vec f (+ i off) (count vec)))
+
+ (-reduce [coll f start]
+ (pv-reduce vec f start (+ i off) (count vec))))
+
+(es6-iterable ChunkedSeq)
+
+(defn chunked-seq
+ ([vec i off] (ChunkedSeq. vec (array-for vec i) i off nil nil))
+ ([vec node i off] (ChunkedSeq. vec node i off nil nil))
+ ([vec node i off meta]
+ (ChunkedSeq. vec node i off meta nil)))
+
+(declare build-subvec)
+
+(deftype Subvec [meta v start end ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [_] (Subvec. meta v start end __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (build-subvec meta v start end __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ IStack
+ (-peek [coll]
+ (-nth v (dec end)))
+ (-pop [coll]
+ (if (== start end)
+ (throw (js/Error. "Can't pop empty vector"))
+ (build-subvec meta v start (dec end) nil)))
+
+ ICollection
+ (-conj [coll o]
+ (build-subvec meta (-assoc-n v end o) start (inc end) nil))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY PersistentVector) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (let [subvec-seq (fn subvec-seq [i]
+ (when-not (== i end)
+ (cons (-nth v i)
+ (lazy-seq
+ (subvec-seq (inc i))))))]
+ (subvec-seq start)))
+
+ IReversible
+ (-rseq [coll]
+ (if-not (== start end)
+ (RSeq. coll (dec (- end start)) nil)))
+
+ ICounted
+ (-count [coll] (- end start))
+
+ IIndexed
+ (-nth [coll n]
+ (if (or (neg? n) (<= end (+ start n)))
+ (vector-index-out-of-bounds n (- end start))
+ (-nth v (+ start n))))
+ (-nth [coll n not-found]
+ (if (or (neg? n) (<= end (+ start n)))
+ not-found
+ (-nth v (+ start n) not-found)))
+
+ ILookup
+ (-lookup [coll k] (-lookup coll k nil))
+ (-lookup [coll k not-found] (if (number? k)
+ (-nth coll k not-found)
+ not-found))
+
+ IAssociative
+ (-assoc [coll key val]
+ (if (number? key)
+ (-assoc-n coll key val)
+ (throw (js/Error. "Subvec's key for assoc must be a number."))))
+
+ IFind
+ (-find [coll n]
+ (when-not (neg? n)
+ (let [idx (+ start n)]
+ (when (< idx end)
+ (MapEntry. n (-lookup v idx) nil)))))
+
+ IVector
+ (-assoc-n [coll n val]
+ (let [v-pos (+ start n)]
+ (if (or (neg? n) (<= (inc end) v-pos))
+ (throw (js/Error. (str "Index " n " out of bounds [0," (-count coll) "]")))
+ (build-subvec meta (assoc v v-pos val) start (max end (inc v-pos)) nil))))
+
+ IReduce
+ (-reduce [coll f]
+ (if (implements? APersistentVector v)
+ (pv-reduce v f start end)
+ (ci-reduce coll f)))
+ (-reduce [coll f init]
+ (if (implements? APersistentVector v)
+ (pv-reduce v f init start end)
+ (ci-reduce coll f init)))
+
+ IKVReduce
+ (-kv-reduce [coll f init]
+ (loop [i start j 0 init init]
+ (if (< i end)
+ (let [init (f init j (-nth v i))]
+ (if (reduced? init)
+ @init
+ (recur (inc i) (inc j) init)))
+ init)))
+
+ IFn
+ (-invoke [coll k]
+ (-nth coll k))
+ (-invoke [coll k not-found]
+ (-nth coll k not-found))
+
+ IIterable
+ (-iterator [coll]
+ (if (implements? APersistentVector v)
+ (ranged-iterator v start end)
+ (seq-iter coll))))
+
+(es6-iterable Subvec)
+
+(defn- build-subvec [meta v start end __hash]
+ (if (instance? Subvec v)
+ (recur meta (.-v v) (+ (.-start v) start) (+ (.-start v) end) __hash)
+ (do
+ (when-not (vector? v)
+ (throw (js/Error. "v must satisfy IVector")))
+ (let [c (count v)]
+ (when (or (neg? start)
+ (neg? end)
+ (> start c)
+ (> end c))
+ (throw (js/Error. "Index out of bounds"))))
+ (Subvec. meta v start end __hash))))
+
+(defn subvec
+ "Returns a persistent vector of the items in vector from
+ start (inclusive) to end (exclusive). If end is not supplied,
+ defaults to (count vector). This operation is O(1) and very fast, as
+ the resulting vector shares structure with the original and no
+ trimming is done."
+ ([v start]
+ (subvec v start (count v)))
+ ([v start end]
+ (assert (and (not (nil? start)) (not (nil? end))))
+ (build-subvec nil v (int start) (int end) nil)))
+
+(defn- tv-ensure-editable [edit node]
+ (if (identical? edit (.-edit node))
+ node
+ (VectorNode. edit (aclone (.-arr node)))))
+
+(defn- tv-editable-root [node]
+ (VectorNode. (js-obj) (aclone (.-arr node))))
+
+(defn- tv-editable-tail [tl]
+ (let [ret (make-array 32)]
+ (array-copy tl 0 ret 0 (alength tl))
+ ret))
+
+(defn- tv-push-tail [tv level parent tail-node]
+ (let [ret (tv-ensure-editable (.. tv -root -edit) parent)
+ subidx (bit-and (bit-shift-right-zero-fill (dec (.-cnt tv)) level) 0x01f)]
+ (pv-aset ret subidx
+ (if (== level 5)
+ tail-node
+ (let [child (pv-aget ret subidx)]
+ (if-not (nil? child)
+ (tv-push-tail tv (- level 5) child tail-node)
+ (new-path (.. tv -root -edit) (- level 5) tail-node)))))
+ ret))
+
+(defn- tv-pop-tail [tv level node]
+ (let [node (tv-ensure-editable (.. tv -root -edit) node)
+ subidx (bit-and (bit-shift-right-zero-fill (- (.-cnt tv) 2) level) 0x01f)]
+ (cond
+ (> level 5) (let [new-child (tv-pop-tail
+ tv (- level 5) (pv-aget node subidx))]
+ (if (and (nil? new-child) (zero? subidx))
+ nil
+ (do (pv-aset node subidx new-child)
+ node)))
+ (zero? subidx) nil
+ :else (do (pv-aset node subidx nil)
+ node))))
+
+(defn- unchecked-editable-array-for [tv i]
+ ;; invariant: i is a valid index of tv.
+ (if (>= i (tail-off tv))
+ (.-tail tv)
+ (let [root (.-root tv)]
+ (loop [node root
+ level (.-shift tv)]
+ (if (pos? level)
+ (recur (tv-ensure-editable
+ (.-edit root)
+ (pv-aget node
+ (bit-and (bit-shift-right-zero-fill i level)
+ 0x01f)))
+ (- level 5))
+ (.-arr node))))))
+
+(deftype TransientVector [^:mutable cnt
+ ^:mutable shift
+ ^:mutable root
+ ^:mutable tail]
+ ITransientCollection
+ (-conj! [tcoll o]
+ (if ^boolean (.-edit root)
+ (if (< (- cnt (tail-off tcoll)) 32)
+ (do (aset tail (bit-and cnt 0x01f) o)
+ (set! cnt (inc cnt))
+ tcoll)
+ (let [tail-node (VectorNode. (.-edit root) tail)
+ new-tail (make-array 32)]
+ (aset new-tail 0 o)
+ (set! tail new-tail)
+ (if (> (bit-shift-right-zero-fill cnt 5)
+ (bit-shift-left 1 shift))
+ (let [new-root-array (make-array 32)
+ new-shift (+ shift 5)]
+ (aset new-root-array 0 root)
+ (aset new-root-array 1 (new-path (.-edit root) shift tail-node))
+ (set! root (VectorNode. (.-edit root) new-root-array))
+ (set! shift new-shift)
+ (set! cnt (inc cnt))
+ tcoll)
+ (let [new-root (tv-push-tail tcoll shift root tail-node)]
+ (set! root new-root)
+ (set! cnt (inc cnt))
+ tcoll))))
+ (throw (js/Error. "conj! after persistent!"))))
+
+ (-persistent! [tcoll]
+ (if ^boolean (.-edit root)
+ (do (set! (.-edit root) nil)
+ (let [len (- cnt (tail-off tcoll))
+ trimmed-tail (make-array len)]
+ (array-copy tail 0 trimmed-tail 0 len)
+ (PersistentVector. nil cnt shift root trimmed-tail nil)))
+ (throw (js/Error. "persistent! called twice"))))
+
+ ITransientAssociative
+ (-assoc! [tcoll key val]
+ (if (number? key)
+ (-assoc-n! tcoll key val)
+ (throw (js/Error. "TransientVector's key for assoc! must be a number."))))
+
+ ITransientVector
+ (-assoc-n! [tcoll n val]
+ (if ^boolean (.-edit root)
+ (cond
+ (and (<= 0 n) (< n cnt))
+ (if (<= (tail-off tcoll) n)
+ (do (aset tail (bit-and n 0x01f) val)
+ tcoll)
+ (let [new-root
+ ((fn go [level node]
+ (let [node (tv-ensure-editable (.-edit root) node)]
+ (if (zero? level)
+ (do (pv-aset node (bit-and n 0x01f) val)
+ node)
+ (let [subidx (bit-and (bit-shift-right-zero-fill n level)
+ 0x01f)]
+ (pv-aset node subidx
+ (go (- level 5) (pv-aget node subidx)))
+ node))))
+ shift root)]
+ (set! root new-root)
+ tcoll))
+ (== n cnt) (-conj! tcoll val)
+ :else
+ (throw
+ (js/Error.
+ (str "Index " n " out of bounds for TransientVector of length" cnt))))
+ (throw (js/Error. "assoc! after persistent!"))))
+
+ (-pop! [tcoll]
+ (if ^boolean (.-edit root)
+ (cond
+ (zero? cnt) (throw (js/Error. "Can't pop empty vector"))
+ (== 1 cnt) (do (set! cnt 0) tcoll)
+ (pos? (bit-and (dec cnt) 0x01f)) (do (set! cnt (dec cnt)) tcoll)
+ :else
+ (let [new-tail (unchecked-editable-array-for tcoll (- cnt 2))
+ new-root (let [nr (tv-pop-tail tcoll shift root)]
+ (if-not (nil? nr)
+ nr
+ (VectorNode. (.-edit root) (make-array 32))))]
+ (if (and (< 5 shift) (nil? (pv-aget new-root 1)))
+ (let [new-root (tv-ensure-editable (.-edit root) (pv-aget new-root 0))]
+ (set! root new-root)
+ (set! shift (- shift 5))
+ (set! cnt (dec cnt))
+ (set! tail new-tail)
+ tcoll)
+ (do (set! root new-root)
+ (set! cnt (dec cnt))
+ (set! tail new-tail)
+ tcoll))))
+ (throw (js/Error. "pop! after persistent!"))))
+
+ ICounted
+ (-count [coll]
+ (if ^boolean (.-edit root)
+ cnt
+ (throw (js/Error. "count after persistent!"))))
+
+ IIndexed
+ (-nth [coll n]
+ (if ^boolean (.-edit root)
+ (aget (array-for coll n) (bit-and n 0x01f))
+ (throw (js/Error. "nth after persistent!"))))
+
+ (-nth [coll n not-found]
+ (if (and (<= 0 n) (< n cnt))
+ (-nth coll n)
+ not-found))
+
+ ILookup
+ (-lookup [coll k] (-lookup coll k nil))
+
+ (-lookup [coll k not-found] (if (number? k)
+ (-nth coll k not-found)
+ not-found))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found)))
+
+;;; PersistentQueue ;;;
+
+(deftype PersistentQueueIter [^:mutable fseq riter]
+ Object
+ (hasNext [_]
+ (or (and (some? fseq) (seq fseq)) (and (some? riter) (.hasNext riter))))
+ (next [_]
+ (cond
+ (some? fseq)
+ (let [ret (first fseq)]
+ (set! fseq (next fseq))
+ ret)
+ (and (some? riter) ^boolean (.hasNext riter))
+ (.next riter)
+ :else (throw (js/Error. "No such element"))))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(deftype PersistentQueueSeq [meta front rear ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentQueueSeq. meta front rear __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll] (first front))
+ (-rest [coll]
+ (if-let [f1 (next front)]
+ (PersistentQueueSeq. meta f1 rear nil)
+ (if (nil? rear)
+ (-empty coll)
+ (PersistentQueueSeq. meta rear nil nil))))
+
+ INext
+ (-next [coll]
+ (if-let [f1 (next front)]
+ (PersistentQueueSeq. meta f1 rear nil)
+ (when (some? rear)
+ (PersistentQueueSeq. meta rear nil nil))))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll] coll))
+
+(es6-iterable PersistentQueueSeq)
+
+(deftype PersistentQueue [meta count front rear ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [coll] (PersistentQueue. meta count front rear __hash))
+
+ IIterable
+ (-iterator [coll]
+ (PersistentQueueIter. front (-iterator rear)))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentQueue. meta count front rear __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ISeq
+ (-first [coll] (first front))
+ (-rest [coll] (rest (seq coll)))
+
+ IStack
+ (-peek [coll] (first front))
+ (-pop [coll]
+ (if front
+ (if-let [f1 (next front)]
+ (PersistentQueue. meta (dec count) f1 rear nil)
+ (PersistentQueue. meta (dec count) (seq rear) [] nil))
+ coll))
+
+ ICollection
+ (-conj [coll o]
+ (if front
+ (PersistentQueue. meta (inc count) front (conj (or rear []) o) nil)
+ (PersistentQueue. meta (inc count) (conj front o) [] nil)))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY PersistentQueue) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (let [rear (seq rear)]
+ (if (or front rear)
+ (PersistentQueueSeq. nil front (seq rear) nil))))
+
+ ICounted
+ (-count [coll] count))
+
+(set! (.-EMPTY PersistentQueue) (PersistentQueue. nil 0 nil [] empty-ordered-hash))
+
+(es6-iterable PersistentQueue)
+
+(deftype NeverEquiv []
+ Object
+ (equiv [this other]
+ (-equiv this other))
+ IEquiv
+ (-equiv [o other] false))
+
+(def ^:private never-equiv (NeverEquiv.))
+
+(defn ^boolean equiv-map
+ "Test map equivalence. Returns true if x equals y, otherwise returns false."
+ [x y]
+ (boolean
+ (when (and (map? y) (not (record? y)))
+ ; assume all maps are counted
+ (when (== (count x) (count y))
+ (if (satisfies? IKVReduce x)
+ (reduce-kv
+ (fn [_ k v]
+ (if (= (get y k never-equiv) v)
+ true
+ (reduced false)))
+ true x)
+ (every?
+ (fn [xkv]
+ (= (get y (first xkv) never-equiv) (second xkv)))
+ x))))))
+
+
+(defn- scan-array [incr k array]
+ (let [len (alength array)]
+ (loop [i 0]
+ (when (< i len)
+ (if (identical? k (aget array i))
+ i
+ (recur (+ i incr)))))))
+
+; The keys field is an array of all keys of this map, in no particular
+; order. Any string, keyword, or symbol key is used as a property name
+; to store the value in strobj. If a key is assoc'ed when that same
+; key already exists in strobj, the old value is overwritten. If a
+; non-string key is assoc'ed, return a HashMap object instead.
+
+(defn- obj-map-compare-keys [a b]
+ (let [a (hash a)
+ b (hash b)]
+ (cond
+ (< a b) -1
+ (> a b) 1
+ :else 0)))
+
+(defn- obj-map->hash-map [m k v]
+ (let [ks (.-keys m)
+ len (alength ks)
+ so (.-strobj m)
+ mm (meta m)]
+ (loop [i 0
+ out (transient (.-EMPTY PersistentHashMap))]
+ (if (< i len)
+ (let [k (aget ks i)]
+ (recur (inc i) (assoc! out k (gobject/get so k))))
+ (-with-meta (persistent! (assoc! out k v)) mm)))))
+
+;;; ObjMap - DEPRECATED
+
+(defn- obj-clone [obj ks]
+ (let [new-obj (js-obj)
+ l (alength ks)]
+ (loop [i 0]
+ (when (< i l)
+ (let [k (aget ks i)]
+ (gobject/set new-obj k (gobject/get obj k))
+ (recur (inc i)))))
+ new-obj))
+
+(deftype ObjMap [meta keys strobj update-count ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ IWithMeta
+ (-with-meta [coll meta] (ObjMap. meta keys strobj update-count __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll entry]
+ (if (vector? entry)
+ (-assoc coll (-nth entry 0) (-nth entry 1))
+ (reduce -conj
+ coll
+ entry)))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY ObjMap) meta))
+
+ IEquiv
+ (-equiv [coll other] (equiv-map coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (when (pos? (alength keys))
+ (map #(vector % (unchecked-get strobj %))
+ (.sort keys obj-map-compare-keys))))
+
+ ICounted
+ (-count [coll] (alength keys))
+
+ ILookup
+ (-lookup [coll k] (-lookup coll k nil))
+ (-lookup [coll k not-found]
+ (if (and ^boolean (goog/isString k)
+ (not (nil? (scan-array 1 k keys))))
+ (unchecked-get strobj k)
+ not-found))
+
+ IAssociative
+ (-assoc [coll k v]
+ (if ^boolean (goog/isString k)
+ (if (or (> update-count (.-HASHMAP_THRESHOLD ObjMap))
+ (>= (alength keys) (.-HASHMAP_THRESHOLD ObjMap)))
+ (obj-map->hash-map coll k v)
+ (if-not (nil? (scan-array 1 k keys))
+ (let [new-strobj (obj-clone strobj keys)]
+ (gobject/set new-strobj k v)
+ (ObjMap. meta keys new-strobj (inc update-count) nil)) ; overwrite
+ (let [new-strobj (obj-clone strobj keys) ; append
+ new-keys (aclone keys)]
+ (gobject/set new-strobj k v)
+ (.push new-keys k)
+ (ObjMap. meta new-keys new-strobj (inc update-count) nil))))
+ ;; non-string key. game over.
+ (obj-map->hash-map coll k v)))
+ (-contains-key? [coll k]
+ (if (and ^boolean (goog/isString k)
+ (not (nil? (scan-array 1 k keys))))
+ true
+ false))
+
+ IFind
+ (-find [coll k]
+ (when (and ^boolean (goog/isString k)
+ (not (nil? (scan-array 1 k keys))))
+ (MapEntry. k (unchecked-get strobj k) nil)))
+
+ IKVReduce
+ (-kv-reduce [coll f init]
+ (let [len (alength keys)]
+ (loop [keys (.sort keys obj-map-compare-keys)
+ init init]
+ (if (seq keys)
+ (let [k (first keys)
+ init (f init k (unchecked-get strobj k))]
+ (if (reduced? init)
+ @init
+ (recur (rest keys) init)))
+ init))))
+
+ IMap
+ (-dissoc [coll k]
+ (if (and ^boolean (goog/isString k)
+ (not (nil? (scan-array 1 k keys))))
+ (let [new-keys (aclone keys)
+ new-strobj (obj-clone strobj keys)]
+ (.splice new-keys (scan-array 1 k new-keys) 1)
+ (js-delete new-strobj k)
+ (ObjMap. meta new-keys new-strobj (inc update-count) nil))
+ coll)) ; key not found, return coll unchanged
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found))
+
+ IEditableCollection
+ (-as-transient [coll]
+ (transient (into (hash-map) coll))))
+
+(set! (.-EMPTY ObjMap) (ObjMap. nil (array) (js-obj) 0 empty-unordered-hash))
+
+(set! (.-HASHMAP_THRESHOLD ObjMap) 8)
+
+(set! (.-fromObject ObjMap) (fn [ks obj] (ObjMap. nil ks obj 0 nil)))
+
+;; Record Iterator
+(deftype RecordIter [^:mutable i record base-count fields ext-map-iter]
+ Object
+ (hasNext [_]
+ (or (< i base-count) (.hasNext ext-map-iter)))
+ (next [_]
+ (if (< i base-count)
+ (let [k (nth fields i)]
+ (set! i (inc i))
+ (MapEntry. k (-lookup record k) nil))
+ (.next ext-map-iter)))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+;; EXPERIMENTAL: subject to change
+(deftype ES6EntriesIterator [^:mutable s]
+ Object
+ (next [_]
+ (if-not (nil? s)
+ (let [[k v] (first s)]
+ (set! s (next s))
+ #js {:value #js [k v] :done false})
+ #js {:value nil :done true})))
+
+(defn es6-entries-iterator [coll]
+ (ES6EntriesIterator. (seq coll)))
+
+;; EXPERIMENTAL: subject to change
+(deftype ES6SetEntriesIterator [^:mutable s]
+ Object
+ (next [_]
+ (if-not (nil? s)
+ (let [x (first s)]
+ (set! s (next s))
+ #js {:value #js [x x] :done false})
+ #js {:value nil :done true})))
+
+(defn es6-set-entries-iterator [coll]
+ (ES6SetEntriesIterator. (seq coll)))
+
+;;; PersistentArrayMap
+
+(defn- array-index-of-nil? [arr]
+ (let [len (alength arr)]
+ (loop [i 0]
+ (cond
+ (<= len i) -1
+ (nil? (aget arr i)) i
+ :else (recur (+ i 2))))))
+
+(defn- array-index-of-keyword? [arr k]
+ (let [len (alength arr)
+ kstr (.-fqn k)]
+ (loop [i 0]
+ (cond
+ (<= len i) -1
+ (and (keyword? (aget arr i))
+ (identical? kstr (.-fqn (aget arr i)))) i
+ :else (recur (+ i 2))))))
+
+(defn- array-index-of-symbol? [arr k]
+ (let [len (alength arr)
+ kstr (.-str k)]
+ (loop [i 0]
+ (cond
+ (<= len i) -1
+ (and (symbol? (aget arr i))
+ (identical? kstr (.-str (aget arr i)))) i
+ :else (recur (+ i 2))))))
+
+(defn- array-index-of-identical? [arr k]
+ (let [len (alength arr)]
+ (loop [i 0]
+ (cond
+ (<= len i) -1
+ (identical? k (aget arr i)) i
+ :else (recur (+ i 2))))))
+
+(defn- array-index-of-equiv? [arr k]
+ (let [len (alength arr)]
+ (loop [i 0]
+ (cond
+ (<= len i) -1
+ (= k (aget arr i)) i
+ :else (recur (+ i 2))))))
+
+(defn array-index-of [arr k]
+ (cond
+ (keyword? k) (array-index-of-keyword? arr k)
+
+ (or ^boolean (goog/isString k) (number? k))
+ (array-index-of-identical? arr k)
+
+ (symbol? k) (array-index-of-symbol? arr k)
+
+ (nil? k)
+ (array-index-of-nil? arr)
+
+ :else (array-index-of-equiv? arr k)))
+
+(defn- array-map-index-of [m k]
+ (array-index-of (.-arr m) k))
+
+(defn- array-extend-kv [arr k v]
+ (let [l (alength arr)
+ narr (make-array (+ l 2))]
+ (loop [i 0]
+ (when (< i l)
+ (aset narr i (aget arr i))
+ (recur (inc i))))
+ (aset narr l k)
+ (aset narr (inc l) v)
+ narr))
+
+(defn- array-map-extend-kv [m k v]
+ (array-extend-kv (.-arr m) k v))
+
+(declare TransientArrayMap)
+
+(deftype MapEntry [key val ^:mutable __hash]
+ Object
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMapEntry
+ (-key [node] key)
+ (-val [node] val)
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IMeta
+ (-meta [node] nil)
+
+ IWithMeta
+ (-with-meta [node meta]
+ (with-meta [key val] meta))
+
+ IStack
+ (-peek [node] val)
+
+ (-pop [node] [key])
+
+ ICollection
+ (-conj [node o] [key val o])
+
+ IEmptyableCollection
+ (-empty [node] nil)
+
+ ISequential
+ ISeqable
+ (-seq [node] (IndexedSeq. #js [key val] 0 nil))
+
+ IReversible
+ (-rseq [node] (IndexedSeq. #js [val key] 0 nil))
+
+ ICounted
+ (-count [node] 2)
+
+ IIndexed
+ (-nth [node n]
+ (cond (== n 0) key
+ (== n 1) val
+ :else (throw (js/Error. "Index out of bounds"))))
+
+ (-nth [node n not-found]
+ (cond (== n 0) key
+ (== n 1) val
+ :else not-found))
+
+ ILookup
+ (-lookup [node k] (-nth node k nil))
+ (-lookup [node k not-found] (-nth node k not-found))
+
+ IAssociative
+ (-assoc [node k v]
+ (assoc [key val] k v))
+ (-contains-key? [node k]
+ (or (== k 0) (== k 1)))
+
+ IFind
+ (-find [node k]
+ (case k
+ 0 (MapEntry. 0 key nil)
+ 1 (MapEntry. 1 val nil)
+ nil))
+
+ IVector
+ (-assoc-n [node n v]
+ (-assoc-n [key val] n v))
+
+ IReduce
+ (-reduce [node f]
+ (ci-reduce node f))
+
+ (-reduce [node f start]
+ (ci-reduce node f start))
+
+ IFn
+ (-invoke [node k]
+ (-nth node k))
+
+ (-invoke [node k not-found]
+ (-nth node k not-found)))
+
+(defn ^boolean map-entry?
+ "Returns true if x satisfies IMapEntry"
+ [x]
+ (implements? IMapEntry x))
+
+(deftype PersistentArrayMapSeq [arr i _meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMeta
+ (-meta [coll] _meta)
+
+ IWithMeta
+ (-with-meta [coll new-meta]
+ (PersistentArrayMapSeq. arr i new-meta))
+
+ ICounted
+ (-count [coll]
+ (/ (- (alength arr) i) 2))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ICollection
+ (-conj [coll o]
+ (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) _meta))
+
+ IHash
+ (-hash [coll] (hash-ordered-coll coll))
+
+ ISeq
+ (-first [coll]
+ (MapEntry. (aget arr i) (aget arr (inc i)) nil))
+
+ (-rest [coll]
+ (if (< i (- (alength arr) 2))
+ (PersistentArrayMapSeq. arr (+ i 2) _meta)
+ ()))
+
+ INext
+ (-next [coll]
+ (when (< i (- (alength arr) 2))
+ (PersistentArrayMapSeq. arr (+ i 2) _meta)))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable PersistentArrayMapSeq)
+
+(defn persistent-array-map-seq [arr i _meta]
+ (when (<= i (- (alength arr) 2))
+ (PersistentArrayMapSeq. arr i _meta)))
+
+(declare keys vals)
+
+(deftype PersistentArrayMapIterator [arr ^:mutable i cnt]
+ Object
+ (hasNext [_]
+ (< i cnt))
+ (next [_]
+ (let [ret (MapEntry. (aget arr i) (aget arr (inc i)) nil)]
+ (set! i (+ i 2))
+ ret)))
+
+(deftype PersistentArrayMap [meta cnt arr ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ ;; EXPERIMENTAL: subject to change
+ (keys [coll]
+ (es6-iterator (keys coll)))
+ (entries [coll]
+ (es6-entries-iterator (seq coll)))
+ (values [coll]
+ (es6-iterator (vals coll)))
+ (has [coll k]
+ (contains? coll k))
+ (get [coll k not-found]
+ (-lookup coll k not-found))
+ (forEach [coll f]
+ (doseq [[k v] coll]
+ (f v k)))
+
+ ICloneable
+ (-clone [_] (PersistentArrayMap. meta cnt arr __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentArrayMap. meta cnt arr __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll entry]
+ (if (vector? entry)
+ (-assoc coll (-nth entry 0) (-nth entry 1))
+ (loop [ret coll es (seq entry)]
+ (if (nil? es)
+ ret
+ (let [e (first es)]
+ (if (vector? e)
+ (recur (-assoc ret (-nth e 0) (-nth e 1))
+ (next es))
+ (throw (js/Error. "conj on a map takes map entries or seqables of map entries"))))))))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY PersistentArrayMap) meta))
+
+ IEquiv
+ (-equiv [coll other]
+ (if (and (map? other) (not (record? other)))
+ (let [alen (alength arr)
+ ^not-native other other]
+ (if (== cnt (-count other))
+ (loop [i 0]
+ (if (< i alen)
+ (let [v (-lookup other (aget arr i) lookup-sentinel)]
+ (if-not (identical? v lookup-sentinel)
+ (if (= (aget arr (inc i)) v)
+ (recur (+ i 2))
+ false)
+ false))
+ true))
+ false))
+ false))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ IIterable
+ (-iterator [this]
+ (PersistentArrayMapIterator. arr 0 (* cnt 2)))
+
+ ISeqable
+ (-seq [coll]
+ (persistent-array-map-seq arr 0 nil))
+
+ ICounted
+ (-count [coll] cnt)
+
+ ILookup
+ (-lookup [coll k]
+ (-lookup coll k nil))
+
+ (-lookup [coll k not-found]
+ (let [idx (array-map-index-of coll k)]
+ (if (== idx -1)
+ not-found
+ (aget arr (inc idx)))))
+
+ IAssociative
+ (-assoc [coll k v]
+ (let [idx (array-map-index-of coll k)]
+ (cond
+ (== idx -1)
+ (if (< cnt (.-HASHMAP-THRESHOLD PersistentArrayMap))
+ (let [arr (array-map-extend-kv coll k v)]
+ (PersistentArrayMap. meta (inc cnt) arr nil))
+ (-> (into (.-EMPTY PersistentHashMap) coll)
+ (-assoc k v)
+ (-with-meta meta)))
+
+ (identical? v (aget arr (inc idx)))
+ coll
+
+ :else
+ (let [arr (doto (aclone arr)
+ (aset (inc idx) v))]
+ (PersistentArrayMap. meta cnt arr nil)))))
+
+ (-contains-key? [coll k]
+ (not (== (array-map-index-of coll k) -1)))
+
+ IFind
+ (-find [coll k]
+ (let [idx (array-map-index-of coll k)]
+ (when-not (== idx -1)
+ (MapEntry. (aget arr idx) (aget arr (inc idx)) nil))))
+
+ IMap
+ (-dissoc [coll k]
+ (let [idx (array-map-index-of coll k)]
+ (if (>= idx 0)
+ (let [len (alength arr)
+ new-len (- len 2)]
+ (if (zero? new-len)
+ (-empty coll)
+ (let [new-arr (make-array new-len)]
+ (loop [s 0 d 0]
+ (cond
+ (>= s len) (PersistentArrayMap. meta (dec cnt) new-arr nil)
+ (= k (aget arr s)) (recur (+ s 2) d)
+ :else (do (aset new-arr d (aget arr s))
+ (aset new-arr (inc d) (aget arr (inc s)))
+ (recur (+ s 2) (+ d 2))))))))
+ coll)))
+
+ IKVReduce
+ (-kv-reduce [coll f init]
+ (let [len (alength arr)]
+ (loop [i 0 init init]
+ (if (< i len)
+ (let [init (f init (aget arr i) (aget arr (inc i)))]
+ (if (reduced? init)
+ @init
+ (recur (+ i 2) init)))
+ init))))
+
+ IReduce
+ (-reduce [coll f]
+ (iter-reduce coll f))
+ (-reduce [coll f start]
+ (iter-reduce coll f start))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found))
+
+ IEditableCollection
+ (-as-transient [coll]
+ (TransientArrayMap. (js-obj) (alength arr) (aclone arr))))
+
+(set! (.-EMPTY PersistentArrayMap) (PersistentArrayMap. nil 0 (array) empty-unordered-hash))
+
+(set! (.-HASHMAP-THRESHOLD PersistentArrayMap) 8)
+
+(set! (.-fromArray PersistentArrayMap)
+ (fn [arr ^boolean no-clone ^boolean no-check]
+ (as-> (if no-clone arr (aclone arr)) arr
+ (if no-check
+ arr
+ (let [ret (array)]
+ (loop [i 0]
+ (when (< i (alength arr))
+ (let [k (aget arr i)
+ v (aget arr (inc i))
+ idx (array-index-of ret k)]
+ (when (== idx -1)
+ (.push ret k)
+ (.push ret v)))
+ (recur (+ i 2))))
+ ret))
+ (let [cnt (/ (alength arr) 2)]
+ (PersistentArrayMap. nil cnt arr nil)))))
+
+(set! (.-createWithCheck PersistentArrayMap)
+ (fn [arr]
+ (let [ret (array)]
+ (loop [i 0]
+ (when (< i (alength arr))
+ (let [k (aget arr i)
+ v (aget arr (inc i))
+ idx (array-index-of ret k)]
+ (if (== idx -1)
+ (doto ret (.push k) (.push v))
+ (throw (js/Error. (str "Duplicate key: " k)))))
+ (recur (+ i 2))))
+ (let [cnt (/ (alength arr) 2)]
+ (PersistentArrayMap. nil cnt arr nil)))))
+
+(set! (.-createAsIfByAssoc PersistentArrayMap)
+ (fn [arr]
+ (let [ret (array)]
+ (loop [i 0]
+ (when (< i (alength arr))
+ (let [k (aget arr i)
+ v (aget arr (inc i))
+ idx (array-index-of ret k)]
+ (if (== idx -1)
+ (doto ret (.push k) (.push v))
+ (aset ret (inc idx) v)))
+ (recur (+ i 2))))
+ (PersistentArrayMap. nil (/ (alength ret) 2) ret nil))))
+
+(es6-iterable PersistentArrayMap)
+
+(declare array->transient-hash-map)
+
+(deftype TransientArrayMap [^:mutable editable?
+ ^:mutable len
+ arr]
+ ICounted
+ (-count [tcoll]
+ (if editable?
+ (quot len 2)
+ (throw (js/Error. "count after persistent!"))))
+
+ ILookup
+ (-lookup [tcoll k]
+ (-lookup tcoll k nil))
+
+ (-lookup [tcoll k not-found]
+ (if editable?
+ (let [idx (array-map-index-of tcoll k)]
+ (if (== idx -1)
+ not-found
+ (aget arr (inc idx))))
+ (throw (js/Error. "lookup after persistent!"))))
+
+ ITransientCollection
+ (-conj! [tcoll o]
+ (if editable?
+ (cond
+ (map-entry? o)
+ (-assoc! tcoll (key o) (val o))
+
+ (vector? o)
+ (-assoc! tcoll (o 0) (o 1))
+
+ :else
+ (loop [es (seq o) tcoll tcoll]
+ (if-let [e (first es)]
+ (recur (next es)
+ (-assoc! tcoll (key e) (val e)))
+ tcoll)))
+ (throw (js/Error. "conj! after persistent!"))))
+
+ (-persistent! [tcoll]
+ (if editable?
+ (do (set! editable? false)
+ (PersistentArrayMap. nil (quot len 2) arr nil))
+ (throw (js/Error. "persistent! called twice"))))
+
+ ITransientAssociative
+ (-assoc! [tcoll key val]
+ (if editable?
+ (let [idx (array-map-index-of tcoll key)]
+ (if (== idx -1)
+ (if (<= (+ len 2) (* 2 (.-HASHMAP-THRESHOLD PersistentArrayMap)))
+ (do (set! len (+ len 2))
+ (.push arr key)
+ (.push arr val)
+ tcoll)
+ (assoc! (array->transient-hash-map len arr) key val))
+ (if (identical? val (aget arr (inc idx)))
+ tcoll
+ (do (aset arr (inc idx) val)
+ tcoll))))
+ (throw (js/Error. "assoc! after persistent!"))))
+
+ ITransientMap
+ (-dissoc! [tcoll key]
+ (if editable?
+ (let [idx (array-map-index-of tcoll key)]
+ (when (>= idx 0)
+ (aset arr idx (aget arr (- len 2)))
+ (aset arr (inc idx) (aget arr (dec len)))
+ (doto arr .pop .pop)
+ (set! len (- len 2)))
+ tcoll)
+ (throw (js/Error. "dissoc! after persistent!"))))
+
+ IFn
+ (-invoke [tcoll key]
+ (-lookup tcoll key nil))
+ (-invoke [tcoll key not-found]
+ (-lookup tcoll key not-found)))
+
+(declare TransientHashMap)
+
+(defn- array->transient-hash-map [len arr]
+ (loop [out (transient (.-EMPTY PersistentHashMap))
+ i 0]
+ (if (< i len)
+ (recur (assoc! out (aget arr i) (aget arr (inc i))) (+ i 2))
+ out)))
+
+;;; PersistentHashMap
+
+(deftype Box [^:mutable val])
+
+(declare create-inode-seq create-array-node-seq reset! create-node atom deref)
+
+(defn ^boolean key-test [key other]
+ (cond
+ (identical? key other) true
+ (keyword-identical? key other) true
+ :else (= key other)))
+
+(defn- mask [hash shift]
+ (bit-and (bit-shift-right-zero-fill hash shift) 0x01f))
+
+(defn- clone-and-set
+ ([arr i a]
+ (doto (aclone arr)
+ (aset i a)))
+ ([arr i a j b]
+ (doto (aclone arr)
+ (aset i a)
+ (aset j b))))
+
+(defn- remove-pair [arr i]
+ (let [new-arr (make-array (- (alength arr) 2))]
+ (array-copy arr 0 new-arr 0 (* 2 i))
+ (array-copy arr (* 2 (inc i)) new-arr (* 2 i) (- (alength new-arr) (* 2 i)))
+ new-arr))
+
+(defn- bitmap-indexed-node-index [bitmap bit]
+ (bit-count (bit-and bitmap (dec bit))))
+
+(defn- bitpos [hash shift]
+ (bit-shift-left 1 (mask hash shift)))
+
+(defn- edit-and-set
+ ([inode edit i a]
+ (let [editable (.ensure-editable inode edit)]
+ (aset (.-arr editable) i a)
+ editable))
+ ([inode edit i a j b]
+ (let [editable (.ensure-editable inode edit)]
+ (aset (.-arr editable) i a)
+ (aset (.-arr editable) j b)
+ editable)))
+
+(defn- inode-kv-reduce [arr f init]
+ (let [len (alength arr)]
+ (loop [i 0 init init]
+ (if (< i len)
+ (let [init (let [k (aget arr i)]
+ (if-not (nil? k)
+ (f init k (aget arr (inc i)))
+ (let [node (aget arr (inc i))]
+ (if-not (nil? node)
+ (.kv-reduce node f init)
+ init))))]
+ (if (reduced? init)
+ init
+ (recur (+ i 2) init)))
+ init))))
+
+(declare ArrayNode)
+
+ (deftype NodeIterator [arr ^:mutable i ^:mutable next-entry ^:mutable next-iter]
+ Object
+ (advance [this]
+ (let [len (alength arr)]
+ (loop []
+ (if (< i len)
+ (let [key (aget arr i)
+ node-or-val (aget arr (inc i))
+ ^boolean found
+ (cond (some? key)
+ (set! next-entry (MapEntry. key node-or-val nil))
+ (some? node-or-val)
+ (let [new-iter (-iterator node-or-val)]
+ (if ^boolean (.hasNext new-iter)
+ (set! next-iter new-iter)
+ false))
+ :else false)]
+ (set! i (+ i 2))
+ (if found true (recur)))
+ false))))
+ (hasNext [this]
+ (or (some? next-entry) (some? next-iter) (.advance this)))
+ (next [this]
+ (cond
+ (some? next-entry)
+ (let [ret next-entry]
+ (set! next-entry nil)
+ ret)
+ (some? next-iter)
+ (let [ret (.next next-iter)]
+ (when-not ^boolean (.hasNext next-iter)
+ (set! next-iter nil))
+ ret)
+ ^boolean (.advance this)
+ (.next this)
+ :else (throw (js/Error. "No such element"))))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(deftype BitmapIndexedNode [edit ^:mutable bitmap ^:mutable arr]
+ Object
+ (inode-assoc [inode shift hash key val added-leaf?]
+ (let [bit (bitpos hash shift)
+ idx (bitmap-indexed-node-index bitmap bit)]
+ (if (zero? (bit-and bitmap bit))
+ (let [n (bit-count bitmap)]
+ (if (>= n 16)
+ (let [nodes (make-array 32)
+ jdx (mask hash shift)]
+ (aset nodes jdx (.inode-assoc (.-EMPTY BitmapIndexedNode) (+ shift 5) hash key val added-leaf?))
+ (loop [i 0 j 0]
+ (if (< i 32)
+ (if (zero? (bit-and (bit-shift-right-zero-fill bitmap i) 1))
+ (recur (inc i) j)
+ (do (aset nodes i
+ (if-not (nil? (aget arr j))
+ (.inode-assoc (.-EMPTY BitmapIndexedNode)
+ (+ shift 5) (cljs.core/hash (aget arr j)) (aget arr j) (aget arr (inc j)) added-leaf?)
+ (aget arr (inc j))))
+ (recur (inc i) (+ j 2))))))
+ (ArrayNode. nil (inc n) nodes))
+ (let [new-arr (make-array (* 2 (inc n)))]
+ (array-copy arr 0 new-arr 0 (* 2 idx))
+ (aset new-arr (* 2 idx) key)
+ (aset new-arr (inc (* 2 idx)) val)
+ (array-copy arr (* 2 idx) new-arr (* 2 (inc idx)) (* 2 (- n idx)))
+ (set! (.-val added-leaf?) true)
+ (BitmapIndexedNode. nil (bit-or bitmap bit) new-arr))))
+ (let [key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil)
+ (let [n (.inode-assoc val-or-node (+ shift 5) hash key val added-leaf?)]
+ (if (identical? n val-or-node)
+ inode
+ (BitmapIndexedNode. nil bitmap (clone-and-set arr (inc (* 2 idx)) n))))
+
+ (key-test key key-or-nil)
+ (if (identical? val val-or-node)
+ inode
+ (BitmapIndexedNode. nil bitmap (clone-and-set arr (inc (* 2 idx)) val)))
+
+ :else
+ (do (set! (.-val added-leaf?) true)
+ (BitmapIndexedNode. nil bitmap
+ (clone-and-set arr (* 2 idx) nil (inc (* 2 idx))
+ (create-node (+ shift 5) key-or-nil val-or-node hash key val)))))))))
+
+ (inode-without [inode shift hash key]
+ (let [bit (bitpos hash shift)]
+ (if (zero? (bit-and bitmap bit))
+ inode
+ (let [idx (bitmap-indexed-node-index bitmap bit)
+ key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil)
+ (let [n (.inode-without val-or-node (+ shift 5) hash key)]
+ (cond (identical? n val-or-node) inode
+ (not (nil? n)) (BitmapIndexedNode. nil bitmap (clone-and-set arr (inc (* 2 idx)) n))
+ (== bitmap bit) nil
+ :else (BitmapIndexedNode. nil (bit-xor bitmap bit) (remove-pair arr idx))))
+ (key-test key key-or-nil)
+ (BitmapIndexedNode. nil (bit-xor bitmap bit) (remove-pair arr idx))
+ :else inode)))))
+
+ (inode-lookup [inode shift hash key not-found]
+ (let [bit (bitpos hash shift)]
+ (if (zero? (bit-and bitmap bit))
+ not-found
+ (let [idx (bitmap-indexed-node-index bitmap bit)
+ key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil) (.inode-lookup val-or-node (+ shift 5) hash key not-found)
+ (key-test key key-or-nil) val-or-node
+ :else not-found)))))
+
+ (inode-find [inode shift hash key not-found]
+ (let [bit (bitpos hash shift)]
+ (if (zero? (bit-and bitmap bit))
+ not-found
+ (let [idx (bitmap-indexed-node-index bitmap bit)
+ key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil) (.inode-find val-or-node (+ shift 5) hash key not-found)
+ (key-test key key-or-nil) (MapEntry. key-or-nil val-or-node nil)
+ :else not-found)))))
+
+ (inode-seq [inode]
+ (create-inode-seq arr))
+
+ (ensure-editable [inode e]
+ (if (identical? e edit)
+ inode
+ (let [n (bit-count bitmap)
+ new-arr (make-array (if (neg? n) 4 (* 2 (inc n))))]
+ (array-copy arr 0 new-arr 0 (* 2 n))
+ (BitmapIndexedNode. e bitmap new-arr))))
+
+ (edit-and-remove-pair [inode e bit i]
+ (if (== bitmap bit)
+ nil
+ (let [editable (.ensure-editable inode e)
+ earr (.-arr editable)
+ len (alength earr)]
+ (set! (.-bitmap editable) (bit-xor bit (.-bitmap editable)))
+ (array-copy earr (* 2 (inc i))
+ earr (* 2 i)
+ (- len (* 2 (inc i))))
+ (aset earr (- len 2) nil)
+ (aset earr (dec len) nil)
+ editable)))
+
+ (inode-assoc! [inode edit shift hash key val added-leaf?]
+ (let [bit (bitpos hash shift)
+ idx (bitmap-indexed-node-index bitmap bit)]
+ (if (zero? (bit-and bitmap bit))
+ (let [n (bit-count bitmap)]
+ (cond
+ (< (* 2 n) (alength arr))
+ (let [editable (.ensure-editable inode edit)
+ earr (.-arr editable)]
+ (set! (.-val added-leaf?) true)
+ (array-copy-downward earr (* 2 idx)
+ earr (* 2 (inc idx))
+ (* 2 (- n idx)))
+ (aset earr (* 2 idx) key)
+ (aset earr (inc (* 2 idx)) val)
+ (set! (.-bitmap editable) (bit-or (.-bitmap editable) bit))
+ editable)
+
+ (>= n 16)
+ (let [nodes (make-array 32)
+ jdx (mask hash shift)]
+ (aset nodes jdx (.inode-assoc! (.-EMPTY BitmapIndexedNode) edit (+ shift 5) hash key val added-leaf?))
+ (loop [i 0 j 0]
+ (if (< i 32)
+ (if (zero? (bit-and (bit-shift-right-zero-fill bitmap i) 1))
+ (recur (inc i) j)
+ (do (aset nodes i
+ (if-not (nil? (aget arr j))
+ (.inode-assoc! (.-EMPTY BitmapIndexedNode)
+ edit (+ shift 5) (cljs.core/hash (aget arr j)) (aget arr j) (aget arr (inc j)) added-leaf?)
+ (aget arr (inc j))))
+ (recur (inc i) (+ j 2))))))
+ (ArrayNode. edit (inc n) nodes))
+
+ :else
+ (let [new-arr (make-array (* 2 (+ n 4)))]
+ (array-copy arr 0 new-arr 0 (* 2 idx))
+ (aset new-arr (* 2 idx) key)
+ (aset new-arr (inc (* 2 idx)) val)
+ (array-copy arr (* 2 idx) new-arr (* 2 (inc idx)) (* 2 (- n idx)))
+ (set! (.-val added-leaf?) true)
+ (let [editable (.ensure-editable inode edit)]
+ (set! (.-arr editable) new-arr)
+ (set! (.-bitmap editable) (bit-or (.-bitmap editable) bit))
+ editable))))
+ (let [key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil)
+ (let [n (.inode-assoc! val-or-node edit (+ shift 5) hash key val added-leaf?)]
+ (if (identical? n val-or-node)
+ inode
+ (edit-and-set inode edit (inc (* 2 idx)) n)))
+
+ (key-test key key-or-nil)
+ (if (identical? val val-or-node)
+ inode
+ (edit-and-set inode edit (inc (* 2 idx)) val))
+
+ :else
+ (do (set! (.-val added-leaf?) true)
+ (edit-and-set inode edit (* 2 idx) nil (inc (* 2 idx))
+ (create-node edit (+ shift 5) key-or-nil val-or-node hash key val))))))))
+
+ (inode-without! [inode edit shift hash key removed-leaf?]
+ (let [bit (bitpos hash shift)]
+ (if (zero? (bit-and bitmap bit))
+ inode
+ (let [idx (bitmap-indexed-node-index bitmap bit)
+ key-or-nil (aget arr (* 2 idx))
+ val-or-node (aget arr (inc (* 2 idx)))]
+ (cond (nil? key-or-nil)
+ (let [n (.inode-without! val-or-node edit (+ shift 5) hash key removed-leaf?)]
+ (cond (identical? n val-or-node) inode
+ (not (nil? n)) (edit-and-set inode edit (inc (* 2 idx)) n)
+ (== bitmap bit) nil
+ :else (.edit-and-remove-pair inode edit bit idx)))
+ (key-test key key-or-nil)
+ (do (set! (.-val removed-leaf?) true)
+ (.edit-and-remove-pair inode edit bit idx))
+ :else inode)))))
+
+ (kv-reduce [inode f init]
+ (inode-kv-reduce arr f init))
+
+ IIterable
+ (-iterator [coll]
+ (NodeIterator. arr 0 nil nil)))
+
+(set! (.-EMPTY BitmapIndexedNode) (BitmapIndexedNode. nil 0 (make-array 0)))
+
+(defn- pack-array-node [array-node edit idx]
+ (let [arr (.-arr array-node)
+ len (alength arr)
+ new-arr (make-array (* 2 (dec (.-cnt array-node))))]
+ (loop [i 0 j 1 bitmap 0]
+ (if (< i len)
+ (if (and (not (== i idx))
+ (not (nil? (aget arr i))))
+ (do (aset new-arr j (aget arr i))
+ (recur (inc i) (+ j 2) (bit-or bitmap (bit-shift-left 1 i))))
+ (recur (inc i) j bitmap))
+ (BitmapIndexedNode. edit bitmap new-arr)))))
+
+(deftype ArrayNodeIterator [arr ^:mutable i ^:mutable next-iter]
+ Object
+ (hasNext [this]
+ (let [len (alength arr)]
+ (loop []
+ (if-not (and (some? next-iter) ^boolean (.hasNext next-iter))
+ (if (< i len)
+ (let [node (aget arr i)]
+ (set! i (inc i))
+ (when (some? node)
+ (set! next-iter (-iterator node)))
+ (recur))
+ false)
+ true))))
+ (next [this]
+ (if ^boolean (.hasNext this)
+ (.next next-iter)
+ (throw (js/Error. "No such element"))))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(deftype ArrayNode [edit ^:mutable cnt ^:mutable arr]
+ Object
+ (inode-assoc [inode shift hash key val added-leaf?]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if (nil? node)
+ (ArrayNode. nil (inc cnt) (clone-and-set arr idx (.inode-assoc (.-EMPTY BitmapIndexedNode) (+ shift 5) hash key val added-leaf?)))
+ (let [n (.inode-assoc node (+ shift 5) hash key val added-leaf?)]
+ (if (identical? n node)
+ inode
+ (ArrayNode. nil cnt (clone-and-set arr idx n)))))))
+
+ (inode-without [inode shift hash key]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if-not (nil? node)
+ (let [n (.inode-without node (+ shift 5) hash key)]
+ (cond
+ (identical? n node)
+ inode
+
+ (nil? n)
+ (if (<= cnt 8)
+ (pack-array-node inode nil idx)
+ (ArrayNode. nil (dec cnt) (clone-and-set arr idx n)))
+
+ :else
+ (ArrayNode. nil cnt (clone-and-set arr idx n))))
+ inode)))
+
+ (inode-lookup [inode shift hash key not-found]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if-not (nil? node)
+ (.inode-lookup node (+ shift 5) hash key not-found)
+ not-found)))
+
+ (inode-find [inode shift hash key not-found]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if-not (nil? node)
+ (.inode-find node (+ shift 5) hash key not-found)
+ not-found)))
+
+ (inode-seq [inode]
+ (create-array-node-seq arr))
+
+ (ensure-editable [inode e]
+ (if (identical? e edit)
+ inode
+ (ArrayNode. e cnt (aclone arr))))
+
+ (inode-assoc! [inode edit shift hash key val added-leaf?]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if (nil? node)
+ (let [editable (edit-and-set inode edit idx (.inode-assoc! (.-EMPTY BitmapIndexedNode) edit (+ shift 5) hash key val added-leaf?))]
+ (set! (.-cnt editable) (inc (.-cnt editable)))
+ editable)
+ (let [n (.inode-assoc! node edit (+ shift 5) hash key val added-leaf?)]
+ (if (identical? n node)
+ inode
+ (edit-and-set inode edit idx n))))))
+
+ (inode-without! [inode edit shift hash key removed-leaf?]
+ (let [idx (mask hash shift)
+ node (aget arr idx)]
+ (if (nil? node)
+ inode
+ (let [n (.inode-without! node edit (+ shift 5) hash key removed-leaf?)]
+ (cond
+ (identical? n node)
+ inode
+
+ (nil? n)
+ (if (<= cnt 8)
+ (pack-array-node inode edit idx)
+ (let [editable (edit-and-set inode edit idx n)]
+ (set! (.-cnt editable) (dec (.-cnt editable)))
+ editable))
+
+ :else
+ (edit-and-set inode edit idx n))))))
+
+ (kv-reduce [inode f init]
+ (let [len (alength arr)] ; actually 32
+ (loop [i 0 init init]
+ (if (< i len)
+ (let [node (aget arr i)]
+ (if-not (nil? node)
+ (let [init (.kv-reduce node f init)]
+ (if (reduced? init)
+ init
+ (recur (inc i) init)))
+ (recur (inc i) init)))
+ init))))
+
+ IIterable
+ (-iterator [coll]
+ (ArrayNodeIterator. arr 0 nil)))
+
+(defn- hash-collision-node-find-index [arr cnt key]
+ (let [lim (* 2 cnt)]
+ (loop [i 0]
+ (if (< i lim)
+ (if (key-test key (aget arr i))
+ i
+ (recur (+ i 2)))
+ -1))))
+
+(deftype HashCollisionNode [edit
+ ^:mutable collision-hash
+ ^:mutable cnt
+ ^:mutable arr]
+ Object
+ (inode-assoc [inode shift hash key val added-leaf?]
+ (if (== hash collision-hash)
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (if (== idx -1)
+ (let [len (* 2 cnt)
+ new-arr (make-array (+ len 2))]
+ (array-copy arr 0 new-arr 0 len)
+ (aset new-arr len key)
+ (aset new-arr (inc len) val)
+ (set! (.-val added-leaf?) true)
+ (HashCollisionNode. nil collision-hash (inc cnt) new-arr))
+ (if (= (aget arr (inc idx)) val)
+ inode
+ (HashCollisionNode. nil collision-hash cnt (clone-and-set arr (inc idx) val)))))
+ (.inode-assoc (BitmapIndexedNode. nil (bitpos collision-hash shift) (array nil inode))
+ shift hash key val added-leaf?)))
+
+ (inode-without [inode shift hash key]
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (cond (== idx -1) inode
+ (== cnt 1) nil
+ :else (HashCollisionNode. nil collision-hash (dec cnt) (remove-pair arr (quot idx 2))))))
+
+ (inode-lookup [inode shift hash key not-found]
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (cond (< idx 0) not-found
+ (key-test key (aget arr idx)) (aget arr (inc idx))
+ :else not-found)))
+
+ (inode-find [inode shift hash key not-found]
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (cond (< idx 0) not-found
+ (key-test key (aget arr idx)) (MapEntry. (aget arr idx) (aget arr (inc idx)) nil)
+ :else not-found)))
+
+ (inode-seq [inode]
+ (create-inode-seq arr))
+
+ (ensure-editable [inode e]
+ (if (identical? e edit)
+ inode
+ (let [new-arr (make-array (* 2 (inc cnt)))]
+ (array-copy arr 0 new-arr 0 (* 2 cnt))
+ (HashCollisionNode. e collision-hash cnt new-arr))))
+
+ (ensure-editable-array [inode e count array]
+ (if (identical? e edit)
+ (do (set! arr array)
+ (set! cnt count)
+ inode)
+ (HashCollisionNode. edit collision-hash count array)))
+
+ (inode-assoc! [inode edit shift hash key val added-leaf?]
+ (if (== hash collision-hash)
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (if (== idx -1)
+ (if (> (alength arr) (* 2 cnt))
+ (let [editable (edit-and-set inode edit (* 2 cnt) key (inc (* 2 cnt)) val)]
+ (set! (.-val added-leaf?) true)
+ (set! (.-cnt editable) (inc (.-cnt editable)))
+ editable)
+ (let [len (alength arr)
+ new-arr (make-array (+ len 2))]
+ (array-copy arr 0 new-arr 0 len)
+ (aset new-arr len key)
+ (aset new-arr (inc len) val)
+ (set! (.-val added-leaf?) true)
+ (.ensure-editable-array inode edit (inc cnt) new-arr)))
+ (if (identical? (aget arr (inc idx)) val)
+ inode
+ (edit-and-set inode edit (inc idx) val))))
+ (.inode-assoc! (BitmapIndexedNode. edit (bitpos collision-hash shift) (array nil inode nil nil))
+ edit shift hash key val added-leaf?)))
+
+ (inode-without! [inode edit shift hash key removed-leaf?]
+ (let [idx (hash-collision-node-find-index arr cnt key)]
+ (if (== idx -1)
+ inode
+ (do (set! (.-val removed-leaf?) true)
+ (if (== cnt 1)
+ nil
+ (let [editable (.ensure-editable inode edit)
+ earr (.-arr editable)]
+ (aset earr idx (aget earr (- (* 2 cnt) 2)))
+ (aset earr (inc idx) (aget earr (dec (* 2 cnt))))
+ (aset earr (dec (* 2 cnt)) nil)
+ (aset earr (- (* 2 cnt) 2) nil)
+ (set! (.-cnt editable) (dec (.-cnt editable)))
+ editable))))))
+
+ (kv-reduce [inode f init]
+ (inode-kv-reduce arr f init))
+
+ IIterable
+ (-iterator [coll]
+ (NodeIterator. arr 0 nil nil)))
+
+(defn- create-node
+ ([shift key1 val1 key2hash key2 val2]
+ (let [key1hash (hash key1)]
+ (if (== key1hash key2hash)
+ (HashCollisionNode. nil key1hash 2 (array key1 val1 key2 val2))
+ (let [added-leaf? (Box. false)]
+ (-> (.-EMPTY BitmapIndexedNode)
+ (.inode-assoc shift key1hash key1 val1 added-leaf?)
+ (.inode-assoc shift key2hash key2 val2 added-leaf?))))))
+ ([edit shift key1 val1 key2hash key2 val2]
+ (let [key1hash (hash key1)]
+ (if (== key1hash key2hash)
+ (HashCollisionNode. nil key1hash 2 (array key1 val1 key2 val2))
+ (let [added-leaf? (Box. false)]
+ (-> (.-EMPTY BitmapIndexedNode)
+ (.inode-assoc! edit shift key1hash key1 val1 added-leaf?)
+ (.inode-assoc! edit shift key2hash key2 val2 added-leaf?)))))))
+
+(deftype NodeSeq [meta nodes i s ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMeta
+ (-meta [coll] meta)
+
+ IWithMeta
+ (-with-meta [coll meta] (NodeSeq. meta nodes i s __hash))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ ISequential
+ ISeq
+ (-first [coll]
+ (if (nil? s)
+ (MapEntry. (aget nodes i) (aget nodes (inc i)) nil)
+ (first s)))
+
+ (-rest [coll]
+ (let [ret (if (nil? s)
+ (create-inode-seq nodes (+ i 2) nil)
+ (create-inode-seq nodes i (next s)))]
+ (if-not (nil? ret) ret ())))
+
+ INext
+ (-next [coll]
+ (if (nil? s)
+ (create-inode-seq nodes (+ i 2) nil)
+ (create-inode-seq nodes i (next s))))
+
+ ISeqable
+ (-seq [this] this)
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable NodeSeq)
+
+(defn- create-inode-seq
+ ([nodes]
+ (create-inode-seq nodes 0 nil))
+ ([nodes i s]
+ (if (nil? s)
+ (let [len (alength nodes)]
+ (loop [j i]
+ (if (< j len)
+ (if-not (nil? (aget nodes j))
+ (NodeSeq. nil nodes j nil nil)
+ (if-let [node (aget nodes (inc j))]
+ (if-let [node-seq (.inode-seq node)]
+ (NodeSeq. nil nodes (+ j 2) node-seq nil)
+ (recur (+ j 2)))
+ (recur (+ j 2)))))))
+ (NodeSeq. nil nodes i s nil))))
+
+(deftype ArrayNodeSeq [meta nodes i s ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMeta
+ (-meta [coll] meta)
+
+ IWithMeta
+ (-with-meta [coll meta] (ArrayNodeSeq. meta nodes i s __hash))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ ISequential
+ ISeq
+ (-first [coll] (first s))
+ (-rest [coll]
+ (let [ret (create-array-node-seq nil nodes i (next s))]
+ (if-not (nil? ret) ret ())))
+
+ INext
+ (-next [coll]
+ (create-array-node-seq nil nodes i (next s)))
+
+ ISeqable
+ (-seq [this] this)
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable ArrayNodeSeq)
+
+(defn- create-array-node-seq
+ ([nodes] (create-array-node-seq nil nodes 0 nil))
+ ([meta nodes i s]
+ (if (nil? s)
+ (let [len (alength nodes)]
+ (loop [j i]
+ (if (< j len)
+ (if-let [nj (aget nodes j)]
+ (if-let [ns (.inode-seq nj)]
+ (ArrayNodeSeq. meta nodes (inc j) ns nil)
+ (recur (inc j)))
+ (recur (inc j))))))
+ (ArrayNodeSeq. meta nodes i s nil))))
+
+(deftype HashMapIter [nil-val root-iter ^:mutable seen]
+ Object
+ (hasNext [_]
+ (or (not ^boolean seen) ^boolean (.hasNext root-iter)))
+ (next [_]
+ (if-not ^boolean seen
+ (do
+ (set! seen true)
+ (MapEntry. nil nil-val nil))
+ (.next root-iter)))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(deftype PersistentHashMap [meta cnt root ^boolean has-nil? nil-val ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ ;; EXPERIMENTAL: subject to change
+ (keys [coll]
+ (es6-iterator (keys coll)))
+ (entries [coll]
+ (es6-entries-iterator (seq coll)))
+ (values [coll]
+ (es6-iterator (vals coll)))
+ (has [coll k]
+ (contains? coll k))
+ (get [coll k not-found]
+ (-lookup coll k not-found))
+ (forEach [coll f]
+ (doseq [[k v] coll]
+ (f v k)))
+
+ ICloneable
+ (-clone [_] (PersistentHashMap. meta cnt root has-nil? nil-val __hash))
+
+ IIterable
+ (-iterator [coll]
+ (let [root-iter (if ^boolean root (-iterator root) (nil-iter))]
+ (if has-nil?
+ (HashMapIter. nil-val root-iter false)
+ root-iter)))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentHashMap. meta cnt root has-nil? nil-val __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll entry]
+ (if (vector? entry)
+ (-assoc coll (-nth entry 0) (-nth entry 1))
+ (loop [ret coll es (seq entry)]
+ (if (nil? es)
+ ret
+ (let [e (first es)]
+ (if (vector? e)
+ (recur (-assoc ret (-nth e 0) (-nth e 1))
+ (next es))
+ (throw (js/Error. "conj on a map takes map entries or seqables of map entries"))))))))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY PersistentHashMap) meta))
+
+ IEquiv
+ (-equiv [coll other] (equiv-map coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ ISeqable
+ (-seq [coll]
+ (when (pos? cnt)
+ (let [s (if-not (nil? root) (.inode-seq root))]
+ (if has-nil?
+ (cons (MapEntry. nil nil-val nil) s)
+ s))))
+
+ ICounted
+ (-count [coll] cnt)
+
+ ILookup
+ (-lookup [coll k]
+ (-lookup coll k nil))
+
+ (-lookup [coll k not-found]
+ (cond (nil? k) (if has-nil?
+ nil-val
+ not-found)
+ (nil? root) not-found
+ :else (.inode-lookup root 0 (hash k) k not-found)))
+
+ IAssociative
+ (-assoc [coll k v]
+ (if (nil? k)
+ (if (and has-nil? (identical? v nil-val))
+ coll
+ (PersistentHashMap. meta (if has-nil? cnt (inc cnt)) root true v nil))
+ (let [added-leaf? (Box. false)
+ new-root (-> (if (nil? root)
+ (.-EMPTY BitmapIndexedNode)
+ root)
+ (.inode-assoc 0 (hash k) k v added-leaf?))]
+ (if (identical? new-root root)
+ coll
+ (PersistentHashMap. meta (if ^boolean (.-val added-leaf?) (inc cnt) cnt) new-root has-nil? nil-val nil)))))
+
+ (-contains-key? [coll k]
+ (cond (nil? k) has-nil?
+ (nil? root) false
+ :else (not (identical? (.inode-lookup root 0 (hash k) k lookup-sentinel)
+ lookup-sentinel))))
+
+ IFind
+ (-find [coll k]
+ (cond
+ (nil? k) (when has-nil? (MapEntry. nil nil-val nil))
+ (nil? root) nil
+ :else (.inode-find root 0 (hash k) k nil)))
+
+ IMap
+ (-dissoc [coll k]
+ (cond (nil? k) (if has-nil?
+ (PersistentHashMap. meta (dec cnt) root false nil nil)
+ coll)
+ (nil? root) coll
+ :else
+ (let [new-root (.inode-without root 0 (hash k) k)]
+ (if (identical? new-root root)
+ coll
+ (PersistentHashMap. meta (dec cnt) new-root has-nil? nil-val nil)))))
+
+ IKVReduce
+ (-kv-reduce [coll f init]
+ (let [init (if has-nil? (f init nil nil-val) init)]
+ (cond
+ (reduced? init) @init
+ (not (nil? root)) (unreduced (.kv-reduce root f init))
+ :else init)))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found))
+
+ IEditableCollection
+ (-as-transient [coll]
+ (TransientHashMap. (js-obj) root cnt has-nil? nil-val)))
+
+(set! (.-EMPTY PersistentHashMap) (PersistentHashMap. nil 0 nil false nil empty-unordered-hash))
+
+(set! (.-fromArray PersistentHashMap)
+ (fn [arr ^boolean no-clone]
+ (let [arr (if no-clone arr (aclone arr))
+ len (alength arr)]
+ (loop [i 0 ret (transient (.-EMPTY PersistentHashMap))]
+ (if (< i len)
+ (recur (+ i 2)
+ (-assoc! ret (aget arr i) (aget arr (inc i))))
+ (-persistent! ret))))))
+
+(set! (.-fromArrays PersistentHashMap)
+ (fn [ks vs]
+ (let [len (alength ks)]
+ (loop [i 0 ^not-native out (transient (.-EMPTY PersistentHashMap))]
+ (if (< i len)
+ (recur (inc i) (-assoc! out (aget ks i) (aget vs i)))
+ (persistent! out))))))
+
+(set! (.-createWithCheck PersistentHashMap)
+ (fn [arr]
+ (let [len (alength arr)
+ ret (transient (.-EMPTY PersistentHashMap))]
+ (loop [i 0]
+ (when (< i len)
+ (-assoc! ret (aget arr i) (aget arr (inc i)))
+ (if (not= (-count ret) (inc (/ i 2)))
+ (throw (js/Error. (str "Duplicate key: " (aget arr i))))
+ (recur (+ i 2)))))
+ (-persistent! ret))))
+
+(es6-iterable PersistentHashMap)
+
+(deftype TransientHashMap [^:mutable ^boolean edit
+ ^:mutable root
+ ^:mutable count
+ ^:mutable ^boolean has-nil?
+ ^:mutable nil-val]
+ Object
+ (conj! [tcoll o]
+ (if edit
+ (cond
+ (map-entry? o)
+ (.assoc! tcoll (key o) (val o))
+
+ (vector? o)
+ (.assoc! tcoll (o 0) (o 1))
+
+ :else
+ (loop [es (seq o) tcoll tcoll]
+ (if-let [e (first es)]
+ (recur (next es)
+ (.assoc! tcoll (key e) (val e)))
+ tcoll)))
+ (throw (js/Error. "conj! after persistent"))))
+
+ (assoc! [tcoll k v]
+ (if edit
+ (if (nil? k)
+ (do (if (identical? nil-val v)
+ nil
+ (set! nil-val v))
+ (if has-nil?
+ nil
+ (do (set! count (inc count))
+ (set! has-nil? true)))
+ tcoll)
+ (let [added-leaf? (Box. false)
+ node (-> (if (nil? root)
+ (.-EMPTY BitmapIndexedNode)
+ root)
+ (.inode-assoc! edit 0 (hash k) k v added-leaf?))]
+ (if (identical? node root)
+ nil
+ (set! root node))
+ (if ^boolean (.-val added-leaf?)
+ (set! count (inc count)))
+ tcoll))
+ (throw (js/Error. "assoc! after persistent!"))))
+
+ (without! [tcoll k]
+ (if edit
+ (if (nil? k)
+ (if has-nil?
+ (do (set! has-nil? false)
+ (set! nil-val nil)
+ (set! count (dec count))
+ tcoll)
+ tcoll)
+ (if (nil? root)
+ tcoll
+ (let [removed-leaf? (Box. false)
+ node (.inode-without! root edit 0 (hash k) k removed-leaf?)]
+ (if (identical? node root)
+ nil
+ (set! root node))
+ (if ^boolean (.-val removed-leaf?)
+ (set! count (dec count)))
+ tcoll)))
+ (throw (js/Error. "dissoc! after persistent!"))))
+
+ (persistent! [tcoll]
+ (if edit
+ (do (set! edit nil)
+ (PersistentHashMap. nil count root has-nil? nil-val nil))
+ (throw (js/Error. "persistent! called twice"))))
+
+ ICounted
+ (-count [coll]
+ (if edit
+ count
+ (throw (js/Error. "count after persistent!"))))
+
+ ILookup
+ (-lookup [tcoll k]
+ (if (nil? k)
+ (if has-nil?
+ nil-val)
+ (if (nil? root)
+ nil
+ (.inode-lookup root 0 (hash k) k))))
+
+ (-lookup [tcoll k not-found]
+ (if (nil? k)
+ (if has-nil?
+ nil-val
+ not-found)
+ (if (nil? root)
+ not-found
+ (.inode-lookup root 0 (hash k) k not-found))))
+
+ ITransientCollection
+ (-conj! [tcoll val] (.conj! tcoll val))
+
+ (-persistent! [tcoll] (.persistent! tcoll))
+
+ ITransientAssociative
+ (-assoc! [tcoll key val] (.assoc! tcoll key val))
+
+ ITransientMap
+ (-dissoc! [tcoll key] (.without! tcoll key))
+
+ IFn
+ (-invoke [tcoll key]
+ (-lookup tcoll key))
+ (-invoke [tcoll key not-found]
+ (-lookup tcoll key not-found)))
+
+;;; PersistentTreeMap
+
+(defn- tree-map-seq-push [node stack ^boolean ascending?]
+ (loop [t node stack stack]
+ (if-not (nil? t)
+ (recur (if ascending? (.-left t) (.-right t))
+ (conj stack t))
+ stack)))
+
+(deftype PersistentTreeMapSeq [meta stack ^boolean ascending? cnt ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ISeqable
+ (-seq [this] this)
+
+ ISequential
+ ISeq
+ (-first [this] (peek stack))
+ (-rest [this]
+ (let [t (first stack)
+ next-stack (tree-map-seq-push (if ascending? (.-right t) (.-left t))
+ (next stack)
+ ascending?)]
+ (if-not (nil? next-stack)
+ (PersistentTreeMapSeq. nil next-stack ascending? (dec cnt) nil)
+ ())))
+ INext
+ (-next [this]
+ (let [t (first stack)
+ next-stack (tree-map-seq-push (if ascending? (.-right t) (.-left t))
+ (next stack)
+ ascending?)]
+ (when-not (nil? next-stack)
+ (PersistentTreeMapSeq. nil next-stack ascending? (dec cnt) nil))))
+
+ ICounted
+ (-count [coll]
+ (if (neg? cnt)
+ (inc (count (next coll)))
+ cnt))
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ICollection
+ (-conj [coll o] (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) meta))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ IWithMeta
+ (-with-meta [coll meta]
+ (PersistentTreeMapSeq. meta stack ascending? cnt __hash))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable PersistentTreeMapSeq)
+
+(defn- create-tree-map-seq [tree ascending? cnt]
+ (PersistentTreeMapSeq. nil (tree-map-seq-push tree nil ascending?) ascending? cnt nil))
+
+(declare RedNode BlackNode)
+
+(defn- balance-left [key val ins right]
+ (if (instance? RedNode ins)
+ (cond
+ (instance? RedNode (.-left ins))
+ (RedNode. (.-key ins) (.-val ins)
+ (.blacken (.-left ins))
+ (BlackNode. key val (.-right ins) right nil)
+ nil)
+
+ (instance? RedNode (.-right ins))
+ (RedNode. (.. ins -right -key) (.. ins -right -val)
+ (BlackNode. (.-key ins) (.-val ins)
+ (.-left ins)
+ (.. ins -right -left)
+ nil)
+ (BlackNode. key val
+ (.. ins -right -right)
+ right
+ nil)
+ nil)
+
+ :else
+ (BlackNode. key val ins right nil))
+ (BlackNode. key val ins right nil)))
+
+(defn- balance-right [key val left ins]
+ (if (instance? RedNode ins)
+ (cond
+ (instance? RedNode (.-right ins))
+ (RedNode. (.-key ins) (.-val ins)
+ (BlackNode. key val left (.-left ins) nil)
+ (.blacken (.-right ins))
+ nil)
+
+ (instance? RedNode (.-left ins))
+ (RedNode. (.. ins -left -key) (.. ins -left -val)
+ (BlackNode. key val left (.. ins -left -left) nil)
+ (BlackNode. (.-key ins) (.-val ins)
+ (.. ins -left -right)
+ (.-right ins)
+ nil)
+ nil)
+
+ :else
+ (BlackNode. key val left ins nil))
+ (BlackNode. key val left ins nil)))
+
+(defn- balance-left-del [key val del right]
+ (cond
+ (instance? RedNode del)
+ (RedNode. key val (.blacken del) right nil)
+
+ (instance? BlackNode right)
+ (balance-right key val del (.redden right))
+
+ (and (instance? RedNode right) (instance? BlackNode (.-left right)))
+ (RedNode. (.. right -left -key) (.. right -left -val)
+ (BlackNode. key val del (.. right -left -left) nil)
+ (balance-right (.-key right) (.-val right)
+ (.. right -left -right)
+ (.redden (.-right right)))
+ nil)
+
+ :else
+ (throw (js/Error. "red-black tree invariant violation"))))
+
+(defn- balance-right-del [key val left del]
+ (cond
+ (instance? RedNode del)
+ (RedNode. key val left (.blacken del) nil)
+
+ (instance? BlackNode left)
+ (balance-left key val (.redden left) del)
+
+ (and (instance? RedNode left) (instance? BlackNode (.-right left)))
+ (RedNode. (.. left -right -key) (.. left -right -val)
+ (balance-left (.-key left) (.-val left)
+ (.redden (.-left left))
+ (.. left -right -left))
+ (BlackNode. key val (.. left -right -right) del nil)
+ nil)
+
+ :else
+ (throw (js/Error. "red-black tree invariant violation"))))
+
+(defn- tree-map-kv-reduce [node f init]
+ (let [init (if-not (nil? (.-left node))
+ (tree-map-kv-reduce (.-left node) f init)
+ init)]
+ (if (reduced? init)
+ init
+ (let [init (f init (.-key node) (.-val node))]
+ (if (reduced? init)
+ init
+ (if-not (nil? (.-right node))
+ (tree-map-kv-reduce (.-right node) f init)
+ init))))))
+
+(deftype BlackNode [key val left right ^:mutable __hash]
+ Object
+ (add-left [node ins]
+ (.balance-left ins node))
+
+ (add-right [node ins]
+ (.balance-right ins node))
+
+ (remove-left [node del]
+ (balance-left-del key val del right))
+
+ (remove-right [node del]
+ (balance-right-del key val left del))
+
+ (blacken [node] node)
+
+ (redden [node] (RedNode. key val left right nil))
+
+ (balance-left [node parent]
+ (BlackNode. (.-key parent) (.-val parent) node (.-right parent) nil))
+
+ (balance-right [node parent]
+ (BlackNode. (.-key parent) (.-val parent) (.-left parent) node nil))
+
+ (replace [node key val left right]
+ (BlackNode. key val left right nil))
+
+ (kv-reduce [node f init]
+ (tree-map-kv-reduce node f init))
+
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMapEntry
+ (-key [node] key)
+ (-val [node] val)
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IMeta
+ (-meta [node] nil)
+
+ IWithMeta
+ (-with-meta [node meta]
+ (-with-meta [key val] meta))
+
+ IStack
+ (-peek [node] val)
+
+ (-pop [node] [key])
+
+ ICollection
+ (-conj [node o] [key val o])
+
+ IEmptyableCollection
+ (-empty [node] nil)
+
+ ISequential
+ ISeqable
+ (-seq [node] (IndexedSeq. #js [key val] 0 nil))
+
+ IReversible
+ (-rseq [node] (IndexedSeq. #js [val key] 0 nil))
+
+ ICounted
+ (-count [node] 2)
+
+ IIndexed
+ (-nth [node n]
+ (cond (== n 0) key
+ (== n 1) val
+ :else (throw (js/Error. "Index out of bounds"))))
+
+ (-nth [node n not-found]
+ (cond (== n 0) key
+ (== n 1) val
+ :else not-found))
+
+ ILookup
+ (-lookup [node k] (-nth node k nil))
+ (-lookup [node k not-found] (-nth node k not-found))
+
+ IAssociative
+ (-assoc [node k v]
+ (assoc [key val] k v))
+ (-contains-key? [node k]
+ (or (== k 0) (== k 1)))
+
+ IFind
+ (-find [node k]
+ (case k
+ 0 (MapEntry. 0 key nil)
+ 1 (MapEntry. 1 val nil)
+ nil))
+
+ IVector
+ (-assoc-n [node n v]
+ (-assoc-n [key val] n v))
+
+ IReduce
+ (-reduce [node f]
+ (ci-reduce node f))
+
+ (-reduce [node f start]
+ (ci-reduce node f start))
+
+ IFn
+ (-invoke [node k]
+ (-nth node k))
+
+ (-invoke [node k not-found]
+ (-nth node k not-found)))
+
+(es6-iterable BlackNode)
+
+(deftype RedNode [key val left right ^:mutable __hash]
+ Object
+ (add-left [node ins]
+ (RedNode. key val ins right nil))
+
+ (add-right [node ins]
+ (RedNode. key val left ins nil))
+
+ (remove-left [node del]
+ (RedNode. key val del right nil))
+
+ (remove-right [node del]
+ (RedNode. key val left del nil))
+
+ (blacken [node]
+ (BlackNode. key val left right nil))
+
+ (redden [node]
+ (throw (js/Error. "red-black tree invariant violation")))
+
+ (balance-left [node parent]
+ (cond
+ (instance? RedNode left)
+ (RedNode. key val
+ (.blacken left)
+ (BlackNode. (.-key parent) (.-val parent) right (.-right parent) nil)
+ nil)
+
+ (instance? RedNode right)
+ (RedNode. (.-key right) (.-val right)
+ (BlackNode. key val left (.-left right) nil)
+ (BlackNode. (.-key parent) (.-val parent)
+ (.-right right)
+ (.-right parent)
+ nil)
+ nil)
+
+ :else
+ (BlackNode. (.-key parent) (.-val parent) node (.-right parent) nil)))
+
+ (balance-right [node parent]
+ (cond
+ (instance? RedNode right)
+ (RedNode. key val
+ (BlackNode. (.-key parent) (.-val parent)
+ (.-left parent)
+ left
+ nil)
+ (.blacken right)
+ nil)
+
+ (instance? RedNode left)
+ (RedNode. (.-key left) (.-val left)
+ (BlackNode. (.-key parent) (.-val parent)
+ (.-left parent)
+ (.-left left)
+ nil)
+ (BlackNode. key val (.-right left) right nil)
+ nil)
+
+ :else
+ (BlackNode. (.-key parent) (.-val parent) (.-left parent) node nil)))
+
+ (replace [node key val left right]
+ (RedNode. key val left right nil))
+
+ (kv-reduce [node f init]
+ (tree-map-kv-reduce node f init))
+
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMapEntry
+ (-key [node] key)
+ (-val [node] val)
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-ordered-coll __hash))
+
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ IMeta
+ (-meta [node] nil)
+
+ IWithMeta
+ (-with-meta [node meta]
+ (-with-meta [key val] meta))
+
+ IStack
+ (-peek [node] val)
+
+ (-pop [node] [key])
+
+ ICollection
+ (-conj [node o] [key val o])
+
+ IEmptyableCollection
+ (-empty [node] nil)
+
+ ISequential
+ ISeqable
+ (-seq [node] (IndexedSeq. #js [key val] 0 nil))
+
+ IReversible
+ (-rseq [node] (IndexedSeq. #js [val key] 0 nil))
+
+ ICounted
+ (-count [node] 2)
+
+ IIndexed
+ (-nth [node n]
+ (cond (== n 0) key
+ (== n 1) val
+ :else (throw (js/Error. "Index out of bounds"))))
+
+ (-nth [node n not-found]
+ (cond (== n 0) key
+ (== n 1) val
+ :else not-found))
+
+ ILookup
+ (-lookup [node k] (-nth node k nil))
+ (-lookup [node k not-found] (-nth node k not-found))
+
+ IAssociative
+ (-assoc [node k v]
+ (assoc [key val] k v))
+ (-contains-key? [node k]
+ (or (== k 0) (== k 1)))
+
+ IFind
+ (-find [node k]
+ (case k
+ 0 (MapEntry. 0 key nil)
+ 1 (MapEntry. 1 val nil)
+ nil))
+
+ IVector
+ (-assoc-n [node n v]
+ (-assoc-n [key val] n v))
+
+ IReduce
+ (-reduce [node f]
+ (ci-reduce node f))
+
+ (-reduce [node f start]
+ (ci-reduce node f start))
+
+ IFn
+ (-invoke [node k]
+ (-nth node k))
+
+ (-invoke [node k not-found]
+ (-nth node k not-found)))
+
+(es6-iterable RedNode)
+
+(defn- tree-map-add [comp tree k v found]
+ (if (nil? tree)
+ (RedNode. k v nil nil nil)
+ (let [c (comp k (.-key tree))]
+ (cond
+ (zero? c)
+ (do (aset found 0 tree)
+ nil)
+
+ (neg? c)
+ (let [ins (tree-map-add comp (.-left tree) k v found)]
+ (if-not (nil? ins)
+ (.add-left tree ins)))
+
+ :else
+ (let [ins (tree-map-add comp (.-right tree) k v found)]
+ (if-not (nil? ins)
+ (.add-right tree ins)))))))
+
+(defn- tree-map-append [left right]
+ (cond
+ (nil? left)
+ right
+
+ (nil? right)
+ left
+
+ (instance? RedNode left)
+ (if (instance? RedNode right)
+ (let [app (tree-map-append (.-right left) (.-left right))]
+ (if (instance? RedNode app)
+ (RedNode. (.-key app) (.-val app)
+ (RedNode. (.-key left) (.-val left)
+ (.-left left)
+ (.-left app)
+ nil)
+ (RedNode. (.-key right) (.-val right)
+ (.-right app)
+ (.-right right)
+ nil)
+ nil)
+ (RedNode. (.-key left) (.-val left)
+ (.-left left)
+ (RedNode. (.-key right) (.-val right) app (.-right right) nil)
+ nil)))
+ (RedNode. (.-key left) (.-val left)
+ (.-left left)
+ (tree-map-append (.-right left) right)
+ nil))
+
+ (instance? RedNode right)
+ (RedNode. (.-key right) (.-val right)
+ (tree-map-append left (.-left right))
+ (.-right right)
+ nil)
+
+ :else
+ (let [app (tree-map-append (.-right left) (.-left right))]
+ (if (instance? RedNode app)
+ (RedNode. (.-key app) (.-val app)
+ (BlackNode. (.-key left) (.-val left)
+ (.-left left)
+ (.-left app)
+ nil)
+ (BlackNode. (.-key right) (.-val right)
+ (.-right app)
+ (.-right right)
+ nil)
+ nil)
+ (balance-left-del (.-key left) (.-val left)
+ (.-left left)
+ (BlackNode. (.-key right) (.-val right)
+ app
+ (.-right right)
+ nil))))))
+
+(defn- tree-map-remove [comp tree k found]
+ (if-not (nil? tree)
+ (let [c (comp k (.-key tree))]
+ (cond
+ (zero? c)
+ (do (aset found 0 tree)
+ (tree-map-append (.-left tree) (.-right tree)))
+
+ (neg? c)
+ (let [del (tree-map-remove comp (.-left tree) k found)]
+ (if (or (not (nil? del)) (not (nil? (aget found 0))))
+ (if (instance? BlackNode (.-left tree))
+ (balance-left-del (.-key tree) (.-val tree) del (.-right tree))
+ (RedNode. (.-key tree) (.-val tree) del (.-right tree) nil))))
+
+ :else
+ (let [del (tree-map-remove comp (.-right tree) k found)]
+ (if (or (not (nil? del)) (not (nil? (aget found 0))))
+ (if (instance? BlackNode (.-right tree))
+ (balance-right-del (.-key tree) (.-val tree) (.-left tree) del)
+ (RedNode. (.-key tree) (.-val tree) (.-left tree) del nil))))))))
+
+(defn- tree-map-replace [comp tree k v]
+ (let [tk (.-key tree)
+ c (comp k tk)]
+ (cond (zero? c) (.replace tree tk v (.-left tree) (.-right tree))
+ (neg? c) (.replace tree tk (.-val tree) (tree-map-replace comp (.-left tree) k v) (.-right tree))
+ :else (.replace tree tk (.-val tree) (.-left tree) (tree-map-replace comp (.-right tree) k v)))))
+
+(declare key)
+
+(deftype PersistentTreeMap [comp tree cnt meta ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ ;; EXPERIMENTAL: subject to change
+ (keys [coll]
+ (es6-iterator (keys coll)))
+ (entries [coll]
+ (es6-entries-iterator (seq coll)))
+ (values [coll]
+ (es6-iterator (vals coll)))
+ (has [coll k]
+ (contains? coll k))
+ (get [coll k not-found]
+ (-lookup coll k not-found))
+ (forEach [coll f]
+ (doseq [[k v] coll]
+ (f v k)))
+
+ (entry-at [coll k]
+ (loop [t tree]
+ (if-not (nil? t)
+ (let [c (comp k (.-key t))]
+ (cond (zero? c) t
+ (neg? c) (recur (.-left t))
+ :else (recur (.-right t)))))))
+
+ ICloneable
+ (-clone [_] (PersistentTreeMap. comp tree cnt meta __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentTreeMap. comp tree cnt meta __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll entry]
+ (if (vector? entry)
+ (-assoc coll (-nth entry 0) (-nth entry 1))
+ (loop [ret coll es (seq entry)]
+ (if (nil? es)
+ ret
+ (let [e (first es)]
+ (if (vector? e)
+ (recur (-assoc ret (-nth e 0) (-nth e 1))
+ (next es))
+ (throw (js/Error. "conj on a map takes map entries or seqables of map entries"))))))))
+
+ IEmptyableCollection
+ (-empty [coll] (PersistentTreeMap. comp nil 0 meta 0))
+
+ IEquiv
+ (-equiv [coll other] (equiv-map coll other))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ ICounted
+ (-count [coll] cnt)
+
+ IKVReduce
+ (-kv-reduce [coll f init]
+ (if-not (nil? tree)
+ (unreduced (tree-map-kv-reduce tree f init))
+ init))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found))
+
+ ISeqable
+ (-seq [coll]
+ (if (pos? cnt)
+ (create-tree-map-seq tree true cnt)))
+
+ IReversible
+ (-rseq [coll]
+ (if (pos? cnt)
+ (create-tree-map-seq tree false cnt)))
+
+ ILookup
+ (-lookup [coll k]
+ (-lookup coll k nil))
+
+ (-lookup [coll k not-found]
+ (let [n (.entry-at coll k)]
+ (if-not (nil? n)
+ (.-val n)
+ not-found)))
+
+ IAssociative
+ (-assoc [coll k v]
+ (let [found (array nil)
+ t (tree-map-add comp tree k v found)]
+ (if (nil? t)
+ (let [found-node (nth found 0)]
+ (if (= v (.-val found-node))
+ coll
+ (PersistentTreeMap. comp (tree-map-replace comp tree k v) cnt meta nil)))
+ (PersistentTreeMap. comp (.blacken t) (inc cnt) meta nil))))
+
+ (-contains-key? [coll k]
+ (not (nil? (.entry-at coll k))))
+
+ IFind
+ (-find [coll k]
+ (.entry-at coll k))
+
+ IMap
+ (-dissoc [coll k]
+ (let [found (array nil)
+ t (tree-map-remove comp tree k found)]
+ (if (nil? t)
+ (if (nil? (nth found 0))
+ coll
+ (PersistentTreeMap. comp nil 0 meta nil))
+ (PersistentTreeMap. comp (.blacken t) (dec cnt) meta nil))))
+
+ ISorted
+ (-sorted-seq [coll ascending?]
+ (if (pos? cnt)
+ (create-tree-map-seq tree ascending? cnt)))
+
+ (-sorted-seq-from [coll k ascending?]
+ (if (pos? cnt)
+ (loop [stack nil t tree]
+ (if-not (nil? t)
+ (let [c (comp k (.-key t))]
+ (cond
+ (zero? c) (PersistentTreeMapSeq. nil (conj stack t) ascending? -1 nil)
+ ascending? (if (neg? c)
+ (recur (conj stack t) (.-left t))
+ (recur stack (.-right t)))
+ :else (if (pos? c)
+ (recur (conj stack t) (.-right t))
+ (recur stack (.-left t)))))
+ (when-not (nil? stack)
+ (PersistentTreeMapSeq. nil stack ascending? -1 nil))))))
+
+ (-entry-key [coll entry] (key entry))
+
+ (-comparator [coll] comp))
+
+(set! (.-EMPTY PersistentTreeMap) (PersistentTreeMap. compare nil 0 nil empty-unordered-hash))
+
+(es6-iterable PersistentTreeMap)
+
+(defn hash-map
+ "keyval => key val
+ Returns a new hash map with supplied mappings."
+ [& keyvals]
+ (loop [in (seq keyvals), out (transient (.-EMPTY PersistentHashMap))]
+ (if in
+ (recur (nnext in) (assoc! out (first in) (second in)))
+ (persistent! out))))
+
+(defn array-map
+ "keyval => key val
+ Returns a new array map with supplied mappings."
+ [& keyvals]
+ (let [arr (if (and (instance? IndexedSeq keyvals) (zero? (.-i keyvals)))
+ (.-arr keyvals)
+ (into-array keyvals))]
+ (.createAsIfByAssoc PersistentArrayMap arr)))
+
+(defn obj-map
+ "keyval => key val
+ Returns a new object map with supplied mappings."
+ [& keyvals]
+ (let [ks (array)
+ obj (js-obj)]
+ (loop [kvs (seq keyvals)]
+ (if kvs
+ (do (.push ks (first kvs))
+ (gobject/set obj (first kvs) (second kvs))
+ (recur (nnext kvs)))
+ (.fromObject ObjMap ks obj)))))
+
+(defn sorted-map
+ "keyval => key val
+ Returns a new sorted map with supplied mappings."
+ ([& keyvals]
+ (loop [in (seq keyvals) out (.-EMPTY PersistentTreeMap)]
+ (if in
+ (recur (nnext in) (assoc out (first in) (second in)))
+ out))))
+
+(defn sorted-map-by
+ "keyval => key val
+ Returns a new sorted map with supplied mappings, using the supplied comparator."
+ ([comparator & keyvals]
+ (loop [in (seq keyvals)
+ out (PersistentTreeMap. (fn->comparator comparator) nil 0 nil 0)]
+ (if in
+ (recur (nnext in) (assoc out (first in) (second in)))
+ out))))
+
+(deftype KeySeq [^not-native mseq _meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMeta
+ (-meta [coll] _meta)
+
+ IWithMeta
+ (-with-meta [coll new-meta] (KeySeq. mseq new-meta))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ICollection
+ (-conj [coll o]
+ (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) _meta))
+
+ IHash
+ (-hash [coll] (hash-ordered-coll coll))
+
+ ISeq
+ (-first [coll]
+ (let [^not-native me (-first mseq)]
+ (-key me)))
+
+ (-rest [coll]
+ (let [nseq (if (satisfies? INext mseq)
+ (-next mseq)
+ (next mseq))]
+ (if-not (nil? nseq)
+ (KeySeq. nseq _meta)
+ ())))
+
+ INext
+ (-next [coll]
+ (let [nseq (if (satisfies? INext mseq)
+ (-next mseq)
+ (next mseq))]
+ (when-not (nil? nseq)
+ (KeySeq. nseq _meta))))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable KeySeq)
+
+(defn keys
+ "Returns a sequence of the map's keys."
+ [hash-map]
+ (when-let [mseq (seq hash-map)]
+ (KeySeq. mseq nil)))
+
+(defn key
+ "Returns the key of the map entry."
+ [map-entry]
+ (-key map-entry))
+
+(deftype ValSeq [^not-native mseq _meta]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ IMeta
+ (-meta [coll] _meta)
+
+ IWithMeta
+ (-with-meta [coll new-meta] (ValSeq. mseq new-meta))
+
+ ISeqable
+ (-seq [coll] coll)
+
+ ISequential
+ IEquiv
+ (-equiv [coll other] (equiv-sequential coll other))
+
+ ICollection
+ (-conj [coll o]
+ (cons o coll))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY List) _meta))
+
+ IHash
+ (-hash [coll] (hash-ordered-coll coll))
+
+ ISeq
+ (-first [coll]
+ (let [^not-native me (-first mseq)]
+ (-val me)))
+
+ (-rest [coll]
+ (let [nseq (if (satisfies? INext mseq)
+ (-next mseq)
+ (next mseq))]
+ (if-not (nil? nseq)
+ (ValSeq. nseq _meta)
+ ())))
+
+ INext
+ (-next [coll]
+ (let [nseq (if (satisfies? INext mseq)
+ (-next mseq)
+ (next mseq))]
+ (when-not (nil? nseq)
+ (ValSeq. nseq _meta))))
+
+ IReduce
+ (-reduce [coll f] (seq-reduce f coll))
+ (-reduce [coll f start] (seq-reduce f start coll)))
+
+(es6-iterable ValSeq)
+
+(defn vals
+ "Returns a sequence of the map's values."
+ [hash-map]
+ (when-let [mseq (seq hash-map)]
+ (ValSeq. mseq nil)))
+
+(defn val
+ "Returns the value in the map entry."
+ [map-entry]
+ (-val map-entry))
+
+(defn merge
+ "Returns a map that consists of the rest of the maps conj-ed onto
+ the first. If a key occurs in more than one map, the mapping from
+ the latter (left-to-right) will be the mapping in the result."
+ [& maps]
+ (when (some identity maps)
+ (reduce #(conj (or %1 {}) %2) maps)))
+
+(defn merge-with
+ "Returns a map that consists of the rest of the maps conj-ed onto
+ the first. If a key occurs in more than one map, the mapping(s)
+ from the latter (left-to-right) will be combined with the mapping in
+ the result by calling (f val-in-result val-in-latter)."
+ [f & maps]
+ (when (some identity maps)
+ (let [merge-entry (fn [m e]
+ (let [k (key e) v (val e)]
+ (if (contains? m k)
+ (assoc m k (f (get m k) v))
+ (assoc m k v))))
+ merge2 (fn [m1 m2]
+ (reduce merge-entry (or m1 {}) (seq m2)))]
+ (reduce merge2 maps))))
+
+(defn select-keys
+ "Returns a map containing only those entries in map whose key is in keys"
+ [map keyseq]
+ (loop [ret {} keys (seq keyseq)]
+ (if keys
+ (let [key (first keys)
+ entry (get map key ::not-found)]
+ (recur
+ (if (not= entry ::not-found)
+ (assoc ret key entry)
+ ret)
+ (next keys)))
+ (-with-meta ret (meta map)))))
+
+;;; PersistentHashSet
+
+(declare TransientHashSet)
+
+(deftype HashSetIter [iter]
+ Object
+ (hasNext [_]
+ (.hasNext iter))
+ (next [_]
+ (if ^boolean (.hasNext iter)
+ (.-key (.next iter))
+ (throw (js/Error. "No such element"))))
+ (remove [_] (js/Error. "Unsupported operation")))
+
+(deftype PersistentHashSet [meta hash-map ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ ;; EXPERIMENTAL: subject to change
+ (keys [coll]
+ (es6-iterator (seq coll)))
+ (entries [coll]
+ (es6-set-entries-iterator (seq coll)))
+ (values [coll]
+ (es6-iterator (seq coll)))
+ (has [coll k]
+ (contains? coll k))
+ (forEach [coll f]
+ (doseq [[k v] coll]
+ (f v k)))
+
+ ICloneable
+ (-clone [_] (PersistentHashSet. meta hash-map __hash))
+
+ IIterable
+ (-iterator [coll]
+ (HashSetIter. (-iterator hash-map)))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentHashSet. meta hash-map __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll o]
+ (PersistentHashSet. meta (assoc hash-map o nil) nil))
+
+ IEmptyableCollection
+ (-empty [coll] (-with-meta (.-EMPTY PersistentHashSet) meta))
+
+ IEquiv
+ (-equiv [coll other]
+ (and
+ (set? other)
+ (== (count coll) (count other))
+ ^boolean
+ (try
+ (reduce-kv
+ #(or (contains? other %2) (reduced false))
+ true hash-map)
+ (catch js/Error ex
+ false))))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ ISeqable
+ (-seq [coll] (keys hash-map))
+
+ ICounted
+ (-count [coll] (-count hash-map))
+
+ ILookup
+ (-lookup [coll v]
+ (-lookup coll v nil))
+ (-lookup [coll v not-found]
+ (if-let [entry (-find hash-map v)]
+ (key entry)
+ not-found))
+
+ ISet
+ (-disjoin [coll v]
+ (PersistentHashSet. meta (-dissoc hash-map v) nil))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found))
+
+ IEditableCollection
+ (-as-transient [coll] (TransientHashSet. (-as-transient hash-map))))
+
+(set! (.-EMPTY PersistentHashSet)
+ (PersistentHashSet. nil (.-EMPTY PersistentArrayMap) empty-unordered-hash))
+
+(set! (.-fromArray PersistentHashSet)
+ (fn [items ^boolean no-clone]
+ (let [len (alength items)]
+ (if (<= len (.-HASHMAP-THRESHOLD PersistentArrayMap))
+ (let [arr (if no-clone items (aclone items))]
+ (loop [i 0
+ out (transient (.-EMPTY PersistentArrayMap))]
+ (if (< i len)
+ (recur (inc i) (-assoc! out (aget items i) nil))
+ (PersistentHashSet. nil (-persistent! out) nil))))
+ (loop [i 0
+ out (transient (.-EMPTY PersistentHashSet))]
+ (if (< i len)
+ (recur (inc i) (-conj! out (aget items i)))
+ (-persistent! out)))))))
+
+(set! (.-createWithCheck PersistentHashSet)
+ (fn [items]
+ (let [len (alength items)
+ t (-as-transient (.-EMPTY PersistentHashSet))]
+ (dotimes [i len]
+ (-conj! t (aget items i))
+ (when-not (= (count t) (inc i))
+ (throw (js/Error. (str "Duplicate key: " (aget items i))))))
+ (-persistent! t))))
+
+(set! (.-createAsIfByAssoc PersistentHashSet)
+ (fn [items]
+ (let [len (alength items)
+ t (-as-transient (.-EMPTY PersistentHashSet))]
+ (dotimes [i len] (-conj! t (aget items i)))
+ (-persistent! t))))
+
+(es6-iterable PersistentHashSet)
+
+(deftype TransientHashSet [^:mutable transient-map]
+ ITransientCollection
+ (-conj! [tcoll o]
+ (set! transient-map (assoc! transient-map o nil))
+ tcoll)
+
+ (-persistent! [tcoll]
+ (PersistentHashSet. nil (persistent! transient-map) nil))
+
+ ITransientSet
+ (-disjoin! [tcoll v]
+ (set! transient-map (dissoc! transient-map v))
+ tcoll)
+
+ ICounted
+ (-count [tcoll] (count transient-map))
+
+ ILookup
+ (-lookup [tcoll v]
+ (-lookup tcoll v nil))
+
+ (-lookup [tcoll v not-found]
+ (if (identical? (-lookup transient-map v lookup-sentinel) lookup-sentinel)
+ not-found
+ v))
+
+ IFn
+ (-invoke [tcoll k]
+ (if (identical? (-lookup transient-map k lookup-sentinel) lookup-sentinel)
+ nil
+ k))
+
+ (-invoke [tcoll k not-found]
+ (if (identical? (-lookup transient-map k lookup-sentinel) lookup-sentinel)
+ not-found
+ k)))
+
+(deftype PersistentTreeSet [meta tree-map ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+
+ ;; EXPERIMENTAL: subject to change
+ (keys [coll]
+ (es6-iterator (seq coll)))
+ (entries [coll]
+ (es6-set-entries-iterator (seq coll)))
+ (values [coll]
+ (es6-iterator (seq coll)))
+ (has [coll k]
+ (contains? coll k))
+ (forEach [coll f]
+ (doseq [[k v] coll]
+ (f v k)))
+
+ ICloneable
+ (-clone [_] (PersistentTreeSet. meta tree-map __hash))
+
+ IWithMeta
+ (-with-meta [coll meta] (PersistentTreeSet. meta tree-map __hash))
+
+ IMeta
+ (-meta [coll] meta)
+
+ ICollection
+ (-conj [coll o]
+ (PersistentTreeSet. meta (assoc tree-map o nil) nil))
+
+ IEmptyableCollection
+ (-empty [coll] (PersistentTreeSet. meta (-empty tree-map) 0))
+
+ IEquiv
+ (-equiv [coll other]
+ (and
+ (set? other)
+ (== (count coll) (count other))
+ ^boolean
+ (try
+ (reduce-kv
+ #(or (contains? other %2) (reduced false))
+ true tree-map)
+ (catch js/Error ex
+ false))))
+
+ IHash
+ (-hash [coll] (caching-hash coll hash-unordered-coll __hash))
+
+ ISeqable
+ (-seq [coll] (keys tree-map))
+
+ ISorted
+ (-sorted-seq [coll ascending?]
+ (map key (-sorted-seq tree-map ascending?)))
+
+ (-sorted-seq-from [coll k ascending?]
+ (map key (-sorted-seq-from tree-map k ascending?)))
+
+ (-entry-key [coll entry] entry)
+
+ (-comparator [coll] (-comparator tree-map))
+
+ IReversible
+ (-rseq [coll]
+ (if (pos? (count tree-map))
+ (map key (rseq tree-map))))
+
+ ICounted
+ (-count [coll] (count tree-map))
+
+ ILookup
+ (-lookup [coll v]
+ (-lookup coll v nil))
+ (-lookup [coll v not-found]
+ (let [n (.entry-at tree-map v)]
+ (if-not (nil? n)
+ (.-key n)
+ not-found)))
+
+ ISet
+ (-disjoin [coll v]
+ (PersistentTreeSet. meta (dissoc tree-map v) nil))
+
+ IFn
+ (-invoke [coll k]
+ (-lookup coll k))
+ (-invoke [coll k not-found]
+ (-lookup coll k not-found)))
+
+(set! (.-EMPTY PersistentTreeSet)
+ (PersistentTreeSet. nil (.-EMPTY PersistentTreeMap) empty-unordered-hash))
+
+(es6-iterable PersistentTreeSet)
+
+(defn set-from-indexed-seq [iseq]
+ (let [arr (.-arr iseq)
+ ret (areduce arr i ^not-native res (-as-transient #{})
+ (-conj! res (aget arr i)))]
+ (-persistent! ^not-native ret)))
+
+(defn set
+ "Returns a set of the distinct elements of coll."
+ [coll]
+ (if (set? coll)
+ (with-meta coll nil)
+ (let [in (seq coll)]
+ (cond
+ (nil? in) #{}
+
+ (and (instance? IndexedSeq in) (zero? (.-i in)))
+ (.createAsIfByAssoc PersistentHashSet (.-arr in))
+
+ :else
+ (loop [^not-native in in
+ ^not-native out (-as-transient #{})]
+ (if-not (nil? in)
+ (recur (next in) (-conj! out (-first in)))
+ (persistent! out)))))))
+
+(defn hash-set
+ "Returns a new hash set with supplied keys. Any equal keys are
+ handled as if by repeated uses of conj."
+ ([] #{})
+ ([& keys] (set keys)))
+
+(defn sorted-set
+ "Returns a new sorted set with supplied keys."
+ ([& keys]
+ (reduce -conj (.-EMPTY PersistentTreeSet) keys)))
+
+(defn sorted-set-by
+ "Returns a new sorted set with supplied keys, using the supplied comparator."
+ ([comparator & keys]
+ (reduce -conj
+ (PersistentTreeSet. nil (sorted-map-by comparator) 0)
+ keys)))
+
+(defn replace
+ "Given a map of replacement pairs and a vector/collection, returns a
+ vector/seq with any elements = a key in smap replaced with the
+ corresponding val in smap. Returns a transducer when no collection
+ is provided."
+ ([smap]
+ (map #(if-let [e (find smap %)] (val e) %)))
+ ([smap coll]
+ (if (vector? coll)
+ (let [n (count coll)]
+ (reduce (fn [v i]
+ (if-let [e (find smap (nth v i))]
+ (assoc v i (second e))
+ v))
+ coll (take n (iterate inc 0))))
+ (map #(if-let [e (find smap %)] (second e) %) coll))))
+
+(defn distinct
+ "Returns a lazy sequence of the elements of coll with duplicates removed.
+ Returns a stateful transducer when no collection is provided."
+ ([]
+ (fn [rf]
+ (let [seen (volatile! #{})]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (if (contains? @seen input)
+ result
+ (do (vswap! seen conj input)
+ (rf result input))))))))
+ ([coll]
+ (let [step (fn step [xs seen]
+ (lazy-seq
+ ((fn [[f :as xs] seen]
+ (when-let [s (seq xs)]
+ (if (contains? seen f)
+ (recur (rest s) seen)
+ (cons f (step (rest s) (conj seen f))))))
+ xs seen)))]
+ (step coll #{}))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defn butlast
+ "Return a seq of all but the last item in coll, in linear time"
+ [s]
+ (loop [ret [] s s]
+ (if (next s)
+ (recur (conj ret (first s)) (next s))
+ (seq ret))))
+
+(defn name
+ "Returns the name String of a string, symbol or keyword."
+ [x]
+ (if (implements? INamed x)
+ (-name ^not-native x)
+ (if (string? x)
+ x
+ (throw (js/Error. (str "Doesn't support name: " x))))))
+
+(defn zipmap
+ "Returns a map with the keys mapped to the corresponding vals."
+ [keys vals]
+ (loop [map (transient {})
+ ks (seq keys)
+ vs (seq vals)]
+ (if (and ks vs)
+ (recur (assoc! map (first ks) (first vs))
+ (next ks)
+ (next vs))
+ (persistent! map))))
+
+(defn max-key
+ "Returns the x for which (k x), a number, is greatest.
+
+ If there are multiple such xs, the last one is returned."
+ ([k x] x)
+ ([k x y] (if (> (k x) (k y)) x y))
+ ([k x y & more]
+ (reduce #(max-key k %1 %2) (max-key k x y) more)))
+
+(defn min-key
+ "Returns the x for which (k x), a number, is least.
+
+ If there are multiple such xs, the last one is returned."
+ ([k x] x)
+ ([k x y] (if (< (k x) (k y)) x y))
+ ([k x y & more]
+ (reduce #(min-key k %1 %2) (min-key k x y) more)))
+
+(deftype ArrayList [^:mutable arr]
+ Object
+ (add [_ x] (.push arr x))
+ (size [_] (alength arr))
+ (clear [_] (set! arr (array)))
+ (isEmpty [_] (zero? (alength arr)))
+ (toArray [_] arr))
+
+(defn array-list []
+ (ArrayList. (array)))
+
+(defn partition-all
+ "Returns a lazy sequence of lists like partition, but may include
+ partitions with fewer than n items at the end. Returns a stateful
+ transducer when no collection is provided."
+ ([n]
+ (fn [rf]
+ (let [a (array-list)]
+ (fn
+ ([] (rf))
+ ([result]
+ (let [result (if (.isEmpty a)
+ result
+ (let [v (vec (.toArray a))]
+ ;;clear first!
+ (.clear a)
+ (unreduced (rf result v))))]
+ (rf result)))
+ ([result input]
+ (.add a input)
+ (if (== n (.size a))
+ (let [v (vec (.toArray a))]
+ (.clear a)
+ (rf result v))
+ result))))))
+ ([n coll]
+ (partition-all n n coll))
+ ([n step coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (cons (take n s) (partition-all n step (drop step s)))))))
+
+(defn take-while
+ "Returns a lazy sequence of successive items from coll while
+ (pred item) returns logical true. pred must be free of side-effects.
+ Returns a transducer when no collection is provided."
+ ([pred]
+ (fn [rf]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (if (pred input)
+ (rf result input)
+ (reduced result))))))
+ ([pred coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (when (pred (first s))
+ (cons (first s) (take-while pred (rest s))))))))
+
+(defn mk-bound-fn
+ [sc test key]
+ (fn [e]
+ (let [comp (-comparator sc)]
+ (test (comp (-entry-key sc e) key) 0))))
+
+(defn subseq
+ "sc must be a sorted collection, test(s) one of <, <=, > or
+ >=. Returns a seq of those entries with keys ek for
+ which (test (.. sc comparator (compare ek key)) 0) is true"
+ ([sc test key]
+ (let [include (mk-bound-fn sc test key)]
+ (if (#{> >=} test)
+ (when-let [[e :as s] (-sorted-seq-from sc key true)]
+ (if (include e) s (next s)))
+ (take-while include (-sorted-seq sc true)))))
+ ([sc start-test start-key end-test end-key]
+ (when-let [[e :as s] (-sorted-seq-from sc start-key true)]
+ (take-while (mk-bound-fn sc end-test end-key)
+ (if ((mk-bound-fn sc start-test start-key) e) s (next s))))))
+
+(defn rsubseq
+ "sc must be a sorted collection, test(s) one of <, <=, > or
+ >=. Returns a reverse seq of those entries with keys ek for
+ which (test (.. sc comparator (compare ek key)) 0) is true"
+ ([sc test key]
+ (let [include (mk-bound-fn sc test key)]
+ (if (#{< <=} test)
+ (when-let [[e :as s] (-sorted-seq-from sc key false)]
+ (if (include e) s (next s)))
+ (take-while include (-sorted-seq sc false)))))
+ ([sc start-test start-key end-test end-key]
+ (when-let [[e :as s] (-sorted-seq-from sc end-key false)]
+ (take-while (mk-bound-fn sc start-test start-key)
+ (if ((mk-bound-fn sc end-test end-key) e) s (next s))))))
+
+(deftype RangeIterator [^:mutable i end step]
+ Object
+ (hasNext [_]
+ (if (pos? step)
+ (< i end)
+ (> i end)))
+ (next [_]
+ (let [ret i]
+ (set! i (+ i step))
+ ret)))
+
+(deftype Range [meta start end step ^:mutable __hash]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+ (equiv [this other]
+ (-equiv this other))
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ICloneable
+ (-clone [_] (Range. meta start end step __hash))
+
+ IWithMeta
+ (-with-meta [rng meta] (Range. meta start end step __hash))
+
+ IMeta
+ (-meta [rng] meta)
+
+ ISeqable
+ (-seq [rng]
+ (cond
+ (pos? step) (when (< start end) rng)
+ (neg? step) (when (> start end) rng)
+ :else (when-not (== start end) rng)))
+
+ ISeq
+ (-first [rng]
+ (when-not (nil? (-seq rng)) start))
+ (-rest [rng]
+ (if-not (nil? (-seq rng))
+ (Range. meta (+ start step) end step nil)
+ ()))
+
+ IIterable
+ (-iterator [_]
+ (RangeIterator. start end step))
+
+ INext
+ (-next [rng]
+ (if (pos? step)
+ (when (< (+ start step) end)
+ (Range. meta (+ start step) end step nil))
+ (when (> (+ start step) end)
+ (Range. meta (+ start step) end step nil))))
+
+ ICollection
+ (-conj [rng o] (cons o rng))
+
+ IEmptyableCollection
+ (-empty [rng] (-with-meta (.-EMPTY List) meta))
+
+ ISequential
+ IEquiv
+ (-equiv [rng other] (equiv-sequential rng other))
+
+ IHash
+ (-hash [rng] (caching-hash rng hash-ordered-coll __hash))
+
+ ICounted
+ (-count [rng]
+ (if-not (-seq rng)
+ 0
+ (Math/ceil (/ (- end start) step))))
+
+ IIndexed
+ (-nth [rng n]
+ (if (and (<= 0 n) (< n (-count rng)))
+ (+ start (* n step))
+ (if (and (<= 0 n) (> start end) (zero? step))
+ start
+ (throw (js/Error. "Index out of bounds")))))
+ (-nth [rng n not-found]
+ (if (and (<= 0 n) (< n (-count rng)))
+ (+ start (* n step))
+ (if (and (<= 0 n) (> start end) (zero? step))
+ start
+ not-found)))
+
+ IReduce
+ (-reduce [rng f] (ci-reduce rng f))
+ (-reduce [rng f init]
+ (loop [i start ret init]
+ (if (if (pos? step) (< i end) (> i end))
+ (let [ret (f ret i)]
+ (if (reduced? ret)
+ @ret
+ (recur (+ i step) ret)))
+ ret))))
+
+(es6-iterable Range)
+
+(defn range
+ "Returns a lazy seq of nums from start (inclusive) to end
+ (exclusive), by step, where start defaults to 0, step to 1,
+ and end to infinity."
+ ([] (range 0 (.-MAX_VALUE js/Number) 1))
+ ([end] (range 0 end 1))
+ ([start end] (range start end 1))
+ ([start end step] (Range. nil start end step nil)))
+
+(defn take-nth
+ "Returns a lazy seq of every nth item in coll. Returns a stateful
+ transducer when no collection is provided."
+ ([n]
+ {:pre [(number? n)]}
+ (fn [rf]
+ (let [ia (volatile! -1)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [i (vswap! ia inc)]
+ (if (zero? (rem i n))
+ (rf result input)
+ result)))))))
+ ([n coll]
+ {:pre [(number? n)]}
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (cons (first s) (take-nth n (drop n s)))))))
+
+(defn split-with
+ "Returns a vector of [(take-while pred coll) (drop-while pred coll)]"
+ [pred coll]
+ [(take-while pred coll) (drop-while pred coll)])
+
+(defn partition-by
+ "Applies f to each value in coll, splitting it each time f returns a
+ new value. Returns a lazy seq of partitions. Returns a stateful
+ transducer when no collection is provided."
+ ([f]
+ (fn [rf]
+ (let [a (array-list)
+ pa (volatile! ::none)]
+ (fn
+ ([] (rf))
+ ([result]
+ (let [result (if (.isEmpty a)
+ result
+ (let [v (vec (.toArray a))]
+ ;;clear first!
+ (.clear a)
+ (unreduced (rf result v))))]
+ (rf result)))
+ ([result input]
+ (let [pval @pa
+ val (f input)]
+ (vreset! pa val)
+ (if (or (keyword-identical? pval ::none)
+ (= val pval))
+ (do
+ (.add a input)
+ result)
+ (let [v (vec (.toArray a))]
+ (.clear a)
+ (let [ret (rf result v)]
+ (when-not (reduced? ret)
+ (.add a input))
+ ret)))))))))
+ ([f coll]
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (let [fst (first s)
+ fv (f fst)
+ run (cons fst (take-while #(= fv (f %)) (next s)))]
+ (cons run (partition-by f (lazy-seq (drop (count run) s)))))))))
+
+(defn frequencies
+ "Returns a map from distinct items in coll to the number of times
+ they appear."
+ [coll]
+ (persistent!
+ (reduce (fn [counts x]
+ (assoc! counts x (inc (get counts x 0))))
+ (transient {}) coll)))
+
+(defn reductions
+ "Returns a lazy seq of the intermediate values of the reduction (as
+ per reduce) of coll by f, starting with init."
+ ([f coll]
+ (lazy-seq
+ (if-let [s (seq coll)]
+ (reductions f (first s) (rest s))
+ (list (f)))))
+ ([f init coll]
+ (if (reduced? init)
+ (list @init)
+ (cons init
+ (lazy-seq
+ (when-let [s (seq coll)]
+ (reductions f (f init (first s)) (rest s))))))))
+
+(defn juxt
+ "Takes a set of functions and returns a fn that is the juxtaposition
+ of those fns. The returned fn takes a variable number of args, and
+ returns a vector containing the result of applying each fn to the
+ args (left-to-right).
+ ((juxt a b c) x) => [(a x) (b x) (c x)]"
+ ([f]
+ (fn
+ ([] (vector (f)))
+ ([x] (vector (f x)))
+ ([x y] (vector (f x y)))
+ ([x y z] (vector (f x y z)))
+ ([x y z & args] (vector (apply f x y z args)))))
+ ([f g]
+ (fn
+ ([] (vector (f) (g)))
+ ([x] (vector (f x) (g x)))
+ ([x y] (vector (f x y) (g x y)))
+ ([x y z] (vector (f x y z) (g x y z)))
+ ([x y z & args] (vector (apply f x y z args) (apply g x y z args)))))
+ ([f g h]
+ (fn
+ ([] (vector (f) (g) (h)))
+ ([x] (vector (f x) (g x) (h x)))
+ ([x y] (vector (f x y) (g x y) (h x y)))
+ ([x y z] (vector (f x y z) (g x y z) (h x y z)))
+ ([x y z & args] (vector (apply f x y z args) (apply g x y z args) (apply h x y z args)))))
+ ([f g h & fs]
+ (let [fs (list* f g h fs)]
+ (fn
+ ([] (reduce #(conj %1 (%2)) [] fs))
+ ([x] (reduce #(conj %1 (%2 x)) [] fs))
+ ([x y] (reduce #(conj %1 (%2 x y)) [] fs))
+ ([x y z] (reduce #(conj %1 (%2 x y z)) [] fs))
+ ([x y z & args] (reduce #(conj %1 (apply %2 x y z args)) [] fs))))))
+
+(defn dorun
+ "When lazy sequences are produced via functions that have side
+ effects, any effects other than those needed to produce the first
+ element in the seq do not occur until the seq is consumed. dorun can
+ be used to force any effects. Walks through the successive nexts of
+ the seq, does not retain the head and returns nil."
+ ([coll]
+ (when-let [s (seq coll)]
+ (recur (next s))))
+ ([n coll]
+ (when (and (seq coll) (pos? n))
+ (recur (dec n) (next coll)))))
+
+(defn doall
+ "When lazy sequences are produced via functions that have side
+ effects, any effects other than those needed to produce the first
+ element in the seq do not occur until the seq is consumed. doall can
+ be used to force any effects. Walks through the successive nexts of
+ the seq, retains the head and returns it, thus causing the entire
+ seq to reside in memory at one time."
+ ([coll]
+ (dorun coll)
+ coll)
+ ([n coll]
+ (dorun n coll)
+ coll))
+
+;;;;;;;;;;;;;;;;;;;;;;;;; Regular Expressions ;;;;;;;;;;
+
+(defn ^boolean regexp?
+ "Returns true if x is a JavaScript RegExp instance."
+ [x]
+ (instance? js/RegExp x))
+
+(defn re-matches
+ "Returns the result of (re-find re s) if re fully matches s."
+ [re s]
+ (if (string? s)
+ (let [matches (.exec re s)]
+ (when (= (first matches) s)
+ (if (== (count matches) 1)
+ (first matches)
+ (vec matches))))
+ (throw (js/TypeError. "re-matches must match against a string."))))
+
+
+(defn re-find
+ "Returns the first regex match, if any, of s to re, using
+ re.exec(s). Returns a vector, containing first the matching
+ substring, then any capturing groups if the regular expression contains
+ capturing groups."
+ [re s]
+ (if (string? s)
+ (let [matches (.exec re s)]
+ (when-not (nil? matches)
+ (if (== (count matches) 1)
+ (first matches)
+ (vec matches))))
+ (throw (js/TypeError. "re-find must match against a string."))))
+
+(defn re-seq
+ "Returns a lazy sequence of successive matches of re in s."
+ [re s]
+ (let [match-data (re-find re s)
+ match-idx (.search s re)
+ match-str (if (coll? match-data) (first match-data) match-data)
+ post-idx (+ match-idx (max 1 (count match-str)))
+ post-match (subs s post-idx)]
+ (when match-data (lazy-seq (cons match-data (when (<= post-idx (count s)) (re-seq re post-match)))))))
+
+(defn re-pattern
+ "Returns an instance of RegExp which has compiled the provided string."
+ [s]
+ (if (instance? js/RegExp s)
+ s
+ (let [[prefix flags] (re-find #"^\(\?([idmsux]*)\)" s)
+ pattern (subs s (count prefix))]
+ (js/RegExp. pattern (or flags "")))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Printing ;;;;;;;;;;;;;;;;
+
+(defn pr-sequential-writer [writer print-one begin sep end opts coll]
+ (binding [*print-level* (when-not (nil? *print-level*) (dec *print-level*))]
+ (if (and (not (nil? *print-level*)) (neg? *print-level*))
+ (-write writer "#")
+ (do
+ (-write writer begin)
+ (if (zero? (:print-length opts))
+ (when (seq coll)
+ (-write writer (or (:more-marker opts) "...")))
+ (do
+ (when (seq coll)
+ (print-one (first coll) writer opts))
+ (loop [coll (next coll) n (dec (:print-length opts))]
+ (if (and coll (or (nil? n) (not (zero? n))))
+ (do
+ (-write writer sep)
+ (print-one (first coll) writer opts)
+ (recur (next coll) (dec n)))
+ (when (and (seq coll) (zero? n))
+ (-write writer sep)
+ (-write writer (or (:more-marker opts) "...")))))))
+ (-write writer end)))))
+
+(defn write-all [writer & ss]
+ (doseq [s ss]
+ (-write writer s)))
+
+(defn string-print [x]
+ (when (nil? *print-fn*)
+ (throw (js/Error. "No *print-fn* fn set for evaluation environment")))
+ (*print-fn* x)
+ nil)
+
+(defn flush [] ;stub
+ nil)
+
+(def ^:private char-escapes
+ (js-obj
+ "\"" "\\\""
+ "\\" "\\\\"
+ "\b" "\\b"
+ "\f" "\\f"
+ "\n" "\\n"
+ "\r" "\\r"
+ "\t" "\\t"))
+
+(defn ^:private quote-string
+ [s]
+ (str \"
+ (.replace s (js/RegExp "[\\\\\"\b\f\n\r\t]" "g")
+ (fn [match] (unchecked-get char-escapes match)))
+ \"))
+
+(declare print-map)
+
+(defn ^boolean print-meta? [opts obj]
+ (and (boolean (get opts :meta))
+ (implements? IMeta obj)
+ (not (nil? (meta obj)))))
+
+(defn- pr-writer-impl
+ [obj writer opts]
+ (cond
+ (nil? obj) (-write writer "nil")
+ :else
+ (do
+ (when (print-meta? opts obj)
+ (-write writer "^")
+ (pr-writer (meta obj) writer opts)
+ (-write writer " "))
+ (cond
+ ;; handle CLJS ctors
+ ^boolean (.-cljs$lang$type obj)
+ (.cljs$lang$ctorPrWriter obj obj writer opts)
+
+ ; Use the new, more efficient, IPrintWithWriter interface when possible.
+ (satisfies? IPrintWithWriter obj)
+ (-pr-writer obj writer opts)
+
+ (or (true? obj) (false? obj))
+ (-write writer (str obj))
+
+ (number? obj)
+ (-write writer
+ (cond
+ ^boolean (js/isNaN obj) "##NaN"
+ (identical? obj js/Number.POSITIVE_INFINITY) "##Inf"
+ (identical? obj js/Number.NEGATIVE_INFINITY) "##-Inf"
+ :else (str obj)))
+
+ (object? obj)
+ (do
+ (-write writer "#js ")
+ (print-map
+ (map (fn [k]
+ (MapEntry. (cond-> k (some? (re-matches #"[A-Za-z_\*\+\?!\-'][\w\*\+\?!\-']*" k)) keyword) (unchecked-get obj k) nil))
+ (js-keys obj))
+ pr-writer writer opts))
+
+ (array? obj)
+ (pr-sequential-writer writer pr-writer "#js [" " " "]" opts obj)
+
+ ^boolean (goog/isString obj)
+ (if (:readably opts)
+ (-write writer (quote-string obj))
+ (-write writer obj))
+
+ ^boolean (goog/isFunction obj)
+ (let [name (.-name obj)
+ name (if (or (nil? name) (gstring/isEmpty name))
+ "Function"
+ name)]
+ (write-all writer "#object[" name
+ (if *print-fn-bodies*
+ (str " \"" (str obj) "\"")
+ "")
+ "]"))
+
+ (instance? js/Date obj)
+ (let [normalize (fn [n len]
+ (loop [ns (str n)]
+ (if (< (count ns) len)
+ (recur (str "0" ns))
+ ns)))]
+ (write-all writer
+ "#inst \""
+ (str (.getUTCFullYear obj)) "-"
+ (normalize (inc (.getUTCMonth obj)) 2) "-"
+ (normalize (.getUTCDate obj) 2) "T"
+ (normalize (.getUTCHours obj) 2) ":"
+ (normalize (.getUTCMinutes obj) 2) ":"
+ (normalize (.getUTCSeconds obj) 2) "."
+ (normalize (.getUTCMilliseconds obj) 3) "-"
+ "00:00\""))
+
+ (regexp? obj) (write-all writer "#\"" (.-source obj) "\"")
+
+ :else
+ (if (some-> obj .-constructor .-cljs$lang$ctorStr)
+ (write-all writer
+ "#object[" (.replace (.. obj -constructor -cljs$lang$ctorStr)
+ (js/RegExp. "/" "g") ".") "]")
+ (let [name (some-> obj .-constructor .-name)
+ name (if (or (nil? name) (gstring/isEmpty name))
+ "Object"
+ name)]
+ (if (nil? (. obj -constructor))
+ (write-all writer "#object[" name "]")
+ (write-all writer "#object[" name " " (str obj) "]"))))))))
+
+(defn- pr-writer
+ "Prefer this to pr-seq, because it makes the printing function
+ configurable, allowing efficient implementations such as appending
+ to a StringBuffer."
+ [obj writer opts]
+ (if-let [alt-impl (:alt-impl opts)]
+ (alt-impl obj writer (assoc opts :fallback-impl pr-writer-impl))
+ (pr-writer-impl obj writer opts)))
+
+(defn pr-seq-writer [objs writer opts]
+ (pr-writer (first objs) writer opts)
+ (doseq [obj (next objs)]
+ (-write writer " ")
+ (pr-writer obj writer opts)))
+
+(defn- pr-sb-with-opts [objs opts]
+ (let [sb (StringBuffer.)
+ writer (StringBufferWriter. sb)]
+ (pr-seq-writer objs writer opts)
+ (-flush writer)
+ sb))
+
+(defn pr-str-with-opts
+ "Prints a sequence of objects to a string, observing all the
+ options given in opts"
+ [objs opts]
+ (if (empty? objs)
+ ""
+ (str (pr-sb-with-opts objs opts))))
+
+(defn prn-str-with-opts
+ "Same as pr-str-with-opts followed by (newline)"
+ [objs opts]
+ (if (empty? objs)
+ "\n"
+ (let [sb (pr-sb-with-opts objs opts)]
+ (.append sb \newline)
+ (str sb))))
+
+(defn- pr-with-opts
+ "Prints a sequence of objects using string-print, observing all
+ the options given in opts"
+ [objs opts]
+ (string-print (pr-str-with-opts objs opts)))
+
+(defn newline
+ "Prints a newline using *print-fn*"
+ ([] (newline nil))
+ ([opts]
+ (string-print "\n")
+ (when (get opts :flush-on-newline)
+ (flush))))
+
+(defn pr-str
+ "pr to a string, returning it. Fundamental entrypoint to IPrintWithWriter."
+ [& objs]
+ (pr-str-with-opts objs (pr-opts)))
+
+(defn prn-str
+ "Same as pr-str followed by (newline)"
+ [& objs]
+ (prn-str-with-opts objs (pr-opts)))
+
+(defn pr
+ "Prints the object(s) using string-print. Prints the
+ object(s), separated by spaces if there is more than one.
+ By default, pr and prn print in a way that objects can be
+ read by the reader"
+ [& objs]
+ (pr-with-opts objs (pr-opts)))
+
+(def ^{:doc
+ "Prints the object(s) using string-print.
+ print and println produce output for human consumption."}
+ print
+ (fn cljs-core-print [& objs]
+ (pr-with-opts objs (assoc (pr-opts) :readably false))))
+
+(defn print-str
+ "print to a string, returning it"
+ [& objs]
+ (pr-str-with-opts objs (assoc (pr-opts) :readably false)))
+
+(defn println
+ "Same as print followed by (newline)"
+ [& objs]
+ (pr-with-opts objs (assoc (pr-opts) :readably false))
+ (when *print-newline*
+ (newline (pr-opts))))
+
+(defn println-str
+ "println to a string, returning it"
+ [& objs]
+ (prn-str-with-opts objs (assoc (pr-opts) :readably false)))
+
+(defn prn
+ "Same as pr followed by (newline)."
+ [& objs]
+ (pr-with-opts objs (pr-opts))
+ (when *print-newline*
+ (newline (pr-opts))))
+
+(defn- strip-ns
+ [named]
+ (if (symbol? named)
+ (symbol nil (name named))
+ (keyword nil (name named))))
+
+(defn- lift-ns
+ "Returns [lifted-ns lifted-map] or nil if m can't be lifted."
+ [m]
+ (when *print-namespace-maps*
+ (loop [ns nil
+ [[k v :as entry] & entries] (seq m)
+ lm (empty m)]
+ (if entry
+ (when (or (keyword? k) (symbol? k))
+ (if ns
+ (when (= ns (namespace k))
+ (recur ns entries (assoc lm (strip-ns k) v)))
+ (when-let [new-ns (namespace k)]
+ (recur new-ns entries (assoc lm (strip-ns k) v)))))
+ [ns lm]))))
+
+(defn print-prefix-map [prefix m print-one writer opts]
+ (pr-sequential-writer
+ writer
+ (fn [e w opts]
+ (do (print-one (key e) w opts)
+ (-write w \space)
+ (print-one (val e) w opts)))
+ (str prefix "{") ", " "}"
+ opts (seq m)))
+
+(defn print-map [m print-one writer opts]
+ (let [[ns lift-map] (when (map? m)
+ (lift-ns m))]
+ (if ns
+ (print-prefix-map (str "#:" ns) lift-map print-one writer opts)
+ (print-prefix-map nil m print-one writer opts))))
+
+(extend-protocol IPrintWithWriter
+ LazySeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ TransformerIterator
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ IndexedSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ RSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ PersistentQueue
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "#queue [" " " "]" opts (seq coll)))
+
+ PersistentQueueSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ PersistentTreeMapSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ NodeSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ ArrayNodeSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ List
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ Cons
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ EmptyList
+ (-pr-writer [coll writer opts] (-write writer "()"))
+
+ PersistentVector
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "[" " " "]" opts coll))
+
+ ChunkedCons
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ ChunkedSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ Subvec
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "[" " " "]" opts coll))
+
+ BlackNode
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "[" " " "]" opts coll))
+
+ RedNode
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "[" " " "]" opts coll))
+
+ MapEntry
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "[" " " "]" opts coll))
+
+ ObjMap
+ (-pr-writer [coll writer opts]
+ (print-map coll pr-writer writer opts))
+
+ KeySeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ ValSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ PersistentArrayMapSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ PersistentArrayMap
+ (-pr-writer [coll writer opts]
+ (print-map coll pr-writer writer opts))
+
+ PersistentHashMap
+ (-pr-writer [coll writer opts]
+ (print-map coll pr-writer writer opts))
+
+ PersistentTreeMap
+ (-pr-writer [coll writer opts]
+ (print-map coll pr-writer writer opts))
+
+ PersistentHashSet
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "#{" " " "}" opts coll))
+
+ PersistentTreeSet
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "#{" " " "}" opts coll))
+
+ Range
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ Cycle
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ Repeat
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ Iterate
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ ES6IteratorSeq
+ (-pr-writer [coll writer opts] (pr-sequential-writer writer pr-writer "(" " " ")" opts coll))
+
+ Atom
+ (-pr-writer [a writer opts]
+ (-write writer "#object [cljs.core.Atom ")
+ (pr-writer {:val (.-state a)} writer opts)
+ (-write writer "]"))
+
+ Volatile
+ (-pr-writer [a writer opts]
+ (-write writer "#object [cljs.core.Volatile ")
+ (pr-writer {:val (.-state a)} writer opts)
+ (-write writer "]"))
+
+ Var
+ (-pr-writer [a writer opts]
+ (-write writer "#'")
+ (pr-writer (.-sym a) writer opts)))
+
+;; IComparable
+(extend-protocol IComparable
+ Symbol
+ (-compare [x y]
+ (if (symbol? y)
+ (compare-symbols x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y)))))
+
+ Keyword
+ (-compare [x y]
+ (if (keyword? y)
+ (compare-keywords x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y)))))
+
+ Subvec
+ (-compare [x y]
+ (if (vector? y)
+ (compare-indexed x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y)))))
+
+ PersistentVector
+ (-compare [x y]
+ (if (vector? y)
+ (compare-indexed x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y)))))
+
+ MapEntry
+ (-compare [x y]
+ (if (vector? y)
+ (compare-indexed x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y)))))
+
+ BlackNode
+ (-compare [x y]
+ (if (vector? y)
+ (compare-indexed x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y)))))
+
+ RedNode
+ (-compare [x y]
+ (if (vector? y)
+ (compare-indexed x y)
+ (throw (js/Error. (str "Cannot compare " x " to " y))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Reference Types ;;;;;;;;;;;;;;;;
+
+(defn alter-meta!
+ "Atomically sets the metadata for a namespace/var/ref/agent/atom to be:
+
+ (apply f its-current-meta args)
+
+ f must be free of side-effects"
+ [iref f & args]
+ (set! (.-meta iref) (apply f (.-meta iref) args)))
+
+(defn reset-meta!
+ "Atomically resets the metadata for an atom"
+ [iref m]
+ (set! (.-meta iref) m))
+
+(defn add-watch
+ "Adds a watch function to an atom reference. The watch fn must be a
+ fn of 4 args: a key, the reference, its old-state, its
+ new-state. Whenever the reference's state might have been changed,
+ any registered watches will have their functions called. The watch
+ fn will be called synchronously. Note that an atom's state
+ may have changed again prior to the fn call, so use old/new-state
+ rather than derefing the reference. Keys must be unique per
+ reference, and can be used to remove the watch with remove-watch,
+ but are otherwise considered opaque by the watch mechanism. Bear in
+ mind that regardless of the result or action of the watch fns the
+ atom's value will change. Example:
+
+ (def a (atom 0))
+ (add-watch a :inc (fn [k r o n] (assert (== 0 n))))
+ (swap! a inc)
+ ;; Assertion Error
+ (deref a)
+ ;=> 1"
+ [iref key f]
+ (-add-watch iref key f)
+ iref)
+
+(defn remove-watch
+ "Removes a watch (set by add-watch) from a reference"
+ [iref key]
+ (-remove-watch iref key)
+ iref)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gensym ;;;;;;;;;;;;;;;;
+;; Internal - do not use!
+(def
+ ^{:jsdoc ["@type {*}"]}
+ gensym_counter nil)
+
+(defn gensym
+ "Returns a new symbol with a unique name. If a prefix string is
+ supplied, the name is prefix# where # is some unique number. If
+ prefix is not supplied, the prefix is 'G__'."
+ ([] (gensym "G__"))
+ ([prefix-string]
+ (when (nil? gensym_counter)
+ (set! gensym_counter (atom 0)))
+ (symbol (str prefix-string (swap! gensym_counter inc)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Delay ;;;;;;;;;;;;;;;;;;;;
+
+(deftype Delay [^:mutable f ^:mutable value]
+ IDeref
+ (-deref [_]
+ (when f
+ (set! value (f))
+ (set! f nil))
+ value)
+
+ IPending
+ (-realized? [x]
+ (not f))
+
+ IPrintWithWriter
+ (-pr-writer [x writer opts]
+ (-write writer "#object[cljs.core.Delay ")
+ (pr-writer {:status (if (nil? f) :ready :pending), :val value} writer opts)
+ (-write writer "]")))
+
+(defn ^boolean delay?
+ "returns true if x is a Delay created with delay"
+ [x] (instance? Delay x))
+
+(defn force
+ "If x is a Delay, returns the (possibly cached) value of its expression, else returns x"
+ [x]
+ (if (delay? x)
+ (deref x)
+ x))
+
+(defn ^boolean realized?
+ "Returns true if a value has been produced for a delay or lazy sequence."
+ [x]
+ (-realized? x))
+
+(defn- preserving-reduced
+ [rf]
+ #(let [ret (rf %1 %2)]
+ (if (reduced? ret)
+ (reduced ret)
+ ret)))
+
+(defn cat
+ "A transducer which concatenates the contents of each input, which must be a
+ collection, into the reduction."
+ {:added "1.7"}
+ [rf]
+ (let [rf1 (preserving-reduced rf)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (reduce rf1 result input)))))
+
+(defn halt-when
+ "Returns a transducer that ends transduction when pred returns true
+ for an input. When retf is supplied it must be a fn of 2 arguments -
+ it will be passed the (completed) result so far and the input that
+ triggered the predicate, and its return value (if it does not throw
+ an exception) will be the return value of the transducer. If retf
+ is not supplied, the input that triggered the predicate will be
+ returned. If the predicate never returns true the transduction is
+ unaffected."
+ {:added "1.9"}
+ ([pred] (halt-when pred nil))
+ ([pred retf]
+ (fn [rf]
+ (fn
+ ([] (rf))
+ ([result]
+ (if (and (map? result) (contains? result ::halt))
+ (::halt result)
+ (rf result)))
+ ([result input]
+ (if (pred input)
+ (reduced {::halt (if retf (retf (rf result) input) input)})
+ (rf result input)))))))
+
+(defn dedupe
+ "Returns a lazy sequence removing consecutive duplicates in coll.
+ Returns a transducer when no collection is provided."
+ ([]
+ (fn [rf]
+ (let [pa (volatile! ::none)]
+ (fn
+ ([] (rf))
+ ([result] (rf result))
+ ([result input]
+ (let [prior @pa]
+ (vreset! pa input)
+ (if (= prior input)
+ result
+ (rf result input))))))))
+ ([coll] (sequence (dedupe) coll)))
+
+(declare rand)
+
+(defn random-sample
+ "Returns items from coll with random probability of prob (0.0 -
+ 1.0). Returns a transducer when no collection is provided."
+ ([prob]
+ (filter (fn [_] (< (rand) prob))))
+ ([prob coll]
+ (filter (fn [_] (< (rand) prob)) coll)))
+
+(deftype Eduction [xform coll]
+ Object
+ (indexOf [coll x]
+ (-indexOf coll x 0))
+ (indexOf [coll x start]
+ (-indexOf coll x start))
+ (lastIndexOf [coll x]
+ (-lastIndexOf coll x (count coll)))
+ (lastIndexOf [coll x start]
+ (-lastIndexOf coll x start))
+
+ ISequential
+
+ IIterable
+ (-iterator [_]
+ (.create TransformerIterator xform (iter coll)))
+
+ ISeqable
+ (-seq [_] (seq (sequence xform coll)))
+
+ IReduce
+ (-reduce [_ f] (transduce xform (completing f) coll))
+ (-reduce [_ f init] (transduce xform (completing f) init coll))
+
+ IPrintWithWriter
+ (-pr-writer [coll writer opts]
+ (pr-sequential-writer writer pr-writer "(" " " ")" opts coll)))
+
+(es6-iterable Eduction)
+
+(defn eduction
+ "Returns a reducible/iterable application of the transducers
+ to the items in coll. Transducers are applied in order as if
+ combined with comp. Note that these applications will be
+ performed every time reduce/iterator is called."
+ {:arglists '([xform* coll])}
+ [& xforms]
+ (Eduction. (apply comp (butlast xforms)) (last xforms)))
+
+(defn run!
+ "Runs the supplied procedure (via reduce), for purposes of side
+ effects, on successive items in the collection. Returns nil"
+ [proc coll]
+ (reduce #(proc %2) nil coll)
+ nil)
+
+(defprotocol IEncodeJS
+ (-clj->js [x] "Recursively transforms clj values to JavaScript")
+ (-key->js [x] "Transforms map keys to valid JavaScript keys. Arbitrary keys are
+ encoded to their string representation via (pr-str x)"))
+
+(declare clj->js)
+
+(defn key->js
+ ([k] (key->js k clj->js))
+ ([k primitive-fn]
+ (cond
+ (satisfies? IEncodeJS k) (-clj->js k)
+ (or (string? k)
+ (number? k)
+ (keyword? k)
+ (symbol? k)) (primitive-fn k)
+ :default (pr-str k))))
+
+(defn clj->js
+ "Recursively transforms ClojureScript values to JavaScript.
+ sets/vectors/lists become Arrays, Keywords and Symbol become Strings,
+ Maps become Objects. Arbitrary keys are encoded to by `key->js`.
+ Options is a key-value pair, where the only valid key is
+ :keyword-fn, which should point to a single-argument function to be
+ called on keyword keys. Default to `name`."
+ [x & {:keys [keyword-fn]
+ :or {keyword-fn name}
+ :as options}]
+ (letfn [(keyfn [k] (key->js k thisfn))
+ (thisfn [x] (cond
+ (nil? x) nil
+ (satisfies? IEncodeJS x) (-clj->js x)
+ (keyword? x) (keyword-fn x)
+ (symbol? x) (str x)
+ (map? x) (let [m (js-obj)]
+ (doseq [[k v] x]
+ (gobject/set m (keyfn k) (thisfn v)))
+ m)
+ (coll? x) (let [arr (array)]
+ (doseq [x (map thisfn x)]
+ (.push arr x))
+ arr)
+ :else x))]
+ (thisfn x)))
+
+
+(defprotocol IEncodeClojure
+ (-js->clj [x options] "Transforms JavaScript values to Clojure"))
+
+(defn js->clj
+ "Recursively transforms JavaScript arrays into ClojureScript
+ vectors, and JavaScript objects into ClojureScript maps. With
+ option ':keywordize-keys true' will convert object fields from
+ strings to keywords."
+ ([x] (js->clj x :keywordize-keys false))
+ ([x & opts]
+ (let [{:keys [keywordize-keys]} opts
+ keyfn (if keywordize-keys keyword str)
+ f (fn thisfn [x]
+ (cond
+ (satisfies? IEncodeClojure x)
+ (-js->clj x (apply array-map opts))
+
+ (seq? x)
+ (doall (map thisfn x))
+
+ (map-entry? x)
+ (MapEntry. (thisfn (key x)) (thisfn (val x)) nil)
+
+ (coll? x)
+ (into (empty x) (map thisfn) x)
+
+ (array? x)
+ (persistent!
+ (reduce #(conj! %1 (thisfn %2))
+ (transient []) x))
+
+ (identical? (type x) js/Object)
+ (persistent!
+ (reduce (fn [r k] (assoc! r (keyfn k) (thisfn (gobject/get x k))))
+ (transient {}) (js-keys x)))
+ :else x))]
+ (f x))))
+
+(defn memoize
+ "Returns a memoized version of a referentially transparent function. The
+ memoized version of the function keeps a cache of the mapping from arguments
+ to results and, when calls with the same arguments are repeated often, has
+ higher performance at the expense of higher memory use."
+ [f]
+ (let [mem (atom {})]
+ (fn [& args]
+ (let [v (get @mem args lookup-sentinel)]
+ (if (identical? v lookup-sentinel)
+ (let [ret (apply f args)]
+ (swap! mem assoc args ret)
+ ret)
+ v)))))
+
+(defn trampoline
+ "trampoline can be used to convert algorithms requiring mutual
+ recursion without stack consumption. Calls f with supplied args, if
+ any. If f returns a fn, calls that fn with no arguments, and
+ continues to repeat, until the return value is not a fn, then
+ returns that non-fn value. Note that if you want to return a fn as a
+ final value, you must wrap it in some data structure and unpack it
+ after trampoline returns."
+ ([f]
+ (let [ret (f)]
+ (if (fn? ret)
+ (recur ret)
+ ret)))
+ ([f & args]
+ (trampoline #(apply f args))))
+
+(defn rand
+ "Returns a random floating point number between 0 (inclusive) and
+ n (default 1) (exclusive)."
+ ([] (rand 1))
+ ([n] (* (Math/random) n)))
+
+(defn rand-int
+ "Returns a random integer between 0 (inclusive) and n (exclusive)."
+ [n] (Math/floor (* (Math/random) n)))
+
+(defn rand-nth
+ "Return a random element of the (sequential) collection. Will have
+ the same performance characteristics as nth for the given
+ collection."
+ [coll]
+ (nth coll (rand-int (count coll))))
+
+(defn group-by
+ "Returns a map of the elements of coll keyed by the result of
+ f on each element. The value at each key will be a vector of the
+ corresponding elements, in the order they appeared in coll."
+ [f coll]
+ (persistent!
+ (reduce
+ (fn [ret x]
+ (let [k (f x)]
+ (assoc! ret k (conj (get ret k []) x))))
+ (transient {}) coll)))
+
+(defn make-hierarchy
+ "Creates a hierarchy object for use with derive, isa? etc."
+ [] {:parents {} :descendants {} :ancestors {}})
+
+(def
+ ^{:private true
+ :jsdoc ["@type {*}"]}
+ -global-hierarchy nil)
+
+(defn- get-global-hierarchy []
+ (when (nil? -global-hierarchy)
+ (set! -global-hierarchy (atom (make-hierarchy))))
+ -global-hierarchy)
+
+(defn- swap-global-hierarchy! [f & args]
+ (apply swap! (get-global-hierarchy) f args))
+
+(defn ^boolean isa?
+ "Returns true if (= child parent), or child is directly or indirectly derived from
+ parent, either via a JavaScript type inheritance relationship or a
+ relationship established via derive. h must be a hierarchy obtained
+ from make-hierarchy, if not supplied defaults to the global
+ hierarchy"
+ ([child parent] (isa? @(get-global-hierarchy) child parent))
+ ([h child parent]
+ (or (= child parent)
+ ;; (and (class? parent) (class? child)
+ ;; (. ^Class parent isAssignableFrom child))
+ (contains? ((:ancestors h) child) parent)
+ ;;(and (class? child) (some #(contains? ((:ancestors h) %) parent) (supers child)))
+ (and (vector? parent) (vector? child)
+ (== (count parent) (count child))
+ (loop [ret true i 0]
+ (if (or (not ret) (== i (count parent)))
+ ret
+ (recur (isa? h (child i) (parent i)) (inc i))))))))
+
+(defn parents
+ "Returns the immediate parents of tag, either via a JavaScript type
+ inheritance relationship or a relationship established via derive. h
+ must be a hierarchy obtained from make-hierarchy, if not supplied
+ defaults to the global hierarchy"
+ ([tag] (parents @(get-global-hierarchy) tag))
+ ([h tag] (not-empty (get (:parents h) tag))))
+
+(defn ancestors
+ "Returns the immediate and indirect parents of tag, either via a JavaScript type
+ inheritance relationship or a relationship established via derive. h
+ must be a hierarchy obtained from make-hierarchy, if not supplied
+ defaults to the global hierarchy"
+ ([tag] (ancestors @(get-global-hierarchy) tag))
+ ([h tag] (not-empty (get (:ancestors h) tag))))
+
+(defn descendants
+ "Returns the immediate and indirect children of tag, through a
+ relationship established via derive. h must be a hierarchy obtained
+ from make-hierarchy, if not supplied defaults to the global
+ hierarchy. Note: does not work on JavaScript type inheritance
+ relationships."
+ ([tag] (descendants @(get-global-hierarchy) tag))
+ ([h tag] (not-empty (get (:descendants h) tag))))
+
+(defn derive
+ "Establishes a parent/child relationship between parent and
+ tag. Parent must be a namespace-qualified symbol or keyword and
+ child can be either a namespace-qualified symbol or keyword or a
+ class. h must be a hierarchy obtained from make-hierarchy, if not
+ supplied defaults to, and modifies, the global hierarchy."
+ ([tag parent]
+ (assert (namespace parent))
+ ;; (assert (or (class? tag) (and (instance? cljs.core.Named tag) (namespace tag))))
+ (swap-global-hierarchy! derive tag parent) nil)
+ ([h tag parent]
+ (assert (not= tag parent))
+ ;; (assert (or (class? tag) (instance? clojure.lang.Named tag)))
+ ;; (assert (instance? clojure.lang.INamed tag))
+ ;; (assert (instance? clojure.lang.INamed parent))
+ (let [tp (:parents h)
+ td (:descendants h)
+ ta (:ancestors h)
+ tf (fn [m source sources target targets]
+ (reduce (fn [ret k]
+ (assoc ret k
+ (reduce conj (get targets k #{}) (cons target (targets target)))))
+ m (cons source (sources source))))]
+ (or
+ (when-not (contains? (tp tag) parent)
+ (when (contains? (ta tag) parent)
+ (throw (js/Error. (str tag "already has" parent "as ancestor"))))
+ (when (contains? (ta parent) tag)
+ (throw (js/Error. (str "Cyclic derivation:" parent "has" tag "as ancestor"))))
+ {:parents (assoc (:parents h) tag (conj (get tp tag #{}) parent))
+ :ancestors (tf (:ancestors h) tag td parent ta)
+ :descendants (tf (:descendants h) parent ta tag td)})
+ h))))
+
+(defn underive
+ "Removes a parent/child relationship between parent and
+ tag. h must be a hierarchy obtained from make-hierarchy, if not
+ supplied defaults to, and modifies, the global hierarchy."
+ ([tag parent]
+ (swap-global-hierarchy! underive tag parent)
+ nil)
+ ([h tag parent]
+ (let [parentMap (:parents h)
+ childsParents (if (parentMap tag)
+ (disj (parentMap tag) parent) #{})
+ newParents (if (not-empty childsParents)
+ (assoc parentMap tag childsParents)
+ (dissoc parentMap tag))
+ deriv-seq (flatten (map #(cons (first %) (interpose (first %) (second %)))
+ (seq newParents)))]
+ (if (contains? (parentMap tag) parent)
+ (reduce #(apply derive %1 %2) (make-hierarchy)
+ (partition 2 deriv-seq))
+ h))))
+
+(defn- reset-cache
+ [method-cache method-table cached-hierarchy hierarchy]
+ (swap! method-cache (fn [_] (deref method-table)))
+ (swap! cached-hierarchy (fn [_] (deref hierarchy))))
+
+(defn- prefers*
+ [x y prefer-table]
+ (let [xprefs (@prefer-table x)]
+ (or
+ (when (and xprefs (xprefs y))
+ true)
+ (loop [ps (parents y)]
+ (when (pos? (count ps))
+ (when (prefers* x (first ps) prefer-table)
+ true)
+ (recur (rest ps))))
+ (loop [ps (parents x)]
+ (when (pos? (count ps))
+ (when (prefers* (first ps) y prefer-table)
+ true)
+ (recur (rest ps))))
+ false)))
+
+(defn- dominates
+ [x y prefer-table hierarchy]
+ (or (prefers* x y prefer-table) (isa? hierarchy x y)))
+
+(defn- find-and-cache-best-method
+ [name dispatch-val hierarchy method-table prefer-table method-cache cached-hierarchy default-dispatch-val]
+ (let [best-entry (reduce (fn [be [k _ :as e]]
+ (if (isa? @hierarchy dispatch-val k)
+ (let [be2 (if (or (nil? be) (dominates k (first be) prefer-table @hierarchy))
+ e
+ be)]
+ (when-not (dominates (first be2) k prefer-table @hierarchy)
+ (throw (js/Error.
+ (str "Multiple methods in multimethod '" name
+ "' match dispatch value: " dispatch-val " -> " k
+ " and " (first be2) ", and neither is preferred"))))
+ be2)
+ be))
+ nil @method-table)
+ best-entry (if-let [entry (and (nil? best-entry) (@method-table default-dispatch-val))]
+ [default-dispatch-val entry]
+ best-entry)]
+ (when best-entry
+ (if (= @cached-hierarchy @hierarchy)
+ (do
+ (swap! method-cache assoc dispatch-val (second best-entry))
+ (second best-entry))
+ (do
+ (reset-cache method-cache method-table cached-hierarchy hierarchy)
+ (find-and-cache-best-method name dispatch-val hierarchy method-table prefer-table
+ method-cache cached-hierarchy default-dispatch-val))))))
+
+(defprotocol IMultiFn
+ (-reset [mf])
+ (-add-method [mf dispatch-val method])
+ (-remove-method [mf dispatch-val])
+ (-prefer-method [mf dispatch-val dispatch-val-y])
+ (-get-method [mf dispatch-val])
+ (-methods [mf])
+ (-prefers [mf])
+ (-default-dispatch-val [mf])
+ (-dispatch-fn [mf]))
+
+(defn- throw-no-method-error [name dispatch-val]
+ (throw (js/Error. (str "No method in multimethod '" name "' for dispatch value: " dispatch-val))))
+
+(deftype MultiFn [name dispatch-fn default-dispatch-val hierarchy
+ method-table prefer-table method-cache cached-hierarchy]
+ IFn
+ (-invoke [mf]
+ (let [dispatch-val (dispatch-fn)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn)))
+ (-invoke [mf a]
+ (let [dispatch-val (dispatch-fn a)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a)))
+ (-invoke [mf a b]
+ (let [dispatch-val (dispatch-fn a b)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b)))
+ (-invoke [mf a b c]
+ (let [dispatch-val (dispatch-fn a b c)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c)))
+ (-invoke [mf a b c d]
+ (let [dispatch-val (dispatch-fn a b c d)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d)))
+ (-invoke [mf a b c d e]
+ (let [dispatch-val (dispatch-fn a b c d e)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e)))
+ (-invoke [mf a b c d e f]
+ (let [dispatch-val (dispatch-fn a b c d e f)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f)))
+ (-invoke [mf a b c d e f g]
+ (let [dispatch-val (dispatch-fn a b c d e f g)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g)))
+ (-invoke [mf a b c d e f g h]
+ (let [dispatch-val (dispatch-fn a b c d e f g h)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h)))
+ (-invoke [mf a b c d e f g h i]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i)))
+ (-invoke [mf a b c d e f g h i j]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j)))
+ (-invoke [mf a b c d e f g h i j k]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k)))
+ (-invoke [mf a b c d e f g h i j k l]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l)))
+ (-invoke [mf a b c d e f g h i j k l m]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m)))
+ (-invoke [mf a b c d e f g h i j k l m n]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n)))
+ (-invoke [mf a b c d e f g h i j k l m n o]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o)))
+ (-invoke [mf a b c d e f g h i j k l m n o p]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o p)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o p)))
+ (-invoke [mf a b c d e f g h i j k l m n o p q]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o p q)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o p q)))
+ (-invoke [mf a b c d e f g h i j k l m n o p q r]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o p q r)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o p q r)))
+ (-invoke [mf a b c d e f g h i j k l m n o p q r s]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o p q r s)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o p q r s)))
+ (-invoke [mf a b c d e f g h i j k l m n o p q r s t]
+ (let [dispatch-val (dispatch-fn a b c d e f g h i j k l m n o p q r s t)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (target-fn a b c d e f g h i j k l m n o p q r s t)))
+ (-invoke [mf a b c d e f g h i j k l m n o p q r s t rest]
+ (let [dispatch-val (apply dispatch-fn a b c d e f g h i j k l m n o p q r s t rest)
+ target-fn (-get-method mf dispatch-val)]
+ (when-not target-fn
+ (throw-no-method-error name dispatch-val))
+ (apply target-fn a b c d e f g h i j k l m n o p q r s t rest)))
+
+ IMultiFn
+ (-reset [mf]
+ (swap! method-table (fn [mf] {}))
+ (swap! method-cache (fn [mf] {}))
+ (swap! prefer-table (fn [mf] {}))
+ (swap! cached-hierarchy (fn [mf] nil))
+ mf)
+
+ (-add-method [mf dispatch-val method]
+ (swap! method-table assoc dispatch-val method)
+ (reset-cache method-cache method-table cached-hierarchy hierarchy)
+ mf)
+
+ (-remove-method [mf dispatch-val]
+ (swap! method-table dissoc dispatch-val)
+ (reset-cache method-cache method-table cached-hierarchy hierarchy)
+ mf)
+
+ (-get-method [mf dispatch-val]
+ (when-not (= @cached-hierarchy @hierarchy)
+ (reset-cache method-cache method-table cached-hierarchy hierarchy))
+ (if-let [target-fn (@method-cache dispatch-val)]
+ target-fn
+ (find-and-cache-best-method name dispatch-val hierarchy method-table
+ prefer-table method-cache cached-hierarchy default-dispatch-val)))
+
+ (-prefer-method [mf dispatch-val-x dispatch-val-y]
+ (when (prefers* dispatch-val-x dispatch-val-y prefer-table)
+ (throw (js/Error. (str "Preference conflict in multimethod '" name "': " dispatch-val-y
+ " is already preferred to " dispatch-val-x))))
+ (swap! prefer-table
+ (fn [old]
+ (assoc old dispatch-val-x
+ (conj (get old dispatch-val-x #{})
+ dispatch-val-y))))
+ (reset-cache method-cache method-table cached-hierarchy hierarchy))
+
+ (-methods [mf] @method-table)
+ (-prefers [mf] @prefer-table)
+ (-default-dispatch-val [mf] default-dispatch-val)
+ (-dispatch-fn [mf] dispatch-fn)
+
+ INamed
+ (-name [this] (-name name))
+ (-namespace [this] (-namespace name))
+
+ IHash
+ (-hash [this] (goog/getUid this)))
+
+(defn remove-all-methods
+ "Removes all of the methods of multimethod."
+ [multifn]
+ (-reset multifn))
+
+(defn remove-method
+ "Removes the method of multimethod associated with dispatch-value."
+ [multifn dispatch-val]
+ (-remove-method multifn dispatch-val))
+
+(defn prefer-method
+ "Causes the multimethod to prefer matches of dispatch-val-x over dispatch-val-y
+ when there is a conflict"
+ [multifn dispatch-val-x dispatch-val-y]
+ (-prefer-method multifn dispatch-val-x dispatch-val-y))
+
+(defn methods
+ "Given a multimethod, returns a map of dispatch values -> dispatch fns"
+ [multifn] (-methods multifn))
+
+(defn get-method
+ "Given a multimethod and a dispatch value, returns the dispatch fn
+ that would apply to that value, or nil if none apply and no default"
+ [multifn dispatch-val] (-get-method multifn dispatch-val))
+
+(defn prefers
+ "Given a multimethod, returns a map of preferred value -> set of other values"
+ [multifn] (-prefers multifn))
+
+(defn default-dispatch-val
+ "Given a multimethod, return it's default-dispatch-val."
+ [multifn] (-default-dispatch-val multifn))
+
+(defn dispatch-fn
+ "Given a multimethod, return it's dispatch-fn."
+ [multifn] (-dispatch-fn multifn))
+
+;; UUID
+(defprotocol IUUID "A marker protocol for UUIDs")
+
+(deftype UUID [uuid ^:mutable __hash]
+ IUUID
+
+ Object
+ (toString [_] uuid)
+ (equiv [this other]
+ (-equiv this other))
+
+ IEquiv
+ (-equiv [_ other]
+ (and (instance? UUID other) (identical? uuid (.-uuid other))))
+
+ IPrintWithWriter
+ (-pr-writer [_ writer _]
+ (-write writer (str "#uuid \"" uuid "\"")))
+
+ IHash
+ (-hash [this]
+ (when (nil? __hash)
+ (set! __hash (hash uuid)))
+ __hash)
+
+ IComparable
+ (-compare [_ other]
+ (garray/defaultCompare uuid (.-uuid other))))
+
+(defn uuid [s]
+ (assert (string? s))
+ (UUID. (.toLowerCase s) nil))
+
+(defn random-uuid []
+ (letfn [(hex [] (.toString (rand-int 16) 16))]
+ (let [rhex (.toString (bit-or 0x8 (bit-and 0x3 (rand-int 16))) 16)]
+ (uuid
+ (str (hex) (hex) (hex) (hex)
+ (hex) (hex) (hex) (hex) "-"
+ (hex) (hex) (hex) (hex) "-"
+ "4" (hex) (hex) (hex) "-"
+ rhex (hex) (hex) (hex) "-"
+ (hex) (hex) (hex) (hex)
+ (hex) (hex) (hex) (hex)
+ (hex) (hex) (hex) (hex))))))
+
+(defn ^boolean uuid?
+ [x] (implements? IUUID x))
+
+;;; ExceptionInfo
+
+(defn- pr-writer-ex-info [obj writer opts]
+ (-write writer "#error {:message ")
+ (pr-writer (.-message obj) writer opts)
+ (when (.-data obj)
+ (-write writer ", :data ")
+ (pr-writer (.-data obj) writer opts))
+ (when (.-cause obj)
+ (-write writer ", :cause ")
+ (pr-writer (.-cause obj) writer opts))
+ (-write writer "}"))
+
+(defn ^{:jsdoc ["@constructor"]}
+ ExceptionInfo [message data cause]
+ (let [e (js/Error. message)]
+ (this-as this
+ (set! (.-message this) message)
+ (set! (.-data this) data)
+ (set! (.-cause this) cause)
+ (do
+ (set! (.-name this) (.-name e))
+ ;; non-standard
+ (set! (.-description this) (.-description e))
+ (set! (.-number this) (.-number e))
+ (set! (.-fileName this) (.-fileName e))
+ (set! (.-lineNumber this) (.-lineNumber e))
+ (set! (.-columnNumber this) (.-columnNumber e))
+ (set! (.-stack this) (.-stack e)))
+ this)))
+
+(set! (.. ExceptionInfo -prototype -__proto__) js/Error.prototype)
+
+(extend-type ExceptionInfo
+ IPrintWithWriter
+ (-pr-writer [obj writer opts]
+ (pr-writer-ex-info obj writer opts)))
+
+(set! (.. ExceptionInfo -prototype -toString)
+ (fn []
+ (this-as this (pr-str* this))))
+
+(defn ex-info
+ "Create an instance of ExceptionInfo, an Error type that carries a
+ map of additional data."
+ ([msg data] (ex-info msg data nil))
+ ([msg data cause]
+ (ExceptionInfo. msg data cause)))
+
+(defn ex-data
+ "Returns exception data (a map) if ex is an ExceptionInfo.
+ Otherwise returns nil."
+ [ex]
+ (when (instance? ExceptionInfo ex)
+ (.-data ex)))
+
+(defn ex-message
+ "Returns the message attached to the given Error / ExceptionInfo object.
+ For non-Errors returns nil."
+ [ex]
+ (when (instance? js/Error ex)
+ (.-message ex)))
+
+(defn ex-cause
+ "Returns exception cause (an Error / ExceptionInfo) if ex is an
+ ExceptionInfo.
+ Otherwise returns nil."
+ [ex]
+ (when (instance? ExceptionInfo ex)
+ (.-cause ex)))
+
+(defn comparator
+ "Returns an JavaScript compatible comparator based upon pred."
+ [pred]
+ (fn [x y]
+ (cond (pred x y) -1 (pred y x) 1 :else 0)))
+
+(defn ^boolean special-symbol?
+ "Returns true if x names a special form"
+ [x]
+ (contains?
+ '#{if def fn* do let* loop* letfn* throw try catch finally
+ recur new set! ns deftype* defrecord* . js* & quote case* var ns*}
+ x))
+
+(defn test
+ "test [v] finds fn at key :test in var metadata and calls it,
+ presuming failure will throw exception"
+ [v]
+ (let [f (.-cljs$lang$test v)]
+ (if f
+ (do (f) :ok)
+ :no-test)))
+
+
+(deftype TaggedLiteral [tag form]
+ Object
+ (toString [coll]
+ (pr-str* coll))
+
+ IEquiv
+ (-equiv [this other]
+ (and (instance? TaggedLiteral other)
+ (= tag (.-tag other))
+ (= form (.-form other))))
+
+ IHash
+ (-hash [this]
+ (+ (* 31 (hash tag))
+ (hash form)))
+
+ ILookup
+ (-lookup [this v]
+ (-lookup this v nil))
+ (-lookup [this v not-found]
+ (case v
+ :tag tag
+ :form form
+ not-found))
+
+ IPrintWithWriter
+ (-pr-writer [o writer opts]
+ (-write writer (str "#" tag " "))
+ (pr-writer form writer opts)))
+
+(defn ^boolean tagged-literal?
+ "Return true if the value is the data representation of a tagged literal"
+ [value]
+ (instance? TaggedLiteral value))
+
+(defn tagged-literal
+ "Construct a data representation of a tagged literal from a
+ tag symbol and a form."
+ [tag form]
+ {:pre [(symbol? tag)]}
+ (TaggedLiteral. tag form))
+
+(def
+ ^{:private true
+ :jsdoc ["@type {*}"]}
+ js-reserved-arr
+ #js ["arguments" "abstract" "await" "boolean" "break" "byte" "case"
+ "catch" "char" "class" "const" "continue"
+ "debugger" "default" "delete" "do" "double"
+ "else" "enum" "export" "extends" "final"
+ "finally" "float" "for" "function" "goto" "if"
+ "implements" "import" "in" "instanceof" "int"
+ "interface" "let" "long" "native" "new"
+ "package" "private" "protected" "public"
+ "return" "short" "static" "super" "switch"
+ "synchronized" "this" "throw" "throws"
+ "transient" "try" "typeof" "var" "void"
+ "volatile" "while" "with" "yield" "methods"
+ "null" "constructor"])
+
+(def
+ ^{:jsdoc ["@type {null|Object}"]}
+ js-reserved nil)
+
+(defn- js-reserved? [x]
+ (when (nil? js-reserved)
+ (set! js-reserved
+ (reduce #(do (gobject/set %1 %2 true) %1)
+ #js {} js-reserved-arr)))
+ (.hasOwnProperty js-reserved x))
+
+(defn- demunge-pattern []
+ (when-not DEMUNGE_PATTERN
+ (set! DEMUNGE_PATTERN
+ (let [ks (sort (fn [a b] (- (. b -length) (. a -length)))
+ (js-keys DEMUNGE_MAP))]
+ (loop [ks ks ret ""]
+ (if (seq ks)
+ (recur
+ (next ks)
+ (str
+ (cond-> ret
+ (not (identical? ret "")) (str "|"))
+ (first ks)))
+ (str ret "|\\$"))))))
+ DEMUNGE_PATTERN)
+
+(defn- munge-str [name]
+ (let [sb (StringBuffer.)]
+ (loop [i 0]
+ (if (< i (. name -length))
+ (let [c (.charAt name i)
+ sub (gobject/get CHAR_MAP c)]
+ (if-not (nil? sub)
+ (.append sb sub)
+ (.append sb c))
+ (recur (inc i)))))
+ (.toString sb)))
+
+(defn munge [name]
+ (let [name' (munge-str (str name))
+ name' (cond
+ (identical? name' "..") "_DOT__DOT_"
+ (js-reserved? name') (str name' "$")
+ :else name')]
+ (if (symbol? name)
+ (symbol name')
+ name')))
+
+(defn- demunge-str [munged-name]
+ (let [r (js/RegExp. (demunge-pattern) "g")
+ munged-name (if (gstring/endsWith munged-name "$")
+ (.substring munged-name 0 (dec (. munged-name -length)))
+ munged-name)]
+ (loop [ret "" last-match-end 0]
+ (if-let [match (.exec r munged-name)]
+ (let [[x] match]
+ (recur
+ (str ret
+ (.substring munged-name last-match-end
+ (- (. r -lastIndex) (. x -length)))
+ (if (identical? x "$") "/" (gobject/get DEMUNGE_MAP x)))
+ (. r -lastIndex)))
+ (str ret
+ (.substring munged-name last-match-end (.-length munged-name)))))))
+
+(defn demunge [name]
+ ((if (symbol? name) symbol str)
+ (let [name' (str name)]
+ (if (identical? name' "_DOT__DOT_")
+ ".."
+ (demunge-str name')))))
+
+(defonce ^{:jsdoc ["@type {*}"] :private true}
+ tapset nil)
+
+(defn- maybe-init-tapset []
+ (when (nil? tapset)
+ (set! tapset (atom #{}))))
+
+(defn add-tap
+ "Adds f, a fn of one argument, to the tap set. This function will be called with
+ anything sent via tap>. Remember f in order to remove-tap"
+ [f]
+ (maybe-init-tapset)
+ (swap! tapset conj f)
+ nil)
+
+(defn remove-tap
+ "Remove f from the tap set."
+ [f]
+ (maybe-init-tapset)
+ (swap! tapset disj f)
+ nil)
+
+(defn ^boolean tap>
+ "Sends x to any taps. Returns the result of *exec-tap-fn*, a Boolean value."
+ [x]
+ (maybe-init-tapset)
+ (*exec-tap-fn*
+ (fn []
+ (doseq [tap @tapset]
+ (try
+ (tap x)
+ (catch js/Error ex))))))
+
+;; -----------------------------------------------------------------------------
+;; Bootstrap helpers - incompatible with advanced compilation
+
+(defn- ns-lookup
+ "Bootstrap only."
+ [ns-obj k]
+ (fn [] (gobject/get ns-obj k)))
+
+;; Bootstrap only
+(deftype Namespace [obj name]
+ Object
+ (findInternedVar [this sym]
+ (let [k (munge (str sym))]
+ (when ^boolean (gobject/containsKey obj k)
+ (let [var-sym (symbol (str name) (str sym))
+ var-meta {:ns this}]
+ (Var. (ns-lookup obj k) var-sym var-meta)))))
+ (getName [_] name)
+ (toString [_]
+ (str name))
+ IEquiv
+ (-equiv [_ other]
+ (if (instance? Namespace other)
+ (= name (.-name other))
+ false))
+ IHash
+ (-hash [_]
+ (hash name)))
+
+(def
+ ^{:doc "Bootstrap only." :jsdoc ["@type {*}"]}
+ NS_CACHE nil)
+
+(defn- find-ns-obj*
+ "Bootstrap only."
+ [ctxt xs]
+ (cond
+ (nil? ctxt) nil
+ (nil? xs) ctxt
+ :else (recur (gobject/get ctxt (first xs)) (next xs))))
+
+(defn find-ns-obj
+ "Bootstrap only."
+ [ns]
+ (let [munged-ns (munge (str ns))
+ segs (.split munged-ns ".")]
+ (case *target*
+ "nodejs" (if ^boolean js/COMPILED
+ ; Under simple optimizations on nodejs, namespaces will be in module
+ ; rather than global scope and must be accessed by a direct call to eval.
+ ; The first segment may refer to an undefined variable, so its evaluation
+ ; may throw ReferenceError.
+ (find-ns-obj*
+ (try
+ (let [ctxt (js/eval (first segs))]
+ (when (and ctxt (object? ctxt))
+ ctxt))
+ (catch js/ReferenceError e
+ nil))
+ (next segs))
+ (find-ns-obj* goog/global segs))
+ ("default" "webworker") (find-ns-obj* goog/global segs)
+ (throw (js/Error. (str "find-ns-obj not supported for target " *target*))))))
+
+(defn ns-interns*
+ "Returns a map of the intern mappings for the namespace.
+ Bootstrap only."
+ [sym]
+ (let [ns-obj (find-ns-obj sym)
+ ns (Namespace. ns-obj sym)]
+ (letfn [(step [ret k]
+ (let [var-sym (symbol (demunge k))]
+ (assoc ret
+ var-sym (Var. #(gobject/get ns-obj k)
+ (symbol (str sym) (str var-sym)) {:ns ns}))))]
+ (reduce step {} (js-keys ns-obj)))))
+
+(defn create-ns
+ "Create a new namespace named by the symbol. Bootstrap only."
+ ([sym]
+ (create-ns sym (find-ns-obj sym)))
+ ([sym ns-obj]
+ (Namespace. ns-obj sym)))
+
+(defn find-ns
+ "Returns the namespace named by the symbol or nil if it doesn't exist.
+ Bootstrap only."
+ [ns]
+ (when (nil? NS_CACHE)
+ (set! NS_CACHE (atom {})))
+ (let [the-ns (get @NS_CACHE ns)]
+ (if-not (nil? the-ns)
+ the-ns
+ (let [ns-obj (find-ns-obj ns)]
+ (when-not (nil? ns-obj)
+ (let [new-ns (create-ns ns ns-obj)]
+ (swap! NS_CACHE assoc ns new-ns)
+ new-ns))))))
+
+(defn find-macros-ns
+ "Returns the macros namespace named by the symbol or nil if it doesn't exist.
+ Bootstrap only."
+ [ns]
+ (when (nil? NS_CACHE)
+ (set! NS_CACHE (atom {})))
+ (let [ns-str (str ns)
+ ns (if (not ^boolean (gstring/contains ns-str "$macros"))
+ (symbol (str ns-str "$macros"))
+ ns)
+ the-ns (get @NS_CACHE ns)]
+ (if-not (nil? the-ns)
+ the-ns
+ (let [ns-obj (find-ns-obj ns)]
+ (when-not (nil? ns-obj)
+ (let [new-ns (create-ns ns ns-obj)]
+ (swap! NS_CACHE assoc ns new-ns)
+ new-ns))))))
+
+(defn ns-name
+ "Returns the name of the namespace, a Namespace object.
+ Bootstrap only."
+ [ns-obj]
+ (.-name ns-obj))
+
+(defn uri?
+ "Returns true x is a goog.Uri instance."
+ {:added "1.9"}
+ [x]
+ (instance? goog.Uri x))
+
+(defn- maybe-enable-print! []
+ (cond
+ (exists? js/console)
+ (enable-console-print!)
+
+ (or (identical? *target* "nashorn")
+ (identical? *target* "graaljs"))
+ (let [system (.type js/Java "java.lang.System")]
+ (set! *print-newline* false)
+ (set-print-fn!
+ (fn []
+ (let [xs (js-arguments)
+ s (.join (garray/clone xs) "")]
+ (.println (.-out system) s))))
+ (set-print-err-fn!
+ (fn []
+ (let [xs (js-arguments)
+ s (.join (garray/clone xs) "")]
+ (.println (.-error system) s)))))))
+
+(maybe-enable-print!)
+
+(defonce
+ ^{:doc "Runtime environments may provide a way to evaluate ClojureScript
+ forms. Whatever function *eval* is bound to will be passed any forms which
+ should be evaluated." :dynamic true}
+ *eval*
+ (fn [_]
+ (throw (js/Error. "cljs.core/*eval* not bound"))))
+
+(defn eval
+ "Evaluates the form data structure (not text!) and returns the result.
+ Delegates to cljs.core/*eval*. Intended for use in self-hosted ClojureScript,
+ which sets up an implementation of cljs.core/*eval* for that environment."
+ [form]
+ (*eval* form))
diff --git a/src/http/static/viz/2/cljs/core.js b/src/http/static/viz/2/cljs/core.js
new file mode 100644
index 0000000..31ad4ae
--- /dev/null
+++ b/src/http/static/viz/2/cljs/core.js
@@ -0,0 +1,37633 @@
+// Compiled by ClojureScript 1.10.439 {:static-fns true}
+goog.provide('cljs.core');
+goog.require('goog.math.Long');
+goog.require('goog.math.Integer');
+goog.require('goog.string');
+goog.require('goog.object');
+goog.require('goog.array');
+goog.require('goog.Uri');
+goog.require('goog.string.StringBuffer');
+cljs.core._STAR_clojurescript_version_STAR_ = "1.10.439";
+cljs.core._STAR_unchecked_if_STAR_ = false;
+cljs.core._STAR_unchecked_arrays_STAR_ = false;
+cljs.core._STAR_warn_on_infer_STAR_ = false;
+if((typeof cljs !== 'undefined') && (typeof cljs.core !== 'undefined') && (typeof cljs.core.PROTOCOL_SENTINEL !== 'undefined')){
+} else {
+cljs.core.PROTOCOL_SENTINEL = ({});
+}
+cljs.core.MODULE_URIS = null;
+cljs.core.MODULE_INFOS = null;
+
+/** @define {string} */
+goog.define("cljs.core._STAR_target_STAR_","default");
+/**
+ * Var bound to the current namespace. Only used for bootstrapping.
+ * @type {*}
+ */
+cljs.core._STAR_ns_STAR_ = null;
+/**
+ * @type {*}
+ */
+cljs.core._STAR_out_STAR_ = null;
+cljs.core._STAR_assert_STAR_ = true;
+if((typeof cljs !== 'undefined') && (typeof cljs.core !== 'undefined') && (typeof cljs.core._STAR_print_fn_STAR_ !== 'undefined')){
+} else {
+/**
+ * Each runtime environment provides a different way to print output.
+ * Whatever function *print-fn* is bound to will be passed any
+ * Strings which should be printed.
+ */
+cljs.core._STAR_print_fn_STAR_ = null;
+}
+/**
+ * Arranges to have tap functions executed via the supplied f, a
+ * function of no arguments. Returns true if successful, false otherwise.
+ */
+cljs.core._STAR_exec_tap_fn_STAR_ = (function cljs$core$_STAR_exec_tap_fn_STAR_(f){
+var and__7791__auto__ = (typeof setTimeout !== 'undefined');
+if(and__7791__auto__){
+var and__7791__auto____$1 = setTimeout(f,(0));
+if(cljs.core.truth_(and__7791__auto____$1)){
+return true;
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+});
+if((typeof cljs !== 'undefined') && (typeof cljs.core !== 'undefined') && (typeof cljs.core._STAR_print_err_fn_STAR_ !== 'undefined')){
+} else {
+/**
+ * Each runtime environment provides a different way to print error output.
+ * Whatever function *print-err-fn* is bound to will be passed any
+ * Strings which should be printed.
+ */
+cljs.core._STAR_print_err_fn_STAR_ = null;
+}
+/**
+ * Set *print-fn* to f.
+ */
+cljs.core.set_print_fn_BANG_ = (function cljs$core$set_print_fn_BANG_(f){
+return cljs.core._STAR_print_fn_STAR_ = f;
+});
+/**
+ * Set *print-err-fn* to f.
+ */
+cljs.core.set_print_err_fn_BANG_ = (function cljs$core$set_print_err_fn_BANG_(f){
+return cljs.core._STAR_print_err_fn_STAR_ = f;
+});
+/**
+ * When set to true, output will be flushed whenever a newline is printed.
+ *
+ * Defaults to true.
+ */
+cljs.core._STAR_flush_on_newline_STAR_ = true;
+/**
+ * When set to logical false will drop newlines from printing calls.
+ * This is to work around the implicit newlines emitted by standard JavaScript
+ * console objects.
+ */
+cljs.core._STAR_print_newline_STAR_ = true;
+/**
+ * When set to logical false, strings and characters will be printed with
+ * non-alphanumeric characters converted to the appropriate escape sequences.
+ *
+ * Defaults to true
+ */
+cljs.core._STAR_print_readably_STAR_ = true;
+/**
+ * If set to logical true, when printing an object, its metadata will also
+ * be printed in a form that can be read back by the reader.
+ *
+ * Defaults to false.
+ */
+cljs.core._STAR_print_meta_STAR_ = false;
+/**
+ * When set to logical true, objects will be printed in a way that preserves
+ * their type when read in later.
+ *
+ * Defaults to false.
+ */
+cljs.core._STAR_print_dup_STAR_ = false;
+/**
+ * *print-namespace-maps* controls whether the printer will print
+ * namespace map literal syntax.
+ *
+ * Defaults to false, but the REPL binds it to true.
+ */
+cljs.core._STAR_print_namespace_maps_STAR_ = false;
+/**
+ * *print-length* controls how many items of each collection the
+ * printer will print. If it is bound to logical false, there is no
+ * limit. Otherwise, it must be bound to an integer indicating the maximum
+ * number of items of each collection to print. If a collection contains
+ * more items, the printer will print items up to the limit followed by
+ * '...' to represent the remaining items. The root binding is nil
+ * indicating no limit.
+ * @type {null|number}
+ */
+cljs.core._STAR_print_length_STAR_ = null;
+/**
+ * *print-level* controls how many levels deep the printer will
+ * print nested objects. If it is bound to logical false, there is no
+ * limit. Otherwise, it must be bound to an integer indicating the maximum
+ * level to print. Each argument to print is at level 0; if an argument is a
+ * collection, its items are at level 1; and so on. If an object is a
+ * collection and is at a level greater than or equal to the value bound to
+ * *print-level*, the printer prints '#' to represent it. The root binding
+ * is nil indicating no limit.
+ * @type {null|number}
+ */
+cljs.core._STAR_print_level_STAR_ = null;
+/**
+ * *print-fns-bodies* controls whether functions print their source or
+ * only their names.
+ */
+cljs.core._STAR_print_fn_bodies_STAR_ = false;
+if((typeof cljs !== 'undefined') && (typeof cljs.core !== 'undefined') && (typeof cljs.core._STAR_loaded_libs_STAR_ !== 'undefined')){
+} else {
+/**
+ * @type {*}
+ */
+cljs.core._STAR_loaded_libs_STAR_ = null;
+}
+cljs.core.pr_opts = (function cljs$core$pr_opts(){
+return new cljs.core.PersistentArrayMap(null, 5, [new cljs.core.Keyword(null,"flush-on-newline","flush-on-newline",-151457939),cljs.core._STAR_flush_on_newline_STAR_,new cljs.core.Keyword(null,"readably","readably",1129599760),cljs.core._STAR_print_readably_STAR_,new cljs.core.Keyword(null,"meta","meta",1499536964),cljs.core._STAR_print_meta_STAR_,new cljs.core.Keyword(null,"dup","dup",556298533),cljs.core._STAR_print_dup_STAR_,new cljs.core.Keyword(null,"print-length","print-length",1931866356),cljs.core._STAR_print_length_STAR_], null);
+});
+/**
+ * Set *print-fn* to console.log
+ */
+cljs.core.enable_console_print_BANG_ = (function cljs$core$enable_console_print_BANG_(){
+cljs.core._STAR_print_newline_STAR_ = false;
+
+cljs.core.set_print_fn_BANG_((function (){
+var xs = arguments;
+return console.log.apply(console,goog.array.clone(xs));
+}));
+
+cljs.core.set_print_err_fn_BANG_((function (){
+var xs = arguments;
+return console.error.apply(console,goog.array.clone(xs));
+}));
+
+return null;
+});
+/**
+ * Internal - do not use!
+ */
+cljs.core.truth_ = (function cljs$core$truth_(x){
+return (x != null && x !== false);
+});
+cljs.core.not_native = null;
+
+/**
+ * Tests if 2 arguments are the same object
+ */
+cljs.core.identical_QMARK_ = (function cljs$core$identical_QMARK_(x,y){
+return (x === y);
+});
+/**
+ * Returns true if x is nil, false otherwise.
+ */
+cljs.core.nil_QMARK_ = (function cljs$core$nil_QMARK_(x){
+return (x == null);
+});
+/**
+ * Returns true if x is a JavaScript array.
+ */
+cljs.core.array_QMARK_ = (function cljs$core$array_QMARK_(x){
+if((cljs.core._STAR_target_STAR_ === "nodejs")){
+return Array.isArray(x);
+} else {
+return (x instanceof Array);
+}
+});
+/**
+ * Returns true if x is a JavaScript number.
+ */
+cljs.core.number_QMARK_ = (function cljs$core$number_QMARK_(x){
+return typeof x === 'number';
+});
+/**
+ * Returns true if x is logical false, false otherwise.
+ */
+cljs.core.not = (function cljs$core$not(x){
+if((x == null)){
+return true;
+} else {
+if(x === false){
+return true;
+} else {
+return false;
+
+}
+}
+});
+/**
+ * Returns true if x is not nil, false otherwise.
+ */
+cljs.core.some_QMARK_ = (function cljs$core$some_QMARK_(x){
+return (!((x == null)));
+});
+/**
+ * Returns true if x's constructor is Object
+ */
+cljs.core.object_QMARK_ = (function cljs$core$object_QMARK_(x){
+if((!((x == null)))){
+return (x.constructor === Object);
+} else {
+return false;
+}
+});
+/**
+ * Returns true if x is a JavaScript string.
+ */
+cljs.core.string_QMARK_ = (function cljs$core$string_QMARK_(x){
+return goog.isString(x);
+});
+/**
+ * Returns true if x is a JavaScript string of length one.
+ */
+cljs.core.char_QMARK_ = (function cljs$core$char_QMARK_(x){
+return ((typeof x === 'string') && (((1) === x.length)));
+});
+/**
+ * Returns true if given any argument.
+ */
+cljs.core.any_QMARK_ = (function cljs$core$any_QMARK_(x){
+return true;
+});
+/**
+ * Internal - do not use!
+ */
+cljs.core.native_satisfies_QMARK_ = (function cljs$core$native_satisfies_QMARK_(p,x){
+var x__$1 = (((x == null))?null:x);
+if((p[goog.typeOf(x__$1)])){
+return true;
+} else {
+if((p["_"])){
+return true;
+} else {
+return false;
+
+}
+}
+});
+cljs.core.is_proto_ = (function cljs$core$is_proto_(x){
+return (x.constructor.prototype === x);
+});
+/**
+ * When compiled for a command-line target, whatever function
+ * *main-cli-fn* is set to will be called with the command-line
+ * argv as arguments
+ */
+cljs.core._STAR_main_cli_fn_STAR_ = null;
+/**
+ * A sequence of the supplied command line arguments, or nil if
+ * none were supplied
+ */
+cljs.core._STAR_command_line_args_STAR_ = null;
+/**
+ * Return x's constructor.
+ */
+cljs.core.type = (function cljs$core$type(x){
+if((x == null)){
+return null;
+} else {
+return x.constructor;
+}
+});
+cljs.core.missing_protocol = (function cljs$core$missing_protocol(proto,obj){
+var ty = cljs.core.type(obj);
+var ty__$1 = (cljs.core.truth_((function (){var and__7791__auto__ = ty;
+if(cljs.core.truth_(and__7791__auto__)){
+return ty.cljs$lang$type;
+} else {
+return and__7791__auto__;
+}
+})())?ty.cljs$lang$ctorStr:goog.typeOf(obj));
+return (new Error(["No protocol method ",proto," defined for type ",ty__$1,": ",obj].join("")));
+});
+cljs.core.type__GT_str = (function cljs$core$type__GT_str(ty){
+var temp__4655__auto__ = ty.cljs$lang$ctorStr;
+if(cljs.core.truth_(temp__4655__auto__)){
+var s = temp__4655__auto__;
+return s;
+} else {
+return cljs.core.str.cljs$core$IFn$_invoke$arity$1(ty);
+}
+});
+cljs.core.load_file = (function cljs$core$load_file(file){
+if(cljs.core.truth_(COMPILED)){
+return null;
+} else {
+return goog.nodeGlobalRequire(file);
+}
+});
+if((((typeof Symbol !== 'undefined')) && ((goog.typeOf(Symbol) === "function")))){
+cljs.core.ITER_SYMBOL = Symbol.iterator;
+} else {
+cljs.core.ITER_SYMBOL = "@@iterator";
+}
+/**
+ * @enum {string}
+ */
+cljs.core.CHAR_MAP = ({"]": "_RBRACK_", "'": "_SINGLEQUOTE_", "=": "_EQ_", "\"": "_DOUBLEQUOTE_", "!": "_BANG_", "*": "_STAR_", "%": "_PERCENT_", "|": "_BAR_", "~": "_TILDE_", "/": "_SLASH_", "\\": "_BSLASH_", "-": "_", "?": "_QMARK_", "&": "_AMPERSAND_", ":": "_COLON_", "<": "_LT_", "{": "_LBRACE_", "}": "_RBRACE_", "[": "_LBRACK_", "#": "_SHARP_", "^": "_CARET_", "+": "_PLUS_", "@": "_CIRCA_", ">": "_GT_"});
+/**
+ * @enum {string}
+ */
+cljs.core.DEMUNGE_MAP = ({"_RBRACE_": "}", "_COLON_": ":", "_BANG_": "!", "_QMARK_": "?", "_BSLASH_": "\\\\", "_SLASH_": "/", "_PERCENT_": "%", "_PLUS_": "+", "_SHARP_": "#", "_LBRACE_": "{", "_BAR_": "|", "_LBRACK_": "[", "_EQ_": "=", "_": "-", "_TILDE_": "~", "_RBRACK_": "]", "_GT_": ">", "_SINGLEQUOTE_": "'", "_CIRCA_": "@", "_AMPERSAND_": "&", "_DOUBLEQUOTE_": "\\\"", "_CARET_": "^", "_LT_": "<", "_STAR_": "*"});
+cljs.core.DEMUNGE_PATTERN = null;
+/**
+ * Returns highest resolution time offered by host in milliseconds.
+ */
+cljs.core.system_time = (function cljs$core$system_time(){
+if((((typeof performance !== 'undefined')) && ((!((performance.now == null)))))){
+return performance.now();
+} else {
+if((((typeof process !== 'undefined')) && ((!((process.hrtime == null)))))){
+var t = process.hrtime();
+return ((((t[(0)]) * 1.0E9) + (t[(1)])) / 1000000.0);
+} else {
+return (new Date()).getTime();
+
+}
+}
+});
+/**
+ * Construct a JavaScript array of the specified dimensions. Accepts ignored
+ * type argument for compatibility with Clojure. Note that there is no efficient
+ * way to allocate multi-dimensional arrays in JavaScript; as such, this function
+ * will run in polynomial time when called with 3 or more arguments.
+ */
+cljs.core.make_array = (function cljs$core$make_array(var_args){
+var G__10030 = arguments.length;
+switch (G__10030) {
+case 1:
+return cljs.core.make_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.make_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10032 = arguments.length;
+var i__9001__auto___10033 = (0);
+while(true){
+if((i__9001__auto___10033 < len__9000__auto___10032)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10033]));
+
+var G__10034 = (i__9001__auto___10033 + (1));
+i__9001__auto___10033 = G__10034;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.make_array.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.make_array.cljs$core$IFn$_invoke$arity$1 = (function (size){
+return (new Array(size));
+});
+
+cljs.core.make_array.cljs$core$IFn$_invoke$arity$2 = (function (type,size){
+return (new Array(size));
+});
+
+cljs.core.make_array.cljs$core$IFn$_invoke$arity$variadic = (function (type,size,more_sizes){
+var dims = more_sizes;
+var dimarray = (new Array(size));
+var n__8769__auto___10035 = dimarray.length;
+var i_10036 = (0);
+while(true){
+if((i_10036 < n__8769__auto___10035)){
+(dimarray[i_10036] = cljs.core.apply.cljs$core$IFn$_invoke$arity$3(cljs.core.make_array,null,dims));
+
+var G__10037 = (i_10036 + (1));
+i_10036 = G__10037;
+continue;
+} else {
+}
+break;
+}
+
+return dimarray;
+});
+
+/** @this {Function} */
+cljs.core.make_array.cljs$lang$applyTo = (function (seq10027){
+var G__10028 = cljs.core.first(seq10027);
+var seq10027__$1 = cljs.core.next(seq10027);
+var G__10029 = cljs.core.first(seq10027__$1);
+var seq10027__$2 = cljs.core.next(seq10027__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10028,G__10029,seq10027__$2);
+});
+
+cljs.core.make_array.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns a javascript array, cloned from the passed in array
+ */
+cljs.core.aclone = (function cljs$core$aclone(arr){
+var len = arr.length;
+var new_arr = (new Array(len));
+var n__8769__auto___10038 = len;
+var i_10039 = (0);
+while(true){
+if((i_10039 < n__8769__auto___10038)){
+(new_arr[i_10039] = (arr[i_10039]));
+
+var G__10040 = (i_10039 + (1));
+i_10039 = G__10040;
+continue;
+} else {
+}
+break;
+}
+
+return new_arr;
+});
+/**
+ * Creates a new javascript array.
+ * @param {...*} var_args
+ */
+cljs.core.array = (function cljs$core$array(var_args){
+var a = (new Array(arguments.length));
+var i = (0);
+while(true){
+if((i < a.length)){
+(a[i] = (arguments[i]));
+
+var G__10041 = (i + (1));
+i = G__10041;
+continue;
+} else {
+return a;
+}
+break;
+}
+});
+cljs.core.maybe_warn = (function cljs$core$maybe_warn(e){
+if(cljs.core.truth_(cljs.core._STAR_print_err_fn_STAR_)){
+return (cljs.core._STAR_print_err_fn_STAR_.cljs$core$IFn$_invoke$arity$1 ? cljs.core._STAR_print_err_fn_STAR_.cljs$core$IFn$_invoke$arity$1(e) : cljs.core._STAR_print_err_fn_STAR_.call(null,e));
+} else {
+return null;
+}
+});
+cljs.core.checked_aget = (function cljs$core$checked_aget(var_args){
+var G__10046 = arguments.length;
+switch (G__10046) {
+case 2:
+return cljs.core.checked_aget.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10049 = arguments.length;
+var i__9001__auto___10050 = (0);
+while(true){
+if((i__9001__auto___10050 < len__9000__auto___10049)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10050]));
+
+var G__10051 = (i__9001__auto___10050 + (1));
+i__9001__auto___10050 = G__10051;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.checked_aget.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.checked_aget.cljs$core$IFn$_invoke$arity$2 = (function (array,idx){
+try{if(cljs.core.truth_((function (){var or__7806__auto__ = cljs.core.array_QMARK_(array);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return goog.isArrayLike(array);
+}
+})())){
+} else {
+throw (new Error("Assert failed: (or (array? array) (goog/isArrayLike array))"));
+}
+
+if(typeof idx === 'number'){
+} else {
+throw (new Error("Assert failed: (number? idx)"));
+}
+
+if((!((idx < (0))))){
+} else {
+throw (new Error("Assert failed: (not (neg? idx))"));
+}
+
+if((idx < array.length)){
+} else {
+throw (new Error("Assert failed: (< idx (alength array))"));
+}
+}catch (e10047){var e_10052 = e10047;
+cljs.core.maybe_warn(e_10052);
+}
+return (array[idx]);
+});
+
+cljs.core.checked_aget.cljs$core$IFn$_invoke$arity$variadic = (function (array,idx,idxs){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$3(cljs.core.checked_aget,cljs.core.checked_aget.cljs$core$IFn$_invoke$arity$2(array,idx),idxs);
+});
+
+/** @this {Function} */
+cljs.core.checked_aget.cljs$lang$applyTo = (function (seq10043){
+var G__10044 = cljs.core.first(seq10043);
+var seq10043__$1 = cljs.core.next(seq10043);
+var G__10045 = cljs.core.first(seq10043__$1);
+var seq10043__$2 = cljs.core.next(seq10043__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10044,G__10045,seq10043__$2);
+});
+
+cljs.core.checked_aget.cljs$lang$maxFixedArity = (2);
+
+cljs.core.checked_aset = (function cljs$core$checked_aset(var_args){
+var G__10058 = arguments.length;
+switch (G__10058) {
+case 3:
+return cljs.core.checked_aset.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10061 = arguments.length;
+var i__9001__auto___10062 = (0);
+while(true){
+if((i__9001__auto___10062 < len__9000__auto___10061)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10062]));
+
+var G__10063 = (i__9001__auto___10062 + (1));
+i__9001__auto___10062 = G__10063;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.checked_aset.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.checked_aset.cljs$core$IFn$_invoke$arity$3 = (function (array,idx,val){
+try{if(cljs.core.truth_((function (){var or__7806__auto__ = cljs.core.array_QMARK_(array);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return goog.isArrayLike(array);
+}
+})())){
+} else {
+throw (new Error("Assert failed: (or (array? array) (goog/isArrayLike array))"));
+}
+
+if(typeof idx === 'number'){
+} else {
+throw (new Error("Assert failed: (number? idx)"));
+}
+
+if((!((idx < (0))))){
+} else {
+throw (new Error("Assert failed: (not (neg? idx))"));
+}
+
+if((idx < array.length)){
+} else {
+throw (new Error("Assert failed: (< idx (alength array))"));
+}
+}catch (e10059){var e_10064 = e10059;
+cljs.core.maybe_warn(e_10064);
+}
+return (array[idx] = val);
+});
+
+cljs.core.checked_aset.cljs$core$IFn$_invoke$arity$variadic = (function (array,idx,idx2,idxv){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$4(cljs.core.checked_aset,cljs.core.checked_aget.cljs$core$IFn$_invoke$arity$2(array,idx),idx2,idxv);
+});
+
+/** @this {Function} */
+cljs.core.checked_aset.cljs$lang$applyTo = (function (seq10054){
+var G__10055 = cljs.core.first(seq10054);
+var seq10054__$1 = cljs.core.next(seq10054);
+var G__10056 = cljs.core.first(seq10054__$1);
+var seq10054__$2 = cljs.core.next(seq10054__$1);
+var G__10057 = cljs.core.first(seq10054__$2);
+var seq10054__$3 = cljs.core.next(seq10054__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10055,G__10056,G__10057,seq10054__$3);
+});
+
+cljs.core.checked_aset.cljs$lang$maxFixedArity = (3);
+
+cljs.core.checked_aget_SINGLEQUOTE_ = (function cljs$core$checked_aget_SINGLEQUOTE_(var_args){
+var G__10069 = arguments.length;
+switch (G__10069) {
+case 2:
+return cljs.core.checked_aget_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10071 = arguments.length;
+var i__9001__auto___10072 = (0);
+while(true){
+if((i__9001__auto___10072 < len__9000__auto___10071)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10072]));
+
+var G__10073 = (i__9001__auto___10072 + (1));
+i__9001__auto___10072 = G__10073;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.checked_aget_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.checked_aget_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$2 = (function (array,idx){
+if(cljs.core.truth_((function (){var or__7806__auto__ = cljs.core.array_QMARK_(array);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return goog.isArrayLike(array);
+}
+})())){
+} else {
+throw (new Error("Assert failed: (or (array? array) (goog/isArrayLike array))"));
+}
+
+if(typeof idx === 'number'){
+} else {
+throw (new Error("Assert failed: (number? idx)"));
+}
+
+if((!((idx < (0))))){
+} else {
+throw (new Error("Assert failed: (not (neg? idx))"));
+}
+
+if((idx < array.length)){
+} else {
+throw (new Error("Assert failed: (< idx (alength array))"));
+}
+
+return (array[idx]);
+});
+
+cljs.core.checked_aget_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$variadic = (function (array,idx,idxs){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$3(cljs.core.checked_aget_SINGLEQUOTE_,cljs.core.checked_aget_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$2(array,idx),idxs);
+});
+
+/** @this {Function} */
+cljs.core.checked_aget_SINGLEQUOTE_.cljs$lang$applyTo = (function (seq10066){
+var G__10067 = cljs.core.first(seq10066);
+var seq10066__$1 = cljs.core.next(seq10066);
+var G__10068 = cljs.core.first(seq10066__$1);
+var seq10066__$2 = cljs.core.next(seq10066__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10067,G__10068,seq10066__$2);
+});
+
+cljs.core.checked_aget_SINGLEQUOTE_.cljs$lang$maxFixedArity = (2);
+
+cljs.core.checked_aset_SINGLEQUOTE_ = (function cljs$core$checked_aset_SINGLEQUOTE_(var_args){
+var G__10079 = arguments.length;
+switch (G__10079) {
+case 3:
+return cljs.core.checked_aset_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10081 = arguments.length;
+var i__9001__auto___10082 = (0);
+while(true){
+if((i__9001__auto___10082 < len__9000__auto___10081)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10082]));
+
+var G__10083 = (i__9001__auto___10082 + (1));
+i__9001__auto___10082 = G__10083;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.checked_aset_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.checked_aset_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$3 = (function (array,idx,val){
+if(cljs.core.truth_((function (){var or__7806__auto__ = cljs.core.array_QMARK_(array);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return goog.isArrayLike(array);
+}
+})())){
+} else {
+throw (new Error("Assert failed: (or (array? array) (goog/isArrayLike array))"));
+}
+
+if(typeof idx === 'number'){
+} else {
+throw (new Error("Assert failed: (number? idx)"));
+}
+
+if((!((idx < (0))))){
+} else {
+throw (new Error("Assert failed: (not (neg? idx))"));
+}
+
+if((idx < array.length)){
+} else {
+throw (new Error("Assert failed: (< idx (alength array))"));
+}
+
+return (array[idx] = val);
+});
+
+cljs.core.checked_aset_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$variadic = (function (array,idx,idx2,idxv){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$4(cljs.core.checked_aset_SINGLEQUOTE_,cljs.core.checked_aget_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$2(array,idx),idx2,idxv);
+});
+
+/** @this {Function} */
+cljs.core.checked_aset_SINGLEQUOTE_.cljs$lang$applyTo = (function (seq10075){
+var G__10076 = cljs.core.first(seq10075);
+var seq10075__$1 = cljs.core.next(seq10075);
+var G__10077 = cljs.core.first(seq10075__$1);
+var seq10075__$2 = cljs.core.next(seq10075__$1);
+var G__10078 = cljs.core.first(seq10075__$2);
+var seq10075__$3 = cljs.core.next(seq10075__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10076,G__10077,G__10078,seq10075__$3);
+});
+
+cljs.core.checked_aset_SINGLEQUOTE_.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Returns the value at the index/indices. Works on JavaScript arrays.
+ */
+cljs.core.aget = (function cljs$core$aget(var_args){
+var G__10088 = arguments.length;
+switch (G__10088) {
+case 2:
+return cljs.core.aget.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10090 = arguments.length;
+var i__9001__auto___10091 = (0);
+while(true){
+if((i__9001__auto___10091 < len__9000__auto___10090)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10091]));
+
+var G__10092 = (i__9001__auto___10091 + (1));
+i__9001__auto___10091 = G__10092;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.aget.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.aget.cljs$core$IFn$_invoke$arity$2 = (function (array,idx){
+return (array[idx]);
+});
+
+cljs.core.aget.cljs$core$IFn$_invoke$arity$variadic = (function (array,idx,idxs){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$3(cljs.core.aget,(array[idx]),idxs);
+});
+
+/** @this {Function} */
+cljs.core.aget.cljs$lang$applyTo = (function (seq10085){
+var G__10086 = cljs.core.first(seq10085);
+var seq10085__$1 = cljs.core.next(seq10085);
+var G__10087 = cljs.core.first(seq10085__$1);
+var seq10085__$2 = cljs.core.next(seq10085__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10086,G__10087,seq10085__$2);
+});
+
+cljs.core.aget.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Sets the value at the index/indices. Works on JavaScript arrays.
+ * Returns val.
+ */
+cljs.core.aset = (function cljs$core$aset(var_args){
+var G__10098 = arguments.length;
+switch (G__10098) {
+case 3:
+return cljs.core.aset.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10100 = arguments.length;
+var i__9001__auto___10101 = (0);
+while(true){
+if((i__9001__auto___10101 < len__9000__auto___10100)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10101]));
+
+var G__10102 = (i__9001__auto___10101 + (1));
+i__9001__auto___10101 = G__10102;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.aset.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.aset.cljs$core$IFn$_invoke$arity$3 = (function (array,idx,val){
+return (array[idx] = val);
+});
+
+cljs.core.aset.cljs$core$IFn$_invoke$arity$variadic = (function (array,idx,idx2,idxv){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$4(cljs.core.aset,(array[idx]),idx2,idxv);
+});
+
+/** @this {Function} */
+cljs.core.aset.cljs$lang$applyTo = (function (seq10094){
+var G__10095 = cljs.core.first(seq10094);
+var seq10094__$1 = cljs.core.next(seq10094);
+var G__10096 = cljs.core.first(seq10094__$1);
+var seq10094__$2 = cljs.core.next(seq10094__$1);
+var G__10097 = cljs.core.first(seq10094__$2);
+var seq10094__$3 = cljs.core.next(seq10094__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10095,G__10096,G__10097,seq10094__$3);
+});
+
+cljs.core.aset.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Returns the length of the array. Works on arrays of all types.
+ */
+cljs.core.alength = (function cljs$core$alength(array){
+return array.length;
+});
+/**
+ * Returns an array with components set to the values in aseq. Optional type
+ * argument accepted for compatibility with Clojure.
+ */
+cljs.core.into_array = (function cljs$core$into_array(var_args){
+var G__10104 = arguments.length;
+switch (G__10104) {
+case 1:
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.into_array.cljs$core$IFn$_invoke$arity$1 = (function (aseq){
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$2(null,aseq);
+});
+
+cljs.core.into_array.cljs$core$IFn$_invoke$arity$2 = (function (type,aseq){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (a,x){
+a.push(x);
+
+return a;
+}),[],aseq);
+});
+
+cljs.core.into_array.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Invoke JavaScript object method via string. Needed when the
+ * string is not a valid unquoted property name.
+ */
+cljs.core.js_invoke = (function cljs$core$js_invoke(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___10109 = arguments.length;
+var i__9001__auto___10110 = (0);
+while(true){
+if((i__9001__auto___10110 < len__9000__auto___10109)){
+args__9010__auto__.push((arguments[i__9001__auto___10110]));
+
+var G__10111 = (i__9001__auto___10110 + (1));
+i__9001__auto___10110 = G__10111;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((2) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((2)),(0),null)):null);
+return cljs.core.js_invoke.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9011__auto__);
+});
+
+cljs.core.js_invoke.cljs$core$IFn$_invoke$arity$variadic = (function (obj,s,args){
+return (obj[s]).apply(obj,cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(args));
+});
+
+cljs.core.js_invoke.cljs$lang$maxFixedArity = (2);
+
+/** @this {Function} */
+cljs.core.js_invoke.cljs$lang$applyTo = (function (seq10106){
+var G__10107 = cljs.core.first(seq10106);
+var seq10106__$1 = cljs.core.next(seq10106);
+var G__10108 = cljs.core.first(seq10106__$1);
+var seq10106__$2 = cljs.core.next(seq10106__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10107,G__10108,seq10106__$2);
+});
+
+
+/**
+ * Marker protocol
+ * @interface
+ */
+cljs.core.Fn = function(){};
+
+
+/**
+ * Protocol for adding the ability to invoke an object as a function.
+ * For example, a vector can also be used to look up a value:
+ * ([1 2 3 4] 1) => 2
+ * @interface
+ */
+cljs.core.IFn = function(){};
+
+cljs.core._invoke = (function cljs$core$_invoke(var_args){
+var G__10113 = arguments.length;
+switch (G__10113) {
+case 1:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 6:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+case 7:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$7((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]));
+
+break;
+case 8:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$8((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]));
+
+break;
+case 9:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$9((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]));
+
+break;
+case 10:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$10((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]));
+
+break;
+case 11:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$11((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]));
+
+break;
+case 12:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$12((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]));
+
+break;
+case 13:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$13((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]));
+
+break;
+case 14:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$14((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]));
+
+break;
+case 15:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$15((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]));
+
+break;
+case 16:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$16((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]));
+
+break;
+case 17:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$17((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]));
+
+break;
+case 18:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$18((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]),(arguments[(17)]));
+
+break;
+case 19:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$19((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]),(arguments[(17)]),(arguments[(18)]));
+
+break;
+case 20:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$20((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]),(arguments[(17)]),(arguments[(18)]),(arguments[(19)]));
+
+break;
+case 21:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$21((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]),(arguments[(17)]),(arguments[(18)]),(arguments[(19)]),(arguments[(20)]));
+
+break;
+case 22:
+return cljs.core._invoke.cljs$core$IFn$_invoke$arity$22((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]),(arguments[(12)]),(arguments[(13)]),(arguments[(14)]),(arguments[(15)]),(arguments[(16)]),(arguments[(17)]),(arguments[(18)]),(arguments[(19)]),(arguments[(20)]),(arguments[(21)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$1 = (function (this$){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$1 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$1(this$);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(this$) : m__8503__auto__.call(null,this$));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(this$) : m__8503__auto____$1.call(null,this$));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$2 = (function (this$,a){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$2 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$2(this$,a);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(this$,a) : m__8503__auto__.call(null,this$,a));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(this$,a) : m__8503__auto____$1.call(null,this$,a));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$3 = (function (this$,a,b){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$3 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$3(this$,a,b);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(this$,a,b) : m__8503__auto__.call(null,this$,a,b));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(this$,a,b) : m__8503__auto____$1.call(null,this$,a,b));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$4 = (function (this$,a,b,c){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$4 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$4(this$,a,b,c);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$4 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$4(this$,a,b,c) : m__8503__auto__.call(null,this$,a,b,c));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$4 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$4(this$,a,b,c) : m__8503__auto____$1.call(null,this$,a,b,c));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$5 = (function (this$,a,b,c,d){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$5 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$5(this$,a,b,c,d);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$5 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$5(this$,a,b,c,d) : m__8503__auto__.call(null,this$,a,b,c,d));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$5 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$5(this$,a,b,c,d) : m__8503__auto____$1.call(null,this$,a,b,c,d));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$6 = (function (this$,a,b,c,d,e){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$6 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$6(this$,a,b,c,d,e);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$6 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$6(this$,a,b,c,d,e) : m__8503__auto__.call(null,this$,a,b,c,d,e));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$6 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$6(this$,a,b,c,d,e) : m__8503__auto____$1.call(null,this$,a,b,c,d,e));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$7 = (function (this$,a,b,c,d,e,f){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$7 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$7(this$,a,b,c,d,e,f);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$7 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$7(this$,a,b,c,d,e,f) : m__8503__auto__.call(null,this$,a,b,c,d,e,f));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$7 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$7(this$,a,b,c,d,e,f) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$8 = (function (this$,a,b,c,d,e,f,g){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$8 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$8(this$,a,b,c,d,e,f,g);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$8 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$8(this$,a,b,c,d,e,f,g) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$8 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$8(this$,a,b,c,d,e,f,g) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$9 = (function (this$,a,b,c,d,e,f,g,h){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$9 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$9(this$,a,b,c,d,e,f,g,h);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$9 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$9(this$,a,b,c,d,e,f,g,h) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$9 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$9(this$,a,b,c,d,e,f,g,h) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$10 = (function (this$,a,b,c,d,e,f,g,h,i){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$10 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$10(this$,a,b,c,d,e,f,g,h,i);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$10 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$10(this$,a,b,c,d,e,f,g,h,i) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$10 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$10(this$,a,b,c,d,e,f,g,h,i) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$11 = (function (this$,a,b,c,d,e,f,g,h,i,j){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$11 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$11(this$,a,b,c,d,e,f,g,h,i,j);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$11 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$11(this$,a,b,c,d,e,f,g,h,i,j) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$11 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$11(this$,a,b,c,d,e,f,g,h,i,j) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$12 = (function (this$,a,b,c,d,e,f,g,h,i,j,k){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$12 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$12(this$,a,b,c,d,e,f,g,h,i,j,k);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$12 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$12(this$,a,b,c,d,e,f,g,h,i,j,k) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$12 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$12(this$,a,b,c,d,e,f,g,h,i,j,k) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$13 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$13 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$13(this$,a,b,c,d,e,f,g,h,i,j,k,l);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$13 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$13(this$,a,b,c,d,e,f,g,h,i,j,k,l) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$13 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$13(this$,a,b,c,d,e,f,g,h,i,j,k,l) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$14 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$14 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$14(this$,a,b,c,d,e,f,g,h,i,j,k,l,m);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$14 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$14(this$,a,b,c,d,e,f,g,h,i,j,k,l,m) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$14 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$14(this$,a,b,c,d,e,f,g,h,i,j,k,l,m) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$15 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$15 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$15(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$15 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$15(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$15 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$15(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$16 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$16 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$16(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$16 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$16(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$16 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$16(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$17 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$17 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$17(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$17 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$17(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$17 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$17(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$18 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$18 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$18(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$18 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$18(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$18 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$18(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$19 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$19 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$19(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$19 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$19(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$19 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$19(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$20 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$20 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$20(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$20 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$20(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$20 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$20(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$21 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$21 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$21(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$21 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$21(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$21 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$21(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$core$IFn$_invoke$arity$22 = (function (this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IFn$_invoke$arity$22 == null)))))){
+return this$.cljs$core$IFn$_invoke$arity$22(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._invoke[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$22 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$22(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest) : m__8503__auto__.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest));
+} else {
+var m__8503__auto____$1 = (cljs.core._invoke["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$22 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$22(this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest) : m__8503__auto____$1.call(null,this$,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest));
+} else {
+throw cljs.core.missing_protocol("IFn.-invoke",this$);
+}
+}
+}
+});
+
+cljs.core._invoke.cljs$lang$maxFixedArity = 22;
+
+
+
+/**
+ * Protocol for cloning a value.
+ * @interface
+ */
+cljs.core.ICloneable = function(){};
+
+/**
+ * Creates a clone of value.
+ */
+cljs.core._clone = (function cljs$core$_clone(value){
+if((((!((value == null)))) && ((!((value.cljs$core$ICloneable$_clone$arity$1 == null)))))){
+return value.cljs$core$ICloneable$_clone$arity$1(value);
+} else {
+var x__8502__auto__ = (((value == null))?null:value);
+var m__8503__auto__ = (cljs.core._clone[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(value) : m__8503__auto__.call(null,value));
+} else {
+var m__8503__auto____$1 = (cljs.core._clone["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(value) : m__8503__auto____$1.call(null,value));
+} else {
+throw cljs.core.missing_protocol("ICloneable.-clone",value);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding the ability to count a collection in constant time.
+ * @interface
+ */
+cljs.core.ICounted = function(){};
+
+/**
+ * Calculates the count of coll in constant time. Used by cljs.core/count.
+ */
+cljs.core._count = (function cljs$core$_count(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$ICounted$_count$arity$1 == null)))))){
+return coll.cljs$core$ICounted$_count$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._count[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._count["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("ICounted.-count",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for creating an empty collection.
+ * @interface
+ */
+cljs.core.IEmptyableCollection = function(){};
+
+/**
+ * Returns an empty collection of the same category as coll. Used
+ * by cljs.core/empty.
+ */
+cljs.core._empty = (function cljs$core$_empty(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IEmptyableCollection$_empty$arity$1 == null)))))){
+return coll.cljs$core$IEmptyableCollection$_empty$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._empty[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._empty["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IEmptyableCollection.-empty",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding to a collection.
+ * @interface
+ */
+cljs.core.ICollection = function(){};
+
+/**
+ * Returns a new collection of coll with o added to it. The new item
+ * should be added to the most efficient place, e.g.
+ * (conj [1 2 3 4] 5) => [1 2 3 4 5]
+ * (conj '(2 3 4 5) 1) => '(1 2 3 4 5)
+ */
+cljs.core._conj = (function cljs$core$_conj(coll,o){
+if((((!((coll == null)))) && ((!((coll.cljs$core$ICollection$_conj$arity$2 == null)))))){
+return coll.cljs$core$ICollection$_conj$arity$2(coll,o);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._conj[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(coll,o) : m__8503__auto__.call(null,coll,o));
+} else {
+var m__8503__auto____$1 = (cljs.core._conj["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,o) : m__8503__auto____$1.call(null,coll,o));
+} else {
+throw cljs.core.missing_protocol("ICollection.-conj",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for collections to provide indexed-based access to their items.
+ * @interface
+ */
+cljs.core.IIndexed = function(){};
+
+/**
+ * Returns the value at the index n in the collection coll.
+ * Returns not-found if index n is out of bounds and not-found is supplied.
+ */
+cljs.core._nth = (function cljs$core$_nth(var_args){
+var G__10116 = arguments.length;
+switch (G__10116) {
+case 2:
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core._nth.cljs$core$IFn$_invoke$arity$2 = (function (coll,n){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IIndexed$_nth$arity$2 == null)))))){
+return coll.cljs$core$IIndexed$_nth$arity$2(coll,n);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._nth[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(coll,n) : m__8503__auto__.call(null,coll,n));
+} else {
+var m__8503__auto____$1 = (cljs.core._nth["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,n) : m__8503__auto____$1.call(null,coll,n));
+} else {
+throw cljs.core.missing_protocol("IIndexed.-nth",coll);
+}
+}
+}
+});
+
+cljs.core._nth.cljs$core$IFn$_invoke$arity$3 = (function (coll,n,not_found){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IIndexed$_nth$arity$3 == null)))))){
+return coll.cljs$core$IIndexed$_nth$arity$3(coll,n,not_found);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._nth[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(coll,n,not_found) : m__8503__auto__.call(null,coll,n,not_found));
+} else {
+var m__8503__auto____$1 = (cljs.core._nth["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,n,not_found) : m__8503__auto____$1.call(null,coll,n,not_found));
+} else {
+throw cljs.core.missing_protocol("IIndexed.-nth",coll);
+}
+}
+}
+});
+
+cljs.core._nth.cljs$lang$maxFixedArity = 3;
+
+
+
+/**
+ * Marker protocol indicating an array sequence.
+ * @interface
+ */
+cljs.core.ASeq = function(){};
+
+
+/**
+ * Protocol for collections to provide access to their items as sequences.
+ * @interface
+ */
+cljs.core.ISeq = function(){};
+
+/**
+ * Returns the first item in the collection coll. Used by cljs.core/first.
+ */
+cljs.core._first = (function cljs$core$_first(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$ISeq$_first$arity$1 == null)))))){
+return coll.cljs$core$ISeq$_first$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._first[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._first["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("ISeq.-first",coll);
+}
+}
+}
+});
+
+/**
+ * Returns a new collection of coll without the first item. It should
+ * always return a seq, e.g.
+ * (rest []) => ()
+ * (rest nil) => ()
+ */
+cljs.core._rest = (function cljs$core$_rest(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$ISeq$_rest$arity$1 == null)))))){
+return coll.cljs$core$ISeq$_rest$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._rest[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._rest["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("ISeq.-rest",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for accessing the next items of a collection.
+ * @interface
+ */
+cljs.core.INext = function(){};
+
+/**
+ * Returns a new collection of coll without the first item. In contrast to
+ * rest, it should return nil if there are no more items, e.g.
+ * (next []) => nil
+ * (next nil) => nil
+ */
+cljs.core._next = (function cljs$core$_next(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$INext$_next$arity$1 == null)))))){
+return coll.cljs$core$INext$_next$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._next[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._next["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("INext.-next",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for looking up a value in a data structure.
+ * @interface
+ */
+cljs.core.ILookup = function(){};
+
+/**
+ * Use k to look up a value in o. If not-found is supplied and k is not
+ * a valid value that can be used for look up, not-found is returned.
+ */
+cljs.core._lookup = (function cljs$core$_lookup(var_args){
+var G__10119 = arguments.length;
+switch (G__10119) {
+case 2:
+return cljs.core._lookup.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._lookup.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core._lookup.cljs$core$IFn$_invoke$arity$2 = (function (o,k){
+if((((!((o == null)))) && ((!((o.cljs$core$ILookup$_lookup$arity$2 == null)))))){
+return o.cljs$core$ILookup$_lookup$arity$2(o,k);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._lookup[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(o,k) : m__8503__auto__.call(null,o,k));
+} else {
+var m__8503__auto____$1 = (cljs.core._lookup["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(o,k) : m__8503__auto____$1.call(null,o,k));
+} else {
+throw cljs.core.missing_protocol("ILookup.-lookup",o);
+}
+}
+}
+});
+
+cljs.core._lookup.cljs$core$IFn$_invoke$arity$3 = (function (o,k,not_found){
+if((((!((o == null)))) && ((!((o.cljs$core$ILookup$_lookup$arity$3 == null)))))){
+return o.cljs$core$ILookup$_lookup$arity$3(o,k,not_found);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._lookup[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(o,k,not_found) : m__8503__auto__.call(null,o,k,not_found));
+} else {
+var m__8503__auto____$1 = (cljs.core._lookup["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(o,k,not_found) : m__8503__auto____$1.call(null,o,k,not_found));
+} else {
+throw cljs.core.missing_protocol("ILookup.-lookup",o);
+}
+}
+}
+});
+
+cljs.core._lookup.cljs$lang$maxFixedArity = 3;
+
+
+
+/**
+ * Protocol for adding associativity to collections.
+ * @interface
+ */
+cljs.core.IAssociative = function(){};
+
+/**
+ * Returns true if k is a key in coll.
+ */
+cljs.core._contains_key_QMARK_ = (function cljs$core$_contains_key_QMARK_(coll,k){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 == null)))))){
+return coll.cljs$core$IAssociative$_contains_key_QMARK_$arity$2(coll,k);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._contains_key_QMARK_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(coll,k) : m__8503__auto__.call(null,coll,k));
+} else {
+var m__8503__auto____$1 = (cljs.core._contains_key_QMARK_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,k) : m__8503__auto____$1.call(null,coll,k));
+} else {
+throw cljs.core.missing_protocol("IAssociative.-contains-key?",coll);
+}
+}
+}
+});
+
+/**
+ * Returns a new collection of coll with a mapping from key k to
+ * value v added to it.
+ */
+cljs.core._assoc = (function cljs$core$_assoc(coll,k,v){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IAssociative$_assoc$arity$3 == null)))))){
+return coll.cljs$core$IAssociative$_assoc$arity$3(coll,k,v);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._assoc[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(coll,k,v) : m__8503__auto__.call(null,coll,k,v));
+} else {
+var m__8503__auto____$1 = (cljs.core._assoc["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,k,v) : m__8503__auto____$1.call(null,coll,k,v));
+} else {
+throw cljs.core.missing_protocol("IAssociative.-assoc",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for implementing entry finding in collections.
+ * @interface
+ */
+cljs.core.IFind = function(){};
+
+/**
+ * Returns the map entry for key, or nil if key not present.
+ */
+cljs.core._find = (function cljs$core$_find(coll,k){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IFind$_find$arity$2 == null)))))){
+return coll.cljs$core$IFind$_find$arity$2(coll,k);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._find[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(coll,k) : m__8503__auto__.call(null,coll,k));
+} else {
+var m__8503__auto____$1 = (cljs.core._find["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,k) : m__8503__auto____$1.call(null,coll,k));
+} else {
+throw cljs.core.missing_protocol("IFind.-find",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding mapping functionality to collections.
+ * @interface
+ */
+cljs.core.IMap = function(){};
+
+/**
+ * Returns a new collection of coll without the mapping for key k.
+ */
+cljs.core._dissoc = (function cljs$core$_dissoc(coll,k){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IMap$_dissoc$arity$2 == null)))))){
+return coll.cljs$core$IMap$_dissoc$arity$2(coll,k);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._dissoc[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(coll,k) : m__8503__auto__.call(null,coll,k));
+} else {
+var m__8503__auto____$1 = (cljs.core._dissoc["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,k) : m__8503__auto____$1.call(null,coll,k));
+} else {
+throw cljs.core.missing_protocol("IMap.-dissoc",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for examining a map entry.
+ * @interface
+ */
+cljs.core.IMapEntry = function(){};
+
+/**
+ * Returns the key of the map entry.
+ */
+cljs.core._key = (function cljs$core$_key(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IMapEntry$_key$arity$1 == null)))))){
+return coll.cljs$core$IMapEntry$_key$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._key[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._key["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IMapEntry.-key",coll);
+}
+}
+}
+});
+
+/**
+ * Returns the value of the map entry.
+ */
+cljs.core._val = (function cljs$core$_val(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IMapEntry$_val$arity$1 == null)))))){
+return coll.cljs$core$IMapEntry$_val$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._val[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._val["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IMapEntry.-val",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding set functionality to a collection.
+ * @interface
+ */
+cljs.core.ISet = function(){};
+
+/**
+ * Returns a new collection of coll that does not contain v.
+ */
+cljs.core._disjoin = (function cljs$core$_disjoin(coll,v){
+if((((!((coll == null)))) && ((!((coll.cljs$core$ISet$_disjoin$arity$2 == null)))))){
+return coll.cljs$core$ISet$_disjoin$arity$2(coll,v);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._disjoin[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(coll,v) : m__8503__auto__.call(null,coll,v));
+} else {
+var m__8503__auto____$1 = (cljs.core._disjoin["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,v) : m__8503__auto____$1.call(null,coll,v));
+} else {
+throw cljs.core.missing_protocol("ISet.-disjoin",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for collections to provide access to their items as stacks. The top
+ * of the stack should be accessed in the most efficient way for the different
+ * data structures.
+ * @interface
+ */
+cljs.core.IStack = function(){};
+
+/**
+ * Returns the item from the top of the stack. Is used by cljs.core/peek.
+ */
+cljs.core._peek = (function cljs$core$_peek(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IStack$_peek$arity$1 == null)))))){
+return coll.cljs$core$IStack$_peek$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._peek[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._peek["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IStack.-peek",coll);
+}
+}
+}
+});
+
+/**
+ * Returns a new stack without the item on top of the stack. Is used
+ * by cljs.core/pop.
+ */
+cljs.core._pop = (function cljs$core$_pop(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IStack$_pop$arity$1 == null)))))){
+return coll.cljs$core$IStack$_pop$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._pop[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._pop["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IStack.-pop",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding vector functionality to collections.
+ * @interface
+ */
+cljs.core.IVector = function(){};
+
+/**
+ * Returns a new vector with value val added at position n.
+ */
+cljs.core._assoc_n = (function cljs$core$_assoc_n(coll,n,val){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IVector$_assoc_n$arity$3 == null)))))){
+return coll.cljs$core$IVector$_assoc_n$arity$3(coll,n,val);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._assoc_n[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(coll,n,val) : m__8503__auto__.call(null,coll,n,val));
+} else {
+var m__8503__auto____$1 = (cljs.core._assoc_n["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,n,val) : m__8503__auto____$1.call(null,coll,n,val));
+} else {
+throw cljs.core.missing_protocol("IVector.-assoc-n",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding dereference functionality to a reference.
+ * @interface
+ */
+cljs.core.IDeref = function(){};
+
+/**
+ * Returns the value of the reference o.
+ */
+cljs.core._deref = (function cljs$core$_deref(o){
+if((((!((o == null)))) && ((!((o.cljs$core$IDeref$_deref$arity$1 == null)))))){
+return o.cljs$core$IDeref$_deref$arity$1(o);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._deref[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(o) : m__8503__auto__.call(null,o));
+} else {
+var m__8503__auto____$1 = (cljs.core._deref["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(o) : m__8503__auto____$1.call(null,o));
+} else {
+throw cljs.core.missing_protocol("IDeref.-deref",o);
+}
+}
+}
+});
+
+
+/**
+ * @interface
+ */
+cljs.core.IDerefWithTimeout = function(){};
+
+cljs.core._deref_with_timeout = (function cljs$core$_deref_with_timeout(o,msec,timeout_val){
+if((((!((o == null)))) && ((!((o.cljs$core$IDerefWithTimeout$_deref_with_timeout$arity$3 == null)))))){
+return o.cljs$core$IDerefWithTimeout$_deref_with_timeout$arity$3(o,msec,timeout_val);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._deref_with_timeout[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(o,msec,timeout_val) : m__8503__auto__.call(null,o,msec,timeout_val));
+} else {
+var m__8503__auto____$1 = (cljs.core._deref_with_timeout["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(o,msec,timeout_val) : m__8503__auto____$1.call(null,o,msec,timeout_val));
+} else {
+throw cljs.core.missing_protocol("IDerefWithTimeout.-deref-with-timeout",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for accessing the metadata of an object.
+ * @interface
+ */
+cljs.core.IMeta = function(){};
+
+/**
+ * Returns the metadata of object o.
+ */
+cljs.core._meta = (function cljs$core$_meta(o){
+if((((!((o == null)))) && ((!((o.cljs$core$IMeta$_meta$arity$1 == null)))))){
+return o.cljs$core$IMeta$_meta$arity$1(o);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._meta[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(o) : m__8503__auto__.call(null,o));
+} else {
+var m__8503__auto____$1 = (cljs.core._meta["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(o) : m__8503__auto____$1.call(null,o));
+} else {
+throw cljs.core.missing_protocol("IMeta.-meta",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding metadata to an object.
+ * @interface
+ */
+cljs.core.IWithMeta = function(){};
+
+/**
+ * Returns a new object with value of o and metadata meta added to it.
+ */
+cljs.core._with_meta = (function cljs$core$_with_meta(o,meta){
+if((((!((o == null)))) && ((!((o.cljs$core$IWithMeta$_with_meta$arity$2 == null)))))){
+return o.cljs$core$IWithMeta$_with_meta$arity$2(o,meta);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._with_meta[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(o,meta) : m__8503__auto__.call(null,o,meta));
+} else {
+var m__8503__auto____$1 = (cljs.core._with_meta["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(o,meta) : m__8503__auto____$1.call(null,o,meta));
+} else {
+throw cljs.core.missing_protocol("IWithMeta.-with-meta",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for seq types that can reduce themselves.
+ * Called by cljs.core/reduce.
+ * @interface
+ */
+cljs.core.IReduce = function(){};
+
+/**
+ * f should be a function of 2 arguments. If start is not supplied,
+ * returns the result of applying f to the first 2 items in coll, then
+ * applying f to that result and the 3rd item, etc.
+ */
+cljs.core._reduce = (function cljs$core$_reduce(var_args){
+var G__10122 = arguments.length;
+switch (G__10122) {
+case 2:
+return cljs.core._reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core._reduce.cljs$core$IFn$_invoke$arity$2 = (function (coll,f){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IReduce$_reduce$arity$2 == null)))))){
+return coll.cljs$core$IReduce$_reduce$arity$2(coll,f);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._reduce[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(coll,f) : m__8503__auto__.call(null,coll,f));
+} else {
+var m__8503__auto____$1 = (cljs.core._reduce["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,f) : m__8503__auto____$1.call(null,coll,f));
+} else {
+throw cljs.core.missing_protocol("IReduce.-reduce",coll);
+}
+}
+}
+});
+
+cljs.core._reduce.cljs$core$IFn$_invoke$arity$3 = (function (coll,f,start){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IReduce$_reduce$arity$3 == null)))))){
+return coll.cljs$core$IReduce$_reduce$arity$3(coll,f,start);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._reduce[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(coll,f,start) : m__8503__auto__.call(null,coll,f,start));
+} else {
+var m__8503__auto____$1 = (cljs.core._reduce["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,f,start) : m__8503__auto____$1.call(null,coll,f,start));
+} else {
+throw cljs.core.missing_protocol("IReduce.-reduce",coll);
+}
+}
+}
+});
+
+cljs.core._reduce.cljs$lang$maxFixedArity = 3;
+
+
+
+/**
+ * Protocol for associative types that can reduce themselves
+ * via a function of key and val. Called by cljs.core/reduce-kv.
+ * @interface
+ */
+cljs.core.IKVReduce = function(){};
+
+/**
+ * Reduces an associative collection and returns the result. f should be
+ * a function that takes three arguments.
+ */
+cljs.core._kv_reduce = (function cljs$core$_kv_reduce(coll,f,init){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IKVReduce$_kv_reduce$arity$3 == null)))))){
+return coll.cljs$core$IKVReduce$_kv_reduce$arity$3(coll,f,init);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._kv_reduce[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(coll,f,init) : m__8503__auto__.call(null,coll,f,init));
+} else {
+var m__8503__auto____$1 = (cljs.core._kv_reduce["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,f,init) : m__8503__auto____$1.call(null,coll,f,init));
+} else {
+throw cljs.core.missing_protocol("IKVReduce.-kv-reduce",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding value comparison functionality to a type.
+ * @interface
+ */
+cljs.core.IEquiv = function(){};
+
+/**
+ * Returns true if o and other are equal, false otherwise.
+ */
+cljs.core._equiv = (function cljs$core$_equiv(o,other){
+if((((!((o == null)))) && ((!((o.cljs$core$IEquiv$_equiv$arity$2 == null)))))){
+return o.cljs$core$IEquiv$_equiv$arity$2(o,other);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._equiv[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(o,other) : m__8503__auto__.call(null,o,other));
+} else {
+var m__8503__auto____$1 = (cljs.core._equiv["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(o,other) : m__8503__auto____$1.call(null,o,other));
+} else {
+throw cljs.core.missing_protocol("IEquiv.-equiv",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding hashing functionality to a type.
+ * @interface
+ */
+cljs.core.IHash = function(){};
+
+/**
+ * Returns the hash code of o.
+ */
+cljs.core._hash = (function cljs$core$_hash(o){
+if((((!((o == null)))) && ((!((o.cljs$core$IHash$_hash$arity$1 == null)))))){
+return o.cljs$core$IHash$_hash$arity$1(o);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._hash[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(o) : m__8503__auto__.call(null,o));
+} else {
+var m__8503__auto____$1 = (cljs.core._hash["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(o) : m__8503__auto____$1.call(null,o));
+} else {
+throw cljs.core.missing_protocol("IHash.-hash",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding the ability to a type to be transformed into a sequence.
+ * @interface
+ */
+cljs.core.ISeqable = function(){};
+
+/**
+ * Returns a seq of o, or nil if o is empty.
+ */
+cljs.core._seq = (function cljs$core$_seq(o){
+if((((!((o == null)))) && ((!((o.cljs$core$ISeqable$_seq$arity$1 == null)))))){
+return o.cljs$core$ISeqable$_seq$arity$1(o);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._seq[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(o) : m__8503__auto__.call(null,o));
+} else {
+var m__8503__auto____$1 = (cljs.core._seq["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(o) : m__8503__auto____$1.call(null,o));
+} else {
+throw cljs.core.missing_protocol("ISeqable.-seq",o);
+}
+}
+}
+});
+
+
+/**
+ * Marker interface indicating a persistent collection of sequential items
+ * @interface
+ */
+cljs.core.ISequential = function(){};
+
+
+/**
+ * Marker interface indicating a persistent list
+ * @interface
+ */
+cljs.core.IList = function(){};
+
+
+/**
+ * Marker interface indicating a record object
+ * @interface
+ */
+cljs.core.IRecord = function(){};
+
+
+/**
+ * Protocol for reversing a seq.
+ * @interface
+ */
+cljs.core.IReversible = function(){};
+
+/**
+ * Returns a seq of the items in coll in reversed order.
+ */
+cljs.core._rseq = (function cljs$core$_rseq(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IReversible$_rseq$arity$1 == null)))))){
+return coll.cljs$core$IReversible$_rseq$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._rseq[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._rseq["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IReversible.-rseq",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for a collection which can represent their items
+ * in a sorted manner.
+ * @interface
+ */
+cljs.core.ISorted = function(){};
+
+/**
+ * Returns a sorted seq from coll in either ascending or descending order.
+ */
+cljs.core._sorted_seq = (function cljs$core$_sorted_seq(coll,ascending_QMARK_){
+if((((!((coll == null)))) && ((!((coll.cljs$core$ISorted$_sorted_seq$arity$2 == null)))))){
+return coll.cljs$core$ISorted$_sorted_seq$arity$2(coll,ascending_QMARK_);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._sorted_seq[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(coll,ascending_QMARK_) : m__8503__auto__.call(null,coll,ascending_QMARK_));
+} else {
+var m__8503__auto____$1 = (cljs.core._sorted_seq["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,ascending_QMARK_) : m__8503__auto____$1.call(null,coll,ascending_QMARK_));
+} else {
+throw cljs.core.missing_protocol("ISorted.-sorted-seq",coll);
+}
+}
+}
+});
+
+/**
+ * Returns a sorted seq from coll in either ascending or descending order.
+ * If ascending is true, the result should contain all items which are > or >=
+ * than k. If ascending is false, the result should contain all items which
+ * are < or <= than k, e.g.
+ * (-sorted-seq-from (sorted-set 1 2 3 4 5) 3 true) => (3 4 5)
+ * (-sorted-seq-from (sorted-set 1 2 3 4 5) 3 false) => (3 2 1)
+ */
+cljs.core._sorted_seq_from = (function cljs$core$_sorted_seq_from(coll,k,ascending_QMARK_){
+if((((!((coll == null)))) && ((!((coll.cljs$core$ISorted$_sorted_seq_from$arity$3 == null)))))){
+return coll.cljs$core$ISorted$_sorted_seq_from$arity$3(coll,k,ascending_QMARK_);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._sorted_seq_from[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(coll,k,ascending_QMARK_) : m__8503__auto__.call(null,coll,k,ascending_QMARK_));
+} else {
+var m__8503__auto____$1 = (cljs.core._sorted_seq_from["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(coll,k,ascending_QMARK_) : m__8503__auto____$1.call(null,coll,k,ascending_QMARK_));
+} else {
+throw cljs.core.missing_protocol("ISorted.-sorted-seq-from",coll);
+}
+}
+}
+});
+
+/**
+ * Returns the key for entry.
+ */
+cljs.core._entry_key = (function cljs$core$_entry_key(coll,entry){
+if((((!((coll == null)))) && ((!((coll.cljs$core$ISorted$_entry_key$arity$2 == null)))))){
+return coll.cljs$core$ISorted$_entry_key$arity$2(coll,entry);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._entry_key[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(coll,entry) : m__8503__auto__.call(null,coll,entry));
+} else {
+var m__8503__auto____$1 = (cljs.core._entry_key["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(coll,entry) : m__8503__auto____$1.call(null,coll,entry));
+} else {
+throw cljs.core.missing_protocol("ISorted.-entry-key",coll);
+}
+}
+}
+});
+
+/**
+ * Returns the comparator for coll.
+ */
+cljs.core._comparator = (function cljs$core$_comparator(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$ISorted$_comparator$arity$1 == null)))))){
+return coll.cljs$core$ISorted$_comparator$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._comparator[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._comparator["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("ISorted.-comparator",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for writing. Currently only implemented by StringBufferWriter.
+ * @interface
+ */
+cljs.core.IWriter = function(){};
+
+/**
+ * Writes s with writer and returns the result.
+ */
+cljs.core._write = (function cljs$core$_write(writer,s){
+if((((!((writer == null)))) && ((!((writer.cljs$core$IWriter$_write$arity$2 == null)))))){
+return writer.cljs$core$IWriter$_write$arity$2(writer,s);
+} else {
+var x__8502__auto__ = (((writer == null))?null:writer);
+var m__8503__auto__ = (cljs.core._write[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(writer,s) : m__8503__auto__.call(null,writer,s));
+} else {
+var m__8503__auto____$1 = (cljs.core._write["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(writer,s) : m__8503__auto____$1.call(null,writer,s));
+} else {
+throw cljs.core.missing_protocol("IWriter.-write",writer);
+}
+}
+}
+});
+
+/**
+ * Flush writer.
+ */
+cljs.core._flush = (function cljs$core$_flush(writer){
+if((((!((writer == null)))) && ((!((writer.cljs$core$IWriter$_flush$arity$1 == null)))))){
+return writer.cljs$core$IWriter$_flush$arity$1(writer);
+} else {
+var x__8502__auto__ = (((writer == null))?null:writer);
+var m__8503__auto__ = (cljs.core._flush[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(writer) : m__8503__auto__.call(null,writer));
+} else {
+var m__8503__auto____$1 = (cljs.core._flush["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(writer) : m__8503__auto____$1.call(null,writer));
+} else {
+throw cljs.core.missing_protocol("IWriter.-flush",writer);
+}
+}
+}
+});
+
+
+/**
+ * The old IPrintable protocol's implementation consisted of building a giant
+ * list of strings to concatenate. This involved lots of concat calls,
+ * intermediate vectors, and lazy-seqs, and was very slow in some older JS
+ * engines. IPrintWithWriter implements printing via the IWriter protocol, so it
+ * be implemented efficiently in terms of e.g. a StringBuffer append.
+ * @interface
+ */
+cljs.core.IPrintWithWriter = function(){};
+
+cljs.core._pr_writer = (function cljs$core$_pr_writer(o,writer,opts){
+if((((!((o == null)))) && ((!((o.cljs$core$IPrintWithWriter$_pr_writer$arity$3 == null)))))){
+return o.cljs$core$IPrintWithWriter$_pr_writer$arity$3(o,writer,opts);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._pr_writer[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(o,writer,opts) : m__8503__auto__.call(null,o,writer,opts));
+} else {
+var m__8503__auto____$1 = (cljs.core._pr_writer["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(o,writer,opts) : m__8503__auto____$1.call(null,o,writer,opts));
+} else {
+throw cljs.core.missing_protocol("IPrintWithWriter.-pr-writer",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for types which can have a deferred realization. Currently only
+ * implemented by Delay and LazySeq.
+ * @interface
+ */
+cljs.core.IPending = function(){};
+
+/**
+ * Returns true if a value for x has been produced, false otherwise.
+ */
+cljs.core._realized_QMARK_ = (function cljs$core$_realized_QMARK_(x){
+if((((!((x == null)))) && ((!((x.cljs$core$IPending$_realized_QMARK_$arity$1 == null)))))){
+return x.cljs$core$IPending$_realized_QMARK_$arity$1(x);
+} else {
+var x__8502__auto__ = (((x == null))?null:x);
+var m__8503__auto__ = (cljs.core._realized_QMARK_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(x) : m__8503__auto__.call(null,x));
+} else {
+var m__8503__auto____$1 = (cljs.core._realized_QMARK_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(x) : m__8503__auto____$1.call(null,x));
+} else {
+throw cljs.core.missing_protocol("IPending.-realized?",x);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for types that can be watched. Currently only implemented by Atom.
+ * @interface
+ */
+cljs.core.IWatchable = function(){};
+
+/**
+ * Calls all watchers with this, oldval and newval.
+ */
+cljs.core._notify_watches = (function cljs$core$_notify_watches(this$,oldval,newval){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IWatchable$_notify_watches$arity$3 == null)))))){
+return this$.cljs$core$IWatchable$_notify_watches$arity$3(this$,oldval,newval);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._notify_watches[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(this$,oldval,newval) : m__8503__auto__.call(null,this$,oldval,newval));
+} else {
+var m__8503__auto____$1 = (cljs.core._notify_watches["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(this$,oldval,newval) : m__8503__auto____$1.call(null,this$,oldval,newval));
+} else {
+throw cljs.core.missing_protocol("IWatchable.-notify-watches",this$);
+}
+}
+}
+});
+
+/**
+ * Adds a watcher function f to this. Keys must be unique per reference,
+ * and can be used to remove the watch with -remove-watch.
+ */
+cljs.core._add_watch = (function cljs$core$_add_watch(this$,key,f){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IWatchable$_add_watch$arity$3 == null)))))){
+return this$.cljs$core$IWatchable$_add_watch$arity$3(this$,key,f);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._add_watch[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(this$,key,f) : m__8503__auto__.call(null,this$,key,f));
+} else {
+var m__8503__auto____$1 = (cljs.core._add_watch["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(this$,key,f) : m__8503__auto____$1.call(null,this$,key,f));
+} else {
+throw cljs.core.missing_protocol("IWatchable.-add-watch",this$);
+}
+}
+}
+});
+
+/**
+ * Removes watcher that corresponds to key from this.
+ */
+cljs.core._remove_watch = (function cljs$core$_remove_watch(this$,key){
+if((((!((this$ == null)))) && ((!((this$.cljs$core$IWatchable$_remove_watch$arity$2 == null)))))){
+return this$.cljs$core$IWatchable$_remove_watch$arity$2(this$,key);
+} else {
+var x__8502__auto__ = (((this$ == null))?null:this$);
+var m__8503__auto__ = (cljs.core._remove_watch[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(this$,key) : m__8503__auto__.call(null,this$,key));
+} else {
+var m__8503__auto____$1 = (cljs.core._remove_watch["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(this$,key) : m__8503__auto____$1.call(null,this$,key));
+} else {
+throw cljs.core.missing_protocol("IWatchable.-remove-watch",this$);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for collections which can transformed to transients.
+ * @interface
+ */
+cljs.core.IEditableCollection = function(){};
+
+/**
+ * Returns a new, transient version of the collection, in constant time.
+ */
+cljs.core._as_transient = (function cljs$core$_as_transient(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IEditableCollection$_as_transient$arity$1 == null)))))){
+return coll.cljs$core$IEditableCollection$_as_transient$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._as_transient[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._as_transient["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IEditableCollection.-as-transient",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding basic functionality to transient collections.
+ * @interface
+ */
+cljs.core.ITransientCollection = function(){};
+
+/**
+ * Adds value val to tcoll and returns tcoll.
+ */
+cljs.core._conj_BANG_ = (function cljs$core$_conj_BANG_(tcoll,val){
+if((((!((tcoll == null)))) && ((!((tcoll.cljs$core$ITransientCollection$_conj_BANG_$arity$2 == null)))))){
+return tcoll.cljs$core$ITransientCollection$_conj_BANG_$arity$2(tcoll,val);
+} else {
+var x__8502__auto__ = (((tcoll == null))?null:tcoll);
+var m__8503__auto__ = (cljs.core._conj_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(tcoll,val) : m__8503__auto__.call(null,tcoll,val));
+} else {
+var m__8503__auto____$1 = (cljs.core._conj_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(tcoll,val) : m__8503__auto____$1.call(null,tcoll,val));
+} else {
+throw cljs.core.missing_protocol("ITransientCollection.-conj!",tcoll);
+}
+}
+}
+});
+
+/**
+ * Creates a persistent data structure from tcoll and returns it.
+ */
+cljs.core._persistent_BANG_ = (function cljs$core$_persistent_BANG_(tcoll){
+if((((!((tcoll == null)))) && ((!((tcoll.cljs$core$ITransientCollection$_persistent_BANG_$arity$1 == null)))))){
+return tcoll.cljs$core$ITransientCollection$_persistent_BANG_$arity$1(tcoll);
+} else {
+var x__8502__auto__ = (((tcoll == null))?null:tcoll);
+var m__8503__auto__ = (cljs.core._persistent_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(tcoll) : m__8503__auto__.call(null,tcoll));
+} else {
+var m__8503__auto____$1 = (cljs.core._persistent_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(tcoll) : m__8503__auto____$1.call(null,tcoll));
+} else {
+throw cljs.core.missing_protocol("ITransientCollection.-persistent!",tcoll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding associativity to transient collections.
+ * @interface
+ */
+cljs.core.ITransientAssociative = function(){};
+
+/**
+ * Returns a new transient collection of tcoll with a mapping from key to
+ * val added to it.
+ */
+cljs.core._assoc_BANG_ = (function cljs$core$_assoc_BANG_(tcoll,key,val){
+if((((!((tcoll == null)))) && ((!((tcoll.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3 == null)))))){
+return tcoll.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3(tcoll,key,val);
+} else {
+var x__8502__auto__ = (((tcoll == null))?null:tcoll);
+var m__8503__auto__ = (cljs.core._assoc_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(tcoll,key,val) : m__8503__auto__.call(null,tcoll,key,val));
+} else {
+var m__8503__auto____$1 = (cljs.core._assoc_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(tcoll,key,val) : m__8503__auto____$1.call(null,tcoll,key,val));
+} else {
+throw cljs.core.missing_protocol("ITransientAssociative.-assoc!",tcoll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding mapping functionality to transient collections.
+ * @interface
+ */
+cljs.core.ITransientMap = function(){};
+
+/**
+ * Returns a new transient collection of tcoll without the mapping for key.
+ */
+cljs.core._dissoc_BANG_ = (function cljs$core$_dissoc_BANG_(tcoll,key){
+if((((!((tcoll == null)))) && ((!((tcoll.cljs$core$ITransientMap$_dissoc_BANG_$arity$2 == null)))))){
+return tcoll.cljs$core$ITransientMap$_dissoc_BANG_$arity$2(tcoll,key);
+} else {
+var x__8502__auto__ = (((tcoll == null))?null:tcoll);
+var m__8503__auto__ = (cljs.core._dissoc_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(tcoll,key) : m__8503__auto__.call(null,tcoll,key));
+} else {
+var m__8503__auto____$1 = (cljs.core._dissoc_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(tcoll,key) : m__8503__auto____$1.call(null,tcoll,key));
+} else {
+throw cljs.core.missing_protocol("ITransientMap.-dissoc!",tcoll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding vector functionality to transient collections.
+ * @interface
+ */
+cljs.core.ITransientVector = function(){};
+
+/**
+ * Returns tcoll with value val added at position n.
+ */
+cljs.core._assoc_n_BANG_ = (function cljs$core$_assoc_n_BANG_(tcoll,n,val){
+if((((!((tcoll == null)))) && ((!((tcoll.cljs$core$ITransientVector$_assoc_n_BANG_$arity$3 == null)))))){
+return tcoll.cljs$core$ITransientVector$_assoc_n_BANG_$arity$3(tcoll,n,val);
+} else {
+var x__8502__auto__ = (((tcoll == null))?null:tcoll);
+var m__8503__auto__ = (cljs.core._assoc_n_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(tcoll,n,val) : m__8503__auto__.call(null,tcoll,n,val));
+} else {
+var m__8503__auto____$1 = (cljs.core._assoc_n_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(tcoll,n,val) : m__8503__auto____$1.call(null,tcoll,n,val));
+} else {
+throw cljs.core.missing_protocol("ITransientVector.-assoc-n!",tcoll);
+}
+}
+}
+});
+
+/**
+ * Returns tcoll with the last item removed from it.
+ */
+cljs.core._pop_BANG_ = (function cljs$core$_pop_BANG_(tcoll){
+if((((!((tcoll == null)))) && ((!((tcoll.cljs$core$ITransientVector$_pop_BANG_$arity$1 == null)))))){
+return tcoll.cljs$core$ITransientVector$_pop_BANG_$arity$1(tcoll);
+} else {
+var x__8502__auto__ = (((tcoll == null))?null:tcoll);
+var m__8503__auto__ = (cljs.core._pop_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(tcoll) : m__8503__auto__.call(null,tcoll));
+} else {
+var m__8503__auto____$1 = (cljs.core._pop_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(tcoll) : m__8503__auto____$1.call(null,tcoll));
+} else {
+throw cljs.core.missing_protocol("ITransientVector.-pop!",tcoll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding set functionality to a transient collection.
+ * @interface
+ */
+cljs.core.ITransientSet = function(){};
+
+/**
+ * Returns tcoll without v.
+ */
+cljs.core._disjoin_BANG_ = (function cljs$core$_disjoin_BANG_(tcoll,v){
+if((((!((tcoll == null)))) && ((!((tcoll.cljs$core$ITransientSet$_disjoin_BANG_$arity$2 == null)))))){
+return tcoll.cljs$core$ITransientSet$_disjoin_BANG_$arity$2(tcoll,v);
+} else {
+var x__8502__auto__ = (((tcoll == null))?null:tcoll);
+var m__8503__auto__ = (cljs.core._disjoin_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(tcoll,v) : m__8503__auto__.call(null,tcoll,v));
+} else {
+var m__8503__auto____$1 = (cljs.core._disjoin_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(tcoll,v) : m__8503__auto____$1.call(null,tcoll,v));
+} else {
+throw cljs.core.missing_protocol("ITransientSet.-disjoin!",tcoll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for values that can be compared.
+ * @interface
+ */
+cljs.core.IComparable = function(){};
+
+/**
+ * Returns a negative number, zero, or a positive number when x is logically
+ * 'less than', 'equal to', or 'greater than' y.
+ */
+cljs.core._compare = (function cljs$core$_compare(x,y){
+if((((!((x == null)))) && ((!((x.cljs$core$IComparable$_compare$arity$2 == null)))))){
+return x.cljs$core$IComparable$_compare$arity$2(x,y);
+} else {
+var x__8502__auto__ = (((x == null))?null:x);
+var m__8503__auto__ = (cljs.core._compare[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(x,y) : m__8503__auto__.call(null,x,y));
+} else {
+var m__8503__auto____$1 = (cljs.core._compare["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(x,y) : m__8503__auto____$1.call(null,x,y));
+} else {
+throw cljs.core.missing_protocol("IComparable.-compare",x);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for accessing the items of a chunk.
+ * @interface
+ */
+cljs.core.IChunk = function(){};
+
+/**
+ * Return a new chunk of coll with the first item removed.
+ */
+cljs.core._drop_first = (function cljs$core$_drop_first(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IChunk$_drop_first$arity$1 == null)))))){
+return coll.cljs$core$IChunk$_drop_first$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._drop_first[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._drop_first["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IChunk.-drop-first",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for accessing a collection as sequential chunks.
+ * @interface
+ */
+cljs.core.IChunkedSeq = function(){};
+
+/**
+ * Returns the first chunk in coll.
+ */
+cljs.core._chunked_first = (function cljs$core$_chunked_first(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IChunkedSeq$_chunked_first$arity$1 == null)))))){
+return coll.cljs$core$IChunkedSeq$_chunked_first$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._chunked_first[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._chunked_first["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IChunkedSeq.-chunked-first",coll);
+}
+}
+}
+});
+
+/**
+ * Return a new collection of coll with the first chunk removed.
+ */
+cljs.core._chunked_rest = (function cljs$core$_chunked_rest(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IChunkedSeq$_chunked_rest$arity$1 == null)))))){
+return coll.cljs$core$IChunkedSeq$_chunked_rest$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._chunked_rest[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._chunked_rest["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IChunkedSeq.-chunked-rest",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for accessing the chunks of a collection.
+ * @interface
+ */
+cljs.core.IChunkedNext = function(){};
+
+/**
+ * Returns a new collection of coll without the first chunk.
+ */
+cljs.core._chunked_next = (function cljs$core$_chunked_next(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IChunkedNext$_chunked_next$arity$1 == null)))))){
+return coll.cljs$core$IChunkedNext$_chunked_next$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._chunked_next[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._chunked_next["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IChunkedNext.-chunked-next",coll);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding a name.
+ * @interface
+ */
+cljs.core.INamed = function(){};
+
+/**
+ * Returns the name String of x.
+ */
+cljs.core._name = (function cljs$core$_name(x){
+if((((!((x == null)))) && ((!((x.cljs$core$INamed$_name$arity$1 == null)))))){
+return x.cljs$core$INamed$_name$arity$1(x);
+} else {
+var x__8502__auto__ = (((x == null))?null:x);
+var m__8503__auto__ = (cljs.core._name[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(x) : m__8503__auto__.call(null,x));
+} else {
+var m__8503__auto____$1 = (cljs.core._name["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(x) : m__8503__auto____$1.call(null,x));
+} else {
+throw cljs.core.missing_protocol("INamed.-name",x);
+}
+}
+}
+});
+
+/**
+ * Returns the namespace String of x.
+ */
+cljs.core._namespace = (function cljs$core$_namespace(x){
+if((((!((x == null)))) && ((!((x.cljs$core$INamed$_namespace$arity$1 == null)))))){
+return x.cljs$core$INamed$_namespace$arity$1(x);
+} else {
+var x__8502__auto__ = (((x == null))?null:x);
+var m__8503__auto__ = (cljs.core._namespace[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(x) : m__8503__auto__.call(null,x));
+} else {
+var m__8503__auto____$1 = (cljs.core._namespace["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(x) : m__8503__auto____$1.call(null,x));
+} else {
+throw cljs.core.missing_protocol("INamed.-namespace",x);
+}
+}
+}
+});
+
+
+/**
+ * Marker protocol indicating an atom.
+ * @interface
+ */
+cljs.core.IAtom = function(){};
+
+
+/**
+ * Protocol for adding resetting functionality.
+ * @interface
+ */
+cljs.core.IReset = function(){};
+
+/**
+ * Sets the value of o to new-value.
+ */
+cljs.core._reset_BANG_ = (function cljs$core$_reset_BANG_(o,new_value){
+if((((!((o == null)))) && ((!((o.cljs$core$IReset$_reset_BANG_$arity$2 == null)))))){
+return o.cljs$core$IReset$_reset_BANG_$arity$2(o,new_value);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._reset_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(o,new_value) : m__8503__auto__.call(null,o,new_value));
+} else {
+var m__8503__auto____$1 = (cljs.core._reset_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(o,new_value) : m__8503__auto____$1.call(null,o,new_value));
+} else {
+throw cljs.core.missing_protocol("IReset.-reset!",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for adding swapping functionality.
+ * @interface
+ */
+cljs.core.ISwap = function(){};
+
+/**
+ * Swaps the value of o to be (apply f current-value-of-atom args).
+ */
+cljs.core._swap_BANG_ = (function cljs$core$_swap_BANG_(var_args){
+var G__10125 = arguments.length;
+switch (G__10125) {
+case 2:
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (o,f){
+if((((!((o == null)))) && ((!((o.cljs$core$ISwap$_swap_BANG_$arity$2 == null)))))){
+return o.cljs$core$ISwap$_swap_BANG_$arity$2(o,f);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._swap_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(o,f) : m__8503__auto__.call(null,o,f));
+} else {
+var m__8503__auto____$1 = (cljs.core._swap_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(o,f) : m__8503__auto____$1.call(null,o,f));
+} else {
+throw cljs.core.missing_protocol("ISwap.-swap!",o);
+}
+}
+}
+});
+
+cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$3 = (function (o,f,a){
+if((((!((o == null)))) && ((!((o.cljs$core$ISwap$_swap_BANG_$arity$3 == null)))))){
+return o.cljs$core$ISwap$_swap_BANG_$arity$3(o,f,a);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._swap_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(o,f,a) : m__8503__auto__.call(null,o,f,a));
+} else {
+var m__8503__auto____$1 = (cljs.core._swap_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(o,f,a) : m__8503__auto____$1.call(null,o,f,a));
+} else {
+throw cljs.core.missing_protocol("ISwap.-swap!",o);
+}
+}
+}
+});
+
+cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$4 = (function (o,f,a,b){
+if((((!((o == null)))) && ((!((o.cljs$core$ISwap$_swap_BANG_$arity$4 == null)))))){
+return o.cljs$core$ISwap$_swap_BANG_$arity$4(o,f,a,b);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._swap_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$4 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$4(o,f,a,b) : m__8503__auto__.call(null,o,f,a,b));
+} else {
+var m__8503__auto____$1 = (cljs.core._swap_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$4 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$4(o,f,a,b) : m__8503__auto____$1.call(null,o,f,a,b));
+} else {
+throw cljs.core.missing_protocol("ISwap.-swap!",o);
+}
+}
+}
+});
+
+cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$5 = (function (o,f,a,b,xs){
+if((((!((o == null)))) && ((!((o.cljs$core$ISwap$_swap_BANG_$arity$5 == null)))))){
+return o.cljs$core$ISwap$_swap_BANG_$arity$5(o,f,a,b,xs);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._swap_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$5 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$5(o,f,a,b,xs) : m__8503__auto__.call(null,o,f,a,b,xs));
+} else {
+var m__8503__auto____$1 = (cljs.core._swap_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$5 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$5(o,f,a,b,xs) : m__8503__auto____$1.call(null,o,f,a,b,xs));
+} else {
+throw cljs.core.missing_protocol("ISwap.-swap!",o);
+}
+}
+}
+});
+
+cljs.core._swap_BANG_.cljs$lang$maxFixedArity = 5;
+
+
+
+/**
+ * Protocol for adding volatile functionality.
+ * @interface
+ */
+cljs.core.IVolatile = function(){};
+
+/**
+ * Sets the value of volatile o to new-value without regard for the
+ * current value. Returns new-value.
+ */
+cljs.core._vreset_BANG_ = (function cljs$core$_vreset_BANG_(o,new_value){
+if((((!((o == null)))) && ((!((o.cljs$core$IVolatile$_vreset_BANG_$arity$2 == null)))))){
+return o.cljs$core$IVolatile$_vreset_BANG_$arity$2(o,new_value);
+} else {
+var x__8502__auto__ = (((o == null))?null:o);
+var m__8503__auto__ = (cljs.core._vreset_BANG_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(o,new_value) : m__8503__auto__.call(null,o,new_value));
+} else {
+var m__8503__auto____$1 = (cljs.core._vreset_BANG_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(o,new_value) : m__8503__auto____$1.call(null,o,new_value));
+} else {
+throw cljs.core.missing_protocol("IVolatile.-vreset!",o);
+}
+}
+}
+});
+
+
+/**
+ * Protocol for iterating over a collection.
+ * @interface
+ */
+cljs.core.IIterable = function(){};
+
+/**
+ * Returns an iterator for coll.
+ */
+cljs.core._iterator = (function cljs$core$_iterator(coll){
+if((((!((coll == null)))) && ((!((coll.cljs$core$IIterable$_iterator$arity$1 == null)))))){
+return coll.cljs$core$IIterable$_iterator$arity$1(coll);
+} else {
+var x__8502__auto__ = (((coll == null))?null:coll);
+var m__8503__auto__ = (cljs.core._iterator[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto__.call(null,coll));
+} else {
+var m__8503__auto____$1 = (cljs.core._iterator["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(coll) : m__8503__auto____$1.call(null,coll));
+} else {
+throw cljs.core.missing_protocol("IIterable.-iterator",coll);
+}
+}
+}
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IWriter}
+*/
+cljs.core.StringBufferWriter = (function (sb){
+this.sb = sb;
+this.cljs$lang$protocol_mask$partition0$ = 1073741824;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.StringBufferWriter.prototype.cljs$core$IWriter$_write$arity$2 = (function (_,s){
+var self__ = this;
+var ___$1 = this;
+return self__.sb.append(s);
+});
+
+cljs.core.StringBufferWriter.prototype.cljs$core$IWriter$_flush$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return null;
+});
+
+cljs.core.StringBufferWriter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"sb","sb",-1249746442,null)], null);
+});
+
+cljs.core.StringBufferWriter.cljs$lang$type = true;
+
+cljs.core.StringBufferWriter.cljs$lang$ctorStr = "cljs.core/StringBufferWriter";
+
+cljs.core.StringBufferWriter.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/StringBufferWriter");
+});
+
+/**
+ * Positional factory function for cljs.core/StringBufferWriter.
+ */
+cljs.core.__GT_StringBufferWriter = (function cljs$core$__GT_StringBufferWriter(sb){
+return (new cljs.core.StringBufferWriter(sb));
+});
+
+/**
+ * Support so that collections can implement toString without
+ * loading all the printing machinery.
+ */
+cljs.core.pr_str_STAR_ = (function cljs$core$pr_str_STAR_(obj){
+var sb = (new goog.string.StringBuffer());
+var writer = (new cljs.core.StringBufferWriter(sb));
+obj.cljs$core$IPrintWithWriter$_pr_writer$arity$3(null,writer,cljs.core.pr_opts());
+
+writer.cljs$core$IWriter$_flush$arity$1(null);
+
+return cljs.core.str.cljs$core$IFn$_invoke$arity$1(sb);
+});
+cljs.core.int_rotate_left = (function cljs$core$int_rotate_left(x,n){
+return ((x << n) | (x >>> (- n)));
+});
+if((((typeof Math !== 'undefined') && (typeof Math.imul !== 'undefined')) && ((!((Math.imul((4294967295),(5)) === (0))))))){
+cljs.core.imul = (function cljs$core$imul(a,b){
+return Math.imul(a,b);
+});
+} else {
+cljs.core.imul = (function cljs$core$imul(a,b){
+var ah = ((a >>> (16)) & (65535));
+var al = (a & (65535));
+var bh = ((b >>> (16)) & (65535));
+var bl = (b & (65535));
+return (((al * bl) + ((((ah * bl) + (al * bh)) << (16)) >>> (0))) | (0));
+});
+}
+cljs.core.m3_seed = (0);
+cljs.core.m3_C1 = ((3432918353) | (0));
+cljs.core.m3_C2 = ((461845907) | (0));
+cljs.core.m3_mix_K1 = (function cljs$core$m3_mix_K1(k1){
+return cljs.core.imul(cljs.core.int_rotate_left(cljs.core.imul((k1 | (0)),cljs.core.m3_C1),(15)),cljs.core.m3_C2);
+});
+cljs.core.m3_mix_H1 = (function cljs$core$m3_mix_H1(h1,k1){
+return ((cljs.core.imul(cljs.core.int_rotate_left(((h1 | (0)) ^ (k1 | (0))),(13)),(5)) + ((3864292196) | (0))) | (0));
+});
+cljs.core.m3_fmix = (function cljs$core$m3_fmix(h1,len){
+var h1__$1 = (h1 | (0));
+var h1__$2 = (h1__$1 ^ len);
+var h1__$3 = (h1__$2 ^ (h1__$2 >>> (16)));
+var h1__$4 = cljs.core.imul(h1__$3,((2246822507) | (0)));
+var h1__$5 = (h1__$4 ^ (h1__$4 >>> (13)));
+var h1__$6 = cljs.core.imul(h1__$5,((3266489909) | (0)));
+return (h1__$6 ^ (h1__$6 >>> (16)));
+});
+cljs.core.m3_hash_int = (function cljs$core$m3_hash_int(in$){
+if((in$ === (0))){
+return in$;
+} else {
+var k1 = cljs.core.m3_mix_K1(in$);
+var h1 = cljs.core.m3_mix_H1(cljs.core.m3_seed,k1);
+return cljs.core.m3_fmix(h1,(4));
+}
+});
+cljs.core.m3_hash_unencoded_chars = (function cljs$core$m3_hash_unencoded_chars(in$){
+var h1 = (function (){var i = (1);
+var h1 = cljs.core.m3_seed;
+while(true){
+if((i < in$.length)){
+var G__10127 = (i + (2));
+var G__10128 = cljs.core.m3_mix_H1(h1,cljs.core.m3_mix_K1((in$.charCodeAt((i - (1))) | (in$.charCodeAt(i) << (16)))));
+i = G__10127;
+h1 = G__10128;
+continue;
+} else {
+return h1;
+}
+break;
+}
+})();
+var h1__$1 = ((((in$.length & (1)) === (1)))?(h1 ^ cljs.core.m3_mix_K1(in$.charCodeAt((in$.length - (1))))):h1);
+return cljs.core.m3_fmix(h1__$1,cljs.core.imul((2),in$.length));
+});
+
+
+
+cljs.core.string_hash_cache = {};
+cljs.core.string_hash_cache_count = (0);
+cljs.core.hash_string_STAR_ = (function cljs$core$hash_string_STAR_(s){
+if((!((s == null)))){
+var len = s.length;
+if((len > (0))){
+var i = (0);
+var hash = (0);
+while(true){
+if((i < len)){
+var G__10131 = (i + (1));
+var G__10132 = (cljs.core.imul((31),hash) + s.charCodeAt(i));
+i = G__10131;
+hash = G__10132;
+continue;
+} else {
+return hash;
+}
+break;
+}
+} else {
+return (0);
+}
+} else {
+return (0);
+}
+});
+cljs.core.add_to_string_hash_cache = (function cljs$core$add_to_string_hash_cache(k){
+var h = cljs.core.hash_string_STAR_(k);
+goog.object.set(cljs.core.string_hash_cache,k,h);
+
+cljs.core.string_hash_cache_count = (cljs.core.string_hash_cache_count + (1));
+
+return h;
+});
+cljs.core.hash_string = (function cljs$core$hash_string(k){
+if((cljs.core.string_hash_cache_count > (255))){
+cljs.core.string_hash_cache = {};
+
+cljs.core.string_hash_cache_count = (0);
+} else {
+}
+
+if((k == null)){
+return (0);
+} else {
+var h = (cljs.core.string_hash_cache[k]);
+if(typeof h === 'number'){
+return h;
+} else {
+return cljs.core.add_to_string_hash_cache(k);
+}
+}
+});
+/**
+ * Returns the hash code of its argument. Note this is the hash code
+ * consistent with =.
+ */
+cljs.core.hash = (function cljs$core$hash(o){
+if((((!((o == null))))?(((((o.cljs$lang$protocol_mask$partition0$ & (4194304))) || ((cljs.core.PROTOCOL_SENTINEL === o.cljs$core$IHash$))))?true:false):false)){
+return (o.cljs$core$IHash$_hash$arity$1(null) ^ (0));
+} else {
+if(typeof o === 'number'){
+if(cljs.core.truth_(isFinite(o))){
+return (Math.floor(o) % (2147483647));
+} else {
+var G__10136 = o;
+switch (G__10136) {
+case Infinity:
+return (2146435072);
+
+break;
+case -Infinity:
+return (-1048576);
+
+break;
+default:
+return (2146959360);
+
+}
+}
+} else {
+if(o === true){
+return (1231);
+} else {
+if(o === false){
+return (1237);
+} else {
+if(typeof o === 'string'){
+return cljs.core.m3_hash_int(cljs.core.hash_string(o));
+} else {
+if((o instanceof Date)){
+return (o.valueOf() ^ (0));
+} else {
+if((o == null)){
+return (0);
+} else {
+return (cljs.core._hash(o) ^ (0));
+
+}
+}
+}
+}
+}
+}
+}
+});
+cljs.core.hash_combine = (function cljs$core$hash_combine(seed,hash){
+return (seed ^ (((hash + (2654435769)) + (seed << (6))) + (seed >> (2))));
+});
+/**
+ * Evaluates x and tests if it is an instance of the type
+ * c. Returns true or false
+ */
+cljs.core.instance_QMARK_ = (function cljs$core$instance_QMARK_(c,x){
+return (x instanceof c);
+});
+/**
+ * Return true if x is a Symbol
+ */
+cljs.core.symbol_QMARK_ = (function cljs$core$symbol_QMARK_(x){
+return (x instanceof cljs.core.Symbol);
+});
+cljs.core.hash_symbol = (function cljs$core$hash_symbol(sym){
+return cljs.core.hash_combine(cljs.core.m3_hash_unencoded_chars(sym.name),cljs.core.hash_string(sym.ns));
+});
+cljs.core.compare_symbols = (function cljs$core$compare_symbols(a,b){
+if((a.str === b.str)){
+return (0);
+} else {
+if(cljs.core.truth_((function (){var and__7791__auto__ = cljs.core.not(a.ns);
+if(and__7791__auto__){
+return b.ns;
+} else {
+return and__7791__auto__;
+}
+})())){
+return (-1);
+} else {
+if(cljs.core.truth_(a.ns)){
+if(cljs.core.not(b.ns)){
+return (1);
+} else {
+var nsc = (function (){var G__10138 = a.ns;
+var G__10139 = b.ns;
+return goog.array.defaultCompare(G__10138,G__10139);
+})();
+if(((0) === nsc)){
+var G__10140 = a.name;
+var G__10141 = b.name;
+return goog.array.defaultCompare(G__10140,G__10141);
+} else {
+return nsc;
+}
+}
+} else {
+var G__10142 = a.name;
+var G__10143 = b.name;
+return goog.array.defaultCompare(G__10142,G__10143);
+
+}
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.INamed}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IPrintWithWriter}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.Symbol = (function (ns,name,str,_hash,_meta){
+this.ns = ns;
+this.name = name;
+this.str = str;
+this._hash = _hash;
+this._meta = _meta;
+this.cljs$lang$protocol_mask$partition0$ = 2154168321;
+this.cljs$lang$protocol_mask$partition1$ = 4096;
+});
+cljs.core.Symbol.prototype.toString = (function (){
+var self__ = this;
+var _ = this;
+return self__.str;
+});
+
+cljs.core.Symbol.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Symbol.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (_,other){
+var self__ = this;
+var ___$1 = this;
+if((other instanceof cljs.core.Symbol)){
+return (self__.str === other.str);
+} else {
+return false;
+}
+});
+
+cljs.core.Symbol.prototype.call = (function() {
+var G__10145 = null;
+var G__10145__2 = (function (self__,coll){
+var self__ = this;
+var self____$1 = this;
+var sym = self____$1;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$2(coll,sym);
+});
+var G__10145__3 = (function (self__,coll,not_found){
+var self__ = this;
+var self____$1 = this;
+var sym = self____$1;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$3(coll,sym,not_found);
+});
+G__10145 = function(self__,coll,not_found){
+switch(arguments.length){
+case 2:
+return G__10145__2.call(this,self__,coll);
+case 3:
+return G__10145__3.call(this,self__,coll,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__10145.cljs$core$IFn$_invoke$arity$2 = G__10145__2;
+G__10145.cljs$core$IFn$_invoke$arity$3 = G__10145__3;
+return G__10145;
+})()
+;
+
+cljs.core.Symbol.prototype.apply = (function (self__,args10144){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args10144)));
+});
+
+cljs.core.Symbol.prototype.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+var self__ = this;
+var sym = this;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$2(coll,sym);
+});
+
+cljs.core.Symbol.prototype.cljs$core$IFn$_invoke$arity$2 = (function (coll,not_found){
+var self__ = this;
+var sym = this;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$3(coll,sym,not_found);
+});
+
+cljs.core.Symbol.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__._meta;
+});
+
+cljs.core.Symbol.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_,new_meta){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.Symbol(self__.ns,self__.name,self__.str,self__._hash,new_meta));
+});
+
+cljs.core.Symbol.prototype.cljs$core$IHash$_hash$arity$1 = (function (sym){
+var self__ = this;
+var sym__$1 = this;
+var h__8266__auto__ = self__._hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_symbol(sym__$1);
+self__._hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.Symbol.prototype.cljs$core$INamed$_name$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.name;
+});
+
+cljs.core.Symbol.prototype.cljs$core$INamed$_namespace$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.ns;
+});
+
+cljs.core.Symbol.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (o,writer,_){
+var self__ = this;
+var o__$1 = this;
+return cljs.core._write(writer,self__.str);
+});
+
+cljs.core.Symbol.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"ns","ns",2082130287,null),new cljs.core.Symbol(null,"name","name",-810760592,null),new cljs.core.Symbol(null,"str","str",-1564826950,null),cljs.core.with_meta(new cljs.core.Symbol(null,"_hash","_hash",-2130838312,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"_meta","_meta",-1716892533,null)], null);
+});
+
+cljs.core.Symbol.cljs$lang$type = true;
+
+cljs.core.Symbol.cljs$lang$ctorStr = "cljs.core/Symbol";
+
+cljs.core.Symbol.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Symbol");
+});
+
+/**
+ * Positional factory function for cljs.core/Symbol.
+ */
+cljs.core.__GT_Symbol = (function cljs$core$__GT_Symbol(ns,name,str,_hash,_meta){
+return (new cljs.core.Symbol(ns,name,str,_hash,_meta));
+});
+
+/**
+ * Returns a Symbol with the given namespace and name.
+ */
+cljs.core.symbol = (function cljs$core$symbol(var_args){
+var G__10147 = arguments.length;
+switch (G__10147) {
+case 1:
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.symbol.cljs$core$IFn$_invoke$arity$1 = (function (name){
+if((name instanceof cljs.core.Symbol)){
+return name;
+} else {
+var idx = name.indexOf("/");
+if((idx < (1))){
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$2(null,name);
+} else {
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$2(name.substring((0),idx),name.substring((idx + (1)),name.length));
+}
+}
+});
+
+cljs.core.symbol.cljs$core$IFn$_invoke$arity$2 = (function (ns,name){
+var sym_str = (((!((ns == null))))?[cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns),"/",cljs.core.str.cljs$core$IFn$_invoke$arity$1(name)].join(''):name);
+return (new cljs.core.Symbol(ns,name,sym_str,null,null));
+});
+
+cljs.core.symbol.cljs$lang$maxFixedArity = 2;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.Fn}
+ * @implements {cljs.core.IDeref}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.Var = (function (val,sym,_meta){
+this.val = val;
+this.sym = sym;
+this._meta = _meta;
+this.cljs$lang$protocol_mask$partition0$ = 6717441;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.Var.prototype.isMacro = (function (){
+var self__ = this;
+var _ = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)).cljs$lang$macro;
+});
+
+cljs.core.Var.prototype.toString = (function (){
+var self__ = this;
+var _ = this;
+return ["#'",cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.sym)].join('');
+});
+
+cljs.core.Var.prototype.cljs$core$IDeref$_deref$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+});
+
+cljs.core.Var.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__._meta;
+});
+
+cljs.core.Var.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_,new_meta){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.Var(self__.val,self__.sym,new_meta));
+});
+
+cljs.core.Var.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (this$,other){
+var self__ = this;
+var this$__$1 = this;
+if((other instanceof cljs.core.Var)){
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(this$__$1.sym,other.sym);
+} else {
+return false;
+}
+});
+
+cljs.core.Var.prototype.cljs$core$IHash$_hash$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.hash_symbol(self__.sym);
+});
+
+cljs.core.Var.prototype.cljs$core$Fn$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Var.prototype.call = (function() {
+var G__10192 = null;
+var G__10192__1 = (function (self__){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10150 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10150.cljs$core$IFn$_invoke$arity$0 ? fexpr__10150.cljs$core$IFn$_invoke$arity$0() : fexpr__10150.call(null));
+});
+var G__10192__2 = (function (self__,a){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10151 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10151.cljs$core$IFn$_invoke$arity$1 ? fexpr__10151.cljs$core$IFn$_invoke$arity$1(a) : fexpr__10151.call(null,a));
+});
+var G__10192__3 = (function (self__,a,b){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10152 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10152.cljs$core$IFn$_invoke$arity$2 ? fexpr__10152.cljs$core$IFn$_invoke$arity$2(a,b) : fexpr__10152.call(null,a,b));
+});
+var G__10192__4 = (function (self__,a,b,c){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10153 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10153.cljs$core$IFn$_invoke$arity$3 ? fexpr__10153.cljs$core$IFn$_invoke$arity$3(a,b,c) : fexpr__10153.call(null,a,b,c));
+});
+var G__10192__5 = (function (self__,a,b,c,d){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10154 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10154.cljs$core$IFn$_invoke$arity$4 ? fexpr__10154.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : fexpr__10154.call(null,a,b,c,d));
+});
+var G__10192__6 = (function (self__,a,b,c,d,e){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10155 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10155.cljs$core$IFn$_invoke$arity$5 ? fexpr__10155.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : fexpr__10155.call(null,a,b,c,d,e));
+});
+var G__10192__7 = (function (self__,a,b,c,d,e,f){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10156 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10156.cljs$core$IFn$_invoke$arity$6 ? fexpr__10156.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : fexpr__10156.call(null,a,b,c,d,e,f));
+});
+var G__10192__8 = (function (self__,a,b,c,d,e,f,g){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10157 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10157.cljs$core$IFn$_invoke$arity$7 ? fexpr__10157.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : fexpr__10157.call(null,a,b,c,d,e,f,g));
+});
+var G__10192__9 = (function (self__,a,b,c,d,e,f,g,h){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10158 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10158.cljs$core$IFn$_invoke$arity$8 ? fexpr__10158.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : fexpr__10158.call(null,a,b,c,d,e,f,g,h));
+});
+var G__10192__10 = (function (self__,a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10159 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10159.cljs$core$IFn$_invoke$arity$9 ? fexpr__10159.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : fexpr__10159.call(null,a,b,c,d,e,f,g,h,i));
+});
+var G__10192__11 = (function (self__,a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10160 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10160.cljs$core$IFn$_invoke$arity$10 ? fexpr__10160.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : fexpr__10160.call(null,a,b,c,d,e,f,g,h,i,j));
+});
+var G__10192__12 = (function (self__,a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10161 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10161.cljs$core$IFn$_invoke$arity$11 ? fexpr__10161.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : fexpr__10161.call(null,a,b,c,d,e,f,g,h,i,j,k));
+});
+var G__10192__13 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10162 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10162.cljs$core$IFn$_invoke$arity$12 ? fexpr__10162.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : fexpr__10162.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+});
+var G__10192__14 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10163 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10163.cljs$core$IFn$_invoke$arity$13 ? fexpr__10163.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : fexpr__10163.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+});
+var G__10192__15 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10164 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10164.cljs$core$IFn$_invoke$arity$14 ? fexpr__10164.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : fexpr__10164.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+});
+var G__10192__16 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10165 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10165.cljs$core$IFn$_invoke$arity$15 ? fexpr__10165.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : fexpr__10165.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+});
+var G__10192__17 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10166 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10166.cljs$core$IFn$_invoke$arity$16 ? fexpr__10166.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : fexpr__10166.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+});
+var G__10192__18 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10167 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10167.cljs$core$IFn$_invoke$arity$17 ? fexpr__10167.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : fexpr__10167.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+});
+var G__10192__19 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10168 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10168.cljs$core$IFn$_invoke$arity$18 ? fexpr__10168.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : fexpr__10168.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+});
+var G__10192__20 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10169 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10169.cljs$core$IFn$_invoke$arity$19 ? fexpr__10169.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : fexpr__10169.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+});
+var G__10192__21 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+var fexpr__10170 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10170.cljs$core$IFn$_invoke$arity$20 ? fexpr__10170.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : fexpr__10170.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+});
+var G__10192__22 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic((self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)),a,b,c,d,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+});
+G__10192 = function(self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+switch(arguments.length){
+case 1:
+return G__10192__1.call(this,self__);
+case 2:
+return G__10192__2.call(this,self__,a);
+case 3:
+return G__10192__3.call(this,self__,a,b);
+case 4:
+return G__10192__4.call(this,self__,a,b,c);
+case 5:
+return G__10192__5.call(this,self__,a,b,c,d);
+case 6:
+return G__10192__6.call(this,self__,a,b,c,d,e);
+case 7:
+return G__10192__7.call(this,self__,a,b,c,d,e,f);
+case 8:
+return G__10192__8.call(this,self__,a,b,c,d,e,f,g);
+case 9:
+return G__10192__9.call(this,self__,a,b,c,d,e,f,g,h);
+case 10:
+return G__10192__10.call(this,self__,a,b,c,d,e,f,g,h,i);
+case 11:
+return G__10192__11.call(this,self__,a,b,c,d,e,f,g,h,i,j);
+case 12:
+return G__10192__12.call(this,self__,a,b,c,d,e,f,g,h,i,j,k);
+case 13:
+return G__10192__13.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l);
+case 14:
+return G__10192__14.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m);
+case 15:
+return G__10192__15.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
+case 16:
+return G__10192__16.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o);
+case 17:
+return G__10192__17.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+case 18:
+return G__10192__18.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
+case 19:
+return G__10192__19.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r);
+case 20:
+return G__10192__20.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);
+case 21:
+return G__10192__21.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t);
+case 22:
+return G__10192__22.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__10192.cljs$core$IFn$_invoke$arity$1 = G__10192__1;
+G__10192.cljs$core$IFn$_invoke$arity$2 = G__10192__2;
+G__10192.cljs$core$IFn$_invoke$arity$3 = G__10192__3;
+G__10192.cljs$core$IFn$_invoke$arity$4 = G__10192__4;
+G__10192.cljs$core$IFn$_invoke$arity$5 = G__10192__5;
+G__10192.cljs$core$IFn$_invoke$arity$6 = G__10192__6;
+G__10192.cljs$core$IFn$_invoke$arity$7 = G__10192__7;
+G__10192.cljs$core$IFn$_invoke$arity$8 = G__10192__8;
+G__10192.cljs$core$IFn$_invoke$arity$9 = G__10192__9;
+G__10192.cljs$core$IFn$_invoke$arity$10 = G__10192__10;
+G__10192.cljs$core$IFn$_invoke$arity$11 = G__10192__11;
+G__10192.cljs$core$IFn$_invoke$arity$12 = G__10192__12;
+G__10192.cljs$core$IFn$_invoke$arity$13 = G__10192__13;
+G__10192.cljs$core$IFn$_invoke$arity$14 = G__10192__14;
+G__10192.cljs$core$IFn$_invoke$arity$15 = G__10192__15;
+G__10192.cljs$core$IFn$_invoke$arity$16 = G__10192__16;
+G__10192.cljs$core$IFn$_invoke$arity$17 = G__10192__17;
+G__10192.cljs$core$IFn$_invoke$arity$18 = G__10192__18;
+G__10192.cljs$core$IFn$_invoke$arity$19 = G__10192__19;
+G__10192.cljs$core$IFn$_invoke$arity$20 = G__10192__20;
+G__10192.cljs$core$IFn$_invoke$arity$21 = G__10192__21;
+G__10192.cljs$core$IFn$_invoke$arity$22 = G__10192__22;
+return G__10192;
+})()
+;
+
+cljs.core.Var.prototype.apply = (function (self__,args10149){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args10149)));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$0 = (function (){
+var self__ = this;
+var _ = this;
+var fexpr__10171 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10171.cljs$core$IFn$_invoke$arity$0 ? fexpr__10171.cljs$core$IFn$_invoke$arity$0() : fexpr__10171.call(null));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$1 = (function (a){
+var self__ = this;
+var _ = this;
+var fexpr__10172 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10172.cljs$core$IFn$_invoke$arity$1 ? fexpr__10172.cljs$core$IFn$_invoke$arity$1(a) : fexpr__10172.call(null,a));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$2 = (function (a,b){
+var self__ = this;
+var _ = this;
+var fexpr__10173 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10173.cljs$core$IFn$_invoke$arity$2 ? fexpr__10173.cljs$core$IFn$_invoke$arity$2(a,b) : fexpr__10173.call(null,a,b));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$3 = (function (a,b,c){
+var self__ = this;
+var _ = this;
+var fexpr__10174 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10174.cljs$core$IFn$_invoke$arity$3 ? fexpr__10174.cljs$core$IFn$_invoke$arity$3(a,b,c) : fexpr__10174.call(null,a,b,c));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$4 = (function (a,b,c,d){
+var self__ = this;
+var _ = this;
+var fexpr__10175 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10175.cljs$core$IFn$_invoke$arity$4 ? fexpr__10175.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : fexpr__10175.call(null,a,b,c,d));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$5 = (function (a,b,c,d,e){
+var self__ = this;
+var _ = this;
+var fexpr__10176 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10176.cljs$core$IFn$_invoke$arity$5 ? fexpr__10176.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : fexpr__10176.call(null,a,b,c,d,e));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$6 = (function (a,b,c,d,e,f){
+var self__ = this;
+var _ = this;
+var fexpr__10177 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10177.cljs$core$IFn$_invoke$arity$6 ? fexpr__10177.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : fexpr__10177.call(null,a,b,c,d,e,f));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$7 = (function (a,b,c,d,e,f,g){
+var self__ = this;
+var _ = this;
+var fexpr__10178 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10178.cljs$core$IFn$_invoke$arity$7 ? fexpr__10178.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : fexpr__10178.call(null,a,b,c,d,e,f,g));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$8 = (function (a,b,c,d,e,f,g,h){
+var self__ = this;
+var _ = this;
+var fexpr__10179 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10179.cljs$core$IFn$_invoke$arity$8 ? fexpr__10179.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : fexpr__10179.call(null,a,b,c,d,e,f,g,h));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$9 = (function (a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var _ = this;
+var fexpr__10180 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10180.cljs$core$IFn$_invoke$arity$9 ? fexpr__10180.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : fexpr__10180.call(null,a,b,c,d,e,f,g,h,i));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$10 = (function (a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var _ = this;
+var fexpr__10181 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10181.cljs$core$IFn$_invoke$arity$10 ? fexpr__10181.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : fexpr__10181.call(null,a,b,c,d,e,f,g,h,i,j));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$11 = (function (a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var _ = this;
+var fexpr__10182 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10182.cljs$core$IFn$_invoke$arity$11 ? fexpr__10182.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : fexpr__10182.call(null,a,b,c,d,e,f,g,h,i,j,k));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$12 = (function (a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var _ = this;
+var fexpr__10183 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10183.cljs$core$IFn$_invoke$arity$12 ? fexpr__10183.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : fexpr__10183.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$13 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var _ = this;
+var fexpr__10184 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10184.cljs$core$IFn$_invoke$arity$13 ? fexpr__10184.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : fexpr__10184.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$14 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var _ = this;
+var fexpr__10185 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10185.cljs$core$IFn$_invoke$arity$14 ? fexpr__10185.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : fexpr__10185.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$15 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var _ = this;
+var fexpr__10186 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10186.cljs$core$IFn$_invoke$arity$15 ? fexpr__10186.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : fexpr__10186.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$16 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var _ = this;
+var fexpr__10187 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10187.cljs$core$IFn$_invoke$arity$16 ? fexpr__10187.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : fexpr__10187.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$17 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var _ = this;
+var fexpr__10188 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10188.cljs$core$IFn$_invoke$arity$17 ? fexpr__10188.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : fexpr__10188.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$18 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var _ = this;
+var fexpr__10189 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10189.cljs$core$IFn$_invoke$arity$18 ? fexpr__10189.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : fexpr__10189.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$19 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var _ = this;
+var fexpr__10190 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10190.cljs$core$IFn$_invoke$arity$19 ? fexpr__10190.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : fexpr__10190.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$20 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var _ = this;
+var fexpr__10191 = (self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null));
+return (fexpr__10191.cljs$core$IFn$_invoke$arity$20 ? fexpr__10191.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : fexpr__10191.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+});
+
+cljs.core.Var.prototype.cljs$core$IFn$_invoke$arity$21 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var _ = this;
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic((self__.val.cljs$core$IFn$_invoke$arity$0 ? self__.val.cljs$core$IFn$_invoke$arity$0() : self__.val.call(null)),a,b,c,d,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+});
+
+cljs.core.Var.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"val","val",1769233139,null),new cljs.core.Symbol(null,"sym","sym",195671222,null),new cljs.core.Symbol(null,"_meta","_meta",-1716892533,null)], null);
+});
+
+cljs.core.Var.cljs$lang$type = true;
+
+cljs.core.Var.cljs$lang$ctorStr = "cljs.core/Var";
+
+cljs.core.Var.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Var");
+});
+
+/**
+ * Positional factory function for cljs.core/Var.
+ */
+cljs.core.__GT_Var = (function cljs$core$__GT_Var(val,sym,_meta){
+return (new cljs.core.Var(val,sym,_meta));
+});
+
+/**
+ * Returns true if v is of type cljs.core.Var
+ */
+cljs.core.var_QMARK_ = (function cljs$core$var_QMARK_(v){
+return (v instanceof cljs.core.Var);
+});
+
+
+/**
+ * Return true if x implements IIterable protocol.
+ */
+cljs.core.iterable_QMARK_ = (function cljs$core$iterable_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition1$ & (131072))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IIterable$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition1$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IIterable,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IIterable,x);
+}
+});
+/**
+ * Clone the supplied value which must implement ICloneable.
+ */
+cljs.core.clone = (function cljs$core$clone(value){
+return cljs.core._clone(value);
+});
+/**
+ * Return true if x implements ICloneable protocol.
+ */
+cljs.core.cloneable_QMARK_ = (function cljs$core$cloneable_QMARK_(value){
+if((!((value == null)))){
+if((((value.cljs$lang$protocol_mask$partition1$ & (8192))) || ((cljs.core.PROTOCOL_SENTINEL === value.cljs$core$ICloneable$)))){
+return true;
+} else {
+if((!value.cljs$lang$protocol_mask$partition1$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICloneable,value);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICloneable,value);
+}
+});
+/**
+ * Returns a seq on the collection. If the collection is
+ * empty, returns nil. (seq nil) returns nil. seq also works on
+ * Strings.
+ */
+cljs.core.seq = (function cljs$core$seq(coll){
+if((coll == null)){
+return null;
+} else {
+if((((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (8388608))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeqable$))))?true:false):false)){
+return coll.cljs$core$ISeqable$_seq$arity$1(null);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+if((coll.length === (0))){
+return null;
+} else {
+return (new cljs.core.IndexedSeq(coll,(0),null));
+}
+} else {
+if(typeof coll === 'string'){
+if((coll.length === (0))){
+return null;
+} else {
+return (new cljs.core.IndexedSeq(coll,(0),null));
+}
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.ISeqable,coll)){
+return cljs.core._seq(coll);
+} else {
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1(coll)," is not ISeqable"].join('')));
+
+}
+}
+}
+}
+}
+});
+/**
+ * Returns the first item in the collection. Calls seq on its
+ * argument. If coll is nil, returns nil.
+ */
+cljs.core.first = (function cljs$core$first(coll){
+if((coll == null)){
+return null;
+} else {
+if((((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeq$))))?true:false):false)){
+return coll.cljs$core$ISeq$_first$arity$1(null);
+} else {
+var s = cljs.core.seq(coll);
+if((s == null)){
+return null;
+} else {
+return cljs.core._first(s);
+}
+}
+}
+});
+/**
+ * Returns a possibly empty seq of the items after the first. Calls seq on its
+ * argument.
+ */
+cljs.core.rest = (function cljs$core$rest(coll){
+if((!((coll == null)))){
+if((((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeq$))))?true:false):false)){
+return coll.cljs$core$ISeq$_rest$arity$1(null);
+} else {
+var s = cljs.core.seq(coll);
+if(s){
+return s.cljs$core$ISeq$_rest$arity$1(null);
+} else {
+return cljs.core.List.EMPTY;
+}
+}
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+/**
+ * Returns a seq of the items after the first. Calls seq on its
+ * argument. If there are no more items, returns nil
+ */
+cljs.core.next = (function cljs$core$next(coll){
+if((coll == null)){
+return null;
+} else {
+if((((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (128))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$INext$))))?true:false):false)){
+return coll.cljs$core$INext$_next$arity$1(null);
+} else {
+return cljs.core.seq(cljs.core.rest(coll));
+}
+}
+});
+/**
+ * Equality. Returns true if x equals y, false if not. Compares
+ * numbers and collections in a type-independent manner. Clojure's immutable data
+ * structures define -equiv (and thus =) as a value, not an identity,
+ * comparison.
+ */
+cljs.core._EQ_ = (function cljs$core$_EQ_(var_args){
+var G__10203 = arguments.length;
+switch (G__10203) {
+case 1:
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10205 = arguments.length;
+var i__9001__auto___10206 = (0);
+while(true){
+if((i__9001__auto___10206 < len__9000__auto___10205)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10206]));
+
+var G__10207 = (i__9001__auto___10206 + (1));
+i__9001__auto___10206 = G__10207;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core._EQ_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+if((x == null)){
+return (y == null);
+} else {
+return (((x === y)) || (cljs.core._equiv(x,y)));
+}
+});
+
+cljs.core._EQ_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x,y)){
+if(cljs.core.next(more)){
+var G__10208 = y;
+var G__10209 = cljs.core.first(more);
+var G__10210 = cljs.core.next(more);
+x = G__10208;
+y = G__10209;
+more = G__10210;
+continue;
+} else {
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(y,cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core._EQ_.cljs$lang$applyTo = (function (seq10200){
+var G__10201 = cljs.core.first(seq10200);
+var seq10200__$1 = cljs.core.next(seq10200);
+var G__10202 = cljs.core.first(seq10200__$1);
+var seq10200__$2 = cljs.core.next(seq10200__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10201,G__10202,seq10200__$2);
+});
+
+cljs.core._EQ_.cljs$lang$maxFixedArity = (2);
+
+
+/**
+* @constructor
+*/
+cljs.core.ES6Iterator = (function (s){
+this.s = s;
+});
+cljs.core.ES6Iterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if((!((self__.s == null)))){
+var x = cljs.core.first(self__.s);
+self__.s = cljs.core.next(self__.s);
+
+return ({"value": x, "done": false});
+} else {
+return ({"value": null, "done": true});
+}
+});
+
+cljs.core.ES6Iterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"s","s",-948495851,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ES6Iterator.cljs$lang$type = true;
+
+cljs.core.ES6Iterator.cljs$lang$ctorStr = "cljs.core/ES6Iterator";
+
+cljs.core.ES6Iterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ES6Iterator");
+});
+
+/**
+ * Positional factory function for cljs.core/ES6Iterator.
+ */
+cljs.core.__GT_ES6Iterator = (function cljs$core$__GT_ES6Iterator(s){
+return (new cljs.core.ES6Iterator(s));
+});
+
+/**
+ * EXPERIMENTAL: Return a ES2015 compatible iterator for coll.
+ */
+cljs.core.es6_iterator = (function cljs$core$es6_iterator(coll){
+return (new cljs.core.ES6Iterator(cljs.core.seq(coll)));
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.ISeqable}
+*/
+cljs.core.ES6IteratorSeq = (function (value,iter,_rest){
+this.value = value;
+this.iter = iter;
+this._rest = _rest;
+this.cljs$lang$protocol_mask$partition0$ = 8388672;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.ES6IteratorSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1;
+});
+
+cljs.core.ES6IteratorSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.value;
+});
+
+cljs.core.ES6IteratorSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+if((self__._rest == null)){
+self__._rest = cljs.core.es6_iterator_seq(self__.iter);
+} else {
+}
+
+return self__._rest;
+});
+
+cljs.core.ES6IteratorSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"value","value",1946509744,null),new cljs.core.Symbol(null,"iter","iter",-1346195486,null),cljs.core.with_meta(new cljs.core.Symbol(null,"_rest","_rest",-2100466189,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ES6IteratorSeq.cljs$lang$type = true;
+
+cljs.core.ES6IteratorSeq.cljs$lang$ctorStr = "cljs.core/ES6IteratorSeq";
+
+cljs.core.ES6IteratorSeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ES6IteratorSeq");
+});
+
+/**
+ * Positional factory function for cljs.core/ES6IteratorSeq.
+ */
+cljs.core.__GT_ES6IteratorSeq = (function cljs$core$__GT_ES6IteratorSeq(value,iter,_rest){
+return (new cljs.core.ES6IteratorSeq(value,iter,_rest));
+});
+
+/**
+ * EXPERIMENTAL: Given an ES2015 compatible iterator return a seq.
+ */
+cljs.core.es6_iterator_seq = (function cljs$core$es6_iterator_seq(iter){
+var v = iter.next();
+if(cljs.core.truth_(v.done)){
+return cljs.core.List.EMPTY;
+} else {
+return (new cljs.core.ES6IteratorSeq(v.value,iter,null));
+}
+});
+/**
+ * Mix final collection hash for ordered or unordered collections.
+ * hash-basis is the combined collection hash, count is the number
+ * of elements included in the basis. Note this is the hash code
+ * consistent with =, different from .hashCode.
+ * See http://clojure.org/data_structures#hash for full algorithms.
+ */
+cljs.core.mix_collection_hash = (function cljs$core$mix_collection_hash(hash_basis,count){
+var h1 = cljs.core.m3_seed;
+var k1 = cljs.core.m3_mix_K1(hash_basis);
+var h1__$1 = cljs.core.m3_mix_H1(h1,k1);
+return cljs.core.m3_fmix(h1__$1,count);
+});
+/**
+ * Returns the hash code, consistent with =, for an external ordered
+ * collection implementing Iterable.
+ * See http://clojure.org/data_structures#hash for full algorithms.
+ */
+cljs.core.hash_ordered_coll = (function cljs$core$hash_ordered_coll(coll){
+var n = (0);
+var hash_code = (1);
+var coll__$1 = cljs.core.seq(coll);
+while(true){
+if((!((coll__$1 == null)))){
+var G__10211 = (n + (1));
+var G__10212 = ((cljs.core.imul((31),hash_code) + cljs.core.hash(cljs.core.first(coll__$1))) | (0));
+var G__10213 = cljs.core.next(coll__$1);
+n = G__10211;
+hash_code = G__10212;
+coll__$1 = G__10213;
+continue;
+} else {
+return cljs.core.mix_collection_hash(hash_code,n);
+}
+break;
+}
+});
+cljs.core.empty_ordered_hash = cljs.core.mix_collection_hash((1),(0));
+/**
+ * Returns the hash code, consistent with =, for an external unordered
+ * collection implementing Iterable. For maps, the iterator should
+ * return map entries whose hash is computed as
+ * (hash-ordered-coll [k v]).
+ * See http://clojure.org/data_structures#hash for full algorithms.
+ */
+cljs.core.hash_unordered_coll = (function cljs$core$hash_unordered_coll(coll){
+var n = (0);
+var hash_code = (0);
+var coll__$1 = cljs.core.seq(coll);
+while(true){
+if((!((coll__$1 == null)))){
+var G__10214 = (n + (1));
+var G__10215 = ((hash_code + cljs.core.hash(cljs.core.first(coll__$1))) | (0));
+var G__10216 = cljs.core.next(coll__$1);
+n = G__10214;
+hash_code = G__10215;
+coll__$1 = G__10216;
+continue;
+} else {
+return cljs.core.mix_collection_hash(hash_code,n);
+}
+break;
+}
+});
+cljs.core.empty_unordered_hash = cljs.core.mix_collection_hash((0),(0));
+
+
+goog.object.set(cljs.core.ICounted,"null",true);
+
+var G__10217_10220 = cljs.core._count;
+var G__10218_10221 = "null";
+var G__10219_10222 = ((function (G__10217_10220,G__10218_10221){
+return (function (_){
+return (0);
+});})(G__10217_10220,G__10218_10221))
+;
+goog.object.set(G__10217_10220,G__10218_10221,G__10219_10222);
+Date.prototype.cljs$core$IEquiv$ = cljs.core.PROTOCOL_SENTINEL;
+
+Date.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (o,other){
+var o__$1 = this;
+return (((other instanceof Date)) && ((o__$1.valueOf() === other.valueOf())));
+});
+
+Date.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+Date.prototype.cljs$core$IComparable$_compare$arity$2 = (function (this$,other){
+var this$__$1 = this;
+if((other instanceof Date)){
+var G__10223 = this$__$1.valueOf();
+var G__10224 = other.valueOf();
+return goog.array.defaultCompare(G__10223,G__10224);
+} else {
+throw (new Error(["Cannot compare ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(this$__$1)," to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(other)].join('')));
+}
+});
+
+/**
+ * @interface
+ */
+cljs.core.Inst = function(){};
+
+cljs.core.inst_ms_STAR_ = (function cljs$core$inst_ms_STAR_(inst){
+if((((!((inst == null)))) && ((!((inst.cljs$core$Inst$inst_ms_STAR_$arity$1 == null)))))){
+return inst.cljs$core$Inst$inst_ms_STAR_$arity$1(inst);
+} else {
+var x__8502__auto__ = (((inst == null))?null:inst);
+var m__8503__auto__ = (cljs.core.inst_ms_STAR_[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(inst) : m__8503__auto__.call(null,inst));
+} else {
+var m__8503__auto____$1 = (cljs.core.inst_ms_STAR_["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(inst) : m__8503__auto____$1.call(null,inst));
+} else {
+throw cljs.core.missing_protocol("Inst.inst-ms*",inst);
+}
+}
+}
+});
+
+Date.prototype.cljs$core$Inst$ = cljs.core.PROTOCOL_SENTINEL;
+
+Date.prototype.cljs$core$Inst$inst_ms_STAR_$arity$1 = (function (inst){
+var inst__$1 = this;
+return inst__$1.getTime();
+});
+/**
+ * Return the number of milliseconds since January 1, 1970, 00:00:00 GMT
+ */
+cljs.core.inst_ms = (function cljs$core$inst_ms(inst){
+return cljs.core.inst_ms_STAR_(inst);
+});
+/**
+ * Return true if x satisfies Inst
+ */
+cljs.core.inst_QMARK_ = (function cljs$core$inst_QMARK_(x){
+if((!((x == null)))){
+if(((false) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$Inst$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.Inst,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.Inst,x);
+}
+});
+goog.object.set(cljs.core.IEquiv,"number",true);
+
+var G__10226_10229 = cljs.core._equiv;
+var G__10227_10230 = "number";
+var G__10228_10231 = ((function (G__10226_10229,G__10227_10230){
+return (function (x,o){
+return (x === o);
+});})(G__10226_10229,G__10227_10230))
+;
+goog.object.set(G__10226_10229,G__10227_10230,G__10228_10231);
+goog.object.set(cljs.core.Fn,"function",true);
+
+goog.object.set(cljs.core.IMeta,"function",true);
+
+var G__10232_10235 = cljs.core._meta;
+var G__10233_10236 = "function";
+var G__10234_10237 = ((function (G__10232_10235,G__10233_10236){
+return (function (_){
+return null;
+});})(G__10232_10235,G__10233_10236))
+;
+goog.object.set(G__10232_10235,G__10233_10236,G__10234_10237);
+goog.object.set(cljs.core.IHash,"_",true);
+
+var G__10238_10241 = cljs.core._hash;
+var G__10239_10242 = "_";
+var G__10240_10243 = ((function (G__10238_10241,G__10239_10242){
+return (function (o){
+return goog.getUid(o);
+});})(G__10238_10241,G__10239_10242))
+;
+goog.object.set(G__10238_10241,G__10239_10242,G__10240_10243);
+/**
+ * Returns a number one greater than num.
+ */
+cljs.core.inc = (function cljs$core$inc(x){
+return (x + (1));
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IDeref}
+*/
+cljs.core.Reduced = (function (val){
+this.val = val;
+this.cljs$lang$protocol_mask$partition0$ = 32768;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.Reduced.prototype.cljs$core$IDeref$_deref$arity$1 = (function (o){
+var self__ = this;
+var o__$1 = this;
+return self__.val;
+});
+
+cljs.core.Reduced.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"val","val",1769233139,null)], null);
+});
+
+cljs.core.Reduced.cljs$lang$type = true;
+
+cljs.core.Reduced.cljs$lang$ctorStr = "cljs.core/Reduced";
+
+cljs.core.Reduced.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Reduced");
+});
+
+/**
+ * Positional factory function for cljs.core/Reduced.
+ */
+cljs.core.__GT_Reduced = (function cljs$core$__GT_Reduced(val){
+return (new cljs.core.Reduced(val));
+});
+
+/**
+ * Wraps x in a way such that a reduce will terminate with the value x
+ */
+cljs.core.reduced = (function cljs$core$reduced(x){
+return (new cljs.core.Reduced(x));
+});
+/**
+ * Returns true if x is the result of a call to reduced
+ */
+cljs.core.reduced_QMARK_ = (function cljs$core$reduced_QMARK_(r){
+return (r instanceof cljs.core.Reduced);
+});
+/**
+ * If x is already reduced?, returns it, else returns (reduced x)
+ */
+cljs.core.ensure_reduced = (function cljs$core$ensure_reduced(x){
+if(cljs.core.reduced_QMARK_(x)){
+return x;
+} else {
+return cljs.core.reduced(x);
+}
+});
+/**
+ * If x is reduced?, returns (deref x), else returns x
+ */
+cljs.core.unreduced = (function cljs$core$unreduced(x){
+if(cljs.core.reduced_QMARK_(x)){
+return cljs.core.deref(x);
+} else {
+return x;
+}
+});
+/**
+ * Also reader macro: @var/@atom/@delay. Returns the
+ * most-recently-committed value of ref. When applied to a var
+ * or atom, returns its current state. When applied to a delay, forces
+ * it if not already forced. See also - realized?.
+ */
+cljs.core.deref = (function cljs$core$deref(o){
+return cljs.core._deref(o);
+});
+/**
+ * Accepts any collection which satisfies the ICount and IIndexed protocols and
+ * reduces them without incurring seq initialization
+ */
+cljs.core.ci_reduce = (function cljs$core$ci_reduce(var_args){
+var G__10245 = arguments.length;
+switch (G__10245) {
+case 2:
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2 = (function (cicoll,f){
+var cnt = cljs.core._count(cicoll);
+if((cnt === (0))){
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+} else {
+var val = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(cicoll,(0));
+var n = (1);
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__10246 = val;
+var G__10247 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(cicoll,n);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10246,G__10247) : f.call(null,G__10246,G__10247));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__10253 = nval;
+var G__10254 = (n + (1));
+val = G__10253;
+n = G__10254;
+continue;
+}
+} else {
+return val;
+}
+break;
+}
+}
+});
+
+cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3 = (function (cicoll,f,val){
+var cnt = cljs.core._count(cicoll);
+var val__$1 = val;
+var n = (0);
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__10248 = val__$1;
+var G__10249 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(cicoll,n);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10248,G__10249) : f.call(null,G__10248,G__10249));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__10255 = nval;
+var G__10256 = (n + (1));
+val__$1 = G__10255;
+n = G__10256;
+continue;
+}
+} else {
+return val__$1;
+}
+break;
+}
+});
+
+cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$4 = (function (cicoll,f,val,idx){
+var cnt = cljs.core._count(cicoll);
+var val__$1 = val;
+var n = idx;
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__10250 = val__$1;
+var G__10251 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(cicoll,n);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10250,G__10251) : f.call(null,G__10250,G__10251));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__10257 = nval;
+var G__10258 = (n + (1));
+val__$1 = G__10257;
+n = G__10258;
+continue;
+}
+} else {
+return val__$1;
+}
+break;
+}
+});
+
+cljs.core.ci_reduce.cljs$lang$maxFixedArity = 4;
+
+cljs.core.array_reduce = (function cljs$core$array_reduce(var_args){
+var G__10260 = arguments.length;
+switch (G__10260) {
+case 2:
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$2 = (function (arr,f){
+var cnt = arr.length;
+if((arr.length === (0))){
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+} else {
+var val = (arr[(0)]);
+var n = (1);
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__10261 = val;
+var G__10262 = (arr[n]);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10261,G__10262) : f.call(null,G__10261,G__10262));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__10268 = nval;
+var G__10269 = (n + (1));
+val = G__10268;
+n = G__10269;
+continue;
+}
+} else {
+return val;
+}
+break;
+}
+}
+});
+
+cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$3 = (function (arr,f,val){
+var cnt = arr.length;
+var val__$1 = val;
+var n = (0);
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__10263 = val__$1;
+var G__10264 = (arr[n]);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10263,G__10264) : f.call(null,G__10263,G__10264));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__10270 = nval;
+var G__10271 = (n + (1));
+val__$1 = G__10270;
+n = G__10271;
+continue;
+}
+} else {
+return val__$1;
+}
+break;
+}
+});
+
+cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4 = (function (arr,f,val,idx){
+var cnt = arr.length;
+var val__$1 = val;
+var n = idx;
+while(true){
+if((n < cnt)){
+var nval = (function (){var G__10265 = val__$1;
+var G__10266 = (arr[n]);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10265,G__10266) : f.call(null,G__10265,G__10266));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__10272 = nval;
+var G__10273 = (n + (1));
+val__$1 = G__10272;
+n = G__10273;
+continue;
+}
+} else {
+return val__$1;
+}
+break;
+}
+});
+
+cljs.core.array_reduce.cljs$lang$maxFixedArity = 4;
+
+
+
+
+
+
+
+/**
+ * Returns true if coll implements count in constant time
+ */
+cljs.core.counted_QMARK_ = (function cljs$core$counted_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (2))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$ICounted$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICounted,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICounted,x);
+}
+});
+/**
+ * Returns true if coll implements nth in constant time
+ */
+cljs.core.indexed_QMARK_ = (function cljs$core$indexed_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (16))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IIndexed$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IIndexed,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IIndexed,x);
+}
+});
+cljs.core._indexOf = (function cljs$core$_indexOf(var_args){
+var G__10277 = arguments.length;
+switch (G__10277) {
+case 2:
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core._indexOf.cljs$core$IFn$_invoke$arity$2 = (function (coll,x){
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+
+cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3 = (function (coll,x,start){
+var len = cljs.core.count(coll);
+if((start >= len)){
+return (-1);
+} else {
+var idx = (((start > (0)))?start:(((start < (0)))?(function (){var x__8162__auto__ = (0);
+var y__8163__auto__ = (start + len);
+return ((x__8162__auto__ > y__8163__auto__) ? x__8162__auto__ : y__8163__auto__);
+})():start
+));
+while(true){
+if((idx < len)){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.nth.cljs$core$IFn$_invoke$arity$2(coll,idx),x)){
+return idx;
+} else {
+var G__10279 = (idx + (1));
+idx = G__10279;
+continue;
+}
+} else {
+return (-1);
+}
+break;
+}
+}
+});
+
+cljs.core._indexOf.cljs$lang$maxFixedArity = 3;
+
+cljs.core._lastIndexOf = (function cljs$core$_lastIndexOf(var_args){
+var G__10281 = arguments.length;
+switch (G__10281) {
+case 2:
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$2 = (function (coll,x){
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+
+cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3 = (function (coll,x,start){
+var len = cljs.core.count(coll);
+if((len === (0))){
+return (-1);
+} else {
+var idx = (((start > (0)))?(function (){var x__8169__auto__ = (len - (1));
+var y__8170__auto__ = start;
+return ((x__8169__auto__ < y__8170__auto__) ? x__8169__auto__ : y__8170__auto__);
+})():(((start < (0)))?(len + start):start
+));
+while(true){
+if((idx >= (0))){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.nth.cljs$core$IFn$_invoke$arity$2(coll,idx),x)){
+return idx;
+} else {
+var G__10283 = (idx - (1));
+idx = G__10283;
+continue;
+}
+} else {
+return (-1);
+}
+break;
+}
+}
+});
+
+cljs.core._lastIndexOf.cljs$lang$maxFixedArity = 3;
+
+
+/**
+* @constructor
+*/
+cljs.core.IndexedSeqIterator = (function (arr,i){
+this.arr = arr;
+this.i = i;
+});
+cljs.core.IndexedSeqIterator.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return (self__.i < self__.arr.length);
+});
+
+cljs.core.IndexedSeqIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var ret = (self__.arr[self__.i]);
+self__.i = (self__.i + (1));
+
+return ret;
+});
+
+cljs.core.IndexedSeqIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.IndexedSeqIterator.cljs$lang$type = true;
+
+cljs.core.IndexedSeqIterator.cljs$lang$ctorStr = "cljs.core/IndexedSeqIterator";
+
+cljs.core.IndexedSeqIterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/IndexedSeqIterator");
+});
+
+/**
+ * Positional factory function for cljs.core/IndexedSeqIterator.
+ */
+cljs.core.__GT_IndexedSeqIterator = (function cljs$core$__GT_IndexedSeqIterator(arr,i){
+return (new cljs.core.IndexedSeqIterator(arr,i));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ASeq}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.IndexedSeq = (function (arr,i,meta){
+this.arr = arr;
+this.i = i;
+this.meta = meta;
+this.cljs$lang$protocol_mask$partition0$ = 166592766;
+this.cljs$lang$protocol_mask$partition1$ = 139264;
+});
+cljs.core.IndexedSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.IndexedSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.IndexedSeq.prototype.indexOf = (function() {
+var G__10284 = null;
+var G__10284__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10284__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10284 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10284__1.call(this,x);
+case 2:
+return G__10284__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10284.cljs$core$IFn$_invoke$arity$1 = G__10284__1;
+G__10284.cljs$core$IFn$_invoke$arity$2 = G__10284__2;
+return G__10284;
+})()
+;
+
+cljs.core.IndexedSeq.prototype.lastIndexOf = (function() {
+var G__10285 = null;
+var G__10285__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10285__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10285 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10285__1.call(this,x);
+case 2:
+return G__10285__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10285.cljs$core$IFn$_invoke$arity$1 = G__10285__1;
+G__10285.cljs$core$IFn$_invoke$arity$2 = G__10285__2;
+return G__10285;
+})()
+;
+
+cljs.core.IndexedSeq.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (coll,n){
+var self__ = this;
+var coll__$1 = this;
+var i__$1 = (n + self__.i);
+if(((((0) <= i__$1)) && ((i__$1 < self__.arr.length)))){
+return (self__.arr[i__$1]);
+} else {
+throw (new Error("Index out of bounds"));
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (coll,n,not_found){
+var self__ = this;
+var coll__$1 = this;
+var i__$1 = (n + self__.i);
+if(((((0) <= i__$1)) && ((i__$1 < self__.arr.length)))){
+return (self__.arr[i__$1]);
+} else {
+return not_found;
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.IndexedSeqIterator(self__.arr,self__.i));
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.IndexedSeq(self__.arr,self__.i,self__.meta));
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$INext$_next$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+if(((self__.i + (1)) < self__.arr.length)){
+return (new cljs.core.IndexedSeq(self__.arr,(self__.i + (1)),null));
+} else {
+return null;
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ICounted$_count$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+var x__8162__auto__ = (0);
+var y__8163__auto__ = (self__.arr.length - self__.i);
+return ((x__8162__auto__ > y__8163__auto__) ? x__8162__auto__ : y__8163__auto__);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var c = coll__$1.cljs$core$ICounted$_count$arity$1(null);
+if((c > (0))){
+return (new cljs.core.RSeq(coll__$1,(c - (1)),null));
+} else {
+return null;
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.hash_ordered_coll(coll__$1);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.List.EMPTY;
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4(self__.arr,f,(self__.arr[self__.i]),(self__.i + (1)));
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4(self__.arr,f,start,self__.i);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (self__.arr[self__.i]);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+if(((self__.i + (1)) < self__.arr.length)){
+return (new cljs.core.IndexedSeq(self__.arr,(self__.i + (1)),null));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+if((self__.i < self__.arr.length)){
+return this$__$1;
+} else {
+return null;
+}
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,new_meta){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.IndexedSeq(self__.arr,self__.i,new_meta));
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.IndexedSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null)], null);
+});
+
+cljs.core.IndexedSeq.cljs$lang$type = true;
+
+cljs.core.IndexedSeq.cljs$lang$ctorStr = "cljs.core/IndexedSeq";
+
+cljs.core.IndexedSeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/IndexedSeq");
+});
+
+/**
+ * Positional factory function for cljs.core/IndexedSeq.
+ */
+cljs.core.__GT_IndexedSeq = (function cljs$core$__GT_IndexedSeq(arr,i,meta){
+return (new cljs.core.IndexedSeq(arr,i,meta));
+});
+
+var G__10286_10289 = cljs.core.IndexedSeq.prototype;
+var G__10287_10290 = cljs.core.ITER_SYMBOL;
+var G__10288_10291 = ((function (G__10286_10289,G__10287_10290){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__10286_10289,G__10287_10290))
+;
+goog.object.set(G__10286_10289,G__10287_10290,G__10288_10291);
+/**
+ * Create seq from a primitive JavaScript Array-like.
+ */
+cljs.core.prim_seq = (function cljs$core$prim_seq(var_args){
+var G__10293 = arguments.length;
+switch (G__10293) {
+case 1:
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$1 = (function (prim){
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(prim,(0));
+});
+
+cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2 = (function (prim,i){
+if((i < prim.length)){
+return (new cljs.core.IndexedSeq(prim,i,null));
+} else {
+return null;
+}
+});
+
+cljs.core.prim_seq.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Create a seq from a JavaScript array.
+ */
+cljs.core.array_seq = (function cljs$core$array_seq(var_args){
+var G__10296 = arguments.length;
+switch (G__10296) {
+case 1:
+return cljs.core.array_seq.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.array_seq.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.array_seq.cljs$core$IFn$_invoke$arity$1 = (function (array){
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(array,(0));
+});
+
+cljs.core.array_seq.cljs$core$IFn$_invoke$arity$2 = (function (array,i){
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(array,i);
+});
+
+cljs.core.array_seq.cljs$lang$maxFixedArity = 2;
+
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.RSeq = (function (ci,i,meta){
+this.ci = ci;
+this.i = i;
+this.meta = meta;
+this.cljs$lang$protocol_mask$partition0$ = 32374990;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+});
+cljs.core.RSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.RSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.RSeq.prototype.indexOf = (function() {
+var G__10298 = null;
+var G__10298__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10298__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10298 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10298__1.call(this,x);
+case 2:
+return G__10298__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10298.cljs$core$IFn$_invoke$arity$1 = G__10298__1;
+G__10298.cljs$core$IFn$_invoke$arity$2 = G__10298__2;
+return G__10298;
+})()
+;
+
+cljs.core.RSeq.prototype.lastIndexOf = (function() {
+var G__10299 = null;
+var G__10299__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10299__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10299 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10299__1.call(this,x);
+case 2:
+return G__10299__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10299.cljs$core$IFn$_invoke$arity$1 = G__10299__1;
+G__10299.cljs$core$IFn$_invoke$arity$2 = G__10299__2;
+return G__10299;
+})()
+;
+
+cljs.core.RSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.RSeq.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.RSeq(self__.ci,self__.i,self__.meta));
+});
+
+cljs.core.RSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.i > (0))){
+return (new cljs.core.RSeq(self__.ci,(self__.i - (1)),null));
+} else {
+return null;
+}
+});
+
+cljs.core.RSeq.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (self__.i + (1));
+});
+
+cljs.core.RSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.hash_ordered_coll(coll__$1);
+});
+
+cljs.core.RSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.RSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.RSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (col,f){
+var self__ = this;
+var col__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,col__$1);
+});
+
+cljs.core.RSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (col,f,start){
+var self__ = this;
+var col__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,col__$1);
+});
+
+cljs.core.RSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.ci,self__.i);
+});
+
+cljs.core.RSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.i > (0))){
+return (new cljs.core.RSeq(self__.ci,(self__.i - (1)),null));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.RSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.RSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,new_meta){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.RSeq(self__.ci,self__.i,new_meta));
+});
+
+cljs.core.RSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.RSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"ci","ci",2049808339,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null)], null);
+});
+
+cljs.core.RSeq.cljs$lang$type = true;
+
+cljs.core.RSeq.cljs$lang$ctorStr = "cljs.core/RSeq";
+
+cljs.core.RSeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/RSeq");
+});
+
+/**
+ * Positional factory function for cljs.core/RSeq.
+ */
+cljs.core.__GT_RSeq = (function cljs$core$__GT_RSeq(ci,i,meta){
+return (new cljs.core.RSeq(ci,i,meta));
+});
+
+var G__10300_10303 = cljs.core.RSeq.prototype;
+var G__10301_10304 = cljs.core.ITER_SYMBOL;
+var G__10302_10305 = ((function (G__10300_10303,G__10301_10304){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__10300_10303,G__10301_10304))
+;
+goog.object.set(G__10300_10303,G__10301_10304,G__10302_10305);
+/**
+ * Same as (first (next x))
+ */
+cljs.core.second = (function cljs$core$second(coll){
+return cljs.core.first(cljs.core.next(coll));
+});
+/**
+ * Same as (first (first x))
+ */
+cljs.core.ffirst = (function cljs$core$ffirst(coll){
+return cljs.core.first(cljs.core.first(coll));
+});
+/**
+ * Same as (next (first x))
+ */
+cljs.core.nfirst = (function cljs$core$nfirst(coll){
+return cljs.core.next(cljs.core.first(coll));
+});
+/**
+ * Same as (first (next x))
+ */
+cljs.core.fnext = (function cljs$core$fnext(coll){
+return cljs.core.first(cljs.core.next(coll));
+});
+/**
+ * Same as (next (next x))
+ */
+cljs.core.nnext = (function cljs$core$nnext(coll){
+return cljs.core.next(cljs.core.next(coll));
+});
+/**
+ * Return the last item in coll, in linear time
+ */
+cljs.core.last = (function cljs$core$last(s){
+while(true){
+var sn = cljs.core.next(s);
+if((!((sn == null)))){
+var G__10306 = sn;
+s = G__10306;
+continue;
+} else {
+return cljs.core.first(s);
+}
+break;
+}
+});
+goog.object.set(cljs.core.IEquiv,"_",true);
+
+var G__10307_10310 = cljs.core._equiv;
+var G__10308_10311 = "_";
+var G__10309_10312 = ((function (G__10307_10310,G__10308_10311){
+return (function (x,o){
+return (x === o);
+});})(G__10307_10310,G__10308_10311))
+;
+goog.object.set(G__10307_10310,G__10308_10311,G__10309_10312);
+/**
+ * conj[oin]. Returns a new collection with the xs
+ * 'added'. (conj nil item) returns (item). The 'addition' may
+ * happen at different 'places' depending on the concrete type.
+ */
+cljs.core.conj = (function cljs$core$conj(var_args){
+var G__10317 = arguments.length;
+switch (G__10317) {
+case 0:
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10319 = arguments.length;
+var i__9001__auto___10320 = (0);
+while(true){
+if((i__9001__auto___10320 < len__9000__auto___10319)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10320]));
+
+var G__10321 = (i__9001__auto___10320 + (1));
+i__9001__auto___10320 = G__10321;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.conj.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.PersistentVector.EMPTY;
+});
+
+cljs.core.conj.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+return coll;
+});
+
+cljs.core.conj.cljs$core$IFn$_invoke$arity$2 = (function (coll,x){
+if((!((coll == null)))){
+return cljs.core._conj(coll,x);
+} else {
+return (new cljs.core.List(null,x,null,(1),null));
+}
+});
+
+cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic = (function (coll,x,xs){
+while(true){
+if(cljs.core.truth_(xs)){
+var G__10322 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(coll,x);
+var G__10323 = cljs.core.first(xs);
+var G__10324 = cljs.core.next(xs);
+coll = G__10322;
+x = G__10323;
+xs = G__10324;
+continue;
+} else {
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(coll,x);
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core.conj.cljs$lang$applyTo = (function (seq10314){
+var G__10315 = cljs.core.first(seq10314);
+var seq10314__$1 = cljs.core.next(seq10314);
+var G__10316 = cljs.core.first(seq10314__$1);
+var seq10314__$2 = cljs.core.next(seq10314__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10315,G__10316,seq10314__$2);
+});
+
+cljs.core.conj.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns an empty collection of the same category as coll, or nil
+ */
+cljs.core.empty = (function cljs$core$empty(coll){
+if((coll == null)){
+return null;
+} else {
+return cljs.core._empty(coll);
+}
+});
+cljs.core.accumulating_seq_count = (function cljs$core$accumulating_seq_count(coll){
+var s = cljs.core.seq(coll);
+var acc = (0);
+while(true){
+if(cljs.core.counted_QMARK_(s)){
+return (acc + cljs.core._count(s));
+} else {
+var G__10325 = cljs.core.next(s);
+var G__10326 = (acc + (1));
+s = G__10325;
+acc = G__10326;
+continue;
+}
+break;
+}
+});
+/**
+ * Returns the number of items in the collection. (count nil) returns
+ * 0. Also works on strings, arrays, and Maps
+ */
+cljs.core.count = (function cljs$core$count(coll){
+if((!((coll == null)))){
+if((((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (2))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ICounted$))))?true:false):false)){
+return coll.cljs$core$ICounted$_count$arity$1(null);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+return coll.length;
+} else {
+if(typeof coll === 'string'){
+return coll.length;
+} else {
+if((((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (8388608))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeqable$))))?true:false):false)){
+return cljs.core.accumulating_seq_count(coll);
+} else {
+return cljs.core._count(coll);
+
+}
+}
+}
+}
+} else {
+return (0);
+}
+});
+cljs.core.linear_traversal_nth = (function cljs$core$linear_traversal_nth(var_args){
+var G__10330 = arguments.length;
+switch (G__10330) {
+case 2:
+return cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$2 = (function (coll,n){
+while(true){
+if((coll == null)){
+throw (new Error("Index out of bounds"));
+} else {
+if((n === (0))){
+if(cljs.core.seq(coll)){
+return cljs.core.first(coll);
+} else {
+throw (new Error("Index out of bounds"));
+}
+} else {
+if(cljs.core.indexed_QMARK_(coll)){
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(coll,n);
+} else {
+if(cljs.core.seq(coll)){
+var G__10332 = cljs.core.next(coll);
+var G__10333 = (n - (1));
+coll = G__10332;
+n = G__10333;
+continue;
+} else {
+throw (new Error("Index out of bounds"));
+
+}
+}
+}
+}
+break;
+}
+});
+
+cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$3 = (function (coll,n,not_found){
+while(true){
+if((coll == null)){
+return not_found;
+} else {
+if((n === (0))){
+if(cljs.core.seq(coll)){
+return cljs.core.first(coll);
+} else {
+return not_found;
+}
+} else {
+if(cljs.core.indexed_QMARK_(coll)){
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$3(coll,n,not_found);
+} else {
+if(cljs.core.seq(coll)){
+var G__10334 = cljs.core.next(coll);
+var G__10335 = (n - (1));
+var G__10336 = not_found;
+coll = G__10334;
+n = G__10335;
+not_found = G__10336;
+continue;
+} else {
+return not_found;
+
+}
+}
+}
+}
+break;
+}
+});
+
+cljs.core.linear_traversal_nth.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns the value at the index. get returns nil if index out of
+ * bounds, nth throws an exception unless not-found is supplied. nth
+ * also works for strings, arrays, regex Matchers and Lists, and,
+ * in O(n) time, for sequences.
+ */
+cljs.core.nth = (function cljs$core$nth(var_args){
+var G__10338 = arguments.length;
+switch (G__10338) {
+case 2:
+return cljs.core.nth.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.nth.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.nth.cljs$core$IFn$_invoke$arity$2 = (function (coll,n){
+if((!(typeof n === 'number'))){
+throw (new Error("Index argument to nth must be a number"));
+} else {
+if((coll == null)){
+return coll;
+} else {
+if((((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (16))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$IIndexed$))))?true:false):false)){
+return coll.cljs$core$IIndexed$_nth$arity$2(null,n);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+if((((n >= (0))) && ((n < coll.length)))){
+return (coll[n]);
+} else {
+throw (new Error("Index out of bounds"));
+}
+} else {
+if(typeof coll === 'string'){
+if((((n >= (0))) && ((n < coll.length)))){
+return coll.charAt(n);
+} else {
+throw (new Error("Index out of bounds"));
+}
+} else {
+if((function (){var or__7806__auto__ = (((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeq$))))?true:false):false);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+if((!((coll == null)))){
+if((((coll.cljs$lang$protocol_mask$partition0$ & (16777216))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISequential$)))){
+return true;
+} else {
+return false;
+}
+} else {
+return false;
+}
+}
+})()){
+if((n < (0))){
+throw (new Error("Index out of bounds"));
+} else {
+return cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$2(coll,n);
+}
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.IIndexed,coll)){
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(coll,n);
+} else {
+throw (new Error(["nth not supported on this type ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.type__GT_str(cljs.core.type(coll)))].join('')));
+
+}
+}
+}
+}
+}
+}
+}
+});
+
+cljs.core.nth.cljs$core$IFn$_invoke$arity$3 = (function (coll,n,not_found){
+if((!(typeof n === 'number'))){
+throw (new Error("Index argument to nth must be a number."));
+} else {
+if((coll == null)){
+return not_found;
+} else {
+if((((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (16))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$IIndexed$))))?true:false):false)){
+return coll.cljs$core$IIndexed$_nth$arity$3(null,n,not_found);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+if((((n >= (0))) && ((n < coll.length)))){
+return (coll[n]);
+} else {
+return not_found;
+}
+} else {
+if(typeof coll === 'string'){
+if((((n >= (0))) && ((n < coll.length)))){
+return coll.charAt(n);
+} else {
+return not_found;
+}
+} else {
+if((function (){var or__7806__auto__ = (((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeq$))))?true:false):false);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+if((!((coll == null)))){
+if((((coll.cljs$lang$protocol_mask$partition0$ & (16777216))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISequential$)))){
+return true;
+} else {
+return false;
+}
+} else {
+return false;
+}
+}
+})()){
+if((n < (0))){
+return not_found;
+} else {
+return cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$3(coll,n,not_found);
+}
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.IIndexed,coll)){
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$3(coll,n,not_found);
+} else {
+throw (new Error(["nth not supported on this type ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.type__GT_str(cljs.core.type(coll)))].join('')));
+
+}
+}
+}
+}
+}
+}
+}
+});
+
+cljs.core.nth.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns the nth rest of coll, coll when n is 0.
+ */
+cljs.core.nthrest = (function cljs$core$nthrest(coll,n){
+var n__$1 = n;
+var xs = coll;
+while(true){
+var temp__4655__auto__ = (((n__$1 > (0))) && (cljs.core.seq(xs)));
+if(temp__4655__auto__){
+var xs__$1 = temp__4655__auto__;
+var G__10348 = (n__$1 - (1));
+var G__10349 = cljs.core.rest(xs__$1);
+n__$1 = G__10348;
+xs = G__10349;
+continue;
+} else {
+return xs;
+}
+break;
+}
+});
+/**
+ * Returns the value mapped to key, not-found or nil if key not present.
+ */
+cljs.core.get = (function cljs$core$get(var_args){
+var G__10351 = arguments.length;
+switch (G__10351) {
+case 2:
+return cljs.core.get.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.get.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.get.cljs$core$IFn$_invoke$arity$2 = (function (o,k){
+if((o == null)){
+return null;
+} else {
+if((((!((o == null))))?(((((o.cljs$lang$protocol_mask$partition0$ & (256))) || ((cljs.core.PROTOCOL_SENTINEL === o.cljs$core$ILookup$))))?true:false):false)){
+return o.cljs$core$ILookup$_lookup$arity$2(null,k);
+} else {
+if(cljs.core.array_QMARK_(o)){
+if((((!((k == null)))) && ((k < o.length)))){
+return (o[(k | (0))]);
+} else {
+return null;
+}
+} else {
+if(typeof o === 'string'){
+if((((!((k == null)))) && ((k < o.length)))){
+return o.charAt((k | (0)));
+} else {
+return null;
+}
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.ILookup,o)){
+return cljs.core._lookup.cljs$core$IFn$_invoke$arity$2(o,k);
+} else {
+return null;
+
+}
+}
+}
+}
+}
+});
+
+cljs.core.get.cljs$core$IFn$_invoke$arity$3 = (function (o,k,not_found){
+if((!((o == null)))){
+if((((!((o == null))))?(((((o.cljs$lang$protocol_mask$partition0$ & (256))) || ((cljs.core.PROTOCOL_SENTINEL === o.cljs$core$ILookup$))))?true:false):false)){
+return o.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+} else {
+if(cljs.core.array_QMARK_(o)){
+if((((!((k == null)))) && ((k >= (0))) && ((k < o.length)))){
+return (o[(k | (0))]);
+} else {
+return not_found;
+}
+} else {
+if(typeof o === 'string'){
+if((((!((k == null)))) && ((k >= (0))) && ((k < o.length)))){
+return o.charAt((k | (0)));
+} else {
+return not_found;
+}
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.ILookup,o)){
+return cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(o,k,not_found);
+} else {
+return not_found;
+
+}
+}
+}
+}
+} else {
+return not_found;
+}
+});
+
+cljs.core.get.cljs$lang$maxFixedArity = 3;
+
+
+
+/**
+ * assoc[iate]. When applied to a map, returns a new map of the
+ * same (hashed/sorted) type, that contains the mapping of key(s) to
+ * val(s). When applied to a vector, returns a new vector that
+ * contains val at index.
+ */
+cljs.core.assoc = (function cljs$core$assoc(var_args){
+var G__10360 = arguments.length;
+switch (G__10360) {
+case 3:
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10362 = arguments.length;
+var i__9001__auto___10363 = (0);
+while(true){
+if((i__9001__auto___10363 < len__9000__auto___10362)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10363]));
+
+var G__10364 = (i__9001__auto___10363 + (1));
+i__9001__auto___10363 = G__10364;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.assoc.cljs$core$IFn$_invoke$arity$3 = (function (coll,k,v){
+if((!((coll == null)))){
+return cljs.core._assoc(coll,k,v);
+} else {
+return cljs.core.PersistentArrayMap.createAsIfByAssoc([k,v]);
+}
+});
+
+cljs.core.assoc.cljs$core$IFn$_invoke$arity$variadic = (function (coll,k,v,kvs){
+while(true){
+var ret = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(coll,k,v);
+if(cljs.core.truth_(kvs)){
+var G__10365 = ret;
+var G__10366 = cljs.core.first(kvs);
+var G__10367 = cljs.core.second(kvs);
+var G__10368 = cljs.core.nnext(kvs);
+coll = G__10365;
+k = G__10366;
+v = G__10367;
+kvs = G__10368;
+continue;
+} else {
+return ret;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core.assoc.cljs$lang$applyTo = (function (seq10356){
+var G__10357 = cljs.core.first(seq10356);
+var seq10356__$1 = cljs.core.next(seq10356);
+var G__10358 = cljs.core.first(seq10356__$1);
+var seq10356__$2 = cljs.core.next(seq10356__$1);
+var G__10359 = cljs.core.first(seq10356__$2);
+var seq10356__$3 = cljs.core.next(seq10356__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10357,G__10358,G__10359,seq10356__$3);
+});
+
+cljs.core.assoc.cljs$lang$maxFixedArity = (3);
+
+/**
+ * dissoc[iate]. Returns a new map of the same (hashed/sorted) type,
+ * that does not contain a mapping for key(s).
+ */
+cljs.core.dissoc = (function cljs$core$dissoc(var_args){
+var G__10373 = arguments.length;
+switch (G__10373) {
+case 1:
+return cljs.core.dissoc.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10375 = arguments.length;
+var i__9001__auto___10376 = (0);
+while(true){
+if((i__9001__auto___10376 < len__9000__auto___10375)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10376]));
+
+var G__10377 = (i__9001__auto___10376 + (1));
+i__9001__auto___10376 = G__10377;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.dissoc.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.dissoc.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+return coll;
+});
+
+cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2 = (function (coll,k){
+if((coll == null)){
+return null;
+} else {
+return cljs.core._dissoc(coll,k);
+}
+});
+
+cljs.core.dissoc.cljs$core$IFn$_invoke$arity$variadic = (function (coll,k,ks){
+while(true){
+if((coll == null)){
+return null;
+} else {
+var ret = cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2(coll,k);
+if(cljs.core.truth_(ks)){
+var G__10378 = ret;
+var G__10379 = cljs.core.first(ks);
+var G__10380 = cljs.core.next(ks);
+coll = G__10378;
+k = G__10379;
+ks = G__10380;
+continue;
+} else {
+return ret;
+}
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core.dissoc.cljs$lang$applyTo = (function (seq10370){
+var G__10371 = cljs.core.first(seq10370);
+var seq10370__$1 = cljs.core.next(seq10370);
+var G__10372 = cljs.core.first(seq10370__$1);
+var seq10370__$2 = cljs.core.next(seq10370__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10371,G__10372,seq10370__$2);
+});
+
+cljs.core.dissoc.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Return true if f is a JavaScript function or satisfies the Fn protocol.
+ */
+cljs.core.fn_QMARK_ = (function cljs$core$fn_QMARK_(f){
+var or__7806__auto__ = goog.isFunction(f);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+if((!((f == null)))){
+if(((false) || ((cljs.core.PROTOCOL_SENTINEL === f.cljs$core$Fn$)))){
+return true;
+} else {
+if((!f.cljs$lang$protocol_mask$partition$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.Fn,f);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.Fn,f);
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.Fn}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.MetaFn = (function (afn,meta){
+this.afn = afn;
+this.meta = meta;
+this.cljs$lang$protocol_mask$partition0$ = 393217;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.MetaFn.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.meta;
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_,new_meta){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.MetaFn(self__.afn,new_meta));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$Fn$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.MetaFn.prototype.call = (function() {
+var G__10384 = null;
+var G__10384__1 = (function (self__){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$0 ? self__.afn.cljs$core$IFn$_invoke$arity$0() : self__.afn.call(null));
+});
+var G__10384__2 = (function (self__,a){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$1 ? self__.afn.cljs$core$IFn$_invoke$arity$1(a) : self__.afn.call(null,a));
+});
+var G__10384__3 = (function (self__,a,b){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$2 ? self__.afn.cljs$core$IFn$_invoke$arity$2(a,b) : self__.afn.call(null,a,b));
+});
+var G__10384__4 = (function (self__,a,b,c){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$3 ? self__.afn.cljs$core$IFn$_invoke$arity$3(a,b,c) : self__.afn.call(null,a,b,c));
+});
+var G__10384__5 = (function (self__,a,b,c,d){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$4 ? self__.afn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : self__.afn.call(null,a,b,c,d));
+});
+var G__10384__6 = (function (self__,a,b,c,d,e){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$5 ? self__.afn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : self__.afn.call(null,a,b,c,d,e));
+});
+var G__10384__7 = (function (self__,a,b,c,d,e,f){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$6 ? self__.afn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : self__.afn.call(null,a,b,c,d,e,f));
+});
+var G__10384__8 = (function (self__,a,b,c,d,e,f,g){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$7 ? self__.afn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : self__.afn.call(null,a,b,c,d,e,f,g));
+});
+var G__10384__9 = (function (self__,a,b,c,d,e,f,g,h){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$8 ? self__.afn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : self__.afn.call(null,a,b,c,d,e,f,g,h));
+});
+var G__10384__10 = (function (self__,a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$9 ? self__.afn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : self__.afn.call(null,a,b,c,d,e,f,g,h,i));
+});
+var G__10384__11 = (function (self__,a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$10 ? self__.afn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j));
+});
+var G__10384__12 = (function (self__,a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$11 ? self__.afn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+});
+var G__10384__13 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$12 ? self__.afn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+});
+var G__10384__14 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$13 ? self__.afn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+});
+var G__10384__15 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$14 ? self__.afn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+});
+var G__10384__16 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$15 ? self__.afn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+});
+var G__10384__17 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$16 ? self__.afn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+});
+var G__10384__18 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$17 ? self__.afn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+});
+var G__10384__19 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$18 ? self__.afn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+});
+var G__10384__20 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$19 ? self__.afn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+});
+var G__10384__21 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return (self__.afn.cljs$core$IFn$_invoke$arity$20 ? self__.afn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+});
+var G__10384__22 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var self____$1 = this;
+var _ = self____$1;
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(self__.afn,a,b,c,d,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+});
+G__10384 = function(self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+switch(arguments.length){
+case 1:
+return G__10384__1.call(this,self__);
+case 2:
+return G__10384__2.call(this,self__,a);
+case 3:
+return G__10384__3.call(this,self__,a,b);
+case 4:
+return G__10384__4.call(this,self__,a,b,c);
+case 5:
+return G__10384__5.call(this,self__,a,b,c,d);
+case 6:
+return G__10384__6.call(this,self__,a,b,c,d,e);
+case 7:
+return G__10384__7.call(this,self__,a,b,c,d,e,f);
+case 8:
+return G__10384__8.call(this,self__,a,b,c,d,e,f,g);
+case 9:
+return G__10384__9.call(this,self__,a,b,c,d,e,f,g,h);
+case 10:
+return G__10384__10.call(this,self__,a,b,c,d,e,f,g,h,i);
+case 11:
+return G__10384__11.call(this,self__,a,b,c,d,e,f,g,h,i,j);
+case 12:
+return G__10384__12.call(this,self__,a,b,c,d,e,f,g,h,i,j,k);
+case 13:
+return G__10384__13.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l);
+case 14:
+return G__10384__14.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m);
+case 15:
+return G__10384__15.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
+case 16:
+return G__10384__16.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o);
+case 17:
+return G__10384__17.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+case 18:
+return G__10384__18.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
+case 19:
+return G__10384__19.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r);
+case 20:
+return G__10384__20.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);
+case 21:
+return G__10384__21.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t);
+case 22:
+return G__10384__22.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__10384.cljs$core$IFn$_invoke$arity$1 = G__10384__1;
+G__10384.cljs$core$IFn$_invoke$arity$2 = G__10384__2;
+G__10384.cljs$core$IFn$_invoke$arity$3 = G__10384__3;
+G__10384.cljs$core$IFn$_invoke$arity$4 = G__10384__4;
+G__10384.cljs$core$IFn$_invoke$arity$5 = G__10384__5;
+G__10384.cljs$core$IFn$_invoke$arity$6 = G__10384__6;
+G__10384.cljs$core$IFn$_invoke$arity$7 = G__10384__7;
+G__10384.cljs$core$IFn$_invoke$arity$8 = G__10384__8;
+G__10384.cljs$core$IFn$_invoke$arity$9 = G__10384__9;
+G__10384.cljs$core$IFn$_invoke$arity$10 = G__10384__10;
+G__10384.cljs$core$IFn$_invoke$arity$11 = G__10384__11;
+G__10384.cljs$core$IFn$_invoke$arity$12 = G__10384__12;
+G__10384.cljs$core$IFn$_invoke$arity$13 = G__10384__13;
+G__10384.cljs$core$IFn$_invoke$arity$14 = G__10384__14;
+G__10384.cljs$core$IFn$_invoke$arity$15 = G__10384__15;
+G__10384.cljs$core$IFn$_invoke$arity$16 = G__10384__16;
+G__10384.cljs$core$IFn$_invoke$arity$17 = G__10384__17;
+G__10384.cljs$core$IFn$_invoke$arity$18 = G__10384__18;
+G__10384.cljs$core$IFn$_invoke$arity$19 = G__10384__19;
+G__10384.cljs$core$IFn$_invoke$arity$20 = G__10384__20;
+G__10384.cljs$core$IFn$_invoke$arity$21 = G__10384__21;
+G__10384.cljs$core$IFn$_invoke$arity$22 = G__10384__22;
+return G__10384;
+})()
+;
+
+cljs.core.MetaFn.prototype.apply = (function (self__,args10383){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args10383)));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$0 = (function (){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$0 ? self__.afn.cljs$core$IFn$_invoke$arity$0() : self__.afn.call(null));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$1 = (function (a){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$1 ? self__.afn.cljs$core$IFn$_invoke$arity$1(a) : self__.afn.call(null,a));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$2 = (function (a,b){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$2 ? self__.afn.cljs$core$IFn$_invoke$arity$2(a,b) : self__.afn.call(null,a,b));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$3 = (function (a,b,c){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$3 ? self__.afn.cljs$core$IFn$_invoke$arity$3(a,b,c) : self__.afn.call(null,a,b,c));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$4 = (function (a,b,c,d){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$4 ? self__.afn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : self__.afn.call(null,a,b,c,d));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$5 = (function (a,b,c,d,e){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$5 ? self__.afn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : self__.afn.call(null,a,b,c,d,e));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$6 = (function (a,b,c,d,e,f){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$6 ? self__.afn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : self__.afn.call(null,a,b,c,d,e,f));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$7 = (function (a,b,c,d,e,f,g){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$7 ? self__.afn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : self__.afn.call(null,a,b,c,d,e,f,g));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$8 = (function (a,b,c,d,e,f,g,h){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$8 ? self__.afn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : self__.afn.call(null,a,b,c,d,e,f,g,h));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$9 = (function (a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$9 ? self__.afn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : self__.afn.call(null,a,b,c,d,e,f,g,h,i));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$10 = (function (a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$10 ? self__.afn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$11 = (function (a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$11 ? self__.afn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$12 = (function (a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$12 ? self__.afn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$13 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$13 ? self__.afn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$14 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$14 ? self__.afn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$15 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$15 ? self__.afn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$16 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$16 ? self__.afn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$17 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$17 ? self__.afn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$18 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$18 ? self__.afn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$19 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$19 ? self__.afn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$20 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var _ = this;
+return (self__.afn.cljs$core$IFn$_invoke$arity$20 ? self__.afn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : self__.afn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+});
+
+cljs.core.MetaFn.prototype.cljs$core$IFn$_invoke$arity$21 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var _ = this;
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(self__.afn,a,b,c,d,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+});
+
+cljs.core.MetaFn.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"afn","afn",216963467,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null)], null);
+});
+
+cljs.core.MetaFn.cljs$lang$type = true;
+
+cljs.core.MetaFn.cljs$lang$ctorStr = "cljs.core/MetaFn";
+
+cljs.core.MetaFn.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/MetaFn");
+});
+
+/**
+ * Positional factory function for cljs.core/MetaFn.
+ */
+cljs.core.__GT_MetaFn = (function cljs$core$__GT_MetaFn(afn,meta){
+return (new cljs.core.MetaFn(afn,meta));
+});
+
+/**
+ * Returns an object of the same type and value as obj, with
+ * map m as its metadata.
+ */
+cljs.core.with_meta = (function cljs$core$with_meta(o,meta){
+if(goog.isFunction(o)){
+return (new cljs.core.MetaFn(o,meta));
+} else {
+if((o == null)){
+return null;
+} else {
+return cljs.core._with_meta(o,meta);
+}
+}
+});
+/**
+ * Returns the metadata of obj, returns nil if there is no metadata.
+ */
+cljs.core.meta = (function cljs$core$meta(o){
+if((function (){var and__7791__auto__ = (!((o == null)));
+if(and__7791__auto__){
+if((!((o == null)))){
+if((((o.cljs$lang$protocol_mask$partition0$ & (131072))) || ((cljs.core.PROTOCOL_SENTINEL === o.cljs$core$IMeta$)))){
+return true;
+} else {
+if((!o.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IMeta,o);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IMeta,o);
+}
+} else {
+return and__7791__auto__;
+}
+})()){
+return cljs.core._meta(o);
+} else {
+return null;
+}
+});
+/**
+ * For a list or queue, same as first, for a vector, same as, but much
+ * more efficient than, last. If the collection is empty, returns nil.
+ */
+cljs.core.peek = (function cljs$core$peek(coll){
+if((coll == null)){
+return null;
+} else {
+return cljs.core._peek(coll);
+}
+});
+/**
+ * For a list or queue, returns a new list/queue without the first
+ * item, for a vector, returns a new vector without the last item.
+ * Note - not the same as next/butlast.
+ */
+cljs.core.pop = (function cljs$core$pop(coll){
+if((coll == null)){
+return null;
+} else {
+return cljs.core._pop(coll);
+}
+});
+/**
+ * disj[oin]. Returns a new set of the same (hashed/sorted) type, that
+ * does not contain key(s).
+ */
+cljs.core.disj = (function cljs$core$disj(var_args){
+var G__10391 = arguments.length;
+switch (G__10391) {
+case 1:
+return cljs.core.disj.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.disj.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10393 = arguments.length;
+var i__9001__auto___10394 = (0);
+while(true){
+if((i__9001__auto___10394 < len__9000__auto___10393)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10394]));
+
+var G__10395 = (i__9001__auto___10394 + (1));
+i__9001__auto___10394 = G__10395;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.disj.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.disj.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+return coll;
+});
+
+cljs.core.disj.cljs$core$IFn$_invoke$arity$2 = (function (coll,k){
+if((coll == null)){
+return null;
+} else {
+return cljs.core._disjoin(coll,k);
+}
+});
+
+cljs.core.disj.cljs$core$IFn$_invoke$arity$variadic = (function (coll,k,ks){
+while(true){
+if((coll == null)){
+return null;
+} else {
+var ret = cljs.core.disj.cljs$core$IFn$_invoke$arity$2(coll,k);
+if(cljs.core.truth_(ks)){
+var G__10396 = ret;
+var G__10397 = cljs.core.first(ks);
+var G__10398 = cljs.core.next(ks);
+coll = G__10396;
+k = G__10397;
+ks = G__10398;
+continue;
+} else {
+return ret;
+}
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core.disj.cljs$lang$applyTo = (function (seq10388){
+var G__10389 = cljs.core.first(seq10388);
+var seq10388__$1 = cljs.core.next(seq10388);
+var G__10390 = cljs.core.first(seq10388__$1);
+var seq10388__$2 = cljs.core.next(seq10388__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10389,G__10390,seq10388__$2);
+});
+
+cljs.core.disj.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns true if coll has no items - same as (not (seq coll)).
+ * Please use the idiom (seq x) rather than (not (empty? x))
+ */
+cljs.core.empty_QMARK_ = (function cljs$core$empty_QMARK_(coll){
+return (((coll == null)) || (cljs.core.not(cljs.core.seq(coll))));
+});
+/**
+ * Returns true if x satisfies ICollection
+ */
+cljs.core.coll_QMARK_ = (function cljs$core$coll_QMARK_(x){
+if((x == null)){
+return false;
+} else {
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (8))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$ICollection$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICollection,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ICollection,x);
+}
+}
+});
+/**
+ * Returns true if x satisfies ISet
+ */
+cljs.core.set_QMARK_ = (function cljs$core$set_QMARK_(x){
+if((x == null)){
+return false;
+} else {
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (4096))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$ISet$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISet,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISet,x);
+}
+}
+});
+/**
+ * Returns true if coll implements IAssociative
+ */
+cljs.core.associative_QMARK_ = (function cljs$core$associative_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (512))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IAssociative$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IAssociative,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IAssociative,x);
+}
+});
+/**
+ * Returns true if coll implements IFind
+ */
+cljs.core.ifind_QMARK_ = (function cljs$core$ifind_QMARK_(x){
+if((!((x == null)))){
+if(((false) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IFind$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IFind,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IFind,x);
+}
+});
+/**
+ * Returns true if coll satisfies ISequential
+ */
+cljs.core.sequential_QMARK_ = (function cljs$core$sequential_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (16777216))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$ISequential$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISequential,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISequential,x);
+}
+});
+/**
+ * Returns true if coll satisfies ISorted
+ */
+cljs.core.sorted_QMARK_ = (function cljs$core$sorted_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (268435456))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$ISorted$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISorted,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISorted,x);
+}
+});
+/**
+ * Returns true if coll satisfies IReduce
+ */
+cljs.core.reduceable_QMARK_ = (function cljs$core$reduceable_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (524288))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IReduce$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IReduce,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IReduce,x);
+}
+});
+/**
+ * Return true if x satisfies IMap
+ */
+cljs.core.map_QMARK_ = (function cljs$core$map_QMARK_(x){
+if((x == null)){
+return false;
+} else {
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (1024))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IMap$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IMap,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IMap,x);
+}
+}
+});
+/**
+ * Return true if x satisfies IRecord
+ */
+cljs.core.record_QMARK_ = (function cljs$core$record_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (67108864))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IRecord$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IRecord,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IRecord,x);
+}
+});
+/**
+ * Return true if x satisfies IVector
+ */
+cljs.core.vector_QMARK_ = (function cljs$core$vector_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (16384))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IVector$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IVector,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IVector,x);
+}
+});
+
+/**
+ * Return true if x is satisfies IChunkedSeq.
+ */
+cljs.core.chunked_seq_QMARK_ = (function cljs$core$chunked_seq_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition1$ & (512))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IChunkedSeq$)))){
+return true;
+} else {
+return false;
+}
+} else {
+return false;
+}
+});
+/**
+ * Create JavaSript object from an even number arguments representing
+ * interleaved keys and values.
+ */
+cljs.core.js_obj = (function cljs$core$js_obj(var_args){
+var G__10412 = arguments.length;
+switch (G__10412) {
+case 0:
+return cljs.core.js_obj.cljs$core$IFn$_invoke$arity$0();
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10416 = arguments.length;
+var i__9001__auto___10417 = (0);
+while(true){
+if((i__9001__auto___10417 < len__9000__auto___10416)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10417]));
+
+var G__10418 = (i__9001__auto___10417 + (1));
+i__9001__auto___10417 = G__10418;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((0)),(0),null));
+return cljs.core.js_obj.cljs$core$IFn$_invoke$arity$variadic(argseq__9026__auto__);
+
+}
+});
+
+cljs.core.js_obj.cljs$core$IFn$_invoke$arity$0 = (function (){
+return {};
+});
+
+cljs.core.js_obj.cljs$core$IFn$_invoke$arity$variadic = (function (keyvals){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$2(goog.object.create,keyvals);
+});
+
+/** @this {Function} */
+cljs.core.js_obj.cljs$lang$applyTo = (function (seq10411){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq10411));
+});
+
+cljs.core.js_obj.cljs$lang$maxFixedArity = (0);
+
+/**
+ * Return the JavaScript keys for an object.
+ */
+cljs.core.js_keys = (function cljs$core$js_keys(obj){
+return goog.object.getKeys(obj);
+});
+/**
+ * Delete a property from a JavaScript object.
+ * Returns true upon success, false otherwise.
+ */
+cljs.core.js_delete = (function cljs$core$js_delete(obj,key){
+return delete obj[key];
+});
+cljs.core.array_copy = (function cljs$core$array_copy(from,i,to,j,len){
+var i__$1 = i;
+var j__$1 = j;
+var len__$1 = len;
+while(true){
+if((len__$1 === (0))){
+return to;
+} else {
+(to[j__$1] = (from[i__$1]));
+
+var G__10419 = (i__$1 + (1));
+var G__10420 = (j__$1 + (1));
+var G__10421 = (len__$1 - (1));
+i__$1 = G__10419;
+j__$1 = G__10420;
+len__$1 = G__10421;
+continue;
+}
+break;
+}
+});
+cljs.core.array_copy_downward = (function cljs$core$array_copy_downward(from,i,to,j,len){
+var i__$1 = (i + (len - (1)));
+var j__$1 = (j + (len - (1)));
+var len__$1 = len;
+while(true){
+if((len__$1 === (0))){
+return to;
+} else {
+(to[j__$1] = (from[i__$1]));
+
+var G__10422 = (i__$1 - (1));
+var G__10423 = (j__$1 - (1));
+var G__10424 = (len__$1 - (1));
+i__$1 = G__10422;
+j__$1 = G__10423;
+len__$1 = G__10424;
+continue;
+}
+break;
+}
+});
+cljs.core.lookup_sentinel = {};
+/**
+ * Returns true if x is the value false, false otherwise.
+ */
+cljs.core.false_QMARK_ = (function cljs$core$false_QMARK_(x){
+return x === false;
+});
+/**
+ * Returns true if x is the value true, false otherwise.
+ */
+cljs.core.true_QMARK_ = (function cljs$core$true_QMARK_(x){
+return x === true;
+});
+/**
+ * Return true if x is a Boolean
+ */
+cljs.core.boolean_QMARK_ = (function cljs$core$boolean_QMARK_(x){
+return ((x === true) || (x === false));
+});
+/**
+ * Returns true if x identical to the JavaScript undefined value.
+ */
+cljs.core.undefined_QMARK_ = (function cljs$core$undefined_QMARK_(x){
+return (void 0 === x);
+});
+/**
+ * Return true if s satisfies ISeq
+ */
+cljs.core.seq_QMARK_ = (function cljs$core$seq_QMARK_(s){
+if((s == null)){
+return false;
+} else {
+if((!((s == null)))){
+if((((s.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === s.cljs$core$ISeq$)))){
+return true;
+} else {
+if((!s.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISeq,s);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.ISeq,s);
+}
+}
+});
+/**
+ * Return true if the seq function is supported for s
+ */
+cljs.core.seqable_QMARK_ = (function cljs$core$seqable_QMARK_(s){
+var or__7806__auto__ = (s == null);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = (((!((s == null))))?(((((s.cljs$lang$protocol_mask$partition0$ & (8388608))) || ((cljs.core.PROTOCOL_SENTINEL === s.cljs$core$ISeqable$))))?true:(((!s.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.ISeqable,s):false)):cljs.core.native_satisfies_QMARK_(cljs.core.ISeqable,s));
+if(or__7806__auto____$1){
+return or__7806__auto____$1;
+} else {
+return ((cljs.core.array_QMARK_(s)) || (typeof s === 'string'));
+}
+}
+});
+/**
+ * Coerce to boolean
+ */
+cljs.core.boolean$ = (function cljs$core$boolean(x){
+if((x == null)){
+return false;
+} else {
+if(x === false){
+return false;
+} else {
+return true;
+
+}
+}
+});
+/**
+ * Returns true if f returns true for fn? or satisfies IFn.
+ */
+cljs.core.ifn_QMARK_ = (function cljs$core$ifn_QMARK_(f){
+var or__7806__auto__ = cljs.core.fn_QMARK_(f);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+if((!((f == null)))){
+if((((f.cljs$lang$protocol_mask$partition0$ & (1))) || ((cljs.core.PROTOCOL_SENTINEL === f.cljs$core$IFn$)))){
+return true;
+} else {
+if((!f.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IFn,f);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IFn,f);
+}
+}
+});
+/**
+ * Returns true if n is a JavaScript number with no decimal part.
+ */
+cljs.core.integer_QMARK_ = (function cljs$core$integer_QMARK_(n){
+return ((typeof n === 'number') && ((!(isNaN(n)))) && ((!((n === Infinity)))) && ((parseFloat(n) === parseInt(n,(10)))));
+});
+/**
+ * Return true if x satisfies integer? or is an instance of goog.math.Integer
+ * or goog.math.Long.
+ */
+cljs.core.int_QMARK_ = (function cljs$core$int_QMARK_(x){
+return ((cljs.core.integer_QMARK_(x)) || ((x instanceof goog.math.Integer)) || ((x instanceof goog.math.Long)));
+});
+/**
+ * Return true if x satisfies int? and is positive.
+ */
+cljs.core.pos_int_QMARK_ = (function cljs$core$pos_int_QMARK_(x){
+if(cljs.core.integer_QMARK_(x)){
+return (x > (0));
+} else {
+if((x instanceof goog.math.Integer)){
+return ((cljs.core.not(x.isNegative())) && (cljs.core.not(x.isZero())));
+} else {
+if((x instanceof goog.math.Long)){
+return ((cljs.core.not(x.isNegative())) && (cljs.core.not(x.isZero())));
+} else {
+return false;
+
+}
+}
+}
+});
+/**
+ * Return true if x satisfies int? and is negative.
+ */
+cljs.core.neg_int_QMARK_ = (function cljs$core$neg_int_QMARK_(x){
+if(cljs.core.integer_QMARK_(x)){
+return (x < (0));
+} else {
+if((x instanceof goog.math.Integer)){
+return x.isNegative();
+} else {
+if((x instanceof goog.math.Long)){
+return x.isNegative();
+} else {
+return false;
+
+}
+}
+}
+});
+/**
+ * Return true if x satisfies int? and is a natural integer value.
+ */
+cljs.core.nat_int_QMARK_ = (function cljs$core$nat_int_QMARK_(x){
+if(cljs.core.integer_QMARK_(x)){
+return (!((x < (0))));
+} else {
+if((x instanceof goog.math.Integer)){
+return cljs.core.not(x.isNegative());
+} else {
+if((x instanceof goog.math.Long)){
+return cljs.core.not(x.isNegative());
+} else {
+return false;
+
+}
+}
+}
+});
+/**
+ * Returns true for JavaScript numbers, false otherwise.
+ */
+cljs.core.float_QMARK_ = (function cljs$core$float_QMARK_(x){
+return typeof x === 'number';
+});
+/**
+ * Returns true for JavaScript numbers, false otherwise.
+ */
+cljs.core.double_QMARK_ = (function cljs$core$double_QMARK_(x){
+return typeof x === 'number';
+});
+/**
+ * Returns true for Infinity and -Infinity values.
+ */
+cljs.core.infinite_QMARK_ = (function cljs$core$infinite_QMARK_(x){
+return (((x === Number.POSITIVE_INFINITY)) || ((x === Number.NEGATIVE_INFINITY)));
+});
+/**
+ * Returns true if key is present in the given collection, otherwise
+ * returns false. Note that for numerically indexed collections like
+ * vectors and arrays, this tests if the numeric key is within the
+ * range of indexes. 'contains?' operates constant or logarithmic time;
+ * it will not perform a linear search for a value. See also 'some'.
+ */
+cljs.core.contains_QMARK_ = (function cljs$core$contains_QMARK_(coll,v){
+if((cljs.core.get.cljs$core$IFn$_invoke$arity$3(coll,v,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return false;
+} else {
+return true;
+}
+});
+/**
+ * Returns the map entry for key, or nil if key not present.
+ */
+cljs.core.find = (function cljs$core$find(coll,k){
+if(cljs.core.ifind_QMARK_(coll)){
+return cljs.core._find(coll,k);
+} else {
+if((((!((coll == null)))) && (cljs.core.associative_QMARK_(coll)) && (cljs.core.contains_QMARK_(coll,k)))){
+return (new cljs.core.MapEntry(k,cljs.core.get.cljs$core$IFn$_invoke$arity$2(coll,k),null));
+} else {
+return null;
+}
+}
+});
+/**
+ * Returns true if no two of the arguments are =
+ */
+cljs.core.distinct_QMARK_ = (function cljs$core$distinct_QMARK_(var_args){
+var G__10437 = arguments.length;
+switch (G__10437) {
+case 1:
+return cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10439 = arguments.length;
+var i__9001__auto___10440 = (0);
+while(true){
+if((i__9001__auto___10440 < len__9000__auto___10439)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10440]));
+
+var G__10441 = (i__9001__auto___10440 + (1));
+i__9001__auto___10440 = G__10441;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (!(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x,y)));
+});
+
+cljs.core.distinct_QMARK_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+if((!(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x,y)))){
+var s = cljs.core.PersistentHashSet.createAsIfByAssoc([x,y]);
+var xs = more;
+while(true){
+var x__$1 = cljs.core.first(xs);
+var etc = cljs.core.next(xs);
+if(cljs.core.truth_(xs)){
+if(cljs.core.contains_QMARK_(s,x__$1)){
+return false;
+} else {
+var G__10442 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(s,x__$1);
+var G__10443 = etc;
+s = G__10442;
+xs = G__10443;
+continue;
+}
+} else {
+return true;
+}
+break;
+}
+} else {
+return false;
+}
+});
+
+/** @this {Function} */
+cljs.core.distinct_QMARK_.cljs$lang$applyTo = (function (seq10434){
+var G__10435 = cljs.core.first(seq10434);
+var seq10434__$1 = cljs.core.next(seq10434);
+var G__10436 = cljs.core.first(seq10434__$1);
+var seq10434__$2 = cljs.core.next(seq10434__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10435,G__10436,seq10434__$2);
+});
+
+cljs.core.distinct_QMARK_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Comparator. Returns a negative number, zero, or a positive number
+ * when x is logically 'less than', 'equal to', or 'greater than'
+ * y. Uses IComparable if available and google.array.defaultCompare for objects
+ * of the same type and special-cases nil to be less than any other object.
+ */
+cljs.core.compare = (function cljs$core$compare(x,y){
+if((x === y)){
+return (0);
+} else {
+if((x == null)){
+return (-1);
+} else {
+if((y == null)){
+return (1);
+} else {
+if(typeof x === 'number'){
+if(typeof y === 'number'){
+return goog.array.defaultCompare(x,y);
+} else {
+throw (new Error(["Cannot compare ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x)," to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+} else {
+if((((!((x == null))))?(((((x.cljs$lang$protocol_mask$partition1$ & (2048))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IComparable$))))?true:(((!x.cljs$lang$protocol_mask$partition1$))?cljs.core.native_satisfies_QMARK_(cljs.core.IComparable,x):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IComparable,x))){
+return cljs.core._compare(x,y);
+} else {
+if(((((typeof x === 'string') || (cljs.core.array_QMARK_(x)) || (x === true) || (x === false))) && ((cljs.core.type(x) === cljs.core.type(y))))){
+return goog.array.defaultCompare(x,y);
+} else {
+throw (new Error(["Cannot compare ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x)," to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+
+}
+}
+}
+}
+}
+});
+/**
+ * Compare indexed collection.
+ */
+cljs.core.compare_indexed = (function cljs$core$compare_indexed(var_args){
+var G__10446 = arguments.length;
+switch (G__10446) {
+case 2:
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 4:
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2 = (function (xs,ys){
+var xl = cljs.core.count(xs);
+var yl = cljs.core.count(ys);
+if((xl < yl)){
+return (-1);
+} else {
+if((xl > yl)){
+return (1);
+} else {
+if((xl === (0))){
+return (0);
+} else {
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$4(xs,ys,xl,(0));
+
+}
+}
+}
+});
+
+cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$4 = (function (xs,ys,len,n){
+while(true){
+var d = cljs.core.compare(cljs.core.nth.cljs$core$IFn$_invoke$arity$2(xs,n),cljs.core.nth.cljs$core$IFn$_invoke$arity$2(ys,n));
+if((((d === (0))) && (((n + (1)) < len)))){
+var G__10448 = xs;
+var G__10449 = ys;
+var G__10450 = len;
+var G__10451 = (n + (1));
+xs = G__10448;
+ys = G__10449;
+len = G__10450;
+n = G__10451;
+continue;
+} else {
+return d;
+}
+break;
+}
+});
+
+cljs.core.compare_indexed.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Given a fn that might be boolean valued or a comparator,
+ * return a fn that is a comparator.
+ */
+cljs.core.fn__GT_comparator = (function cljs$core$fn__GT_comparator(f){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(f,cljs.core.compare)){
+return cljs.core.compare;
+} else {
+return (function (x,y){
+var r = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y));
+if(typeof r === 'number'){
+return r;
+} else {
+if(cljs.core.truth_(r)){
+return (-1);
+} else {
+if(cljs.core.truth_((f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(y,x) : f.call(null,y,x)))){
+return (1);
+} else {
+return (0);
+}
+}
+}
+});
+}
+});
+/**
+ * Returns a sorted sequence of the items in coll. Comp can be
+ * boolean-valued comparison function, or a -/0/+ valued comparator.
+ * Comp defaults to compare.
+ */
+cljs.core.sort = (function cljs$core$sort(var_args){
+var G__10453 = arguments.length;
+switch (G__10453) {
+case 1:
+return cljs.core.sort.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.sort.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.sort.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+return cljs.core.sort.cljs$core$IFn$_invoke$arity$2(cljs.core.compare,coll);
+});
+
+cljs.core.sort.cljs$core$IFn$_invoke$arity$2 = (function (comp,coll){
+if(cljs.core.seq(coll)){
+var a = cljs.core.to_array(coll);
+var G__10454_10457 = a;
+var G__10455_10458 = cljs.core.fn__GT_comparator(comp);
+goog.array.stableSort(G__10454_10457,G__10455_10458);
+
+return cljs.core.seq(a);
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.sort.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a sorted sequence of the items in coll, where the sort
+ * order is determined by comparing (keyfn item). Comp can be
+ * boolean-valued comparison function, or a -/0/+ valued comparator.
+ * Comp defaults to compare.
+ */
+cljs.core.sort_by = (function cljs$core$sort_by(var_args){
+var G__10460 = arguments.length;
+switch (G__10460) {
+case 2:
+return cljs.core.sort_by.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.sort_by.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.sort_by.cljs$core$IFn$_invoke$arity$2 = (function (keyfn,coll){
+return cljs.core.sort_by.cljs$core$IFn$_invoke$arity$3(keyfn,cljs.core.compare,coll);
+});
+
+cljs.core.sort_by.cljs$core$IFn$_invoke$arity$3 = (function (keyfn,comp,coll){
+return cljs.core.sort.cljs$core$IFn$_invoke$arity$2((function (x,y){
+var G__10462 = (keyfn.cljs$core$IFn$_invoke$arity$1 ? keyfn.cljs$core$IFn$_invoke$arity$1(x) : keyfn.call(null,x));
+var G__10463 = (keyfn.cljs$core$IFn$_invoke$arity$1 ? keyfn.cljs$core$IFn$_invoke$arity$1(y) : keyfn.call(null,y));
+var fexpr__10461 = cljs.core.fn__GT_comparator(comp);
+return (fexpr__10461.cljs$core$IFn$_invoke$arity$2 ? fexpr__10461.cljs$core$IFn$_invoke$arity$2(G__10462,G__10463) : fexpr__10461.call(null,G__10462,G__10463));
+}),coll);
+});
+
+cljs.core.sort_by.cljs$lang$maxFixedArity = 3;
+
+cljs.core.seq_reduce = (function cljs$core$seq_reduce(var_args){
+var G__10466 = arguments.length;
+switch (G__10466) {
+case 2:
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+var temp__4655__auto__ = cljs.core.seq(coll);
+if(temp__4655__auto__){
+var s = temp__4655__auto__;
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(f,cljs.core.first(s),cljs.core.next(s));
+} else {
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+}
+});
+
+cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3 = (function (f,val,coll){
+var val__$1 = val;
+var coll__$1 = cljs.core.seq(coll);
+while(true){
+if(coll__$1){
+var nval = (function (){var G__10467 = val__$1;
+var G__10468 = cljs.core.first(coll__$1);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10467,G__10468) : f.call(null,G__10467,G__10468));
+})();
+if(cljs.core.reduced_QMARK_(nval)){
+return cljs.core.deref(nval);
+} else {
+var G__10470 = nval;
+var G__10471 = cljs.core.next(coll__$1);
+val__$1 = G__10470;
+coll__$1 = G__10471;
+continue;
+}
+} else {
+return val__$1;
+}
+break;
+}
+});
+
+cljs.core.seq_reduce.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Return a random permutation of coll
+ */
+cljs.core.shuffle = (function cljs$core$shuffle(coll){
+var a = cljs.core.to_array(coll);
+goog.array.shuffle(a);
+
+return cljs.core.vec(a);
+});
+cljs.core.iter_reduce = (function cljs$core$iter_reduce(var_args){
+var G__10473 = arguments.length;
+switch (G__10473) {
+case 2:
+return cljs.core.iter_reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.iter_reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.iter_reduce.cljs$core$IFn$_invoke$arity$2 = (function (coll,f){
+var iter = cljs.core._iterator(coll);
+if(cljs.core.truth_(iter.hasNext())){
+var init = iter.next();
+var acc = init;
+while(true){
+if(iter.hasNext()){
+var nacc = (function (){var G__10474 = acc;
+var G__10475 = iter.next();
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10474,G__10475) : f.call(null,G__10474,G__10475));
+})();
+if(cljs.core.reduced_QMARK_(nacc)){
+return cljs.core.deref(nacc);
+} else {
+var G__10479 = nacc;
+acc = G__10479;
+continue;
+}
+} else {
+return acc;
+}
+break;
+}
+} else {
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+}
+});
+
+cljs.core.iter_reduce.cljs$core$IFn$_invoke$arity$3 = (function (coll,f,init){
+var iter = cljs.core._iterator(coll);
+var acc = init;
+while(true){
+if(iter.hasNext()){
+var nacc = (function (){var G__10476 = acc;
+var G__10477 = iter.next();
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10476,G__10477) : f.call(null,G__10476,G__10477));
+})();
+if(cljs.core.reduced_QMARK_(nacc)){
+return cljs.core.deref(nacc);
+} else {
+var G__10480 = nacc;
+acc = G__10480;
+continue;
+}
+} else {
+return acc;
+}
+break;
+}
+});
+
+cljs.core.iter_reduce.cljs$lang$maxFixedArity = 3;
+
+/**
+ * f should be a function of 2 arguments. If val is not supplied,
+ * returns the result of applying f to the first 2 items in coll, then
+ * applying f to that result and the 3rd item, etc. If coll contains no
+ * items, f must accept no arguments as well, and reduce returns the
+ * result of calling f with no arguments. If coll has only 1 item, it
+ * is returned and f is not called. If val is supplied, returns the
+ * result of applying f to val and the first item in coll, then
+ * applying f to that result and the 2nd item, etc. If coll contains no
+ * items, returns val and f is not called.
+ */
+cljs.core.reduce = (function cljs$core$reduce(var_args){
+var G__10482 = arguments.length;
+switch (G__10482) {
+case 2:
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.reduce.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+if((((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (524288))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$IReduce$))))?true:false):false)){
+return coll.cljs$core$IReduce$_reduce$arity$2(null,f);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$2(coll,f);
+} else {
+if(typeof coll === 'string'){
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$2(coll,f);
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.IReduce,coll)){
+return cljs.core._reduce.cljs$core$IFn$_invoke$arity$2(coll,f);
+} else {
+if(cljs.core.iterable_QMARK_(coll)){
+return cljs.core.iter_reduce.cljs$core$IFn$_invoke$arity$2(coll,f);
+} else {
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll);
+
+}
+}
+}
+}
+}
+});
+
+cljs.core.reduce.cljs$core$IFn$_invoke$arity$3 = (function (f,val,coll){
+if((((!((coll == null))))?(((((coll.cljs$lang$protocol_mask$partition0$ & (524288))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$IReduce$))))?true:false):false)){
+return coll.cljs$core$IReduce$_reduce$arity$3(null,f,val);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$3(coll,f,val);
+} else {
+if(typeof coll === 'string'){
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$3(coll,f,val);
+} else {
+if(cljs.core.native_satisfies_QMARK_(cljs.core.IReduce,coll)){
+return cljs.core._reduce.cljs$core$IFn$_invoke$arity$3(coll,f,val);
+} else {
+if(cljs.core.iterable_QMARK_(coll)){
+return cljs.core.iter_reduce.cljs$core$IFn$_invoke$arity$3(coll,f,val);
+} else {
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,val,coll);
+
+}
+}
+}
+}
+}
+});
+
+cljs.core.reduce.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Reduces an associative collection. f should be a function of 3
+ * arguments. Returns the result of applying f to init, the first key
+ * and the first value in coll, then applying f to that result and the
+ * 2nd key and value, etc. If coll contains no entries, returns init
+ * and f is not called. Note that reduce-kv is supported on vectors,
+ * where the keys will be the ordinals.
+ */
+cljs.core.reduce_kv = (function cljs$core$reduce_kv(f,init,coll){
+if((!((coll == null)))){
+return cljs.core._kv_reduce(coll,f,init);
+} else {
+return init;
+}
+});
+/**
+ * Returns its argument.
+ */
+cljs.core.identity = (function cljs$core$identity(x){
+return x;
+});
+/**
+ * Takes a reducing function f of 2 args and returns a fn suitable for
+ * transduce by adding an arity-1 signature that calls cf (default -
+ * identity) on the result argument.
+ */
+cljs.core.completing = (function cljs$core$completing(var_args){
+var G__10487 = arguments.length;
+switch (G__10487) {
+case 1:
+return cljs.core.completing.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.completing.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.completing.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return cljs.core.completing.cljs$core$IFn$_invoke$arity$2(f,cljs.core.identity);
+});
+
+cljs.core.completing.cljs$core$IFn$_invoke$arity$2 = (function (f,cf){
+return (function() {
+var G__10489 = null;
+var G__10489__0 = (function (){
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+});
+var G__10489__1 = (function (x){
+return (cf.cljs$core$IFn$_invoke$arity$1 ? cf.cljs$core$IFn$_invoke$arity$1(x) : cf.call(null,x));
+});
+var G__10489__2 = (function (x,y){
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y));
+});
+G__10489 = function(x,y){
+switch(arguments.length){
+case 0:
+return G__10489__0.call(this);
+case 1:
+return G__10489__1.call(this,x);
+case 2:
+return G__10489__2.call(this,x,y);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10489.cljs$core$IFn$_invoke$arity$0 = G__10489__0;
+G__10489.cljs$core$IFn$_invoke$arity$1 = G__10489__1;
+G__10489.cljs$core$IFn$_invoke$arity$2 = G__10489__2;
+return G__10489;
+})()
+});
+
+cljs.core.completing.cljs$lang$maxFixedArity = 2;
+
+/**
+ * reduce with a transformation of f (xf). If init is not
+ * supplied, (f) will be called to produce it. f should be a reducing
+ * step function that accepts both 1 and 2 arguments, if it accepts
+ * only 2 you can add the arity-1 with 'completing'. Returns the result
+ * of applying (the transformed) xf to init and the first item in coll,
+ * then applying xf to that result and the 2nd item, etc. If coll
+ * contains no items, returns init and f is not called. Note that
+ * certain transforms may inject or skip items.
+ */
+cljs.core.transduce = (function cljs$core$transduce(var_args){
+var G__10491 = arguments.length;
+switch (G__10491) {
+case 3:
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.transduce.cljs$core$IFn$_invoke$arity$3 = (function (xform,f,coll){
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$4(xform,f,(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)),coll);
+});
+
+cljs.core.transduce.cljs$core$IFn$_invoke$arity$4 = (function (xform,f,init,coll){
+var f__$1 = (xform.cljs$core$IFn$_invoke$arity$1 ? xform.cljs$core$IFn$_invoke$arity$1(f) : xform.call(null,f));
+var ret = cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(f__$1,init,coll);
+return (f__$1.cljs$core$IFn$_invoke$arity$1 ? f__$1.cljs$core$IFn$_invoke$arity$1(ret) : f__$1.call(null,ret));
+});
+
+cljs.core.transduce.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Returns the sum of nums. (+) returns 0.
+ */
+cljs.core._PLUS_ = (function cljs$core$_PLUS_(var_args){
+var G__10497 = arguments.length;
+switch (G__10497) {
+case 0:
+return cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10499 = arguments.length;
+var i__9001__auto___10500 = (0);
+while(true){
+if((i__9001__auto___10500 < len__9000__auto___10499)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10500]));
+
+var G__10501 = (i__9001__auto___10500 + (1));
+i__9001__auto___10500 = G__10501;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (0);
+});
+
+cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x + y);
+});
+
+cljs.core._PLUS_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._PLUS_,(x + y),more);
+});
+
+/** @this {Function} */
+cljs.core._PLUS_.cljs$lang$applyTo = (function (seq10494){
+var G__10495 = cljs.core.first(seq10494);
+var seq10494__$1 = cljs.core.next(seq10494);
+var G__10496 = cljs.core.first(seq10494__$1);
+var seq10494__$2 = cljs.core.next(seq10494__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10495,G__10496,seq10494__$2);
+});
+
+cljs.core._PLUS_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * If no ys are supplied, returns the negation of x, else subtracts
+ * the ys from x and returns the result.
+ */
+cljs.core._ = (function cljs$core$_(var_args){
+var G__10506 = arguments.length;
+switch (G__10506) {
+case 1:
+return cljs.core._.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10508 = arguments.length;
+var i__9001__auto___10509 = (0);
+while(true){
+if((i__9001__auto___10509 < len__9000__auto___10508)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10509]));
+
+var G__10510 = (i__9001__auto___10509 + (1));
+i__9001__auto___10509 = G__10510;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core._.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core._.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (- x);
+});
+
+cljs.core._.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x - y);
+});
+
+cljs.core._.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._,(x - y),more);
+});
+
+/** @this {Function} */
+cljs.core._.cljs$lang$applyTo = (function (seq10503){
+var G__10504 = cljs.core.first(seq10503);
+var seq10503__$1 = cljs.core.next(seq10503);
+var G__10505 = cljs.core.first(seq10503__$1);
+var seq10503__$2 = cljs.core.next(seq10503__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10504,G__10505,seq10503__$2);
+});
+
+cljs.core._.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns the product of nums. (*) returns 1.
+ */
+cljs.core._STAR_ = (function cljs$core$_STAR_(var_args){
+var G__10515 = arguments.length;
+switch (G__10515) {
+case 0:
+return cljs.core._STAR_.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core._STAR_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._STAR_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10517 = arguments.length;
+var i__9001__auto___10518 = (0);
+while(true){
+if((i__9001__auto___10518 < len__9000__auto___10517)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10518]));
+
+var G__10519 = (i__9001__auto___10518 + (1));
+i__9001__auto___10518 = G__10519;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core._STAR_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core._STAR_.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (1);
+});
+
+cljs.core._STAR_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core._STAR_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x * y);
+});
+
+cljs.core._STAR_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._STAR_,(x * y),more);
+});
+
+/** @this {Function} */
+cljs.core._STAR_.cljs$lang$applyTo = (function (seq10512){
+var G__10513 = cljs.core.first(seq10512);
+var seq10512__$1 = cljs.core.next(seq10512);
+var G__10514 = cljs.core.first(seq10512__$1);
+var seq10512__$2 = cljs.core.next(seq10512__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10513,G__10514,seq10512__$2);
+});
+
+cljs.core._STAR_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * If no denominators are supplied, returns 1/numerator,
+ * else returns numerator divided by all of the denominators.
+ */
+cljs.core._SLASH_ = (function cljs$core$_SLASH_(var_args){
+var G__10524 = arguments.length;
+switch (G__10524) {
+case 1:
+return cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10526 = arguments.length;
+var i__9001__auto___10527 = (0);
+while(true){
+if((i__9001__auto___10527 < len__9000__auto___10526)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10527]));
+
+var G__10528 = (i__9001__auto___10527 + (1));
+i__9001__auto___10527 = G__10528;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return ((1) / x);
+});
+
+cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x / y);
+});
+
+cljs.core._SLASH_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._SLASH_,(x / y),more);
+});
+
+/** @this {Function} */
+cljs.core._SLASH_.cljs$lang$applyTo = (function (seq10521){
+var G__10522 = cljs.core.first(seq10521);
+var seq10521__$1 = cljs.core.next(seq10521);
+var G__10523 = cljs.core.first(seq10521__$1);
+var seq10521__$2 = cljs.core.next(seq10521__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10522,G__10523,seq10521__$2);
+});
+
+cljs.core._SLASH_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns non-nil if nums are in monotonically increasing order,
+ * otherwise false.
+ */
+cljs.core._LT_ = (function cljs$core$_LT_(var_args){
+var G__10533 = arguments.length;
+switch (G__10533) {
+case 1:
+return cljs.core._LT_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._LT_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10535 = arguments.length;
+var i__9001__auto___10536 = (0);
+while(true){
+if((i__9001__auto___10536 < len__9000__auto___10535)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10536]));
+
+var G__10537 = (i__9001__auto___10536 + (1));
+i__9001__auto___10536 = G__10537;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core._LT_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core._LT_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._LT_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x < y);
+});
+
+cljs.core._LT_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if((x < y)){
+if(cljs.core.next(more)){
+var G__10538 = y;
+var G__10539 = cljs.core.first(more);
+var G__10540 = cljs.core.next(more);
+x = G__10538;
+y = G__10539;
+more = G__10540;
+continue;
+} else {
+return (y < cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core._LT_.cljs$lang$applyTo = (function (seq10530){
+var G__10531 = cljs.core.first(seq10530);
+var seq10530__$1 = cljs.core.next(seq10530);
+var G__10532 = cljs.core.first(seq10530__$1);
+var seq10530__$2 = cljs.core.next(seq10530__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10531,G__10532,seq10530__$2);
+});
+
+cljs.core._LT_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns non-nil if nums are in monotonically non-decreasing order,
+ * otherwise false.
+ */
+cljs.core._LT__EQ_ = (function cljs$core$_LT__EQ_(var_args){
+var G__10545 = arguments.length;
+switch (G__10545) {
+case 1:
+return cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10547 = arguments.length;
+var i__9001__auto___10548 = (0);
+while(true){
+if((i__9001__auto___10548 < len__9000__auto___10547)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10548]));
+
+var G__10549 = (i__9001__auto___10548 + (1));
+i__9001__auto___10548 = G__10549;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x <= y);
+});
+
+cljs.core._LT__EQ_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if((x <= y)){
+if(cljs.core.next(more)){
+var G__10550 = y;
+var G__10551 = cljs.core.first(more);
+var G__10552 = cljs.core.next(more);
+x = G__10550;
+y = G__10551;
+more = G__10552;
+continue;
+} else {
+return (y <= cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core._LT__EQ_.cljs$lang$applyTo = (function (seq10542){
+var G__10543 = cljs.core.first(seq10542);
+var seq10542__$1 = cljs.core.next(seq10542);
+var G__10544 = cljs.core.first(seq10542__$1);
+var seq10542__$2 = cljs.core.next(seq10542__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10543,G__10544,seq10542__$2);
+});
+
+cljs.core._LT__EQ_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns non-nil if nums are in monotonically decreasing order,
+ * otherwise false.
+ */
+cljs.core._GT_ = (function cljs$core$_GT_(var_args){
+var G__10557 = arguments.length;
+switch (G__10557) {
+case 1:
+return cljs.core._GT_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._GT_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10559 = arguments.length;
+var i__9001__auto___10560 = (0);
+while(true){
+if((i__9001__auto___10560 < len__9000__auto___10559)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10560]));
+
+var G__10561 = (i__9001__auto___10560 + (1));
+i__9001__auto___10560 = G__10561;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core._GT_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core._GT_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._GT_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x > y);
+});
+
+cljs.core._GT_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if((x > y)){
+if(cljs.core.next(more)){
+var G__10562 = y;
+var G__10563 = cljs.core.first(more);
+var G__10564 = cljs.core.next(more);
+x = G__10562;
+y = G__10563;
+more = G__10564;
+continue;
+} else {
+return (y > cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core._GT_.cljs$lang$applyTo = (function (seq10554){
+var G__10555 = cljs.core.first(seq10554);
+var seq10554__$1 = cljs.core.next(seq10554);
+var G__10556 = cljs.core.first(seq10554__$1);
+var seq10554__$2 = cljs.core.next(seq10554__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10555,G__10556,seq10554__$2);
+});
+
+cljs.core._GT_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns non-nil if nums are in monotonically non-increasing order,
+ * otherwise false.
+ */
+cljs.core._GT__EQ_ = (function cljs$core$_GT__EQ_(var_args){
+var G__10569 = arguments.length;
+switch (G__10569) {
+case 1:
+return cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10571 = arguments.length;
+var i__9001__auto___10572 = (0);
+while(true){
+if((i__9001__auto___10572 < len__9000__auto___10571)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10572]));
+
+var G__10573 = (i__9001__auto___10572 + (1));
+i__9001__auto___10572 = G__10573;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x >= y);
+});
+
+cljs.core._GT__EQ_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if((x >= y)){
+if(cljs.core.next(more)){
+var G__10574 = y;
+var G__10575 = cljs.core.first(more);
+var G__10576 = cljs.core.next(more);
+x = G__10574;
+y = G__10575;
+more = G__10576;
+continue;
+} else {
+return (y >= cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core._GT__EQ_.cljs$lang$applyTo = (function (seq10566){
+var G__10567 = cljs.core.first(seq10566);
+var seq10566__$1 = cljs.core.next(seq10566);
+var G__10568 = cljs.core.first(seq10566__$1);
+var seq10566__$2 = cljs.core.next(seq10566__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10567,G__10568,seq10566__$2);
+});
+
+cljs.core._GT__EQ_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns a number one less than num.
+ */
+cljs.core.dec = (function cljs$core$dec(x){
+return (x - (1));
+});
+/**
+ * Returns the greatest of the nums.
+ */
+cljs.core.max = (function cljs$core$max(var_args){
+var G__10581 = arguments.length;
+switch (G__10581) {
+case 1:
+return cljs.core.max.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.max.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10583 = arguments.length;
+var i__9001__auto___10584 = (0);
+while(true){
+if((i__9001__auto___10584 < len__9000__auto___10583)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10584]));
+
+var G__10585 = (i__9001__auto___10584 + (1));
+i__9001__auto___10584 = G__10585;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.max.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.max.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.max.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+var x__8162__auto__ = x;
+var y__8163__auto__ = y;
+return ((x__8162__auto__ > y__8163__auto__) ? x__8162__auto__ : y__8163__auto__);
+});
+
+cljs.core.max.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.max,(function (){var x__8162__auto__ = x;
+var y__8163__auto__ = y;
+return ((x__8162__auto__ > y__8163__auto__) ? x__8162__auto__ : y__8163__auto__);
+})(),more);
+});
+
+/** @this {Function} */
+cljs.core.max.cljs$lang$applyTo = (function (seq10578){
+var G__10579 = cljs.core.first(seq10578);
+var seq10578__$1 = cljs.core.next(seq10578);
+var G__10580 = cljs.core.first(seq10578__$1);
+var seq10578__$2 = cljs.core.next(seq10578__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10579,G__10580,seq10578__$2);
+});
+
+cljs.core.max.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns the least of the nums.
+ */
+cljs.core.min = (function cljs$core$min(var_args){
+var G__10590 = arguments.length;
+switch (G__10590) {
+case 1:
+return cljs.core.min.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.min.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10592 = arguments.length;
+var i__9001__auto___10593 = (0);
+while(true){
+if((i__9001__auto___10593 < len__9000__auto___10592)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10593]));
+
+var G__10594 = (i__9001__auto___10593 + (1));
+i__9001__auto___10593 = G__10594;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.min.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.min.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.min.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+var x__8169__auto__ = x;
+var y__8170__auto__ = y;
+return ((x__8169__auto__ < y__8170__auto__) ? x__8169__auto__ : y__8170__auto__);
+});
+
+cljs.core.min.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.min,(function (){var x__8169__auto__ = x;
+var y__8170__auto__ = y;
+return ((x__8169__auto__ < y__8170__auto__) ? x__8169__auto__ : y__8170__auto__);
+})(),more);
+});
+
+/** @this {Function} */
+cljs.core.min.cljs$lang$applyTo = (function (seq10587){
+var G__10588 = cljs.core.first(seq10587);
+var seq10587__$1 = cljs.core.next(seq10587);
+var G__10589 = cljs.core.first(seq10587__$1);
+var seq10587__$2 = cljs.core.next(seq10587__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10588,G__10589,seq10587__$2);
+});
+
+cljs.core.min.cljs$lang$maxFixedArity = (2);
+
+cljs.core.byte$ = (function cljs$core$byte(x){
+return x;
+});
+/**
+ * Coerce to char
+ */
+cljs.core.char$ = (function cljs$core$char(x){
+if(typeof x === 'number'){
+return String.fromCharCode(x);
+} else {
+if(((typeof x === 'string') && ((x.length === (1))))){
+return x;
+} else {
+throw (new Error("Argument to char must be a character or number"));
+
+}
+}
+});
+cljs.core.short$ = (function cljs$core$short(x){
+return x;
+});
+cljs.core.float$ = (function cljs$core$float(x){
+return x;
+});
+cljs.core.double$ = (function cljs$core$double(x){
+return x;
+});
+cljs.core.unchecked_byte = (function cljs$core$unchecked_byte(x){
+return x;
+});
+cljs.core.unchecked_char = (function cljs$core$unchecked_char(x){
+return x;
+});
+cljs.core.unchecked_short = (function cljs$core$unchecked_short(x){
+return x;
+});
+cljs.core.unchecked_float = (function cljs$core$unchecked_float(x){
+return x;
+});
+cljs.core.unchecked_double = (function cljs$core$unchecked_double(x){
+return x;
+});
+/**
+ * Returns the sum of nums. (+) returns 0.
+ */
+cljs.core.unchecked_add = (function cljs$core$unchecked_add(var_args){
+var G__10599 = arguments.length;
+switch (G__10599) {
+case 0:
+return cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10601 = arguments.length;
+var i__9001__auto___10602 = (0);
+while(true){
+if((i__9001__auto___10602 < len__9000__auto___10601)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10602]));
+
+var G__10603 = (i__9001__auto___10602 + (1));
+i__9001__auto___10602 = G__10603;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (0);
+});
+
+cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x + y);
+});
+
+cljs.core.unchecked_add.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_add,(x + y),more);
+});
+
+/** @this {Function} */
+cljs.core.unchecked_add.cljs$lang$applyTo = (function (seq10596){
+var G__10597 = cljs.core.first(seq10596);
+var seq10596__$1 = cljs.core.next(seq10596);
+var G__10598 = cljs.core.first(seq10596__$1);
+var seq10596__$2 = cljs.core.next(seq10596__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10597,G__10598,seq10596__$2);
+});
+
+cljs.core.unchecked_add.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns the sum of nums. (+) returns 0.
+ */
+cljs.core.unchecked_add_int = (function cljs$core$unchecked_add_int(var_args){
+var G__10608 = arguments.length;
+switch (G__10608) {
+case 0:
+return cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10610 = arguments.length;
+var i__9001__auto___10611 = (0);
+while(true){
+if((i__9001__auto___10611 < len__9000__auto___10610)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10611]));
+
+var G__10612 = (i__9001__auto___10611 + (1));
+i__9001__auto___10611 = G__10612;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (0);
+});
+
+cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x + y);
+});
+
+cljs.core.unchecked_add_int.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_add_int,(x + y),more);
+});
+
+/** @this {Function} */
+cljs.core.unchecked_add_int.cljs$lang$applyTo = (function (seq10605){
+var G__10606 = cljs.core.first(seq10605);
+var seq10605__$1 = cljs.core.next(seq10605);
+var G__10607 = cljs.core.first(seq10605__$1);
+var seq10605__$2 = cljs.core.next(seq10605__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10606,G__10607,seq10605__$2);
+});
+
+cljs.core.unchecked_add_int.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns a number one less than x, an int.
+ */
+cljs.core.unchecked_dec = (function cljs$core$unchecked_dec(x){
+return (x - (1));
+});
+/**
+ * Returns a number one less than x, an int.
+ */
+cljs.core.unchecked_dec_int = (function cljs$core$unchecked_dec_int(x){
+return (x - (1));
+});
+/**
+ * If no denominators are supplied, returns 1/numerator,
+ * else returns numerator divided by all of the denominators.
+ */
+cljs.core.unchecked_divide_int = (function cljs$core$unchecked_divide_int(var_args){
+var G__10617 = arguments.length;
+switch (G__10617) {
+case 1:
+return cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10619 = arguments.length;
+var i__9001__auto___10620 = (0);
+while(true){
+if((i__9001__auto___10620 < len__9000__auto___10619)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10620]));
+
+var G__10621 = (i__9001__auto___10620 + (1));
+i__9001__auto___10620 = G__10621;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return ((1) / x);
+});
+
+cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x / y);
+});
+
+cljs.core.unchecked_divide_int.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_divide_int,(x / y),more);
+});
+
+/** @this {Function} */
+cljs.core.unchecked_divide_int.cljs$lang$applyTo = (function (seq10614){
+var G__10615 = cljs.core.first(seq10614);
+var seq10614__$1 = cljs.core.next(seq10614);
+var G__10616 = cljs.core.first(seq10614__$1);
+var seq10614__$2 = cljs.core.next(seq10614__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10615,G__10616,seq10614__$2);
+});
+
+cljs.core.unchecked_divide_int.cljs$lang$maxFixedArity = (2);
+
+cljs.core.unchecked_inc = (function cljs$core$unchecked_inc(x){
+return (x + (1));
+});
+cljs.core.unchecked_inc_int = (function cljs$core$unchecked_inc_int(x){
+return (x + (1));
+});
+/**
+ * Returns the product of nums. (*) returns 1.
+ */
+cljs.core.unchecked_multiply = (function cljs$core$unchecked_multiply(var_args){
+var G__10626 = arguments.length;
+switch (G__10626) {
+case 0:
+return cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10628 = arguments.length;
+var i__9001__auto___10629 = (0);
+while(true){
+if((i__9001__auto___10629 < len__9000__auto___10628)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10629]));
+
+var G__10630 = (i__9001__auto___10629 + (1));
+i__9001__auto___10629 = G__10630;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (1);
+});
+
+cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x * y);
+});
+
+cljs.core.unchecked_multiply.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_multiply,(x * y),more);
+});
+
+/** @this {Function} */
+cljs.core.unchecked_multiply.cljs$lang$applyTo = (function (seq10623){
+var G__10624 = cljs.core.first(seq10623);
+var seq10623__$1 = cljs.core.next(seq10623);
+var G__10625 = cljs.core.first(seq10623__$1);
+var seq10623__$2 = cljs.core.next(seq10623__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10624,G__10625,seq10623__$2);
+});
+
+cljs.core.unchecked_multiply.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns the product of nums. (*) returns 1.
+ */
+cljs.core.unchecked_multiply_int = (function cljs$core$unchecked_multiply_int(var_args){
+var G__10635 = arguments.length;
+switch (G__10635) {
+case 0:
+return cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10637 = arguments.length;
+var i__9001__auto___10638 = (0);
+while(true){
+if((i__9001__auto___10638 < len__9000__auto___10637)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10638]));
+
+var G__10639 = (i__9001__auto___10638 + (1));
+i__9001__auto___10638 = G__10639;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (1);
+});
+
+cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return x;
+});
+
+cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x * y);
+});
+
+cljs.core.unchecked_multiply_int.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_multiply_int,(x * y),more);
+});
+
+/** @this {Function} */
+cljs.core.unchecked_multiply_int.cljs$lang$applyTo = (function (seq10632){
+var G__10633 = cljs.core.first(seq10632);
+var seq10632__$1 = cljs.core.next(seq10632);
+var G__10634 = cljs.core.first(seq10632__$1);
+var seq10632__$2 = cljs.core.next(seq10632__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10633,G__10634,seq10632__$2);
+});
+
+cljs.core.unchecked_multiply_int.cljs$lang$maxFixedArity = (2);
+
+cljs.core.unchecked_negate = (function cljs$core$unchecked_negate(x){
+return (- x);
+});
+cljs.core.unchecked_negate_int = (function cljs$core$unchecked_negate_int(x){
+return (- x);
+});
+cljs.core.unchecked_remainder_int = (function cljs$core$unchecked_remainder_int(x,n){
+return cljs.core.mod(x,n);
+});
+/**
+ * If no ys are supplied, returns the negation of x, else subtracts
+ * the ys from x and returns the result.
+ */
+cljs.core.unchecked_subtract = (function cljs$core$unchecked_subtract(var_args){
+var G__10644 = arguments.length;
+switch (G__10644) {
+case 1:
+return cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10646 = arguments.length;
+var i__9001__auto___10647 = (0);
+while(true){
+if((i__9001__auto___10647 < len__9000__auto___10646)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10647]));
+
+var G__10648 = (i__9001__auto___10647 + (1));
+i__9001__auto___10647 = G__10648;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (- x);
+});
+
+cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x - y);
+});
+
+cljs.core.unchecked_subtract.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_subtract,(x - y),more);
+});
+
+/** @this {Function} */
+cljs.core.unchecked_subtract.cljs$lang$applyTo = (function (seq10641){
+var G__10642 = cljs.core.first(seq10641);
+var seq10641__$1 = cljs.core.next(seq10641);
+var G__10643 = cljs.core.first(seq10641__$1);
+var seq10641__$2 = cljs.core.next(seq10641__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10642,G__10643,seq10641__$2);
+});
+
+cljs.core.unchecked_subtract.cljs$lang$maxFixedArity = (2);
+
+/**
+ * If no ys are supplied, returns the negation of x, else subtracts
+ * the ys from x and returns the result.
+ */
+cljs.core.unchecked_subtract_int = (function cljs$core$unchecked_subtract_int(var_args){
+var G__10653 = arguments.length;
+switch (G__10653) {
+case 1:
+return cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10655 = arguments.length;
+var i__9001__auto___10656 = (0);
+while(true){
+if((i__9001__auto___10656 < len__9000__auto___10655)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10656]));
+
+var G__10657 = (i__9001__auto___10656 + (1));
+i__9001__auto___10656 = G__10657;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (- x);
+});
+
+cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x - y);
+});
+
+cljs.core.unchecked_subtract_int.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.unchecked_subtract_int,(x - y),more);
+});
+
+/** @this {Function} */
+cljs.core.unchecked_subtract_int.cljs$lang$applyTo = (function (seq10650){
+var G__10651 = cljs.core.first(seq10650);
+var seq10650__$1 = cljs.core.next(seq10650);
+var G__10652 = cljs.core.first(seq10650__$1);
+var seq10650__$2 = cljs.core.next(seq10650__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10651,G__10652,seq10650__$2);
+});
+
+cljs.core.unchecked_subtract_int.cljs$lang$maxFixedArity = (2);
+
+cljs.core.fix = (function cljs$core$fix(q){
+if((q >= (0))){
+return Math.floor(q);
+} else {
+return Math.ceil(q);
+}
+});
+/**
+ * Coerce to int by stripping decimal places.
+ */
+cljs.core.int$ = (function cljs$core$int(x){
+return (x | (0));
+});
+/**
+ * Coerce to int by stripping decimal places.
+ */
+cljs.core.unchecked_int = (function cljs$core$unchecked_int(x){
+return cljs.core.fix(x);
+});
+/**
+ * Coerce to long by stripping decimal places. Identical to `int'.
+ */
+cljs.core.long$ = (function cljs$core$long(x){
+return cljs.core.fix(x);
+});
+/**
+ * Coerce to long by stripping decimal places. Identical to `int'.
+ */
+cljs.core.unchecked_long = (function cljs$core$unchecked_long(x){
+return cljs.core.fix(x);
+});
+cljs.core.booleans = (function cljs$core$booleans(x){
+return x;
+});
+cljs.core.bytes = (function cljs$core$bytes(x){
+return x;
+});
+cljs.core.chars = (function cljs$core$chars(x){
+return x;
+});
+cljs.core.shorts = (function cljs$core$shorts(x){
+return x;
+});
+cljs.core.ints = (function cljs$core$ints(x){
+return x;
+});
+cljs.core.floats = (function cljs$core$floats(x){
+return x;
+});
+cljs.core.doubles = (function cljs$core$doubles(x){
+return x;
+});
+cljs.core.longs = (function cljs$core$longs(x){
+return x;
+});
+/**
+ * Modulus of num and div with original javascript behavior. i.e. bug for negative numbers
+ */
+cljs.core.js_mod = (function cljs$core$js_mod(n,d){
+return (n % d);
+});
+/**
+ * Modulus of num and div. Truncates toward negative infinity.
+ */
+cljs.core.mod = (function cljs$core$mod(n,d){
+return (((n % d) + d) % d);
+});
+/**
+ * quot[ient] of dividing numerator by denominator.
+ */
+cljs.core.quot = (function cljs$core$quot(n,d){
+var rem = (n % d);
+return cljs.core.fix(((n - rem) / d));
+});
+/**
+ * remainder of dividing numerator by denominator.
+ */
+cljs.core.rem = (function cljs$core$rem(n,d){
+var q = cljs.core.quot(n,d);
+return (n - (d * q));
+});
+/**
+ * Bitwise exclusive or
+ */
+cljs.core.bit_xor = (function cljs$core$bit_xor(var_args){
+var G__10662 = arguments.length;
+switch (G__10662) {
+case 2:
+return cljs.core.bit_xor.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10664 = arguments.length;
+var i__9001__auto___10665 = (0);
+while(true){
+if((i__9001__auto___10665 < len__9000__auto___10664)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10665]));
+
+var G__10666 = (i__9001__auto___10665 + (1));
+i__9001__auto___10665 = G__10666;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.bit_xor.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.bit_xor.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x ^ y);
+});
+
+cljs.core.bit_xor.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.bit_xor,(x ^ y),more);
+});
+
+/** @this {Function} */
+cljs.core.bit_xor.cljs$lang$applyTo = (function (seq10659){
+var G__10660 = cljs.core.first(seq10659);
+var seq10659__$1 = cljs.core.next(seq10659);
+var G__10661 = cljs.core.first(seq10659__$1);
+var seq10659__$2 = cljs.core.next(seq10659__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10660,G__10661,seq10659__$2);
+});
+
+cljs.core.bit_xor.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Bitwise and
+ */
+cljs.core.bit_and = (function cljs$core$bit_and(var_args){
+var G__10671 = arguments.length;
+switch (G__10671) {
+case 2:
+return cljs.core.bit_and.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10673 = arguments.length;
+var i__9001__auto___10674 = (0);
+while(true){
+if((i__9001__auto___10674 < len__9000__auto___10673)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10674]));
+
+var G__10675 = (i__9001__auto___10674 + (1));
+i__9001__auto___10674 = G__10675;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.bit_and.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.bit_and.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x & y);
+});
+
+cljs.core.bit_and.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.bit_and,(x & y),more);
+});
+
+/** @this {Function} */
+cljs.core.bit_and.cljs$lang$applyTo = (function (seq10668){
+var G__10669 = cljs.core.first(seq10668);
+var seq10668__$1 = cljs.core.next(seq10668);
+var G__10670 = cljs.core.first(seq10668__$1);
+var seq10668__$2 = cljs.core.next(seq10668__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10669,G__10670,seq10668__$2);
+});
+
+cljs.core.bit_and.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Bitwise or
+ */
+cljs.core.bit_or = (function cljs$core$bit_or(var_args){
+var G__10680 = arguments.length;
+switch (G__10680) {
+case 2:
+return cljs.core.bit_or.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10682 = arguments.length;
+var i__9001__auto___10683 = (0);
+while(true){
+if((i__9001__auto___10683 < len__9000__auto___10682)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10683]));
+
+var G__10684 = (i__9001__auto___10683 + (1));
+i__9001__auto___10683 = G__10684;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.bit_or.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.bit_or.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x | y);
+});
+
+cljs.core.bit_or.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.bit_or,(x | y),more);
+});
+
+/** @this {Function} */
+cljs.core.bit_or.cljs$lang$applyTo = (function (seq10677){
+var G__10678 = cljs.core.first(seq10677);
+var seq10677__$1 = cljs.core.next(seq10677);
+var G__10679 = cljs.core.first(seq10677__$1);
+var seq10677__$2 = cljs.core.next(seq10677__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10678,G__10679,seq10677__$2);
+});
+
+cljs.core.bit_or.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Bitwise and with complement
+ */
+cljs.core.bit_and_not = (function cljs$core$bit_and_not(var_args){
+var G__10689 = arguments.length;
+switch (G__10689) {
+case 2:
+return cljs.core.bit_and_not.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10691 = arguments.length;
+var i__9001__auto___10692 = (0);
+while(true){
+if((i__9001__auto___10692 < len__9000__auto___10691)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10692]));
+
+var G__10693 = (i__9001__auto___10692 + (1));
+i__9001__auto___10692 = G__10693;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.bit_and_not.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.bit_and_not.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (x & ~y);
+});
+
+cljs.core.bit_and_not.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.bit_and_not,(x & ~y),more);
+});
+
+/** @this {Function} */
+cljs.core.bit_and_not.cljs$lang$applyTo = (function (seq10686){
+var G__10687 = cljs.core.first(seq10686);
+var seq10686__$1 = cljs.core.next(seq10686);
+var G__10688 = cljs.core.first(seq10686__$1);
+var seq10686__$2 = cljs.core.next(seq10686__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10687,G__10688,seq10686__$2);
+});
+
+cljs.core.bit_and_not.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Clear bit at index n
+ */
+cljs.core.bit_clear = (function cljs$core$bit_clear(x,n){
+return (x & ~(1 << n));
+});
+/**
+ * Flip bit at index n
+ */
+cljs.core.bit_flip = (function cljs$core$bit_flip(x,n){
+return (x ^ (1 << n));
+});
+/**
+ * Bitwise complement
+ */
+cljs.core.bit_not = (function cljs$core$bit_not(x){
+return (~ x);
+});
+/**
+ * Set bit at index n
+ */
+cljs.core.bit_set = (function cljs$core$bit_set(x,n){
+return (x | (1 << n));
+});
+/**
+ * Test bit at index n
+ */
+cljs.core.bit_test = (function cljs$core$bit_test(x,n){
+return ((x & (1 << n)) != 0);
+});
+/**
+ * Bitwise shift left
+ */
+cljs.core.bit_shift_left = (function cljs$core$bit_shift_left(x,n){
+return (x << n);
+});
+/**
+ * Bitwise shift right
+ */
+cljs.core.bit_shift_right = (function cljs$core$bit_shift_right(x,n){
+return (x >> n);
+});
+/**
+ * DEPRECATED: Bitwise shift right with zero fill
+ */
+cljs.core.bit_shift_right_zero_fill = (function cljs$core$bit_shift_right_zero_fill(x,n){
+return (x >>> n);
+});
+/**
+ * Bitwise shift right with zero fill
+ */
+cljs.core.unsigned_bit_shift_right = (function cljs$core$unsigned_bit_shift_right(x,n){
+return (x >>> n);
+});
+/**
+ * Counts the number of bits set in n
+ */
+cljs.core.bit_count = (function cljs$core$bit_count(v){
+var v__$1 = (v - ((v >> (1)) & (1431655765)));
+var v__$2 = ((v__$1 & (858993459)) + ((v__$1 >> (2)) & (858993459)));
+return ((((v__$2 + (v__$2 >> (4))) & (252645135)) * (16843009)) >> (24));
+});
+/**
+ * Returns non-nil if nums all have the equivalent
+ * value, otherwise false. Behavior on non nums is
+ * undefined.
+ */
+cljs.core._EQ__EQ_ = (function cljs$core$_EQ__EQ_(var_args){
+var G__10698 = arguments.length;
+switch (G__10698) {
+case 1:
+return cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10700 = arguments.length;
+var i__9001__auto___10701 = (0);
+while(true){
+if((i__9001__auto___10701 < len__9000__auto___10700)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10701]));
+
+var G__10702 = (i__9001__auto___10701 + (1));
+i__9001__auto___10701 = G__10702;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return true;
+});
+
+cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return cljs.core._equiv(x,y);
+});
+
+cljs.core._EQ__EQ_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+while(true){
+if((x === y)){
+if(cljs.core.next(more)){
+var G__10703 = y;
+var G__10704 = cljs.core.first(more);
+var G__10705 = cljs.core.next(more);
+x = G__10703;
+y = G__10704;
+more = G__10705;
+continue;
+} else {
+return (y === cljs.core.first(more));
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core._EQ__EQ_.cljs$lang$applyTo = (function (seq10695){
+var G__10696 = cljs.core.first(seq10695);
+var seq10695__$1 = cljs.core.next(seq10695);
+var G__10697 = cljs.core.first(seq10695__$1);
+var seq10695__$2 = cljs.core.next(seq10695__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10696,G__10697,seq10695__$2);
+});
+
+cljs.core._EQ__EQ_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns true if num is greater than zero, else false
+ */
+cljs.core.pos_QMARK_ = (function cljs$core$pos_QMARK_(x){
+return (x > (0));
+});
+/**
+ * Returns true if num is zero, else false
+ */
+cljs.core.zero_QMARK_ = (function cljs$core$zero_QMARK_(x){
+return (x === (0));
+});
+/**
+ * Returns true if num is less than zero, else false
+ */
+cljs.core.neg_QMARK_ = (function cljs$core$neg_QMARK_(x){
+return (x < (0));
+});
+/**
+ * Returns the nth next of coll, (seq coll) when n is 0.
+ */
+cljs.core.nthnext = (function cljs$core$nthnext(coll,n){
+var n__$1 = n;
+var xs = cljs.core.seq(coll);
+while(true){
+if(((xs) && ((n__$1 > (0))))){
+var G__10706 = (n__$1 - (1));
+var G__10707 = cljs.core.next(xs);
+n__$1 = G__10706;
+xs = G__10707;
+continue;
+} else {
+return xs;
+}
+break;
+}
+});
+/**
+ * With no args, returns the empty string. With one arg x, returns
+ * x.toString(). (str nil) returns the empty string. With more than
+ * one arg, returns the concatenation of the str values of the args.
+ */
+cljs.core.str = (function cljs$core$str(var_args){
+var G__10711 = arguments.length;
+switch (G__10711) {
+case 0:
+return cljs.core.str.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.str.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10713 = arguments.length;
+var i__9001__auto___10714 = (0);
+while(true){
+if((i__9001__auto___10714 < len__9000__auto___10713)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10714]));
+
+var G__10715 = (i__9001__auto___10714 + (1));
+i__9001__auto___10714 = G__10715;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((1)),(0),null));
+return cljs.core.str.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.str.cljs$core$IFn$_invoke$arity$0 = (function (){
+return "";
+});
+
+cljs.core.str.cljs$core$IFn$_invoke$arity$1 = (function (x){
+if((x == null)){
+return "";
+} else {
+return [x].join("");
+}
+});
+
+cljs.core.str.cljs$core$IFn$_invoke$arity$variadic = (function (x,ys){
+var sb = (new goog.string.StringBuffer(cljs.core.str.cljs$core$IFn$_invoke$arity$1(x)));
+var more = ys;
+while(true){
+if(cljs.core.truth_(more)){
+var G__10716 = sb.append(cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.first(more)));
+var G__10717 = cljs.core.next(more);
+sb = G__10716;
+more = G__10717;
+continue;
+} else {
+return sb.toString();
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core.str.cljs$lang$applyTo = (function (seq10709){
+var G__10710 = cljs.core.first(seq10709);
+var seq10709__$1 = cljs.core.next(seq10709);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10710,seq10709__$1);
+});
+
+cljs.core.str.cljs$lang$maxFixedArity = (1);
+
+/**
+ * Returns the substring of s beginning at start inclusive, and ending
+ * at end (defaults to length of string), exclusive.
+ */
+cljs.core.subs = (function cljs$core$subs(var_args){
+var G__10719 = arguments.length;
+switch (G__10719) {
+case 2:
+return cljs.core.subs.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.subs.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.subs.cljs$core$IFn$_invoke$arity$2 = (function (s,start){
+return s.substring(start);
+});
+
+cljs.core.subs.cljs$core$IFn$_invoke$arity$3 = (function (s,start,end){
+return s.substring(start,end);
+});
+
+cljs.core.subs.cljs$lang$maxFixedArity = 3;
+
+
+/**
+ * Assumes x is sequential. Returns true if x equals y, otherwise
+ * returns false.
+ */
+cljs.core.equiv_sequential = (function cljs$core$equiv_sequential(x,y){
+return cljs.core.boolean$(((cljs.core.sequential_QMARK_(y))?((((cljs.core.counted_QMARK_(x)) && (cljs.core.counted_QMARK_(y)) && ((!((cljs.core.count(x) === cljs.core.count(y)))))))?false:(function (){var xs = cljs.core.seq(x);
+var ys = cljs.core.seq(y);
+while(true){
+if((xs == null)){
+return (ys == null);
+} else {
+if((ys == null)){
+return false;
+} else {
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.first(xs),cljs.core.first(ys))){
+var G__10721 = cljs.core.next(xs);
+var G__10722 = cljs.core.next(ys);
+xs = G__10721;
+ys = G__10722;
+continue;
+} else {
+return false;
+
+}
+}
+}
+break;
+}
+})()):null));
+});
+cljs.core.hash_coll = (function cljs$core$hash_coll(coll){
+if(cljs.core.seq(coll)){
+var res = cljs.core.hash(cljs.core.first(coll));
+var s = cljs.core.next(coll);
+while(true){
+if((s == null)){
+return res;
+} else {
+var G__10723 = cljs.core.hash_combine(res,cljs.core.hash(cljs.core.first(s)));
+var G__10724 = cljs.core.next(s);
+res = G__10723;
+s = G__10724;
+continue;
+}
+break;
+}
+} else {
+return (0);
+}
+});
+
+cljs.core.hash_imap = (function cljs$core$hash_imap(m){
+var h = (0);
+var s = cljs.core.seq(m);
+while(true){
+if(s){
+var e = cljs.core.first(s);
+var G__10725 = ((h + (cljs.core.hash(cljs.core.key(e)) ^ cljs.core.hash(cljs.core.val(e)))) % (4503599627370496));
+var G__10726 = cljs.core.next(s);
+h = G__10725;
+s = G__10726;
+continue;
+} else {
+return h;
+}
+break;
+}
+});
+cljs.core.hash_iset = (function cljs$core$hash_iset(s){
+var h = (0);
+var s__$1 = cljs.core.seq(s);
+while(true){
+if(s__$1){
+var e = cljs.core.first(s__$1);
+var G__10727 = ((h + cljs.core.hash(e)) % (4503599627370496));
+var G__10728 = cljs.core.next(s__$1);
+h = G__10727;
+s__$1 = G__10728;
+continue;
+} else {
+return h;
+}
+break;
+}
+});
+
+
+/**
+ * Takes a JavaScript object and a map of names to functions and
+ * attaches said functions as methods on the object. Any references to
+ * JavaScript's implicit this (via the this-as macro) will resolve to the
+ * object that the function is attached.
+ */
+cljs.core.extend_object_BANG_ = (function cljs$core$extend_object_BANG_(obj,fn_map){
+var seq__10729_10739 = cljs.core.seq(fn_map);
+var chunk__10730_10740 = null;
+var count__10731_10741 = (0);
+var i__10732_10742 = (0);
+while(true){
+if((i__10732_10742 < count__10731_10741)){
+var vec__10733_10743 = chunk__10730_10740.cljs$core$IIndexed$_nth$arity$2(null,i__10732_10742);
+var key_name_10744 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10733_10743,(0),null);
+var f_10745 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10733_10743,(1),null);
+var str_name_10746 = cljs.core.name(key_name_10744);
+goog.object.set(obj,str_name_10746,f_10745);
+
+
+var G__10747 = seq__10729_10739;
+var G__10748 = chunk__10730_10740;
+var G__10749 = count__10731_10741;
+var G__10750 = (i__10732_10742 + (1));
+seq__10729_10739 = G__10747;
+chunk__10730_10740 = G__10748;
+count__10731_10741 = G__10749;
+i__10732_10742 = G__10750;
+continue;
+} else {
+var temp__4657__auto___10751 = cljs.core.seq(seq__10729_10739);
+if(temp__4657__auto___10751){
+var seq__10729_10752__$1 = temp__4657__auto___10751;
+if(cljs.core.chunked_seq_QMARK_(seq__10729_10752__$1)){
+var c__8664__auto___10753 = cljs.core.chunk_first(seq__10729_10752__$1);
+var G__10754 = cljs.core.chunk_rest(seq__10729_10752__$1);
+var G__10755 = c__8664__auto___10753;
+var G__10756 = cljs.core.count(c__8664__auto___10753);
+var G__10757 = (0);
+seq__10729_10739 = G__10754;
+chunk__10730_10740 = G__10755;
+count__10731_10741 = G__10756;
+i__10732_10742 = G__10757;
+continue;
+} else {
+var vec__10736_10758 = cljs.core.first(seq__10729_10752__$1);
+var key_name_10759 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10736_10758,(0),null);
+var f_10760 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__10736_10758,(1),null);
+var str_name_10761 = cljs.core.name(key_name_10759);
+goog.object.set(obj,str_name_10761,f_10760);
+
+
+var G__10762 = cljs.core.next(seq__10729_10752__$1);
+var G__10763 = null;
+var G__10764 = (0);
+var G__10765 = (0);
+seq__10729_10739 = G__10762;
+chunk__10730_10740 = G__10763;
+count__10731_10741 = G__10764;
+i__10732_10742 = G__10765;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+return obj;
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IList}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ASeq}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.List = (function (meta,first,rest,count,__hash){
+this.meta = meta;
+this.first = first;
+this.rest = rest;
+this.count = count;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 65937646;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+});
+cljs.core.List.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.List.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.List.prototype.indexOf = (function() {
+var G__10766 = null;
+var G__10766__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10766__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10766 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10766__1.call(this,x);
+case 2:
+return G__10766__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10766.cljs$core$IFn$_invoke$arity$1 = G__10766__1;
+G__10766.cljs$core$IFn$_invoke$arity$2 = G__10766__2;
+return G__10766;
+})()
+;
+
+cljs.core.List.prototype.lastIndexOf = (function() {
+var G__10767 = null;
+var G__10767__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,self__.count);
+});
+var G__10767__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10767 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10767__1.call(this,x);
+case 2:
+return G__10767__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10767.cljs$core$IFn$_invoke$arity$1 = G__10767__1;
+G__10767.cljs$core$IFn$_invoke$arity$2 = G__10767__2;
+return G__10767;
+})()
+;
+
+cljs.core.List.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.List.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.List(self__.meta,self__.first,self__.rest,self__.count,self__.__hash));
+});
+
+cljs.core.List.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.count === (1))){
+return null;
+} else {
+return self__.rest;
+}
+});
+
+cljs.core.List.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.count;
+});
+
+cljs.core.List.prototype.cljs$core$IStack$_peek$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.first;
+});
+
+cljs.core.List.prototype.cljs$core$IStack$_pop$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ISeq$_rest$arity$1(null);
+});
+
+cljs.core.List.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.List.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.List.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.List.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.List.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.List.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.first;
+});
+
+cljs.core.List.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.count === (1))){
+return cljs.core.List.EMPTY;
+} else {
+return self__.rest;
+}
+});
+
+cljs.core.List.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.List.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.List(meta__$1,self__.first,self__.rest,self__.count,self__.__hash));
+});
+
+cljs.core.List.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.List(self__.meta,o,coll__$1,(self__.count + (1)),null));
+});
+
+cljs.core.List.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"first","first",996428481,null),new cljs.core.Symbol(null,"rest","rest",398835108,null),new cljs.core.Symbol(null,"count","count",-514511684,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.List.cljs$lang$type = true;
+
+cljs.core.List.cljs$lang$ctorStr = "cljs.core/List";
+
+cljs.core.List.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/List");
+});
+
+/**
+ * Positional factory function for cljs.core/List.
+ */
+cljs.core.__GT_List = (function cljs$core$__GT_List(meta,first,rest,count,__hash){
+return (new cljs.core.List(meta,first,rest,count,__hash));
+});
+
+/**
+ * Returns true if x implements IList
+ */
+cljs.core.list_QMARK_ = (function cljs$core$list_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (33554432))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IList$)))){
+return true;
+} else {
+if((!x.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IList,x);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IList,x);
+}
+});
+var G__10769_10772 = cljs.core.List.prototype;
+var G__10770_10773 = cljs.core.ITER_SYMBOL;
+var G__10771_10774 = ((function (G__10769_10772,G__10770_10773){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__10769_10772,G__10770_10773))
+;
+goog.object.set(G__10769_10772,G__10770_10773,G__10771_10774);
+
+/**
+* @constructor
+ * @implements {cljs.core.IList}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.EmptyList = (function (meta){
+this.meta = meta;
+this.cljs$lang$protocol_mask$partition0$ = 65937614;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+});
+cljs.core.EmptyList.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.EmptyList.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.EmptyList.prototype.indexOf = (function() {
+var G__10775 = null;
+var G__10775__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10775__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10775 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10775__1.call(this,x);
+case 2:
+return G__10775__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10775.cljs$core$IFn$_invoke$arity$1 = G__10775__1;
+G__10775.cljs$core$IFn$_invoke$arity$2 = G__10775__2;
+return G__10775;
+})()
+;
+
+cljs.core.EmptyList.prototype.lastIndexOf = (function() {
+var G__10776 = null;
+var G__10776__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10776__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10776 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10776__1.call(this,x);
+case 2:
+return G__10776__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10776.cljs$core$IFn$_invoke$arity$1 = G__10776__1;
+G__10776.cljs$core$IFn$_invoke$arity$2 = G__10776__2;
+return G__10776;
+})()
+;
+
+cljs.core.EmptyList.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.EmptyList(self__.meta));
+});
+
+cljs.core.EmptyList.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return null;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (0);
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IStack$_peek$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return null;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IStack$_pop$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+throw (new Error("Can't pop empty list"));
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.empty_ordered_hash;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+if(((cljs.core.list_QMARK_(other)) || (cljs.core.sequential_QMARK_(other)))){
+return (cljs.core.seq(other) == null);
+} else {
+return false;
+}
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return null;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.List.EMPTY;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return null;
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.EmptyList(meta__$1));
+});
+
+cljs.core.EmptyList.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.List(self__.meta,o,null,(1),null));
+});
+
+cljs.core.EmptyList.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null)], null);
+});
+
+cljs.core.EmptyList.cljs$lang$type = true;
+
+cljs.core.EmptyList.cljs$lang$ctorStr = "cljs.core/EmptyList";
+
+cljs.core.EmptyList.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/EmptyList");
+});
+
+/**
+ * Positional factory function for cljs.core/EmptyList.
+ */
+cljs.core.__GT_EmptyList = (function cljs$core$__GT_EmptyList(meta){
+return (new cljs.core.EmptyList(meta));
+});
+
+cljs.core.List.EMPTY = (new cljs.core.EmptyList(null));
+var G__10777_10780 = cljs.core.EmptyList.prototype;
+var G__10778_10781 = cljs.core.ITER_SYMBOL;
+var G__10779_10782 = ((function (G__10777_10780,G__10778_10781){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__10777_10780,G__10778_10781))
+;
+goog.object.set(G__10777_10780,G__10778_10781,G__10779_10782);
+/**
+ * Returns true if coll satisfies? IReversible.
+ */
+cljs.core.reversible_QMARK_ = (function cljs$core$reversible_QMARK_(coll){
+if((!((coll == null)))){
+if((((coll.cljs$lang$protocol_mask$partition0$ & (134217728))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$IReversible$)))){
+return true;
+} else {
+if((!coll.cljs$lang$protocol_mask$partition0$)){
+return cljs.core.native_satisfies_QMARK_(cljs.core.IReversible,coll);
+} else {
+return false;
+}
+}
+} else {
+return cljs.core.native_satisfies_QMARK_(cljs.core.IReversible,coll);
+}
+});
+/**
+ * Returns, in constant time, a seq of the items in rev (which
+ * can be a vector or sorted-map), in reverse order. If rev is empty returns nil
+ */
+cljs.core.rseq = (function cljs$core$rseq(rev){
+return cljs.core._rseq(rev);
+});
+/**
+ * Returns a seq of the items in coll in reverse order. Not lazy.
+ */
+cljs.core.reverse = (function cljs$core$reverse(coll){
+if(cljs.core.reversible_QMARK_(coll)){
+var or__7806__auto__ = cljs.core.rseq(coll);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return cljs.core.List.EMPTY;
+}
+} else {
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.conj,cljs.core.List.EMPTY,coll);
+}
+});
+/**
+ * Creates a new list containing the items.
+ */
+cljs.core.list = (function cljs$core$list(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___10785 = arguments.length;
+var i__9001__auto___10786 = (0);
+while(true){
+if((i__9001__auto___10786 < len__9000__auto___10785)){
+args__9010__auto__.push((arguments[i__9001__auto___10786]));
+
+var G__10787 = (i__9001__auto___10786 + (1));
+i__9001__auto___10786 = G__10787;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.list.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.list.cljs$core$IFn$_invoke$arity$variadic = (function (xs){
+var arr = (((((xs instanceof cljs.core.IndexedSeq)) && ((xs.i === (0)))))?xs.arr:(function (){var arr = [];
+var xs__$1 = xs;
+while(true){
+if((!((xs__$1 == null)))){
+arr.push(xs__$1.cljs$core$ISeq$_first$arity$1(null));
+
+var G__10788 = xs__$1.cljs$core$INext$_next$arity$1(null);
+xs__$1 = G__10788;
+continue;
+} else {
+return arr;
+}
+break;
+}
+})());
+var i = arr.length;
+var r = cljs.core.List.EMPTY;
+while(true){
+if((i > (0))){
+var G__10789 = (i - (1));
+var G__10790 = r.cljs$core$ICollection$_conj$arity$2(null,(arr[(i - (1))]));
+i = G__10789;
+r = G__10790;
+continue;
+} else {
+return r;
+}
+break;
+}
+});
+
+cljs.core.list.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.list.cljs$lang$applyTo = (function (seq10784){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq10784));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IList}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ASeq}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Cons = (function (meta,first,rest,__hash){
+this.meta = meta;
+this.first = first;
+this.rest = rest;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 65929452;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+});
+cljs.core.Cons.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.Cons.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Cons.prototype.indexOf = (function() {
+var G__10791 = null;
+var G__10791__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10791__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10791 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10791__1.call(this,x);
+case 2:
+return G__10791__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10791.cljs$core$IFn$_invoke$arity$1 = G__10791__1;
+G__10791.cljs$core$IFn$_invoke$arity$2 = G__10791__2;
+return G__10791;
+})()
+;
+
+cljs.core.Cons.prototype.lastIndexOf = (function() {
+var G__10792 = null;
+var G__10792__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10792__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10792 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10792__1.call(this,x);
+case 2:
+return G__10792__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10792.cljs$core$IFn$_invoke$arity$1 = G__10792__1;
+G__10792.cljs$core$IFn$_invoke$arity$2 = G__10792__2;
+return G__10792;
+})()
+;
+
+cljs.core.Cons.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.Cons.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.Cons(self__.meta,self__.first,self__.rest,self__.__hash));
+});
+
+cljs.core.Cons.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.rest == null)){
+return null;
+} else {
+return cljs.core.seq(self__.rest);
+}
+});
+
+cljs.core.Cons.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.Cons.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.Cons.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.Cons.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.Cons.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.Cons.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.first;
+});
+
+cljs.core.Cons.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.rest == null)){
+return cljs.core.List.EMPTY;
+} else {
+return self__.rest;
+}
+});
+
+cljs.core.Cons.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.Cons.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.Cons(meta__$1,self__.first,self__.rest,self__.__hash));
+});
+
+cljs.core.Cons.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.Cons(null,o,coll__$1,null));
+});
+
+cljs.core.Cons.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"first","first",996428481,null),new cljs.core.Symbol(null,"rest","rest",398835108,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Cons.cljs$lang$type = true;
+
+cljs.core.Cons.cljs$lang$ctorStr = "cljs.core/Cons";
+
+cljs.core.Cons.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Cons");
+});
+
+/**
+ * Positional factory function for cljs.core/Cons.
+ */
+cljs.core.__GT_Cons = (function cljs$core$__GT_Cons(meta,first,rest,__hash){
+return (new cljs.core.Cons(meta,first,rest,__hash));
+});
+
+var G__10793_10796 = cljs.core.Cons.prototype;
+var G__10794_10797 = cljs.core.ITER_SYMBOL;
+var G__10795_10798 = ((function (G__10793_10796,G__10794_10797){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__10793_10796,G__10794_10797))
+;
+goog.object.set(G__10793_10796,G__10794_10797,G__10795_10798);
+/**
+ * Returns a new seq where x is the first element and coll is the rest.
+ */
+cljs.core.cons = (function cljs$core$cons(x,coll){
+if((function (){var or__7806__auto__ = (coll == null);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+if((!((coll == null)))){
+if((((coll.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === coll.cljs$core$ISeq$)))){
+return true;
+} else {
+return false;
+}
+} else {
+return false;
+}
+}
+})()){
+return (new cljs.core.Cons(null,x,coll,null));
+} else {
+return (new cljs.core.Cons(null,x,cljs.core.seq(coll),null));
+}
+});
+cljs.core.hash_keyword = (function cljs$core$hash_keyword(k){
+return ((cljs.core.hash_symbol(k) + (2654435769)) | (0));
+});
+cljs.core.compare_keywords = (function cljs$core$compare_keywords(a,b){
+if((a.fqn === b.fqn)){
+return (0);
+} else {
+if(cljs.core.truth_((function (){var and__7791__auto__ = cljs.core.not(a.ns);
+if(and__7791__auto__){
+return b.ns;
+} else {
+return and__7791__auto__;
+}
+})())){
+return (-1);
+} else {
+if(cljs.core.truth_(a.ns)){
+if(cljs.core.not(b.ns)){
+return (1);
+} else {
+var nsc = (function (){var G__10801 = a.ns;
+var G__10802 = b.ns;
+return goog.array.defaultCompare(G__10801,G__10802);
+})();
+if(((0) === nsc)){
+var G__10803 = a.name;
+var G__10804 = b.name;
+return goog.array.defaultCompare(G__10803,G__10804);
+} else {
+return nsc;
+}
+}
+} else {
+var G__10805 = a.name;
+var G__10806 = b.name;
+return goog.array.defaultCompare(G__10805,G__10806);
+
+}
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.INamed}
+ * @implements {cljs.core.IPrintWithWriter}
+*/
+cljs.core.Keyword = (function (ns,name,fqn,_hash){
+this.ns = ns;
+this.name = name;
+this.fqn = fqn;
+this._hash = _hash;
+this.cljs$lang$protocol_mask$partition0$ = 2153775105;
+this.cljs$lang$protocol_mask$partition1$ = 4096;
+});
+cljs.core.Keyword.prototype.toString = (function (){
+var self__ = this;
+var _ = this;
+return [":",cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.fqn)].join('');
+});
+
+cljs.core.Keyword.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Keyword.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (_,other){
+var self__ = this;
+var ___$1 = this;
+if((other instanceof cljs.core.Keyword)){
+return (self__.fqn === other.fqn);
+} else {
+return false;
+}
+});
+
+cljs.core.Keyword.prototype.call = (function() {
+var G__10808 = null;
+var G__10808__2 = (function (self__,coll){
+var self__ = this;
+var self____$1 = this;
+var kw = self____$1;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$2(coll,kw);
+});
+var G__10808__3 = (function (self__,coll,not_found){
+var self__ = this;
+var self____$1 = this;
+var kw = self____$1;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$3(coll,kw,not_found);
+});
+G__10808 = function(self__,coll,not_found){
+switch(arguments.length){
+case 2:
+return G__10808__2.call(this,self__,coll);
+case 3:
+return G__10808__3.call(this,self__,coll,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__10808.cljs$core$IFn$_invoke$arity$2 = G__10808__2;
+G__10808.cljs$core$IFn$_invoke$arity$3 = G__10808__3;
+return G__10808;
+})()
+;
+
+cljs.core.Keyword.prototype.apply = (function (self__,args10807){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args10807)));
+});
+
+cljs.core.Keyword.prototype.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+var self__ = this;
+var kw = this;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$2(coll,kw);
+});
+
+cljs.core.Keyword.prototype.cljs$core$IFn$_invoke$arity$2 = (function (coll,not_found){
+var self__ = this;
+var kw = this;
+return cljs.core.get.cljs$core$IFn$_invoke$arity$3(coll,kw,not_found);
+});
+
+cljs.core.Keyword.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+var h__8266__auto__ = self__._hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_keyword(this$__$1);
+self__._hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.Keyword.prototype.cljs$core$INamed$_name$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.name;
+});
+
+cljs.core.Keyword.prototype.cljs$core$INamed$_namespace$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.ns;
+});
+
+cljs.core.Keyword.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (o,writer,_){
+var self__ = this;
+var o__$1 = this;
+return cljs.core._write(writer,[":",cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.fqn)].join(''));
+});
+
+cljs.core.Keyword.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"ns","ns",2082130287,null),new cljs.core.Symbol(null,"name","name",-810760592,null),new cljs.core.Symbol(null,"fqn","fqn",-1749334463,null),cljs.core.with_meta(new cljs.core.Symbol(null,"_hash","_hash",-2130838312,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Keyword.cljs$lang$type = true;
+
+cljs.core.Keyword.cljs$lang$ctorStr = "cljs.core/Keyword";
+
+cljs.core.Keyword.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Keyword");
+});
+
+/**
+ * Positional factory function for cljs.core/Keyword.
+ */
+cljs.core.__GT_Keyword = (function cljs$core$__GT_Keyword(ns,name,fqn,_hash){
+return (new cljs.core.Keyword(ns,name,fqn,_hash));
+});
+
+/**
+ * Return true if x is a Keyword
+ */
+cljs.core.keyword_QMARK_ = (function cljs$core$keyword_QMARK_(x){
+return (x instanceof cljs.core.Keyword);
+});
+/**
+ * Efficient test to determine that two keywords are identical.
+ */
+cljs.core.keyword_identical_QMARK_ = (function cljs$core$keyword_identical_QMARK_(x,y){
+if((x === y)){
+return true;
+} else {
+if((((x instanceof cljs.core.Keyword)) && ((y instanceof cljs.core.Keyword)))){
+return (x.fqn === y.fqn);
+} else {
+return false;
+}
+}
+});
+/**
+ * Efficient test to determine that two symbols are identical.
+ */
+cljs.core.symbol_identical_QMARK_ = (function cljs$core$symbol_identical_QMARK_(x,y){
+if((x === y)){
+return true;
+} else {
+if((((x instanceof cljs.core.Symbol)) && ((y instanceof cljs.core.Symbol)))){
+return (x.str === y.str);
+} else {
+return false;
+}
+}
+});
+/**
+ * Returns the namespace String of a symbol or keyword, or nil if not present.
+ */
+cljs.core.namespace = (function cljs$core$namespace(x){
+if((((!((x == null))))?(((((x.cljs$lang$protocol_mask$partition1$ & (4096))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$INamed$))))?true:false):false)){
+return x.cljs$core$INamed$_namespace$arity$1(null);
+} else {
+throw (new Error(["Doesn't support namespace: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x)].join('')));
+}
+});
+/**
+ * Return true if x is a symbol or keyword
+ */
+cljs.core.ident_QMARK_ = (function cljs$core$ident_QMARK_(x){
+return (((x instanceof cljs.core.Keyword)) || ((x instanceof cljs.core.Symbol)));
+});
+/**
+ * Return true if x is a symbol or keyword without a namespace
+ */
+cljs.core.simple_ident_QMARK_ = (function cljs$core$simple_ident_QMARK_(x){
+return ((cljs.core.ident_QMARK_(x)) && ((cljs.core.namespace(x) == null)));
+});
+/**
+ * Return true if x is a symbol or keyword with a namespace
+ */
+cljs.core.qualified_ident_QMARK_ = (function cljs$core$qualified_ident_QMARK_(x){
+return cljs.core.boolean$((function (){var and__7791__auto__ = cljs.core.ident_QMARK_(x);
+if(and__7791__auto__){
+var and__7791__auto____$1 = cljs.core.namespace(x);
+if(cljs.core.truth_(and__7791__auto____$1)){
+return true;
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+})());
+});
+/**
+ * Return true if x is a symbol without a namespace
+ */
+cljs.core.simple_symbol_QMARK_ = (function cljs$core$simple_symbol_QMARK_(x){
+return (((x instanceof cljs.core.Symbol)) && ((cljs.core.namespace(x) == null)));
+});
+/**
+ * Return true if x is a symbol with a namespace
+ */
+cljs.core.qualified_symbol_QMARK_ = (function cljs$core$qualified_symbol_QMARK_(x){
+return cljs.core.boolean$((function (){var and__7791__auto__ = (x instanceof cljs.core.Symbol);
+if(and__7791__auto__){
+var and__7791__auto____$1 = cljs.core.namespace(x);
+if(cljs.core.truth_(and__7791__auto____$1)){
+return true;
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+})());
+});
+/**
+ * Return true if x is a keyword without a namespace
+ */
+cljs.core.simple_keyword_QMARK_ = (function cljs$core$simple_keyword_QMARK_(x){
+return (((x instanceof cljs.core.Keyword)) && ((cljs.core.namespace(x) == null)));
+});
+/**
+ * Return true if x is a keyword with a namespace
+ */
+cljs.core.qualified_keyword_QMARK_ = (function cljs$core$qualified_keyword_QMARK_(x){
+return cljs.core.boolean$((function (){var and__7791__auto__ = (x instanceof cljs.core.Keyword);
+if(and__7791__auto__){
+var and__7791__auto____$1 = cljs.core.namespace(x);
+if(cljs.core.truth_(and__7791__auto____$1)){
+return true;
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+})());
+});
+/**
+ * Returns a Keyword with the given namespace and name. Do not use :
+ * in the keyword strings, it will be added automatically.
+ */
+cljs.core.keyword = (function cljs$core$keyword(var_args){
+var G__10811 = arguments.length;
+switch (G__10811) {
+case 1:
+return cljs.core.keyword.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.keyword.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.keyword.cljs$core$IFn$_invoke$arity$1 = (function (name){
+if((name instanceof cljs.core.Keyword)){
+return name;
+} else {
+if((name instanceof cljs.core.Symbol)){
+return (new cljs.core.Keyword(cljs.core.namespace(name),cljs.core.name(name),name.str,null));
+} else {
+if(typeof name === 'string'){
+var parts = name.split("/");
+if((parts.length === (2))){
+return (new cljs.core.Keyword((parts[(0)]),(parts[(1)]),name,null));
+} else {
+return (new cljs.core.Keyword(null,(parts[(0)]),name,null));
+}
+} else {
+return null;
+}
+}
+}
+});
+
+cljs.core.keyword.cljs$core$IFn$_invoke$arity$2 = (function (ns,name){
+var ns__$1 = (((ns instanceof cljs.core.Keyword))?cljs.core.name(ns):(((ns instanceof cljs.core.Symbol))?cljs.core.name(ns):ns
+));
+var name__$1 = (((name instanceof cljs.core.Keyword))?cljs.core.name(name):(((name instanceof cljs.core.Symbol))?cljs.core.name(name):name
+));
+return (new cljs.core.Keyword(ns__$1,name__$1,[cljs.core.str.cljs$core$IFn$_invoke$arity$1((cljs.core.truth_(ns__$1)?[cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns__$1),"/"].join(''):null)),cljs.core.str.cljs$core$IFn$_invoke$arity$1(name__$1)].join(''),null));
+});
+
+cljs.core.keyword.cljs$lang$maxFixedArity = 2;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IPending}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.LazySeq = (function (meta,fn,s,__hash){
+this.meta = meta;
+this.fn = fn;
+this.s = s;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32374988;
+this.cljs$lang$protocol_mask$partition1$ = 1;
+});
+cljs.core.LazySeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.LazySeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.LazySeq.prototype.sval = (function (){
+var self__ = this;
+var coll = this;
+if((self__.fn == null)){
+return self__.s;
+} else {
+self__.s = (self__.fn.cljs$core$IFn$_invoke$arity$0 ? self__.fn.cljs$core$IFn$_invoke$arity$0() : self__.fn.call(null));
+
+self__.fn = null;
+
+return self__.s;
+}
+});
+
+cljs.core.LazySeq.prototype.indexOf = (function() {
+var G__10813 = null;
+var G__10813__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10813__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10813 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10813__1.call(this,x);
+case 2:
+return G__10813__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10813.cljs$core$IFn$_invoke$arity$1 = G__10813__1;
+G__10813.cljs$core$IFn$_invoke$arity$2 = G__10813__2;
+return G__10813;
+})()
+;
+
+cljs.core.LazySeq.prototype.lastIndexOf = (function() {
+var G__10814 = null;
+var G__10814__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10814__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10814 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10814__1.call(this,x);
+case 2:
+return G__10814__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10814.cljs$core$IFn$_invoke$arity$1 = G__10814__1;
+G__10814.cljs$core$IFn$_invoke$arity$2 = G__10814__2;
+return G__10814;
+})()
+;
+
+cljs.core.LazySeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.LazySeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+coll__$1.cljs$core$ISeqable$_seq$arity$1(null);
+
+if((self__.s == null)){
+return null;
+} else {
+return cljs.core.next(self__.s);
+}
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IPending$_realized_QMARK_$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.not(self__.fn);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+coll__$1.cljs$core$ISeqable$_seq$arity$1(null);
+
+if((self__.s == null)){
+return null;
+} else {
+return cljs.core.first(self__.s);
+}
+});
+
+cljs.core.LazySeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+coll__$1.cljs$core$ISeqable$_seq$arity$1(null);
+
+if((!((self__.s == null)))){
+return cljs.core.rest(self__.s);
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.LazySeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+coll__$1.sval();
+
+if((self__.s == null)){
+return null;
+} else {
+var ls = self__.s;
+while(true){
+if((ls instanceof cljs.core.LazySeq)){
+var G__10815 = ls.sval();
+ls = G__10815;
+continue;
+} else {
+self__.s = ls;
+
+return cljs.core.seq(self__.s);
+}
+break;
+}
+}
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.LazySeq(meta__$1,((function (coll__$1){
+return (function (){
+return coll__$1.cljs$core$ISeqable$_seq$arity$1(null);
+});})(coll__$1))
+,null,self__.__hash));
+});
+
+cljs.core.LazySeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.LazySeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),cljs.core.with_meta(new cljs.core.Symbol(null,"fn","fn",465265323,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"s","s",-948495851,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.LazySeq.cljs$lang$type = true;
+
+cljs.core.LazySeq.cljs$lang$ctorStr = "cljs.core/LazySeq";
+
+cljs.core.LazySeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/LazySeq");
+});
+
+/**
+ * Positional factory function for cljs.core/LazySeq.
+ */
+cljs.core.__GT_LazySeq = (function cljs$core$__GT_LazySeq(meta,fn,s,__hash){
+return (new cljs.core.LazySeq(meta,fn,s,__hash));
+});
+
+var G__10816_10819 = cljs.core.LazySeq.prototype;
+var G__10817_10820 = cljs.core.ITER_SYMBOL;
+var G__10818_10821 = ((function (G__10816_10819,G__10817_10820){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__10816_10819,G__10817_10820))
+;
+goog.object.set(G__10816_10819,G__10817_10820,G__10818_10821);
+
+/**
+* @constructor
+ * @implements {cljs.core.ICounted}
+*/
+cljs.core.ChunkBuffer = (function (buf,end){
+this.buf = buf;
+this.end = end;
+this.cljs$lang$protocol_mask$partition0$ = 2;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.ChunkBuffer.prototype.add = (function (o){
+var self__ = this;
+var _ = this;
+(self__.buf[self__.end] = o);
+
+return self__.end = (self__.end + (1));
+});
+
+cljs.core.ChunkBuffer.prototype.chunk = (function (){
+var self__ = this;
+var _ = this;
+var ret = (new cljs.core.ArrayChunk(self__.buf,(0),self__.end));
+self__.buf = null;
+
+return ret;
+});
+
+cljs.core.ChunkBuffer.prototype.cljs$core$ICounted$_count$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.end;
+});
+
+cljs.core.ChunkBuffer.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"buf","buf",1426618187,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"end","end",1372345569,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ChunkBuffer.cljs$lang$type = true;
+
+cljs.core.ChunkBuffer.cljs$lang$ctorStr = "cljs.core/ChunkBuffer";
+
+cljs.core.ChunkBuffer.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ChunkBuffer");
+});
+
+/**
+ * Positional factory function for cljs.core/ChunkBuffer.
+ */
+cljs.core.__GT_ChunkBuffer = (function cljs$core$__GT_ChunkBuffer(buf,end){
+return (new cljs.core.ChunkBuffer(buf,end));
+});
+
+cljs.core.chunk_buffer = (function cljs$core$chunk_buffer(capacity){
+return (new cljs.core.ChunkBuffer((new Array(capacity)),(0)));
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.IChunk}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.ArrayChunk = (function (arr,off,end){
+this.arr = arr;
+this.off = off;
+this.end = end;
+this.cljs$lang$protocol_mask$partition0$ = 524306;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.ArrayChunk.prototype.cljs$core$ICounted$_count$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (self__.end - self__.off);
+});
+
+cljs.core.ArrayChunk.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (coll,i){
+var self__ = this;
+var coll__$1 = this;
+return (self__.arr[(self__.off + i)]);
+});
+
+cljs.core.ArrayChunk.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (coll,i,not_found){
+var self__ = this;
+var coll__$1 = this;
+if((((i >= (0))) && ((i < (self__.end - self__.off))))){
+return (self__.arr[(self__.off + i)]);
+} else {
+return not_found;
+}
+});
+
+cljs.core.ArrayChunk.prototype.cljs$core$IChunk$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ArrayChunk.prototype.cljs$core$IChunk$_drop_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.off === self__.end)){
+throw (new Error("-drop-first of empty chunk"));
+} else {
+return (new cljs.core.ArrayChunk(self__.arr,(self__.off + (1)),self__.end));
+}
+});
+
+cljs.core.ArrayChunk.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4(self__.arr,f,(self__.arr[self__.off]),(self__.off + (1)));
+});
+
+cljs.core.ArrayChunk.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4(self__.arr,f,start,self__.off);
+});
+
+cljs.core.ArrayChunk.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.Symbol(null,"off","off",-2047994980,null),new cljs.core.Symbol(null,"end","end",1372345569,null)], null);
+});
+
+cljs.core.ArrayChunk.cljs$lang$type = true;
+
+cljs.core.ArrayChunk.cljs$lang$ctorStr = "cljs.core/ArrayChunk";
+
+cljs.core.ArrayChunk.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ArrayChunk");
+});
+
+/**
+ * Positional factory function for cljs.core/ArrayChunk.
+ */
+cljs.core.__GT_ArrayChunk = (function cljs$core$__GT_ArrayChunk(arr,off,end){
+return (new cljs.core.ArrayChunk(arr,off,end));
+});
+
+cljs.core.array_chunk = (function cljs$core$array_chunk(var_args){
+var G__10823 = arguments.length;
+switch (G__10823) {
+case 1:
+return cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$1 = (function (arr){
+return (new cljs.core.ArrayChunk(arr,(0),arr.length));
+});
+
+cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$2 = (function (arr,off){
+return (new cljs.core.ArrayChunk(arr,off,arr.length));
+});
+
+cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$3 = (function (arr,off,end){
+return (new cljs.core.ArrayChunk(arr,off,end));
+});
+
+cljs.core.array_chunk.cljs$lang$maxFixedArity = 3;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ASeq}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IChunkedNext}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IChunkedSeq}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.ChunkedCons = (function (chunk,more,meta,__hash){
+this.chunk = chunk;
+this.more = more;
+this.meta = meta;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 31850732;
+this.cljs$lang$protocol_mask$partition1$ = 1536;
+});
+cljs.core.ChunkedCons.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.ChunkedCons.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.ChunkedCons.prototype.indexOf = (function() {
+var G__10825 = null;
+var G__10825__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__10825__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10825 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10825__1.call(this,x);
+case 2:
+return G__10825__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10825.cljs$core$IFn$_invoke$arity$1 = G__10825__1;
+G__10825.cljs$core$IFn$_invoke$arity$2 = G__10825__2;
+return G__10825;
+})()
+;
+
+cljs.core.ChunkedCons.prototype.lastIndexOf = (function() {
+var G__10826 = null;
+var G__10826__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__10826__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__10826 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__10826__1.call(this,x);
+case 2:
+return G__10826__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__10826.cljs$core$IFn$_invoke$arity$1 = G__10826__1;
+G__10826.cljs$core$IFn$_invoke$arity$2 = G__10826__2;
+return G__10826;
+})()
+;
+
+cljs.core.ChunkedCons.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((cljs.core._count(self__.chunk) > (1))){
+return (new cljs.core.ChunkedCons(cljs.core._drop_first(self__.chunk),self__.more,self__.meta,null));
+} else {
+if((self__.more == null)){
+return null;
+} else {
+return cljs.core._seq(self__.more);
+}
+}
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.chunk,(0));
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((cljs.core._count(self__.chunk) > (1))){
+return (new cljs.core.ChunkedCons(cljs.core._drop_first(self__.chunk),self__.more,self__.meta,null));
+} else {
+if((self__.more == null)){
+return cljs.core.List.EMPTY;
+} else {
+return self__.more;
+}
+}
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IChunkedSeq$_chunked_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.chunk;
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IChunkedSeq$_chunked_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.more == null)){
+return cljs.core.List.EMPTY;
+} else {
+return self__.more;
+}
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,m){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.ChunkedCons(self__.chunk,self__.more,m,self__.__hash));
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$ICollection$_conj$arity$2 = (function (this$,o){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core.cons(o,this$__$1);
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IChunkedNext$_chunked_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.more == null)){
+return null;
+} else {
+return self__.more;
+}
+});
+
+cljs.core.ChunkedCons.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"chunk","chunk",449371907,null),new cljs.core.Symbol(null,"more","more",-418290273,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ChunkedCons.cljs$lang$type = true;
+
+cljs.core.ChunkedCons.cljs$lang$ctorStr = "cljs.core/ChunkedCons";
+
+cljs.core.ChunkedCons.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ChunkedCons");
+});
+
+/**
+ * Positional factory function for cljs.core/ChunkedCons.
+ */
+cljs.core.__GT_ChunkedCons = (function cljs$core$__GT_ChunkedCons(chunk,more,meta,__hash){
+return (new cljs.core.ChunkedCons(chunk,more,meta,__hash));
+});
+
+var G__10827_10830 = cljs.core.ChunkedCons.prototype;
+var G__10828_10831 = cljs.core.ITER_SYMBOL;
+var G__10829_10832 = ((function (G__10827_10830,G__10828_10831){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__10827_10830,G__10828_10831))
+;
+goog.object.set(G__10827_10830,G__10828_10831,G__10829_10832);
+cljs.core.chunk_cons = (function cljs$core$chunk_cons(chunk,rest){
+if((cljs.core._count(chunk) === (0))){
+return rest;
+} else {
+return (new cljs.core.ChunkedCons(chunk,rest,null,null));
+}
+});
+cljs.core.chunk_append = (function cljs$core$chunk_append(b,x){
+return b.add(x);
+});
+cljs.core.chunk = (function cljs$core$chunk(b){
+return b.chunk();
+});
+cljs.core.chunk_first = (function cljs$core$chunk_first(s){
+return cljs.core._chunked_first(s);
+});
+cljs.core.chunk_rest = (function cljs$core$chunk_rest(s){
+return cljs.core._chunked_rest(s);
+});
+cljs.core.chunk_next = (function cljs$core$chunk_next(s){
+if((((!((s == null))))?(((((s.cljs$lang$protocol_mask$partition1$ & (1024))) || ((cljs.core.PROTOCOL_SENTINEL === s.cljs$core$IChunkedNext$))))?true:false):false)){
+return cljs.core._chunked_next(s);
+} else {
+return cljs.core.seq(cljs.core._chunked_rest(s));
+}
+});
+/**
+ * Returns an array containing the contents of coll.
+ */
+cljs.core.to_array = (function cljs$core$to_array(coll){
+var ary = [];
+var s = cljs.core.seq(coll);
+while(true){
+if((!((s == null)))){
+ary.push(cljs.core.first(s));
+
+var G__10834 = cljs.core.next(s);
+s = G__10834;
+continue;
+} else {
+return ary;
+}
+break;
+}
+});
+/**
+ * Returns a (potentially-ragged) 2-dimensional array
+ * containing the contents of coll.
+ */
+cljs.core.to_array_2d = (function cljs$core$to_array_2d(coll){
+var ret = (new Array(cljs.core.count(coll)));
+var i_10835 = (0);
+var xs_10836 = cljs.core.seq(coll);
+while(true){
+if((xs_10836 == null)){
+} else {
+(ret[i_10835] = cljs.core.to_array(cljs.core.first(xs_10836)));
+
+var G__10837 = (i_10835 + (1));
+var G__10838 = cljs.core.next(xs_10836);
+i_10835 = G__10837;
+xs_10836 = G__10838;
+continue;
+}
+break;
+}
+
+return ret;
+});
+/**
+ * Creates an array of ints. Does not coerce array, provided for compatibility
+ * with Clojure.
+ */
+cljs.core.int_array = (function cljs$core$int_array(var_args){
+var G__10840 = arguments.length;
+switch (G__10840) {
+case 1:
+return cljs.core.int_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.int_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.int_array.cljs$core$IFn$_invoke$arity$1 = (function (size_or_seq){
+if(typeof size_or_seq === 'number'){
+return cljs.core.int_array.cljs$core$IFn$_invoke$arity$2(size_or_seq,null);
+} else {
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(size_or_seq);
+}
+});
+
+cljs.core.int_array.cljs$core$IFn$_invoke$arity$2 = (function (size,init_val_or_seq){
+var a = (new Array(size));
+if(cljs.core.seq_QMARK_(init_val_or_seq)){
+var s = cljs.core.seq(init_val_or_seq);
+var i = (0);
+var s__$1 = s;
+while(true){
+if(((s__$1) && ((i < size)))){
+(a[i] = cljs.core.first(s__$1));
+
+var G__10842 = (i + (1));
+var G__10843 = cljs.core.next(s__$1);
+i = G__10842;
+s__$1 = G__10843;
+continue;
+} else {
+return a;
+}
+break;
+}
+} else {
+var n__8769__auto___10844 = size;
+var i_10845 = (0);
+while(true){
+if((i_10845 < n__8769__auto___10844)){
+(a[i_10845] = init_val_or_seq);
+
+var G__10846 = (i_10845 + (1));
+i_10845 = G__10846;
+continue;
+} else {
+}
+break;
+}
+
+return a;
+}
+});
+
+cljs.core.int_array.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Creates an array of longs. Does not coerce array, provided for compatibility
+ * with Clojure.
+ */
+cljs.core.long_array = (function cljs$core$long_array(var_args){
+var G__10848 = arguments.length;
+switch (G__10848) {
+case 1:
+return cljs.core.long_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.long_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.long_array.cljs$core$IFn$_invoke$arity$1 = (function (size_or_seq){
+if(typeof size_or_seq === 'number'){
+return cljs.core.long_array.cljs$core$IFn$_invoke$arity$2(size_or_seq,null);
+} else {
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(size_or_seq);
+}
+});
+
+cljs.core.long_array.cljs$core$IFn$_invoke$arity$2 = (function (size,init_val_or_seq){
+var a = (new Array(size));
+if(cljs.core.seq_QMARK_(init_val_or_seq)){
+var s = cljs.core.seq(init_val_or_seq);
+var i = (0);
+var s__$1 = s;
+while(true){
+if(((s__$1) && ((i < size)))){
+(a[i] = cljs.core.first(s__$1));
+
+var G__10850 = (i + (1));
+var G__10851 = cljs.core.next(s__$1);
+i = G__10850;
+s__$1 = G__10851;
+continue;
+} else {
+return a;
+}
+break;
+}
+} else {
+var n__8769__auto___10852 = size;
+var i_10853 = (0);
+while(true){
+if((i_10853 < n__8769__auto___10852)){
+(a[i_10853] = init_val_or_seq);
+
+var G__10854 = (i_10853 + (1));
+i_10853 = G__10854;
+continue;
+} else {
+}
+break;
+}
+
+return a;
+}
+});
+
+cljs.core.long_array.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Creates an array of doubles. Does not coerce array, provided for compatibility
+ * with Clojure.
+ */
+cljs.core.double_array = (function cljs$core$double_array(var_args){
+var G__10856 = arguments.length;
+switch (G__10856) {
+case 1:
+return cljs.core.double_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.double_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.double_array.cljs$core$IFn$_invoke$arity$1 = (function (size_or_seq){
+if(typeof size_or_seq === 'number'){
+return cljs.core.double_array.cljs$core$IFn$_invoke$arity$2(size_or_seq,null);
+} else {
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(size_or_seq);
+}
+});
+
+cljs.core.double_array.cljs$core$IFn$_invoke$arity$2 = (function (size,init_val_or_seq){
+var a = (new Array(size));
+if(cljs.core.seq_QMARK_(init_val_or_seq)){
+var s = cljs.core.seq(init_val_or_seq);
+var i = (0);
+var s__$1 = s;
+while(true){
+if(((s__$1) && ((i < size)))){
+(a[i] = cljs.core.first(s__$1));
+
+var G__10858 = (i + (1));
+var G__10859 = cljs.core.next(s__$1);
+i = G__10858;
+s__$1 = G__10859;
+continue;
+} else {
+return a;
+}
+break;
+}
+} else {
+var n__8769__auto___10860 = size;
+var i_10861 = (0);
+while(true){
+if((i_10861 < n__8769__auto___10860)){
+(a[i_10861] = init_val_or_seq);
+
+var G__10862 = (i_10861 + (1));
+i_10861 = G__10862;
+continue;
+} else {
+}
+break;
+}
+
+return a;
+}
+});
+
+cljs.core.double_array.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Creates an array of objects. Does not coerce array, provided for compatibility
+ * with Clojure.
+ */
+cljs.core.object_array = (function cljs$core$object_array(var_args){
+var G__10864 = arguments.length;
+switch (G__10864) {
+case 1:
+return cljs.core.object_array.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.object_array.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.object_array.cljs$core$IFn$_invoke$arity$1 = (function (size_or_seq){
+if(typeof size_or_seq === 'number'){
+return cljs.core.object_array.cljs$core$IFn$_invoke$arity$2(size_or_seq,null);
+} else {
+return cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(size_or_seq);
+}
+});
+
+cljs.core.object_array.cljs$core$IFn$_invoke$arity$2 = (function (size,init_val_or_seq){
+var a = (new Array(size));
+if(cljs.core.seq_QMARK_(init_val_or_seq)){
+var s = cljs.core.seq(init_val_or_seq);
+var i = (0);
+var s__$1 = s;
+while(true){
+if(((s__$1) && ((i < size)))){
+(a[i] = cljs.core.first(s__$1));
+
+var G__10866 = (i + (1));
+var G__10867 = cljs.core.next(s__$1);
+i = G__10866;
+s__$1 = G__10867;
+continue;
+} else {
+return a;
+}
+break;
+}
+} else {
+var n__8769__auto___10868 = size;
+var i_10869 = (0);
+while(true){
+if((i_10869 < n__8769__auto___10868)){
+(a[i_10869] = init_val_or_seq);
+
+var G__10870 = (i_10869 + (1));
+i_10869 = G__10870;
+continue;
+} else {
+}
+break;
+}
+
+return a;
+}
+});
+
+cljs.core.object_array.cljs$lang$maxFixedArity = 2;
+
+/**
+ * If coll is counted? returns its count, else will count at most the first n
+ * elements of coll using its seq
+ */
+cljs.core.bounded_count = (function cljs$core$bounded_count(n,coll){
+if(cljs.core.counted_QMARK_(coll)){
+return cljs.core.count(coll);
+} else {
+var i = (0);
+var s = cljs.core.seq(coll);
+while(true){
+if((((!((s == null)))) && ((i < n)))){
+var G__10871 = (i + (1));
+var G__10872 = cljs.core.next(s);
+i = G__10871;
+s = G__10872;
+continue;
+} else {
+return i;
+}
+break;
+}
+}
+});
+cljs.core.spread = (function cljs$core$spread(arglist){
+if((arglist == null)){
+return null;
+} else {
+var n = cljs.core.next(arglist);
+if((n == null)){
+return cljs.core.seq(cljs.core.first(arglist));
+} else {
+return cljs.core.cons(cljs.core.first(arglist),(cljs.core.spread.cljs$core$IFn$_invoke$arity$1 ? cljs.core.spread.cljs$core$IFn$_invoke$arity$1(n) : cljs.core.spread.call(null,n)));
+}
+}
+});
+/**
+ * Returns a lazy seq representing the concatenation of the elements in the supplied colls.
+ */
+cljs.core.concat = (function cljs$core$concat(var_args){
+var G__10877 = arguments.length;
+switch (G__10877) {
+case 0:
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10879 = arguments.length;
+var i__9001__auto___10880 = (0);
+while(true){
+if((i__9001__auto___10880 < len__9000__auto___10879)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10880]));
+
+var G__10881 = (i__9001__auto___10880 + (1));
+i__9001__auto___10880 = G__10881;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.concat.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (new cljs.core.LazySeq(null,(function (){
+return null;
+}),null,null));
+});
+
+cljs.core.concat.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (new cljs.core.LazySeq(null,(function (){
+return x;
+}),null,null));
+});
+
+cljs.core.concat.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (new cljs.core.LazySeq(null,(function (){
+var s = cljs.core.seq(x);
+if(s){
+if(cljs.core.chunked_seq_QMARK_(s)){
+return cljs.core.chunk_cons(cljs.core.chunk_first(s),cljs.core.concat.cljs$core$IFn$_invoke$arity$2(cljs.core.chunk_rest(s),y));
+} else {
+return cljs.core.cons(cljs.core.first(s),cljs.core.concat.cljs$core$IFn$_invoke$arity$2(cljs.core.rest(s),y));
+}
+} else {
+return y;
+}
+}),null,null));
+});
+
+cljs.core.concat.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,zs){
+var cat = (function cljs$core$cat(xys,zs__$1){
+return (new cljs.core.LazySeq(null,(function (){
+var xys__$1 = cljs.core.seq(xys);
+if(xys__$1){
+if(cljs.core.chunked_seq_QMARK_(xys__$1)){
+return cljs.core.chunk_cons(cljs.core.chunk_first(xys__$1),cljs$core$cat(cljs.core.chunk_rest(xys__$1),zs__$1));
+} else {
+return cljs.core.cons(cljs.core.first(xys__$1),cljs$core$cat(cljs.core.rest(xys__$1),zs__$1));
+}
+} else {
+if(cljs.core.truth_(zs__$1)){
+return cljs$core$cat(cljs.core.first(zs__$1),cljs.core.next(zs__$1));
+} else {
+return null;
+}
+}
+}),null,null));
+});
+return cat(cljs.core.concat.cljs$core$IFn$_invoke$arity$2(x,y),zs);
+});
+
+/** @this {Function} */
+cljs.core.concat.cljs$lang$applyTo = (function (seq10874){
+var G__10875 = cljs.core.first(seq10874);
+var seq10874__$1 = cljs.core.next(seq10874);
+var G__10876 = cljs.core.first(seq10874__$1);
+var seq10874__$2 = cljs.core.next(seq10874__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10875,G__10876,seq10874__$2);
+});
+
+cljs.core.concat.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Creates a new list containing the items prepended to the rest, the
+ * last of which will be treated as a sequence.
+ */
+cljs.core.list_STAR_ = (function cljs$core$list_STAR_(var_args){
+var G__10888 = arguments.length;
+switch (G__10888) {
+case 1:
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10890 = arguments.length;
+var i__9001__auto___10891 = (0);
+while(true){
+if((i__9001__auto___10891 < len__9000__auto___10890)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10891]));
+
+var G__10892 = (i__9001__auto___10891 + (1));
+i__9001__auto___10891 = G__10892;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((4)),(0),null));
+return cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$1 = (function (args){
+return cljs.core.seq(args);
+});
+
+cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$2 = (function (a,args){
+return cljs.core.cons(a,args);
+});
+
+cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$3 = (function (a,b,args){
+return cljs.core.cons(a,cljs.core.cons(b,args));
+});
+
+cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4 = (function (a,b,c,args){
+return cljs.core.cons(a,cljs.core.cons(b,cljs.core.cons(c,args)));
+});
+
+cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$variadic = (function (a,b,c,d,more){
+return cljs.core.cons(a,cljs.core.cons(b,cljs.core.cons(c,cljs.core.cons(d,cljs.core.spread(more)))));
+});
+
+/** @this {Function} */
+cljs.core.list_STAR_.cljs$lang$applyTo = (function (seq10883){
+var G__10884 = cljs.core.first(seq10883);
+var seq10883__$1 = cljs.core.next(seq10883);
+var G__10885 = cljs.core.first(seq10883__$1);
+var seq10883__$2 = cljs.core.next(seq10883__$1);
+var G__10886 = cljs.core.first(seq10883__$2);
+var seq10883__$3 = cljs.core.next(seq10883__$2);
+var G__10887 = cljs.core.first(seq10883__$3);
+var seq10883__$4 = cljs.core.next(seq10883__$3);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10884,G__10885,G__10886,G__10887,seq10883__$4);
+});
+
+cljs.core.list_STAR_.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Returns a new, transient version of the collection, in constant time.
+ */
+cljs.core.transient$ = (function cljs$core$transient(coll){
+return cljs.core._as_transient(coll);
+});
+/**
+ * Returns a new, persistent version of the transient collection, in
+ * constant time. The transient collection cannot be used after this
+ * call, any such use will throw an exception.
+ */
+cljs.core.persistent_BANG_ = (function cljs$core$persistent_BANG_(tcoll){
+return cljs.core._persistent_BANG_(tcoll);
+});
+/**
+ * Adds val to the transient collection, and return tcoll. The 'addition'
+ * may happen at different 'places' depending on the concrete type.
+ */
+cljs.core.conj_BANG_ = (function cljs$core$conj_BANG_(var_args){
+var G__10897 = arguments.length;
+switch (G__10897) {
+case 0:
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10899 = arguments.length;
+var i__9001__auto___10900 = (0);
+while(true){
+if((i__9001__auto___10900 < len__9000__auto___10899)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10900]));
+
+var G__10901 = (i__9001__auto___10900 + (1));
+i__9001__auto___10900 = G__10901;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.transient$(cljs.core.PersistentVector.EMPTY);
+});
+
+cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$1 = (function (tcoll){
+return tcoll;
+});
+
+cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (tcoll,val){
+return cljs.core._conj_BANG_(tcoll,val);
+});
+
+cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (tcoll,val,vals){
+while(true){
+var ntcoll = cljs.core._conj_BANG_(tcoll,val);
+if(cljs.core.truth_(vals)){
+var G__10902 = ntcoll;
+var G__10903 = cljs.core.first(vals);
+var G__10904 = cljs.core.next(vals);
+tcoll = G__10902;
+val = G__10903;
+vals = G__10904;
+continue;
+} else {
+return ntcoll;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core.conj_BANG_.cljs$lang$applyTo = (function (seq10894){
+var G__10895 = cljs.core.first(seq10894);
+var seq10894__$1 = cljs.core.next(seq10894);
+var G__10896 = cljs.core.first(seq10894__$1);
+var seq10894__$2 = cljs.core.next(seq10894__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10895,G__10896,seq10894__$2);
+});
+
+cljs.core.conj_BANG_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * When applied to a transient map, adds mapping of key(s) to
+ * val(s). When applied to a transient vector, sets the val at index.
+ * Note - index must be <= (count vector). Returns coll.
+ */
+cljs.core.assoc_BANG_ = (function cljs$core$assoc_BANG_(var_args){
+var G__10910 = arguments.length;
+switch (G__10910) {
+case 3:
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10912 = arguments.length;
+var i__9001__auto___10913 = (0);
+while(true){
+if((i__9001__auto___10913 < len__9000__auto___10912)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10913]));
+
+var G__10914 = (i__9001__auto___10913 + (1));
+i__9001__auto___10913 = G__10914;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3 = (function (tcoll,key,val){
+return cljs.core._assoc_BANG_(tcoll,key,val);
+});
+
+cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (tcoll,key,val,kvs){
+while(true){
+var ntcoll = cljs.core._assoc_BANG_(tcoll,key,val);
+if(cljs.core.truth_(kvs)){
+var G__10915 = ntcoll;
+var G__10916 = cljs.core.first(kvs);
+var G__10917 = cljs.core.second(kvs);
+var G__10918 = cljs.core.nnext(kvs);
+tcoll = G__10915;
+key = G__10916;
+val = G__10917;
+kvs = G__10918;
+continue;
+} else {
+return ntcoll;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core.assoc_BANG_.cljs$lang$applyTo = (function (seq10906){
+var G__10907 = cljs.core.first(seq10906);
+var seq10906__$1 = cljs.core.next(seq10906);
+var G__10908 = cljs.core.first(seq10906__$1);
+var seq10906__$2 = cljs.core.next(seq10906__$1);
+var G__10909 = cljs.core.first(seq10906__$2);
+var seq10906__$3 = cljs.core.next(seq10906__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10907,G__10908,G__10909,seq10906__$3);
+});
+
+cljs.core.assoc_BANG_.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Returns a transient map that doesn't contain a mapping for key(s).
+ */
+cljs.core.dissoc_BANG_ = (function cljs$core$dissoc_BANG_(var_args){
+var G__10923 = arguments.length;
+switch (G__10923) {
+case 2:
+return cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10925 = arguments.length;
+var i__9001__auto___10926 = (0);
+while(true){
+if((i__9001__auto___10926 < len__9000__auto___10925)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10926]));
+
+var G__10927 = (i__9001__auto___10926 + (1));
+i__9001__auto___10926 = G__10927;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (tcoll,key){
+return cljs.core._dissoc_BANG_(tcoll,key);
+});
+
+cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (tcoll,key,ks){
+while(true){
+var ntcoll = cljs.core._dissoc_BANG_(tcoll,key);
+if(cljs.core.truth_(ks)){
+var G__10928 = ntcoll;
+var G__10929 = cljs.core.first(ks);
+var G__10930 = cljs.core.next(ks);
+tcoll = G__10928;
+key = G__10929;
+ks = G__10930;
+continue;
+} else {
+return ntcoll;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core.dissoc_BANG_.cljs$lang$applyTo = (function (seq10920){
+var G__10921 = cljs.core.first(seq10920);
+var seq10920__$1 = cljs.core.next(seq10920);
+var G__10922 = cljs.core.first(seq10920__$1);
+var seq10920__$2 = cljs.core.next(seq10920__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10921,G__10922,seq10920__$2);
+});
+
+cljs.core.dissoc_BANG_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Removes the last item from a transient vector. If
+ * the collection is empty, throws an exception. Returns tcoll
+ */
+cljs.core.pop_BANG_ = (function cljs$core$pop_BANG_(tcoll){
+return cljs.core._pop_BANG_(tcoll);
+});
+/**
+ * disj[oin]. Returns a transient set of the same (hashed/sorted) type, that
+ * does not contain key(s).
+ */
+cljs.core.disj_BANG_ = (function cljs$core$disj_BANG_(var_args){
+var G__10935 = arguments.length;
+switch (G__10935) {
+case 2:
+return cljs.core.disj_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10937 = arguments.length;
+var i__9001__auto___10938 = (0);
+while(true){
+if((i__9001__auto___10938 < len__9000__auto___10937)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10938]));
+
+var G__10939 = (i__9001__auto___10938 + (1));
+i__9001__auto___10938 = G__10939;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.disj_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.disj_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (tcoll,val){
+return cljs.core._disjoin_BANG_(tcoll,val);
+});
+
+cljs.core.disj_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (tcoll,val,vals){
+while(true){
+var ntcoll = cljs.core._disjoin_BANG_(tcoll,val);
+if(cljs.core.truth_(vals)){
+var G__10940 = ntcoll;
+var G__10941 = cljs.core.first(vals);
+var G__10942 = cljs.core.next(vals);
+tcoll = G__10940;
+val = G__10941;
+vals = G__10942;
+continue;
+} else {
+return ntcoll;
+}
+break;
+}
+});
+
+/** @this {Function} */
+cljs.core.disj_BANG_.cljs$lang$applyTo = (function (seq10932){
+var G__10933 = cljs.core.first(seq10932);
+var seq10932__$1 = cljs.core.next(seq10932);
+var G__10934 = cljs.core.first(seq10932__$1);
+var seq10932__$2 = cljs.core.next(seq10932__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10933,G__10934,seq10932__$2);
+});
+
+cljs.core.disj_BANG_.cljs$lang$maxFixedArity = (2);
+
+
+cljs.core.apply_to = (function cljs$core$apply_to(f,argc,args){
+var args__$1 = cljs.core.seq(args);
+if((argc === (0))){
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+} else {
+var a8813 = cljs.core._first(args__$1);
+var args__$2 = cljs.core._rest(args__$1);
+if((argc === (1))){
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(a8813) : f.call(null,a8813));
+} else {
+var b8814 = cljs.core._first(args__$2);
+var args__$3 = cljs.core._rest(args__$2);
+if((argc === (2))){
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(a8813,b8814) : f.call(null,a8813,b8814));
+} else {
+var c8815 = cljs.core._first(args__$3);
+var args__$4 = cljs.core._rest(args__$3);
+if((argc === (3))){
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(a8813,b8814,c8815) : f.call(null,a8813,b8814,c8815));
+} else {
+var d8816 = cljs.core._first(args__$4);
+var args__$5 = cljs.core._rest(args__$4);
+if((argc === (4))){
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(a8813,b8814,c8815,d8816) : f.call(null,a8813,b8814,c8815,d8816));
+} else {
+var e8817 = cljs.core._first(args__$5);
+var args__$6 = cljs.core._rest(args__$5);
+if((argc === (5))){
+return (f.cljs$core$IFn$_invoke$arity$5 ? f.cljs$core$IFn$_invoke$arity$5(a8813,b8814,c8815,d8816,e8817) : f.call(null,a8813,b8814,c8815,d8816,e8817));
+} else {
+var f8818 = cljs.core._first(args__$6);
+var args__$7 = cljs.core._rest(args__$6);
+if((argc === (6))){
+return (f.cljs$core$IFn$_invoke$arity$6 ? f.cljs$core$IFn$_invoke$arity$6(a8813,b8814,c8815,d8816,e8817,f8818) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818));
+} else {
+var g8819 = cljs.core._first(args__$7);
+var args__$8 = cljs.core._rest(args__$7);
+if((argc === (7))){
+return (f.cljs$core$IFn$_invoke$arity$7 ? f.cljs$core$IFn$_invoke$arity$7(a8813,b8814,c8815,d8816,e8817,f8818,g8819) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819));
+} else {
+var h8820 = cljs.core._first(args__$8);
+var args__$9 = cljs.core._rest(args__$8);
+if((argc === (8))){
+return (f.cljs$core$IFn$_invoke$arity$8 ? f.cljs$core$IFn$_invoke$arity$8(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820));
+} else {
+var i8821 = cljs.core._first(args__$9);
+var args__$10 = cljs.core._rest(args__$9);
+if((argc === (9))){
+return (f.cljs$core$IFn$_invoke$arity$9 ? f.cljs$core$IFn$_invoke$arity$9(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821));
+} else {
+var j8822 = cljs.core._first(args__$10);
+var args__$11 = cljs.core._rest(args__$10);
+if((argc === (10))){
+return (f.cljs$core$IFn$_invoke$arity$10 ? f.cljs$core$IFn$_invoke$arity$10(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822));
+} else {
+var k8823 = cljs.core._first(args__$11);
+var args__$12 = cljs.core._rest(args__$11);
+if((argc === (11))){
+return (f.cljs$core$IFn$_invoke$arity$11 ? f.cljs$core$IFn$_invoke$arity$11(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823));
+} else {
+var l8824 = cljs.core._first(args__$12);
+var args__$13 = cljs.core._rest(args__$12);
+if((argc === (12))){
+return (f.cljs$core$IFn$_invoke$arity$12 ? f.cljs$core$IFn$_invoke$arity$12(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824));
+} else {
+var m8825 = cljs.core._first(args__$13);
+var args__$14 = cljs.core._rest(args__$13);
+if((argc === (13))){
+return (f.cljs$core$IFn$_invoke$arity$13 ? f.cljs$core$IFn$_invoke$arity$13(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825));
+} else {
+var n8826 = cljs.core._first(args__$14);
+var args__$15 = cljs.core._rest(args__$14);
+if((argc === (14))){
+return (f.cljs$core$IFn$_invoke$arity$14 ? f.cljs$core$IFn$_invoke$arity$14(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826));
+} else {
+var o8827 = cljs.core._first(args__$15);
+var args__$16 = cljs.core._rest(args__$15);
+if((argc === (15))){
+return (f.cljs$core$IFn$_invoke$arity$15 ? f.cljs$core$IFn$_invoke$arity$15(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827));
+} else {
+var p8828 = cljs.core._first(args__$16);
+var args__$17 = cljs.core._rest(args__$16);
+if((argc === (16))){
+return (f.cljs$core$IFn$_invoke$arity$16 ? f.cljs$core$IFn$_invoke$arity$16(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827,p8828) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827,p8828));
+} else {
+var q8829 = cljs.core._first(args__$17);
+var args__$18 = cljs.core._rest(args__$17);
+if((argc === (17))){
+return (f.cljs$core$IFn$_invoke$arity$17 ? f.cljs$core$IFn$_invoke$arity$17(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827,p8828,q8829) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827,p8828,q8829));
+} else {
+var r8830 = cljs.core._first(args__$18);
+var args__$19 = cljs.core._rest(args__$18);
+if((argc === (18))){
+return (f.cljs$core$IFn$_invoke$arity$18 ? f.cljs$core$IFn$_invoke$arity$18(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827,p8828,q8829,r8830) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827,p8828,q8829,r8830));
+} else {
+var s8831 = cljs.core._first(args__$19);
+var args__$20 = cljs.core._rest(args__$19);
+if((argc === (19))){
+return (f.cljs$core$IFn$_invoke$arity$19 ? f.cljs$core$IFn$_invoke$arity$19(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827,p8828,q8829,r8830,s8831) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827,p8828,q8829,r8830,s8831));
+} else {
+var t8832 = cljs.core._first(args__$20);
+var args__$21 = cljs.core._rest(args__$20);
+if((argc === (20))){
+return (f.cljs$core$IFn$_invoke$arity$20 ? f.cljs$core$IFn$_invoke$arity$20(a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827,p8828,q8829,r8830,s8831,t8832) : f.call(null,a8813,b8814,c8815,d8816,e8817,f8818,g8819,h8820,i8821,j8822,k8823,l8824,m8825,n8826,o8827,p8828,q8829,r8830,s8831,t8832));
+} else {
+throw (new Error("Only up to 20 arguments supported on functions"));
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+});
+
+/**
+ * Internal. DO NOT USE!
+ * Assumes args was already called with seq beforehand!
+ */
+cljs.core.apply_to_simple = (function cljs$core$apply_to_simple(var_args){
+var G__10944 = arguments.length;
+switch (G__10944) {
+case 2:
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 6:
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$2 = (function (f,args){
+if((args == null)){
+if(f.cljs$core$IFn$_invoke$arity$0){
+return f.cljs$core$IFn$_invoke$arity$0();
+} else {
+return f.call(f);
+}
+} else {
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$3(f,cljs.core._first(args),cljs.core.next(args));
+}
+});
+
+cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$3 = (function (f,a0,args){
+if((args == null)){
+if(f.cljs$core$IFn$_invoke$arity$1){
+return f.cljs$core$IFn$_invoke$arity$1(a0);
+} else {
+return f.call(f,a0);
+}
+} else {
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$4(f,a0,cljs.core._first(args),cljs.core.next(args));
+}
+});
+
+cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$4 = (function (f,a0,a1,args){
+if((args == null)){
+if(f.cljs$core$IFn$_invoke$arity$2){
+return f.cljs$core$IFn$_invoke$arity$2(a0,a1);
+} else {
+return f.call(f,a0,a1);
+}
+} else {
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$5(f,a0,a1,cljs.core._first(args),cljs.core.next(args));
+}
+});
+
+cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$5 = (function (f,a0,a1,a2,args){
+if((args == null)){
+if(f.cljs$core$IFn$_invoke$arity$3){
+return f.cljs$core$IFn$_invoke$arity$3(a0,a1,a2);
+} else {
+return f.call(f,a0,a1,a2);
+}
+} else {
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$6(f,a0,a1,a2,cljs.core._first(args),cljs.core.next(args));
+}
+});
+
+cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$6 = (function (f,a0,a1,a2,a3,args){
+if((args == null)){
+if(f.cljs$core$IFn$_invoke$arity$4){
+return f.cljs$core$IFn$_invoke$arity$4(a0,a1,a2,a3);
+} else {
+return f.call(f,a0,a1,a2,a3);
+}
+} else {
+var a4 = cljs.core._first(args);
+var next_4 = cljs.core.next(args);
+if((next_4 == null)){
+if(f.cljs$core$IFn$_invoke$arity$5){
+return f.cljs$core$IFn$_invoke$arity$5(a0,a1,a2,a3,a4);
+} else {
+return f.call(f,a0,a1,a2,a3,a4);
+}
+} else {
+var a5 = cljs.core._first(next_4);
+var next_5 = cljs.core.next(next_4);
+if((next_5 == null)){
+if(f.cljs$core$IFn$_invoke$arity$6){
+return f.cljs$core$IFn$_invoke$arity$6(a0,a1,a2,a3,a4,a5);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5);
+}
+} else {
+var a6 = cljs.core._first(next_5);
+var next_6 = cljs.core.next(next_5);
+if((next_6 == null)){
+if(f.cljs$core$IFn$_invoke$arity$7){
+return f.cljs$core$IFn$_invoke$arity$7(a0,a1,a2,a3,a4,a5,a6);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6);
+}
+} else {
+var a7 = cljs.core._first(next_6);
+var next_7 = cljs.core.next(next_6);
+if((next_7 == null)){
+if(f.cljs$core$IFn$_invoke$arity$8){
+return f.cljs$core$IFn$_invoke$arity$8(a0,a1,a2,a3,a4,a5,a6,a7);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7);
+}
+} else {
+var a8 = cljs.core._first(next_7);
+var next_8 = cljs.core.next(next_7);
+if((next_8 == null)){
+if(f.cljs$core$IFn$_invoke$arity$9){
+return f.cljs$core$IFn$_invoke$arity$9(a0,a1,a2,a3,a4,a5,a6,a7,a8);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8);
+}
+} else {
+var a9 = cljs.core._first(next_8);
+var next_9 = cljs.core.next(next_8);
+if((next_9 == null)){
+if(f.cljs$core$IFn$_invoke$arity$10){
+return f.cljs$core$IFn$_invoke$arity$10(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
+}
+} else {
+var a10 = cljs.core._first(next_9);
+var next_10 = cljs.core.next(next_9);
+if((next_10 == null)){
+if(f.cljs$core$IFn$_invoke$arity$11){
+return f.cljs$core$IFn$_invoke$arity$11(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
+}
+} else {
+var a11 = cljs.core._first(next_10);
+var next_11 = cljs.core.next(next_10);
+if((next_11 == null)){
+if(f.cljs$core$IFn$_invoke$arity$12){
+return f.cljs$core$IFn$_invoke$arity$12(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);
+}
+} else {
+var a12 = cljs.core._first(next_11);
+var next_12 = cljs.core.next(next_11);
+if((next_12 == null)){
+if(f.cljs$core$IFn$_invoke$arity$13){
+return f.cljs$core$IFn$_invoke$arity$13(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);
+}
+} else {
+var a13 = cljs.core._first(next_12);
+var next_13 = cljs.core.next(next_12);
+if((next_13 == null)){
+if(f.cljs$core$IFn$_invoke$arity$14){
+return f.cljs$core$IFn$_invoke$arity$14(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13);
+}
+} else {
+var a14 = cljs.core._first(next_13);
+var next_14 = cljs.core.next(next_13);
+if((next_14 == null)){
+if(f.cljs$core$IFn$_invoke$arity$15){
+return f.cljs$core$IFn$_invoke$arity$15(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14);
+}
+} else {
+var a15 = cljs.core._first(next_14);
+var next_15 = cljs.core.next(next_14);
+if((next_15 == null)){
+if(f.cljs$core$IFn$_invoke$arity$16){
+return f.cljs$core$IFn$_invoke$arity$16(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15);
+}
+} else {
+var a16 = cljs.core._first(next_15);
+var next_16 = cljs.core.next(next_15);
+if((next_16 == null)){
+if(f.cljs$core$IFn$_invoke$arity$17){
+return f.cljs$core$IFn$_invoke$arity$17(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16);
+}
+} else {
+var a17 = cljs.core._first(next_16);
+var next_17 = cljs.core.next(next_16);
+if((next_17 == null)){
+if(f.cljs$core$IFn$_invoke$arity$18){
+return f.cljs$core$IFn$_invoke$arity$18(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17);
+}
+} else {
+var a18 = cljs.core._first(next_17);
+var next_18 = cljs.core.next(next_17);
+if((next_18 == null)){
+if(f.cljs$core$IFn$_invoke$arity$19){
+return f.cljs$core$IFn$_invoke$arity$19(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18);
+}
+} else {
+var a19 = cljs.core._first(next_18);
+var next_19 = cljs.core.next(next_18);
+if((next_19 == null)){
+if(f.cljs$core$IFn$_invoke$arity$20){
+return f.cljs$core$IFn$_invoke$arity$20(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19);
+} else {
+return f.call(f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19);
+}
+} else {
+var arr__8841__auto__ = [a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19];
+var s__8842__auto___10946 = next_19;
+while(true){
+if(s__8842__auto___10946){
+arr__8841__auto__.push(cljs.core._first(s__8842__auto___10946));
+
+var G__10947 = cljs.core.next(s__8842__auto___10946);
+s__8842__auto___10946 = G__10947;
+continue;
+} else {
+}
+break;
+}
+
+return f.apply(f,arr__8841__auto__);
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+});
+
+cljs.core.apply_to_simple.cljs$lang$maxFixedArity = 6;
+
+/**
+ * Applies fn f to the argument list formed by prepending intervening arguments to args.
+ */
+cljs.core.apply = (function cljs$core$apply(var_args){
+var G__10955 = arguments.length;
+switch (G__10955) {
+case 2:
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10957 = arguments.length;
+var i__9001__auto___10958 = (0);
+while(true){
+if((i__9001__auto___10958 < len__9000__auto___10957)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10958]));
+
+var G__10959 = (i__9001__auto___10958 + (1));
+i__9001__auto___10958 = G__10959;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((5)),(0),null));
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.apply.cljs$core$IFn$_invoke$arity$2 = (function (f,args){
+if(f.cljs$lang$applyTo){
+var fixed_arity = f.cljs$lang$maxFixedArity;
+var bc = cljs.core.bounded_count((fixed_arity + (1)),args);
+if((bc <= fixed_arity)){
+return cljs.core.apply_to(f,bc,args);
+} else {
+return f.cljs$lang$applyTo(args);
+}
+} else {
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$2(f,cljs.core.seq(args));
+}
+});
+
+cljs.core.apply.cljs$core$IFn$_invoke$arity$3 = (function (f,x,args){
+if(f.cljs$lang$applyTo){
+var arglist = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$2(x,args);
+var fixed_arity = f.cljs$lang$maxFixedArity;
+var bc = (cljs.core.bounded_count(fixed_arity,args) + (1));
+if((bc <= fixed_arity)){
+return cljs.core.apply_to(f,bc,arglist);
+} else {
+return f.cljs$lang$applyTo(arglist);
+}
+} else {
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$3(f,x,cljs.core.seq(args));
+}
+});
+
+cljs.core.apply.cljs$core$IFn$_invoke$arity$4 = (function (f,x,y,args){
+if(f.cljs$lang$applyTo){
+var arglist = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$3(x,y,args);
+var fixed_arity = f.cljs$lang$maxFixedArity;
+var bc = ((2) + cljs.core.bounded_count((fixed_arity - (1)),args));
+if((bc <= fixed_arity)){
+return cljs.core.apply_to(f,bc,arglist);
+} else {
+return f.cljs$lang$applyTo(arglist);
+}
+} else {
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$4(f,x,y,cljs.core.seq(args));
+}
+});
+
+cljs.core.apply.cljs$core$IFn$_invoke$arity$5 = (function (f,x,y,z,args){
+if(f.cljs$lang$applyTo){
+var arglist = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4(x,y,z,args);
+var fixed_arity = f.cljs$lang$maxFixedArity;
+var bc = ((3) + cljs.core.bounded_count((fixed_arity - (2)),args));
+if((bc <= fixed_arity)){
+return cljs.core.apply_to(f,bc,arglist);
+} else {
+return f.cljs$lang$applyTo(arglist);
+}
+} else {
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$5(f,x,y,z,cljs.core.seq(args));
+}
+});
+
+cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic = (function (f,a,b,c,d,args){
+if(f.cljs$lang$applyTo){
+var spread_args = cljs.core.spread(args);
+var arglist = cljs.core.cons(a,cljs.core.cons(b,cljs.core.cons(c,cljs.core.cons(d,spread_args))));
+var fixed_arity = f.cljs$lang$maxFixedArity;
+var bc = ((4) + cljs.core.bounded_count((fixed_arity - (3)),spread_args));
+if((bc <= fixed_arity)){
+return cljs.core.apply_to(f,bc,arglist);
+} else {
+return f.cljs$lang$applyTo(arglist);
+}
+} else {
+return cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$6(f,a,b,c,d,cljs.core.spread(args));
+}
+});
+
+/** @this {Function} */
+cljs.core.apply.cljs$lang$applyTo = (function (seq10949){
+var G__10950 = cljs.core.first(seq10949);
+var seq10949__$1 = cljs.core.next(seq10949);
+var G__10951 = cljs.core.first(seq10949__$1);
+var seq10949__$2 = cljs.core.next(seq10949__$1);
+var G__10952 = cljs.core.first(seq10949__$2);
+var seq10949__$3 = cljs.core.next(seq10949__$2);
+var G__10953 = cljs.core.first(seq10949__$3);
+var seq10949__$4 = cljs.core.next(seq10949__$3);
+var G__10954 = cljs.core.first(seq10949__$4);
+var seq10949__$5 = cljs.core.next(seq10949__$4);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10950,G__10951,G__10952,G__10953,G__10954,seq10949__$5);
+});
+
+cljs.core.apply.cljs$lang$maxFixedArity = (5);
+
+/**
+ * Returns an object of the same type and value as obj, with
+ * (apply f (meta obj) args) as its metadata.
+ */
+cljs.core.vary_meta = (function cljs$core$vary_meta(var_args){
+var G__10968 = arguments.length;
+switch (G__10968) {
+case 2:
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 6:
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10985 = arguments.length;
+var i__9001__auto___10986 = (0);
+while(true){
+if((i__9001__auto___10986 < len__9000__auto___10985)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10986]));
+
+var G__10987 = (i__9001__auto___10986 + (1));
+i__9001__auto___10986 = G__10987;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((6)),(0),null));
+return cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$2 = (function (obj,f){
+return cljs.core.with_meta(obj,(function (){var G__10969 = cljs.core.meta(obj);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__10969) : f.call(null,G__10969));
+})());
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$3 = (function (obj,f,a){
+return cljs.core.with_meta(obj,(function (){var G__10970 = cljs.core.meta(obj);
+var G__10971 = a;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__10970,G__10971) : f.call(null,G__10970,G__10971));
+})());
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$4 = (function (obj,f,a,b){
+return cljs.core.with_meta(obj,(function (){var G__10972 = cljs.core.meta(obj);
+var G__10973 = a;
+var G__10974 = b;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__10972,G__10973,G__10974) : f.call(null,G__10972,G__10973,G__10974));
+})());
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$5 = (function (obj,f,a,b,c){
+return cljs.core.with_meta(obj,(function (){var G__10975 = cljs.core.meta(obj);
+var G__10976 = a;
+var G__10977 = b;
+var G__10978 = c;
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(G__10975,G__10976,G__10977,G__10978) : f.call(null,G__10975,G__10976,G__10977,G__10978));
+})());
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$6 = (function (obj,f,a,b,c,d){
+return cljs.core.with_meta(obj,(function (){var G__10979 = cljs.core.meta(obj);
+var G__10980 = a;
+var G__10981 = b;
+var G__10982 = c;
+var G__10983 = d;
+return (f.cljs$core$IFn$_invoke$arity$5 ? f.cljs$core$IFn$_invoke$arity$5(G__10979,G__10980,G__10981,G__10982,G__10983) : f.call(null,G__10979,G__10980,G__10981,G__10982,G__10983));
+})());
+});
+
+cljs.core.vary_meta.cljs$core$IFn$_invoke$arity$variadic = (function (obj,f,a,b,c,d,args){
+return cljs.core.with_meta(obj,cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,cljs.core.meta(obj),a,b,c,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([d,args], 0)));
+});
+
+/** @this {Function} */
+cljs.core.vary_meta.cljs$lang$applyTo = (function (seq10961){
+var G__10962 = cljs.core.first(seq10961);
+var seq10961__$1 = cljs.core.next(seq10961);
+var G__10963 = cljs.core.first(seq10961__$1);
+var seq10961__$2 = cljs.core.next(seq10961__$1);
+var G__10964 = cljs.core.first(seq10961__$2);
+var seq10961__$3 = cljs.core.next(seq10961__$2);
+var G__10965 = cljs.core.first(seq10961__$3);
+var seq10961__$4 = cljs.core.next(seq10961__$3);
+var G__10966 = cljs.core.first(seq10961__$4);
+var seq10961__$5 = cljs.core.next(seq10961__$4);
+var G__10967 = cljs.core.first(seq10961__$5);
+var seq10961__$6 = cljs.core.next(seq10961__$5);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10962,G__10963,G__10964,G__10965,G__10966,G__10967,seq10961__$6);
+});
+
+cljs.core.vary_meta.cljs$lang$maxFixedArity = (6);
+
+/**
+ * Same as (not (= obj1 obj2))
+ */
+cljs.core.not_EQ_ = (function cljs$core$not_EQ_(var_args){
+var G__10992 = arguments.length;
+switch (G__10992) {
+case 1:
+return cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___10994 = arguments.length;
+var i__9001__auto___10995 = (0);
+while(true){
+if((i__9001__auto___10995 < len__9000__auto___10994)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___10995]));
+
+var G__10996 = (i__9001__auto___10995 + (1));
+i__9001__auto___10995 = G__10996;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return false;
+});
+
+cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return (!(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x,y)));
+});
+
+cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$variadic = (function (x,y,more){
+return cljs.core.not(cljs.core.apply.cljs$core$IFn$_invoke$arity$4(cljs.core._EQ_,x,y,more));
+});
+
+/** @this {Function} */
+cljs.core.not_EQ_.cljs$lang$applyTo = (function (seq10989){
+var G__10990 = cljs.core.first(seq10989);
+var seq10989__$1 = cljs.core.next(seq10989);
+var G__10991 = cljs.core.first(seq10989__$1);
+var seq10989__$2 = cljs.core.next(seq10989__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__10990,G__10991,seq10989__$2);
+});
+
+cljs.core.not_EQ_.cljs$lang$maxFixedArity = (2);
+
+/**
+ * If coll is empty, returns nil, else coll
+ */
+cljs.core.not_empty = (function cljs$core$not_empty(coll){
+if(cljs.core.seq(coll)){
+return coll;
+} else {
+return null;
+}
+});
+cljs.core.nil_iter = (function cljs$core$nil_iter(){
+if((typeof cljs !== 'undefined') && (typeof cljs.core !== 'undefined') && (typeof cljs.core.t_cljs$core10997 !== 'undefined')){
+} else {
+
+/**
+* @constructor
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.t_cljs$core10997 = (function (meta10998){
+this.meta10998 = meta10998;
+this.cljs$lang$protocol_mask$partition0$ = 393216;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.t_cljs$core10997.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_10999,meta10998__$1){
+var self__ = this;
+var _10999__$1 = this;
+return (new cljs.core.t_cljs$core10997(meta10998__$1));
+});
+
+cljs.core.t_cljs$core10997.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_10999){
+var self__ = this;
+var _10999__$1 = this;
+return self__.meta10998;
+});
+
+cljs.core.t_cljs$core10997.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return false;
+});
+
+cljs.core.t_cljs$core10997.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("No such element"));
+});
+
+cljs.core.t_cljs$core10997.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.t_cljs$core10997.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta10998","meta10998",1410155594,null)], null);
+});
+
+cljs.core.t_cljs$core10997.cljs$lang$type = true;
+
+cljs.core.t_cljs$core10997.cljs$lang$ctorStr = "cljs.core/t_cljs$core10997";
+
+cljs.core.t_cljs$core10997.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/t_cljs$core10997");
+});
+
+/**
+ * Positional factory function for cljs.core/t_cljs$core10997.
+ */
+cljs.core.__GT_t_cljs$core10997 = (function cljs$core$nil_iter_$___GT_t_cljs$core10997(meta10998){
+return (new cljs.core.t_cljs$core10997(meta10998));
+});
+
+}
+
+return (new cljs.core.t_cljs$core10997(cljs.core.PersistentArrayMap.EMPTY));
+});
+
+/**
+* @constructor
+*/
+cljs.core.StringIter = (function (s,i){
+this.s = s;
+this.i = i;
+});
+cljs.core.StringIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return (self__.i < self__.s.length);
+});
+
+cljs.core.StringIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var ret = self__.s.charAt(self__.i);
+self__.i = (self__.i + (1));
+
+return ret;
+});
+
+cljs.core.StringIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.StringIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"s","s",-948495851,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.StringIter.cljs$lang$type = true;
+
+cljs.core.StringIter.cljs$lang$ctorStr = "cljs.core/StringIter";
+
+cljs.core.StringIter.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/StringIter");
+});
+
+/**
+ * Positional factory function for cljs.core/StringIter.
+ */
+cljs.core.__GT_StringIter = (function cljs$core$__GT_StringIter(s,i){
+return (new cljs.core.StringIter(s,i));
+});
+
+cljs.core.string_iter = (function cljs$core$string_iter(x){
+return (new cljs.core.StringIter(x,(0)));
+});
+
+/**
+* @constructor
+*/
+cljs.core.ArrayIter = (function (arr,i){
+this.arr = arr;
+this.i = i;
+});
+cljs.core.ArrayIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return (self__.i < self__.arr.length);
+});
+
+cljs.core.ArrayIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var ret = (self__.arr[self__.i]);
+self__.i = (self__.i + (1));
+
+return ret;
+});
+
+cljs.core.ArrayIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.ArrayIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ArrayIter.cljs$lang$type = true;
+
+cljs.core.ArrayIter.cljs$lang$ctorStr = "cljs.core/ArrayIter";
+
+cljs.core.ArrayIter.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ArrayIter");
+});
+
+/**
+ * Positional factory function for cljs.core/ArrayIter.
+ */
+cljs.core.__GT_ArrayIter = (function cljs$core$__GT_ArrayIter(arr,i){
+return (new cljs.core.ArrayIter(arr,i));
+});
+
+cljs.core.array_iter = (function cljs$core$array_iter(x){
+return (new cljs.core.ArrayIter(x,(0)));
+});
+cljs.core.INIT = ({});
+cljs.core.START = ({});
+
+/**
+* @constructor
+*/
+cljs.core.SeqIter = (function (_seq,_next){
+this._seq = _seq;
+this._next = _next;
+});
+cljs.core.SeqIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+if((self__._seq === cljs.core.INIT)){
+self__._seq = cljs.core.START;
+
+self__._next = cljs.core.seq(self__._next);
+} else {
+if((self__._seq === self__._next)){
+self__._next = cljs.core.next(self__._seq);
+} else {
+}
+}
+
+return (!((self__._next == null)));
+});
+
+cljs.core.SeqIter.prototype.next = (function (){
+var self__ = this;
+var this$ = this;
+if((!(this$.hasNext()))){
+throw (new Error("No such element"));
+} else {
+self__._seq = self__._next;
+
+return cljs.core.first(self__._next);
+}
+});
+
+cljs.core.SeqIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.SeqIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"_seq","_seq",-449557847,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"_next","_next",101877036,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.SeqIter.cljs$lang$type = true;
+
+cljs.core.SeqIter.cljs$lang$ctorStr = "cljs.core/SeqIter";
+
+cljs.core.SeqIter.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/SeqIter");
+});
+
+/**
+ * Positional factory function for cljs.core/SeqIter.
+ */
+cljs.core.__GT_SeqIter = (function cljs$core$__GT_SeqIter(_seq,_next){
+return (new cljs.core.SeqIter(_seq,_next));
+});
+
+cljs.core.seq_iter = (function cljs$core$seq_iter(coll){
+return (new cljs.core.SeqIter(cljs.core.INIT,coll));
+});
+cljs.core.iter = (function cljs$core$iter(coll){
+if(cljs.core.iterable_QMARK_(coll)){
+return cljs.core._iterator(coll);
+} else {
+if((coll == null)){
+return cljs.core.nil_iter();
+} else {
+if(typeof coll === 'string'){
+return cljs.core.string_iter(coll);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+return cljs.core.array_iter(coll);
+} else {
+if(cljs.core.seqable_QMARK_(coll)){
+return cljs.core.seq_iter(coll);
+} else {
+throw (new Error(["Cannot create iterator from ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(coll)].join('')));
+
+}
+}
+}
+}
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.Many = (function (vals){
+this.vals = vals;
+});
+cljs.core.Many.prototype.add = (function (o){
+var self__ = this;
+var this$ = this;
+self__.vals.push(o);
+
+return this$;
+});
+
+cljs.core.Many.prototype.remove = (function (){
+var self__ = this;
+var this$ = this;
+return self__.vals.shift();
+});
+
+cljs.core.Many.prototype.isEmpty = (function (){
+var self__ = this;
+var this$ = this;
+return (self__.vals.length === (0));
+});
+
+cljs.core.Many.prototype.toString = (function (){
+var self__ = this;
+var this$ = this;
+return ["Many: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.vals)].join('');
+});
+
+cljs.core.Many.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"vals","vals",-1886377036,null)], null);
+});
+
+cljs.core.Many.cljs$lang$type = true;
+
+cljs.core.Many.cljs$lang$ctorStr = "cljs.core/Many";
+
+cljs.core.Many.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Many");
+});
+
+/**
+ * Positional factory function for cljs.core/Many.
+ */
+cljs.core.__GT_Many = (function cljs$core$__GT_Many(vals){
+return (new cljs.core.Many(vals));
+});
+
+cljs.core.NONE = ({});
+
+/**
+* @constructor
+*/
+cljs.core.Single = (function (val){
+this.val = val;
+});
+cljs.core.Single.prototype.add = (function (o){
+var self__ = this;
+var this$ = this;
+if((self__.val === cljs.core.NONE)){
+self__.val = o;
+
+return this$;
+} else {
+return (new cljs.core.Many([self__.val,o]));
+}
+});
+
+cljs.core.Single.prototype.remove = (function (){
+var self__ = this;
+var this$ = this;
+if((self__.val === cljs.core.NONE)){
+throw (new Error("Removing object from empty buffer"));
+} else {
+var ret = self__.val;
+self__.val = cljs.core.NONE;
+
+return ret;
+}
+});
+
+cljs.core.Single.prototype.isEmpty = (function (){
+var self__ = this;
+var this$ = this;
+return (self__.val === cljs.core.NONE);
+});
+
+cljs.core.Single.prototype.toString = (function (){
+var self__ = this;
+var this$ = this;
+return ["Single: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.val)].join('');
+});
+
+cljs.core.Single.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"val","val",1769233139,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Single.cljs$lang$type = true;
+
+cljs.core.Single.cljs$lang$ctorStr = "cljs.core/Single";
+
+cljs.core.Single.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Single");
+});
+
+/**
+ * Positional factory function for cljs.core/Single.
+ */
+cljs.core.__GT_Single = (function cljs$core$__GT_Single(val){
+return (new cljs.core.Single(val));
+});
+
+
+/**
+* @constructor
+*/
+cljs.core.Empty = (function (){
+});
+cljs.core.Empty.prototype.add = (function (o){
+var self__ = this;
+var this$ = this;
+return (new cljs.core.Single(o));
+});
+
+cljs.core.Empty.prototype.remove = (function (){
+var self__ = this;
+var this$ = this;
+throw (new Error("Removing object from empty buffer"));
+});
+
+cljs.core.Empty.prototype.isEmpty = (function (){
+var self__ = this;
+var this$ = this;
+return true;
+});
+
+cljs.core.Empty.prototype.toString = (function (){
+var self__ = this;
+var this$ = this;
+return "Empty";
+});
+
+cljs.core.Empty.getBasis = (function (){
+return cljs.core.PersistentVector.EMPTY;
+});
+
+cljs.core.Empty.cljs$lang$type = true;
+
+cljs.core.Empty.cljs$lang$ctorStr = "cljs.core/Empty";
+
+cljs.core.Empty.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Empty");
+});
+
+/**
+ * Positional factory function for cljs.core/Empty.
+ */
+cljs.core.__GT_Empty = (function cljs$core$__GT_Empty(){
+return (new cljs.core.Empty());
+});
+
+cljs.core.EMPTY = (new cljs.core.Empty());
+
+/**
+* @constructor
+*/
+cljs.core.MultiIterator = (function (iters){
+this.iters = iters;
+});
+cljs.core.MultiIterator.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+var iters__$1 = cljs.core.seq(self__.iters);
+while(true){
+if((!((iters__$1 == null)))){
+var iter = cljs.core.first(iters__$1);
+if((!(iter.hasNext()))){
+return false;
+} else {
+var G__11000 = cljs.core.next(iters__$1);
+iters__$1 = G__11000;
+continue;
+}
+} else {
+return true;
+}
+break;
+}
+});
+
+cljs.core.MultiIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var nexts = [];
+var n__8769__auto___11001 = self__.iters.length;
+var i_11002 = (0);
+while(true){
+if((i_11002 < n__8769__auto___11001)){
+(nexts[i_11002] = (self__.iters[i_11002]).next());
+
+var G__11003 = (i_11002 + (1));
+i_11002 = G__11003;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(nexts,(0));
+});
+
+cljs.core.MultiIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"iters","iters",719353031,null)], null);
+});
+
+cljs.core.MultiIterator.cljs$lang$type = true;
+
+cljs.core.MultiIterator.cljs$lang$ctorStr = "cljs.core/MultiIterator";
+
+cljs.core.MultiIterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/MultiIterator");
+});
+
+/**
+ * Positional factory function for cljs.core/MultiIterator.
+ */
+cljs.core.__GT_MultiIterator = (function cljs$core$__GT_MultiIterator(iters){
+return (new cljs.core.MultiIterator(iters));
+});
+
+cljs.core.chunkIteratorSeq = (function cljs$core$chunkIteratorSeq(iter){
+return (new cljs.core.LazySeq(null,(function (){
+if(iter.hasNext()){
+var arr = [];
+var n = (0);
+while(true){
+if(cljs.core.truth_((function (){var and__7791__auto__ = iter.hasNext();
+if(cljs.core.truth_(and__7791__auto__)){
+return (n < (32));
+} else {
+return and__7791__auto__;
+}
+})())){
+(arr[n] = iter.next());
+
+var G__11004 = (n + (1));
+n = G__11004;
+continue;
+} else {
+return cljs.core.chunk_cons(cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$3(arr,(0),n),(cljs.core.chunkIteratorSeq.cljs$core$IFn$_invoke$arity$1 ? cljs.core.chunkIteratorSeq.cljs$core$IFn$_invoke$arity$1(iter) : cljs.core.chunkIteratorSeq.call(null,iter)));
+}
+break;
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+/**
+* @constructor
+*/
+cljs.core.TransformerIterator = (function (buffer,_next,completed,xf,sourceIter,multi){
+this.buffer = buffer;
+this._next = _next;
+this.completed = completed;
+this.xf = xf;
+this.sourceIter = sourceIter;
+this.multi = multi;
+});
+cljs.core.TransformerIterator.prototype.step = (function (){
+var self__ = this;
+var this$ = this;
+if((!((self__._next === cljs.core.NONE)))){
+return true;
+} else {
+while(true){
+if((self__._next === cljs.core.NONE)){
+if(self__.buffer.isEmpty()){
+if(self__.completed){
+return false;
+} else {
+if(self__.sourceIter.hasNext()){
+var iter = ((self__.multi)?cljs.core.apply.cljs$core$IFn$_invoke$arity$2(self__.xf,cljs.core.cons(null,self__.sourceIter.next())):(function (){var G__11005 = null;
+var G__11006 = self__.sourceIter.next();
+return (self__.xf.cljs$core$IFn$_invoke$arity$2 ? self__.xf.cljs$core$IFn$_invoke$arity$2(G__11005,G__11006) : self__.xf.call(null,G__11005,G__11006));
+})());
+if(cljs.core.reduced_QMARK_(iter)){
+(self__.xf.cljs$core$IFn$_invoke$arity$1 ? self__.xf.cljs$core$IFn$_invoke$arity$1(null) : self__.xf.call(null,null));
+
+self__.completed = true;
+} else {
+}
+
+continue;
+} else {
+(self__.xf.cljs$core$IFn$_invoke$arity$1 ? self__.xf.cljs$core$IFn$_invoke$arity$1(null) : self__.xf.call(null,null));
+
+self__.completed = true;
+
+continue;
+}
+}
+} else {
+self__._next = self__.buffer.remove();
+
+continue;
+}
+} else {
+return true;
+}
+break;
+}
+}
+});
+
+cljs.core.TransformerIterator.prototype.hasNext = (function (){
+var self__ = this;
+var this$ = this;
+return this$.step();
+});
+
+cljs.core.TransformerIterator.prototype.next = (function (){
+var self__ = this;
+var this$ = this;
+if(this$.hasNext()){
+var ret = self__._next;
+self__._next = cljs.core.NONE;
+
+return ret;
+} else {
+throw (new Error("No such element"));
+}
+});
+
+cljs.core.TransformerIterator.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.TransformerIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"buffer","buffer",-2037140571,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"_next","_next",101877036,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"completed","completed",1154475024,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"xf","xf",2042434515,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"sourceIter","sourceIter",1068220306,null),new cljs.core.Symbol(null,"multi","multi",1450238522,null)], null);
+});
+
+cljs.core.TransformerIterator.cljs$lang$type = true;
+
+cljs.core.TransformerIterator.cljs$lang$ctorStr = "cljs.core/TransformerIterator";
+
+cljs.core.TransformerIterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/TransformerIterator");
+});
+
+/**
+ * Positional factory function for cljs.core/TransformerIterator.
+ */
+cljs.core.__GT_TransformerIterator = (function cljs$core$__GT_TransformerIterator(buffer,_next,completed,xf,sourceIter,multi){
+return (new cljs.core.TransformerIterator(buffer,_next,completed,xf,sourceIter,multi));
+});
+
+var G__11007_11010 = cljs.core.TransformerIterator.prototype;
+var G__11008_11011 = cljs.core.ITER_SYMBOL;
+var G__11009_11012 = ((function (G__11007_11010,G__11008_11011){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11007_11010,G__11008_11011))
+;
+goog.object.set(G__11007_11010,G__11008_11011,G__11009_11012);
+cljs.core.transformer_iterator = (function cljs$core$transformer_iterator(xform,sourceIter,multi){
+var iterator = (new cljs.core.TransformerIterator(cljs.core.EMPTY,cljs.core.NONE,false,null,sourceIter,multi));
+iterator.xf = (function (){var G__11013 = ((function (iterator){
+return (function() {
+var G__11014 = null;
+var G__11014__0 = (function (){
+return null;
+});
+var G__11014__1 = (function (acc){
+return acc;
+});
+var G__11014__2 = (function (acc,o){
+iterator.buffer = iterator.buffer.add(o);
+
+return acc;
+});
+G__11014 = function(acc,o){
+switch(arguments.length){
+case 0:
+return G__11014__0.call(this);
+case 1:
+return G__11014__1.call(this,acc);
+case 2:
+return G__11014__2.call(this,acc,o);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11014.cljs$core$IFn$_invoke$arity$0 = G__11014__0;
+G__11014.cljs$core$IFn$_invoke$arity$1 = G__11014__1;
+G__11014.cljs$core$IFn$_invoke$arity$2 = G__11014__2;
+return G__11014;
+})()
+;})(iterator))
+;
+return (xform.cljs$core$IFn$_invoke$arity$1 ? xform.cljs$core$IFn$_invoke$arity$1(G__11013) : xform.call(null,G__11013));
+})();
+
+return iterator;
+});
+cljs.core.TransformerIterator.create = (function (xform,source){
+return cljs.core.transformer_iterator(xform,source,false);
+});
+cljs.core.TransformerIterator.createMulti = (function (xform,sources){
+return cljs.core.transformer_iterator(xform,(new cljs.core.MultiIterator(cljs.core.to_array(sources))),true);
+});
+/**
+ * Coerces coll to a (possibly empty) sequence, if it is not already
+ * one. Will not force a lazy seq. (sequence nil) yields (), When a
+ * transducer is supplied, returns a lazy sequence of applications of
+ * the transform to the items in coll(s), i.e. to the set of first
+ * items of each coll, followed by the set of second
+ * items in each coll, until any one of the colls is exhausted. Any
+ * remaining items in other colls are ignored. The transform should accept
+ * number-of-colls arguments
+ */
+cljs.core.sequence = (function cljs$core$sequence(var_args){
+var G__11019 = arguments.length;
+switch (G__11019) {
+case 1:
+return cljs.core.sequence.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.sequence.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11021 = arguments.length;
+var i__9001__auto___11022 = (0);
+while(true){
+if((i__9001__auto___11022 < len__9000__auto___11021)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11022]));
+
+var G__11023 = (i__9001__auto___11022 + (1));
+i__9001__auto___11022 = G__11023;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.sequence.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.sequence.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+if(cljs.core.seq_QMARK_(coll)){
+return coll;
+} else {
+var or__7806__auto__ = cljs.core.seq(coll);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return cljs.core.List.EMPTY;
+}
+}
+});
+
+cljs.core.sequence.cljs$core$IFn$_invoke$arity$2 = (function (xform,coll){
+var or__7806__auto__ = cljs.core.chunkIteratorSeq(cljs.core.TransformerIterator.create(xform,cljs.core.iter(coll)));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.sequence.cljs$core$IFn$_invoke$arity$variadic = (function (xform,coll,colls){
+var or__7806__auto__ = cljs.core.chunkIteratorSeq(cljs.core.TransformerIterator.createMulti(xform,cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.iter,cljs.core.cons(coll,colls))));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+/** @this {Function} */
+cljs.core.sequence.cljs$lang$applyTo = (function (seq11016){
+var G__11017 = cljs.core.first(seq11016);
+var seq11016__$1 = cljs.core.next(seq11016);
+var G__11018 = cljs.core.first(seq11016__$1);
+var seq11016__$2 = cljs.core.next(seq11016__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11017,G__11018,seq11016__$2);
+});
+
+cljs.core.sequence.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns true if (pred x) is logical true for every x in coll, else
+ * false.
+ */
+cljs.core.every_QMARK_ = (function cljs$core$every_QMARK_(pred,coll){
+while(true){
+if((cljs.core.seq(coll) == null)){
+return true;
+} else {
+if(cljs.core.truth_((function (){var G__11024 = cljs.core.first(coll);
+return (pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(G__11024) : pred.call(null,G__11024));
+})())){
+var G__11025 = pred;
+var G__11026 = cljs.core.next(coll);
+pred = G__11025;
+coll = G__11026;
+continue;
+} else {
+return false;
+
+}
+}
+break;
+}
+});
+/**
+ * Returns false if (pred x) is logical true for every x in
+ * coll, else true.
+ */
+cljs.core.not_every_QMARK_ = (function cljs$core$not_every_QMARK_(pred,coll){
+return (!(cljs.core.every_QMARK_(pred,coll)));
+});
+/**
+ * Returns the first logical true value of (pred x) for any x in coll,
+ * else nil. One common idiom is to use a set as pred, for example
+ * this will return :fred if :fred is in the sequence, otherwise nil:
+ * (some #{:fred} coll)
+ */
+cljs.core.some = (function cljs$core$some(pred,coll){
+while(true){
+if(cljs.core.seq(coll)){
+var or__7806__auto__ = (function (){var G__11028 = cljs.core.first(coll);
+return (pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(G__11028) : pred.call(null,G__11028));
+})();
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+var G__11029 = pred;
+var G__11030 = cljs.core.next(coll);
+pred = G__11029;
+coll = G__11030;
+continue;
+}
+} else {
+return null;
+}
+break;
+}
+});
+/**
+ * Returns false if (pred x) is logical true for any x in coll,
+ * else true.
+ */
+cljs.core.not_any_QMARK_ = (function cljs$core$not_any_QMARK_(pred,coll){
+return cljs.core.not(cljs.core.some(pred,coll));
+});
+/**
+ * Returns true if n is even, throws an exception if n is not an integer
+ */
+cljs.core.even_QMARK_ = (function cljs$core$even_QMARK_(n){
+if(cljs.core.integer_QMARK_(n)){
+return ((n & (1)) === (0));
+} else {
+throw (new Error(["Argument must be an integer: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(n)].join('')));
+}
+});
+/**
+ * Returns true if n is odd, throws an exception if n is not an integer
+ */
+cljs.core.odd_QMARK_ = (function cljs$core$odd_QMARK_(n){
+return (!(cljs.core.even_QMARK_(n)));
+});
+/**
+ * Takes a fn f and returns a fn that takes the same arguments as f,
+ * has the same effects, if any, and returns the opposite truth value.
+ */
+cljs.core.complement = (function cljs$core$complement(f){
+return (function() {
+var G__11031 = null;
+var G__11031__0 = (function (){
+return cljs.core.not((f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)));
+});
+var G__11031__1 = (function (x){
+return cljs.core.not((f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x)));
+});
+var G__11031__2 = (function (x,y){
+return cljs.core.not((f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y)));
+});
+var G__11031__3 = (function() {
+var G__11032__delegate = function (x,y,zs){
+return cljs.core.not(cljs.core.apply.cljs$core$IFn$_invoke$arity$4(f,x,y,zs));
+};
+var G__11032 = function (x,y,var_args){
+var zs = null;
+if (arguments.length > 2) {
+var G__11033__i = 0, G__11033__a = new Array(arguments.length - 2);
+while (G__11033__i < G__11033__a.length) {G__11033__a[G__11033__i] = arguments[G__11033__i + 2]; ++G__11033__i;}
+ zs = new cljs.core.IndexedSeq(G__11033__a,0,null);
+}
+return G__11032__delegate.call(this,x,y,zs);};
+G__11032.cljs$lang$maxFixedArity = 2;
+G__11032.cljs$lang$applyTo = (function (arglist__11034){
+var x = cljs.core.first(arglist__11034);
+arglist__11034 = cljs.core.next(arglist__11034);
+var y = cljs.core.first(arglist__11034);
+var zs = cljs.core.rest(arglist__11034);
+return G__11032__delegate(x,y,zs);
+});
+G__11032.cljs$core$IFn$_invoke$arity$variadic = G__11032__delegate;
+return G__11032;
+})()
+;
+G__11031 = function(x,y,var_args){
+var zs = var_args;
+switch(arguments.length){
+case 0:
+return G__11031__0.call(this);
+case 1:
+return G__11031__1.call(this,x);
+case 2:
+return G__11031__2.call(this,x,y);
+default:
+var G__11035 = null;
+if (arguments.length > 2) {
+var G__11036__i = 0, G__11036__a = new Array(arguments.length - 2);
+while (G__11036__i < G__11036__a.length) {G__11036__a[G__11036__i] = arguments[G__11036__i + 2]; ++G__11036__i;}
+G__11035 = new cljs.core.IndexedSeq(G__11036__a,0,null);
+}
+return G__11031__3.cljs$core$IFn$_invoke$arity$variadic(x,y, G__11035);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11031.cljs$lang$maxFixedArity = 2;
+G__11031.cljs$lang$applyTo = G__11031__3.cljs$lang$applyTo;
+G__11031.cljs$core$IFn$_invoke$arity$0 = G__11031__0;
+G__11031.cljs$core$IFn$_invoke$arity$1 = G__11031__1;
+G__11031.cljs$core$IFn$_invoke$arity$2 = G__11031__2;
+G__11031.cljs$core$IFn$_invoke$arity$variadic = G__11031__3.cljs$core$IFn$_invoke$arity$variadic;
+return G__11031;
+})()
+});
+/**
+ * Returns a function that takes any number of arguments and returns x.
+ */
+cljs.core.constantly = (function cljs$core$constantly(x){
+return (function() {
+var G__11037__delegate = function (args){
+return x;
+};
+var G__11037 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__11038__i = 0, G__11038__a = new Array(arguments.length - 0);
+while (G__11038__i < G__11038__a.length) {G__11038__a[G__11038__i] = arguments[G__11038__i + 0]; ++G__11038__i;}
+ args = new cljs.core.IndexedSeq(G__11038__a,0,null);
+}
+return G__11037__delegate.call(this,args);};
+G__11037.cljs$lang$maxFixedArity = 0;
+G__11037.cljs$lang$applyTo = (function (arglist__11039){
+var args = cljs.core.seq(arglist__11039);
+return G__11037__delegate(args);
+});
+G__11037.cljs$core$IFn$_invoke$arity$variadic = G__11037__delegate;
+return G__11037;
+})()
+;
+});
+/**
+ * Takes a set of functions and returns a fn that is the composition
+ * of those fns. The returned fn takes a variable number of args,
+ * applies the rightmost of fns to the args, the next
+ * fn (right-to-left) to the result, etc.
+ */
+cljs.core.comp = (function cljs$core$comp(var_args){
+var G__11045 = arguments.length;
+switch (G__11045) {
+case 0:
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11063 = arguments.length;
+var i__9001__auto___11064 = (0);
+while(true){
+if((i__9001__auto___11064 < len__9000__auto___11063)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11064]));
+
+var G__11065 = (i__9001__auto___11064 + (1));
+i__9001__auto___11064 = G__11065;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.comp.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.identity;
+});
+
+cljs.core.comp.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return f;
+});
+
+cljs.core.comp.cljs$core$IFn$_invoke$arity$2 = (function (f,g){
+return (function() {
+var G__11066 = null;
+var G__11066__0 = (function (){
+var G__11046 = (g.cljs$core$IFn$_invoke$arity$0 ? g.cljs$core$IFn$_invoke$arity$0() : g.call(null));
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11046) : f.call(null,G__11046));
+});
+var G__11066__1 = (function (x){
+var G__11047 = (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(x) : g.call(null,x));
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11047) : f.call(null,G__11047));
+});
+var G__11066__2 = (function (x,y){
+var G__11048 = (g.cljs$core$IFn$_invoke$arity$2 ? g.cljs$core$IFn$_invoke$arity$2(x,y) : g.call(null,x,y));
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11048) : f.call(null,G__11048));
+});
+var G__11066__3 = (function (x,y,z){
+var G__11049 = (g.cljs$core$IFn$_invoke$arity$3 ? g.cljs$core$IFn$_invoke$arity$3(x,y,z) : g.call(null,x,y,z));
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11049) : f.call(null,G__11049));
+});
+var G__11066__4 = (function() {
+var G__11067__delegate = function (x,y,z,args){
+var G__11050 = cljs.core.apply.cljs$core$IFn$_invoke$arity$5(g,x,y,z,args);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11050) : f.call(null,G__11050));
+};
+var G__11067 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11068__i = 0, G__11068__a = new Array(arguments.length - 3);
+while (G__11068__i < G__11068__a.length) {G__11068__a[G__11068__i] = arguments[G__11068__i + 3]; ++G__11068__i;}
+ args = new cljs.core.IndexedSeq(G__11068__a,0,null);
+}
+return G__11067__delegate.call(this,x,y,z,args);};
+G__11067.cljs$lang$maxFixedArity = 3;
+G__11067.cljs$lang$applyTo = (function (arglist__11069){
+var x = cljs.core.first(arglist__11069);
+arglist__11069 = cljs.core.next(arglist__11069);
+var y = cljs.core.first(arglist__11069);
+arglist__11069 = cljs.core.next(arglist__11069);
+var z = cljs.core.first(arglist__11069);
+var args = cljs.core.rest(arglist__11069);
+return G__11067__delegate(x,y,z,args);
+});
+G__11067.cljs$core$IFn$_invoke$arity$variadic = G__11067__delegate;
+return G__11067;
+})()
+;
+G__11066 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__11066__0.call(this);
+case 1:
+return G__11066__1.call(this,x);
+case 2:
+return G__11066__2.call(this,x,y);
+case 3:
+return G__11066__3.call(this,x,y,z);
+default:
+var G__11070 = null;
+if (arguments.length > 3) {
+var G__11071__i = 0, G__11071__a = new Array(arguments.length - 3);
+while (G__11071__i < G__11071__a.length) {G__11071__a[G__11071__i] = arguments[G__11071__i + 3]; ++G__11071__i;}
+G__11070 = new cljs.core.IndexedSeq(G__11071__a,0,null);
+}
+return G__11066__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11070);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11066.cljs$lang$maxFixedArity = 3;
+G__11066.cljs$lang$applyTo = G__11066__4.cljs$lang$applyTo;
+G__11066.cljs$core$IFn$_invoke$arity$0 = G__11066__0;
+G__11066.cljs$core$IFn$_invoke$arity$1 = G__11066__1;
+G__11066.cljs$core$IFn$_invoke$arity$2 = G__11066__2;
+G__11066.cljs$core$IFn$_invoke$arity$3 = G__11066__3;
+G__11066.cljs$core$IFn$_invoke$arity$variadic = G__11066__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11066;
+})()
+});
+
+cljs.core.comp.cljs$core$IFn$_invoke$arity$3 = (function (f,g,h){
+return (function() {
+var G__11072 = null;
+var G__11072__0 = (function (){
+var G__11051 = (function (){var G__11052 = (h.cljs$core$IFn$_invoke$arity$0 ? h.cljs$core$IFn$_invoke$arity$0() : h.call(null));
+return (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(G__11052) : g.call(null,G__11052));
+})();
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11051) : f.call(null,G__11051));
+});
+var G__11072__1 = (function (x){
+var G__11053 = (function (){var G__11054 = (h.cljs$core$IFn$_invoke$arity$1 ? h.cljs$core$IFn$_invoke$arity$1(x) : h.call(null,x));
+return (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(G__11054) : g.call(null,G__11054));
+})();
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11053) : f.call(null,G__11053));
+});
+var G__11072__2 = (function (x,y){
+var G__11055 = (function (){var G__11056 = (h.cljs$core$IFn$_invoke$arity$2 ? h.cljs$core$IFn$_invoke$arity$2(x,y) : h.call(null,x,y));
+return (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(G__11056) : g.call(null,G__11056));
+})();
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11055) : f.call(null,G__11055));
+});
+var G__11072__3 = (function (x,y,z){
+var G__11057 = (function (){var G__11058 = (h.cljs$core$IFn$_invoke$arity$3 ? h.cljs$core$IFn$_invoke$arity$3(x,y,z) : h.call(null,x,y,z));
+return (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(G__11058) : g.call(null,G__11058));
+})();
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11057) : f.call(null,G__11057));
+});
+var G__11072__4 = (function() {
+var G__11073__delegate = function (x,y,z,args){
+var G__11059 = (function (){var G__11060 = cljs.core.apply.cljs$core$IFn$_invoke$arity$5(h,x,y,z,args);
+return (g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(G__11060) : g.call(null,G__11060));
+})();
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11059) : f.call(null,G__11059));
+};
+var G__11073 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11074__i = 0, G__11074__a = new Array(arguments.length - 3);
+while (G__11074__i < G__11074__a.length) {G__11074__a[G__11074__i] = arguments[G__11074__i + 3]; ++G__11074__i;}
+ args = new cljs.core.IndexedSeq(G__11074__a,0,null);
+}
+return G__11073__delegate.call(this,x,y,z,args);};
+G__11073.cljs$lang$maxFixedArity = 3;
+G__11073.cljs$lang$applyTo = (function (arglist__11075){
+var x = cljs.core.first(arglist__11075);
+arglist__11075 = cljs.core.next(arglist__11075);
+var y = cljs.core.first(arglist__11075);
+arglist__11075 = cljs.core.next(arglist__11075);
+var z = cljs.core.first(arglist__11075);
+var args = cljs.core.rest(arglist__11075);
+return G__11073__delegate(x,y,z,args);
+});
+G__11073.cljs$core$IFn$_invoke$arity$variadic = G__11073__delegate;
+return G__11073;
+})()
+;
+G__11072 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__11072__0.call(this);
+case 1:
+return G__11072__1.call(this,x);
+case 2:
+return G__11072__2.call(this,x,y);
+case 3:
+return G__11072__3.call(this,x,y,z);
+default:
+var G__11076 = null;
+if (arguments.length > 3) {
+var G__11077__i = 0, G__11077__a = new Array(arguments.length - 3);
+while (G__11077__i < G__11077__a.length) {G__11077__a[G__11077__i] = arguments[G__11077__i + 3]; ++G__11077__i;}
+G__11076 = new cljs.core.IndexedSeq(G__11077__a,0,null);
+}
+return G__11072__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11076);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11072.cljs$lang$maxFixedArity = 3;
+G__11072.cljs$lang$applyTo = G__11072__4.cljs$lang$applyTo;
+G__11072.cljs$core$IFn$_invoke$arity$0 = G__11072__0;
+G__11072.cljs$core$IFn$_invoke$arity$1 = G__11072__1;
+G__11072.cljs$core$IFn$_invoke$arity$2 = G__11072__2;
+G__11072.cljs$core$IFn$_invoke$arity$3 = G__11072__3;
+G__11072.cljs$core$IFn$_invoke$arity$variadic = G__11072__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11072;
+})()
+});
+
+cljs.core.comp.cljs$core$IFn$_invoke$arity$variadic = (function (f1,f2,f3,fs){
+var fs__$1 = cljs.core.reverse(cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4(f1,f2,f3,fs));
+return ((function (fs__$1){
+return (function() {
+var G__11078__delegate = function (args){
+var ret = cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.first(fs__$1),args);
+var fs__$2 = cljs.core.next(fs__$1);
+while(true){
+if(fs__$2){
+var G__11079 = (function (){var fexpr__11061 = cljs.core.first(fs__$2);
+return (fexpr__11061.cljs$core$IFn$_invoke$arity$1 ? fexpr__11061.cljs$core$IFn$_invoke$arity$1(ret) : fexpr__11061.call(null,ret));
+})();
+var G__11080 = cljs.core.next(fs__$2);
+ret = G__11079;
+fs__$2 = G__11080;
+continue;
+} else {
+return ret;
+}
+break;
+}
+};
+var G__11078 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__11081__i = 0, G__11081__a = new Array(arguments.length - 0);
+while (G__11081__i < G__11081__a.length) {G__11081__a[G__11081__i] = arguments[G__11081__i + 0]; ++G__11081__i;}
+ args = new cljs.core.IndexedSeq(G__11081__a,0,null);
+}
+return G__11078__delegate.call(this,args);};
+G__11078.cljs$lang$maxFixedArity = 0;
+G__11078.cljs$lang$applyTo = (function (arglist__11082){
+var args = cljs.core.seq(arglist__11082);
+return G__11078__delegate(args);
+});
+G__11078.cljs$core$IFn$_invoke$arity$variadic = G__11078__delegate;
+return G__11078;
+})()
+;
+;})(fs__$1))
+});
+
+/** @this {Function} */
+cljs.core.comp.cljs$lang$applyTo = (function (seq11041){
+var G__11042 = cljs.core.first(seq11041);
+var seq11041__$1 = cljs.core.next(seq11041);
+var G__11043 = cljs.core.first(seq11041__$1);
+var seq11041__$2 = cljs.core.next(seq11041__$1);
+var G__11044 = cljs.core.first(seq11041__$2);
+var seq11041__$3 = cljs.core.next(seq11041__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11042,G__11043,G__11044,seq11041__$3);
+});
+
+cljs.core.comp.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Takes a function f and fewer than the normal arguments to f, and
+ * returns a fn that takes a variable number of additional args. When
+ * called, the returned function calls f with args + additional args.
+ */
+cljs.core.partial = (function cljs$core$partial(var_args){
+var G__11089 = arguments.length;
+switch (G__11089) {
+case 1:
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11091 = arguments.length;
+var i__9001__auto___11092 = (0);
+while(true){
+if((i__9001__auto___11092 < len__9000__auto___11091)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11092]));
+
+var G__11093 = (i__9001__auto___11092 + (1));
+i__9001__auto___11092 = G__11093;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((4)),(0),null));
+return cljs.core.partial.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.partial.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return f;
+});
+
+cljs.core.partial.cljs$core$IFn$_invoke$arity$2 = (function (f,arg1){
+return (function() {
+var G__11094 = null;
+var G__11094__0 = (function (){
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(arg1) : f.call(null,arg1));
+});
+var G__11094__1 = (function (x){
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(arg1,x) : f.call(null,arg1,x));
+});
+var G__11094__2 = (function (x,y){
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(arg1,x,y) : f.call(null,arg1,x,y));
+});
+var G__11094__3 = (function (x,y,z){
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(arg1,x,y,z) : f.call(null,arg1,x,y,z));
+});
+var G__11094__4 = (function() {
+var G__11095__delegate = function (x,y,z,args){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,arg1,x,y,z,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([args], 0));
+};
+var G__11095 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11096__i = 0, G__11096__a = new Array(arguments.length - 3);
+while (G__11096__i < G__11096__a.length) {G__11096__a[G__11096__i] = arguments[G__11096__i + 3]; ++G__11096__i;}
+ args = new cljs.core.IndexedSeq(G__11096__a,0,null);
+}
+return G__11095__delegate.call(this,x,y,z,args);};
+G__11095.cljs$lang$maxFixedArity = 3;
+G__11095.cljs$lang$applyTo = (function (arglist__11097){
+var x = cljs.core.first(arglist__11097);
+arglist__11097 = cljs.core.next(arglist__11097);
+var y = cljs.core.first(arglist__11097);
+arglist__11097 = cljs.core.next(arglist__11097);
+var z = cljs.core.first(arglist__11097);
+var args = cljs.core.rest(arglist__11097);
+return G__11095__delegate(x,y,z,args);
+});
+G__11095.cljs$core$IFn$_invoke$arity$variadic = G__11095__delegate;
+return G__11095;
+})()
+;
+G__11094 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__11094__0.call(this);
+case 1:
+return G__11094__1.call(this,x);
+case 2:
+return G__11094__2.call(this,x,y);
+case 3:
+return G__11094__3.call(this,x,y,z);
+default:
+var G__11098 = null;
+if (arguments.length > 3) {
+var G__11099__i = 0, G__11099__a = new Array(arguments.length - 3);
+while (G__11099__i < G__11099__a.length) {G__11099__a[G__11099__i] = arguments[G__11099__i + 3]; ++G__11099__i;}
+G__11098 = new cljs.core.IndexedSeq(G__11099__a,0,null);
+}
+return G__11094__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11098);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11094.cljs$lang$maxFixedArity = 3;
+G__11094.cljs$lang$applyTo = G__11094__4.cljs$lang$applyTo;
+G__11094.cljs$core$IFn$_invoke$arity$0 = G__11094__0;
+G__11094.cljs$core$IFn$_invoke$arity$1 = G__11094__1;
+G__11094.cljs$core$IFn$_invoke$arity$2 = G__11094__2;
+G__11094.cljs$core$IFn$_invoke$arity$3 = G__11094__3;
+G__11094.cljs$core$IFn$_invoke$arity$variadic = G__11094__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11094;
+})()
+});
+
+cljs.core.partial.cljs$core$IFn$_invoke$arity$3 = (function (f,arg1,arg2){
+return (function() {
+var G__11100 = null;
+var G__11100__0 = (function (){
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(arg1,arg2) : f.call(null,arg1,arg2));
+});
+var G__11100__1 = (function (x){
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(arg1,arg2,x) : f.call(null,arg1,arg2,x));
+});
+var G__11100__2 = (function (x,y){
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(arg1,arg2,x,y) : f.call(null,arg1,arg2,x,y));
+});
+var G__11100__3 = (function (x,y,z){
+return (f.cljs$core$IFn$_invoke$arity$5 ? f.cljs$core$IFn$_invoke$arity$5(arg1,arg2,x,y,z) : f.call(null,arg1,arg2,x,y,z));
+});
+var G__11100__4 = (function() {
+var G__11101__delegate = function (x,y,z,args){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,arg1,arg2,x,y,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([z,args], 0));
+};
+var G__11101 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11102__i = 0, G__11102__a = new Array(arguments.length - 3);
+while (G__11102__i < G__11102__a.length) {G__11102__a[G__11102__i] = arguments[G__11102__i + 3]; ++G__11102__i;}
+ args = new cljs.core.IndexedSeq(G__11102__a,0,null);
+}
+return G__11101__delegate.call(this,x,y,z,args);};
+G__11101.cljs$lang$maxFixedArity = 3;
+G__11101.cljs$lang$applyTo = (function (arglist__11103){
+var x = cljs.core.first(arglist__11103);
+arglist__11103 = cljs.core.next(arglist__11103);
+var y = cljs.core.first(arglist__11103);
+arglist__11103 = cljs.core.next(arglist__11103);
+var z = cljs.core.first(arglist__11103);
+var args = cljs.core.rest(arglist__11103);
+return G__11101__delegate(x,y,z,args);
+});
+G__11101.cljs$core$IFn$_invoke$arity$variadic = G__11101__delegate;
+return G__11101;
+})()
+;
+G__11100 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__11100__0.call(this);
+case 1:
+return G__11100__1.call(this,x);
+case 2:
+return G__11100__2.call(this,x,y);
+case 3:
+return G__11100__3.call(this,x,y,z);
+default:
+var G__11104 = null;
+if (arguments.length > 3) {
+var G__11105__i = 0, G__11105__a = new Array(arguments.length - 3);
+while (G__11105__i < G__11105__a.length) {G__11105__a[G__11105__i] = arguments[G__11105__i + 3]; ++G__11105__i;}
+G__11104 = new cljs.core.IndexedSeq(G__11105__a,0,null);
+}
+return G__11100__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11104);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11100.cljs$lang$maxFixedArity = 3;
+G__11100.cljs$lang$applyTo = G__11100__4.cljs$lang$applyTo;
+G__11100.cljs$core$IFn$_invoke$arity$0 = G__11100__0;
+G__11100.cljs$core$IFn$_invoke$arity$1 = G__11100__1;
+G__11100.cljs$core$IFn$_invoke$arity$2 = G__11100__2;
+G__11100.cljs$core$IFn$_invoke$arity$3 = G__11100__3;
+G__11100.cljs$core$IFn$_invoke$arity$variadic = G__11100__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11100;
+})()
+});
+
+cljs.core.partial.cljs$core$IFn$_invoke$arity$4 = (function (f,arg1,arg2,arg3){
+return (function() {
+var G__11106 = null;
+var G__11106__0 = (function (){
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(arg1,arg2,arg3) : f.call(null,arg1,arg2,arg3));
+});
+var G__11106__1 = (function (x){
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(arg1,arg2,arg3,x) : f.call(null,arg1,arg2,arg3,x));
+});
+var G__11106__2 = (function (x,y){
+return (f.cljs$core$IFn$_invoke$arity$5 ? f.cljs$core$IFn$_invoke$arity$5(arg1,arg2,arg3,x,y) : f.call(null,arg1,arg2,arg3,x,y));
+});
+var G__11106__3 = (function (x,y,z){
+return (f.cljs$core$IFn$_invoke$arity$6 ? f.cljs$core$IFn$_invoke$arity$6(arg1,arg2,arg3,x,y,z) : f.call(null,arg1,arg2,arg3,x,y,z));
+});
+var G__11106__4 = (function() {
+var G__11107__delegate = function (x,y,z,args){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,arg1,arg2,arg3,x,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([y,z,args], 0));
+};
+var G__11107 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11108__i = 0, G__11108__a = new Array(arguments.length - 3);
+while (G__11108__i < G__11108__a.length) {G__11108__a[G__11108__i] = arguments[G__11108__i + 3]; ++G__11108__i;}
+ args = new cljs.core.IndexedSeq(G__11108__a,0,null);
+}
+return G__11107__delegate.call(this,x,y,z,args);};
+G__11107.cljs$lang$maxFixedArity = 3;
+G__11107.cljs$lang$applyTo = (function (arglist__11109){
+var x = cljs.core.first(arglist__11109);
+arglist__11109 = cljs.core.next(arglist__11109);
+var y = cljs.core.first(arglist__11109);
+arglist__11109 = cljs.core.next(arglist__11109);
+var z = cljs.core.first(arglist__11109);
+var args = cljs.core.rest(arglist__11109);
+return G__11107__delegate(x,y,z,args);
+});
+G__11107.cljs$core$IFn$_invoke$arity$variadic = G__11107__delegate;
+return G__11107;
+})()
+;
+G__11106 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__11106__0.call(this);
+case 1:
+return G__11106__1.call(this,x);
+case 2:
+return G__11106__2.call(this,x,y);
+case 3:
+return G__11106__3.call(this,x,y,z);
+default:
+var G__11110 = null;
+if (arguments.length > 3) {
+var G__11111__i = 0, G__11111__a = new Array(arguments.length - 3);
+while (G__11111__i < G__11111__a.length) {G__11111__a[G__11111__i] = arguments[G__11111__i + 3]; ++G__11111__i;}
+G__11110 = new cljs.core.IndexedSeq(G__11111__a,0,null);
+}
+return G__11106__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11110);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11106.cljs$lang$maxFixedArity = 3;
+G__11106.cljs$lang$applyTo = G__11106__4.cljs$lang$applyTo;
+G__11106.cljs$core$IFn$_invoke$arity$0 = G__11106__0;
+G__11106.cljs$core$IFn$_invoke$arity$1 = G__11106__1;
+G__11106.cljs$core$IFn$_invoke$arity$2 = G__11106__2;
+G__11106.cljs$core$IFn$_invoke$arity$3 = G__11106__3;
+G__11106.cljs$core$IFn$_invoke$arity$variadic = G__11106__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11106;
+})()
+});
+
+cljs.core.partial.cljs$core$IFn$_invoke$arity$variadic = (function (f,arg1,arg2,arg3,more){
+return (function() {
+var G__11112__delegate = function (args){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,arg1,arg2,arg3,cljs.core.concat.cljs$core$IFn$_invoke$arity$2(more,args));
+};
+var G__11112 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__11113__i = 0, G__11113__a = new Array(arguments.length - 0);
+while (G__11113__i < G__11113__a.length) {G__11113__a[G__11113__i] = arguments[G__11113__i + 0]; ++G__11113__i;}
+ args = new cljs.core.IndexedSeq(G__11113__a,0,null);
+}
+return G__11112__delegate.call(this,args);};
+G__11112.cljs$lang$maxFixedArity = 0;
+G__11112.cljs$lang$applyTo = (function (arglist__11114){
+var args = cljs.core.seq(arglist__11114);
+return G__11112__delegate(args);
+});
+G__11112.cljs$core$IFn$_invoke$arity$variadic = G__11112__delegate;
+return G__11112;
+})()
+;
+});
+
+/** @this {Function} */
+cljs.core.partial.cljs$lang$applyTo = (function (seq11084){
+var G__11085 = cljs.core.first(seq11084);
+var seq11084__$1 = cljs.core.next(seq11084);
+var G__11086 = cljs.core.first(seq11084__$1);
+var seq11084__$2 = cljs.core.next(seq11084__$1);
+var G__11087 = cljs.core.first(seq11084__$2);
+var seq11084__$3 = cljs.core.next(seq11084__$2);
+var G__11088 = cljs.core.first(seq11084__$3);
+var seq11084__$4 = cljs.core.next(seq11084__$3);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11085,G__11086,G__11087,G__11088,seq11084__$4);
+});
+
+cljs.core.partial.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Takes a function f, and returns a function that calls f, replacing
+ * a nil first argument to f with the supplied value x. Higher arity
+ * versions can replace arguments in the second and third
+ * positions (y, z). Note that the function f can take any number of
+ * arguments, not just the one(s) being nil-patched.
+ */
+cljs.core.fnil = (function cljs$core$fnil(var_args){
+var G__11116 = arguments.length;
+switch (G__11116) {
+case 2:
+return cljs.core.fnil.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.fnil.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.fnil.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.fnil.cljs$core$IFn$_invoke$arity$2 = (function (f,x){
+return (function() {
+var G__11134 = null;
+var G__11134__1 = (function (a){
+var G__11117 = (((a == null))?x:a);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11117) : f.call(null,G__11117));
+});
+var G__11134__2 = (function (a,b){
+var G__11118 = (((a == null))?x:a);
+var G__11119 = b;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11118,G__11119) : f.call(null,G__11118,G__11119));
+});
+var G__11134__3 = (function (a,b,c){
+var G__11120 = (((a == null))?x:a);
+var G__11121 = b;
+var G__11122 = c;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11120,G__11121,G__11122) : f.call(null,G__11120,G__11121,G__11122));
+});
+var G__11134__4 = (function() {
+var G__11135__delegate = function (a,b,c,ds){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,(((a == null))?x:a),b,c,ds);
+};
+var G__11135 = function (a,b,c,var_args){
+var ds = null;
+if (arguments.length > 3) {
+var G__11136__i = 0, G__11136__a = new Array(arguments.length - 3);
+while (G__11136__i < G__11136__a.length) {G__11136__a[G__11136__i] = arguments[G__11136__i + 3]; ++G__11136__i;}
+ ds = new cljs.core.IndexedSeq(G__11136__a,0,null);
+}
+return G__11135__delegate.call(this,a,b,c,ds);};
+G__11135.cljs$lang$maxFixedArity = 3;
+G__11135.cljs$lang$applyTo = (function (arglist__11137){
+var a = cljs.core.first(arglist__11137);
+arglist__11137 = cljs.core.next(arglist__11137);
+var b = cljs.core.first(arglist__11137);
+arglist__11137 = cljs.core.next(arglist__11137);
+var c = cljs.core.first(arglist__11137);
+var ds = cljs.core.rest(arglist__11137);
+return G__11135__delegate(a,b,c,ds);
+});
+G__11135.cljs$core$IFn$_invoke$arity$variadic = G__11135__delegate;
+return G__11135;
+})()
+;
+G__11134 = function(a,b,c,var_args){
+var ds = var_args;
+switch(arguments.length){
+case 1:
+return G__11134__1.call(this,a);
+case 2:
+return G__11134__2.call(this,a,b);
+case 3:
+return G__11134__3.call(this,a,b,c);
+default:
+var G__11138 = null;
+if (arguments.length > 3) {
+var G__11139__i = 0, G__11139__a = new Array(arguments.length - 3);
+while (G__11139__i < G__11139__a.length) {G__11139__a[G__11139__i] = arguments[G__11139__i + 3]; ++G__11139__i;}
+G__11138 = new cljs.core.IndexedSeq(G__11139__a,0,null);
+}
+return G__11134__4.cljs$core$IFn$_invoke$arity$variadic(a,b,c, G__11138);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11134.cljs$lang$maxFixedArity = 3;
+G__11134.cljs$lang$applyTo = G__11134__4.cljs$lang$applyTo;
+G__11134.cljs$core$IFn$_invoke$arity$1 = G__11134__1;
+G__11134.cljs$core$IFn$_invoke$arity$2 = G__11134__2;
+G__11134.cljs$core$IFn$_invoke$arity$3 = G__11134__3;
+G__11134.cljs$core$IFn$_invoke$arity$variadic = G__11134__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11134;
+})()
+});
+
+cljs.core.fnil.cljs$core$IFn$_invoke$arity$3 = (function (f,x,y){
+return (function() {
+var G__11140 = null;
+var G__11140__2 = (function (a,b){
+var G__11123 = (((a == null))?x:a);
+var G__11124 = (((b == null))?y:b);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11123,G__11124) : f.call(null,G__11123,G__11124));
+});
+var G__11140__3 = (function (a,b,c){
+var G__11125 = (((a == null))?x:a);
+var G__11126 = (((b == null))?y:b);
+var G__11127 = c;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11125,G__11126,G__11127) : f.call(null,G__11125,G__11126,G__11127));
+});
+var G__11140__4 = (function() {
+var G__11141__delegate = function (a,b,c,ds){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,(((a == null))?x:a),(((b == null))?y:b),c,ds);
+};
+var G__11141 = function (a,b,c,var_args){
+var ds = null;
+if (arguments.length > 3) {
+var G__11142__i = 0, G__11142__a = new Array(arguments.length - 3);
+while (G__11142__i < G__11142__a.length) {G__11142__a[G__11142__i] = arguments[G__11142__i + 3]; ++G__11142__i;}
+ ds = new cljs.core.IndexedSeq(G__11142__a,0,null);
+}
+return G__11141__delegate.call(this,a,b,c,ds);};
+G__11141.cljs$lang$maxFixedArity = 3;
+G__11141.cljs$lang$applyTo = (function (arglist__11143){
+var a = cljs.core.first(arglist__11143);
+arglist__11143 = cljs.core.next(arglist__11143);
+var b = cljs.core.first(arglist__11143);
+arglist__11143 = cljs.core.next(arglist__11143);
+var c = cljs.core.first(arglist__11143);
+var ds = cljs.core.rest(arglist__11143);
+return G__11141__delegate(a,b,c,ds);
+});
+G__11141.cljs$core$IFn$_invoke$arity$variadic = G__11141__delegate;
+return G__11141;
+})()
+;
+G__11140 = function(a,b,c,var_args){
+var ds = var_args;
+switch(arguments.length){
+case 2:
+return G__11140__2.call(this,a,b);
+case 3:
+return G__11140__3.call(this,a,b,c);
+default:
+var G__11144 = null;
+if (arguments.length > 3) {
+var G__11145__i = 0, G__11145__a = new Array(arguments.length - 3);
+while (G__11145__i < G__11145__a.length) {G__11145__a[G__11145__i] = arguments[G__11145__i + 3]; ++G__11145__i;}
+G__11144 = new cljs.core.IndexedSeq(G__11145__a,0,null);
+}
+return G__11140__4.cljs$core$IFn$_invoke$arity$variadic(a,b,c, G__11144);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11140.cljs$lang$maxFixedArity = 3;
+G__11140.cljs$lang$applyTo = G__11140__4.cljs$lang$applyTo;
+G__11140.cljs$core$IFn$_invoke$arity$2 = G__11140__2;
+G__11140.cljs$core$IFn$_invoke$arity$3 = G__11140__3;
+G__11140.cljs$core$IFn$_invoke$arity$variadic = G__11140__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11140;
+})()
+});
+
+cljs.core.fnil.cljs$core$IFn$_invoke$arity$4 = (function (f,x,y,z){
+return (function() {
+var G__11146 = null;
+var G__11146__2 = (function (a,b){
+var G__11128 = (((a == null))?x:a);
+var G__11129 = (((b == null))?y:b);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11128,G__11129) : f.call(null,G__11128,G__11129));
+});
+var G__11146__3 = (function (a,b,c){
+var G__11130 = (((a == null))?x:a);
+var G__11131 = (((b == null))?y:b);
+var G__11132 = (((c == null))?z:c);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11130,G__11131,G__11132) : f.call(null,G__11130,G__11131,G__11132));
+});
+var G__11146__4 = (function() {
+var G__11147__delegate = function (a,b,c,ds){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,(((a == null))?x:a),(((b == null))?y:b),(((c == null))?z:c),ds);
+};
+var G__11147 = function (a,b,c,var_args){
+var ds = null;
+if (arguments.length > 3) {
+var G__11148__i = 0, G__11148__a = new Array(arguments.length - 3);
+while (G__11148__i < G__11148__a.length) {G__11148__a[G__11148__i] = arguments[G__11148__i + 3]; ++G__11148__i;}
+ ds = new cljs.core.IndexedSeq(G__11148__a,0,null);
+}
+return G__11147__delegate.call(this,a,b,c,ds);};
+G__11147.cljs$lang$maxFixedArity = 3;
+G__11147.cljs$lang$applyTo = (function (arglist__11149){
+var a = cljs.core.first(arglist__11149);
+arglist__11149 = cljs.core.next(arglist__11149);
+var b = cljs.core.first(arglist__11149);
+arglist__11149 = cljs.core.next(arglist__11149);
+var c = cljs.core.first(arglist__11149);
+var ds = cljs.core.rest(arglist__11149);
+return G__11147__delegate(a,b,c,ds);
+});
+G__11147.cljs$core$IFn$_invoke$arity$variadic = G__11147__delegate;
+return G__11147;
+})()
+;
+G__11146 = function(a,b,c,var_args){
+var ds = var_args;
+switch(arguments.length){
+case 2:
+return G__11146__2.call(this,a,b);
+case 3:
+return G__11146__3.call(this,a,b,c);
+default:
+var G__11150 = null;
+if (arguments.length > 3) {
+var G__11151__i = 0, G__11151__a = new Array(arguments.length - 3);
+while (G__11151__i < G__11151__a.length) {G__11151__a[G__11151__i] = arguments[G__11151__i + 3]; ++G__11151__i;}
+G__11150 = new cljs.core.IndexedSeq(G__11151__a,0,null);
+}
+return G__11146__4.cljs$core$IFn$_invoke$arity$variadic(a,b,c, G__11150);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11146.cljs$lang$maxFixedArity = 3;
+G__11146.cljs$lang$applyTo = G__11146__4.cljs$lang$applyTo;
+G__11146.cljs$core$IFn$_invoke$arity$2 = G__11146__2;
+G__11146.cljs$core$IFn$_invoke$arity$3 = G__11146__3;
+G__11146.cljs$core$IFn$_invoke$arity$variadic = G__11146__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__11146;
+})()
+});
+
+cljs.core.fnil.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Returns a lazy sequence consisting of the result of applying f to 0
+ * and the first item of coll, followed by applying f to 1 and the second
+ * item in coll, etc, until coll is exhausted. Thus function f should
+ * accept 2 arguments, index and item. Returns a stateful transducer when
+ * no collection is provided.
+ */
+cljs.core.map_indexed = (function cljs$core$map_indexed(var_args){
+var G__11153 = arguments.length;
+switch (G__11153) {
+case 1:
+return cljs.core.map_indexed.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.map_indexed.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.map_indexed.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function (rf){
+var i = cljs.core.volatile_BANG_((-1));
+return ((function (i){
+return (function() {
+var G__11167 = null;
+var G__11167__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11167__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11167__2 = (function (result,input){
+var G__11154 = result;
+var G__11155 = (function (){var G__11156 = i.cljs$core$IVolatile$_vreset_BANG_$arity$2(null,(i.cljs$core$IDeref$_deref$arity$1(null) + (1)));
+var G__11157 = input;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11156,G__11157) : f.call(null,G__11156,G__11157));
+})();
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(G__11154,G__11155) : rf.call(null,G__11154,G__11155));
+});
+G__11167 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11167__0.call(this);
+case 1:
+return G__11167__1.call(this,result);
+case 2:
+return G__11167__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11167.cljs$core$IFn$_invoke$arity$0 = G__11167__0;
+G__11167.cljs$core$IFn$_invoke$arity$1 = G__11167__1;
+G__11167.cljs$core$IFn$_invoke$arity$2 = G__11167__2;
+return G__11167;
+})()
+;})(i))
+});
+});
+
+cljs.core.map_indexed.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+var mapi = (function cljs$core$mapi(idx,coll__$1){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll__$1);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s)){
+var c = cljs.core.chunk_first(s);
+var size = cljs.core.count(c);
+var b = cljs.core.chunk_buffer(size);
+var n__8769__auto___11168 = size;
+var i_11169 = (0);
+while(true){
+if((i_11169 < n__8769__auto___11168)){
+cljs.core.chunk_append(b,(function (){var G__11162 = (idx + i_11169);
+var G__11163 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_11169);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11162,G__11163) : f.call(null,G__11162,G__11163));
+})());
+
+var G__11170 = (i_11169 + (1));
+i_11169 = G__11170;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.chunk_cons(cljs.core.chunk(b),cljs$core$mapi((idx + size),cljs.core.chunk_rest(s)));
+} else {
+return cljs.core.cons((function (){var G__11164 = idx;
+var G__11165 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11164,G__11165) : f.call(null,G__11164,G__11165));
+})(),cljs$core$mapi((idx + (1)),cljs.core.rest(s)));
+}
+} else {
+return null;
+}
+}),null,null));
+});
+return mapi((0),coll);
+});
+
+cljs.core.map_indexed.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of the non-nil results of (f item). Note,
+ * this means false return values will be included. f must be free of
+ * side-effects. Returns a transducer when no collection is provided.
+ */
+cljs.core.keep = (function cljs$core$keep(var_args){
+var G__11172 = arguments.length;
+switch (G__11172) {
+case 1:
+return cljs.core.keep.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.keep.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.keep.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function (rf){
+return (function() {
+var G__11176 = null;
+var G__11176__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11176__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11176__2 = (function (result,input){
+var v = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(input) : f.call(null,input));
+if((v == null)){
+return result;
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v));
+}
+});
+G__11176 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11176__0.call(this);
+case 1:
+return G__11176__1.call(this,result);
+case 2:
+return G__11176__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11176.cljs$core$IFn$_invoke$arity$0 = G__11176__0;
+G__11176.cljs$core$IFn$_invoke$arity$1 = G__11176__1;
+G__11176.cljs$core$IFn$_invoke$arity$2 = G__11176__2;
+return G__11176;
+})()
+});
+});
+
+cljs.core.keep.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s)){
+var c = cljs.core.chunk_first(s);
+var size = cljs.core.count(c);
+var b = cljs.core.chunk_buffer(size);
+var n__8769__auto___11177 = size;
+var i_11178 = (0);
+while(true){
+if((i_11178 < n__8769__auto___11177)){
+var x_11179 = (function (){var G__11173 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_11178);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11173) : f.call(null,G__11173));
+})();
+if((x_11179 == null)){
+} else {
+cljs.core.chunk_append(b,x_11179);
+}
+
+var G__11180 = (i_11178 + (1));
+i_11178 = G__11180;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.chunk_cons(cljs.core.chunk(b),cljs.core.keep.cljs$core$IFn$_invoke$arity$2(f,cljs.core.chunk_rest(s)));
+} else {
+var x = (function (){var G__11174 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11174) : f.call(null,G__11174));
+})();
+if((x == null)){
+return cljs.core.keep.cljs$core$IFn$_invoke$arity$2(f,cljs.core.rest(s));
+} else {
+return cljs.core.cons(x,cljs.core.keep.cljs$core$IFn$_invoke$arity$2(f,cljs.core.rest(s)));
+}
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.keep.cljs$lang$maxFixedArity = 2;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IWatchable}
+ * @implements {cljs.core.IAtom}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IDeref}
+*/
+cljs.core.Atom = (function (state,meta,validator,watches){
+this.state = state;
+this.meta = meta;
+this.validator = validator;
+this.watches = watches;
+this.cljs$lang$protocol_mask$partition1$ = 16386;
+this.cljs$lang$protocol_mask$partition0$ = 6455296;
+});
+cljs.core.Atom.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Atom.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (o,other){
+var self__ = this;
+var o__$1 = this;
+return (o__$1 === other);
+});
+
+cljs.core.Atom.prototype.cljs$core$IDeref$_deref$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.state;
+});
+
+cljs.core.Atom.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.meta;
+});
+
+cljs.core.Atom.prototype.cljs$core$IWatchable$_notify_watches$arity$3 = (function (this$,oldval,newval){
+var self__ = this;
+var this$__$1 = this;
+var seq__11181 = cljs.core.seq(self__.watches);
+var chunk__11182 = null;
+var count__11183 = (0);
+var i__11184 = (0);
+while(true){
+if((i__11184 < count__11183)){
+var vec__11185 = chunk__11182.cljs$core$IIndexed$_nth$arity$2(null,i__11184);
+var key = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11185,(0),null);
+var f = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11185,(1),null);
+(f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(key,this$__$1,oldval,newval) : f.call(null,key,this$__$1,oldval,newval));
+
+
+var G__11191 = seq__11181;
+var G__11192 = chunk__11182;
+var G__11193 = count__11183;
+var G__11194 = (i__11184 + (1));
+seq__11181 = G__11191;
+chunk__11182 = G__11192;
+count__11183 = G__11193;
+i__11184 = G__11194;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__11181);
+if(temp__4657__auto__){
+var seq__11181__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__11181__$1)){
+var c__8664__auto__ = cljs.core.chunk_first(seq__11181__$1);
+var G__11195 = cljs.core.chunk_rest(seq__11181__$1);
+var G__11196 = c__8664__auto__;
+var G__11197 = cljs.core.count(c__8664__auto__);
+var G__11198 = (0);
+seq__11181 = G__11195;
+chunk__11182 = G__11196;
+count__11183 = G__11197;
+i__11184 = G__11198;
+continue;
+} else {
+var vec__11188 = cljs.core.first(seq__11181__$1);
+var key = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11188,(0),null);
+var f = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11188,(1),null);
+(f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(key,this$__$1,oldval,newval) : f.call(null,key,this$__$1,oldval,newval));
+
+
+var G__11199 = cljs.core.next(seq__11181__$1);
+var G__11200 = null;
+var G__11201 = (0);
+var G__11202 = (0);
+seq__11181 = G__11199;
+chunk__11182 = G__11200;
+count__11183 = G__11201;
+i__11184 = G__11202;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.Atom.prototype.cljs$core$IWatchable$_add_watch$arity$3 = (function (this$,key,f){
+var self__ = this;
+var this$__$1 = this;
+this$__$1.watches = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(self__.watches,key,f);
+
+return this$__$1;
+});
+
+cljs.core.Atom.prototype.cljs$core$IWatchable$_remove_watch$arity$2 = (function (this$,key){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1.watches = cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2(self__.watches,key);
+});
+
+cljs.core.Atom.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return goog.getUid(this$__$1);
+});
+
+cljs.core.Atom.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"state","state",-348086572,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"validator","validator",-325659154,null),new cljs.core.Symbol(null,"watches","watches",1367433992,null)], null);
+});
+
+cljs.core.Atom.cljs$lang$type = true;
+
+cljs.core.Atom.cljs$lang$ctorStr = "cljs.core/Atom";
+
+cljs.core.Atom.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Atom");
+});
+
+/**
+ * Positional factory function for cljs.core/Atom.
+ */
+cljs.core.__GT_Atom = (function cljs$core$__GT_Atom(state,meta,validator,watches){
+return (new cljs.core.Atom(state,meta,validator,watches));
+});
+
+/**
+ * Creates and returns an Atom with an initial value of x and zero or
+ * more options (in any order):
+ *
+ * :meta metadata-map
+ *
+ * :validator validate-fn
+ *
+ * If metadata-map is supplied, it will be come the metadata on the
+ * atom. validate-fn must be nil or a side-effect-free fn of one
+ * argument, which will be passed the intended new state on any state
+ * change. If the new state is unacceptable, the validate-fn should
+ * return false or throw an Error. If either of these error conditions
+ * occur, then the value of the atom will not change.
+ */
+cljs.core.atom = (function cljs$core$atom(var_args){
+var G__11206 = arguments.length;
+switch (G__11206) {
+case 1:
+return cljs.core.atom.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11211 = arguments.length;
+var i__9001__auto___11212 = (0);
+while(true){
+if((i__9001__auto___11212 < len__9000__auto___11211)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11212]));
+
+var G__11213 = (i__9001__auto___11212 + (1));
+i__9001__auto___11212 = G__11213;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((1)),(0),null));
+return cljs.core.atom.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.atom.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (new cljs.core.Atom(x,null,null,null));
+});
+
+cljs.core.atom.cljs$core$IFn$_invoke$arity$variadic = (function (x,p__11207){
+var map__11208 = p__11207;
+var map__11208__$1 = (((((!((map__11208 == null))))?(((((map__11208.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__11208.cljs$core$ISeq$))))?true:false):false))?cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.hash_map,map__11208):map__11208);
+var meta = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__11208__$1,new cljs.core.Keyword(null,"meta","meta",1499536964));
+var validator = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__11208__$1,new cljs.core.Keyword(null,"validator","validator",-1966190681));
+return (new cljs.core.Atom(x,meta,validator,null));
+});
+
+/** @this {Function} */
+cljs.core.atom.cljs$lang$applyTo = (function (seq11204){
+var G__11205 = cljs.core.first(seq11204);
+var seq11204__$1 = cljs.core.next(seq11204);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11205,seq11204__$1);
+});
+
+cljs.core.atom.cljs$lang$maxFixedArity = (1);
+
+/**
+ * Sets the value of atom to newval without regard for the
+ * current value. Returns new-value.
+ */
+cljs.core.reset_BANG_ = (function cljs$core$reset_BANG_(a,new_value){
+if((a instanceof cljs.core.Atom)){
+var validate = a.validator;
+if((validate == null)){
+} else {
+if(cljs.core.truth_((validate.cljs$core$IFn$_invoke$arity$1 ? validate.cljs$core$IFn$_invoke$arity$1(new_value) : validate.call(null,new_value)))){
+} else {
+throw (new Error("Validator rejected reference state"));
+}
+}
+
+var old_value = a.state;
+a.state = new_value;
+
+if((a.watches == null)){
+} else {
+cljs.core._notify_watches(a,old_value,new_value);
+}
+
+return new_value;
+} else {
+return cljs.core._reset_BANG_(a,new_value);
+}
+});
+/**
+ * Sets the value of atom to newval. Returns [old new], the value of the
+ * atom before and after the reset.
+ */
+cljs.core.reset_vals_BANG_ = (function cljs$core$reset_vals_BANG_(a,new_value){
+var validate = a.validator;
+if((validate == null)){
+} else {
+if(cljs.core.truth_((validate.cljs$core$IFn$_invoke$arity$1 ? validate.cljs$core$IFn$_invoke$arity$1(new_value) : validate.call(null,new_value)))){
+} else {
+throw (new Error("Validator rejected reference state"));
+}
+}
+
+var old_value = a.state;
+a.state = new_value;
+
+if((a.watches == null)){
+} else {
+cljs.core._notify_watches(a,old_value,new_value);
+}
+
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [old_value,new_value], null);
+});
+/**
+ * Atomically swaps the value of atom to be:
+ * (apply f current-value-of-atom args). Note that f may be called
+ * multiple times, and thus should be free of side effects. Returns
+ * the value that was swapped in.
+ */
+cljs.core.swap_BANG_ = (function cljs$core$swap_BANG_(var_args){
+var G__11220 = arguments.length;
+switch (G__11220) {
+case 2:
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11228 = arguments.length;
+var i__9001__auto___11229 = (0);
+while(true){
+if((i__9001__auto___11229 < len__9000__auto___11228)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11229]));
+
+var G__11230 = (i__9001__auto___11229 + (1));
+i__9001__auto___11229 = G__11230;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((4)),(0),null));
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (a,f){
+if((a instanceof cljs.core.Atom)){
+return cljs.core.reset_BANG_(a,(function (){var G__11221 = a.state;
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11221) : f.call(null,G__11221));
+})());
+} else {
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$2(a,f);
+}
+});
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3 = (function (a,f,x){
+if((a instanceof cljs.core.Atom)){
+return cljs.core.reset_BANG_(a,(function (){var G__11222 = a.state;
+var G__11223 = x;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11222,G__11223) : f.call(null,G__11222,G__11223));
+})());
+} else {
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$3(a,f,x);
+}
+});
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4 = (function (a,f,x,y){
+if((a instanceof cljs.core.Atom)){
+return cljs.core.reset_BANG_(a,(function (){var G__11224 = a.state;
+var G__11225 = x;
+var G__11226 = y;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11224,G__11225,G__11226) : f.call(null,G__11224,G__11225,G__11226));
+})());
+} else {
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$4(a,f,x,y);
+}
+});
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (a,f,x,y,more){
+if((a instanceof cljs.core.Atom)){
+return cljs.core.reset_BANG_(a,cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,a.state,x,y,more));
+} else {
+return cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$5(a,f,x,y,more);
+}
+});
+
+/** @this {Function} */
+cljs.core.swap_BANG_.cljs$lang$applyTo = (function (seq11215){
+var G__11216 = cljs.core.first(seq11215);
+var seq11215__$1 = cljs.core.next(seq11215);
+var G__11217 = cljs.core.first(seq11215__$1);
+var seq11215__$2 = cljs.core.next(seq11215__$1);
+var G__11218 = cljs.core.first(seq11215__$2);
+var seq11215__$3 = cljs.core.next(seq11215__$2);
+var G__11219 = cljs.core.first(seq11215__$3);
+var seq11215__$4 = cljs.core.next(seq11215__$3);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11216,G__11217,G__11218,G__11219,seq11215__$4);
+});
+
+cljs.core.swap_BANG_.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Atomically swaps the value of atom to be:
+ * (apply f current-value-of-atom args). Note that f may be called
+ * multiple times, and thus should be free of side effects.
+ * Returns [old new], the value of the atom before and after the swap.
+ */
+cljs.core.swap_vals_BANG_ = (function cljs$core$swap_vals_BANG_(var_args){
+var G__11237 = arguments.length;
+switch (G__11237) {
+case 2:
+return cljs.core.swap_vals_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.swap_vals_BANG_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.swap_vals_BANG_.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11245 = arguments.length;
+var i__9001__auto___11246 = (0);
+while(true){
+if((i__9001__auto___11246 < len__9000__auto___11245)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11246]));
+
+var G__11247 = (i__9001__auto___11246 + (1));
+i__9001__auto___11246 = G__11247;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((4)),(0),null));
+return cljs.core.swap_vals_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.swap_vals_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (a,f){
+return cljs.core.reset_vals_BANG_(a,(function (){var G__11238 = a.state;
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11238) : f.call(null,G__11238));
+})());
+});
+
+cljs.core.swap_vals_BANG_.cljs$core$IFn$_invoke$arity$3 = (function (a,f,x){
+return cljs.core.reset_vals_BANG_(a,(function (){var G__11239 = a.state;
+var G__11240 = x;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11239,G__11240) : f.call(null,G__11239,G__11240));
+})());
+});
+
+cljs.core.swap_vals_BANG_.cljs$core$IFn$_invoke$arity$4 = (function (a,f,x,y){
+return cljs.core.reset_vals_BANG_(a,(function (){var G__11241 = a.state;
+var G__11242 = x;
+var G__11243 = y;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11241,G__11242,G__11243) : f.call(null,G__11241,G__11242,G__11243));
+})());
+});
+
+cljs.core.swap_vals_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (a,f,x,y,more){
+return cljs.core.reset_vals_BANG_(a,cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,a.state,x,y,more));
+});
+
+/** @this {Function} */
+cljs.core.swap_vals_BANG_.cljs$lang$applyTo = (function (seq11232){
+var G__11233 = cljs.core.first(seq11232);
+var seq11232__$1 = cljs.core.next(seq11232);
+var G__11234 = cljs.core.first(seq11232__$1);
+var seq11232__$2 = cljs.core.next(seq11232__$1);
+var G__11235 = cljs.core.first(seq11232__$2);
+var seq11232__$3 = cljs.core.next(seq11232__$2);
+var G__11236 = cljs.core.first(seq11232__$3);
+var seq11232__$4 = cljs.core.next(seq11232__$3);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11233,G__11234,G__11235,G__11236,seq11232__$4);
+});
+
+cljs.core.swap_vals_BANG_.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Atomically sets the value of atom to newval if and only if the
+ * current value of the atom is equal to oldval. Returns true if
+ * set happened, else false.
+ */
+cljs.core.compare_and_set_BANG_ = (function cljs$core$compare_and_set_BANG_(a,oldval,newval){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(a.cljs$core$IDeref$_deref$arity$1(null),oldval)){
+cljs.core.reset_BANG_(a,newval);
+
+return true;
+} else {
+return false;
+}
+});
+/**
+ * Sets the validator-fn for an atom. validator-fn must be nil or a
+ * side-effect-free fn of one argument, which will be passed the intended
+ * new state on any state change. If the new state is unacceptable, the
+ * validator-fn should return false or throw an Error. If the current state
+ * is not acceptable to the new validator, an Error will be thrown and the
+ * validator will not be changed.
+ */
+cljs.core.set_validator_BANG_ = (function cljs$core$set_validator_BANG_(iref,val){
+if((((!((val == null)))) && (cljs.core.not((function (){var G__11249 = cljs.core._deref(iref);
+return (val.cljs$core$IFn$_invoke$arity$1 ? val.cljs$core$IFn$_invoke$arity$1(G__11249) : val.call(null,G__11249));
+})())))){
+throw (new Error("Validator rejected reference state"));
+} else {
+}
+
+return iref.validator = val;
+});
+/**
+ * Gets the validator-fn for a var/ref/agent/atom.
+ */
+cljs.core.get_validator = (function cljs$core$get_validator(iref){
+return iref.validator;
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IVolatile}
+ * @implements {cljs.core.IDeref}
+*/
+cljs.core.Volatile = (function (state){
+this.state = state;
+this.cljs$lang$protocol_mask$partition0$ = 32768;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.Volatile.prototype.cljs$core$IVolatile$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Volatile.prototype.cljs$core$IVolatile$_vreset_BANG_$arity$2 = (function (_,new_state){
+var self__ = this;
+var ___$1 = this;
+return self__.state = new_state;
+});
+
+cljs.core.Volatile.prototype.cljs$core$IDeref$_deref$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return self__.state;
+});
+
+cljs.core.Volatile.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"state","state",-348086572,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Volatile.cljs$lang$type = true;
+
+cljs.core.Volatile.cljs$lang$ctorStr = "cljs.core/Volatile";
+
+cljs.core.Volatile.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Volatile");
+});
+
+/**
+ * Positional factory function for cljs.core/Volatile.
+ */
+cljs.core.__GT_Volatile = (function cljs$core$__GT_Volatile(state){
+return (new cljs.core.Volatile(state));
+});
+
+/**
+ * Creates and returns a Volatile with an initial value of val.
+ */
+cljs.core.volatile_BANG_ = (function cljs$core$volatile_BANG_(val){
+return (new cljs.core.Volatile(val));
+});
+/**
+ * Returns true if x is a volatile.
+ */
+cljs.core.volatile_QMARK_ = (function cljs$core$volatile_QMARK_(x){
+return (x instanceof cljs.core.Volatile);
+});
+/**
+ * Sets the value of volatile to newval without regard for the
+ * current value. Returns newval.
+ */
+cljs.core.vreset_BANG_ = (function cljs$core$vreset_BANG_(vol,newval){
+return cljs.core._vreset_BANG_(vol,newval);
+});
+/**
+ * Returns a lazy sequence of the non-nil results of (f index item). Note,
+ * this means false return values will be included. f must be free of
+ * side-effects. Returns a stateful transducer when no collection is
+ * provided.
+ */
+cljs.core.keep_indexed = (function cljs$core$keep_indexed(var_args){
+var G__11251 = arguments.length;
+switch (G__11251) {
+case 1:
+return cljs.core.keep_indexed.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.keep_indexed.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.keep_indexed.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function (rf){
+var ia = cljs.core.volatile_BANG_((-1));
+return ((function (ia){
+return (function() {
+var G__11261 = null;
+var G__11261__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11261__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11261__2 = (function (result,input){
+var i = ia.cljs$core$IVolatile$_vreset_BANG_$arity$2(null,(ia.cljs$core$IDeref$_deref$arity$1(null) + (1)));
+var v = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(i,input) : f.call(null,i,input));
+if((v == null)){
+return result;
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v));
+}
+});
+G__11261 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11261__0.call(this);
+case 1:
+return G__11261__1.call(this,result);
+case 2:
+return G__11261__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11261.cljs$core$IFn$_invoke$arity$0 = G__11261__0;
+G__11261.cljs$core$IFn$_invoke$arity$1 = G__11261__1;
+G__11261.cljs$core$IFn$_invoke$arity$2 = G__11261__2;
+return G__11261;
+})()
+;})(ia))
+});
+});
+
+cljs.core.keep_indexed.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+var keepi = (function cljs$core$keepi(idx,coll__$1){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll__$1);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s)){
+var c = cljs.core.chunk_first(s);
+var size = cljs.core.count(c);
+var b = cljs.core.chunk_buffer(size);
+var n__8769__auto___11262 = size;
+var i_11263 = (0);
+while(true){
+if((i_11263 < n__8769__auto___11262)){
+var x_11264 = (function (){var G__11256 = (idx + i_11263);
+var G__11257 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_11263);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11256,G__11257) : f.call(null,G__11256,G__11257));
+})();
+if((x_11264 == null)){
+} else {
+cljs.core.chunk_append(b,x_11264);
+}
+
+var G__11265 = (i_11263 + (1));
+i_11263 = G__11265;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.chunk_cons(cljs.core.chunk(b),cljs$core$keepi((idx + size),cljs.core.chunk_rest(s)));
+} else {
+var x = (function (){var G__11258 = idx;
+var G__11259 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11258,G__11259) : f.call(null,G__11258,G__11259));
+})();
+if((x == null)){
+return cljs$core$keepi((idx + (1)),cljs.core.rest(s));
+} else {
+return cljs.core.cons(x,cljs$core$keepi((idx + (1)),cljs.core.rest(s)));
+}
+}
+} else {
+return null;
+}
+}),null,null));
+});
+return keepi((0),coll);
+});
+
+cljs.core.keep_indexed.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Takes a set of predicates and returns a function f that returns true if all of its
+ * composing predicates return a logical true value against all of its arguments, else it returns
+ * false. Note that f is short-circuiting in that it will stop execution on the first
+ * argument that triggers a logical false result against the original predicates.
+ */
+cljs.core.every_pred = (function cljs$core$every_pred(var_args){
+var G__11277 = arguments.length;
+switch (G__11277) {
+case 1:
+return cljs.core.every_pred.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.every_pred.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.every_pred.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11279 = arguments.length;
+var i__9001__auto___11280 = (0);
+while(true){
+if((i__9001__auto___11280 < len__9000__auto___11279)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11280]));
+
+var G__11281 = (i__9001__auto___11280 + (1));
+i__9001__auto___11280 = G__11281;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.every_pred.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.every_pred.cljs$core$IFn$_invoke$arity$1 = (function (p){
+return (function() {
+var cljs$core$ep1 = null;
+var cljs$core$ep1__0 = (function (){
+return true;
+});
+var cljs$core$ep1__1 = (function (x){
+return cljs.core.boolean$((p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x)));
+});
+var cljs$core$ep1__2 = (function (x,y){
+return cljs.core.boolean$((function (){var and__7791__auto__ = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x));
+if(cljs.core.truth_(and__7791__auto__)){
+return (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(y) : p.call(null,y));
+} else {
+return and__7791__auto__;
+}
+})());
+});
+var cljs$core$ep1__3 = (function (x,y,z){
+return cljs.core.boolean$((function (){var and__7791__auto__ = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x));
+if(cljs.core.truth_(and__7791__auto__)){
+var and__7791__auto____$1 = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(y) : p.call(null,y));
+if(cljs.core.truth_(and__7791__auto____$1)){
+return (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(z) : p.call(null,z));
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+})());
+});
+var cljs$core$ep1__4 = (function() {
+var G__11282__delegate = function (x,y,z,args){
+return cljs.core.boolean$((function (){var and__7791__auto__ = cljs$core$ep1.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(and__7791__auto__)){
+return cljs.core.every_QMARK_(p,args);
+} else {
+return and__7791__auto__;
+}
+})());
+};
+var G__11282 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11283__i = 0, G__11283__a = new Array(arguments.length - 3);
+while (G__11283__i < G__11283__a.length) {G__11283__a[G__11283__i] = arguments[G__11283__i + 3]; ++G__11283__i;}
+ args = new cljs.core.IndexedSeq(G__11283__a,0,null);
+}
+return G__11282__delegate.call(this,x,y,z,args);};
+G__11282.cljs$lang$maxFixedArity = 3;
+G__11282.cljs$lang$applyTo = (function (arglist__11284){
+var x = cljs.core.first(arglist__11284);
+arglist__11284 = cljs.core.next(arglist__11284);
+var y = cljs.core.first(arglist__11284);
+arglist__11284 = cljs.core.next(arglist__11284);
+var z = cljs.core.first(arglist__11284);
+var args = cljs.core.rest(arglist__11284);
+return G__11282__delegate(x,y,z,args);
+});
+G__11282.cljs$core$IFn$_invoke$arity$variadic = G__11282__delegate;
+return G__11282;
+})()
+;
+cljs$core$ep1 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$ep1__0.call(this);
+case 1:
+return cljs$core$ep1__1.call(this,x);
+case 2:
+return cljs$core$ep1__2.call(this,x,y);
+case 3:
+return cljs$core$ep1__3.call(this,x,y,z);
+default:
+var G__11285 = null;
+if (arguments.length > 3) {
+var G__11286__i = 0, G__11286__a = new Array(arguments.length - 3);
+while (G__11286__i < G__11286__a.length) {G__11286__a[G__11286__i] = arguments[G__11286__i + 3]; ++G__11286__i;}
+G__11285 = new cljs.core.IndexedSeq(G__11286__a,0,null);
+}
+return cljs$core$ep1__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11285);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$ep1.cljs$lang$maxFixedArity = 3;
+cljs$core$ep1.cljs$lang$applyTo = cljs$core$ep1__4.cljs$lang$applyTo;
+cljs$core$ep1.cljs$core$IFn$_invoke$arity$0 = cljs$core$ep1__0;
+cljs$core$ep1.cljs$core$IFn$_invoke$arity$1 = cljs$core$ep1__1;
+cljs$core$ep1.cljs$core$IFn$_invoke$arity$2 = cljs$core$ep1__2;
+cljs$core$ep1.cljs$core$IFn$_invoke$arity$3 = cljs$core$ep1__3;
+cljs$core$ep1.cljs$core$IFn$_invoke$arity$variadic = cljs$core$ep1__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$ep1;
+})()
+});
+
+cljs.core.every_pred.cljs$core$IFn$_invoke$arity$2 = (function (p1,p2){
+return (function() {
+var cljs$core$ep2 = null;
+var cljs$core$ep2__0 = (function (){
+return true;
+});
+var cljs$core$ep2__1 = (function (x){
+return cljs.core.boolean$((function (){var and__7791__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__7791__auto__)){
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+} else {
+return and__7791__auto__;
+}
+})());
+});
+var cljs$core$ep2__2 = (function (x,y){
+return cljs.core.boolean$((function (){var and__7791__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__7791__auto__)){
+var and__7791__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(and__7791__auto____$1)){
+var and__7791__auto____$2 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(and__7791__auto____$2)){
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+} else {
+return and__7791__auto____$2;
+}
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+})());
+});
+var cljs$core$ep2__3 = (function (x,y,z){
+return cljs.core.boolean$((function (){var and__7791__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__7791__auto__)){
+var and__7791__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(and__7791__auto____$1)){
+var and__7791__auto____$2 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(z) : p1.call(null,z));
+if(cljs.core.truth_(and__7791__auto____$2)){
+var and__7791__auto____$3 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(and__7791__auto____$3)){
+var and__7791__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(and__7791__auto____$4)){
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(z) : p2.call(null,z));
+} else {
+return and__7791__auto____$4;
+}
+} else {
+return and__7791__auto____$3;
+}
+} else {
+return and__7791__auto____$2;
+}
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+})());
+});
+var cljs$core$ep2__4 = (function() {
+var G__11287__delegate = function (x,y,z,args){
+return cljs.core.boolean$((function (){var and__7791__auto__ = cljs$core$ep2.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(and__7791__auto__)){
+return cljs.core.every_QMARK_(((function (and__7791__auto__){
+return (function (p1__11266_SHARP_){
+var and__7791__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(p1__11266_SHARP_) : p1.call(null,p1__11266_SHARP_));
+if(cljs.core.truth_(and__7791__auto____$1)){
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(p1__11266_SHARP_) : p2.call(null,p1__11266_SHARP_));
+} else {
+return and__7791__auto____$1;
+}
+});})(and__7791__auto__))
+,args);
+} else {
+return and__7791__auto__;
+}
+})());
+};
+var G__11287 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11288__i = 0, G__11288__a = new Array(arguments.length - 3);
+while (G__11288__i < G__11288__a.length) {G__11288__a[G__11288__i] = arguments[G__11288__i + 3]; ++G__11288__i;}
+ args = new cljs.core.IndexedSeq(G__11288__a,0,null);
+}
+return G__11287__delegate.call(this,x,y,z,args);};
+G__11287.cljs$lang$maxFixedArity = 3;
+G__11287.cljs$lang$applyTo = (function (arglist__11289){
+var x = cljs.core.first(arglist__11289);
+arglist__11289 = cljs.core.next(arglist__11289);
+var y = cljs.core.first(arglist__11289);
+arglist__11289 = cljs.core.next(arglist__11289);
+var z = cljs.core.first(arglist__11289);
+var args = cljs.core.rest(arglist__11289);
+return G__11287__delegate(x,y,z,args);
+});
+G__11287.cljs$core$IFn$_invoke$arity$variadic = G__11287__delegate;
+return G__11287;
+})()
+;
+cljs$core$ep2 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$ep2__0.call(this);
+case 1:
+return cljs$core$ep2__1.call(this,x);
+case 2:
+return cljs$core$ep2__2.call(this,x,y);
+case 3:
+return cljs$core$ep2__3.call(this,x,y,z);
+default:
+var G__11290 = null;
+if (arguments.length > 3) {
+var G__11291__i = 0, G__11291__a = new Array(arguments.length - 3);
+while (G__11291__i < G__11291__a.length) {G__11291__a[G__11291__i] = arguments[G__11291__i + 3]; ++G__11291__i;}
+G__11290 = new cljs.core.IndexedSeq(G__11291__a,0,null);
+}
+return cljs$core$ep2__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11290);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$ep2.cljs$lang$maxFixedArity = 3;
+cljs$core$ep2.cljs$lang$applyTo = cljs$core$ep2__4.cljs$lang$applyTo;
+cljs$core$ep2.cljs$core$IFn$_invoke$arity$0 = cljs$core$ep2__0;
+cljs$core$ep2.cljs$core$IFn$_invoke$arity$1 = cljs$core$ep2__1;
+cljs$core$ep2.cljs$core$IFn$_invoke$arity$2 = cljs$core$ep2__2;
+cljs$core$ep2.cljs$core$IFn$_invoke$arity$3 = cljs$core$ep2__3;
+cljs$core$ep2.cljs$core$IFn$_invoke$arity$variadic = cljs$core$ep2__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$ep2;
+})()
+});
+
+cljs.core.every_pred.cljs$core$IFn$_invoke$arity$3 = (function (p1,p2,p3){
+return (function() {
+var cljs$core$ep3 = null;
+var cljs$core$ep3__0 = (function (){
+return true;
+});
+var cljs$core$ep3__1 = (function (x){
+return cljs.core.boolean$((function (){var and__7791__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__7791__auto__)){
+var and__7791__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(and__7791__auto____$1)){
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+})());
+});
+var cljs$core$ep3__2 = (function (x,y){
+return cljs.core.boolean$((function (){var and__7791__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__7791__auto__)){
+var and__7791__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(and__7791__auto____$1)){
+var and__7791__auto____$2 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+if(cljs.core.truth_(and__7791__auto____$2)){
+var and__7791__auto____$3 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(and__7791__auto____$3)){
+var and__7791__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(and__7791__auto____$4)){
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(y) : p3.call(null,y));
+} else {
+return and__7791__auto____$4;
+}
+} else {
+return and__7791__auto____$3;
+}
+} else {
+return and__7791__auto____$2;
+}
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+})());
+});
+var cljs$core$ep3__3 = (function (x,y,z){
+return cljs.core.boolean$((function (){var and__7791__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(and__7791__auto__)){
+var and__7791__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(and__7791__auto____$1)){
+var and__7791__auto____$2 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+if(cljs.core.truth_(and__7791__auto____$2)){
+var and__7791__auto____$3 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(and__7791__auto____$3)){
+var and__7791__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(and__7791__auto____$4)){
+var and__7791__auto____$5 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(y) : p3.call(null,y));
+if(cljs.core.truth_(and__7791__auto____$5)){
+var and__7791__auto____$6 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(z) : p1.call(null,z));
+if(cljs.core.truth_(and__7791__auto____$6)){
+var and__7791__auto____$7 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(z) : p2.call(null,z));
+if(cljs.core.truth_(and__7791__auto____$7)){
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(z) : p3.call(null,z));
+} else {
+return and__7791__auto____$7;
+}
+} else {
+return and__7791__auto____$6;
+}
+} else {
+return and__7791__auto____$5;
+}
+} else {
+return and__7791__auto____$4;
+}
+} else {
+return and__7791__auto____$3;
+}
+} else {
+return and__7791__auto____$2;
+}
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+})());
+});
+var cljs$core$ep3__4 = (function() {
+var G__11292__delegate = function (x,y,z,args){
+return cljs.core.boolean$((function (){var and__7791__auto__ = cljs$core$ep3.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(and__7791__auto__)){
+return cljs.core.every_QMARK_(((function (and__7791__auto__){
+return (function (p1__11267_SHARP_){
+var and__7791__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(p1__11267_SHARP_) : p1.call(null,p1__11267_SHARP_));
+if(cljs.core.truth_(and__7791__auto____$1)){
+var and__7791__auto____$2 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(p1__11267_SHARP_) : p2.call(null,p1__11267_SHARP_));
+if(cljs.core.truth_(and__7791__auto____$2)){
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(p1__11267_SHARP_) : p3.call(null,p1__11267_SHARP_));
+} else {
+return and__7791__auto____$2;
+}
+} else {
+return and__7791__auto____$1;
+}
+});})(and__7791__auto__))
+,args);
+} else {
+return and__7791__auto__;
+}
+})());
+};
+var G__11292 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11293__i = 0, G__11293__a = new Array(arguments.length - 3);
+while (G__11293__i < G__11293__a.length) {G__11293__a[G__11293__i] = arguments[G__11293__i + 3]; ++G__11293__i;}
+ args = new cljs.core.IndexedSeq(G__11293__a,0,null);
+}
+return G__11292__delegate.call(this,x,y,z,args);};
+G__11292.cljs$lang$maxFixedArity = 3;
+G__11292.cljs$lang$applyTo = (function (arglist__11294){
+var x = cljs.core.first(arglist__11294);
+arglist__11294 = cljs.core.next(arglist__11294);
+var y = cljs.core.first(arglist__11294);
+arglist__11294 = cljs.core.next(arglist__11294);
+var z = cljs.core.first(arglist__11294);
+var args = cljs.core.rest(arglist__11294);
+return G__11292__delegate(x,y,z,args);
+});
+G__11292.cljs$core$IFn$_invoke$arity$variadic = G__11292__delegate;
+return G__11292;
+})()
+;
+cljs$core$ep3 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$ep3__0.call(this);
+case 1:
+return cljs$core$ep3__1.call(this,x);
+case 2:
+return cljs$core$ep3__2.call(this,x,y);
+case 3:
+return cljs$core$ep3__3.call(this,x,y,z);
+default:
+var G__11295 = null;
+if (arguments.length > 3) {
+var G__11296__i = 0, G__11296__a = new Array(arguments.length - 3);
+while (G__11296__i < G__11296__a.length) {G__11296__a[G__11296__i] = arguments[G__11296__i + 3]; ++G__11296__i;}
+G__11295 = new cljs.core.IndexedSeq(G__11296__a,0,null);
+}
+return cljs$core$ep3__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11295);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$ep3.cljs$lang$maxFixedArity = 3;
+cljs$core$ep3.cljs$lang$applyTo = cljs$core$ep3__4.cljs$lang$applyTo;
+cljs$core$ep3.cljs$core$IFn$_invoke$arity$0 = cljs$core$ep3__0;
+cljs$core$ep3.cljs$core$IFn$_invoke$arity$1 = cljs$core$ep3__1;
+cljs$core$ep3.cljs$core$IFn$_invoke$arity$2 = cljs$core$ep3__2;
+cljs$core$ep3.cljs$core$IFn$_invoke$arity$3 = cljs$core$ep3__3;
+cljs$core$ep3.cljs$core$IFn$_invoke$arity$variadic = cljs$core$ep3__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$ep3;
+})()
+});
+
+cljs.core.every_pred.cljs$core$IFn$_invoke$arity$variadic = (function (p1,p2,p3,ps){
+var ps__$1 = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4(p1,p2,p3,ps);
+return ((function (ps__$1){
+return (function() {
+var cljs$core$epn = null;
+var cljs$core$epn__0 = (function (){
+return true;
+});
+var cljs$core$epn__1 = (function (x){
+return cljs.core.every_QMARK_(((function (ps__$1){
+return (function (p1__11268_SHARP_){
+return (p1__11268_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11268_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__11268_SHARP_.call(null,x));
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$epn__2 = (function (x,y){
+return cljs.core.every_QMARK_(((function (ps__$1){
+return (function (p1__11269_SHARP_){
+var and__7791__auto__ = (p1__11269_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11269_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__11269_SHARP_.call(null,x));
+if(cljs.core.truth_(and__7791__auto__)){
+return (p1__11269_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11269_SHARP_.cljs$core$IFn$_invoke$arity$1(y) : p1__11269_SHARP_.call(null,y));
+} else {
+return and__7791__auto__;
+}
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$epn__3 = (function (x,y,z){
+return cljs.core.every_QMARK_(((function (ps__$1){
+return (function (p1__11270_SHARP_){
+var and__7791__auto__ = (p1__11270_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11270_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__11270_SHARP_.call(null,x));
+if(cljs.core.truth_(and__7791__auto__)){
+var and__7791__auto____$1 = (p1__11270_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11270_SHARP_.cljs$core$IFn$_invoke$arity$1(y) : p1__11270_SHARP_.call(null,y));
+if(cljs.core.truth_(and__7791__auto____$1)){
+return (p1__11270_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11270_SHARP_.cljs$core$IFn$_invoke$arity$1(z) : p1__11270_SHARP_.call(null,z));
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$epn__4 = (function() {
+var G__11297__delegate = function (x,y,z,args){
+return cljs.core.boolean$((function (){var and__7791__auto__ = cljs$core$epn.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(and__7791__auto__)){
+return cljs.core.every_QMARK_(((function (and__7791__auto__,ps__$1){
+return (function (p1__11271_SHARP_){
+return cljs.core.every_QMARK_(p1__11271_SHARP_,args);
+});})(and__7791__auto__,ps__$1))
+,ps__$1);
+} else {
+return and__7791__auto__;
+}
+})());
+};
+var G__11297 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11298__i = 0, G__11298__a = new Array(arguments.length - 3);
+while (G__11298__i < G__11298__a.length) {G__11298__a[G__11298__i] = arguments[G__11298__i + 3]; ++G__11298__i;}
+ args = new cljs.core.IndexedSeq(G__11298__a,0,null);
+}
+return G__11297__delegate.call(this,x,y,z,args);};
+G__11297.cljs$lang$maxFixedArity = 3;
+G__11297.cljs$lang$applyTo = (function (arglist__11299){
+var x = cljs.core.first(arglist__11299);
+arglist__11299 = cljs.core.next(arglist__11299);
+var y = cljs.core.first(arglist__11299);
+arglist__11299 = cljs.core.next(arglist__11299);
+var z = cljs.core.first(arglist__11299);
+var args = cljs.core.rest(arglist__11299);
+return G__11297__delegate(x,y,z,args);
+});
+G__11297.cljs$core$IFn$_invoke$arity$variadic = G__11297__delegate;
+return G__11297;
+})()
+;
+cljs$core$epn = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$epn__0.call(this);
+case 1:
+return cljs$core$epn__1.call(this,x);
+case 2:
+return cljs$core$epn__2.call(this,x,y);
+case 3:
+return cljs$core$epn__3.call(this,x,y,z);
+default:
+var G__11300 = null;
+if (arguments.length > 3) {
+var G__11301__i = 0, G__11301__a = new Array(arguments.length - 3);
+while (G__11301__i < G__11301__a.length) {G__11301__a[G__11301__i] = arguments[G__11301__i + 3]; ++G__11301__i;}
+G__11300 = new cljs.core.IndexedSeq(G__11301__a,0,null);
+}
+return cljs$core$epn__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11300);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$epn.cljs$lang$maxFixedArity = 3;
+cljs$core$epn.cljs$lang$applyTo = cljs$core$epn__4.cljs$lang$applyTo;
+cljs$core$epn.cljs$core$IFn$_invoke$arity$0 = cljs$core$epn__0;
+cljs$core$epn.cljs$core$IFn$_invoke$arity$1 = cljs$core$epn__1;
+cljs$core$epn.cljs$core$IFn$_invoke$arity$2 = cljs$core$epn__2;
+cljs$core$epn.cljs$core$IFn$_invoke$arity$3 = cljs$core$epn__3;
+cljs$core$epn.cljs$core$IFn$_invoke$arity$variadic = cljs$core$epn__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$epn;
+})()
+;})(ps__$1))
+});
+
+/** @this {Function} */
+cljs.core.every_pred.cljs$lang$applyTo = (function (seq11273){
+var G__11274 = cljs.core.first(seq11273);
+var seq11273__$1 = cljs.core.next(seq11273);
+var G__11275 = cljs.core.first(seq11273__$1);
+var seq11273__$2 = cljs.core.next(seq11273__$1);
+var G__11276 = cljs.core.first(seq11273__$2);
+var seq11273__$3 = cljs.core.next(seq11273__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11274,G__11275,G__11276,seq11273__$3);
+});
+
+cljs.core.every_pred.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Takes a set of predicates and returns a function f that returns the first logical true value
+ * returned by one of its composing predicates against any of its arguments, else it returns
+ * logical false. Note that f is short-circuiting in that it will stop execution on the first
+ * argument that triggers a logical true result against the original predicates.
+ */
+cljs.core.some_fn = (function cljs$core$some_fn(var_args){
+var G__11313 = arguments.length;
+switch (G__11313) {
+case 1:
+return cljs.core.some_fn.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.some_fn.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.some_fn.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11315 = arguments.length;
+var i__9001__auto___11316 = (0);
+while(true){
+if((i__9001__auto___11316 < len__9000__auto___11315)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11316]));
+
+var G__11317 = (i__9001__auto___11316 + (1));
+i__9001__auto___11316 = G__11317;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.some_fn.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.some_fn.cljs$core$IFn$_invoke$arity$1 = (function (p){
+return (function() {
+var cljs$core$sp1 = null;
+var cljs$core$sp1__0 = (function (){
+return null;
+});
+var cljs$core$sp1__1 = (function (x){
+return (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x));
+});
+var cljs$core$sp1__2 = (function (x,y){
+var or__7806__auto__ = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(y) : p.call(null,y));
+}
+});
+var cljs$core$sp1__3 = (function (x,y,z){
+var or__7806__auto__ = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(x) : p.call(null,x));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(y) : p.call(null,y));
+if(cljs.core.truth_(or__7806__auto____$1)){
+return or__7806__auto____$1;
+} else {
+return (p.cljs$core$IFn$_invoke$arity$1 ? p.cljs$core$IFn$_invoke$arity$1(z) : p.call(null,z));
+}
+}
+});
+var cljs$core$sp1__4 = (function() {
+var G__11318__delegate = function (x,y,z,args){
+var or__7806__auto__ = cljs$core$sp1.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return cljs.core.some(p,args);
+}
+};
+var G__11318 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11319__i = 0, G__11319__a = new Array(arguments.length - 3);
+while (G__11319__i < G__11319__a.length) {G__11319__a[G__11319__i] = arguments[G__11319__i + 3]; ++G__11319__i;}
+ args = new cljs.core.IndexedSeq(G__11319__a,0,null);
+}
+return G__11318__delegate.call(this,x,y,z,args);};
+G__11318.cljs$lang$maxFixedArity = 3;
+G__11318.cljs$lang$applyTo = (function (arglist__11320){
+var x = cljs.core.first(arglist__11320);
+arglist__11320 = cljs.core.next(arglist__11320);
+var y = cljs.core.first(arglist__11320);
+arglist__11320 = cljs.core.next(arglist__11320);
+var z = cljs.core.first(arglist__11320);
+var args = cljs.core.rest(arglist__11320);
+return G__11318__delegate(x,y,z,args);
+});
+G__11318.cljs$core$IFn$_invoke$arity$variadic = G__11318__delegate;
+return G__11318;
+})()
+;
+cljs$core$sp1 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$sp1__0.call(this);
+case 1:
+return cljs$core$sp1__1.call(this,x);
+case 2:
+return cljs$core$sp1__2.call(this,x,y);
+case 3:
+return cljs$core$sp1__3.call(this,x,y,z);
+default:
+var G__11321 = null;
+if (arguments.length > 3) {
+var G__11322__i = 0, G__11322__a = new Array(arguments.length - 3);
+while (G__11322__i < G__11322__a.length) {G__11322__a[G__11322__i] = arguments[G__11322__i + 3]; ++G__11322__i;}
+G__11321 = new cljs.core.IndexedSeq(G__11322__a,0,null);
+}
+return cljs$core$sp1__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11321);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$sp1.cljs$lang$maxFixedArity = 3;
+cljs$core$sp1.cljs$lang$applyTo = cljs$core$sp1__4.cljs$lang$applyTo;
+cljs$core$sp1.cljs$core$IFn$_invoke$arity$0 = cljs$core$sp1__0;
+cljs$core$sp1.cljs$core$IFn$_invoke$arity$1 = cljs$core$sp1__1;
+cljs$core$sp1.cljs$core$IFn$_invoke$arity$2 = cljs$core$sp1__2;
+cljs$core$sp1.cljs$core$IFn$_invoke$arity$3 = cljs$core$sp1__3;
+cljs$core$sp1.cljs$core$IFn$_invoke$arity$variadic = cljs$core$sp1__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$sp1;
+})()
+});
+
+cljs.core.some_fn.cljs$core$IFn$_invoke$arity$2 = (function (p1,p2){
+return (function() {
+var cljs$core$sp2 = null;
+var cljs$core$sp2__0 = (function (){
+return null;
+});
+var cljs$core$sp2__1 = (function (x){
+var or__7806__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+}
+});
+var cljs$core$sp2__2 = (function (x,y){
+var or__7806__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(or__7806__auto____$1)){
+return or__7806__auto____$1;
+} else {
+var or__7806__auto____$2 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(or__7806__auto____$2)){
+return or__7806__auto____$2;
+} else {
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+}
+}
+}
+});
+var cljs$core$sp2__3 = (function (x,y,z){
+var or__7806__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(or__7806__auto____$1)){
+return or__7806__auto____$1;
+} else {
+var or__7806__auto____$2 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(z) : p1.call(null,z));
+if(cljs.core.truth_(or__7806__auto____$2)){
+return or__7806__auto____$2;
+} else {
+var or__7806__auto____$3 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(or__7806__auto____$3)){
+return or__7806__auto____$3;
+} else {
+var or__7806__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(or__7806__auto____$4)){
+return or__7806__auto____$4;
+} else {
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(z) : p2.call(null,z));
+}
+}
+}
+}
+}
+});
+var cljs$core$sp2__4 = (function() {
+var G__11323__delegate = function (x,y,z,args){
+var or__7806__auto__ = cljs$core$sp2.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return cljs.core.some(((function (or__7806__auto__){
+return (function (p1__11302_SHARP_){
+var or__7806__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(p1__11302_SHARP_) : p1.call(null,p1__11302_SHARP_));
+if(cljs.core.truth_(or__7806__auto____$1)){
+return or__7806__auto____$1;
+} else {
+return (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(p1__11302_SHARP_) : p2.call(null,p1__11302_SHARP_));
+}
+});})(or__7806__auto__))
+,args);
+}
+};
+var G__11323 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11324__i = 0, G__11324__a = new Array(arguments.length - 3);
+while (G__11324__i < G__11324__a.length) {G__11324__a[G__11324__i] = arguments[G__11324__i + 3]; ++G__11324__i;}
+ args = new cljs.core.IndexedSeq(G__11324__a,0,null);
+}
+return G__11323__delegate.call(this,x,y,z,args);};
+G__11323.cljs$lang$maxFixedArity = 3;
+G__11323.cljs$lang$applyTo = (function (arglist__11325){
+var x = cljs.core.first(arglist__11325);
+arglist__11325 = cljs.core.next(arglist__11325);
+var y = cljs.core.first(arglist__11325);
+arglist__11325 = cljs.core.next(arglist__11325);
+var z = cljs.core.first(arglist__11325);
+var args = cljs.core.rest(arglist__11325);
+return G__11323__delegate(x,y,z,args);
+});
+G__11323.cljs$core$IFn$_invoke$arity$variadic = G__11323__delegate;
+return G__11323;
+})()
+;
+cljs$core$sp2 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$sp2__0.call(this);
+case 1:
+return cljs$core$sp2__1.call(this,x);
+case 2:
+return cljs$core$sp2__2.call(this,x,y);
+case 3:
+return cljs$core$sp2__3.call(this,x,y,z);
+default:
+var G__11326 = null;
+if (arguments.length > 3) {
+var G__11327__i = 0, G__11327__a = new Array(arguments.length - 3);
+while (G__11327__i < G__11327__a.length) {G__11327__a[G__11327__i] = arguments[G__11327__i + 3]; ++G__11327__i;}
+G__11326 = new cljs.core.IndexedSeq(G__11327__a,0,null);
+}
+return cljs$core$sp2__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11326);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$sp2.cljs$lang$maxFixedArity = 3;
+cljs$core$sp2.cljs$lang$applyTo = cljs$core$sp2__4.cljs$lang$applyTo;
+cljs$core$sp2.cljs$core$IFn$_invoke$arity$0 = cljs$core$sp2__0;
+cljs$core$sp2.cljs$core$IFn$_invoke$arity$1 = cljs$core$sp2__1;
+cljs$core$sp2.cljs$core$IFn$_invoke$arity$2 = cljs$core$sp2__2;
+cljs$core$sp2.cljs$core$IFn$_invoke$arity$3 = cljs$core$sp2__3;
+cljs$core$sp2.cljs$core$IFn$_invoke$arity$variadic = cljs$core$sp2__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$sp2;
+})()
+});
+
+cljs.core.some_fn.cljs$core$IFn$_invoke$arity$3 = (function (p1,p2,p3){
+return (function() {
+var cljs$core$sp3 = null;
+var cljs$core$sp3__0 = (function (){
+return null;
+});
+var cljs$core$sp3__1 = (function (x){
+var or__7806__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(or__7806__auto____$1)){
+return or__7806__auto____$1;
+} else {
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+}
+}
+});
+var cljs$core$sp3__2 = (function (x,y){
+var or__7806__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(or__7806__auto____$1)){
+return or__7806__auto____$1;
+} else {
+var or__7806__auto____$2 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+if(cljs.core.truth_(or__7806__auto____$2)){
+return or__7806__auto____$2;
+} else {
+var or__7806__auto____$3 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(or__7806__auto____$3)){
+return or__7806__auto____$3;
+} else {
+var or__7806__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(or__7806__auto____$4)){
+return or__7806__auto____$4;
+} else {
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(y) : p3.call(null,y));
+}
+}
+}
+}
+}
+});
+var cljs$core$sp3__3 = (function (x,y,z){
+var or__7806__auto__ = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(x) : p1.call(null,x));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(x) : p2.call(null,x));
+if(cljs.core.truth_(or__7806__auto____$1)){
+return or__7806__auto____$1;
+} else {
+var or__7806__auto____$2 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(x) : p3.call(null,x));
+if(cljs.core.truth_(or__7806__auto____$2)){
+return or__7806__auto____$2;
+} else {
+var or__7806__auto____$3 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(y) : p1.call(null,y));
+if(cljs.core.truth_(or__7806__auto____$3)){
+return or__7806__auto____$3;
+} else {
+var or__7806__auto____$4 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(y) : p2.call(null,y));
+if(cljs.core.truth_(or__7806__auto____$4)){
+return or__7806__auto____$4;
+} else {
+var or__7806__auto____$5 = (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(y) : p3.call(null,y));
+if(cljs.core.truth_(or__7806__auto____$5)){
+return or__7806__auto____$5;
+} else {
+var or__7806__auto____$6 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(z) : p1.call(null,z));
+if(cljs.core.truth_(or__7806__auto____$6)){
+return or__7806__auto____$6;
+} else {
+var or__7806__auto____$7 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(z) : p2.call(null,z));
+if(cljs.core.truth_(or__7806__auto____$7)){
+return or__7806__auto____$7;
+} else {
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(z) : p3.call(null,z));
+}
+}
+}
+}
+}
+}
+}
+}
+});
+var cljs$core$sp3__4 = (function() {
+var G__11328__delegate = function (x,y,z,args){
+var or__7806__auto__ = cljs$core$sp3.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return cljs.core.some(((function (or__7806__auto__){
+return (function (p1__11303_SHARP_){
+var or__7806__auto____$1 = (p1.cljs$core$IFn$_invoke$arity$1 ? p1.cljs$core$IFn$_invoke$arity$1(p1__11303_SHARP_) : p1.call(null,p1__11303_SHARP_));
+if(cljs.core.truth_(or__7806__auto____$1)){
+return or__7806__auto____$1;
+} else {
+var or__7806__auto____$2 = (p2.cljs$core$IFn$_invoke$arity$1 ? p2.cljs$core$IFn$_invoke$arity$1(p1__11303_SHARP_) : p2.call(null,p1__11303_SHARP_));
+if(cljs.core.truth_(or__7806__auto____$2)){
+return or__7806__auto____$2;
+} else {
+return (p3.cljs$core$IFn$_invoke$arity$1 ? p3.cljs$core$IFn$_invoke$arity$1(p1__11303_SHARP_) : p3.call(null,p1__11303_SHARP_));
+}
+}
+});})(or__7806__auto__))
+,args);
+}
+};
+var G__11328 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11329__i = 0, G__11329__a = new Array(arguments.length - 3);
+while (G__11329__i < G__11329__a.length) {G__11329__a[G__11329__i] = arguments[G__11329__i + 3]; ++G__11329__i;}
+ args = new cljs.core.IndexedSeq(G__11329__a,0,null);
+}
+return G__11328__delegate.call(this,x,y,z,args);};
+G__11328.cljs$lang$maxFixedArity = 3;
+G__11328.cljs$lang$applyTo = (function (arglist__11330){
+var x = cljs.core.first(arglist__11330);
+arglist__11330 = cljs.core.next(arglist__11330);
+var y = cljs.core.first(arglist__11330);
+arglist__11330 = cljs.core.next(arglist__11330);
+var z = cljs.core.first(arglist__11330);
+var args = cljs.core.rest(arglist__11330);
+return G__11328__delegate(x,y,z,args);
+});
+G__11328.cljs$core$IFn$_invoke$arity$variadic = G__11328__delegate;
+return G__11328;
+})()
+;
+cljs$core$sp3 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$sp3__0.call(this);
+case 1:
+return cljs$core$sp3__1.call(this,x);
+case 2:
+return cljs$core$sp3__2.call(this,x,y);
+case 3:
+return cljs$core$sp3__3.call(this,x,y,z);
+default:
+var G__11331 = null;
+if (arguments.length > 3) {
+var G__11332__i = 0, G__11332__a = new Array(arguments.length - 3);
+while (G__11332__i < G__11332__a.length) {G__11332__a[G__11332__i] = arguments[G__11332__i + 3]; ++G__11332__i;}
+G__11331 = new cljs.core.IndexedSeq(G__11332__a,0,null);
+}
+return cljs$core$sp3__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11331);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$sp3.cljs$lang$maxFixedArity = 3;
+cljs$core$sp3.cljs$lang$applyTo = cljs$core$sp3__4.cljs$lang$applyTo;
+cljs$core$sp3.cljs$core$IFn$_invoke$arity$0 = cljs$core$sp3__0;
+cljs$core$sp3.cljs$core$IFn$_invoke$arity$1 = cljs$core$sp3__1;
+cljs$core$sp3.cljs$core$IFn$_invoke$arity$2 = cljs$core$sp3__2;
+cljs$core$sp3.cljs$core$IFn$_invoke$arity$3 = cljs$core$sp3__3;
+cljs$core$sp3.cljs$core$IFn$_invoke$arity$variadic = cljs$core$sp3__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$sp3;
+})()
+});
+
+cljs.core.some_fn.cljs$core$IFn$_invoke$arity$variadic = (function (p1,p2,p3,ps){
+var ps__$1 = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4(p1,p2,p3,ps);
+return ((function (ps__$1){
+return (function() {
+var cljs$core$spn = null;
+var cljs$core$spn__0 = (function (){
+return null;
+});
+var cljs$core$spn__1 = (function (x){
+return cljs.core.some(((function (ps__$1){
+return (function (p1__11304_SHARP_){
+return (p1__11304_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11304_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__11304_SHARP_.call(null,x));
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$spn__2 = (function (x,y){
+return cljs.core.some(((function (ps__$1){
+return (function (p1__11305_SHARP_){
+var or__7806__auto__ = (p1__11305_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11305_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__11305_SHARP_.call(null,x));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return (p1__11305_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11305_SHARP_.cljs$core$IFn$_invoke$arity$1(y) : p1__11305_SHARP_.call(null,y));
+}
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$spn__3 = (function (x,y,z){
+return cljs.core.some(((function (ps__$1){
+return (function (p1__11306_SHARP_){
+var or__7806__auto__ = (p1__11306_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11306_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p1__11306_SHARP_.call(null,x));
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = (p1__11306_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11306_SHARP_.cljs$core$IFn$_invoke$arity$1(y) : p1__11306_SHARP_.call(null,y));
+if(cljs.core.truth_(or__7806__auto____$1)){
+return or__7806__auto____$1;
+} else {
+return (p1__11306_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p1__11306_SHARP_.cljs$core$IFn$_invoke$arity$1(z) : p1__11306_SHARP_.call(null,z));
+}
+}
+});})(ps__$1))
+,ps__$1);
+});
+var cljs$core$spn__4 = (function() {
+var G__11333__delegate = function (x,y,z,args){
+var or__7806__auto__ = cljs$core$spn.cljs$core$IFn$_invoke$arity$3(x,y,z);
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return cljs.core.some(((function (or__7806__auto__,ps__$1){
+return (function (p1__11307_SHARP_){
+return cljs.core.some(p1__11307_SHARP_,args);
+});})(or__7806__auto__,ps__$1))
+,ps__$1);
+}
+};
+var G__11333 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__11334__i = 0, G__11334__a = new Array(arguments.length - 3);
+while (G__11334__i < G__11334__a.length) {G__11334__a[G__11334__i] = arguments[G__11334__i + 3]; ++G__11334__i;}
+ args = new cljs.core.IndexedSeq(G__11334__a,0,null);
+}
+return G__11333__delegate.call(this,x,y,z,args);};
+G__11333.cljs$lang$maxFixedArity = 3;
+G__11333.cljs$lang$applyTo = (function (arglist__11335){
+var x = cljs.core.first(arglist__11335);
+arglist__11335 = cljs.core.next(arglist__11335);
+var y = cljs.core.first(arglist__11335);
+arglist__11335 = cljs.core.next(arglist__11335);
+var z = cljs.core.first(arglist__11335);
+var args = cljs.core.rest(arglist__11335);
+return G__11333__delegate(x,y,z,args);
+});
+G__11333.cljs$core$IFn$_invoke$arity$variadic = G__11333__delegate;
+return G__11333;
+})()
+;
+cljs$core$spn = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return cljs$core$spn__0.call(this);
+case 1:
+return cljs$core$spn__1.call(this,x);
+case 2:
+return cljs$core$spn__2.call(this,x,y);
+case 3:
+return cljs$core$spn__3.call(this,x,y,z);
+default:
+var G__11336 = null;
+if (arguments.length > 3) {
+var G__11337__i = 0, G__11337__a = new Array(arguments.length - 3);
+while (G__11337__i < G__11337__a.length) {G__11337__a[G__11337__i] = arguments[G__11337__i + 3]; ++G__11337__i;}
+G__11336 = new cljs.core.IndexedSeq(G__11337__a,0,null);
+}
+return cljs$core$spn__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__11336);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+cljs$core$spn.cljs$lang$maxFixedArity = 3;
+cljs$core$spn.cljs$lang$applyTo = cljs$core$spn__4.cljs$lang$applyTo;
+cljs$core$spn.cljs$core$IFn$_invoke$arity$0 = cljs$core$spn__0;
+cljs$core$spn.cljs$core$IFn$_invoke$arity$1 = cljs$core$spn__1;
+cljs$core$spn.cljs$core$IFn$_invoke$arity$2 = cljs$core$spn__2;
+cljs$core$spn.cljs$core$IFn$_invoke$arity$3 = cljs$core$spn__3;
+cljs$core$spn.cljs$core$IFn$_invoke$arity$variadic = cljs$core$spn__4.cljs$core$IFn$_invoke$arity$variadic;
+return cljs$core$spn;
+})()
+;})(ps__$1))
+});
+
+/** @this {Function} */
+cljs.core.some_fn.cljs$lang$applyTo = (function (seq11309){
+var G__11310 = cljs.core.first(seq11309);
+var seq11309__$1 = cljs.core.next(seq11309);
+var G__11311 = cljs.core.first(seq11309__$1);
+var seq11309__$2 = cljs.core.next(seq11309__$1);
+var G__11312 = cljs.core.first(seq11309__$2);
+var seq11309__$3 = cljs.core.next(seq11309__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11310,G__11311,G__11312,seq11309__$3);
+});
+
+cljs.core.some_fn.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Returns a lazy sequence consisting of the result of applying f to
+ * the set of first items of each coll, followed by applying f to the
+ * set of second items in each coll, until any one of the colls is
+ * exhausted. Any remaining items in other colls are ignored. Function
+ * f should accept number-of-colls arguments. Returns a transducer when
+ * no collection is provided.
+ */
+cljs.core.map = (function cljs$core$map(var_args){
+var G__11345 = arguments.length;
+switch (G__11345) {
+case 1:
+return cljs.core.map.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.map.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.map.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11358 = arguments.length;
+var i__9001__auto___11359 = (0);
+while(true){
+if((i__9001__auto___11359 < len__9000__auto___11358)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11359]));
+
+var G__11360 = (i__9001__auto___11359 + (1));
+i__9001__auto___11359 = G__11360;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((4)),(0),null));
+return cljs.core.map.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.map.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function (rf){
+return (function() {
+var G__11361 = null;
+var G__11361__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11361__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11361__2 = (function (result,input){
+var G__11346 = result;
+var G__11347 = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(input) : f.call(null,input));
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(G__11346,G__11347) : rf.call(null,G__11346,G__11347));
+});
+var G__11361__3 = (function() {
+var G__11362__delegate = function (result,input,inputs){
+var G__11348 = result;
+var G__11349 = cljs.core.apply.cljs$core$IFn$_invoke$arity$3(f,input,inputs);
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(G__11348,G__11349) : rf.call(null,G__11348,G__11349));
+};
+var G__11362 = function (result,input,var_args){
+var inputs = null;
+if (arguments.length > 2) {
+var G__11363__i = 0, G__11363__a = new Array(arguments.length - 2);
+while (G__11363__i < G__11363__a.length) {G__11363__a[G__11363__i] = arguments[G__11363__i + 2]; ++G__11363__i;}
+ inputs = new cljs.core.IndexedSeq(G__11363__a,0,null);
+}
+return G__11362__delegate.call(this,result,input,inputs);};
+G__11362.cljs$lang$maxFixedArity = 2;
+G__11362.cljs$lang$applyTo = (function (arglist__11364){
+var result = cljs.core.first(arglist__11364);
+arglist__11364 = cljs.core.next(arglist__11364);
+var input = cljs.core.first(arglist__11364);
+var inputs = cljs.core.rest(arglist__11364);
+return G__11362__delegate(result,input,inputs);
+});
+G__11362.cljs$core$IFn$_invoke$arity$variadic = G__11362__delegate;
+return G__11362;
+})()
+;
+G__11361 = function(result,input,var_args){
+var inputs = var_args;
+switch(arguments.length){
+case 0:
+return G__11361__0.call(this);
+case 1:
+return G__11361__1.call(this,result);
+case 2:
+return G__11361__2.call(this,result,input);
+default:
+var G__11365 = null;
+if (arguments.length > 2) {
+var G__11366__i = 0, G__11366__a = new Array(arguments.length - 2);
+while (G__11366__i < G__11366__a.length) {G__11366__a[G__11366__i] = arguments[G__11366__i + 2]; ++G__11366__i;}
+G__11365 = new cljs.core.IndexedSeq(G__11366__a,0,null);
+}
+return G__11361__3.cljs$core$IFn$_invoke$arity$variadic(result,input, G__11365);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11361.cljs$lang$maxFixedArity = 2;
+G__11361.cljs$lang$applyTo = G__11361__3.cljs$lang$applyTo;
+G__11361.cljs$core$IFn$_invoke$arity$0 = G__11361__0;
+G__11361.cljs$core$IFn$_invoke$arity$1 = G__11361__1;
+G__11361.cljs$core$IFn$_invoke$arity$2 = G__11361__2;
+G__11361.cljs$core$IFn$_invoke$arity$variadic = G__11361__3.cljs$core$IFn$_invoke$arity$variadic;
+return G__11361;
+})()
+});
+});
+
+cljs.core.map.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s)){
+var c = cljs.core.chunk_first(s);
+var size = cljs.core.count(c);
+var b = cljs.core.chunk_buffer(size);
+var n__8769__auto___11367 = size;
+var i_11368 = (0);
+while(true){
+if((i_11368 < n__8769__auto___11367)){
+cljs.core.chunk_append(b,(function (){var G__11350 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_11368);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11350) : f.call(null,G__11350));
+})());
+
+var G__11369 = (i_11368 + (1));
+i_11368 = G__11369;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.chunk_cons(cljs.core.chunk(b),cljs.core.map.cljs$core$IFn$_invoke$arity$2(f,cljs.core.chunk_rest(s)));
+} else {
+return cljs.core.cons((function (){var G__11351 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11351) : f.call(null,G__11351));
+})(),cljs.core.map.cljs$core$IFn$_invoke$arity$2(f,cljs.core.rest(s)));
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.map.cljs$core$IFn$_invoke$arity$3 = (function (f,c1,c2){
+return (new cljs.core.LazySeq(null,(function (){
+var s1 = cljs.core.seq(c1);
+var s2 = cljs.core.seq(c2);
+if(((s1) && (s2))){
+return cljs.core.cons((function (){var G__11352 = cljs.core.first(s1);
+var G__11353 = cljs.core.first(s2);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11352,G__11353) : f.call(null,G__11352,G__11353));
+})(),cljs.core.map.cljs$core$IFn$_invoke$arity$3(f,cljs.core.rest(s1),cljs.core.rest(s2)));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.map.cljs$core$IFn$_invoke$arity$4 = (function (f,c1,c2,c3){
+return (new cljs.core.LazySeq(null,(function (){
+var s1 = cljs.core.seq(c1);
+var s2 = cljs.core.seq(c2);
+var s3 = cljs.core.seq(c3);
+if(((s1) && (s2) && (s3))){
+return cljs.core.cons((function (){var G__11354 = cljs.core.first(s1);
+var G__11355 = cljs.core.first(s2);
+var G__11356 = cljs.core.first(s3);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11354,G__11355,G__11356) : f.call(null,G__11354,G__11355,G__11356));
+})(),cljs.core.map.cljs$core$IFn$_invoke$arity$4(f,cljs.core.rest(s1),cljs.core.rest(s2),cljs.core.rest(s3)));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.map.cljs$core$IFn$_invoke$arity$variadic = (function (f,c1,c2,c3,colls){
+var step = (function cljs$core$step(cs){
+return (new cljs.core.LazySeq(null,(function (){
+var ss = cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.seq,cs);
+if(cljs.core.every_QMARK_(cljs.core.identity,ss)){
+return cljs.core.cons(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.first,ss),cljs$core$step(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.rest,ss)));
+} else {
+return null;
+}
+}),null,null));
+});
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2(((function (step){
+return (function (p1__11338_SHARP_){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$2(f,p1__11338_SHARP_);
+});})(step))
+,step(cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic(colls,c3,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([c2,c1], 0))));
+});
+
+/** @this {Function} */
+cljs.core.map.cljs$lang$applyTo = (function (seq11340){
+var G__11341 = cljs.core.first(seq11340);
+var seq11340__$1 = cljs.core.next(seq11340);
+var G__11342 = cljs.core.first(seq11340__$1);
+var seq11340__$2 = cljs.core.next(seq11340__$1);
+var G__11343 = cljs.core.first(seq11340__$2);
+var seq11340__$3 = cljs.core.next(seq11340__$2);
+var G__11344 = cljs.core.first(seq11340__$3);
+var seq11340__$4 = cljs.core.next(seq11340__$3);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11341,G__11342,G__11343,G__11344,seq11340__$4);
+});
+
+cljs.core.map.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Returns a lazy sequence of the first n items in coll, or all items if
+ * there are fewer than n. Returns a stateful transducer when
+ * no collection is provided.
+ */
+cljs.core.take = (function cljs$core$take(var_args){
+var G__11371 = arguments.length;
+switch (G__11371) {
+case 1:
+return cljs.core.take.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.take.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.take.cljs$core$IFn$_invoke$arity$1 = (function (n){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+return (function (rf){
+var na = cljs.core.volatile_BANG_(n);
+return ((function (na){
+return (function() {
+var G__11373 = null;
+var G__11373__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11373__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11373__2 = (function (result,input){
+var n__$1 = cljs.core.deref(na);
+var nn = na.cljs$core$IVolatile$_vreset_BANG_$arity$2(null,(na.cljs$core$IDeref$_deref$arity$1(null) - (1)));
+var result__$1 = (((n__$1 > (0)))?(rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input)):result);
+if((!((nn > (0))))){
+return cljs.core.ensure_reduced(result__$1);
+} else {
+return result__$1;
+}
+});
+G__11373 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11373__0.call(this);
+case 1:
+return G__11373__1.call(this,result);
+case 2:
+return G__11373__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11373.cljs$core$IFn$_invoke$arity$0 = G__11373__0;
+G__11373.cljs$core$IFn$_invoke$arity$1 = G__11373__1;
+G__11373.cljs$core$IFn$_invoke$arity$2 = G__11373__2;
+return G__11373;
+})()
+;})(na))
+});
+});
+
+cljs.core.take.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+return (new cljs.core.LazySeq(null,(function (){
+if((n > (0))){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+return cljs.core.cons(cljs.core.first(s),cljs.core.take.cljs$core$IFn$_invoke$arity$2((n - (1)),cljs.core.rest(s)));
+} else {
+return null;
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.take.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of all but the first n items in coll.
+ * Returns a stateful transducer when no collection is provided.
+ */
+cljs.core.drop = (function cljs$core$drop(var_args){
+var G__11375 = arguments.length;
+switch (G__11375) {
+case 1:
+return cljs.core.drop.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.drop.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.drop.cljs$core$IFn$_invoke$arity$1 = (function (n){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+return (function (rf){
+var na = cljs.core.volatile_BANG_(n);
+return ((function (na){
+return (function() {
+var G__11377 = null;
+var G__11377__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11377__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11377__2 = (function (result,input){
+var n__$1 = cljs.core.deref(na);
+na.cljs$core$IVolatile$_vreset_BANG_$arity$2(null,(na.cljs$core$IDeref$_deref$arity$1(null) - (1)));
+
+if((n__$1 > (0))){
+return result;
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__11377 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11377__0.call(this);
+case 1:
+return G__11377__1.call(this,result);
+case 2:
+return G__11377__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11377.cljs$core$IFn$_invoke$arity$0 = G__11377__0;
+G__11377.cljs$core$IFn$_invoke$arity$1 = G__11377__1;
+G__11377.cljs$core$IFn$_invoke$arity$2 = G__11377__2;
+return G__11377;
+})()
+;})(na))
+});
+});
+
+cljs.core.drop.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+var step = (function (n__$1,coll__$1){
+while(true){
+var s = cljs.core.seq(coll__$1);
+if((((n__$1 > (0))) && (s))){
+var G__11378 = (n__$1 - (1));
+var G__11379 = cljs.core.rest(s);
+n__$1 = G__11378;
+coll__$1 = G__11379;
+continue;
+} else {
+return s;
+}
+break;
+}
+});
+return (new cljs.core.LazySeq(null,((function (step){
+return (function (){
+return step(n,coll);
+});})(step))
+,null,null));
+});
+
+cljs.core.drop.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Return a lazy sequence of all but the last n (default 1) items in coll
+ */
+cljs.core.drop_last = (function cljs$core$drop_last(var_args){
+var G__11381 = arguments.length;
+switch (G__11381) {
+case 1:
+return cljs.core.drop_last.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.drop_last.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.drop_last.cljs$core$IFn$_invoke$arity$1 = (function (s){
+return cljs.core.drop_last.cljs$core$IFn$_invoke$arity$2((1),s);
+});
+
+cljs.core.drop_last.cljs$core$IFn$_invoke$arity$2 = (function (n,s){
+return cljs.core.map.cljs$core$IFn$_invoke$arity$3((function (x,_){
+return x;
+}),s,cljs.core.drop.cljs$core$IFn$_invoke$arity$2(n,s));
+});
+
+cljs.core.drop_last.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a seq of the last n items in coll. Depending on the type
+ * of coll may be no better than linear time. For vectors, see also subvec.
+ */
+cljs.core.take_last = (function cljs$core$take_last(n,coll){
+var s = cljs.core.seq(coll);
+var lead = cljs.core.seq(cljs.core.drop.cljs$core$IFn$_invoke$arity$2(n,coll));
+while(true){
+if(lead){
+var G__11383 = cljs.core.next(s);
+var G__11384 = cljs.core.next(lead);
+s = G__11383;
+lead = G__11384;
+continue;
+} else {
+return s;
+}
+break;
+}
+});
+/**
+ * Returns a lazy sequence of the items in coll starting from the
+ * first item for which (pred item) returns logical false. Returns a
+ * stateful transducer when no collection is provided.
+ */
+cljs.core.drop_while = (function cljs$core$drop_while(var_args){
+var G__11386 = arguments.length;
+switch (G__11386) {
+case 1:
+return cljs.core.drop_while.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.drop_while.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.drop_while.cljs$core$IFn$_invoke$arity$1 = (function (pred){
+return (function (rf){
+var da = cljs.core.volatile_BANG_(true);
+return ((function (da){
+return (function() {
+var G__11390 = null;
+var G__11390__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11390__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11390__2 = (function (result,input){
+var drop_QMARK_ = cljs.core.deref(da);
+if(cljs.core.truth_((function (){var and__7791__auto__ = drop_QMARK_;
+if(cljs.core.truth_(and__7791__auto__)){
+return (pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(input) : pred.call(null,input));
+} else {
+return and__7791__auto__;
+}
+})())){
+return result;
+} else {
+cljs.core.vreset_BANG_(da,null);
+
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__11390 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11390__0.call(this);
+case 1:
+return G__11390__1.call(this,result);
+case 2:
+return G__11390__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11390.cljs$core$IFn$_invoke$arity$0 = G__11390__0;
+G__11390.cljs$core$IFn$_invoke$arity$1 = G__11390__1;
+G__11390.cljs$core$IFn$_invoke$arity$2 = G__11390__2;
+return G__11390;
+})()
+;})(da))
+});
+});
+
+cljs.core.drop_while.cljs$core$IFn$_invoke$arity$2 = (function (pred,coll){
+var step = (function (pred__$1,coll__$1){
+while(true){
+var s = cljs.core.seq(coll__$1);
+if(cljs.core.truth_((function (){var and__7791__auto__ = s;
+if(and__7791__auto__){
+var G__11388 = cljs.core.first(s);
+return (pred__$1.cljs$core$IFn$_invoke$arity$1 ? pred__$1.cljs$core$IFn$_invoke$arity$1(G__11388) : pred__$1.call(null,G__11388));
+} else {
+return and__7791__auto__;
+}
+})())){
+var G__11391 = pred__$1;
+var G__11392 = cljs.core.rest(s);
+pred__$1 = G__11391;
+coll__$1 = G__11392;
+continue;
+} else {
+return s;
+}
+break;
+}
+});
+return (new cljs.core.LazySeq(null,((function (step){
+return (function (){
+return step(pred,coll);
+});})(step))
+,null,null));
+});
+
+cljs.core.drop_while.cljs$lang$maxFixedArity = 2;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IPending}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Cycle = (function (meta,all,prev,current,_next){
+this.meta = meta;
+this.all = all;
+this.prev = prev;
+this.current = current;
+this._next = _next;
+this.cljs$lang$protocol_mask$partition0$ = 26083532;
+this.cljs$lang$protocol_mask$partition1$ = 1;
+});
+cljs.core.Cycle.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.Cycle.prototype.currentval = (function (){
+var self__ = this;
+var coll = this;
+if(self__.current){
+} else {
+var temp__4655__auto___11397 = cljs.core.next(self__.prev);
+if(temp__4655__auto___11397){
+var c_11398 = temp__4655__auto___11397;
+self__.current = c_11398;
+} else {
+self__.current = self__.all;
+}
+}
+
+return self__.current;
+});
+
+cljs.core.Cycle.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.Cycle.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ISeq$_rest$arity$1(null);
+});
+
+cljs.core.Cycle.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.Cycle.prototype.cljs$core$IPending$_realized_QMARK_$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (!((self__.current == null)));
+});
+
+cljs.core.Cycle.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+var s = coll__$1.currentval();
+var ret = cljs.core.first(s);
+while(true){
+var s__$1 = (function (){var or__7806__auto__ = cljs.core.next(s);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return self__.all;
+}
+})();
+var ret__$1 = (function (){var G__11393 = ret;
+var G__11394 = cljs.core.first(s__$1);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11393,G__11394) : f.call(null,G__11393,G__11394));
+})();
+if(cljs.core.reduced_QMARK_(ret__$1)){
+return cljs.core.deref(ret__$1);
+} else {
+var G__11399 = s__$1;
+var G__11400 = ret__$1;
+s = G__11399;
+ret = G__11400;
+continue;
+}
+break;
+}
+});
+
+cljs.core.Cycle.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+var s = coll__$1.currentval();
+var ret = start;
+while(true){
+var ret__$1 = (function (){var G__11395 = ret;
+var G__11396 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11395,G__11396) : f.call(null,G__11395,G__11396));
+})();
+if(cljs.core.reduced_QMARK_(ret__$1)){
+return cljs.core.deref(ret__$1);
+} else {
+var G__11401 = (function (){var or__7806__auto__ = cljs.core.next(s);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return self__.all;
+}
+})();
+var G__11402 = ret__$1;
+s = G__11401;
+ret = G__11402;
+continue;
+}
+break;
+}
+});
+
+cljs.core.Cycle.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.first(coll__$1.currentval());
+});
+
+cljs.core.Cycle.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__._next == null)){
+self__._next = (new cljs.core.Cycle(null,self__.all,coll__$1.currentval(),null,null));
+} else {
+}
+
+return self__._next;
+});
+
+cljs.core.Cycle.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.Cycle.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.Cycle(meta__$1,self__.all,self__.prev,self__.current,self__._next));
+});
+
+cljs.core.Cycle.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.Cycle.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"all","all",-1762306027,null),new cljs.core.Symbol(null,"prev","prev",43462301,null),cljs.core.with_meta(new cljs.core.Symbol(null,"current","current",552492924,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"_next","_next",101877036,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Cycle.cljs$lang$type = true;
+
+cljs.core.Cycle.cljs$lang$ctorStr = "cljs.core/Cycle";
+
+cljs.core.Cycle.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Cycle");
+});
+
+/**
+ * Positional factory function for cljs.core/Cycle.
+ */
+cljs.core.__GT_Cycle = (function cljs$core$__GT_Cycle(meta,all,prev,current,_next){
+return (new cljs.core.Cycle(meta,all,prev,current,_next));
+});
+
+/**
+ * Returns a lazy (infinite!) sequence of repetitions of the items in coll.
+ */
+cljs.core.cycle = (function cljs$core$cycle(coll){
+var temp__4655__auto__ = cljs.core.seq(coll);
+if(temp__4655__auto__){
+var vals = temp__4655__auto__;
+return (new cljs.core.Cycle(null,vals,null,vals,null));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+/**
+ * Returns a vector of [(take n coll) (drop n coll)]
+ */
+cljs.core.split_at = (function cljs$core$split_at(n,coll){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,coll),cljs.core.drop.cljs$core$IFn$_invoke$arity$2(n,coll)], null);
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IPending}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Repeat = (function (meta,count,val,next,__hash){
+this.meta = meta;
+this.count = count;
+this.val = val;
+this.next = next;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32374988;
+this.cljs$lang$protocol_mask$partition1$ = 1;
+});
+cljs.core.Repeat.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.Repeat.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Repeat.prototype.indexOf = (function() {
+var G__11403 = null;
+var G__11403__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11403__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11403 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11403__1.call(this,x);
+case 2:
+return G__11403__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11403.cljs$core$IFn$_invoke$arity$1 = G__11403__1;
+G__11403.cljs$core$IFn$_invoke$arity$2 = G__11403__2;
+return G__11403;
+})()
+;
+
+cljs.core.Repeat.prototype.lastIndexOf = (function() {
+var G__11404 = null;
+var G__11404__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,self__.count);
+});
+var G__11404__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11404 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11404__1.call(this,x);
+case 2:
+return G__11404__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11404.cljs$core$IFn$_invoke$arity$1 = G__11404__1;
+G__11404.cljs$core$IFn$_invoke$arity$2 = G__11404__2;
+return G__11404;
+})()
+;
+
+cljs.core.Repeat.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.Repeat.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.next == null)){
+if((self__.count > (1))){
+self__.next = (new cljs.core.Repeat(null,(self__.count - (1)),self__.val,null,null));
+
+return self__.next;
+} else {
+if(((-1) === self__.count)){
+return coll__$1;
+} else {
+return null;
+}
+}
+} else {
+return self__.next;
+}
+});
+
+cljs.core.Repeat.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.Repeat.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.Repeat.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.Repeat.prototype.cljs$core$IPending$_realized_QMARK_$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return false;
+});
+
+cljs.core.Repeat.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+if((self__.count === (-1))){
+var ret = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(self__.val,self__.val) : f.call(null,self__.val,self__.val));
+while(true){
+if(cljs.core.reduced_QMARK_(ret)){
+return cljs.core.deref(ret);
+} else {
+var G__11405 = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(ret,self__.val) : f.call(null,ret,self__.val));
+ret = G__11405;
+continue;
+}
+break;
+}
+} else {
+var i = (1);
+var ret = self__.val;
+while(true){
+if((i < self__.count)){
+var ret__$1 = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(ret,self__.val) : f.call(null,ret,self__.val));
+if(cljs.core.reduced_QMARK_(ret__$1)){
+return cljs.core.deref(ret__$1);
+} else {
+var G__11406 = (i + (1));
+var G__11407 = ret__$1;
+i = G__11406;
+ret = G__11407;
+continue;
+}
+} else {
+return ret;
+}
+break;
+}
+}
+});
+
+cljs.core.Repeat.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+if((self__.count === (-1))){
+var ret = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(start,self__.val) : f.call(null,start,self__.val));
+while(true){
+if(cljs.core.reduced_QMARK_(ret)){
+return cljs.core.deref(ret);
+} else {
+var G__11408 = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(ret,self__.val) : f.call(null,ret,self__.val));
+ret = G__11408;
+continue;
+}
+break;
+}
+} else {
+var i = (0);
+var ret = start;
+while(true){
+if((i < self__.count)){
+var ret__$1 = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(ret,self__.val) : f.call(null,ret,self__.val));
+if(cljs.core.reduced_QMARK_(ret__$1)){
+return cljs.core.deref(ret__$1);
+} else {
+var G__11409 = (i + (1));
+var G__11410 = ret__$1;
+i = G__11409;
+ret = G__11410;
+continue;
+}
+} else {
+return ret;
+}
+break;
+}
+}
+});
+
+cljs.core.Repeat.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.val;
+});
+
+cljs.core.Repeat.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.next == null)){
+if((self__.count > (1))){
+self__.next = (new cljs.core.Repeat(null,(self__.count - (1)),self__.val,null,null));
+
+return self__.next;
+} else {
+if(((-1) === self__.count)){
+return coll__$1;
+} else {
+return cljs.core.List.EMPTY;
+}
+}
+} else {
+return self__.next;
+}
+});
+
+cljs.core.Repeat.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.Repeat.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.Repeat(meta__$1,self__.count,self__.val,self__.next,null));
+});
+
+cljs.core.Repeat.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.Repeat.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"count","count",-514511684,null),new cljs.core.Symbol(null,"val","val",1769233139,null),cljs.core.with_meta(new cljs.core.Symbol(null,"next","next",1522830042,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Repeat.cljs$lang$type = true;
+
+cljs.core.Repeat.cljs$lang$ctorStr = "cljs.core/Repeat";
+
+cljs.core.Repeat.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Repeat");
+});
+
+/**
+ * Positional factory function for cljs.core/Repeat.
+ */
+cljs.core.__GT_Repeat = (function cljs$core$__GT_Repeat(meta,count,val,next,__hash){
+return (new cljs.core.Repeat(meta,count,val,next,__hash));
+});
+
+/**
+ * Returns a lazy (infinite!, or length n if supplied) sequence of xs.
+ */
+cljs.core.repeat = (function cljs$core$repeat(var_args){
+var G__11412 = arguments.length;
+switch (G__11412) {
+case 1:
+return cljs.core.repeat.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.repeat.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.repeat.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return (new cljs.core.Repeat(null,(-1),x,null,null));
+});
+
+cljs.core.repeat.cljs$core$IFn$_invoke$arity$2 = (function (n,x){
+if((n > (0))){
+return (new cljs.core.Repeat(null,n,x,null,null));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.repeat.cljs$lang$maxFixedArity = 2;
+
+/**
+ * DEPRECATED: Use 'repeat' instead.
+ * Returns a lazy seq of n xs.
+ */
+cljs.core.replicate = (function cljs$core$replicate(n,x){
+return cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,cljs.core.repeat.cljs$core$IFn$_invoke$arity$1(x));
+});
+/**
+ * Takes a function of no args, presumably with side effects, and
+ * returns an infinite (or length n if supplied) lazy sequence of calls
+ * to it
+ */
+cljs.core.repeatedly = (function cljs$core$repeatedly(var_args){
+var G__11415 = arguments.length;
+switch (G__11415) {
+case 1:
+return cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (new cljs.core.LazySeq(null,(function (){
+return cljs.core.cons((f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)),cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$1(f));
+}),null,null));
+});
+
+cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$2 = (function (n,f){
+return cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$1(f));
+});
+
+cljs.core.repeatedly.cljs$lang$maxFixedArity = 2;
+
+cljs.core.UNREALIZED_SEED = ({});
+
+/**
+* @constructor
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IPending}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Iterate = (function (meta,f,prev_seed,seed,next){
+this.meta = meta;
+this.f = f;
+this.prev_seed = prev_seed;
+this.seed = seed;
+this.next = next;
+this.cljs$lang$protocol_mask$partition0$ = 26083532;
+this.cljs$lang$protocol_mask$partition1$ = 1;
+});
+cljs.core.Iterate.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.Iterate.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.Iterate.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ISeq$_rest$arity$1(null);
+});
+
+cljs.core.Iterate.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.Iterate.prototype.cljs$core$IPending$_realized_QMARK_$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (!((self__.seed === cljs.core.UNREALIZED_SEED)));
+});
+
+cljs.core.Iterate.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,rf){
+var self__ = this;
+var coll__$1 = this;
+var first = coll__$1.cljs$core$ISeq$_first$arity$1(null);
+var v = (self__.f.cljs$core$IFn$_invoke$arity$1 ? self__.f.cljs$core$IFn$_invoke$arity$1(first) : self__.f.call(null,first));
+var ret = (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(first,v) : rf.call(null,first,v));
+var v__$1 = v;
+while(true){
+if(cljs.core.reduced_QMARK_(ret)){
+return cljs.core.deref(ret);
+} else {
+var v__$2 = (self__.f.cljs$core$IFn$_invoke$arity$1 ? self__.f.cljs$core$IFn$_invoke$arity$1(v__$1) : self__.f.call(null,v__$1));
+var G__11417 = (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(ret,v__$2) : rf.call(null,ret,v__$2));
+var G__11418 = v__$2;
+ret = G__11417;
+v__$1 = G__11418;
+continue;
+}
+break;
+}
+});
+
+cljs.core.Iterate.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,rf,start){
+var self__ = this;
+var coll__$1 = this;
+var v = coll__$1.cljs$core$ISeq$_first$arity$1(null);
+var ret = (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(start,v) : rf.call(null,start,v));
+var v__$1 = v;
+while(true){
+if(cljs.core.reduced_QMARK_(ret)){
+return cljs.core.deref(ret);
+} else {
+var v__$2 = (self__.f.cljs$core$IFn$_invoke$arity$1 ? self__.f.cljs$core$IFn$_invoke$arity$1(v__$1) : self__.f.call(null,v__$1));
+var G__11419 = (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(ret,v__$2) : rf.call(null,ret,v__$2));
+var G__11420 = v__$2;
+ret = G__11419;
+v__$1 = G__11420;
+continue;
+}
+break;
+}
+});
+
+cljs.core.Iterate.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((cljs.core.UNREALIZED_SEED === self__.seed)){
+self__.seed = (self__.f.cljs$core$IFn$_invoke$arity$1 ? self__.f.cljs$core$IFn$_invoke$arity$1(self__.prev_seed) : self__.f.call(null,self__.prev_seed));
+} else {
+}
+
+return self__.seed;
+});
+
+cljs.core.Iterate.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.next == null)){
+self__.next = (new cljs.core.Iterate(null,self__.f,coll__$1.cljs$core$ISeq$_first$arity$1(null),cljs.core.UNREALIZED_SEED,null));
+} else {
+}
+
+return self__.next;
+});
+
+cljs.core.Iterate.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.Iterate.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.Iterate(meta__$1,self__.f,self__.prev_seed,self__.seed,self__.next));
+});
+
+cljs.core.Iterate.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.Iterate.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"f","f",43394975,null),new cljs.core.Symbol(null,"prev-seed","prev-seed",2126381367,null),cljs.core.with_meta(new cljs.core.Symbol(null,"seed","seed",1709144854,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"next","next",1522830042,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Iterate.cljs$lang$type = true;
+
+cljs.core.Iterate.cljs$lang$ctorStr = "cljs.core/Iterate";
+
+cljs.core.Iterate.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Iterate");
+});
+
+/**
+ * Positional factory function for cljs.core/Iterate.
+ */
+cljs.core.__GT_Iterate = (function cljs$core$__GT_Iterate(meta,f,prev_seed,seed,next){
+return (new cljs.core.Iterate(meta,f,prev_seed,seed,next));
+});
+
+/**
+ * Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects
+ */
+cljs.core.iterate = (function cljs$core$iterate(f,x){
+return (new cljs.core.Iterate(null,f,null,x,null));
+});
+/**
+ * Returns a lazy seq of the first item in each coll, then the second etc.
+ */
+cljs.core.interleave = (function cljs$core$interleave(var_args){
+var G__11425 = arguments.length;
+switch (G__11425) {
+case 0:
+return cljs.core.interleave.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.interleave.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.interleave.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11427 = arguments.length;
+var i__9001__auto___11428 = (0);
+while(true){
+if((i__9001__auto___11428 < len__9000__auto___11427)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11428]));
+
+var G__11429 = (i__9001__auto___11428 + (1));
+i__9001__auto___11428 = G__11429;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((2)),(0),null));
+return cljs.core.interleave.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.interleave.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.List.EMPTY;
+});
+
+cljs.core.interleave.cljs$core$IFn$_invoke$arity$1 = (function (c1){
+return (new cljs.core.LazySeq(null,(function (){
+return c1;
+}),null,null));
+});
+
+cljs.core.interleave.cljs$core$IFn$_invoke$arity$2 = (function (c1,c2){
+return (new cljs.core.LazySeq(null,(function (){
+var s1 = cljs.core.seq(c1);
+var s2 = cljs.core.seq(c2);
+if(((s1) && (s2))){
+return cljs.core.cons(cljs.core.first(s1),cljs.core.cons(cljs.core.first(s2),cljs.core.interleave.cljs$core$IFn$_invoke$arity$2(cljs.core.rest(s1),cljs.core.rest(s2))));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.interleave.cljs$core$IFn$_invoke$arity$variadic = (function (c1,c2,colls){
+return (new cljs.core.LazySeq(null,(function (){
+var ss = cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.seq,cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic(colls,c2,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([c1], 0)));
+if(cljs.core.every_QMARK_(cljs.core.identity,ss)){
+return cljs.core.concat.cljs$core$IFn$_invoke$arity$2(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.first,ss),cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.interleave,cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.rest,ss)));
+} else {
+return null;
+}
+}),null,null));
+});
+
+/** @this {Function} */
+cljs.core.interleave.cljs$lang$applyTo = (function (seq11422){
+var G__11423 = cljs.core.first(seq11422);
+var seq11422__$1 = cljs.core.next(seq11422);
+var G__11424 = cljs.core.first(seq11422__$1);
+var seq11422__$2 = cljs.core.next(seq11422__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11423,G__11424,seq11422__$2);
+});
+
+cljs.core.interleave.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns a lazy seq of the elements of coll separated by sep.
+ * Returns a stateful transducer when no collection is provided.
+ */
+cljs.core.interpose = (function cljs$core$interpose(var_args){
+var G__11431 = arguments.length;
+switch (G__11431) {
+case 1:
+return cljs.core.interpose.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.interpose.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.interpose.cljs$core$IFn$_invoke$arity$1 = (function (sep){
+return (function (rf){
+var started = cljs.core.volatile_BANG_(false);
+return ((function (started){
+return (function() {
+var G__11433 = null;
+var G__11433__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11433__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11433__2 = (function (result,input){
+if(cljs.core.truth_(cljs.core.deref(started))){
+var sepr = (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,sep) : rf.call(null,result,sep));
+if(cljs.core.reduced_QMARK_(sepr)){
+return sepr;
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(sepr,input) : rf.call(null,sepr,input));
+}
+} else {
+cljs.core.vreset_BANG_(started,true);
+
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__11433 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11433__0.call(this);
+case 1:
+return G__11433__1.call(this,result);
+case 2:
+return G__11433__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11433.cljs$core$IFn$_invoke$arity$0 = G__11433__0;
+G__11433.cljs$core$IFn$_invoke$arity$1 = G__11433__1;
+G__11433.cljs$core$IFn$_invoke$arity$2 = G__11433__2;
+return G__11433;
+})()
+;})(started))
+});
+});
+
+cljs.core.interpose.cljs$core$IFn$_invoke$arity$2 = (function (sep,coll){
+return cljs.core.drop.cljs$core$IFn$_invoke$arity$2((1),cljs.core.interleave.cljs$core$IFn$_invoke$arity$2(cljs.core.repeat.cljs$core$IFn$_invoke$arity$1(sep),coll));
+});
+
+cljs.core.interpose.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Take a collection of collections, and return a lazy seq
+ * of items from the inner collection
+ */
+cljs.core.flatten1 = (function cljs$core$flatten1(colls){
+var cat = (function cljs$core$flatten1_$_cat(coll,colls__$1){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4655__auto__ = cljs.core.seq(coll);
+if(temp__4655__auto__){
+var coll__$1 = temp__4655__auto__;
+return cljs.core.cons(cljs.core.first(coll__$1),cljs$core$flatten1_$_cat(cljs.core.rest(coll__$1),colls__$1));
+} else {
+if(cljs.core.seq(colls__$1)){
+return cljs$core$flatten1_$_cat(cljs.core.first(colls__$1),cljs.core.rest(colls__$1));
+} else {
+return null;
+}
+}
+}),null,null));
+});
+return cat(null,colls);
+});
+/**
+ * Returns the result of applying concat to the result of applying map
+ * to f and colls. Thus function f should return a collection. Returns
+ * a transducer when no collections are provided
+ */
+cljs.core.mapcat = (function cljs$core$mapcat(var_args){
+var G__11437 = arguments.length;
+switch (G__11437) {
+case 1:
+return cljs.core.mapcat.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11439 = arguments.length;
+var i__9001__auto___11440 = (0);
+while(true){
+if((i__9001__auto___11440 < len__9000__auto___11439)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11440]));
+
+var G__11441 = (i__9001__auto___11440 + (1));
+i__9001__auto___11440 = G__11441;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((1)),(0),null));
+return cljs.core.mapcat.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.mapcat.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return cljs.core.comp.cljs$core$IFn$_invoke$arity$2(cljs.core.map.cljs$core$IFn$_invoke$arity$1(f),cljs.core.cat);
+});
+
+cljs.core.mapcat.cljs$core$IFn$_invoke$arity$variadic = (function (f,colls){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.concat,cljs.core.apply.cljs$core$IFn$_invoke$arity$3(cljs.core.map,f,colls));
+});
+
+/** @this {Function} */
+cljs.core.mapcat.cljs$lang$applyTo = (function (seq11435){
+var G__11436 = cljs.core.first(seq11435);
+var seq11435__$1 = cljs.core.next(seq11435);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11436,seq11435__$1);
+});
+
+cljs.core.mapcat.cljs$lang$maxFixedArity = (1);
+
+/**
+ * Returns a lazy sequence of the items in coll for which
+ * (pred item) returns logical true. pred must be free of side-effects.
+ * Returns a transducer when no collection is provided.
+ */
+cljs.core.filter = (function cljs$core$filter(var_args){
+var G__11443 = arguments.length;
+switch (G__11443) {
+case 1:
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.filter.cljs$core$IFn$_invoke$arity$1 = (function (pred){
+return (function (rf){
+return (function() {
+var G__11446 = null;
+var G__11446__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__11446__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__11446__2 = (function (result,input){
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(input) : pred.call(null,input)))){
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+} else {
+return result;
+}
+});
+G__11446 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__11446__0.call(this);
+case 1:
+return G__11446__1.call(this,result);
+case 2:
+return G__11446__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11446.cljs$core$IFn$_invoke$arity$0 = G__11446__0;
+G__11446.cljs$core$IFn$_invoke$arity$1 = G__11446__1;
+G__11446.cljs$core$IFn$_invoke$arity$2 = G__11446__2;
+return G__11446;
+})()
+});
+});
+
+cljs.core.filter.cljs$core$IFn$_invoke$arity$2 = (function (pred,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(s)){
+var c = cljs.core.chunk_first(s);
+var size = cljs.core.count(c);
+var b = cljs.core.chunk_buffer(size);
+var n__8769__auto___11447 = size;
+var i_11448 = (0);
+while(true){
+if((i_11448 < n__8769__auto___11447)){
+if(cljs.core.truth_((function (){var G__11444 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_11448);
+return (pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(G__11444) : pred.call(null,G__11444));
+})())){
+cljs.core.chunk_append(b,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(c,i_11448));
+} else {
+}
+
+var G__11449 = (i_11448 + (1));
+i_11448 = G__11449;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core.chunk_cons(cljs.core.chunk(b),cljs.core.filter.cljs$core$IFn$_invoke$arity$2(pred,cljs.core.chunk_rest(s)));
+} else {
+var f = cljs.core.first(s);
+var r = cljs.core.rest(s);
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(f) : pred.call(null,f)))){
+return cljs.core.cons(f,cljs.core.filter.cljs$core$IFn$_invoke$arity$2(pred,r));
+} else {
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$2(pred,r);
+}
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.filter.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of the items in coll for which
+ * (pred item) returns logical false. pred must be free of side-effects.
+ * Returns a transducer when no collection is provided.
+ */
+cljs.core.remove = (function cljs$core$remove(var_args){
+var G__11451 = arguments.length;
+switch (G__11451) {
+case 1:
+return cljs.core.remove.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.remove.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.remove.cljs$core$IFn$_invoke$arity$1 = (function (pred){
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$1(cljs.core.complement(pred));
+});
+
+cljs.core.remove.cljs$core$IFn$_invoke$arity$2 = (function (pred,coll){
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$2(cljs.core.complement(pred),coll);
+});
+
+cljs.core.remove.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of the nodes in a tree, via a depth-first walk.
+ * branch? must be a fn of one arg that returns true if passed a node
+ * that can have children (but may not). children must be a fn of one
+ * arg that returns a sequence of the children. Will only be called on
+ * nodes for which branch? returns true. Root is the root node of the
+ * tree.
+ */
+cljs.core.tree_seq = (function cljs$core$tree_seq(branch_QMARK_,children,root){
+var walk = (function cljs$core$tree_seq_$_walk(node){
+return (new cljs.core.LazySeq(null,(function (){
+return cljs.core.cons(node,(cljs.core.truth_((branch_QMARK_.cljs$core$IFn$_invoke$arity$1 ? branch_QMARK_.cljs$core$IFn$_invoke$arity$1(node) : branch_QMARK_.call(null,node)))?cljs.core.mapcat.cljs$core$IFn$_invoke$arity$variadic(cljs$core$tree_seq_$_walk,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([(children.cljs$core$IFn$_invoke$arity$1 ? children.cljs$core$IFn$_invoke$arity$1(node) : children.call(null,node))], 0)):null));
+}),null,null));
+});
+return walk(root);
+});
+/**
+ * Takes any nested combination of sequential things (lists, vectors,
+ * etc.) and returns their contents as a single, flat sequence.
+ * (flatten nil) returns nil.
+ */
+cljs.core.flatten = (function cljs$core$flatten(x){
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$2((function (p1__11453_SHARP_){
+return (!(cljs.core.sequential_QMARK_(p1__11453_SHARP_)));
+}),cljs.core.rest(cljs.core.tree_seq(cljs.core.sequential_QMARK_,cljs.core.seq,x)));
+});
+/**
+ * Returns a new coll consisting of to-coll with all of the items of
+ * from-coll conjoined. A transducer may be supplied.
+ */
+cljs.core.into = (function cljs$core$into(var_args){
+var G__11455 = arguments.length;
+switch (G__11455) {
+case 0:
+return cljs.core.into.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.into.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.into.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.into.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.into.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.PersistentVector.EMPTY;
+});
+
+cljs.core.into.cljs$core$IFn$_invoke$arity$1 = (function (to){
+return to;
+});
+
+cljs.core.into.cljs$core$IFn$_invoke$arity$2 = (function (to,from){
+if((!((to == null)))){
+if((((!((to == null))))?(((((to.cljs$lang$protocol_mask$partition1$ & (4))) || ((cljs.core.PROTOCOL_SENTINEL === to.cljs$core$IEditableCollection$))))?true:false):false)){
+return cljs.core._with_meta(cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj_BANG_,cljs.core.transient$(to),from)),cljs.core.meta(to));
+} else {
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj,to,from);
+}
+} else {
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.conj,cljs.core.List.EMPTY,from);
+}
+});
+
+cljs.core.into.cljs$core$IFn$_invoke$arity$3 = (function (to,xform,from){
+if((((!((to == null))))?(((((to.cljs$lang$protocol_mask$partition1$ & (4))) || ((cljs.core.PROTOCOL_SENTINEL === to.cljs$core$IEditableCollection$))))?true:false):false)){
+return cljs.core._with_meta(cljs.core.persistent_BANG_(cljs.core.transduce.cljs$core$IFn$_invoke$arity$4(xform,cljs.core.conj_BANG_,cljs.core.transient$(to),from)),cljs.core.meta(to));
+} else {
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$4(xform,cljs.core.conj,to,from);
+}
+});
+
+cljs.core.into.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns a vector consisting of the result of applying f to the
+ * set of first items of each coll, followed by applying f to the set
+ * of second items in each coll, until any one of the colls is
+ * exhausted. Any remaining items in other colls are ignored. Function
+ * f should accept number-of-colls arguments.
+ */
+cljs.core.mapv = (function cljs$core$mapv(var_args){
+var G__11465 = arguments.length;
+switch (G__11465) {
+case 2:
+return cljs.core.mapv.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.mapv.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.mapv.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11467 = arguments.length;
+var i__9001__auto___11468 = (0);
+while(true){
+if((i__9001__auto___11468 < len__9000__auto___11467)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11468]));
+
+var G__11469 = (i__9001__auto___11468 + (1));
+i__9001__auto___11468 = G__11469;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((4)),(0),null));
+return cljs.core.mapv.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.mapv.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+return cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (v,o){
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2(v,(f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(o) : f.call(null,o)));
+}),cljs.core.transient$(cljs.core.PersistentVector.EMPTY),coll));
+});
+
+cljs.core.mapv.cljs$core$IFn$_invoke$arity$3 = (function (f,c1,c2){
+return cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentVector.EMPTY,cljs.core.map.cljs$core$IFn$_invoke$arity$3(f,c1,c2));
+});
+
+cljs.core.mapv.cljs$core$IFn$_invoke$arity$4 = (function (f,c1,c2,c3){
+return cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentVector.EMPTY,cljs.core.map.cljs$core$IFn$_invoke$arity$4(f,c1,c2,c3));
+});
+
+cljs.core.mapv.cljs$core$IFn$_invoke$arity$variadic = (function (f,c1,c2,c3,colls){
+return cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentVector.EMPTY,cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(cljs.core.map,f,c1,c2,c3,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([colls], 0)));
+});
+
+/** @this {Function} */
+cljs.core.mapv.cljs$lang$applyTo = (function (seq11460){
+var G__11461 = cljs.core.first(seq11460);
+var seq11460__$1 = cljs.core.next(seq11460);
+var G__11462 = cljs.core.first(seq11460__$1);
+var seq11460__$2 = cljs.core.next(seq11460__$1);
+var G__11463 = cljs.core.first(seq11460__$2);
+var seq11460__$3 = cljs.core.next(seq11460__$2);
+var G__11464 = cljs.core.first(seq11460__$3);
+var seq11460__$4 = cljs.core.next(seq11460__$3);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11461,G__11462,G__11463,G__11464,seq11460__$4);
+});
+
+cljs.core.mapv.cljs$lang$maxFixedArity = (4);
+
+/**
+ * Returns a vector of the items in coll for which
+ * (pred item) returns logical true. pred must be free of side-effects.
+ */
+cljs.core.filterv = (function cljs$core$filterv(pred,coll){
+return cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (v,o){
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(o) : pred.call(null,o)))){
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2(v,o);
+} else {
+return v;
+}
+}),cljs.core.transient$(cljs.core.PersistentVector.EMPTY),coll));
+});
+/**
+ * Returns a lazy sequence of lists of n items each, at offsets step
+ * apart. If step is not supplied, defaults to n, i.e. the partitions
+ * do not overlap. If a pad collection is supplied, use its elements as
+ * necessary to complete last partition up to n items. In case there are
+ * not enough padding elements, return a partition with less than n items.
+ */
+cljs.core.partition = (function cljs$core$partition(var_args){
+var G__11471 = arguments.length;
+switch (G__11471) {
+case 2:
+return cljs.core.partition.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.partition.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.partition.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.partition.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+return cljs.core.partition.cljs$core$IFn$_invoke$arity$3(n,n,coll);
+});
+
+cljs.core.partition.cljs$core$IFn$_invoke$arity$3 = (function (n,step,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+var p = cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,s);
+if((n === cljs.core.count(p))){
+return cljs.core.cons(p,cljs.core.partition.cljs$core$IFn$_invoke$arity$3(n,step,cljs.core.drop.cljs$core$IFn$_invoke$arity$2(step,s)));
+} else {
+return null;
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.partition.cljs$core$IFn$_invoke$arity$4 = (function (n,step,pad,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+var p = cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,s);
+if((n === cljs.core.count(p))){
+return cljs.core.cons(p,cljs.core.partition.cljs$core$IFn$_invoke$arity$4(n,step,pad,cljs.core.drop.cljs$core$IFn$_invoke$arity$2(step,s)));
+} else {
+return (new cljs.core.List(null,cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,cljs.core.concat.cljs$core$IFn$_invoke$arity$2(p,pad)),null,(1),null));
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.partition.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Returns the value in a nested associative structure,
+ * where ks is a sequence of keys. Returns nil if the key is not present,
+ * or the not-found value if supplied.
+ */
+cljs.core.get_in = (function cljs$core$get_in(var_args){
+var G__11474 = arguments.length;
+switch (G__11474) {
+case 2:
+return cljs.core.get_in.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.get_in.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.get_in.cljs$core$IFn$_invoke$arity$2 = (function (m,ks){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.get,m,ks);
+});
+
+cljs.core.get_in.cljs$core$IFn$_invoke$arity$3 = (function (m,ks,not_found){
+var sentinel = cljs.core.lookup_sentinel;
+var m__$1 = m;
+var ks__$1 = cljs.core.seq(ks);
+while(true){
+if((!((ks__$1 == null)))){
+var m__$2 = cljs.core.get.cljs$core$IFn$_invoke$arity$3(m__$1,cljs.core.first(ks__$1),sentinel);
+if((sentinel === m__$2)){
+return not_found;
+} else {
+var G__11476 = sentinel;
+var G__11477 = m__$2;
+var G__11478 = cljs.core.next(ks__$1);
+sentinel = G__11476;
+m__$1 = G__11477;
+ks__$1 = G__11478;
+continue;
+}
+} else {
+return m__$1;
+}
+break;
+}
+});
+
+cljs.core.get_in.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Associates a value in a nested associative structure, where ks is a
+ * sequence of keys and v is the new value and returns a new nested structure.
+ * If any levels do not exist, hash-maps will be created.
+ */
+cljs.core.assoc_in = (function cljs$core$assoc_in(m,p__11479,v){
+var vec__11480 = p__11479;
+var seq__11481 = cljs.core.seq(vec__11480);
+var first__11482 = cljs.core.first(seq__11481);
+var seq__11481__$1 = cljs.core.next(seq__11481);
+var k = first__11482;
+var ks = seq__11481__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__11483 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__11484 = ks;
+var G__11485 = v;
+return (cljs.core.assoc_in.cljs$core$IFn$_invoke$arity$3 ? cljs.core.assoc_in.cljs$core$IFn$_invoke$arity$3(G__11483,G__11484,G__11485) : cljs.core.assoc_in.call(null,G__11483,G__11484,G__11485));
+})());
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,v);
+}
+});
+/**
+ * 'Updates' a value in a nested associative structure, where ks is a
+ * sequence of keys and f is a function that will take the old value
+ * and any supplied args and return the new value, and returns a new
+ * nested structure. If any levels do not exist, hash-maps will be
+ * created.
+ */
+cljs.core.update_in = (function cljs$core$update_in(var_args){
+var G__11494 = arguments.length;
+switch (G__11494) {
+case 3:
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 6:
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11526 = arguments.length;
+var i__9001__auto___11527 = (0);
+while(true){
+if((i__9001__auto___11527 < len__9000__auto___11526)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11527]));
+
+var G__11528 = (i__9001__auto___11527 + (1));
+i__9001__auto___11527 = G__11528;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((6)),(0),null));
+return cljs.core.update_in.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.update_in.cljs$core$IFn$_invoke$arity$3 = (function (m,p__11495,f){
+var vec__11496 = p__11495;
+var seq__11497 = cljs.core.seq(vec__11496);
+var first__11498 = cljs.core.first(seq__11497);
+var seq__11497__$1 = cljs.core.next(seq__11497);
+var k = first__11498;
+var ks = seq__11497__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.update_in.cljs$core$IFn$_invoke$arity$3(cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),ks,f));
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__11499 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11499) : f.call(null,G__11499));
+})());
+}
+});
+
+cljs.core.update_in.cljs$core$IFn$_invoke$arity$4 = (function (m,p__11500,f,a){
+var vec__11501 = p__11500;
+var seq__11502 = cljs.core.seq(vec__11501);
+var first__11503 = cljs.core.first(seq__11502);
+var seq__11502__$1 = cljs.core.next(seq__11502);
+var k = first__11503;
+var ks = seq__11502__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.update_in.cljs$core$IFn$_invoke$arity$4(cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),ks,f,a));
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__11504 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__11505 = a;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11504,G__11505) : f.call(null,G__11504,G__11505));
+})());
+}
+});
+
+cljs.core.update_in.cljs$core$IFn$_invoke$arity$5 = (function (m,p__11506,f,a,b){
+var vec__11507 = p__11506;
+var seq__11508 = cljs.core.seq(vec__11507);
+var first__11509 = cljs.core.first(seq__11508);
+var seq__11508__$1 = cljs.core.next(seq__11508);
+var k = first__11509;
+var ks = seq__11508__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.update_in.cljs$core$IFn$_invoke$arity$5(cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),ks,f,a,b));
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__11510 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__11511 = a;
+var G__11512 = b;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11510,G__11511,G__11512) : f.call(null,G__11510,G__11511,G__11512));
+})());
+}
+});
+
+cljs.core.update_in.cljs$core$IFn$_invoke$arity$6 = (function (m,p__11513,f,a,b,c){
+var vec__11514 = p__11513;
+var seq__11515 = cljs.core.seq(vec__11514);
+var first__11516 = cljs.core.first(seq__11515);
+var seq__11515__$1 = cljs.core.next(seq__11515);
+var k = first__11516;
+var ks = seq__11515__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.update_in.cljs$core$IFn$_invoke$arity$6(cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),ks,f,a,b,c));
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__11517 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__11518 = a;
+var G__11519 = b;
+var G__11520 = c;
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(G__11517,G__11518,G__11519,G__11520) : f.call(null,G__11517,G__11518,G__11519,G__11520));
+})());
+}
+});
+
+cljs.core.update_in.cljs$core$IFn$_invoke$arity$variadic = (function (m,p__11521,f,a,b,c,args){
+var vec__11522 = p__11521;
+var seq__11523 = cljs.core.seq(vec__11522);
+var first__11524 = cljs.core.first(seq__11523);
+var seq__11523__$1 = cljs.core.next(seq__11523);
+var k = first__11524;
+var ks = seq__11523__$1;
+if(ks){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(cljs.core.update_in,cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),ks,f,a,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([b,c,args], 0)));
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),a,b,c,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([args], 0)));
+}
+});
+
+/** @this {Function} */
+cljs.core.update_in.cljs$lang$applyTo = (function (seq11487){
+var G__11488 = cljs.core.first(seq11487);
+var seq11487__$1 = cljs.core.next(seq11487);
+var G__11489 = cljs.core.first(seq11487__$1);
+var seq11487__$2 = cljs.core.next(seq11487__$1);
+var G__11490 = cljs.core.first(seq11487__$2);
+var seq11487__$3 = cljs.core.next(seq11487__$2);
+var G__11491 = cljs.core.first(seq11487__$3);
+var seq11487__$4 = cljs.core.next(seq11487__$3);
+var G__11492 = cljs.core.first(seq11487__$4);
+var seq11487__$5 = cljs.core.next(seq11487__$4);
+var G__11493 = cljs.core.first(seq11487__$5);
+var seq11487__$6 = cljs.core.next(seq11487__$5);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11488,G__11489,G__11490,G__11491,G__11492,G__11493,seq11487__$6);
+});
+
+cljs.core.update_in.cljs$lang$maxFixedArity = (6);
+
+/**
+ * 'Updates' a value in an associative structure, where k is a
+ * key and f is a function that will take the old value
+ * and any supplied args and return the new value, and returns a new
+ * structure. If the key does not exist, nil is passed as the old value.
+ */
+cljs.core.update = (function cljs$core$update(var_args){
+var G__11537 = arguments.length;
+switch (G__11537) {
+case 3:
+return cljs.core.update.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.update.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.update.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 6:
+return cljs.core.update.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___11549 = arguments.length;
+var i__9001__auto___11550 = (0);
+while(true){
+if((i__9001__auto___11550 < len__9000__auto___11549)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___11550]));
+
+var G__11551 = (i__9001__auto___11550 + (1));
+i__9001__auto___11550 = G__11551;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((6)),(0),null));
+return cljs.core.update.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.update.cljs$core$IFn$_invoke$arity$3 = (function (m,k,f){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__11538 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+return (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(G__11538) : f.call(null,G__11538));
+})());
+});
+
+cljs.core.update.cljs$core$IFn$_invoke$arity$4 = (function (m,k,f,x){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__11539 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__11540 = x;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11539,G__11540) : f.call(null,G__11539,G__11540));
+})());
+});
+
+cljs.core.update.cljs$core$IFn$_invoke$arity$5 = (function (m,k,f,x,y){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__11541 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__11542 = x;
+var G__11543 = y;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11541,G__11542,G__11543) : f.call(null,G__11541,G__11542,G__11543));
+})());
+});
+
+cljs.core.update.cljs$core$IFn$_invoke$arity$6 = (function (m,k,f,x,y,z){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__11544 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__11545 = x;
+var G__11546 = y;
+var G__11547 = z;
+return (f.cljs$core$IFn$_invoke$arity$4 ? f.cljs$core$IFn$_invoke$arity$4(G__11544,G__11545,G__11546,G__11547) : f.call(null,G__11544,G__11545,G__11546,G__11547));
+})());
+});
+
+cljs.core.update.cljs$core$IFn$_invoke$arity$variadic = (function (m,k,f,x,y,z,more){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(f,cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k),x,y,z,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([more], 0)));
+});
+
+/** @this {Function} */
+cljs.core.update.cljs$lang$applyTo = (function (seq11530){
+var G__11531 = cljs.core.first(seq11530);
+var seq11530__$1 = cljs.core.next(seq11530);
+var G__11532 = cljs.core.first(seq11530__$1);
+var seq11530__$2 = cljs.core.next(seq11530__$1);
+var G__11533 = cljs.core.first(seq11530__$2);
+var seq11530__$3 = cljs.core.next(seq11530__$2);
+var G__11534 = cljs.core.first(seq11530__$3);
+var seq11530__$4 = cljs.core.next(seq11530__$3);
+var G__11535 = cljs.core.first(seq11530__$4);
+var seq11530__$5 = cljs.core.next(seq11530__$4);
+var G__11536 = cljs.core.first(seq11530__$5);
+var seq11530__$6 = cljs.core.next(seq11530__$5);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__11531,G__11532,G__11533,G__11534,G__11535,G__11536,seq11530__$6);
+});
+
+cljs.core.update.cljs$lang$maxFixedArity = (6);
+
+
+/**
+* @constructor
+*/
+cljs.core.VectorNode = (function (edit,arr){
+this.edit = edit;
+this.arr = arr;
+});
+
+cljs.core.VectorNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"edit","edit",-1302639,null),new cljs.core.Symbol(null,"arr","arr",2115492975,null)], null);
+});
+
+cljs.core.VectorNode.cljs$lang$type = true;
+
+cljs.core.VectorNode.cljs$lang$ctorStr = "cljs.core/VectorNode";
+
+cljs.core.VectorNode.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/VectorNode");
+});
+
+/**
+ * Positional factory function for cljs.core/VectorNode.
+ */
+cljs.core.__GT_VectorNode = (function cljs$core$__GT_VectorNode(edit,arr){
+return (new cljs.core.VectorNode(edit,arr));
+});
+
+cljs.core.pv_fresh_node = (function cljs$core$pv_fresh_node(edit){
+return (new cljs.core.VectorNode(edit,[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]));
+});
+cljs.core.pv_aget = (function cljs$core$pv_aget(node,idx){
+return (node.arr[idx]);
+});
+cljs.core.pv_aset = (function cljs$core$pv_aset(node,idx,val){
+return (node.arr[idx] = val);
+});
+cljs.core.pv_clone_node = (function cljs$core$pv_clone_node(node){
+return (new cljs.core.VectorNode(node.edit,cljs.core.aclone(node.arr)));
+});
+cljs.core.tail_off = (function cljs$core$tail_off(pv){
+var cnt = pv.cnt;
+if((cnt < (32))){
+return (0);
+} else {
+return (((cnt - (1)) >>> (5)) << (5));
+}
+});
+cljs.core.new_path = (function cljs$core$new_path(edit,level,node){
+var ll = level;
+var ret = node;
+while(true){
+if((ll === (0))){
+return ret;
+} else {
+var embed = ret;
+var r = cljs.core.pv_fresh_node(edit);
+var _ = cljs.core.pv_aset(r,(0),embed);
+var G__11552 = (ll - (5));
+var G__11553 = r;
+ll = G__11552;
+ret = G__11553;
+continue;
+}
+break;
+}
+});
+cljs.core.push_tail = (function cljs$core$push_tail(pv,level,parent,tailnode){
+var ret = cljs.core.pv_clone_node(parent);
+var subidx = (((pv.cnt - (1)) >>> level) & (31));
+if(((5) === level)){
+cljs.core.pv_aset(ret,subidx,tailnode);
+
+return ret;
+} else {
+var child = cljs.core.pv_aget(parent,subidx);
+if((!((child == null)))){
+var node_to_insert = (function (){var G__11554 = pv;
+var G__11555 = (level - (5));
+var G__11556 = child;
+var G__11557 = tailnode;
+return (cljs.core.push_tail.cljs$core$IFn$_invoke$arity$4 ? cljs.core.push_tail.cljs$core$IFn$_invoke$arity$4(G__11554,G__11555,G__11556,G__11557) : cljs.core.push_tail.call(null,G__11554,G__11555,G__11556,G__11557));
+})();
+cljs.core.pv_aset(ret,subidx,node_to_insert);
+
+return ret;
+} else {
+var node_to_insert = cljs.core.new_path(null,(level - (5)),tailnode);
+cljs.core.pv_aset(ret,subidx,node_to_insert);
+
+return ret;
+}
+}
+});
+cljs.core.vector_index_out_of_bounds = (function cljs$core$vector_index_out_of_bounds(i,cnt){
+throw (new Error(["No item ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(i)," in vector of length ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(cnt)].join('')));
+});
+cljs.core.first_array_for_longvec = (function cljs$core$first_array_for_longvec(pv){
+var node = pv.root;
+var level = pv.shift;
+while(true){
+if((level > (0))){
+var G__11558 = cljs.core.pv_aget(node,(0));
+var G__11559 = (level - (5));
+node = G__11558;
+level = G__11559;
+continue;
+} else {
+return node.arr;
+}
+break;
+}
+});
+cljs.core.unchecked_array_for = (function cljs$core$unchecked_array_for(pv,i){
+if((i >= cljs.core.tail_off(pv))){
+return pv.tail;
+} else {
+var node = pv.root;
+var level = pv.shift;
+while(true){
+if((level > (0))){
+var G__11560 = cljs.core.pv_aget(node,((i >>> level) & (31)));
+var G__11561 = (level - (5));
+node = G__11560;
+level = G__11561;
+continue;
+} else {
+return node.arr;
+}
+break;
+}
+}
+});
+cljs.core.array_for = (function cljs$core$array_for(pv,i){
+if(((((0) <= i)) && ((i < pv.cnt)))){
+return cljs.core.unchecked_array_for(pv,i);
+} else {
+return cljs.core.vector_index_out_of_bounds(i,pv.cnt);
+}
+});
+cljs.core.do_assoc = (function cljs$core$do_assoc(pv,level,node,i,val){
+var ret = cljs.core.pv_clone_node(node);
+if((level === (0))){
+cljs.core.pv_aset(ret,(i & (31)),val);
+
+return ret;
+} else {
+var subidx = ((i >>> level) & (31));
+cljs.core.pv_aset(ret,subidx,(function (){var G__11562 = pv;
+var G__11563 = (level - (5));
+var G__11564 = cljs.core.pv_aget(node,subidx);
+var G__11565 = i;
+var G__11566 = val;
+return (cljs.core.do_assoc.cljs$core$IFn$_invoke$arity$5 ? cljs.core.do_assoc.cljs$core$IFn$_invoke$arity$5(G__11562,G__11563,G__11564,G__11565,G__11566) : cljs.core.do_assoc.call(null,G__11562,G__11563,G__11564,G__11565,G__11566));
+})());
+
+return ret;
+}
+});
+cljs.core.pop_tail = (function cljs$core$pop_tail(pv,level,node){
+var subidx = (((pv.cnt - (2)) >>> level) & (31));
+if((level > (5))){
+var new_child = (function (){var G__11567 = pv;
+var G__11568 = (level - (5));
+var G__11569 = cljs.core.pv_aget(node,subidx);
+return (cljs.core.pop_tail.cljs$core$IFn$_invoke$arity$3 ? cljs.core.pop_tail.cljs$core$IFn$_invoke$arity$3(G__11567,G__11568,G__11569) : cljs.core.pop_tail.call(null,G__11567,G__11568,G__11569));
+})();
+if((((new_child == null)) && ((subidx === (0))))){
+return null;
+} else {
+var ret = cljs.core.pv_clone_node(node);
+cljs.core.pv_aset(ret,subidx,new_child);
+
+return ret;
+}
+} else {
+if((subidx === (0))){
+return null;
+} else {
+var ret = cljs.core.pv_clone_node(node);
+cljs.core.pv_aset(ret,subidx,null);
+
+return ret;
+
+}
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.RangedIterator = (function (i,base,arr,v,start,end){
+this.i = i;
+this.base = base;
+this.arr = arr;
+this.v = v;
+this.start = start;
+this.end = end;
+});
+cljs.core.RangedIterator.prototype.hasNext = (function (){
+var self__ = this;
+var this$ = this;
+return (self__.i < self__.end);
+});
+
+cljs.core.RangedIterator.prototype.next = (function (){
+var self__ = this;
+var this$ = this;
+if(((self__.i - self__.base) === (32))){
+self__.arr = cljs.core.unchecked_array_for(self__.v,self__.i);
+
+self__.base = (self__.base + (32));
+} else {
+}
+
+var ret = (self__.arr[(self__.i & (31))]);
+self__.i = (self__.i + (1));
+
+return ret;
+});
+
+cljs.core.RangedIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"base","base",1825810849,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"v","v",1661996586,null),new cljs.core.Symbol(null,"start","start",1285322546,null),new cljs.core.Symbol(null,"end","end",1372345569,null)], null);
+});
+
+cljs.core.RangedIterator.cljs$lang$type = true;
+
+cljs.core.RangedIterator.cljs$lang$ctorStr = "cljs.core/RangedIterator";
+
+cljs.core.RangedIterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/RangedIterator");
+});
+
+/**
+ * Positional factory function for cljs.core/RangedIterator.
+ */
+cljs.core.__GT_RangedIterator = (function cljs$core$__GT_RangedIterator(i,base,arr,v,start,end){
+return (new cljs.core.RangedIterator(i,base,arr,v,start,end));
+});
+
+cljs.core.ranged_iterator = (function cljs$core$ranged_iterator(v,start,end){
+var i = start;
+return (new cljs.core.RangedIterator(i,(i - (i % (32))),(((start < cljs.core.count(v)))?cljs.core.unchecked_array_for(v,i):null),v,start,end));
+});
+cljs.core.pv_reduce = (function cljs$core$pv_reduce(var_args){
+var G__11571 = arguments.length;
+switch (G__11571) {
+case 4:
+return cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$4 = (function (pv,f,start,end){
+if((start < end)){
+return cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$5(pv,f,cljs.core.nth.cljs$core$IFn$_invoke$arity$2(pv,start),(start + (1)),end);
+} else {
+return (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+}
+});
+
+cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$5 = (function (pv,f,init,start,end){
+var acc = init;
+var i = start;
+var arr = cljs.core.unchecked_array_for(pv,start);
+while(true){
+if((i < end)){
+var j = (i & (31));
+var arr__$1 = (((j === (0)))?cljs.core.unchecked_array_for(pv,i):arr);
+var nacc = (function (){var G__11572 = acc;
+var G__11573 = (arr__$1[j]);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11572,G__11573) : f.call(null,G__11572,G__11573));
+})();
+if(cljs.core.reduced_QMARK_(nacc)){
+return cljs.core.deref(nacc);
+} else {
+var G__11575 = nacc;
+var G__11576 = (i + (1));
+var G__11577 = arr__$1;
+acc = G__11575;
+i = G__11576;
+arr = G__11577;
+continue;
+}
+} else {
+return acc;
+}
+break;
+}
+});
+
+cljs.core.pv_reduce.cljs$lang$maxFixedArity = 5;
+
+
+
+
+
+
+
+
+/**
+ * Marker protocol
+ * @interface
+ */
+cljs.core.APersistentVector = function(){};
+
+
+/**
+* @constructor
+ * @implements {cljs.core.APersistentVector}
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IVector}
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEditableCollection}
+ * @implements {cljs.core.IFind}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.PersistentVector = (function (meta,cnt,shift,root,tail,__hash){
+this.meta = meta;
+this.cnt = cnt;
+this.shift = shift;
+this.root = root;
+this.tail = tail;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 167666463;
+this.cljs$lang$protocol_mask$partition1$ = 139268;
+});
+cljs.core.PersistentVector.prototype.cljs$core$IFind$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentVector.prototype.cljs$core$IFind$_find$arity$2 = (function (coll,n){
+var self__ = this;
+var coll__$1 = this;
+if(((((0) <= n)) && ((n < self__.cnt)))){
+return (new cljs.core.MapEntry(n,(cljs.core.unchecked_array_for(coll__$1,n)[(n & (31))]),null));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentVector.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentVector.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentVector.prototype.indexOf = (function() {
+var G__11584 = null;
+var G__11584__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11584__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11584 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11584__1.call(this,x);
+case 2:
+return G__11584__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11584.cljs$core$IFn$_invoke$arity$1 = G__11584__1;
+G__11584.cljs$core$IFn$_invoke$arity$2 = G__11584__2;
+return G__11584;
+})()
+;
+
+cljs.core.PersistentVector.prototype.lastIndexOf = (function() {
+var G__11585 = null;
+var G__11585__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11585__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11585 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11585__1.call(this,x);
+case 2:
+return G__11585__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11585.cljs$core$IFn$_invoke$arity$1 = G__11585__1;
+G__11585.cljs$core$IFn$_invoke$arity$2 = G__11585__2;
+return G__11585;
+})()
+;
+
+cljs.core.PersistentVector.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(typeof k === 'number'){
+return coll__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+} else {
+return not_found;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (v,f,init){
+var self__ = this;
+var v__$1 = this;
+var i = (0);
+var init__$1 = init;
+while(true){
+if((i < self__.cnt)){
+var arr = cljs.core.unchecked_array_for(v__$1,i);
+var len = arr.length;
+var init__$2 = (function (){var j = (0);
+var init__$2 = init__$1;
+while(true){
+if((j < len)){
+var init__$3 = (function (){var G__11579 = init__$2;
+var G__11580 = (j + i);
+var G__11581 = (arr[j]);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11579,G__11580,G__11581) : f.call(null,G__11579,G__11580,G__11581));
+})();
+if(cljs.core.reduced_QMARK_(init__$3)){
+return init__$3;
+} else {
+var G__11586 = (j + (1));
+var G__11587 = init__$3;
+j = G__11586;
+init__$2 = G__11587;
+continue;
+}
+} else {
+return init__$2;
+}
+break;
+}
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return cljs.core.deref(init__$2);
+} else {
+var G__11588 = (i + len);
+var G__11589 = init__$2;
+i = G__11588;
+init__$1 = G__11589;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$APersistentVector$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentVector.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (coll,n){
+var self__ = this;
+var coll__$1 = this;
+return (cljs.core.array_for(coll__$1,n)[(n & (31))]);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (coll,n,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(((((0) <= n)) && ((n < self__.cnt)))){
+return (cljs.core.unchecked_array_for(coll__$1,n)[(n & (31))]);
+} else {
+return not_found;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IVector$_assoc_n$arity$3 = (function (coll,n,val){
+var self__ = this;
+var coll__$1 = this;
+if(((((0) <= n)) && ((n < self__.cnt)))){
+if((cljs.core.tail_off(coll__$1) <= n)){
+var new_tail = cljs.core.aclone(self__.tail);
+(new_tail[(n & (31))] = val);
+
+return (new cljs.core.PersistentVector(self__.meta,self__.cnt,self__.shift,self__.root,new_tail,null));
+} else {
+return (new cljs.core.PersistentVector(self__.meta,self__.cnt,self__.shift,cljs.core.do_assoc(coll__$1,self__.shift,self__.root,n,val),self__.tail,null));
+}
+} else {
+if((n === self__.cnt)){
+return coll__$1.cljs$core$ICollection$_conj$arity$2(null,val);
+} else {
+throw (new Error(["Index ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(n)," out of bounds [0,",cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.cnt),"]"].join('')));
+
+}
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core.ranged_iterator(this$__$1,(0),self__.cnt);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentVector(self__.meta,self__.cnt,self__.shift,self__.root,self__.tail,self__.__hash));
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.cnt;
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IStack$_peek$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+return coll__$1.cljs$core$IIndexed$_nth$arity$2(null,(self__.cnt - (1)));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IStack$_pop$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt === (0))){
+throw (new Error("Can't pop empty vector"));
+} else {
+if(((1) === self__.cnt)){
+return cljs.core._with_meta(cljs.core.PersistentVector.EMPTY,self__.meta);
+} else {
+if(((1) < (self__.cnt - cljs.core.tail_off(coll__$1)))){
+return (new cljs.core.PersistentVector(self__.meta,(self__.cnt - (1)),self__.shift,self__.root,self__.tail.slice((0),(-1)),null));
+} else {
+var new_tail = cljs.core.unchecked_array_for(coll__$1,(self__.cnt - (2)));
+var nr = cljs.core.pop_tail(coll__$1,self__.shift,self__.root);
+var new_root = (((nr == null))?cljs.core.PersistentVector.EMPTY_NODE:nr);
+var cnt_1 = (self__.cnt - (1));
+if(((((5) < self__.shift)) && ((cljs.core.pv_aget(new_root,(1)) == null)))){
+return (new cljs.core.PersistentVector(self__.meta,cnt_1,(self__.shift - (5)),cljs.core.pv_aget(new_root,(0)),new_tail,null));
+} else {
+return (new cljs.core.PersistentVector(self__.meta,cnt_1,self__.shift,new_root,new_tail,null));
+}
+
+}
+}
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+return (new cljs.core.RSeq(coll__$1,(self__.cnt - (1)),null));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+if((other instanceof cljs.core.PersistentVector)){
+if((self__.cnt === cljs.core.count(other))){
+var me_iter = coll__$1.cljs$core$IIterable$_iterator$arity$1(null);
+var you_iter = cljs.core._iterator(other);
+while(true){
+if(me_iter.hasNext()){
+var x = me_iter.next();
+var y = you_iter.next();
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(x,y)){
+continue;
+} else {
+return false;
+}
+} else {
+return true;
+}
+break;
+}
+} else {
+return false;
+}
+} else {
+return cljs.core.equiv_sequential(coll__$1,other);
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IEditableCollection$_as_transient$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.TransientVector(self__.cnt,self__.shift,cljs.core.tv_editable_root(self__.root),cljs.core.tv_editable_tail(self__.tail)));
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.PersistentVector.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (v,f){
+var self__ = this;
+var v__$1 = this;
+return cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$4(v__$1,f,(0),self__.cnt);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (v,f,init){
+var self__ = this;
+var v__$1 = this;
+var i = (0);
+var init__$1 = init;
+while(true){
+if((i < self__.cnt)){
+var arr = cljs.core.unchecked_array_for(v__$1,i);
+var len = arr.length;
+var init__$2 = (function (){var j = (0);
+var init__$2 = init__$1;
+while(true){
+if((j < len)){
+var init__$3 = (function (){var G__11582 = init__$2;
+var G__11583 = (arr[j]);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__11582,G__11583) : f.call(null,G__11582,G__11583));
+})();
+if(cljs.core.reduced_QMARK_(init__$3)){
+return init__$3;
+} else {
+var G__11590 = (j + (1));
+var G__11591 = init__$3;
+j = G__11590;
+init__$2 = G__11591;
+continue;
+}
+} else {
+return init__$2;
+}
+break;
+}
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return cljs.core.deref(init__$2);
+} else {
+var G__11592 = (i + len);
+var G__11593 = init__$2;
+i = G__11592;
+init__$1 = G__11593;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,k,v){
+var self__ = this;
+var coll__$1 = this;
+if(typeof k === 'number'){
+return coll__$1.cljs$core$IVector$_assoc_n$arity$3(null,k,v);
+} else {
+throw (new Error("Vector's key for assoc must be a number."));
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.integer_QMARK_(k)){
+return ((((0) <= k)) && ((k < self__.cnt)));
+} else {
+return false;
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt === (0))){
+return null;
+} else {
+if((self__.cnt <= (32))){
+return (new cljs.core.IndexedSeq(self__.tail,(0),null));
+} else {
+return cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4(coll__$1,cljs.core.first_array_for_longvec(coll__$1),(0),(0));
+
+}
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentVector(meta__$1,self__.cnt,self__.shift,self__.root,self__.tail,self__.__hash));
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+if(((self__.cnt - cljs.core.tail_off(coll__$1)) < (32))){
+var len = self__.tail.length;
+var new_tail = (new Array((len + (1))));
+var n__8769__auto___11594 = len;
+var i_11595 = (0);
+while(true){
+if((i_11595 < n__8769__auto___11594)){
+(new_tail[i_11595] = (self__.tail[i_11595]));
+
+var G__11596 = (i_11595 + (1));
+i_11595 = G__11596;
+continue;
+} else {
+}
+break;
+}
+
+(new_tail[len] = o);
+
+return (new cljs.core.PersistentVector(self__.meta,(self__.cnt + (1)),self__.shift,self__.root,new_tail,null));
+} else {
+var root_overflow_QMARK_ = ((self__.cnt >>> (5)) > ((1) << self__.shift));
+var new_shift = ((root_overflow_QMARK_)?(self__.shift + (5)):self__.shift);
+var new_root = ((root_overflow_QMARK_)?(function (){var n_r = cljs.core.pv_fresh_node(null);
+cljs.core.pv_aset(n_r,(0),self__.root);
+
+cljs.core.pv_aset(n_r,(1),cljs.core.new_path(null,self__.shift,(new cljs.core.VectorNode(null,self__.tail))));
+
+return n_r;
+})():cljs.core.push_tail(coll__$1,self__.shift,self__.root,(new cljs.core.VectorNode(null,self__.tail))));
+return (new cljs.core.PersistentVector(self__.meta,(self__.cnt + (1)),new_shift,new_root,[o],null));
+}
+});
+
+cljs.core.PersistentVector.prototype.call = (function() {
+var G__11597 = null;
+var G__11597__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+var G__11597__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+G__11597 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11597__2.call(this,self__,k);
+case 3:
+return G__11597__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11597.cljs$core$IFn$_invoke$arity$2 = G__11597__2;
+G__11597.cljs$core$IFn$_invoke$arity$3 = G__11597__3;
+return G__11597;
+})()
+;
+
+cljs.core.PersistentVector.prototype.apply = (function (self__,args11578){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11578)));
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentVector.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.Symbol(null,"shift","shift",-1657295705,null),new cljs.core.Symbol(null,"root","root",1191874074,null),new cljs.core.Symbol(null,"tail","tail",494507963,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentVector.cljs$lang$type = true;
+
+cljs.core.PersistentVector.cljs$lang$ctorStr = "cljs.core/PersistentVector";
+
+cljs.core.PersistentVector.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentVector");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentVector.
+ */
+cljs.core.__GT_PersistentVector = (function cljs$core$__GT_PersistentVector(meta,cnt,shift,root,tail,__hash){
+return (new cljs.core.PersistentVector(meta,cnt,shift,root,tail,__hash));
+});
+
+cljs.core.PersistentVector.EMPTY_NODE = (new cljs.core.VectorNode(null,[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]));
+cljs.core.PersistentVector.EMPTY = (new cljs.core.PersistentVector(null,(0),(5),cljs.core.PersistentVector.EMPTY_NODE,[],cljs.core.empty_ordered_hash));
+cljs.core.PersistentVector.fromArray = (function (xs,no_clone){
+var l = xs.length;
+var xs__$1 = ((no_clone)?xs:cljs.core.aclone(xs));
+if((l < (32))){
+return (new cljs.core.PersistentVector(null,l,(5),cljs.core.PersistentVector.EMPTY_NODE,xs__$1,null));
+} else {
+var node = xs__$1.slice((0),(32));
+var v = (new cljs.core.PersistentVector(null,(32),(5),cljs.core.PersistentVector.EMPTY_NODE,node,null));
+var i = (32);
+var out = v.cljs$core$IEditableCollection$_as_transient$arity$1(null);
+while(true){
+if((i < l)){
+var G__11598 = (i + (1));
+var G__11599 = cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2(out,(xs__$1[i]));
+i = G__11598;
+out = G__11599;
+continue;
+} else {
+return cljs.core.persistent_BANG_(out);
+}
+break;
+}
+}
+});
+var G__11600_11603 = cljs.core.PersistentVector.prototype;
+var G__11601_11604 = cljs.core.ITER_SYMBOL;
+var G__11602_11605 = ((function (G__11600_11603,G__11601_11604){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11600_11603,G__11601_11604))
+;
+goog.object.set(G__11600_11603,G__11601_11604,G__11602_11605);
+/**
+ * Creates a new vector containing the contents of coll. JavaScript arrays
+ * will be aliased and should not be modified.
+ */
+cljs.core.vec = (function cljs$core$vec(coll){
+if(cljs.core.map_entry_QMARK_(coll)){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.key(coll),cljs.core.val(coll)], null);
+} else {
+if(cljs.core.vector_QMARK_(coll)){
+return cljs.core.with_meta(coll,null);
+} else {
+if(cljs.core.array_QMARK_(coll)){
+return cljs.core.PersistentVector.fromArray(coll,true);
+} else {
+return cljs.core._persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj_BANG_,cljs.core._as_transient(cljs.core.PersistentVector.EMPTY),coll));
+
+}
+}
+}
+});
+/**
+ * Creates a new vector containing the args.
+ */
+cljs.core.vector = (function cljs$core$vector(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___11607 = arguments.length;
+var i__9001__auto___11608 = (0);
+while(true){
+if((i__9001__auto___11608 < len__9000__auto___11607)){
+args__9010__auto__.push((arguments[i__9001__auto___11608]));
+
+var G__11609 = (i__9001__auto___11608 + (1));
+i__9001__auto___11608 = G__11609;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.vector.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.vector.cljs$core$IFn$_invoke$arity$variadic = (function (args){
+if((((args instanceof cljs.core.IndexedSeq)) && ((args.i === (0))))){
+return cljs.core.PersistentVector.fromArray(args.arr,true);
+} else {
+return cljs.core.vec(args);
+}
+});
+
+cljs.core.vector.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.vector.cljs$lang$applyTo = (function (seq11606){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq11606));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ASeq}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IChunkedNext}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IChunkedSeq}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.ChunkedSeq = (function (vec,node,i,off,meta,__hash){
+this.vec = vec;
+this.node = node;
+this.i = i;
+this.off = off;
+this.meta = meta;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32375020;
+this.cljs$lang$protocol_mask$partition1$ = 1536;
+});
+cljs.core.ChunkedSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.ChunkedSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.ChunkedSeq.prototype.indexOf = (function() {
+var G__11610 = null;
+var G__11610__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11610__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11610 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11610__1.call(this,x);
+case 2:
+return G__11610__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11610.cljs$core$IFn$_invoke$arity$1 = G__11610__1;
+G__11610.cljs$core$IFn$_invoke$arity$2 = G__11610__2;
+return G__11610;
+})()
+;
+
+cljs.core.ChunkedSeq.prototype.lastIndexOf = (function() {
+var G__11611 = null;
+var G__11611__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11611__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11611 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11611__1.call(this,x);
+case 2:
+return G__11611__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11611.cljs$core$IFn$_invoke$arity$1 = G__11611__1;
+G__11611.cljs$core$IFn$_invoke$arity$2 = G__11611__2;
+return G__11611;
+})()
+;
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(((self__.off + (1)) < self__.node.length)){
+var s = cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4(self__.vec,self__.node,self__.i,(self__.off + (1)));
+if((s == null)){
+return null;
+} else {
+return s;
+}
+} else {
+return coll__$1.cljs$core$IChunkedNext$_chunked_next$arity$1(null);
+}
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.List.EMPTY;
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$4(self__.vec,f,(self__.i + self__.off),cljs.core.count(self__.vec));
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$5(self__.vec,f,start,(self__.i + self__.off),cljs.core.count(self__.vec));
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (self__.node[self__.off]);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(((self__.off + (1)) < self__.node.length)){
+var s = cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4(self__.vec,self__.node,self__.i,(self__.off + (1)));
+if((s == null)){
+return cljs.core.List.EMPTY;
+} else {
+return s;
+}
+} else {
+return coll__$1.cljs$core$IChunkedSeq$_chunked_rest$arity$1(null);
+}
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IChunkedSeq$_chunked_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$2(self__.node,self__.off);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IChunkedSeq$_chunked_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var end = (self__.i + self__.node.length);
+if((end < cljs.core._count(self__.vec))){
+return cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4(self__.vec,cljs.core.unchecked_array_for(self__.vec,end),end,(0));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,m){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$5(self__.vec,self__.node,self__.i,self__.off,m);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IChunkedNext$_chunked_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var end = (self__.i + self__.node.length);
+if((end < cljs.core._count(self__.vec))){
+return cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4(self__.vec,cljs.core.unchecked_array_for(self__.vec,end),end,(0));
+} else {
+return null;
+}
+});
+
+cljs.core.ChunkedSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"vec","vec",982683596,null),new cljs.core.Symbol(null,"node","node",-2073234571,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"off","off",-2047994980,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ChunkedSeq.cljs$lang$type = true;
+
+cljs.core.ChunkedSeq.cljs$lang$ctorStr = "cljs.core/ChunkedSeq";
+
+cljs.core.ChunkedSeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ChunkedSeq");
+});
+
+/**
+ * Positional factory function for cljs.core/ChunkedSeq.
+ */
+cljs.core.__GT_ChunkedSeq = (function cljs$core$__GT_ChunkedSeq(vec,node,i,off,meta,__hash){
+return (new cljs.core.ChunkedSeq(vec,node,i,off,meta,__hash));
+});
+
+var G__11612_11615 = cljs.core.ChunkedSeq.prototype;
+var G__11613_11616 = cljs.core.ITER_SYMBOL;
+var G__11614_11617 = ((function (G__11612_11615,G__11613_11616){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11612_11615,G__11613_11616))
+;
+goog.object.set(G__11612_11615,G__11613_11616,G__11614_11617);
+cljs.core.chunked_seq = (function cljs$core$chunked_seq(var_args){
+var G__11619 = arguments.length;
+switch (G__11619) {
+case 3:
+return cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$3 = (function (vec,i,off){
+return (new cljs.core.ChunkedSeq(vec,cljs.core.array_for(vec,i),i,off,null,null));
+});
+
+cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4 = (function (vec,node,i,off){
+return (new cljs.core.ChunkedSeq(vec,node,i,off,null,null));
+});
+
+cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$5 = (function (vec,node,i,off,meta){
+return (new cljs.core.ChunkedSeq(vec,node,i,off,meta,null));
+});
+
+cljs.core.chunked_seq.cljs$lang$maxFixedArity = 5;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IVector}
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IFind}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Subvec = (function (meta,v,start,end,__hash){
+this.meta = meta;
+this.v = v;
+this.start = start;
+this.end = end;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 167666463;
+this.cljs$lang$protocol_mask$partition1$ = 139264;
+});
+cljs.core.Subvec.prototype.cljs$core$IFind$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Subvec.prototype.cljs$core$IFind$_find$arity$2 = (function (coll,n){
+var self__ = this;
+var coll__$1 = this;
+if((n < (0))){
+return null;
+} else {
+var idx = (self__.start + n);
+if((idx < self__.end)){
+return (new cljs.core.MapEntry(n,cljs.core._lookup.cljs$core$IFn$_invoke$arity$2(self__.v,idx),null));
+} else {
+return null;
+}
+}
+});
+
+cljs.core.Subvec.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.Subvec.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Subvec.prototype.indexOf = (function() {
+var G__11628 = null;
+var G__11628__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11628__2 = (function (x,start__$1){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start__$1);
+});
+G__11628 = function(x,start__$1){
+switch(arguments.length){
+case 1:
+return G__11628__1.call(this,x);
+case 2:
+return G__11628__2.call(this,x,start__$1);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11628.cljs$core$IFn$_invoke$arity$1 = G__11628__1;
+G__11628.cljs$core$IFn$_invoke$arity$2 = G__11628__2;
+return G__11628;
+})()
+;
+
+cljs.core.Subvec.prototype.lastIndexOf = (function() {
+var G__11629 = null;
+var G__11629__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11629__2 = (function (x,start__$1){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start__$1);
+});
+G__11629 = function(x,start__$1){
+switch(arguments.length){
+case 1:
+return G__11629__1.call(this,x);
+case 2:
+return G__11629__2.call(this,x,start__$1);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11629.cljs$core$IFn$_invoke$arity$1 = G__11629__1;
+G__11629.cljs$core$IFn$_invoke$arity$2 = G__11629__2;
+return G__11629;
+})()
+;
+
+cljs.core.Subvec.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.Subvec.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(typeof k === 'number'){
+return coll__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+} else {
+return not_found;
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+var i = self__.start;
+var j = (0);
+var init__$1 = init;
+while(true){
+if((i < self__.end)){
+var init__$2 = (function (){var G__11622 = init__$1;
+var G__11623 = j;
+var G__11624 = cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.v,i);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11622,G__11623,G__11624) : f.call(null,G__11622,G__11623,G__11624));
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return cljs.core.deref(init__$2);
+} else {
+var G__11630 = (i + (1));
+var G__11631 = (j + (1));
+var G__11632 = init__$2;
+i = G__11630;
+j = G__11631;
+init__$1 = G__11632;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (coll,n){
+var self__ = this;
+var coll__$1 = this;
+if((((n < (0))) || ((self__.end <= (self__.start + n))))){
+return cljs.core.vector_index_out_of_bounds(n,(self__.end - self__.start));
+} else {
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.v,(self__.start + n));
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (coll,n,not_found){
+var self__ = this;
+var coll__$1 = this;
+if((((n < (0))) || ((self__.end <= (self__.start + n))))){
+return not_found;
+} else {
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$3(self__.v,(self__.start + n),not_found);
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IVector$_assoc_n$arity$3 = (function (coll,n,val){
+var self__ = this;
+var coll__$1 = this;
+var v_pos = (self__.start + n);
+if((((n < (0))) || (((self__.end + (1)) <= v_pos)))){
+throw (new Error(["Index ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(n)," out of bounds [0,",cljs.core.str.cljs$core$IFn$_invoke$arity$1(coll__$1.cljs$core$ICounted$_count$arity$1(null)),"]"].join('')));
+} else {
+return cljs.core.build_subvec(self__.meta,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(self__.v,v_pos,val),self__.start,(function (){var x__8162__auto__ = self__.end;
+var y__8163__auto__ = (v_pos + (1));
+return ((x__8162__auto__ > y__8163__auto__) ? x__8162__auto__ : y__8163__auto__);
+})(),null);
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((((!((self__.v == null))))?((((false) || ((cljs.core.PROTOCOL_SENTINEL === self__.v.cljs$core$APersistentVector$))))?true:false):false)){
+return cljs.core.ranged_iterator(self__.v,self__.start,self__.end);
+} else {
+return cljs.core.seq_iter(coll__$1);
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.Subvec.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.Subvec(self__.meta,self__.v,self__.start,self__.end,self__.__hash));
+});
+
+cljs.core.Subvec.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (self__.end - self__.start);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IStack$_peek$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.v,(self__.end - (1)));
+});
+
+cljs.core.Subvec.prototype.cljs$core$IStack$_pop$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.start === self__.end)){
+throw (new Error("Can't pop empty vector"));
+} else {
+return cljs.core.build_subvec(self__.meta,self__.v,self__.start,(self__.end - (1)),null);
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((!((self__.start === self__.end)))){
+return (new cljs.core.RSeq(coll__$1,((self__.end - self__.start) - (1)),null));
+} else {
+return null;
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.PersistentVector.EMPTY,self__.meta);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+if((((!((self__.v == null))))?((((false) || ((cljs.core.PROTOCOL_SENTINEL === self__.v.cljs$core$APersistentVector$))))?true:false):false)){
+return cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$4(self__.v,f,self__.start,self__.end);
+} else {
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2(coll__$1,f);
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+if((((!((self__.v == null))))?((((false) || ((cljs.core.PROTOCOL_SENTINEL === self__.v.cljs$core$APersistentVector$))))?true:false):false)){
+return cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$5(self__.v,f,init,self__.start,self__.end);
+} else {
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3(coll__$1,f,init);
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,key,val){
+var self__ = this;
+var coll__$1 = this;
+if(typeof key === 'number'){
+return coll__$1.cljs$core$IVector$_assoc_n$arity$3(null,key,val);
+} else {
+throw (new Error("Subvec's key for assoc must be a number."));
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var subvec_seq = ((function (coll__$1){
+return (function cljs$core$subvec_seq(i){
+if((i === self__.end)){
+return null;
+} else {
+return cljs.core.cons(cljs.core._nth.cljs$core$IFn$_invoke$arity$2(self__.v,i),(new cljs.core.LazySeq(null,((function (coll__$1){
+return (function (){
+return cljs$core$subvec_seq((i + (1)));
+});})(coll__$1))
+,null,null)));
+}
+});})(coll__$1))
+;
+return subvec_seq(self__.start);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.build_subvec(meta__$1,self__.v,self__.start,self__.end,self__.__hash);
+});
+
+cljs.core.Subvec.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.build_subvec(self__.meta,cljs.core._assoc_n(self__.v,self__.end,o),self__.start,(self__.end + (1)),null);
+});
+
+cljs.core.Subvec.prototype.call = (function() {
+var G__11633 = null;
+var G__11633__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+var G__11633__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+G__11633 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11633__2.call(this,self__,k);
+case 3:
+return G__11633__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11633.cljs$core$IFn$_invoke$arity$2 = G__11633__2;
+G__11633.cljs$core$IFn$_invoke$arity$3 = G__11633__3;
+return G__11633;
+})()
+;
+
+cljs.core.Subvec.prototype.apply = (function (self__,args11621){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11621)));
+});
+
+cljs.core.Subvec.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.Subvec.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"v","v",1661996586,null),new cljs.core.Symbol(null,"start","start",1285322546,null),new cljs.core.Symbol(null,"end","end",1372345569,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Subvec.cljs$lang$type = true;
+
+cljs.core.Subvec.cljs$lang$ctorStr = "cljs.core/Subvec";
+
+cljs.core.Subvec.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Subvec");
+});
+
+/**
+ * Positional factory function for cljs.core/Subvec.
+ */
+cljs.core.__GT_Subvec = (function cljs$core$__GT_Subvec(meta,v,start,end,__hash){
+return (new cljs.core.Subvec(meta,v,start,end,__hash));
+});
+
+var G__11634_11637 = cljs.core.Subvec.prototype;
+var G__11635_11638 = cljs.core.ITER_SYMBOL;
+var G__11636_11639 = ((function (G__11634_11637,G__11635_11638){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11634_11637,G__11635_11638))
+;
+goog.object.set(G__11634_11637,G__11635_11638,G__11636_11639);
+cljs.core.build_subvec = (function cljs$core$build_subvec(meta,v,start,end,__hash){
+while(true){
+if((v instanceof cljs.core.Subvec)){
+var G__11640 = meta;
+var G__11641 = v.v;
+var G__11642 = (v.start + start);
+var G__11643 = (v.start + end);
+var G__11644 = __hash;
+meta = G__11640;
+v = G__11641;
+start = G__11642;
+end = G__11643;
+__hash = G__11644;
+continue;
+} else {
+if(cljs.core.vector_QMARK_(v)){
+} else {
+throw (new Error("v must satisfy IVector"));
+}
+
+var c_11645 = cljs.core.count(v);
+if((((start < (0))) || ((end < (0))) || ((start > c_11645)) || ((end > c_11645)))){
+throw (new Error("Index out of bounds"));
+} else {
+}
+
+return (new cljs.core.Subvec(meta,v,start,end,__hash));
+}
+break;
+}
+});
+/**
+ * Returns a persistent vector of the items in vector from
+ * start (inclusive) to end (exclusive). If end is not supplied,
+ * defaults to (count vector). This operation is O(1) and very fast, as
+ * the resulting vector shares structure with the original and no
+ * trimming is done.
+ */
+cljs.core.subvec = (function cljs$core$subvec(var_args){
+var G__11647 = arguments.length;
+switch (G__11647) {
+case 2:
+return cljs.core.subvec.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.subvec.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.subvec.cljs$core$IFn$_invoke$arity$2 = (function (v,start){
+return cljs.core.subvec.cljs$core$IFn$_invoke$arity$3(v,start,cljs.core.count(v));
+});
+
+cljs.core.subvec.cljs$core$IFn$_invoke$arity$3 = (function (v,start,end){
+if((((!((start == null)))) && ((!((end == null)))))){
+} else {
+throw (new Error("Assert failed: (and (not (nil? start)) (not (nil? end)))"));
+}
+
+return cljs.core.build_subvec(null,v,(start | (0)),(end | (0)),null);
+});
+
+cljs.core.subvec.cljs$lang$maxFixedArity = 3;
+
+cljs.core.tv_ensure_editable = (function cljs$core$tv_ensure_editable(edit,node){
+if((edit === node.edit)){
+return node;
+} else {
+return (new cljs.core.VectorNode(edit,cljs.core.aclone(node.arr)));
+}
+});
+cljs.core.tv_editable_root = (function cljs$core$tv_editable_root(node){
+return (new cljs.core.VectorNode({},cljs.core.aclone(node.arr)));
+});
+cljs.core.tv_editable_tail = (function cljs$core$tv_editable_tail(tl){
+var ret = [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null];
+cljs.core.array_copy(tl,(0),ret,(0),tl.length);
+
+return ret;
+});
+cljs.core.tv_push_tail = (function cljs$core$tv_push_tail(tv,level,parent,tail_node){
+var ret = cljs.core.tv_ensure_editable(tv.root.edit,parent);
+var subidx = (((tv.cnt - (1)) >>> level) & (31));
+cljs.core.pv_aset(ret,subidx,(((level === (5)))?tail_node:(function (){var child = cljs.core.pv_aget(ret,subidx);
+if((!((child == null)))){
+var G__11651 = tv;
+var G__11652 = (level - (5));
+var G__11653 = child;
+var G__11654 = tail_node;
+return (cljs.core.tv_push_tail.cljs$core$IFn$_invoke$arity$4 ? cljs.core.tv_push_tail.cljs$core$IFn$_invoke$arity$4(G__11651,G__11652,G__11653,G__11654) : cljs.core.tv_push_tail.call(null,G__11651,G__11652,G__11653,G__11654));
+} else {
+return cljs.core.new_path(tv.root.edit,(level - (5)),tail_node);
+}
+})()));
+
+return ret;
+});
+cljs.core.tv_pop_tail = (function cljs$core$tv_pop_tail(tv,level,node){
+var node__$1 = cljs.core.tv_ensure_editable(tv.root.edit,node);
+var subidx = (((tv.cnt - (2)) >>> level) & (31));
+if((level > (5))){
+var new_child = (function (){var G__11655 = tv;
+var G__11656 = (level - (5));
+var G__11657 = cljs.core.pv_aget(node__$1,subidx);
+return (cljs.core.tv_pop_tail.cljs$core$IFn$_invoke$arity$3 ? cljs.core.tv_pop_tail.cljs$core$IFn$_invoke$arity$3(G__11655,G__11656,G__11657) : cljs.core.tv_pop_tail.call(null,G__11655,G__11656,G__11657));
+})();
+if((((new_child == null)) && ((subidx === (0))))){
+return null;
+} else {
+cljs.core.pv_aset(node__$1,subidx,new_child);
+
+return node__$1;
+}
+} else {
+if((subidx === (0))){
+return null;
+} else {
+cljs.core.pv_aset(node__$1,subidx,null);
+
+return node__$1;
+
+}
+}
+});
+cljs.core.unchecked_editable_array_for = (function cljs$core$unchecked_editable_array_for(tv,i){
+if((i >= cljs.core.tail_off(tv))){
+return tv.tail;
+} else {
+var root = tv.root;
+var node = root;
+var level = tv.shift;
+while(true){
+if((level > (0))){
+var G__11658 = cljs.core.tv_ensure_editable(root.edit,cljs.core.pv_aget(node,((i >>> level) & (31))));
+var G__11659 = (level - (5));
+node = G__11658;
+level = G__11659;
+continue;
+} else {
+return node.arr;
+}
+break;
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ITransientCollection}
+ * @implements {cljs.core.ITransientVector}
+ * @implements {cljs.core.ITransientAssociative}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.TransientVector = (function (cnt,shift,root,tail){
+this.cnt = cnt;
+this.shift = shift;
+this.root = root;
+this.tail = tail;
+this.cljs$lang$protocol_mask$partition1$ = 88;
+this.cljs$lang$protocol_mask$partition0$ = 275;
+});
+cljs.core.TransientVector.prototype.cljs$core$ITransientCollection$_conj_BANG_$arity$2 = (function (tcoll,o){
+var self__ = this;
+var tcoll__$1 = this;
+if(self__.root.edit){
+if(((self__.cnt - cljs.core.tail_off(tcoll__$1)) < (32))){
+(self__.tail[(self__.cnt & (31))] = o);
+
+self__.cnt = (self__.cnt + (1));
+
+return tcoll__$1;
+} else {
+var tail_node = (new cljs.core.VectorNode(self__.root.edit,self__.tail));
+var new_tail = [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null];
+(new_tail[(0)] = o);
+
+self__.tail = new_tail;
+
+if(((self__.cnt >>> (5)) > ((1) << self__.shift))){
+var new_root_array = [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null];
+var new_shift = (self__.shift + (5));
+(new_root_array[(0)] = self__.root);
+
+(new_root_array[(1)] = cljs.core.new_path(self__.root.edit,self__.shift,tail_node));
+
+self__.root = (new cljs.core.VectorNode(self__.root.edit,new_root_array));
+
+self__.shift = new_shift;
+
+self__.cnt = (self__.cnt + (1));
+
+return tcoll__$1;
+} else {
+var new_root = cljs.core.tv_push_tail(tcoll__$1,self__.shift,self__.root,tail_node);
+self__.root = new_root;
+
+self__.cnt = (self__.cnt + (1));
+
+return tcoll__$1;
+}
+}
+} else {
+throw (new Error("conj! after persistent!"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ITransientCollection$_persistent_BANG_$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+if(self__.root.edit){
+self__.root.edit = null;
+
+var len = (self__.cnt - cljs.core.tail_off(tcoll__$1));
+var trimmed_tail = (new Array(len));
+cljs.core.array_copy(self__.tail,(0),trimmed_tail,(0),len);
+
+return (new cljs.core.PersistentVector(null,self__.cnt,self__.shift,self__.root,trimmed_tail,null));
+} else {
+throw (new Error("persistent! called twice"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3 = (function (tcoll,key,val){
+var self__ = this;
+var tcoll__$1 = this;
+if(typeof key === 'number'){
+return tcoll__$1.cljs$core$ITransientVector$_assoc_n_BANG_$arity$3(null,key,val);
+} else {
+throw (new Error("TransientVector's key for assoc! must be a number."));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ITransientVector$_assoc_n_BANG_$arity$3 = (function (tcoll,n,val){
+var self__ = this;
+var tcoll__$1 = this;
+if(self__.root.edit){
+if(((((0) <= n)) && ((n < self__.cnt)))){
+if((cljs.core.tail_off(tcoll__$1) <= n)){
+(self__.tail[(n & (31))] = val);
+
+return tcoll__$1;
+} else {
+var new_root = (function (){var fexpr__11661 = ((function (tcoll__$1){
+return (function cljs$core$go(level,node){
+var node__$1 = cljs.core.tv_ensure_editable(self__.root.edit,node);
+if((level === (0))){
+cljs.core.pv_aset(node__$1,(n & (31)),val);
+
+return node__$1;
+} else {
+var subidx = ((n >>> level) & (31));
+cljs.core.pv_aset(node__$1,subidx,cljs$core$go((level - (5)),cljs.core.pv_aget(node__$1,subidx)));
+
+return node__$1;
+}
+});})(tcoll__$1))
+;
+return fexpr__11661(self__.shift,self__.root);
+})();
+self__.root = new_root;
+
+return tcoll__$1;
+}
+} else {
+if((n === self__.cnt)){
+return tcoll__$1.cljs$core$ITransientCollection$_conj_BANG_$arity$2(null,val);
+} else {
+throw (new Error(["Index ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(n)," out of bounds for TransientVector of length",cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.cnt)].join('')));
+
+}
+}
+} else {
+throw (new Error("assoc! after persistent!"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ITransientVector$_pop_BANG_$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+if(self__.root.edit){
+if((self__.cnt === (0))){
+throw (new Error("Can't pop empty vector"));
+} else {
+if(((1) === self__.cnt)){
+self__.cnt = (0);
+
+return tcoll__$1;
+} else {
+if((((self__.cnt - (1)) & (31)) > (0))){
+self__.cnt = (self__.cnt - (1));
+
+return tcoll__$1;
+} else {
+var new_tail = cljs.core.unchecked_editable_array_for(tcoll__$1,(self__.cnt - (2)));
+var new_root = (function (){var nr = cljs.core.tv_pop_tail(tcoll__$1,self__.shift,self__.root);
+if((!((nr == null)))){
+return nr;
+} else {
+return (new cljs.core.VectorNode(self__.root.edit,[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]));
+}
+})();
+if(((((5) < self__.shift)) && ((cljs.core.pv_aget(new_root,(1)) == null)))){
+var new_root__$1 = cljs.core.tv_ensure_editable(self__.root.edit,cljs.core.pv_aget(new_root,(0)));
+self__.root = new_root__$1;
+
+self__.shift = (self__.shift - (5));
+
+self__.cnt = (self__.cnt - (1));
+
+self__.tail = new_tail;
+
+return tcoll__$1;
+} else {
+self__.root = new_root;
+
+self__.cnt = (self__.cnt - (1));
+
+self__.tail = new_tail;
+
+return tcoll__$1;
+}
+
+}
+}
+}
+} else {
+throw (new Error("pop! after persistent!"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(self__.root.edit){
+return self__.cnt;
+} else {
+throw (new Error("count after persistent!"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (coll,n){
+var self__ = this;
+var coll__$1 = this;
+if(self__.root.edit){
+return (cljs.core.array_for(coll__$1,n)[(n & (31))]);
+} else {
+throw (new Error("nth after persistent!"));
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (coll,n,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(((((0) <= n)) && ((n < self__.cnt)))){
+return coll__$1.cljs$core$IIndexed$_nth$arity$2(null,n);
+} else {
+return not_found;
+}
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.TransientVector.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(typeof k === 'number'){
+return coll__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+} else {
+return not_found;
+}
+});
+
+cljs.core.TransientVector.prototype.call = (function() {
+var G__11662 = null;
+var G__11662__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__11662__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__11662 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11662__2.call(this,self__,k);
+case 3:
+return G__11662__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11662.cljs$core$IFn$_invoke$arity$2 = G__11662__2;
+G__11662.cljs$core$IFn$_invoke$arity$3 = G__11662__3;
+return G__11662;
+})()
+;
+
+cljs.core.TransientVector.prototype.apply = (function (self__,args11660){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11660)));
+});
+
+cljs.core.TransientVector.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.TransientVector.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.TransientVector.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"shift","shift",-1657295705,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"root","root",1191874074,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"tail","tail",494507963,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.TransientVector.cljs$lang$type = true;
+
+cljs.core.TransientVector.cljs$lang$ctorStr = "cljs.core/TransientVector";
+
+cljs.core.TransientVector.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/TransientVector");
+});
+
+/**
+ * Positional factory function for cljs.core/TransientVector.
+ */
+cljs.core.__GT_TransientVector = (function cljs$core$__GT_TransientVector(cnt,shift,root,tail){
+return (new cljs.core.TransientVector(cnt,shift,root,tail));
+});
+
+
+/**
+* @constructor
+*/
+cljs.core.PersistentQueueIter = (function (fseq,riter){
+this.fseq = fseq;
+this.riter = riter;
+});
+cljs.core.PersistentQueueIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+var or__7806__auto__ = (((!((self__.fseq == null)))) && (cljs.core.seq(self__.fseq)));
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+var and__7791__auto__ = (!((self__.riter == null)));
+if(and__7791__auto__){
+return self__.riter.hasNext();
+} else {
+return and__7791__auto__;
+}
+}
+});
+
+cljs.core.PersistentQueueIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if((!((self__.fseq == null)))){
+var ret = cljs.core.first(self__.fseq);
+self__.fseq = cljs.core.next(self__.fseq);
+
+return ret;
+} else {
+if((((!((self__.riter == null)))) && (self__.riter.hasNext()))){
+return self__.riter.next();
+} else {
+throw (new Error("No such element"));
+
+}
+}
+});
+
+cljs.core.PersistentQueueIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.PersistentQueueIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"fseq","fseq",-1466412450,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"riter","riter",-237834262,null)], null);
+});
+
+cljs.core.PersistentQueueIter.cljs$lang$type = true;
+
+cljs.core.PersistentQueueIter.cljs$lang$ctorStr = "cljs.core/PersistentQueueIter";
+
+cljs.core.PersistentQueueIter.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentQueueIter");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentQueueIter.
+ */
+cljs.core.__GT_PersistentQueueIter = (function cljs$core$__GT_PersistentQueueIter(fseq,riter){
+return (new cljs.core.PersistentQueueIter(fseq,riter));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.PersistentQueueSeq = (function (meta,front,rear,__hash){
+this.meta = meta;
+this.front = front;
+this.rear = rear;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 31850700;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.PersistentQueueSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentQueueSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentQueueSeq.prototype.indexOf = (function() {
+var G__11663 = null;
+var G__11663__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11663__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11663 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11663__1.call(this,x);
+case 2:
+return G__11663__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11663.cljs$core$IFn$_invoke$arity$1 = G__11663__1;
+G__11663.cljs$core$IFn$_invoke$arity$2 = G__11663__2;
+return G__11663;
+})()
+;
+
+cljs.core.PersistentQueueSeq.prototype.lastIndexOf = (function() {
+var G__11664 = null;
+var G__11664__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11664__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11664 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11664__1.call(this,x);
+case 2:
+return G__11664__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11664.cljs$core$IFn$_invoke$arity$1 = G__11664__1;
+G__11664.cljs$core$IFn$_invoke$arity$2 = G__11664__2;
+return G__11664;
+})()
+;
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var temp__4655__auto__ = cljs.core.next(self__.front);
+if(temp__4655__auto__){
+var f1 = temp__4655__auto__;
+return (new cljs.core.PersistentQueueSeq(self__.meta,f1,self__.rear,null));
+} else {
+if((!((self__.rear == null)))){
+return (new cljs.core.PersistentQueueSeq(self__.meta,self__.rear,null,null));
+} else {
+return null;
+}
+}
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.first(self__.front);
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var temp__4655__auto__ = cljs.core.next(self__.front);
+if(temp__4655__auto__){
+var f1 = temp__4655__auto__;
+return (new cljs.core.PersistentQueueSeq(self__.meta,f1,self__.rear,null));
+} else {
+if((self__.rear == null)){
+return coll__$1.cljs$core$IEmptyableCollection$_empty$arity$1(null);
+} else {
+return (new cljs.core.PersistentQueueSeq(self__.meta,self__.rear,null,null));
+}
+}
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentQueueSeq(meta__$1,self__.front,self__.rear,self__.__hash));
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.PersistentQueueSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"front","front",117022539,null),new cljs.core.Symbol(null,"rear","rear",-900164830,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentQueueSeq.cljs$lang$type = true;
+
+cljs.core.PersistentQueueSeq.cljs$lang$ctorStr = "cljs.core/PersistentQueueSeq";
+
+cljs.core.PersistentQueueSeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentQueueSeq");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentQueueSeq.
+ */
+cljs.core.__GT_PersistentQueueSeq = (function cljs$core$__GT_PersistentQueueSeq(meta,front,rear,__hash){
+return (new cljs.core.PersistentQueueSeq(meta,front,rear,__hash));
+});
+
+var G__11665_11668 = cljs.core.PersistentQueueSeq.prototype;
+var G__11666_11669 = cljs.core.ITER_SYMBOL;
+var G__11667_11670 = ((function (G__11665_11668,G__11666_11669){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11665_11668,G__11666_11669))
+;
+goog.object.set(G__11665_11668,G__11666_11669,G__11667_11670);
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+*/
+cljs.core.PersistentQueue = (function (meta,count,front,rear,__hash){
+this.meta = meta;
+this.count = count;
+this.front = front;
+this.rear = rear;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition1$ = 139264;
+this.cljs$lang$protocol_mask$partition0$ = 31858766;
+});
+cljs.core.PersistentQueue.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentQueue.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentQueue.prototype.indexOf = (function() {
+var G__11671 = null;
+var G__11671__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11671__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11671 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11671__1.call(this,x);
+case 2:
+return G__11671__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11671.cljs$core$IFn$_invoke$arity$1 = G__11671__1;
+G__11671.cljs$core$IFn$_invoke$arity$2 = G__11671__2;
+return G__11671;
+})()
+;
+
+cljs.core.PersistentQueue.prototype.lastIndexOf = (function() {
+var G__11672 = null;
+var G__11672__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(self__.count.cljs$core$IFn$_invoke$arity$1 ? self__.count.cljs$core$IFn$_invoke$arity$1(coll) : self__.count.call(null,coll)));
+});
+var G__11672__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11672 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11672__1.call(this,x);
+case 2:
+return G__11672__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11672.cljs$core$IFn$_invoke$arity$1 = G__11672__1;
+G__11672.cljs$core$IFn$_invoke$arity$2 = G__11672__2;
+return G__11672;
+})()
+;
+
+cljs.core.PersistentQueue.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentQueueIter(self__.front,cljs.core._iterator(self__.rear)));
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentQueue(self__.meta,self__.count,self__.front,self__.rear,self__.__hash));
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.count;
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IStack$_peek$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.first(self__.front);
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IStack$_pop$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.truth_(self__.front)){
+var temp__4655__auto__ = cljs.core.next(self__.front);
+if(temp__4655__auto__){
+var f1 = temp__4655__auto__;
+return (new cljs.core.PersistentQueue(self__.meta,(self__.count - (1)),f1,self__.rear,null));
+} else {
+return (new cljs.core.PersistentQueue(self__.meta,(self__.count - (1)),cljs.core.seq(self__.rear),cljs.core.PersistentVector.EMPTY,null));
+}
+} else {
+return coll__$1;
+}
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.PersistentQueue.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.first(self__.front);
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.rest(cljs.core.seq(coll__$1));
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var rear__$1 = cljs.core.seq(self__.rear);
+if(cljs.core.truth_((function (){var or__7806__auto__ = self__.front;
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return rear__$1;
+}
+})())){
+return (new cljs.core.PersistentQueueSeq(null,self__.front,cljs.core.seq(rear__$1),null));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentQueue(meta__$1,self__.count,self__.front,self__.rear,self__.__hash));
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.truth_(self__.front)){
+return (new cljs.core.PersistentQueue(self__.meta,(self__.count + (1)),self__.front,cljs.core.conj.cljs$core$IFn$_invoke$arity$2((function (){var or__7806__auto__ = self__.rear;
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return cljs.core.PersistentVector.EMPTY;
+}
+})(),o),null));
+} else {
+return (new cljs.core.PersistentQueue(self__.meta,(self__.count + (1)),cljs.core.conj.cljs$core$IFn$_invoke$arity$2(self__.front,o),cljs.core.PersistentVector.EMPTY,null));
+}
+});
+
+cljs.core.PersistentQueue.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"count","count",-514511684,null),new cljs.core.Symbol(null,"front","front",117022539,null),new cljs.core.Symbol(null,"rear","rear",-900164830,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentQueue.cljs$lang$type = true;
+
+cljs.core.PersistentQueue.cljs$lang$ctorStr = "cljs.core/PersistentQueue";
+
+cljs.core.PersistentQueue.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentQueue");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentQueue.
+ */
+cljs.core.__GT_PersistentQueue = (function cljs$core$__GT_PersistentQueue(meta,count,front,rear,__hash){
+return (new cljs.core.PersistentQueue(meta,count,front,rear,__hash));
+});
+
+cljs.core.PersistentQueue.EMPTY = (new cljs.core.PersistentQueue(null,(0),null,cljs.core.PersistentVector.EMPTY,cljs.core.empty_ordered_hash));
+var G__11673_11676 = cljs.core.PersistentQueue.prototype;
+var G__11674_11677 = cljs.core.ITER_SYMBOL;
+var G__11675_11678 = ((function (G__11673_11676,G__11674_11677){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11673_11676,G__11674_11677))
+;
+goog.object.set(G__11673_11676,G__11674_11677,G__11675_11678);
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+*/
+cljs.core.NeverEquiv = (function (){
+this.cljs$lang$protocol_mask$partition0$ = 2097152;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.NeverEquiv.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.NeverEquiv.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (o,other){
+var self__ = this;
+var o__$1 = this;
+return false;
+});
+
+cljs.core.NeverEquiv.getBasis = (function (){
+return cljs.core.PersistentVector.EMPTY;
+});
+
+cljs.core.NeverEquiv.cljs$lang$type = true;
+
+cljs.core.NeverEquiv.cljs$lang$ctorStr = "cljs.core/NeverEquiv";
+
+cljs.core.NeverEquiv.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/NeverEquiv");
+});
+
+/**
+ * Positional factory function for cljs.core/NeverEquiv.
+ */
+cljs.core.__GT_NeverEquiv = (function cljs$core$__GT_NeverEquiv(){
+return (new cljs.core.NeverEquiv());
+});
+
+cljs.core.never_equiv = (new cljs.core.NeverEquiv());
+/**
+ * Test map equivalence. Returns true if x equals y, otherwise returns false.
+ */
+cljs.core.equiv_map = (function cljs$core$equiv_map(x,y){
+return cljs.core.boolean$(((((cljs.core.map_QMARK_(y)) && ((!(cljs.core.record_QMARK_(y))))))?(((cljs.core.count(x) === cljs.core.count(y)))?(((((!((x == null))))?(((((x.cljs$lang$protocol_mask$partition0$ & (1048576))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IKVReduce$))))?true:(((!x.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.IKVReduce,x):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IKVReduce,x)))?cljs.core.reduce_kv((function (_,k,v){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.get.cljs$core$IFn$_invoke$arity$3(y,k,cljs.core.never_equiv),v)){
+return true;
+} else {
+return cljs.core.reduced(false);
+}
+}),true,x):cljs.core.every_QMARK_((function (xkv){
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.get.cljs$core$IFn$_invoke$arity$3(y,cljs.core.first(xkv),cljs.core.never_equiv),cljs.core.second(xkv));
+}),x)):null):null));
+});
+cljs.core.scan_array = (function cljs$core$scan_array(incr,k,array){
+var len = array.length;
+var i = (0);
+while(true){
+if((i < len)){
+if((k === (array[i]))){
+return i;
+} else {
+var G__11680 = (i + incr);
+i = G__11680;
+continue;
+}
+} else {
+return null;
+}
+break;
+}
+});
+cljs.core.obj_map_compare_keys = (function cljs$core$obj_map_compare_keys(a,b){
+var a__$1 = cljs.core.hash(a);
+var b__$1 = cljs.core.hash(b);
+if((a__$1 < b__$1)){
+return (-1);
+} else {
+if((a__$1 > b__$1)){
+return (1);
+} else {
+return (0);
+
+}
+}
+});
+cljs.core.obj_map__GT_hash_map = (function cljs$core$obj_map__GT_hash_map(m,k,v){
+var ks = m.keys;
+var len = ks.length;
+var so = m.strobj;
+var mm = cljs.core.meta(m);
+var i = (0);
+var out = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+while(true){
+if((i < len)){
+var k__$1 = (ks[i]);
+var G__11681 = (i + (1));
+var G__11682 = cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(out,k__$1,goog.object.get(so,k__$1));
+i = G__11681;
+out = G__11682;
+continue;
+} else {
+return cljs.core._with_meta(cljs.core.persistent_BANG_(cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(out,k,v)),mm);
+}
+break;
+}
+});
+cljs.core.obj_clone = (function cljs$core$obj_clone(obj,ks){
+var new_obj = {};
+var l = ks.length;
+var i_11688 = (0);
+while(true){
+if((i_11688 < l)){
+var k_11689 = (ks[i_11688]);
+var G__11685_11690 = new_obj;
+var G__11686_11691 = k_11689;
+var G__11687_11692 = goog.object.get(obj,k_11689);
+goog.object.set(G__11685_11690,G__11686_11691,G__11687_11692);
+
+var G__11693 = (i_11688 + (1));
+i_11688 = G__11693;
+continue;
+} else {
+}
+break;
+}
+
+return new_obj;
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEditableCollection}
+ * @implements {cljs.core.IFind}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.IMap}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.ObjMap = (function (meta,keys,strobj,update_count,__hash){
+this.meta = meta;
+this.keys = keys;
+this.strobj = strobj;
+this.update_count = update_count;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 16123663;
+this.cljs$lang$protocol_mask$partition1$ = 4;
+});
+cljs.core.ObjMap.prototype.cljs$core$IFind$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ObjMap.prototype.cljs$core$IFind$_find$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if(((goog.isString(k)) && ((!((cljs.core.scan_array((1),k,self__.keys) == null)))))){
+return (new cljs.core.MapEntry(k,(self__.strobj[k]),null));
+} else {
+return null;
+}
+});
+
+cljs.core.ObjMap.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.ObjMap.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+if(((goog.isString(k)) && ((!((cljs.core.scan_array((1),k,self__.keys) == null)))))){
+return (self__.strobj[k]);
+} else {
+return not_found;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+var len = self__.keys.length;
+var keys__$1 = self__.keys.sort(cljs.core.obj_map_compare_keys);
+var init__$1 = init;
+while(true){
+if(cljs.core.seq(keys__$1)){
+var k = cljs.core.first(keys__$1);
+var init__$2 = (function (){var G__11696 = init__$1;
+var G__11697 = k;
+var G__11698 = (self__.strobj[k]);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11696,G__11697,G__11698) : f.call(null,G__11696,G__11697,G__11698));
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return cljs.core.deref(init__$2);
+} else {
+var G__11699 = cljs.core.rest(keys__$1);
+var G__11700 = init__$2;
+keys__$1 = G__11699;
+init__$1 = G__11700;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.ObjMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.keys.length;
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_map(coll__$1,other);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IEditableCollection$_as_transient$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.transient$(cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentHashMap.EMPTY,coll__$1));
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.ObjMap.EMPTY,self__.meta);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IMap$_dissoc$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if(((goog.isString(k)) && ((!((cljs.core.scan_array((1),k,self__.keys) == null)))))){
+var new_keys = cljs.core.aclone(self__.keys);
+var new_strobj = cljs.core.obj_clone(self__.strobj,self__.keys);
+new_keys.splice(cljs.core.scan_array((1),k,new_keys),(1));
+
+delete new_strobj[k];
+
+return (new cljs.core.ObjMap(self__.meta,new_keys,new_strobj,(self__.update_count + (1)),null));
+} else {
+return coll__$1;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,k,v){
+var self__ = this;
+var coll__$1 = this;
+if(goog.isString(k)){
+if((((self__.update_count > cljs.core.ObjMap.HASHMAP_THRESHOLD)) || ((self__.keys.length >= cljs.core.ObjMap.HASHMAP_THRESHOLD)))){
+return cljs.core.obj_map__GT_hash_map(coll__$1,k,v);
+} else {
+if((!((cljs.core.scan_array((1),k,self__.keys) == null)))){
+var new_strobj = cljs.core.obj_clone(self__.strobj,self__.keys);
+goog.object.set(new_strobj,k,v);
+
+return (new cljs.core.ObjMap(self__.meta,self__.keys,new_strobj,(self__.update_count + (1)),null));
+} else {
+var new_strobj = cljs.core.obj_clone(self__.strobj,self__.keys);
+var new_keys = cljs.core.aclone(self__.keys);
+goog.object.set(new_strobj,k,v);
+
+new_keys.push(k);
+
+return (new cljs.core.ObjMap(self__.meta,new_keys,new_strobj,(self__.update_count + (1)),null));
+}
+}
+} else {
+return cljs.core.obj_map__GT_hash_map(coll__$1,k,v);
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if(((goog.isString(k)) && ((!((cljs.core.scan_array((1),k,self__.keys) == null)))))){
+return true;
+} else {
+return false;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.keys.length > (0))){
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2(((function (coll__$1){
+return (function (p1__11694_SHARP_){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[p1__11694_SHARP_,(self__.strobj[p1__11694_SHARP_])],null));
+});})(coll__$1))
+,self__.keys.sort(cljs.core.obj_map_compare_keys));
+} else {
+return null;
+}
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.ObjMap(meta__$1,self__.keys,self__.strobj,self__.update_count,self__.__hash));
+});
+
+cljs.core.ObjMap.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.vector_QMARK_(entry)){
+return coll__$1.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(1)));
+} else {
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj,coll__$1,entry);
+}
+});
+
+cljs.core.ObjMap.prototype.call = (function() {
+var G__11701 = null;
+var G__11701__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__11701__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__11701 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11701__2.call(this,self__,k);
+case 3:
+return G__11701__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11701.cljs$core$IFn$_invoke$arity$2 = G__11701__2;
+G__11701.cljs$core$IFn$_invoke$arity$3 = G__11701__3;
+return G__11701;
+})()
+;
+
+cljs.core.ObjMap.prototype.apply = (function (self__,args11695){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11695)));
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.ObjMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"keys","keys",-1586012071,null),new cljs.core.Symbol(null,"strobj","strobj",1088091283,null),new cljs.core.Symbol(null,"update-count","update-count",-411982269,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ObjMap.cljs$lang$type = true;
+
+cljs.core.ObjMap.cljs$lang$ctorStr = "cljs.core/ObjMap";
+
+cljs.core.ObjMap.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ObjMap");
+});
+
+/**
+ * Positional factory function for cljs.core/ObjMap.
+ */
+cljs.core.__GT_ObjMap = (function cljs$core$__GT_ObjMap(meta,keys,strobj,update_count,__hash){
+return (new cljs.core.ObjMap(meta,keys,strobj,update_count,__hash));
+});
+
+cljs.core.ObjMap.EMPTY = (new cljs.core.ObjMap(null,[],{},(0),cljs.core.empty_unordered_hash));
+cljs.core.ObjMap.HASHMAP_THRESHOLD = (8);
+cljs.core.ObjMap.fromObject = (function (ks,obj){
+return (new cljs.core.ObjMap(null,ks,obj,(0),null));
+});
+
+/**
+* @constructor
+*/
+cljs.core.RecordIter = (function (i,record,base_count,fields,ext_map_iter){
+this.i = i;
+this.record = record;
+this.base_count = base_count;
+this.fields = fields;
+this.ext_map_iter = ext_map_iter;
+});
+cljs.core.RecordIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+var or__7806__auto__ = (self__.i < self__.base_count);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return self__.ext_map_iter.hasNext();
+}
+});
+
+cljs.core.RecordIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if((self__.i < self__.base_count)){
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$2(self__.fields,self__.i);
+self__.i = (self__.i + (1));
+
+return (new cljs.core.MapEntry(k,cljs.core._lookup.cljs$core$IFn$_invoke$arity$2(self__.record,k),null));
+} else {
+return self__.ext_map_iter.next();
+}
+});
+
+cljs.core.RecordIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.RecordIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"record","record",861424668,null),new cljs.core.Symbol(null,"base-count","base-count",-1180647182,null),new cljs.core.Symbol(null,"fields","fields",-291534703,null),new cljs.core.Symbol(null,"ext-map-iter","ext-map-iter",-1215982757,null)], null);
+});
+
+cljs.core.RecordIter.cljs$lang$type = true;
+
+cljs.core.RecordIter.cljs$lang$ctorStr = "cljs.core/RecordIter";
+
+cljs.core.RecordIter.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/RecordIter");
+});
+
+/**
+ * Positional factory function for cljs.core/RecordIter.
+ */
+cljs.core.__GT_RecordIter = (function cljs$core$__GT_RecordIter(i,record,base_count,fields,ext_map_iter){
+return (new cljs.core.RecordIter(i,record,base_count,fields,ext_map_iter));
+});
+
+
+/**
+* @constructor
+*/
+cljs.core.ES6EntriesIterator = (function (s){
+this.s = s;
+});
+cljs.core.ES6EntriesIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if((!((self__.s == null)))){
+var vec__11704 = cljs.core.first(self__.s);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11704,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11704,(1),null);
+self__.s = cljs.core.next(self__.s);
+
+return ({"value": [k,v], "done": false});
+} else {
+return ({"value": null, "done": true});
+}
+});
+
+cljs.core.ES6EntriesIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"s","s",-948495851,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ES6EntriesIterator.cljs$lang$type = true;
+
+cljs.core.ES6EntriesIterator.cljs$lang$ctorStr = "cljs.core/ES6EntriesIterator";
+
+cljs.core.ES6EntriesIterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ES6EntriesIterator");
+});
+
+/**
+ * Positional factory function for cljs.core/ES6EntriesIterator.
+ */
+cljs.core.__GT_ES6EntriesIterator = (function cljs$core$__GT_ES6EntriesIterator(s){
+return (new cljs.core.ES6EntriesIterator(s));
+});
+
+cljs.core.es6_entries_iterator = (function cljs$core$es6_entries_iterator(coll){
+return (new cljs.core.ES6EntriesIterator(cljs.core.seq(coll)));
+});
+
+/**
+* @constructor
+*/
+cljs.core.ES6SetEntriesIterator = (function (s){
+this.s = s;
+});
+cljs.core.ES6SetEntriesIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if((!((self__.s == null)))){
+var x = cljs.core.first(self__.s);
+self__.s = cljs.core.next(self__.s);
+
+return ({"value": [x,x], "done": false});
+} else {
+return ({"value": null, "done": true});
+}
+});
+
+cljs.core.ES6SetEntriesIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"s","s",-948495851,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ES6SetEntriesIterator.cljs$lang$type = true;
+
+cljs.core.ES6SetEntriesIterator.cljs$lang$ctorStr = "cljs.core/ES6SetEntriesIterator";
+
+cljs.core.ES6SetEntriesIterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ES6SetEntriesIterator");
+});
+
+/**
+ * Positional factory function for cljs.core/ES6SetEntriesIterator.
+ */
+cljs.core.__GT_ES6SetEntriesIterator = (function cljs$core$__GT_ES6SetEntriesIterator(s){
+return (new cljs.core.ES6SetEntriesIterator(s));
+});
+
+cljs.core.es6_set_entries_iterator = (function cljs$core$es6_set_entries_iterator(coll){
+return (new cljs.core.ES6SetEntriesIterator(cljs.core.seq(coll)));
+});
+cljs.core.array_index_of_nil_QMARK_ = (function cljs$core$array_index_of_nil_QMARK_(arr){
+var len = arr.length;
+var i = (0);
+while(true){
+if((len <= i)){
+return (-1);
+} else {
+if(((arr[i]) == null)){
+return i;
+} else {
+var G__11707 = (i + (2));
+i = G__11707;
+continue;
+
+}
+}
+break;
+}
+});
+cljs.core.array_index_of_keyword_QMARK_ = (function cljs$core$array_index_of_keyword_QMARK_(arr,k){
+var len = arr.length;
+var kstr = k.fqn;
+var i = (0);
+while(true){
+if((len <= i)){
+return (-1);
+} else {
+if(((((arr[i]) instanceof cljs.core.Keyword)) && ((kstr === (arr[i]).fqn)))){
+return i;
+} else {
+var G__11708 = (i + (2));
+i = G__11708;
+continue;
+
+}
+}
+break;
+}
+});
+cljs.core.array_index_of_symbol_QMARK_ = (function cljs$core$array_index_of_symbol_QMARK_(arr,k){
+var len = arr.length;
+var kstr = k.str;
+var i = (0);
+while(true){
+if((len <= i)){
+return (-1);
+} else {
+if(((((arr[i]) instanceof cljs.core.Symbol)) && ((kstr === (arr[i]).str)))){
+return i;
+} else {
+var G__11709 = (i + (2));
+i = G__11709;
+continue;
+
+}
+}
+break;
+}
+});
+cljs.core.array_index_of_identical_QMARK_ = (function cljs$core$array_index_of_identical_QMARK_(arr,k){
+var len = arr.length;
+var i = (0);
+while(true){
+if((len <= i)){
+return (-1);
+} else {
+if((k === (arr[i]))){
+return i;
+} else {
+var G__11710 = (i + (2));
+i = G__11710;
+continue;
+
+}
+}
+break;
+}
+});
+cljs.core.array_index_of_equiv_QMARK_ = (function cljs$core$array_index_of_equiv_QMARK_(arr,k){
+var len = arr.length;
+var i = (0);
+while(true){
+if((len <= i)){
+return (-1);
+} else {
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(k,(arr[i]))){
+return i;
+} else {
+var G__11711 = (i + (2));
+i = G__11711;
+continue;
+
+}
+}
+break;
+}
+});
+cljs.core.array_index_of = (function cljs$core$array_index_of(arr,k){
+if((k instanceof cljs.core.Keyword)){
+return cljs.core.array_index_of_keyword_QMARK_(arr,k);
+} else {
+if(((goog.isString(k)) || (typeof k === 'number'))){
+return cljs.core.array_index_of_identical_QMARK_(arr,k);
+} else {
+if((k instanceof cljs.core.Symbol)){
+return cljs.core.array_index_of_symbol_QMARK_(arr,k);
+} else {
+if((k == null)){
+return cljs.core.array_index_of_nil_QMARK_(arr);
+} else {
+return cljs.core.array_index_of_equiv_QMARK_(arr,k);
+
+}
+}
+}
+}
+});
+cljs.core.array_map_index_of = (function cljs$core$array_map_index_of(m,k){
+return cljs.core.array_index_of(m.arr,k);
+});
+cljs.core.array_extend_kv = (function cljs$core$array_extend_kv(arr,k,v){
+var l = arr.length;
+var narr = (new Array((l + (2))));
+var i_11712 = (0);
+while(true){
+if((i_11712 < l)){
+(narr[i_11712] = (arr[i_11712]));
+
+var G__11713 = (i_11712 + (1));
+i_11712 = G__11713;
+continue;
+} else {
+}
+break;
+}
+
+(narr[l] = k);
+
+(narr[(l + (1))] = v);
+
+return narr;
+});
+cljs.core.array_map_extend_kv = (function cljs$core$array_map_extend_kv(m,k,v){
+return cljs.core.array_extend_kv(m.arr,k,v);
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IVector}
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IFind}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IMapEntry}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.MapEntry = (function (key,val,__hash){
+this.key = key;
+this.val = val;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 166619935;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.MapEntry.prototype.cljs$core$IFind$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.MapEntry.prototype.cljs$core$IFind$_find$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+var G__11715 = k;
+switch (G__11715) {
+case (0):
+return (new cljs.core.MapEntry((0),self__.key,null));
+
+break;
+case (1):
+return (new cljs.core.MapEntry((1),self__.val,null));
+
+break;
+default:
+return null;
+
+}
+});
+
+cljs.core.MapEntry.prototype.indexOf = (function() {
+var G__11717 = null;
+var G__11717__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11717__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11717 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11717__1.call(this,x);
+case 2:
+return G__11717__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11717.cljs$core$IFn$_invoke$arity$1 = G__11717__1;
+G__11717.cljs$core$IFn$_invoke$arity$2 = G__11717__2;
+return G__11717;
+})()
+;
+
+cljs.core.MapEntry.prototype.lastIndexOf = (function() {
+var G__11718 = null;
+var G__11718__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11718__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11718 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11718__1.call(this,x);
+case 2:
+return G__11718__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11718.cljs$core$IFn$_invoke$arity$1 = G__11718__1;
+G__11718.cljs$core$IFn$_invoke$arity$2 = G__11718__2;
+return G__11718;
+})()
+;
+
+cljs.core.MapEntry.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+return node__$1.cljs$core$IIndexed$_nth$arity$3(null,k,null);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (node,k,not_found){
+var self__ = this;
+var node__$1 = this;
+return node__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (node,n){
+var self__ = this;
+var node__$1 = this;
+if((n === (0))){
+return self__.key;
+} else {
+if((n === (1))){
+return self__.val;
+} else {
+throw (new Error("Index out of bounds"));
+
+}
+}
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (node,n,not_found){
+var self__ = this;
+var node__$1 = this;
+if((n === (0))){
+return self__.key;
+} else {
+if((n === (1))){
+return self__.val;
+} else {
+return not_found;
+
+}
+}
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IVector$_assoc_n$arity$3 = (function (node,n,v){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null).cljs$core$IVector$_assoc_n$arity$3(null,n,v);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IMeta$_meta$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return null;
+});
+
+cljs.core.MapEntry.prototype.cljs$core$ICounted$_count$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (2);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IMapEntry$_key$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.key;
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IMapEntry$_val$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.val;
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IStack$_peek$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.val;
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IStack$_pop$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key], null);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (new cljs.core.IndexedSeq([self__.val,self__.key],(0),null));
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return null;
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (node,f){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2(node__$1,f);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (node,f,start){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3(node__$1,f,start);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (node,k,v){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null),k,v);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+return (((k === (0))) || ((k === (1))));
+});
+
+cljs.core.MapEntry.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (new cljs.core.IndexedSeq([self__.key,self__.val],(0),null));
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (node,meta){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.with_meta(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null),meta);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$ICollection$_conj$arity$2 = (function (node,o){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val,o], null);
+});
+
+cljs.core.MapEntry.prototype.call = (function() {
+var G__11719 = null;
+var G__11719__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var node = self____$1;
+return node.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+var G__11719__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var node = self____$1;
+return node.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+G__11719 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11719__2.call(this,self__,k);
+case 3:
+return G__11719__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11719.cljs$core$IFn$_invoke$arity$2 = G__11719__2;
+G__11719.cljs$core$IFn$_invoke$arity$3 = G__11719__3;
+return G__11719;
+})()
+;
+
+cljs.core.MapEntry.prototype.apply = (function (self__,args11714){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11714)));
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var node = this;
+return node.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var node = this;
+return node.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.MapEntry.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"key","key",124488940,null),new cljs.core.Symbol(null,"val","val",1769233139,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.MapEntry.cljs$lang$type = true;
+
+cljs.core.MapEntry.cljs$lang$ctorStr = "cljs.core/MapEntry";
+
+cljs.core.MapEntry.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/MapEntry");
+});
+
+/**
+ * Positional factory function for cljs.core/MapEntry.
+ */
+cljs.core.__GT_MapEntry = (function cljs$core$__GT_MapEntry(key,val,__hash){
+return (new cljs.core.MapEntry(key,val,__hash));
+});
+
+/**
+ * Returns true if x satisfies IMapEntry
+ */
+cljs.core.map_entry_QMARK_ = (function cljs$core$map_entry_QMARK_(x){
+if((!((x == null)))){
+if((((x.cljs$lang$protocol_mask$partition0$ & (2048))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IMapEntry$)))){
+return true;
+} else {
+return false;
+}
+} else {
+return false;
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.PersistentArrayMapSeq = (function (arr,i,_meta){
+this.arr = arr;
+this.i = i;
+this._meta = _meta;
+this.cljs$lang$protocol_mask$partition0$ = 32374990;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.PersistentArrayMapSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.indexOf = (function() {
+var G__11721 = null;
+var G__11721__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11721__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11721 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11721__1.call(this,x);
+case 2:
+return G__11721__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11721.cljs$core$IFn$_invoke$arity$1 = G__11721__1;
+G__11721.cljs$core$IFn$_invoke$arity$2 = G__11721__2;
+return G__11721;
+})()
+;
+
+cljs.core.PersistentArrayMapSeq.prototype.lastIndexOf = (function() {
+var G__11722 = null;
+var G__11722__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11722__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11722 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11722__1.call(this,x);
+case 2:
+return G__11722__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11722.cljs$core$IFn$_invoke$arity$1 = G__11722__1;
+G__11722.cljs$core$IFn$_invoke$arity$2 = G__11722__2;
+return G__11722;
+})()
+;
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__._meta;
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.i < (self__.arr.length - (2)))){
+return (new cljs.core.PersistentArrayMapSeq(self__.arr,(self__.i + (2)),self__._meta));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return ((self__.arr.length - self__.i) / (2));
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.hash_ordered_coll(coll__$1);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__._meta);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.MapEntry((self__.arr[self__.i]),(self__.arr[(self__.i + (1))]),null));
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.i < (self__.arr.length - (2)))){
+return (new cljs.core.PersistentArrayMapSeq(self__.arr,(self__.i + (2)),self__._meta));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,new_meta){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentArrayMapSeq(self__.arr,self__.i,new_meta));
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.PersistentArrayMapSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"_meta","_meta",-1716892533,null)], null);
+});
+
+cljs.core.PersistentArrayMapSeq.cljs$lang$type = true;
+
+cljs.core.PersistentArrayMapSeq.cljs$lang$ctorStr = "cljs.core/PersistentArrayMapSeq";
+
+cljs.core.PersistentArrayMapSeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentArrayMapSeq");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentArrayMapSeq.
+ */
+cljs.core.__GT_PersistentArrayMapSeq = (function cljs$core$__GT_PersistentArrayMapSeq(arr,i,_meta){
+return (new cljs.core.PersistentArrayMapSeq(arr,i,_meta));
+});
+
+var G__11723_11726 = cljs.core.PersistentArrayMapSeq.prototype;
+var G__11724_11727 = cljs.core.ITER_SYMBOL;
+var G__11725_11728 = ((function (G__11723_11726,G__11724_11727){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11723_11726,G__11724_11727))
+;
+goog.object.set(G__11723_11726,G__11724_11727,G__11725_11728);
+cljs.core.persistent_array_map_seq = (function cljs$core$persistent_array_map_seq(arr,i,_meta){
+if((i <= (arr.length - (2)))){
+return (new cljs.core.PersistentArrayMapSeq(arr,i,_meta));
+} else {
+return null;
+}
+});
+
+
+/**
+* @constructor
+*/
+cljs.core.PersistentArrayMapIterator = (function (arr,i,cnt){
+this.arr = arr;
+this.i = i;
+this.cnt = cnt;
+});
+cljs.core.PersistentArrayMapIterator.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return (self__.i < self__.cnt);
+});
+
+cljs.core.PersistentArrayMapIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var ret = (new cljs.core.MapEntry((self__.arr[self__.i]),(self__.arr[(self__.i + (1))]),null));
+self__.i = (self__.i + (2));
+
+return ret;
+});
+
+cljs.core.PersistentArrayMapIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null)], null);
+});
+
+cljs.core.PersistentArrayMapIterator.cljs$lang$type = true;
+
+cljs.core.PersistentArrayMapIterator.cljs$lang$ctorStr = "cljs.core/PersistentArrayMapIterator";
+
+cljs.core.PersistentArrayMapIterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentArrayMapIterator");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentArrayMapIterator.
+ */
+cljs.core.__GT_PersistentArrayMapIterator = (function cljs$core$__GT_PersistentArrayMapIterator(arr,i,cnt){
+return (new cljs.core.PersistentArrayMapIterator(arr,i,cnt));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEditableCollection}
+ * @implements {cljs.core.IFind}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.IMap}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.PersistentArrayMap = (function (meta,cnt,arr,__hash){
+this.meta = meta;
+this.cnt = cnt;
+this.arr = arr;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 16647951;
+this.cljs$lang$protocol_mask$partition1$ = 139268;
+});
+cljs.core.PersistentArrayMap.prototype.cljs$core$IFind$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IFind$_find$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+var idx = cljs.core.array_map_index_of(coll__$1,k);
+if((idx === (-1))){
+return null;
+} else {
+return (new cljs.core.MapEntry((self__.arr[idx]),(self__.arr[(idx + (1))]),null));
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentArrayMap.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentArrayMap.prototype.keys = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.keys(coll));
+});
+
+cljs.core.PersistentArrayMap.prototype.entries = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_entries_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentArrayMap.prototype.values = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.vals(coll));
+});
+
+cljs.core.PersistentArrayMap.prototype.has = (function (k){
+var self__ = this;
+var coll = this;
+return cljs.core.contains_QMARK_(coll,k);
+});
+
+cljs.core.PersistentArrayMap.prototype.get = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentArrayMap.prototype.forEach = (function (f){
+var self__ = this;
+var coll = this;
+var seq__11730 = cljs.core.seq(coll);
+var chunk__11731 = null;
+var count__11732 = (0);
+var i__11733 = (0);
+while(true){
+if((i__11733 < count__11732)){
+var vec__11734 = chunk__11731.cljs$core$IIndexed$_nth$arity$2(null,i__11733);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11734,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11734,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+
+var G__11746 = seq__11730;
+var G__11747 = chunk__11731;
+var G__11748 = count__11732;
+var G__11749 = (i__11733 + (1));
+seq__11730 = G__11746;
+chunk__11731 = G__11747;
+count__11732 = G__11748;
+i__11733 = G__11749;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__11730);
+if(temp__4657__auto__){
+var seq__11730__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__11730__$1)){
+var c__8664__auto__ = cljs.core.chunk_first(seq__11730__$1);
+var G__11750 = cljs.core.chunk_rest(seq__11730__$1);
+var G__11751 = c__8664__auto__;
+var G__11752 = cljs.core.count(c__8664__auto__);
+var G__11753 = (0);
+seq__11730 = G__11750;
+chunk__11731 = G__11751;
+count__11732 = G__11752;
+i__11733 = G__11753;
+continue;
+} else {
+var vec__11737 = cljs.core.first(seq__11730__$1);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11737,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11737,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+
+var G__11754 = cljs.core.next(seq__11730__$1);
+var G__11755 = null;
+var G__11756 = (0);
+var G__11757 = (0);
+seq__11730 = G__11754;
+chunk__11731 = G__11755;
+count__11732 = G__11756;
+i__11733 = G__11757;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+var idx = cljs.core.array_map_index_of(coll__$1,k);
+if((idx === (-1))){
+return not_found;
+} else {
+return (self__.arr[(idx + (1))]);
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+var len = self__.arr.length;
+var i = (0);
+var init__$1 = init;
+while(true){
+if((i < len)){
+var init__$2 = (function (){var G__11740 = init__$1;
+var G__11741 = (self__.arr[i]);
+var G__11742 = (self__.arr[(i + (1))]);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11740,G__11741,G__11742) : f.call(null,G__11740,G__11741,G__11742));
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return cljs.core.deref(init__$2);
+} else {
+var G__11758 = (i + (2));
+var G__11759 = init__$2;
+i = G__11758;
+init__$1 = G__11759;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return (new cljs.core.PersistentArrayMapIterator(self__.arr,(0),(self__.cnt * (2))));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentArrayMap(self__.meta,self__.cnt,self__.arr,self__.__hash));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.cnt;
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+if(((cljs.core.map_QMARK_(other)) && ((!(cljs.core.record_QMARK_(other)))))){
+var alen = self__.arr.length;
+var other__$1 = other;
+if((self__.cnt === other__$1.cljs$core$ICounted$_count$arity$1(null))){
+var i = (0);
+while(true){
+if((i < alen)){
+var v = other__$1.cljs$core$ILookup$_lookup$arity$3(null,(self__.arr[i]),cljs.core.lookup_sentinel);
+if((!((v === cljs.core.lookup_sentinel)))){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2((self__.arr[(i + (1))]),v)){
+var G__11760 = (i + (2));
+i = G__11760;
+continue;
+} else {
+return false;
+}
+} else {
+return false;
+}
+} else {
+return true;
+}
+break;
+}
+} else {
+return false;
+}
+} else {
+return false;
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IEditableCollection$_as_transient$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.TransientArrayMap({},self__.arr.length,cljs.core.aclone(self__.arr)));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.PersistentArrayMap.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.iter_reduce.cljs$core$IFn$_invoke$arity$2(coll__$1,f);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.iter_reduce.cljs$core$IFn$_invoke$arity$3(coll__$1,f,start);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IMap$_dissoc$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+var idx = cljs.core.array_map_index_of(coll__$1,k);
+if((idx >= (0))){
+var len = self__.arr.length;
+var new_len = (len - (2));
+if((new_len === (0))){
+return coll__$1.cljs$core$IEmptyableCollection$_empty$arity$1(null);
+} else {
+var new_arr = (new Array(new_len));
+var s = (0);
+var d = (0);
+while(true){
+if((s >= len)){
+return (new cljs.core.PersistentArrayMap(self__.meta,(self__.cnt - (1)),new_arr,null));
+} else {
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(k,(self__.arr[s]))){
+var G__11761 = (s + (2));
+var G__11762 = d;
+s = G__11761;
+d = G__11762;
+continue;
+} else {
+(new_arr[d] = (self__.arr[s]));
+
+(new_arr[(d + (1))] = (self__.arr[(s + (1))]));
+
+var G__11763 = (s + (2));
+var G__11764 = (d + (2));
+s = G__11763;
+d = G__11764;
+continue;
+
+}
+}
+break;
+}
+}
+} else {
+return coll__$1;
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,k,v){
+var self__ = this;
+var coll__$1 = this;
+var idx = cljs.core.array_map_index_of(coll__$1,k);
+if((idx === (-1))){
+if((self__.cnt < cljs.core.PersistentArrayMap.HASHMAP_THRESHOLD)){
+var arr__$1 = cljs.core.array_map_extend_kv(coll__$1,k,v);
+return (new cljs.core.PersistentArrayMap(self__.meta,(self__.cnt + (1)),arr__$1,null));
+} else {
+return cljs.core._with_meta(cljs.core._assoc(cljs.core.into.cljs$core$IFn$_invoke$arity$2(cljs.core.PersistentHashMap.EMPTY,coll__$1),k,v),self__.meta);
+}
+} else {
+if((v === (self__.arr[(idx + (1))]))){
+return coll__$1;
+} else {
+var arr__$1 = (function (){var G__11745 = cljs.core.aclone(self__.arr);
+(G__11745[(idx + (1))] = v);
+
+return G__11745;
+})();
+return (new cljs.core.PersistentArrayMap(self__.meta,self__.cnt,arr__$1,null));
+
+}
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return (!((cljs.core.array_map_index_of(coll__$1,k) === (-1))));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.persistent_array_map_seq(self__.arr,(0),null);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentArrayMap(meta__$1,self__.cnt,self__.arr,self__.__hash));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.vector_QMARK_(entry)){
+return coll__$1.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(1)));
+} else {
+var ret = coll__$1;
+var es = cljs.core.seq(entry);
+while(true){
+if((es == null)){
+return ret;
+} else {
+var e = cljs.core.first(es);
+if(cljs.core.vector_QMARK_(e)){
+var G__11765 = ret.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(1)));
+var G__11766 = cljs.core.next(es);
+ret = G__11765;
+es = G__11766;
+continue;
+} else {
+throw (new Error("conj on a map takes map entries or seqables of map entries"));
+}
+}
+break;
+}
+}
+});
+
+cljs.core.PersistentArrayMap.prototype.call = (function() {
+var G__11767 = null;
+var G__11767__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__11767__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__11767 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11767__2.call(this,self__,k);
+case 3:
+return G__11767__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11767.cljs$core$IFn$_invoke$arity$2 = G__11767__2;
+G__11767.cljs$core$IFn$_invoke$arity$3 = G__11767__3;
+return G__11767;
+})()
+;
+
+cljs.core.PersistentArrayMap.prototype.apply = (function (self__,args11729){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11729)));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentArrayMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentArrayMap.cljs$lang$type = true;
+
+cljs.core.PersistentArrayMap.cljs$lang$ctorStr = "cljs.core/PersistentArrayMap";
+
+cljs.core.PersistentArrayMap.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentArrayMap");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentArrayMap.
+ */
+cljs.core.__GT_PersistentArrayMap = (function cljs$core$__GT_PersistentArrayMap(meta,cnt,arr,__hash){
+return (new cljs.core.PersistentArrayMap(meta,cnt,arr,__hash));
+});
+
+cljs.core.PersistentArrayMap.EMPTY = (new cljs.core.PersistentArrayMap(null,(0),[],cljs.core.empty_unordered_hash));
+cljs.core.PersistentArrayMap.HASHMAP_THRESHOLD = (8);
+cljs.core.PersistentArrayMap.fromArray = (function (arr,no_clone,no_check){
+var arr__$1 = ((no_clone)?arr:cljs.core.aclone(arr));
+var arr__$2 = ((no_check)?arr__$1:(function (){var ret = [];
+var i_11768 = (0);
+while(true){
+if((i_11768 < arr__$1.length)){
+var k_11769 = (arr__$1[i_11768]);
+var v_11770 = (arr__$1[(i_11768 + (1))]);
+var idx_11771 = cljs.core.array_index_of(ret,k_11769);
+if((idx_11771 === (-1))){
+ret.push(k_11769);
+
+ret.push(v_11770);
+} else {
+}
+
+var G__11772 = (i_11768 + (2));
+i_11768 = G__11772;
+continue;
+} else {
+}
+break;
+}
+
+return ret;
+})());
+var cnt = (arr__$2.length / (2));
+return (new cljs.core.PersistentArrayMap(null,cnt,arr__$2,null));
+});
+cljs.core.PersistentArrayMap.createWithCheck = (function (arr){
+var ret = [];
+var i_11774 = (0);
+while(true){
+if((i_11774 < arr.length)){
+var k_11775 = (arr[i_11774]);
+var v_11776 = (arr[(i_11774 + (1))]);
+var idx_11777 = cljs.core.array_index_of(ret,k_11775);
+if((idx_11777 === (-1))){
+var G__11773_11778 = ret;
+G__11773_11778.push(k_11775);
+
+G__11773_11778.push(v_11776);
+
+} else {
+throw (new Error(["Duplicate key: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(k_11775)].join('')));
+}
+
+var G__11779 = (i_11774 + (2));
+i_11774 = G__11779;
+continue;
+} else {
+}
+break;
+}
+
+var cnt = (arr.length / (2));
+return (new cljs.core.PersistentArrayMap(null,cnt,arr,null));
+});
+cljs.core.PersistentArrayMap.createAsIfByAssoc = (function (arr){
+var ret = [];
+var i_11781 = (0);
+while(true){
+if((i_11781 < arr.length)){
+var k_11782 = (arr[i_11781]);
+var v_11783 = (arr[(i_11781 + (1))]);
+var idx_11784 = cljs.core.array_index_of(ret,k_11782);
+if((idx_11784 === (-1))){
+var G__11780_11785 = ret;
+G__11780_11785.push(k_11782);
+
+G__11780_11785.push(v_11783);
+
+} else {
+(ret[(idx_11784 + (1))] = v_11783);
+}
+
+var G__11786 = (i_11781 + (2));
+i_11781 = G__11786;
+continue;
+} else {
+}
+break;
+}
+
+return (new cljs.core.PersistentArrayMap(null,(ret.length / (2)),ret,null));
+});
+var G__11787_11790 = cljs.core.PersistentArrayMap.prototype;
+var G__11788_11791 = cljs.core.ITER_SYMBOL;
+var G__11789_11792 = ((function (G__11787_11790,G__11788_11791){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11787_11790,G__11788_11791))
+;
+goog.object.set(G__11787_11790,G__11788_11791,G__11789_11792);
+
+/**
+* @constructor
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ITransientMap}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ITransientCollection}
+ * @implements {cljs.core.ITransientAssociative}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.TransientArrayMap = (function (editable_QMARK_,len,arr){
+this.editable_QMARK_ = editable_QMARK_;
+this.len = len;
+this.arr = arr;
+this.cljs$lang$protocol_mask$partition0$ = 259;
+this.cljs$lang$protocol_mask$partition1$ = 56;
+});
+cljs.core.TransientArrayMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+return cljs.core.quot(self__.len,(2));
+} else {
+throw (new Error("count after persistent!"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (tcoll,k){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (tcoll,k,not_found){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+var idx = cljs.core.array_map_index_of(tcoll__$1,k);
+if((idx === (-1))){
+return not_found;
+} else {
+return (self__.arr[(idx + (1))]);
+}
+} else {
+throw (new Error("lookup after persistent!"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ITransientCollection$_conj_BANG_$arity$2 = (function (tcoll,o){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+if(cljs.core.map_entry_QMARK_(o)){
+return tcoll__$1.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3(null,cljs.core.key(o),cljs.core.val(o));
+} else {
+if(cljs.core.vector_QMARK_(o)){
+return tcoll__$1.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3(null,(o.cljs$core$IFn$_invoke$arity$1 ? o.cljs$core$IFn$_invoke$arity$1((0)) : o.call(null,(0))),(o.cljs$core$IFn$_invoke$arity$1 ? o.cljs$core$IFn$_invoke$arity$1((1)) : o.call(null,(1))));
+} else {
+var es = cljs.core.seq(o);
+var tcoll__$2 = tcoll__$1;
+while(true){
+var temp__4655__auto__ = cljs.core.first(es);
+if(cljs.core.truth_(temp__4655__auto__)){
+var e = temp__4655__auto__;
+var G__11795 = cljs.core.next(es);
+var G__11796 = tcoll__$2.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3(null,cljs.core.key(e),cljs.core.val(e));
+es = G__11795;
+tcoll__$2 = G__11796;
+continue;
+} else {
+return tcoll__$2;
+}
+break;
+}
+
+}
+}
+} else {
+throw (new Error("conj! after persistent!"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ITransientCollection$_persistent_BANG_$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+self__.editable_QMARK_ = false;
+
+return (new cljs.core.PersistentArrayMap(null,cljs.core.quot(self__.len,(2)),self__.arr,null));
+} else {
+throw (new Error("persistent! called twice"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3 = (function (tcoll,key,val){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+var idx = cljs.core.array_map_index_of(tcoll__$1,key);
+if((idx === (-1))){
+if(((self__.len + (2)) <= ((2) * cljs.core.PersistentArrayMap.HASHMAP_THRESHOLD))){
+self__.len = (self__.len + (2));
+
+self__.arr.push(key);
+
+self__.arr.push(val);
+
+return tcoll__$1;
+} else {
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(cljs.core.array__GT_transient_hash_map(self__.len,self__.arr),key,val);
+}
+} else {
+if((val === (self__.arr[(idx + (1))]))){
+return tcoll__$1;
+} else {
+(self__.arr[(idx + (1))] = val);
+
+return tcoll__$1;
+}
+}
+} else {
+throw (new Error("assoc! after persistent!"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$ITransientMap$_dissoc_BANG_$arity$2 = (function (tcoll,key){
+var self__ = this;
+var tcoll__$1 = this;
+if(cljs.core.truth_(self__.editable_QMARK_)){
+var idx = cljs.core.array_map_index_of(tcoll__$1,key);
+if((idx >= (0))){
+(self__.arr[idx] = (self__.arr[(self__.len - (2))]));
+
+(self__.arr[(idx + (1))] = (self__.arr[(self__.len - (1))]));
+
+var G__11794_11797 = self__.arr;
+G__11794_11797.pop();
+
+G__11794_11797.pop();
+
+
+self__.len = (self__.len - (2));
+} else {
+}
+
+return tcoll__$1;
+} else {
+throw (new Error("dissoc! after persistent!"));
+}
+});
+
+cljs.core.TransientArrayMap.prototype.call = (function() {
+var G__11798 = null;
+var G__11798__2 = (function (self__,key){
+var self__ = this;
+var self____$1 = this;
+var tcoll = self____$1;
+return tcoll.cljs$core$ILookup$_lookup$arity$3(null,key,null);
+});
+var G__11798__3 = (function (self__,key,not_found){
+var self__ = this;
+var self____$1 = this;
+var tcoll = self____$1;
+return tcoll.cljs$core$ILookup$_lookup$arity$3(null,key,not_found);
+});
+G__11798 = function(self__,key,not_found){
+switch(arguments.length){
+case 2:
+return G__11798__2.call(this,self__,key);
+case 3:
+return G__11798__3.call(this,self__,key,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11798.cljs$core$IFn$_invoke$arity$2 = G__11798__2;
+G__11798.cljs$core$IFn$_invoke$arity$3 = G__11798__3;
+return G__11798;
+})()
+;
+
+cljs.core.TransientArrayMap.prototype.apply = (function (self__,args11793){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11793)));
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$IFn$_invoke$arity$1 = (function (key){
+var self__ = this;
+var tcoll = this;
+return tcoll.cljs$core$ILookup$_lookup$arity$3(null,key,null);
+});
+
+cljs.core.TransientArrayMap.prototype.cljs$core$IFn$_invoke$arity$2 = (function (key,not_found){
+var self__ = this;
+var tcoll = this;
+return tcoll.cljs$core$ILookup$_lookup$arity$3(null,key,not_found);
+});
+
+cljs.core.TransientArrayMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"editable?","editable?",-164945806,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"len","len",-1230778691,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"arr","arr",2115492975,null)], null);
+});
+
+cljs.core.TransientArrayMap.cljs$lang$type = true;
+
+cljs.core.TransientArrayMap.cljs$lang$ctorStr = "cljs.core/TransientArrayMap";
+
+cljs.core.TransientArrayMap.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/TransientArrayMap");
+});
+
+/**
+ * Positional factory function for cljs.core/TransientArrayMap.
+ */
+cljs.core.__GT_TransientArrayMap = (function cljs$core$__GT_TransientArrayMap(editable_QMARK_,len,arr){
+return (new cljs.core.TransientArrayMap(editable_QMARK_,len,arr));
+});
+
+cljs.core.array__GT_transient_hash_map = (function cljs$core$array__GT_transient_hash_map(len,arr){
+var out = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+var i = (0);
+while(true){
+if((i < len)){
+var G__11799 = cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(out,(arr[i]),(arr[(i + (1))]));
+var G__11800 = (i + (2));
+out = G__11799;
+i = G__11800;
+continue;
+} else {
+return out;
+}
+break;
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.Box = (function (val){
+this.val = val;
+});
+
+cljs.core.Box.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"val","val",1769233139,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Box.cljs$lang$type = true;
+
+cljs.core.Box.cljs$lang$ctorStr = "cljs.core/Box";
+
+cljs.core.Box.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Box");
+});
+
+/**
+ * Positional factory function for cljs.core/Box.
+ */
+cljs.core.__GT_Box = (function cljs$core$__GT_Box(val){
+return (new cljs.core.Box(val));
+});
+
+
+
+
+
+
+cljs.core.key_test = (function cljs$core$key_test(key,other){
+if((key === other)){
+return true;
+} else {
+if(cljs.core.keyword_identical_QMARK_(key,other)){
+return true;
+} else {
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(key,other);
+
+}
+}
+});
+cljs.core.mask = (function cljs$core$mask(hash,shift){
+return ((hash >>> shift) & (31));
+});
+cljs.core.clone_and_set = (function cljs$core$clone_and_set(var_args){
+var G__11802 = arguments.length;
+switch (G__11802) {
+case 3:
+return cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 5:
+return cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3 = (function (arr,i,a){
+var G__11803 = cljs.core.aclone(arr);
+(G__11803[i] = a);
+
+return G__11803;
+});
+
+cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$5 = (function (arr,i,a,j,b){
+var G__11804 = cljs.core.aclone(arr);
+(G__11804[i] = a);
+
+(G__11804[j] = b);
+
+return G__11804;
+});
+
+cljs.core.clone_and_set.cljs$lang$maxFixedArity = 5;
+
+cljs.core.remove_pair = (function cljs$core$remove_pair(arr,i){
+var new_arr = (new Array((arr.length - (2))));
+cljs.core.array_copy(arr,(0),new_arr,(0),((2) * i));
+
+cljs.core.array_copy(arr,((2) * (i + (1))),new_arr,((2) * i),(new_arr.length - ((2) * i)));
+
+return new_arr;
+});
+cljs.core.bitmap_indexed_node_index = (function cljs$core$bitmap_indexed_node_index(bitmap,bit){
+return cljs.core.bit_count((bitmap & (bit - (1))));
+});
+cljs.core.bitpos = (function cljs$core$bitpos(hash,shift){
+return ((1) << ((hash >>> shift) & 0x01f));
+});
+cljs.core.edit_and_set = (function cljs$core$edit_and_set(var_args){
+var G__11807 = arguments.length;
+switch (G__11807) {
+case 4:
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 6:
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4 = (function (inode,edit,i,a){
+var editable = inode.ensure_editable(edit);
+(editable.arr[i] = a);
+
+return editable;
+});
+
+cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$6 = (function (inode,edit,i,a,j,b){
+var editable = inode.ensure_editable(edit);
+(editable.arr[i] = a);
+
+(editable.arr[j] = b);
+
+return editable;
+});
+
+cljs.core.edit_and_set.cljs$lang$maxFixedArity = 6;
+
+cljs.core.inode_kv_reduce = (function cljs$core$inode_kv_reduce(arr,f,init){
+var len = arr.length;
+var i = (0);
+var init__$1 = init;
+while(true){
+if((i < len)){
+var init__$2 = (function (){var k = (arr[i]);
+if((!((k == null)))){
+var G__11809 = init__$1;
+var G__11810 = k;
+var G__11811 = (arr[(i + (1))]);
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11809,G__11810,G__11811) : f.call(null,G__11809,G__11810,G__11811));
+} else {
+var node = (arr[(i + (1))]);
+if((!((node == null)))){
+return node.kv_reduce(f,init__$1);
+} else {
+return init__$1;
+}
+}
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return init__$2;
+} else {
+var G__11812 = (i + (2));
+var G__11813 = init__$2;
+i = G__11812;
+init__$1 = G__11813;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.NodeIterator = (function (arr,i,next_entry,next_iter){
+this.arr = arr;
+this.i = i;
+this.next_entry = next_entry;
+this.next_iter = next_iter;
+});
+cljs.core.NodeIterator.prototype.advance = (function (){
+var self__ = this;
+var this$ = this;
+var len = self__.arr.length;
+while(true){
+if((self__.i < len)){
+var key = (self__.arr[self__.i]);
+var node_or_val = (self__.arr[(self__.i + (1))]);
+var found = (((!((key == null))))?self__.next_entry = (new cljs.core.MapEntry(key,node_or_val,null)):(((!((node_or_val == null))))?(function (){var new_iter = cljs.core._iterator(node_or_val);
+if(new_iter.hasNext()){
+return self__.next_iter = new_iter;
+} else {
+return false;
+}
+})():false
+));
+self__.i = (self__.i + (2));
+
+if(found){
+return true;
+} else {
+continue;
+}
+} else {
+return false;
+}
+break;
+}
+});
+
+cljs.core.NodeIterator.prototype.hasNext = (function (){
+var self__ = this;
+var this$ = this;
+var or__7806__auto__ = (!((self__.next_entry == null)));
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = (!((self__.next_iter == null)));
+if(or__7806__auto____$1){
+return or__7806__auto____$1;
+} else {
+return this$.advance();
+}
+}
+});
+
+cljs.core.NodeIterator.prototype.next = (function (){
+var self__ = this;
+var this$ = this;
+if((!((self__.next_entry == null)))){
+var ret = self__.next_entry;
+self__.next_entry = null;
+
+return ret;
+} else {
+if((!((self__.next_iter == null)))){
+var ret = self__.next_iter.next();
+if(self__.next_iter.hasNext()){
+} else {
+self__.next_iter = null;
+}
+
+return ret;
+} else {
+if(this$.advance()){
+return this$.next();
+} else {
+throw (new Error("No such element"));
+
+}
+}
+}
+});
+
+cljs.core.NodeIterator.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.NodeIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"next-entry","next-entry",1091342476,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"next-iter","next-iter",1526626239,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.NodeIterator.cljs$lang$type = true;
+
+cljs.core.NodeIterator.cljs$lang$ctorStr = "cljs.core/NodeIterator";
+
+cljs.core.NodeIterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/NodeIterator");
+});
+
+/**
+ * Positional factory function for cljs.core/NodeIterator.
+ */
+cljs.core.__GT_NodeIterator = (function cljs$core$__GT_NodeIterator(arr,i,next_entry,next_iter){
+return (new cljs.core.NodeIterator(arr,i,next_entry,next_iter));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIterable}
+*/
+cljs.core.BitmapIndexedNode = (function (edit,bitmap,arr){
+this.edit = edit;
+this.bitmap = bitmap;
+this.arr = arr;
+this.cljs$lang$protocol_mask$partition1$ = 131072;
+this.cljs$lang$protocol_mask$partition0$ = 0;
+});
+cljs.core.BitmapIndexedNode.prototype.ensure_editable = (function (e){
+var self__ = this;
+var inode = this;
+if((e === self__.edit)){
+return inode;
+} else {
+var n = cljs.core.bit_count(self__.bitmap);
+var new_arr = (new Array((((n < (0)))?(4):((2) * (n + (1))))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),((2) * n));
+
+return (new cljs.core.BitmapIndexedNode(e,self__.bitmap,new_arr));
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_without_BANG_ = (function (edit__$1,shift,hash,key,removed_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+if(((self__.bitmap & bit) === (0))){
+return inode;
+} else {
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+var n = val_or_node.inode_without_BANG_(edit__$1,(shift + (5)),hash,key,removed_leaf_QMARK_);
+if((n === val_or_node)){
+return inode;
+} else {
+if((!((n == null)))){
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,(((2) * idx) + (1)),n);
+} else {
+if((self__.bitmap === bit)){
+return null;
+} else {
+return inode.edit_and_remove_pair(edit__$1,bit,idx);
+
+}
+}
+}
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+removed_leaf_QMARK_.val = true;
+
+return inode.edit_and_remove_pair(edit__$1,bit,idx);
+} else {
+return inode;
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.edit_and_remove_pair = (function (e,bit,i){
+var self__ = this;
+var inode = this;
+if((self__.bitmap === bit)){
+return null;
+} else {
+var editable = inode.ensure_editable(e);
+var earr = editable.arr;
+var len = earr.length;
+editable.bitmap = (bit ^ editable.bitmap);
+
+cljs.core.array_copy(earr,((2) * (i + (1))),earr,((2) * i),(len - ((2) * (i + (1)))));
+
+(earr[(len - (2))] = null);
+
+(earr[(len - (1))] = null);
+
+return editable;
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_seq = (function (){
+var self__ = this;
+var inode = this;
+return cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1(self__.arr);
+});
+
+cljs.core.BitmapIndexedNode.prototype.kv_reduce = (function (f,init){
+var self__ = this;
+var inode = this;
+return cljs.core.inode_kv_reduce(self__.arr,f,init);
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_lookup = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+if(((self__.bitmap & bit) === (0))){
+return not_found;
+} else {
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+return val_or_node.inode_lookup((shift + (5)),hash,key,not_found);
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+return val_or_node;
+} else {
+return not_found;
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_assoc_BANG_ = (function (edit__$1,shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+if(((self__.bitmap & bit) === (0))){
+var n = cljs.core.bit_count(self__.bitmap);
+if((((2) * n) < self__.arr.length)){
+var editable = inode.ensure_editable(edit__$1);
+var earr = editable.arr;
+added_leaf_QMARK_.val = true;
+
+cljs.core.array_copy_downward(earr,((2) * idx),earr,((2) * (idx + (1))),((2) * (n - idx)));
+
+(earr[((2) * idx)] = key);
+
+(earr[(((2) * idx) + (1))] = val);
+
+editable.bitmap = (editable.bitmap | bit);
+
+return editable;
+} else {
+if((n >= (16))){
+var nodes = [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null];
+var jdx = ((hash >>> shift) & 0x01f);
+(nodes[jdx] = cljs.core.BitmapIndexedNode.EMPTY.inode_assoc_BANG_(edit__$1,(shift + (5)),hash,key,val,added_leaf_QMARK_));
+
+var i_11814 = (0);
+var j_11815 = (0);
+while(true){
+if((i_11814 < (32))){
+if((((self__.bitmap >>> i_11814) & (1)) === (0))){
+var G__11816 = (i_11814 + (1));
+var G__11817 = j_11815;
+i_11814 = G__11816;
+j_11815 = G__11817;
+continue;
+} else {
+(nodes[i_11814] = (((!(((self__.arr[j_11815]) == null))))?cljs.core.BitmapIndexedNode.EMPTY.inode_assoc_BANG_(edit__$1,(shift + (5)),cljs.core.hash((self__.arr[j_11815])),(self__.arr[j_11815]),(self__.arr[(j_11815 + (1))]),added_leaf_QMARK_):(self__.arr[(j_11815 + (1))])));
+
+var G__11818 = (i_11814 + (1));
+var G__11819 = (j_11815 + (2));
+i_11814 = G__11818;
+j_11815 = G__11819;
+continue;
+}
+} else {
+}
+break;
+}
+
+return (new cljs.core.ArrayNode(edit__$1,(n + (1)),nodes));
+} else {
+var new_arr = (new Array(((2) * (n + (4)))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),((2) * idx));
+
+(new_arr[((2) * idx)] = key);
+
+(new_arr[(((2) * idx) + (1))] = val);
+
+cljs.core.array_copy(self__.arr,((2) * idx),new_arr,((2) * (idx + (1))),((2) * (n - idx)));
+
+added_leaf_QMARK_.val = true;
+
+var editable = inode.ensure_editable(edit__$1);
+editable.arr = new_arr;
+
+editable.bitmap = (editable.bitmap | bit);
+
+return editable;
+
+}
+}
+} else {
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+var n = val_or_node.inode_assoc_BANG_(edit__$1,(shift + (5)),hash,key,val,added_leaf_QMARK_);
+if((n === val_or_node)){
+return inode;
+} else {
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,(((2) * idx) + (1)),n);
+}
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+if((val === val_or_node)){
+return inode;
+} else {
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,(((2) * idx) + (1)),val);
+}
+} else {
+added_leaf_QMARK_.val = true;
+
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$6(inode,edit__$1,((2) * idx),null,(((2) * idx) + (1)),cljs.core.create_node.cljs$core$IFn$_invoke$arity$7(edit__$1,(shift + (5)),key_or_nil,val_or_node,hash,key,val));
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_assoc = (function (shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+if(((self__.bitmap & bit) === (0))){
+var n = cljs.core.bit_count(self__.bitmap);
+if((n >= (16))){
+var nodes = [null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null];
+var jdx = ((hash >>> shift) & 0x01f);
+(nodes[jdx] = cljs.core.BitmapIndexedNode.EMPTY.inode_assoc((shift + (5)),hash,key,val,added_leaf_QMARK_));
+
+var i_11820 = (0);
+var j_11821 = (0);
+while(true){
+if((i_11820 < (32))){
+if((((self__.bitmap >>> i_11820) & (1)) === (0))){
+var G__11822 = (i_11820 + (1));
+var G__11823 = j_11821;
+i_11820 = G__11822;
+j_11821 = G__11823;
+continue;
+} else {
+(nodes[i_11820] = (((!(((self__.arr[j_11821]) == null))))?cljs.core.BitmapIndexedNode.EMPTY.inode_assoc((shift + (5)),cljs.core.hash((self__.arr[j_11821])),(self__.arr[j_11821]),(self__.arr[(j_11821 + (1))]),added_leaf_QMARK_):(self__.arr[(j_11821 + (1))])));
+
+var G__11824 = (i_11820 + (1));
+var G__11825 = (j_11821 + (2));
+i_11820 = G__11824;
+j_11821 = G__11825;
+continue;
+}
+} else {
+}
+break;
+}
+
+return (new cljs.core.ArrayNode(null,(n + (1)),nodes));
+} else {
+var new_arr = (new Array(((2) * (n + (1)))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),((2) * idx));
+
+(new_arr[((2) * idx)] = key);
+
+(new_arr[(((2) * idx) + (1))] = val);
+
+cljs.core.array_copy(self__.arr,((2) * idx),new_arr,((2) * (idx + (1))),((2) * (n - idx)));
+
+added_leaf_QMARK_.val = true;
+
+return (new cljs.core.BitmapIndexedNode(null,(self__.bitmap | bit),new_arr));
+}
+} else {
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+var n = val_or_node.inode_assoc((shift + (5)),hash,key,val,added_leaf_QMARK_);
+if((n === val_or_node)){
+return inode;
+} else {
+return (new cljs.core.BitmapIndexedNode(null,self__.bitmap,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,(((2) * idx) + (1)),n)));
+}
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+if((val === val_or_node)){
+return inode;
+} else {
+return (new cljs.core.BitmapIndexedNode(null,self__.bitmap,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,(((2) * idx) + (1)),val)));
+}
+} else {
+added_leaf_QMARK_.val = true;
+
+return (new cljs.core.BitmapIndexedNode(null,self__.bitmap,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$5(self__.arr,((2) * idx),null,(((2) * idx) + (1)),cljs.core.create_node.cljs$core$IFn$_invoke$arity$6((shift + (5)),key_or_nil,val_or_node,hash,key,val))));
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_find = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+if(((self__.bitmap & bit) === (0))){
+return not_found;
+} else {
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+return val_or_node.inode_find((shift + (5)),hash,key,not_found);
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+return (new cljs.core.MapEntry(key_or_nil,val_or_node,null));
+} else {
+return not_found;
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.inode_without = (function (shift,hash,key){
+var self__ = this;
+var inode = this;
+var bit = (1 << ((hash >>> shift) & 0x01f));
+if(((self__.bitmap & bit) === (0))){
+return inode;
+} else {
+var idx = cljs.core.bitmap_indexed_node_index(self__.bitmap,bit);
+var key_or_nil = (self__.arr[((2) * idx)]);
+var val_or_node = (self__.arr[(((2) * idx) + (1))]);
+if((key_or_nil == null)){
+var n = val_or_node.inode_without((shift + (5)),hash,key);
+if((n === val_or_node)){
+return inode;
+} else {
+if((!((n == null)))){
+return (new cljs.core.BitmapIndexedNode(null,self__.bitmap,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,(((2) * idx) + (1)),n)));
+} else {
+if((self__.bitmap === bit)){
+return null;
+} else {
+return (new cljs.core.BitmapIndexedNode(null,(self__.bitmap ^ bit),cljs.core.remove_pair(self__.arr,idx)));
+
+}
+}
+}
+} else {
+if(cljs.core.key_test(key,key_or_nil)){
+return (new cljs.core.BitmapIndexedNode(null,(self__.bitmap ^ bit),cljs.core.remove_pair(self__.arr,idx)));
+} else {
+return inode;
+
+}
+}
+}
+});
+
+cljs.core.BitmapIndexedNode.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.NodeIterator(self__.arr,(0),null,null));
+});
+
+cljs.core.BitmapIndexedNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"edit","edit",-1302639,null),cljs.core.with_meta(new cljs.core.Symbol(null,"bitmap","bitmap",501334601,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.BitmapIndexedNode.cljs$lang$type = true;
+
+cljs.core.BitmapIndexedNode.cljs$lang$ctorStr = "cljs.core/BitmapIndexedNode";
+
+cljs.core.BitmapIndexedNode.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/BitmapIndexedNode");
+});
+
+/**
+ * Positional factory function for cljs.core/BitmapIndexedNode.
+ */
+cljs.core.__GT_BitmapIndexedNode = (function cljs$core$__GT_BitmapIndexedNode(edit,bitmap,arr){
+return (new cljs.core.BitmapIndexedNode(edit,bitmap,arr));
+});
+
+cljs.core.BitmapIndexedNode.EMPTY = (new cljs.core.BitmapIndexedNode(null,(0),[]));
+cljs.core.pack_array_node = (function cljs$core$pack_array_node(array_node,edit,idx){
+var arr = array_node.arr;
+var len = arr.length;
+var new_arr = (new Array(((2) * (array_node.cnt - (1)))));
+var i = (0);
+var j = (1);
+var bitmap = (0);
+while(true){
+if((i < len)){
+if((((!((i === idx)))) && ((!(((arr[i]) == null)))))){
+(new_arr[j] = (arr[i]));
+
+var G__11826 = (i + (1));
+var G__11827 = (j + (2));
+var G__11828 = (bitmap | ((1) << i));
+i = G__11826;
+j = G__11827;
+bitmap = G__11828;
+continue;
+} else {
+var G__11829 = (i + (1));
+var G__11830 = j;
+var G__11831 = bitmap;
+i = G__11829;
+j = G__11830;
+bitmap = G__11831;
+continue;
+}
+} else {
+return (new cljs.core.BitmapIndexedNode(edit,bitmap,new_arr));
+}
+break;
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.ArrayNodeIterator = (function (arr,i,next_iter){
+this.arr = arr;
+this.i = i;
+this.next_iter = next_iter;
+});
+cljs.core.ArrayNodeIterator.prototype.hasNext = (function (){
+var self__ = this;
+var this$ = this;
+var len = self__.arr.length;
+while(true){
+if((!((((!((self__.next_iter == null)))) && (self__.next_iter.hasNext()))))){
+if((self__.i < len)){
+var node = (self__.arr[self__.i]);
+self__.i = (self__.i + (1));
+
+if((!((node == null)))){
+self__.next_iter = cljs.core._iterator(node);
+} else {
+}
+
+continue;
+} else {
+return false;
+}
+} else {
+return true;
+}
+break;
+}
+});
+
+cljs.core.ArrayNodeIterator.prototype.next = (function (){
+var self__ = this;
+var this$ = this;
+if(this$.hasNext()){
+return self__.next_iter.next();
+} else {
+throw (new Error("No such element"));
+}
+});
+
+cljs.core.ArrayNodeIterator.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.ArrayNodeIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"arr","arr",2115492975,null),cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"next-iter","next-iter",1526626239,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ArrayNodeIterator.cljs$lang$type = true;
+
+cljs.core.ArrayNodeIterator.cljs$lang$ctorStr = "cljs.core/ArrayNodeIterator";
+
+cljs.core.ArrayNodeIterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ArrayNodeIterator");
+});
+
+/**
+ * Positional factory function for cljs.core/ArrayNodeIterator.
+ */
+cljs.core.__GT_ArrayNodeIterator = (function cljs$core$__GT_ArrayNodeIterator(arr,i,next_iter){
+return (new cljs.core.ArrayNodeIterator(arr,i,next_iter));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIterable}
+*/
+cljs.core.ArrayNode = (function (edit,cnt,arr){
+this.edit = edit;
+this.cnt = cnt;
+this.arr = arr;
+this.cljs$lang$protocol_mask$partition1$ = 131072;
+this.cljs$lang$protocol_mask$partition0$ = 0;
+});
+cljs.core.ArrayNode.prototype.ensure_editable = (function (e){
+var self__ = this;
+var inode = this;
+if((e === self__.edit)){
+return inode;
+} else {
+return (new cljs.core.ArrayNode(e,self__.cnt,cljs.core.aclone(self__.arr)));
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_without_BANG_ = (function (edit__$1,shift,hash,key,removed_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if((node == null)){
+return inode;
+} else {
+var n = node.inode_without_BANG_(edit__$1,(shift + (5)),hash,key,removed_leaf_QMARK_);
+if((n === node)){
+return inode;
+} else {
+if((n == null)){
+if((self__.cnt <= (8))){
+return cljs.core.pack_array_node(inode,edit__$1,idx);
+} else {
+var editable = cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,idx,n);
+editable.cnt = (editable.cnt - (1));
+
+return editable;
+}
+} else {
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,idx,n);
+
+}
+}
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_seq = (function (){
+var self__ = this;
+var inode = this;
+return cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$1(self__.arr);
+});
+
+cljs.core.ArrayNode.prototype.kv_reduce = (function (f,init){
+var self__ = this;
+var inode = this;
+var len = self__.arr.length;
+var i = (0);
+var init__$1 = init;
+while(true){
+if((i < len)){
+var node = (self__.arr[i]);
+if((!((node == null)))){
+var init__$2 = node.kv_reduce(f,init__$1);
+if(cljs.core.reduced_QMARK_(init__$2)){
+return init__$2;
+} else {
+var G__11832 = (i + (1));
+var G__11833 = init__$2;
+i = G__11832;
+init__$1 = G__11833;
+continue;
+}
+} else {
+var G__11834 = (i + (1));
+var G__11835 = init__$1;
+i = G__11834;
+init__$1 = G__11835;
+continue;
+}
+} else {
+return init__$1;
+}
+break;
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_lookup = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if((!((node == null)))){
+return node.inode_lookup((shift + (5)),hash,key,not_found);
+} else {
+return not_found;
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_assoc_BANG_ = (function (edit__$1,shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if((node == null)){
+var editable = cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,idx,cljs.core.BitmapIndexedNode.EMPTY.inode_assoc_BANG_(edit__$1,(shift + (5)),hash,key,val,added_leaf_QMARK_));
+editable.cnt = (editable.cnt + (1));
+
+return editable;
+} else {
+var n = node.inode_assoc_BANG_(edit__$1,(shift + (5)),hash,key,val,added_leaf_QMARK_);
+if((n === node)){
+return inode;
+} else {
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,idx,n);
+}
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_assoc = (function (shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if((node == null)){
+return (new cljs.core.ArrayNode(null,(self__.cnt + (1)),cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,idx,cljs.core.BitmapIndexedNode.EMPTY.inode_assoc((shift + (5)),hash,key,val,added_leaf_QMARK_))));
+} else {
+var n = node.inode_assoc((shift + (5)),hash,key,val,added_leaf_QMARK_);
+if((n === node)){
+return inode;
+} else {
+return (new cljs.core.ArrayNode(null,self__.cnt,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,idx,n)));
+}
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_find = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if((!((node == null)))){
+return node.inode_find((shift + (5)),hash,key,not_found);
+} else {
+return not_found;
+}
+});
+
+cljs.core.ArrayNode.prototype.inode_without = (function (shift,hash,key){
+var self__ = this;
+var inode = this;
+var idx = ((hash >>> shift) & 0x01f);
+var node = (self__.arr[idx]);
+if((!((node == null)))){
+var n = node.inode_without((shift + (5)),hash,key);
+if((n === node)){
+return inode;
+} else {
+if((n == null)){
+if((self__.cnt <= (8))){
+return cljs.core.pack_array_node(inode,null,idx);
+} else {
+return (new cljs.core.ArrayNode(null,(self__.cnt - (1)),cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,idx,n)));
+}
+} else {
+return (new cljs.core.ArrayNode(null,self__.cnt,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,idx,n)));
+
+}
+}
+} else {
+return inode;
+}
+});
+
+cljs.core.ArrayNode.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.ArrayNodeIterator(self__.arr,(0),null));
+});
+
+cljs.core.ArrayNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"edit","edit",-1302639,null),cljs.core.with_meta(new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ArrayNode.cljs$lang$type = true;
+
+cljs.core.ArrayNode.cljs$lang$ctorStr = "cljs.core/ArrayNode";
+
+cljs.core.ArrayNode.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ArrayNode");
+});
+
+/**
+ * Positional factory function for cljs.core/ArrayNode.
+ */
+cljs.core.__GT_ArrayNode = (function cljs$core$__GT_ArrayNode(edit,cnt,arr){
+return (new cljs.core.ArrayNode(edit,cnt,arr));
+});
+
+cljs.core.hash_collision_node_find_index = (function cljs$core$hash_collision_node_find_index(arr,cnt,key){
+var lim = ((2) * cnt);
+var i = (0);
+while(true){
+if((i < lim)){
+if(cljs.core.key_test(key,(arr[i]))){
+return i;
+} else {
+var G__11836 = (i + (2));
+i = G__11836;
+continue;
+}
+} else {
+return (-1);
+}
+break;
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IIterable}
+*/
+cljs.core.HashCollisionNode = (function (edit,collision_hash,cnt,arr){
+this.edit = edit;
+this.collision_hash = collision_hash;
+this.cnt = cnt;
+this.arr = arr;
+this.cljs$lang$protocol_mask$partition1$ = 131072;
+this.cljs$lang$protocol_mask$partition0$ = 0;
+});
+cljs.core.HashCollisionNode.prototype.ensure_editable = (function (e){
+var self__ = this;
+var inode = this;
+if((e === self__.edit)){
+return inode;
+} else {
+var new_arr = (new Array(((2) * (self__.cnt + (1)))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),((2) * self__.cnt));
+
+return (new cljs.core.HashCollisionNode(e,self__.collision_hash,self__.cnt,new_arr));
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_without_BANG_ = (function (edit__$1,shift,hash,key,removed_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx === (-1))){
+return inode;
+} else {
+removed_leaf_QMARK_.val = true;
+
+if((self__.cnt === (1))){
+return null;
+} else {
+var editable = inode.ensure_editable(edit__$1);
+var earr = editable.arr;
+(earr[idx] = (earr[(((2) * self__.cnt) - (2))]));
+
+(earr[(idx + (1))] = (earr[(((2) * self__.cnt) - (1))]));
+
+(earr[(((2) * self__.cnt) - (1))] = null);
+
+(earr[(((2) * self__.cnt) - (2))] = null);
+
+editable.cnt = (editable.cnt - (1));
+
+return editable;
+}
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_seq = (function (){
+var self__ = this;
+var inode = this;
+return cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1(self__.arr);
+});
+
+cljs.core.HashCollisionNode.prototype.kv_reduce = (function (f,init){
+var self__ = this;
+var inode = this;
+return cljs.core.inode_kv_reduce(self__.arr,f,init);
+});
+
+cljs.core.HashCollisionNode.prototype.inode_lookup = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx < (0))){
+return not_found;
+} else {
+if(cljs.core.key_test(key,(self__.arr[idx]))){
+return (self__.arr[(idx + (1))]);
+} else {
+return not_found;
+
+}
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_assoc_BANG_ = (function (edit__$1,shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+if((hash === self__.collision_hash)){
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx === (-1))){
+if((self__.arr.length > ((2) * self__.cnt))){
+var editable = cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$6(inode,edit__$1,((2) * self__.cnt),key,(((2) * self__.cnt) + (1)),val);
+added_leaf_QMARK_.val = true;
+
+editable.cnt = (editable.cnt + (1));
+
+return editable;
+} else {
+var len = self__.arr.length;
+var new_arr = (new Array((len + (2))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),len);
+
+(new_arr[len] = key);
+
+(new_arr[(len + (1))] = val);
+
+added_leaf_QMARK_.val = true;
+
+return inode.ensure_editable_array(edit__$1,(self__.cnt + (1)),new_arr);
+}
+} else {
+if(((self__.arr[(idx + (1))]) === val)){
+return inode;
+} else {
+return cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4(inode,edit__$1,(idx + (1)),val);
+}
+}
+} else {
+return (new cljs.core.BitmapIndexedNode(edit__$1,(1 << ((self__.collision_hash >>> shift) & 0x01f)),[null,inode,null,null])).inode_assoc_BANG_(edit__$1,shift,hash,key,val,added_leaf_QMARK_);
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_assoc = (function (shift,hash,key,val,added_leaf_QMARK_){
+var self__ = this;
+var inode = this;
+if((hash === self__.collision_hash)){
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx === (-1))){
+var len = ((2) * self__.cnt);
+var new_arr = (new Array((len + (2))));
+cljs.core.array_copy(self__.arr,(0),new_arr,(0),len);
+
+(new_arr[len] = key);
+
+(new_arr[(len + (1))] = val);
+
+added_leaf_QMARK_.val = true;
+
+return (new cljs.core.HashCollisionNode(null,self__.collision_hash,(self__.cnt + (1)),new_arr));
+} else {
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2((self__.arr[(idx + (1))]),val)){
+return inode;
+} else {
+return (new cljs.core.HashCollisionNode(null,self__.collision_hash,self__.cnt,cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3(self__.arr,(idx + (1)),val)));
+}
+}
+} else {
+return (new cljs.core.BitmapIndexedNode(null,(1 << ((self__.collision_hash >>> shift) & 0x01f)),[null,inode])).inode_assoc(shift,hash,key,val,added_leaf_QMARK_);
+}
+});
+
+cljs.core.HashCollisionNode.prototype.ensure_editable_array = (function (e,count,array){
+var self__ = this;
+var inode = this;
+if((e === self__.edit)){
+self__.arr = array;
+
+self__.cnt = count;
+
+return inode;
+} else {
+return (new cljs.core.HashCollisionNode(self__.edit,self__.collision_hash,count,array));
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_find = (function (shift,hash,key,not_found){
+var self__ = this;
+var inode = this;
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx < (0))){
+return not_found;
+} else {
+if(cljs.core.key_test(key,(self__.arr[idx]))){
+return (new cljs.core.MapEntry((self__.arr[idx]),(self__.arr[(idx + (1))]),null));
+} else {
+return not_found;
+
+}
+}
+});
+
+cljs.core.HashCollisionNode.prototype.inode_without = (function (shift,hash,key){
+var self__ = this;
+var inode = this;
+var idx = cljs.core.hash_collision_node_find_index(self__.arr,self__.cnt,key);
+if((idx === (-1))){
+return inode;
+} else {
+if((self__.cnt === (1))){
+return null;
+} else {
+return (new cljs.core.HashCollisionNode(null,self__.collision_hash,(self__.cnt - (1)),cljs.core.remove_pair(self__.arr,cljs.core.quot(idx,(2)))));
+
+}
+}
+});
+
+cljs.core.HashCollisionNode.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.NodeIterator(self__.arr,(0),null,null));
+});
+
+cljs.core.HashCollisionNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"edit","edit",-1302639,null),cljs.core.with_meta(new cljs.core.Symbol(null,"collision-hash","collision-hash",-35831342,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.HashCollisionNode.cljs$lang$type = true;
+
+cljs.core.HashCollisionNode.cljs$lang$ctorStr = "cljs.core/HashCollisionNode";
+
+cljs.core.HashCollisionNode.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/HashCollisionNode");
+});
+
+/**
+ * Positional factory function for cljs.core/HashCollisionNode.
+ */
+cljs.core.__GT_HashCollisionNode = (function cljs$core$__GT_HashCollisionNode(edit,collision_hash,cnt,arr){
+return (new cljs.core.HashCollisionNode(edit,collision_hash,cnt,arr));
+});
+
+cljs.core.create_node = (function cljs$core$create_node(var_args){
+var G__11838 = arguments.length;
+switch (G__11838) {
+case 6:
+return cljs.core.create_node.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+case 7:
+return cljs.core.create_node.cljs$core$IFn$_invoke$arity$7((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.create_node.cljs$core$IFn$_invoke$arity$6 = (function (shift,key1,val1,key2hash,key2,val2){
+var key1hash = cljs.core.hash(key1);
+if((key1hash === key2hash)){
+return (new cljs.core.HashCollisionNode(null,key1hash,(2),[key1,val1,key2,val2]));
+} else {
+var added_leaf_QMARK_ = (new cljs.core.Box(false));
+return cljs.core.BitmapIndexedNode.EMPTY.inode_assoc(shift,key1hash,key1,val1,added_leaf_QMARK_).inode_assoc(shift,key2hash,key2,val2,added_leaf_QMARK_);
+}
+});
+
+cljs.core.create_node.cljs$core$IFn$_invoke$arity$7 = (function (edit,shift,key1,val1,key2hash,key2,val2){
+var key1hash = cljs.core.hash(key1);
+if((key1hash === key2hash)){
+return (new cljs.core.HashCollisionNode(null,key1hash,(2),[key1,val1,key2,val2]));
+} else {
+var added_leaf_QMARK_ = (new cljs.core.Box(false));
+return cljs.core.BitmapIndexedNode.EMPTY.inode_assoc_BANG_(edit,shift,key1hash,key1,val1,added_leaf_QMARK_).inode_assoc_BANG_(edit,shift,key2hash,key2,val2,added_leaf_QMARK_);
+}
+});
+
+cljs.core.create_node.cljs$lang$maxFixedArity = 7;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.NodeSeq = (function (meta,nodes,i,s,__hash){
+this.meta = meta;
+this.nodes = nodes;
+this.i = i;
+this.s = s;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32374988;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.NodeSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.NodeSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.NodeSeq.prototype.indexOf = (function() {
+var G__11840 = null;
+var G__11840__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11840__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11840 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11840__1.call(this,x);
+case 2:
+return G__11840__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11840.cljs$core$IFn$_invoke$arity$1 = G__11840__1;
+G__11840.cljs$core$IFn$_invoke$arity$2 = G__11840__2;
+return G__11840;
+})()
+;
+
+cljs.core.NodeSeq.prototype.lastIndexOf = (function() {
+var G__11841 = null;
+var G__11841__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11841__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11841 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11841__1.call(this,x);
+case 2:
+return G__11841__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11841.cljs$core$IFn$_invoke$arity$1 = G__11841__1;
+G__11841.cljs$core$IFn$_invoke$arity$2 = G__11841__2;
+return G__11841;
+})()
+;
+
+cljs.core.NodeSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.s == null)){
+return cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3(self__.nodes,(self__.i + (2)),null);
+} else {
+return cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3(self__.nodes,self__.i,cljs.core.next(self__.s));
+}
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.s == null)){
+return (new cljs.core.MapEntry((self__.nodes[self__.i]),(self__.nodes[(self__.i + (1))]),null));
+} else {
+return cljs.core.first(self__.s);
+}
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var ret = (((self__.s == null))?cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3(self__.nodes,(self__.i + (2)),null):cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3(self__.nodes,self__.i,cljs.core.next(self__.s)));
+if((!((ret == null)))){
+return ret;
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1;
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.NodeSeq(meta__$1,self__.nodes,self__.i,self__.s,self__.__hash));
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.NodeSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"nodes","nodes",-459054278,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"s","s",-948495851,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.NodeSeq.cljs$lang$type = true;
+
+cljs.core.NodeSeq.cljs$lang$ctorStr = "cljs.core/NodeSeq";
+
+cljs.core.NodeSeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/NodeSeq");
+});
+
+/**
+ * Positional factory function for cljs.core/NodeSeq.
+ */
+cljs.core.__GT_NodeSeq = (function cljs$core$__GT_NodeSeq(meta,nodes,i,s,__hash){
+return (new cljs.core.NodeSeq(meta,nodes,i,s,__hash));
+});
+
+var G__11842_11845 = cljs.core.NodeSeq.prototype;
+var G__11843_11846 = cljs.core.ITER_SYMBOL;
+var G__11844_11847 = ((function (G__11842_11845,G__11843_11846){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11842_11845,G__11843_11846))
+;
+goog.object.set(G__11842_11845,G__11843_11846,G__11844_11847);
+cljs.core.create_inode_seq = (function cljs$core$create_inode_seq(var_args){
+var G__11849 = arguments.length;
+switch (G__11849) {
+case 1:
+return cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1 = (function (nodes){
+return cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3(nodes,(0),null);
+});
+
+cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3 = (function (nodes,i,s){
+if((s == null)){
+var len = nodes.length;
+var j = i;
+while(true){
+if((j < len)){
+if((!(((nodes[j]) == null)))){
+return (new cljs.core.NodeSeq(null,nodes,j,null,null));
+} else {
+var temp__4655__auto__ = (nodes[(j + (1))]);
+if(cljs.core.truth_(temp__4655__auto__)){
+var node = temp__4655__auto__;
+var temp__4655__auto____$1 = node.inode_seq();
+if(cljs.core.truth_(temp__4655__auto____$1)){
+var node_seq = temp__4655__auto____$1;
+return (new cljs.core.NodeSeq(null,nodes,(j + (2)),node_seq,null));
+} else {
+var G__11851 = (j + (2));
+j = G__11851;
+continue;
+}
+} else {
+var G__11852 = (j + (2));
+j = G__11852;
+continue;
+}
+}
+} else {
+return null;
+}
+break;
+}
+} else {
+return (new cljs.core.NodeSeq(null,nodes,i,s,null));
+}
+});
+
+cljs.core.create_inode_seq.cljs$lang$maxFixedArity = 3;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.ArrayNodeSeq = (function (meta,nodes,i,s,__hash){
+this.meta = meta;
+this.nodes = nodes;
+this.i = i;
+this.s = s;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32374988;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.ArrayNodeSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.ArrayNodeSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.ArrayNodeSeq.prototype.indexOf = (function() {
+var G__11853 = null;
+var G__11853__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11853__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11853 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11853__1.call(this,x);
+case 2:
+return G__11853__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11853.cljs$core$IFn$_invoke$arity$1 = G__11853__1;
+G__11853.cljs$core$IFn$_invoke$arity$2 = G__11853__2;
+return G__11853;
+})()
+;
+
+cljs.core.ArrayNodeSeq.prototype.lastIndexOf = (function() {
+var G__11854 = null;
+var G__11854__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11854__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11854 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11854__1.call(this,x);
+case 2:
+return G__11854__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11854.cljs$core$IFn$_invoke$arity$1 = G__11854__1;
+G__11854.cljs$core$IFn$_invoke$arity$2 = G__11854__2;
+return G__11854;
+})()
+;
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4(null,self__.nodes,self__.i,cljs.core.next(self__.s));
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.first(self__.s);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var ret = cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4(null,self__.nodes,self__.i,cljs.core.next(self__.s));
+if((!((ret == null)))){
+return ret;
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1;
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.ArrayNodeSeq(meta__$1,self__.nodes,self__.i,self__.s,self__.__hash));
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.ArrayNodeSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"nodes","nodes",-459054278,null),new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.Symbol(null,"s","s",-948495851,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ArrayNodeSeq.cljs$lang$type = true;
+
+cljs.core.ArrayNodeSeq.cljs$lang$ctorStr = "cljs.core/ArrayNodeSeq";
+
+cljs.core.ArrayNodeSeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ArrayNodeSeq");
+});
+
+/**
+ * Positional factory function for cljs.core/ArrayNodeSeq.
+ */
+cljs.core.__GT_ArrayNodeSeq = (function cljs$core$__GT_ArrayNodeSeq(meta,nodes,i,s,__hash){
+return (new cljs.core.ArrayNodeSeq(meta,nodes,i,s,__hash));
+});
+
+var G__11855_11858 = cljs.core.ArrayNodeSeq.prototype;
+var G__11856_11859 = cljs.core.ITER_SYMBOL;
+var G__11857_11860 = ((function (G__11855_11858,G__11856_11859){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11855_11858,G__11856_11859))
+;
+goog.object.set(G__11855_11858,G__11856_11859,G__11857_11860);
+cljs.core.create_array_node_seq = (function cljs$core$create_array_node_seq(var_args){
+var G__11862 = arguments.length;
+switch (G__11862) {
+case 1:
+return cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 4:
+return cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$1 = (function (nodes){
+return cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4(null,nodes,(0),null);
+});
+
+cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4 = (function (meta,nodes,i,s){
+if((s == null)){
+var len = nodes.length;
+var j = i;
+while(true){
+if((j < len)){
+var temp__4655__auto__ = (nodes[j]);
+if(cljs.core.truth_(temp__4655__auto__)){
+var nj = temp__4655__auto__;
+var temp__4655__auto____$1 = nj.inode_seq();
+if(cljs.core.truth_(temp__4655__auto____$1)){
+var ns = temp__4655__auto____$1;
+return (new cljs.core.ArrayNodeSeq(meta,nodes,(j + (1)),ns,null));
+} else {
+var G__11864 = (j + (1));
+j = G__11864;
+continue;
+}
+} else {
+var G__11865 = (j + (1));
+j = G__11865;
+continue;
+}
+} else {
+return null;
+}
+break;
+}
+} else {
+return (new cljs.core.ArrayNodeSeq(meta,nodes,i,s,null));
+}
+});
+
+cljs.core.create_array_node_seq.cljs$lang$maxFixedArity = 4;
+
+
+/**
+* @constructor
+*/
+cljs.core.HashMapIter = (function (nil_val,root_iter,seen){
+this.nil_val = nil_val;
+this.root_iter = root_iter;
+this.seen = seen;
+});
+cljs.core.HashMapIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return (((!(self__.seen))) || (self__.root_iter.hasNext()));
+});
+
+cljs.core.HashMapIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if((!(self__.seen))){
+self__.seen = true;
+
+return (new cljs.core.MapEntry(null,self__.nil_val,null));
+} else {
+return self__.root_iter.next();
+}
+});
+
+cljs.core.HashMapIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.HashMapIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"nil-val","nil-val",-513933559,null),new cljs.core.Symbol(null,"root-iter","root-iter",1974672108,null),cljs.core.with_meta(new cljs.core.Symbol(null,"seen","seen",1121531738,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.HashMapIter.cljs$lang$type = true;
+
+cljs.core.HashMapIter.cljs$lang$ctorStr = "cljs.core/HashMapIter";
+
+cljs.core.HashMapIter.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/HashMapIter");
+});
+
+/**
+ * Positional factory function for cljs.core/HashMapIter.
+ */
+cljs.core.__GT_HashMapIter = (function cljs$core$__GT_HashMapIter(nil_val,root_iter,seen){
+return (new cljs.core.HashMapIter(nil_val,root_iter,seen));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEditableCollection}
+ * @implements {cljs.core.IFind}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.IMap}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.PersistentHashMap = (function (meta,cnt,root,has_nil_QMARK_,nil_val,__hash){
+this.meta = meta;
+this.cnt = cnt;
+this.root = root;
+this.has_nil_QMARK_ = has_nil_QMARK_;
+this.nil_val = nil_val;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 16123663;
+this.cljs$lang$protocol_mask$partition1$ = 139268;
+});
+cljs.core.PersistentHashMap.prototype.cljs$core$IFind$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IFind$_find$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if((k == null)){
+if(self__.has_nil_QMARK_){
+return (new cljs.core.MapEntry(null,self__.nil_val,null));
+} else {
+return null;
+}
+} else {
+if((self__.root == null)){
+return null;
+} else {
+return self__.root.inode_find((0),cljs.core.hash(k),k,null);
+
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentHashMap.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentHashMap.prototype.keys = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.keys(coll));
+});
+
+cljs.core.PersistentHashMap.prototype.entries = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_entries_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentHashMap.prototype.values = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.vals(coll));
+});
+
+cljs.core.PersistentHashMap.prototype.has = (function (k){
+var self__ = this;
+var coll = this;
+return cljs.core.contains_QMARK_(coll,k);
+});
+
+cljs.core.PersistentHashMap.prototype.get = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentHashMap.prototype.forEach = (function (f){
+var self__ = this;
+var coll = this;
+var seq__11867 = cljs.core.seq(coll);
+var chunk__11868 = null;
+var count__11869 = (0);
+var i__11870 = (0);
+while(true){
+if((i__11870 < count__11869)){
+var vec__11871 = chunk__11868.cljs$core$IIndexed$_nth$arity$2(null,i__11870);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11871,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11871,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+
+var G__11879 = seq__11867;
+var G__11880 = chunk__11868;
+var G__11881 = count__11869;
+var G__11882 = (i__11870 + (1));
+seq__11867 = G__11879;
+chunk__11868 = G__11880;
+count__11869 = G__11881;
+i__11870 = G__11882;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__11867);
+if(temp__4657__auto__){
+var seq__11867__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__11867__$1)){
+var c__8664__auto__ = cljs.core.chunk_first(seq__11867__$1);
+var G__11883 = cljs.core.chunk_rest(seq__11867__$1);
+var G__11884 = c__8664__auto__;
+var G__11885 = cljs.core.count(c__8664__auto__);
+var G__11886 = (0);
+seq__11867 = G__11883;
+chunk__11868 = G__11884;
+count__11869 = G__11885;
+i__11870 = G__11886;
+continue;
+} else {
+var vec__11874 = cljs.core.first(seq__11867__$1);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11874,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11874,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+
+var G__11887 = cljs.core.next(seq__11867__$1);
+var G__11888 = null;
+var G__11889 = (0);
+var G__11890 = (0);
+seq__11867 = G__11887;
+chunk__11868 = G__11888;
+count__11869 = G__11889;
+i__11870 = G__11890;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+if((k == null)){
+if(self__.has_nil_QMARK_){
+return self__.nil_val;
+} else {
+return not_found;
+}
+} else {
+if((self__.root == null)){
+return not_found;
+} else {
+return self__.root.inode_lookup((0),cljs.core.hash(k),k,not_found);
+
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+var init__$1 = ((self__.has_nil_QMARK_)?(f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(init,null,self__.nil_val) : f.call(null,init,null,self__.nil_val)):init);
+if(cljs.core.reduced_QMARK_(init__$1)){
+return cljs.core.deref(init__$1);
+} else {
+if((!((self__.root == null)))){
+return cljs.core.unreduced(self__.root.kv_reduce(f,init__$1));
+} else {
+return init__$1;
+
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var root_iter = ((self__.root)?cljs.core._iterator(self__.root):cljs.core.nil_iter());
+if(self__.has_nil_QMARK_){
+return (new cljs.core.HashMapIter(self__.nil_val,root_iter,false));
+} else {
+return root_iter;
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentHashMap(self__.meta,self__.cnt,self__.root,self__.has_nil_QMARK_,self__.nil_val,self__.__hash));
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.cnt;
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_map(coll__$1,other);
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IEditableCollection$_as_transient$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.TransientHashMap({},self__.root,self__.cnt,self__.has_nil_QMARK_,self__.nil_val));
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.PersistentHashMap.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IMap$_dissoc$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if((k == null)){
+if(self__.has_nil_QMARK_){
+return (new cljs.core.PersistentHashMap(self__.meta,(self__.cnt - (1)),self__.root,false,null,null));
+} else {
+return coll__$1;
+}
+} else {
+if((self__.root == null)){
+return coll__$1;
+} else {
+var new_root = self__.root.inode_without((0),cljs.core.hash(k),k);
+if((new_root === self__.root)){
+return coll__$1;
+} else {
+return (new cljs.core.PersistentHashMap(self__.meta,(self__.cnt - (1)),new_root,self__.has_nil_QMARK_,self__.nil_val,null));
+}
+
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,k,v){
+var self__ = this;
+var coll__$1 = this;
+if((k == null)){
+if(((self__.has_nil_QMARK_) && ((v === self__.nil_val)))){
+return coll__$1;
+} else {
+return (new cljs.core.PersistentHashMap(self__.meta,((self__.has_nil_QMARK_)?self__.cnt:(self__.cnt + (1))),self__.root,true,v,null));
+}
+} else {
+var added_leaf_QMARK_ = (new cljs.core.Box(false));
+var new_root = (((self__.root == null))?cljs.core.BitmapIndexedNode.EMPTY:self__.root).inode_assoc((0),cljs.core.hash(k),k,v,added_leaf_QMARK_);
+if((new_root === self__.root)){
+return coll__$1;
+} else {
+return (new cljs.core.PersistentHashMap(self__.meta,((added_leaf_QMARK_.val)?(self__.cnt + (1)):self__.cnt),new_root,self__.has_nil_QMARK_,self__.nil_val,null));
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+if((k == null)){
+return self__.has_nil_QMARK_;
+} else {
+if((self__.root == null)){
+return false;
+} else {
+return (!((self__.root.inode_lookup((0),cljs.core.hash(k),k,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)));
+
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+var s = (((!((self__.root == null))))?self__.root.inode_seq():null);
+if(self__.has_nil_QMARK_){
+return cljs.core.cons((new cljs.core.MapEntry(null,self__.nil_val,null)),s);
+} else {
+return s;
+}
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentHashMap(meta__$1,self__.cnt,self__.root,self__.has_nil_QMARK_,self__.nil_val,self__.__hash));
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.vector_QMARK_(entry)){
+return coll__$1.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(1)));
+} else {
+var ret = coll__$1;
+var es = cljs.core.seq(entry);
+while(true){
+if((es == null)){
+return ret;
+} else {
+var e = cljs.core.first(es);
+if(cljs.core.vector_QMARK_(e)){
+var G__11891 = ret.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(1)));
+var G__11892 = cljs.core.next(es);
+ret = G__11891;
+es = G__11892;
+continue;
+} else {
+throw (new Error("conj on a map takes map entries or seqables of map entries"));
+}
+}
+break;
+}
+}
+});
+
+cljs.core.PersistentHashMap.prototype.call = (function() {
+var G__11893 = null;
+var G__11893__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__11893__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__11893 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11893__2.call(this,self__,k);
+case 3:
+return G__11893__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11893.cljs$core$IFn$_invoke$arity$2 = G__11893__2;
+G__11893.cljs$core$IFn$_invoke$arity$3 = G__11893__3;
+return G__11893;
+})()
+;
+
+cljs.core.PersistentHashMap.prototype.apply = (function (self__,args11866){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11866)));
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentHashMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.Symbol(null,"root","root",1191874074,null),cljs.core.with_meta(new cljs.core.Symbol(null,"has-nil?","has-nil?",825886722,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"boolean","boolean",-278886877,null)], null)),new cljs.core.Symbol(null,"nil-val","nil-val",-513933559,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentHashMap.cljs$lang$type = true;
+
+cljs.core.PersistentHashMap.cljs$lang$ctorStr = "cljs.core/PersistentHashMap";
+
+cljs.core.PersistentHashMap.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentHashMap");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentHashMap.
+ */
+cljs.core.__GT_PersistentHashMap = (function cljs$core$__GT_PersistentHashMap(meta,cnt,root,has_nil_QMARK_,nil_val,__hash){
+return (new cljs.core.PersistentHashMap(meta,cnt,root,has_nil_QMARK_,nil_val,__hash));
+});
+
+cljs.core.PersistentHashMap.EMPTY = (new cljs.core.PersistentHashMap(null,(0),null,false,null,cljs.core.empty_unordered_hash));
+cljs.core.PersistentHashMap.fromArray = (function (arr,no_clone){
+var arr__$1 = ((no_clone)?arr:cljs.core.aclone(arr));
+var len = arr__$1.length;
+var i = (0);
+var ret = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+while(true){
+if((i < len)){
+var G__11894 = (i + (2));
+var G__11895 = cljs.core._assoc_BANG_(ret,(arr__$1[i]),(arr__$1[(i + (1))]));
+i = G__11894;
+ret = G__11895;
+continue;
+} else {
+return cljs.core._persistent_BANG_(ret);
+}
+break;
+}
+});
+cljs.core.PersistentHashMap.fromArrays = (function (ks,vs){
+var len = ks.length;
+var i = (0);
+var out = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+while(true){
+if((i < len)){
+var G__11896 = (i + (1));
+var G__11897 = out.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3(null,(ks[i]),(vs[i]));
+i = G__11896;
+out = G__11897;
+continue;
+} else {
+return cljs.core.persistent_BANG_(out);
+}
+break;
+}
+});
+cljs.core.PersistentHashMap.createWithCheck = (function (arr){
+var len = arr.length;
+var ret = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+var i_11898 = (0);
+while(true){
+if((i_11898 < len)){
+cljs.core._assoc_BANG_(ret,(arr[i_11898]),(arr[(i_11898 + (1))]));
+
+if(cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core._count(ret),((i_11898 / (2)) + (1)))){
+throw (new Error(["Duplicate key: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1((arr[i_11898]))].join('')));
+} else {
+var G__11899 = (i_11898 + (2));
+i_11898 = G__11899;
+continue;
+}
+} else {
+}
+break;
+}
+
+return cljs.core._persistent_BANG_(ret);
+});
+var G__11900_11903 = cljs.core.PersistentHashMap.prototype;
+var G__11901_11904 = cljs.core.ITER_SYMBOL;
+var G__11902_11905 = ((function (G__11900_11903,G__11901_11904){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11900_11903,G__11901_11904))
+;
+goog.object.set(G__11900_11903,G__11901_11904,G__11902_11905);
+
+/**
+* @constructor
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ITransientMap}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ITransientCollection}
+ * @implements {cljs.core.ITransientAssociative}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.TransientHashMap = (function (edit,root,count,has_nil_QMARK_,nil_val){
+this.edit = edit;
+this.root = root;
+this.count = count;
+this.has_nil_QMARK_ = has_nil_QMARK_;
+this.nil_val = nil_val;
+this.cljs$lang$protocol_mask$partition0$ = 259;
+this.cljs$lang$protocol_mask$partition1$ = 56;
+});
+cljs.core.TransientHashMap.prototype.conj_BANG_ = (function (o){
+var self__ = this;
+var tcoll = this;
+if(self__.edit){
+if(cljs.core.map_entry_QMARK_(o)){
+return tcoll.assoc_BANG_(cljs.core.key(o),cljs.core.val(o));
+} else {
+if(cljs.core.vector_QMARK_(o)){
+return tcoll.assoc_BANG_((o.cljs$core$IFn$_invoke$arity$1 ? o.cljs$core$IFn$_invoke$arity$1((0)) : o.call(null,(0))),(o.cljs$core$IFn$_invoke$arity$1 ? o.cljs$core$IFn$_invoke$arity$1((1)) : o.call(null,(1))));
+} else {
+var es = cljs.core.seq(o);
+var tcoll__$1 = tcoll;
+while(true){
+var temp__4655__auto__ = cljs.core.first(es);
+if(cljs.core.truth_(temp__4655__auto__)){
+var e = temp__4655__auto__;
+var G__11907 = cljs.core.next(es);
+var G__11908 = tcoll__$1.assoc_BANG_(cljs.core.key(e),cljs.core.val(e));
+es = G__11907;
+tcoll__$1 = G__11908;
+continue;
+} else {
+return tcoll__$1;
+}
+break;
+}
+
+}
+}
+} else {
+throw (new Error("conj! after persistent"));
+}
+});
+
+cljs.core.TransientHashMap.prototype.assoc_BANG_ = (function (k,v){
+var self__ = this;
+var tcoll = this;
+if(self__.edit){
+if((k == null)){
+if((self__.nil_val === v)){
+} else {
+self__.nil_val = v;
+}
+
+if(self__.has_nil_QMARK_){
+} else {
+self__.count = (self__.count + (1));
+
+self__.has_nil_QMARK_ = true;
+}
+
+return tcoll;
+} else {
+var added_leaf_QMARK_ = (new cljs.core.Box(false));
+var node = (((self__.root == null))?cljs.core.BitmapIndexedNode.EMPTY:self__.root).inode_assoc_BANG_(self__.edit,(0),cljs.core.hash(k),k,v,added_leaf_QMARK_);
+if((node === self__.root)){
+} else {
+self__.root = node;
+}
+
+if(added_leaf_QMARK_.val){
+self__.count = (self__.count + (1));
+} else {
+}
+
+return tcoll;
+}
+} else {
+throw (new Error("assoc! after persistent!"));
+}
+});
+
+cljs.core.TransientHashMap.prototype.without_BANG_ = (function (k){
+var self__ = this;
+var tcoll = this;
+if(self__.edit){
+if((k == null)){
+if(self__.has_nil_QMARK_){
+self__.has_nil_QMARK_ = false;
+
+self__.nil_val = null;
+
+self__.count = (self__.count - (1));
+
+return tcoll;
+} else {
+return tcoll;
+}
+} else {
+if((self__.root == null)){
+return tcoll;
+} else {
+var removed_leaf_QMARK_ = (new cljs.core.Box(false));
+var node = self__.root.inode_without_BANG_(self__.edit,(0),cljs.core.hash(k),k,removed_leaf_QMARK_);
+if((node === self__.root)){
+} else {
+self__.root = node;
+}
+
+if(removed_leaf_QMARK_.val){
+self__.count = (self__.count - (1));
+} else {
+}
+
+return tcoll;
+}
+}
+} else {
+throw (new Error("dissoc! after persistent!"));
+}
+});
+
+cljs.core.TransientHashMap.prototype.persistent_BANG_ = (function (){
+var self__ = this;
+var tcoll = this;
+if(self__.edit){
+self__.edit = null;
+
+return (new cljs.core.PersistentHashMap(null,self__.count,self__.root,self__.has_nil_QMARK_,self__.nil_val,null));
+} else {
+throw (new Error("persistent! called twice"));
+}
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if(self__.edit){
+return self__.count;
+} else {
+throw (new Error("count after persistent!"));
+}
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (tcoll,k){
+var self__ = this;
+var tcoll__$1 = this;
+if((k == null)){
+if(self__.has_nil_QMARK_){
+return self__.nil_val;
+} else {
+return null;
+}
+} else {
+if((self__.root == null)){
+return null;
+} else {
+return self__.root.inode_lookup((0),cljs.core.hash(k),k);
+}
+}
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (tcoll,k,not_found){
+var self__ = this;
+var tcoll__$1 = this;
+if((k == null)){
+if(self__.has_nil_QMARK_){
+return self__.nil_val;
+} else {
+return not_found;
+}
+} else {
+if((self__.root == null)){
+return not_found;
+} else {
+return self__.root.inode_lookup((0),cljs.core.hash(k),k,not_found);
+}
+}
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ITransientCollection$_conj_BANG_$arity$2 = (function (tcoll,val){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.conj_BANG_(val);
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ITransientCollection$_persistent_BANG_$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.persistent_BANG_();
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ITransientAssociative$_assoc_BANG_$arity$3 = (function (tcoll,key,val){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.assoc_BANG_(key,val);
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$ITransientMap$_dissoc_BANG_$arity$2 = (function (tcoll,key){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.without_BANG_(key);
+});
+
+cljs.core.TransientHashMap.prototype.call = (function() {
+var G__11909 = null;
+var G__11909__2 = (function (self__,key){
+var self__ = this;
+var self____$1 = this;
+var tcoll = self____$1;
+return tcoll.cljs$core$ILookup$_lookup$arity$2(null,key);
+});
+var G__11909__3 = (function (self__,key,not_found){
+var self__ = this;
+var self____$1 = this;
+var tcoll = self____$1;
+return tcoll.cljs$core$ILookup$_lookup$arity$3(null,key,not_found);
+});
+G__11909 = function(self__,key,not_found){
+switch(arguments.length){
+case 2:
+return G__11909__2.call(this,self__,key);
+case 3:
+return G__11909__3.call(this,self__,key,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11909.cljs$core$IFn$_invoke$arity$2 = G__11909__2;
+G__11909.cljs$core$IFn$_invoke$arity$3 = G__11909__3;
+return G__11909;
+})()
+;
+
+cljs.core.TransientHashMap.prototype.apply = (function (self__,args11906){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11906)));
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$IFn$_invoke$arity$1 = (function (key){
+var self__ = this;
+var tcoll = this;
+return tcoll.cljs$core$ILookup$_lookup$arity$2(null,key);
+});
+
+cljs.core.TransientHashMap.prototype.cljs$core$IFn$_invoke$arity$2 = (function (key,not_found){
+var self__ = this;
+var tcoll = this;
+return tcoll.cljs$core$ILookup$_lookup$arity$3(null,key,not_found);
+});
+
+cljs.core.TransientHashMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"edit","edit",-1302639,null),new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"boolean","boolean",-278886877,null),new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"root","root",1191874074,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"count","count",-514511684,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"has-nil?","has-nil?",825886722,null),new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"boolean","boolean",-278886877,null),new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"nil-val","nil-val",-513933559,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.TransientHashMap.cljs$lang$type = true;
+
+cljs.core.TransientHashMap.cljs$lang$ctorStr = "cljs.core/TransientHashMap";
+
+cljs.core.TransientHashMap.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/TransientHashMap");
+});
+
+/**
+ * Positional factory function for cljs.core/TransientHashMap.
+ */
+cljs.core.__GT_TransientHashMap = (function cljs$core$__GT_TransientHashMap(edit,root,count,has_nil_QMARK_,nil_val){
+return (new cljs.core.TransientHashMap(edit,root,count,has_nil_QMARK_,nil_val));
+});
+
+cljs.core.tree_map_seq_push = (function cljs$core$tree_map_seq_push(node,stack,ascending_QMARK_){
+var t = node;
+var stack__$1 = stack;
+while(true){
+if((!((t == null)))){
+var G__11910 = ((ascending_QMARK_)?t.left:t.right);
+var G__11911 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(stack__$1,t);
+t = G__11910;
+stack__$1 = G__11911;
+continue;
+} else {
+return stack__$1;
+}
+break;
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.PersistentTreeMapSeq = (function (meta,stack,ascending_QMARK_,cnt,__hash){
+this.meta = meta;
+this.stack = stack;
+this.ascending_QMARK_ = ascending_QMARK_;
+this.cnt = cnt;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32374990;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.PersistentTreeMapSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.indexOf = (function() {
+var G__11912 = null;
+var G__11912__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11912__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11912 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11912__1.call(this,x);
+case 2:
+return G__11912__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11912.cljs$core$IFn$_invoke$arity$1 = G__11912__1;
+G__11912.cljs$core$IFn$_invoke$arity$2 = G__11912__2;
+return G__11912;
+})()
+;
+
+cljs.core.PersistentTreeMapSeq.prototype.lastIndexOf = (function() {
+var G__11913 = null;
+var G__11913__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11913__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11913 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11913__1.call(this,x);
+case 2:
+return G__11913__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11913.cljs$core$IFn$_invoke$arity$1 = G__11913__1;
+G__11913.cljs$core$IFn$_invoke$arity$2 = G__11913__2;
+return G__11913;
+})()
+;
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$INext$_next$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+var t = cljs.core.first(self__.stack);
+var next_stack = cljs.core.tree_map_seq_push(((self__.ascending_QMARK_)?t.right:t.left),cljs.core.next(self__.stack),self__.ascending_QMARK_);
+if((next_stack == null)){
+return null;
+} else {
+return (new cljs.core.PersistentTreeMapSeq(null,next_stack,self__.ascending_QMARK_,(self__.cnt - (1)),null));
+}
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt < (0))){
+return (cljs.core.count(cljs.core.next(coll__$1)) + (1));
+} else {
+return self__.cnt;
+}
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core.peek(self__.stack);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+var t = cljs.core.first(self__.stack);
+var next_stack = cljs.core.tree_map_seq_push(((self__.ascending_QMARK_)?t.right:t.left),cljs.core.next(self__.stack),self__.ascending_QMARK_);
+if((!((next_stack == null)))){
+return (new cljs.core.PersistentTreeMapSeq(null,next_stack,self__.ascending_QMARK_,(self__.cnt - (1)),null));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1;
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeMapSeq(meta__$1,self__.stack,self__.ascending_QMARK_,self__.cnt,self__.__hash));
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.PersistentTreeMapSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"stack","stack",847125597,null),cljs.core.with_meta(new cljs.core.Symbol(null,"ascending?","ascending?",-1938452653,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"boolean","boolean",-278886877,null)], null)),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentTreeMapSeq.cljs$lang$type = true;
+
+cljs.core.PersistentTreeMapSeq.cljs$lang$ctorStr = "cljs.core/PersistentTreeMapSeq";
+
+cljs.core.PersistentTreeMapSeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentTreeMapSeq");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentTreeMapSeq.
+ */
+cljs.core.__GT_PersistentTreeMapSeq = (function cljs$core$__GT_PersistentTreeMapSeq(meta,stack,ascending_QMARK_,cnt,__hash){
+return (new cljs.core.PersistentTreeMapSeq(meta,stack,ascending_QMARK_,cnt,__hash));
+});
+
+var G__11914_11917 = cljs.core.PersistentTreeMapSeq.prototype;
+var G__11915_11918 = cljs.core.ITER_SYMBOL;
+var G__11916_11919 = ((function (G__11914_11917,G__11915_11918){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11914_11917,G__11915_11918))
+;
+goog.object.set(G__11914_11917,G__11915_11918,G__11916_11919);
+cljs.core.create_tree_map_seq = (function cljs$core$create_tree_map_seq(tree,ascending_QMARK_,cnt){
+return (new cljs.core.PersistentTreeMapSeq(null,cljs.core.tree_map_seq_push(tree,null,ascending_QMARK_),ascending_QMARK_,cnt,null));
+});
+
+cljs.core.balance_left = (function cljs$core$balance_left(key,val,ins,right){
+if((ins instanceof cljs.core.RedNode)){
+if((ins.left instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(ins.key,ins.val,ins.left.blacken(),(new cljs.core.BlackNode(key,val,ins.right,right,null)),null));
+} else {
+if((ins.right instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(ins.right.key,ins.right.val,(new cljs.core.BlackNode(ins.key,ins.val,ins.left,ins.right.left,null)),(new cljs.core.BlackNode(key,val,ins.right.right,right,null)),null));
+} else {
+return (new cljs.core.BlackNode(key,val,ins,right,null));
+
+}
+}
+} else {
+return (new cljs.core.BlackNode(key,val,ins,right,null));
+}
+});
+cljs.core.balance_right = (function cljs$core$balance_right(key,val,left,ins){
+if((ins instanceof cljs.core.RedNode)){
+if((ins.right instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(ins.key,ins.val,(new cljs.core.BlackNode(key,val,left,ins.left,null)),ins.right.blacken(),null));
+} else {
+if((ins.left instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(ins.left.key,ins.left.val,(new cljs.core.BlackNode(key,val,left,ins.left.left,null)),(new cljs.core.BlackNode(ins.key,ins.val,ins.left.right,ins.right,null)),null));
+} else {
+return (new cljs.core.BlackNode(key,val,left,ins,null));
+
+}
+}
+} else {
+return (new cljs.core.BlackNode(key,val,left,ins,null));
+}
+});
+cljs.core.balance_left_del = (function cljs$core$balance_left_del(key,val,del,right){
+if((del instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(key,val,del.blacken(),right,null));
+} else {
+if((right instanceof cljs.core.BlackNode)){
+return cljs.core.balance_right(key,val,del,right.redden());
+} else {
+if((((right instanceof cljs.core.RedNode)) && ((right.left instanceof cljs.core.BlackNode)))){
+return (new cljs.core.RedNode(right.left.key,right.left.val,(new cljs.core.BlackNode(key,val,del,right.left.left,null)),cljs.core.balance_right(right.key,right.val,right.left.right,right.right.redden()),null));
+} else {
+throw (new Error("red-black tree invariant violation"));
+
+}
+}
+}
+});
+cljs.core.balance_right_del = (function cljs$core$balance_right_del(key,val,left,del){
+if((del instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(key,val,left,del.blacken(),null));
+} else {
+if((left instanceof cljs.core.BlackNode)){
+return cljs.core.balance_left(key,val,left.redden(),del);
+} else {
+if((((left instanceof cljs.core.RedNode)) && ((left.right instanceof cljs.core.BlackNode)))){
+return (new cljs.core.RedNode(left.right.key,left.right.val,cljs.core.balance_left(left.key,left.val,left.left.redden(),left.right.left),(new cljs.core.BlackNode(key,val,left.right.right,del,null)),null));
+} else {
+throw (new Error("red-black tree invariant violation"));
+
+}
+}
+}
+});
+cljs.core.tree_map_kv_reduce = (function cljs$core$tree_map_kv_reduce(node,f,init){
+var init__$1 = (((!((node.left == null))))?(function (){var G__11920 = node.left;
+var G__11921 = f;
+var G__11922 = init;
+return (cljs.core.tree_map_kv_reduce.cljs$core$IFn$_invoke$arity$3 ? cljs.core.tree_map_kv_reduce.cljs$core$IFn$_invoke$arity$3(G__11920,G__11921,G__11922) : cljs.core.tree_map_kv_reduce.call(null,G__11920,G__11921,G__11922));
+})():init);
+if(cljs.core.reduced_QMARK_(init__$1)){
+return init__$1;
+} else {
+var init__$2 = (function (){var G__11923 = init__$1;
+var G__11924 = node.key;
+var G__11925 = node.val;
+return (f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(G__11923,G__11924,G__11925) : f.call(null,G__11923,G__11924,G__11925));
+})();
+if(cljs.core.reduced_QMARK_(init__$2)){
+return init__$2;
+} else {
+if((!((node.right == null)))){
+var G__11926 = node.right;
+var G__11927 = f;
+var G__11928 = init__$2;
+return (cljs.core.tree_map_kv_reduce.cljs$core$IFn$_invoke$arity$3 ? cljs.core.tree_map_kv_reduce.cljs$core$IFn$_invoke$arity$3(G__11926,G__11927,G__11928) : cljs.core.tree_map_kv_reduce.call(null,G__11926,G__11927,G__11928));
+} else {
+return init__$2;
+}
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IVector}
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IFind}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IMapEntry}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.BlackNode = (function (key,val,left,right,__hash){
+this.key = key;
+this.val = val;
+this.left = left;
+this.right = right;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 166619935;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.BlackNode.prototype.cljs$core$IFind$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.BlackNode.prototype.cljs$core$IFind$_find$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+var G__11930 = k;
+switch (G__11930) {
+case (0):
+return (new cljs.core.MapEntry((0),self__.key,null));
+
+break;
+case (1):
+return (new cljs.core.MapEntry((1),self__.val,null));
+
+break;
+default:
+return null;
+
+}
+});
+
+cljs.core.BlackNode.prototype.lastIndexOf = (function() {
+var G__11932 = null;
+var G__11932__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11932__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11932 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11932__1.call(this,x);
+case 2:
+return G__11932__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11932.cljs$core$IFn$_invoke$arity$1 = G__11932__1;
+G__11932.cljs$core$IFn$_invoke$arity$2 = G__11932__2;
+return G__11932;
+})()
+;
+
+cljs.core.BlackNode.prototype.indexOf = (function() {
+var G__11933 = null;
+var G__11933__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11933__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11933 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11933__1.call(this,x);
+case 2:
+return G__11933__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11933.cljs$core$IFn$_invoke$arity$1 = G__11933__1;
+G__11933.cljs$core$IFn$_invoke$arity$2 = G__11933__2;
+return G__11933;
+})()
+;
+
+cljs.core.BlackNode.prototype.add_right = (function (ins){
+var self__ = this;
+var node = this;
+return ins.balance_right(node);
+});
+
+cljs.core.BlackNode.prototype.redden = (function (){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(self__.key,self__.val,self__.left,self__.right,null));
+});
+
+cljs.core.BlackNode.prototype.blacken = (function (){
+var self__ = this;
+var node = this;
+return node;
+});
+
+cljs.core.BlackNode.prototype.add_left = (function (ins){
+var self__ = this;
+var node = this;
+return ins.balance_left(node);
+});
+
+cljs.core.BlackNode.prototype.replace = (function (key__$1,val__$1,left__$1,right__$1){
+var self__ = this;
+var node = this;
+return (new cljs.core.BlackNode(key__$1,val__$1,left__$1,right__$1,null));
+});
+
+cljs.core.BlackNode.prototype.balance_left = (function (parent){
+var self__ = this;
+var node = this;
+return (new cljs.core.BlackNode(parent.key,parent.val,node,parent.right,null));
+});
+
+cljs.core.BlackNode.prototype.balance_right = (function (parent){
+var self__ = this;
+var node = this;
+return (new cljs.core.BlackNode(parent.key,parent.val,parent.left,node,null));
+});
+
+cljs.core.BlackNode.prototype.remove_left = (function (del){
+var self__ = this;
+var node = this;
+return cljs.core.balance_left_del(self__.key,self__.val,del,self__.right);
+});
+
+cljs.core.BlackNode.prototype.kv_reduce = (function (f,init){
+var self__ = this;
+var node = this;
+return cljs.core.tree_map_kv_reduce(node,f,init);
+});
+
+cljs.core.BlackNode.prototype.remove_right = (function (del){
+var self__ = this;
+var node = this;
+return cljs.core.balance_right_del(self__.key,self__.val,self__.left,del);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+return node__$1.cljs$core$IIndexed$_nth$arity$3(null,k,null);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (node,k,not_found){
+var self__ = this;
+var node__$1 = this;
+return node__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (node,n){
+var self__ = this;
+var node__$1 = this;
+if((n === (0))){
+return self__.key;
+} else {
+if((n === (1))){
+return self__.val;
+} else {
+throw (new Error("Index out of bounds"));
+
+}
+}
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (node,n,not_found){
+var self__ = this;
+var node__$1 = this;
+if((n === (0))){
+return self__.key;
+} else {
+if((n === (1))){
+return self__.val;
+} else {
+return not_found;
+
+}
+}
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IVector$_assoc_n$arity$3 = (function (node,n,v){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null).cljs$core$IVector$_assoc_n$arity$3(null,n,v);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IMeta$_meta$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return null;
+});
+
+cljs.core.BlackNode.prototype.cljs$core$ICounted$_count$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (2);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IMapEntry$_key$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.key;
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IMapEntry$_val$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.val;
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IStack$_peek$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.val;
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IStack$_pop$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key], null);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (new cljs.core.IndexedSeq([self__.val,self__.key],(0),null));
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return null;
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (node,f){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2(node__$1,f);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (node,f,start){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3(node__$1,f,start);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (node,k,v){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null),k,v);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+return (((k === (0))) || ((k === (1))));
+});
+
+cljs.core.BlackNode.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (new cljs.core.IndexedSeq([self__.key,self__.val],(0),null));
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (node,meta){
+var self__ = this;
+var node__$1 = this;
+return cljs.core._with_meta(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null),meta);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$ICollection$_conj$arity$2 = (function (node,o){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val,o], null);
+});
+
+cljs.core.BlackNode.prototype.call = (function() {
+var G__11934 = null;
+var G__11934__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var node = self____$1;
+return node.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+var G__11934__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var node = self____$1;
+return node.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+G__11934 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11934__2.call(this,self__,k);
+case 3:
+return G__11934__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11934.cljs$core$IFn$_invoke$arity$2 = G__11934__2;
+G__11934.cljs$core$IFn$_invoke$arity$3 = G__11934__3;
+return G__11934;
+})()
+;
+
+cljs.core.BlackNode.prototype.apply = (function (self__,args11929){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11929)));
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var node = this;
+return node.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var node = this;
+return node.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.BlackNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"key","key",124488940,null),new cljs.core.Symbol(null,"val","val",1769233139,null),new cljs.core.Symbol(null,"left","left",1241415590,null),new cljs.core.Symbol(null,"right","right",1187949694,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.BlackNode.cljs$lang$type = true;
+
+cljs.core.BlackNode.cljs$lang$ctorStr = "cljs.core/BlackNode";
+
+cljs.core.BlackNode.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/BlackNode");
+});
+
+/**
+ * Positional factory function for cljs.core/BlackNode.
+ */
+cljs.core.__GT_BlackNode = (function cljs$core$__GT_BlackNode(key,val,left,right,__hash){
+return (new cljs.core.BlackNode(key,val,left,right,__hash));
+});
+
+var G__11935_11938 = cljs.core.BlackNode.prototype;
+var G__11936_11939 = cljs.core.ITER_SYMBOL;
+var G__11937_11940 = ((function (G__11935_11938,G__11936_11939){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11935_11938,G__11936_11939))
+;
+goog.object.set(G__11935_11938,G__11936_11939,G__11937_11940);
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IVector}
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IFind}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.IStack}
+ * @implements {cljs.core.IMapEntry}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.ILookup}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.RedNode = (function (key,val,left,right,__hash){
+this.key = key;
+this.val = val;
+this.left = left;
+this.right = right;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 166619935;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.RedNode.prototype.cljs$core$IFind$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.RedNode.prototype.cljs$core$IFind$_find$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+var G__11942 = k;
+switch (G__11942) {
+case (0):
+return (new cljs.core.MapEntry((0),self__.key,null));
+
+break;
+case (1):
+return (new cljs.core.MapEntry((1),self__.val,null));
+
+break;
+default:
+return null;
+
+}
+});
+
+cljs.core.RedNode.prototype.lastIndexOf = (function() {
+var G__11944 = null;
+var G__11944__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__11944__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11944 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11944__1.call(this,x);
+case 2:
+return G__11944__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11944.cljs$core$IFn$_invoke$arity$1 = G__11944__1;
+G__11944.cljs$core$IFn$_invoke$arity$2 = G__11944__2;
+return G__11944;
+})()
+;
+
+cljs.core.RedNode.prototype.indexOf = (function() {
+var G__11945 = null;
+var G__11945__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__11945__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__11945 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__11945__1.call(this,x);
+case 2:
+return G__11945__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__11945.cljs$core$IFn$_invoke$arity$1 = G__11945__1;
+G__11945.cljs$core$IFn$_invoke$arity$2 = G__11945__2;
+return G__11945;
+})()
+;
+
+cljs.core.RedNode.prototype.add_right = (function (ins){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(self__.key,self__.val,self__.left,ins,null));
+});
+
+cljs.core.RedNode.prototype.redden = (function (){
+var self__ = this;
+var node = this;
+throw (new Error("red-black tree invariant violation"));
+});
+
+cljs.core.RedNode.prototype.blacken = (function (){
+var self__ = this;
+var node = this;
+return (new cljs.core.BlackNode(self__.key,self__.val,self__.left,self__.right,null));
+});
+
+cljs.core.RedNode.prototype.add_left = (function (ins){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(self__.key,self__.val,ins,self__.right,null));
+});
+
+cljs.core.RedNode.prototype.replace = (function (key__$1,val__$1,left__$1,right__$1){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(key__$1,val__$1,left__$1,right__$1,null));
+});
+
+cljs.core.RedNode.prototype.balance_left = (function (parent){
+var self__ = this;
+var node = this;
+if((self__.left instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(self__.key,self__.val,self__.left.blacken(),(new cljs.core.BlackNode(parent.key,parent.val,self__.right,parent.right,null)),null));
+} else {
+if((self__.right instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(self__.right.key,self__.right.val,(new cljs.core.BlackNode(self__.key,self__.val,self__.left,self__.right.left,null)),(new cljs.core.BlackNode(parent.key,parent.val,self__.right.right,parent.right,null)),null));
+} else {
+return (new cljs.core.BlackNode(parent.key,parent.val,node,parent.right,null));
+
+}
+}
+});
+
+cljs.core.RedNode.prototype.balance_right = (function (parent){
+var self__ = this;
+var node = this;
+if((self__.right instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(self__.key,self__.val,(new cljs.core.BlackNode(parent.key,parent.val,parent.left,self__.left,null)),self__.right.blacken(),null));
+} else {
+if((self__.left instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(self__.left.key,self__.left.val,(new cljs.core.BlackNode(parent.key,parent.val,parent.left,self__.left.left,null)),(new cljs.core.BlackNode(self__.key,self__.val,self__.left.right,self__.right,null)),null));
+} else {
+return (new cljs.core.BlackNode(parent.key,parent.val,parent.left,node,null));
+
+}
+}
+});
+
+cljs.core.RedNode.prototype.remove_left = (function (del){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(self__.key,self__.val,del,self__.right,null));
+});
+
+cljs.core.RedNode.prototype.kv_reduce = (function (f,init){
+var self__ = this;
+var node = this;
+return cljs.core.tree_map_kv_reduce(node,f,init);
+});
+
+cljs.core.RedNode.prototype.remove_right = (function (del){
+var self__ = this;
+var node = this;
+return (new cljs.core.RedNode(self__.key,self__.val,self__.left,del,null));
+});
+
+cljs.core.RedNode.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+return node__$1.cljs$core$IIndexed$_nth$arity$3(null,k,null);
+});
+
+cljs.core.RedNode.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (node,k,not_found){
+var self__ = this;
+var node__$1 = this;
+return node__$1.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (node,n){
+var self__ = this;
+var node__$1 = this;
+if((n === (0))){
+return self__.key;
+} else {
+if((n === (1))){
+return self__.val;
+} else {
+throw (new Error("Index out of bounds"));
+
+}
+}
+});
+
+cljs.core.RedNode.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (node,n,not_found){
+var self__ = this;
+var node__$1 = this;
+if((n === (0))){
+return self__.key;
+} else {
+if((n === (1))){
+return self__.val;
+} else {
+return not_found;
+
+}
+}
+});
+
+cljs.core.RedNode.prototype.cljs$core$IVector$_assoc_n$arity$3 = (function (node,n,v){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null).cljs$core$IVector$_assoc_n$arity$3(null,n,v);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IMeta$_meta$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return null;
+});
+
+cljs.core.RedNode.prototype.cljs$core$ICounted$_count$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (2);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IMapEntry$_key$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.key;
+});
+
+cljs.core.RedNode.prototype.cljs$core$IMapEntry$_val$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.val;
+});
+
+cljs.core.RedNode.prototype.cljs$core$IStack$_peek$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return self__.val;
+});
+
+cljs.core.RedNode.prototype.cljs$core$IStack$_pop$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key], null);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (new cljs.core.IndexedSeq([self__.val,self__.key],(0),null));
+});
+
+cljs.core.RedNode.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.RedNode.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return null;
+});
+
+cljs.core.RedNode.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (node,f){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2(node__$1,f);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (node,f,start){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3(node__$1,f,start);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (node,k,v){
+var self__ = this;
+var node__$1 = this;
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null),k,v);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (node,k){
+var self__ = this;
+var node__$1 = this;
+return (((k === (0))) || ((k === (1))));
+});
+
+cljs.core.RedNode.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (node){
+var self__ = this;
+var node__$1 = this;
+return (new cljs.core.IndexedSeq([self__.key,self__.val],(0),null));
+});
+
+cljs.core.RedNode.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (node,meta){
+var self__ = this;
+var node__$1 = this;
+return cljs.core._with_meta(new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val], null),meta);
+});
+
+cljs.core.RedNode.prototype.cljs$core$ICollection$_conj$arity$2 = (function (node,o){
+var self__ = this;
+var node__$1 = this;
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [self__.key,self__.val,o], null);
+});
+
+cljs.core.RedNode.prototype.call = (function() {
+var G__11946 = null;
+var G__11946__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var node = self____$1;
+return node.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+var G__11946__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var node = self____$1;
+return node.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+G__11946 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__11946__2.call(this,self__,k);
+case 3:
+return G__11946__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__11946.cljs$core$IFn$_invoke$arity$2 = G__11946__2;
+G__11946.cljs$core$IFn$_invoke$arity$3 = G__11946__3;
+return G__11946;
+})()
+;
+
+cljs.core.RedNode.prototype.apply = (function (self__,args11941){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11941)));
+});
+
+cljs.core.RedNode.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var node = this;
+return node.cljs$core$IIndexed$_nth$arity$2(null,k);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var node = this;
+return node.cljs$core$IIndexed$_nth$arity$3(null,k,not_found);
+});
+
+cljs.core.RedNode.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"key","key",124488940,null),new cljs.core.Symbol(null,"val","val",1769233139,null),new cljs.core.Symbol(null,"left","left",1241415590,null),new cljs.core.Symbol(null,"right","right",1187949694,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.RedNode.cljs$lang$type = true;
+
+cljs.core.RedNode.cljs$lang$ctorStr = "cljs.core/RedNode";
+
+cljs.core.RedNode.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/RedNode");
+});
+
+/**
+ * Positional factory function for cljs.core/RedNode.
+ */
+cljs.core.__GT_RedNode = (function cljs$core$__GT_RedNode(key,val,left,right,__hash){
+return (new cljs.core.RedNode(key,val,left,right,__hash));
+});
+
+var G__11947_11950 = cljs.core.RedNode.prototype;
+var G__11948_11951 = cljs.core.ITER_SYMBOL;
+var G__11949_11952 = ((function (G__11947_11950,G__11948_11951){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__11947_11950,G__11948_11951))
+;
+goog.object.set(G__11947_11950,G__11948_11951,G__11949_11952);
+cljs.core.tree_map_add = (function cljs$core$tree_map_add(comp,tree,k,v,found){
+if((tree == null)){
+return (new cljs.core.RedNode(k,v,null,null,null));
+} else {
+var c = (function (){var G__11953 = k;
+var G__11954 = tree.key;
+return (comp.cljs$core$IFn$_invoke$arity$2 ? comp.cljs$core$IFn$_invoke$arity$2(G__11953,G__11954) : comp.call(null,G__11953,G__11954));
+})();
+if((c === (0))){
+(found[(0)] = tree);
+
+return null;
+} else {
+if((c < (0))){
+var ins = (function (){var G__11955 = comp;
+var G__11956 = tree.left;
+var G__11957 = k;
+var G__11958 = v;
+var G__11959 = found;
+return (cljs.core.tree_map_add.cljs$core$IFn$_invoke$arity$5 ? cljs.core.tree_map_add.cljs$core$IFn$_invoke$arity$5(G__11955,G__11956,G__11957,G__11958,G__11959) : cljs.core.tree_map_add.call(null,G__11955,G__11956,G__11957,G__11958,G__11959));
+})();
+if((!((ins == null)))){
+return tree.add_left(ins);
+} else {
+return null;
+}
+} else {
+var ins = (function (){var G__11960 = comp;
+var G__11961 = tree.right;
+var G__11962 = k;
+var G__11963 = v;
+var G__11964 = found;
+return (cljs.core.tree_map_add.cljs$core$IFn$_invoke$arity$5 ? cljs.core.tree_map_add.cljs$core$IFn$_invoke$arity$5(G__11960,G__11961,G__11962,G__11963,G__11964) : cljs.core.tree_map_add.call(null,G__11960,G__11961,G__11962,G__11963,G__11964));
+})();
+if((!((ins == null)))){
+return tree.add_right(ins);
+} else {
+return null;
+}
+
+}
+}
+}
+});
+cljs.core.tree_map_append = (function cljs$core$tree_map_append(left,right){
+if((left == null)){
+return right;
+} else {
+if((right == null)){
+return left;
+} else {
+if((left instanceof cljs.core.RedNode)){
+if((right instanceof cljs.core.RedNode)){
+var app = (function (){var G__11965 = left.right;
+var G__11966 = right.left;
+return (cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2 ? cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2(G__11965,G__11966) : cljs.core.tree_map_append.call(null,G__11965,G__11966));
+})();
+if((app instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(app.key,app.val,(new cljs.core.RedNode(left.key,left.val,left.left,app.left,null)),(new cljs.core.RedNode(right.key,right.val,app.right,right.right,null)),null));
+} else {
+return (new cljs.core.RedNode(left.key,left.val,left.left,(new cljs.core.RedNode(right.key,right.val,app,right.right,null)),null));
+}
+} else {
+return (new cljs.core.RedNode(left.key,left.val,left.left,(function (){var G__11967 = left.right;
+var G__11968 = right;
+return (cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2 ? cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2(G__11967,G__11968) : cljs.core.tree_map_append.call(null,G__11967,G__11968));
+})(),null));
+}
+} else {
+if((right instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(right.key,right.val,(function (){var G__11969 = left;
+var G__11970 = right.left;
+return (cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2 ? cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2(G__11969,G__11970) : cljs.core.tree_map_append.call(null,G__11969,G__11970));
+})(),right.right,null));
+} else {
+var app = (function (){var G__11971 = left.right;
+var G__11972 = right.left;
+return (cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2 ? cljs.core.tree_map_append.cljs$core$IFn$_invoke$arity$2(G__11971,G__11972) : cljs.core.tree_map_append.call(null,G__11971,G__11972));
+})();
+if((app instanceof cljs.core.RedNode)){
+return (new cljs.core.RedNode(app.key,app.val,(new cljs.core.BlackNode(left.key,left.val,left.left,app.left,null)),(new cljs.core.BlackNode(right.key,right.val,app.right,right.right,null)),null));
+} else {
+return cljs.core.balance_left_del(left.key,left.val,left.left,(new cljs.core.BlackNode(right.key,right.val,app,right.right,null)));
+}
+
+}
+}
+}
+}
+});
+cljs.core.tree_map_remove = (function cljs$core$tree_map_remove(comp,tree,k,found){
+if((!((tree == null)))){
+var c = (function (){var G__11973 = k;
+var G__11974 = tree.key;
+return (comp.cljs$core$IFn$_invoke$arity$2 ? comp.cljs$core$IFn$_invoke$arity$2(G__11973,G__11974) : comp.call(null,G__11973,G__11974));
+})();
+if((c === (0))){
+(found[(0)] = tree);
+
+return cljs.core.tree_map_append(tree.left,tree.right);
+} else {
+if((c < (0))){
+var del = (function (){var G__11975 = comp;
+var G__11976 = tree.left;
+var G__11977 = k;
+var G__11978 = found;
+return (cljs.core.tree_map_remove.cljs$core$IFn$_invoke$arity$4 ? cljs.core.tree_map_remove.cljs$core$IFn$_invoke$arity$4(G__11975,G__11976,G__11977,G__11978) : cljs.core.tree_map_remove.call(null,G__11975,G__11976,G__11977,G__11978));
+})();
+if((((!((del == null)))) || ((!(((found[(0)]) == null)))))){
+if((tree.left instanceof cljs.core.BlackNode)){
+return cljs.core.balance_left_del(tree.key,tree.val,del,tree.right);
+} else {
+return (new cljs.core.RedNode(tree.key,tree.val,del,tree.right,null));
+}
+} else {
+return null;
+}
+} else {
+var del = (function (){var G__11979 = comp;
+var G__11980 = tree.right;
+var G__11981 = k;
+var G__11982 = found;
+return (cljs.core.tree_map_remove.cljs$core$IFn$_invoke$arity$4 ? cljs.core.tree_map_remove.cljs$core$IFn$_invoke$arity$4(G__11979,G__11980,G__11981,G__11982) : cljs.core.tree_map_remove.call(null,G__11979,G__11980,G__11981,G__11982));
+})();
+if((((!((del == null)))) || ((!(((found[(0)]) == null)))))){
+if((tree.right instanceof cljs.core.BlackNode)){
+return cljs.core.balance_right_del(tree.key,tree.val,tree.left,del);
+} else {
+return (new cljs.core.RedNode(tree.key,tree.val,tree.left,del,null));
+}
+} else {
+return null;
+}
+
+}
+}
+} else {
+return null;
+}
+});
+cljs.core.tree_map_replace = (function cljs$core$tree_map_replace(comp,tree,k,v){
+var tk = tree.key;
+var c = (comp.cljs$core$IFn$_invoke$arity$2 ? comp.cljs$core$IFn$_invoke$arity$2(k,tk) : comp.call(null,k,tk));
+if((c === (0))){
+return tree.replace(tk,v,tree.left,tree.right);
+} else {
+if((c < (0))){
+return tree.replace(tk,tree.val,(function (){var G__11983 = comp;
+var G__11984 = tree.left;
+var G__11985 = k;
+var G__11986 = v;
+return (cljs.core.tree_map_replace.cljs$core$IFn$_invoke$arity$4 ? cljs.core.tree_map_replace.cljs$core$IFn$_invoke$arity$4(G__11983,G__11984,G__11985,G__11986) : cljs.core.tree_map_replace.call(null,G__11983,G__11984,G__11985,G__11986));
+})(),tree.right);
+} else {
+return tree.replace(tk,tree.val,tree.left,(function (){var G__11987 = comp;
+var G__11988 = tree.right;
+var G__11989 = k;
+var G__11990 = v;
+return (cljs.core.tree_map_replace.cljs$core$IFn$_invoke$arity$4 ? cljs.core.tree_map_replace.cljs$core$IFn$_invoke$arity$4(G__11987,G__11988,G__11989,G__11990) : cljs.core.tree_map_replace.call(null,G__11987,G__11988,G__11989,G__11990));
+})());
+
+}
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IKVReduce}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IFind}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISorted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IAssociative}
+ * @implements {cljs.core.IMap}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.PersistentTreeMap = (function (comp,tree,cnt,meta,__hash){
+this.comp = comp;
+this.tree = tree;
+this.cnt = cnt;
+this.meta = meta;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 418776847;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+});
+cljs.core.PersistentTreeMap.prototype.cljs$core$IFind$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IFind$_find$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.entry_at(k);
+});
+
+cljs.core.PersistentTreeMap.prototype.forEach = (function (f){
+var self__ = this;
+var coll = this;
+var seq__11992 = cljs.core.seq(coll);
+var chunk__11993 = null;
+var count__11994 = (0);
+var i__11995 = (0);
+while(true){
+if((i__11995 < count__11994)){
+var vec__11996 = chunk__11993.cljs$core$IIndexed$_nth$arity$2(null,i__11995);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11996,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11996,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+
+var G__12006 = seq__11992;
+var G__12007 = chunk__11993;
+var G__12008 = count__11994;
+var G__12009 = (i__11995 + (1));
+seq__11992 = G__12006;
+chunk__11993 = G__12007;
+count__11994 = G__12008;
+i__11995 = G__12009;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__11992);
+if(temp__4657__auto__){
+var seq__11992__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__11992__$1)){
+var c__8664__auto__ = cljs.core.chunk_first(seq__11992__$1);
+var G__12010 = cljs.core.chunk_rest(seq__11992__$1);
+var G__12011 = c__8664__auto__;
+var G__12012 = cljs.core.count(c__8664__auto__);
+var G__12013 = (0);
+seq__11992 = G__12010;
+chunk__11993 = G__12011;
+count__11994 = G__12012;
+i__11995 = G__12013;
+continue;
+} else {
+var vec__11999 = cljs.core.first(seq__11992__$1);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11999,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__11999,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+
+var G__12014 = cljs.core.next(seq__11992__$1);
+var G__12015 = null;
+var G__12016 = (0);
+var G__12017 = (0);
+seq__11992 = G__12014;
+chunk__11993 = G__12015;
+count__11994 = G__12016;
+i__11995 = G__12017;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.get = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentTreeMap.prototype.entries = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_entries_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentTreeMap.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentTreeMap.prototype.keys = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.keys(coll));
+});
+
+cljs.core.PersistentTreeMap.prototype.values = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.vals(coll));
+});
+
+cljs.core.PersistentTreeMap.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentTreeMap.prototype.entry_at = (function (k){
+var self__ = this;
+var coll = this;
+var t = self__.tree;
+while(true){
+if((!((t == null)))){
+var c = (function (){var G__12002 = k;
+var G__12003 = t.key;
+return (self__.comp.cljs$core$IFn$_invoke$arity$2 ? self__.comp.cljs$core$IFn$_invoke$arity$2(G__12002,G__12003) : self__.comp.call(null,G__12002,G__12003));
+})();
+if((c === (0))){
+return t;
+} else {
+if((c < (0))){
+var G__12018 = t.left;
+t = G__12018;
+continue;
+} else {
+var G__12019 = t.right;
+t = G__12019;
+continue;
+
+}
+}
+} else {
+return null;
+}
+break;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.has = (function (k){
+var self__ = this;
+var coll = this;
+return cljs.core.contains_QMARK_(coll,k);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,k,null);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,k,not_found){
+var self__ = this;
+var coll__$1 = this;
+var n = coll__$1.entry_at(k);
+if((!((n == null)))){
+return n.val;
+} else {
+return not_found;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IKVReduce$_kv_reduce$arity$3 = (function (coll,f,init){
+var self__ = this;
+var coll__$1 = this;
+if((!((self__.tree == null)))){
+return cljs.core.unreduced(cljs.core.tree_map_kv_reduce(self__.tree,f,init));
+} else {
+return init;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentTreeMap(self__.comp,self__.tree,self__.cnt,self__.meta,self__.__hash));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.cnt;
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+return cljs.core.create_tree_map_seq(self__.tree,false,self__.cnt);
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_map(coll__$1,other);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeMap(self__.comp,null,(0),self__.meta,(0)));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IMap$_dissoc$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+var found = [null];
+var t = cljs.core.tree_map_remove(self__.comp,self__.tree,k,found);
+if((t == null)){
+if((cljs.core.nth.cljs$core$IFn$_invoke$arity$2(found,(0)) == null)){
+return coll__$1;
+} else {
+return (new cljs.core.PersistentTreeMap(self__.comp,null,(0),self__.meta,null));
+}
+} else {
+return (new cljs.core.PersistentTreeMap(self__.comp,t.blacken(),(self__.cnt - (1)),self__.meta,null));
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IAssociative$_assoc$arity$3 = (function (coll,k,v){
+var self__ = this;
+var coll__$1 = this;
+var found = [null];
+var t = cljs.core.tree_map_add(self__.comp,self__.tree,k,v,found);
+if((t == null)){
+var found_node = cljs.core.nth.cljs$core$IFn$_invoke$arity$2(found,(0));
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(v,found_node.val)){
+return coll__$1;
+} else {
+return (new cljs.core.PersistentTreeMap(self__.comp,cljs.core.tree_map_replace(self__.comp,self__.tree,k,v),self__.cnt,self__.meta,null));
+}
+} else {
+return (new cljs.core.PersistentTreeMap(self__.comp,t.blacken(),(self__.cnt + (1)),self__.meta,null));
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IAssociative$_contains_key_QMARK_$arity$2 = (function (coll,k){
+var self__ = this;
+var coll__$1 = this;
+return (!((coll__$1.entry_at(k) == null)));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+return cljs.core.create_tree_map_seq(self__.tree,true,self__.cnt);
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeMap(self__.comp,self__.tree,self__.cnt,meta__$1,self__.__hash));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+if(cljs.core.vector_QMARK_(entry)){
+return coll__$1.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(entry,(1)));
+} else {
+var ret = coll__$1;
+var es = cljs.core.seq(entry);
+while(true){
+if((es == null)){
+return ret;
+} else {
+var e = cljs.core.first(es);
+if(cljs.core.vector_QMARK_(e)){
+var G__12020 = ret.cljs$core$IAssociative$_assoc$arity$3(null,cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(0)),cljs.core._nth.cljs$core$IFn$_invoke$arity$2(e,(1)));
+var G__12021 = cljs.core.next(es);
+ret = G__12020;
+es = G__12021;
+continue;
+} else {
+throw (new Error("conj on a map takes map entries or seqables of map entries"));
+}
+}
+break;
+}
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.call = (function() {
+var G__12022 = null;
+var G__12022__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__12022__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__12022 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__12022__2.call(this,self__,k);
+case 3:
+return G__12022__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__12022.cljs$core$IFn$_invoke$arity$2 = G__12022__2;
+G__12022.cljs$core$IFn$_invoke$arity$3 = G__12022__3;
+return G__12022;
+})()
+;
+
+cljs.core.PersistentTreeMap.prototype.apply = (function (self__,args11991){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args11991)));
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ISorted$_sorted_seq$arity$2 = (function (coll,ascending_QMARK_){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+return cljs.core.create_tree_map_seq(self__.tree,ascending_QMARK_,self__.cnt);
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ISorted$_sorted_seq_from$arity$3 = (function (coll,k,ascending_QMARK_){
+var self__ = this;
+var coll__$1 = this;
+if((self__.cnt > (0))){
+var stack = null;
+var t = self__.tree;
+while(true){
+if((!((t == null)))){
+var c = (function (){var G__12004 = k;
+var G__12005 = t.key;
+return (self__.comp.cljs$core$IFn$_invoke$arity$2 ? self__.comp.cljs$core$IFn$_invoke$arity$2(G__12004,G__12005) : self__.comp.call(null,G__12004,G__12005));
+})();
+if((c === (0))){
+return (new cljs.core.PersistentTreeMapSeq(null,cljs.core.conj.cljs$core$IFn$_invoke$arity$2(stack,t),ascending_QMARK_,(-1),null));
+} else {
+if(cljs.core.truth_(ascending_QMARK_)){
+if((c < (0))){
+var G__12023 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(stack,t);
+var G__12024 = t.left;
+stack = G__12023;
+t = G__12024;
+continue;
+} else {
+var G__12025 = stack;
+var G__12026 = t.right;
+stack = G__12025;
+t = G__12026;
+continue;
+}
+} else {
+if((c > (0))){
+var G__12027 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(stack,t);
+var G__12028 = t.right;
+stack = G__12027;
+t = G__12028;
+continue;
+} else {
+var G__12029 = stack;
+var G__12030 = t.left;
+stack = G__12029;
+t = G__12030;
+continue;
+}
+
+}
+}
+} else {
+if((stack == null)){
+return null;
+} else {
+return (new cljs.core.PersistentTreeMapSeq(null,stack,ascending_QMARK_,(-1),null));
+}
+}
+break;
+}
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ISorted$_entry_key$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.key(entry);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$ISorted$_comparator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.comp;
+});
+
+cljs.core.PersistentTreeMap.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"comp","comp",-1462482139,null),new cljs.core.Symbol(null,"tree","tree",1444219499,null),new cljs.core.Symbol(null,"cnt","cnt",1924510325,null),new cljs.core.Symbol(null,"meta","meta",-1154898805,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentTreeMap.cljs$lang$type = true;
+
+cljs.core.PersistentTreeMap.cljs$lang$ctorStr = "cljs.core/PersistentTreeMap";
+
+cljs.core.PersistentTreeMap.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentTreeMap");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentTreeMap.
+ */
+cljs.core.__GT_PersistentTreeMap = (function cljs$core$__GT_PersistentTreeMap(comp,tree,cnt,meta,__hash){
+return (new cljs.core.PersistentTreeMap(comp,tree,cnt,meta,__hash));
+});
+
+cljs.core.PersistentTreeMap.EMPTY = (new cljs.core.PersistentTreeMap(cljs.core.compare,null,(0),null,cljs.core.empty_unordered_hash));
+var G__12031_12034 = cljs.core.PersistentTreeMap.prototype;
+var G__12032_12035 = cljs.core.ITER_SYMBOL;
+var G__12033_12036 = ((function (G__12031_12034,G__12032_12035){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__12031_12034,G__12032_12035))
+;
+goog.object.set(G__12031_12034,G__12032_12035,G__12033_12036);
+/**
+ * keyval => key val
+ * Returns a new hash map with supplied mappings.
+ */
+cljs.core.hash_map = (function cljs$core$hash_map(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12038 = arguments.length;
+var i__9001__auto___12039 = (0);
+while(true){
+if((i__9001__auto___12039 < len__9000__auto___12038)){
+args__9010__auto__.push((arguments[i__9001__auto___12039]));
+
+var G__12040 = (i__9001__auto___12039 + (1));
+i__9001__auto___12039 = G__12040;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.hash_map.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.hash_map.cljs$core$IFn$_invoke$arity$variadic = (function (keyvals){
+var in$ = cljs.core.seq(keyvals);
+var out = cljs.core.transient$(cljs.core.PersistentHashMap.EMPTY);
+while(true){
+if(in$){
+var G__12041 = cljs.core.nnext(in$);
+var G__12042 = cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(out,cljs.core.first(in$),cljs.core.second(in$));
+in$ = G__12041;
+out = G__12042;
+continue;
+} else {
+return cljs.core.persistent_BANG_(out);
+}
+break;
+}
+});
+
+cljs.core.hash_map.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.hash_map.cljs$lang$applyTo = (function (seq12037){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12037));
+});
+
+/**
+ * keyval => key val
+ * Returns a new array map with supplied mappings.
+ */
+cljs.core.array_map = (function cljs$core$array_map(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12044 = arguments.length;
+var i__9001__auto___12045 = (0);
+while(true){
+if((i__9001__auto___12045 < len__9000__auto___12044)){
+args__9010__auto__.push((arguments[i__9001__auto___12045]));
+
+var G__12046 = (i__9001__auto___12045 + (1));
+i__9001__auto___12045 = G__12046;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.array_map.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.array_map.cljs$core$IFn$_invoke$arity$variadic = (function (keyvals){
+var arr = (((((keyvals instanceof cljs.core.IndexedSeq)) && ((keyvals.i === (0)))))?keyvals.arr:cljs.core.into_array.cljs$core$IFn$_invoke$arity$1(keyvals));
+return cljs.core.PersistentArrayMap.createAsIfByAssoc(arr);
+});
+
+cljs.core.array_map.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.array_map.cljs$lang$applyTo = (function (seq12043){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12043));
+});
+
+/**
+ * keyval => key val
+ * Returns a new object map with supplied mappings.
+ */
+cljs.core.obj_map = (function cljs$core$obj_map(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12053 = arguments.length;
+var i__9001__auto___12054 = (0);
+while(true){
+if((i__9001__auto___12054 < len__9000__auto___12053)){
+args__9010__auto__.push((arguments[i__9001__auto___12054]));
+
+var G__12055 = (i__9001__auto___12054 + (1));
+i__9001__auto___12054 = G__12055;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.obj_map.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.obj_map.cljs$core$IFn$_invoke$arity$variadic = (function (keyvals){
+var ks = [];
+var obj = {};
+var kvs = cljs.core.seq(keyvals);
+while(true){
+if(kvs){
+ks.push(cljs.core.first(kvs));
+
+var G__12050_12056 = obj;
+var G__12051_12057 = cljs.core.first(kvs);
+var G__12052_12058 = cljs.core.second(kvs);
+goog.object.set(G__12050_12056,G__12051_12057,G__12052_12058);
+
+var G__12059 = cljs.core.nnext(kvs);
+kvs = G__12059;
+continue;
+} else {
+return cljs.core.ObjMap.fromObject(ks,obj);
+}
+break;
+}
+});
+
+cljs.core.obj_map.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.obj_map.cljs$lang$applyTo = (function (seq12047){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12047));
+});
+
+/**
+ * keyval => key val
+ * Returns a new sorted map with supplied mappings.
+ */
+cljs.core.sorted_map = (function cljs$core$sorted_map(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12061 = arguments.length;
+var i__9001__auto___12062 = (0);
+while(true){
+if((i__9001__auto___12062 < len__9000__auto___12061)){
+args__9010__auto__.push((arguments[i__9001__auto___12062]));
+
+var G__12063 = (i__9001__auto___12062 + (1));
+i__9001__auto___12062 = G__12063;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.sorted_map.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.sorted_map.cljs$core$IFn$_invoke$arity$variadic = (function (keyvals){
+var in$ = cljs.core.seq(keyvals);
+var out = cljs.core.PersistentTreeMap.EMPTY;
+while(true){
+if(in$){
+var G__12064 = cljs.core.nnext(in$);
+var G__12065 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(out,cljs.core.first(in$),cljs.core.second(in$));
+in$ = G__12064;
+out = G__12065;
+continue;
+} else {
+return out;
+}
+break;
+}
+});
+
+cljs.core.sorted_map.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.sorted_map.cljs$lang$applyTo = (function (seq12060){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12060));
+});
+
+/**
+ * keyval => key val
+ * Returns a new sorted map with supplied mappings, using the supplied comparator.
+ */
+cljs.core.sorted_map_by = (function cljs$core$sorted_map_by(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12068 = arguments.length;
+var i__9001__auto___12069 = (0);
+while(true){
+if((i__9001__auto___12069 < len__9000__auto___12068)){
+args__9010__auto__.push((arguments[i__9001__auto___12069]));
+
+var G__12070 = (i__9001__auto___12069 + (1));
+i__9001__auto___12069 = G__12070;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((1) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((1)),(0),null)):null);
+return cljs.core.sorted_map_by.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9011__auto__);
+});
+
+cljs.core.sorted_map_by.cljs$core$IFn$_invoke$arity$variadic = (function (comparator,keyvals){
+var in$ = cljs.core.seq(keyvals);
+var out = (new cljs.core.PersistentTreeMap(cljs.core.fn__GT_comparator(comparator),null,(0),null,(0)));
+while(true){
+if(in$){
+var G__12071 = cljs.core.nnext(in$);
+var G__12072 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(out,cljs.core.first(in$),cljs.core.second(in$));
+in$ = G__12071;
+out = G__12072;
+continue;
+} else {
+return out;
+}
+break;
+}
+});
+
+cljs.core.sorted_map_by.cljs$lang$maxFixedArity = (1);
+
+/** @this {Function} */
+cljs.core.sorted_map_by.cljs$lang$applyTo = (function (seq12066){
+var G__12067 = cljs.core.first(seq12066);
+var seq12066__$1 = cljs.core.next(seq12066);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12067,seq12066__$1);
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.KeySeq = (function (mseq,_meta){
+this.mseq = mseq;
+this._meta = _meta;
+this.cljs$lang$protocol_mask$partition0$ = 32374988;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.KeySeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.KeySeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.KeySeq.prototype.indexOf = (function() {
+var G__12075 = null;
+var G__12075__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__12075__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__12075 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__12075__1.call(this,x);
+case 2:
+return G__12075__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12075.cljs$core$IFn$_invoke$arity$1 = G__12075__1;
+G__12075.cljs$core$IFn$_invoke$arity$2 = G__12075__2;
+return G__12075;
+})()
+;
+
+cljs.core.KeySeq.prototype.lastIndexOf = (function() {
+var G__12076 = null;
+var G__12076__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__12076__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__12076 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__12076__1.call(this,x);
+case 2:
+return G__12076__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12076.cljs$core$IFn$_invoke$arity$1 = G__12076__1;
+G__12076.cljs$core$IFn$_invoke$arity$2 = G__12076__2;
+return G__12076;
+})()
+;
+
+cljs.core.KeySeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__._meta;
+});
+
+cljs.core.KeySeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var nseq = (((((!((self__.mseq == null))))?(((((self__.mseq.cljs$lang$protocol_mask$partition0$ & (128))) || ((cljs.core.PROTOCOL_SENTINEL === self__.mseq.cljs$core$INext$))))?true:(((!self__.mseq.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq):false)):cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq)))?self__.mseq.cljs$core$INext$_next$arity$1(null):cljs.core.next(self__.mseq));
+if((nseq == null)){
+return null;
+} else {
+return (new cljs.core.KeySeq(nseq,self__._meta));
+}
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.hash_ordered_coll(coll__$1);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__._meta);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var me = self__.mseq.cljs$core$ISeq$_first$arity$1(null);
+return me.cljs$core$IMapEntry$_key$arity$1(null);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var nseq = (((((!((self__.mseq == null))))?(((((self__.mseq.cljs$lang$protocol_mask$partition0$ & (128))) || ((cljs.core.PROTOCOL_SENTINEL === self__.mseq.cljs$core$INext$))))?true:(((!self__.mseq.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq):false)):cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq)))?self__.mseq.cljs$core$INext$_next$arity$1(null):cljs.core.next(self__.mseq));
+if((!((nseq == null)))){
+return (new cljs.core.KeySeq(nseq,self__._meta));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.KeySeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,new_meta){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.KeySeq(self__.mseq,new_meta));
+});
+
+cljs.core.KeySeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.KeySeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"mseq","mseq",1602647196,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"not-native","not-native",-236392494,null)], null)),new cljs.core.Symbol(null,"_meta","_meta",-1716892533,null)], null);
+});
+
+cljs.core.KeySeq.cljs$lang$type = true;
+
+cljs.core.KeySeq.cljs$lang$ctorStr = "cljs.core/KeySeq";
+
+cljs.core.KeySeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/KeySeq");
+});
+
+/**
+ * Positional factory function for cljs.core/KeySeq.
+ */
+cljs.core.__GT_KeySeq = (function cljs$core$__GT_KeySeq(mseq,_meta){
+return (new cljs.core.KeySeq(mseq,_meta));
+});
+
+var G__12077_12080 = cljs.core.KeySeq.prototype;
+var G__12078_12081 = cljs.core.ITER_SYMBOL;
+var G__12079_12082 = ((function (G__12077_12080,G__12078_12081){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__12077_12080,G__12078_12081))
+;
+goog.object.set(G__12077_12080,G__12078_12081,G__12079_12082);
+/**
+ * Returns a sequence of the map's keys.
+ */
+cljs.core.keys = (function cljs$core$keys(hash_map){
+var temp__4657__auto__ = cljs.core.seq(hash_map);
+if(temp__4657__auto__){
+var mseq = temp__4657__auto__;
+return (new cljs.core.KeySeq(mseq,null));
+} else {
+return null;
+}
+});
+/**
+ * Returns the key of the map entry.
+ */
+cljs.core.key = (function cljs$core$key(map_entry){
+return cljs.core._key(map_entry);
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.ValSeq = (function (mseq,_meta){
+this.mseq = mseq;
+this._meta = _meta;
+this.cljs$lang$protocol_mask$partition0$ = 32374988;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.ValSeq.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.ValSeq.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.ValSeq.prototype.indexOf = (function() {
+var G__12085 = null;
+var G__12085__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__12085__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__12085 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__12085__1.call(this,x);
+case 2:
+return G__12085__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12085.cljs$core$IFn$_invoke$arity$1 = G__12085__1;
+G__12085.cljs$core$IFn$_invoke$arity$2 = G__12085__2;
+return G__12085;
+})()
+;
+
+cljs.core.ValSeq.prototype.lastIndexOf = (function() {
+var G__12086 = null;
+var G__12086__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__12086__2 = (function (x,start){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start);
+});
+G__12086 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__12086__1.call(this,x);
+case 2:
+return G__12086__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12086.cljs$core$IFn$_invoke$arity$1 = G__12086__1;
+G__12086.cljs$core$IFn$_invoke$arity$2 = G__12086__2;
+return G__12086;
+})()
+;
+
+cljs.core.ValSeq.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__._meta;
+});
+
+cljs.core.ValSeq.prototype.cljs$core$INext$_next$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var nseq = (((((!((self__.mseq == null))))?(((((self__.mseq.cljs$lang$protocol_mask$partition0$ & (128))) || ((cljs.core.PROTOCOL_SENTINEL === self__.mseq.cljs$core$INext$))))?true:(((!self__.mseq.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq):false)):cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq)))?self__.mseq.cljs$core$INext$_next$arity$1(null):cljs.core.next(self__.mseq));
+if((nseq == null)){
+return null;
+} else {
+return (new cljs.core.ValSeq(nseq,self__._meta));
+}
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.hash_ordered_coll(coll__$1);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.equiv_sequential(coll__$1,other);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__._meta);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (coll,f){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2(f,coll__$1);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (coll,f,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3(f,start,coll__$1);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$ISeq$_first$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var me = self__.mseq.cljs$core$ISeq$_first$arity$1(null);
+return me.cljs$core$IMapEntry$_val$arity$1(null);
+});
+
+cljs.core.ValSeq.prototype.cljs$core$ISeq$_rest$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var nseq = (((((!((self__.mseq == null))))?(((((self__.mseq.cljs$lang$protocol_mask$partition0$ & (128))) || ((cljs.core.PROTOCOL_SENTINEL === self__.mseq.cljs$core$INext$))))?true:(((!self__.mseq.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq):false)):cljs.core.native_satisfies_QMARK_(cljs.core.INext,self__.mseq)))?self__.mseq.cljs$core$INext$_next$arity$1(null):cljs.core.next(self__.mseq));
+if((!((nseq == null)))){
+return (new cljs.core.ValSeq(nseq,self__._meta));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.ValSeq.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1;
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,new_meta){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.ValSeq(self__.mseq,new_meta));
+});
+
+cljs.core.ValSeq.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.cons(o,coll__$1);
+});
+
+cljs.core.ValSeq.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"mseq","mseq",1602647196,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"tag","tag",-1290361223),new cljs.core.Symbol(null,"not-native","not-native",-236392494,null)], null)),new cljs.core.Symbol(null,"_meta","_meta",-1716892533,null)], null);
+});
+
+cljs.core.ValSeq.cljs$lang$type = true;
+
+cljs.core.ValSeq.cljs$lang$ctorStr = "cljs.core/ValSeq";
+
+cljs.core.ValSeq.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ValSeq");
+});
+
+/**
+ * Positional factory function for cljs.core/ValSeq.
+ */
+cljs.core.__GT_ValSeq = (function cljs$core$__GT_ValSeq(mseq,_meta){
+return (new cljs.core.ValSeq(mseq,_meta));
+});
+
+var G__12087_12090 = cljs.core.ValSeq.prototype;
+var G__12088_12091 = cljs.core.ITER_SYMBOL;
+var G__12089_12092 = ((function (G__12087_12090,G__12088_12091){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__12087_12090,G__12088_12091))
+;
+goog.object.set(G__12087_12090,G__12088_12091,G__12089_12092);
+/**
+ * Returns a sequence of the map's values.
+ */
+cljs.core.vals = (function cljs$core$vals(hash_map){
+var temp__4657__auto__ = cljs.core.seq(hash_map);
+if(temp__4657__auto__){
+var mseq = temp__4657__auto__;
+return (new cljs.core.ValSeq(mseq,null));
+} else {
+return null;
+}
+});
+/**
+ * Returns the value in the map entry.
+ */
+cljs.core.val = (function cljs$core$val(map_entry){
+return cljs.core._val(map_entry);
+});
+/**
+ * Returns a map that consists of the rest of the maps conj-ed onto
+ * the first. If a key occurs in more than one map, the mapping from
+ * the latter (left-to-right) will be the mapping in the result.
+ */
+cljs.core.merge = (function cljs$core$merge(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12096 = arguments.length;
+var i__9001__auto___12097 = (0);
+while(true){
+if((i__9001__auto___12097 < len__9000__auto___12096)){
+args__9010__auto__.push((arguments[i__9001__auto___12097]));
+
+var G__12098 = (i__9001__auto___12097 + (1));
+i__9001__auto___12097 = G__12098;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.merge.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.merge.cljs$core$IFn$_invoke$arity$variadic = (function (maps){
+if(cljs.core.truth_(cljs.core.some(cljs.core.identity,maps))){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$2((function (p1__12093_SHARP_,p2__12094_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2((function (){var or__7806__auto__ = p1__12093_SHARP_;
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return cljs.core.PersistentArrayMap.EMPTY;
+}
+})(),p2__12094_SHARP_);
+}),maps);
+} else {
+return null;
+}
+});
+
+cljs.core.merge.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.merge.cljs$lang$applyTo = (function (seq12095){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12095));
+});
+
+/**
+ * Returns a map that consists of the rest of the maps conj-ed onto
+ * the first. If a key occurs in more than one map, the mapping(s)
+ * from the latter (left-to-right) will be combined with the mapping in
+ * the result by calling (f val-in-result val-in-latter).
+ */
+cljs.core.merge_with = (function cljs$core$merge_with(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12103 = arguments.length;
+var i__9001__auto___12104 = (0);
+while(true){
+if((i__9001__auto___12104 < len__9000__auto___12103)){
+args__9010__auto__.push((arguments[i__9001__auto___12104]));
+
+var G__12105 = (i__9001__auto___12104 + (1));
+i__9001__auto___12104 = G__12105;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((1) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((1)),(0),null)):null);
+return cljs.core.merge_with.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9011__auto__);
+});
+
+cljs.core.merge_with.cljs$core$IFn$_invoke$arity$variadic = (function (f,maps){
+if(cljs.core.truth_(cljs.core.some(cljs.core.identity,maps))){
+var merge_entry = (function (m,e){
+var k = cljs.core.key(e);
+var v = cljs.core.val(e);
+if(cljs.core.contains_QMARK_(m,k)){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,(function (){var G__12101 = cljs.core.get.cljs$core$IFn$_invoke$arity$2(m,k);
+var G__12102 = v;
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__12101,G__12102) : f.call(null,G__12101,G__12102));
+})());
+} else {
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(m,k,v);
+}
+});
+var merge2 = ((function (merge_entry){
+return (function (m1,m2){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(merge_entry,(function (){var or__7806__auto__ = m1;
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return cljs.core.PersistentArrayMap.EMPTY;
+}
+})(),cljs.core.seq(m2));
+});})(merge_entry))
+;
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$2(merge2,maps);
+} else {
+return null;
+}
+});
+
+cljs.core.merge_with.cljs$lang$maxFixedArity = (1);
+
+/** @this {Function} */
+cljs.core.merge_with.cljs$lang$applyTo = (function (seq12099){
+var G__12100 = cljs.core.first(seq12099);
+var seq12099__$1 = cljs.core.next(seq12099);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12100,seq12099__$1);
+});
+
+/**
+ * Returns a map containing only those entries in map whose key is in keys
+ */
+cljs.core.select_keys = (function cljs$core$select_keys(map,keyseq){
+var ret = cljs.core.PersistentArrayMap.EMPTY;
+var keys = cljs.core.seq(keyseq);
+while(true){
+if(keys){
+var key = cljs.core.first(keys);
+var entry = cljs.core.get.cljs$core$IFn$_invoke$arity$3(map,key,new cljs.core.Keyword("cljs.core","not-found","cljs.core/not-found",-1572889185));
+var G__12106 = ((cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(entry,new cljs.core.Keyword("cljs.core","not-found","cljs.core/not-found",-1572889185)))?cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(ret,key,entry):ret);
+var G__12107 = cljs.core.next(keys);
+ret = G__12106;
+keys = G__12107;
+continue;
+} else {
+return cljs.core._with_meta(ret,cljs.core.meta(map));
+}
+break;
+}
+});
+
+/**
+* @constructor
+*/
+cljs.core.HashSetIter = (function (iter){
+this.iter = iter;
+});
+cljs.core.HashSetIter.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+return self__.iter.hasNext();
+});
+
+cljs.core.HashSetIter.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+if(self__.iter.hasNext()){
+return self__.iter.next().key;
+} else {
+throw (new Error("No such element"));
+}
+});
+
+cljs.core.HashSetIter.prototype.remove = (function (){
+var self__ = this;
+var _ = this;
+return (new Error("Unsupported operation"));
+});
+
+cljs.core.HashSetIter.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"iter","iter",-1346195486,null)], null);
+});
+
+cljs.core.HashSetIter.cljs$lang$type = true;
+
+cljs.core.HashSetIter.cljs$lang$ctorStr = "cljs.core/HashSetIter";
+
+cljs.core.HashSetIter.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/HashSetIter");
+});
+
+/**
+ * Positional factory function for cljs.core/HashSetIter.
+ */
+cljs.core.__GT_HashSetIter = (function cljs$core$__GT_HashSetIter(iter){
+return (new cljs.core.HashSetIter(iter));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEditableCollection}
+ * @implements {cljs.core.ISet}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.PersistentHashSet = (function (meta,hash_map,__hash){
+this.meta = meta;
+this.hash_map = hash_map;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 15077647;
+this.cljs$lang$protocol_mask$partition1$ = 139268;
+});
+cljs.core.PersistentHashSet.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentHashSet.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentHashSet.prototype.keys = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentHashSet.prototype.entries = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_set_entries_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentHashSet.prototype.values = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentHashSet.prototype.has = (function (k){
+var self__ = this;
+var coll = this;
+return cljs.core.contains_QMARK_(coll,k);
+});
+
+cljs.core.PersistentHashSet.prototype.forEach = (function (f){
+var self__ = this;
+var coll = this;
+var seq__12111 = cljs.core.seq(coll);
+var chunk__12112 = null;
+var count__12113 = (0);
+var i__12114 = (0);
+while(true){
+if((i__12114 < count__12113)){
+var vec__12115 = chunk__12112.cljs$core$IIndexed$_nth$arity$2(null,i__12114);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12115,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12115,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+
+var G__12124 = seq__12111;
+var G__12125 = chunk__12112;
+var G__12126 = count__12113;
+var G__12127 = (i__12114 + (1));
+seq__12111 = G__12124;
+chunk__12112 = G__12125;
+count__12113 = G__12126;
+i__12114 = G__12127;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__12111);
+if(temp__4657__auto__){
+var seq__12111__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__12111__$1)){
+var c__8664__auto__ = cljs.core.chunk_first(seq__12111__$1);
+var G__12128 = cljs.core.chunk_rest(seq__12111__$1);
+var G__12129 = c__8664__auto__;
+var G__12130 = cljs.core.count(c__8664__auto__);
+var G__12131 = (0);
+seq__12111 = G__12128;
+chunk__12112 = G__12129;
+count__12113 = G__12130;
+i__12114 = G__12131;
+continue;
+} else {
+var vec__12118 = cljs.core.first(seq__12111__$1);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12118,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12118,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+
+var G__12132 = cljs.core.next(seq__12111__$1);
+var G__12133 = null;
+var G__12134 = (0);
+var G__12135 = (0);
+seq__12111 = G__12132;
+chunk__12112 = G__12133;
+count__12113 = G__12134;
+i__12114 = G__12135;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,v){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,v,null);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,v,not_found){
+var self__ = this;
+var coll__$1 = this;
+var temp__4655__auto__ = cljs.core._find(self__.hash_map,v);
+if(cljs.core.truth_(temp__4655__auto__)){
+var entry = temp__4655__auto__;
+return cljs.core.key(entry);
+} else {
+return not_found;
+}
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.HashSetIter(cljs.core._iterator(self__.hash_map)));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentHashSet(self__.meta,self__.hash_map,self__.__hash));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._count(self__.hash_map);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+var and__7791__auto__ = cljs.core.set_QMARK_(other);
+if(and__7791__auto__){
+var and__7791__auto____$1 = (cljs.core.count(coll__$1) === cljs.core.count(other));
+if(and__7791__auto____$1){
+try{return cljs.core.reduce_kv(((function (and__7791__auto____$1,and__7791__auto__,coll__$1){
+return (function (p1__12109_SHARP_,p2__12108_SHARP_){
+var or__7806__auto__ = cljs.core.contains_QMARK_(other,p2__12108_SHARP_);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return cljs.core.reduced(false);
+}
+});})(and__7791__auto____$1,and__7791__auto__,coll__$1))
+,true,self__.hash_map);
+}catch (e12123){if((e12123 instanceof Error)){
+var ex = e12123;
+return false;
+} else {
+throw e12123;
+
+}
+}} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IEditableCollection$_as_transient$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.TransientHashSet(cljs.core._as_transient(self__.hash_map)));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._with_meta(cljs.core.PersistentHashSet.EMPTY,self__.meta);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ISet$_disjoin$arity$2 = (function (coll,v){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentHashSet(self__.meta,cljs.core._dissoc(self__.hash_map,v),null));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.keys(self__.hash_map);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentHashSet(meta__$1,self__.hash_map,self__.__hash));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentHashSet(self__.meta,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(self__.hash_map,o,null),null));
+});
+
+cljs.core.PersistentHashSet.prototype.call = (function() {
+var G__12136 = null;
+var G__12136__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__12136__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__12136 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__12136__2.call(this,self__,k);
+case 3:
+return G__12136__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__12136.cljs$core$IFn$_invoke$arity$2 = G__12136__2;
+G__12136.cljs$core$IFn$_invoke$arity$3 = G__12136__3;
+return G__12136;
+})()
+;
+
+cljs.core.PersistentHashSet.prototype.apply = (function (self__,args12110){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args12110)));
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentHashSet.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"hash-map","hash-map",-439030950,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentHashSet.cljs$lang$type = true;
+
+cljs.core.PersistentHashSet.cljs$lang$ctorStr = "cljs.core/PersistentHashSet";
+
+cljs.core.PersistentHashSet.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentHashSet");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentHashSet.
+ */
+cljs.core.__GT_PersistentHashSet = (function cljs$core$__GT_PersistentHashSet(meta,hash_map,__hash){
+return (new cljs.core.PersistentHashSet(meta,hash_map,__hash));
+});
+
+cljs.core.PersistentHashSet.EMPTY = (new cljs.core.PersistentHashSet(null,cljs.core.PersistentArrayMap.EMPTY,cljs.core.empty_unordered_hash));
+cljs.core.PersistentHashSet.fromArray = (function (items,no_clone){
+var len = items.length;
+if((len <= cljs.core.PersistentArrayMap.HASHMAP_THRESHOLD)){
+var arr = ((no_clone)?items:cljs.core.aclone(items));
+var i = (0);
+var out = cljs.core.transient$(cljs.core.PersistentArrayMap.EMPTY);
+while(true){
+if((i < len)){
+var G__12137 = (i + (1));
+var G__12138 = cljs.core._assoc_BANG_(out,(items[i]),null);
+i = G__12137;
+out = G__12138;
+continue;
+} else {
+return (new cljs.core.PersistentHashSet(null,cljs.core._persistent_BANG_(out),null));
+}
+break;
+}
+} else {
+var i = (0);
+var out = cljs.core.transient$(cljs.core.PersistentHashSet.EMPTY);
+while(true){
+if((i < len)){
+var G__12139 = (i + (1));
+var G__12140 = cljs.core._conj_BANG_(out,(items[i]));
+i = G__12139;
+out = G__12140;
+continue;
+} else {
+return cljs.core._persistent_BANG_(out);
+}
+break;
+}
+}
+});
+cljs.core.PersistentHashSet.createWithCheck = (function (items){
+var len = items.length;
+var t = cljs.core._as_transient(cljs.core.PersistentHashSet.EMPTY);
+var n__8769__auto___12141 = len;
+var i_12142 = (0);
+while(true){
+if((i_12142 < n__8769__auto___12141)){
+cljs.core._conj_BANG_(t,(items[i_12142]));
+
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.count(t),(i_12142 + (1)))){
+} else {
+throw (new Error(["Duplicate key: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1((items[i_12142]))].join('')));
+}
+
+var G__12143 = (i_12142 + (1));
+i_12142 = G__12143;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core._persistent_BANG_(t);
+});
+cljs.core.PersistentHashSet.createAsIfByAssoc = (function (items){
+var len = items.length;
+var t = cljs.core._as_transient(cljs.core.PersistentHashSet.EMPTY);
+var n__8769__auto___12144 = len;
+var i_12145 = (0);
+while(true){
+if((i_12145 < n__8769__auto___12144)){
+cljs.core._conj_BANG_(t,(items[i_12145]));
+
+var G__12146 = (i_12145 + (1));
+i_12145 = G__12146;
+continue;
+} else {
+}
+break;
+}
+
+return cljs.core._persistent_BANG_(t);
+});
+var G__12147_12150 = cljs.core.PersistentHashSet.prototype;
+var G__12148_12151 = cljs.core.ITER_SYMBOL;
+var G__12149_12152 = ((function (G__12147_12150,G__12148_12151){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__12147_12150,G__12148_12151))
+;
+goog.object.set(G__12147_12150,G__12148_12151,G__12149_12152);
+
+/**
+* @constructor
+ * @implements {cljs.core.ITransientSet}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ITransientCollection}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.TransientHashSet = (function (transient_map){
+this.transient_map = transient_map;
+this.cljs$lang$protocol_mask$partition1$ = 136;
+this.cljs$lang$protocol_mask$partition0$ = 259;
+});
+cljs.core.TransientHashSet.prototype.cljs$core$ITransientCollection$_conj_BANG_$arity$2 = (function (tcoll,o){
+var self__ = this;
+var tcoll__$1 = this;
+self__.transient_map = cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(self__.transient_map,o,null);
+
+return tcoll__$1;
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$ITransientCollection$_persistent_BANG_$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+return (new cljs.core.PersistentHashSet(null,cljs.core.persistent_BANG_(self__.transient_map),null));
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$ITransientSet$_disjoin_BANG_$arity$2 = (function (tcoll,v){
+var self__ = this;
+var tcoll__$1 = this;
+self__.transient_map = cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$2(self__.transient_map,v);
+
+return tcoll__$1;
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$ICounted$_count$arity$1 = (function (tcoll){
+var self__ = this;
+var tcoll__$1 = this;
+return cljs.core.count(self__.transient_map);
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (tcoll,v){
+var self__ = this;
+var tcoll__$1 = this;
+return tcoll__$1.cljs$core$ILookup$_lookup$arity$3(null,v,null);
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (tcoll,v,not_found){
+var self__ = this;
+var tcoll__$1 = this;
+if((cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(self__.transient_map,v,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return not_found;
+} else {
+return v;
+}
+});
+
+cljs.core.TransientHashSet.prototype.call = (function() {
+var G__12154 = null;
+var G__12154__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var tcoll = self____$1;
+if((cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(self__.transient_map,k,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return null;
+} else {
+return k;
+}
+});
+var G__12154__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var tcoll = self____$1;
+if((cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(self__.transient_map,k,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return not_found;
+} else {
+return k;
+}
+});
+G__12154 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__12154__2.call(this,self__,k);
+case 3:
+return G__12154__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__12154.cljs$core$IFn$_invoke$arity$2 = G__12154__2;
+G__12154.cljs$core$IFn$_invoke$arity$3 = G__12154__3;
+return G__12154;
+})()
+;
+
+cljs.core.TransientHashSet.prototype.apply = (function (self__,args12153){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args12153)));
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var tcoll = this;
+if((cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(self__.transient_map,k,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return null;
+} else {
+return k;
+}
+});
+
+cljs.core.TransientHashSet.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var tcoll = this;
+if((cljs.core._lookup.cljs$core$IFn$_invoke$arity$3(self__.transient_map,k,cljs.core.lookup_sentinel) === cljs.core.lookup_sentinel)){
+return not_found;
+} else {
+return k;
+}
+});
+
+cljs.core.TransientHashSet.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"transient-map","transient-map",351764893,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.TransientHashSet.cljs$lang$type = true;
+
+cljs.core.TransientHashSet.cljs$lang$ctorStr = "cljs.core/TransientHashSet";
+
+cljs.core.TransientHashSet.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/TransientHashSet");
+});
+
+/**
+ * Positional factory function for cljs.core/TransientHashSet.
+ */
+cljs.core.__GT_TransientHashSet = (function cljs$core$__GT_TransientHashSet(transient_map){
+return (new cljs.core.TransientHashSet(transient_map));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IReversible}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.ISet}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISorted}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.PersistentTreeSet = (function (meta,tree_map,__hash){
+this.meta = meta;
+this.tree_map = tree_map;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 417730831;
+this.cljs$lang$protocol_mask$partition1$ = 8192;
+});
+cljs.core.PersistentTreeSet.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.PersistentTreeSet.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.PersistentTreeSet.prototype.keys = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentTreeSet.prototype.entries = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_set_entries_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentTreeSet.prototype.values = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.es6_iterator(cljs.core.seq(coll));
+});
+
+cljs.core.PersistentTreeSet.prototype.has = (function (k){
+var self__ = this;
+var coll = this;
+return cljs.core.contains_QMARK_(coll,k);
+});
+
+cljs.core.PersistentTreeSet.prototype.forEach = (function (f){
+var self__ = this;
+var coll = this;
+var seq__12158 = cljs.core.seq(coll);
+var chunk__12159 = null;
+var count__12160 = (0);
+var i__12161 = (0);
+while(true){
+if((i__12161 < count__12160)){
+var vec__12162 = chunk__12159.cljs$core$IIndexed$_nth$arity$2(null,i__12161);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12162,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12162,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+
+var G__12171 = seq__12158;
+var G__12172 = chunk__12159;
+var G__12173 = count__12160;
+var G__12174 = (i__12161 + (1));
+seq__12158 = G__12171;
+chunk__12159 = G__12172;
+count__12160 = G__12173;
+i__12161 = G__12174;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__12158);
+if(temp__4657__auto__){
+var seq__12158__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__12158__$1)){
+var c__8664__auto__ = cljs.core.chunk_first(seq__12158__$1);
+var G__12175 = cljs.core.chunk_rest(seq__12158__$1);
+var G__12176 = c__8664__auto__;
+var G__12177 = cljs.core.count(c__8664__auto__);
+var G__12178 = (0);
+seq__12158 = G__12175;
+chunk__12159 = G__12176;
+count__12160 = G__12177;
+i__12161 = G__12178;
+continue;
+} else {
+var vec__12165 = cljs.core.first(seq__12158__$1);
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12165,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12165,(1),null);
+(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(v,k) : f.call(null,v,k));
+
+
+var G__12179 = cljs.core.next(seq__12158__$1);
+var G__12180 = null;
+var G__12181 = (0);
+var G__12182 = (0);
+seq__12158 = G__12179;
+chunk__12159 = G__12180;
+count__12160 = G__12181;
+i__12161 = G__12182;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (coll,v){
+var self__ = this;
+var coll__$1 = this;
+return coll__$1.cljs$core$ILookup$_lookup$arity$3(null,v,null);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (coll,v,not_found){
+var self__ = this;
+var coll__$1 = this;
+var n = self__.tree_map.entry_at(v);
+if((!((n == null)))){
+return n.key;
+} else {
+return not_found;
+}
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IMeta$_meta$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return self__.meta;
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.PersistentTreeSet(self__.meta,self__.tree_map,self__.__hash));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ICounted$_count$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.count(self__.tree_map);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IReversible$_rseq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+if((cljs.core.count(self__.tree_map) > (0))){
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.key,cljs.core.rseq(self__.tree_map));
+} else {
+return null;
+}
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IHash$_hash$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_unordered_coll(coll__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (coll,other){
+var self__ = this;
+var coll__$1 = this;
+var and__7791__auto__ = cljs.core.set_QMARK_(other);
+if(and__7791__auto__){
+var and__7791__auto____$1 = (cljs.core.count(coll__$1) === cljs.core.count(other));
+if(and__7791__auto____$1){
+try{return cljs.core.reduce_kv(((function (and__7791__auto____$1,and__7791__auto__,coll__$1){
+return (function (p1__12156_SHARP_,p2__12155_SHARP_){
+var or__7806__auto__ = cljs.core.contains_QMARK_(other,p2__12155_SHARP_);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return cljs.core.reduced(false);
+}
+});})(and__7791__auto____$1,and__7791__auto__,coll__$1))
+,true,self__.tree_map);
+}catch (e12170){if((e12170 instanceof Error)){
+var ex = e12170;
+return false;
+} else {
+throw e12170;
+
+}
+}} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeSet(self__.meta,cljs.core._empty(self__.tree_map),(0)));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISet$_disjoin$arity$2 = (function (coll,v){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeSet(self__.meta,cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2(self__.tree_map,v),null));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.keys(self__.tree_map);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (coll,meta__$1){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeSet(meta__$1,self__.tree_map,self__.__hash));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ICollection$_conj$arity$2 = (function (coll,o){
+var self__ = this;
+var coll__$1 = this;
+return (new cljs.core.PersistentTreeSet(self__.meta,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(self__.tree_map,o,null),null));
+});
+
+cljs.core.PersistentTreeSet.prototype.call = (function() {
+var G__12183 = null;
+var G__12183__2 = (function (self__,k){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+var G__12183__3 = (function (self__,k,not_found){
+var self__ = this;
+var self____$1 = this;
+var coll = self____$1;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+G__12183 = function(self__,k,not_found){
+switch(arguments.length){
+case 2:
+return G__12183__2.call(this,self__,k);
+case 3:
+return G__12183__3.call(this,self__,k,not_found);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__12183.cljs$core$IFn$_invoke$arity$2 = G__12183__2;
+G__12183.cljs$core$IFn$_invoke$arity$3 = G__12183__3;
+return G__12183;
+})()
+;
+
+cljs.core.PersistentTreeSet.prototype.apply = (function (self__,args12157){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args12157)));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IFn$_invoke$arity$1 = (function (k){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$2(null,k);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IFn$_invoke$arity$2 = (function (k,not_found){
+var self__ = this;
+var coll = this;
+return coll.cljs$core$ILookup$_lookup$arity$3(null,k,not_found);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISorted$_sorted_seq$arity$2 = (function (coll,ascending_QMARK_){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.key,cljs.core._sorted_seq(self__.tree_map,ascending_QMARK_));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISorted$_sorted_seq_from$arity$3 = (function (coll,k,ascending_QMARK_){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs.core.key,cljs.core._sorted_seq_from(self__.tree_map,k,ascending_QMARK_));
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISorted$_entry_key$arity$2 = (function (coll,entry){
+var self__ = this;
+var coll__$1 = this;
+return entry;
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$ISorted$_comparator$arity$1 = (function (coll){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._comparator(self__.tree_map);
+});
+
+cljs.core.PersistentTreeSet.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"tree-map","tree-map",1373073049,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.PersistentTreeSet.cljs$lang$type = true;
+
+cljs.core.PersistentTreeSet.cljs$lang$ctorStr = "cljs.core/PersistentTreeSet";
+
+cljs.core.PersistentTreeSet.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/PersistentTreeSet");
+});
+
+/**
+ * Positional factory function for cljs.core/PersistentTreeSet.
+ */
+cljs.core.__GT_PersistentTreeSet = (function cljs$core$__GT_PersistentTreeSet(meta,tree_map,__hash){
+return (new cljs.core.PersistentTreeSet(meta,tree_map,__hash));
+});
+
+cljs.core.PersistentTreeSet.EMPTY = (new cljs.core.PersistentTreeSet(null,cljs.core.PersistentTreeMap.EMPTY,cljs.core.empty_unordered_hash));
+var G__12184_12187 = cljs.core.PersistentTreeSet.prototype;
+var G__12185_12188 = cljs.core.ITER_SYMBOL;
+var G__12186_12189 = ((function (G__12184_12187,G__12185_12188){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__12184_12187,G__12185_12188))
+;
+goog.object.set(G__12184_12187,G__12185_12188,G__12186_12189);
+cljs.core.set_from_indexed_seq = (function cljs$core$set_from_indexed_seq(iseq){
+var arr = iseq.arr;
+var ret = (function (){var a__8762__auto__ = arr;
+var l__8763__auto__ = a__8762__auto__.length;
+var i = (0);
+var res = cljs.core._as_transient(cljs.core.PersistentHashSet.EMPTY);
+while(true){
+if((i < l__8763__auto__)){
+var G__12190 = (i + (1));
+var G__12191 = res.cljs$core$ITransientCollection$_conj_BANG_$arity$2(null,(arr[i]));
+i = G__12190;
+res = G__12191;
+continue;
+} else {
+return res;
+}
+break;
+}
+})();
+return ret.cljs$core$ITransientCollection$_persistent_BANG_$arity$1(null);
+});
+/**
+ * Returns a set of the distinct elements of coll.
+ */
+cljs.core.set = (function cljs$core$set(coll){
+if(cljs.core.set_QMARK_(coll)){
+return cljs.core.with_meta(coll,null);
+} else {
+var in$ = cljs.core.seq(coll);
+if((in$ == null)){
+return cljs.core.PersistentHashSet.EMPTY;
+} else {
+if((((in$ instanceof cljs.core.IndexedSeq)) && ((in$.i === (0))))){
+return cljs.core.PersistentHashSet.createAsIfByAssoc(in$.arr);
+} else {
+var in$__$1 = in$;
+var out = cljs.core._as_transient(cljs.core.PersistentHashSet.EMPTY);
+while(true){
+if((!((in$__$1 == null)))){
+var G__12192 = cljs.core.next(in$__$1);
+var G__12193 = out.cljs$core$ITransientCollection$_conj_BANG_$arity$2(null,in$__$1.cljs$core$ISeq$_first$arity$1(null));
+in$__$1 = G__12192;
+out = G__12193;
+continue;
+} else {
+return cljs.core.persistent_BANG_(out);
+}
+break;
+}
+
+}
+}
+}
+});
+/**
+ * Returns a new hash set with supplied keys. Any equal keys are
+ * handled as if by repeated uses of conj.
+ */
+cljs.core.hash_set = (function cljs$core$hash_set(var_args){
+var G__12196 = arguments.length;
+switch (G__12196) {
+case 0:
+return cljs.core.hash_set.cljs$core$IFn$_invoke$arity$0();
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___12198 = arguments.length;
+var i__9001__auto___12199 = (0);
+while(true){
+if((i__9001__auto___12199 < len__9000__auto___12198)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___12199]));
+
+var G__12200 = (i__9001__auto___12199 + (1));
+i__9001__auto___12199 = G__12200;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((0)),(0),null));
+return cljs.core.hash_set.cljs$core$IFn$_invoke$arity$variadic(argseq__9026__auto__);
+
+}
+});
+
+cljs.core.hash_set.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.PersistentHashSet.EMPTY;
+});
+
+cljs.core.hash_set.cljs$core$IFn$_invoke$arity$variadic = (function (keys){
+return cljs.core.set(keys);
+});
+
+/** @this {Function} */
+cljs.core.hash_set.cljs$lang$applyTo = (function (seq12195){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12195));
+});
+
+cljs.core.hash_set.cljs$lang$maxFixedArity = (0);
+
+/**
+ * Returns a new sorted set with supplied keys.
+ */
+cljs.core.sorted_set = (function cljs$core$sorted_set(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12202 = arguments.length;
+var i__9001__auto___12203 = (0);
+while(true){
+if((i__9001__auto___12203 < len__9000__auto___12202)){
+args__9010__auto__.push((arguments[i__9001__auto___12203]));
+
+var G__12204 = (i__9001__auto___12203 + (1));
+i__9001__auto___12203 = G__12204;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.sorted_set.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.sorted_set.cljs$core$IFn$_invoke$arity$variadic = (function (keys){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj,cljs.core.PersistentTreeSet.EMPTY,keys);
+});
+
+cljs.core.sorted_set.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.sorted_set.cljs$lang$applyTo = (function (seq12201){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12201));
+});
+
+/**
+ * Returns a new sorted set with supplied keys, using the supplied comparator.
+ */
+cljs.core.sorted_set_by = (function cljs$core$sorted_set_by(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12207 = arguments.length;
+var i__9001__auto___12208 = (0);
+while(true){
+if((i__9001__auto___12208 < len__9000__auto___12207)){
+args__9010__auto__.push((arguments[i__9001__auto___12208]));
+
+var G__12209 = (i__9001__auto___12208 + (1));
+i__9001__auto___12208 = G__12209;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((1) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((1)),(0),null)):null);
+return cljs.core.sorted_set_by.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9011__auto__);
+});
+
+cljs.core.sorted_set_by.cljs$core$IFn$_invoke$arity$variadic = (function (comparator,keys){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core._conj,(new cljs.core.PersistentTreeSet(null,cljs.core.sorted_map_by(comparator),(0))),keys);
+});
+
+cljs.core.sorted_set_by.cljs$lang$maxFixedArity = (1);
+
+/** @this {Function} */
+cljs.core.sorted_set_by.cljs$lang$applyTo = (function (seq12205){
+var G__12206 = cljs.core.first(seq12205);
+var seq12205__$1 = cljs.core.next(seq12205);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12206,seq12205__$1);
+});
+
+/**
+ * Given a map of replacement pairs and a vector/collection, returns a
+ * vector/seq with any elements = a key in smap replaced with the
+ * corresponding val in smap. Returns a transducer when no collection
+ * is provided.
+ */
+cljs.core.replace = (function cljs$core$replace(var_args){
+var G__12213 = arguments.length;
+switch (G__12213) {
+case 1:
+return cljs.core.replace.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.replace.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.replace.cljs$core$IFn$_invoke$arity$1 = (function (smap){
+return cljs.core.map.cljs$core$IFn$_invoke$arity$1((function (p1__12210_SHARP_){
+var temp__4655__auto__ = cljs.core.find(smap,p1__12210_SHARP_);
+if(cljs.core.truth_(temp__4655__auto__)){
+var e = temp__4655__auto__;
+return cljs.core.val(e);
+} else {
+return p1__12210_SHARP_;
+}
+}));
+});
+
+cljs.core.replace.cljs$core$IFn$_invoke$arity$2 = (function (smap,coll){
+if(cljs.core.vector_QMARK_(coll)){
+var n = cljs.core.count(coll);
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (n){
+return (function (v,i){
+var temp__4655__auto__ = cljs.core.find(smap,cljs.core.nth.cljs$core$IFn$_invoke$arity$2(v,i));
+if(cljs.core.truth_(temp__4655__auto__)){
+var e = temp__4655__auto__;
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(v,i,cljs.core.second(e));
+} else {
+return v;
+}
+});})(n))
+,coll,cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,cljs.core.iterate(cljs.core.inc,(0))));
+} else {
+return cljs.core.map.cljs$core$IFn$_invoke$arity$2((function (p1__12211_SHARP_){
+var temp__4655__auto__ = cljs.core.find(smap,p1__12211_SHARP_);
+if(cljs.core.truth_(temp__4655__auto__)){
+var e = temp__4655__auto__;
+return cljs.core.second(e);
+} else {
+return p1__12211_SHARP_;
+}
+}),coll);
+}
+});
+
+cljs.core.replace.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence of the elements of coll with duplicates removed.
+ * Returns a stateful transducer when no collection is provided.
+ */
+cljs.core.distinct = (function cljs$core$distinct(var_args){
+var G__12216 = arguments.length;
+switch (G__12216) {
+case 0:
+return cljs.core.distinct.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.distinct.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.distinct.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (function (rf){
+var seen = cljs.core.volatile_BANG_(cljs.core.PersistentHashSet.EMPTY);
+return ((function (seen){
+return (function() {
+var G__12227 = null;
+var G__12227__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__12227__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__12227__2 = (function (result,input){
+if(cljs.core.contains_QMARK_(cljs.core.deref(seen),input)){
+return result;
+} else {
+seen.cljs$core$IVolatile$_vreset_BANG_$arity$2(null,cljs.core.conj.cljs$core$IFn$_invoke$arity$2(seen.cljs$core$IDeref$_deref$arity$1(null),input));
+
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__12227 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__12227__0.call(this);
+case 1:
+return G__12227__1.call(this,result);
+case 2:
+return G__12227__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12227.cljs$core$IFn$_invoke$arity$0 = G__12227__0;
+G__12227.cljs$core$IFn$_invoke$arity$1 = G__12227__1;
+G__12227.cljs$core$IFn$_invoke$arity$2 = G__12227__2;
+return G__12227;
+})()
+;})(seen))
+});
+});
+
+cljs.core.distinct.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+var step = (function cljs$core$step(xs,seen){
+return (new cljs.core.LazySeq(null,(function (){
+var fexpr__12221 = (function (p__12222,seen__$1){
+while(true){
+var vec__12223 = p__12222;
+var f = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12223,(0),null);
+var xs__$1 = vec__12223;
+var temp__4657__auto__ = cljs.core.seq(xs__$1);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.contains_QMARK_(seen__$1,f)){
+var G__12228 = cljs.core.rest(s);
+var G__12229 = seen__$1;
+p__12222 = G__12228;
+seen__$1 = G__12229;
+continue;
+} else {
+return cljs.core.cons(f,cljs$core$step(cljs.core.rest(s),cljs.core.conj.cljs$core$IFn$_invoke$arity$2(seen__$1,f)));
+}
+} else {
+return null;
+}
+break;
+}
+});
+return fexpr__12221(xs,seen);
+}),null,null));
+});
+return step(coll,cljs.core.PersistentHashSet.EMPTY);
+});
+
+cljs.core.distinct.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Return a seq of all but the last item in coll, in linear time
+ */
+cljs.core.butlast = (function cljs$core$butlast(s){
+var ret = cljs.core.PersistentVector.EMPTY;
+var s__$1 = s;
+while(true){
+if(cljs.core.next(s__$1)){
+var G__12230 = cljs.core.conj.cljs$core$IFn$_invoke$arity$2(ret,cljs.core.first(s__$1));
+var G__12231 = cljs.core.next(s__$1);
+ret = G__12230;
+s__$1 = G__12231;
+continue;
+} else {
+return cljs.core.seq(ret);
+}
+break;
+}
+});
+/**
+ * Returns the name String of a string, symbol or keyword.
+ */
+cljs.core.name = (function cljs$core$name(x){
+if((((!((x == null))))?(((((x.cljs$lang$protocol_mask$partition1$ & (4096))) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$INamed$))))?true:false):false)){
+return x.cljs$core$INamed$_name$arity$1(null);
+} else {
+if(typeof x === 'string'){
+return x;
+} else {
+throw (new Error(["Doesn't support name: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x)].join('')));
+}
+}
+});
+/**
+ * Returns a map with the keys mapped to the corresponding vals.
+ */
+cljs.core.zipmap = (function cljs$core$zipmap(keys,vals){
+var map = cljs.core.transient$(cljs.core.PersistentArrayMap.EMPTY);
+var ks = cljs.core.seq(keys);
+var vs = cljs.core.seq(vals);
+while(true){
+if(((ks) && (vs))){
+var G__12233 = cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(map,cljs.core.first(ks),cljs.core.first(vs));
+var G__12234 = cljs.core.next(ks);
+var G__12235 = cljs.core.next(vs);
+map = G__12233;
+ks = G__12234;
+vs = G__12235;
+continue;
+} else {
+return cljs.core.persistent_BANG_(map);
+}
+break;
+}
+});
+/**
+ * Returns the x for which (k x), a number, is greatest.
+ *
+ * If there are multiple such xs, the last one is returned.
+ */
+cljs.core.max_key = (function cljs$core$max_key(var_args){
+var G__12243 = arguments.length;
+switch (G__12243) {
+case 2:
+return cljs.core.max_key.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.max_key.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___12245 = arguments.length;
+var i__9001__auto___12246 = (0);
+while(true){
+if((i__9001__auto___12246 < len__9000__auto___12245)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___12246]));
+
+var G__12247 = (i__9001__auto___12246 + (1));
+i__9001__auto___12246 = G__12247;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.max_key.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.max_key.cljs$core$IFn$_invoke$arity$2 = (function (k,x){
+return x;
+});
+
+cljs.core.max_key.cljs$core$IFn$_invoke$arity$3 = (function (k,x,y){
+if(((k.cljs$core$IFn$_invoke$arity$1 ? k.cljs$core$IFn$_invoke$arity$1(x) : k.call(null,x)) > (k.cljs$core$IFn$_invoke$arity$1 ? k.cljs$core$IFn$_invoke$arity$1(y) : k.call(null,y)))){
+return x;
+} else {
+return y;
+}
+});
+
+cljs.core.max_key.cljs$core$IFn$_invoke$arity$variadic = (function (k,x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (p1__12236_SHARP_,p2__12237_SHARP_){
+return cljs.core.max_key.cljs$core$IFn$_invoke$arity$3(k,p1__12236_SHARP_,p2__12237_SHARP_);
+}),cljs.core.max_key.cljs$core$IFn$_invoke$arity$3(k,x,y),more);
+});
+
+/** @this {Function} */
+cljs.core.max_key.cljs$lang$applyTo = (function (seq12239){
+var G__12240 = cljs.core.first(seq12239);
+var seq12239__$1 = cljs.core.next(seq12239);
+var G__12241 = cljs.core.first(seq12239__$1);
+var seq12239__$2 = cljs.core.next(seq12239__$1);
+var G__12242 = cljs.core.first(seq12239__$2);
+var seq12239__$3 = cljs.core.next(seq12239__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12240,G__12241,G__12242,seq12239__$3);
+});
+
+cljs.core.max_key.cljs$lang$maxFixedArity = (3);
+
+/**
+ * Returns the x for which (k x), a number, is least.
+ *
+ * If there are multiple such xs, the last one is returned.
+ */
+cljs.core.min_key = (function cljs$core$min_key(var_args){
+var G__12255 = arguments.length;
+switch (G__12255) {
+case 2:
+return cljs.core.min_key.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.min_key.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___12257 = arguments.length;
+var i__9001__auto___12258 = (0);
+while(true){
+if((i__9001__auto___12258 < len__9000__auto___12257)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___12258]));
+
+var G__12259 = (i__9001__auto___12258 + (1));
+i__9001__auto___12258 = G__12259;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.min_key.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.min_key.cljs$core$IFn$_invoke$arity$2 = (function (k,x){
+return x;
+});
+
+cljs.core.min_key.cljs$core$IFn$_invoke$arity$3 = (function (k,x,y){
+if(((k.cljs$core$IFn$_invoke$arity$1 ? k.cljs$core$IFn$_invoke$arity$1(x) : k.call(null,x)) < (k.cljs$core$IFn$_invoke$arity$1 ? k.cljs$core$IFn$_invoke$arity$1(y) : k.call(null,y)))){
+return x;
+} else {
+return y;
+}
+});
+
+cljs.core.min_key.cljs$core$IFn$_invoke$arity$variadic = (function (k,x,y,more){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (p1__12248_SHARP_,p2__12249_SHARP_){
+return cljs.core.min_key.cljs$core$IFn$_invoke$arity$3(k,p1__12248_SHARP_,p2__12249_SHARP_);
+}),cljs.core.min_key.cljs$core$IFn$_invoke$arity$3(k,x,y),more);
+});
+
+/** @this {Function} */
+cljs.core.min_key.cljs$lang$applyTo = (function (seq12251){
+var G__12252 = cljs.core.first(seq12251);
+var seq12251__$1 = cljs.core.next(seq12251);
+var G__12253 = cljs.core.first(seq12251__$1);
+var seq12251__$2 = cljs.core.next(seq12251__$1);
+var G__12254 = cljs.core.first(seq12251__$2);
+var seq12251__$3 = cljs.core.next(seq12251__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12252,G__12253,G__12254,seq12251__$3);
+});
+
+cljs.core.min_key.cljs$lang$maxFixedArity = (3);
+
+
+/**
+* @constructor
+*/
+cljs.core.ArrayList = (function (arr){
+this.arr = arr;
+});
+cljs.core.ArrayList.prototype.add = (function (x){
+var self__ = this;
+var _ = this;
+return self__.arr.push(x);
+});
+
+cljs.core.ArrayList.prototype.size = (function (){
+var self__ = this;
+var _ = this;
+return self__.arr.length;
+});
+
+cljs.core.ArrayList.prototype.clear = (function (){
+var self__ = this;
+var _ = this;
+return self__.arr = [];
+});
+
+cljs.core.ArrayList.prototype.isEmpty = (function (){
+var self__ = this;
+var _ = this;
+return (self__.arr.length === (0));
+});
+
+cljs.core.ArrayList.prototype.toArray = (function (){
+var self__ = this;
+var _ = this;
+return self__.arr;
+});
+
+cljs.core.ArrayList.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"arr","arr",2115492975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.ArrayList.cljs$lang$type = true;
+
+cljs.core.ArrayList.cljs$lang$ctorStr = "cljs.core/ArrayList";
+
+cljs.core.ArrayList.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/ArrayList");
+});
+
+/**
+ * Positional factory function for cljs.core/ArrayList.
+ */
+cljs.core.__GT_ArrayList = (function cljs$core$__GT_ArrayList(arr){
+return (new cljs.core.ArrayList(arr));
+});
+
+cljs.core.array_list = (function cljs$core$array_list(){
+return (new cljs.core.ArrayList([]));
+});
+/**
+ * Returns a lazy sequence of lists like partition, but may include
+ * partitions with fewer than n items at the end. Returns a stateful
+ * transducer when no collection is provided.
+ */
+cljs.core.partition_all = (function cljs$core$partition_all(var_args){
+var G__12261 = arguments.length;
+switch (G__12261) {
+case 1:
+return cljs.core.partition_all.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.partition_all.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.partition_all.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.partition_all.cljs$core$IFn$_invoke$arity$1 = (function (n){
+return (function (rf){
+var a = cljs.core.array_list();
+return ((function (a){
+return (function() {
+var G__12263 = null;
+var G__12263__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__12263__1 = (function (result){
+var result__$1 = (cljs.core.truth_(a.isEmpty())?result:(function (){var v = cljs.core.vec(a.toArray());
+a.clear();
+
+return cljs.core.unreduced((rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v)));
+})());
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result__$1) : rf.call(null,result__$1));
+});
+var G__12263__2 = (function (result,input){
+a.add(input);
+
+if((n === a.size())){
+var v = cljs.core.vec(a.toArray());
+a.clear();
+
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v));
+} else {
+return result;
+}
+});
+G__12263 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__12263__0.call(this);
+case 1:
+return G__12263__1.call(this,result);
+case 2:
+return G__12263__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12263.cljs$core$IFn$_invoke$arity$0 = G__12263__0;
+G__12263.cljs$core$IFn$_invoke$arity$1 = G__12263__1;
+G__12263.cljs$core$IFn$_invoke$arity$2 = G__12263__2;
+return G__12263;
+})()
+;})(a))
+});
+});
+
+cljs.core.partition_all.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+return cljs.core.partition_all.cljs$core$IFn$_invoke$arity$3(n,n,coll);
+});
+
+cljs.core.partition_all.cljs$core$IFn$_invoke$arity$3 = (function (n,step,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+return cljs.core.cons(cljs.core.take.cljs$core$IFn$_invoke$arity$2(n,s),cljs.core.partition_all.cljs$core$IFn$_invoke$arity$3(n,step,cljs.core.drop.cljs$core$IFn$_invoke$arity$2(step,s)));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.partition_all.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns a lazy sequence of successive items from coll while
+ * (pred item) returns logical true. pred must be free of side-effects.
+ * Returns a transducer when no collection is provided.
+ */
+cljs.core.take_while = (function cljs$core$take_while(var_args){
+var G__12265 = arguments.length;
+switch (G__12265) {
+case 1:
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.take_while.cljs$core$IFn$_invoke$arity$1 = (function (pred){
+return (function (rf){
+return (function() {
+var G__12268 = null;
+var G__12268__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__12268__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__12268__2 = (function (result,input){
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(input) : pred.call(null,input)))){
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+} else {
+return cljs.core.reduced(result);
+}
+});
+G__12268 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__12268__0.call(this);
+case 1:
+return G__12268__1.call(this,result);
+case 2:
+return G__12268__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12268.cljs$core$IFn$_invoke$arity$0 = G__12268__0;
+G__12268.cljs$core$IFn$_invoke$arity$1 = G__12268__1;
+G__12268.cljs$core$IFn$_invoke$arity$2 = G__12268__2;
+return G__12268;
+})()
+});
+});
+
+cljs.core.take_while.cljs$core$IFn$_invoke$arity$2 = (function (pred,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+if(cljs.core.truth_((function (){var G__12266 = cljs.core.first(s);
+return (pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(G__12266) : pred.call(null,G__12266));
+})())){
+return cljs.core.cons(cljs.core.first(s),cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(pred,cljs.core.rest(s)));
+} else {
+return null;
+}
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.take_while.cljs$lang$maxFixedArity = 2;
+
+cljs.core.mk_bound_fn = (function cljs$core$mk_bound_fn(sc,test,key){
+return (function (e){
+var comp = cljs.core._comparator(sc);
+var G__12269 = (function (){var G__12271 = cljs.core._entry_key(sc,e);
+var G__12272 = key;
+return (comp.cljs$core$IFn$_invoke$arity$2 ? comp.cljs$core$IFn$_invoke$arity$2(G__12271,G__12272) : comp.call(null,G__12271,G__12272));
+})();
+var G__12270 = (0);
+return (test.cljs$core$IFn$_invoke$arity$2 ? test.cljs$core$IFn$_invoke$arity$2(G__12269,G__12270) : test.call(null,G__12269,G__12270));
+});
+});
+/**
+ * sc must be a sorted collection, test(s) one of <, <=, > or
+ * >=. Returns a seq of those entries with keys ek for
+ * which (test (.. sc comparator (compare ek key)) 0) is true
+ */
+cljs.core.subseq = (function cljs$core$subseq(var_args){
+var G__12274 = arguments.length;
+switch (G__12274) {
+case 3:
+return cljs.core.subseq.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 5:
+return cljs.core.subseq.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.subseq.cljs$core$IFn$_invoke$arity$3 = (function (sc,test,key){
+var include = cljs.core.mk_bound_fn(sc,test,key);
+if(cljs.core.truth_((function (){var fexpr__12275 = cljs.core.PersistentHashSet.createAsIfByAssoc([cljs.core._GT_,cljs.core._GT__EQ_]);
+return (fexpr__12275.cljs$core$IFn$_invoke$arity$1 ? fexpr__12275.cljs$core$IFn$_invoke$arity$1(test) : fexpr__12275.call(null,test));
+})())){
+var temp__4657__auto__ = cljs.core._sorted_seq_from(sc,key,true);
+if(cljs.core.truth_(temp__4657__auto__)){
+var vec__12276 = temp__4657__auto__;
+var e = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12276,(0),null);
+var s = vec__12276;
+if(cljs.core.truth_((include.cljs$core$IFn$_invoke$arity$1 ? include.cljs$core$IFn$_invoke$arity$1(e) : include.call(null,e)))){
+return s;
+} else {
+return cljs.core.next(s);
+}
+} else {
+return null;
+}
+} else {
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(include,cljs.core._sorted_seq(sc,true));
+}
+});
+
+cljs.core.subseq.cljs$core$IFn$_invoke$arity$5 = (function (sc,start_test,start_key,end_test,end_key){
+var temp__4657__auto__ = cljs.core._sorted_seq_from(sc,start_key,true);
+if(cljs.core.truth_(temp__4657__auto__)){
+var vec__12279 = temp__4657__auto__;
+var e = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12279,(0),null);
+var s = vec__12279;
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(cljs.core.mk_bound_fn(sc,end_test,end_key),(cljs.core.truth_((function (){var fexpr__12282 = cljs.core.mk_bound_fn(sc,start_test,start_key);
+return (fexpr__12282.cljs$core$IFn$_invoke$arity$1 ? fexpr__12282.cljs$core$IFn$_invoke$arity$1(e) : fexpr__12282.call(null,e));
+})())?s:cljs.core.next(s)));
+} else {
+return null;
+}
+});
+
+cljs.core.subseq.cljs$lang$maxFixedArity = 5;
+
+/**
+ * sc must be a sorted collection, test(s) one of <, <=, > or
+ * >=. Returns a reverse seq of those entries with keys ek for
+ * which (test (.. sc comparator (compare ek key)) 0) is true
+ */
+cljs.core.rsubseq = (function cljs$core$rsubseq(var_args){
+var G__12285 = arguments.length;
+switch (G__12285) {
+case 3:
+return cljs.core.rsubseq.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 5:
+return cljs.core.rsubseq.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.rsubseq.cljs$core$IFn$_invoke$arity$3 = (function (sc,test,key){
+var include = cljs.core.mk_bound_fn(sc,test,key);
+if(cljs.core.truth_((function (){var fexpr__12286 = cljs.core.PersistentHashSet.createAsIfByAssoc([cljs.core._LT_,cljs.core._LT__EQ_]);
+return (fexpr__12286.cljs$core$IFn$_invoke$arity$1 ? fexpr__12286.cljs$core$IFn$_invoke$arity$1(test) : fexpr__12286.call(null,test));
+})())){
+var temp__4657__auto__ = cljs.core._sorted_seq_from(sc,key,false);
+if(cljs.core.truth_(temp__4657__auto__)){
+var vec__12287 = temp__4657__auto__;
+var e = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12287,(0),null);
+var s = vec__12287;
+if(cljs.core.truth_((include.cljs$core$IFn$_invoke$arity$1 ? include.cljs$core$IFn$_invoke$arity$1(e) : include.call(null,e)))){
+return s;
+} else {
+return cljs.core.next(s);
+}
+} else {
+return null;
+}
+} else {
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(include,cljs.core._sorted_seq(sc,false));
+}
+});
+
+cljs.core.rsubseq.cljs$core$IFn$_invoke$arity$5 = (function (sc,start_test,start_key,end_test,end_key){
+var temp__4657__auto__ = cljs.core._sorted_seq_from(sc,end_key,false);
+if(cljs.core.truth_(temp__4657__auto__)){
+var vec__12290 = temp__4657__auto__;
+var e = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12290,(0),null);
+var s = vec__12290;
+return cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(cljs.core.mk_bound_fn(sc,start_test,start_key),(cljs.core.truth_((function (){var fexpr__12293 = cljs.core.mk_bound_fn(sc,end_test,end_key);
+return (fexpr__12293.cljs$core$IFn$_invoke$arity$1 ? fexpr__12293.cljs$core$IFn$_invoke$arity$1(e) : fexpr__12293.call(null,e));
+})())?s:cljs.core.next(s)));
+} else {
+return null;
+}
+});
+
+cljs.core.rsubseq.cljs$lang$maxFixedArity = 5;
+
+
+/**
+* @constructor
+*/
+cljs.core.RangeIterator = (function (i,end,step){
+this.i = i;
+this.end = end;
+this.step = step;
+});
+cljs.core.RangeIterator.prototype.hasNext = (function (){
+var self__ = this;
+var _ = this;
+if((self__.step > (0))){
+return (self__.i < self__.end);
+} else {
+return (self__.i > self__.end);
+}
+});
+
+cljs.core.RangeIterator.prototype.next = (function (){
+var self__ = this;
+var _ = this;
+var ret = self__.i;
+self__.i = (self__.i + self__.step);
+
+return ret;
+});
+
+cljs.core.RangeIterator.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"i","i",253690212,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),new cljs.core.Symbol(null,"end","end",1372345569,null),new cljs.core.Symbol(null,"step","step",-1365547645,null)], null);
+});
+
+cljs.core.RangeIterator.cljs$lang$type = true;
+
+cljs.core.RangeIterator.cljs$lang$ctorStr = "cljs.core/RangeIterator";
+
+cljs.core.RangeIterator.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/RangeIterator");
+});
+
+/**
+ * Positional factory function for cljs.core/RangeIterator.
+ */
+cljs.core.__GT_RangeIterator = (function cljs$core$__GT_RangeIterator(i,end,step){
+return (new cljs.core.RangeIterator(i,end,step));
+});
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IIndexed}
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.ICollection}
+ * @implements {cljs.core.IEmptyableCollection}
+ * @implements {cljs.core.ICounted}
+ * @implements {cljs.core.ISeq}
+ * @implements {cljs.core.INext}
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IMeta}
+ * @implements {cljs.core.ICloneable}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IWithMeta}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Range = (function (meta,start,end,step,__hash){
+this.meta = meta;
+this.start = start;
+this.end = end;
+this.step = step;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 32375006;
+this.cljs$lang$protocol_mask$partition1$ = 139264;
+});
+cljs.core.Range.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.Range.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.Range.prototype.indexOf = (function() {
+var G__12296 = null;
+var G__12296__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,(0));
+});
+var G__12296__2 = (function (x,start__$1){
+var self__ = this;
+var coll = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start__$1);
+});
+G__12296 = function(x,start__$1){
+switch(arguments.length){
+case 1:
+return G__12296__1.call(this,x);
+case 2:
+return G__12296__2.call(this,x,start__$1);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12296.cljs$core$IFn$_invoke$arity$1 = G__12296__1;
+G__12296.cljs$core$IFn$_invoke$arity$2 = G__12296__2;
+return G__12296;
+})()
+;
+
+cljs.core.Range.prototype.lastIndexOf = (function() {
+var G__12297 = null;
+var G__12297__1 = (function (x){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,cljs.core.count(coll));
+});
+var G__12297__2 = (function (x,start__$1){
+var self__ = this;
+var coll = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll,x,start__$1);
+});
+G__12297 = function(x,start__$1){
+switch(arguments.length){
+case 1:
+return G__12297__1.call(this,x);
+case 2:
+return G__12297__2.call(this,x,start__$1);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12297.cljs$core$IFn$_invoke$arity$1 = G__12297__1;
+G__12297.cljs$core$IFn$_invoke$arity$2 = G__12297__2;
+return G__12297;
+})()
+;
+
+cljs.core.Range.prototype.cljs$core$IIndexed$_nth$arity$2 = (function (rng,n){
+var self__ = this;
+var rng__$1 = this;
+if(((((0) <= n)) && ((n < rng__$1.cljs$core$ICounted$_count$arity$1(null))))){
+return (self__.start + (n * self__.step));
+} else {
+if(((((0) <= n)) && ((self__.start > self__.end)) && ((self__.step === (0))))){
+return self__.start;
+} else {
+throw (new Error("Index out of bounds"));
+}
+}
+});
+
+cljs.core.Range.prototype.cljs$core$IIndexed$_nth$arity$3 = (function (rng,n,not_found){
+var self__ = this;
+var rng__$1 = this;
+if(((((0) <= n)) && ((n < rng__$1.cljs$core$ICounted$_count$arity$1(null))))){
+return (self__.start + (n * self__.step));
+} else {
+if(((((0) <= n)) && ((self__.start > self__.end)) && ((self__.step === (0))))){
+return self__.start;
+} else {
+return not_found;
+}
+}
+});
+
+cljs.core.Range.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.RangeIterator(self__.start,self__.end,self__.step));
+});
+
+cljs.core.Range.prototype.cljs$core$IMeta$_meta$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+return self__.meta;
+});
+
+cljs.core.Range.prototype.cljs$core$ICloneable$_clone$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return (new cljs.core.Range(self__.meta,self__.start,self__.end,self__.step,self__.__hash));
+});
+
+cljs.core.Range.prototype.cljs$core$INext$_next$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+if((self__.step > (0))){
+if(((self__.start + self__.step) < self__.end)){
+return (new cljs.core.Range(self__.meta,(self__.start + self__.step),self__.end,self__.step,null));
+} else {
+return null;
+}
+} else {
+if(((self__.start + self__.step) > self__.end)){
+return (new cljs.core.Range(self__.meta,(self__.start + self__.step),self__.end,self__.step,null));
+} else {
+return null;
+}
+}
+});
+
+cljs.core.Range.prototype.cljs$core$ICounted$_count$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+if(cljs.core.not(rng__$1.cljs$core$ISeqable$_seq$arity$1(null))){
+return (0);
+} else {
+var G__12295 = ((self__.end - self__.start) / self__.step);
+return Math.ceil(G__12295);
+}
+});
+
+cljs.core.Range.prototype.cljs$core$IHash$_hash$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+var h__8266__auto__ = self__.__hash;
+if((!((h__8266__auto__ == null)))){
+return h__8266__auto__;
+} else {
+var h__8266__auto____$1 = cljs.core.hash_ordered_coll(rng__$1);
+self__.__hash = h__8266__auto____$1;
+
+return h__8266__auto____$1;
+}
+});
+
+cljs.core.Range.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (rng,other){
+var self__ = this;
+var rng__$1 = this;
+return cljs.core.equiv_sequential(rng__$1,other);
+});
+
+cljs.core.Range.prototype.cljs$core$IEmptyableCollection$_empty$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+return cljs.core._with_meta(cljs.core.List.EMPTY,self__.meta);
+});
+
+cljs.core.Range.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (rng,f){
+var self__ = this;
+var rng__$1 = this;
+return cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2(rng__$1,f);
+});
+
+cljs.core.Range.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (rng,f,init){
+var self__ = this;
+var rng__$1 = this;
+var i = self__.start;
+var ret = init;
+while(true){
+if((((self__.step > (0)))?(i < self__.end):(i > self__.end))){
+var ret__$1 = (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(ret,i) : f.call(null,ret,i));
+if(cljs.core.reduced_QMARK_(ret__$1)){
+return cljs.core.deref(ret__$1);
+} else {
+var G__12298 = (i + self__.step);
+var G__12299 = ret__$1;
+i = G__12298;
+ret = G__12299;
+continue;
+}
+} else {
+return ret;
+}
+break;
+}
+});
+
+cljs.core.Range.prototype.cljs$core$ISeq$_first$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+if((rng__$1.cljs$core$ISeqable$_seq$arity$1(null) == null)){
+return null;
+} else {
+return self__.start;
+}
+});
+
+cljs.core.Range.prototype.cljs$core$ISeq$_rest$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+if((!((rng__$1.cljs$core$ISeqable$_seq$arity$1(null) == null)))){
+return (new cljs.core.Range(self__.meta,(self__.start + self__.step),self__.end,self__.step,null));
+} else {
+return cljs.core.List.EMPTY;
+}
+});
+
+cljs.core.Range.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (rng){
+var self__ = this;
+var rng__$1 = this;
+if((self__.step > (0))){
+if((self__.start < self__.end)){
+return rng__$1;
+} else {
+return null;
+}
+} else {
+if((self__.step < (0))){
+if((self__.start > self__.end)){
+return rng__$1;
+} else {
+return null;
+}
+} else {
+if((self__.start === self__.end)){
+return null;
+} else {
+return rng__$1;
+}
+
+}
+}
+});
+
+cljs.core.Range.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (rng,meta__$1){
+var self__ = this;
+var rng__$1 = this;
+return (new cljs.core.Range(meta__$1,self__.start,self__.end,self__.step,self__.__hash));
+});
+
+cljs.core.Range.prototype.cljs$core$ICollection$_conj$arity$2 = (function (rng,o){
+var self__ = this;
+var rng__$1 = this;
+return cljs.core.cons(o,rng__$1);
+});
+
+cljs.core.Range.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"meta","meta",-1154898805,null),new cljs.core.Symbol(null,"start","start",1285322546,null),new cljs.core.Symbol(null,"end","end",1372345569,null),new cljs.core.Symbol(null,"step","step",-1365547645,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Range.cljs$lang$type = true;
+
+cljs.core.Range.cljs$lang$ctorStr = "cljs.core/Range";
+
+cljs.core.Range.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Range");
+});
+
+/**
+ * Positional factory function for cljs.core/Range.
+ */
+cljs.core.__GT_Range = (function cljs$core$__GT_Range(meta,start,end,step,__hash){
+return (new cljs.core.Range(meta,start,end,step,__hash));
+});
+
+var G__12300_12303 = cljs.core.Range.prototype;
+var G__12301_12304 = cljs.core.ITER_SYMBOL;
+var G__12302_12305 = ((function (G__12300_12303,G__12301_12304){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__12300_12303,G__12301_12304))
+;
+goog.object.set(G__12300_12303,G__12301_12304,G__12302_12305);
+/**
+ * Returns a lazy seq of nums from start (inclusive) to end
+ * (exclusive), by step, where start defaults to 0, step to 1,
+ * and end to infinity.
+ */
+cljs.core.range = (function cljs$core$range(var_args){
+var G__12307 = arguments.length;
+switch (G__12307) {
+case 0:
+return cljs.core.range.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.range.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.range.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.range.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.range.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.range.cljs$core$IFn$_invoke$arity$3((0),Number.MAX_VALUE,(1));
+});
+
+cljs.core.range.cljs$core$IFn$_invoke$arity$1 = (function (end){
+return cljs.core.range.cljs$core$IFn$_invoke$arity$3((0),end,(1));
+});
+
+cljs.core.range.cljs$core$IFn$_invoke$arity$2 = (function (start,end){
+return cljs.core.range.cljs$core$IFn$_invoke$arity$3(start,end,(1));
+});
+
+cljs.core.range.cljs$core$IFn$_invoke$arity$3 = (function (start,end,step){
+return (new cljs.core.Range(null,start,end,step,null));
+});
+
+cljs.core.range.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns a lazy seq of every nth item in coll. Returns a stateful
+ * transducer when no collection is provided.
+ */
+cljs.core.take_nth = (function cljs$core$take_nth(var_args){
+var G__12310 = arguments.length;
+switch (G__12310) {
+case 1:
+return cljs.core.take_nth.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.take_nth.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.take_nth.cljs$core$IFn$_invoke$arity$1 = (function (n){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+return (function (rf){
+var ia = cljs.core.volatile_BANG_((-1));
+return ((function (ia){
+return (function() {
+var G__12312 = null;
+var G__12312__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__12312__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__12312__2 = (function (result,input){
+var i = ia.cljs$core$IVolatile$_vreset_BANG_$arity$2(null,(ia.cljs$core$IDeref$_deref$arity$1(null) + (1)));
+if((cljs.core.rem(i,n) === (0))){
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+} else {
+return result;
+}
+});
+G__12312 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__12312__0.call(this);
+case 1:
+return G__12312__1.call(this,result);
+case 2:
+return G__12312__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12312.cljs$core$IFn$_invoke$arity$0 = G__12312__0;
+G__12312.cljs$core$IFn$_invoke$arity$1 = G__12312__1;
+G__12312.cljs$core$IFn$_invoke$arity$2 = G__12312__2;
+return G__12312;
+})()
+;})(ia))
+});
+});
+
+cljs.core.take_nth.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+if(typeof n === 'number'){
+} else {
+throw (new Error("Assert failed: (number? n)"));
+}
+
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+return cljs.core.cons(cljs.core.first(s),cljs.core.take_nth.cljs$core$IFn$_invoke$arity$2(n,cljs.core.drop.cljs$core$IFn$_invoke$arity$2(n,s)));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.take_nth.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a vector of [(take-while pred coll) (drop-while pred coll)]
+ */
+cljs.core.split_with = (function cljs$core$split_with(pred,coll){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(pred,coll),cljs.core.drop_while.cljs$core$IFn$_invoke$arity$2(pred,coll)], null);
+});
+/**
+ * Applies f to each value in coll, splitting it each time f returns a
+ * new value. Returns a lazy seq of partitions. Returns a stateful
+ * transducer when no collection is provided.
+ */
+cljs.core.partition_by = (function cljs$core$partition_by(var_args){
+var G__12315 = arguments.length;
+switch (G__12315) {
+case 1:
+return cljs.core.partition_by.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.partition_by.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.partition_by.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function (rf){
+var a = cljs.core.array_list();
+var pa = cljs.core.volatile_BANG_(new cljs.core.Keyword("cljs.core","none","cljs.core/none",926646439));
+return ((function (a,pa){
+return (function() {
+var G__12317 = null;
+var G__12317__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__12317__1 = (function (result){
+var result__$1 = (cljs.core.truth_(a.isEmpty())?result:(function (){var v = cljs.core.vec(a.toArray());
+a.clear();
+
+return cljs.core.unreduced((rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v)));
+})());
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result__$1) : rf.call(null,result__$1));
+});
+var G__12317__2 = (function (result,input){
+var pval = cljs.core.deref(pa);
+var val = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(input) : f.call(null,input));
+cljs.core.vreset_BANG_(pa,val);
+
+if(((cljs.core.keyword_identical_QMARK_(pval,new cljs.core.Keyword("cljs.core","none","cljs.core/none",926646439))) || (cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(val,pval)))){
+a.add(input);
+
+return result;
+} else {
+var v = cljs.core.vec(a.toArray());
+a.clear();
+
+var ret = (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,v) : rf.call(null,result,v));
+if(cljs.core.reduced_QMARK_(ret)){
+} else {
+a.add(input);
+}
+
+return ret;
+}
+});
+G__12317 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__12317__0.call(this);
+case 1:
+return G__12317__1.call(this,result);
+case 2:
+return G__12317__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12317.cljs$core$IFn$_invoke$arity$0 = G__12317__0;
+G__12317.cljs$core$IFn$_invoke$arity$1 = G__12317__1;
+G__12317.cljs$core$IFn$_invoke$arity$2 = G__12317__2;
+return G__12317;
+})()
+;})(a,pa))
+});
+});
+
+cljs.core.partition_by.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+var fst = cljs.core.first(s);
+var fv = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(fst) : f.call(null,fst));
+var run = cljs.core.cons(fst,cljs.core.take_while.cljs$core$IFn$_invoke$arity$2(((function (fst,fv,s,temp__4657__auto__){
+return (function (p1__12313_SHARP_){
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(fv,(f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(p1__12313_SHARP_) : f.call(null,p1__12313_SHARP_)));
+});})(fst,fv,s,temp__4657__auto__))
+,cljs.core.next(s)));
+return cljs.core.cons(run,cljs.core.partition_by.cljs$core$IFn$_invoke$arity$2(f,(new cljs.core.LazySeq(null,((function (fst,fv,run,s,temp__4657__auto__){
+return (function (){
+return cljs.core.drop.cljs$core$IFn$_invoke$arity$2(cljs.core.count(run),s);
+});})(fst,fv,run,s,temp__4657__auto__))
+,null,null))));
+} else {
+return null;
+}
+}),null,null));
+});
+
+cljs.core.partition_by.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a map from distinct items in coll to the number of times
+ * they appear.
+ */
+cljs.core.frequencies = (function cljs$core$frequencies(coll){
+return cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (counts,x){
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(counts,x,(cljs.core.get.cljs$core$IFn$_invoke$arity$3(counts,x,(0)) + (1)));
+}),cljs.core.transient$(cljs.core.PersistentArrayMap.EMPTY),coll));
+});
+/**
+ * Returns a lazy seq of the intermediate values of the reduction (as
+ * per reduce) of coll by f, starting with init.
+ */
+cljs.core.reductions = (function cljs$core$reductions(var_args){
+var G__12319 = arguments.length;
+switch (G__12319) {
+case 2:
+return cljs.core.reductions.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.reductions.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.reductions.cljs$core$IFn$_invoke$arity$2 = (function (f,coll){
+return (new cljs.core.LazySeq(null,(function (){
+var temp__4655__auto__ = cljs.core.seq(coll);
+if(temp__4655__auto__){
+var s = temp__4655__auto__;
+return cljs.core.reductions.cljs$core$IFn$_invoke$arity$3(f,cljs.core.first(s),cljs.core.rest(s));
+} else {
+return (new cljs.core.List(null,(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)),null,(1),null));
+}
+}),null,null));
+});
+
+cljs.core.reductions.cljs$core$IFn$_invoke$arity$3 = (function (f,init,coll){
+if(cljs.core.reduced_QMARK_(init)){
+return (new cljs.core.List(null,cljs.core.deref(init),null,(1),null));
+} else {
+return cljs.core.cons(init,(new cljs.core.LazySeq(null,(function (){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+return cljs.core.reductions.cljs$core$IFn$_invoke$arity$3(f,(function (){var G__12320 = init;
+var G__12321 = cljs.core.first(s);
+return (f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(G__12320,G__12321) : f.call(null,G__12320,G__12321));
+})(),cljs.core.rest(s));
+} else {
+return null;
+}
+}),null,null)));
+}
+});
+
+cljs.core.reductions.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Takes a set of functions and returns a fn that is the juxtaposition
+ * of those fns. The returned fn takes a variable number of args, and
+ * returns a vector containing the result of applying each fn to the
+ * args (left-to-right).
+ * ((juxt a b c) x) => [(a x) (b x) (c x)]
+ */
+cljs.core.juxt = (function cljs$core$juxt(var_args){
+var G__12338 = arguments.length;
+switch (G__12338) {
+case 1:
+return cljs.core.juxt.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.juxt.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.juxt.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___12340 = arguments.length;
+var i__9001__auto___12341 = (0);
+while(true){
+if((i__9001__auto___12341 < len__9000__auto___12340)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___12341]));
+
+var G__12342 = (i__9001__auto___12341 + (1));
+i__9001__auto___12341 = G__12342;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((3)),(0),null));
+return cljs.core.juxt.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.juxt.cljs$core$IFn$_invoke$arity$1 = (function (f){
+return (function() {
+var G__12343 = null;
+var G__12343__0 = (function (){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null))],null));
+});
+var G__12343__1 = (function (x){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x))],null));
+});
+var G__12343__2 = (function (x,y){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y))],null));
+});
+var G__12343__3 = (function (x,y,z){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(x,y,z) : f.call(null,x,y,z))],null));
+});
+var G__12343__4 = (function() {
+var G__12344__delegate = function (x,y,z,args){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,x,y,z,args)],null));
+};
+var G__12344 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__12345__i = 0, G__12345__a = new Array(arguments.length - 3);
+while (G__12345__i < G__12345__a.length) {G__12345__a[G__12345__i] = arguments[G__12345__i + 3]; ++G__12345__i;}
+ args = new cljs.core.IndexedSeq(G__12345__a,0,null);
+}
+return G__12344__delegate.call(this,x,y,z,args);};
+G__12344.cljs$lang$maxFixedArity = 3;
+G__12344.cljs$lang$applyTo = (function (arglist__12346){
+var x = cljs.core.first(arglist__12346);
+arglist__12346 = cljs.core.next(arglist__12346);
+var y = cljs.core.first(arglist__12346);
+arglist__12346 = cljs.core.next(arglist__12346);
+var z = cljs.core.first(arglist__12346);
+var args = cljs.core.rest(arglist__12346);
+return G__12344__delegate(x,y,z,args);
+});
+G__12344.cljs$core$IFn$_invoke$arity$variadic = G__12344__delegate;
+return G__12344;
+})()
+;
+G__12343 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__12343__0.call(this);
+case 1:
+return G__12343__1.call(this,x);
+case 2:
+return G__12343__2.call(this,x,y);
+case 3:
+return G__12343__3.call(this,x,y,z);
+default:
+var G__12347 = null;
+if (arguments.length > 3) {
+var G__12348__i = 0, G__12348__a = new Array(arguments.length - 3);
+while (G__12348__i < G__12348__a.length) {G__12348__a[G__12348__i] = arguments[G__12348__i + 3]; ++G__12348__i;}
+G__12347 = new cljs.core.IndexedSeq(G__12348__a,0,null);
+}
+return G__12343__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__12347);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12343.cljs$lang$maxFixedArity = 3;
+G__12343.cljs$lang$applyTo = G__12343__4.cljs$lang$applyTo;
+G__12343.cljs$core$IFn$_invoke$arity$0 = G__12343__0;
+G__12343.cljs$core$IFn$_invoke$arity$1 = G__12343__1;
+G__12343.cljs$core$IFn$_invoke$arity$2 = G__12343__2;
+G__12343.cljs$core$IFn$_invoke$arity$3 = G__12343__3;
+G__12343.cljs$core$IFn$_invoke$arity$variadic = G__12343__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__12343;
+})()
+});
+
+cljs.core.juxt.cljs$core$IFn$_invoke$arity$2 = (function (f,g){
+return (function() {
+var G__12349 = null;
+var G__12349__0 = (function (){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)),(g.cljs$core$IFn$_invoke$arity$0 ? g.cljs$core$IFn$_invoke$arity$0() : g.call(null))],null));
+});
+var G__12349__1 = (function (x){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x)),(g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(x) : g.call(null,x))],null));
+});
+var G__12349__2 = (function (x,y){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y)),(g.cljs$core$IFn$_invoke$arity$2 ? g.cljs$core$IFn$_invoke$arity$2(x,y) : g.call(null,x,y))],null));
+});
+var G__12349__3 = (function (x,y,z){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(x,y,z) : f.call(null,x,y,z)),(g.cljs$core$IFn$_invoke$arity$3 ? g.cljs$core$IFn$_invoke$arity$3(x,y,z) : g.call(null,x,y,z))],null));
+});
+var G__12349__4 = (function() {
+var G__12350__delegate = function (x,y,z,args){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,x,y,z,args),cljs.core.apply.cljs$core$IFn$_invoke$arity$5(g,x,y,z,args)],null));
+};
+var G__12350 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__12351__i = 0, G__12351__a = new Array(arguments.length - 3);
+while (G__12351__i < G__12351__a.length) {G__12351__a[G__12351__i] = arguments[G__12351__i + 3]; ++G__12351__i;}
+ args = new cljs.core.IndexedSeq(G__12351__a,0,null);
+}
+return G__12350__delegate.call(this,x,y,z,args);};
+G__12350.cljs$lang$maxFixedArity = 3;
+G__12350.cljs$lang$applyTo = (function (arglist__12352){
+var x = cljs.core.first(arglist__12352);
+arglist__12352 = cljs.core.next(arglist__12352);
+var y = cljs.core.first(arglist__12352);
+arglist__12352 = cljs.core.next(arglist__12352);
+var z = cljs.core.first(arglist__12352);
+var args = cljs.core.rest(arglist__12352);
+return G__12350__delegate(x,y,z,args);
+});
+G__12350.cljs$core$IFn$_invoke$arity$variadic = G__12350__delegate;
+return G__12350;
+})()
+;
+G__12349 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__12349__0.call(this);
+case 1:
+return G__12349__1.call(this,x);
+case 2:
+return G__12349__2.call(this,x,y);
+case 3:
+return G__12349__3.call(this,x,y,z);
+default:
+var G__12353 = null;
+if (arguments.length > 3) {
+var G__12354__i = 0, G__12354__a = new Array(arguments.length - 3);
+while (G__12354__i < G__12354__a.length) {G__12354__a[G__12354__i] = arguments[G__12354__i + 3]; ++G__12354__i;}
+G__12353 = new cljs.core.IndexedSeq(G__12354__a,0,null);
+}
+return G__12349__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__12353);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12349.cljs$lang$maxFixedArity = 3;
+G__12349.cljs$lang$applyTo = G__12349__4.cljs$lang$applyTo;
+G__12349.cljs$core$IFn$_invoke$arity$0 = G__12349__0;
+G__12349.cljs$core$IFn$_invoke$arity$1 = G__12349__1;
+G__12349.cljs$core$IFn$_invoke$arity$2 = G__12349__2;
+G__12349.cljs$core$IFn$_invoke$arity$3 = G__12349__3;
+G__12349.cljs$core$IFn$_invoke$arity$variadic = G__12349__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__12349;
+})()
+});
+
+cljs.core.juxt.cljs$core$IFn$_invoke$arity$3 = (function (f,g,h){
+return (function() {
+var G__12355 = null;
+var G__12355__0 = (function (){
+return (new cljs.core.PersistentVector(null,3,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)),(g.cljs$core$IFn$_invoke$arity$0 ? g.cljs$core$IFn$_invoke$arity$0() : g.call(null)),(h.cljs$core$IFn$_invoke$arity$0 ? h.cljs$core$IFn$_invoke$arity$0() : h.call(null))],null));
+});
+var G__12355__1 = (function (x){
+return (new cljs.core.PersistentVector(null,3,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x)),(g.cljs$core$IFn$_invoke$arity$1 ? g.cljs$core$IFn$_invoke$arity$1(x) : g.call(null,x)),(h.cljs$core$IFn$_invoke$arity$1 ? h.cljs$core$IFn$_invoke$arity$1(x) : h.call(null,x))],null));
+});
+var G__12355__2 = (function (x,y){
+return (new cljs.core.PersistentVector(null,3,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$2 ? f.cljs$core$IFn$_invoke$arity$2(x,y) : f.call(null,x,y)),(g.cljs$core$IFn$_invoke$arity$2 ? g.cljs$core$IFn$_invoke$arity$2(x,y) : g.call(null,x,y)),(h.cljs$core$IFn$_invoke$arity$2 ? h.cljs$core$IFn$_invoke$arity$2(x,y) : h.call(null,x,y))],null));
+});
+var G__12355__3 = (function (x,y,z){
+return (new cljs.core.PersistentVector(null,3,(5),cljs.core.PersistentVector.EMPTY_NODE,[(f.cljs$core$IFn$_invoke$arity$3 ? f.cljs$core$IFn$_invoke$arity$3(x,y,z) : f.call(null,x,y,z)),(g.cljs$core$IFn$_invoke$arity$3 ? g.cljs$core$IFn$_invoke$arity$3(x,y,z) : g.call(null,x,y,z)),(h.cljs$core$IFn$_invoke$arity$3 ? h.cljs$core$IFn$_invoke$arity$3(x,y,z) : h.call(null,x,y,z))],null));
+});
+var G__12355__4 = (function() {
+var G__12356__delegate = function (x,y,z,args){
+return (new cljs.core.PersistentVector(null,3,(5),cljs.core.PersistentVector.EMPTY_NODE,[cljs.core.apply.cljs$core$IFn$_invoke$arity$5(f,x,y,z,args),cljs.core.apply.cljs$core$IFn$_invoke$arity$5(g,x,y,z,args),cljs.core.apply.cljs$core$IFn$_invoke$arity$5(h,x,y,z,args)],null));
+};
+var G__12356 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__12357__i = 0, G__12357__a = new Array(arguments.length - 3);
+while (G__12357__i < G__12357__a.length) {G__12357__a[G__12357__i] = arguments[G__12357__i + 3]; ++G__12357__i;}
+ args = new cljs.core.IndexedSeq(G__12357__a,0,null);
+}
+return G__12356__delegate.call(this,x,y,z,args);};
+G__12356.cljs$lang$maxFixedArity = 3;
+G__12356.cljs$lang$applyTo = (function (arglist__12358){
+var x = cljs.core.first(arglist__12358);
+arglist__12358 = cljs.core.next(arglist__12358);
+var y = cljs.core.first(arglist__12358);
+arglist__12358 = cljs.core.next(arglist__12358);
+var z = cljs.core.first(arglist__12358);
+var args = cljs.core.rest(arglist__12358);
+return G__12356__delegate(x,y,z,args);
+});
+G__12356.cljs$core$IFn$_invoke$arity$variadic = G__12356__delegate;
+return G__12356;
+})()
+;
+G__12355 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__12355__0.call(this);
+case 1:
+return G__12355__1.call(this,x);
+case 2:
+return G__12355__2.call(this,x,y);
+case 3:
+return G__12355__3.call(this,x,y,z);
+default:
+var G__12359 = null;
+if (arguments.length > 3) {
+var G__12360__i = 0, G__12360__a = new Array(arguments.length - 3);
+while (G__12360__i < G__12360__a.length) {G__12360__a[G__12360__i] = arguments[G__12360__i + 3]; ++G__12360__i;}
+G__12359 = new cljs.core.IndexedSeq(G__12360__a,0,null);
+}
+return G__12355__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__12359);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12355.cljs$lang$maxFixedArity = 3;
+G__12355.cljs$lang$applyTo = G__12355__4.cljs$lang$applyTo;
+G__12355.cljs$core$IFn$_invoke$arity$0 = G__12355__0;
+G__12355.cljs$core$IFn$_invoke$arity$1 = G__12355__1;
+G__12355.cljs$core$IFn$_invoke$arity$2 = G__12355__2;
+G__12355.cljs$core$IFn$_invoke$arity$3 = G__12355__3;
+G__12355.cljs$core$IFn$_invoke$arity$variadic = G__12355__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__12355;
+})()
+});
+
+cljs.core.juxt.cljs$core$IFn$_invoke$arity$variadic = (function (f,g,h,fs){
+var fs__$1 = cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4(f,g,h,fs);
+return ((function (fs__$1){
+return (function() {
+var G__12361 = null;
+var G__12361__0 = (function (){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (fs__$1){
+return (function (p1__12323_SHARP_,p2__12324_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(p1__12323_SHARP_,(p2__12324_SHARP_.cljs$core$IFn$_invoke$arity$0 ? p2__12324_SHARP_.cljs$core$IFn$_invoke$arity$0() : p2__12324_SHARP_.call(null)));
+});})(fs__$1))
+,cljs.core.PersistentVector.EMPTY,fs__$1);
+});
+var G__12361__1 = (function (x){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (fs__$1){
+return (function (p1__12325_SHARP_,p2__12326_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(p1__12325_SHARP_,(p2__12326_SHARP_.cljs$core$IFn$_invoke$arity$1 ? p2__12326_SHARP_.cljs$core$IFn$_invoke$arity$1(x) : p2__12326_SHARP_.call(null,x)));
+});})(fs__$1))
+,cljs.core.PersistentVector.EMPTY,fs__$1);
+});
+var G__12361__2 = (function (x,y){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (fs__$1){
+return (function (p1__12327_SHARP_,p2__12328_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(p1__12327_SHARP_,(p2__12328_SHARP_.cljs$core$IFn$_invoke$arity$2 ? p2__12328_SHARP_.cljs$core$IFn$_invoke$arity$2(x,y) : p2__12328_SHARP_.call(null,x,y)));
+});})(fs__$1))
+,cljs.core.PersistentVector.EMPTY,fs__$1);
+});
+var G__12361__3 = (function (x,y,z){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (fs__$1){
+return (function (p1__12329_SHARP_,p2__12330_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(p1__12329_SHARP_,(p2__12330_SHARP_.cljs$core$IFn$_invoke$arity$3 ? p2__12330_SHARP_.cljs$core$IFn$_invoke$arity$3(x,y,z) : p2__12330_SHARP_.call(null,x,y,z)));
+});})(fs__$1))
+,cljs.core.PersistentVector.EMPTY,fs__$1);
+});
+var G__12361__4 = (function() {
+var G__12362__delegate = function (x,y,z,args){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (fs__$1){
+return (function (p1__12331_SHARP_,p2__12332_SHARP_){
+return cljs.core.conj.cljs$core$IFn$_invoke$arity$2(p1__12331_SHARP_,cljs.core.apply.cljs$core$IFn$_invoke$arity$5(p2__12332_SHARP_,x,y,z,args));
+});})(fs__$1))
+,cljs.core.PersistentVector.EMPTY,fs__$1);
+};
+var G__12362 = function (x,y,z,var_args){
+var args = null;
+if (arguments.length > 3) {
+var G__12363__i = 0, G__12363__a = new Array(arguments.length - 3);
+while (G__12363__i < G__12363__a.length) {G__12363__a[G__12363__i] = arguments[G__12363__i + 3]; ++G__12363__i;}
+ args = new cljs.core.IndexedSeq(G__12363__a,0,null);
+}
+return G__12362__delegate.call(this,x,y,z,args);};
+G__12362.cljs$lang$maxFixedArity = 3;
+G__12362.cljs$lang$applyTo = (function (arglist__12364){
+var x = cljs.core.first(arglist__12364);
+arglist__12364 = cljs.core.next(arglist__12364);
+var y = cljs.core.first(arglist__12364);
+arglist__12364 = cljs.core.next(arglist__12364);
+var z = cljs.core.first(arglist__12364);
+var args = cljs.core.rest(arglist__12364);
+return G__12362__delegate(x,y,z,args);
+});
+G__12362.cljs$core$IFn$_invoke$arity$variadic = G__12362__delegate;
+return G__12362;
+})()
+;
+G__12361 = function(x,y,z,var_args){
+var args = var_args;
+switch(arguments.length){
+case 0:
+return G__12361__0.call(this);
+case 1:
+return G__12361__1.call(this,x);
+case 2:
+return G__12361__2.call(this,x,y);
+case 3:
+return G__12361__3.call(this,x,y,z);
+default:
+var G__12365 = null;
+if (arguments.length > 3) {
+var G__12366__i = 0, G__12366__a = new Array(arguments.length - 3);
+while (G__12366__i < G__12366__a.length) {G__12366__a[G__12366__i] = arguments[G__12366__i + 3]; ++G__12366__i;}
+G__12365 = new cljs.core.IndexedSeq(G__12366__a,0,null);
+}
+return G__12361__4.cljs$core$IFn$_invoke$arity$variadic(x,y,z, G__12365);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12361.cljs$lang$maxFixedArity = 3;
+G__12361.cljs$lang$applyTo = G__12361__4.cljs$lang$applyTo;
+G__12361.cljs$core$IFn$_invoke$arity$0 = G__12361__0;
+G__12361.cljs$core$IFn$_invoke$arity$1 = G__12361__1;
+G__12361.cljs$core$IFn$_invoke$arity$2 = G__12361__2;
+G__12361.cljs$core$IFn$_invoke$arity$3 = G__12361__3;
+G__12361.cljs$core$IFn$_invoke$arity$variadic = G__12361__4.cljs$core$IFn$_invoke$arity$variadic;
+return G__12361;
+})()
+;})(fs__$1))
+});
+
+/** @this {Function} */
+cljs.core.juxt.cljs$lang$applyTo = (function (seq12334){
+var G__12335 = cljs.core.first(seq12334);
+var seq12334__$1 = cljs.core.next(seq12334);
+var G__12336 = cljs.core.first(seq12334__$1);
+var seq12334__$2 = cljs.core.next(seq12334__$1);
+var G__12337 = cljs.core.first(seq12334__$2);
+var seq12334__$3 = cljs.core.next(seq12334__$2);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12335,G__12336,G__12337,seq12334__$3);
+});
+
+cljs.core.juxt.cljs$lang$maxFixedArity = (3);
+
+/**
+ * When lazy sequences are produced via functions that have side
+ * effects, any effects other than those needed to produce the first
+ * element in the seq do not occur until the seq is consumed. dorun can
+ * be used to force any effects. Walks through the successive nexts of
+ * the seq, does not retain the head and returns nil.
+ */
+cljs.core.dorun = (function cljs$core$dorun(var_args){
+var G__12368 = arguments.length;
+switch (G__12368) {
+case 1:
+return cljs.core.dorun.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.dorun.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.dorun.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+while(true){
+var temp__4657__auto__ = cljs.core.seq(coll);
+if(temp__4657__auto__){
+var s = temp__4657__auto__;
+var G__12370 = cljs.core.next(s);
+coll = G__12370;
+continue;
+} else {
+return null;
+}
+break;
+}
+});
+
+cljs.core.dorun.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+while(true){
+if(((cljs.core.seq(coll)) && ((n > (0))))){
+var G__12371 = (n - (1));
+var G__12372 = cljs.core.next(coll);
+n = G__12371;
+coll = G__12372;
+continue;
+} else {
+return null;
+}
+break;
+}
+});
+
+cljs.core.dorun.cljs$lang$maxFixedArity = 2;
+
+/**
+ * When lazy sequences are produced via functions that have side
+ * effects, any effects other than those needed to produce the first
+ * element in the seq do not occur until the seq is consumed. doall can
+ * be used to force any effects. Walks through the successive nexts of
+ * the seq, retains the head and returns it, thus causing the entire
+ * seq to reside in memory at one time.
+ */
+cljs.core.doall = (function cljs$core$doall(var_args){
+var G__12374 = arguments.length;
+switch (G__12374) {
+case 1:
+return cljs.core.doall.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.doall.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.doall.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+cljs.core.dorun.cljs$core$IFn$_invoke$arity$1(coll);
+
+return coll;
+});
+
+cljs.core.doall.cljs$core$IFn$_invoke$arity$2 = (function (n,coll){
+cljs.core.dorun.cljs$core$IFn$_invoke$arity$2(n,coll);
+
+return coll;
+});
+
+cljs.core.doall.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns true if x is a JavaScript RegExp instance.
+ */
+cljs.core.regexp_QMARK_ = (function cljs$core$regexp_QMARK_(x){
+return (x instanceof RegExp);
+});
+/**
+ * Returns the result of (re-find re s) if re fully matches s.
+ */
+cljs.core.re_matches = (function cljs$core$re_matches(re,s){
+if(typeof s === 'string'){
+var matches = re.exec(s);
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.first(matches),s)){
+if((cljs.core.count(matches) === (1))){
+return cljs.core.first(matches);
+} else {
+return cljs.core.vec(matches);
+}
+} else {
+return null;
+}
+} else {
+throw (new TypeError("re-matches must match against a string."));
+}
+});
+/**
+ * Returns the first regex match, if any, of s to re, using
+ * re.exec(s). Returns a vector, containing first the matching
+ * substring, then any capturing groups if the regular expression contains
+ * capturing groups.
+ */
+cljs.core.re_find = (function cljs$core$re_find(re,s){
+if(typeof s === 'string'){
+var matches = re.exec(s);
+if((matches == null)){
+return null;
+} else {
+if((cljs.core.count(matches) === (1))){
+return cljs.core.first(matches);
+} else {
+return cljs.core.vec(matches);
+}
+}
+} else {
+throw (new TypeError("re-find must match against a string."));
+}
+});
+/**
+ * Returns a lazy sequence of successive matches of re in s.
+ */
+cljs.core.re_seq = (function cljs$core$re_seq(re,s){
+var match_data = cljs.core.re_find(re,s);
+var match_idx = s.search(re);
+var match_str = ((cljs.core.coll_QMARK_(match_data))?cljs.core.first(match_data):match_data);
+var post_idx = (match_idx + (function (){var x__8162__auto__ = (1);
+var y__8163__auto__ = cljs.core.count(match_str);
+return ((x__8162__auto__ > y__8163__auto__) ? x__8162__auto__ : y__8163__auto__);
+})());
+var post_match = cljs.core.subs.cljs$core$IFn$_invoke$arity$2(s,post_idx);
+if(cljs.core.truth_(match_data)){
+return (new cljs.core.LazySeq(null,((function (match_data,match_idx,match_str,post_idx,post_match){
+return (function (){
+return cljs.core.cons(match_data,(((post_idx <= cljs.core.count(s)))?(cljs.core.re_seq.cljs$core$IFn$_invoke$arity$2 ? cljs.core.re_seq.cljs$core$IFn$_invoke$arity$2(re,post_match) : cljs.core.re_seq.call(null,re,post_match)):null));
+});})(match_data,match_idx,match_str,post_idx,post_match))
+,null,null));
+} else {
+return null;
+}
+});
+/**
+ * Returns an instance of RegExp which has compiled the provided string.
+ */
+cljs.core.re_pattern = (function cljs$core$re_pattern(s){
+if((s instanceof RegExp)){
+return s;
+} else {
+var vec__12376 = cljs.core.re_find(/^\(\?([idmsux]*)\)/,s);
+var prefix = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12376,(0),null);
+var flags = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12376,(1),null);
+var pattern = cljs.core.subs.cljs$core$IFn$_invoke$arity$2(s,cljs.core.count(prefix));
+return (new RegExp(pattern,(function (){var or__7806__auto__ = flags;
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return "";
+}
+})()));
+}
+});
+cljs.core.pr_sequential_writer = (function cljs$core$pr_sequential_writer(writer,print_one,begin,sep,end,opts,coll){
+var _STAR_print_level_STAR__orig_val__12379 = cljs.core._STAR_print_level_STAR_;
+var _STAR_print_level_STAR__temp_val__12380 = (((cljs.core._STAR_print_level_STAR_ == null))?null:(cljs.core._STAR_print_level_STAR_ - (1)));
+cljs.core._STAR_print_level_STAR_ = _STAR_print_level_STAR__temp_val__12380;
+
+try{if((((!((cljs.core._STAR_print_level_STAR_ == null)))) && ((cljs.core._STAR_print_level_STAR_ < (0))))){
+return cljs.core._write(writer,"#");
+} else {
+cljs.core._write(writer,begin);
+
+if((new cljs.core.Keyword(null,"print-length","print-length",1931866356).cljs$core$IFn$_invoke$arity$1(opts) === (0))){
+if(cljs.core.seq(coll)){
+cljs.core._write(writer,(function (){var or__7806__auto__ = new cljs.core.Keyword(null,"more-marker","more-marker",-14717935).cljs$core$IFn$_invoke$arity$1(opts);
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return "...";
+}
+})());
+} else {
+}
+} else {
+if(cljs.core.seq(coll)){
+var G__12381_12387 = cljs.core.first(coll);
+var G__12382_12388 = writer;
+var G__12383_12389 = opts;
+(print_one.cljs$core$IFn$_invoke$arity$3 ? print_one.cljs$core$IFn$_invoke$arity$3(G__12381_12387,G__12382_12388,G__12383_12389) : print_one.call(null,G__12381_12387,G__12382_12388,G__12383_12389));
+} else {
+}
+
+var coll_12390__$1 = cljs.core.next(coll);
+var n_12391 = (new cljs.core.Keyword(null,"print-length","print-length",1931866356).cljs$core$IFn$_invoke$arity$1(opts) - (1));
+while(true){
+if(((coll_12390__$1) && ((((n_12391 == null)) || ((!((n_12391 === (0))))))))){
+cljs.core._write(writer,sep);
+
+var G__12384_12392 = cljs.core.first(coll_12390__$1);
+var G__12385_12393 = writer;
+var G__12386_12394 = opts;
+(print_one.cljs$core$IFn$_invoke$arity$3 ? print_one.cljs$core$IFn$_invoke$arity$3(G__12384_12392,G__12385_12393,G__12386_12394) : print_one.call(null,G__12384_12392,G__12385_12393,G__12386_12394));
+
+var G__12395 = cljs.core.next(coll_12390__$1);
+var G__12396 = (n_12391 - (1));
+coll_12390__$1 = G__12395;
+n_12391 = G__12396;
+continue;
+} else {
+if(((cljs.core.seq(coll_12390__$1)) && ((n_12391 === (0))))){
+cljs.core._write(writer,sep);
+
+cljs.core._write(writer,(function (){var or__7806__auto__ = new cljs.core.Keyword(null,"more-marker","more-marker",-14717935).cljs$core$IFn$_invoke$arity$1(opts);
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return "...";
+}
+})());
+} else {
+}
+}
+break;
+}
+}
+
+return cljs.core._write(writer,end);
+}
+}finally {cljs.core._STAR_print_level_STAR_ = _STAR_print_level_STAR__orig_val__12379;
+}});
+cljs.core.write_all = (function cljs$core$write_all(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12403 = arguments.length;
+var i__9001__auto___12404 = (0);
+while(true){
+if((i__9001__auto___12404 < len__9000__auto___12403)){
+args__9010__auto__.push((arguments[i__9001__auto___12404]));
+
+var G__12405 = (i__9001__auto___12404 + (1));
+i__9001__auto___12404 = G__12405;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((1) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((1)),(0),null)):null);
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9011__auto__);
+});
+
+cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic = (function (writer,ss){
+var seq__12399 = cljs.core.seq(ss);
+var chunk__12400 = null;
+var count__12401 = (0);
+var i__12402 = (0);
+while(true){
+if((i__12402 < count__12401)){
+var s = chunk__12400.cljs$core$IIndexed$_nth$arity$2(null,i__12402);
+cljs.core._write(writer,s);
+
+
+var G__12406 = seq__12399;
+var G__12407 = chunk__12400;
+var G__12408 = count__12401;
+var G__12409 = (i__12402 + (1));
+seq__12399 = G__12406;
+chunk__12400 = G__12407;
+count__12401 = G__12408;
+i__12402 = G__12409;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__12399);
+if(temp__4657__auto__){
+var seq__12399__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__12399__$1)){
+var c__8664__auto__ = cljs.core.chunk_first(seq__12399__$1);
+var G__12410 = cljs.core.chunk_rest(seq__12399__$1);
+var G__12411 = c__8664__auto__;
+var G__12412 = cljs.core.count(c__8664__auto__);
+var G__12413 = (0);
+seq__12399 = G__12410;
+chunk__12400 = G__12411;
+count__12401 = G__12412;
+i__12402 = G__12413;
+continue;
+} else {
+var s = cljs.core.first(seq__12399__$1);
+cljs.core._write(writer,s);
+
+
+var G__12414 = cljs.core.next(seq__12399__$1);
+var G__12415 = null;
+var G__12416 = (0);
+var G__12417 = (0);
+seq__12399 = G__12414;
+chunk__12400 = G__12415;
+count__12401 = G__12416;
+i__12402 = G__12417;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+
+cljs.core.write_all.cljs$lang$maxFixedArity = (1);
+
+/** @this {Function} */
+cljs.core.write_all.cljs$lang$applyTo = (function (seq12397){
+var G__12398 = cljs.core.first(seq12397);
+var seq12397__$1 = cljs.core.next(seq12397);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12398,seq12397__$1);
+});
+
+cljs.core.string_print = (function cljs$core$string_print(x){
+if((cljs.core._STAR_print_fn_STAR_ == null)){
+throw (new Error("No *print-fn* fn set for evaluation environment"));
+} else {
+}
+
+(cljs.core._STAR_print_fn_STAR_.cljs$core$IFn$_invoke$arity$1 ? cljs.core._STAR_print_fn_STAR_.cljs$core$IFn$_invoke$arity$1(x) : cljs.core._STAR_print_fn_STAR_.call(null,x));
+
+return null;
+});
+cljs.core.flush = (function cljs$core$flush(){
+return null;
+});
+cljs.core.char_escapes = (function (){var obj12419 = {"\"":"\\\"","\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t"};
+return obj12419;
+})();
+cljs.core.quote_string = (function cljs$core$quote_string(s){
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1("\""),cljs.core.str.cljs$core$IFn$_invoke$arity$1(s.replace(RegExp("[\\\\\"\b\f\n\r\t]","g"),(function (match){
+return (cljs.core.char_escapes[match]);
+}))),cljs.core.str.cljs$core$IFn$_invoke$arity$1("\"")].join('');
+});
+cljs.core.print_meta_QMARK_ = (function cljs$core$print_meta_QMARK_(opts,obj){
+var and__7791__auto__ = cljs.core.boolean$(cljs.core.get.cljs$core$IFn$_invoke$arity$2(opts,new cljs.core.Keyword(null,"meta","meta",1499536964)));
+if(and__7791__auto__){
+var and__7791__auto____$1 = (((!((obj == null))))?(((((obj.cljs$lang$protocol_mask$partition0$ & (131072))) || ((cljs.core.PROTOCOL_SENTINEL === obj.cljs$core$IMeta$))))?true:false):false);
+if(and__7791__auto____$1){
+return (!((cljs.core.meta(obj) == null)));
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+});
+cljs.core.pr_writer_impl = (function cljs$core$pr_writer_impl(obj,writer,opts){
+if((obj == null)){
+return cljs.core._write(writer,"nil");
+} else {
+if(cljs.core.print_meta_QMARK_(opts,obj)){
+cljs.core._write(writer,"^");
+
+cljs.core.pr_writer(cljs.core.meta(obj),writer,opts);
+
+cljs.core._write(writer," ");
+} else {
+}
+
+if(obj.cljs$lang$type){
+return obj.cljs$lang$ctorPrWriter(obj,writer,opts);
+} else {
+if((((!((obj == null))))?(((((obj.cljs$lang$protocol_mask$partition0$ & (2147483648))) || ((cljs.core.PROTOCOL_SENTINEL === obj.cljs$core$IPrintWithWriter$))))?true:(((!obj.cljs$lang$protocol_mask$partition0$))?cljs.core.native_satisfies_QMARK_(cljs.core.IPrintWithWriter,obj):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IPrintWithWriter,obj))){
+return cljs.core._pr_writer(obj,writer,opts);
+} else {
+if(((obj === true) || (obj === false))){
+return cljs.core._write(writer,cljs.core.str.cljs$core$IFn$_invoke$arity$1(obj));
+} else {
+if(typeof obj === 'number'){
+return cljs.core._write(writer,((isNaN(obj))?"##NaN":(((obj === Number.POSITIVE_INFINITY))?"##Inf":(((obj === Number.NEGATIVE_INFINITY))?"##-Inf":cljs.core.str.cljs$core$IFn$_invoke$arity$1(obj)
+))));
+} else {
+if(cljs.core.object_QMARK_(obj)){
+cljs.core._write(writer,"#js ");
+
+return cljs.core.print_map(cljs.core.map.cljs$core$IFn$_invoke$arity$2((function (k){
+return (new cljs.core.MapEntry((function (){var G__12424 = k;
+if((!((cljs.core.re_matches(/[A-Za-z_\*\+\?!\-'][\w\*\+\?!\-']*/,k) == null)))){
+return cljs.core.keyword.cljs$core$IFn$_invoke$arity$1(G__12424);
+} else {
+return G__12424;
+}
+})(),(obj[k]),null));
+}),cljs.core.js_keys(obj)),cljs.core.pr_writer,writer,opts);
+} else {
+if(cljs.core.array_QMARK_(obj)){
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"#js ["," ","]",opts,obj);
+} else {
+if(goog.isString(obj)){
+if(cljs.core.truth_(new cljs.core.Keyword(null,"readably","readably",1129599760).cljs$core$IFn$_invoke$arity$1(opts))){
+return cljs.core._write(writer,cljs.core.quote_string(obj));
+} else {
+return cljs.core._write(writer,obj);
+}
+} else {
+if(goog.isFunction(obj)){
+var name = obj.name;
+var name__$1 = (cljs.core.truth_((function (){var or__7806__auto__ = (name == null);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return goog.string.isEmpty(name);
+}
+})())?"Function":name);
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["#object[",name__$1,((cljs.core._STAR_print_fn_bodies_STAR_)?[" \"",cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.str.cljs$core$IFn$_invoke$arity$1(obj)),"\""].join(''):""),"]"], 0));
+} else {
+if((obj instanceof Date)){
+var normalize = (function (n,len){
+var ns = cljs.core.str.cljs$core$IFn$_invoke$arity$1(n);
+while(true){
+if((cljs.core.count(ns) < len)){
+var G__12427 = ["0",cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns)].join('');
+ns = G__12427;
+continue;
+} else {
+return ns;
+}
+break;
+}
+});
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["#inst \"",cljs.core.str.cljs$core$IFn$_invoke$arity$1(obj.getUTCFullYear()),"-",normalize((obj.getUTCMonth() + (1)),(2)),"-",normalize(obj.getUTCDate(),(2)),"T",normalize(obj.getUTCHours(),(2)),":",normalize(obj.getUTCMinutes(),(2)),":",normalize(obj.getUTCSeconds(),(2)),".",normalize(obj.getUTCMilliseconds(),(3)),"-","00:00\""], 0));
+} else {
+if(cljs.core.regexp_QMARK_(obj)){
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["#\"",obj.source,"\""], 0));
+} else {
+if(cljs.core.truth_((function (){var G__12425 = obj;
+var G__12425__$1 = (((G__12425 == null))?null:G__12425.constructor);
+if((G__12425__$1 == null)){
+return null;
+} else {
+return G__12425__$1.cljs$lang$ctorStr;
+}
+})())){
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["#object[",obj.constructor.cljs$lang$ctorStr.replace((new RegExp("/","g")),"."),"]"], 0));
+} else {
+var name = (function (){var G__12426 = obj;
+var G__12426__$1 = (((G__12426 == null))?null:G__12426.constructor);
+if((G__12426__$1 == null)){
+return null;
+} else {
+return G__12426__$1.name;
+}
+})();
+var name__$1 = (cljs.core.truth_((function (){var or__7806__auto__ = (name == null);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return goog.string.isEmpty(name);
+}
+})())?"Object":name);
+if((obj.constructor == null)){
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["#object[",name__$1,"]"], 0));
+} else {
+return cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic(writer,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2(["#object[",name__$1," ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(obj),"]"], 0));
+}
+}
+
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+
+}
+});
+/**
+ * Prefer this to pr-seq, because it makes the printing function
+ * configurable, allowing efficient implementations such as appending
+ * to a StringBuffer.
+ */
+cljs.core.pr_writer = (function cljs$core$pr_writer(obj,writer,opts){
+var temp__4655__auto__ = new cljs.core.Keyword(null,"alt-impl","alt-impl",670969595).cljs$core$IFn$_invoke$arity$1(opts);
+if(cljs.core.truth_(temp__4655__auto__)){
+var alt_impl = temp__4655__auto__;
+var G__12428 = obj;
+var G__12429 = writer;
+var G__12430 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(opts,new cljs.core.Keyword(null,"fallback-impl","fallback-impl",-1501286995),cljs.core.pr_writer_impl);
+return (alt_impl.cljs$core$IFn$_invoke$arity$3 ? alt_impl.cljs$core$IFn$_invoke$arity$3(G__12428,G__12429,G__12430) : alt_impl.call(null,G__12428,G__12429,G__12430));
+} else {
+return cljs.core.pr_writer_impl(obj,writer,opts);
+}
+});
+cljs.core.pr_seq_writer = (function cljs$core$pr_seq_writer(objs,writer,opts){
+cljs.core.pr_writer(cljs.core.first(objs),writer,opts);
+
+var seq__12431 = cljs.core.seq(cljs.core.next(objs));
+var chunk__12432 = null;
+var count__12433 = (0);
+var i__12434 = (0);
+while(true){
+if((i__12434 < count__12433)){
+var obj = chunk__12432.cljs$core$IIndexed$_nth$arity$2(null,i__12434);
+cljs.core._write(writer," ");
+
+cljs.core.pr_writer(obj,writer,opts);
+
+
+var G__12435 = seq__12431;
+var G__12436 = chunk__12432;
+var G__12437 = count__12433;
+var G__12438 = (i__12434 + (1));
+seq__12431 = G__12435;
+chunk__12432 = G__12436;
+count__12433 = G__12437;
+i__12434 = G__12438;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__12431);
+if(temp__4657__auto__){
+var seq__12431__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__12431__$1)){
+var c__8664__auto__ = cljs.core.chunk_first(seq__12431__$1);
+var G__12439 = cljs.core.chunk_rest(seq__12431__$1);
+var G__12440 = c__8664__auto__;
+var G__12441 = cljs.core.count(c__8664__auto__);
+var G__12442 = (0);
+seq__12431 = G__12439;
+chunk__12432 = G__12440;
+count__12433 = G__12441;
+i__12434 = G__12442;
+continue;
+} else {
+var obj = cljs.core.first(seq__12431__$1);
+cljs.core._write(writer," ");
+
+cljs.core.pr_writer(obj,writer,opts);
+
+
+var G__12443 = cljs.core.next(seq__12431__$1);
+var G__12444 = null;
+var G__12445 = (0);
+var G__12446 = (0);
+seq__12431 = G__12443;
+chunk__12432 = G__12444;
+count__12433 = G__12445;
+i__12434 = G__12446;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+cljs.core.pr_sb_with_opts = (function cljs$core$pr_sb_with_opts(objs,opts){
+var sb = (new goog.string.StringBuffer());
+var writer = (new cljs.core.StringBufferWriter(sb));
+cljs.core.pr_seq_writer(objs,writer,opts);
+
+writer.cljs$core$IWriter$_flush$arity$1(null);
+
+return sb;
+});
+/**
+ * Prints a sequence of objects to a string, observing all the
+ * options given in opts
+ */
+cljs.core.pr_str_with_opts = (function cljs$core$pr_str_with_opts(objs,opts){
+if(cljs.core.empty_QMARK_(objs)){
+return "";
+} else {
+return cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.pr_sb_with_opts(objs,opts));
+}
+});
+/**
+ * Same as pr-str-with-opts followed by (newline)
+ */
+cljs.core.prn_str_with_opts = (function cljs$core$prn_str_with_opts(objs,opts){
+if(cljs.core.empty_QMARK_(objs)){
+return "\n";
+} else {
+var sb = cljs.core.pr_sb_with_opts(objs,opts);
+sb.append("\n");
+
+return cljs.core.str.cljs$core$IFn$_invoke$arity$1(sb);
+}
+});
+/**
+ * Prints a sequence of objects using string-print, observing all
+ * the options given in opts
+ */
+cljs.core.pr_with_opts = (function cljs$core$pr_with_opts(objs,opts){
+return cljs.core.string_print(cljs.core.pr_str_with_opts(objs,opts));
+});
+/**
+ * Prints a newline using *print-fn*
+ */
+cljs.core.newline = (function cljs$core$newline(var_args){
+var G__12448 = arguments.length;
+switch (G__12448) {
+case 0:
+return cljs.core.newline.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.newline.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.newline.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.newline.cljs$core$IFn$_invoke$arity$1(null);
+});
+
+cljs.core.newline.cljs$core$IFn$_invoke$arity$1 = (function (opts){
+cljs.core.string_print("\n");
+
+if(cljs.core.truth_(cljs.core.get.cljs$core$IFn$_invoke$arity$2(opts,new cljs.core.Keyword(null,"flush-on-newline","flush-on-newline",-151457939)))){
+return cljs.core.flush();
+} else {
+return null;
+}
+});
+
+cljs.core.newline.cljs$lang$maxFixedArity = 1;
+
+/**
+ * pr to a string, returning it. Fundamental entrypoint to IPrintWithWriter.
+ */
+cljs.core.pr_str = (function cljs$core$pr_str(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12451 = arguments.length;
+var i__9001__auto___12452 = (0);
+while(true){
+if((i__9001__auto___12452 < len__9000__auto___12451)){
+args__9010__auto__.push((arguments[i__9001__auto___12452]));
+
+var G__12453 = (i__9001__auto___12452 + (1));
+i__9001__auto___12452 = G__12453;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.pr_str.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.pr_str.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+return cljs.core.pr_str_with_opts(objs,cljs.core.pr_opts());
+});
+
+cljs.core.pr_str.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.pr_str.cljs$lang$applyTo = (function (seq12450){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12450));
+});
+
+/**
+ * Same as pr-str followed by (newline)
+ */
+cljs.core.prn_str = (function cljs$core$prn_str(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12455 = arguments.length;
+var i__9001__auto___12456 = (0);
+while(true){
+if((i__9001__auto___12456 < len__9000__auto___12455)){
+args__9010__auto__.push((arguments[i__9001__auto___12456]));
+
+var G__12457 = (i__9001__auto___12456 + (1));
+i__9001__auto___12456 = G__12457;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.prn_str.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.prn_str.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+return cljs.core.prn_str_with_opts(objs,cljs.core.pr_opts());
+});
+
+cljs.core.prn_str.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.prn_str.cljs$lang$applyTo = (function (seq12454){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12454));
+});
+
+/**
+ * Prints the object(s) using string-print. Prints the
+ * object(s), separated by spaces if there is more than one.
+ * By default, pr and prn print in a way that objects can be
+ * read by the reader
+ */
+cljs.core.pr = (function cljs$core$pr(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12459 = arguments.length;
+var i__9001__auto___12460 = (0);
+while(true){
+if((i__9001__auto___12460 < len__9000__auto___12459)){
+args__9010__auto__.push((arguments[i__9001__auto___12460]));
+
+var G__12461 = (i__9001__auto___12460 + (1));
+i__9001__auto___12460 = G__12461;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.pr.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.pr.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+return cljs.core.pr_with_opts(objs,cljs.core.pr_opts());
+});
+
+cljs.core.pr.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.pr.cljs$lang$applyTo = (function (seq12458){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12458));
+});
+
+/**
+ * Prints the object(s) using string-print.
+ * print and println produce output for human consumption.
+ * @param {...*} var_args
+ */
+cljs.core.print = (function() {
+var cljs$core$cljs_core_print__delegate = function (objs){
+return cljs.core.pr_with_opts(objs,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(cljs.core.pr_opts(),new cljs.core.Keyword(null,"readably","readably",1129599760),false));
+};
+var cljs$core$cljs_core_print = function (var_args){
+var objs = null;
+if (arguments.length > 0) {
+var G__12462__i = 0, G__12462__a = new Array(arguments.length - 0);
+while (G__12462__i < G__12462__a.length) {G__12462__a[G__12462__i] = arguments[G__12462__i + 0]; ++G__12462__i;}
+ objs = new cljs.core.IndexedSeq(G__12462__a,0,null);
+}
+return cljs$core$cljs_core_print__delegate.call(this,objs);};
+cljs$core$cljs_core_print.cljs$lang$maxFixedArity = 0;
+cljs$core$cljs_core_print.cljs$lang$applyTo = (function (arglist__12463){
+var objs = cljs.core.seq(arglist__12463);
+return cljs$core$cljs_core_print__delegate(objs);
+});
+cljs$core$cljs_core_print.cljs$core$IFn$_invoke$arity$variadic = cljs$core$cljs_core_print__delegate;
+return cljs$core$cljs_core_print;
+})()
+;
+/**
+ * print to a string, returning it
+ */
+cljs.core.print_str = (function cljs$core$print_str(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12465 = arguments.length;
+var i__9001__auto___12466 = (0);
+while(true){
+if((i__9001__auto___12466 < len__9000__auto___12465)){
+args__9010__auto__.push((arguments[i__9001__auto___12466]));
+
+var G__12467 = (i__9001__auto___12466 + (1));
+i__9001__auto___12466 = G__12467;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.print_str.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.print_str.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+return cljs.core.pr_str_with_opts(objs,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(cljs.core.pr_opts(),new cljs.core.Keyword(null,"readably","readably",1129599760),false));
+});
+
+cljs.core.print_str.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.print_str.cljs$lang$applyTo = (function (seq12464){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12464));
+});
+
+/**
+ * Same as print followed by (newline)
+ */
+cljs.core.println = (function cljs$core$println(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12469 = arguments.length;
+var i__9001__auto___12470 = (0);
+while(true){
+if((i__9001__auto___12470 < len__9000__auto___12469)){
+args__9010__auto__.push((arguments[i__9001__auto___12470]));
+
+var G__12471 = (i__9001__auto___12470 + (1));
+i__9001__auto___12470 = G__12471;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.println.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.println.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+cljs.core.pr_with_opts(objs,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(cljs.core.pr_opts(),new cljs.core.Keyword(null,"readably","readably",1129599760),false));
+
+if(cljs.core._STAR_print_newline_STAR_){
+return cljs.core.newline.cljs$core$IFn$_invoke$arity$1(cljs.core.pr_opts());
+} else {
+return null;
+}
+});
+
+cljs.core.println.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.println.cljs$lang$applyTo = (function (seq12468){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12468));
+});
+
+/**
+ * println to a string, returning it
+ */
+cljs.core.println_str = (function cljs$core$println_str(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12473 = arguments.length;
+var i__9001__auto___12474 = (0);
+while(true){
+if((i__9001__auto___12474 < len__9000__auto___12473)){
+args__9010__auto__.push((arguments[i__9001__auto___12474]));
+
+var G__12475 = (i__9001__auto___12474 + (1));
+i__9001__auto___12474 = G__12475;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.println_str.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.println_str.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+return cljs.core.prn_str_with_opts(objs,cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(cljs.core.pr_opts(),new cljs.core.Keyword(null,"readably","readably",1129599760),false));
+});
+
+cljs.core.println_str.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.println_str.cljs$lang$applyTo = (function (seq12472){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12472));
+});
+
+/**
+ * Same as pr followed by (newline).
+ */
+cljs.core.prn = (function cljs$core$prn(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12477 = arguments.length;
+var i__9001__auto___12478 = (0);
+while(true){
+if((i__9001__auto___12478 < len__9000__auto___12477)){
+args__9010__auto__.push((arguments[i__9001__auto___12478]));
+
+var G__12479 = (i__9001__auto___12478 + (1));
+i__9001__auto___12478 = G__12479;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.prn.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.prn.cljs$core$IFn$_invoke$arity$variadic = (function (objs){
+cljs.core.pr_with_opts(objs,cljs.core.pr_opts());
+
+if(cljs.core._STAR_print_newline_STAR_){
+return cljs.core.newline.cljs$core$IFn$_invoke$arity$1(cljs.core.pr_opts());
+} else {
+return null;
+}
+});
+
+cljs.core.prn.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.prn.cljs$lang$applyTo = (function (seq12476){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12476));
+});
+
+cljs.core.strip_ns = (function cljs$core$strip_ns(named){
+if((named instanceof cljs.core.Symbol)){
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$2(null,cljs.core.name(named));
+} else {
+return cljs.core.keyword.cljs$core$IFn$_invoke$arity$2(null,cljs.core.name(named));
+}
+});
+/**
+ * Returns [lifted-ns lifted-map] or nil if m can't be lifted.
+ */
+cljs.core.lift_ns = (function cljs$core$lift_ns(m){
+if(cljs.core._STAR_print_namespace_maps_STAR_){
+var ns = null;
+var G__12486 = cljs.core.seq(m);
+var vec__12487 = G__12486;
+var seq__12488 = cljs.core.seq(vec__12487);
+var first__12489 = cljs.core.first(seq__12488);
+var seq__12488__$1 = cljs.core.next(seq__12488);
+var vec__12490 = first__12489;
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12490,(0),null);
+var v = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12490,(1),null);
+var entry = vec__12490;
+var entries = seq__12488__$1;
+var lm = cljs.core.empty(m);
+var ns__$1 = ns;
+var G__12486__$1 = G__12486;
+var lm__$1 = lm;
+while(true){
+var ns__$2 = ns__$1;
+var vec__12493 = G__12486__$1;
+var seq__12494 = cljs.core.seq(vec__12493);
+var first__12495 = cljs.core.first(seq__12494);
+var seq__12494__$1 = cljs.core.next(seq__12494);
+var vec__12496 = first__12495;
+var k__$1 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12496,(0),null);
+var v__$1 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12496,(1),null);
+var entry__$1 = vec__12496;
+var entries__$1 = seq__12494__$1;
+var lm__$2 = lm__$1;
+if(cljs.core.truth_(entry__$1)){
+if((((k__$1 instanceof cljs.core.Keyword)) || ((k__$1 instanceof cljs.core.Symbol)))){
+if(cljs.core.truth_(ns__$2)){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(ns__$2,cljs.core.namespace(k__$1))){
+var G__12499 = ns__$2;
+var G__12500 = entries__$1;
+var G__12501 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(lm__$2,cljs.core.strip_ns(k__$1),v__$1);
+ns__$1 = G__12499;
+G__12486__$1 = G__12500;
+lm__$1 = G__12501;
+continue;
+} else {
+return null;
+}
+} else {
+var temp__4657__auto__ = cljs.core.namespace(k__$1);
+if(cljs.core.truth_(temp__4657__auto__)){
+var new_ns = temp__4657__auto__;
+var G__12502 = new_ns;
+var G__12503 = entries__$1;
+var G__12504 = cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(lm__$2,cljs.core.strip_ns(k__$1),v__$1);
+ns__$1 = G__12502;
+G__12486__$1 = G__12503;
+lm__$1 = G__12504;
+continue;
+} else {
+return null;
+}
+}
+} else {
+return null;
+}
+} else {
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [ns__$2,lm__$2], null);
+}
+break;
+}
+} else {
+return null;
+}
+});
+cljs.core.print_prefix_map = (function cljs$core$print_prefix_map(prefix,m,print_one,writer,opts){
+return cljs.core.pr_sequential_writer(writer,(function (e,w,opts__$1){
+var G__12505_12511 = cljs.core.key(e);
+var G__12506_12512 = w;
+var G__12507_12513 = opts__$1;
+(print_one.cljs$core$IFn$_invoke$arity$3 ? print_one.cljs$core$IFn$_invoke$arity$3(G__12505_12511,G__12506_12512,G__12507_12513) : print_one.call(null,G__12505_12511,G__12506_12512,G__12507_12513));
+
+cljs.core._write(w," ");
+
+var G__12508 = cljs.core.val(e);
+var G__12509 = w;
+var G__12510 = opts__$1;
+return (print_one.cljs$core$IFn$_invoke$arity$3 ? print_one.cljs$core$IFn$_invoke$arity$3(G__12508,G__12509,G__12510) : print_one.call(null,G__12508,G__12509,G__12510));
+}),[cljs.core.str.cljs$core$IFn$_invoke$arity$1(prefix),"{"].join(''),", ","}",opts,cljs.core.seq(m));
+});
+cljs.core.print_map = (function cljs$core$print_map(m,print_one,writer,opts){
+var vec__12514 = ((cljs.core.map_QMARK_(m))?cljs.core.lift_ns(m):null);
+var ns = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12514,(0),null);
+var lift_map = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12514,(1),null);
+if(cljs.core.truth_(ns)){
+return cljs.core.print_prefix_map(["#:",cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns)].join(''),lift_map,print_one,writer,opts);
+} else {
+return cljs.core.print_prefix_map(null,m,print_one,writer,opts);
+}
+});
+cljs.core.Volatile.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Volatile.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (a,writer,opts){
+var a__$1 = this;
+cljs.core._write(writer,"#object [cljs.core.Volatile ");
+
+cljs.core.pr_writer(new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"val","val",128701612),a__$1.state], null),writer,opts);
+
+return cljs.core._write(writer,"]");
+});
+
+cljs.core.Var.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Var.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (a,writer,opts){
+var a__$1 = this;
+cljs.core._write(writer,"#'");
+
+return cljs.core.pr_writer(a__$1.sym,writer,opts);
+});
+
+cljs.core.IndexedSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.IndexedSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.LazySeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.LazySeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.MapEntry.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"["," ","]",opts,coll__$1);
+});
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentTreeMapSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.NodeSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.NodeSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.BlackNode.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"["," ","]",opts,coll__$1);
+});
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentArrayMapSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.ES6IteratorSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ES6IteratorSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentTreeSet.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"#{"," ","}",opts,coll__$1);
+});
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ChunkedSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.ObjMap.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ObjMap.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.print_map(coll__$1,cljs.core.pr_writer,writer,opts);
+});
+
+cljs.core.Cons.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Cons.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.Iterate.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Iterate.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.RSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.RSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentHashMap.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.print_map(coll__$1,cljs.core.pr_writer,writer,opts);
+});
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ArrayNodeSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.Subvec.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Subvec.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"["," ","]",opts,coll__$1);
+});
+
+cljs.core.Cycle.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Cycle.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentTreeMap.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.print_map(coll__$1,cljs.core.pr_writer,writer,opts);
+});
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentHashSet.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"#{"," ","}",opts,coll__$1);
+});
+
+cljs.core.ChunkedCons.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ChunkedCons.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.Atom.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Atom.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (a,writer,opts){
+var a__$1 = this;
+cljs.core._write(writer,"#object [cljs.core.Atom ");
+
+cljs.core.pr_writer(new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"val","val",128701612),a__$1.state], null),writer,opts);
+
+return cljs.core._write(writer,"]");
+});
+
+cljs.core.ValSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ValSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.RedNode.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.RedNode.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"["," ","]",opts,coll__$1);
+});
+
+cljs.core.Repeat.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Repeat.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentVector.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"["," ","]",opts,coll__$1);
+});
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentQueueSeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.EmptyList.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.EmptyList.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core._write(writer,"()");
+});
+
+cljs.core.PersistentQueue.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentQueue.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"#queue ["," ","]",opts,cljs.core.seq(coll__$1));
+});
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentArrayMap.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.print_map(coll__$1,cljs.core.pr_writer,writer,opts);
+});
+
+cljs.core.Range.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Range.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.TransformerIterator.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.TransformerIterator.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.KeySeq.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.KeySeq.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+
+cljs.core.List.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.List.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll,writer,opts){
+var coll__$1 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$1);
+});
+cljs.core.Symbol.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Symbol.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if((y instanceof cljs.core.Symbol)){
+return cljs.core.compare_symbols(x__$1,y);
+} else {
+throw (new Error(["Cannot compare ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1)," to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+
+cljs.core.Keyword.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Keyword.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if((y instanceof cljs.core.Keyword)){
+return cljs.core.compare_keywords(x__$1,y);
+} else {
+throw (new Error(["Cannot compare ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1)," to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+
+cljs.core.Subvec.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.Subvec.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if(cljs.core.vector_QMARK_(y)){
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2(x__$1,y);
+} else {
+throw (new Error(["Cannot compare ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1)," to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+
+cljs.core.PersistentVector.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.PersistentVector.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if(cljs.core.vector_QMARK_(y)){
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2(x__$1,y);
+} else {
+throw (new Error(["Cannot compare ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1)," to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+
+cljs.core.MapEntry.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.MapEntry.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if(cljs.core.vector_QMARK_(y)){
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2(x__$1,y);
+} else {
+throw (new Error(["Cannot compare ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1)," to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+
+cljs.core.BlackNode.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.BlackNode.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if(cljs.core.vector_QMARK_(y)){
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2(x__$1,y);
+} else {
+throw (new Error(["Cannot compare ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1)," to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+
+cljs.core.RedNode.prototype.cljs$core$IComparable$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.RedNode.prototype.cljs$core$IComparable$_compare$arity$2 = (function (x,y){
+var x__$1 = this;
+if(cljs.core.vector_QMARK_(y)){
+return cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2(x__$1,y);
+} else {
+throw (new Error(["Cannot compare ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1)," to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(y)].join('')));
+}
+});
+/**
+ * Atomically sets the metadata for a namespace/var/ref/agent/atom to be:
+ *
+ * (apply f its-current-meta args)
+ *
+ * f must be free of side-effects
+ */
+cljs.core.alter_meta_BANG_ = (function cljs$core$alter_meta_BANG_(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12520 = arguments.length;
+var i__9001__auto___12521 = (0);
+while(true){
+if((i__9001__auto___12521 < len__9000__auto___12520)){
+args__9010__auto__.push((arguments[i__9001__auto___12521]));
+
+var G__12522 = (i__9001__auto___12521 + (1));
+i__9001__auto___12521 = G__12522;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((2) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((2)),(0),null)):null);
+return cljs.core.alter_meta_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__9011__auto__);
+});
+
+cljs.core.alter_meta_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (iref,f,args){
+return iref.meta = cljs.core.apply.cljs$core$IFn$_invoke$arity$3(f,iref.meta,args);
+});
+
+cljs.core.alter_meta_BANG_.cljs$lang$maxFixedArity = (2);
+
+/** @this {Function} */
+cljs.core.alter_meta_BANG_.cljs$lang$applyTo = (function (seq12517){
+var G__12518 = cljs.core.first(seq12517);
+var seq12517__$1 = cljs.core.next(seq12517);
+var G__12519 = cljs.core.first(seq12517__$1);
+var seq12517__$2 = cljs.core.next(seq12517__$1);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12518,G__12519,seq12517__$2);
+});
+
+/**
+ * Atomically resets the metadata for an atom
+ */
+cljs.core.reset_meta_BANG_ = (function cljs$core$reset_meta_BANG_(iref,m){
+return iref.meta = m;
+});
+/**
+ * Adds a watch function to an atom reference. The watch fn must be a
+ * fn of 4 args: a key, the reference, its old-state, its
+ * new-state. Whenever the reference's state might have been changed,
+ * any registered watches will have their functions called. The watch
+ * fn will be called synchronously. Note that an atom's state
+ * may have changed again prior to the fn call, so use old/new-state
+ * rather than derefing the reference. Keys must be unique per
+ * reference, and can be used to remove the watch with remove-watch,
+ * but are otherwise considered opaque by the watch mechanism. Bear in
+ * mind that regardless of the result or action of the watch fns the
+ * atom's value will change. Example:
+ *
+ * (def a (atom 0))
+ * (add-watch a :inc (fn [k r o n] (assert (== 0 n))))
+ * (swap! a inc)
+ * ;; Assertion Error
+ * (deref a)
+ * ;=> 1
+ */
+cljs.core.add_watch = (function cljs$core$add_watch(iref,key,f){
+cljs.core._add_watch(iref,key,f);
+
+return iref;
+});
+/**
+ * Removes a watch (set by add-watch) from a reference
+ */
+cljs.core.remove_watch = (function cljs$core$remove_watch(iref,key){
+cljs.core._remove_watch(iref,key);
+
+return iref;
+});
+/**
+ * @type {*}
+ */
+cljs.core.gensym_counter = null;
+/**
+ * Returns a new symbol with a unique name. If a prefix string is
+ * supplied, the name is prefix# where # is some unique number. If
+ * prefix is not supplied, the prefix is 'G__'.
+ */
+cljs.core.gensym = (function cljs$core$gensym(var_args){
+var G__12524 = arguments.length;
+switch (G__12524) {
+case 0:
+return cljs.core.gensym.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.gensym.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.gensym.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.gensym.cljs$core$IFn$_invoke$arity$1("G__");
+});
+
+cljs.core.gensym.cljs$core$IFn$_invoke$arity$1 = (function (prefix_string){
+if((cljs.core.gensym_counter == null)){
+cljs.core.gensym_counter = cljs.core.atom.cljs$core$IFn$_invoke$arity$1((0));
+} else {
+}
+
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$1([cljs.core.str.cljs$core$IFn$_invoke$arity$1(prefix_string),cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(cljs.core.gensym_counter,cljs.core.inc))].join(''));
+});
+
+cljs.core.gensym.cljs$lang$maxFixedArity = 1;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IPending}
+ * @implements {cljs.core.IDeref}
+ * @implements {cljs.core.IPrintWithWriter}
+*/
+cljs.core.Delay = (function (f,value){
+this.f = f;
+this.value = value;
+this.cljs$lang$protocol_mask$partition0$ = 2147516416;
+this.cljs$lang$protocol_mask$partition1$ = 1;
+});
+cljs.core.Delay.prototype.cljs$core$IDeref$_deref$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+if(cljs.core.truth_(self__.f)){
+self__.value = (self__.f.cljs$core$IFn$_invoke$arity$0 ? self__.f.cljs$core$IFn$_invoke$arity$0() : self__.f.call(null));
+
+self__.f = null;
+} else {
+}
+
+return self__.value;
+});
+
+cljs.core.Delay.prototype.cljs$core$IPending$_realized_QMARK_$arity$1 = (function (x){
+var self__ = this;
+var x__$1 = this;
+return cljs.core.not(self__.f);
+});
+
+cljs.core.Delay.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (x,writer,opts){
+var self__ = this;
+var x__$1 = this;
+cljs.core._write(writer,"#object[cljs.core.Delay ");
+
+cljs.core.pr_writer(new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"status","status",-1997798413),(((self__.f == null))?new cljs.core.Keyword(null,"ready","ready",1086465795):new cljs.core.Keyword(null,"pending","pending",-220036727)),new cljs.core.Keyword(null,"val","val",128701612),self__.value], null),writer,opts);
+
+return cljs.core._write(writer,"]");
+});
+
+cljs.core.Delay.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.with_meta(new cljs.core.Symbol(null,"f","f",43394975,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null)),cljs.core.with_meta(new cljs.core.Symbol(null,"value","value",1946509744,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.Delay.cljs$lang$type = true;
+
+cljs.core.Delay.cljs$lang$ctorStr = "cljs.core/Delay";
+
+cljs.core.Delay.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Delay");
+});
+
+/**
+ * Positional factory function for cljs.core/Delay.
+ */
+cljs.core.__GT_Delay = (function cljs$core$__GT_Delay(f,value){
+return (new cljs.core.Delay(f,value));
+});
+
+/**
+ * returns true if x is a Delay created with delay
+ */
+cljs.core.delay_QMARK_ = (function cljs$core$delay_QMARK_(x){
+return (x instanceof cljs.core.Delay);
+});
+/**
+ * If x is a Delay, returns the (possibly cached) value of its expression, else returns x
+ */
+cljs.core.force = (function cljs$core$force(x){
+if(cljs.core.delay_QMARK_(x)){
+return cljs.core.deref(x);
+} else {
+return x;
+}
+});
+/**
+ * Returns true if a value has been produced for a delay or lazy sequence.
+ */
+cljs.core.realized_QMARK_ = (function cljs$core$realized_QMARK_(x){
+return cljs.core._realized_QMARK_(x);
+});
+cljs.core.preserving_reduced = (function cljs$core$preserving_reduced(rf){
+return (function (p1__12526_SHARP_,p2__12527_SHARP_){
+var ret = (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(p1__12526_SHARP_,p2__12527_SHARP_) : rf.call(null,p1__12526_SHARP_,p2__12527_SHARP_));
+if(cljs.core.reduced_QMARK_(ret)){
+return cljs.core.reduced(ret);
+} else {
+return ret;
+}
+});
+});
+/**
+ * A transducer which concatenates the contents of each input, which must be a
+ * collection, into the reduction.
+ */
+cljs.core.cat = (function cljs$core$cat(rf){
+var rf1 = cljs.core.preserving_reduced(rf);
+return ((function (rf1){
+return (function() {
+var G__12528 = null;
+var G__12528__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__12528__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__12528__2 = (function (result,input){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(rf1,result,input);
+});
+G__12528 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__12528__0.call(this);
+case 1:
+return G__12528__1.call(this,result);
+case 2:
+return G__12528__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12528.cljs$core$IFn$_invoke$arity$0 = G__12528__0;
+G__12528.cljs$core$IFn$_invoke$arity$1 = G__12528__1;
+G__12528.cljs$core$IFn$_invoke$arity$2 = G__12528__2;
+return G__12528;
+})()
+;})(rf1))
+});
+/**
+ * Returns a transducer that ends transduction when pred returns true
+ * for an input. When retf is supplied it must be a fn of 2 arguments -
+ * it will be passed the (completed) result so far and the input that
+ * triggered the predicate, and its return value (if it does not throw
+ * an exception) will be the return value of the transducer. If retf
+ * is not supplied, the input that triggered the predicate will be
+ * returned. If the predicate never returns true the transduction is
+ * unaffected.
+ */
+cljs.core.halt_when = (function cljs$core$halt_when(var_args){
+var G__12530 = arguments.length;
+switch (G__12530) {
+case 1:
+return cljs.core.halt_when.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.halt_when.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.halt_when.cljs$core$IFn$_invoke$arity$1 = (function (pred){
+return cljs.core.halt_when.cljs$core$IFn$_invoke$arity$2(pred,null);
+});
+
+cljs.core.halt_when.cljs$core$IFn$_invoke$arity$2 = (function (pred,retf){
+return (function (rf){
+return (function() {
+var G__12534 = null;
+var G__12534__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__12534__1 = (function (result){
+if(((cljs.core.map_QMARK_(result)) && (cljs.core.contains_QMARK_(result,new cljs.core.Keyword("cljs.core","halt","cljs.core/halt",-1049036715))))){
+return new cljs.core.Keyword("cljs.core","halt","cljs.core/halt",-1049036715).cljs$core$IFn$_invoke$arity$1(result);
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+}
+});
+var G__12534__2 = (function (result,input){
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$1 ? pred.cljs$core$IFn$_invoke$arity$1(input) : pred.call(null,input)))){
+return cljs.core.reduced(new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword("cljs.core","halt","cljs.core/halt",-1049036715),(cljs.core.truth_(retf)?(function (){var G__12531 = (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+var G__12532 = input;
+return (retf.cljs$core$IFn$_invoke$arity$2 ? retf.cljs$core$IFn$_invoke$arity$2(G__12531,G__12532) : retf.call(null,G__12531,G__12532));
+})():input)], null));
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__12534 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__12534__0.call(this);
+case 1:
+return G__12534__1.call(this,result);
+case 2:
+return G__12534__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12534.cljs$core$IFn$_invoke$arity$0 = G__12534__0;
+G__12534.cljs$core$IFn$_invoke$arity$1 = G__12534__1;
+G__12534.cljs$core$IFn$_invoke$arity$2 = G__12534__2;
+return G__12534;
+})()
+});
+});
+
+cljs.core.halt_when.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a lazy sequence removing consecutive duplicates in coll.
+ * Returns a transducer when no collection is provided.
+ */
+cljs.core.dedupe = (function cljs$core$dedupe(var_args){
+var G__12536 = arguments.length;
+switch (G__12536) {
+case 0:
+return cljs.core.dedupe.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.dedupe.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.dedupe.cljs$core$IFn$_invoke$arity$0 = (function (){
+return (function (rf){
+var pa = cljs.core.volatile_BANG_(new cljs.core.Keyword("cljs.core","none","cljs.core/none",926646439));
+return ((function (pa){
+return (function() {
+var G__12538 = null;
+var G__12538__0 = (function (){
+return (rf.cljs$core$IFn$_invoke$arity$0 ? rf.cljs$core$IFn$_invoke$arity$0() : rf.call(null));
+});
+var G__12538__1 = (function (result){
+return (rf.cljs$core$IFn$_invoke$arity$1 ? rf.cljs$core$IFn$_invoke$arity$1(result) : rf.call(null,result));
+});
+var G__12538__2 = (function (result,input){
+var prior = cljs.core.deref(pa);
+cljs.core.vreset_BANG_(pa,input);
+
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(prior,input)){
+return result;
+} else {
+return (rf.cljs$core$IFn$_invoke$arity$2 ? rf.cljs$core$IFn$_invoke$arity$2(result,input) : rf.call(null,result,input));
+}
+});
+G__12538 = function(result,input){
+switch(arguments.length){
+case 0:
+return G__12538__0.call(this);
+case 1:
+return G__12538__1.call(this,result);
+case 2:
+return G__12538__2.call(this,result,input);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12538.cljs$core$IFn$_invoke$arity$0 = G__12538__0;
+G__12538.cljs$core$IFn$_invoke$arity$1 = G__12538__1;
+G__12538.cljs$core$IFn$_invoke$arity$2 = G__12538__2;
+return G__12538;
+})()
+;})(pa))
+});
+});
+
+cljs.core.dedupe.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+return cljs.core.sequence.cljs$core$IFn$_invoke$arity$2(cljs.core.dedupe.cljs$core$IFn$_invoke$arity$0(),coll);
+});
+
+cljs.core.dedupe.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Returns items from coll with random probability of prob (0.0 -
+ * 1.0). Returns a transducer when no collection is provided.
+ */
+cljs.core.random_sample = (function cljs$core$random_sample(var_args){
+var G__12540 = arguments.length;
+switch (G__12540) {
+case 1:
+return cljs.core.random_sample.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.random_sample.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.random_sample.cljs$core$IFn$_invoke$arity$1 = (function (prob){
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$1((function (_){
+return (cljs.core.rand.cljs$core$IFn$_invoke$arity$0() < prob);
+}));
+});
+
+cljs.core.random_sample.cljs$core$IFn$_invoke$arity$2 = (function (prob,coll){
+return cljs.core.filter.cljs$core$IFn$_invoke$arity$2((function (_){
+return (cljs.core.rand.cljs$core$IFn$_invoke$arity$0() < prob);
+}),coll);
+});
+
+cljs.core.random_sample.cljs$lang$maxFixedArity = 2;
+
+
+/**
+* @constructor
+ * @implements {cljs.core.ISeqable}
+ * @implements {cljs.core.IPrintWithWriter}
+ * @implements {cljs.core.IIterable}
+ * @implements {cljs.core.ISequential}
+ * @implements {cljs.core.IReduce}
+*/
+cljs.core.Eduction = (function (xform,coll){
+this.xform = xform;
+this.coll = coll;
+this.cljs$lang$protocol_mask$partition0$ = 2173173760;
+this.cljs$lang$protocol_mask$partition1$ = 131072;
+});
+cljs.core.Eduction.prototype.indexOf = (function() {
+var G__12542 = null;
+var G__12542__1 = (function (x){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll__$1,x,(0));
+});
+var G__12542__2 = (function (x,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3(coll__$1,x,start);
+});
+G__12542 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__12542__1.call(this,x);
+case 2:
+return G__12542__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12542.cljs$core$IFn$_invoke$arity$1 = G__12542__1;
+G__12542.cljs$core$IFn$_invoke$arity$2 = G__12542__2;
+return G__12542;
+})()
+;
+
+cljs.core.Eduction.prototype.lastIndexOf = (function() {
+var G__12543 = null;
+var G__12543__1 = (function (x){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll__$1,x,cljs.core.count(coll__$1));
+});
+var G__12543__2 = (function (x,start){
+var self__ = this;
+var coll__$1 = this;
+return cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3(coll__$1,x,start);
+});
+G__12543 = function(x,start){
+switch(arguments.length){
+case 1:
+return G__12543__1.call(this,x);
+case 2:
+return G__12543__2.call(this,x,start);
+}
+throw(new Error('Invalid arity: ' + arguments.length));
+};
+G__12543.cljs$core$IFn$_invoke$arity$1 = G__12543__1;
+G__12543.cljs$core$IFn$_invoke$arity$2 = G__12543__2;
+return G__12543;
+})()
+;
+
+cljs.core.Eduction.prototype.cljs$core$IIterable$_iterator$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.TransformerIterator.create(self__.xform,cljs.core.iter(self__.coll));
+});
+
+cljs.core.Eduction.prototype.cljs$core$ISeqable$_seq$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.seq(cljs.core.sequence.cljs$core$IFn$_invoke$arity$2(self__.xform,self__.coll));
+});
+
+cljs.core.Eduction.prototype.cljs$core$IReduce$_reduce$arity$2 = (function (_,f){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$3(self__.xform,cljs.core.completing.cljs$core$IFn$_invoke$arity$1(f),self__.coll);
+});
+
+cljs.core.Eduction.prototype.cljs$core$IReduce$_reduce$arity$3 = (function (_,f,init){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.transduce.cljs$core$IFn$_invoke$arity$4(self__.xform,cljs.core.completing.cljs$core$IFn$_invoke$arity$1(f),init,self__.coll);
+});
+
+cljs.core.Eduction.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (coll__$1,writer,opts){
+var self__ = this;
+var coll__$2 = this;
+return cljs.core.pr_sequential_writer(writer,cljs.core.pr_writer,"("," ",")",opts,coll__$2);
+});
+
+cljs.core.Eduction.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"xform","xform",-85179481,null),new cljs.core.Symbol(null,"coll","coll",-1006698606,null)], null);
+});
+
+cljs.core.Eduction.cljs$lang$type = true;
+
+cljs.core.Eduction.cljs$lang$ctorStr = "cljs.core/Eduction";
+
+cljs.core.Eduction.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Eduction");
+});
+
+/**
+ * Positional factory function for cljs.core/Eduction.
+ */
+cljs.core.__GT_Eduction = (function cljs$core$__GT_Eduction(xform,coll){
+return (new cljs.core.Eduction(xform,coll));
+});
+
+var G__12544_12547 = cljs.core.Eduction.prototype;
+var G__12545_12548 = cljs.core.ITER_SYMBOL;
+var G__12546_12549 = ((function (G__12544_12547,G__12545_12548){
+return (function (){
+var this__8871__auto__ = this;
+return cljs.core.es6_iterator(this__8871__auto__);
+});})(G__12544_12547,G__12545_12548))
+;
+goog.object.set(G__12544_12547,G__12545_12548,G__12546_12549);
+/**
+ * Returns a reducible/iterable application of the transducers
+ * to the items in coll. Transducers are applied in order as if
+ * combined with comp. Note that these applications will be
+ * performed every time reduce/iterator is called.
+ */
+cljs.core.eduction = (function cljs$core$eduction(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12551 = arguments.length;
+var i__9001__auto___12552 = (0);
+while(true){
+if((i__9001__auto___12552 < len__9000__auto___12551)){
+args__9010__auto__.push((arguments[i__9001__auto___12552]));
+
+var G__12553 = (i__9001__auto___12552 + (1));
+i__9001__auto___12552 = G__12553;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((0) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((0)),(0),null)):null);
+return cljs.core.eduction.cljs$core$IFn$_invoke$arity$variadic(argseq__9011__auto__);
+});
+
+cljs.core.eduction.cljs$core$IFn$_invoke$arity$variadic = (function (xforms){
+return (new cljs.core.Eduction(cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.comp,cljs.core.butlast(xforms)),cljs.core.last(xforms)));
+});
+
+cljs.core.eduction.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+cljs.core.eduction.cljs$lang$applyTo = (function (seq12550){
+var self__8988__auto__ = this;
+return self__8988__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq(seq12550));
+});
+
+/**
+ * Runs the supplied procedure (via reduce), for purposes of side
+ * effects, on successive items in the collection. Returns nil
+ */
+cljs.core.run_BANG_ = (function cljs$core$run_BANG_(proc,coll){
+cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (p1__12555_SHARP_,p2__12554_SHARP_){
+return (proc.cljs$core$IFn$_invoke$arity$1 ? proc.cljs$core$IFn$_invoke$arity$1(p2__12554_SHARP_) : proc.call(null,p2__12554_SHARP_));
+}),null,coll);
+
+return null;
+});
+
+/**
+ * @interface
+ */
+cljs.core.IEncodeJS = function(){};
+
+/**
+ * Recursively transforms clj values to JavaScript
+ */
+cljs.core._clj__GT_js = (function cljs$core$_clj__GT_js(x){
+if((((!((x == null)))) && ((!((x.cljs$core$IEncodeJS$_clj__GT_js$arity$1 == null)))))){
+return x.cljs$core$IEncodeJS$_clj__GT_js$arity$1(x);
+} else {
+var x__8502__auto__ = (((x == null))?null:x);
+var m__8503__auto__ = (cljs.core._clj__GT_js[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(x) : m__8503__auto__.call(null,x));
+} else {
+var m__8503__auto____$1 = (cljs.core._clj__GT_js["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(x) : m__8503__auto____$1.call(null,x));
+} else {
+throw cljs.core.missing_protocol("IEncodeJS.-clj->js",x);
+}
+}
+}
+});
+
+/**
+ * Transforms map keys to valid JavaScript keys. Arbitrary keys are
+ * encoded to their string representation via (pr-str x)
+ */
+cljs.core._key__GT_js = (function cljs$core$_key__GT_js(x){
+if((((!((x == null)))) && ((!((x.cljs$core$IEncodeJS$_key__GT_js$arity$1 == null)))))){
+return x.cljs$core$IEncodeJS$_key__GT_js$arity$1(x);
+} else {
+var x__8502__auto__ = (((x == null))?null:x);
+var m__8503__auto__ = (cljs.core._key__GT_js[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(x) : m__8503__auto__.call(null,x));
+} else {
+var m__8503__auto____$1 = (cljs.core._key__GT_js["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(x) : m__8503__auto____$1.call(null,x));
+} else {
+throw cljs.core.missing_protocol("IEncodeJS.-key->js",x);
+}
+}
+}
+});
+
+cljs.core.key__GT_js = (function cljs$core$key__GT_js(var_args){
+var G__12557 = arguments.length;
+switch (G__12557) {
+case 1:
+return cljs.core.key__GT_js.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.key__GT_js.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.key__GT_js.cljs$core$IFn$_invoke$arity$1 = (function (k){
+return cljs.core.key__GT_js.cljs$core$IFn$_invoke$arity$2(k,cljs.core.clj__GT_js);
+});
+
+cljs.core.key__GT_js.cljs$core$IFn$_invoke$arity$2 = (function (k,primitive_fn){
+if((((!((k == null))))?((((false) || ((cljs.core.PROTOCOL_SENTINEL === k.cljs$core$IEncodeJS$))))?true:(((!k.cljs$lang$protocol_mask$partition$))?cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeJS,k):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeJS,k))){
+return cljs.core._clj__GT_js(k);
+} else {
+if(((typeof k === 'string') || (typeof k === 'number') || ((k instanceof cljs.core.Keyword)) || ((k instanceof cljs.core.Symbol)))){
+return (primitive_fn.cljs$core$IFn$_invoke$arity$1 ? primitive_fn.cljs$core$IFn$_invoke$arity$1(k) : primitive_fn.call(null,k));
+} else {
+return cljs.core.pr_str.cljs$core$IFn$_invoke$arity$variadic(cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([k], 0));
+
+}
+}
+});
+
+cljs.core.key__GT_js.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Recursively transforms ClojureScript values to JavaScript.
+ * sets/vectors/lists become Arrays, Keywords and Symbol become Strings,
+ * Maps become Objects. Arbitrary keys are encoded to by `key->js`.
+ * Options is a key-value pair, where the only valid key is
+ * :keyword-fn, which should point to a single-argument function to be
+ * called on keyword keys. Default to `name`.
+ */
+cljs.core.clj__GT_js = (function cljs$core$clj__GT_js(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12611 = arguments.length;
+var i__9001__auto___12612 = (0);
+while(true){
+if((i__9001__auto___12612 < len__9000__auto___12611)){
+args__9010__auto__.push((arguments[i__9001__auto___12612]));
+
+var G__12613 = (i__9001__auto___12612 + (1));
+i__9001__auto___12612 = G__12613;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((1) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((1)),(0),null)):null);
+return cljs.core.clj__GT_js.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9011__auto__);
+});
+
+cljs.core.clj__GT_js.cljs$core$IFn$_invoke$arity$variadic = (function (x,p__12562){
+var map__12563 = p__12562;
+var map__12563__$1 = (((((!((map__12563 == null))))?(((((map__12563.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__12563.cljs$core$ISeq$))))?true:false):false))?cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.hash_map,map__12563):map__12563);
+var options = map__12563__$1;
+var keyword_fn = cljs.core.get.cljs$core$IFn$_invoke$arity$3(map__12563__$1,new cljs.core.Keyword(null,"keyword-fn","keyword-fn",-64566675),cljs.core.name);
+var keyfn = ((function (map__12563,map__12563__$1,options,keyword_fn){
+return (function cljs$core$keyfn(k){
+return cljs.core.key__GT_js.cljs$core$IFn$_invoke$arity$2(k,thisfn);
+});})(map__12563,map__12563__$1,options,keyword_fn))
+;
+var thisfn = ((function (map__12563,map__12563__$1,options,keyword_fn){
+return (function cljs$core$thisfn(x__$1){
+if((x__$1 == null)){
+return null;
+} else {
+if((((!((x__$1 == null))))?((((false) || ((cljs.core.PROTOCOL_SENTINEL === x__$1.cljs$core$IEncodeJS$))))?true:(((!x__$1.cljs$lang$protocol_mask$partition$))?cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeJS,x__$1):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeJS,x__$1))){
+return cljs.core._clj__GT_js(x__$1);
+} else {
+if((x__$1 instanceof cljs.core.Keyword)){
+return (keyword_fn.cljs$core$IFn$_invoke$arity$1 ? keyword_fn.cljs$core$IFn$_invoke$arity$1(x__$1) : keyword_fn.call(null,x__$1));
+} else {
+if((x__$1 instanceof cljs.core.Symbol)){
+return cljs.core.str.cljs$core$IFn$_invoke$arity$1(x__$1);
+} else {
+if(cljs.core.map_QMARK_(x__$1)){
+var m = {};
+var seq__12591_12614 = cljs.core.seq(x__$1);
+var chunk__12592_12615 = null;
+var count__12593_12616 = (0);
+var i__12594_12617 = (0);
+while(true){
+if((i__12594_12617 < count__12593_12616)){
+var vec__12595_12618 = chunk__12592_12615.cljs$core$IIndexed$_nth$arity$2(null,i__12594_12617);
+var k_12619 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12595_12618,(0),null);
+var v_12620 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12595_12618,(1),null);
+var G__12598_12621 = m;
+var G__12599_12622 = keyfn(k_12619);
+var G__12600_12623 = cljs$core$thisfn(v_12620);
+goog.object.set(G__12598_12621,G__12599_12622,G__12600_12623);
+
+
+var G__12624 = seq__12591_12614;
+var G__12625 = chunk__12592_12615;
+var G__12626 = count__12593_12616;
+var G__12627 = (i__12594_12617 + (1));
+seq__12591_12614 = G__12624;
+chunk__12592_12615 = G__12625;
+count__12593_12616 = G__12626;
+i__12594_12617 = G__12627;
+continue;
+} else {
+var temp__4657__auto___12628 = cljs.core.seq(seq__12591_12614);
+if(temp__4657__auto___12628){
+var seq__12591_12629__$1 = temp__4657__auto___12628;
+if(cljs.core.chunked_seq_QMARK_(seq__12591_12629__$1)){
+var c__8664__auto___12630 = cljs.core.chunk_first(seq__12591_12629__$1);
+var G__12631 = cljs.core.chunk_rest(seq__12591_12629__$1);
+var G__12632 = c__8664__auto___12630;
+var G__12633 = cljs.core.count(c__8664__auto___12630);
+var G__12634 = (0);
+seq__12591_12614 = G__12631;
+chunk__12592_12615 = G__12632;
+count__12593_12616 = G__12633;
+i__12594_12617 = G__12634;
+continue;
+} else {
+var vec__12601_12635 = cljs.core.first(seq__12591_12629__$1);
+var k_12636 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12601_12635,(0),null);
+var v_12637 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12601_12635,(1),null);
+var G__12604_12638 = m;
+var G__12605_12639 = keyfn(k_12636);
+var G__12606_12640 = cljs$core$thisfn(v_12637);
+goog.object.set(G__12604_12638,G__12605_12639,G__12606_12640);
+
+
+var G__12641 = cljs.core.next(seq__12591_12629__$1);
+var G__12642 = null;
+var G__12643 = (0);
+var G__12644 = (0);
+seq__12591_12614 = G__12641;
+chunk__12592_12615 = G__12642;
+count__12593_12616 = G__12643;
+i__12594_12617 = G__12644;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+return m;
+} else {
+if(cljs.core.coll_QMARK_(x__$1)){
+var arr = [];
+var seq__12607_12645 = cljs.core.seq(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs$core$thisfn,x__$1));
+var chunk__12608_12646 = null;
+var count__12609_12647 = (0);
+var i__12610_12648 = (0);
+while(true){
+if((i__12610_12648 < count__12609_12647)){
+var x_12649__$2 = chunk__12608_12646.cljs$core$IIndexed$_nth$arity$2(null,i__12610_12648);
+arr.push(x_12649__$2);
+
+
+var G__12650 = seq__12607_12645;
+var G__12651 = chunk__12608_12646;
+var G__12652 = count__12609_12647;
+var G__12653 = (i__12610_12648 + (1));
+seq__12607_12645 = G__12650;
+chunk__12608_12646 = G__12651;
+count__12609_12647 = G__12652;
+i__12610_12648 = G__12653;
+continue;
+} else {
+var temp__4657__auto___12654 = cljs.core.seq(seq__12607_12645);
+if(temp__4657__auto___12654){
+var seq__12607_12655__$1 = temp__4657__auto___12654;
+if(cljs.core.chunked_seq_QMARK_(seq__12607_12655__$1)){
+var c__8664__auto___12656 = cljs.core.chunk_first(seq__12607_12655__$1);
+var G__12657 = cljs.core.chunk_rest(seq__12607_12655__$1);
+var G__12658 = c__8664__auto___12656;
+var G__12659 = cljs.core.count(c__8664__auto___12656);
+var G__12660 = (0);
+seq__12607_12645 = G__12657;
+chunk__12608_12646 = G__12658;
+count__12609_12647 = G__12659;
+i__12610_12648 = G__12660;
+continue;
+} else {
+var x_12661__$2 = cljs.core.first(seq__12607_12655__$1);
+arr.push(x_12661__$2);
+
+
+var G__12662 = cljs.core.next(seq__12607_12655__$1);
+var G__12663 = null;
+var G__12664 = (0);
+var G__12665 = (0);
+seq__12607_12645 = G__12662;
+chunk__12608_12646 = G__12663;
+count__12609_12647 = G__12664;
+i__12610_12648 = G__12665;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+return arr;
+} else {
+return x__$1;
+
+}
+}
+}
+}
+}
+}
+});})(map__12563,map__12563__$1,options,keyword_fn))
+;
+return thisfn(x);
+});
+
+cljs.core.clj__GT_js.cljs$lang$maxFixedArity = (1);
+
+/** @this {Function} */
+cljs.core.clj__GT_js.cljs$lang$applyTo = (function (seq12560){
+var G__12561 = cljs.core.first(seq12560);
+var seq12560__$1 = cljs.core.next(seq12560);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12561,seq12560__$1);
+});
+
+
+/**
+ * @interface
+ */
+cljs.core.IEncodeClojure = function(){};
+
+/**
+ * Transforms JavaScript values to Clojure
+ */
+cljs.core._js__GT_clj = (function cljs$core$_js__GT_clj(x,options){
+if((((!((x == null)))) && ((!((x.cljs$core$IEncodeClojure$_js__GT_clj$arity$2 == null)))))){
+return x.cljs$core$IEncodeClojure$_js__GT_clj$arity$2(x,options);
+} else {
+var x__8502__auto__ = (((x == null))?null:x);
+var m__8503__auto__ = (cljs.core._js__GT_clj[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(x,options) : m__8503__auto__.call(null,x,options));
+} else {
+var m__8503__auto____$1 = (cljs.core._js__GT_clj["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(x,options) : m__8503__auto____$1.call(null,x,options));
+} else {
+throw cljs.core.missing_protocol("IEncodeClojure.-js->clj",x);
+}
+}
+}
+});
+
+/**
+ * Recursively transforms JavaScript arrays into ClojureScript
+ * vectors, and JavaScript objects into ClojureScript maps. With
+ * option ':keywordize-keys true' will convert object fields from
+ * strings to keywords.
+ */
+cljs.core.js__GT_clj = (function cljs$core$js__GT_clj(var_args){
+var G__12671 = arguments.length;
+switch (G__12671) {
+case 1:
+return cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___12676 = arguments.length;
+var i__9001__auto___12677 = (0);
+while(true){
+if((i__9001__auto___12677 < len__9000__auto___12676)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___12677]));
+
+var G__12678 = (i__9001__auto___12677 + (1));
+i__9001__auto___12677 = G__12678;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((1)),(0),null));
+return cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic(x,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([new cljs.core.Keyword(null,"keywordize-keys","keywordize-keys",1310784252),false], 0));
+});
+
+cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic = (function (x,opts){
+var map__12672 = opts;
+var map__12672__$1 = (((((!((map__12672 == null))))?(((((map__12672.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__12672.cljs$core$ISeq$))))?true:false):false))?cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.hash_map,map__12672):map__12672);
+var keywordize_keys = cljs.core.get.cljs$core$IFn$_invoke$arity$2(map__12672__$1,new cljs.core.Keyword(null,"keywordize-keys","keywordize-keys",1310784252));
+var keyfn = (cljs.core.truth_(keywordize_keys)?cljs.core.keyword:cljs.core.str);
+var f = ((function (map__12672,map__12672__$1,keywordize_keys,keyfn){
+return (function cljs$core$thisfn(x__$1){
+if((((!((x__$1 == null))))?((((false) || ((cljs.core.PROTOCOL_SENTINEL === x__$1.cljs$core$IEncodeClojure$))))?true:(((!x__$1.cljs$lang$protocol_mask$partition$))?cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeClojure,x__$1):false)):cljs.core.native_satisfies_QMARK_(cljs.core.IEncodeClojure,x__$1))){
+return cljs.core._js__GT_clj(x__$1,cljs.core.apply.cljs$core$IFn$_invoke$arity$2(cljs.core.array_map,opts));
+} else {
+if(cljs.core.seq_QMARK_(x__$1)){
+return cljs.core.doall.cljs$core$IFn$_invoke$arity$1(cljs.core.map.cljs$core$IFn$_invoke$arity$2(cljs$core$thisfn,x__$1));
+} else {
+if(cljs.core.map_entry_QMARK_(x__$1)){
+return (new cljs.core.MapEntry(cljs$core$thisfn(cljs.core.key(x__$1)),cljs$core$thisfn(cljs.core.val(x__$1)),null));
+} else {
+if(cljs.core.coll_QMARK_(x__$1)){
+return cljs.core.into.cljs$core$IFn$_invoke$arity$3(cljs.core.empty(x__$1),cljs.core.map.cljs$core$IFn$_invoke$arity$1(cljs$core$thisfn),x__$1);
+} else {
+if(cljs.core.array_QMARK_(x__$1)){
+return cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (map__12672,map__12672__$1,keywordize_keys,keyfn){
+return (function (p1__12666_SHARP_,p2__12667_SHARP_){
+return cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2(p1__12666_SHARP_,cljs$core$thisfn(p2__12667_SHARP_));
+});})(map__12672,map__12672__$1,keywordize_keys,keyfn))
+,cljs.core.transient$(cljs.core.PersistentVector.EMPTY),x__$1));
+} else {
+if((cljs.core.type(x__$1) === Object)){
+return cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (map__12672,map__12672__$1,keywordize_keys,keyfn){
+return (function (r,k){
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(r,(keyfn.cljs$core$IFn$_invoke$arity$1 ? keyfn.cljs$core$IFn$_invoke$arity$1(k) : keyfn.call(null,k)),cljs$core$thisfn(goog.object.get(x__$1,k)));
+});})(map__12672,map__12672__$1,keywordize_keys,keyfn))
+,cljs.core.transient$(cljs.core.PersistentArrayMap.EMPTY),cljs.core.js_keys(x__$1)));
+} else {
+return x__$1;
+
+}
+}
+}
+}
+}
+}
+});})(map__12672,map__12672__$1,keywordize_keys,keyfn))
+;
+return f(x);
+});
+
+/** @this {Function} */
+cljs.core.js__GT_clj.cljs$lang$applyTo = (function (seq12669){
+var G__12670 = cljs.core.first(seq12669);
+var seq12669__$1 = cljs.core.next(seq12669);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12670,seq12669__$1);
+});
+
+cljs.core.js__GT_clj.cljs$lang$maxFixedArity = (1);
+
+/**
+ * Returns a memoized version of a referentially transparent function. The
+ * memoized version of the function keeps a cache of the mapping from arguments
+ * to results and, when calls with the same arguments are repeated often, has
+ * higher performance at the expense of higher memory use.
+ */
+cljs.core.memoize = (function cljs$core$memoize(f){
+var mem = cljs.core.atom.cljs$core$IFn$_invoke$arity$1(cljs.core.PersistentArrayMap.EMPTY);
+return ((function (mem){
+return (function() {
+var G__12679__delegate = function (args){
+var v = cljs.core.get.cljs$core$IFn$_invoke$arity$3(cljs.core.deref(mem),args,cljs.core.lookup_sentinel);
+if((v === cljs.core.lookup_sentinel)){
+var ret = cljs.core.apply.cljs$core$IFn$_invoke$arity$2(f,args);
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(mem,cljs.core.assoc,args,ret);
+
+return ret;
+} else {
+return v;
+}
+};
+var G__12679 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__12680__i = 0, G__12680__a = new Array(arguments.length - 0);
+while (G__12680__i < G__12680__a.length) {G__12680__a[G__12680__i] = arguments[G__12680__i + 0]; ++G__12680__i;}
+ args = new cljs.core.IndexedSeq(G__12680__a,0,null);
+}
+return G__12679__delegate.call(this,args);};
+G__12679.cljs$lang$maxFixedArity = 0;
+G__12679.cljs$lang$applyTo = (function (arglist__12681){
+var args = cljs.core.seq(arglist__12681);
+return G__12679__delegate(args);
+});
+G__12679.cljs$core$IFn$_invoke$arity$variadic = G__12679__delegate;
+return G__12679;
+})()
+;
+;})(mem))
+});
+/**
+ * trampoline can be used to convert algorithms requiring mutual
+ * recursion without stack consumption. Calls f with supplied args, if
+ * any. If f returns a fn, calls that fn with no arguments, and
+ * continues to repeat, until the return value is not a fn, then
+ * returns that non-fn value. Note that if you want to return a fn as a
+ * final value, you must wrap it in some data structure and unpack it
+ * after trampoline returns.
+ */
+cljs.core.trampoline = (function cljs$core$trampoline(var_args){
+var G__12685 = arguments.length;
+switch (G__12685) {
+case 1:
+return cljs.core.trampoline.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+var args_arr__9025__auto__ = [];
+var len__9000__auto___12687 = arguments.length;
+var i__9001__auto___12688 = (0);
+while(true){
+if((i__9001__auto___12688 < len__9000__auto___12687)){
+args_arr__9025__auto__.push((arguments[i__9001__auto___12688]));
+
+var G__12689 = (i__9001__auto___12688 + (1));
+i__9001__auto___12688 = G__12689;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9026__auto__ = (new cljs.core.IndexedSeq(args_arr__9025__auto__.slice((1)),(0),null));
+return cljs.core.trampoline.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9026__auto__);
+
+}
+});
+
+cljs.core.trampoline.cljs$core$IFn$_invoke$arity$1 = (function (f){
+while(true){
+var ret = (f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+if(cljs.core.fn_QMARK_(ret)){
+var G__12690 = ret;
+f = G__12690;
+continue;
+} else {
+return ret;
+}
+break;
+}
+});
+
+cljs.core.trampoline.cljs$core$IFn$_invoke$arity$variadic = (function (f,args){
+return cljs.core.trampoline.cljs$core$IFn$_invoke$arity$1((function (){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$2(f,args);
+}));
+});
+
+/** @this {Function} */
+cljs.core.trampoline.cljs$lang$applyTo = (function (seq12683){
+var G__12684 = cljs.core.first(seq12683);
+var seq12683__$1 = cljs.core.next(seq12683);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12684,seq12683__$1);
+});
+
+cljs.core.trampoline.cljs$lang$maxFixedArity = (1);
+
+/**
+ * Returns a random floating point number between 0 (inclusive) and
+ * n (default 1) (exclusive).
+ */
+cljs.core.rand = (function cljs$core$rand(var_args){
+var G__12692 = arguments.length;
+switch (G__12692) {
+case 0:
+return cljs.core.rand.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return cljs.core.rand.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.rand.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.rand.cljs$core$IFn$_invoke$arity$1((1));
+});
+
+cljs.core.rand.cljs$core$IFn$_invoke$arity$1 = (function (n){
+return (Math.random() * n);
+});
+
+cljs.core.rand.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Returns a random integer between 0 (inclusive) and n (exclusive).
+ */
+cljs.core.rand_int = (function cljs$core$rand_int(n){
+var G__12694 = (Math.random() * n);
+return Math.floor(G__12694);
+});
+/**
+ * Return a random element of the (sequential) collection. Will have
+ * the same performance characteristics as nth for the given
+ * collection.
+ */
+cljs.core.rand_nth = (function cljs$core$rand_nth(coll){
+return cljs.core.nth.cljs$core$IFn$_invoke$arity$2(coll,cljs.core.rand_int(cljs.core.count(coll)));
+});
+/**
+ * Returns a map of the elements of coll keyed by the result of
+ * f on each element. The value at each key will be a vector of the
+ * corresponding elements, in the order they appeared in coll.
+ */
+cljs.core.group_by = (function cljs$core$group_by(f,coll){
+return cljs.core.persistent_BANG_(cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (ret,x){
+var k = (f.cljs$core$IFn$_invoke$arity$1 ? f.cljs$core$IFn$_invoke$arity$1(x) : f.call(null,x));
+return cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3(ret,k,cljs.core.conj.cljs$core$IFn$_invoke$arity$2(cljs.core.get.cljs$core$IFn$_invoke$arity$3(ret,k,cljs.core.PersistentVector.EMPTY),x));
+}),cljs.core.transient$(cljs.core.PersistentArrayMap.EMPTY),coll));
+});
+/**
+ * Creates a hierarchy object for use with derive, isa? etc.
+ */
+cljs.core.make_hierarchy = (function cljs$core$make_hierarchy(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"parents","parents",-2027538891),cljs.core.PersistentArrayMap.EMPTY,new cljs.core.Keyword(null,"descendants","descendants",1824886031),cljs.core.PersistentArrayMap.EMPTY,new cljs.core.Keyword(null,"ancestors","ancestors",-776045424),cljs.core.PersistentArrayMap.EMPTY], null);
+});
+/**
+ * @type {*}
+ */
+cljs.core._global_hierarchy = null;
+cljs.core.get_global_hierarchy = (function cljs$core$get_global_hierarchy(){
+if((cljs.core._global_hierarchy == null)){
+cljs.core._global_hierarchy = cljs.core.atom.cljs$core$IFn$_invoke$arity$1(cljs.core.make_hierarchy());
+} else {
+}
+
+return cljs.core._global_hierarchy;
+});
+cljs.core.swap_global_hierarchy_BANG_ = (function cljs$core$swap_global_hierarchy_BANG_(var_args){
+var args__9010__auto__ = [];
+var len__9000__auto___12697 = arguments.length;
+var i__9001__auto___12698 = (0);
+while(true){
+if((i__9001__auto___12698 < len__9000__auto___12697)){
+args__9010__auto__.push((arguments[i__9001__auto___12698]));
+
+var G__12699 = (i__9001__auto___12698 + (1));
+i__9001__auto___12698 = G__12699;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__9011__auto__ = ((((1) < args__9010__auto__.length))?(new cljs.core.IndexedSeq(args__9010__auto__.slice((1)),(0),null)):null);
+return cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__9011__auto__);
+});
+
+cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (f,args){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$4(cljs.core.swap_BANG_,cljs.core.get_global_hierarchy(),f,args);
+});
+
+cljs.core.swap_global_hierarchy_BANG_.cljs$lang$maxFixedArity = (1);
+
+/** @this {Function} */
+cljs.core.swap_global_hierarchy_BANG_.cljs$lang$applyTo = (function (seq12695){
+var G__12696 = cljs.core.first(seq12695);
+var seq12695__$1 = cljs.core.next(seq12695);
+var self__8987__auto__ = this;
+return self__8987__auto__.cljs$core$IFn$_invoke$arity$variadic(G__12696,seq12695__$1);
+});
+
+/**
+ * Returns true if (= child parent), or child is directly or indirectly derived from
+ * parent, either via a JavaScript type inheritance relationship or a
+ * relationship established via derive. h must be a hierarchy obtained
+ * from make-hierarchy, if not supplied defaults to the global
+ * hierarchy
+ */
+cljs.core.isa_QMARK_ = (function cljs$core$isa_QMARK_(var_args){
+var G__12701 = arguments.length;
+switch (G__12701) {
+case 2:
+return cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$2 = (function (child,parent){
+return cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3(cljs.core.deref(cljs.core.get_global_hierarchy()),child,parent);
+});
+
+cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3 = (function (h,child,parent){
+var or__7806__auto__ = cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(child,parent);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = cljs.core.contains_QMARK_((function (){var fexpr__12704 = new cljs.core.Keyword(null,"ancestors","ancestors",-776045424).cljs$core$IFn$_invoke$arity$1(h);
+return (fexpr__12704.cljs$core$IFn$_invoke$arity$1 ? fexpr__12704.cljs$core$IFn$_invoke$arity$1(child) : fexpr__12704.call(null,child));
+})(),parent);
+if(or__7806__auto____$1){
+return or__7806__auto____$1;
+} else {
+var and__7791__auto__ = cljs.core.vector_QMARK_(parent);
+if(and__7791__auto__){
+var and__7791__auto____$1 = cljs.core.vector_QMARK_(child);
+if(and__7791__auto____$1){
+var and__7791__auto____$2 = (cljs.core.count(parent) === cljs.core.count(child));
+if(and__7791__auto____$2){
+var ret = true;
+var i = (0);
+while(true){
+if((((!(ret))) || ((i === cljs.core.count(parent))))){
+return ret;
+} else {
+var G__12706 = cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3(h,(child.cljs$core$IFn$_invoke$arity$1 ? child.cljs$core$IFn$_invoke$arity$1(i) : child.call(null,i)),(parent.cljs$core$IFn$_invoke$arity$1 ? parent.cljs$core$IFn$_invoke$arity$1(i) : parent.call(null,i)));
+var G__12707 = (i + (1));
+ret = G__12706;
+i = G__12707;
+continue;
+}
+break;
+}
+} else {
+return and__7791__auto____$2;
+}
+} else {
+return and__7791__auto____$1;
+}
+} else {
+return and__7791__auto__;
+}
+}
+}
+});
+
+cljs.core.isa_QMARK_.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns the immediate parents of tag, either via a JavaScript type
+ * inheritance relationship or a relationship established via derive. h
+ * must be a hierarchy obtained from make-hierarchy, if not supplied
+ * defaults to the global hierarchy
+ */
+cljs.core.parents = (function cljs$core$parents(var_args){
+var G__12709 = arguments.length;
+switch (G__12709) {
+case 1:
+return cljs.core.parents.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.parents.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.parents.cljs$core$IFn$_invoke$arity$1 = (function (tag){
+return cljs.core.parents.cljs$core$IFn$_invoke$arity$2(cljs.core.deref(cljs.core.get_global_hierarchy()),tag);
+});
+
+cljs.core.parents.cljs$core$IFn$_invoke$arity$2 = (function (h,tag){
+return cljs.core.not_empty(cljs.core.get.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"parents","parents",-2027538891).cljs$core$IFn$_invoke$arity$1(h),tag));
+});
+
+cljs.core.parents.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns the immediate and indirect parents of tag, either via a JavaScript type
+ * inheritance relationship or a relationship established via derive. h
+ * must be a hierarchy obtained from make-hierarchy, if not supplied
+ * defaults to the global hierarchy
+ */
+cljs.core.ancestors = (function cljs$core$ancestors(var_args){
+var G__12712 = arguments.length;
+switch (G__12712) {
+case 1:
+return cljs.core.ancestors.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.ancestors.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.ancestors.cljs$core$IFn$_invoke$arity$1 = (function (tag){
+return cljs.core.ancestors.cljs$core$IFn$_invoke$arity$2(cljs.core.deref(cljs.core.get_global_hierarchy()),tag);
+});
+
+cljs.core.ancestors.cljs$core$IFn$_invoke$arity$2 = (function (h,tag){
+return cljs.core.not_empty(cljs.core.get.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"ancestors","ancestors",-776045424).cljs$core$IFn$_invoke$arity$1(h),tag));
+});
+
+cljs.core.ancestors.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns the immediate and indirect children of tag, through a
+ * relationship established via derive. h must be a hierarchy obtained
+ * from make-hierarchy, if not supplied defaults to the global
+ * hierarchy. Note: does not work on JavaScript type inheritance
+ * relationships.
+ */
+cljs.core.descendants = (function cljs$core$descendants(var_args){
+var G__12715 = arguments.length;
+switch (G__12715) {
+case 1:
+return cljs.core.descendants.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.descendants.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.descendants.cljs$core$IFn$_invoke$arity$1 = (function (tag){
+return cljs.core.descendants.cljs$core$IFn$_invoke$arity$2(cljs.core.deref(cljs.core.get_global_hierarchy()),tag);
+});
+
+cljs.core.descendants.cljs$core$IFn$_invoke$arity$2 = (function (h,tag){
+return cljs.core.not_empty(cljs.core.get.cljs$core$IFn$_invoke$arity$2(new cljs.core.Keyword(null,"descendants","descendants",1824886031).cljs$core$IFn$_invoke$arity$1(h),tag));
+});
+
+cljs.core.descendants.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Establishes a parent/child relationship between parent and
+ * tag. Parent must be a namespace-qualified symbol or keyword and
+ * child can be either a namespace-qualified symbol or keyword or a
+ * class. h must be a hierarchy obtained from make-hierarchy, if not
+ * supplied defaults to, and modifies, the global hierarchy.
+ */
+cljs.core.derive = (function cljs$core$derive(var_args){
+var G__12718 = arguments.length;
+switch (G__12718) {
+case 2:
+return cljs.core.derive.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.derive.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.derive.cljs$core$IFn$_invoke$arity$2 = (function (tag,parent){
+if(cljs.core.truth_(cljs.core.namespace(parent))){
+} else {
+throw (new Error("Assert failed: (namespace parent)"));
+}
+
+cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic(cljs.core.derive,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([tag,parent], 0));
+
+return null;
+});
+
+cljs.core.derive.cljs$core$IFn$_invoke$arity$3 = (function (h,tag,parent){
+if(cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2(tag,parent)){
+} else {
+throw (new Error("Assert failed: (not= tag parent)"));
+}
+
+var tp = new cljs.core.Keyword(null,"parents","parents",-2027538891).cljs$core$IFn$_invoke$arity$1(h);
+var td = new cljs.core.Keyword(null,"descendants","descendants",1824886031).cljs$core$IFn$_invoke$arity$1(h);
+var ta = new cljs.core.Keyword(null,"ancestors","ancestors",-776045424).cljs$core$IFn$_invoke$arity$1(h);
+var tf = ((function (tp,td,ta){
+return (function (m,source,sources,target,targets){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (tp,td,ta){
+return (function (ret,k){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(ret,k,cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(cljs.core.conj,cljs.core.get.cljs$core$IFn$_invoke$arity$3(targets,k,cljs.core.PersistentHashSet.EMPTY),cljs.core.cons(target,(targets.cljs$core$IFn$_invoke$arity$1 ? targets.cljs$core$IFn$_invoke$arity$1(target) : targets.call(null,target)))));
+});})(tp,td,ta))
+,m,cljs.core.cons(source,(sources.cljs$core$IFn$_invoke$arity$1 ? sources.cljs$core$IFn$_invoke$arity$1(source) : sources.call(null,source))));
+});})(tp,td,ta))
+;
+var or__7806__auto__ = ((cljs.core.contains_QMARK_((tp.cljs$core$IFn$_invoke$arity$1 ? tp.cljs$core$IFn$_invoke$arity$1(tag) : tp.call(null,tag)),parent))?null:(function (){
+if(cljs.core.contains_QMARK_((ta.cljs$core$IFn$_invoke$arity$1 ? ta.cljs$core$IFn$_invoke$arity$1(tag) : ta.call(null,tag)),parent)){
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1(tag),"already has",cljs.core.str.cljs$core$IFn$_invoke$arity$1(parent),"as ancestor"].join('')));
+} else {
+}
+
+if(cljs.core.contains_QMARK_((ta.cljs$core$IFn$_invoke$arity$1 ? ta.cljs$core$IFn$_invoke$arity$1(parent) : ta.call(null,parent)),tag)){
+throw (new Error(["Cyclic derivation:",cljs.core.str.cljs$core$IFn$_invoke$arity$1(parent),"has",cljs.core.str.cljs$core$IFn$_invoke$arity$1(tag),"as ancestor"].join('')));
+} else {
+}
+
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"parents","parents",-2027538891),cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(new cljs.core.Keyword(null,"parents","parents",-2027538891).cljs$core$IFn$_invoke$arity$1(h),tag,cljs.core.conj.cljs$core$IFn$_invoke$arity$2(cljs.core.get.cljs$core$IFn$_invoke$arity$3(tp,tag,cljs.core.PersistentHashSet.EMPTY),parent)),new cljs.core.Keyword(null,"ancestors","ancestors",-776045424),tf(new cljs.core.Keyword(null,"ancestors","ancestors",-776045424).cljs$core$IFn$_invoke$arity$1(h),tag,td,parent,ta),new cljs.core.Keyword(null,"descendants","descendants",1824886031),tf(new cljs.core.Keyword(null,"descendants","descendants",1824886031).cljs$core$IFn$_invoke$arity$1(h),parent,ta,tag,td)], null);
+})()
+);
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return h;
+}
+});
+
+cljs.core.derive.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Removes a parent/child relationship between parent and
+ * tag. h must be a hierarchy obtained from make-hierarchy, if not
+ * supplied defaults to, and modifies, the global hierarchy.
+ */
+cljs.core.underive = (function cljs$core$underive(var_args){
+var G__12724 = arguments.length;
+switch (G__12724) {
+case 2:
+return cljs.core.underive.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.underive.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.underive.cljs$core$IFn$_invoke$arity$2 = (function (tag,parent){
+cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic(cljs.core.underive,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([tag,parent], 0));
+
+return null;
+});
+
+cljs.core.underive.cljs$core$IFn$_invoke$arity$3 = (function (h,tag,parent){
+var parentMap = new cljs.core.Keyword(null,"parents","parents",-2027538891).cljs$core$IFn$_invoke$arity$1(h);
+var childsParents = (cljs.core.truth_((parentMap.cljs$core$IFn$_invoke$arity$1 ? parentMap.cljs$core$IFn$_invoke$arity$1(tag) : parentMap.call(null,tag)))?cljs.core.disj.cljs$core$IFn$_invoke$arity$2((parentMap.cljs$core$IFn$_invoke$arity$1 ? parentMap.cljs$core$IFn$_invoke$arity$1(tag) : parentMap.call(null,tag)),parent):cljs.core.PersistentHashSet.EMPTY);
+var newParents = (cljs.core.truth_(cljs.core.not_empty(childsParents))?cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(parentMap,tag,childsParents):cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2(parentMap,tag));
+var deriv_seq = cljs.core.flatten(cljs.core.map.cljs$core$IFn$_invoke$arity$2(((function (parentMap,childsParents,newParents){
+return (function (p1__12720_SHARP_){
+return cljs.core.cons(cljs.core.first(p1__12720_SHARP_),cljs.core.interpose.cljs$core$IFn$_invoke$arity$2(cljs.core.first(p1__12720_SHARP_),cljs.core.second(p1__12720_SHARP_)));
+});})(parentMap,childsParents,newParents))
+,cljs.core.seq(newParents)));
+if(cljs.core.contains_QMARK_((parentMap.cljs$core$IFn$_invoke$arity$1 ? parentMap.cljs$core$IFn$_invoke$arity$1(tag) : parentMap.call(null,tag)),parent)){
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(((function (parentMap,childsParents,newParents,deriv_seq){
+return (function (p1__12721_SHARP_,p2__12722_SHARP_){
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$3(cljs.core.derive,p1__12721_SHARP_,p2__12722_SHARP_);
+});})(parentMap,childsParents,newParents,deriv_seq))
+,cljs.core.make_hierarchy(),cljs.core.partition.cljs$core$IFn$_invoke$arity$2((2),deriv_seq));
+} else {
+return h;
+}
+});
+
+cljs.core.underive.cljs$lang$maxFixedArity = 3;
+
+cljs.core.reset_cache = (function cljs$core$reset_cache(method_cache,method_table,cached_hierarchy,hierarchy){
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(method_cache,(function (_){
+return cljs.core.deref(method_table);
+}));
+
+return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(cached_hierarchy,(function (_){
+return cljs.core.deref(hierarchy);
+}));
+});
+cljs.core.prefers_STAR_ = (function cljs$core$prefers_STAR_(x,y,prefer_table){
+var xprefs = (function (){var fexpr__12726 = cljs.core.deref(prefer_table);
+return (fexpr__12726.cljs$core$IFn$_invoke$arity$1 ? fexpr__12726.cljs$core$IFn$_invoke$arity$1(x) : fexpr__12726.call(null,x));
+})();
+var or__7806__auto__ = (cljs.core.truth_((function (){var and__7791__auto__ = xprefs;
+if(cljs.core.truth_(and__7791__auto__)){
+return (xprefs.cljs$core$IFn$_invoke$arity$1 ? xprefs.cljs$core$IFn$_invoke$arity$1(y) : xprefs.call(null,y));
+} else {
+return and__7791__auto__;
+}
+})())?true:null);
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+var or__7806__auto____$1 = (function (){var ps = cljs.core.parents.cljs$core$IFn$_invoke$arity$1(y);
+while(true){
+if((cljs.core.count(ps) > (0))){
+if(cljs.core.truth_((function (){var G__12730 = x;
+var G__12731 = cljs.core.first(ps);
+var G__12732 = prefer_table;
+return (cljs.core.prefers_STAR_.cljs$core$IFn$_invoke$arity$3 ? cljs.core.prefers_STAR_.cljs$core$IFn$_invoke$arity$3(G__12730,G__12731,G__12732) : cljs.core.prefers_STAR_.call(null,G__12730,G__12731,G__12732));
+})())){
+} else {
+}
+
+var G__12739 = cljs.core.rest(ps);
+ps = G__12739;
+continue;
+} else {
+return null;
+}
+break;
+}
+})();
+if(cljs.core.truth_(or__7806__auto____$1)){
+return or__7806__auto____$1;
+} else {
+var or__7806__auto____$2 = (function (){var ps = cljs.core.parents.cljs$core$IFn$_invoke$arity$1(x);
+while(true){
+if((cljs.core.count(ps) > (0))){
+if(cljs.core.truth_((function (){var G__12736 = cljs.core.first(ps);
+var G__12737 = y;
+var G__12738 = prefer_table;
+return (cljs.core.prefers_STAR_.cljs$core$IFn$_invoke$arity$3 ? cljs.core.prefers_STAR_.cljs$core$IFn$_invoke$arity$3(G__12736,G__12737,G__12738) : cljs.core.prefers_STAR_.call(null,G__12736,G__12737,G__12738));
+})())){
+} else {
+}
+
+var G__12740 = cljs.core.rest(ps);
+ps = G__12740;
+continue;
+} else {
+return null;
+}
+break;
+}
+})();
+if(cljs.core.truth_(or__7806__auto____$2)){
+return or__7806__auto____$2;
+} else {
+return false;
+}
+}
+}
+});
+cljs.core.dominates = (function cljs$core$dominates(x,y,prefer_table,hierarchy){
+var or__7806__auto__ = cljs.core.prefers_STAR_(x,y,prefer_table);
+if(cljs.core.truth_(or__7806__auto__)){
+return or__7806__auto__;
+} else {
+return cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3(hierarchy,x,y);
+}
+});
+cljs.core.find_and_cache_best_method = (function cljs$core$find_and_cache_best_method(name,dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy,default_dispatch_val){
+var best_entry = cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (be,p__12741){
+var vec__12742 = p__12741;
+var k = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12742,(0),null);
+var _ = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12742,(1),null);
+var e = vec__12742;
+if(cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3(cljs.core.deref(hierarchy),dispatch_val,k)){
+var be2 = (cljs.core.truth_((function (){var or__7806__auto__ = (be == null);
+if(or__7806__auto__){
+return or__7806__auto__;
+} else {
+return cljs.core.dominates(k,cljs.core.first(be),prefer_table,cljs.core.deref(hierarchy));
+}
+})())?e:be);
+if(cljs.core.truth_(cljs.core.dominates(cljs.core.first(be2),k,prefer_table,cljs.core.deref(hierarchy)))){
+} else {
+throw (new Error(["Multiple methods in multimethod '",cljs.core.str.cljs$core$IFn$_invoke$arity$1(name),"' match dispatch value: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(dispatch_val)," -> ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(k)," and ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.first(be2)),", and neither is preferred"].join('')));
+}
+
+return be2;
+} else {
+return be;
+}
+}),null,cljs.core.deref(method_table));
+var best_entry__$1 = (function (){var temp__4655__auto__ = (function (){var and__7791__auto__ = (best_entry == null);
+if(and__7791__auto__){
+var fexpr__12746 = cljs.core.deref(method_table);
+return (fexpr__12746.cljs$core$IFn$_invoke$arity$1 ? fexpr__12746.cljs$core$IFn$_invoke$arity$1(default_dispatch_val) : fexpr__12746.call(null,default_dispatch_val));
+} else {
+return and__7791__auto__;
+}
+})();
+if(cljs.core.truth_(temp__4655__auto__)){
+var entry = temp__4655__auto__;
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [default_dispatch_val,entry], null);
+} else {
+return best_entry;
+}
+})();
+if(cljs.core.truth_(best_entry__$1)){
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.deref(cached_hierarchy),cljs.core.deref(hierarchy))){
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(method_cache,cljs.core.assoc,dispatch_val,cljs.core.second(best_entry__$1));
+
+return cljs.core.second(best_entry__$1);
+} else {
+cljs.core.reset_cache(method_cache,method_table,cached_hierarchy,hierarchy);
+
+return (cljs.core.find_and_cache_best_method.cljs$core$IFn$_invoke$arity$8 ? cljs.core.find_and_cache_best_method.cljs$core$IFn$_invoke$arity$8(name,dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy,default_dispatch_val) : cljs.core.find_and_cache_best_method.call(null,name,dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy,default_dispatch_val));
+}
+} else {
+return null;
+}
+});
+
+/**
+ * @interface
+ */
+cljs.core.IMultiFn = function(){};
+
+cljs.core._reset = (function cljs$core$_reset(mf){
+if((((!((mf == null)))) && ((!((mf.cljs$core$IMultiFn$_reset$arity$1 == null)))))){
+return mf.cljs$core$IMultiFn$_reset$arity$1(mf);
+} else {
+var x__8502__auto__ = (((mf == null))?null:mf);
+var m__8503__auto__ = (cljs.core._reset[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(mf) : m__8503__auto__.call(null,mf));
+} else {
+var m__8503__auto____$1 = (cljs.core._reset["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(mf) : m__8503__auto____$1.call(null,mf));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-reset",mf);
+}
+}
+}
+});
+
+cljs.core._add_method = (function cljs$core$_add_method(mf,dispatch_val,method){
+if((((!((mf == null)))) && ((!((mf.cljs$core$IMultiFn$_add_method$arity$3 == null)))))){
+return mf.cljs$core$IMultiFn$_add_method$arity$3(mf,dispatch_val,method);
+} else {
+var x__8502__auto__ = (((mf == null))?null:mf);
+var m__8503__auto__ = (cljs.core._add_method[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(mf,dispatch_val,method) : m__8503__auto__.call(null,mf,dispatch_val,method));
+} else {
+var m__8503__auto____$1 = (cljs.core._add_method["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(mf,dispatch_val,method) : m__8503__auto____$1.call(null,mf,dispatch_val,method));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-add-method",mf);
+}
+}
+}
+});
+
+cljs.core._remove_method = (function cljs$core$_remove_method(mf,dispatch_val){
+if((((!((mf == null)))) && ((!((mf.cljs$core$IMultiFn$_remove_method$arity$2 == null)))))){
+return mf.cljs$core$IMultiFn$_remove_method$arity$2(mf,dispatch_val);
+} else {
+var x__8502__auto__ = (((mf == null))?null:mf);
+var m__8503__auto__ = (cljs.core._remove_method[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(mf,dispatch_val) : m__8503__auto__.call(null,mf,dispatch_val));
+} else {
+var m__8503__auto____$1 = (cljs.core._remove_method["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(mf,dispatch_val) : m__8503__auto____$1.call(null,mf,dispatch_val));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-remove-method",mf);
+}
+}
+}
+});
+
+cljs.core._prefer_method = (function cljs$core$_prefer_method(mf,dispatch_val,dispatch_val_y){
+if((((!((mf == null)))) && ((!((mf.cljs$core$IMultiFn$_prefer_method$arity$3 == null)))))){
+return mf.cljs$core$IMultiFn$_prefer_method$arity$3(mf,dispatch_val,dispatch_val_y);
+} else {
+var x__8502__auto__ = (((mf == null))?null:mf);
+var m__8503__auto__ = (cljs.core._prefer_method[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$3(mf,dispatch_val,dispatch_val_y) : m__8503__auto__.call(null,mf,dispatch_val,dispatch_val_y));
+} else {
+var m__8503__auto____$1 = (cljs.core._prefer_method["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$3(mf,dispatch_val,dispatch_val_y) : m__8503__auto____$1.call(null,mf,dispatch_val,dispatch_val_y));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-prefer-method",mf);
+}
+}
+}
+});
+
+cljs.core._get_method = (function cljs$core$_get_method(mf,dispatch_val){
+if((((!((mf == null)))) && ((!((mf.cljs$core$IMultiFn$_get_method$arity$2 == null)))))){
+return mf.cljs$core$IMultiFn$_get_method$arity$2(mf,dispatch_val);
+} else {
+var x__8502__auto__ = (((mf == null))?null:mf);
+var m__8503__auto__ = (cljs.core._get_method[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$2(mf,dispatch_val) : m__8503__auto__.call(null,mf,dispatch_val));
+} else {
+var m__8503__auto____$1 = (cljs.core._get_method["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$2(mf,dispatch_val) : m__8503__auto____$1.call(null,mf,dispatch_val));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-get-method",mf);
+}
+}
+}
+});
+
+cljs.core._methods = (function cljs$core$_methods(mf){
+if((((!((mf == null)))) && ((!((mf.cljs$core$IMultiFn$_methods$arity$1 == null)))))){
+return mf.cljs$core$IMultiFn$_methods$arity$1(mf);
+} else {
+var x__8502__auto__ = (((mf == null))?null:mf);
+var m__8503__auto__ = (cljs.core._methods[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(mf) : m__8503__auto__.call(null,mf));
+} else {
+var m__8503__auto____$1 = (cljs.core._methods["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(mf) : m__8503__auto____$1.call(null,mf));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-methods",mf);
+}
+}
+}
+});
+
+cljs.core._prefers = (function cljs$core$_prefers(mf){
+if((((!((mf == null)))) && ((!((mf.cljs$core$IMultiFn$_prefers$arity$1 == null)))))){
+return mf.cljs$core$IMultiFn$_prefers$arity$1(mf);
+} else {
+var x__8502__auto__ = (((mf == null))?null:mf);
+var m__8503__auto__ = (cljs.core._prefers[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(mf) : m__8503__auto__.call(null,mf));
+} else {
+var m__8503__auto____$1 = (cljs.core._prefers["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(mf) : m__8503__auto____$1.call(null,mf));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-prefers",mf);
+}
+}
+}
+});
+
+cljs.core._default_dispatch_val = (function cljs$core$_default_dispatch_val(mf){
+if((((!((mf == null)))) && ((!((mf.cljs$core$IMultiFn$_default_dispatch_val$arity$1 == null)))))){
+return mf.cljs$core$IMultiFn$_default_dispatch_val$arity$1(mf);
+} else {
+var x__8502__auto__ = (((mf == null))?null:mf);
+var m__8503__auto__ = (cljs.core._default_dispatch_val[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(mf) : m__8503__auto__.call(null,mf));
+} else {
+var m__8503__auto____$1 = (cljs.core._default_dispatch_val["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(mf) : m__8503__auto____$1.call(null,mf));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-default-dispatch-val",mf);
+}
+}
+}
+});
+
+cljs.core._dispatch_fn = (function cljs$core$_dispatch_fn(mf){
+if((((!((mf == null)))) && ((!((mf.cljs$core$IMultiFn$_dispatch_fn$arity$1 == null)))))){
+return mf.cljs$core$IMultiFn$_dispatch_fn$arity$1(mf);
+} else {
+var x__8502__auto__ = (((mf == null))?null:mf);
+var m__8503__auto__ = (cljs.core._dispatch_fn[goog.typeOf(x__8502__auto__)]);
+if((!((m__8503__auto__ == null)))){
+return (m__8503__auto__.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto__.cljs$core$IFn$_invoke$arity$1(mf) : m__8503__auto__.call(null,mf));
+} else {
+var m__8503__auto____$1 = (cljs.core._dispatch_fn["_"]);
+if((!((m__8503__auto____$1 == null)))){
+return (m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1 ? m__8503__auto____$1.cljs$core$IFn$_invoke$arity$1(mf) : m__8503__auto____$1.call(null,mf));
+} else {
+throw cljs.core.missing_protocol("IMultiFn.-dispatch-fn",mf);
+}
+}
+}
+});
+
+cljs.core.throw_no_method_error = (function cljs$core$throw_no_method_error(name,dispatch_val){
+throw (new Error(["No method in multimethod '",cljs.core.str.cljs$core$IFn$_invoke$arity$1(name),"' for dispatch value: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(dispatch_val)].join('')));
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IFn}
+ * @implements {cljs.core.IMultiFn}
+ * @implements {cljs.core.INamed}
+*/
+cljs.core.MultiFn = (function (name,dispatch_fn,default_dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy){
+this.name = name;
+this.dispatch_fn = dispatch_fn;
+this.default_dispatch_val = default_dispatch_val;
+this.hierarchy = hierarchy;
+this.method_table = method_table;
+this.prefer_table = prefer_table;
+this.method_cache = method_cache;
+this.cached_hierarchy = cached_hierarchy;
+this.cljs$lang$protocol_mask$partition0$ = 4194305;
+this.cljs$lang$protocol_mask$partition1$ = 4352;
+});
+cljs.core.MultiFn.prototype.call = (function() {
+var G__12749 = null;
+var G__12749__1 = (function (self__){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$0 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$0() : self__.dispatch_fn.call(null));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$0 ? target_fn.cljs$core$IFn$_invoke$arity$0() : target_fn.call(null));
+});
+var G__12749__2 = (function (self__,a){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$1 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$1(a) : self__.dispatch_fn.call(null,a));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$1 ? target_fn.cljs$core$IFn$_invoke$arity$1(a) : target_fn.call(null,a));
+});
+var G__12749__3 = (function (self__,a,b){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$2 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$2(a,b) : self__.dispatch_fn.call(null,a,b));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$2 ? target_fn.cljs$core$IFn$_invoke$arity$2(a,b) : target_fn.call(null,a,b));
+});
+var G__12749__4 = (function (self__,a,b,c){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$3 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$3(a,b,c) : self__.dispatch_fn.call(null,a,b,c));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$3 ? target_fn.cljs$core$IFn$_invoke$arity$3(a,b,c) : target_fn.call(null,a,b,c));
+});
+var G__12749__5 = (function (self__,a,b,c,d){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$4 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : self__.dispatch_fn.call(null,a,b,c,d));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$4 ? target_fn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : target_fn.call(null,a,b,c,d));
+});
+var G__12749__6 = (function (self__,a,b,c,d,e){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$5 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : self__.dispatch_fn.call(null,a,b,c,d,e));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$5 ? target_fn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : target_fn.call(null,a,b,c,d,e));
+});
+var G__12749__7 = (function (self__,a,b,c,d,e,f){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$6 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : self__.dispatch_fn.call(null,a,b,c,d,e,f));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$6 ? target_fn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : target_fn.call(null,a,b,c,d,e,f));
+});
+var G__12749__8 = (function (self__,a,b,c,d,e,f,g){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$7 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$7 ? target_fn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : target_fn.call(null,a,b,c,d,e,f,g));
+});
+var G__12749__9 = (function (self__,a,b,c,d,e,f,g,h){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$8 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$8 ? target_fn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : target_fn.call(null,a,b,c,d,e,f,g,h));
+});
+var G__12749__10 = (function (self__,a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$9 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$9 ? target_fn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : target_fn.call(null,a,b,c,d,e,f,g,h,i));
+});
+var G__12749__11 = (function (self__,a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$10 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$10 ? target_fn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j));
+});
+var G__12749__12 = (function (self__,a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$11 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$11 ? target_fn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+});
+var G__12749__13 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$12 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$12 ? target_fn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+});
+var G__12749__14 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$13 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$13 ? target_fn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+});
+var G__12749__15 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$14 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$14 ? target_fn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+});
+var G__12749__16 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$15 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$15 ? target_fn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+});
+var G__12749__17 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$16 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$16 ? target_fn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+});
+var G__12749__18 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$17 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$17 ? target_fn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+});
+var G__12749__19 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$18 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$18 ? target_fn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+});
+var G__12749__20 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$19 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$19 ? target_fn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+});
+var G__12749__21 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$20 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$20 ? target_fn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+});
+var G__12749__22 = (function (self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var self____$1 = this;
+var mf = self____$1;
+var dispatch_val = cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(self__.dispatch_fn,a,b,c,d,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(target_fn,a,b,c,d,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+});
+G__12749 = function(self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+switch(arguments.length){
+case 1:
+return G__12749__1.call(this,self__);
+case 2:
+return G__12749__2.call(this,self__,a);
+case 3:
+return G__12749__3.call(this,self__,a,b);
+case 4:
+return G__12749__4.call(this,self__,a,b,c);
+case 5:
+return G__12749__5.call(this,self__,a,b,c,d);
+case 6:
+return G__12749__6.call(this,self__,a,b,c,d,e);
+case 7:
+return G__12749__7.call(this,self__,a,b,c,d,e,f);
+case 8:
+return G__12749__8.call(this,self__,a,b,c,d,e,f,g);
+case 9:
+return G__12749__9.call(this,self__,a,b,c,d,e,f,g,h);
+case 10:
+return G__12749__10.call(this,self__,a,b,c,d,e,f,g,h,i);
+case 11:
+return G__12749__11.call(this,self__,a,b,c,d,e,f,g,h,i,j);
+case 12:
+return G__12749__12.call(this,self__,a,b,c,d,e,f,g,h,i,j,k);
+case 13:
+return G__12749__13.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l);
+case 14:
+return G__12749__14.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m);
+case 15:
+return G__12749__15.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n);
+case 16:
+return G__12749__16.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o);
+case 17:
+return G__12749__17.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);
+case 18:
+return G__12749__18.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
+case 19:
+return G__12749__19.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r);
+case 20:
+return G__12749__20.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);
+case 21:
+return G__12749__21.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t);
+case 22:
+return G__12749__22.call(this,self__,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest);
+}
+throw(new Error('Invalid arity: ' + (arguments.length - 1)));
+};
+G__12749.cljs$core$IFn$_invoke$arity$1 = G__12749__1;
+G__12749.cljs$core$IFn$_invoke$arity$2 = G__12749__2;
+G__12749.cljs$core$IFn$_invoke$arity$3 = G__12749__3;
+G__12749.cljs$core$IFn$_invoke$arity$4 = G__12749__4;
+G__12749.cljs$core$IFn$_invoke$arity$5 = G__12749__5;
+G__12749.cljs$core$IFn$_invoke$arity$6 = G__12749__6;
+G__12749.cljs$core$IFn$_invoke$arity$7 = G__12749__7;
+G__12749.cljs$core$IFn$_invoke$arity$8 = G__12749__8;
+G__12749.cljs$core$IFn$_invoke$arity$9 = G__12749__9;
+G__12749.cljs$core$IFn$_invoke$arity$10 = G__12749__10;
+G__12749.cljs$core$IFn$_invoke$arity$11 = G__12749__11;
+G__12749.cljs$core$IFn$_invoke$arity$12 = G__12749__12;
+G__12749.cljs$core$IFn$_invoke$arity$13 = G__12749__13;
+G__12749.cljs$core$IFn$_invoke$arity$14 = G__12749__14;
+G__12749.cljs$core$IFn$_invoke$arity$15 = G__12749__15;
+G__12749.cljs$core$IFn$_invoke$arity$16 = G__12749__16;
+G__12749.cljs$core$IFn$_invoke$arity$17 = G__12749__17;
+G__12749.cljs$core$IFn$_invoke$arity$18 = G__12749__18;
+G__12749.cljs$core$IFn$_invoke$arity$19 = G__12749__19;
+G__12749.cljs$core$IFn$_invoke$arity$20 = G__12749__20;
+G__12749.cljs$core$IFn$_invoke$arity$21 = G__12749__21;
+G__12749.cljs$core$IFn$_invoke$arity$22 = G__12749__22;
+return G__12749;
+})()
+;
+
+cljs.core.MultiFn.prototype.apply = (function (self__,args12747){
+var self__ = this;
+var self____$1 = this;
+return self____$1.call.apply(self____$1,[self____$1].concat(cljs.core.aclone(args12747)));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$0 = (function (){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$0 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$0() : self__.dispatch_fn.call(null));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$0 ? target_fn.cljs$core$IFn$_invoke$arity$0() : target_fn.call(null));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$1 = (function (a){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$1 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$1(a) : self__.dispatch_fn.call(null,a));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$1 ? target_fn.cljs$core$IFn$_invoke$arity$1(a) : target_fn.call(null,a));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$2 = (function (a,b){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$2 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$2(a,b) : self__.dispatch_fn.call(null,a,b));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$2 ? target_fn.cljs$core$IFn$_invoke$arity$2(a,b) : target_fn.call(null,a,b));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$3 = (function (a,b,c){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$3 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$3(a,b,c) : self__.dispatch_fn.call(null,a,b,c));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$3 ? target_fn.cljs$core$IFn$_invoke$arity$3(a,b,c) : target_fn.call(null,a,b,c));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$4 = (function (a,b,c,d){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$4 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : self__.dispatch_fn.call(null,a,b,c,d));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$4 ? target_fn.cljs$core$IFn$_invoke$arity$4(a,b,c,d) : target_fn.call(null,a,b,c,d));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$5 = (function (a,b,c,d,e){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$5 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : self__.dispatch_fn.call(null,a,b,c,d,e));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$5 ? target_fn.cljs$core$IFn$_invoke$arity$5(a,b,c,d,e) : target_fn.call(null,a,b,c,d,e));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$6 = (function (a,b,c,d,e,f){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$6 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : self__.dispatch_fn.call(null,a,b,c,d,e,f));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$6 ? target_fn.cljs$core$IFn$_invoke$arity$6(a,b,c,d,e,f) : target_fn.call(null,a,b,c,d,e,f));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$7 = (function (a,b,c,d,e,f,g){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$7 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$7 ? target_fn.cljs$core$IFn$_invoke$arity$7(a,b,c,d,e,f,g) : target_fn.call(null,a,b,c,d,e,f,g));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$8 = (function (a,b,c,d,e,f,g,h){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$8 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$8 ? target_fn.cljs$core$IFn$_invoke$arity$8(a,b,c,d,e,f,g,h) : target_fn.call(null,a,b,c,d,e,f,g,h));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$9 = (function (a,b,c,d,e,f,g,h,i){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$9 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$9 ? target_fn.cljs$core$IFn$_invoke$arity$9(a,b,c,d,e,f,g,h,i) : target_fn.call(null,a,b,c,d,e,f,g,h,i));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$10 = (function (a,b,c,d,e,f,g,h,i,j){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$10 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$10 ? target_fn.cljs$core$IFn$_invoke$arity$10(a,b,c,d,e,f,g,h,i,j) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$11 = (function (a,b,c,d,e,f,g,h,i,j,k){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$11 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$11 ? target_fn.cljs$core$IFn$_invoke$arity$11(a,b,c,d,e,f,g,h,i,j,k) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$12 = (function (a,b,c,d,e,f,g,h,i,j,k,l){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$12 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$12 ? target_fn.cljs$core$IFn$_invoke$arity$12(a,b,c,d,e,f,g,h,i,j,k,l) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$13 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$13 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$13 ? target_fn.cljs$core$IFn$_invoke$arity$13(a,b,c,d,e,f,g,h,i,j,k,l,m) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$14 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$14 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$14 ? target_fn.cljs$core$IFn$_invoke$arity$14(a,b,c,d,e,f,g,h,i,j,k,l,m,n) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$15 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$15 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$15 ? target_fn.cljs$core$IFn$_invoke$arity$15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$16 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$16 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$16 ? target_fn.cljs$core$IFn$_invoke$arity$16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$17 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$17 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$17 ? target_fn.cljs$core$IFn$_invoke$arity$17(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$18 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$18 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$18 ? target_fn.cljs$core$IFn$_invoke$arity$18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$19 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$19 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$19 ? target_fn.cljs$core$IFn$_invoke$arity$19(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$20 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){
+var self__ = this;
+var mf = this;
+var dispatch_val = (self__.dispatch_fn.cljs$core$IFn$_invoke$arity$20 ? self__.dispatch_fn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : self__.dispatch_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return (target_fn.cljs$core$IFn$_invoke$arity$20 ? target_fn.cljs$core$IFn$_invoke$arity$20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) : target_fn.call(null,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IFn$_invoke$arity$21 = (function (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest){
+var self__ = this;
+var mf = this;
+var dispatch_val = cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(self__.dispatch_fn,a,b,c,d,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+var target_fn = mf.cljs$core$IMultiFn$_get_method$arity$2(null,dispatch_val);
+if(cljs.core.truth_(target_fn)){
+} else {
+cljs.core.throw_no_method_error(self__.name,dispatch_val);
+}
+
+return cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic(target_fn,a,b,c,d,cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2([e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,rest], 0));
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_prefer_method$arity$3 = (function (mf,dispatch_val_x,dispatch_val_y){
+var self__ = this;
+var mf__$1 = this;
+if(cljs.core.truth_(cljs.core.prefers_STAR_(dispatch_val_x,dispatch_val_y,self__.prefer_table))){
+throw (new Error(["Preference conflict in multimethod '",cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.name),"': ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(dispatch_val_y)," is already preferred to ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(dispatch_val_x)].join('')));
+} else {
+}
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(self__.prefer_table,((function (mf__$1){
+return (function (old){
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(old,dispatch_val_x,cljs.core.conj.cljs$core$IFn$_invoke$arity$2(cljs.core.get.cljs$core$IFn$_invoke$arity$3(old,dispatch_val_x,cljs.core.PersistentHashSet.EMPTY),dispatch_val_y));
+});})(mf__$1))
+);
+
+return cljs.core.reset_cache(self__.method_cache,self__.method_table,self__.cached_hierarchy,self__.hierarchy);
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_default_dispatch_val$arity$1 = (function (mf){
+var self__ = this;
+var mf__$1 = this;
+return self__.default_dispatch_val;
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_remove_method$arity$2 = (function (mf,dispatch_val){
+var self__ = this;
+var mf__$1 = this;
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3(self__.method_table,cljs.core.dissoc,dispatch_val);
+
+cljs.core.reset_cache(self__.method_cache,self__.method_table,self__.cached_hierarchy,self__.hierarchy);
+
+return mf__$1;
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_methods$arity$1 = (function (mf){
+var self__ = this;
+var mf__$1 = this;
+return cljs.core.deref(self__.method_table);
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_prefers$arity$1 = (function (mf){
+var self__ = this;
+var mf__$1 = this;
+return cljs.core.deref(self__.prefer_table);
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_dispatch_fn$arity$1 = (function (mf){
+var self__ = this;
+var mf__$1 = this;
+return self__.dispatch_fn;
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_add_method$arity$3 = (function (mf,dispatch_val,method){
+var self__ = this;
+var mf__$1 = this;
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(self__.method_table,cljs.core.assoc,dispatch_val,method);
+
+cljs.core.reset_cache(self__.method_cache,self__.method_table,self__.cached_hierarchy,self__.hierarchy);
+
+return mf__$1;
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_reset$arity$1 = (function (mf){
+var self__ = this;
+var mf__$1 = this;
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(self__.method_table,((function (mf__$1){
+return (function (mf__$2){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(mf__$1))
+);
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(self__.method_cache,((function (mf__$1){
+return (function (mf__$2){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(mf__$1))
+);
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(self__.prefer_table,((function (mf__$1){
+return (function (mf__$2){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(mf__$1))
+);
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(self__.cached_hierarchy,((function (mf__$1){
+return (function (mf__$2){
+return null;
+});})(mf__$1))
+);
+
+return mf__$1;
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IMultiFn$_get_method$arity$2 = (function (mf,dispatch_val){
+var self__ = this;
+var mf__$1 = this;
+if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(cljs.core.deref(self__.cached_hierarchy),cljs.core.deref(self__.hierarchy))){
+} else {
+cljs.core.reset_cache(self__.method_cache,self__.method_table,self__.cached_hierarchy,self__.hierarchy);
+}
+
+var temp__4655__auto__ = (function (){var fexpr__12748 = cljs.core.deref(self__.method_cache);
+return (fexpr__12748.cljs$core$IFn$_invoke$arity$1 ? fexpr__12748.cljs$core$IFn$_invoke$arity$1(dispatch_val) : fexpr__12748.call(null,dispatch_val));
+})();
+if(cljs.core.truth_(temp__4655__auto__)){
+var target_fn = temp__4655__auto__;
+return target_fn;
+} else {
+return cljs.core.find_and_cache_best_method(self__.name,dispatch_val,self__.hierarchy,self__.method_table,self__.prefer_table,self__.method_cache,self__.cached_hierarchy,self__.default_dispatch_val);
+}
+});
+
+cljs.core.MultiFn.prototype.cljs$core$INamed$_name$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core._name(self__.name);
+});
+
+cljs.core.MultiFn.prototype.cljs$core$INamed$_namespace$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return cljs.core._namespace(self__.name);
+});
+
+cljs.core.MultiFn.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return goog.getUid(this$__$1);
+});
+
+cljs.core.MultiFn.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 8, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"name","name",-810760592,null),new cljs.core.Symbol(null,"dispatch-fn","dispatch-fn",-1401088155,null),new cljs.core.Symbol(null,"default-dispatch-val","default-dispatch-val",-1231201266,null),new cljs.core.Symbol(null,"hierarchy","hierarchy",587061186,null),new cljs.core.Symbol(null,"method-table","method-table",-1878263165,null),new cljs.core.Symbol(null,"prefer-table","prefer-table",462168584,null),new cljs.core.Symbol(null,"method-cache","method-cache",1230193905,null),new cljs.core.Symbol(null,"cached-hierarchy","cached-hierarchy",-1085460203,null)], null);
+});
+
+cljs.core.MultiFn.cljs$lang$type = true;
+
+cljs.core.MultiFn.cljs$lang$ctorStr = "cljs.core/MultiFn";
+
+cljs.core.MultiFn.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/MultiFn");
+});
+
+/**
+ * Positional factory function for cljs.core/MultiFn.
+ */
+cljs.core.__GT_MultiFn = (function cljs$core$__GT_MultiFn(name,dispatch_fn,default_dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy){
+return (new cljs.core.MultiFn(name,dispatch_fn,default_dispatch_val,hierarchy,method_table,prefer_table,method_cache,cached_hierarchy));
+});
+
+/**
+ * Removes all of the methods of multimethod.
+ */
+cljs.core.remove_all_methods = (function cljs$core$remove_all_methods(multifn){
+return cljs.core._reset(multifn);
+});
+/**
+ * Removes the method of multimethod associated with dispatch-value.
+ */
+cljs.core.remove_method = (function cljs$core$remove_method(multifn,dispatch_val){
+return cljs.core._remove_method(multifn,dispatch_val);
+});
+/**
+ * Causes the multimethod to prefer matches of dispatch-val-x over dispatch-val-y
+ * when there is a conflict
+ */
+cljs.core.prefer_method = (function cljs$core$prefer_method(multifn,dispatch_val_x,dispatch_val_y){
+return cljs.core._prefer_method(multifn,dispatch_val_x,dispatch_val_y);
+});
+/**
+ * Given a multimethod, returns a map of dispatch values -> dispatch fns
+ */
+cljs.core.methods$ = (function cljs$core$methods(multifn){
+return cljs.core._methods(multifn);
+});
+/**
+ * Given a multimethod and a dispatch value, returns the dispatch fn
+ * that would apply to that value, or nil if none apply and no default
+ */
+cljs.core.get_method = (function cljs$core$get_method(multifn,dispatch_val){
+return cljs.core._get_method(multifn,dispatch_val);
+});
+/**
+ * Given a multimethod, returns a map of preferred value -> set of other values
+ */
+cljs.core.prefers = (function cljs$core$prefers(multifn){
+return cljs.core._prefers(multifn);
+});
+/**
+ * Given a multimethod, return it's default-dispatch-val.
+ */
+cljs.core.default_dispatch_val = (function cljs$core$default_dispatch_val(multifn){
+return cljs.core._default_dispatch_val(multifn);
+});
+/**
+ * Given a multimethod, return it's dispatch-fn.
+ */
+cljs.core.dispatch_fn = (function cljs$core$dispatch_fn(multifn){
+return cljs.core._dispatch_fn(multifn);
+});
+
+/**
+ * A marker protocol for UUIDs
+ * @interface
+ */
+cljs.core.IUUID = function(){};
+
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IPrintWithWriter}
+ * @implements {cljs.core.IComparable}
+ * @implements {cljs.core.IUUID}
+*/
+cljs.core.UUID = (function (uuid,__hash){
+this.uuid = uuid;
+this.__hash = __hash;
+this.cljs$lang$protocol_mask$partition0$ = 2153775104;
+this.cljs$lang$protocol_mask$partition1$ = 2048;
+});
+cljs.core.UUID.prototype.cljs$core$IUUID$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.UUID.prototype.toString = (function (){
+var self__ = this;
+var _ = this;
+return self__.uuid;
+});
+
+cljs.core.UUID.prototype.equiv = (function (other){
+var self__ = this;
+var this$ = this;
+return this$.cljs$core$IEquiv$_equiv$arity$2(null,other);
+});
+
+cljs.core.UUID.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (_,other){
+var self__ = this;
+var ___$1 = this;
+return (((other instanceof cljs.core.UUID)) && ((self__.uuid === other.uuid)));
+});
+
+cljs.core.UUID.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (_,writer,___$1){
+var self__ = this;
+var ___$2 = this;
+return cljs.core._write(writer,["#uuid \"",cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.uuid),"\""].join(''));
+});
+
+cljs.core.UUID.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+if((self__.__hash == null)){
+self__.__hash = cljs.core.hash(self__.uuid);
+} else {
+}
+
+return self__.__hash;
+});
+
+cljs.core.UUID.prototype.cljs$core$IComparable$_compare$arity$2 = (function (_,other){
+var self__ = this;
+var ___$1 = this;
+var G__12750 = self__.uuid;
+var G__12751 = other.uuid;
+return goog.array.defaultCompare(G__12750,G__12751);
+});
+
+cljs.core.UUID.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"uuid","uuid",-504564192,null),cljs.core.with_meta(new cljs.core.Symbol(null,"__hash","__hash",-1328796629,null),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"mutable","mutable",875778266),true], null))], null);
+});
+
+cljs.core.UUID.cljs$lang$type = true;
+
+cljs.core.UUID.cljs$lang$ctorStr = "cljs.core/UUID";
+
+cljs.core.UUID.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/UUID");
+});
+
+/**
+ * Positional factory function for cljs.core/UUID.
+ */
+cljs.core.__GT_UUID = (function cljs$core$__GT_UUID(uuid,__hash){
+return (new cljs.core.UUID(uuid,__hash));
+});
+
+cljs.core.uuid = (function cljs$core$uuid(s){
+if(typeof s === 'string'){
+} else {
+throw (new Error("Assert failed: (string? s)"));
+}
+
+return (new cljs.core.UUID(s.toLowerCase(),null));
+});
+cljs.core.random_uuid = (function cljs$core$random_uuid(){
+var hex = (function cljs$core$random_uuid_$_hex(){
+return cljs.core.rand_int((16)).toString((16));
+});
+var rhex = ((8) | ((3) & cljs.core.rand_int((16)))).toString((16));
+return cljs.core.uuid([cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),"-",cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),"-","4",cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),"-",cljs.core.str.cljs$core$IFn$_invoke$arity$1(rhex),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),"-",cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex())].join(''));
+});
+cljs.core.uuid_QMARK_ = (function cljs$core$uuid_QMARK_(x){
+if((!((x == null)))){
+if(((false) || ((cljs.core.PROTOCOL_SENTINEL === x.cljs$core$IUUID$)))){
+return true;
+} else {
+return false;
+}
+} else {
+return false;
+}
+});
+cljs.core.pr_writer_ex_info = (function cljs$core$pr_writer_ex_info(obj,writer,opts){
+cljs.core._write(writer,"#error {:message ");
+
+cljs.core.pr_writer(obj.message,writer,opts);
+
+if(cljs.core.truth_(obj.data)){
+cljs.core._write(writer,", :data ");
+
+cljs.core.pr_writer(obj.data,writer,opts);
+} else {
+}
+
+if(cljs.core.truth_(obj.cause)){
+cljs.core._write(writer,", :cause ");
+
+cljs.core.pr_writer(obj.cause,writer,opts);
+} else {
+}
+
+return cljs.core._write(writer,"}");
+});
+/**
+ * @constructor
+ */
+cljs.core.ExceptionInfo = (function cljs$core$ExceptionInfo(message,data,cause){
+var e = (new Error(message));
+var this$ = this;
+this$.message = message;
+
+this$.data = data;
+
+this$.cause = cause;
+
+this$.name = e.name;
+
+this$.description = e.description;
+
+this$.number = e.number;
+
+this$.fileName = e.fileName;
+
+this$.lineNumber = e.lineNumber;
+
+this$.columnNumber = e.columnNumber;
+
+this$.stack = e.stack;
+
+return this$;
+});
+cljs.core.ExceptionInfo.prototype.__proto__ = Error.prototype;
+cljs.core.ExceptionInfo.prototype.cljs$core$IPrintWithWriter$ = cljs.core.PROTOCOL_SENTINEL;
+
+cljs.core.ExceptionInfo.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (obj,writer,opts){
+var obj__$1 = this;
+return cljs.core.pr_writer_ex_info(obj__$1,writer,opts);
+});
+cljs.core.ExceptionInfo.prototype.toString = (function (){
+var this$ = this;
+return cljs.core.pr_str_STAR_(this$);
+});
+/**
+ * Create an instance of ExceptionInfo, an Error type that carries a
+ * map of additional data.
+ */
+cljs.core.ex_info = (function cljs$core$ex_info(var_args){
+var G__12754 = arguments.length;
+switch (G__12754) {
+case 2:
+return cljs.core.ex_info.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.ex_info.cljs$core$IFn$_invoke$arity$2 = (function (msg,data){
+return cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3(msg,data,null);
+});
+
+cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3 = (function (msg,data,cause){
+return (new cljs.core.ExceptionInfo(msg,data,cause));
+});
+
+cljs.core.ex_info.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Returns exception data (a map) if ex is an ExceptionInfo.
+ * Otherwise returns nil.
+ */
+cljs.core.ex_data = (function cljs$core$ex_data(ex){
+if((ex instanceof cljs.core.ExceptionInfo)){
+return ex.data;
+} else {
+return null;
+}
+});
+/**
+ * Returns the message attached to the given Error / ExceptionInfo object.
+ * For non-Errors returns nil.
+ */
+cljs.core.ex_message = (function cljs$core$ex_message(ex){
+if((ex instanceof Error)){
+return ex.message;
+} else {
+return null;
+}
+});
+/**
+ * Returns exception cause (an Error / ExceptionInfo) if ex is an
+ * ExceptionInfo.
+ * Otherwise returns nil.
+ */
+cljs.core.ex_cause = (function cljs$core$ex_cause(ex){
+if((ex instanceof cljs.core.ExceptionInfo)){
+return ex.cause;
+} else {
+return null;
+}
+});
+/**
+ * Returns an JavaScript compatible comparator based upon pred.
+ */
+cljs.core.comparator = (function cljs$core$comparator(pred){
+return (function (x,y){
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$2 ? pred.cljs$core$IFn$_invoke$arity$2(x,y) : pred.call(null,x,y)))){
+return (-1);
+} else {
+if(cljs.core.truth_((pred.cljs$core$IFn$_invoke$arity$2 ? pred.cljs$core$IFn$_invoke$arity$2(y,x) : pred.call(null,y,x)))){
+return (1);
+} else {
+return (0);
+
+}
+}
+});
+});
+/**
+ * Returns true if x names a special form
+ */
+cljs.core.special_symbol_QMARK_ = (function cljs$core$special_symbol_QMARK_(x){
+return cljs.core.contains_QMARK_(new cljs.core.PersistentHashSet(null, new cljs.core.PersistentArrayMap(null, 24, [new cljs.core.Symbol(null,"&","&",-2144855648,null),"null",new cljs.core.Symbol(null,"case*","case*",-1938255072,null),"null",new cljs.core.Symbol(null,"defrecord*","defrecord*",-1936366207,null),"null",new cljs.core.Symbol(null,"try","try",-1273693247,null),"null",new cljs.core.Symbol(null,"ns*","ns*",1840949383,null),"null",new cljs.core.Symbol(null,"finally","finally",-1065347064,null),"null",new cljs.core.Symbol(null,"loop*","loop*",615029416,null),"null",new cljs.core.Symbol(null,"do","do",1686842252,null),"null",new cljs.core.Symbol(null,"letfn*","letfn*",-110097810,null),"null",new cljs.core.Symbol(null,"if","if",1181717262,null),"null",new cljs.core.Symbol(null,"new","new",-444906321,null),"null",new cljs.core.Symbol(null,"ns","ns",2082130287,null),"null",new cljs.core.Symbol(null,"deftype*","deftype*",962659890,null),"null",new cljs.core.Symbol(null,"let*","let*",1920721458,null),"null",new cljs.core.Symbol(null,"js*","js*",-1134233646,null),"null",new cljs.core.Symbol(null,"fn*","fn*",-752876845,null),"null",new cljs.core.Symbol(null,"recur","recur",1202958259,null),"null",new cljs.core.Symbol(null,"set!","set!",250714521,null),"null",new cljs.core.Symbol(null,".",".",1975675962,null),"null",new cljs.core.Symbol(null,"var","var",870848730,null),"null",new cljs.core.Symbol(null,"quote","quote",1377916282,null),"null",new cljs.core.Symbol(null,"catch","catch",-1616370245,null),"null",new cljs.core.Symbol(null,"throw","throw",595905694,null),"null",new cljs.core.Symbol(null,"def","def",597100991,null),"null"], null), null),x);
+});
+/**
+ * test [v] finds fn at key :test in var metadata and calls it,
+ * presuming failure will throw exception
+ */
+cljs.core.test = (function cljs$core$test(v){
+var f = v.cljs$lang$test;
+if(cljs.core.truth_(f)){
+(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null));
+
+return new cljs.core.Keyword(null,"ok","ok",967785236);
+} else {
+return new cljs.core.Keyword(null,"no-test","no-test",-1679482642);
+}
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+ * @implements {cljs.core.IPrintWithWriter}
+ * @implements {cljs.core.ILookup}
+*/
+cljs.core.TaggedLiteral = (function (tag,form){
+this.tag = tag;
+this.form = form;
+this.cljs$lang$protocol_mask$partition0$ = 2153775360;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.TaggedLiteral.prototype.toString = (function (){
+var self__ = this;
+var coll = this;
+return cljs.core.pr_str_STAR_(coll);
+});
+
+cljs.core.TaggedLiteral.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (this$,other){
+var self__ = this;
+var this$__$1 = this;
+return (((other instanceof cljs.core.TaggedLiteral)) && (cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(self__.tag,other.tag)) && (cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(self__.form,other.form)));
+});
+
+cljs.core.TaggedLiteral.prototype.cljs$core$IHash$_hash$arity$1 = (function (this$){
+var self__ = this;
+var this$__$1 = this;
+return (((31) * cljs.core.hash(self__.tag)) + cljs.core.hash(self__.form));
+});
+
+cljs.core.TaggedLiteral.prototype.cljs$core$ILookup$_lookup$arity$2 = (function (this$,v){
+var self__ = this;
+var this$__$1 = this;
+return this$__$1.cljs$core$ILookup$_lookup$arity$3(null,v,null);
+});
+
+cljs.core.TaggedLiteral.prototype.cljs$core$ILookup$_lookup$arity$3 = (function (this$,v,not_found){
+var self__ = this;
+var this$__$1 = this;
+var G__12756 = v;
+var G__12756__$1 = (((G__12756 instanceof cljs.core.Keyword))?G__12756.fqn:null);
+switch (G__12756__$1) {
+case "tag":
+return self__.tag;
+
+break;
+case "form":
+return self__.form;
+
+break;
+default:
+return not_found;
+
+}
+});
+
+cljs.core.TaggedLiteral.prototype.cljs$core$IPrintWithWriter$_pr_writer$arity$3 = (function (o,writer,opts){
+var self__ = this;
+var o__$1 = this;
+cljs.core._write(writer,["#",cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.tag)," "].join(''));
+
+return cljs.core.pr_writer(self__.form,writer,opts);
+});
+
+cljs.core.TaggedLiteral.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"tag","tag",350170304,null),new cljs.core.Symbol(null,"form","form",16469056,null)], null);
+});
+
+cljs.core.TaggedLiteral.cljs$lang$type = true;
+
+cljs.core.TaggedLiteral.cljs$lang$ctorStr = "cljs.core/TaggedLiteral";
+
+cljs.core.TaggedLiteral.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/TaggedLiteral");
+});
+
+/**
+ * Positional factory function for cljs.core/TaggedLiteral.
+ */
+cljs.core.__GT_TaggedLiteral = (function cljs$core$__GT_TaggedLiteral(tag,form){
+return (new cljs.core.TaggedLiteral(tag,form));
+});
+
+/**
+ * Return true if the value is the data representation of a tagged literal
+ */
+cljs.core.tagged_literal_QMARK_ = (function cljs$core$tagged_literal_QMARK_(value){
+return (value instanceof cljs.core.TaggedLiteral);
+});
+/**
+ * Construct a data representation of a tagged literal from a
+ * tag symbol and a form.
+ */
+cljs.core.tagged_literal = (function cljs$core$tagged_literal(tag,form){
+if((tag instanceof cljs.core.Symbol)){
+} else {
+throw (new Error("Assert failed: (symbol? tag)"));
+}
+
+return (new cljs.core.TaggedLiteral(tag,form));
+});
+/**
+ * @type {*}
+ */
+cljs.core.js_reserved_arr = ["arguments","abstract","await","boolean","break","byte","case","catch","char","class","const","continue","debugger","default","delete","do","double","else","enum","export","extends","final","finally","float","for","function","goto","if","implements","import","in","instanceof","int","interface","let","long","native","new","package","private","protected","public","return","short","static","super","switch","synchronized","this","throw","throws","transient","try","typeof","var","void","volatile","while","with","yield","methods","null","constructor"];
+/**
+ * @type {null|Object}
+ */
+cljs.core.js_reserved = null;
+cljs.core.js_reserved_QMARK_ = (function cljs$core$js_reserved_QMARK_(x){
+if((cljs.core.js_reserved == null)){
+cljs.core.js_reserved = cljs.core.reduce.cljs$core$IFn$_invoke$arity$3((function (p1__12758_SHARP_,p2__12759_SHARP_){
+goog.object.set(p1__12758_SHARP_,p2__12759_SHARP_,true);
+
+return p1__12758_SHARP_;
+}),({}),cljs.core.js_reserved_arr);
+} else {
+}
+
+return cljs.core.js_reserved.hasOwnProperty(x);
+});
+cljs.core.demunge_pattern = (function cljs$core$demunge_pattern(){
+if(cljs.core.truth_(cljs.core.DEMUNGE_PATTERN)){
+} else {
+cljs.core.DEMUNGE_PATTERN = (function (){var ks = cljs.core.sort.cljs$core$IFn$_invoke$arity$2((function (a,b){
+return (b.length - a.length);
+}),cljs.core.js_keys(cljs.core.DEMUNGE_MAP));
+var ks__$1 = ks;
+var ret = "";
+while(true){
+if(cljs.core.seq(ks__$1)){
+var G__12761 = cljs.core.next(ks__$1);
+var G__12762 = [cljs.core.str.cljs$core$IFn$_invoke$arity$1((function (){var G__12760 = ret;
+if((!((ret === "")))){
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(G__12760),"|"].join('');
+} else {
+return G__12760;
+}
+})()),cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.first(ks__$1))].join('');
+ks__$1 = G__12761;
+ret = G__12762;
+continue;
+} else {
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(ret),"|\\$"].join('');
+}
+break;
+}
+})();
+}
+
+return cljs.core.DEMUNGE_PATTERN;
+});
+cljs.core.munge_str = (function cljs$core$munge_str(name){
+var sb = (new goog.string.StringBuffer());
+var i_12763 = (0);
+while(true){
+if((i_12763 < name.length)){
+var c_12764 = name.charAt(i_12763);
+var sub_12765 = goog.object.get(cljs.core.CHAR_MAP,c_12764);
+if((!((sub_12765 == null)))){
+sb.append(sub_12765);
+} else {
+sb.append(c_12764);
+}
+
+var G__12766 = (i_12763 + (1));
+i_12763 = G__12766;
+continue;
+} else {
+}
+break;
+}
+
+return sb.toString();
+});
+cljs.core.munge = (function cljs$core$munge(name){
+var name_SINGLEQUOTE_ = cljs.core.munge_str(cljs.core.str.cljs$core$IFn$_invoke$arity$1(name));
+var name_SINGLEQUOTE___$1 = (((name_SINGLEQUOTE_ === ".."))?"_DOT__DOT_":(cljs.core.truth_(cljs.core.js_reserved_QMARK_(name_SINGLEQUOTE_))?[cljs.core.str.cljs$core$IFn$_invoke$arity$1(name_SINGLEQUOTE_),"$"].join(''):name_SINGLEQUOTE_
+));
+if((name instanceof cljs.core.Symbol)){
+return cljs.core.symbol.cljs$core$IFn$_invoke$arity$1(name_SINGLEQUOTE___$1);
+} else {
+return name_SINGLEQUOTE___$1;
+}
+});
+cljs.core.demunge_str = (function cljs$core$demunge_str(munged_name){
+var r = (new RegExp(cljs.core.demunge_pattern(),"g"));
+var munged_name__$1 = (cljs.core.truth_(goog.string.endsWith(munged_name,"$"))?munged_name.substring((0),(munged_name.length - (1))):munged_name);
+var ret = "";
+var last_match_end = (0);
+while(true){
+var temp__4655__auto__ = r.exec(munged_name__$1);
+if(cljs.core.truth_(temp__4655__auto__)){
+var match = temp__4655__auto__;
+var vec__12767 = match;
+var x = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__12767,(0),null);
+var G__12770 = [cljs.core.str.cljs$core$IFn$_invoke$arity$1(ret),cljs.core.str.cljs$core$IFn$_invoke$arity$1(munged_name__$1.substring(last_match_end,(r.lastIndex - x.length))),cljs.core.str.cljs$core$IFn$_invoke$arity$1((((x === "$"))?"/":goog.object.get(cljs.core.DEMUNGE_MAP,x)))].join('');
+var G__12771 = r.lastIndex;
+ret = G__12770;
+last_match_end = G__12771;
+continue;
+} else {
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(ret),cljs.core.str.cljs$core$IFn$_invoke$arity$1(munged_name__$1.substring(last_match_end,munged_name__$1.length))].join('');
+}
+break;
+}
+});
+cljs.core.demunge = (function cljs$core$demunge(name){
+var G__12773 = (function (){var name_SINGLEQUOTE_ = cljs.core.str.cljs$core$IFn$_invoke$arity$1(name);
+if((name_SINGLEQUOTE_ === "_DOT__DOT_")){
+return "..";
+} else {
+return cljs.core.demunge_str(name_SINGLEQUOTE_);
+}
+})();
+var fexpr__12772 = (((name instanceof cljs.core.Symbol))?cljs.core.symbol:cljs.core.str);
+return (fexpr__12772.cljs$core$IFn$_invoke$arity$1 ? fexpr__12772.cljs$core$IFn$_invoke$arity$1(G__12773) : fexpr__12772.call(null,G__12773));
+});
+if((typeof cljs !== 'undefined') && (typeof cljs.core !== 'undefined') && (typeof cljs.core.tapset !== 'undefined')){
+} else {
+/**
+ * @type {*}
+ */
+cljs.core.tapset = null;
+}
+cljs.core.maybe_init_tapset = (function cljs$core$maybe_init_tapset(){
+if((cljs.core.tapset == null)){
+return cljs.core.tapset = cljs.core.atom.cljs$core$IFn$_invoke$arity$1(cljs.core.PersistentHashSet.EMPTY);
+} else {
+return null;
+}
+});
+/**
+ * Adds f, a fn of one argument, to the tap set. This function will be called with
+ * anything sent via tap>. Remember f in order to remove-tap
+ */
+cljs.core.add_tap = (function cljs$core$add_tap(f){
+cljs.core.maybe_init_tapset();
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3(cljs.core.tapset,cljs.core.conj,f);
+
+return null;
+});
+/**
+ * Remove f from the tap set.
+ */
+cljs.core.remove_tap = (function cljs$core$remove_tap(f){
+cljs.core.maybe_init_tapset();
+
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3(cljs.core.tapset,cljs.core.disj,f);
+
+return null;
+});
+/**
+ * Sends x to any taps. Returns the result of *exec-tap-fn*, a Boolean value.
+ */
+cljs.core.tap_GT_ = (function cljs$core$tap_GT_(x){
+cljs.core.maybe_init_tapset();
+
+return (cljs.core._STAR_exec_tap_fn_STAR_.cljs$core$IFn$_invoke$arity$1 ? cljs.core._STAR_exec_tap_fn_STAR_.cljs$core$IFn$_invoke$arity$1((function (){
+var seq__12774 = cljs.core.seq(cljs.core.deref(cljs.core.tapset));
+var chunk__12775 = null;
+var count__12776 = (0);
+var i__12777 = (0);
+while(true){
+if((i__12777 < count__12776)){
+var tap = chunk__12775.cljs$core$IIndexed$_nth$arity$2(null,i__12777);
+try{(tap.cljs$core$IFn$_invoke$arity$1 ? tap.cljs$core$IFn$_invoke$arity$1(x) : tap.call(null,x));
+}catch (e12778){if((e12778 instanceof Error)){
+var ex_12780 = e12778;
+} else {
+throw e12778;
+
+}
+}
+
+var G__12781 = seq__12774;
+var G__12782 = chunk__12775;
+var G__12783 = count__12776;
+var G__12784 = (i__12777 + (1));
+seq__12774 = G__12781;
+chunk__12775 = G__12782;
+count__12776 = G__12783;
+i__12777 = G__12784;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__12774);
+if(temp__4657__auto__){
+var seq__12774__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__12774__$1)){
+var c__8664__auto__ = cljs.core.chunk_first(seq__12774__$1);
+var G__12785 = cljs.core.chunk_rest(seq__12774__$1);
+var G__12786 = c__8664__auto__;
+var G__12787 = cljs.core.count(c__8664__auto__);
+var G__12788 = (0);
+seq__12774 = G__12785;
+chunk__12775 = G__12786;
+count__12776 = G__12787;
+i__12777 = G__12788;
+continue;
+} else {
+var tap = cljs.core.first(seq__12774__$1);
+try{(tap.cljs$core$IFn$_invoke$arity$1 ? tap.cljs$core$IFn$_invoke$arity$1(x) : tap.call(null,x));
+}catch (e12779){if((e12779 instanceof Error)){
+var ex_12789 = e12779;
+} else {
+throw e12779;
+
+}
+}
+
+var G__12790 = cljs.core.next(seq__12774__$1);
+var G__12791 = null;
+var G__12792 = (0);
+var G__12793 = (0);
+seq__12774 = G__12790;
+chunk__12775 = G__12791;
+count__12776 = G__12792;
+i__12777 = G__12793;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+})) : cljs.core._STAR_exec_tap_fn_STAR_.call(null,(function (){
+var seq__12774 = cljs.core.seq(cljs.core.deref(cljs.core.tapset));
+var chunk__12775 = null;
+var count__12776 = (0);
+var i__12777 = (0);
+while(true){
+if((i__12777 < count__12776)){
+var tap = chunk__12775.cljs$core$IIndexed$_nth$arity$2(null,i__12777);
+try{(tap.cljs$core$IFn$_invoke$arity$1 ? tap.cljs$core$IFn$_invoke$arity$1(x) : tap.call(null,x));
+}catch (e12778){if((e12778 instanceof Error)){
+var ex_12794 = e12778;
+} else {
+throw e12778;
+
+}
+}
+
+var G__12795 = seq__12774;
+var G__12796 = chunk__12775;
+var G__12797 = count__12776;
+var G__12798 = (i__12777 + (1));
+seq__12774 = G__12795;
+chunk__12775 = G__12796;
+count__12776 = G__12797;
+i__12777 = G__12798;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq(seq__12774);
+if(temp__4657__auto__){
+var seq__12774__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_(seq__12774__$1)){
+var c__8664__auto__ = cljs.core.chunk_first(seq__12774__$1);
+var G__12799 = cljs.core.chunk_rest(seq__12774__$1);
+var G__12800 = c__8664__auto__;
+var G__12801 = cljs.core.count(c__8664__auto__);
+var G__12802 = (0);
+seq__12774 = G__12799;
+chunk__12775 = G__12800;
+count__12776 = G__12801;
+i__12777 = G__12802;
+continue;
+} else {
+var tap = cljs.core.first(seq__12774__$1);
+try{(tap.cljs$core$IFn$_invoke$arity$1 ? tap.cljs$core$IFn$_invoke$arity$1(x) : tap.call(null,x));
+}catch (e12779){if((e12779 instanceof Error)){
+var ex_12803 = e12779;
+} else {
+throw e12779;
+
+}
+}
+
+var G__12804 = cljs.core.next(seq__12774__$1);
+var G__12805 = null;
+var G__12806 = (0);
+var G__12807 = (0);
+seq__12774 = G__12804;
+chunk__12775 = G__12805;
+count__12776 = G__12806;
+i__12777 = G__12807;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+})));
+});
+/**
+ * Bootstrap only.
+ */
+cljs.core.ns_lookup = (function cljs$core$ns_lookup(ns_obj,k){
+return (function (){
+return goog.object.get(ns_obj,k);
+});
+});
+
+/**
+* @constructor
+ * @implements {cljs.core.IEquiv}
+ * @implements {cljs.core.IHash}
+*/
+cljs.core.Namespace = (function (obj,name){
+this.obj = obj;
+this.name = name;
+this.cljs$lang$protocol_mask$partition0$ = 6291456;
+this.cljs$lang$protocol_mask$partition1$ = 0;
+});
+cljs.core.Namespace.prototype.findInternedVar = (function (sym){
+var self__ = this;
+var this$ = this;
+var k = cljs.core.munge(cljs.core.str.cljs$core$IFn$_invoke$arity$1(sym));
+if(goog.object.containsKey(self__.obj,k)){
+var var_sym = cljs.core.symbol.cljs$core$IFn$_invoke$arity$2(cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.name),cljs.core.str.cljs$core$IFn$_invoke$arity$1(sym));
+var var_meta = new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"ns","ns",441598760),this$], null);
+return (new cljs.core.Var(cljs.core.ns_lookup(self__.obj,k),var_sym,var_meta));
+} else {
+return null;
+}
+});
+
+cljs.core.Namespace.prototype.getName = (function (){
+var self__ = this;
+var _ = this;
+return self__.name;
+});
+
+cljs.core.Namespace.prototype.toString = (function (){
+var self__ = this;
+var _ = this;
+return cljs.core.str.cljs$core$IFn$_invoke$arity$1(self__.name);
+});
+
+cljs.core.Namespace.prototype.cljs$core$IEquiv$_equiv$arity$2 = (function (_,other){
+var self__ = this;
+var ___$1 = this;
+if((other instanceof cljs.core.Namespace)){
+return cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(self__.name,other.name);
+} else {
+return false;
+}
+});
+
+cljs.core.Namespace.prototype.cljs$core$IHash$_hash$arity$1 = (function (_){
+var self__ = this;
+var ___$1 = this;
+return cljs.core.hash(self__.name);
+});
+
+cljs.core.Namespace.getBasis = (function (){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"obj","obj",-1672671807,null),new cljs.core.Symbol(null,"name","name",-810760592,null)], null);
+});
+
+cljs.core.Namespace.cljs$lang$type = true;
+
+cljs.core.Namespace.cljs$lang$ctorStr = "cljs.core/Namespace";
+
+cljs.core.Namespace.cljs$lang$ctorPrWriter = (function (this__8437__auto__,writer__8438__auto__,opt__8439__auto__){
+return cljs.core._write(writer__8438__auto__,"cljs.core/Namespace");
+});
+
+/**
+ * Positional factory function for cljs.core/Namespace.
+ */
+cljs.core.__GT_Namespace = (function cljs$core$__GT_Namespace(obj,name){
+return (new cljs.core.Namespace(obj,name));
+});
+
+/**
+ * Bootstrap only.
+ * @type {*}
+ */
+cljs.core.NS_CACHE = null;
+/**
+ * Bootstrap only.
+ */
+cljs.core.find_ns_obj_STAR_ = (function cljs$core$find_ns_obj_STAR_(ctxt,xs){
+while(true){
+if((ctxt == null)){
+return null;
+} else {
+if((xs == null)){
+return ctxt;
+} else {
+var G__12810 = (function (){var G__12808 = ctxt;
+var G__12809 = cljs.core.first(xs);
+return goog.object.get(G__12808,G__12809);
+})();
+var G__12811 = cljs.core.next(xs);
+ctxt = G__12810;
+xs = G__12811;
+continue;
+
+}
+}
+break;
+}
+});
+/**
+ * Bootstrap only.
+ */
+cljs.core.find_ns_obj = (function cljs$core$find_ns_obj(ns){
+var munged_ns = cljs.core.munge(cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns));
+var segs = munged_ns.split(".");
+var G__12812 = cljs.core._STAR_target_STAR_;
+switch (G__12812) {
+case "nodejs":
+if(COMPILED){
+return cljs.core.find_ns_obj_STAR_((function (){try{var ctxt = eval(cljs.core.first(segs));
+if(cljs.core.truth_((function (){var and__7791__auto__ = ctxt;
+if(cljs.core.truth_(and__7791__auto__)){
+return cljs.core.object_QMARK_(ctxt);
+} else {
+return and__7791__auto__;
+}
+})())){
+return ctxt;
+} else {
+return null;
+}
+}catch (e12813){if((e12813 instanceof ReferenceError)){
+var e = e12813;
+return null;
+} else {
+throw e12813;
+
+}
+}})(),cljs.core.next(segs));
+} else {
+return cljs.core.find_ns_obj_STAR_(goog.global,segs);
+}
+
+break;
+case "default":
+case "webworker":
+return cljs.core.find_ns_obj_STAR_(goog.global,segs);
+
+break;
+default:
+throw (new Error(["find-ns-obj not supported for target ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core._STAR_target_STAR_)].join('')));
+
+}
+});
+/**
+ * Returns a map of the intern mappings for the namespace.
+ * Bootstrap only.
+ */
+cljs.core.ns_interns_STAR_ = (function cljs$core$ns_interns_STAR_(sym){
+var ns_obj = cljs.core.find_ns_obj(sym);
+var ns = (new cljs.core.Namespace(ns_obj,sym));
+var step = ((function (ns_obj,ns){
+return (function cljs$core$ns_interns_STAR__$_step(ret,k){
+var var_sym = cljs.core.symbol.cljs$core$IFn$_invoke$arity$1(cljs.core.demunge(k));
+return cljs.core.assoc.cljs$core$IFn$_invoke$arity$3(ret,var_sym,(new cljs.core.Var(((function (var_sym,ns_obj,ns){
+return (function (){
+return goog.object.get(ns_obj,k);
+});})(var_sym,ns_obj,ns))
+,cljs.core.symbol.cljs$core$IFn$_invoke$arity$2(cljs.core.str.cljs$core$IFn$_invoke$arity$1(sym),cljs.core.str.cljs$core$IFn$_invoke$arity$1(var_sym)),new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"ns","ns",441598760),ns], null))));
+});})(ns_obj,ns))
+;
+return cljs.core.reduce.cljs$core$IFn$_invoke$arity$3(step,cljs.core.PersistentArrayMap.EMPTY,cljs.core.js_keys(ns_obj));
+});
+/**
+ * Create a new namespace named by the symbol. Bootstrap only.
+ */
+cljs.core.create_ns = (function cljs$core$create_ns(var_args){
+var G__12816 = arguments.length;
+switch (G__12816) {
+case 1:
+return cljs.core.create_ns.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+cljs.core.create_ns.cljs$core$IFn$_invoke$arity$1 = (function (sym){
+return cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2(sym,cljs.core.find_ns_obj(sym));
+});
+
+cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2 = (function (sym,ns_obj){
+return (new cljs.core.Namespace(ns_obj,sym));
+});
+
+cljs.core.create_ns.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns the namespace named by the symbol or nil if it doesn't exist.
+ * Bootstrap only.
+ */
+cljs.core.find_ns = (function cljs$core$find_ns(ns){
+if((cljs.core.NS_CACHE == null)){
+cljs.core.NS_CACHE = cljs.core.atom.cljs$core$IFn$_invoke$arity$1(cljs.core.PersistentArrayMap.EMPTY);
+} else {
+}
+
+var the_ns = cljs.core.get.cljs$core$IFn$_invoke$arity$2(cljs.core.deref(cljs.core.NS_CACHE),ns);
+if((!((the_ns == null)))){
+return the_ns;
+} else {
+var ns_obj = cljs.core.find_ns_obj(ns);
+if((ns_obj == null)){
+return null;
+} else {
+var new_ns = cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2(ns,ns_obj);
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(cljs.core.NS_CACHE,cljs.core.assoc,ns,new_ns);
+
+return new_ns;
+}
+}
+});
+/**
+ * Returns the macros namespace named by the symbol or nil if it doesn't exist.
+ * Bootstrap only.
+ */
+cljs.core.find_macros_ns = (function cljs$core$find_macros_ns(ns){
+if((cljs.core.NS_CACHE == null)){
+cljs.core.NS_CACHE = cljs.core.atom.cljs$core$IFn$_invoke$arity$1(cljs.core.PersistentArrayMap.EMPTY);
+} else {
+}
+
+var ns_str = cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns);
+var ns__$1 = (((!(goog.string.contains(ns_str,"$macros"))))?cljs.core.symbol.cljs$core$IFn$_invoke$arity$1([cljs.core.str.cljs$core$IFn$_invoke$arity$1(ns_str),"$macros"].join('')):ns);
+var the_ns = cljs.core.get.cljs$core$IFn$_invoke$arity$2(cljs.core.deref(cljs.core.NS_CACHE),ns__$1);
+if((!((the_ns == null)))){
+return the_ns;
+} else {
+var ns_obj = cljs.core.find_ns_obj(ns__$1);
+if((ns_obj == null)){
+return null;
+} else {
+var new_ns = cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2(ns__$1,ns_obj);
+cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4(cljs.core.NS_CACHE,cljs.core.assoc,ns__$1,new_ns);
+
+return new_ns;
+}
+}
+});
+/**
+ * Returns the name of the namespace, a Namespace object.
+ * Bootstrap only.
+ */
+cljs.core.ns_name = (function cljs$core$ns_name(ns_obj){
+return ns_obj.name;
+});
+/**
+ * Returns true x is a goog.Uri instance.
+ */
+cljs.core.uri_QMARK_ = (function cljs$core$uri_QMARK_(x){
+return (x instanceof goog.Uri);
+});
+cljs.core.maybe_enable_print_BANG_ = (function cljs$core$maybe_enable_print_BANG_(){
+if((typeof console !== 'undefined')){
+return cljs.core.enable_console_print_BANG_();
+} else {
+if((((cljs.core._STAR_target_STAR_ === "nashorn")) || ((cljs.core._STAR_target_STAR_ === "graaljs")))){
+var system = Java.type("java.lang.System");
+cljs.core._STAR_print_newline_STAR_ = false;
+
+cljs.core.set_print_fn_BANG_(((function (system){
+return (function (){
+var xs = arguments;
+var s = goog.array.clone(xs).join("");
+return system.out.println(s);
+});})(system))
+);
+
+return cljs.core.set_print_err_fn_BANG_(((function (system){
+return (function (){
+var xs = arguments;
+var s = goog.array.clone(xs).join("");
+return system.error.println(s);
+});})(system))
+);
+} else {
+return null;
+}
+}
+});
+cljs.core.maybe_enable_print_BANG_();
+if((typeof cljs !== 'undefined') && (typeof cljs.core !== 'undefined') && (typeof cljs.core._STAR_eval_STAR_ !== 'undefined')){
+} else {
+/**
+ * Runtime environments may provide a way to evaluate ClojureScript
+ * forms. Whatever function *eval* is bound to will be passed any forms which
+ * should be evaluated.
+ */
+cljs.core._STAR_eval_STAR_ = (function cljs$core$_STAR_eval_STAR_(_){
+throw (new Error("cljs.core/*eval* not bound"));
+});
+}
+/**
+ * Evaluates the form data structure (not text!) and returns the result.
+ * Delegates to cljs.core/*eval*. Intended for use in self-hosted ClojureScript,
+ * which sets up an implementation of cljs.core/*eval* for that environment.
+ */
+cljs.core.eval = (function cljs$core$eval(form){
+return (cljs.core._STAR_eval_STAR_.cljs$core$IFn$_invoke$arity$1 ? cljs.core._STAR_eval_STAR_.cljs$core$IFn$_invoke$arity$1(form) : cljs.core._STAR_eval_STAR_.call(null,form));
+});
+
+//# sourceMappingURL=core.js.map
diff --git a/src/http/static/viz/2/cljs/core.js.map b/src/http/static/viz/2/cljs/core.js.map
new file mode 100644
index 0000000..f7ea5cc
--- /dev/null
+++ b/src/http/static/viz/2/cljs/core.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"out\/cljs\/core.js","sources":["core.cljs"],"lineCount":37633,"mappings":"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\/D;;;;;AAAA,AAAA,+CAAA,\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CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,gDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,gDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,CAAA,UAAA,OAAA,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\/CAAEuE,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEvE,iDAAAA;;AAVlB,MAAA,AAAAjD,2BAAA,cAUKqH;;;;;;AAVL,AAAA,kDAAA,lDAIGL,6DAOE,MAAK,EAAE,EAAE,EAAE,EAAE,EAAE;AAXpB,AAAA,GAAA,EAAA,GAAA,UAAA,aAAA,GAAA,CAAA,uCAAA,jEAWKK,0BAAAA;AAXL,OAWKA,oCAAAA,MAAKtE,EAAEuE,EAAEC,EAAEC,EAAEvE,EAAE\/F;;AAXpB,IAAA,kBAAA,EAAA,UAAA,OAAA,hBAWKmK,qBAAAA;IAXL,kBAAA,CAAA,AAAAJ,kBAAA,AAAAtH,YAAAuH;AAAA,AAAA,GAAA,GAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,mEAAAA,rBAWKE,+CAAAA,zCAAKtE,+CAAAA,7CAAEuE,+CAAAA,7CAAEC,+CAAAA,7CAAEC,+CAAAA,7CAAEvE,+CAAAA,7CAAE\/F,+CAAAA;;AAXpB,IAAA,sBAAA,CAAA,AAAA+J,kBAAA;AAAA,AAAA,GAAA,GAAA,CAAAE,uBAAA;AAAA,QAAAA,oDAAAA,uEAAAA,rBAWKE,mDAAAA,7CAAKtE,mDAAAA,jDAAEuE,mDAAAA,jDAAEC,mDAAAA,jDAAEC,mDAAAA,jDAAEvE,mDAAAA,jDAAE\/F,mDAAAA;;AAXpB,MAAA,AAAA8C,2BAAA,cAWKqH;;;;;;AAXL,AAAA,kDAAA,lDAIGL,6DAQE,MAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAZtB,AAAA,GAAA,EAAA,GAAA,UAAA,aAAA,GAAA,CAAA,uCAAA,jEAYKK,0BAAAA;AAZL,OAYKA,oCAAAA,MAAKtE,EAAEuE,EAAEC,EAAEC,EAAEvE,EAAE\/F,EAAEuK;;AAZtB,IAAA,kBAAA,EAAA,UAAA,OAAA,hBAYKJ,qBAAAA;IAZL,kBAAA,CAAA,AAAAJ,kBAAA,AAAAtH,YAAAuH;AAAA,AAAA,GAAA,GAAA,CAAAC,mBAAA;AAAA,QAAAA,gDAAAA,qEAAAA,vBAYKE,iDAAAA,3CAAKtE,iDAAAA,\/CAAEuE,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEvE,iDAAAA,\/CAAE\/F,iDAAAA,\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\/DAAEuE,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEvE,iEAAAA,\/DAAE\/F,iEAAAA,\/DAAEuK,iEAAAA,\/DAAEC,iEAAAA,\/DAAEpF,iEAAAA,\/DAAEqF,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA;;AAlBlC,MAAA,AAAA9H,2BAAA,cAkBKqH;;;;;;AAlBL,AAAA,mDAAA,nDAIGL,8DAeE,MAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAnBpC,AAAA,GAAA,EAAA,GAAA,UAAA,aAAA,GAAA,CAAA,wCAAA,lEAmBKK,0BAAAA;AAnBL,OAmBKA,qCAAAA,MAAKtE,EAAEuE,EAAEC,EAAEC,EAAEvE,EAAE\/F,EAAEuK,EAAEC,EAAEpF,EAAEqF,EAAEC,EAAEC,EAAEC,EAAEC;;AAnBpC,IAAA,kBAAA,EAAA,UAAA,OAAA,hBAmBKV,qBAAAA;IAnBL,kBAAA,CAAA,AAAAJ,kBAAA,AAAAtH,YAAAuH;AAAA,AAAA,GAAA,GAAA,CAAAC,mBAAA;AAAA,QAAAA,iDAAAA,oFAAAA,rCAmBKE,+DAAAA,zDAAKtE,+DAAAA,7DAAEuE,+DAAAA,7DAAEC,+DAAAA,7DAAEC,+DAAAA,7DAAEvE,+DAAAA,7DAAE\/F,+DAAAA,7DAAEuK,+DAAAA,7DAAEC,+DAAAA,7DAAEpF,+DAAAA,7DAAEqF,+DAAAA,7DAAEC,+DAAAA,7DAAEC,+DAAAA,7DAAEC,+DAAAA,7DAAEC,+DAAAA;;AAnBpC,IAAA,sBAAA,CAAA,AAAAd,kBAAA;AAAA,AAAA,GAAA,GAAA,CAAAE,uBAAA;AAAA,QAAAA,qDAAAA,wFAAAA,rCAmBKE,mEAAAA,7DAAKtE,mEAAAA,jEAAEuE,mEAAAA,jEAAEC,mEAAAA,jEAAEC,mEAAAA,jEAAEvE,mEAAAA,jEAAE\/F,mEAAAA,jEAAEuK,mEAAAA,jEAAEC,mEAAAA,jEAAEpF,mEAAAA,jEAAEqF,mEAAAA,jEAAEC,mEAAAA,jEAAEC,mEAAAA,jEAAEC,mEAAAA,jEAAEC,mEAAAA;;AAnBpC,MAAA,AAAA\/H,2BAAA,cAmBKqH;;;;;;AAnBL,AAAA,mDAAA,nDAIGL,8DAgBE,MAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AApBtC,AAAA,GAAA,EAAA,GAAA,UAAA,aAAA,GAAA,CAAA,wCAAA,lEAoBKK,0BAAAA;AApBL,OAoBKA,qCAAAA,MAAKtE,EAAEuE,EAAEC,EAAEC,EAAEvE,EAAE\/F,EAAEuK,EAAEC,EAAEpF,EAAEqF,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC;;AApBtC,IAAA,kBAAA,EAAA,UAAA,OAAA,hBAoBKX,qBAAAA;IApBL,kBAAA,CAAA,AAAAJ,kBAAA,AAAAtH,YAAAuH;AAAA,AAAA,GAAA,GAAA,CAAAC,mBAAA;AAAA,QAAAA,iDAAAA,sFAAAA,vCAoBKE,iEAAAA,3DAAKtE,iEAAAA,\/DAAEuE,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEvE,iEAAAA,\/DAAE\/F,iEAAAA,\/DAAEuK,iEAAAA,\/DAAEC,iEAAAA,\/DAAEpF,iEAAAA,\/DAAEqF,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\/DAAEC,iEAAAA,\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\/H,2BAAA,gBAESyI;;;;;;AAFT,AAAA,+CAAA,\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\/CAAKC,oDAAAA;;AAD\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\/BpB,AAAA,QAAA,JA+BY;AA\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\/CpC,AAAA,QAAA,JA+CY;AA\/CZ,AAgDI,IAAA,eAAC,CAACzQ,2CAAAA,6CAAAA;AAAF,AAAA,QAAAqS,8CAAAA,uEAAAA,3BAAO3T,kDAAAA,hDAAEuE,kDAAAA,hDAAEC,kDAAAA,hDAAEC,kDAAAA,hDAAEvE,kDAAAA,hDAAE\/F,kDAAAA,hDAAEuK,kDAAAA,hDAAEC,kDAAAA,hDAAEpF,kDAAAA,hDAAEqF,kDAAAA,hDAAEC,kDAAAA,hDAAEC,kDAAAA;;;AAhDjC,AAAA,AAAA,yDAAA,zDAASiN,oEAiDK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;;AAjDtC,AAAA,QAAA,JAiDY;AAjDZ,AAkDI,IAAA,eAAC,CAACzQ,2CAAAA,6CAAAA;AAAF,AAAA,QAAAuS,8CAAAA,yEAAAA,7BAAO7T,oDAAAA,lDAAEuE,oDAAAA,lDAAEC,oDAAAA,lDAAEC,oDAAAA,lDAAEvE,oDAAAA,lDAAE\/F,oDAAAA,lDAAEuK,oDAAAA,lDAAEC,oDAAAA,lDAAEpF,oDAAAA,lDAAEqF,oDAAAA,lDAAEC,oDAAAA,lDAAEC,oDAAAA,lDAAEC,oDAAAA;;;AAlDnC,AAAA,AAAA,yDAAA,zDAASgN,oEAmDK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;;AAnDxC,AAAA,QAAA,JAmDY;AAnDZ,AAoDI,IAAA,eAAC,CAACzQ,2CAAAA,6CAAAA;AAAF,AAAA,QAAAyS,8CAAAA,2EAAAA,\/BAAO\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\/DpD,AAAA,QAAA,JA+DY;AA\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\/J;;AAArB;;;;AAAA,OAAAiB,kCAAY8I,mBAAS\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\/D7B,AAAA,AAAA,+DAAA,\/DAASX,0EAwBC;;AAxBV,AAAA,eAAA,XAwBU;AAxBV,AAwBgB4J;;;AAxBhB,AAAA,AAAA,qEAAA,rEAAS5J,gFAgBE;;AAhBX,AAAA,YAAA,RAgBW;AAhBX,AAgBc,YAAAA,qBAAagB,WAAIL,SAAEiJ;;;AAhBjC,AAAA,AAAA,+DAAA,\/DAAS5J,0EAqCC;;AArCV,AAAA,YAAA,RAqCU;AArCV,AAqCa,GAAI,CAAG,YAAA,XAAKW,kBAAG,AAASK;AACtB,YAAAhB,iDAAA,5BAAagB,WAAI,YAAA,XAAKL;;AADxB;;;;AArCb,AAAA,AAAA,mEAAA,nEAASX,8EA0CE;;AA1CX,AAAA,YAAA,RA0CW;AA1CX,AA2CI,IAAA,kBAAA;IAAA,kBAAO,CAAG,AAASgB,oBAAKL;AAAxB,AAAA,SAAAwa,kBAAAC,mBAAAD,kBAAAC;;;AA3CJ,AAAA,AAAA,qEAAA,rEAASpb,gFAiFC;;AAjFV,AAAA,eAAA,XAiFU;AAjFV,AAkFI,IAAM,IAAE,AAAQ8G;AAAhB,AACE,GAAI,KAAA,JAAMlB;AACR,YAAAuW,kCAAA,nBAAOrV,SAAK,KAAA,JAAKlB;;AADnB;;;;AAnFN,AAAA,AAAA,+DAAA,\/DAAS5F,0EA8EC;;AA9EV,AAAA,eAAA,XA8EU;AA9EV,AA8EgB,OAACwX,4BAAkB1Q;;;AA9EnC,AAAA,AAAA,iEAAA,jEAAS9G,4EA2DE,KAAK;;AA3DhB,AAAA,eAAA,XA2DW;AA3DX,AA2DuB,OAAC+b,2BAAiBjV,SAAKwD;;;AA3D9C,AAAA,AAAA,+EAAA,\/EAAStK,0FAqEE;;AArEX,AAAA,eAAA,XAqEW;AArEX,AAqEiB,OAASic;;;AArE1B,AAAA,AAAA,mEAAA,nEAASjc,8EAwEG,KAAK;;AAxEjB,AAAA,eAAA,XAwEY;AAxEZ,AAyEI,OAACkc,qDAAalb,WAAIzF,EAAE,CAAMyF,WAAIL,WAAG,YAAA,XAAKA;;;AAzE1C,AAAA,AAAA,mEAAA,nEAASX,8EA0EG,KAAK,EAAE;;AA1EnB,AAAA,eAAA,XA0EY;AA1EZ,AA2EI,OAACkc,qDAAalb,WAAIzF,EAAEyO,MAAMrJ;;;AA3E9B,AAAA,AAAA,+DAAA,\/DAASX,0EA+BE;;AA\/BX,AAAA,YAAA,RA+BW;AA\/BX,AA+Bc,QAAMgB,WAAIL;;;AA\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\/CAAMge;AAAN,AAAA;;;AAAA,AAAA,+CAAA,\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\/gB;;;;;AAAA,AAAA,+CAAA,\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\/E;IAAM,UAAIA;;AAA\/C,AACE,GAAI,aAAA,ZAAOA;AACT2hB;;AACA,AAAI,CAAMA,GAAG5c,SAAE,CAAM6c,KAAKliB;;AACtB,eAAO,SAAA,RAAKA;eAAG,SAAA,RAAKqF;eAAG,WAAA,VAAK\/E;;;;;;;;;AAIzC,AAAe8hB,4BAAgB;AAE\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\/CAAeA,0DAIX,EAAE;AAJN,AAIS,QAAa\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\/B,AAAA,+DAAA,\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\/C,AAAA,YAAArY,eAAerS,KAAK2qB,MAAM\/tB,KAAK+Q,MAAgBid;;;AAAtCvY,AAmET;;;wBAAA,xBAAewY,wDAEZ;AAFH,AAGE,GAAA,GAAA,MAAA,LAAkB53B;AAAlB,GAAA,EAAA,CAAA,wCAAA,iBAAA,CAAAlC,gCAAA,1FAAkBkC,0FAAAA;AAAlB;;AAAA,GAAA,EAAA,AAAkBA;AAAlB,OAAAiB,kCAAY8M,gBAAM\/N;;AAAlB;;;;AAAA,OAAAiB,kCAAY8M,gBAAM\/N;;;AAEpB,IAAA,iBAAA,AAAcof;IAAd,iBAAA\/c;IAAA,iBAAA;;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAA6X,uBAAAqF;;;AAAA,AAAA,AAAAxL,gBAAA8jB,eAAAC,eAAAC;AAEA,AAAA;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,yCAAA,zCAASC;;AAAT,AAAA,WAAA,PAEa;AAFb,AAGI,OAAC5lB,uBAAQnI;;;AAHb,AAAA,AAAA,sCAAA,tCAAS+tB,iDAIM;;AAJf,AAAA,YAAA,RAIU;AAJV,AAKI,OAAQnvB,2CAAK4E;;;AALjB,AAAA,AAAA,wCAAA,xCAASuqB;;6BAMQ;;AANjB,AAAA,WAAA,PAMY;AANZ,AAOI,+DAAA,xDAAC5Z,iDAASnU,KAAKjK;;6BACF,EAAE;;AARnB,AAAA,WAAA,PAQY;AARZ,AASI,OAACoe,iDAASnU,KAAKjK,EAAEmN;;oBADJ,EAAE;;;6BAAF;;6BAAA,EAAE;;;;;;;;;;AARnB,AAAA,AAAA,4CAAA,5CAAS6qB;;6BAUY;;AAVrB,AAAA,WAAA,PAUgB;AAVhB,AAWI,OAACrZ,qDAAa1U,KAAKjK,EAAE,AAACqe,gBAAMpU;;6BACX,EAAE;;AAZvB,AAAA,WAAA,PAYgB;AAZhB,AAaI,OAAC0U,qDAAa1U,KAAKjK,EAAEmN;;oBADJ,EAAE;;;6BAAF;;6BAAA,EAAE;;;;;;;;;;AAZvB,AAAA,AAAA,8DAAA,9DAAS6qB,yEAwBC;;AAxBV,AAAA,eAAA,XAwBU;AAxBV,AAwBgBjrB;;;AAxBhB,AAAA,AAAA,oEAAA,pEAASirB,+EAkBE;;AAlBX,AAAA,YAAA,RAkBW;AAlBX,AAkBc,YAAAA,oBAAYjrB;;;AAlB1B,AAAA,AAAA,8DAAA,9DAASirB,yEA+BC;;AA\/BV,AAAA,eAAA,XA+BU;AA\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\/tB,YAAKguB;;;AArBjD,AAAA,AAAA,+DAAA,\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\/DT,AAAA,eAAA,XA+DS;AA\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\/BX,AAAA,eAAA,XA+BW;AA\/BX,AA+BiB,iEAAA,1DAAC5e,6CAAK8e;;;AA\/BvB,AAAA,AAAA,+DAAA,\/DAASF,0EAgCC;;AAhCV,AAAA,eAAA,XAgCU;AAhCV,AAiCI,GAAI,kCAAA,jCAAG,AAAC5xB,iBAAO8xB;AACb,YAAAF,kFAAA,5DAAc,AAAChrB,sBAAYkrB,cAAO\/hB,YAAKhN;;AACvC,GAAI,gBAAA,fAAMgN;AAAV;;AAEEA;;;;;AArCR,AAAA,AAAA,kEAAA,lEAAS6hB,6EA2BA;;AA3BT,AAAA,eAAA,XA2BS;AA3BT,AA2Be3xB;;;AA3Bf,AAAA,AAAA,+EAAA,\/EAAS2xB,0FA+CU;;AA\/CnB,AAAA,eAAA,XA+CmB;AA\/CnB,AA+CyBE;;;AA\/CzB,AAAA,AAAA,8EAAA,9EAASF,yFAgDS;;AAhDlB,AAAA,eAAA,XAgDkB;AAhDlB,AAiDI,GAAI,gBAAA,fAAM7hB;AAAV;;AAEEA;;;;AAnDN,AAAA,AAAA,yEAAA,zEAAS6hB,oFAgBM,KAAK;;AAhBpB,AAAA,eAAA,XAgBe;AAhBf,AAiBI,YAAAA,sBAAcE,aAAM\/hB,YAAKzQ,EAAEquB;;;AAjB\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\/\/B,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,0DAAA,1DAAO+\/B,qEAGH,EAAO;AAHX,AAIG,GAAI,SAAA,RAAMr5B;AACR,GAAI,AAAiC3J;AACnC,OAAgCA;;AAChC,OAAOA,OAAEA;;;AACX,OAACijC,wDAAgBjjC,EAAE,AAACkM,iBAAOvC,MAAM,AAAC9E,eAAK8E;;;;AAR5C,AAAA,0DAAA,1DAAOq5B,qEASH,EAAE,GAAQ;AATd,AAUG,GAAI,SAAA,RAAMr5B;AACR,GAAI,AAAiC3J;AACnC,OAAgCA,gCAAEkjC;;AAClC,OAAOljC,OAAEA,EAAEkjC;;;AACb,OAACC,wDAAgBnjC,EAAEkjC,GAAG,AAACh3B,iBAAOvC,MAAM,AAAC9E,eAAK8E;;;;AAd\/C,AAAA,0DAAA,1DAAOq5B,qEAeH,EAAE,GAAG,GAAQ;AAfjB,AAgBG,GAAI,SAAA,RAAMr5B;AACR,GAAI,AAAiC3J;AACnC,OAAgCA,gCAAEkjC,GAAGE;;AACrC,OAAOpjC,OAAEA,EAAEkjC,GAAGE;;;AAChB,OAACC,wDAAgBrjC,EAAEkjC,GAAGE,GAAG,AAACl3B,iBAAOvC,MAAM,AAAC9E,eAAK8E;;;;AApBlD,AAAA,0DAAA,1DAAOq5B,qEAqBH,EAAE,GAAG,GAAG,GAAQ;AArBpB,AAsBG,GAAI,SAAA,RAAMr5B;AACR,GAAI,AAAiC3J;AACnC,OAAgCA,gCAAEkjC,GAAGE,GAAGE;;AACxC,OAAOtjC,OAAEA,EAAEkjC,GAAGE,GAAGE;;;AACnB,OAACC,wDAAgBvjC,EAAEkjC,GAAGE,GAAGE,GAAG,AAACp3B,iBAAOvC,MAAM,AAAC9E,eAAK8E;;;;AA1BrD,AAAA,0DAAA,1DAAOq5B,qEA2BH,EAAE,GAAG,GAAG,GAAG,GAAQ;AA3BvB,AA4BG,GAAI,SAAA,RAAMr5B;AACR,GAAI,AAAiC3J;AACnC,OAAgCA,gCAAEkjC,GAAGE,GAAGE,GAAGE;;AAC3C,OAAOxjC,OAAEA,EAAEkjC,GAAGE,GAAGE,GAAGE;;;AACtB,IAAA,KAAA,AAAAt3B,iBAAyBvC;IAAzB,SAAA,AAAA9E,eAAyB8E;AAAzB,AAAA,GAAA,CAAA85B,UAAA;AAAA,GAAA,AAAqBzjC;AAArB,uCAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,5CAAqB1jC;;AAArB,gBAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,rBAAqB1jC,OAAAA;;;AAArB,IAAA,KAAA,AAAAkM,iBAAAu3B;IAAA,SAAA,AAAA5+B,eAAA4+B;AAAA,AAAA,GAAA,CAAAE,UAAA;AAAA,GAAA,AAAqB3jC;AAArB,uCAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,\/CAAqB5jC;;AAArB,gBAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,xBAAqB5jC,OAAAA;;;AAArB,IAAA,KAAA,AAAAkM,iBAAAy3B;IAAA,SAAA,AAAA9+B,eAAA8+B;AAAA,AAAA,GAAA,CAAAE,UAAA;AAAA,GAAA,AAAqB7jC;AAArB,uCAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,lDAAqB9jC;;AAArB,gBAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,3BAAqB9jC,OAAAA;;;AAArB,IAAA,KAAA,AAAAkM,iBAAA23B;IAAA,SAAA,AAAAh\/B,eAAAg\/B;AAAA,AAAA,GAAA,CAAAE,UAAA;AAAA,GAAA,AAAqB\/jC;AAArB,uCAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,rDAAqBhkC;;AAArB,gBAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,9BAAqBhkC,OAAAA;;;AAArB,IAAA,KAAA,AAAAkM,iBAAA63B;IAAA,SAAA,AAAAl\/B,eAAAk\/B;AAAA,AAAA,GAAA,CAAAE,UAAA;AAAA,GAAA,AAAqBjkC;AAArB,uCAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,xDAAqBlkC;;AAArB,gBAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,jCAAqBlkC,OAAAA;;;AAArB,IAAA,KAAA,AAAAkM,iBAAA+3B;IAAA,SAAA,AAAAp\/B,eAAAo\/B;AAAA,AAAA,GAAA,CAAAE,UAAA;AAAA,GAAA,AAAqBnkC;AAArB,wCAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,5DAAqBpkC;;AAArB,gBAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,pCAAqBpkC,OAAAA;;;AAArB,IAAA,MAAA,AAAAkM,iBAAAi4B;IAAA,UAAA,AAAAt\/B,eAAAs\/B;AAAA,AAAA,GAAA,CAAAE,WAAA;AAAA,GAAA,AAAqBrkC;AAArB,wCAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,\/DAAqBtkC;;AAArB,gBAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,vCAAqBtkC,OAAAA;;;AAArB,IAAA,MAAA,AAAAkM,iBAAAm4B;IAAA,UAAA,AAAAx\/B,eAAAw\/B;AAAA,AAAA,GAAA,CAAAE,WAAA;AAAA,GAAA,AAAqBvkC;AAArB,wCAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,IAAAE,nEAAqBxkC;;AAArB,gBAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,IAAAE,3CAAqBxkC,OAAAA;;;AAArB,IAAA,MAAA,AAAAkM,iBAAAq4B;IAAA,UAAA,AAAA1\/B,eAAA0\/B;AAAA,AAAA,GAAA,CAAAE,WAAA;AAAA,GAAA,AAAqBzkC;AAArB,wCAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,IAAAE,IAAAE,vEAAqB1kC;;AAArB,gBAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,IAAAE,IAAAE,\/CAAqB1kC,OAAAA;;;AAArB,IAAA,MAAA,AAAAkM,iBAAAu4B;IAAA,UAAA,AAAA5\/B,eAAA4\/B;AAAA,AAAA,GAAA,CAAAE,WAAA;AAAA,GAAA,AAAqB3kC;AAArB,wCAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,IAAAE,IAAAE,IAAAE,3EAAqB5kC;;AAArB,gBAAAkjC,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,GAAAE,IAAAE,IAAAE,IAAAE,nDAAqB5kC,OAAAA;;;AAArB,IAAA,MAAA,AAAAkM,iBAAAy4B;IAAA,UAAA,AAAA9\/B,eAAA8\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\/B;;;AAHb,AAAA,AAAA,mCAAA,nCAASm\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\/BAAKC,oCAAAA,\/BAAKC,oCAAAA,\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\/\/B;;;AAC\/BA;;AACJ,OAACD,uBAAQhN,EAAEiN;;;AAEf;;;;6BAAA,7BAAMggC,kEAIH,EAAE;AAJL,AAKE,IAAM,WAAS,AAAajtC;AAA5B,AACE,GAAU,aAAA,ZAAM+sC;AAAhB;AAAA,AACE,oBAAU,CAACA,yCAAAA,oDAAAA,bAAS9\/B,gCAAAA;AAApB;AAAA,AACE,MAAO,KAAA7P,MAAA;;;;AACX,IAAM,YAAU,AAAS4C;AAAzB,AACE,AAAM,AAASA,UAAGiN;;AAClB,GAAU,cAAA,bAAM,AAAWjN;AAA3B;AAAA,AACE,AAAC6K,0BAAgB7K,EAAEgtC,UAAU\/\/B;;;AAHjC,0FAIG+\/B,UAAU\/\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\/vC;;;AA\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\/EV,AAAA,AAAA,+DAAA,\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\/B,yBAAS4\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\/CAAMm8C;AAAN,AAAA;;;AAAA,AAAA,+CAAA,\/CAAMA,0DAIF;AAJJ,AAIQ\/3B;;;AAJR,AAAA,+CAAA,\/CAAM+3B,0DAKF,GAAG;AALP,AAMK,GAAA,GAAQ,OAAA,NAAM\/3B;AACZ,GAAI,EAAA,GAAA,OAAA,SAAA,EAAA,EAAA,CAAA,yCAAA,UAAA,CAAAjoB,gCAAA,sCAAA,KAAA,OAAA,1JAAiCioB,oBAAAA,oFAAAA;AACnC,OAACjZ,qBAAW,AAAC4xB,2BAAY,AAAC72B,+CAAOgI,sBAAO,AAAC4uB,qBAAU1Y,IAAIC,OAAO,AAACjC,eAAKgC;;AACpE,OAACle,+CAAOwC,gBAAM0b,GAAGC;;;AACnB,qEAAA,9DAACne,+CAAOuZ,oCAAQ4E;;;;AAVvB,AAAA,+CAAA,\/CAAM83B,0DAWF,GAAG,MAAM;AAXb,AAYK,GAAI,EAAA,GAAA,OAAA,SAAA,EAAA,EAAA,CAAA,yCAAA,UAAA,CAAAhgD,gCAAA,sCAAA,KAAA,OAAA,1JAAiCioB,oBAAAA,oFAAAA;AACnC,OAACjZ,qBAAW,AAAC4xB,2BAAY,AAAClT,kDAAUC,MAAMmT,qBAAM,AAACH,qBAAU1Y,IAAIC,OAAO,AAACjC,eAAKgC;;AAC5E,OAACyF,kDAAUC,MAAMrK,eAAK2E,GAAGC;;;;AAdhC,AAAA,yCAAA,zCAAM83B;;AAAN,AAgBA,AAAA;;;;;;;iBAAA,yBAAA,1CAAME;AAAN,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,6CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAA,yBAAA;AAAA,AAAA,IAAA,0BAAA,AAAA;AAAA,AAAA,IAAA,wBAAA;;AAAA,AAAA,GAAA,CAAAh7C,wBAAAC;AAAA,AAAA,AAAAC,4BAAA,CAAA,UAAAF;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA,uBAAA,KAAAG,qBAAA,AAAAD,6BAAA,KAAA,IAAA;AAAA,AAAA,OAAA86C,oDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA56C;;;;;AAAA,AAAA,+CAAA,\/CAAM46C,0DAMF,EAAE;AANN,AAOK,kCAAI,AAACn2C,+CAAO,WAAK,EAAE,vFACf62B;AADQ,AAAU,OAAC4f,mDAAMhzC,EAAE,CAAC5M,kCAAAA,qCAAAA,LAAE8K,iBAAAA;GAAK,qBAAA,rBAACi1B,uDAAcx0B;;;AAP3D,AAAA,+CAAA,\/CAAM+zC,0DASF,EAAE,GAAG;AATT,AAUK,oDAAA,7CAACO,8EAAQ,AAACrG,4CAAIx5C,EAAEk5C,GAAGC;;;AAVxB,AAAA,+CAAA,\/CAAMmG,0DAWF,EAAE,GAAG,GAAG;AAXZ,AAYK,oDAAA,7CAACO,8EAAQ,AAAC\/F,4CAAI95C,EAAEk5C,GAAGC,GAAGM;;;AAZ3B,AAAA,AAAA,sDAAA,tDAAM6F,iEAaF,EAAE,GAAG,GAAG,GAAK;AAbjB,AAcK,oDAAA,7CAACO,8EAAQ,AAACplC,qDAAM49B,cAAIr4C,EAAEk5C,GAAGC,GAAGM,qDAAGxN;;;AAdpC;AAAA,AAAA,mCAAA,WAAA,9CAAMqT;AAAN,AAAA,IAAA,WAAA,AAAA36C,gBAAA46C;IAAA,eAAA,AAAA16C,eAAA06C;IAAA,WAAA,AAAA56C,gBAAA46C;IAAA,eAAA,AAAA16C,eAAA06C;IAAA,WAAA,AAAA56C,gBAAA46C;IAAA,eAAA,AAAA16C,eAAA06C;IAAA,WAAA,AAAA56C,gBAAA46C;IAAA,eAAA,AAAA16C,eAAA06C;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAAz6C,wDAAA06C,SAAAC,SAAAC,SAAAC,SAAAJ;;;AAAA,AAAA,yCAAA,zCAAMD;;AAAN,AAgBA;;;;oBAAA,pBAAMQ,gDAGH,KAAK;AAHR,AAIE,kCAAI,AAAC32C,+CAAO,WAAK,EAAE,vFAGf62B;AAHQ,AAAU,oBAAI,CAACoM,qCAAAA,wCAAAA,LAAKthC,oBAAAA;AAAG,OAAC80C,mDAAMhzC,EAAE9B;;AAAG8B;;GACnC,qBAAA,rBAACmzB,uDACDx0B;;AAGd,AAAA;;;;;;;sBAAA,8BAAA,pDAAMy0C;AAAN,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA\/8C,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,oDAAA,pDAAM+8C,+DAMF,EAAE;AANN,AAOK,OAACC,kDAAUp1C,EAAEA,EAAEU;;;AAPpB,AAAA,oDAAA,pDAAMy0C,+DAQF,EAAE,KAAK;AARX,AASK,YAAA\/jB,kBAAA,KAAA;AAAA,AACE,IAAA,qBAAa,AAACnhB,cAAIvP;AAAlB,AAAA,GAAA+sB;AAAA,AAAA,QAAAA,JAAW;AAAX,AACE,IAAM,IAAE,AAACkiB,6CAAK3vC,EAAExH;AAAhB,AACE,GAAM,CAAIwH,MAAE,AAAC8U,gBAAMnd;AAAnB,AACE,OAACie,eAAKje,EAAE,AAACy9C,kDAAUp1C,EAAEovC,KAAK,AAACa,6CAAKb,KAAK52C;;AADvC;;;AAFJ;;GADF,KAAA;;;AATL,AAAA,oDAAA,pDAAM28C,+DAcF,EAAE,KAAK,IAAI;AAdf,AAeK,YAAA\/jB,kBAAA,KAAA;AAAA,AACE,IAAA,qBAAa,AAACnhB,cAAIvP;AAAlB,AAAA,GAAA+sB;AAAA,AAAA,QAAAA,JAAW;AAAX,AACE,IAAM,IAAE,AAACkiB,6CAAK3vC,EAAExH;AAAhB,AACE,GAAI,CAAIwH,MAAE,AAAC8U,gBAAMnd;AACf,OAACie,eAAKje,EAAE,AAAC09C,kDAAUr1C,EAAEovC,KAAKkG,IAAI,AAACrF,6CAAKb,KAAK52C;;AACzC,YAAAqd,eAAA,2GAAA,KAAA,IAAA,\/GAAM,AAAC85B,6CAAK3vC,EAAE,AAACu0B,+CAAO58B,EAAE29C;;;AAJ9B;;GADF,KAAA;;;AAfL,AAAA,8CAAA,9CAAMH;;AAAN,AAsBA,AAAA;;;;;mBAAA,2BAAA,9CAAMK;AAAN,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAp9C,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,iDAAA,jDAAMo9C,4DAMF,EAAE;AANN,AAOK,OAACl3C,+CAAOwa,cAAI\/Y,EAAEia;;;AAPnB,AAAA,iDAAA,jDAAMw7B,4DAQF,EAAE,GAAG;AART,AASK,IAAO,WAAS74B;IACT,QAAE5c;IACF,SAAG,AAACkQ,cAAI+J;;AAFf,AAGE,GAAA,GAAQ,WAAA,VAAMA;AACZ,IAAM,QAAE,AAACzN,4CAAIxM,MAAE,AAACjG,gBAAMkgB,QAAIy7B;AAA1B,AACE,GAAI,CAAYA,aAAS11C;AACvBmB;;AACA,eAAOu0C;eAAS11C;eAAE,AAAC\/F,eAAKggB;;;;;;;AAC5Bja;;;;;;AAjBT,AAAA,2CAAA,3CAAMy1C;;AAAN,AAmBA;;;;;qBAAA,+BAAA,pDAAMM,kDAIH,WAAW;AAJd,AAAA,IAAA,aAAAJ;IAAA,aAAA,AAAAzlC,cAAA0lC;IAAA,eAAA,AAAA77C,gBAAA87C;IAAA,iBAAA,AAAA57C,eAAA47C;QAAAC,JAIM;SAJND,LAIU;AAJV,AAKE,GAAI57B;AACF,OAACR,8CAAMzZ,EAAEF,EAAE,iBAAA,WAAU,AAACyM,4CAAIvM,EAAEF;IAAjB,WAAoBma;IAApB,WAAuBjY;AAAvB,AAAA,4GAAAg0C,SAAAC,SAAAC,yCAAAF,SAAAC,SAAAC,jLAACH,mDAAAA,+EAAAA;;;AACZ,OAACt8B,8CAAMzZ,EAAEF,EAAEkC;;;AAEf,AAAA;;;;;;;sBAAA,8BAAA,pDAAMo0C;AAAN,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAA,yBAAA;AAAA,AAAA,IAAA,0BAAA,AAAA;AAAA,AAAA,IAAA,wBAAA;;AAAA,AAAA,GAAA,CAAA18C,wBAAAC;AAAA,AAAA,AAAAC,4BAAA,CAAA,UAAAF;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA,uBAAA,KAAAG,qBAAA,AAAAD,6BAAA,KAAA,IAAA;AAAA,AAAA,OAAAw8C,yDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAt8C;;;;;AAAA,AAAA,oDAAA,aAAA,jEAAMs8C,+DAMF,WAAW;AANf,AAAA,IAAA,aAAAC;IAAA,aAAA,AAAAnmC,cAAAomC;IAAA,eAAA,AAAAv8C,gBAAAw8C;IAAA,iBAAA,AAAAt8C,eAAAs8C;QAAAC,JAMO;SANPD,LAMW;AANX,AAOG,GAAIt8B;AACF,OAACR,8CAAMzZ,EAAEF,EAAE,AAACk4C,kDAAU,AAACzrC,4CAAIvM,EAAEF,GAAGma,GAAG7kB;;AACnC,OAACqkB,8CAAMzZ,EAAEF,EAAE,iBAAA,WAAG,AAACyM,4CAAIvM,EAAEF;AAAV,AAAA,0EAAAm4C,wBAAAA,1FAAC7iD,kCAAAA,4CAAAA;;;;;AATjB,AAAA,oDAAA,aAAA,jEAAMghD,+DAUF,WAAW,EAAE;AAVjB,AAAA,IAAA,aAAAK;IAAA,aAAA,AAAAvmC,cAAAwmC;IAAA,eAAA,AAAA38C,gBAAA48C;IAAA,iBAAA,AAAA18C,eAAA08C;QAAAC,JAUO;SAVPD,LAUW;AAVX,AAWG,GAAI18B;AACF,OAACR,8CAAMzZ,EAAEF,EAAE,AAACo4C,kDAAU,AAAC3rC,4CAAIvM,EAAEF,GAAGma,GAAG7kB,EAAE6F;;AACrC,OAACwe,8CAAMzZ,EAAEF,EAAE,iBAAA,WAAG,AAACyM,4CAAIvM,EAAEF;IAAV,WAAa7E;AAAb,AAAA,0EAAAk9C,SAAAC,wBAAAD,SAAAC,5GAAChjD,kCAAAA,qDAAAA;;;;;AAbjB,AAAA,oDAAA,aAAA,jEAAMghD,+DAcF,WAAW,EAAE,EAAE;AAdnB,AAAA,IAAA,aAAAS;IAAA,aAAA,AAAA3mC,cAAA4mC;IAAA,eAAA,AAAA\/8C,gBAAAg9C;IAAA,iBAAA,AAAA98C,eAAA88C;QAAAC,JAcO;SAdPD,LAcW;AAdX,AAeG,GAAI98B;AACF,OAACR,8CAAMzZ,EAAEF,EAAE,AAACu4C,kDAAU,AAAC9rC,4CAAIvM,EAAEF,GAAGma,GAAG7kB,EAAE6F,EAAEuE;;AACvC,OAACia,8CAAMzZ,EAAEF,EAAE,iBAAA,WAAG,AAACyM,4CAAIvM,EAAEF;IAAV,WAAa7E;IAAb,WAAeuE;AAAf,AAAA,0EAAA84C,SAAAC,SAAAC,wBAAAF,SAAAC,SAAAC,9HAACpjD,kCAAAA,8DAAAA;;;;;AAjBjB,AAAA,oDAAA,aAAA,jEAAMghD,+DAkBF,WAAW,EAAE,EAAE,EAAE;AAlBrB,AAAA,IAAA,aAAAa;IAAA,aAAA,AAAA\/mC,cAAAgnC;IAAA,eAAA,AAAAn9C,gBAAAo9C;IAAA,iBAAA,AAAAl9C,eAAAk9C;QAAAC,JAkBO;SAlBPD,LAkBW;AAlBX,AAmBG,GAAIl9B;AACF,OAACR,8CAAMzZ,EAAEF,EAAE,AAAC24C,kDAAU,AAAClsC,4CAAIvM,EAAEF,GAAGma,GAAG7kB,EAAE6F,EAAEuE,EAAEC;;AACzC,OAACga,8CAAMzZ,EAAEF,EAAE,iBAAA,WAAG,AAACyM,4CAAIvM,EAAEF;IAAV,WAAa7E;IAAb,WAAeuE;IAAf,WAAiBC;AAAjB,AAAA,0EAAAi5C,SAAAC,SAAAC,SAAAC,wBAAAH,SAAAC,SAAAC,SAAAC,hJAACzjD,kCAAAA,uEAAAA;;;;;AArBjB,AAAA,AAAA,2DAAA,aAAA,xEAAMghD,sEAsBF,WAAW,EAAE,EAAE,EAAE,EAAI;AAtBzB,AAAA,IAAA,aAAAiB;IAAA,aAAA,AAAAnnC,cAAAonC;IAAA,eAAA,AAAAv9C,gBAAAw9C;IAAA,iBAAA,AAAAt9C,eAAAs9C;QAAAC,JAsBO;SAtBPD,LAsBW;AAtBX,AAuBG,GAAIt9B;AACF,OAACR,8CAAMzZ,EAAEF,EAAE,AAAC+P,qDAAMumC,oBAAU,AAAC7pC,4CAAIvM,EAAEF,GAAGma,GAAG7kB,EAAE6F,oDAAEuE,EAAEC,EAAEV;;AACjD,OAAC0a,8CAAMzZ,EAAEF,EAAE,AAAC+P,qDAAMza,EAAE,AAACmX,4CAAIvM,EAAEF,GAAG7E,EAAEuE,EAAEC,oDAAEV;;;;AAzBzC;AAAA,AAAA,wCAAA,WAAA,nDAAMq3C;AAAN,AAAA,IAAA,WAAA,AAAAr8C,gBAAA09C;IAAA,eAAA,AAAAx9C,eAAAw9C;IAAA,WAAA,AAAA19C,gBAAA09C;IAAA,eAAA,AAAAx9C,eAAAw9C;IAAA,WAAA,AAAA19C,gBAAA09C;IAAA,eAAA,AAAAx9C,eAAAw9C;IAAA,WAAA,AAAA19C,gBAAA09C;IAAA,eAAA,AAAAx9C,eAAAw9C;IAAA,WAAA,AAAA19C,gBAAA09C;IAAA,eAAA,AAAAx9C,eAAAw9C;IAAA,WAAA,AAAA19C,gBAAA09C;IAAA,eAAA,AAAAx9C,eAAAw9C;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAAv9C,wDAAAw9C,SAAAC,SAAAC,SAAAC,SAAAC,SAAAC,SAAAN;;;AAAA,AAAA,8CAAA,9CAAMrB;;AAAN,AA2BA,AAAA;;;;;;mBAAA,2BAAA,9CAAM2C;AAAN,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,+CAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,IAAA,yBAAA;AAAA,AAAA,IAAA,0BAAA,AAAA;AAAA,AAAA,IAAA,wBAAA;;AAAA,AAAA,GAAA,CAAAr\/C,wBAAAC;AAAA,AAAA,AAAAC,4BAAA,CAAA,UAAAF;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA,uBAAA,KAAAG,qBAAA,AAAAD,6BAAA,KAAA,IAAA;AAAA,AAAA,OAAAm\/C,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAj\/C;;;;;AAAA,AAAA,iDAAA,jDAAMi\/C,4DAKF,EAAE,EAAE;AALR,AAMG,OAACt\/B,8CAAMzZ,EAAEF,EAAE,iBAAA,WAAG,AAACyM,4CAAIvM,EAAEF;AAAV,AAAA,0EAAAy5C,wBAAAA,1FAACnkD,kCAAAA,4CAAAA;;;;AANf,AAAA,iDAAA,jDAAM2jD,4DAOF,EAAE,EAAE,EAAE;AAPV,AAQG,OAACt\/B,8CAAMzZ,EAAEF,EAAE,iBAAA,WAAG,AAACyM,4CAAIvM,EAAEF;IAAV,WAAapJ;AAAb,AAAA,0EAAA8iD,SAAAC,wBAAAD,SAAAC,5GAACrkD,kCAAAA,qDAAAA;;;;AARf,AAAA,iDAAA,jDAAM2jD,4DASF,EAAE,EAAE,EAAE,EAAE;AATZ,AAUG,OAACt\/B,8CAAMzZ,EAAEF,EAAE,iBAAA,WAAG,AAACyM,4CAAIvM,EAAEF;IAAV,WAAapJ;IAAb,WAAeG;AAAf,AAAA,0EAAA6iD,SAAAC,SAAAC,wBAAAF,SAAAC,SAAAC,9HAACxkD,kCAAAA,8DAAAA;;;;AAVf,AAAA,iDAAA,jDAAM2jD,4DAWF,EAAE,EAAE,EAAE,EAAE,EAAE;AAXd,AAYG,OAACt\/B,8CAAMzZ,EAAEF,EAAE,iBAAA,WAAG,AAACyM,4CAAIvM,EAAEF;IAAV,WAAapJ;IAAb,WAAeG;IAAf,WAAiBglC;AAAjB,AAAA,0EAAAge,SAAAC,SAAAC,SAAAC,wBAAAH,SAAAC,SAAAC,SAAAC,hJAAC5kD,kCAAAA,uEAAAA;;;;AAZf,AAAA,AAAA,wDAAA,xDAAM2jD,mEAaF,EAAE,EAAE,EAAE,EAAE,EAAE,EAAI;AAblB,AAcG,OAACt\/B,8CAAMzZ,EAAEF,EAAE,AAAC+P,qDAAMza,EAAE,AAACmX,4CAAIvM,EAAEF,GAAGpJ,EAAEG,EAAEglC,oDAAEprB;;;AAdvC;AAAA,AAAA,qCAAA,WAAA,hDAAMsoC;AAAN,AAAA,IAAA,WAAA,AAAAh\/C,gBAAAi\/C;IAAA,eAAA,AAAA\/+C,eAAA++C;IAAA,WAAA,AAAAj\/C,gBAAAi\/C;IAAA,eAAA,AAAA\/+C,eAAA++C;IAAA,WAAA,AAAAj\/C,gBAAAi\/C;IAAA,eAAA,AAAA\/+C,eAAA++C;IAAA,WAAA,AAAAj\/C,gBAAAi\/C;IAAA,eAAA,AAAA\/+C,eAAA++C;IAAA,WAAA,AAAAj\/C,gBAAAi\/C;IAAA,eAAA,AAAA\/+C,eAAA++C;IAAA,WAAA,AAAAj\/C,gBAAAi\/C;IAAA,eAAA,AAAA\/+C,eAAA++C;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAA9+C,wDAAA++C,SAAAC,SAAAC,SAAAC,SAAAC,SAAAC,SAAAN;;;AAAA,AAAA,2CAAA,3CAAMD;;AAAN,AAkBA,AAAA;;;;;;;;AAAA;AAAA,AAAA,gCAAA,hCAASkB;AAAT,AAAA,AAAA;;;AAAA,AAAA,sCAAA,tCAASA;;AAAT,AAAA,yCAAA,zCAASA;;AAAT,AAAA,8CAAA,WAAA,mBAAA,qBAAA,jGAASA;AAAT,AAAA,OAAA50C,iBAAAqD,qBAAA;;;AAAA;;;4BAAA,5BAASwxC,gEAAY,KAAK;AAA1B,AAAA,YAAAD,qBAAqBE,KAAKt\/C;;;AAAjBo\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\/C,WAAiD+B;AAAjD,AAAA,4GAAAs\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\/Ld,AAAA,gBAAA,ZA+Lc;AA\/Ld,AAgMI,2CAAA,pCAACR,0BAAgBn9C,cAAOkU;;;AAhM5B,AAAA,AAAA,qEAAA,rEAASypC,gFAsBC;;AAtBV,AAAA,eAAA,XAsBU;AAtBV,AAsBgBz5C;;;AAtBhB,AAAA,AAAA,2EAAA,3EAASy5C,sFAgBE;;AAhBX,AAAA,YAAA,RAgBW;AAhBX,AAgBc,YAAAA,2BAAmBz5C,YAAKgQ,WAAI2pC,aAAMhJ,YAAKiJ,YAAKhvB;;;AAhB1D,AAAA,AAAA,yEAAA,zEAAS6uB,oFA6FE;;AA7FX,AAAA,eAAA,XA6FW;AA7FX,AA6FiBzpC;;;AA7FjB,AAAA,AAAA,sEAAA,tEAASypC,iFAyBC;;AAzBV,AAAA,eAAA,XAyBU;AAzBV,AA0BI,GAAM,cAAA,bAAGzpC;AAAT,AACE,OAAM9S,8CAAK,cAAA,bAAK8S;;AADlB;;;;AA1BJ,AAAA,AAAA,qEAAA,rEAASypC,gFA4BA;;AA5BT,AAAA,eAAA,XA4BS;AA5BT,AA6BI,GACC,gBAAA,fAAOzpC;AAAK,MAAO,KAAApb,MAAA;;AADpB,GAEC,CAAA,QAAMob;AAAK,OAACjQ,qBAAW,AAAS05C,iCAAkBz5C;;AAFnD,GAGC,CAAA,MAAK,CAAGgQ,aAAI,AAAC+mC,mBAAS75C;AACrB,YAAAu8C,+GAAA,pFAAmBz5C,YAAK,cAAA,bAAKgQ,kBAAK2pC,aAAMhJ,YAAK,kBAAA,IAAA,tBAAQiJ;;AAJvD,AAKQ,IAAM,WAAS,AAAC3B,8BAAoB\/6C,SAAK,cAAA,bAAG8S;IACtC,KAAG,AAACyoC,mBAASv7C,SAAKy8C,aAAMhJ;IACxB,WAAS,EAAI,OAAA,NAAMkJ,aAAI,AAAcJ,sCAAkBI;IACvD,QAAM,cAAA,bAAK7pC;AAHjB,AAIE,GAAI,EAAK,CAAA,MAAK2pC,mBAAO,oCAAA,nCAAM,2BAAA,3BAAC\/C,kBAAQkD;AAClC,YAAAL,2GAAA,hFAAmBz5C,YAAK+5C,MAAM,gBAAA,fAAGJ,oBAAS,2BAAA,3BAAC\/C,kBAAQkD,cAAYE;;AAC\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\/xC;;AAA\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\/CrB,AAAA,AAAA,+DAAA,\/DAASs+C,0EAyEC;;AAzEV,AAAA,eAAA,XAyEU;AAzEV,AAyEgB,IAAA,kBAAqC5wB;AAArC,AAAA,GAAA,GAAA,CAAA3hB,mBAAA;AAAAA;;AAAA,IAAA,sBAAA,4BAAc\/L,5BAAK0Q;AAAnB,AAAA,gBAAA3E,hBAAqC2hB;;AAArC3hB;;;;AAzEhB,AAAA,AAAA,iEAAA,jEAASuyC,4EA0BE,KAAK;;AA1BhB,AAAA,eAAA,XA0BW;AA1BX,AA0BuB,OAACrpC,2BAAiBjV,SAAKwD;;;AA1B9C,AAAA,AAAA,+EAAA,\/EAAS86C,0FAsDE;;AAtDX,AAAA,eAAA,XAsDW;AAtDX,AAAA;;;AAAA,AAAA,AAAA,mEAAA,nEAASA,8EA4EG,KAAK;;AA5EjB,AAAA,eAAA,XA4EY;AA5EZ,AA6EI,OAACjB,kDAAUmB,WAAI\/pD,EAAE,CAAGoF,WAAE23B,YAAK,AAACpd,gBAAMoqC;;;AA7EtC,AAAA,AAAA,mEAAA,nEAASF,8EA+EG,KAAK,EAAE;;AA\/EnB,AAAA,eAAA,XA+EY;AA\/EZ,AAgFI,OAACpC,kDAAUsC,WAAI\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\/C,gDAAKb;;;AA1ElC,AAAA,AAAA,+DAAA,\/DAAS8\/C,0EA2EG,KAAK,EAAE;;AA3EnB,AAAA,eAAA,XA2EY;AA3EZ,AA2E8B,GAAI,OAAS9\/C;AACX,OAAMa,8CAAKb,EAAEqB;;AACbA;;;;AA7EhC,AAAA,AAAA,oEAAA,pEAASy+C,+EA8GM,KAAK,EAAE;;AA9GtB,AAAA,eAAA,XA8Ge;AA9Gf,AA+GI,IAAO,IAAE\/7C;QAAT,JAAe;IAAI,WAAKG;;AAAxB,AACE,GAAI,CAAGxJ,IAAEoyB;AACP,IAAM,WAAK,iBAAA,WAAG5oB;IAAH,WAAQnE;IAAR,WAAU,AAAC6T,6CAAK1R,SAAExH;AAAlB,AAAA,0EAAA2lD,SAAAC,SAAAC,wBAAAF,SAAAC,SAAAC,9HAACjrD,kCAAAA,8DAAAA;;AAAZ,AACE,GAAI,AAAC8d,yBAASlP;AAAd,OAAAqP,gBACGrP;;AACD,eAAO,KAAA,JAAKxJ;eAAG,KAAA,JAAKqF;eAAGmE;;;;;;;AAC3BA;;;;;;AArHR,AAAA,AAAA,6DAAA,7DAAS47C,wEAgEA,KAAK;;AAhEd,AAAA,eAAA,XAgES;AAhET,AAiEI,GAAI,EAAI,KAAA,JAAM3\/C,cAAG,CAAI2sB,cAAI,CAAG\/oB,eAAM5D;AAChC,OAACu7C,qCAA2Bv7C,EAAE,CAAG2sB,aAAI\/oB;;AACrC,OAAC6P,6CAAK1R,SAAE,CAAG6B,eAAM5D;;;;AAnEvB,AAAA,AAAA,6DAAA,7DAAS2\/C,wEAoEA,KAAK,EAAE;;AApEhB,AAAA,eAAA,XAoES;AApET,AAqEI,GAAI,EAAI,KAAA,JAAM3\/C,cAAG,CAAI2sB,cAAI,CAAG\/oB,eAAM5D;AAChCkB;;AACA,OAACqX,6CAAKxW,SAAE,CAAG6B,eAAM5D,GAAGkB;;;;AAvE1B,AAAA,AAAA,gEAAA,hEAASy+C,2EA6FI,KAAK,EAAE;;AA7FpB,AAAA,eAAA,XA6Fa;AA7Fb,AA8FI,IAAM,QAAM,CAAG\/7C,eAAM5D;AAArB,AACE,GAAI,EAAI,KAAA,JAAMA,cAAG,CAAI,cAAA,bAAK2sB,qBAAKozB;AAC7B,MAAO,KAAA3nD,MAAW,CAAA,wDAAA,mHAAA,tHAAc4H,oEAAuB,AAAQU;;AAC\/D,OAACm\/C,uBAAar8C,YAAK,AAACgW,8CAAMzX,SAAEg+C,MAAMzjD,KAAKsH,aAAM,iBAAA,kBAAK+oB;IAAL,kBAAS,SAAA,RAAKozB;AAAd,AAAA,SAAAhrC,kBAAAC,mBAAAD,kBAAAC;KAA7C;;;;AAjGR,AAAA,AAAA,mEAAA,nEAAS2qC,8EA8HK;;AA9Hd,AAAA,eAAA,XA8Hc;AA9Hd,AA+HI,GAAI,EAAA,GAAA,aAAA,SAAA,EAAA,EAAA,WAAA,CAAAprD,gCAAA,0CAAA,KAAA,OAAA,3HAA+BwN,qEAAAA;AACjC,OAAC06C,0BAAgB16C,SAAE6B,aAAM+oB;;AACzB,OAACkS,mBAASn+B;;;;AAjIhB,AAAA,AAAA,2DAAA,3DAASi\/C,sEAsBC;;AAtBV,AAAA,eAAA,XAsBU;AAtBV,AAsBgBn8C;;;AAtBhB,AAAA,AAAA,iEAAA,jEAASm8C,4EAgBE;;AAhBX,AAAA,YAAA,RAgBW;AAhBX,AAgBc,YAAAA,iBAASn8C,YAAKzB,SAAE6B,aAAM+oB,WAAIyB;;;AAhBxC,AAAA,AAAA,+DAAA,\/DAASuxB,0EA6DE;;AA7DX,AAAA,eAAA,XA6DW;AA7DX,AA6DiB,QAAGhzB,aAAI\/oB;;;AA7DxB,AAAA,AAAA,4DAAA,5DAAS+7C,uEAyBC;;AAzBV,AAAA,eAAA,XAyBU;AAzBV,AA0BI,OAAClsC,6CAAK1R,SAAE,cAAA,bAAK4qB;;;AA1BjB,AAAA,AAAA,2DAAA,3DAASgzB,sEA2BA;;AA3BT,AAAA,eAAA,XA2BS;AA3BT,AA4BI,GAAI,CAAI\/7C,iBAAM+oB;AACZ,MAAO,KAAAv0B,MAAA;;AACP,mFAAA,5EAACynD,uBAAar8C,YAAKzB,SAAE6B,aAAM,cAAA,bAAK+oB;;;;AA9BtC,AAAA,AAAA,iEAAA,jEAASgzB,4EAwDC;;AAxDV,AAAA,eAAA,XAwDU;AAxDV,AAyDI,GAAA,GAAQ,CAAI\/7C,iBAAM+oB;AAChB,YAAA5W,4DAAA,7CAAOrV,SAAK,+BAAA,9BAAK,CAAGisB,aAAI\/oB;;AAD1B;;;;AAzDJ,AAAA,AAAA,2DAAA,3DAAS+7C,sEA4CC;;AA5CV,AAAA,eAAA,XA4CU;AA5CV,AA4CgB,IAAA,kBAAqCvxB;AAArC,AAAA,GAAA,GAAA,CAAA3hB,mBAAA;AAAAA;;AAAA,IAAA,sBAAA,4BAAc\/L,5BAAK0Q;AAAnB,AAAA,gBAAA3E,hBAAqC2hB;;AAArC3hB;;;;AA5ChB,AAAA,AAAA,6DAAA,7DAASkzC,wEAyCE,KAAK;;AAzChB,AAAA,eAAA,XAyCW;AAzCX,AAyCuB,OAAChqC,2BAAiBjV,SAAKwD;;;AAzC9C,AAAA,AAAA,2EAAA,3EAASy7C,sFAqCE;;AArCX,AAAA,eAAA,XAqCW;AArCX,AAqCiB,OAACp8C,qBAAW,AAAS05C,iCAAkBz5C;;;AArCxD,AAAA,AAAA,+DAAA,\/DAASm8C,0EAoGG,KAAK;;AApGjB,AAAA,eAAA,XAoGY;AApGZ,AAqGI,GAAI,EAAA,GAAA,aAAA,SAAA,EAAA,EAAA,WAAA,CAAAprD,gCAAA,0CAAA,KAAA,OAAA,3HAA+BwN,qEAAAA;AACjC,OAACg8C,kDAAUh8C,SAAE5M,EAAEyO,aAAM+oB;;AACrB,OAACqzB,kDAAUt\/C,SAAKvL;;;;AAvGtB,AAAA,AAAA,+DAAA,\/DAASwqD,0EAwGG,KAAK,EAAE;;AAxGnB,AAAA,eAAA,XAwGY;AAxGZ,AAyGI,GAAI,EAAA,GAAA,aAAA,SAAA,EAAA,EAAA,WAAA,CAAAprD,gCAAA,0CAAA,KAAA,OAAA,3HAA+BwN,qEAAAA;AACjC,OAAC66C,kDAAU76C,SAAE5M,EAAE4O,KAAKH,aAAM+oB;;AAC1B,OAACszB,kDAAUv\/C,SAAKvL,EAAE4O;;;;AA3GxB,AAAA,AAAA,mEAAA,nEAAS47C,8EAgFE,KAAK,IAAI;;AAhFpB,AAAA,eAAA,XAgFW;AAhFX,AAiFI,GAAI,OAAS15C;AACX,OAAUvF,iDAAKuF,IAAI3J;;AACnB,MAAO,KAAAlE,MAAA;;;;AAnFb,AAAA,AAAA,6DAAA,7DAASunD,wEA+CA;;AA\/CT,AAAA,eAAA,XA+CS;AA\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\/FAASimD,0GA+BQ;;AA\/BjB,AAAA,gBAAA,ZA+BiB;AA\/BjB,AAgCI,GAAI,AAAiBlK;AACnB,AAAI,mBAAA,nBAAM,AAAQA;;AACd,IAAM,MAAI,CAAG3gC,aAAI,AAAC+mC,mBAASh0C;IACrB,eAAa,KAAAvP,MAAY6D;AAD\/B,AAEE,iCAAA,iBAAA,lDAAC0hB,qBAAW6gC,gBAAOwE,iBAAe\/mD;;AAClC,YAAAoiD,2BAAA,sDAAA,jDAAuBzpC,WAAI2pC,aAAMhJ,YAAKyN;;AAC5C,MAAO,KAAAxpD,MAAA;;;;AAtCb,AAAA,AAAA,2FAAA,3FAASimD,sGAyCG,MAAM,IAAI;;AAzCtB,AAAA,gBAAA,ZAyCY;AAzCZ,AA0CI,GAAI,OAASp4C;AACX,OAAWM,iEAAMN,IAAI3J;;AACrB,MAAO,KAAAlE,MAAA;;;;AA5Cb,AAAA,AAAA,wFAAA,xFAASimD,mGA+CK,MAAM,EAAE;;AA\/CtB,AAAA,gBAAA,ZA+Cc;AA\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\/BV,AAAA,eAAA,XA+BU;AA\/BV,AAgCI,IAAA,qBAAY,AAACnoD,eAAKqoD;AAAlB,AAAA,GAAA9pD;AAAA,SAAAA,LAAS;AAAT,AACE,YAAA4pD,wDAAA,3BAAqB3+C,YAAK8\/B,GAAGgf;;AAC7B,GAAM,GAAA,gBAAA,fAAOA;AAAb,AACE,YAAAH,qDAAA,KAAA,7BAAqB3+C,YAAK8+C;;AAD5B;;;;;AAlCN,AAAA,AAAA,uEAAA,vEAASH,kFAgDC;;AAhDV,AAAA,eAAA,XAgDU;AAhDV,AAgDgB,IAAA,kBAAqC\/zB;AAArC,AAAA,GAAA,GAAA,CAAA3hB,mBAAA;AAAAA;;AAAA,IAAA,sBAAA,4BAAc\/L,5BAAK0Q;AAAnB,AAAA,gBAAA3E,hBAAqC2hB;;AAArC3hB;;;;AAhDhB,AAAA,AAAA,yEAAA,zEAAS01C,oFA6CE,KAAK;;AA7ChB,AAAA,eAAA,XA6CW;AA7CX,AA6CuB,OAACxsC,2BAAiBjV,SAAKwD;;;AA7C9C,AAAA,AAAA,uFAAA,vFAASi+C,kGAyCE;;AAzCX,AAAA,eAAA,XAyCW;AAzCX,AAyCiB,OAAC5+C,qBAAW,AAASsS,qBAAMrS;;;AAzC5C,AAAA,AAAA,uEAAA,vEAAS2+C,kFAsBE;;AAtBX,AAAA,eAAA,XAsBW;AAtBX,AAsBiB,OAACroD,gBAAMuoD;;;AAtBxB,AAAA,AAAA,sEAAA,tEAASF,iFAuBE;;AAvBX,AAAA,eAAA,XAuBW;AAvBX,AAwBI,IAAA,qBAAY,AAACnoD,eAAKqoD;AAAlB,AAAA,GAAA9pD;AAAA,SAAAA,LAAS;AAAT,AACE,YAAA4pD,wDAAA,3BAAqB3+C,YAAK8\/B,GAAGgf;;AAC7B,GAAI,gBAAA,fAAMA;AACR,OAAQ5hD;;AACR,YAAAyhD,qDAAA,KAAA,7BAAqB3+C,YAAK8+C;;;;;AA5BlC,AAAA,AAAA,yEAAA,zEAASH,oFAmDA;;AAnDT,AAAA,eAAA,XAmDS;AAnDT,AAmDezhD;;;AAnDf,AAAA,AAAA,gFAAA,hFAASyhD,2FAgBM,KAAK;;AAhBpB,AAAA,eAAA,XAgBe;AAhBf,AAgB0B,YAAAA,6BAAqB3+C,SAAK6+C,aAAMC,YAAKl0B;;;AAhB\/D,AAAA,AAAA,6EAAA,7EAAS+zB,wFAsCC,KAAK;;AAtCf,AAAA,eAAA,XAsCU;AAtCV,AAsCkB,OAACvsC,eAAK3V,EAAES;;;AAtC1B,AAAA,wCAAA,xCAASyhD;AAAT,AAAA,AAAA;;;AAAA,AAAA,8CAAA,9CAASA;;AAAT,AAAA,iDAAA,jDAASA;;AAAT,AAAA,sDAAA,WAAA,mBAAA,qBAAA,zGAASA;AAAT,AAAA,OAAA\/8C,iBAAAqD,qBAAA;;;AAAA;;;oCAAA,pCAAS25C,gFAAoB,KAAK,MAAM,KAAe;AAAvD,AAAA,YAAAD,6BAA6B3+C,KAAK6+C,MAAMC,KAAel0B;;;AAA9C+zB,AAqDT,IAAA,iBAAA,AAAcA;IAAd,iBAAArpD;IAAA,iBAAA;;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAA6X,uBAAAqF;;;AAAA,AAAA,AAAAxL,gBAAA+3C,eAAAC,eAAAC;AAEA,AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,+CAAA,\/CAASC;;AAAT,AAAA,WAAA,PAEa;AAFb,AAGI,OAAC75C,uBAAQnI;;;AAHb,AAAA,AAAA,4CAAA,5CAASgiD,uDAIM;;AAJf,AAAA,YAAA,RAIU;AAJV,AAKI,OAAQpjD,2CAAK4E;;;AALjB,AAAA,AAAA,8CAAA,9CAASw+C;;6BAMQ;;AANjB,AAAA,WAAA,PAMY;AANZ,AAOI,+DAAA,xDAAC7tC,iDAASnU,KAAKjK;;6BACF,EAAE;;AARnB,AAAA,WAAA,PAQY;AARZ,AASI,OAACoe,iDAASnU,KAAKjK,EAAEmN;;oBADJ,EAAE;;;6BAAF;;6BAAA,EAAE;;;;;;;;;;AARnB,AAAA,AAAA,kDAAA,lDAAS8+C;;6BAUY;;AAVrB,AAAA,WAAA,PAUgB;AAVhB,AAWI,OAACttC,qDAAa1U,KAAKjK,EAAE,CAAC0a,6CAAAA,mDAAAA,RAAMzQ,+BAAAA;;6BACX,EAAE;;AAZvB,AAAA,WAAA,PAYgB;AAZhB,AAaI,OAAC0U,qDAAa1U,KAAKjK,EAAEmN;;oBADJ,EAAE;;;6BAAF;;6BAAA,EAAE;;;;;;;;;;AAZvB,AAAA,AAAA,4EAAA,5EAAS8+C,uFAmBK;;AAnBd,AAAA,eAAA,XAmBc;AAnBd,AAoBI,YAAAX,8BAAsBM,aAAM,AAAC75C,oBAAU85C;;;AApB3C,AAAA,AAAA,oEAAA,pEAASI,+EA0BC;;AA1BV,AAAA,eAAA,XA0BU;AA1BV,AA0BgBl\/C;;;AA1BhB,AAAA,AAAA,0EAAA,1EAASk\/C,qFAgBE;;AAhBX,AAAA,eAAA,XAgBW;AAhBX,AAgBiB,YAAAA,0BAAkBl\/C,YAAK2N,aAAMkxC,aAAMC,YAAKl0B;;;AAhBzD,AAAA,AAAA,wEAAA,xEAASs0B,mFAgEE;;AAhEX,AAAA,eAAA,XAgEW;AAhEX,AAgEiBvxC;;;AAhEjB,AAAA,AAAA,qEAAA,rEAASuxC,gFAiCC;;AAjCV,AAAA,eAAA,XAiCU;AAjCV,AAiCgB,OAAC5oD,gBAAMuoD;;;AAjCvB,AAAA,AAAA,oEAAA,pEAASK,+EAkCA;;AAlCT,AAAA,eAAA,XAkCS;AAlCT,AAmCI,oBAAIL;AACF,IAAA,qBAAY,AAACroD,eAAKqoD;AAAlB,AAAA,GAAA9pD;AAAA,SAAAA,LAAS;AAAT,AACE,YAAAmqD,0EAAA,hDAAkBl\/C,YAAK,gBAAA,fAAK2N,oBAAOmyB,GAAGgf;;AACtC,YAAAI,sFAAA,iCAAA,7FAAkBl\/C,YAAK,gBAAA,fAAK2N,oBAAO,AAAClB,cAAIqyC;;;AAC1C5hD;;;;AAvCN,AAAA,AAAA,oEAAA,pEAASgiD,+EAuDC;;AAvDV,AAAA,eAAA,XAuDU;AAvDV,AAuDgB,IAAA,kBAAqCt0B;AAArC,AAAA,GAAA,GAAA,CAAA3hB,mBAAA;AAAAA;;AAAA,IAAA,sBAAA,4BAAc\/L,5BAAK0Q;AAAnB,AAAA,gBAAA3E,hBAAqC2hB;;AAArC3hB;;;;AAvDhB,AAAA,AAAA,sEAAA,tEAASi2C,iFAoDE,KAAK;;AApDhB,AAAA,eAAA,XAoDW;AApDX,AAoDuB,OAAC\/sC,2BAAiBjV,SAAKwD;;;AApD9C,AAAA,AAAA,oFAAA,pFAASw+C,+FAgDE;;AAhDX,AAAA,eAAA,XAgDW;AAhDX,AAgDiB,OAACn\/C,qBAAW,AAASm\/C,gCAAiBl\/C;;;AAhDvD,AAAA,AAAA,oEAAA,pEAASk\/C,+EA6BE;;AA7BX,AAAA,eAAA,XA6BW;AA7BX,AA6BiB,OAAC5oD,gBAAMuoD;;;AA7BxB,AAAA,AAAA,mEAAA,nEAASK,8EA8BC;;AA9BV,AAAA,eAAA,XA8BU;AA9BV,AA8BgB,OAACxyC,eAAK,AAACD,cAAIvP;;;AA9B3B,AAAA,AAAA,sEAAA,tEAASgiD,iFA0DA;;AA1DT,AAAA,eAAA,XA0DS;AA1DT,AA2DI,IAAM,WAAK,AAACzyC,cAAIqyC;AAAhB,AACE,oBAAI,iBAAA,mBAAID;AAAJ,AAAA,oBAAA5mD;AAAAA;;AAAU6mD;;;AACZ,YAAAH,6BAAA,0CAAA,rCAAyBE,aAAM,AAACpyC,cAAIqyC;;AADtC;;;;AA5DN,AAAA,AAAA,6EAAA,7EAASI,wFAuBM,KAAK;;AAvBpB,AAAA,eAAA,XAuBe;AAvBf,AAuB0B,YAAAA,0BAAkBl\/C,SAAK2N,aAAMkxC,aAAMC,YAAKl0B;;;AAvBlE,AAAA,AAAA,0EAAA,1EAASs0B,qFA0CC,KAAK;;AA1Cf,AAAA,eAAA,XA0CU;AA1CV,AA2CI,oBAAIL;AACF,YAAAK,0BAAkBl\/C,YAAK,gBAAA,fAAK2N,oBAAOkxC,aAAM,AAACpqC,6CAAK,iBAAA,mBAAIqqC;AAAJ,AAAA,oBAAA7mD;AAAAA;;AAAA;;QAA\/C,HAA4DwE;;AAC5D,YAAAyiD,wHAAA,iCAAA,\/HAAkBl\/C,YAAK,gBAAA,fAAK2N,oBAAO,AAAC8G,6CAAKoqC,aAAMpiD;;;;AA7CrD,AAAA,qCAAA,rCAASyiD;AAAT,AAAA,AAAA;;;AAAA,AAAA,2CAAA,3CAASA;;AAAT,AAAA,8CAAA,9CAASA;;AAAT,AAAA,mDAAA,WAAA,mBAAA,qBAAA,tGAASA;AAAT,AAAA,OAAAt9C,iBAAAqD,qBAAA;;;AAAA;;;iCAAA,jCAASk6C,0EAAiB,KAAK,MAAM,MAAM,KAAe;AAA1D,AAAA,YAAAD,0BAA0Bl\/C,KAAK2N,MAAMkxC,MAAMC,KAAel0B;;;AAAjDs0B,AAkET,AAAM,AAASA,kCAAiB,KAAAA,0BAAA,KAAA,IAAA,KAAA,iCAA+BpxC;AAE\/D,IAAA,iBAAA,AAAcoxC;IAAd,iBAAA5pD;IAAA,iBAAA;;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAA6X,uBAAAqF;;;AAAA,AAAA,AAAAxL,gBAAAo4C,eAAAC,eAAAC;AAEA,AAAA;;;;;;;;;AAAA,AAAA,AAAA,AAAA,uCAAA,vCAASC,kDAEM;;AAFf,AAAA,YAAA,RAEU;AAFV,AAGI,OAAQzjD,2CAAK4E;;;AAHjB,AAAA,AAAA,iEAAA,jEAAS6+C,4EAKE,EAAE;;AALb,AAAA,YAAA,RAKW;AALX,AAAA;;;AAAA,AAAA,gCAAA,hCAASA;AAAT,AAAA,AAAA;;;AAAA,AAAA,sCAAA,tCAASA;;AAAT,AAAA,yCAAA,zCAASA;;AAAT,AAAA,8CAAA,WAAA,mBAAA,qBAAA,jGAASA;AAAT,AAAA,OAAA39C,iBAAAqD,qBAAA;;;AAAA;;;4BAAA,5BAASu6C;AAAT,AAAA,YAAAD;;;AAASA,AAOT,AAAeE,wBAAY,KAAAF;AAE3B;;;sBAAA,tBAAeG,oDAEZ,EAAE;AAFL,AAGE,OAAChmC,mBACC,oEAAA,lEAAM,EAAK,AAACzB,qBAAK7kB,QAAG,GAAK,AAAC8kB,wBAAQ9kB,QAEhC,+CAAA,7CAAM,CAAI,AAACke,gBAAMre,OAAG,AAACqe,gBAAMle,KACzB,EAAI,EAAA,GAAA,MAAA,SAAA,EAAA,EAAA,CAAA,wCAAA,gBAAA,CAAArC,gCAAA,2BAAA,KAAA,EAAA,EAAA,wCAAA,AAAAmD,yDAAA,QAAA,AAAAA,\/BAAYmM,iEAAAA,3RAAUpN,mBAAAA,yFAAAA,oCAAAA,8FAAAA,iEAAAA,KACxB,AAACgrB,oBACC,WAAK,EAAE,EAAE;AAAT,AACE,GAAI,AAACxU,6CAAE,AAACV,4CAAI3V,EAAEiJ,EAAEojD,uBAAalhD;AAA7B;;AAEE,yBAAA,lBAACiR;;GAJP,KAKOvc,GACP,AAAC4qC,uBACC,WAAK;AAAL,AACE,OAACp0B,6CAAE,AAACV,4CAAI3V,EAAE,AAACkD,gBAAMqpD,KAAKF,uBAAa,AAAC\/rC,iBAAOisC;aAZrD,NAEE,JAWM1sD;;AAGZ,uBAAA,vBAAO2sD,sDAAY,KAAK,EAAE;AAA1B,AACE,IAAM,MAAI,AAAS1nD;AAAnB,AACE,QAAA,JAAO;;AAAP,AACE,GAAM,CAAGnB,IAAEM;AAAX,AACE,GAAI,CAAYgF,MAAE,CAAMnE,MAAMnB;AAC5BA;;AACA,eAAO,CAAGA,IAAE8oD;;;;;AAHhB;;;;;AAWN,iCAAA,jCAAOC,0EAAsB,EAAE;AAA\/B,AACE,IAAM,QAAE,AAAC54C,eAAK1P;IACR,QAAE,AAAC0P,eAAKnL;AADd,AAEE,GACC,CAAGvE,QAAEuE;AADN;;AAAA,GAEC,CAAGvE,QAAEuE;AAFN;;AAAA,AAAA;;;;;AAKJ,iCAAA,jCAAOgkD,0EAAmB,EAAE,EAAE;AAA9B,AACE,IAAM,KAAI,AAAQxjD;IACZ,MAAI,AAASia;IACb,KAAI,AAAUja;IACd,KAAI,AAACya,eAAKza;AAHhB,AAIE,QAAA,JAAO;IACA,MAAI,AAACm1B,qBAAU,AAASsuB;;AAD\/B,AAEE,GAAI,CAAGjpD,IAAEM;AACP,IAAM,QAAE,CAAMmf,GAAGzf;AAAjB,AACE,eAAO,KAAA,JAAKA;eAAG,AAACkpD,oDAAOhF,IAAI5+C,MAAE,AAAC6jD,gBAAYC,GAAG9jD;;;;;AAC\/C,OAAC0D,qBAAW,AAAC4xB,2BAAY,AAACsuB,oDAAOhF,IAAI5+C,EAAEkC,IAAI6hD;;;;;AAInD,sBAAA,tBAAOC,oDAAW,IAAI;AAAtB,AACE,IAAM,UAAQ;IACR,IAAE,AAAS7pC;AADjB,AAEE,cAAA,VAAO;;AAAP,AACE,GAAM,CAAGzf,UAAEuF;AAAX,AACE,IAAM,UAAE,CAAMka,GAAGzf;AAAjB,AACE,IAAA,iBAAa0pD;IAAb,iBAAqBpkD;IAArB,iBAAuB,AAAC6jD,gBAAYxrD,IAAI2H;AAAxC,AAAA,gBAAAikD,eAAAC,eAAAC,9CAACx5C;;AACD,eAAO,WAAA,VAAKjQ;;;;AAHhB;;;;AAIF0pD;;AAEJ,AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,8CAAA1vD,9CAAS4vD;;AAAT,AAAA,AAAA,2DAAA,3DAASA,sEAuEC,KAAK;;AAvEf,AAAA,eAAA,XAuEU;AAvEV,AAwEI,GAAM,EAAK,AAAU5sD,cAAcsI,QAC3B,GAAK,4CAAA,3CAAM,qBAAA,rBAACujD,yBAAavjD,EAAEwkD;AADnC,AAEE,YAAAhmC,wCAAA,rBAAWxe,EAAE,CAAeykD,cAAOzkD;;AAFrC;;;;AAxEJ,AAAA,AAAA,sCAAA,tCAASskD;;AAAT,AAAA,WAAA,PAEa;AAFb,AAGI,OAACt7C,uBAAQnI;;;AAHb,AAAA,AAAA,mCAAA,nCAASyjD,8CAIM;;AAJf,AAAA,YAAA,RAIU;AAJV,AAKI,OAAQ7kD,2CAAK4E;;;AALjB,AAAA,AAAA,+DAAA,\/DAASigD,0EAwCG,KAAK;;AAxCjB,AAAA,eAAA,XAwCY;AAxCZ,AAwCoB,yDAAA,lDAASzjD,gDAAKb;;;AAxClC,AAAA,AAAA,+DAAA,\/DAASskD,0EAyCG,KAAK,EAAE;;AAzCnB,AAAA,eAAA,XAyCY;AAzCZ,AA0CI,GAAI,EAAK,AAAU5sD,cAAcsI,QACxB,GAAK,4CAAA,3CAAM,qBAAA,rBAACujD,yBAAavjD,EAAEwkD;AAClC,QAAeC,cAAOzkD;;AACtBqB;;;;AA7CN,AAAA,AAAA,oEAAA,pEAASijD,+EA6EM,KAAK,EAAE;;AA7EtB,AAAA,eAAA,XA6Ee;AA7Ef,AA8EI,IAAM,MAAI,AAASE;AAAnB,AACE,IAAO,WAAK,AAAOA,iBAAKf;IACjB,WAAKv\/C;;AADZ,AAEE,GAAI,AAACkM,cAAIo0C;AACP,IAAM,IAAE,AAACvqD,gBAAMuqD;IACT,WAAK,iBAAA,WAAGtgD;IAAH,WAAQlE;IAAR,WAAU,CAAeykD,cAAOzkD;AAAhC,AAAA,0EAAA8kD,SAAAC,SAAAC,wBAAAF,SAAAC,SAAAC,9HAAC1vD,kCAAAA,8DAAAA;;AADZ,AAEE,GAAI,AAAC8d,yBAASlP;AAAd,OAAAqP,gBACGrP;;AACD,eAAO,AAACmM,eAAKm0C;eAAMtgD;;;;;;AACvBA;;;;;;AAvFV,AAAA,AAAA,2DAAA,3DAASogD,sEAWC;;AAXV,AAAA,eAAA,XAWU;AAXV,AAWgB3gD;;;AAXhB,AAAA,AAAA,+DAAA,\/DAAS2gD,0EAqCE;;AArCX,AAAA,eAAA,XAqCW;AArCX,AAqCiB,OAASE;;;AArC1B,AAAA,AAAA,2DAAA,3DAASF,sEA4BC;;AA5BV,AAAA,eAAA,XA4BU;AA5BV,AA4BgB,IAAA,kBAAuC\/1B;AAAvC,AAAA,GAAA,GAAA,CAAA3hB,mBAAA;AAAAA;;AAAA,IAAA,sBAAA,8BAAc\/L,9BAAK6Q;AAAnB,AAAA,gBAAA9E,hBAAuC2hB;;AAAvC3hB;;;;AA5BhB,AAAA,AAAA,6DAAA,7DAAS03C,wEAyBE,KAAK;;AAzBhB,AAAA,eAAA,XAyBW;AAzBX,AAyBuB,OAACjB,oBAAUxiD,SAAKwD;;;AAzBvC,AAAA,AAAA,iFAAA,jFAASigD,4FA2GS;;AA3GlB,AAAA,eAAA,XA2GkB;AA3GlB,AA4GI,OAACjvB,qBAAU,AAAC8f,6CAAK,AAAAwO,kCAAW9iD;;;AA5GhC,AAAA,AAAA,2EAAA,3EAASyjD,sFAsBE;;AAtBX,AAAA,eAAA,XAsBW;AAtBX,AAsBiB,OAAC5gD,qBAAW,AAAS4gD,uBAAQ3gD;;;AAtB9C,AAAA,AAAA,4DAAA,5DAAS2gD,uEA0FG,KAAK;;AA1FjB,AAAA,eAAA,XA0FY;AA1FZ,AA2FI,GAAI,EAAK,AAAU5sD,cAAcsI,QACxB,GAAK,4CAAA,3CAAM,qBAAA,rBAACujD,yBAAavjD,EAAEwkD;AAClC,IAAM,WAAS,AAAC1pD,iBAAO0pD;IACjB,aAAW,AAACR,oBAAUS,cAAOD;AADnC,AAEE,qDAAA,rDAASK,gBAAS,qBAAA,rBAACtB,yBAAavjD,EAAE6kD;;AAClC,OAAWD,WAAW5kD;;AACtB,YAAAskD,6EAAA,5DAAS3gD,YAAKkhD,SAASD,WAAW,uBAAA,tBAAKF;;AACzC7jD;;;;AAlGN,AAAA,AAAA,mEAAA,nEAASyjD,8EAgDE,KAAK,EAAE;;AAhDlB,AAAA,eAAA,XAgDW;AAhDX,AAiDI,GAAI,AAAU5sD,cAAcsI;AACxB,GAAI,EAAI,CAAG0kD,sBAAa,AAAqBJ,yCACrC,CAAI,AAASE,sBAAM,AAAqBF;AAC9C,OAACZ,+BAAkB7iD,SAAKb,EAAEkC;;AAC1B,GAAA,GAAQ,4CAAA,3CAAM,qBAAA,rBAACqhD,yBAAavjD,EAAEwkD;AAC5B,IAAM,aAAW,AAACR,oBAAUS,cAAOD;AAAnC,AACE,AAAC75C,gBAAYi6C,WAAW5kD,EAAEkC;;AAC1B,YAAAoiD,gFAAA,\/DAAS3gD,YAAK6gD,YAAKI,WAAW,uBAAA,tBAAKF;;AACrC,IAAM,aAAW,AAACV,oBAAUS,cAAOD;IAC7B,WAAS,AAAC1pD,iBAAO0pD;AADvB,AAEE,AAAC75C,gBAAYi6C,WAAW5kD,EAAEkC;;AAC1B,AAAO2iD,cAAS7kD;;AAChB,YAAAskD,6EAAA,5DAAS3gD,YAAKkhD,SAASD,WAAW,uBAAA,tBAAKF;;;;AAE7C,OAAChB,+BAAkB7iD,SAAKb,EAAEkC;;;;AA\/DlC,AAAA,AAAA,iFAAA,jFAASoiD,4FAgEU,KAAK;;AAhExB,AAAA,eAAA,XAgEmB;AAhEnB,AAiEI,GAAI,EAAK,AAAU5sD,cAAcsI,QACxB,GAAK,4CAAA,3CAAM,qBAAA,rBAACujD,yBAAavjD,EAAEwkD;AADpC;;AAAA;;;;AAjEJ,AAAA,AAAA,6DAAA,7DAASF,wEA+BA;;AA\/BT,AAAA,eAAA,XA+BS;AA\/BT,AAgCI,GAAM,sBAAA,rBAAM,AAASE;AAArB,AACE,mDAAA,5CAACljB;kBAAD;AAAA,AAAM,YAAA8b,2BAAA,KAAA,EAAA,IAAA,AAAAA,sCAAA,CAAAuH,oDAAA,nCAAU,eAAAA,dAAeF;;CAC1B,AAAOD,iBAAKf;;AAFnB;;;;AAhCJ,AAAA,AAAA,oEAAA,pEAASa,+EAQM,KAAK;;AARpB,AAAA,eAAA,XAQe;AARf,AAQ0B,YAAAA,iBAAS3gD,SAAK6gD,YAAKC,cAAOC,oBAAan2B;;;AARjE,AAAA,AAAA,iEAAA,jEAAS+1B,4EAcC,KAAK;;AAdf,AAAA,eAAA,XAcU;AAdV,AAeI,GAAI,AAACxoC,wBAAQ1W;AACX,OAAQvE,oDAAK,mDAAA,nDAAC+S,6CAAKxO,WAAS,mDAAA,nDAACwO,6CAAKxO;;AAClC,OAAC3G,+CAAOwC,gBACAJ,SACAuE;;;;AAnBd,AAAA,AAAA,kCAAA,lCAASk\/C;;6BAAT,OAqGiB;;AArGjB,AAAA,IAAA,aAAA;AAAA,AAAA,WAAAr4C,PAqGY;AArGZ,AAsGI,OAASpL,4CAAKb;;6BAtGlB,OAuGiB,EAAE;;AAvGnB,AAAA,IAAA,aAAA;AAAA,AAAA,WAAAiM,PAuGY;AAvGZ,AAwGI,OAASpL,4CAAKb,EAAEqB;;oBAxGpB,OAuGiB,EAAE;;;6BAvGnB,OAuGiB;;6BAvGjB,OAuGiB,EAAE;;;;;;;;;;AAvGnB,AAAA,AAAA,mCAAA,WAAA,OAAA,rDAASijD;;AAAT,AAAA,IAAA,aAAA;AAAA,AAAA,OAAA,AAAAr4C,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAAnR,iBAAAupD;;;AAAA,AAAA,AAAA,2DAAA,3DAASC,sEAqGQ;;AArGjB,AAAA,WAAA,PAqGY;AArGZ,AAsGI,OAASzjD,4CAAKb;;;AAtGlB,AAAA,AAAA,2DAAA,3DAASskD,sEAuGQ,EAAE;;AAvGnB,AAAA,WAAA,PAuGY;AAvGZ,AAwGI,OAASzjD,4CAAKb,EAAEqB;;;AAxGpB,AAAA,4BAAA,5BAASijD;AAAT,AAAA,AAAA;;;AAAA,AAAA,kCAAA,lCAASA;;AAAT,AAAA,qCAAA,rCAASA;;AAAT,AAAA,0CAAA,WAAA,mBAAA,qBAAA,7FAASA;AAAT,AAAA,OAAA\/+C,iBAAAqD,qBAAA;;;AAAA;;;wBAAA,xBAAS27C,wDAAQ,KAAK,KAAK,OAAO,aAAuB;AAAzD,AAAA,YAAAD,iBAAiB3gD,KAAK6gD,KAAKC,OAAOC,aAAuBn2B;;;AAAhD+1B,AA8GT,AAAM,AAASA,yBAAQ,KAAAA,iBAAA,WAAA,NAAa,GAAQ,OAAW3yC;AAEvD,qCAAA,rCAAM,AAAqB2yC;AAE3B,AAAM,AAAcA,8BAAQ,WAAK,GAAG;AAAR,AAAa,YAAAA,iBAAA,YAAA,IAAA,XAAanqC,GAAG9hB;;AAGzD,AAAA;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,yCAAA,zCAAS4sD;;AAAT,AAAA,QAAA,JAEY;AAFZ,AAGI,IAAA,mBAAI,CAAGvqD,WAAE0qD;AAAT,AAAA,GAAAxpD;AAAAA;;AAAqB,OAAU0pD;;;;AAHnC,AAAA,AAAA,sCAAA,tCAASL;;AAAT,AAAA,QAAA,JAIS;AAJT,AAKI,GAAI,CAAGvqD,WAAE0qD;AACP,IAAM,IAAE,AAAChwC,4CAAIiwC,cAAO3qD;AAApB,AACE,AAAMA,WAAE,YAAA,XAAKA;;AACb,YAAA8jB,sFAAA,nEAAWxe,EAAE,AAACkZ,gDAAQisC,cAAOnlD;;AAC\/B,OAAOslD;;;;AATb,AAAA,AAAA,wCAAA,xCAASL;;AAAT,AAAA,QAAA,JAUW;AAVX,AAUc,YAAA1sD,MAAA;;;AAVd,AAAA,gCAAA,hCAAS0sD;AAAT,AAAA,AAAA;;;AAAA,AAAA,sCAAA,tCAASA;;AAAT,AAAA,yCAAA,zCAASA;;AAAT,AAAA,8CAAA,WAAA,mBAAA,qBAAA,jGAASA;AAAT,AAAA,OAAA1\/C,iBAAAqD,qBAAA;;;AAAA;;;4BAAA,5BAASs8C,gEAAsB,EAAE,OAAO,WAAW,OAAO;AAA1D,AAAA,YAAAD,qBAA+BvqD,EAAEyqD,OAAOC,WAAWC,OAAOC;;;AAAjDL,AAaT,AAAA;;;;;;;AAAA,AAAA,AAAA,AAAA,8CAAA,9CAASM;;AAAT,AAAA,QAAA,JAES;AAFT,AAGI,GAAA,GAAQ,aAAA,ZAAM5sD;AACZ,IAAA,aAAY,AAACsB,gBAAMtB;QAAnB,AAAA80B,4CAAAg4B,WAAA,IAAA,\/DAAO;QAAP,AAAAh4B,4CAAAg4B,WAAA,IAAA,\/DAAS;AAAT,AACE,AAAM9sD,WAAE,AAACwB,eAAKxB;;AADhB,kBAAA,eAAA,dAEmBqH,EAAEkC;;AAHvB,kBAAA,cAAA;;;;AAHJ,AAAA,wCAAA,xCAASqjD;AAAT,AAAA,AAAA;;;AAAA,AAAA,8CAAA,9CAASA;;AAAT,AAAA,iDAAA,jDAASA;;AAAT,AAAA,sDAAA,WAAA,mBAAA,qBAAA,zGAASA;AAAT,AAAA,OAAAhgD,iBAAAqD,qBAAA;;;AAAA;;;oCAAA,pCAAS48C,gFAA8B;AAAvC,AAAA,YAAAD,6BAAuC5sD;;;AAA9B4sD,AAST,iCAAA,jCAAMG,0EAAsB;AAA5B,AACE,YAAAH,6BAAqB,AAACn1C,cAAIvP;;AAG5B,AAAA;;;;;;;AAAA,AAAA,AAAA,AAAA,iDAAA,jDAAS8kD;;AAAT,AAAA,QAAA,JAES;AAFT,AAGI,GAAA,GAAQ,aAAA,ZAAMhtD;AACZ,IAAM,IAAE,AAACsB,gBAAMtB;AAAf,AACE,AAAMA,WAAE,AAACwB,eAAKxB;;AADhB,kBAAA,eAAA,dAEmB\/B,EAAEA;;AAHvB,kBAAA,cAAA;;;;AAHJ,AAAA,2CAAA,3CAAS+uD;AAAT,AAAA,AAAA;;;AAAA,AAAA,iDAAA,jDAASA;;AAAT,AAAA,oDAAA,pDAASA;;AAAT,AAAA,yDAAA,WAAA,mBAAA,qBAAA,5GAASA;AAAT,AAAA,OAAApgD,iBAAAqD,qBAAA;;;AAAA;;;uCAAA,vCAASg9C,sFAAiC;AAA1C,AAAA,YAAAD,gCAA0ChtD;;;AAAjCgtD,AAST,qCAAA,rCAAME,kFAA0B;AAAhC,AACE,YAAAF,gCAAwB,AAACv1C,cAAIvP;;AAI\/B,sCAAA,tCAAOilD,oFAAqB;AAA5B,AACE,IAAM,MAAI,AAAS\/qD;AAAnB,AACE,QAAA,JAAO;;AAAP,AACE,GACE,CAAIC,OAAIN;AADV;;AAAA,GAEE,aAAA,ZAAM,CAAMK,IAAIL;AAAIA;;AAFtB,AAGQ,eAAO,KAAA,JAAGA;;;;;;;;;AAExB,0CAAA,1CAAOqrD,4FAAyB,IAAI;AAApC,AACE,IAAM,MAAK,AAAShrD;IACd,OAAK,AAAOiF;AADlB,AAEE,QAAA,JAAO;;AAAP,AACE,GACE,CAAIhF,OAAIN;AADV;;AAAA,GAEE,EAAK,qBAAA21B,pBAAU,CAAMt1B,IAAIL,uCACpB,CAAYsrD,SAAK,AAAO,CAAMjrD,IAAIL;AAAMA;;AAH\/C,AAIQ,eAAO,KAAA,JAAGA;;;;;;;;;AAExB,yCAAA,zCAAOurD,0FAAwB,IAAI;AAAnC,AACE,IAAM,MAAK,AAASlrD;IACd,OAAK,AAAOiF;AADlB,AAEE,QAAA,JAAO;;AAAP,AACE,GACE,CAAIhF,OAAIN;AADV;;AAAA,GAEE,EAAK,qBAAA2Q,pBAAS,CAAMtQ,IAAIL,sCACnB,CAAYsrD,SAAK,AAAO,CAAMjrD,IAAIL;AAAMA;;AAH\/C,AAIQ,eAAO,KAAA,JAAGA;;;;;;;;;AAExB,4CAAA,5CAAOwrD,gGAA2B,IAAI;AAAtC,AACE,IAAM,MAAI,AAASnrD;AAAnB,AACE,QAAA,JAAO;;AAAP,AACE,GACE,CAAIC,OAAIN;AADV;;AAAA,GAEE,CAAYsF,MAAE,CAAMjF,IAAIL;AAAIA;;AAF9B,AAGQ,eAAO,KAAA,JAAGA;;;;;;;;;AAExB,wCAAA,xCAAOyrD,wFAAuB,IAAI;AAAlC,AACE,IAAM,MAAI,AAASprD;AAAnB,AACE,QAAA,JAAO;;AAAP,AACE,GACE,CAAIC,OAAIN;AADV;;AAAA,GAEE,AAAC0S,6CAAEpN,EAAE,CAAMjF,IAAIL;AAAIA;;AAFrB,AAGQ,eAAO,KAAA,JAAGA;;;;;;;;;AAExB,2BAAA,3BAAM0rD,8DAAgB,IAAI;AAA1B,AACE,GACE,cAAA\/1B,bAAUrwB;AAAG,OAAC+lD,wCAAwBhrD,IAAIiF;;AAD5C,GAGE,EAAI,AAAUtI,cAAcsI,QAAG,OAASA;AACxC,OAACkmD,0CAA0BnrD,IAAIiF;;AAJjC,GAME,cAAAqL,bAASrL;AAAG,OAACimD,uCAAuBlrD,IAAIiF;;AAN1C,GAQE,MAAA,LAAMA;AACN,OAAC8lD,oCAAoB\/qD;;AATvB,AAWQ,OAACorD,sCAAsBprD,IAAIiF;;;;;;;AAErC,+BAAA,\/BAAOqmD,sEAAoB,EAAE;AAA7B,AACE,OAACD,yBAAe,AAAOlmD,MAAGF;;AAE5B,4BAAA,5BAAOsmD,gEAAiB,IAAI,EAAE;AAA9B,AACE,IAAM,IAAE,AAASvrD;IACX,OAAK,KAAA5D,MAAY,KAAA,JAAG8I;AAD1B,AAEE,cAAA,VAAO;;AAAP,AACE,GAAM,CAAGvF,UAAEuF;AAAX,AACE,CAAMsmD,KAAK7rD,WAAE,CAAMK,IAAIL;;AACvB,eAAO,WAAA,VAAKA;;;;AAFd;;;;AAGF,CAAM6rD,KAAKtmD,KAAED;;AACb,CAAMumD,KAAK,KAAA,JAAKtmD,YAAGiC;;AACnBqkD;;AAEJ,gCAAA,hCAAOC,wEAAqB,EAAE,EAAE;AAAhC,AACE,OAACF,0BAAgB,AAAOpmD,MAAGF,EAAEkC;;AAE\/B,AAAA,AAEA,AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,gDAAAxN,hDAAS8pB;;AAAT,AAAA,AAAA,6DAAA,7DAASA,wEAuEC,KAAK;;AAvEf,AAAA,eAAA,XAuEU;AAvEV,AAwEI,IAAA,WAAMxe;AAAN,AAAA,QAAA2mD;KAAA;AACI,YAAAnoC,mBAAA,eAAA,XAAapY;;;KADjB;AAEI,YAAAoY,mBAAA,eAAA,XAAa\/hB;;;;AAFjB;;;;;AAxEJ,AAAA,AAAA,uCAAA,vCAAS+hB;;6BAEQ;;AAFjB,AAAA,WAAA,PAEY;AAFZ,AAGI,+DAAA,xDAACxJ,iDAASnU,KAAKjK;;6BACF,EAAE;;AAJnB,AAAA,WAAA,PAIY;AAJZ,AAKI,OAACoe,iDAASnU,KAAKjK,EAAEmN;;oBADJ,EAAE;;;6BAAF;;6BAAA,EAAE;;;;;;;;;;AAJnB,AAAA,AAAA,2CAAA,3CAASya;;6BAMY;;AANrB,AAAA,WAAA,PAMgB;AANhB,AAOI,OAACjJ,qDAAa1U,KAAKjK,EAAE,AAACqe,gBAAMpU;;6BACX,EAAE;;AARvB,AAAA,WAAA,PAQgB;AARhB,AASI,OAAC0U,qDAAa1U,KAAKjK,EAAEmN;;oBADJ,EAAE;;;6BAAF;;6BAAA,EAAE;;;;;;;;;;AARvB,AAAA,AAAA,iEAAA,jEAASya,4EA6DG,KAAK;;AA7DjB,AAAA,eAAA,XA6DY;AA7DZ,AA6DoB,uDAAA,hDAAMy1B,8CAAKj0C;;;AA7D\/B,AAAA,AAAA,iEAAA,jEAASwe,4EA8DG,KAAK,EAAE;;AA9DnB,AAAA,eAAA,XA8DY;AA9DZ,AA8D8B,OAAMy1B,8CAAKj0C,EAAEqB;;;AA9D3C,AAAA,AAAA,+DAAA,\/DAASmd,0EAkDA,KAAK;;AAlDd,AAAA,eAAA,XAkDS;AAlDT,AAmDI,GAAM,OAAA,NAAIre;AAAKiG;;AAAf,GACM,OAAA,NAAIjG;AAAK1D;;AADf,AAEe,MAAO,KAAAlE,MAAA;;;;;;AArD1B,AAAA,AAAA,+DAAA,\/DAASimB,0EAuDA,KAAK,EAAE;;AAvDhB,AAAA,eAAA,XAuDS;AAvDT,AAwDI,GAAM,OAAA,NAAIre;AAAKiG;;AAAf,GACM,OAAA,NAAIjG;AAAK1D;;AADf,AAEe4E;;;;;;AA1DnB,AAAA,AAAA,kEAAA,lEAASmd,6EA8EI,KAAK,EAAE;;AA9EpB,AAAA,eAAA,XA8Ea;AA9Eb,AA+EI,OAAA,mFAAWpY,WAAI3J,2DAAK0D,EAAE+B;;;AA\/E1B,AAAA,AAAA,6DAAA,7DAASsc,wEAsBC;;AAtBV,AAAA,eAAA,XAsBU;AAtBV,AAAA;;;AAAA,AAAA,AAAA,iEAAA,jEAASA,4EA+CE;;AA\/CX,AAAA,eAAA,XA+CW;AA\/CX,AAAA;;;AAAA,AAAA,AAAA,gEAAA,hEAASA,2EAYA;;AAZT,AAAA,eAAA,XAYS;AAZT,AAYepY;;;AAZf,AAAA,AAAA,gEAAA,hEAASoY,2EAaA;;AAbT,AAAA,eAAA,XAaS;AAbT,AAae\/hB;;;AAbf,AAAA,AAAA,8DAAA,9DAAS+hB,yEA6BC;;AA7BV,AAAA,eAAA,XA6BU;AA7BV,AA6BgB\/hB;;;AA7BhB,AAAA,AAAA,6DAAA,7DAAS+hB,wEA+BA;;AA\/BT,AAAA,eAAA,XA+BS;AA\/BT,AAAA,0FA+BgBpY;;;AA\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\/BhB,AAAA,eAAA,XA+BW;AA\/BX,AA+BuB,OAAC9wC,2BAAiBjV,SAAKwD;;;AA\/B9C,AAAA,AAAA,0FAAA,1FAASuiD,qGAsCE;;AAtCX,AAAA,eAAA,XAsCW;AAtCX,AAsCiB,OAACljD,qBAAW,AAASsS,qBAAMxJ;;;AAtC5C,AAAA,AAAA,8EAAA,9EAASo6C,yFA0DG,KAAK;;AA1DjB,AAAA,eAAA,XA0DY;AA1DZ,AA0DoB,OAAC7vC,mDAAWzhB,EAAEuL;;;AA1DlC,AAAA,AAAA,8EAAA,9EAAS+lD,yFA2DG,KAAK,EAAE;;AA3DnB,AAAA,eAAA,XA2DY;AA3DZ,AA2D0B,OAAC3vC,mDAAW3hB,EAAEyO,MAAMlD;;;AA3D9C,AAAA,AAAA,0EAAA,1EAAS+lD,qFA4CE;;AA5CX,AAAA,eAAA,XA4CW;AA5CX,AA6CI,YAAApoC,yEAAA,tDAAW,CAAMzjB,WAAIL,WAAG,CAAMK,WAAI,YAAA,XAAKL;;;AA7C3C,AAAA,AAAA,yEAAA,zEAASksD,oFA+CC;;AA\/CV,AAAA,eAAA,XA+CU;AA\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\/5B,4CAAAk6B,WAAA,IAAA,\/DAAS;QAAT,AAAAl6B,4CAAAk6B,WAAA,IAAA,\/DAAW;AAAX,AAAA,AACE,CAACryD,kCAAAA,uCAAAA,PAAE4M,mBAAAA,jBAAElC,mBAAAA;;AADP;AAAA,eAAA4nD;eAAAF;eAAAD;eAAA,CAAAD,WAAA;;;;;;;AAAA,IAAA,qBAAA,AAAAp3C,cAAAw3C;AAAA,AAAA,GAAAh6B;AAAA,AAAA,IAAA,iBAAAA;AAAA,AAAA,GAAA,AAAA7R,6BAAA6rC;AAAA,IAAA,kBAAA,AAAA\/5B,sBAAA+5B;AAAA,AAAA,eAAA,AAAA95B,qBAAA85B;eAAA75B;eAAA,AAAA9Y,gBAAA8Y;eAAA;;;;;;;AAAA,IAAA,aAAA,AAAA9zB,gBAAA2tD;QAAA,AAAAn6B,4CAAAo6B,WAAA,IAAA,\/DAAS;QAAT,AAAAp6B,4CAAAo6B,WAAA,IAAA,\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\/BAAqB\/V,YAAKgQ,WAAI5Y;;;;;;AA3GxC,AAAA,AAAA,6FAAA,7FAAS2e,wGA6GU,KAAK;;AA7GxB,AAAA,eAAA,XA6GmB;AA7GnB,AA8GI,UAAK,8CAAA,7CAAI,AAAC2sC,6BAAmBxlD,SAAKb;;;AA9GtC,AAAA,AAAA,yEAAA,zEAAS0Z,oFAyEA;;AAzET,AAAA,eAAA,XAyES;AAzET,AA0EI,qDAAA,IAAA,lDAACutC,mCAAyBlsD;;;AA1E9B,AAAA,AAAA,gFAAA,hFAAS2e,2FA0BM,KAAK;;AA1BpB,AAAA,eAAA,XA0Be;AA1Bf,AA0B0B,YAAAA,6BAAqB\/V,SAAKgQ,WAAI5Y,WAAIwzB;;;AA1B5D,AAAA,AAAA,6EAAA,7EAAS7U,wFAgCC,KAAK;;AAhCf,AAAA,eAAA,XAgCU;AAhCV,AAiCI,GAAI,AAACoC,wBAAQ1W;AACX,OAAQvE,oDAAK,mDAAA,nDAAC+S,6CAAKxO,WAAS,mDAAA,nDAACwO,6CAAKxO;;AAClC,IAAO,MAAIvE;IAAK,KAAG,AAACuP,cAAIhL;;AAAxB,AACE,GAAI,OAAA,NAAM0iD;AACRlyC;;AACA,IAAM,IAAE,AAAC3b,gBAAM6tD;AAAf,AACE,GAAI,AAAChsC,wBAAQzgB;AACX,eAAO,AAAQua,+CAAI,+CAAA,\/CAAChC,6CAAKvY,OAAK,+CAAA,\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\/DnB,AAAA,gBAAA,ZA+Da;AA\/Db,AAgEI,oBAAIS;AACF,IAAM,MAAI,AAACzC,6BAAmB3\/C,UAAMN;AAApC,AACE,GAAM,QAAA,PAAIrK;AAAV,AACE,CAAMhB,WAAIgB,OAAI,CAAMhB,WAAI,cAAA,bAAGC;;AAC3B,CAAMD,WAAI,OAAA,NAAKgB,cAAK,CAAMhB,WAAI,cAAA,bAAKC;;AACnC,IAAA,iBAAMD;AAAN,AAAA,AAAAiuD;;AAAA,AAAAA;;AAAAA;AACA,AAAMhuD,aAAI,cAAA,bAAGA;;AAJf;;AAKA0L;;AACF,MAAO,KAAAnO,MAAA;;;;AAxEb,AAAA,AAAA,6CAAA,7CAAS8vD;;6BAAT,OA2EkB;;AA3ElB,AAAA,IAAA,aAAA;AAAA,AAAA,YAAAp8C,RA2EY;AA3EZ,AA4EI,wDAAA,jDAASvF,6CAAMN;;6BA5EnB,OA6EkB,IAAI;;AA7EtB,AAAA,IAAA,aAAA;AAAA,AAAA,YAAA6F,RA6EY;AA7EZ,AA8EI,OAASvF,6CAAMN,IAAI\/E;;oBA9EvB,OA6EkB,IAAI;;;6BA7EtB,OA6EkB;;6BA7ElB,OA6EkB,IAAI;;;;;;;;;;AA7EtB,AAAA,AAAA,8CAAA,WAAA,OAAA,hEAASgnD;;AAAT,AAAA,IAAA,aAAA;AAAA,AAAA,OAAA,AAAAp8C,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAAnR,iBAAA8tD;;;AAAA,AAAA,AAAA,sEAAA,tEAASP,iFA2ES;;AA3ElB,AAAA,YAAA,RA2EY;AA3EZ,AA4EI,wDAAA,jDAAS3hD,6CAAMN;;;AA5EnB,AAAA,AAAA,sEAAA,tEAASiiD,iFA6ES,IAAI;;AA7EtB,AAAA,YAAA,RA6EY;AA7EZ,AA8EI,OAAS3hD,6CAAMN,IAAI\/E;;;AA9EvB,AAAA,uCAAA,vCAASgnD;AAAT,AAAA,AAAA;;;AAAA,AAAA,6CAAA,7CAASA;;AAAT,AAAA,gDAAA,hDAASA;;AAAT,AAAA,qDAAA,WAAA,mBAAA,qBAAA,xGAASA;AAAT,AAAA,OAAA9iD,iBAAAqD,qBAAA;;;AAAA;;;mCAAA,nCAASigD,8EAA6B,gBACA,IACV;AAF5B,AAAA,YAAAR,4BAAsCS,gBACA9tD,IACVD;;;AAFnBstD,AAgFT,AAAA,AAEA,yCAAA,zCAAOU,0FAA2B,IAAI;AAAtC,AACE,IAAO,MAAI,AAAC1zB,qBAAU,AAASsuB;QAA\/B,JACO;;AADP,AAEE,GAAI,CAAGjpD,IAAEM;AACP,eAAO,AAAC4oD,oDAAOhF,IAAI,CAAM7jD,IAAIL,IAAG,CAAMK,IAAI,KAAA,JAAKL;eAAK,KAAA,JAAGA;;;;;AACvDkkD;;;;;AAIN,AAAA;;;;;;;AAAA;AAAA,AAAA,yBAAA,zBAASqK;AAAT,AAAA,AAAA;;;AAAA,AAAA,+BAAA,\/BAASA;;AAAT,AAAA,kCAAA,lCAASA;;AAAT,AAAA,uCAAA,WAAA,mBAAA,qBAAA,1FAASA;AAAT,AAAA,OAAA1jD,iBAAAqD,qBAAA;;;AAAA;;;qBAAA,rBAASsgD,kDAAe;AAAxB,AAAA,YAAAD,cAAwBxsD;;;AAAfwsD,AAET,AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,AAEA,qBAAA,rBAAeE,kDAAU,IAAI;AAA7B,AACE,GACE,CAAY\/iD,QAAI\/B;AADlB;;AAAA,GAEE,AAACqsB,mCAAmBtqB,IAAI\/B;AAF1B;;AAAA,AAGQ,OAAC+I,6CAAEhH,IAAI\/B;;;;;AAEjB,iBAAA,jBAAO+kD,0CAAM,KAAK;AAAlB,AACE,2BAAA,nBAAS,CAA2B3+C,SAAK6yC;;AAE3C,AAAA,0BAAA,kCAAA,5DAAOgM;AAAP,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,sDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA\/wD,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,wDAAA,xDAAO+wD,mEACH,IAAI,EAAE;AADV,AAEK,IAAA,WAAM,AAACxuD,iBAAOC;AAAd,AAAA,CAAAwuD,SACQ7uD,KAAES;;AADVouD;;;AAFL,AAAA,wDAAA,xDAAOD,mEAIH,IAAI,EAAE,EAAE,EAAE;AAJd,AAKK,IAAA,WAAM,AAACxuD,iBAAOC;AAAd,AAAA,CAAAyuD,SACQ9uD,KAAES;;AADV,CAAAquD,SAEQzpD,KAAEL;;AAFV8pD;;;AALL,AAAA,kDAAA,lDAAOF;;AAAP,AASA,wBAAA,xBAAOG,wDAAa,IAAI;AAAxB,AACE,IAAM,UAAQ,KAAAtyD,MAAY,cAAA,bAAG,AAAS4D;AAAtC,AACE,yBAAA,YAAA,rCAAC2hB,qBAAW3hB,QAAME,YAAU,CAAA,MAAKP;;AACjC,AAACgiB,qBAAW3hB,IAAI,CAAA,MAAK,KAAA,JAAKL,UAAIO,QAAQ,CAAA,MAAKP,GAAG,CAAG,AAASO,iBAAS,CAAA,MAAKP;;AACxEO;;AAEJ,sCAAA,tCAAOyuD,oFAA2B,OAAO;AAAzC,AACE,OAAC59B,oBAAU,CAAS69B,SAAO,OAAA,NAAKC;;AAElC,mBAAA,nBAAOC,8CAAQ,KAAK;AAApB,AACE,QAAA,OAAkB,EAAMp\/C,SAAK6yC;;AAE\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\/K7C,AAAA,YAAA,RA+KmB;AA\/KnB,AAgLI,IAAM,MAAI,MAAA,EAAQpgD,SAAK6yC;AAAvB,AACE,GAAI,2BAAA,1BAAO,CAASqM,gBAAOC;AACzBI;;AACA,IAAM,MAAY,AAACN,oCAA0BC,cAAOC;IAC9C,aAAY,CAAM7uD,WAAI,CAAA,MAAKgB;IAC3B,cAAY,CAAMhB,WAAI,eAAA,dAAK,CAAA,MAAKgB;AAFtC,AAGE,GAAM,eAAA,dAAMovD;AACN,IAAM,IAAE,AAAiBC,gCAAY\/Q,SAAK,SAAA,RAAGiD,aAAS7yC,KAAKrE,IAAIylD;AAA\/D,AACE,GAAM,CAAY1rD,MAAEirD;AAAapB;;AAAjC,GACM,GAAK,MAAA,LAAM7pD;AAAI,OAACurD,qDAAa1B,MAAM3P,SAAK,eAAA,dAAK,CAAA,MAAKt+C,YAAMoE;;AAD9D,GAEM,CAAIwpD,kBAAOC;AAFjB;;AAAA,AAGY,OAAuBI,2BAAM3P,SAAKuP,IAAI7tD;;;;;;AAL1D,GAMM,AAACotD,mBAAS\/iD,IAAI+kD;AACd,AAAI,0BAAA,1BAAM,AAAOU;;AACb,OAAuB7B,2BAAM3P,SAAKuP,IAAI7tD;;AARhD,AASYiuD;;;;;;;AA\/LtB,AAAA,AAAA,6DAAA,7DAASa,wEAkGsB,EAAE,IAAI;;AAlGrC,AAAA,YAAA,RAkGyB;AAlGzB,AAmGI,GAAI,CAAIlB,kBAAOC;AAAf;;AAEE,IAAM,WAAS,AAAkBI,sBAAM3uD;IACjC,OAAS,AAAO4uD;IAChB,MAAS,AAASwB;AAFxB,AAGE,AAAM,AAAUxB,kBAAU,CAASL,MAAI,AAAUK;;AACjD,AAACvtC,qBAAW+uC,KAAK,CAAA,MAAK,KAAA,JAAK\/wD,UACf+wD,KAAK,CAAA,MAAK\/wD,GACV,CAAGM,MAAI,CAAA,MAAK,KAAA,JAAKN;;AAC7B,qBAAA,pBAAM+wD,KAAK,OAAA,NAAGzwD;;AACd,qBAAA,pBAAMywD,KAAK,OAAA,NAAKzwD;;AAChBivD;;;;AA9GR,AAAA,AAAA,kDAAA,lDAASY;;AAAT,AAAA,YAAA,RAuFc;AAvFd,AAwFI,OAACW,yDAAiBzwD;;;AAxFtB,AAAA,AAAA,kDAAA,lDAAS8vD,6DAiMW,EAAE;;AAjMtB,AAAA,YAAA,RAiMc;AAjMd,AAkMI,OAACX,0BAAgBnvD,WAAIzF,EAAE4O;;;AAlM3B,AAAA,AAAA,qDAAA,rDAAS2mD,gEAiEc,MAAM,KAAK,IAAI;;AAjEtC,AAAA,YAAA,RAiEiB;AAjEjB,AAkEI,IAAM,MAAI,MAAA,EAAQpgD,SAAK6yC;AAAvB,AACE,GAAI,2BAAA,1BAAO,CAASqM,gBAAOC;AACzBvoD;;AACA,IAAM,MAAY,AAACqoD,oCAA0BC,cAAOC;IAC9C,aAAY,CAAM7uD,WAAI,CAAA,MAAKgB;IAC3B,cAAY,CAAMhB,WAAI,eAAA,dAAK,CAAA,MAAKgB;AAFtC,AAGE,GAAM,eAAA,dAAMovD;AAAa,OAAeC,yBAAY,SAAA,RAAG9N,aAAS7yC,KAAKrE,IAAI\/E;;AAAzE,GACM,AAAC8nD,mBAAS\/iD,IAAI+kD;AAAYC;;AADhC,AAEY\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\/E;;AAAtE,GACM,AAAC8nD,mBAAS\/iD,IAAI+kD;AAAqB,YAAA3sC,0CAAA,vBAAW2sC,WAAWC;;AAD\/D,AAEY\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\/C1B,AAAA,YAAA,RA+CoB;AA\/CpB,AAgDI,GAAI,CAAY7vD,MAAEg\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\/E7C,AAAA,YAAA,RA+EmB;AA\/EnB,AAgFI,IAAM,MAAI,AAACF,yCAA+BrxD,WAAI4Y,WAAIvN;AAAlD,AACE,GAAI,SAAA,RAAIrK;AACNiuD;;AACA,AAAI,0BAAA,1BAAM,AAAO6B;;AACb,GAAI,gBAAA,fAAIl4C;AAAR;;AAEE,IAAM,WAAS,AAAkBq2C,sBAAM3P;IACjC,OAAS,AAAO4P;AADtB,AAEE,CAAMwB,KAAK1vD,OAAI,CAAM0vD,KAAK,sBAAA,rBAAG,CAAA,MAAK93C;;AAClC,CAAM83C,KAAK,OAAA,NAAK1vD,cAAK,CAAM0vD,KAAK,sBAAA,rBAAK,CAAA,MAAK93C;;AAC1C,oCAAA,nCAAM83C,KAAK,sBAAA,rBAAK,CAAA,MAAK93C;;AACrB,oCAAA,nCAAM83C,KAAK,sBAAA,rBAAG,CAAA,MAAK93C;;AACnB,AAAM,AAAOs2C,eAAU,gBAAA,fAAK,AAAOA;;AACnCA;;;;;AA7FhB,AAAA,AAAA,kDAAA,lDAASqC;;AAAT,AAAA,YAAA,RAwCc;AAxCd,AAyCI,OAACd,yDAAiBzwD;;;AAzCtB,AAAA,AAAA,kDAAA,lDAASuxD,6DA+FW,EAAE;;AA\/FtB,AAAA,YAAA,RA+Fc;AA\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\/C;AAChB,AAAI,AAAMt\/C,aAAIc;;AACV,AAAM8X,aAAIrC;;AACV04C;;AACJ,YAAAsC,4BAAoBjS,YAAKmS,sBAAel7C,MAAMzV;;;;AAvDpD,AAAA,AAAA,mDAAA,nDAASywD,8DAkCY,MAAM,KAAK,IAAI;;AAlCpC,AAAA,YAAA,RAkCe;AAlCf,AAmCI,IAAM,MAAI,AAACF,yCAA+BrxD,WAAI4Y,WAAIvN;AAAlD,AACE,GAAM,OAAA,NAAGrK;AAAoBsF;;AAA7B,GACM,AAAC8nD,mBAAS\/iD,IAAI,CAAMrL,WAAIgB;AAAM,YAAAyiB,+DAAA,5CAAW,CAAMzjB,WAAIgB,MAAK,CAAMhB,WAAI,OAAA,NAAKgB;;AAD7E,AAE6BsF;;;;;;AAtCnC,AAAA,AAAA,sDAAA,tDAASirD,iEAsBe,MAAM,KAAK;;AAtBnC,AAAA,YAAA,RAsBkB;AAtBlB,AAuBI,IAAM,MAAI,AAACF,yCAA+BrxD,WAAI4Y,WAAIvN;AAAlD,AACE,GAAM,SAAA,RAAIrK;AAAQiuD;;AAAlB,GACM,gBAAA,fAAIr2C;AADV;;AAAA,AAEY,YAAA24C,4BAAA,KAAwBE,sBAAe,cAAA,bAAK74C,kBAAK,AAAC81C,sBAAY1uD,WAAI,mBAAA,nBAAC+uB,eAAK\/tB;;;;;;AA1B1F,AAAA,AAAA,8EAAA,9EAASuwD,yFAmGK;;AAnGd,AAAA,eAAA,XAmGc;AAnGd,AAoGI,YAAAhC,kCAAA,IAAA,KAAA,pBAAevvD;;;AApGnB,AAAA,uCAAA,vCAASuxD;AAAT,AAAA,AAAA;;;AAAA,AAAA,6CAAA,7CAASA;;AAAT,AAAA,gDAAA,hDAASA;;AAAT,AAAA,qDAAA,WAAA,mBAAA,qBAAA,xGAASA;AAAT,AAAA,OAAA\/mD,iBAAAqD,qBAAA;;;AAAA;;;mCAAA,nCAAS2jD,8EAAmB,KACU,eACA,IACA;AAHtC,AAAA,YAAAD,4BAA4BjS,KACUmS,eACA74C,IACA5Y;;;AAH7BuxD,AAsGT,AAAA,wBAAA,gCAAA,xDAAOI;AAAP,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,oDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,oDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAn0D,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,sDAAA,tDAAOm0D,iEACH,MAAM,KAAK,KAAK,SAAS,KAAK;AADlC,AAEK,IAAM,WAAS,AAAC7hD,eAAK8hD;AAArB,AACE,GAAI,CAAIC,aAASC;AACf,YAAAP,4BAAA,cAAA,TAAwBM,aAAW,CAAOD,KAAKG,KAAKC,KAAKC;;AACzD,IAAM,oBAAY,KAAA\/D,cAAA;AAAlB,OACM,AAAS4B,AACT,8CAAcvN,MAAMsP,SAASD,KAAKG,KAAK7B,9EACvC,6GAAc3N,MAAMuP,SAASE,KAAKC,KAAK\/B;;;;AARtD,AAAA,sDAAA,tDAAOyB,iEASH,KAAK,MAAM,KAAK,KAAK,SAAS,KAAK;AATvC,AAUK,IAAM,WAAS,AAAC7hD,eAAK8hD;AAArB,AACE,GAAI,CAAIC,aAASC;AACf,YAAAP,4BAAA,cAAA,TAAwBM,aAAW,CAAOD,KAAKG,KAAKC,KAAKC;;AACzD,IAAM,oBAAY,KAAA\/D,cAAA;AAAlB,OACM,AAAS4B,AACT,oDAAexQ,KAAKiD,MAAMsP,SAASD,KAAKG,KAAK7B,zFAC7C,8HAAe5Q,KAAKiD,MAAMuP,SAASE,KAAKC,KAAK\/B;;;;AAhB5D,AAAA,gDAAA,hDAAOyB;;AAAP,AAkBA,AAAA;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,uCAAA,vCAASO;;AAAT,AAAA,WAAA,PAEa;AAFb,AAGI,OAACjkD,uBAAQnI;;;AAHb,AAAA,AAAA,oCAAA,pCAASosD,+CAIM;;AAJf,AAAA,YAAA,RAIU;AAJV,AAKI,OAAQxtD,2CAAK4E;;;AALjB,AAAA,AAAA,sCAAA,tCAAS4oD;;6BAMQ;;AANjB,AAAA,WAAA,PAMY;AANZ,AAOI,+DAAA,xDAACj4C,iDAASnU,KAAKjK;;6BACF,EAAE;;AARnB,AAAA,WAAA,PAQY;AARZ,AASI,OAACoe,iDAASnU,KAAKjK,EAAEmN;;oBADJ,EAAE;;;6BAAF;;6BAAA,EAAE;;;;;;;;;;AARnB,AAAA,AAAA,0CAAA,1CAASkpD;;6BAUY;;AAVrB,AAAA,WAAA,PAUgB;AAVhB,AAWI,OAAC13C,qDAAa1U,KAAKjK,EAAE,AAACqe,gBAAMpU;;6BACX,EAAE;;AAZvB,AAAA,WAAA,PAYgB;AAZhB,AAaI,OAAC0U,qDAAa1U,KAAKjK,EAAEmN;;oBADJ,EAAE;;;6BAAF;;6BAAA,EAAE;;;;;;;;;;AAZvB,AAAA,AAAA,4DAAA,5DAASkpD,uEAgBC;;AAhBV,AAAA,eAAA,XAgBU;AAhBV,AAgBgBtpD;;;AAhBhB,AAAA,AAAA,4DAAA,5DAASspD,uEAyCC;;AAzCV,AAAA,eAAA,XAyCU;AAzCV,AA0CI,GAAI,aAAA,ZAAMt0D;AACR,8FAAA,vFAACw0D,yDAAiBpC,aAAM,YAAA,XAAGrwD;;AAC3B,OAACyyD,yDAAiBpC,aAAMrwD,SAAE,AAACP,eAAKxB;;;;AA5CtC,AAAA,AAAA,4DAAA,5DAASs0D,uEAqDC;;AArDV,AAAA,eAAA,XAqDU;AArDV,AAqDgB,IAAA,kBAAqC1+B;AAArC,AAAA,GAAA,GAAA,CAAA3hB,mBAAA;AAAAA;;AAAA,IAAA,sBAAA,4BAAc\/L,5BAAK0Q;AAAnB,AAAA,gBAAA3E,hBAAqC2hB;;AAArC3hB;;;;AArDhB,AAAA,AAAA,8DAAA,9DAASqgD,yEAkDE,KAAK;;AAlDhB,AAAA,eAAA,XAkDW;AAlDX,AAkDuB,OAACn3C,2BAAiBjV,SAAKwD;;;AAlD9C,AAAA,AAAA,4EAAA,5EAAS4oD,uFAyBE;;AAzBX,AAAA,eAAA,XAyBW;AAzBX,AAyBiB,OAACvpD,qBAAW,AAASsS,qBAAMrS;;;AAzB5C,AAAA,AAAA,gEAAA,hEAASspD,2EAwDG,KAAK;;AAxDjB,AAAA,eAAA,XAwDY;AAxDZ,AAwDoB,OAACl2C,mDAAWzhB,EAAEuL;;;AAxDlC,AAAA,AAAA,gEAAA,hEAASosD,2EAyDG,KAAK,EAAE;;AAzDnB,AAAA,eAAA,XAyDY;AAzDZ,AAyD0B,OAACh2C,mDAAW3hB,EAAEyO,MAAMlD;;;AAzD9C,AAAA,AAAA,4DAAA,5DAASosD,uEA6BE;;AA7BX,AAAA,eAAA,XA6BW;AA7BX,AA8BI,GAAI,aAAA,ZAAMt0D;AACR,YAAA6lB,6EAAA,1DAAW,CAAMusC,aAAMrwD,WAAG,CAAMqwD,aAAM,YAAA,XAAKrwD;;AAC3C,OAACT,gBAAMtB;;;;AAhCb,AAAA,AAAA,2DAAA,3DAASs0D,sEAkCC;;AAlCV,AAAA,eAAA,XAkCU;AAlCV,AAmCI,IAAM,MAAI,EAAI,aAAA,ZAAMt0D,mBACR,uFAAA,vFAACw0D,yDAAiBpC,aAAM,YAAA,XAAGrwD,sBAC3B,AAACyyD,yDAAiBpC,aAAMrwD,SAAE,AAACP,eAAKxB;AAF5C,AAGE,GAAA,GAAQ,QAAA,PAAMid;AAAKA;;AAAnB;;;;AAtCN,AAAA,AAAA,8DAAA,9DAASq3C,yEA+CA;;AA\/CT,AAAA,gBAAA,ZA+CS;AA\/CT,AA+CextD;;;AA\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\/pD,SAAKonD,aAAMrwD,SAAE\/B,SAAE41B;;;AAnBxD,AAAA,AAAA,uEAAA,vEAASm\/B,kFAsBC,KAAK;;AAtBf,AAAA,eAAA,XAsBU;AAtBV,AAsBkB,OAAC33C,eAAK3V,EAAES;;;AAtB1B,AAAA,kCAAA,lCAAS6sD;AAAT,AAAA,AAAA;;;AAAA,AAAA,wCAAA,xCAASA;;AAAT,AAAA,2CAAA,3CAASA;;AAAT,AAAA,gDAAA,WAAA,mBAAA,qBAAA,nGAASA;AAAT,AAAA,OAAAnoD,iBAAAqD,qBAAA;;;AAAA;;;8BAAA,9BAAS+kD,oEAAc,KAAK,MAAM,EAAE,EAAY;AAAhD,AAAA,YAAAD,uBAAuB\/pD,KAAKonD,MAAMrwD,EAAE\/B,EAAY41B;;;AAAvCm\/B,AAmDT,IAAA,iBAAA,AAAcA;IAAd,iBAAAz0D;IAAA,iBAAA;;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAA6X,uBAAAqF;;;AAAA,AAAA,AAAAxL,gBAAAkjD,eAAAC,eAAAC;AAEA,AAAA,kCAAA,0CAAA,5EAAOE;AAAP,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,8DAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,8DAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA11D,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,gEAAA,hEAAO01D,2EACH;AADJ,AACW,qEAAA,WAAA,IAAA,7EAACL,mEAA0B7C;;;AADtC,AAAA,gEAAA,hEAAOkD,2EAEH,KAAK,MAAM,EAAE;AAFjB,AAGK,GAAI,MAAA,LAAMt1D;AACR,IAAM,MAAI,AAASoyD;AAAnB,AACE,IAAO,IAAErwD;;AAAT,AACE,GAAI,CAAGqF,IAAE\/E;AACP,IAAA,qBAAY,CAAM+vD,MAAMhrD;AAAxB,AAAA,oBAAArH;AAAA,SAAAA,LAAS;AAAT,AACE,IAAA,yBAAY,AAAYw1D;AAAxB,AAAA,oBAAAx1D;AAAA,SAAAA,LAAS;AAAT,AACE,YAAAg1D,+CAAA,xBAAe\/pD,KAAKonD,MAAM,KAAA,JAAKhrD,SAAGqM;;AAClC,eAAO,KAAA,JAAKrM;;;;;AACd,eAAO,KAAA,JAAKA;;;;;AALhB;;;;;AAMJ,YAAA2tD,sCAAA,fAAe\/pD,KAAKonD,MAAMrwD,EAAE\/B;;;;AAZnC,AAAA,0DAAA,1DAAOs1D;;AAAP,AAcA,AAAA;;;;;;;;;AAAA,AAAA,AAAA,AAAA,0CAAA,1CAASE;;AAAT,AAAA,QAAA,JAEY;AAFZ,AAGI,SAAI,GAAcI,mBAAM,AAAmBD;;;AAH\/C,AAAA,AAAA,uCAAA,vCAASH;;AAAT,AAAA,QAAA,JAIS;AAJT,AAKI,GAAA,GAAiBI;AACf,AACE,cAAA,dAAMA;;AACN,YAAA\/vC,mBAAA,oBAAA,fAAe6vC;;AACjB,OAAOC;;;;AATb,AAAA,AAAA,yCAAA,zCAASH;;AAAT,AAAA,QAAA,JAUW;AAVX,AAUc,YAAA51D,MAAA;;;AAVd,AAAA,iCAAA,jCAAS41D;AAAT,AAAA,AAAA;;;AAAA,AAAA,uCAAA,vCAASA;;AAAT,AAAA,0CAAA,1CAASA;;AAAT,AAAA,+CAAA,WAAA,mBAAA,qBAAA,lGAASA;AAAT,AAAA,OAAA5oD,iBAAAqD,qBAAA;;;AAAA;;;6BAAA,7BAASwlD,kEAAa,QAAQ,UAAoB;AAAlD,AAAA,YAAAD,sBAAsBE,QAAQC,UAAoBC;;;AAAzCJ,AAYT,AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,yDAAAz5D,zDAASivD;;AAAT,AAAA,AAAA,sEAAA,tEAASA,iFAwGC,KAAK;;AAxGf,AAAA,eAAA,XAwGU;AAxGV,AAyGI,GACE,MAAA,LAAM3jD;AAAG,GAAM0uD;AAAN,AAAe,YAAAlwC,mBAAA,oBAAA,fAAe6vC;;AAA9B;;;AADX,GAEE,gBAAA,fAAM\/Z;AAFR;;AAAA,AAGQ,8BAAA,wBAAA,\/CAAaA,2BAAO,AAACzpC,eAAK7K,GAAGA;;;;;;AA5GzC,AAAA,AAAA,iDAAA,jDAAS2jD;;AAAT,AAAA,WAAA,PAEa;AAFb,AAGI,OAAC36C,uBAAQnI;;;AAHb,AAAA,AAAA,8CAAA,9CAAS8iD,yDAIM;;AAJf,AAAA,YAAA,RAIU;AAJV,AAKI,OAAQlkD,2CAAK4E;;;AALjB,AAAA,AAAA,6CAAA,7CAASs\/C;;AAAT,AAAA,WAAA,PAQS;AART,AASI,OAAC7yC,uBAAa,AAACw2C,eAAKzmD;;;AATxB,AAAA,AAAA,gDAAA,hDAAS8iD;;AAAT,AAAA,WAAA,PAUY;AAVZ,AAWI,OAAC+B,+BAAqB,AAACt1C,cAAIvP;;;AAX\/B,AAAA,AAAA,+CAAA,\/CAAS8iD;;AAAT,AAAA,WAAA,PAYW;AAZX,AAaI,OAAC7yC,uBAAa,AAACy2C,eAAK1mD;;;AAbxB,AAAA,AAAA,4CAAA,5CAAS8iD,uDAcI;;AAdb,AAAA,WAAA,PAcQ;AAdR,AAeI,OAACrlC,0BAAUzd,KAAKb;;;AAfpB,AAAA,AAAA,4CAAA,5CAAS2jD,uDAgBI,EAAE;;AAhBf,AAAA,WAAA,PAgBQ;AAhBR,AAiBI,OAAS9iD,4CAAKb,EAAEqB;;;AAjBpB,AAAA,AAAA,gDAAA,hDAASsiD,2DAkBQ;;AAlBjB,AAAA,WAAA,PAkBY;AAlBZ,AAmBI,IAAA,aAAA,AAAAvzC,cAAcvP;IAAd,eAAA;IAAA,eAAA;IAAA,WAAA;;AAAA,AAAA,GAAA,AAAA,CAAA8tD,WAAAC;AAAA,IAAA,aAAA,AAAAC,kDAAAF;QAAA,AAAAlhC,4CAAAqhC,WAAA,IAAA,\/DAAS;QAAT,AAAArhC,4CAAAqhC,WAAA,IAAA,\/DAAW;AAAX,AAAA,AACE,CAACx5D,kCAAAA,uCAAAA,PAAE4M,mBAAAA,jBAAElC,mBAAAA;;AADP;AAAA,eAAA+uD;eAAAF;eAAAD;eAAA,CAAAD,WAAA;;;;;;;AAAA,IAAA,qBAAA,AAAAv+C,cAAA2+C;AAAA,AAAA,GAAAnhC;AAAA,AAAA,IAAA,iBAAAA;AAAA,AAAA,GAAA,AAAA7R,6BAAAgzC;AAAA,IAAA,kBAAA,AAAAlhC,sBAAAkhC;AAAA,AAAA,eAAA,AAAAjhC,qBAAAihC;eAAAhhC;eAAA,AAAA9Y,gBAAA8Y;eAAA;;;;;;;AAAA,IAAA,aAAA,AAAA9zB,gBAAA80D;QAAA,AAAAthC,4CAAAuhC,WAAA,IAAA,\/DAAS;QAAT,AAAAvhC,4CAAAuhC,WAAA,IAAA,\/DAAW;AAAX,AAAA,AACE,CAAC15D,kCAAAA,uCAAAA,PAAE4M,mBAAAA,jBAAElC,mBAAAA;;AADP;AAAA,eAAA,AAAA7F,eAAA40D;eAAA;eAAA;eAAA;;;;;;;;AAAA;;;;;;;AAnBJ,AAAA,AAAA,0EAAA,1EAASpL,qFAwEG,KAAK;;AAxEjB,AAAA,eAAA,XAwEY;AAxEZ,AAyEI,yDAAA,lDAAS9iD,gDAAKb;;;AAzElB,AAAA,AAAA,0EAAA,1EAAS2jD,qFA2EG,KAAK,EAAE;;AA3EnB,AAAA,eAAA,XA2EY;AA3EZ,AA4EI,GAAM,MAAA,LAAM3jD;AAAM,GAAI0uD;AACFL;;AACAhtD;;;AAFpB,GAGM,gBAAA,fAAMizC;AAAMjzC;;AAHlB,AAIkB,gCAAA,zBAAeizC,6BAAO,AAACzpC,eAAK7K,GAAGA,EAAEqB;;;;;;AAhFvD,AAAA,AAAA,+EAAA,\/EAASsiD,0FA2HM,KAAK,EAAE;;AA3HtB,AAAA,eAAA,XA2He;AA3Hf,AA4HI,IAAM,WAAK,EAAI+K,uBAAS,wEAAA,wCAAA,\/GAACp5D,kCAAAA,4DAAAA,5BAAE4O,wCAAAA,9BAASmqD,wCAAAA,iBAASnqD;AAA7C,AACE,GACE,AAACkP,yBAASlP;AADZ,OAAAqP,gBAC4BrP;;AAD5B,GAEE,GAAK,gBAAA,fAAMowC;AAAO,OAAChhC,oBAAU,AAAYghC,sBAAKh\/C,EAAE4O;;AAFlD,AAG2BA;;;;;;AAhIjC,AAAA,AAAA,8EAAA,9EAASy\/C,yFA0BK;;AA1Bd,AAAA,eAAA,XA0Bc;AA1Bd,AA2BI,IAAM,YAAU,EAAarP,aAAK,AAAC3rC,oBAAU2rC,aAAM,AAACvW;AAApD,AACE,GAAI2wB;AACF,YAAAP,+CAAA,zBAAcE,eAAQC;;AACtBA;;;;AA9BR,AAAA,AAAA,sEAAA,tEAAS3K,iFAoCC;;AApCV,AAAA,eAAA,XAoCU;AApCV,AAoCgBhgD;;;AApChB,AAAA,AAAA,4EAAA,5EAASggD,uFAuBE;;AAvBX,AAAA,YAAA,RAuBW;AAvBX,AAuBc,YAAAA,4BAAoBhgD,YAAKgQ,WAAI2gC,YAAKoa,sBAASL,eAAQ9\/B;;;AAvBjE,AAAA,AAAA,0EAAA,1EAASo1B,qFAqEE;;AArEX,AAAA,eAAA,XAqEW;AArEX,AAqEiBhwC;;;AArEjB,AAAA,AAAA,sEAAA,tEAASgwC,iFA0DC;;AA1DV,AAAA,eAAA,XA0DU;AA1DV,AA0DgB,IAAA,kBAAuCp1B;AAAvC,AAAA,GAAA,GAAA,CAAA3hB,mBAAA;AAAAA;;AAAA,IAAA,sBAAA,8BAAc\/L,9BAAK6Q;AAAnB,AAAA,gBAAA9E,hBAAuC2hB;;AAAvC3hB;;;;AA1DhB,AAAA,AAAA,wEAAA,xEAAS+2C,mFAuDE,KAAK;;AAvDhB,AAAA,eAAA,XAuDW;AAvDX,AAuDuB,OAACN,oBAAUxiD,SAAKwD;;;AAvDvC,AAAA,AAAA,4FAAA,5FAASs\/C,uGA0IS;;AA1IlB,AAAA,eAAA,XA0IkB;AA1IlB,AA2II,YAAAsL,2BAAmB,GAAS3a,YAAK3gC,WAAI+6C,sBAASL;;;AA3IlD,AAAA,AAAA,sFAAA,tFAAS1K,iGAoDE;;AApDX,AAAA,eAAA,XAoDW;AApDX,AAoDiB,OAACjgD,qBAAW,AAASigD,kCAAmBhgD;;;AApDzD,AAAA,AAAA,uEAAA,vEAASggD,kFA+GG,KAAK;;AA\/GjB,AAAA,eAAA,XA+GY;AA\/GZ,AAgHI,GAAM,MAAA,LAAM3jD;AAAM,GAAI0uD;AACF,YAAA\/K,uEAAA,MAAA,KAAA,tDAAoBhgD,YAAK,cAAA,bAAKgQ,kBAAK2gC;;AACnCzzC;;;AAFpB,GAGM,gBAAA,fAAMyzC;AAAMzzC;;AAHlB,AAKM,IAAM,WAAS,0BAAA,1BAAgByzC,8BAAO,AAACzpC,eAAK7K,GAAGA;AAA\/C,AACE,GAAI,CAAYy9C,aAASnJ;AACvBzzC;;AACA,YAAA8iD,yGAAA,7EAAoBhgD,YAAK,cAAA,bAAKgQ,kBAAK8pC,SAASiR,sBAASL;;;;;;;AAxHnE,AAAA,AAAA,8EAAA,9EAAS1K,yFAmFE,KAAK,EAAE;;AAnFlB,AAAA,eAAA,XAmFW;AAnFX,AAoFI,GAAI,MAAA,LAAM3jD;AACR,GAAI,EAAK0uD,2BAAS,CAAYxsD,MAAEmsD;AAC9BxtD;;AACA,YAAA8iD,4GAAA,OAAA,vFAAoBhgD,YAAK,EAAI+qD,uBAAS\/6C,WAAI,cAAA,bAAKA,mBAAM2gC,iBAAUpyC;;;AACjE,IAAM,oBAAY,KAAA+mD,cAAA;IACZ,WAAgB,EAAI,gBAAA,fAAM3U,sBACR,AAASuW,kCACTvW,3DACF,oFAAA,IAAgB,AAACzpC,eAAK7K,GAAGA,EAAEkC,EAAE+oD;AAJnD,AAKE,GAAI,CAAYxN,aAASnJ;AACvBzzC;;AACA,YAAA8iD,8IAAA,lHAAoBhgD,YAAK,EAAI,AAAgBsnD,uBAAa,cAAA,bAAKt3C,kBAAKA,YAAK8pC,SAASiR,sBAASL;;;;;AA\/FrG,AAAA,AAAA,4FAAA,5FAAS1K,uGAiGU,KAAK;;AAjGxB,AAAA,eAAA,XAiGmB;AAjGnB,AAkGI,GAAM,MAAA,LAAM3jD;AAAM0uD;;AAAlB,GACM,gBAAA,fAAMpa;AADZ;;AAAA,AAEkB,UAAK,CAAY,yBAAA,zBAAeA,6BAAO,AAACzpC,eAAK7K,GAAGA,EAAE8c,+BACjCA;;;;;;AArGvC,AAAA,AAAA,wEAAA,xEAAS6mC,mFA6DA;;AA7DT,AAAA,eAAA,XA6DS;AA7DT,AA8DI,GAAM,cAAA,bAAMhwC;AAAZ,AACE,IAAM,IAAE,EAAA,oDAAA,jDAAQ,gBAAA,fAAM2gC,wBAAM,AAAYA;AAAxC,AACE,GAAIoa;AACF,OAAC34C,eAAK,KAAAyI,mBAAA,oBAAA,fAAe6vC,sBAAa11D;;AAClCA;;;AAJN;;;;AA9DJ,AAAA,AAAA,+EAAA,\/EAASgrD,0FAiCM,KAAK;;AAjCpB,AAAA,eAAA,XAiCe;AAjCf,AAiC0B,YAAAA,4BAAoBhgD,SAAKgQ,WAAI2gC,YAAKoa,sBAASL,eAAQ9\/B;;;AAjC7E,AAAA,AAAA,4EAAA,5EAASo1B,uFAuCC,KAAK;;AAvCf,AAAA,eAAA,XAuCU;AAvCV,AAwCI,GAAI,AAAC7nC,wBAAQ1W;AACX,OAAQvE,oDAAK,mDAAA,nDAAC+S,6CAAKxO,WAAS,mDAAA,nDAACwO,6CAAKxO;;AAClC,IAAO,MAAIvE;IAAK,KAAG,AAACuP,cAAIhL;;AAAxB,AACE,GAAI,OAAA,NAAM0iD;AACRlyC;;AACA,IAAM,IAAE,AAAC3b,gBAAM6tD;AAAf,AACE,GAAI,AAAChsC,wBAAQzgB;AACX,eAAO,AAAQua,+CAAI,+CAAA,\/CAAChC,6CAAKvY,OAAK,+CAAA,\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\/CnB,AAAA,YAAA,RA+Ca;AA\/Cb,AAgDI,GAAI5U;AACF,GAAI,MAAA,LAAMr6C;AACR,GAAI0uD;AACF,AAAI,wBAAA,xBAAMA;;AACN,iBAAA,jBAAML;;AACN,AAAM\/8C,eAAM,gBAAA,fAAKA;;AACjB5K;;AACJA;;;AACF,GAAI,gBAAA,fAAM4tC;AACR5tC;;AACA,IAAM,sBAAc,KAAAuiD,cAAA;IACd,OAAK,4CAAA,5CAAiB3U,gCAAK+F,gBAAO,AAACxvC,eAAK7K,GAAGA,EAAE6rD;AADnD,AAEE,GAAI,CAAY5X,SAAKK;AAArB;AAEE,AAAMA,cAAKL;;;AACb,GAAI,AAAgB4X;AAClB,AAAMv6C,eAAM,gBAAA,fAAKA;;AADnB;;AAEA5K;;;;AACN,MAAO,KAAAnO,MAAA;;;;AAlEb,AAAA,AAAA,wDAAA,xDAAS02D;;AAAT,AAAA,YAAA,RAoEgB;AApEhB,AAqEI,GAAI5U;AACF,AAAI,cAAA,dAAMA;;AACN,YAAAsJ,4BAAA,mEAAA,9DAAwBryC,aAAMgjC,YAAKoa,sBAASL;;AAChD,MAAO,KAAA91D,MAAA;;;;AAxEb,AAAA,AAAA,yEAAA,zEAAS02D,oFA2EE;;AA3EX,AAAA,eAAA,XA2EW;AA3EX,AA4EI,GAAI5U;AACF\/oC;;AACA,MAAO,KAAA\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\/ChB,AAAA,eAAA,XA+CW;AA\/CX,AA+CuB,OAACx6C,2BAAiBjV,SAAKwD;;;AA\/C9C,AAAA,AAAA,8EAAA,9EAASisD,yFAiEE;;AAjEX,AAAA,eAAA,XAiEW;AAjEX,AAAA;;;AAAA,AAAA,AAAA,kEAAA,lEAASA,6EA8GG,KAAK;;AA9GjB,AAAA,eAAA,XA8GY;AA9GZ,AA+GI,OAACnQ,kDAAUlM,SAAK3+C;;;AA\/GpB,AAAA,AAAA,kEAAA,lEAASg7D,6EAiHG,KAAK,EAAE;;AAjHnB,AAAA,eAAA,XAiHY;AAjHZ,AAkHI,OAAClQ,kDAAUnM,SAAK3+C,EAAEyO;;;AAlHtB,AAAA,AAAA,sEAAA,tEAASusD,iFA6FE,KAAK,EAAE;;AA7FlB,AAAA,eAAA,XA6FW;AA7FX,AA8FI,qDAAA,9CAAC32C,iIAAOvT,WAAI3J,mBAAKuD,EAAEkC;;;AA9FvB,AAAA,AAAA,oFAAA,pFAASouD,+FA+FU,KAAK;;AA\/FxB,AAAA,eAAA,XA+FmB;AA\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\/D9B,AAAA,WAAA,PA+DY;AA\/DZ,AAgEI,YAAAA,qDAAA,nCAAUhqD,QAAI3J,QAAIg0D,SAAKF;;;AAhE3B,AAAA,AAAA,2CAAA,3CAASH,sDAoBa;;AApBtB,AAAA,WAAA,PAoBiB;AApBjB,AAqBI,GACE,wBAAWA,vBAAQK;AACnB,YAAAL,8IAAA,5HAAUhqD,WAAI3J,WACJ,AAAUg0D,sBACV,KAAAH,oEAAA,hDAAY,AAAOrV,WAAQ,AAAOA,WAAQsV,aAAM,AAAStV;;AAJrE,GAOE,yBAAWmV,xBAAQG;AACnB,YAAAH,8NAAA,5MAAU,AAAOG,iBAAO,AAAOA,iBACrB,KAAAD,wEAAA,pDAAYlqD,WAAI3J,WAAIg0D,YAAK,AAAQF,yBACjC,KAAAD,0EAAA,tDAAY,AAAOrV,WAAQ,AAAOA,WACtB,AAASsV,mBACT,AAAStV;;AAZjC,AAiBE,YAAAqV,4DAAA,xCAAY,AAAOrV,WAAQ,AAAOA,WAAQhH,KAAK,AAASgH;;;;;;AAtC9D,AAAA,AAAA,4CAAA,5CAASmV,uDAwCc;;AAxCvB,AAAA,WAAA,PAwCkB;AAxClB,AAyCI,GACE,yBAAWA,xBAAQG;AACnB,YAAAH,6IAAA,3HAAUhqD,WAAI3J,WACJ,KAAA6zD,kEAAA,9CAAY,AAAOrV,WAAQ,AAAOA,WACtB,AAAQA,YACRwV,mBAEZ,AAAUF;;AAPtB,GAUE,wBAAWH,vBAAQK;AACnB,YAAAL,0NAAA,xMAAU,AAAOK,gBAAM,AAAOA,gBACpB,KAAAH,uEAAA,nDAAY,AAAOrV,WAAQ,AAAOA,WACtB,AAAQA,YACR,AAAQwV,wBAEpB,KAAAH,yEAAA,rDAAYlqD,WAAI3J,WAAI,AAASg0D,kBAAMF;;AAhB\/C,AAoBE,YAAAD,2DAAA,vCAAY,AAAOrV,WAAQ,AAAOA,WAAQ,AAAQA,YAAQhH;;;;;;AA7DhE,AAAA,AAAA,0CAAA,1CAASmc,qDAQY;;AARrB,AAAA,WAAA,PAQgB;AARhB,AASI,YAAAA,yDAAA,vCAAUhqD,WAAI3J,WAAIk0D,IAAIJ;;;AAT1B,AAAA,AAAA,wCAAA,xCAASH,mDAkEU,EAAE;;AAlErB,AAAA,WAAA,PAkEc;AAlEd,AAmEI,OAACS,6BAAmB5c,KAAK3+C,EAAE4O;;;AAnE\/B,AAAA,AAAA,2CAAA,3CAASksD,sDAWa;;AAXtB,AAAA,WAAA,PAWiB;AAXjB,AAYI,YAAAA,wDAAA,tCAAUhqD,WAAI3J,WAAIg0D,YAAKE;;;AAZ3B,AAAA,AAAA,gEAAA,hEAASP,2EAgIG,KAAK;;AAhIjB,AAAA,eAAA,XAgIY;AAhIZ,AAgIoB,uDAAA,hDAAMnc,8CAAKj0C;;;AAhI\/B,AAAA,AAAA,gEAAA,hEAASowD,2EAiIG,KAAK,EAAE;;AAjInB,AAAA,eAAA,XAiIY;AAjIZ,AAiI8B,OAAMnc,8CAAKj0C,EAAEqB;;;AAjI3C,AAAA,AAAA,8DAAA,9DAAS+uD,yEAqHA,KAAK;;AArHd,AAAA,eAAA,XAqHS;AArHT,AAsHI,GAAM,OAAA,NAAIjwD;AAAKiG;;AAAf,GACM,OAAA,NAAIjG;AAAK1D;;AADf,AAEe,MAAO,KAAAlE,MAAA;;;;;;AAxH1B,AAAA,AAAA,8DAAA,9DAAS63D,yEA0HA,KAAK,EAAE;;AA1HhB,AAAA,eAAA,XA0HS;AA1HT,AA2HI,GAAM,OAAA,NAAIjwD;AAAKiG;;AAAf,GACM,OAAA,NAAIjG;AAAK1D;;AADf,AAEe4E;;;;;;AA7HnB,AAAA,AAAA,iEAAA,jEAAS+uD,4EAiJI,KAAK,EAAE;;AAjJpB,AAAA,eAAA,XAiJa;AAjJb,AAkJI,OAAA,mFAAWhqD,WAAI3J,2DAAK0D,EAAE+B;;;AAlJ1B,AAAA,AAAA,4DAAA,5DAASkuD,uEAyFC;;AAzFV,AAAA,eAAA,XAyFU;AAzFV,AAAA;;;AAAA,AAAA,AAAA,gEAAA,hEAASA,2EAkHE;;AAlHX,AAAA,eAAA,XAkHW;AAlHX,AAAA;;;AAAA,AAAA,AAAA,+DAAA,\/DAASA,0EA+EA;;AA\/ET,AAAA,eAAA,XA+ES;AA\/ET,AA+EehqD;;;AA\/Ef,AAAA,AAAA,+DAAA,\/DAASgqD,0EAgFA;;AAhFT,AAAA,eAAA,XAgFS;AAhFT,AAgFe3zD;;;AAhFf,AAAA,AAAA,6DAAA,7DAAS2zD,wEAgGC;;AAhGV,AAAA,eAAA,XAgGU;AAhGV,AAgGgB3zD;;;AAhGhB,AAAA,AAAA,4DAAA,5DAAS2zD,uEAkGA;;AAlGT,AAAA,eAAA,XAkGS;AAlGT,AAAA,0FAkGgBhqD;;;AAlGhB,AAAA,AAAA,kEAAA,lEAASgqD,6EA+GC;;AA\/GV,AAAA,eAAA,XA+GU;AA\/GV,AA+GgB,YAAAr2D,qBAAA,wBAAA,IAAA,3BAAkB0C,WAAI2J;;;AA\/GtC,AAAA,AAAA,4DAAA,5DAASgqD,uEAmFC;;AAnFV,AAAA,eAAA,XAmFU;AAnFV,AAmFgB,IAAA,kBAAqC7hC;AAArC,AAAA,GAAA,GAAA,CAAA3hB,mBAAA;AAAAA;;AAAA,IAAA,sBAAA,4BAAc\/L,5BAAK0Q;AAAnB,AAAA,gBAAA3E,hBAAqC2hB;;AAArC3hB;;;;AAnFhB,AAAA,AAAA,8DAAA,9DAASwjD,yEAsFE,KAAK;;AAtFhB,AAAA,eAAA,XAsFW;AAtFX,AAsFuB,OAACt6C,2BAAiBjV,SAAKwD;;;AAtF9C,AAAA,AAAA,4EAAA,5EAAS+rD,uFAwGE;;AAxGX,AAAA,eAAA,XAwGW;AAxGX,AAAA;;;AAAA,AAAA,AAAA,gEAAA,hEAASA,2EAqJG,KAAK;;AArJjB,AAAA,eAAA,XAqJY;AArJZ,AAsJI,OAACjQ,kDAAUlM,SAAK3+C;;;AAtJpB,AAAA,AAAA,gEAAA,hEAAS86D,2EAwJG,KAAK,EAAE;;AAxJnB,AAAA,eAAA,XAwJY;AAxJZ,AAyJI,OAAChQ,kDAAUnM,SAAK3+C,EAAEyO;;;AAzJtB,AAAA,AAAA,oEAAA,pEAASqsD,+EAoIE,KAAK,EAAE;;AApIlB,AAAA,eAAA,XAoIW;AApIX,AAqII,qDAAA,9CAACz2C,iIAAOvT,WAAI3J,mBAAKuD,EAAEkC;;;AArIvB,AAAA,AAAA,kFAAA,lFAASkuD,6FAsIU,KAAK;;AAtIxB,AAAA,eAAA,XAsImB;AAtInB,AAuII,SAAI,OAAA,NAAIpwD,gBAAK,OAAA,NAAIA;;;AAvIrB,AAAA,AAAA,8DAAA,9DAASowD,yEA4GA;;AA5GT,AAAA,eAAA,XA4GS;AA5GT,AA4Ge,YAAAr2D,qBAAA,wBAAA,IAAA,3BAAkBqM,WAAI3J;;;AA5GrC,AAAA,AAAA,qEAAA,rEAAS2zD,gFA4FM,KAAK;;AA5FpB,AAAA,eAAA,XA4Fe;AA5Ff,AA6FI,4BAAA,rBAAC1sD,wGAAY0C,WAAI3J,mBAAKkH;;;AA7F1B,AAAA,AAAA,kEAAA,lEAASysD,6EAqGC,KAAK;;AArGf,AAAA,eAAA,XAqGU;AArGV,AAAA,0FAqGmBhqD,WAAI3J,WAAI2D;;;AArG3B,AAAA,AAAA,mCAAA,nCAASgwD;;6BAAT,OA4JiB;;AA5JjB,AAAA,IAAA,aAAA;AAAA,AAAA,WAAAnkD,PA4JY;AA5JZ,AA6JI,OAAMgoC,0CAAKj0C;;6BA7Jf,OA+JiB,EAAE;;AA\/JnB,AAAA,IAAA,aAAA;AAAA,AAAA,WAAAiM,PA+JY;AA\/JZ,AAgKI,OAAMgoC,0CAAKj0C,EAAEqB;;oBAhKjB,OA+JiB,EAAE;;;6BA\/JnB,OA+JiB;;6BA\/JjB,OA+JiB,EAAE;;;;;;;;;;AA\/JnB,AAAA,AAAA,oCAAA,WAAA,OAAA,tDAAS+uD;;AAAT,AAAA,IAAA,aAAA;AAAA,AAAA,OAAA,AAAAnkD,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAAnR,iBAAA+2D;;;AAAA,AAAA,AAAA,4DAAA,5DAASzB,uEA4JQ;;AA5JjB,AAAA,WAAA,PA4JY;AA5JZ,AA6JI,OAAMnc,0CAAKj0C;;;AA7Jf,AAAA,AAAA,4DAAA,5DAASowD,uEA+JQ,EAAE;;AA\/JnB,AAAA,WAAA,PA+JY;AA\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\/C,iLAAA,\/JAAU,AAAO+C,QAAK,AAAOA,QACnB,KAAA7C,yDAAA,rCAAY,AAAOG,SAAM,AAAOA,SACpB,AAAQA,UACR,AAAQ0C,gBAEpB,KAAA7C,8DAAA,1CAAY,AAAOC,UAAO,AAAOA,UACrB,AAAS4C,UACT,AAAS5C;;AAG\/B,OAACG,2BAAiB,AAAOD,SAAM,AAAOA,SACpB,AAAQA,UACR,KAAAH,wDAAA,pCAAY,AAAOC,UAAO,AAAOA,UACrB4C,IACA,AAAS5C;;;;;;;;AAG\/C,4BAAA,5BAAOmD,gEAAiB,KAAK,KAAK,EAAE;AAApC,AACE,GAAA,GAAQ,SAAA,RAAMxD;AACZ,IAAM,IAAE,iBAAA,WAAMlwD;IAAN,WAAQ,AAAOkwD;AAAf,AAAA,gFAAAyD,SAAAC,2BAAAD,SAAAC,rHAAC9zC,qCAAAA,wDAAAA;;AAAT,AACE,GACE,OAAA,NAAOngB;AACP,AAAI,OAAA,NAAMirD,aAAQsF;;AACd,OAAC8C,0BAAgB,AAAQ9C,UAAM,AAASA;;AAH9C,GAKE,KAAA,JAAMvwD;AACN,IAAM,MAAI,iBAAA,WAAiBmgB;IAAjB,WAAsB,AAAQowC;IAA9B,WAAoClwD;IAApC,WAAsC4qD;AAAtC,AAAA,0HAAAiJ,SAAAC,SAAAC,SAAAC,gDAAAH,SAAAC,SAAAC,SAAAC,xNAACN,0DAAAA,+FAAAA;;AAAX,AACE,GAAI,EAAI,GAAK,QAAA,PAAM\/C,oBAAM,GAAK,iBAAA,hBAAM,OAAA,NAAM\/F;AACxC,GAAI,sBAAW0F,rBAAU,AAAQJ;AAC\/B,OAACQ,2BAAiB,AAAOR,SAAM,AAAOA,SAAMS,IAAI,AAAST;;AACzD,YAAAE,mDAAA,jCAAU,AAAOF,SAAM,AAAOA,SAAMS,IAAI,AAAST;;;AAHrD;;;AAPJ,AAaE,IAAM,MAAI,iBAAA,WAAiBpwC;IAAjB,WAAsB,AAASowC;IAA\/B,WAAqClwD;IAArC,WAAuC4qD;AAAvC,AAAA,0HAAAqJ,SAAAC,SAAAC,SAAAC,gDAAAH,SAAAC,SAAAC,SAAAC,xNAACV,0DAAAA,+FAAAA;;AAAX,AACE,GAAI,EAAI,GAAK,QAAA,PAAM\/C,oBAAM,GAAK,iBAAA,hBAAM,OAAA,NAAM\/F;AACxC,GAAI,uBAAW0F,tBAAU,AAASJ;AAChC,OAACU,4BAAkB,AAAOV,SAAM,AAAOA,SAAM,AAAQA,UAAMS;;AAC3D,YAAAP,kDAAA,hCAAU,AAAOF,SAAM,AAAOA,SAAM,AAAQA,UAAMS;;;AAHtD;;;;;;AAhBR;;;AAqBF,6BAAA,7BAAO0D,kEAAkB,KAAK,KAAK,EAAE;AAArC,AACE,IAAM,KAAG,AAAOnE;IACV,IAAG,CAACpwC,qCAAAA,2CAAAA,RAAK9f,uBAAAA,rBAAEs0D,uBAAAA;AADjB,AAEE,GAAM,OAAA,NAAO30D;AAAG,OAAUuwD,aAAKoE,GAAGpyD,EAAE,AAAQguD,UAAM,AAASA;;AAA3D,GACM,KAAA,JAAMvwD;AAAI,OAAUuwD,aAAKoE,GAAG,AAAOpE,SAAM,iBAAA,WAAkBpwC;IAAlB,WAAuB,AAAQowC;IAA\/B,WAAqClwD;IAArC,WAAuCkC;AAAvC,AAAA,4HAAAqyD,SAAAC,SAAAC,SAAAC,iDAAAH,SAAAC,SAAAC,SAAAC,3NAACL,2DAAAA,gGAAAA;KAAyC,AAASnE;;AADlG,AAEgB,OAAUA,aAAKoE,GAAG,AAAOpE,SAAM,AAAQA,UAAM,iBAAA,WAAkBpwC;IAAlB,WAAuB,AAASowC;IAAhC,WAAsClwD;IAAtC,WAAwCkC;AAAxC,AAAA,4HAAAyyD,SAAAC,SAAAC,SAAAC,iDAAAH,SAAAC,SAAAC,SAAAC,3NAACT,2DAAAA,gGAAAA;;;;;;AAElE,AAAA,AAEA,AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,yDAAA3\/D,zDAASsgE;;AAAT,AAAA,AAAA,sEAAA,tEAASA,iFAgHC,KAAK;;AAhHf,AAAA,eAAA,XAgHU;AAhHV,AAiHI,OAAWn0D,kBAAKb;;;AAjHpB,AAAA,AAAA,gDAAA,hDAASg1D,2DAkBQ;;AAlBjB,AAAA,WAAA,PAkBY;AAlBZ,AAmBI,IAAA,aAAA,AAAA5kD,cAAcvP;IAAd,eAAA;IAAA,eAAA;IAAA,WAAA;;AAAA,AAAA,GAAA,AAAA,CAAAq0D,WAAAC;AAAA,IAAA,aAAA,AAAAC,kDAAAF;QAAA,AAAAznC,4CAAA4nC,WAAA,IAAA,\/DAAS;QAAT,AAAA5nC,4CAAA4nC,WAAA,IAAA,\/DAAW;AAAX,AAAA,AACE,CAAC\/\/D,kCAAAA,uCAAAA,PAAE4M,mBAAAA,jBAAElC,mBAAAA;;AADP;AAAA,eAAAs1D;eAAAF;eAAAD;eAAA,CAAAD,WAAA;;;;;;;AAAA,IAAA,qBAAA,AAAA9kD,cAAAklD;AAAA,AAAA,GAAA1nC;AAAA,AAAA,IAAA,iBAAAA;AAAA,AAAA,GAAA,AAAA7R,6BAAAu5C;AAAA,IAAA,kBAAA,AAAAznC,sBAAAynC;AAAA,AAAA,eAAA,AAAAxnC,qBAAAwnC;eAAAvnC;eAAA,AAAA9Y,gBAAA8Y;eAAA;;;;;;;AAAA,IAAA,aAAA,AAAA9zB,gBAAAq7D;QAAA,AAAA7nC,4CAAA8nC,WAAA,IAAA,\/DAAS;QAAT,AAAA9nC,4CAAA8nC,WAAA,IAAA,\/DAAW;AAAX,AAAA,AACE,CAACjgE,kCAAAA,uCAAAA,PAAE4M,mBAAAA,jBAAElC,mBAAAA;;AADP;AAAA,eAAA,AAAA7F,eAAAm7D;eAAA;eAAA;eAAA;;;;;;;;AAAA;;;;;;;AAnBJ,AAAA,AAAA,4CAAA,5CAASN,uDAgBI,EAAE;;AAhBf,AAAA,WAAA,PAgBQ;AAhBR,AAiBI,OAASn0D,4CAAKb,EAAEqB;;;AAjBpB,AAAA,AAAA,gDAAA,hDAAS2zD;;AAAT,AAAA,WAAA,PAUY;AAVZ,AAWI,OAACtP,+BAAqB,AAACt1C,cAAIvP;;;AAX\/B,AAAA,AAAA,iDAAA,jDAASm0D;;AAAT,AAAA,WAAA,PAEa;AAFb,AAGI,OAAChsD,uBAAQnI;;;AAHb,AAAA,AAAA,6CAAA,7CAASm0D;;AAAT,AAAA,WAAA,PAQS;AART,AASI,OAAClkD,uBAAa,AAACw2C,eAAKzmD;;;AATxB,AAAA,AAAA,+CAAA,\/CAASm0D;;AAAT,AAAA,WAAA,PAYW;AAZX,AAaI,OAAClkD,uBAAa,AAACy2C,eAAK1mD;;;AAbxB,AAAA,AAAA,8CAAA,9CAASm0D,yDAIM;;AAJf,AAAA,YAAA,RAIU;AAJV,AAKI,OAAQv1D,2CAAK4E;;;AALjB,AAAA,AAAA,iDAAA,jDAAS2wD,4DAsBS;;AAtBlB,AAAA,WAAA,PAsBa;AAtBb,AAuBI,IAAO,IAAE9E;;AAAT,AACE,GAAA,GAAQ,MAAA,LAAM12D;AACZ,IAAM,IAAE,iBAAA,WAAMwG;IAAN,WAAQ,AAAOxG;AAAf,AAAA,8FAAAg8D,SAAAC,kCAAAD,SAAAC,1IAAC31C,4CAAAA,+DAAAA;;AAAT,AACE,GAAM,OAAA,NAAOngB;AAAGnG;;AAAhB,GACM,KAAA,JAAMmG;AAAI,eAAO,AAAQnG;;;;AAD\/B,AAEgB,eAAO,AAASA;;;;;;;AAJpC;;;;;;AAxBN,AAAA,AAAA,4CAAA,5CAASw7D,uDAcI;;AAdb,AAAA,WAAA,PAcQ;AAdR,AAeI,OAAC12C,0BAAUzd,KAAKb;;;AAfpB,AAAA,AAAA,0EAAA,1EAASg1D,qFAwFG,KAAK;;AAxFjB,AAAA,eAAA,XAwFY;AAxFZ,AAyFI,yDAAA,lDAASn0D,gDAAKb;;;AAzFlB,AAAA,AAAA,0EAAA,1EAASg1D,qFA2FG,KAAK,EAAE;;AA3FnB,AAAA,eAAA,XA2FY;AA3FZ,AA4FI,IAAM,IAAE,AAAWn0D,kBAAKb;AAAxB,AACE,GAAA,GAAQ,MAAA,LAAMG;AACZ,OAAOA;;AACPkB;;;;AA\/FR,AAAA,AAAA,+EAAA,\/EAAS2zD,0FAiEM,KAAK,EAAE;;AAjEtB,AAAA,eAAA,XAiEe;AAjEf,AAkEI,GAAA,GAAQ,gBAAA,fAAM9E;AACZ,OAAC58C,oBAAU,AAACu9C,6BAAmBX,YAAK56D,EAAE4O;;AACtCA;;;;AApEN,AAAA,AAAA,sEAAA,tEAAS8wD,iFAqCC;;AArCV,AAAA,eAAA,XAqCU;AArCV,AAqCgBrxD;;;AArChB,AAAA,AAAA,4EAAA,5EAASqxD,uFA+BE;;AA\/BX,AAAA,YAAA,RA+BW;AA\/BX,AA+Bc,YAAAA,4BAAoBl1C,YAAKowC,YAAKv8C,WAAIhQ,YAAK4qB;;;AA\/BrD,AAAA,AAAA,0EAAA,1EAASymC,qFA8DE;;AA9DX,AAAA,eAAA,XA8DW;AA9DX,AA8DiBrhD;;;AA9DjB,AAAA,AAAA,4EAAA,5EAASqhD,uFAmFC;;AAnFV,AAAA,eAAA,XAmFU;AAnFV,AAoFI,GAAI,cAAA,bAAMrhD;AACR,iDAAA,1CAACs8C,8BAAoBC,kBAAWv8C;;AADlC;;;;AApFJ,AAAA,AAAA,sEAAA,tEAASqhD,iFA2DC;;AA3DV,AAAA,eAAA,XA2DU;AA3DV,AA2DgB,IAAA,kBAAuCzmC;AAAvC,AAAA,GAAA,GAAA,CAAA3hB,mBAAA;AAAAA;;AAAA,IAAA,sBAAA,8BAAc\/L,9BAAK6Q;AAAnB,AAAA,gBAAA9E,hBAAuC2hB;;AAAvC3hB;;;;AA3DhB,AAAA,AAAA,wEAAA,xEAASooD,mFAwDE,KAAK;;AAxDhB,AAAA,eAAA,XAwDW;AAxDX,AAwDuB,OAAC3R,oBAAUxiD,SAAKwD;;;AAxDvC,AAAA,AAAA,sFAAA,tFAAS2wD,iGAqDE;;AArDX,AAAA,eAAA,XAqDW;AArDX,AAqDiB,YAAAA,wCAAA,KAAA,gBAAA,jCAAoBl1C,qBAAWnc;;;AArDhD,AAAA,AAAA,uEAAA,vEAASqxD,kFAoHG,KAAK;;AApHjB,AAAA,eAAA,XAoHY;AApHZ,AAqHI,IAAM,QAAM,CAAA;IACN,IAAM,AAACtB,0BAAgB5zC,YAAKowC,YAAKlwD,EAAE4qD;AADzC,AAEE,GAAI,MAAA,LAAMpxD;AACR,GAAI,2DAAA,1DAAM,kDAAA,lDAAC4b,4CAAIw1C;AACb\/pD;;AACA,YAAAm0D,wCAAA,KAAA,gBAAA,jCAAoBl1C,qBAAWnc;;;AACjC,YAAAqxD,mFAAA,vDAAoBl1C,YAAK,AAAUtmB,YAAG,cAAA,bAAKma,kBAAKhQ;;;;AA3HxD,AAAA,AAAA,8EAAA,9EAASqxD,yFAkGE,KAAK,EAAE;;AAlGlB,AAAA,eAAA,XAkGW;AAlGX,AAmGI,IAAM,QAAM,CAAA;IACN,IAAM,AAAC7C,uBAAaryC,YAAKowC,YAAKlwD,EAAEkC,EAAE0oD;AADxC,AAEE,GAAI,MAAA,LAAMpxD;AACR,IAAM,aAAW,kDAAA,lDAAC4b,4CAAIw1C;AAAtB,AACE,GAAI,AAACx9C,6CAAElL,EAAE,AAAOwzD;AACd70D;;AACA,YAAAm0D,uHAAA,3FAAoBl1C,YAAK,AAACu0C,2BAAiBv0C,YAAKowC,YAAKlwD,EAAEkC,GAAGyR,WAAIhQ;;;AAClE,YAAAqxD,mFAAA,vDAAoBl1C,YAAK,AAAUtmB,YAAG,cAAA,bAAKma,kBAAKhQ;;;;AA1GxD,AAAA,AAAA,4FAAA,5FAASqxD,uGA4GU,KAAK;;AA5GxB,AAAA,eAAA,XA4GmB;AA5GnB,AA6GI,UAAK,yBAAA,xBAAM,AAAWn0D,kBAAKb;;;AA7G\/B,AAAA,AAAA,wEAAA,xEAASg1D,mFA8EA;;AA9ET,AAAA,eAAA,XA8ES;AA9ET,AA+EI,GAAI,cAAA,bAAMrhD;AACR,iDAAA,1CAACs8C,8BAAoBC,iBAAUv8C;;AADjC;;;;AA\/EJ,AAAA,AAAA,+EAAA,\/EAASqhD,0FAkCM,KAAK;;AAlCpB,AAAA,eAAA,XAkCe;AAlCf,AAkC0B,YAAAA,4BAAoBl1C,YAAKowC,YAAKv8C,WAAIhQ,SAAK4qB;;;AAlCjE,AAAA,AAAA,4EAAA,5EAASymC,uFAwCC,KAAK;;AAxCf,AAAA,eAAA,XAwCU;AAxCV,AAyCI,GAAI,AAACl5C,wBAAQ1W;AACX,OAAQvE,oDAAK,mDAAA,nDAAC+S,6CAAKxO,WAAS,mDAAA,nDAACwO,6CAAKxO;;AAClC,IAAO,MAAIvE;IAAK,KAAG,AAACuP,cAAIhL;;AAAxB,AACE,GAAI,OAAA,NAAM0iD;AACRlyC;;AACA,IAAM,IAAE,AAAC3b,gBAAM6tD;AAAf,AACE,GAAI,AAAChsC,wBAAQzgB;AACX,eAAO,AAAQua,+CAAI,+CAAA,\/CAAChC,6CAAKvY,OAAK,+CAAA,\/CAACuY,6CAAKvY;eAC7B,AAAClB,eAAK2tD;;;;;AACb,MAAO,KAAAvvD,MAAA;;;;;;;;AAlDrB,AAAA,AAAA,6CAAA,7CAASy8D;;6BAAT,OAuEiB;;AAvEjB,AAAA,IAAA,aAAA;AAAA,AAAA,WAAA\/oD,PAuEY;AAvEZ,AAwEI,OAASpL,4CAAKb;;6BAxElB,OA0EiB,EAAE;;AA1EnB,AAAA,IAAA,aAAA;AAAA,AAAA,WAAAiM,PA0EY;AA1EZ,AA2EI,OAASpL,4CAAKb,EAAEqB;;oBA3EpB,OA0EiB,EAAE;;;6BA1EnB,OA0EiB;;6BA1EjB,OA0EiB,EAAE;;;;;;;;;;AA1EnB,AAAA,AAAA,8CAAA,WAAA,OAAA,hEAAS2zD;;AAAT,AAAA,IAAA,aAAA;AAAA,AAAA,OAAA,AAAA\/oD,sBAAAA,WAAA,AAAA,CAAAA,mBAAA,AAAAnR,iBAAAi6D;;;AAAA,AAAA,AAAA,sEAAA,tEAASC,iFAuEQ;;AAvEjB,AAAA,WAAA,PAuEY;AAvEZ,AAwEI,OAASn0D,4CAAKb;;;AAxElB,AAAA,AAAA,sEAAA,tEAASg1D,iFA0EQ,EAAE;;AA1EnB,AAAA,WAAA,PA0EY;AA1EZ,AA2EI,OAASn0D,4CAAKb,EAAEqB;;;AA3EpB,AAAA,AAAA,8EAAA,9EAAS2zD,yFA8HO,KAAK;;AA9HrB,AAAA,eAAA,XA8HgB;AA9HhB,AA+HI,GAAI,cAAA,bAAMrhD;AACR,OAACs8C,8BAAoBC,YAAKjrD,iBAAW0O;;AADvC;;;;AA\/HJ,AAAA,AAAA,mFAAA,nFAASqhD,8FAkIY,KAAK,EAAE;;AAlI5B,AAAA,eAAA,XAkIqB;AAlIrB,AAmII,GAAI,cAAA,bAAMrhD;AACR,YAAA,RAAO;IAAU,IAAEu8C;;AAAnB,AACE,GAAA,GAAQ,MAAA,LAAM12D;AACZ,IAAM,IAAE,iBAAA,WAAMwG;IAAN,WAAQ,AAAOxG;AAAf,AAAA,8FAAAm8D,SAAAC,kCAAAD,SAAAC,1IAAC91C,4CAAAA,+DAAAA;;AAAT,AACE,GACE,OAAA,NAAOngB;AAAI,YAAAgwD,+BAAA,4EAAA,KAAA,5EAA2B,AAACv3C,6CAAKs3C,MAAMl2D,GAAGyL;;AADvD,oBAEEA;AAAW,GAAI,KAAA,JAAMtF;AACR,eAAO,AAACyY,6CAAKs3C,MAAMl2D;eAAG,AAAQA;;;;;AAC9B,eAAOk2D;eAAe,AAASl2D;;;;;;AAJ9C,AAKa,GAAI,KAAA,JAAMmG;AACR,eAAO,AAACyY,6CAAKs3C,MAAMl2D;eAAG,AAASA;;;;;AAC\/B,eAAOk2D;eAAe,AAAQl2D;;;;;;;;;AAC\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\/\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\/C,6CAAK,iBAAA,mBAAA8\/C;AAAA,AAAA,oBAAAt8D;AAAAA;;AAAA;;KAANq8D;GAAqBF;;AADhC;;;;AALF,AAAA,AAAAF,0CAAA;;AAAA;AAAA,AAAA,AAAAA,oCAAA,WAAA;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAA37C,wDAAA,AAAA9L,cAAA0nD;;;AAAA,AAQA,AAAA;;;;;;uBAAA,+BAAA,tDAAMK;AAAN,AAAA,IAAA,qBAAA;AAAA,AAAA,IAAA,0BAAA,AAAA;AAAA,AAAA,IAAA,wBAAA;;AAAA,AAAA,GAAA,CAAAv+D,wBAAAC;AAAA,AAAA,AAAA6E,wBAAA,CAAA,UAAA9E;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA,uBAAA,EAAA,CAAA,MAAA,AAAA8E,4BAAA,AAAA,KAAA3E,qBAAA,AAAA2E,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAy5D,0DAAA,CAAA,UAAA,MAAAv5D;;;AAAA,AAAA,AAAA,AAAAu5D,4DAAA,WAKG,EAAI;AALP,AAME,oBAAM,AAACv2B,eAAK\/f,mBAASk2C;AAArB,AACE,IAAM,cAAY,WAAK,EAAE;AAAP,AACE,IAAM,IAAE,AAAC7qC,cAAI7xB;IAAG,IAAE,AAAC8xB,cAAI9xB;AAAvB,AACE,GAAI,AAACijB,0BAAUpe,EAAEF;AACf,OAAC2Z,8CAAMzZ,EAAEF,EAAE,iBAAA,WAAG,AAACyM,4CAAIvM,EAAEF;IAAV,WAAakC;AAAb,AAAA,0EAAAo2D,SAAAC,wBAAAD,SAAAC,5GAACjjE,kCAAAA,qDAAAA;;;AACZ,OAACqkB,8CAAMzZ,EAAEF,EAAEkC;;;IAC7B,SAAO;kBAAK,GAAG;AAAR,AACE,OAACzD,+CAAO+5D,YAAY,iBAAA,mBAAIC;AAAJ,AAAA,oBAAA78D;AAAAA;;AAAA;;KAAW,AAACwU,cAAIsoD;;;AANnD,AAOE,OAACV,+CAAOW,OAAOZ;;AARnB;;;;AANF,AAAA,AAAAI,+CAAA;;AAAA;AAAA,AAAA,AAAAA,yCAAA,WAAA;AAAA,AAAA,IAAA,WAAA,AAAAl+D,gBAAAm+D;IAAA,eAAA,AAAAj+D,eAAAi+D;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAAh+D,wDAAAi+D,SAAAD;;;AAAA,AAgBA;;;wBAAA,xBAAMQ,wDAEH,IAAI;AAFP,AAGI,UAAA,NAAO;IAAO,OAAK,AAACxoD,cAAIyoD;;AAAxB,AACE,GAAIrU;AACF,IAAM,MAAM,AAACvqD,gBAAMuqD;IACb,QAAM,oDAAA,pDAAC93C,4CAAIosD,IAAI1yD;AADrB,AAEE,eACC,EAAI,sDAAA,tDAAC+oD,gDAAK\/pD,yFACR,AAACuU,8CAAM\/D,IAAIxP,IAAIhB,OACfwQ;eACF,AAACzb,eAAKqqD;;;;;AACT,OAAC9gD,qBAAWkS,IAAI,AAAC+E,eAAKm+C;;;;;AAI9B,AAAA,AAEA,AAAA;;;;;;;AAAA,AAAA,AAAA,AAAA,0CAAA,1CAASC;;AAAT,AAAA,QAAA,JAEY;AAFZ,AAGI,OAAU9nD;;;AAHd,AAAA,AAAA,uCAAA,vCAAS8nD;;AAAT,AAAA,QAAA,JAIS;AAJT,AAKI,GAAI,AAAmB9nD;AACrB,OAAO,AAAOA;;AACd,MAAO,KAAA1Y,MAAA;;;;AAPb,AAAA,AAAA,yCAAA,zCAASwgE;;AAAT,AAAA,QAAA,JAQW;AARX,AAQc,YAAAxgE,MAAA;;;AARd,AAAA,iCAAA,jCAASwgE;AAAT,AAAA,AAAA;;;AAAA,AAAA,uCAAA,vCAASA;;AAAT,AAAA,0CAAA,1CAASA;;AAAT,AAAA,+CAAA,WAAA,mBAAA,qBAAA,lGAASA;AAAT,AAAA,OAAAxzD,iBAAAqD,qBAAA;;;AAAA;;;6BAAA,7BAASowD,kEAAa;AAAtB,AAAA,YAAAD,sBAAsB9nD;;;AAAb8nD,AAUT,AAAA;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,AAAA,AAAA,AAAA,iDAAA,jDAASG;;AAAT,AAAA,WAAA,PAEa;AAFb,AAGI,OAAClwD,uBAAQnI;;;AAHb,AAAA,AAAA,8CAAA,9CAASq4D,yDAIM;;AAJf,AAAA,YAAA,RAIU;AAJV,AAKI,OAAQz5D,2CAAK4E;;;AALjB,AAAA,AAAA,6CAAA,7CAAS60D;;AAAT,AAAA,WAAA,PAQS;AART,AASI,OAACpoD,uBAAa,AAACV,cAAIvP;;;AATvB,AAAA,AAAA,gDAAA,hDAASq4D;;AAAT,AAAA,WAAA,PAUY;AAVZ,AAWI,OAACrT,mCAAyB,AAACz1C,cAAIvP;;;AAXnC,AAAA,AAAA,+CAAA,\/CAASq4D;;AAAT,AAAA,WAAA,PAYW;AAZX,AAaI,OAACpoD,uBAAa,AAACV,cAAIvP;;;AAbvB,AAAA,AAAA,4CAAA,5CAASq4D,uDAcI;;AAdb,AAAA,WAAA,PAcQ;AAdR,AAeI,OAAC56C,0BAAUzd,KAAKb;;;AAfpB,AAAA,AAAA,gDAAA,hDAASk5D,2DAgBQ;;AAhBjB,AAAA,WAAA,PAgBY;AAhBZ,AAiBI,IAAA,aAAA,AAAA9oD,cAAcvP;IAAd,eAAA;IAAA,eAAA;IAAA,WAAA;;AAAA,AAAA,GAAA,AAAA,CAAAu4D,WAAAC;AAAA,IAAA,aAAA,AAAAC,kDAAAF;QAAA,AAAA3rC,4CAAA8rC,WAAA,IAAA,\/DAAS;QAAT,AAAA9rC,4CAAA8rC,WAAA,IAAA,\/DAAW;AAAX,AAAA,AACE,CAACjkE,kCAAAA,uCAAAA,PAAE4M,mBAAAA,jBAAElC,mBAAAA;;AADP;AAAA,eAAAw5D;eAAAF;eAAAD;eAAA,CAAAD,WAAA;;;;;;;AAAA,IAAA,qBAAA,AAAAhpD,cAAAopD;AAAA,AAAA,GAAA5rC;AAAA,AAAA,IAAA,iBAAAA;AAAA,AAAA,GAAA,AAAA7R,6BAAAy9C;AAAA,IAAA,kBAAA,AAAA3rC,sBAAA2rC;AAAA,AAAA,eAAA,AAAA1rC,qBAAA0rC;eAAAzrC;eAAA,AAAA9Y,gBAAA8Y;eAAA;;;;;;;AAAA,IAAA,aAAA,AAAA9zB,gBAAAu\/D;QAAA,AAAA\/rC,4CAAAgsC,WAAA,IAAA,\/DAAS;QAAT,AAAAhsC,4CAAAgsC,WAAA,IAAA,\/DAAW;AAAX,AAAA,AACE,CAACnkE,kCAAAA,uCAAAA,PAAE4M,mBAAAA,jBAAElC,mBAAAA;;AADP;AAAA,eAAA,AAAA7F,eAAAq\/D;eAAA;eAAA;eAAA;;;;;;;;AAAA;;;;;;;AAjBJ,AAAA,AAAA,0EAAA,1EAASN,qFA+DG,KAAK;;AA\/DjB,AAAA,eAAA,XA+DY;AA\/DZ,AAgEI,yDAAA,lDAASr4D,gDAAKqB;;;AAhElB,AAAA,AAAA,0EAAA,1EAASg3D,qFAiEG,KAAK,EAAE;;AAjEnB,AAAA,eAAA,XAiEY;AAjEZ,AAkEI,IAAA,qBAAe,AAAC92D,gBAAMk1D,gBAASp1D;AAA\/B,AAAA,oBAAAxJ;AAAA,YAAAA,RAAS;AAAT,AACE,OAACw0B,cAAI9nB;;AACL\/D;;;;AApEN,AAAA,AAAA,8EAAA,9EAAS63D,yFAwBK;;AAxBd,AAAA,eAAA,XAwBc;AAxBd,AAyBI,YAAAH,sBAAc,AAACpwD,oBAAU2uD;;;AAzB7B,AAAA,AAAA,sEAAA,tEAAS4B,iFA+BC;;AA\/BV,AAAA,eAAA,XA+BU;AA\/BV,AA+BgBv1D;;;AA\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\/C,mCAAoB\/H;AAEvD,AAAM,AAAaunD,wCACjB,WAAK,MAAe;AAApB,AACE,IAAM,MAAI,AAASW;AAAnB,AACE,GAAI,CAAI7+D,OAAI,AAAqB0e;AAC\/B,IAAM,MAAI,EAAIilC,UAASkb,MAAM,AAAC\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\/DAAS;QAAT,AAAAntC,4CAAAmtC,WAAA,IAAA,\/DAAW;AAAX,AAAA,AACE,CAACtlE,kCAAAA,uCAAAA,PAAE4M,mBAAAA,jBAAElC,mBAAAA;;AADP;AAAA,eAAA66D;eAAAF;eAAAD;eAAA,CAAAD,WAAA;;;;;;;AAAA,IAAA,qBAAA,AAAArqD,cAAAyqD;AAAA,AAAA,GAAAjtC;AAAA,AAAA,IAAA,iBAAAA;AAAA,AAAA,GAAA,AAAA7R,6BAAA8+C;AAAA,IAAA,kBAAA,AAAAhtC,sBAAAgtC;AAAA,AAAA,eAAA,AAAA\/sC,qBAAA+sC;eAAA9sC;eAAA,AAAA9Y,gBAAA8Y;eAAA;;;;;;;AAAA,IAAA,aAAA,AAAA9zB,gBAAA4gE;QAAA,AAAAptC,4CAAAqtC,WAAA,IAAA,\/DAAS;QAAT,AAAArtC,4CAAAqtC,WAAA,IAAA,\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\/D;;AACf,GAAI,8GAAA,7GAAO,AAAA,mGAAen\/D;AACxB,GAAM,AAACwK,cAAIvP;AAAX,AACE,AAAC0E,iBAAOC,OAAO,iBAAA,mBAAI,AAAA,gGAAcI;AAAlB,AAAA,oBAAAhK;AAAAA;;AAAA;;;;AADjB;;AAEA,AACE,GAAM,AAACwU,cAAIvP;AAAX,AACE,IAAA,iBAAW,AAAC5G,gBAAM4G;IAAlB,iBAAwB2E;IAAxB,iBAA+BI;AAA\/B,AAAA,mFAAAo\/D,eAAAC,eAAAC,sCAAAF,eAAAC,eAAAC,pLAACC,0CAAAA,wFAAAA;;AADH;;AAEA,IAAO,iBAAK,AAAChrE,eAAK0G;IAAM,UAAE,4GAAA,3GAAK,AAAA,mGAAe+E;;AAA9C,AACE,GAAI,EAAK\/E,oBAAK,EAAI,YAAA,XAAMV,sBAAG,GAAK,aAAA,ZAAOA;AACrC,AACE,AAACoF,iBAAOC,OAAOutC;;AACf,IAAA,iBAAW,AAAC94C,gBAAM4G;IAAlB,iBAAwB2E;IAAxB,iBAA+BI;AAA\/B,AAAA,mFAAAw\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\/DACS;QADT,AAAA97C,4CAAA87C,WAAA,IAAA,\/DACW;YADXA,RACiB;cADjBF,VAC0B;IACnB,KAAG,AAAChxD,gBAAMnY;AAFjB,AAAA,IAAO,SAAAkM;IAAP,eAAA+8D;IAEO,SAAAS;;AAFP,AAAA,IAAO,SAAAx9D;IAAP,aAAA+8D;IAAA,aAAA,AAAA\/4D,cAAAo5D;IAAA,eAAA,AAAAvvE,gBAAAwvE;IAAA,iBAAA,AAAAtvE,eAAAsvE;IAAA,aAAAC;YAAA,AAAAj8C,4CAAAk8C,WAAA,IAAA,nEACS;YADT,AAAAl8C,4CAAAk8C,WAAA,IAAA,nEACW;gBADXA,ZACiB;kBADjBF,dAC0B;IACnB,SAAAG;AAFP,AAGE,oBAAIxkE;AACF,GAAM,EAAI,kBAAAirB,jBAAUrwB,yCAAG,kBAAAqL,jBAASrL;AAAhC,AACE,oBAAIoM;AACF,GAAM,AAACgB,6CAAEhB,OAAG,AAACwkB,oBAAU5wB;AAAvB,AACE,eAAOoM;eAAGy9D;eAAQ,AAAClwD,8CAAMiwD,OAAG,AAACb,mBAAS\/oE,OAAGkC;;;;;;AAD3C;;;AAEA,IAAA,qBAAkB,AAAC0uB,oBAAU5wB;AAA7B,AAAA,oBAAA4tB;AAAA,AAAA,aAAAA,TAAW;AAAX,AACE,eAAOk8C;eAAOD;eAAQ,AAAClwD,8CAAMiwD,OAAG,AAACb,mBAAS\/oE,OAAGkC;;;;;;AAD\/C;;;;AAJJ;;;AADF,0FAOGkK,OAAGw9D;;;;;AAXV;;;AAaF,6BAAA,7BAAMG,kEAAkB,OAAO,EAAE,UAAU,OAAO;AAAlD,AACE,OAACnF,+BACCp\/D,OACA,WAAK,EAAE,EAAE;AAAT,AACE,AAAI,IAAA,iBAAW,AAAC0nB,cAAI7xB;IAAhB,iBAAmB8uE;IAAnB,iBAAqBvkE;AAArB,AAAA,mFAAAokE,eAAAC,eAAAC,sCAAAF,eAAAC,eAAAC,pLAAC\/E,0CAAAA,wFAAAA;;AACD,mBAAA,nBAAC5\/D,iBAAO4kE;;AACR,IAAA,WAAW,AAACh9C,cAAI9xB;IAAhB,WAAmB8uE;IAAnB,WAAqBvkE;AAArB,AAAA,0FAAAwkE,SAAAC,SAAAC,gCAAAF,SAAAC,SAAAC,tJAACnF,0CAAAA,sEAAAA;sEALT,KAAA,xEAME,qDAAA,RAAKV,+BACL7+D,KAAK,AAACwK,cAAIlQ;;AAEd,sBAAA,tBAAMqmE,oDAAW,EAAE,UAAU,OAAO;AAApC,AACE,IAAA,aAAoB,2BAAA,qBAAA,9CAAM,AAAC3qD,qBAAK1b,IACV,AAACgpE,kBAAQhpE;SAD\/B,AAAAutB,4CAAA88C,WAAA,IAAA,hEAAO;eAAP,AAAA98C,4CAAA88C,WAAA,IAAA,tEAAU;AAAV,AAEE,oBAAIn+D;AACF,OAAC29D,2BAAiB,CAAA,iDAAU39D,cAAIo+D,SAASrF,UAAU3\/D,OAAOI;;AAC1D,kCAAA,3BAACmkE,gCAAqB7pE,EAAEilE,UAAU3\/D,OAAOI;;;AAE\/C,AAAA,AAAA,AAAA,AAAA,2DAAAlR,3DA8GE81C;;AA9GF,AAAA,AAAA,AA8GEA,6EACA,WAAa,EAAE,OAAO;AAAtB,AAAA,YAAA,RAAa;AAAb,AACE,wBAAA,xBAACjlC,iBAAOC;;AACR,oBAAA,2CAAA,\/DAAC8gE,iHAAgB,AAASnrE,oBAAIqK,OAAOI;;AACrC,+BAAA,xBAACL,iBAAOC;;;AAlHZ,AAAA,AAAA,AAAA,sDAAA9Q,tDAoHEwY;;AApHF,AAAA,AAAA,AAoHEA,wEACA,WAAa,EAAE,OAAO;AAAtB,AAAA,YAAA,RAAa;AAAb,AACE,wBAAA,xBAAC3H,iBAAOC;;AACR,OAAC8gE,oBAAU,AAAOnrE,UAAGqK,OAAOI;;;AAvHhC,AAAA,AAAA,AAAA,6DAAAlR,7DAOEqF;;AAPF,AAAA,AAAA,AAOEA,+EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAAC6qE,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AARzF,AAAA,AAAA,AAAA,0DAAAnM,1DACE68B;;AADF,AAAA,AAAA,AACEA,4EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACqzC,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAFzF,AAAA,AAAA,AAAA,2DAAAnM,3DAuDE8pB;;AAvDF,AAAA,AAAA,AAuDEA,6EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAAComD,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAxDzF,AAAA,AAAA,AAAA,uEAAAnM,vEAmBEi7D;;AAnBF,AAAA,AAAA,AAmBEA,yFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACiV,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AApBzF,AAAA,AAAA,AAAA,0DAAAnM,1DAsBEu4D;;AAtBF,AAAA,AAAA,AAsBEA,4EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAAC2X,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAvBzF,AAAA,AAAA,AAAA,4DAAAnM,5DAiDE47D;;AAjDF,AAAA,AAAA,AAiDEA,8EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACsU,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAlDzF,AAAA,AAAA,AAAA,wEAAAnM,xEAoEEkyD;;AApEF,AAAA,AAAA,AAoEEA,0FACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACge,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AArEzF,AAAA,AAAA,AAAA,iEAAAnM,jEAqGEqc;;AArGF,AAAA,AAAA,AAqGEA,mFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAAC6zD,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAtGzF,AAAA,AAAA,AAAA,oEAAAnM,pEAsFE4lE;;AAtFF,AAAA,AAAA,AAsFEA,sFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,KAAA,IAAA,nEAACsK,+BAAqBp\/D,OAAO8gE,iCAAuB1gE,KAAK\/E;;;AAvF1F,AAAA,AAAA,AAAA,6DAAAnM,7DA2CEyqD;;AA3CF,AAAA,AAAA,AA2CEA,+EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACylB,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AA5CzF,AAAA,AAAA,AAAA,yDAAAnM,zDA0DE4vD;;AA1DF,AAAA,AAAA,AA0DEA,2EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AACE,OAACiiB,oBAAU1lE,SAAKylE,oBAAU9gE,OAAOI;;;AA5DrC,AAAA,AAAA,AAAA,uDAAAlR,vDA+BE66B;;AA\/BF,AAAA,AAAA,AA+BEA,yEACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACq1C,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAhCzF,AAAA,AAAA,AAAA,0DAAAnM,1DAkGEw9C;;AAlGF,AAAA,AAAA,AAkGEA,4EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAAC0yB,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAnGzF,AAAA,AAAA,AAAA,uDAAAnM,vDAUEwhB;;AAVF,AAAA,AAAA,AAUEA,yEACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAAC0uD,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAXzF,AAAA,AAAA,AAAA,oEAAAnM,pEA2EEivD;;AA3EF,AAAA,AAAA,AA2EEA,sFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AACE,OAAC4iB,oBAAU1lE,SAAKylE,oBAAU9gE,OAAOI;;;AA7ErC,AAAA,AAAA,AAAA,+DAAAlR,\/DAyBEg5D;;AAzBF,AAAA,AAAA,AAyBEA,iFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACkX,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AA1BzF,AAAA,AAAA,AAAA,yDAAAnM,zDA8CEorD;;AA9CF,AAAA,AAAA,AA8CEA,2EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAAC8kB,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AA\/CzF,AAAA,AAAA,AAAA,wDAAAnM,xDA4FEk8C;;AA5FF,AAAA,AAAA,AA4FEA,0EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACg0B,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AA7FzF,AAAA,AAAA,AAAA,oEAAAnM,pEA+EEsgE;;AA\/EF,AAAA,AAAA,AA+EEA,sFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AACE,OAACuR,oBAAU1lE,SAAKylE,oBAAU9gE,OAAOI;;;AAjFrC,AAAA,AAAA,AAAA,oEAAAlR,pEAmFEwkE;;AAnFF,AAAA,AAAA,AAmFEA,sFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,KAAA,IAAA,nEAAC0L,+BAAqBp\/D,OAAO8gE,iCAAuB1gE,KAAK\/E;;;AApF1F,AAAA,AAAA,AAAA,8DAAAnM,9DAwCE89B;;AAxCF,AAAA,AAAA,AAwCEA,gFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACoyC,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAzCzF,AAAA,AAAA,AAAA,uDAAAnM,vDAwGEqyC;;AAxGF,AAAA,AAAA,AAwGEA,yEACA,WAAa,EAAE,OAAO;AAAtB,AAAA,YAAA,RAAa;AAAb,AACE,wBAAA,xBAACxhC,iBAAOC;;AACR,oBAAA,2CAAA,\/DAAC8gE,iHAAgB,AAASnrE,oBAAIqK,OAAOI;;AACrC,+BAAA,xBAACL,iBAAOC;;;AA5GZ,AAAA,AAAA,AAAA,yDAAA9Q,zDAiEE8iE;;AAjEF,AAAA,AAAA,AAiEEA,2EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACoN,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAlEzF,AAAA,AAAA,AAAA,0DAAAnM,1DAoDE07D;;AApDF,AAAA,AAAA,AAoDEA,4EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACwU,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AArDzF,AAAA,AAAA,AAAA,yDAAAnM,zDA+FE68C;;AA\/FF,AAAA,AAAA,AA+FEA,2EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACqzB,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAhGzF,AAAA,AAAA,AAAA,mEAAAnM,nEAqCE0oD;;AArCF,AAAA,AAAA,AAqCEA,qFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACwnB,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAtCzF,AAAA,AAAA,AAAA,qEAAAnM,rEAgBE4tD;;AAhBF,AAAA,AAAA,AAgBEA,uFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACsiB,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AAjBzF,AAAA,AAAA,AAAA,4DAAAnM,5DAkCEk6B;;AAlCF,AAAA,AAAA,AAkCEA,8EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,+BAAA,xBAACrpB,iBAAOC;;;AAnCzC,AAAA,AAAA,AAAA,kEAAA9Q,lEAaEmuD;;AAbF,AAAA,AAAA,AAaEA,oFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,WAAA,IAAA,zEAAC+hB,+BAAqBp\/D,OAAO8gE,uCAA6B1gE,KAAK,AAACwK,cAAIvP;;;AAdrG,AAAA,AAAA,AAAA,qEAAAnM,rEAuEEglB;;AAvEF,AAAA,AAAA,AAuEEA,uFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AACE,OAAC6sD,oBAAU1lE,SAAKylE,oBAAU9gE,OAAOI;;;AAzErC,AAAA,AAAA,AAAA,wDAAAlR,xDAyFEyrE;;AAzFF,AAAA,AAAA,AAyFEA,0EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAACyE,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AA1FzF,AAAA,AAAA,AAAA,sEAAAnM,tEAIEsrC;;AAJF,AAAA,AAAA,AAIEA,wFACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAAC4kC,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AALzF,AAAA,AAAA,AAAA,yDAAAnM,zDA8DEoiE;;AA9DF,AAAA,AAAA,AA8DEA,2EACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAAC8N,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\/E;;;AA\/DzF,AAAA,AAAA,AAAA,uDAAAnM,vDA4BEshB;;AA5BF,AAAA,AAAA,AA4BEA,yEACA,WAAa,KAAK,OAAO;AAAzB,AAAA,eAAA,XAAa;AAAb,AAA+B,iEAAA,IAAA,IAAA,lEAAC4uD,+BAAqBp\/D,OAAO8gE,gCAAsB1gE,KAAK\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\/lE,2BAAWlP;;AAEd,+BAAA,\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\/D,OAAO8gE,gCAAsB1gE,KAAK\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\/D,cAAAw\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\/3E;;AAX\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\/B;AAA\/B,AAAA,GAAAhmD;AAAA,IAAA,wBACK,CAAI,AAAC6f,gBAAMgmC,YAAQ,AAAChmC,gBAAMmmC;AAD\/B,AAAA,GAAAhmD;AAEK,UAAA,NAAO;QAAP,JAAgB;;AAAhB,AACE,GAAI,EAAI,GAAKwgB,WAAK,CAAIlb,MAAE,AAACua,gBAAMgmC;AAC7BrlC;;AACA,eAAO,AAACu8D,mDAAKryE,EAAE,CAACs7C,sCAAAA,yCAAAA,LAAM1gD,qBAAAA,IAAG,CAACugD,uCAAAA,0CAAAA,LAAOvgD,sBAAAA;eAAI,KAAA,JAAKA;;;;;;;;AALnDtF;;;AAAAA;;;AAAAA;;;;;;AAbT,AAAA,+CAAA,\/CAAe88E;;AAAf,AAoBA,AAAA;;;;;;oBAAA,4BAAA,hDAAMI;AAAN,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,gDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,gDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA\/5E,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,kDAAA,lDAAM+5E,6DAKF;AALJ,AAKS,uDAAA,AAAA\/+D,hDAACg\/D,gEAAS,AAACV,kCAAsBW;;;AAL1C,AAAA,kDAAA,lDAAMF,6DAMF,EAAE;AANN,AAMW,OAACx0C,oBAAU,AAACrxB,4CAAI,AAAA,0FAAU3M,GAAG0yE;;;AANxC,AAAA,4CAAA,5CAAMF;;AAAN,AAQA,AAAA;;;;;;sBAAA,8BAAA,pDAAMI;AAAN,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,kDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAn6E,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,oDAAA,pDAAMm6E,+DAKF;AALJ,AAKS,yDAAA,AAAAn\/D,lDAACo\/D,kEAAW,AAACd,kCAAsBW;;;AAL5C,AAAA,oDAAA,pDAAME,+DAMF,EAAE;AANN,AAMW,OAAC50C,oBAAU,AAACrxB,4CAAI,AAAA,6FAAY3M,GAAG0yE;;;AAN1C,AAAA,8CAAA,9CAAME;;AAAN,AAQA,AAAA;;;;;;;wBAAA,gCAAA,xDAAMG;AAAN,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,oDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,oDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAt6E,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,sDAAA,tDAAMs6E,iEAMF;AANJ,AAMS,2DAAA,AAAAt\/D,pDAACu\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\/E;AAAY,QAACu\/E,uCAAAA,0CAAAA,LAAO59E,sBAAAA;;AAApB3B;;MAAN,AAAA,KAAA;AADD,AAAA,oBAAAwG;AAAAA;;AAAA,IAAA,uBAGC,iBAAO,KAAG,AAACg5E,gDAAQ79E;;AAAnB,AACE,GAAM,uBAAA,tBAAM,AAACke,gBAAMm3B;AAAnB,AACE,oBAAM,iBAAA,WAAUx1C;IAAV,WAAY,AAACqD,gBAAMmyC;IAAnB,WAAuBsoC;AAAvB,AAAA,sHAAAG,SAAAC,SAAAC,8CAAAF,SAAAC,SAAAC,hMAACP,wDAAAA,oFAAAA;;AAAP,AAAA;AAAA;;AAEA,eAAO,AAACnkE,eAAK+7B;;;;AAHf;;;;;AAJH,AAAA,oBAAAxwC;AAAAA;;AAAA,IAAA,uBAQC,iBAAO,KAAG,AAACg5E,gDAAQh+E;;AAAnB,AACE,GAAM,uBAAA,tBAAM,AAACqe,gBAAMm3B;AAAnB,AACE,oBAAM,iBAAA,WAAU,AAACnyC,gBAAMmyC;IAAjB,WAAqBr1C;IAArB,WAAuB29E;AAAvB,AAAA,sHAAAM,SAAAC,SAAAC,8CAAAF,SAAAC,SAAAC,hMAACV,wDAAAA,oFAAAA;;AAAP,AAAA;AAAA;;AAEA,eAAO,AAACnkE,eAAK+7B;;;;AAHf;;;;;AATH,AAAA,oBAAAxwC;AAAAA;;AAAA;;;;;AAeJ,sBAAA,tBAAOu5E,oDACJ,EAAE,EAAE,aAAa;AADpB,AAEE,IAAA,mBAAI,AAACX,wBAAS59E,EAAEG,EAAE29E;AAAlB,AAAA,oBAAA94E;AAAAA;;AAAgC,OAACu2E,mDAAKoC,UAAU39E,EAAEG;;;AAEpD,uCAAA,vCAAOq+E,sFACJ,KAAK,aAAa,UAAU,aAAa,aAAa,aAAa,iBAAiB;AADvF,AAEE,IAAM,aAAW,AAAC32E,+CAAO,cAAA,HAAK;AAAL,AAAA,IAAA,aAAA42E;QAAA,AAAA5nD,4CAAA6nD,WAAA,IAAA,\/DAAS;QAAT,AAAA7nD,4CAAA6nD,WAAA,IAAA,\/DAAW;QAAXA,JAAiB;AAAjB,AACE,GAAI,mDAAA,AAAA\/hE,nDAAC4+D,mEAAMoC,WAAUgB,aAAav1E;AAChC,IAAM,MAAI,kBAAI,iBAAA,mBAAI,OAAA,NAAMw1E;AAAV,AAAA,GAAA55E;AAAAA;;AAAc,8DAAA,AAAA2X,vDAAC4hE,oBAAUn1E,EAAE,AAAC\/F,gBAAMu7E,IAAId,6BAAcH;;MACtDl5E,EACAm6E;AAFZ,AAGE,oBAAU,wDAAA,AAAAjiE,xDAAC4hE,oBAAU,AAACl7E,gBAAMw7E,KAAKz1E,EAAE00E,6BAAcH;AAAjD;AAAA,AACE,MAAO,KAAAh8E,MACE,CAAA,sFAAA,qFAAA,sDAAA,0EAAA,3NAAyC8T,6EACZkpE,iEAAoBv1E,uDACvC,AAAC\/F,gBAAMw7E;;;AAC5BA;;AACFD;;GAXZ,KAAA,AAAAjiE,gBAYO8gE;IAClB,iBAAW,iBAAA,qBAAe,iBAAA,oBAAK,eAAA,dAAMqB;AAAX,AAAA,GAAAtgF;AAAuB,IAAA,eAAA,AAAAme,gBAAE8gE;AAAF,AAAA,QAAAsB,6CAAAA,mEAAAA,xBAAeC,+CAAAA;;AAAtCxgF;;;AAAf,AAAA,oBAAAsD;AAAA,YAAAA,RAAS;AAAT,AAAA,0FACGk9E,qBAAqBxwE;;AACtBswE;;;AAfnB,AAgBE,oBAAMA;AAAN,AACE,GAAI,6CAAA,AAAAniE,kCAAA,AAAAA,\/EAACnG,6DAAGknE,kCAAkBC;AACxB,AACE,AAAC1D,mDAAMuD,aAAa\/6D,gBAAMk8D,aAAa,AAACl+D,iBAAOq+D;;AAC\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\/BAAEuE,iCAAAA,\/BAAEC,iCAAAA,\/BAAEC,iCAAAA,\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\/CAAEuE,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEvE,iDAAAA,\/CAAE\/F,iDAAAA,\/CAAEuK,iDAAAA,\/CAAEC,iDAAAA,\/CAAEpF,iDAAAA,\/CAAEqF,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\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\/BAAEuE,iCAAAA,\/BAAEC,iCAAAA,\/BAAEC,iCAAAA,\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\/DjC,AAAA,SAAA,LA+DY;AA\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\/CAAEuE,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\/CAAEvE,iDAAAA,\/CAAE\/F,iDAAAA,\/CAAEuK,iDAAAA,\/CAAEC,iDAAAA,\/CAAEpF,iDAAAA,\/CAAEqF,iDAAAA,\/CAAEC,iDAAAA,\/CAAEC,iDAAAA,\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\/GjD,AAAA,SAAA,LA+GY;AA\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\/EAASqC,0FA+KiB;;AA\/K1B,AAAA,aAAA,TA+K0B;AA\/K1B,AA+K8BhB;;;AA\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\/E,+BAAA,hBAAO,AAAcn\/E;;AAEvB,wBAAA,xBAAMy\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\/D,+CAAO,AAACyP,kBAAQ\/6E;AAA\/B,AACE,OAAC2Z,8CAAM\/D,IACLwmE,QAAQ,KAAAlvE,cAAA;;AAAA,AAAO,OAAC22C,gBAAYm4B,OAAOh8E;;uJAA3B,2CAAA,jMACE,AAAC+M,+CAAO,4CAAKxB,KAAK,4CAAK6wE,qGAAehwE;;;AAJ9D,AAKE,2DAAA,pDAAC3N,+CAAO8wC,wCAAQ,AAAChzB,kBAAQy\/D;;AAE\/B,AAAA;;;sBAAA,8BAAA,pDAAMqB;AAAN,AAAA,IAAA,WAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,kDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA9kF,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,oDAAA,pDAAM8kF,+DAEF;AAFJ,AAGG,OAACC,kDAAU\/xE,IAAI,AAACoxE,sBAAYpxE;;;AAH\/B,AAAA,oDAAA,pDAAM8xE,+DAIF,IAAI;AAJR,AAKG,YAAApB,oBAAYD,OAAOzwE;;;AALtB,AAAA,8CAAA,9CAAM8xE;;AAAN,AAOA;;;;oBAAA,pBAAME,gDAGH;AAHH,AAIE,GAAM,uBAAA,tBAAMjB;AAAZ,AACE,AAAMA,qBAAS,6CAAA,7CAACjR;;AADlB;;AAEA,IAAM,SAAO,4CAAA,AAAA93D,5CAAC9G,4DAAK6vE,oBAASlwE;AAA5B,AACE,GAAA,GAAQ,WAAA,VAAMoxE;AACZA;;AACA,IAAM,SAAO,AAACb,sBAAYvwE;AAA1B,AACE,GAAU,WAAA,VAAM4vE;AAAhB;;AAAA,AACE,IAAM,SAAO,AAACsB,kDAAUlxE,GAAG4vE;AAA3B,AACE,AAACnL,mDAAMyL,mBAASjjE,gBAAMjN,GAAG09D;;AACzBA;;;;AAEZ;;;;2BAAA,3BAAM2T,8DAGH;AAHH,AAIE,GAAM,uBAAA,tBAAMnB;AAAZ,AACE,AAAMA,qBAAS,6CAAA,7CAACjR;;AADlB;;AAEA,IAAM,SAAO,4CAAKj\/D;IACZ,SAAG,EAAI,GAAK,4BAAA,5BAAUsxE,qBAAiBC,qBAClC,AAACrS,+CAAO,qDAAA,RAAKqS,6BACbvxE;IACL,SAAO,4CAAA,AAAAmH,5CAAC9G,4DAAK6vE,oBAASlwE;AAJ5B,AAKE,GAAA,GAAQ,WAAA,VAAMoxE;AACZA;;AACA,IAAM,SAAO,AAACb,sBAAYvwE;AAA1B,AACC,GAAU,WAAA,VAAM4vE;AAAhB;;AAAA,AACE,IAAM,SAAO,AAACsB,kDAAUlxE,OAAG4vE;AAA3B,AACE,AAACnL,mDAAMyL,mBAASjjE,gBAAMjN,OAAG09D;;AACzBA;;;;AAEX;;;;oBAAA,pBAAM8T,gDAGH;AAHH,AAIE,OAAQ5B;;AAEV;;;uBAAA,vBAAM6B,sDAGH;AAHH,AAIE,qBAAWC,bAASlnF;;AAEtB,qCAAA,rCAAOmnF;AAAP,AACE,GACE,QAAAvnF;AACA,OAACD;;AAFH,GAIE,EAAI,kCAAA,jCAAYW,iDACZ,kCAAA,jCAAYA;AAChB,IAAM,SAAO,UAAA,VAAO8mF;AAApB,AACE,sCAAA,tCAAMpoF;;AACN,AAACH,6BACC;;AAAA,AACE,IAAM,KAAG;IACH,IAAG,0BAAA,1BAAO,AAACgB,iBAAaC;AAD9B,AAEE,OAAU,AAAOunF,mBAAQtlF;;;;AAC\/B,OAACjD,iCACC;;AAAA,AACE,IAAM,KAAG;IACH,IAAG,0BAAA,1BAAO,AAACe,iBAAaC;AAD9B,AAEE,OAAU,AAASunF,qBAAQtlF;;;;AAjBrC;;;;AAmBF,AAAColF;AAED,GAAA,QAAAxpF,iCAAAC,sCAAA0pF;AAAA;AAAA,AAAA;;;;;AAIEC,6BACA,qCAAK;AAAL,AACE,MAAO,KAAA5lF,MAAA;;;AAEX;;;;;iBAAA,jBAAM6lF,0CAIH;AAJH,AAKE,QAACD,2DAAAA,iEAAAA,RAAOxE,6CAAAA","names":["cljs.core\/*clojurescript-version*","cljs.core\/*unchecked-if*","cljs.core\/*unchecked-arrays*","cljs.core\/*warn-on-infer*","js\/cljs","js\/cljs.core","js\/cljs.core.PROTOCOL_SENTINEL","cljs.core\/PROTOCOL_SENTINEL","cljs.core\/MODULE_URIS","cljs.core\/MODULE_INFOS","goog\/define","cljs.core\/*ns*","cljs.core\/*out*","cljs.core\/*assert*","js\/cljs.core.*print-fn*","cljs.core\/*print-fn*","cljs.core\/*exec-tap-fn*","and__7791__auto__","js\/setTimeout","f","js\/cljs.core.*print-err-fn*","cljs.core\/*print-err-fn*","cljs.core\/set-print-fn!","cljs.core\/set-print-err-fn!","cljs.core\/*flush-on-newline*","cljs.core\/*print-newline*","cljs.core\/*print-readably*","cljs.core\/*print-meta*","cljs.core\/*print-dup*","cljs.core\/*print-namespace-maps*","cljs.core\/*print-length*","cljs.core\/*print-level*","cljs.core\/*print-fn-bodies*","js\/cljs.core.*loaded-libs*","cljs.core\/*loaded-libs*","cljs.core\/pr-opts","cljs.core\/enable-console-print!","js\/console","goog.array\/clone","xs","cljs.core\/truth_","x","cljs.core\/not-native","cljs.core\/identical?","y","cljs.core\/nil?","cljs.core\/array?","cljs.core\/*target*","js\/Array","cljs.core\/number?","cljs.core\/not","cljs.core\/some?","cljs.core\/object?","js\/Object","cljs.core\/string?","goog\/isString","cljs.core\/char?","cljs.core\/any?","cljs.core\/native-satisfies?","p","goog\/typeOf","cljs.core\/is_proto_","cljs.core\/*main-cli-fn*","cljs.core\/*command-line-args*","cljs.core\/type","cljs.core\/missing-protocol","obj","ty","js\/Error","proto","cljs.core\/type->str","temp__4655__auto__","s","cljs.core\/load-file","js\/COMPILED","goog\/nodeGlobalRequire","file","js\/Symbol","cljs.core\/ITER_SYMBOL","cljs.core\/CHAR_MAP","cljs.core\/DEMUNGE_MAP","cljs.core\/DEMUNGE_PATTERN","cljs.core\/system-time","js\/performance","js\/process","t","js\/Date","G__10030","cljs.core\/make-array","i__9001__auto__","len__9000__auto__","args-arr__9025__auto__","cljs.core\/IndexedSeq","argseq__9026__auto__","cljs.core\/first","seq10027","cljs.core\/next","self__8987__auto__","G__10028","G__10029","size","more-sizes","n__8769__auto__","i","dimarray","cljs.core.apply.cljs$core$IFn$_invoke$arity$3","dims","cljs.core\/aclone","arr","len","new-arr","cljs.core\/array","a","cljs.core\/maybe-warn","e","G__10046","cljs.core\/checked-aget","seq10043","G__10044","G__10045","e10047","or__7806__auto__","array","goog\/isArrayLike","idx","cljs.core.checked_aget.cljs$core$IFn$_invoke$arity$2","idxs","G__10058","cljs.core\/checked-aset","seq10054","G__10055","G__10056","G__10057","e10059","val","cljs.core.apply.cljs$core$IFn$_invoke$arity$4","idx2","idxv","G__10069","cljs.core\/checked-aget'","seq10066","G__10067","G__10068","cljs.core.checked_aget_SINGLEQUOTE_.cljs$core$IFn$_invoke$arity$2","G__10079","cljs.core\/checked-aset'","seq10075","G__10076","G__10077","G__10078","G__10088","cljs.core\/aget","seq10085","G__10086","G__10087","G__10098","cljs.core\/aset","seq10094","G__10095","G__10096","G__10097","cljs.core\/alength","G__10104","cljs.core\/into-array","cljs.core.into_array.cljs$core$IFn$_invoke$arity$2","aseq","cljs.core.reduce.cljs$core$IFn$_invoke$arity$3","args__9010__auto__","cljs.core\/js-invoke","argseq__9011__auto__","seq10106","G__10107","G__10108","cljs.core.into_array.cljs$core$IFn$_invoke$arity$1","args","cljs.core\/Fn","G__10113","cljs.core\/-invoke","cljs\/core","x__8502__auto__","m__8503__auto__","cljs.core\/IFn","this","b","c","d","g","h","j","k","l","m","n","o","q","r","rest","cljs.core\/ICloneable","cljs.core\/-clone","value","cljs.core\/ICounted","cljs.core\/-count","coll","cljs.core\/IEmptyableCollection","cljs.core\/-empty","cljs.core\/ICollection","cljs.core\/-conj","G__10116","cljs.core\/-nth","cljs.core\/IIndexed","not-found","cljs.core\/ASeq","cljs.core\/ISeq","cljs.core\/-first","cljs.core\/-rest","cljs.core\/INext","cljs.core\/-next","G__10119","cljs.core\/-lookup","cljs.core\/ILookup","cljs.core\/IAssociative","cljs.core\/-contains-key?","cljs.core\/-assoc","v","cljs.core\/IFind","cljs.core\/-find","cljs.core\/IMap","cljs.core\/-dissoc","cljs.core\/IMapEntry","cljs.core\/-key","cljs.core\/-val","cljs.core\/ISet","cljs.core\/-disjoin","cljs.core\/IStack","cljs.core\/-peek","cljs.core\/-pop","cljs.core\/IVector","cljs.core\/-assoc-n","cljs.core\/IDeref","cljs.core\/-deref","cljs.core\/IDerefWithTimeout","cljs.core\/-deref-with-timeout","msec","timeout-val","cljs.core\/IMeta","cljs.core\/-meta","cljs.core\/IWithMeta","cljs.core\/-with-meta","meta","G__10122","cljs.core\/-reduce","cljs.core\/IReduce","start","cljs.core\/IKVReduce","cljs.core\/-kv-reduce","init","cljs.core\/IEquiv","cljs.core\/-equiv","other","cljs.core\/IHash","cljs.core\/-hash","cljs.core\/ISeqable","cljs.core\/-seq","cljs.core\/ISequential","cljs.core\/IList","cljs.core\/IRecord","cljs.core\/IReversible","cljs.core\/-rseq","cljs.core\/ISorted","cljs.core\/-sorted-seq","ascending?","cljs.core\/-sorted-seq-from","cljs.core\/-entry-key","entry","cljs.core\/-comparator","cljs.core\/IWriter","cljs.core\/-write","writer","cljs.core\/-flush","cljs.core\/IPrintWithWriter","cljs.core\/-pr-writer","opts","cljs.core\/IPending","cljs.core\/-realized?","cljs.core\/IWatchable","cljs.core\/-notify-watches","oldval","newval","cljs.core\/-add-watch","key","cljs.core\/-remove-watch","cljs.core\/IEditableCollection","cljs.core\/-as-transient","cljs.core\/ITransientCollection","cljs.core\/-conj!","tcoll","cljs.core\/-persistent!","cljs.core\/ITransientAssociative","cljs.core\/-assoc!","cljs.core\/ITransientMap","cljs.core\/-dissoc!","cljs.core\/ITransientVector","cljs.core\/-assoc-n!","cljs.core\/-pop!","cljs.core\/ITransientSet","cljs.core\/-disjoin!","cljs.core\/IComparable","cljs.core\/-compare","cljs.core\/IChunk","cljs.core\/-drop-first","cljs.core\/IChunkedSeq","cljs.core\/-chunked-first","cljs.core\/-chunked-rest","cljs.core\/IChunkedNext","cljs.core\/-chunked-next","cljs.core\/INamed","cljs.core\/-name","cljs.core\/-namespace","cljs.core\/IAtom","cljs.core\/IReset","cljs.core\/-reset!","new-value","G__10125","cljs.core\/-swap!","cljs.core\/ISwap","cljs.core\/IVolatile","cljs.core\/-vreset!","cljs.core\/IIterable","cljs.core\/-iterator","writer__8438__auto__","cljs.core\/StringBufferWriter","cljs.core\/->StringBufferWriter","sb","cljs.core\/pr-str*","goog\/string","cljs.core\/int-rotate-left","js\/Math","js\/Math.imul","Math\/imul","cljs.core\/imul","al","bl","ah","bh","cljs.core\/m3-seed","cljs.core\/m3-C1","cljs.core\/m3-C2","cljs.core\/m3-mix-K1","k1","cljs.core\/m3-mix-H1","h1","cljs.core\/m3-fmix","cljs.core\/m3-hash-int","in","cljs.core\/m3-hash-unencoded-chars","cljs.core\/string-hash-cache","cljs.core\/string-hash-cache-count","cljs.core\/hash-string*","hash","cljs.core\/add-to-string-hash-cache","goog.object\/set","cljs.core\/hash-string","cljs.core\/hash","js\/isFinite","Math\/floor","G__10136","cljs.core\/hash-combine","seed","cljs.core\/instance?","cljs.core\/symbol?","cljs.core\/Symbol","cljs.core\/hash-symbol","sym","cljs.core\/compare-symbols","G__10138","G__10139","goog.array\/defaultCompare","nsc","G__10140","G__10141","G__10142","G__10143","self__","args10144","cljs.core\/->Symbol","ns","name","str","_hash","_meta","cljs.core.get.cljs$core$IFn$_invoke$arity$2","cljs.core.get.cljs$core$IFn$_invoke$arity$3","new-meta","h__8266__auto__","G__10147","cljs.core\/symbol","cljs.core.symbol.cljs$core$IFn$_invoke$arity$2","sym-str","args10149","cljs.core\/Var","cljs.core\/->Var","cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2","fexpr__10150","fexpr__10171","fexpr__10151","fexpr__10172","fexpr__10152","fexpr__10173","fexpr__10153","fexpr__10174","fexpr__10154","fexpr__10175","fexpr__10155","fexpr__10176","fexpr__10156","fexpr__10177","fexpr__10157","fexpr__10178","fexpr__10158","fexpr__10179","fexpr__10159","fexpr__10180","fexpr__10160","fexpr__10181","fexpr__10161","fexpr__10182","fexpr__10162","fexpr__10183","fexpr__10163","fexpr__10184","fexpr__10164","fexpr__10185","fexpr__10165","fexpr__10186","fexpr__10166","fexpr__10187","fexpr__10167","fexpr__10188","fexpr__10168","fexpr__10189","fexpr__10169","fexpr__10190","fexpr__10170","fexpr__10191","cljs.core.apply.cljs$core$IFn$_invoke$arity$variadic","cljs.core\/var?","cljs.core\/iterable?","cljs.core\/clone","cljs.core\/cloneable?","cljs.core\/seq","cljs.core\/rest","G__10203","cljs.core\/=","seq10200","G__10201","G__10202","more","cljs.core\/ES6Iterator","cljs.core\/->ES6Iterator","cljs.core\/es6-iterator","cljs.core\/ES6IteratorSeq","cljs.core\/->ES6IteratorSeq","iter","_rest","cljs.core\/es6-iterator-seq","cljs.core\/mix-collection-hash","hash-basis","count","cljs.core\/hash-ordered-coll","hash-code","cljs.core\/empty-ordered-hash","cljs.core\/hash-unordered-coll","cljs.core\/empty-unordered-hash","G__10217","G__10218","G__10219","G__10223","G__10224","cljs.core\/Inst","cljs.core\/inst-ms*","inst","cljs.core\/inst-ms","cljs.core\/inst?","G__10226","G__10227","G__10228","G__10232","G__10233","G__10234","G__10238","G__10239","G__10240","goog\/getUid","cljs.core\/inc","cljs.core\/Reduced","cljs.core\/->Reduced","cljs.core\/reduced","cljs.core\/reduced?","cljs.core\/ensure-reduced","cljs.core\/unreduced","cljs.core\/deref","G__10245","cljs.core\/ci-reduce","cicoll","cnt","cljs.core._nth.cljs$core$IFn$_invoke$arity$2","G__10246","G__10247","nval","G__10248","G__10249","G__10250","G__10251","G__10260","cljs.core\/array-reduce","G__10261","G__10262","G__10263","G__10264","G__10265","G__10266","cljs.core\/counted?","cljs.core\/indexed?","G__10277","cljs.core\/-indexOf","cljs.core._indexOf.cljs$core$IFn$_invoke$arity$3","cljs.core\/count","x__8162__auto__","y__8163__auto__","cljs.core.nth.cljs$core$IFn$_invoke$arity$2","G__10281","cljs.core\/-lastIndexOf","cljs.core._lastIndexOf.cljs$core$IFn$_invoke$arity$3","x__8169__auto__","y__8170__auto__","cljs.core\/IndexedSeqIterator","cljs.core\/->IndexedSeqIterator","ret","cljs.core\/->IndexedSeq","cljs.core\/equiv-sequential","cljs.core\/cons","cljs.core\/List","cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$4","cljs.core\/RSeq","this__8871__auto__","G__10286","G__10287","G__10288","G__10293","cljs.core\/prim-seq","cljs.core.prim_seq.cljs$core$IFn$_invoke$arity$2","prim","G__10296","cljs.core\/array-seq","cljs.core\/->RSeq","ci","cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$2","col","cljs.core.seq_reduce.cljs$core$IFn$_invoke$arity$3","G__10300","G__10301","G__10302","cljs.core\/second","cljs.core\/ffirst","cljs.core\/nfirst","cljs.core\/fnext","cljs.core\/nnext","cljs.core\/last","sn","G__10307","G__10308","G__10309","G__10317","cljs.core\/conj","seq10314","G__10315","G__10316","cljs.core.conj.cljs$core$IFn$_invoke$arity$2","cljs.core\/empty","cljs.core\/accumulating-seq-count","acc","G__10330","cljs.core\/linear-traversal-nth","cljs.core._nth.cljs$core$IFn$_invoke$arity$3","G__10338","cljs.core\/nth","cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$2","cljs.core.linear_traversal_nth.cljs$core$IFn$_invoke$arity$3","cljs.core\/nthrest","G__10351","cljs.core\/get","cljs.core._lookup.cljs$core$IFn$_invoke$arity$2","cljs.core._lookup.cljs$core$IFn$_invoke$arity$3","G__10360","cljs.core\/assoc","seq10356","G__10357","G__10358","G__10359","cljs.core\/PersistentArrayMap","cljs.core.assoc.cljs$core$IFn$_invoke$arity$3","kvs","G__10373","cljs.core\/dissoc","seq10370","G__10371","G__10372","cljs.core.dissoc.cljs$core$IFn$_invoke$arity$2","ks","cljs.core\/fn?","goog\/isFunction","args10383","cljs.core\/MetaFn","cljs.core\/->MetaFn","afn","cljs.core\/with-meta","cljs.core\/meta","cljs.core\/peek","cljs.core\/pop","G__10391","cljs.core\/disj","seq10388","G__10389","G__10390","cljs.core.disj.cljs$core$IFn$_invoke$arity$2","cljs.core\/empty?","cljs.core\/coll?","cljs.core\/set?","cljs.core\/associative?","cljs.core\/ifind?","cljs.core\/sequential?","cljs.core\/sorted?","cljs.core\/reduceable?","cljs.core\/map?","cljs.core\/record?","cljs.core\/vector?","cljs.core\/chunked-seq?","G__10412","cljs.core\/js-obj","self__8988__auto__","seq10411","cljs.core.apply.cljs$core$IFn$_invoke$arity$2","goog.object\/create","keyvals","cljs.core\/js-keys","goog.object\/getKeys","cljs.core\/js-delete","cljs.core\/array-copy","to","from","cljs.core\/array-copy-downward","cljs.core\/lookup-sentinel","cljs.core\/false?","cljs.core\/true?","cljs.core\/boolean?","cljs.core\/undefined?","cljs.core\/seq?","cljs.core\/seqable?","cljs.core\/boolean","cljs.core\/ifn?","cljs.core\/integer?","js\/isNaN","js\/Infinity","js\/parseFloat","js\/parseInt","cljs.core\/int?","goog\/math","cljs.core\/pos-int?","cljs.core\/neg-int?","cljs.core\/nat-int?","cljs.core\/float?","cljs.core\/double?","cljs.core\/infinite?","js\/Number.POSITIVE_INFINITY","js\/Number.NEGATIVE_INFINITY","cljs.core\/contains?","cljs.core\/find","cljs.core\/MapEntry","G__10437","cljs.core\/distinct?","seq10434","G__10435","G__10436","etc","cljs.core\/compare","G__10446","cljs.core\/compare-indexed","ys","xl","yl","cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$4","cljs.core\/fn->comparator","G__10453","cljs.core\/sort","cljs.core.sort.cljs$core$IFn$_invoke$arity$2","cljs.core\/to-array","G__10454","G__10455","goog.array\/stableSort","comp","G__10460","cljs.core\/sort-by","cljs.core.sort_by.cljs$core$IFn$_invoke$arity$3","keyfn","fexpr__10461","G__10462","G__10463","G__10466","cljs.core\/seq-reduce","G__10467","G__10468","cljs.core\/shuffle","goog.array\/shuffle","cljs.core\/vec","G__10473","cljs.core\/iter-reduce","G__10474","G__10475","nacc","G__10476","G__10477","G__10482","cljs.core\/reduce","cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$2","cljs.core._reduce.cljs$core$IFn$_invoke$arity$2","cljs.core.iter_reduce.cljs$core$IFn$_invoke$arity$2","cljs.core.array_reduce.cljs$core$IFn$_invoke$arity$3","cljs.core._reduce.cljs$core$IFn$_invoke$arity$3","cljs.core.iter_reduce.cljs$core$IFn$_invoke$arity$3","cljs.core\/reduce-kv","cljs.core\/identity","G__10487","cljs.core\/completing","cljs.core.completing.cljs$core$IFn$_invoke$arity$2","cf","G__10491","cljs.core\/transduce","cljs.core.transduce.cljs$core$IFn$_invoke$arity$4","xform","G__10497","cljs.core\/+","seq10494","G__10495","G__10496","G__10506","cljs.core\/-","seq10503","G__10504","G__10505","G__10515","cljs.core\/*","seq10512","G__10513","G__10514","cljs.core\/\/","G__10524","seq10521","G__10522","G__10523","G__10533","cljs.core\/<","seq10530","G__10531","G__10532","G__10545","cljs.core\/<=","seq10542","G__10543","G__10544","G__10557","cljs.core\/>","seq10554","G__10555","G__10556","G__10569","cljs.core\/>=","seq10566","G__10567","G__10568","cljs.core\/dec","G__10581","cljs.core\/max","seq10578","G__10579","G__10580","G__10590","cljs.core\/min","seq10587","G__10588","G__10589","cljs.core\/byte","cljs.core\/char","js\/String","cljs.core\/short","cljs.core\/float","cljs.core\/double","cljs.core\/unchecked-byte","cljs.core\/unchecked-char","cljs.core\/unchecked-short","cljs.core\/unchecked-float","cljs.core\/unchecked-double","G__10599","cljs.core\/unchecked-add","seq10596","G__10597","G__10598","G__10608","cljs.core\/unchecked-add-int","seq10605","G__10606","G__10607","cljs.core\/unchecked-dec","cljs.core\/unchecked-dec-int","G__10617","cljs.core\/unchecked-divide-int","seq10614","G__10615","G__10616","cljs.core\/unchecked-inc","cljs.core\/unchecked-inc-int","G__10626","cljs.core\/unchecked-multiply","seq10623","G__10624","G__10625","G__10635","cljs.core\/unchecked-multiply-int","seq10632","G__10633","G__10634","cljs.core\/unchecked-negate","cljs.core\/unchecked-negate-int","cljs.core\/unchecked-remainder-int","cljs.core\/mod","G__10644","cljs.core\/unchecked-subtract","seq10641","G__10642","G__10643","G__10653","cljs.core\/unchecked-subtract-int","seq10650","G__10651","G__10652","cljs.core\/fix","Math\/ceil","cljs.core\/int","cljs.core\/unchecked-int","cljs.core\/long","cljs.core\/unchecked-long","cljs.core\/booleans","cljs.core\/bytes","cljs.core\/chars","cljs.core\/shorts","cljs.core\/ints","cljs.core\/floats","cljs.core\/doubles","cljs.core\/longs","cljs.core\/js-mod","cljs.core\/quot","rem","cljs.core\/rem","G__10662","cljs.core\/bit-xor","seq10659","G__10660","G__10661","G__10671","cljs.core\/bit-and","seq10668","G__10669","G__10670","G__10680","cljs.core\/bit-or","seq10677","G__10678","G__10679","G__10689","cljs.core\/bit-and-not","seq10686","G__10687","G__10688","cljs.core\/bit-clear","cljs.core\/bit-flip","cljs.core\/bit-not","cljs.core\/bit-set","cljs.core\/bit-test","cljs.core\/bit-shift-left","cljs.core\/bit-shift-right","cljs.core\/bit-shift-right-zero-fill","cljs.core\/unsigned-bit-shift-right","cljs.core\/bit-count","G__10698","cljs.core\/==","seq10695","G__10696","G__10697","cljs.core\/pos?","cljs.core\/zero?","cljs.core\/neg?","cljs.core\/nthnext","G__10711","cljs.core\/str","seq10709","G__10710","G__10719","cljs.core\/subs","end","cljs.core\/hash-coll","res","cljs.core\/hash-imap","cljs.core\/key","cljs.core\/val","cljs.core\/hash-iset","cljs.core\/extend-object!","i__10732","count__10731","chunk__10730","cljs.core.nth.cljs$core$IFn$_invoke$arity$3","vec__10733","seq__10729","temp__4657__auto__","cljs.core\/chunk-first","cljs.core\/chunk-rest","c__8664__auto__","vec__10736","fn-map","cljs.core\/name","key-name","str-name","cljs.core\/->List","first","__hash","cljs.core\/list?","G__10769","G__10770","G__10771","cljs.core\/EmptyList","cljs.core\/->EmptyList","G__10777","G__10778","G__10779","cljs.core\/reversible?","cljs.core\/rseq","rev","cljs.core\/reverse","cljs.core\/list","seq10784","cljs.core\/Cons","cljs.core\/->Cons","G__10793","G__10794","G__10795","cljs.core\/hash-keyword","cljs.core\/compare-keywords","G__10801","G__10802","G__10803","G__10804","G__10805","G__10806","args10807","cljs.core\/Keyword","cljs.core\/->Keyword","fqn","kw","cljs.core\/keyword?","cljs.core\/keyword-identical?","cljs.core\/symbol-identical?","cljs.core\/namespace","cljs.core\/ident?","cljs.core\/simple-ident?","cljs.core\/qualified-ident?","cljs.core\/simple-symbol?","cljs.core\/qualified-symbol?","cljs.core\/simple-keyword?","cljs.core\/qualified-keyword?","G__10811","cljs.core\/keyword","parts","cljs.core\/LazySeq","cljs.core\/->LazySeq","fn","ls","G__10816","G__10817","G__10818","cljs.core\/ChunkBuffer","cljs.core\/->ChunkBuffer","buf","cljs.core\/ArrayChunk","cljs.core\/chunk-buffer","capacity","cljs.core\/->ArrayChunk","off","G__10823","cljs.core\/array-chunk","cljs.core\/ChunkedCons","cljs.core\/->ChunkedCons","chunk","G__10827","G__10828","G__10829","cljs.core\/chunk-cons","cljs.core\/chunk-append","cljs.core\/chunk","cljs.core\/chunk-next","ary","cljs.core\/to-array-2d","G__10840","cljs.core\/int-array","size-or-seq","cljs.core.int_array.cljs$core$IFn$_invoke$arity$2","init-val-or-seq","G__10848","cljs.core\/long-array","cljs.core.long_array.cljs$core$IFn$_invoke$arity$2","G__10856","cljs.core\/double-array","cljs.core.double_array.cljs$core$IFn$_invoke$arity$2","G__10864","cljs.core\/object-array","cljs.core.object_array.cljs$core$IFn$_invoke$arity$2","cljs.core\/bounded-count","cljs.core\/spread","arglist","G__10877","cljs.core\/concat","seq10874","G__10875","G__10876","cljs.core.concat.cljs$core$IFn$_invoke$arity$2","xys","cat","zs","G__10888","cljs.core\/list*","seq10883","G__10884","G__10885","G__10886","G__10887","cljs.core\/transient","cljs.core\/persistent!","G__10897","cljs.core\/conj!","seq10894","G__10895","G__10896","vals","ntcoll","G__10910","cljs.core\/assoc!","seq10906","G__10907","G__10908","G__10909","G__10923","cljs.core\/dissoc!","seq10920","G__10921","G__10922","cljs.core\/pop!","G__10935","cljs.core\/disj!","seq10932","G__10933","G__10934","cljs.core\/apply-to","argc","a8813","b8814","c8815","d8816","e8817","f8818","g8819","h8820","i8821","j8822","k8823","l8824","m8825","n8826","o8827","p8828","q8829","r8830","s8831","t8832","G__10944","cljs.core\/apply-to-simple","cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$3","a0","cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$4","a1","cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$5","a2","cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$6","a3","next_4","a4","next_5","a5","next_6","a6","next_7","a7","next_8","a8","next_9","a9","next_10","a10","next_11","a11","next_12","a12","next_13","a13","next_14","a14","next_15","a15","next_16","a16","next_17","a17","next_18","a18","next_19","a19","s__8842__auto__","arr__8841__auto__","G__10955","cljs.core\/apply","seq10949","G__10950","G__10951","G__10952","G__10953","G__10954","fixed-arity","bc","cljs.core.apply_to_simple.cljs$core$IFn$_invoke$arity$2","cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$2","cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$3","cljs.core.list_STAR_.cljs$core$IFn$_invoke$arity$4","z","spread-args","G__10968","cljs.core\/vary-meta","seq10961","G__10962","G__10963","G__10964","G__10965","G__10966","G__10967","G__10969","G__10970","G__10971","G__10972","G__10973","G__10974","G__10975","G__10976","G__10977","G__10978","G__10979","G__10980","G__10981","G__10982","G__10983","G__10992","cljs.core\/not=","seq10989","G__10990","G__10991","cljs.core\/not-empty","cljs.core\/nil-iter","js\/cljs.core.t_cljs$core10997","cljs.core\/t_cljs$core10997","meta10998","cljs.core\/->t_cljs$core10997","cljs.core\/StringIter","cljs.core\/->StringIter","cljs.core\/string-iter","cljs.core\/ArrayIter","cljs.core\/->ArrayIter","cljs.core\/array-iter","cljs.core\/INIT","cljs.core\/START","cljs.core\/SeqIter","cljs.core\/->SeqIter","_seq","_next","cljs.core\/seq-iter","cljs.core\/iter","cljs.core\/Many","cljs.core\/->Many","cljs.core\/NONE","cljs.core\/Single","cljs.core\/->Single","cljs.core\/Empty","cljs.core\/->Empty","cljs.core\/EMPTY","cljs.core\/MultiIterator","cljs.core\/->MultiIterator","iters","nexts","cljs.core\/chunkIteratorSeq","cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$3","cljs.core\/TransformerIterator","cljs.core\/->TransformerIterator","buffer","completed","xf","sourceIter","multi","G__11005","G__11006","G__11007","G__11008","G__11009","cljs.core\/transformer-iterator","iterator","G__11013","source","sources","G__11019","cljs.core\/sequence","seq11016","G__11017","G__11018","cljs.core.map.cljs$core$IFn$_invoke$arity$2","colls","cljs.core\/every?","G__11024","pred","cljs.core\/not-every?","cljs.core\/some","G__11028","cljs.core\/not-any?","cljs.core\/even?","cljs.core\/odd?","cljs.core\/complement","cljs.core\/constantly","G__11045","cljs.core\/comp","seq11041","G__11042","G__11043","G__11044","G__11046","G__11047","G__11048","G__11049","G__11050","cljs.core.apply.cljs$core$IFn$_invoke$arity$5","G__11051","G__11052","G__11053","G__11054","G__11055","G__11056","G__11057","G__11058","G__11059","G__11060","f1","f2","f3","fs","fexpr__11061","G__11089","cljs.core\/partial","seq11084","G__11085","G__11086","G__11087","G__11088","arg1","arg2","arg3","G__11116","cljs.core\/fnil","G__11117","G__11118","G__11119","G__11120","G__11121","G__11122","ds","G__11123","G__11124","G__11125","G__11126","G__11127","G__11128","G__11129","G__11130","G__11131","G__11132","G__11153","cljs.core\/map-indexed","cljs.core\/volatile!","rf","result","G__11154","G__11155","G__11156","G__11157","input","G__11162","G__11163","mapi","G__11164","G__11165","G__11172","cljs.core\/keep","G__11173","cljs.core.keep.cljs$core$IFn$_invoke$arity$2","G__11174","cljs.core\/Atom","cljs.core\/->Atom","state","validator","watches","i__11184","count__11183","chunk__11182","vec__11185","seq__11181","vec__11188","G__11206","cljs.core\/atom","p__11207","map__11208","cljs.core\/hash-map","seq11204","G__11205","cljs.core\/reset!","validate","old-value","cljs.core\/reset-vals!","G__11220","cljs.core\/swap!","seq11215","G__11216","G__11217","G__11218","G__11219","G__11221","cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$2","G__11222","G__11223","cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$3","G__11224","G__11225","G__11226","cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$4","cljs.core._swap_BANG_.cljs$core$IFn$_invoke$arity$5","G__11237","cljs.core\/swap-vals!","seq11232","G__11233","G__11234","G__11235","G__11236","G__11238","G__11239","G__11240","G__11241","G__11242","G__11243","cljs.core\/compare-and-set!","cljs.core\/set-validator!","G__11249","iref","cljs.core\/get-validator","cljs.core\/Volatile","cljs.core\/->Volatile","new-state","cljs.core\/volatile?","cljs.core\/vreset!","vol","G__11251","cljs.core\/keep-indexed","ia","G__11256","G__11257","keepi","G__11258","G__11259","G__11277","cljs.core\/every-pred","seq11273","G__11274","G__11275","G__11276","cljs$core$ep1.cljs$core$IFn$_invoke$arity$3","p1","p2","cljs$core$ep2.cljs$core$IFn$_invoke$arity$3","p1__11266#","p3","cljs$core$ep3.cljs$core$IFn$_invoke$arity$3","p1__11267#","ps","p1__11268#","p1__11269#","p1__11270#","cljs$core$epn.cljs$core$IFn$_invoke$arity$3","p1__11271#","G__11313","cljs.core\/some-fn","seq11309","G__11310","G__11311","G__11312","cljs$core$sp1.cljs$core$IFn$_invoke$arity$3","cljs$core$sp2.cljs$core$IFn$_invoke$arity$3","p1__11302#","cljs$core$sp3.cljs$core$IFn$_invoke$arity$3","p1__11303#","p1__11304#","p1__11305#","p1__11306#","cljs$core$spn.cljs$core$IFn$_invoke$arity$3","p1__11307#","G__11345","cljs.core\/map","seq11340","G__11341","G__11342","G__11343","G__11344","G__11346","G__11347","G__11348","G__11349","inputs","G__11350","G__11351","c1","c2","s1","s2","G__11352","G__11353","cljs.core.map.cljs$core$IFn$_invoke$arity$3","c3","s3","G__11354","G__11355","G__11356","cljs.core.map.cljs$core$IFn$_invoke$arity$4","cs","ss","step","p1__11338#","cljs.core.conj.cljs$core$IFn$_invoke$arity$variadic","G__11371","cljs.core\/take","na","nn","cljs.core.take.cljs$core$IFn$_invoke$arity$2","G__11375","cljs.core\/drop","G__11381","cljs.core\/drop-last","cljs.core.drop_last.cljs$core$IFn$_invoke$arity$2","cljs.core.drop.cljs$core$IFn$_invoke$arity$2","cljs.core\/take-last","lead","G__11386","cljs.core\/drop-while","da","drop?","G__11388","cljs.core\/Cycle","cljs.core\/->Cycle","all","prev","current","G__11393","G__11394","G__11395","G__11396","cljs.core\/cycle","cljs.core\/split-at","cljs.core\/Repeat","cljs.core\/->Repeat","next","G__11412","cljs.core\/repeat","cljs.core\/replicate","cljs.core.repeat.cljs$core$IFn$_invoke$arity$1","G__11415","cljs.core\/repeatedly","cljs.core.repeatedly.cljs$core$IFn$_invoke$arity$1","cljs.core\/UNREALIZED-SEED","cljs.core\/Iterate","cljs.core\/->Iterate","prev-seed","cljs.core\/iterate","G__11425","cljs.core\/interleave","seq11422","G__11423","G__11424","cljs.core.interleave.cljs$core$IFn$_invoke$arity$2","G__11431","cljs.core\/interpose","started","sep","sepr","cljs.core\/flatten1","G__11437","cljs.core\/mapcat","seq11435","G__11436","cljs.core.comp.cljs$core$IFn$_invoke$arity$2","cljs.core.map.cljs$core$IFn$_invoke$arity$1","cljs.core\/cat","G__11443","cljs.core\/filter","G__11444","cljs.core.filter.cljs$core$IFn$_invoke$arity$2","G__11451","cljs.core\/remove","cljs.core.filter.cljs$core$IFn$_invoke$arity$1","cljs.core\/tree-seq","node","branch?","cljs.core.mapcat.cljs$core$IFn$_invoke$arity$variadic","walk","children","root","cljs.core\/flatten","p1__11453#","G__11455","cljs.core\/into","G__11465","cljs.core\/mapv","seq11460","G__11461","G__11462","G__11463","G__11464","cljs.core.conj_BANG_.cljs$core$IFn$_invoke$arity$2","cljs.core.into.cljs$core$IFn$_invoke$arity$2","cljs.core\/filterv","G__11471","cljs.core\/partition","cljs.core.partition.cljs$core$IFn$_invoke$arity$3","cljs.core.partition.cljs$core$IFn$_invoke$arity$4","pad","G__11474","cljs.core\/get-in","sentinel","p__11479","vec__11480","seq__11481","first__11482","cljs.core\/assoc-in","G__11483","G__11484","G__11485","G__11494","cljs.core\/update-in","p__11495","vec__11496","seq__11497","first__11498","p__11500","vec__11501","seq__11502","first__11503","p__11506","vec__11507","seq__11508","first__11509","p__11513","vec__11514","seq__11515","first__11516","p__11521","vec__11522","seq__11523","first__11524","seq11487","G__11488","G__11489","G__11490","G__11491","G__11492","G__11493","cljs.core.update_in.cljs$core$IFn$_invoke$arity$3","G__11499","cljs.core.update_in.cljs$core$IFn$_invoke$arity$4","G__11504","G__11505","cljs.core.update_in.cljs$core$IFn$_invoke$arity$5","G__11510","G__11511","G__11512","cljs.core.update_in.cljs$core$IFn$_invoke$arity$6","G__11517","G__11518","G__11519","G__11520","G__11537","cljs.core\/update","seq11530","G__11531","G__11532","G__11533","G__11534","G__11535","G__11536","G__11538","G__11539","G__11540","G__11541","G__11542","G__11543","G__11544","G__11545","G__11546","G__11547","cljs.core\/VectorNode","cljs.core\/->VectorNode","edit","cljs.core\/pv-fresh-node","cljs.core\/pv-aget","cljs.core\/pv-aset","cljs.core\/pv-clone-node","cljs.core\/tail-off","pv","cljs.core\/new-path","level","ll","embed","cljs.core\/push-tail","parent","subidx","tailnode","child","G__11554","G__11555","G__11556","G__11557","node-to-insert","cljs.core\/vector-index-out-of-bounds","cljs.core\/first-array-for-longvec","cljs.core\/unchecked-array-for","cljs.core\/array-for","cljs.core\/do-assoc","G__11562","G__11563","G__11564","G__11565","G__11566","cljs.core\/pop-tail","G__11567","G__11568","G__11569","new-child","cljs.core\/RangedIterator","cljs.core\/->RangedIterator","base","cljs.core\/ranged-iterator","G__11571","cljs.core\/pv-reduce","cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$5","G__11572","G__11573","cljs.core\/APersistentVector","args11578","cljs.core\/PersistentVector","cljs.core\/->PersistentVector","shift","tail","nr","new-root","cnt-1","new-tail","root-overflow?","n-r","new-shift","me-iter","you-iter","cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$4","cljs.core.pv_reduce.cljs$core$IFn$_invoke$arity$4","G__11582","G__11583","G__11579","G__11580","G__11581","cljs.core\/TransientVector","cljs.core\/tv-editable-root","cljs.core\/tv-editable-tail","no-clone","out","G__11600","G__11601","G__11602","cljs.core\/map-entry?","cljs.core\/vector","seq11606","cljs.core\/ChunkedSeq","cljs.core\/->ChunkedSeq","vec","cljs.core.chunked_seq.cljs$core$IFn$_invoke$arity$5","cljs.core.array_chunk.cljs$core$IFn$_invoke$arity$2","G__11612","G__11613","G__11614","G__11619","cljs.core\/chunked-seq","args11621","cljs.core\/Subvec","cljs.core\/->Subvec","cljs.core\/build-subvec","subvec-seq","v-pos","cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$2","cljs.core.ci_reduce.cljs$core$IFn$_invoke$arity$3","G__11622","G__11623","G__11624","G__11634","G__11635","G__11636","G__11647","cljs.core\/subvec","cljs.core.subvec.cljs$core$IFn$_invoke$arity$3","cljs.core\/tv-ensure-editable","tl","cljs.core\/tv-push-tail","tv","tail-node","G__11651","G__11652","G__11653","G__11654","cljs.core\/tv-pop-tail","G__11655","G__11656","G__11657","cljs.core\/unchecked-editable-array-for","args11660","cljs.core\/->TransientVector","new-root-array","trimmed-tail","fexpr__11661","go","cljs.core\/PersistentQueueIter","cljs.core\/->PersistentQueueIter","fseq","riter","cljs.core\/PersistentQueueSeq","cljs.core\/->PersistentQueueSeq","front","rear","G__11665","G__11666","G__11667","cljs.core\/PersistentQueue","cljs.core\/->PersistentQueue","G__11673","G__11674","G__11675","cljs.core\/NeverEquiv","cljs.core\/->NeverEquiv","cljs.core\/never-equiv","cljs.core\/equiv-map","xkv","cljs.core\/scan-array","incr","cljs.core\/obj-map-compare-keys","cljs.core\/obj-map->hash-map","cljs.core\/PersistentHashMap","cljs.core.assoc_BANG_.cljs$core$IFn$_invoke$arity$3","goog.object\/get","so","mm","cljs.core\/obj-clone","G__11685","G__11686","G__11687","new-obj","args11695","cljs.core\/ObjMap","cljs.core\/->ObjMap","keys","strobj","update-count","p1__11694#","new-strobj","new-keys","G__11696","G__11697","G__11698","cljs.core\/RecordIter","cljs.core\/->RecordIter","record","base-count","fields","ext-map-iter","cljs.core\/ES6EntriesIterator","cljs.core\/->ES6EntriesIterator","vec__11704","cljs.core\/es6-entries-iterator","cljs.core\/ES6SetEntriesIterator","cljs.core\/->ES6SetEntriesIterator","cljs.core\/es6-set-entries-iterator","cljs.core\/array-index-of-nil?","cljs.core\/array-index-of-keyword?","kstr","cljs.core\/array-index-of-symbol?","cljs.core\/array-index-of-identical?","cljs.core\/array-index-of-equiv?","cljs.core\/array-index-of","cljs.core\/array-map-index-of","cljs.core\/array-extend-kv","narr","cljs.core\/array-map-extend-kv","args11714","cljs.core\/->MapEntry","G__11715","cljs.core\/PersistentArrayMapSeq","cljs.core\/->PersistentArrayMapSeq","G__11723","G__11724","G__11725","cljs.core\/persistent-array-map-seq","cljs.core\/PersistentArrayMapIterator","cljs.core\/->PersistentArrayMapIterator","args11729","cljs.core\/->PersistentArrayMap","cljs.core\/keys","cljs.core\/vals","i__11733","count__11732","chunk__11731","vec__11734","seq__11730","vec__11737","es","alen","G__11745","new-len","G__11740","G__11741","G__11742","cljs.core\/TransientArrayMap","no-check","G__11773","G__11780","G__11787","G__11788","G__11789","args11793","cljs.core\/->TransientArrayMap","editable?","cljs.core\/array->transient-hash-map","G__11794","cljs.core\/Box","cljs.core\/->Box","cljs.core\/key-test","cljs.core\/mask","G__11802","cljs.core\/clone-and-set","G__11803","G__11804","cljs.core\/remove-pair","cljs.core\/bitmap-indexed-node-index","bitmap","bit","cljs.core\/bitpos","G__11807","cljs.core\/edit-and-set","inode","editable","cljs.core\/inode-kv-reduce","G__11809","G__11810","G__11811","cljs.core\/NodeIterator","cljs.core\/->NodeIterator","next-entry","next-iter","node-or-val","new-iter","found","cljs.core\/BitmapIndexedNode","cljs.core\/->BitmapIndexedNode","nodes","jdx","added-leaf?","cljs.core\/ArrayNode","key-or-nil","val-or-node","cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$3","cljs.core.clone_and_set.cljs$core$IFn$_invoke$arity$5","cljs.core.create_node.cljs$core$IFn$_invoke$arity$6","cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$1","earr","cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$4","cljs.core.edit_and_set.cljs$core$IFn$_invoke$arity$6","cljs.core.create_node.cljs$core$IFn$_invoke$arity$7","removed-leaf?","cljs.core\/pack-array-node","array-node","cljs.core\/ArrayNodeIterator","cljs.core\/->ArrayNodeIterator","cljs.core\/->ArrayNode","cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$1","cljs.core\/hash-collision-node-find-index","lim","cljs.core\/HashCollisionNode","cljs.core\/->HashCollisionNode","collision-hash","G__11838","cljs.core\/create-node","key1","key1hash","key2hash","val1","key2","val2","cljs.core\/NodeSeq","cljs.core\/->NodeSeq","cljs.core.create_inode_seq.cljs$core$IFn$_invoke$arity$3","G__11842","G__11843","G__11844","G__11849","cljs.core\/create-inode-seq","node-seq","cljs.core\/ArrayNodeSeq","cljs.core\/->ArrayNodeSeq","cljs.core.create_array_node_seq.cljs$core$IFn$_invoke$arity$4","G__11855","G__11856","G__11857","G__11862","cljs.core\/create-array-node-seq","nj","cljs.core\/HashMapIter","cljs.core\/->HashMapIter","nil-val","root-iter","seen","args11866","cljs.core\/->PersistentHashMap","has-nil?","i__11870","count__11869","chunk__11868","vec__11871","seq__11867","vec__11874","cljs.core\/TransientHashMap","vs","cljs.core.not_EQ_.cljs$core$IFn$_invoke$arity$2","G__11900","G__11901","G__11902","args11906","cljs.core\/->TransientHashMap","cljs.core\/tree-map-seq-push","stack","cljs.core\/PersistentTreeMapSeq","cljs.core\/->PersistentTreeMapSeq","next-stack","G__11914","G__11915","G__11916","cljs.core\/create-tree-map-seq","tree","cljs.core\/balance-left","cljs.core\/RedNode","ins","cljs.core\/BlackNode","right","cljs.core\/balance-right","left","cljs.core\/balance-left-del","del","cljs.core\/balance-right-del","cljs.core\/tree-map-kv-reduce","G__11920","G__11921","G__11922","G__11923","G__11924","G__11925","G__11926","G__11927","G__11928","args11929","cljs.core\/->BlackNode","G__11930","G__11935","G__11936","G__11937","args11941","cljs.core\/->RedNode","G__11942","G__11947","G__11948","G__11949","cljs.core\/tree-map-add","G__11953","G__11954","G__11955","G__11956","G__11957","G__11958","G__11959","G__11960","G__11961","G__11962","G__11963","G__11964","cljs.core\/tree-map-append","G__11965","G__11966","app","G__11967","G__11968","G__11969","G__11970","G__11971","G__11972","cljs.core\/tree-map-remove","G__11973","G__11974","G__11975","G__11976","G__11977","G__11978","G__11979","G__11980","G__11981","G__11982","cljs.core\/tree-map-replace","tk","G__11983","G__11984","G__11985","G__11986","G__11987","G__11988","G__11989","G__11990","args11991","cljs.core\/PersistentTreeMap","cljs.core\/->PersistentTreeMap","i__11995","count__11994","chunk__11993","vec__11996","seq__11992","vec__11999","G__12002","G__12003","found-node","G__12004","G__12005","G__12031","G__12032","G__12033","seq12037","cljs.core\/array-map","seq12043","cljs.core\/obj-map","seq12047","G__12050","G__12051","G__12052","cljs.core\/sorted-map","seq12060","cljs.core\/sorted-map-by","seq12066","G__12067","comparator","cljs.core\/KeySeq","cljs.core\/->KeySeq","mseq","me","nseq","G__12077","G__12078","G__12079","hash-map","map-entry","cljs.core\/ValSeq","cljs.core\/->ValSeq","G__12087","G__12088","G__12089","cljs.core\/merge","seq12095","maps","cljs.core.reduce.cljs$core$IFn$_invoke$arity$2","p2__12094#","p1__12093#","cljs.core\/merge-with","seq12099","G__12100","G__12101","G__12102","merge-entry","m1","m2","merge2","cljs.core\/select-keys","keyseq","map","cljs.core\/HashSetIter","cljs.core\/->HashSetIter","args12110","cljs.core\/PersistentHashSet","cljs.core\/->PersistentHashSet","i__12114","count__12113","chunk__12112","vec__12115","seq__12111","vec__12118","e12123","p2__12108#","cljs.core\/TransientHashSet","items","G__12147","G__12148","G__12149","args12153","cljs.core\/->TransientHashSet","transient-map","cljs.core.dissoc_BANG_.cljs$core$IFn$_invoke$arity$2","args12157","cljs.core\/PersistentTreeSet","cljs.core\/->PersistentTreeSet","tree-map","i__12161","count__12160","chunk__12159","vec__12162","seq__12158","vec__12165","e12170","p2__12155#","G__12184","G__12185","G__12186","cljs.core\/set-from-indexed-seq","iseq","a__8762__auto__","l__8763__auto__","cljs.core\/set","G__12196","cljs.core\/hash-set","seq12195","cljs.core\/sorted-set","seq12201","cljs.core\/sorted-set-by","seq12205","G__12206","G__12213","cljs.core\/replace","p1__12210#","smap","p1__12211#","G__12216","cljs.core\/distinct","fexpr__12221","p__12222","vec__12223","cljs.core\/butlast","cljs.core\/zipmap","G__12243","cljs.core\/max-key","seq12239","G__12240","G__12241","G__12242","p1__12236#","p2__12237#","cljs.core.max_key.cljs$core$IFn$_invoke$arity$3","G__12255","cljs.core\/min-key","seq12251","G__12252","G__12253","G__12254","p1__12248#","p2__12249#","cljs.core.min_key.cljs$core$IFn$_invoke$arity$3","cljs.core\/ArrayList","cljs.core\/->ArrayList","cljs.core\/array-list","G__12261","cljs.core\/partition-all","cljs.core.partition_all.cljs$core$IFn$_invoke$arity$3","G__12265","cljs.core\/take-while","G__12266","cljs.core.take_while.cljs$core$IFn$_invoke$arity$2","cljs.core\/mk-bound-fn","sc","G__12269","G__12270","test","G__12271","G__12272","G__12274","cljs.core\/subseq","fexpr__12275","vec__12276","include","vec__12279","start-key","end-test","end-key","fexpr__12282","start-test","G__12285","cljs.core\/rsubseq","fexpr__12286","vec__12287","vec__12290","fexpr__12293","cljs.core\/RangeIterator","cljs.core\/->RangeIterator","cljs.core\/Range","cljs.core\/->Range","rng","G__12295","G__12300","G__12301","G__12302","G__12307","cljs.core\/range","cljs.core.range.cljs$core$IFn$_invoke$arity$3","js\/Number","G__12310","cljs.core\/take-nth","cljs.core.take_nth.cljs$core$IFn$_invoke$arity$2","cljs.core\/split-with","cljs.core.drop_while.cljs$core$IFn$_invoke$arity$2","G__12315","cljs.core\/partition-by","pa","pval","fst","fv","p1__12313#","run","cljs.core.partition_by.cljs$core$IFn$_invoke$arity$2","cljs.core\/frequencies","counts","G__12319","cljs.core\/reductions","cljs.core.reductions.cljs$core$IFn$_invoke$arity$3","G__12320","G__12321","G__12338","cljs.core\/juxt","seq12334","G__12335","G__12336","G__12337","p1__12323#","p2__12324#","p1__12325#","p2__12326#","p1__12327#","p2__12328#","p1__12329#","p2__12330#","p1__12331#","p2__12332#","G__12368","cljs.core\/dorun","G__12374","cljs.core\/doall","cljs.core.dorun.cljs$core$IFn$_invoke$arity$1","cljs.core.dorun.cljs$core$IFn$_invoke$arity$2","cljs.core\/regexp?","js\/RegExp","cljs.core\/re-matches","re","matches","js\/TypeError","cljs.core\/re-find","cljs.core\/re-seq","match-data","match-idx","match-str","cljs.core.subs.cljs$core$IFn$_invoke$arity$2","post-idx","post-match","cljs.core\/re-pattern","vec__12376","prefix","pattern","flags","cljs.core\/pr-sequential-writer","*print-level*-temp-val__12380","*print-level*-orig-val__12379","begin","G__12381","G__12382","G__12383","print-one","G__12384","G__12385","G__12386","cljs.core\/write-all","seq12397","G__12398","i__12402","count__12401","chunk__12400","seq__12399","cljs.core\/string-print","cljs.core\/flush","cljs.core\/char-escapes","obj12419","cljs.core\/quote-string","match","cljs.core\/print-meta?","cljs.core\/pr-writer-impl","cljs.core\/pr-writer","cljs.core\/print-map","G__12424","cljs.core.keyword.cljs$core$IFn$_invoke$arity$1","goog.string\/isEmpty","cljs.core.write_all.cljs$core$IFn$_invoke$arity$variadic","normalize","G__12425","G__12426","G__12428","G__12429","G__12430","alt-impl","cljs.core\/pr-seq-writer","objs","i__12434","count__12433","chunk__12432","seq__12431","cljs.core\/pr-sb-with-opts","cljs.core\/pr-str-with-opts","cljs.core\/prn-str-with-opts","cljs.core\/pr-with-opts","G__12448","cljs.core\/newline","cljs.core.newline.cljs$core$IFn$_invoke$arity$1","cljs.core\/pr-str","seq12450","cljs.core\/prn-str","seq12454","cljs.core\/pr","seq12458","cljs.core\/print","cljs.core\/print-str","seq12464","cljs.core\/println","seq12468","cljs.core\/println-str","seq12472","cljs.core\/prn","seq12476","cljs.core\/strip-ns","named","cljs.core.keyword.cljs$core$IFn$_invoke$arity$2","cljs.core\/lift-ns","G__12486","vec__12487","seq__12488","first__12489","vec__12490","vec__12493","seq__12494","first__12495","vec__12496","lm","entries","new-ns","cljs.core\/print-prefix-map","G__12505","G__12506","G__12507","w","G__12508","G__12509","G__12510","vec__12514","lift-map","cljs.core.compare_indexed.cljs$core$IFn$_invoke$arity$2","cljs.core\/alter-meta!","seq12517","G__12518","G__12519","cljs.core\/reset-meta!","cljs.core\/add-watch","cljs.core\/remove-watch","cljs.core\/gensym_counter","G__12524","cljs.core\/gensym","cljs.core.gensym.cljs$core$IFn$_invoke$arity$1","cljs.core.atom.cljs$core$IFn$_invoke$arity$1","cljs.core.symbol.cljs$core$IFn$_invoke$arity$1","prefix-string","cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2","cljs.core\/Delay","cljs.core\/->Delay","cljs.core\/delay?","cljs.core\/force","cljs.core\/realized?","cljs.core\/preserving-reduced","p1__12526#","p2__12527#","rf1","G__12530","cljs.core\/halt-when","cljs.core.halt_when.cljs$core$IFn$_invoke$arity$2","retf","G__12531","G__12532","G__12536","cljs.core\/dedupe","prior","cljs.core.sequence.cljs$core$IFn$_invoke$arity$2","cljs.core.dedupe.cljs$core$IFn$_invoke$arity$0","G__12540","cljs.core\/random-sample","cljs.core.rand.cljs$core$IFn$_invoke$arity$0","prob","cljs.core\/Eduction","cljs.core\/->Eduction","cljs.core.transduce.cljs$core$IFn$_invoke$arity$3","cljs.core.completing.cljs$core$IFn$_invoke$arity$1","G__12544","G__12545","G__12546","cljs.core\/eduction","seq12550","xforms","cljs.core\/run!","p2__12554#","proc","cljs.core\/IEncodeJS","cljs.core\/-clj->js","cljs.core\/-key->js","G__12557","cljs.core\/key->js","cljs.core.key__GT_js.cljs$core$IFn$_invoke$arity$2","cljs.core\/clj->js","primitive-fn","cljs.core.pr_str.cljs$core$IFn$_invoke$arity$variadic","p__12562","map__12563","seq12560","G__12561","thisfn","keyword-fn","i__12594","count__12593","chunk__12592","vec__12595","seq__12591","vec__12601","G__12598","G__12599","G__12600","G__12604","G__12605","G__12606","i__12610","count__12609","chunk__12608","seq__12607","cljs.core\/IEncodeClojure","cljs.core\/-js->clj","options","G__12671","cljs.core\/js->clj","seq12669","G__12670","cljs.core.js__GT_clj.cljs$core$IFn$_invoke$arity$variadic","map__12672","keywordize-keys","cljs.core.doall.cljs$core$IFn$_invoke$arity$1","cljs.core.into.cljs$core$IFn$_invoke$arity$3","p1__12666#","p2__12667#","cljs.core\/memoize","mem","cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$4","G__12685","cljs.core\/trampoline","seq12683","G__12684","cljs.core.trampoline.cljs$core$IFn$_invoke$arity$1","G__12692","cljs.core\/rand","cljs.core.rand.cljs$core$IFn$_invoke$arity$1","Math\/random","cljs.core\/rand-int","G__12694","cljs.core\/rand-nth","cljs.core\/group-by","cljs.core\/make-hierarchy","cljs.core\/-global-hierarchy","cljs.core\/get-global-hierarchy","cljs.core\/swap-global-hierarchy!","seq12695","G__12696","G__12701","cljs.core\/isa?","cljs.core.isa_QMARK_.cljs$core$IFn$_invoke$arity$3","fexpr__12704","G__12709","cljs.core\/parents","cljs.core.parents.cljs$core$IFn$_invoke$arity$2","tag","G__12712","cljs.core\/ancestors","cljs.core.ancestors.cljs$core$IFn$_invoke$arity$2","G__12715","cljs.core\/descendants","cljs.core.descendants.cljs$core$IFn$_invoke$arity$2","G__12718","cljs.core\/derive","cljs.core.swap_global_hierarchy_BANG_.cljs$core$IFn$_invoke$arity$variadic","targets","target","tp","ta","tf","td","G__12724","cljs.core\/underive","parentMap","childsParents","p1__12720#","cljs.core.interpose.cljs$core$IFn$_invoke$arity$2","newParents","p1__12721#","p2__12722#","cljs.core.partition.cljs$core$IFn$_invoke$arity$2","deriv-seq","cljs.core\/reset-cache","method-cache","method-table","cached-hierarchy","hierarchy","cljs.core\/prefers*","fexpr__12726","prefer-table","xprefs","cljs.core.parents.cljs$core$IFn$_invoke$arity$1","G__12730","G__12731","G__12732","G__12736","G__12737","G__12738","cljs.core\/dominates","cljs.core\/find-and-cache-best-method","p__12741","vec__12742","dispatch-val","be","be2","best-entry","fexpr__12746","default-dispatch-val","cljs.core\/IMultiFn","cljs.core\/-reset","mf","cljs.core\/-add-method","method","cljs.core\/-remove-method","cljs.core\/-prefer-method","dispatch-val-y","cljs.core\/-get-method","cljs.core\/-methods","cljs.core\/-prefers","cljs.core\/-default-dispatch-val","cljs.core\/-dispatch-fn","cljs.core\/throw-no-method-error","args12747","cljs.core\/MultiFn","cljs.core\/->MultiFn","dispatch-fn","target-fn","cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$3","fexpr__12748","dispatch-val-x","old","cljs.core\/remove-all-methods","multifn","cljs.core\/remove-method","cljs.core\/prefer-method","cljs.core\/methods","cljs.core\/get-method","cljs.core\/prefers","cljs.core\/default-dispatch-val","cljs.core\/dispatch-fn","cljs.core\/IUUID","cljs.core\/UUID","cljs.core\/->UUID","uuid","G__12750","G__12751","cljs.core\/uuid","cljs.core\/random-uuid","hex","rhex","cljs.core\/uuid?","cljs.core\/pr-writer-ex-info","cljs.core\/ExceptionInfo","message","data","cause","js\/Error.prototype","G__12754","cljs.core\/ex-info","cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3","msg","cljs.core\/ex-data","ex","cljs.core\/ex-message","cljs.core\/ex-cause","cljs.core\/comparator","cljs.core\/special-symbol?","cljs.core\/test","cljs.core\/TaggedLiteral","cljs.core\/->TaggedLiteral","form","G__12756","cljs.core\/tagged-literal?","cljs.core\/tagged-literal","cljs.core\/js-reserved-arr","cljs.core\/js-reserved","cljs.core\/js-reserved?","p1__12758#","p2__12759#","cljs.core\/demunge-pattern","G__12760","cljs.core\/munge-str","sub","cljs.core\/munge","name'","cljs.core\/demunge-str","goog.string\/endsWith","munged-name","vec__12767","last-match-end","cljs.core\/demunge","fexpr__12772","G__12773","js\/cljs.core.tapset","cljs.core\/tapset","cljs.core\/maybe-init-tapset","cljs.core\/add-tap","cljs.core\/remove-tap","cljs.core\/tap>","i__12777","count__12776","chunk__12775","seq__12774","e12778","e12779","tap","cljs.core\/ns-lookup","ns-obj","cljs.core\/Namespace","cljs.core\/->Namespace","goog.object\/containsKey","var-sym","var-meta","cljs.core\/NS_CACHE","cljs.core\/find-ns-obj*","ctxt","G__12808","G__12809","cljs.core\/find-ns-obj","munged-ns","G__12812","e12813","js\/eval","segs","js\/ReferenceError","goog\/global","cljs.core\/ns-interns*","G__12816","cljs.core\/create-ns","cljs.core.create_ns.cljs$core$IFn$_invoke$arity$2","cljs.core\/find-ns","the-ns","cljs.core\/find-macros-ns","goog.string\/contains","ns-str","cljs.core\/ns-name","cljs.core\/uri?","goog\/Uri","cljs.core\/maybe-enable-print!","js\/Java","system","js\/cljs.core.*eval*","cljs.core\/*eval*","cljs.core\/eval"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/cljs/user/debug9D984AE.cljs.cache.json b/src/http/static/viz/2/cljs/user/debug9D984AE.cljs.cache.json
new file mode 100644
index 0000000..e98e6e7
--- /dev/null
+++ b/src/http/static/viz/2/cljs/user/debug9D984AE.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:defs",["^ "],"~:cljs.spec/registry-ref",[],"~:cljs.spec/speced-vars",[]] \ No newline at end of file
diff --git a/src/http/static/viz/2/cljs/user/debug9D984AE.js b/src/http/static/viz/2/cljs/user/debug9D984AE.js
new file mode 100644
index 0000000..6e5f3f2
--- /dev/null
+++ b/src/http/static/viz/2/cljs/user/debug9D984AE.js
@@ -0,0 +1,3 @@
+// Compiled by ClojureScript 1.10.439 {}
+
+//# sourceMappingURL=debug9D984AE.js.map
diff --git a/src/http/static/viz/2/cljs/user/debug9D984AE.js.map b/src/http/static/viz/2/cljs/user/debug9D984AE.js.map
new file mode 100644
index 0000000..029817d
--- /dev/null
+++ b/src/http/static/viz/2/cljs/user/debug9D984AE.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/cljs\/user\/debug9D984AE.js","sources":["debug.cljs"],"lineCount":3,"mappings":"","names":[]} \ No newline at end of file
diff --git a/src/http/static/viz/2/cljs_deps.js b/src/http/static/viz/2/cljs_deps.js
new file mode 100644
index 0000000..95a5ac8
--- /dev/null
+++ b/src/http/static/viz/2/cljs_deps.js
@@ -0,0 +1,19 @@
+goog.addDependency("base.js", ['goog'], []);
+goog.addDependency("../cljs/core.js", ['cljs.core'], ['goog.string', 'goog.Uri', 'goog.object', 'goog.math.Integer', 'goog.string.StringBuffer', 'goog.array', 'goog.math.Long']);
+goog.addDependency("../process/env.js", ['process.env'], ['cljs.core']);
+goog.addDependency("../viz/grid.js", ['viz.grid'], ['cljs.core']);
+goog.addDependency("../viz/forest.js", ['viz.forest'], ['cljs.core', 'viz.grid']);
+goog.addDependency("../processing.js", ['org.processingjs.Processing'], [], {'foreign-lib': true});
+goog.addDependency("../quil/middlewares/deprecated_options.js", ['quil.middlewares.deprecated_options'], ['cljs.core']);
+goog.addDependency("../clojure/string.js", ['clojure.string'], ['goog.string', 'cljs.core', 'goog.string.StringBuffer']);
+goog.addDependency("../quil/util.js", ['quil.util'], ['cljs.core', 'clojure.string']);
+goog.addDependency("../quil/sketch.js", ['quil.sketch'], ['goog.dom', 'cljs.core', 'quil.middlewares.deprecated_options', 'goog.events.EventType', 'goog.events', 'quil.util']);
+goog.addDependency("../quil/core.js", ['quil.core'], ['org.processingjs.Processing', 'quil.sketch', 'cljs.core', 'clojure.string', 'quil.util']);
+goog.addDependency("../quil/middlewares/navigation_3d.js", ['quil.middlewares.navigation_3d'], ['cljs.core', 'quil.core']);
+goog.addDependency("../quil/middlewares/navigation_2d.js", ['quil.middlewares.navigation_2d'], ['cljs.core', 'quil.core']);
+goog.addDependency("../quil/middlewares/fun_mode.js", ['quil.middlewares.fun_mode'], ['cljs.core', 'quil.core']);
+goog.addDependency("../quil/middleware.js", ['quil.middleware'], ['cljs.core', 'quil.middlewares.navigation_3d', 'quil.middlewares.navigation_2d', 'quil.middlewares.fun_mode']);
+goog.addDependency("../clojure/set.js", ['clojure.set'], ['cljs.core']);
+goog.addDependency("../viz/ghost.js", ['viz.ghost'], ['cljs.core', 'viz.forest', 'clojure.set', 'quil.core', 'quil.middleware', 'viz.grid']);
+goog.addDependency("../viz/dial.js", ['viz.dial'], ['cljs.core', 'quil.core']);
+goog.addDependency("../viz/core.js", ['viz.core'], ['goog.string', 'cljs.core', 'viz.forest', 'quil.core', 'quil.middleware', 'goog.string.format', 'viz.ghost', 'viz.grid', 'viz.dial']);
diff --git a/src/http/static/viz/2/cljsc_opts.edn b/src/http/static/viz/2/cljsc_opts.edn
new file mode 100644
index 0000000..9ab2cfa
--- /dev/null
+++ b/src/http/static/viz/2/cljsc_opts.edn
@@ -0,0 +1 @@
+{:output-wrapper false, :externs ["closure-js/externs"], :libs ["closure-js/libs"], :output-to "js/main.js", :output-dir "out", :main "viz.core", :preamble ["processing.min.js"], :optimizations :none, :pretty-print false} \ No newline at end of file
diff --git a/src/http/static/viz/2/clojure/set.cljs b/src/http/static/viz/2/clojure/set.cljs
new file mode 100644
index 0000000..b9ba41f
--- /dev/null
+++ b/src/http/static/viz/2/clojure/set.cljs
@@ -0,0 +1,161 @@
+; Copyright (c) Rich Hickey. All rights reserved.
+; The use and distribution terms for this software are covered by the
+; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
+; which can be found in the file epl-v10.html at the root of this distribution.
+; By using this software in any fashion, you are agreeing to be bound by
+; the terms of this license.
+; You must not remove this notice, or any other, from this software.
+
+(ns ^{:doc "Set operations such as union/intersection."
+ :author "Rich Hickey"}
+ clojure.set)
+
+(defn- bubble-max-key [k coll]
+ "Move a maximal element of coll according to fn k (which returns a number)
+ to the front of coll."
+ (let [max (apply max-key k coll)]
+ (cons max (remove #(identical? max %) coll))))
+
+(defn union
+ "Return a set that is the union of the input sets"
+ ([] #{})
+ ([s1] s1)
+ ([s1 s2]
+ (if (< (count s1) (count s2))
+ (reduce conj s2 s1)
+ (reduce conj s1 s2)))
+ ([s1 s2 & sets]
+ (let [bubbled-sets (bubble-max-key count (conj sets s2 s1))]
+ (reduce into (first bubbled-sets) (rest bubbled-sets)))))
+
+(defn intersection
+ "Return a set that is the intersection of the input sets"
+ ([s1] s1)
+ ([s1 s2]
+ (if (< (count s2) (count s1))
+ (recur s2 s1)
+ (reduce (fn [result item]
+ (if (contains? s2 item)
+ result
+ (disj result item)))
+ s1 s1)))
+ ([s1 s2 & sets]
+ (let [bubbled-sets (bubble-max-key #(- (count %)) (conj sets s2 s1))]
+ (reduce intersection (first bubbled-sets) (rest bubbled-sets)))))
+
+(defn difference
+ "Return a set that is the first set without elements of the remaining sets"
+ ([s1] s1)
+ ([s1 s2]
+ (if (< (count s1) (count s2))
+ (reduce (fn [result item]
+ (if (contains? s2 item)
+ (disj result item)
+ result))
+ s1 s1)
+ (reduce disj s1 s2)))
+ ([s1 s2 & sets]
+ (reduce difference s1 (conj sets s2))))
+
+
+(defn select
+ "Returns a set of the elements for which pred is true"
+ [pred xset]
+ (reduce (fn [s k] (if (pred k) s (disj s k)))
+ xset xset))
+
+(defn project
+ "Returns a rel of the elements of xrel with only the keys in ks"
+ [xrel ks]
+ (set (map #(select-keys % ks) xrel)))
+
+(defn rename-keys
+ "Returns the map with the keys in kmap renamed to the vals in kmap"
+ [map kmap]
+ (reduce
+ (fn [m [old new]]
+ (if (contains? map old)
+ (assoc m new (get map old))
+ m))
+ (apply dissoc map (keys kmap)) kmap))
+
+(defn rename
+ "Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap"
+ [xrel kmap]
+ (set (map #(rename-keys % kmap) xrel)))
+
+(defn index
+ "Returns a map of the distinct values of ks in the xrel mapped to a
+ set of the maps in xrel with the corresponding values of ks."
+ [xrel ks]
+ (reduce
+ (fn [m x]
+ (let [ik (select-keys x ks)]
+ (assoc m ik (conj (get m ik #{}) x))))
+ {} xrel))
+
+(defn map-invert
+ "Returns the map with the vals mapped to the keys."
+ [m] (reduce (fn [m [k v]] (assoc m v k)) {} m))
+
+(defn join
+ "When passed 2 rels, returns the rel corresponding to the natural
+ join. When passed an additional keymap, joins on the corresponding
+ keys."
+ ([xrel yrel] ;natural join
+ (if (and (seq xrel) (seq yrel))
+ (let [ks (intersection (set (keys (first xrel))) (set (keys (first yrel))))
+ [r s] (if (<= (count xrel) (count yrel))
+ [xrel yrel]
+ [yrel xrel])
+ idx (index r ks)]
+ (reduce (fn [ret x]
+ (let [found (idx (select-keys x ks))]
+ (if found
+ (reduce #(conj %1 (merge %2 x)) ret found)
+ ret)))
+ #{} s))
+ #{}))
+ ([xrel yrel km] ;arbitrary key mapping
+ (let [[r s k] (if (<= (count xrel) (count yrel))
+ [xrel yrel (map-invert km)]
+ [yrel xrel km])
+ idx (index r (vals k))]
+ (reduce (fn [ret x]
+ (let [found (idx (rename-keys (select-keys x (keys k)) k))]
+ (if found
+ (reduce #(conj %1 (merge %2 x)) ret found)
+ ret)))
+ #{} s))))
+
+(defn subset?
+ "Is set1 a subset of set2?"
+ [set1 set2]
+ (and (<= (count set1) (count set2))
+ (every? #(contains? set2 %) set1)))
+
+(defn superset?
+ "Is set1 a superset of set2?"
+ [set1 set2]
+ (and (>= (count set1) (count set2))
+ (every? #(contains? set1 %) set2)))
+
+(comment
+(refer 'set)
+(def xs #{{:a 11 :b 1 :c 1 :d 4}
+ {:a 2 :b 12 :c 2 :d 6}
+ {:a 3 :b 3 :c 3 :d 8 :f 42}})
+
+(def ys #{{:a 11 :b 11 :c 11 :e 5}
+ {:a 12 :b 11 :c 12 :e 3}
+ {:a 3 :b 3 :c 3 :e 7 }})
+
+(join xs ys)
+(join xs (rename ys {:b :yb :c :yc}) {:a :a})
+
+(union #{:a :b :c} #{:c :d :e })
+(difference #{:a :b :c} #{:c :d :e})
+(intersection #{:a :b :c} #{:c :d :e})
+
+(index ys [:b]))
+
diff --git a/src/http/static/viz/2/clojure/set.cljs.cache.json b/src/http/static/viz/2/clojure/set.cljs.cache.json
new file mode 100644
index 0000000..f2332c0
--- /dev/null
+++ b/src/http/static/viz/2/clojure/set.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:externs",["^ ","~$Error",["^ "]],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$clojure.set","~:imports",null,"~:requires",null,"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$union",["^ ","~:protocol-inline",null,"~:meta",["^ ","~:file","/home/mediocregopher/src/viz/out/clojure/set.cljs","~:line",19,"~:column",7,"~:end-line",19,"~:end-column",12,"~:arglists",["~#list",["~$quote",["^G",[[],["~$s1"],["^I","~$s2"],["^I","^J","~$&","~$sets"]]]]],"~:doc","Return a set that is the union of the input sets","~:top-fn",["^ ","~:variadic?",true,"~:max-fixed-arity",2,"~:method-params",["^G",[[],["^I"],["^I","^J"]]],"^F",["^G",[[],["^I"],["^I","^J"],["^I","^J","~$&","^K"]]],"~:arglists-meta",["^G",[null,null,null,null]]]],"^7","~$clojure.set/union","^A","out/clojure/set.cljs","^E",12,"^M",["^ ","^N",true,"^O",2,"^P",["^G",[[],["^I"],["^I","^J"]]],"^F",["^G",[[],["^I"],["^I","^J"],["^I","^J","~$&","^K"]]],"^Q",["^G",[null,null,null,null]]],"^P",["^G",[[],["^I"],["^I","^J"]]],"~:protocol-impl",null,"^Q",["^G",[null,null,null,null]],"^C",1,"^N",true,"^B",19,"^D",19,"^O",2,"~:fn-var",true,"^F",["^G",[[],["^I"],["^I","^J"],["^I","^J","~$&","^K"]]],"^L","Return a set that is the union of the input sets"],"~$map-invert",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",97,"^C",7,"^D",97,"^E",17,"^F",["^G",["^H",["^G",[["~$m"]]]]],"^L","Returns the map with the vals mapped to the keys."],"^7","~$clojure.set/map-invert","^A","out/clojure/set.cljs","^E",17,"^P",["^G",[["~$m"]]],"^S",null,"^Q",["^G",[null,null]],"^C",1,"^N",false,"^B",97,"~:ret-tag","~$any","^D",97,"^O",1,"^T",true,"^F",["^G",["^H",["^G",[["~$m"]]]]],"^L","Returns the map with the vals mapped to the keys."],"~$join",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",101,"^C",7,"^D",101,"^E",11,"^F",["^G",["^H",["^G",[["~$xrel","~$yrel"],["^Z","^[","~$km"]]]]],"^L","When passed 2 rels, returns the rel corresponding to the natural\n join. When passed an additional keymap, joins on the corresponding\n keys.","^M",["^ ","^N",false,"^O",3,"^P",["^G",[["^Z","^["],["^Z","^[","^10"]]],"^F",["^G",[["^Z","^["],["^Z","^[","^10"]]],"^Q",["^G",[null,null]]]],"^7","~$clojure.set/join","^A","out/clojure/set.cljs","^E",11,"^M",["^ ","^N",false,"^O",3,"^P",["^G",[["^Z","^["],["^Z","^[","^10"]]],"^F",["^G",[["^Z","^["],["^Z","^[","^10"]]],"^Q",["^G",[null,null]]],"^P",["^G",[["^Z","^["],["^Z","^[","^10"]]],"^S",null,"^Q",["^G",[null,null]],"^C",1,"^N",false,"^B",101,"^D",101,"^O",3,"^T",true,"^F",["^G",[["^Z","^["],["^Z","^[","^10"]]],"^L","When passed 2 rels, returns the rel corresponding to the natural\n join. When passed an additional keymap, joins on the corresponding\n keys."],"~$select",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",61,"^C",7,"^D",61,"^E",13,"^F",["^G",["^H",["^G",[["~$pred","~$xset"]]]]],"^L","Returns a set of the elements for which pred is true"],"^7","~$clojure.set/select","^A","out/clojure/set.cljs","^E",13,"^P",["^G",[["^13","^14"]]],"^S",null,"^Q",["^G",[null,null]],"^C",1,"^N",false,"^B",61,"^W","^X","^D",61,"^O",2,"^T",true,"^F",["^G",["^H",["^G",[["^13","^14"]]]]],"^L","Returns a set of the elements for which pred is true"],"~$intersection",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",31,"^C",7,"^D",31,"^E",19,"^F",["^G",["^H",["^G",[["^I"],["^I","^J"],["^I","^J","~$&","^K"]]]]],"^L","Return a set that is the intersection of the input sets","^M",["^ ","^N",true,"^O",2,"^P",["^G",[["^I"],["^I","^J"]]],"^F",["^G",[["^I"],["^I","^J"],["^I","^J","~$&","^K"]]],"^Q",["^G",[null,null,null]]]],"^7","~$clojure.set/intersection","^A","out/clojure/set.cljs","^E",19,"^M",["^ ","^N",true,"^O",2,"^P",["^G",[["^I"],["^I","^J"]]],"^F",["^G",[["^I"],["^I","^J"],["^I","^J","~$&","^K"]]],"^Q",["^G",[null,null,null]]],"^P",["^G",[["^I"],["^I","^J"]]],"^S",null,"^Q",["^G",[null,null,null]],"^C",1,"^N",true,"^B",31,"^D",31,"^O",2,"^T",true,"^F",["^G",[["^I"],["^I","^J"],["^I","^J","~$&","^K"]]],"^L","Return a set that is the intersection of the input sets"],"~$superset?",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",137,"^C",7,"^D",137,"^E",16,"^F",["^G",["^H",["^G",[["~$set1","~$set2"]]]]],"^L","Is set1 a superset of set2?"],"^7","~$clojure.set/superset?","^A","out/clojure/set.cljs","^E",16,"^P",["^G",[["^19","^1:"]]],"^S",null,"^Q",["^G",[null,null]],"^C",1,"^N",false,"^B",137,"^W","~$boolean","^D",137,"^O",2,"^T",true,"^F",["^G",["^H",["^G",[["^19","^1:"]]]]],"^L","Is set1 a superset of set2?"],"~$index",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",87,"^C",7,"^D",87,"^E",12,"^F",["^G",["^H",["^G",[["^Z","~$ks"]]]]],"^L","Returns a map of the distinct values of ks in the xrel mapped to a\n set of the maps in xrel with the corresponding values of ks."],"^7","~$clojure.set/index","^A","out/clojure/set.cljs","^E",12,"^P",["^G",[["^Z","^1>"]]],"^S",null,"^Q",["^G",[null,null]],"^C",1,"^N",false,"^B",87,"^W","^X","^D",87,"^O",2,"^T",true,"^F",["^G",["^H",["^G",[["^Z","^1>"]]]]],"^L","Returns a map of the distinct values of ks in the xrel mapped to a\n set of the maps in xrel with the corresponding values of ks."],"~$bubble-max-key",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",13,"^C",8,"^D",13,"^E",22,"~:private",true,"^F",["^G",["^H",["^G",[["~$k","~$coll"]]]]]],"^1A",true,"^7","~$clojure.set/bubble-max-key","^A","out/clojure/set.cljs","^E",22,"^P",["^G",[["~$k","^1B"]]],"^S",null,"^Q",["^G",[null,null]],"^C",1,"^N",false,"^B",13,"^W","~$cljs.core/Cons","^D",13,"^O",2,"^T",true,"^F",["^G",["^H",["^G",[["~$k","^1B"]]]]]],"~$subset?",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",131,"^C",7,"^D",131,"^E",14,"^F",["^G",["^H",["^G",[["^19","^1:"]]]]],"^L","Is set1 a subset of set2?"],"^7","~$clojure.set/subset?","^A","out/clojure/set.cljs","^E",14,"^P",["^G",[["^19","^1:"]]],"^S",null,"^Q",["^G",[null,null]],"^C",1,"^N",false,"^B",131,"^W","^1<","^D",131,"^O",2,"^T",true,"^F",["^G",["^H",["^G",[["^19","^1:"]]]]],"^L","Is set1 a subset of set2?"],"~$rename",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",82,"^C",7,"^D",82,"^E",13,"^F",["^G",["^H",["^G",[["^Z","~$kmap"]]]]],"^L","Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap"],"^7","~$clojure.set/rename","^A","out/clojure/set.cljs","^E",13,"^P",["^G",[["^Z","^1H"]]],"^S",null,"^Q",["^G",[null,null]],"^C",1,"^N",false,"^B",82,"^W",["^6",["~$clj","^X","~$cljs.core/ISet","~$cljs.core/MetaFn","~$clj-nil"]],"^D",82,"^O",2,"^T",true,"^F",["^G",["^H",["^G",[["^Z","^1H"]]]]],"^L","Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap"],"~$rename-keys",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",72,"^C",7,"^D",72,"^E",18,"^F",["^G",["^H",["^G",[["~$map","^1H"]]]]],"^L","Returns the map with the keys in kmap renamed to the vals in kmap"],"^7","~$clojure.set/rename-keys","^A","out/clojure/set.cljs","^E",18,"^P",["^G",[["^1O","^1H"]]],"^S",null,"^Q",["^G",[null,null]],"^C",1,"^N",false,"^B",72,"^W","^X","^D",72,"^O",2,"^T",true,"^F",["^G",["^H",["^G",[["^1O","^1H"]]]]],"^L","Returns the map with the keys in kmap renamed to the vals in kmap"],"~$project",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",67,"^C",7,"^D",67,"^E",14,"^F",["^G",["^H",["^G",[["^Z","^1>"]]]]],"^L","Returns a rel of the elements of xrel with only the keys in ks"],"^7","~$clojure.set/project","^A","out/clojure/set.cljs","^E",14,"^P",["^G",[["^Z","^1>"]]],"^S",null,"^Q",["^G",[null,null]],"^C",1,"^N",false,"^B",67,"^W",["^6",["^1J","^X","^1K","^1L","^1M"]],"^D",67,"^O",2,"^T",true,"^F",["^G",["^H",["^G",[["^Z","^1>"]]]]],"^L","Returns a rel of the elements of xrel with only the keys in ks"],"~$difference",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/out/clojure/set.cljs","^B",46,"^C",7,"^D",46,"^E",17,"^F",["^G",["^H",["^G",[["^I"],["^I","^J"],["^I","^J","~$&","^K"]]]]],"^L","Return a set that is the first set without elements of the remaining sets","^M",["^ ","^N",true,"^O",2,"^P",["^G",[["^I"],["^I","^J"]]],"^F",["^G",[["^I"],["^I","^J"],["^I","^J","~$&","^K"]]],"^Q",["^G",[null,null,null]]]],"^7","~$clojure.set/difference","^A","out/clojure/set.cljs","^E",17,"^M",["^ ","^N",true,"^O",2,"^P",["^G",[["^I"],["^I","^J"]]],"^F",["^G",[["^I"],["^I","^J"],["^I","^J","~$&","^K"]]],"^Q",["^G",[null,null,null]]],"^P",["^G",[["^I"],["^I","^J"]]],"^S",null,"^Q",["^G",[null,null,null]],"^C",1,"^N",true,"^B",46,"^D",46,"^O",2,"^T",true,"^F",["^G",[["^I"],["^I","^J"],["^I","^J","~$&","^K"]]],"^L","Return a set that is the first set without elements of the remaining sets"]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"^L","Set operations such as union/intersection."] \ No newline at end of file
diff --git a/src/http/static/viz/2/clojure/set.js b/src/http/static/viz/2/clojure/set.js
new file mode 100644
index 0000000..3be3f0b
--- /dev/null
+++ b/src/http/static/viz/2/clojure/set.js
@@ -0,0 +1,391 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('clojure.set');
+goog.require('cljs.core');
+clojure.set.bubble_max_key = (function clojure$set$bubble_max_key(k,coll){
+
+var max = cljs.core.apply.call(null,cljs.core.max_key,k,coll);
+return cljs.core.cons.call(null,max,cljs.core.remove.call(null,((function (max){
+return (function (p1__2145_SHARP_){
+return (max === p1__2145_SHARP_);
+});})(max))
+,coll));
+});
+/**
+ * Return a set that is the union of the input sets
+ */
+clojure.set.union = (function clojure$set$union(var_args){
+var G__2150 = arguments.length;
+switch (G__2150) {
+case 0:
+return clojure.set.union.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return clojure.set.union.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return clojure.set.union.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__4662__auto__ = [];
+var len__4641__auto___2152 = arguments.length;
+var i__4642__auto___2153 = (0);
+while(true){
+if((i__4642__auto___2153 < len__4641__auto___2152)){
+args_arr__4662__auto__.push((arguments[i__4642__auto___2153]));
+
+var G__2154 = (i__4642__auto___2153 + (1));
+i__4642__auto___2153 = G__2154;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4663__auto__ = (new cljs.core.IndexedSeq(args_arr__4662__auto__.slice((2)),(0),null));
+return clojure.set.union.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__4663__auto__);
+
+}
+});
+
+clojure.set.union.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.PersistentHashSet.EMPTY;
+});
+
+clojure.set.union.cljs$core$IFn$_invoke$arity$1 = (function (s1){
+return s1;
+});
+
+clojure.set.union.cljs$core$IFn$_invoke$arity$2 = (function (s1,s2){
+if((cljs.core.count.call(null,s1) < cljs.core.count.call(null,s2))){
+return cljs.core.reduce.call(null,cljs.core.conj,s2,s1);
+} else {
+return cljs.core.reduce.call(null,cljs.core.conj,s1,s2);
+}
+});
+
+clojure.set.union.cljs$core$IFn$_invoke$arity$variadic = (function (s1,s2,sets){
+var bubbled_sets = clojure.set.bubble_max_key.call(null,cljs.core.count,cljs.core.conj.call(null,sets,s2,s1));
+return cljs.core.reduce.call(null,cljs.core.into,cljs.core.first.call(null,bubbled_sets),cljs.core.rest.call(null,bubbled_sets));
+});
+
+/** @this {Function} */
+clojure.set.union.cljs$lang$applyTo = (function (seq2147){
+var G__2148 = cljs.core.first.call(null,seq2147);
+var seq2147__$1 = cljs.core.next.call(null,seq2147);
+var G__2149 = cljs.core.first.call(null,seq2147__$1);
+var seq2147__$2 = cljs.core.next.call(null,seq2147__$1);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__2148,G__2149,seq2147__$2);
+});
+
+clojure.set.union.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Return a set that is the intersection of the input sets
+ */
+clojure.set.intersection = (function clojure$set$intersection(var_args){
+var G__2160 = arguments.length;
+switch (G__2160) {
+case 1:
+return clojure.set.intersection.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return clojure.set.intersection.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__4662__auto__ = [];
+var len__4641__auto___2162 = arguments.length;
+var i__4642__auto___2163 = (0);
+while(true){
+if((i__4642__auto___2163 < len__4641__auto___2162)){
+args_arr__4662__auto__.push((arguments[i__4642__auto___2163]));
+
+var G__2164 = (i__4642__auto___2163 + (1));
+i__4642__auto___2163 = G__2164;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4663__auto__ = (new cljs.core.IndexedSeq(args_arr__4662__auto__.slice((2)),(0),null));
+return clojure.set.intersection.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__4663__auto__);
+
+}
+});
+
+clojure.set.intersection.cljs$core$IFn$_invoke$arity$1 = (function (s1){
+return s1;
+});
+
+clojure.set.intersection.cljs$core$IFn$_invoke$arity$2 = (function (s1,s2){
+while(true){
+if((cljs.core.count.call(null,s2) < cljs.core.count.call(null,s1))){
+var G__2165 = s2;
+var G__2166 = s1;
+s1 = G__2165;
+s2 = G__2166;
+continue;
+} else {
+return cljs.core.reduce.call(null,((function (s1,s2){
+return (function (result,item){
+if(cljs.core.contains_QMARK_.call(null,s2,item)){
+return result;
+} else {
+return cljs.core.disj.call(null,result,item);
+}
+});})(s1,s2))
+,s1,s1);
+}
+break;
+}
+});
+
+clojure.set.intersection.cljs$core$IFn$_invoke$arity$variadic = (function (s1,s2,sets){
+var bubbled_sets = clojure.set.bubble_max_key.call(null,(function (p1__2155_SHARP_){
+return (- cljs.core.count.call(null,p1__2155_SHARP_));
+}),cljs.core.conj.call(null,sets,s2,s1));
+return cljs.core.reduce.call(null,clojure.set.intersection,cljs.core.first.call(null,bubbled_sets),cljs.core.rest.call(null,bubbled_sets));
+});
+
+/** @this {Function} */
+clojure.set.intersection.cljs$lang$applyTo = (function (seq2157){
+var G__2158 = cljs.core.first.call(null,seq2157);
+var seq2157__$1 = cljs.core.next.call(null,seq2157);
+var G__2159 = cljs.core.first.call(null,seq2157__$1);
+var seq2157__$2 = cljs.core.next.call(null,seq2157__$1);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__2158,G__2159,seq2157__$2);
+});
+
+clojure.set.intersection.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Return a set that is the first set without elements of the remaining sets
+ */
+clojure.set.difference = (function clojure$set$difference(var_args){
+var G__2171 = arguments.length;
+switch (G__2171) {
+case 1:
+return clojure.set.difference.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return clojure.set.difference.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+var args_arr__4662__auto__ = [];
+var len__4641__auto___2173 = arguments.length;
+var i__4642__auto___2174 = (0);
+while(true){
+if((i__4642__auto___2174 < len__4641__auto___2173)){
+args_arr__4662__auto__.push((arguments[i__4642__auto___2174]));
+
+var G__2175 = (i__4642__auto___2174 + (1));
+i__4642__auto___2174 = G__2175;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4663__auto__ = (new cljs.core.IndexedSeq(args_arr__4662__auto__.slice((2)),(0),null));
+return clojure.set.difference.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),argseq__4663__auto__);
+
+}
+});
+
+clojure.set.difference.cljs$core$IFn$_invoke$arity$1 = (function (s1){
+return s1;
+});
+
+clojure.set.difference.cljs$core$IFn$_invoke$arity$2 = (function (s1,s2){
+if((cljs.core.count.call(null,s1) < cljs.core.count.call(null,s2))){
+return cljs.core.reduce.call(null,(function (result,item){
+if(cljs.core.contains_QMARK_.call(null,s2,item)){
+return cljs.core.disj.call(null,result,item);
+} else {
+return result;
+}
+}),s1,s1);
+} else {
+return cljs.core.reduce.call(null,cljs.core.disj,s1,s2);
+}
+});
+
+clojure.set.difference.cljs$core$IFn$_invoke$arity$variadic = (function (s1,s2,sets){
+return cljs.core.reduce.call(null,clojure.set.difference,s1,cljs.core.conj.call(null,sets,s2));
+});
+
+/** @this {Function} */
+clojure.set.difference.cljs$lang$applyTo = (function (seq2168){
+var G__2169 = cljs.core.first.call(null,seq2168);
+var seq2168__$1 = cljs.core.next.call(null,seq2168);
+var G__2170 = cljs.core.first.call(null,seq2168__$1);
+var seq2168__$2 = cljs.core.next.call(null,seq2168__$1);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__2169,G__2170,seq2168__$2);
+});
+
+clojure.set.difference.cljs$lang$maxFixedArity = (2);
+
+/**
+ * Returns a set of the elements for which pred is true
+ */
+clojure.set.select = (function clojure$set$select(pred,xset){
+return cljs.core.reduce.call(null,(function (s,k){
+if(cljs.core.truth_(pred.call(null,k))){
+return s;
+} else {
+return cljs.core.disj.call(null,s,k);
+}
+}),xset,xset);
+});
+/**
+ * Returns a rel of the elements of xrel with only the keys in ks
+ */
+clojure.set.project = (function clojure$set$project(xrel,ks){
+return cljs.core.set.call(null,cljs.core.map.call(null,(function (p1__2176_SHARP_){
+return cljs.core.select_keys.call(null,p1__2176_SHARP_,ks);
+}),xrel));
+});
+/**
+ * Returns the map with the keys in kmap renamed to the vals in kmap
+ */
+clojure.set.rename_keys = (function clojure$set$rename_keys(map,kmap){
+return cljs.core.reduce.call(null,(function (m,p__2177){
+var vec__2178 = p__2177;
+var old = cljs.core.nth.call(null,vec__2178,(0),null);
+var new$ = cljs.core.nth.call(null,vec__2178,(1),null);
+if(cljs.core.contains_QMARK_.call(null,map,old)){
+return cljs.core.assoc.call(null,m,new$,cljs.core.get.call(null,map,old));
+} else {
+return m;
+}
+}),cljs.core.apply.call(null,cljs.core.dissoc,map,cljs.core.keys.call(null,kmap)),kmap);
+});
+/**
+ * Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap
+ */
+clojure.set.rename = (function clojure$set$rename(xrel,kmap){
+return cljs.core.set.call(null,cljs.core.map.call(null,(function (p1__2181_SHARP_){
+return clojure.set.rename_keys.call(null,p1__2181_SHARP_,kmap);
+}),xrel));
+});
+/**
+ * Returns a map of the distinct values of ks in the xrel mapped to a
+ * set of the maps in xrel with the corresponding values of ks.
+ */
+clojure.set.index = (function clojure$set$index(xrel,ks){
+return cljs.core.reduce.call(null,(function (m,x){
+var ik = cljs.core.select_keys.call(null,x,ks);
+return cljs.core.assoc.call(null,m,ik,cljs.core.conj.call(null,cljs.core.get.call(null,m,ik,cljs.core.PersistentHashSet.EMPTY),x));
+}),cljs.core.PersistentArrayMap.EMPTY,xrel);
+});
+/**
+ * Returns the map with the vals mapped to the keys.
+ */
+clojure.set.map_invert = (function clojure$set$map_invert(m){
+return cljs.core.reduce.call(null,(function (m__$1,p__2182){
+var vec__2183 = p__2182;
+var k = cljs.core.nth.call(null,vec__2183,(0),null);
+var v = cljs.core.nth.call(null,vec__2183,(1),null);
+return cljs.core.assoc.call(null,m__$1,v,k);
+}),cljs.core.PersistentArrayMap.EMPTY,m);
+});
+/**
+ * When passed 2 rels, returns the rel corresponding to the natural
+ * join. When passed an additional keymap, joins on the corresponding
+ * keys.
+ */
+clojure.set.join = (function clojure$set$join(var_args){
+var G__2191 = arguments.length;
+switch (G__2191) {
+case 2:
+return clojure.set.join.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return clojure.set.join.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+clojure.set.join.cljs$core$IFn$_invoke$arity$2 = (function (xrel,yrel){
+if(((cljs.core.seq.call(null,xrel)) && (cljs.core.seq.call(null,yrel)))){
+var ks = clojure.set.intersection.call(null,cljs.core.set.call(null,cljs.core.keys.call(null,cljs.core.first.call(null,xrel))),cljs.core.set.call(null,cljs.core.keys.call(null,cljs.core.first.call(null,yrel))));
+var vec__2192 = (((cljs.core.count.call(null,xrel) <= cljs.core.count.call(null,yrel)))?new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [xrel,yrel], null):new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [yrel,xrel], null));
+var r = cljs.core.nth.call(null,vec__2192,(0),null);
+var s = cljs.core.nth.call(null,vec__2192,(1),null);
+var idx = clojure.set.index.call(null,r,ks);
+return cljs.core.reduce.call(null,((function (ks,vec__2192,r,s,idx){
+return (function (ret,x){
+var found = idx.call(null,cljs.core.select_keys.call(null,x,ks));
+if(cljs.core.truth_(found)){
+return cljs.core.reduce.call(null,((function (found,ks,vec__2192,r,s,idx){
+return (function (p1__2186_SHARP_,p2__2187_SHARP_){
+return cljs.core.conj.call(null,p1__2186_SHARP_,cljs.core.merge.call(null,p2__2187_SHARP_,x));
+});})(found,ks,vec__2192,r,s,idx))
+,ret,found);
+} else {
+return ret;
+}
+});})(ks,vec__2192,r,s,idx))
+,cljs.core.PersistentHashSet.EMPTY,s);
+} else {
+return cljs.core.PersistentHashSet.EMPTY;
+}
+});
+
+clojure.set.join.cljs$core$IFn$_invoke$arity$3 = (function (xrel,yrel,km){
+var vec__2195 = (((cljs.core.count.call(null,xrel) <= cljs.core.count.call(null,yrel)))?new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [xrel,yrel,clojure.set.map_invert.call(null,km)], null):new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [yrel,xrel,km], null));
+var r = cljs.core.nth.call(null,vec__2195,(0),null);
+var s = cljs.core.nth.call(null,vec__2195,(1),null);
+var k = cljs.core.nth.call(null,vec__2195,(2),null);
+var idx = clojure.set.index.call(null,r,cljs.core.vals.call(null,k));
+return cljs.core.reduce.call(null,((function (vec__2195,r,s,k,idx){
+return (function (ret,x){
+var found = idx.call(null,clojure.set.rename_keys.call(null,cljs.core.select_keys.call(null,x,cljs.core.keys.call(null,k)),k));
+if(cljs.core.truth_(found)){
+return cljs.core.reduce.call(null,((function (found,vec__2195,r,s,k,idx){
+return (function (p1__2188_SHARP_,p2__2189_SHARP_){
+return cljs.core.conj.call(null,p1__2188_SHARP_,cljs.core.merge.call(null,p2__2189_SHARP_,x));
+});})(found,vec__2195,r,s,k,idx))
+,ret,found);
+} else {
+return ret;
+}
+});})(vec__2195,r,s,k,idx))
+,cljs.core.PersistentHashSet.EMPTY,s);
+});
+
+clojure.set.join.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Is set1 a subset of set2?
+ */
+clojure.set.subset_QMARK_ = (function clojure$set$subset_QMARK_(set1,set2){
+return (((cljs.core.count.call(null,set1) <= cljs.core.count.call(null,set2))) && (cljs.core.every_QMARK_.call(null,(function (p1__2199_SHARP_){
+return cljs.core.contains_QMARK_.call(null,set2,p1__2199_SHARP_);
+}),set1)));
+});
+/**
+ * Is set1 a superset of set2?
+ */
+clojure.set.superset_QMARK_ = (function clojure$set$superset_QMARK_(set1,set2){
+return (((cljs.core.count.call(null,set1) >= cljs.core.count.call(null,set2))) && (cljs.core.every_QMARK_.call(null,(function (p1__2200_SHARP_){
+return cljs.core.contains_QMARK_.call(null,set1,p1__2200_SHARP_);
+}),set2)));
+});
+
+//# sourceMappingURL=set.js.map
diff --git a/src/http/static/viz/2/clojure/set.js.map b/src/http/static/viz/2/clojure/set.js.map
new file mode 100644
index 0000000..c385760
--- /dev/null
+++ b/src/http/static/viz/2/clojure/set.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/clojure\/set.js","sources":["set.cljs"],"lineCount":391,"mappings":"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","names":["clojure.set\/bubble-max-key","cljs.core\/apply","cljs.core\/max-key","k","coll","cljs.core\/cons","max","cljs.core\/remove","p1__2145#","G__2150","clojure.set\/union","i__4642__auto__","len__4641__auto__","args-arr__4662__auto__","cljs.core\/IndexedSeq","argseq__4663__auto__","cljs.core\/first","seq2147","cljs.core\/next","self__4628__auto__","G__2148","G__2149","s1","cljs.core\/count","s2","cljs.core\/reduce","cljs.core\/conj","sets","cljs.core\/into","bubbled-sets","cljs.core\/rest","G__2160","clojure.set\/intersection","seq2157","G__2158","G__2159","cljs.core\/contains?","item","result","cljs.core\/disj","p1__2155#","G__2171","clojure.set\/difference","seq2168","G__2169","G__2170","clojure.set\/select","pred","s","xset","clojure.set\/project","cljs.core\/set","cljs.core\/map","p1__2176#","cljs.core\/select-keys","ks","xrel","clojure.set\/rename-keys","p__2177","cljs.core\/nth","vec__2178","map","old","cljs.core\/assoc","m","new","cljs.core\/get","cljs.core\/dissoc","cljs.core\/keys","kmap","clojure.set\/rename","p1__2181#","clojure.set\/index","x","ik","clojure.set\/map-invert","p__2182","vec__2183","v","G__2191","clojure.set\/join","js\/Error","cljs.core\/seq","yrel","vec__2192","r","idx","found","p1__2186#","p2__2187#","cljs.core\/merge","ret","vec__2195","km","cljs.core\/vals","p1__2188#","p2__2189#","clojure.set\/subset?","set1","set2","cljs.core\/every?","p1__2199#","clojure.set\/superset?","p1__2200#"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/clojure/string.cljs b/src/http/static/viz/2/clojure/string.cljs
new file mode 100644
index 0000000..26f63f2
--- /dev/null
+++ b/src/http/static/viz/2/clojure/string.cljs
@@ -0,0 +1,289 @@
+; Copyright (c) Rich Hickey. All rights reserved.
+; The use and distribution terms for this software are covered by the
+; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
+; which can be found in the file epl-v10.html at the root of this distribution.
+; By using this software in any fashion, you are agreeing to be bound by
+; the terms of this license.
+; You must not remove this notice, or any other, from this software.
+
+(ns clojure.string
+ (:refer-clojure :exclude [replace reverse])
+ (:require [goog.string :as gstring])
+ (:import [goog.string StringBuffer]))
+
+(defn- seq-reverse
+ [coll]
+ (reduce conj () coll))
+
+(def ^:private re-surrogate-pair
+ (js/RegExp. "([\\uD800-\\uDBFF])([\\uDC00-\\uDFFF])" "g"))
+
+(defn reverse
+ "Returns s with its characters reversed."
+ [s]
+ (-> (.replace s re-surrogate-pair "$2$1")
+ (.. (split "") (reverse) (join ""))))
+
+(defn- replace-all
+ [s re replacement]
+ (let [r (js/RegExp. (.-source re)
+ (cond-> "g"
+ (.-ignoreCase re) (str "i")
+ (.-multiline re) (str "m")
+ (.-unicode re) (str "u")))]
+ (.replace s r replacement)))
+
+(defn- replace-with
+ [f]
+ (fn [& args]
+ (let [matches (drop-last 2 args)]
+ (if (= (count matches) 1)
+ (f (first matches))
+ (f (vec matches))))))
+
+(defn replace
+ "Replaces all instance of match with replacement in s.
+
+ match/replacement can be:
+
+ string / string
+ pattern / (string or function of match).
+
+ See also replace-first.
+
+ The replacement is literal (i.e. none of its characters are treated
+ specially) for all cases above except pattern / string.
+
+ For pattern / string, $1, $2, etc. in the replacement string are
+ substituted with the string that matched the corresponding
+ parenthesized group in the pattern.
+
+ Example:
+ (clojure.string/replace \"Almost Pig Latin\" #\"\\b(\\w)(\\w+)\\b\" \"$2$1ay\")
+ -> \"lmostAay igPay atinLay\""
+ [s match replacement]
+ (cond
+ (string? match)
+ (.replace s (js/RegExp. (gstring/regExpEscape match) "g") replacement)
+
+ (instance? js/RegExp match)
+ (if (string? replacement)
+ (replace-all s match replacement)
+ (replace-all s match (replace-with replacement)))
+
+ :else (throw (str "Invalid match arg: " match))))
+
+(defn replace-first
+ "Replaces the first instance of match with replacement in s.
+
+ match/replacement can be:
+
+ string / string
+ pattern / (string or function of match).
+
+ See also replace.
+
+ The replacement is literal (i.e. none of its characters are treated
+ specially) for all cases above except pattern / string.
+
+ For pattern / string, $1, $2, etc. in the replacement string are
+ substituted with the string that matched the corresponding
+ parenthesized group in the pattern.
+
+ Example:
+ (clojure.string/replace-first \"swap first two words\"
+ #\"(\\w+)(\\s+)(\\w+)\" \"$3$2$1\")
+ -> \"first swap two words\""
+ [s match replacement]
+ (.replace s match replacement))
+
+(defn join
+ "Returns a string of all elements in coll, as returned by (seq coll),
+ separated by an optional separator."
+ ([coll]
+ (loop [sb (StringBuffer.) coll (seq coll)]
+ (if-not (nil? coll)
+ (recur (. sb (append (str (first coll)))) (next coll))
+ (.toString sb))))
+ ([separator coll]
+ (loop [sb (StringBuffer.) coll (seq coll)]
+ (if-not (nil? coll)
+ (do
+ (. sb (append (str (first coll))))
+ (let [coll (next coll)]
+ (when-not (nil? coll)
+ (. sb (append separator)))
+ (recur sb coll)))
+ (.toString sb)))))
+
+(defn upper-case
+ "Converts string to all upper-case."
+ [s]
+ (.toUpperCase s))
+
+(defn lower-case
+ "Converts string to all lower-case."
+ [s]
+ (.toLowerCase s))
+
+(defn capitalize
+ "Converts first character of the string to upper-case, all other
+ characters to lower-case."
+ [s]
+ (gstring/capitalize s))
+
+;; The JavaScript split function takes a limit argument but the return
+;; value is not the same as the Java split function.
+;;
+;; Java: (.split "a-b-c" #"-" 2) => ["a" "b-c"]
+;; JavaScript: (.split "a-b-c" #"-" 2) => ["a" "b"]
+;;
+;; For consistency, the three arg version has been implemented to
+;; mimic Java's behavior.
+
+(defn- pop-last-while-empty
+ [v]
+ (loop [v v]
+ (if (identical? "" (peek v))
+ (recur (pop v))
+ v)))
+
+(defn- discard-trailing-if-needed
+ [limit v]
+ (if (and (== 0 limit) (< 1 (count v)))
+ (pop-last-while-empty v)
+ v))
+
+(defn- split-with-empty-regex
+ [s limit]
+ (if (or (<= limit 0) (>= limit (+ 2 (count s))))
+ (conj (vec (cons "" (map str (seq s)))) "")
+ (condp == limit
+ 1 (vector s)
+ 2 (vector "" s)
+ (let [c (- limit 2)]
+ (conj (vec (cons "" (subvec (vec (map str (seq s))) 0 c))) (subs s c))))))
+
+(defn split
+ "Splits string on a regular expression. Optional argument limit is
+ the maximum number of splits. Not lazy. Returns vector of the splits."
+ ([s re]
+ (split s re 0))
+ ([s re limit]
+ (discard-trailing-if-needed limit
+ (if (identical? "/(?:)/" (str re))
+ (split-with-empty-regex s limit)
+ (if (< limit 1)
+ (vec (.split (str s) re))
+ (loop [s s
+ limit limit
+ parts []]
+ (if (== 1 limit)
+ (conj parts s)
+ (let [m (re-find re s)]
+ (if-not (nil? m)
+ (let [index (.indexOf s m)]
+ (recur (.substring s (+ index (count m)))
+ (dec limit)
+ (conj parts (.substring s 0 index))))
+ (conj parts s))))))))))
+
+(defn split-lines
+ "Splits s on \\n or \\r\\n."
+ [s]
+ (split s #"\n|\r\n"))
+
+(defn trim
+ "Removes whitespace from both ends of string."
+ [s]
+ (gstring/trim s))
+
+(defn triml
+ "Removes whitespace from the left side of string."
+ [s]
+ (gstring/trimLeft s))
+
+(defn trimr
+ "Removes whitespace from the right side of string."
+ [s]
+ (gstring/trimRight s))
+
+(defn trim-newline
+ "Removes all trailing newline \\n or return \\r characters from
+ string. Similar to Perl's chomp."
+ [s]
+ (loop [index (.-length s)]
+ (if (zero? index)
+ ""
+ (let [ch (get s (dec index))]
+ (if (or (identical? \newline ch)
+ (identical? \return ch))
+ (recur (dec index))
+ (.substring s 0 index))))))
+
+(defn ^boolean blank?
+ "True is s is nil, empty, or contains only whitespace."
+ [s]
+ (gstring/isEmptySafe s))
+
+(defn escape
+ "Return a new string, using cmap to escape each character ch
+ from s as follows:
+
+ If (cmap ch) is nil, append ch to the new string.
+ If (cmap ch) is non-nil, append (str (cmap ch)) instead."
+ [s cmap]
+ (let [buffer (StringBuffer.)
+ length (.-length s)]
+ (loop [index 0]
+ (if (== length index)
+ (. buffer (toString))
+ (let [ch (.charAt s index)
+ replacement (get cmap ch)]
+ (if-not (nil? replacement)
+ (.append buffer (str replacement))
+ (.append buffer ch))
+ (recur (inc index)))))))
+
+(defn index-of
+ "Return index of value (string or char) in s, optionally searching
+ forward from from-index or nil if not found."
+ ([s value]
+ (let [result (.indexOf s value)]
+ (if (neg? result)
+ nil
+ result)))
+ ([s value from-index]
+ (let [result (.indexOf s value from-index)]
+ (if (neg? result)
+ nil
+ result))))
+
+(defn last-index-of
+ "Return last index of value (string or char) in s, optionally
+ searching backward from from-index or nil if not found."
+ ([s value]
+ (let [result (.lastIndexOf s value)]
+ (if (neg? result)
+ nil
+ result)))
+ ([s value from-index]
+ (let [result (.lastIndexOf s value from-index)]
+ (if (neg? result)
+ nil
+ result))))
+
+(defn ^boolean starts-with?
+ "True if s starts with substr."
+ [s substr]
+ (gstring/startsWith s substr))
+
+(defn ^boolean ends-with?
+ "True if s ends with substr."
+ [s substr]
+ (gstring/endsWith s substr))
+
+(defn ^boolean includes?
+ "True if s includes substr."
+ [s substr]
+ (gstring/contains s substr))
diff --git a/src/http/static/viz/2/clojure/string.cljs.cache.json b/src/http/static/viz/2/clojure/string.cljs.cache.json
new file mode 100644
index 0000000..534c7f8
--- /dev/null
+++ b/src/http/static/viz/2/clojure/string.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:externs",["^ ","~$RegExp",["^ "],"~$Error",["^ "]],"~:use-macros",["^ "],"~:excludes",["~#set",["~$reverse","~$replace"]],"~:name","~$clojure.string","~:imports",["^ ","~$StringBuffer","~$goog.string.StringBuffer"],"~:requires",["^ ","~$gstring","~$goog.string","^A","^A","^=","^>"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$ends-with?",["^ ","~:protocol-inline",null,"~:meta",["^ ","~:file","/home/mediocregopher/src/viz/out/clojure/string.cljs","~:line",281,"~:column",16,"~:end-line",281,"~:end-column",26,"~:tag","~$boolean","~:arglists",["~#list",["~$quote",["^P",[["~$s","~$substr"]]]]],"~:doc","True if s ends with substr."],"^:","~$clojure.string/ends-with?","^H","out/clojure/string.cljs","^L",26,"~:method-params",["^P",[["~$s","^R"]]],"~:protocol-impl",null,"~:arglists-meta",["^P",[null,null]],"^J",1,"~:variadic?",false,"^I",281,"~:ret-tag","^N","^K",281,"~:max-fixed-arity",2,"^M","^N","~:fn-var",true,"^O",["^P",["^Q",["^P",[["~$s","^R"]]]]],"^S","True if s ends with substr."],"~$seq-reverse",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",14,"^J",8,"^K",14,"^L",19,"~:private",true,"^O",["^P",["^Q",["^P",[["~$coll"]]]]]],"^11",true,"^:","~$clojure.string/seq-reverse","^H","out/clojure/string.cljs","^L",19,"^U",["^P",[["^12"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",14,"^Y","~$any","^K",14,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["^12"]]]]]],"~$replace-with",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",36,"^J",8,"^K",36,"^L",20,"^11",true,"^O",["^P",["^Q",["^P",[["~$f"]]]]]],"^11",true,"^:","~$clojure.string/replace-with","^H","out/clojure/string.cljs","^L",20,"^U",["^P",[["~$f"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",36,"^Y","~$function","^K",36,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$f"]]]]]],"~$capitalize",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",129,"^J",7,"^K",129,"^L",17,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Converts first character of the string to upper-case, all other\n characters to lower-case."],"^:","~$clojure.string/capitalize","^H","out/clojure/string.cljs","^L",17,"^U",["^P",[["~$s"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",129,"^Y","^14","^K",129,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Converts first character of the string to upper-case, all other\n characters to lower-case."],"^8",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",21,"^J",7,"^K",21,"^L",14,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Returns s with its characters reversed."],"^:","~$clojure.string/reverse","^H","out/clojure/string.cljs","^L",14,"^U",["^P",[["~$s"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",21,"^Y","^14","^K",21,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Returns s with its characters reversed."],"~$join",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",100,"^J",7,"^K",100,"^L",11,"^O",["^P",["^Q",["^P",[["^12"],["~$separator","^12"]]]]],"^S","Returns a string of all elements in coll, as returned by (seq coll),\n separated by an optional separator.","~:top-fn",["^ ","^X",false,"^Z",2,"^U",["^P",[["^12"],["^1<","^12"]]],"^O",["^P",[["^12"],["^1<","^12"]]],"^W",["^P",[null,null]]]],"^:","~$clojure.string/join","^H","out/clojure/string.cljs","^L",11,"^1=",["^ ","^X",false,"^Z",2,"^U",["^P",[["^12"],["^1<","^12"]]],"^O",["^P",[["^12"],["^1<","^12"]]],"^W",["^P",[null,null]]],"^U",["^P",[["^12"],["^1<","^12"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",100,"^K",100,"^Z",2,"^[",true,"^O",["^P",[["^12"],["^1<","^12"]]],"^S","Returns a string of all elements in coll, as returned by (seq coll),\n separated by an optional separator."],"~$replace-first",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",76,"^J",7,"^K",76,"^L",20,"^O",["^P",["^Q",["^P",[["~$s","~$match","~$replacement"]]]]],"^S","Replaces the first instance of match with replacement in s.\n\n match/replacement can be:\n\n string / string\n pattern / (string or function of match).\n\n See also replace.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern.\n\n Example:\n (clojure.string/replace-first \"swap first two words\"\n #\"(\\w+)(\\s+)(\\w+)\" \"$3$2$1\")\n -> \"first swap two words\""],"^:","~$clojure.string/replace-first","^H","out/clojure/string.cljs","^L",20,"^U",["^P",[["~$s","^1@","^1A"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",76,"^Y","^14","^K",76,"^Z",3,"^[",true,"^O",["^P",["^Q",["^P",[["~$s","^1@","^1A"]]]]],"^S","Replaces the first instance of match with replacement in s.\n\n match/replacement can be:\n\n string / string\n pattern / (string or function of match).\n\n See also replace.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern.\n\n Example:\n (clojure.string/replace-first \"swap first two words\"\n #\"(\\w+)(\\s+)(\\w+)\" \"$3$2$1\")\n -> \"first swap two words\""],"~$starts-with?",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",276,"^J",16,"^K",276,"^L",28,"^M","^N","^O",["^P",["^Q",["^P",[["~$s","^R"]]]]],"^S","True if s starts with substr."],"^:","~$clojure.string/starts-with?","^H","out/clojure/string.cljs","^L",28,"^U",["^P",[["~$s","^R"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",276,"^Y","^N","^K",276,"^Z",2,"^M","^N","^[",true,"^O",["^P",["^Q",["^P",[["~$s","^R"]]]]],"^S","True if s starts with substr."],"~$escape",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",229,"^J",7,"^K",229,"^L",13,"^O",["^P",["^Q",["^P",[["~$s","~$cmap"]]]]],"^S","Return a new string, using cmap to escape each character ch\n from s as follows:\n\n If (cmap ch) is nil, append ch to the new string.\n If (cmap ch) is non-nil, append (str (cmap ch)) instead."],"^:","~$clojure.string/escape","^H","out/clojure/string.cljs","^L",13,"^U",["^P",[["~$s","^1F"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",229,"^Y","^14","^K",229,"^Z",2,"^[",true,"^O",["^P",["^Q",["^P",[["~$s","^1F"]]]]],"^S","Return a new string, using cmap to escape each character ch\n from s as follows:\n\n If (cmap ch) is nil, append ch to the new string.\n If (cmap ch) is non-nil, append (str (cmap ch)) instead."],"~$replace-all",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",27,"^J",8,"^K",27,"^L",19,"^11",true,"^O",["^P",["^Q",["^P",[["~$s","~$re","^1A"]]]]]],"^11",true,"^:","~$clojure.string/replace-all","^H","out/clojure/string.cljs","^L",19,"^U",["^P",[["~$s","^1I","^1A"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",27,"^Y","^14","^K",27,"^Z",3,"^[",true,"^O",["^P",["^Q",["^P",[["~$s","^1I","^1A"]]]]]],"~$discard-trailing-if-needed",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",151,"^J",8,"^K",151,"^L",34,"^11",true,"^O",["^P",["^Q",["^P",[["~$limit","~$v"]]]]]],"^11",true,"^:","~$clojure.string/discard-trailing-if-needed","^H","out/clojure/string.cljs","^L",34,"^U",["^P",[["^1L","~$v"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",151,"^Y",["^7",[null,"^14"]],"^K",151,"^Z",2,"^[",true,"^O",["^P",["^Q",["^P",[["^1L","~$v"]]]]]],"~$last-index-of",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",262,"^J",7,"^K",262,"^L",20,"^O",["^P",["^Q",["^P",[["~$s","~$value"],["~$s","^1O","~$from-index"]]]]],"^S","Return last index of value (string or char) in s, optionally\n searching backward from from-index or nil if not found.","^1=",["^ ","^X",false,"^Z",3,"^U",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^O",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^W",["^P",[null,null]]]],"^:","~$clojure.string/last-index-of","^H","out/clojure/string.cljs","^L",20,"^1=",["^ ","^X",false,"^Z",3,"^U",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^O",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^W",["^P",[null,null]]],"^U",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",262,"^K",262,"^Z",3,"^[",true,"^O",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^S","Return last index of value (string or char) in s, optionally\n searching backward from from-index or nil if not found."],"~$pop-last-while-empty",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",144,"^J",8,"^K",144,"^L",28,"^11",true,"^O",["^P",["^Q",["^P",[["~$v"]]]]]],"^11",true,"^:","~$clojure.string/pop-last-while-empty","^H","out/clojure/string.cljs","^L",28,"^U",["^P",[["~$v"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",144,"^K",144,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$v"]]]]]],"~$includes?",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",286,"^J",16,"^K",286,"^L",25,"^M","^N","^O",["^P",["^Q",["^P",[["~$s","^R"]]]]],"^S","True if s includes substr."],"^:","~$clojure.string/includes?","^H","out/clojure/string.cljs","^L",25,"^U",["^P",[["~$s","^R"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",286,"^Y","^N","^K",286,"^Z",2,"^M","^N","^[",true,"^O",["^P",["^Q",["^P",[["~$s","^R"]]]]],"^S","True if s includes substr."],"^9",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",44,"^J",7,"^K",44,"^L",14,"^O",["^P",["^Q",["^P",[["~$s","^1@","^1A"]]]]],"^S","Replaces all instance of match with replacement in s.\n\n match/replacement can be:\n\n string / string\n pattern / (string or function of match).\n\n See also replace-first.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern.\n\n Example:\n (clojure.string/replace \"Almost Pig Latin\" #\"\\b(\\w)(\\w+)\\b\" \"$2$1ay\")\n -> \"lmostAay igPay atinLay\""],"^:","~$clojure.string/replace","^H","out/clojure/string.cljs","^L",14,"^U",["^P",[["~$s","^1@","^1A"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",44,"^Y","^14","^K",44,"^Z",3,"^[",true,"^O",["^P",["^Q",["^P",[["~$s","^1@","^1A"]]]]],"^S","Replaces all instance of match with replacement in s.\n\n match/replacement can be:\n\n string / string\n pattern / (string or function of match).\n\n See also replace-first.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern.\n\n Example:\n (clojure.string/replace \"Almost Pig Latin\" #\"\\b(\\w)(\\w+)\\b\" \"$2$1ay\")\n -> \"lmostAay igPay atinLay\""],"~$split-lines",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",191,"^J",7,"^K",191,"^L",18,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Splits s on \\n or \\r\\n."],"^:","~$clojure.string/split-lines","^H","out/clojure/string.cljs","^L",18,"^U",["^P",[["~$s"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",191,"^Y","^14","^K",191,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Splits s on \\n or \\r\\n."],"~$lower-case",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",124,"^J",7,"^K",124,"^L",17,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Converts string to all lower-case."],"^:","~$clojure.string/lower-case","^H","out/clojure/string.cljs","^L",17,"^U",["^P",[["~$s"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",124,"^Y","^14","^K",124,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Converts string to all lower-case."],"~$trim-newline",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",211,"^J",7,"^K",211,"^L",19,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Removes all trailing newline \\n or return \\r characters from\n string. Similar to Perl's chomp."],"^:","~$clojure.string/trim-newline","^H","out/clojure/string.cljs","^L",19,"^U",["^P",[["~$s"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",211,"^Y",["^7",["^14","~$string"]],"^K",211,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Removes all trailing newline \\n or return \\r characters from\n string. Similar to Perl's chomp."],"~$upper-case",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",119,"^J",7,"^K",119,"^L",17,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Converts string to all upper-case."],"^:","~$clojure.string/upper-case","^H","out/clojure/string.cljs","^L",17,"^U",["^P",[["~$s"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",119,"^Y","^14","^K",119,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Converts string to all upper-case."],"~$split",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",167,"^J",7,"^K",167,"^L",12,"^O",["^P",["^Q",["^P",[["~$s","^1I"],["~$s","^1I","^1L"]]]]],"^S","Splits string on a regular expression. Optional argument limit is\n the maximum number of splits. Not lazy. Returns vector of the splits.","^1=",["^ ","^X",false,"^Z",3,"^U",["^P",[["~$s","^1I"],["~$s","^1I","^1L"]]],"^O",["^P",[["~$s","^1I"],["~$s","^1I","^1L"]]],"^W",["^P",[null,null]]]],"^:","~$clojure.string/split","^H","out/clojure/string.cljs","^L",12,"^1=",["^ ","^X",false,"^Z",3,"^U",["^P",[["~$s","^1I"],["~$s","^1I","^1L"]]],"^O",["^P",[["~$s","^1I"],["~$s","^1I","^1L"]]],"^W",["^P",[null,null]]],"^U",["^P",[["~$s","^1I"],["~$s","^1I","^1L"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",167,"^K",167,"^Z",3,"^[",true,"^O",["^P",[["~$s","^1I"],["~$s","^1I","^1L"]]],"^S","Splits string on a regular expression. Optional argument limit is\n the maximum number of splits. Not lazy. Returns vector of the splits."],"~$trimr",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",206,"^J",7,"^K",206,"^L",12,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Removes whitespace from the right side of string."],"^:","~$clojure.string/trimr","^H","out/clojure/string.cljs","^L",12,"^U",["^P",[["~$s"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",206,"^Y","^14","^K",206,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Removes whitespace from the right side of string."],"~$index-of",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",248,"^J",7,"^K",248,"^L",15,"^O",["^P",["^Q",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]]]],"^S","Return index of value (string or char) in s, optionally searching\n forward from from-index or nil if not found.","^1=",["^ ","^X",false,"^Z",3,"^U",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^O",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^W",["^P",[null,null]]]],"^:","~$clojure.string/index-of","^H","out/clojure/string.cljs","^L",15,"^1=",["^ ","^X",false,"^Z",3,"^U",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^O",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^W",["^P",[null,null]]],"^U",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",248,"^K",248,"^Z",3,"^[",true,"^O",["^P",[["~$s","^1O"],["~$s","^1O","^1P"]]],"^S","Return index of value (string or char) in s, optionally searching\n forward from from-index or nil if not found."],"~$trim",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",196,"^J",7,"^K",196,"^L",11,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Removes whitespace from both ends of string."],"^:","~$clojure.string/trim","^H","out/clojure/string.cljs","^L",11,"^U",["^P",[["~$s"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",196,"^Y","^14","^K",196,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Removes whitespace from both ends of string."],"~$triml",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",201,"^J",7,"^K",201,"^L",12,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Removes whitespace from the left side of string."],"^:","~$clojure.string/triml","^H","out/clojure/string.cljs","^L",12,"^U",["^P",[["~$s"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",201,"^Y","^14","^K",201,"^Z",1,"^[",true,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","Removes whitespace from the left side of string."],"~$blank?",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",224,"^J",16,"^K",224,"^L",22,"^M","^N","^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","True is s is nil, empty, or contains only whitespace."],"^:","~$clojure.string/blank?","^H","out/clojure/string.cljs","^L",22,"^U",["^P",[["~$s"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",224,"^Y","^N","^K",224,"^Z",1,"^M","^N","^[",true,"^O",["^P",["^Q",["^P",[["~$s"]]]]],"^S","True is s is nil, empty, or contains only whitespace."],"~$re-surrogate-pair",["^ ","^:","~$clojure.string/re-surrogate-pair","^H","out/clojure/string.cljs","^I",18,"^J",1,"^K",18,"^L",33,"^11",true,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",18,"^J",16,"^K",18,"^L",33,"^11",true],"^M","~$js/RegExp"],"~$split-with-empty-regex",["^ ","^F",null,"^G",["^ ","^H","/home/mediocregopher/src/viz/out/clojure/string.cljs","^I",157,"^J",8,"^K",157,"^L",30,"^11",true,"^O",["^P",["^Q",["^P",[["~$s","^1L"]]]]]],"^11",true,"^:","~$clojure.string/split-with-empty-regex","^H","out/clojure/string.cljs","^L",30,"^U",["^P",[["~$s","^1L"]]],"^V",null,"^W",["^P",[null,null]],"^J",1,"^X",false,"^I",157,"^Y",["^7",["^14","~$cljs.core/PersistentVector"]],"^K",157,"^Z",2,"^[",true,"^O",["^P",["^Q",["^P",[["~$s","^1L"]]]]]]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:cljs.analyzer/constants",["^ ","~:seen",["^7",["~:else"]],"~:order",["^2J"]],"^S",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/clojure/string.js b/src/http/static/viz/2/clojure/string.js
new file mode 100644
index 0000000..acd3456
--- /dev/null
+++ b/src/http/static/viz/2/clojure/string.js
@@ -0,0 +1,477 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('clojure.string');
+goog.require('cljs.core');
+goog.require('goog.string');
+goog.require('goog.string.StringBuffer');
+clojure.string.seq_reverse = (function clojure$string$seq_reverse(coll){
+return cljs.core.reduce.call(null,cljs.core.conj,cljs.core.List.EMPTY,coll);
+});
+clojure.string.re_surrogate_pair = (new RegExp("([\\uD800-\\uDBFF])([\\uDC00-\\uDFFF])","g"));
+/**
+ * Returns s with its characters reversed.
+ */
+clojure.string.reverse = (function clojure$string$reverse(s){
+return s.replace(clojure.string.re_surrogate_pair,"$2$1").split("").reverse().join("");
+});
+clojure.string.replace_all = (function clojure$string$replace_all(s,re,replacement){
+var r = (new RegExp(re.source,(function (){var G__1125 = "g";
+var G__1125__$1 = (cljs.core.truth_(re.ignoreCase)?[cljs.core.str.cljs$core$IFn$_invoke$arity$1(G__1125),"i"].join(''):G__1125);
+var G__1125__$2 = (cljs.core.truth_(re.multiline)?[cljs.core.str.cljs$core$IFn$_invoke$arity$1(G__1125__$1),"m"].join(''):G__1125__$1);
+if(cljs.core.truth_(re.unicode)){
+return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(G__1125__$2),"u"].join('');
+} else {
+return G__1125__$2;
+}
+})()));
+return s.replace(r,replacement);
+});
+clojure.string.replace_with = (function clojure$string$replace_with(f){
+return (function() {
+var G__1126__delegate = function (args){
+var matches = cljs.core.drop_last.call(null,(2),args);
+if(cljs.core._EQ_.call(null,cljs.core.count.call(null,matches),(1))){
+return f.call(null,cljs.core.first.call(null,matches));
+} else {
+return f.call(null,cljs.core.vec.call(null,matches));
+}
+};
+var G__1126 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__1127__i = 0, G__1127__a = new Array(arguments.length - 0);
+while (G__1127__i < G__1127__a.length) {G__1127__a[G__1127__i] = arguments[G__1127__i + 0]; ++G__1127__i;}
+ args = new cljs.core.IndexedSeq(G__1127__a,0,null);
+}
+return G__1126__delegate.call(this,args);};
+G__1126.cljs$lang$maxFixedArity = 0;
+G__1126.cljs$lang$applyTo = (function (arglist__1128){
+var args = cljs.core.seq(arglist__1128);
+return G__1126__delegate(args);
+});
+G__1126.cljs$core$IFn$_invoke$arity$variadic = G__1126__delegate;
+return G__1126;
+})()
+;
+});
+/**
+ * Replaces all instance of match with replacement in s.
+ *
+ * match/replacement can be:
+ *
+ * string / string
+ * pattern / (string or function of match).
+ *
+ * See also replace-first.
+ *
+ * The replacement is literal (i.e. none of its characters are treated
+ * specially) for all cases above except pattern / string.
+ *
+ * For pattern / string, $1, $2, etc. in the replacement string are
+ * substituted with the string that matched the corresponding
+ * parenthesized group in the pattern.
+ *
+ * Example:
+ * (clojure.string/replace "Almost Pig Latin" #"\b(\w)(\w+)\b" "$2$1ay")
+ * -> "lmostAay igPay atinLay"
+ */
+clojure.string.replace = (function clojure$string$replace(s,match,replacement){
+if(typeof match === 'string'){
+return s.replace((new RegExp(goog.string.regExpEscape(match),"g")),replacement);
+} else {
+if((match instanceof RegExp)){
+if(typeof replacement === 'string'){
+return clojure.string.replace_all.call(null,s,match,replacement);
+} else {
+return clojure.string.replace_all.call(null,s,match,clojure.string.replace_with.call(null,replacement));
+}
+} else {
+throw ["Invalid match arg: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(match)].join('');
+
+}
+}
+});
+/**
+ * Replaces the first instance of match with replacement in s.
+ *
+ * match/replacement can be:
+ *
+ * string / string
+ * pattern / (string or function of match).
+ *
+ * See also replace.
+ *
+ * The replacement is literal (i.e. none of its characters are treated
+ * specially) for all cases above except pattern / string.
+ *
+ * For pattern / string, $1, $2, etc. in the replacement string are
+ * substituted with the string that matched the corresponding
+ * parenthesized group in the pattern.
+ *
+ * Example:
+ * (clojure.string/replace-first "swap first two words"
+ * #"(\w+)(\s+)(\w+)" "$3$2$1")
+ * -> "first swap two words"
+ */
+clojure.string.replace_first = (function clojure$string$replace_first(s,match,replacement){
+return s.replace(match,replacement);
+});
+/**
+ * Returns a string of all elements in coll, as returned by (seq coll),
+ * separated by an optional separator.
+ */
+clojure.string.join = (function clojure$string$join(var_args){
+var G__1130 = arguments.length;
+switch (G__1130) {
+case 1:
+return clojure.string.join.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return clojure.string.join.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+clojure.string.join.cljs$core$IFn$_invoke$arity$1 = (function (coll){
+var sb = (new goog.string.StringBuffer());
+var coll__$1 = cljs.core.seq.call(null,coll);
+while(true){
+if((!((coll__$1 == null)))){
+var G__1132 = sb.append(cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.first.call(null,coll__$1)));
+var G__1133 = cljs.core.next.call(null,coll__$1);
+sb = G__1132;
+coll__$1 = G__1133;
+continue;
+} else {
+return sb.toString();
+}
+break;
+}
+});
+
+clojure.string.join.cljs$core$IFn$_invoke$arity$2 = (function (separator,coll){
+var sb = (new goog.string.StringBuffer());
+var coll__$1 = cljs.core.seq.call(null,coll);
+while(true){
+if((!((coll__$1 == null)))){
+sb.append(cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.first.call(null,coll__$1)));
+
+var coll__$2 = cljs.core.next.call(null,coll__$1);
+if((coll__$2 == null)){
+} else {
+sb.append(separator);
+}
+
+var G__1134 = sb;
+var G__1135 = coll__$2;
+sb = G__1134;
+coll__$1 = G__1135;
+continue;
+} else {
+return sb.toString();
+}
+break;
+}
+});
+
+clojure.string.join.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Converts string to all upper-case.
+ */
+clojure.string.upper_case = (function clojure$string$upper_case(s){
+return s.toUpperCase();
+});
+/**
+ * Converts string to all lower-case.
+ */
+clojure.string.lower_case = (function clojure$string$lower_case(s){
+return s.toLowerCase();
+});
+/**
+ * Converts first character of the string to upper-case, all other
+ * characters to lower-case.
+ */
+clojure.string.capitalize = (function clojure$string$capitalize(s){
+return goog.string.capitalize(s);
+});
+clojure.string.pop_last_while_empty = (function clojure$string$pop_last_while_empty(v){
+var v__$1 = v;
+while(true){
+if(("" === cljs.core.peek.call(null,v__$1))){
+var G__1136 = cljs.core.pop.call(null,v__$1);
+v__$1 = G__1136;
+continue;
+} else {
+return v__$1;
+}
+break;
+}
+});
+clojure.string.discard_trailing_if_needed = (function clojure$string$discard_trailing_if_needed(limit,v){
+if(((((0) === limit)) && (((1) < cljs.core.count.call(null,v))))){
+return clojure.string.pop_last_while_empty.call(null,v);
+} else {
+return v;
+}
+});
+clojure.string.split_with_empty_regex = (function clojure$string$split_with_empty_regex(s,limit){
+if((((limit <= (0))) || ((limit >= ((2) + cljs.core.count.call(null,s)))))){
+return cljs.core.conj.call(null,cljs.core.vec.call(null,cljs.core.cons.call(null,"",cljs.core.map.call(null,cljs.core.str,cljs.core.seq.call(null,s)))),"");
+} else {
+var pred__1137 = cljs.core._EQ__EQ_;
+var expr__1138 = limit;
+if(cljs.core.truth_(pred__1137.call(null,(1),expr__1138))){
+return (new cljs.core.PersistentVector(null,1,(5),cljs.core.PersistentVector.EMPTY_NODE,[s],null));
+} else {
+if(cljs.core.truth_(pred__1137.call(null,(2),expr__1138))){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,["",s],null));
+} else {
+var c = (limit - (2));
+return cljs.core.conj.call(null,cljs.core.vec.call(null,cljs.core.cons.call(null,"",cljs.core.subvec.call(null,cljs.core.vec.call(null,cljs.core.map.call(null,cljs.core.str,cljs.core.seq.call(null,s))),(0),c))),cljs.core.subs.call(null,s,c));
+}
+}
+}
+});
+/**
+ * Splits string on a regular expression. Optional argument limit is
+ * the maximum number of splits. Not lazy. Returns vector of the splits.
+ */
+clojure.string.split = (function clojure$string$split(var_args){
+var G__1141 = arguments.length;
+switch (G__1141) {
+case 2:
+return clojure.string.split.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return clojure.string.split.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+clojure.string.split.cljs$core$IFn$_invoke$arity$2 = (function (s,re){
+return clojure.string.split.call(null,s,re,(0));
+});
+
+clojure.string.split.cljs$core$IFn$_invoke$arity$3 = (function (s,re,limit){
+return clojure.string.discard_trailing_if_needed.call(null,limit,((("/(?:)/" === cljs.core.str.cljs$core$IFn$_invoke$arity$1(re)))?clojure.string.split_with_empty_regex.call(null,s,limit):(((limit < (1)))?cljs.core.vec.call(null,cljs.core.str.cljs$core$IFn$_invoke$arity$1(s).split(re)):(function (){var s__$1 = s;
+var limit__$1 = limit;
+var parts = cljs.core.PersistentVector.EMPTY;
+while(true){
+if(((1) === limit__$1)){
+return cljs.core.conj.call(null,parts,s__$1);
+} else {
+var m = cljs.core.re_find.call(null,re,s__$1);
+if((!((m == null)))){
+var index = s__$1.indexOf(m);
+var G__1143 = s__$1.substring((index + cljs.core.count.call(null,m)));
+var G__1144 = (limit__$1 - (1));
+var G__1145 = cljs.core.conj.call(null,parts,s__$1.substring((0),index));
+s__$1 = G__1143;
+limit__$1 = G__1144;
+parts = G__1145;
+continue;
+} else {
+return cljs.core.conj.call(null,parts,s__$1);
+}
+}
+break;
+}
+})())));
+});
+
+clojure.string.split.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Splits s on \n or \r\n.
+ */
+clojure.string.split_lines = (function clojure$string$split_lines(s){
+return clojure.string.split.call(null,s,/\n|\r\n/);
+});
+/**
+ * Removes whitespace from both ends of string.
+ */
+clojure.string.trim = (function clojure$string$trim(s){
+return goog.string.trim(s);
+});
+/**
+ * Removes whitespace from the left side of string.
+ */
+clojure.string.triml = (function clojure$string$triml(s){
+return goog.string.trimLeft(s);
+});
+/**
+ * Removes whitespace from the right side of string.
+ */
+clojure.string.trimr = (function clojure$string$trimr(s){
+return goog.string.trimRight(s);
+});
+/**
+ * Removes all trailing newline \n or return \r characters from
+ * string. Similar to Perl's chomp.
+ */
+clojure.string.trim_newline = (function clojure$string$trim_newline(s){
+var index = s.length;
+while(true){
+if((index === (0))){
+return "";
+} else {
+var ch = cljs.core.get.call(null,s,(index - (1)));
+if(((("\n" === ch)) || (("\r" === ch)))){
+var G__1146 = (index - (1));
+index = G__1146;
+continue;
+} else {
+return s.substring((0),index);
+}
+}
+break;
+}
+});
+/**
+ * True is s is nil, empty, or contains only whitespace.
+ */
+clojure.string.blank_QMARK_ = (function clojure$string$blank_QMARK_(s){
+return goog.string.isEmptySafe(s);
+});
+/**
+ * Return a new string, using cmap to escape each character ch
+ * from s as follows:
+ *
+ * If (cmap ch) is nil, append ch to the new string.
+ * If (cmap ch) is non-nil, append (str (cmap ch)) instead.
+ */
+clojure.string.escape = (function clojure$string$escape(s,cmap){
+var buffer = (new goog.string.StringBuffer());
+var length = s.length;
+var index = (0);
+while(true){
+if((length === index)){
+return buffer.toString();
+} else {
+var ch = s.charAt(index);
+var replacement = cljs.core.get.call(null,cmap,ch);
+if((!((replacement == null)))){
+buffer.append(cljs.core.str.cljs$core$IFn$_invoke$arity$1(replacement));
+} else {
+buffer.append(ch);
+}
+
+var G__1147 = (index + (1));
+index = G__1147;
+continue;
+}
+break;
+}
+});
+/**
+ * Return index of value (string or char) in s, optionally searching
+ * forward from from-index or nil if not found.
+ */
+clojure.string.index_of = (function clojure$string$index_of(var_args){
+var G__1149 = arguments.length;
+switch (G__1149) {
+case 2:
+return clojure.string.index_of.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return clojure.string.index_of.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+clojure.string.index_of.cljs$core$IFn$_invoke$arity$2 = (function (s,value){
+var result = s.indexOf(value);
+if((result < (0))){
+return null;
+} else {
+return result;
+}
+});
+
+clojure.string.index_of.cljs$core$IFn$_invoke$arity$3 = (function (s,value,from_index){
+var result = s.indexOf(value,from_index);
+if((result < (0))){
+return null;
+} else {
+return result;
+}
+});
+
+clojure.string.index_of.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Return last index of value (string or char) in s, optionally
+ * searching backward from from-index or nil if not found.
+ */
+clojure.string.last_index_of = (function clojure$string$last_index_of(var_args){
+var G__1152 = arguments.length;
+switch (G__1152) {
+case 2:
+return clojure.string.last_index_of.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return clojure.string.last_index_of.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+clojure.string.last_index_of.cljs$core$IFn$_invoke$arity$2 = (function (s,value){
+var result = s.lastIndexOf(value);
+if((result < (0))){
+return null;
+} else {
+return result;
+}
+});
+
+clojure.string.last_index_of.cljs$core$IFn$_invoke$arity$3 = (function (s,value,from_index){
+var result = s.lastIndexOf(value,from_index);
+if((result < (0))){
+return null;
+} else {
+return result;
+}
+});
+
+clojure.string.last_index_of.cljs$lang$maxFixedArity = 3;
+
+/**
+ * True if s starts with substr.
+ */
+clojure.string.starts_with_QMARK_ = (function clojure$string$starts_with_QMARK_(s,substr){
+return goog.string.startsWith(s,substr);
+});
+/**
+ * True if s ends with substr.
+ */
+clojure.string.ends_with_QMARK_ = (function clojure$string$ends_with_QMARK_(s,substr){
+return goog.string.endsWith(s,substr);
+});
+/**
+ * True if s includes substr.
+ */
+clojure.string.includes_QMARK_ = (function clojure$string$includes_QMARK_(s,substr){
+return goog.string.contains(s,substr);
+});
+
+//# sourceMappingURL=string.js.map
diff --git a/src/http/static/viz/2/clojure/string.js.map b/src/http/static/viz/2/clojure/string.js.map
new file mode 100644
index 0000000..2270a89
--- /dev/null
+++ b/src/http/static/viz/2/clojure/string.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/clojure\/string.js","sources":["string.cljs"],"lineCount":477,"mappings":"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\/B,AAAA,+CAAA,\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","names":["clojure.string\/seq-reverse","cljs.core\/reduce","cljs.core\/conj","coll","clojure.string\/re-surrogate-pair","js\/RegExp","clojure.string\/reverse","s","clojure.string\/replace-all","re","G__1125","r","replacement","clojure.string\/replace-with","cljs.core\/drop-last","args","cljs.core\/=","cljs.core\/count","matches","f","cljs.core\/first","cljs.core\/vec","clojure.string\/replace","match","goog.string\/regExpEscape","clojure.string\/replace-first","G__1130","clojure.string\/join","js\/Error","goog\/string","cljs.core\/seq","sb","cljs.core\/next","separator","clojure.string\/upper-case","clojure.string\/lower-case","clojure.string\/capitalize","goog.string\/capitalize","clojure.string\/pop-last-while-empty","v","cljs.core\/peek","cljs.core\/pop","clojure.string\/discard-trailing-if-needed","limit","clojure.string\/split-with-empty-regex","cljs.core\/cons","cljs.core\/map","cljs.core\/str","pred__1137","expr__1138","cljs.core\/==","cljs.core\/PersistentVector","cljs.core\/subvec","c","cljs.core\/subs","G__1141","clojure.string\/split","parts","cljs.core\/re-find","m","index","clojure.string\/split-lines","clojure.string\/trim","goog.string\/trim","clojure.string\/triml","goog.string\/trimLeft","clojure.string\/trimr","goog.string\/trimRight","clojure.string\/trim-newline","cljs.core\/get","ch","clojure.string\/blank?","goog.string\/isEmptySafe","clojure.string\/escape","length","buffer","cmap","G__1149","clojure.string\/index-of","value","result","from-index","G__1152","clojure.string\/last-index-of","clojure.string\/starts-with?","goog.string\/startsWith","substr","clojure.string\/ends-with?","goog.string\/endsWith","clojure.string\/includes?","goog.string\/contains"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/goog/array/array.js b/src/http/static/viz/2/goog/array/array.js
new file mode 100644
index 0000000..47e0dbb
--- /dev/null
+++ b/src/http/static/viz/2/goog/array/array.js
@@ -0,0 +1,1665 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for manipulating arrays.
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+goog.provide('goog.array');
+
+goog.require('goog.asserts');
+
+
+/**
+ * @define {boolean} NATIVE_ARRAY_PROTOTYPES indicates whether the code should
+ * rely on Array.prototype functions, if available.
+ *
+ * The Array.prototype functions can be defined by external libraries like
+ * Prototype and setting this flag to false forces closure to use its own
+ * goog.array implementation.
+ *
+ * If your javascript can be loaded by a third party site and you are wary about
+ * relying on the prototype functions, specify
+ * "--define goog.NATIVE_ARRAY_PROTOTYPES=false" to the JSCompiler.
+ *
+ * Setting goog.TRUSTED_SITE to false will automatically set
+ * NATIVE_ARRAY_PROTOTYPES to false.
+ */
+goog.define('goog.NATIVE_ARRAY_PROTOTYPES', goog.TRUSTED_SITE);
+
+
+/**
+ * @define {boolean} If true, JSCompiler will use the native implementation of
+ * array functions where appropriate (e.g., {@code Array#filter}) and remove the
+ * unused pure JS implementation.
+ */
+goog.define('goog.array.ASSUME_NATIVE_FUNCTIONS', false);
+
+
+/**
+ * Returns the last element in an array without removing it.
+ * Same as goog.array.last.
+ * @param {IArrayLike<T>|string} array The array.
+ * @return {T} Last item in array.
+ * @template T
+ */
+goog.array.peek = function(array) {
+ return array[array.length - 1];
+};
+
+
+/**
+ * Returns the last element in an array without removing it.
+ * Same as goog.array.peek.
+ * @param {IArrayLike<T>|string} array The array.
+ * @return {T} Last item in array.
+ * @template T
+ */
+goog.array.last = goog.array.peek;
+
+// NOTE(arv): Since most of the array functions are generic it allows you to
+// pass an array-like object. Strings have a length and are considered array-
+// like. However, the 'in' operator does not work on strings so we cannot just
+// use the array path even if the browser supports indexing into strings. We
+// therefore end up splitting the string.
+
+
+/**
+ * Returns the index of the first element of an array with a specified value, or
+ * -1 if the element is not present in the array.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-indexof}
+ *
+ * @param {IArrayLike<T>|string} arr The array to be searched.
+ * @param {T} obj The object for which we are searching.
+ * @param {number=} opt_fromIndex The index at which to start the search. If
+ * omitted the search starts at index 0.
+ * @return {number} The index of the first matching array element.
+ * @template T
+ */
+goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.indexOf) ?
+ function(arr, obj, opt_fromIndex) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.indexOf.call(arr, obj, opt_fromIndex);
+ } :
+ function(arr, obj, opt_fromIndex) {
+ var fromIndex = opt_fromIndex == null ?
+ 0 :
+ (opt_fromIndex < 0 ? Math.max(0, arr.length + opt_fromIndex) :
+ opt_fromIndex);
+
+ if (goog.isString(arr)) {
+ // Array.prototype.indexOf uses === so only strings should be found.
+ if (!goog.isString(obj) || obj.length != 1) {
+ return -1;
+ }
+ return arr.indexOf(obj, fromIndex);
+ }
+
+ for (var i = fromIndex; i < arr.length; i++) {
+ if (i in arr && arr[i] === obj) return i;
+ }
+ return -1;
+ };
+
+
+/**
+ * Returns the index of the last element of an array with a specified value, or
+ * -1 if the element is not present in the array.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-lastindexof}
+ *
+ * @param {!IArrayLike<T>|string} arr The array to be searched.
+ * @param {T} obj The object for which we are searching.
+ * @param {?number=} opt_fromIndex The index at which to start the search. If
+ * omitted the search starts at the end of the array.
+ * @return {number} The index of the last matching array element.
+ * @template T
+ */
+goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.lastIndexOf) ?
+ function(arr, obj, opt_fromIndex) {
+ goog.asserts.assert(arr.length != null);
+
+ // Firefox treats undefined and null as 0 in the fromIndex argument which
+ // leads it to always return -1
+ var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex;
+ return Array.prototype.lastIndexOf.call(arr, obj, fromIndex);
+ } :
+ function(arr, obj, opt_fromIndex) {
+ var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex;
+
+ if (fromIndex < 0) {
+ fromIndex = Math.max(0, arr.length + fromIndex);
+ }
+
+ if (goog.isString(arr)) {
+ // Array.prototype.lastIndexOf uses === so only strings should be found.
+ if (!goog.isString(obj) || obj.length != 1) {
+ return -1;
+ }
+ return arr.lastIndexOf(obj, fromIndex);
+ }
+
+ for (var i = fromIndex; i >= 0; i--) {
+ if (i in arr && arr[i] === obj) return i;
+ }
+ return -1;
+ };
+
+
+/**
+ * Calls a function for each element in an array. Skips holes in the array.
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-foreach}
+ *
+ * @param {IArrayLike<T>|string} arr Array or array like object over
+ * which to iterate.
+ * @param {?function(this: S, T, number, ?): ?} f The function to call for every
+ * element. This function takes 3 arguments (the element, the index and the
+ * array). The return value is ignored.
+ * @param {S=} opt_obj The object to be used as the value of 'this' within f.
+ * @template T,S
+ */
+goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.forEach) ?
+ function(arr, f, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+
+ Array.prototype.forEach.call(arr, f, opt_obj);
+ } :
+ function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2) {
+ f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);
+ }
+ }
+ };
+
+
+/**
+ * Calls a function for each element in an array, starting from the last
+ * element rather than the first.
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this: S, T, number, ?): ?} f The function to call for every
+ * element. This function
+ * takes 3 arguments (the element, the index and the array). The return
+ * value is ignored.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @template T,S
+ */
+goog.array.forEachRight = function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = l - 1; i >= 0; --i) {
+ if (i in arr2) {
+ f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);
+ }
+ }
+};
+
+
+/**
+ * Calls a function for each element in an array, and if the function returns
+ * true adds the element to a new array.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-filter}
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?):boolean} f The function to call for
+ * every element. This function
+ * takes 3 arguments (the element, the index and the array) and must
+ * return a Boolean. If the return value is true the element is added to the
+ * result array. If it is false the element is not included.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @return {!Array<T>} a new array in which only elements that passed the test
+ * are present.
+ * @template T,S
+ */
+goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.filter) ?
+ function(arr, f, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.filter.call(arr, f, opt_obj);
+ } :
+ function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var res = [];
+ var resLength = 0;
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2) {
+ var val = arr2[i]; // in case f mutates arr2
+ if (f.call(/** @type {?} */ (opt_obj), val, i, arr)) {
+ res[resLength++] = val;
+ }
+ }
+ }
+ return res;
+ };
+
+
+/**
+ * Calls a function for each element in an array and inserts the result into a
+ * new array.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-map}
+ *
+ * @param {IArrayLike<VALUE>|string} arr Array or array like object
+ * over which to iterate.
+ * @param {function(this:THIS, VALUE, number, ?): RESULT} f The function to call
+ * for every element. This function takes 3 arguments (the element,
+ * the index and the array) and should return something. The result will be
+ * inserted into a new array.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within f.
+ * @return {!Array<RESULT>} a new array with the results from f.
+ * @template THIS, VALUE, RESULT
+ */
+goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.map) ?
+ function(arr, f, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.map.call(arr, f, opt_obj);
+ } :
+ function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var res = new Array(l);
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2) {
+ res[i] = f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);
+ }
+ }
+ return res;
+ };
+
+
+/**
+ * Passes every element of an array into a function and accumulates the result.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-reduce}
+ *
+ * For example:
+ * var a = [1, 2, 3, 4];
+ * goog.array.reduce(a, function(r, v, i, arr) {return r + v;}, 0);
+ * returns 10
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {function(this:S, R, T, number, ?) : R} f The function to call for
+ * every element. This function
+ * takes 4 arguments (the function's previous result or the initial value,
+ * the value of the current array element, the current array index, and the
+ * array itself)
+ * function(previousValue, currentValue, index, array).
+ * @param {?} val The initial value to pass into the function on the first call.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @return {R} Result of evaluating f repeatedly across the values of the array.
+ * @template T,S,R
+ */
+goog.array.reduce = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.reduce) ?
+ function(arr, f, val, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+ if (opt_obj) {
+ f = goog.bind(f, opt_obj);
+ }
+ return Array.prototype.reduce.call(arr, f, val);
+ } :
+ function(arr, f, val, opt_obj) {
+ var rval = val;
+ goog.array.forEach(arr, function(val, index) {
+ rval = f.call(/** @type {?} */ (opt_obj), rval, val, index, arr);
+ });
+ return rval;
+ };
+
+
+/**
+ * Passes every element of an array into a function and accumulates the result,
+ * starting from the last element and working towards the first.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-reduceright}
+ *
+ * For example:
+ * var a = ['a', 'b', 'c'];
+ * goog.array.reduceRight(a, function(r, v, i, arr) {return r + v;}, '');
+ * returns 'cba'
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, R, T, number, ?) : R} f The function to call for
+ * every element. This function
+ * takes 4 arguments (the function's previous result or the initial value,
+ * the value of the current array element, the current array index, and the
+ * array itself)
+ * function(previousValue, currentValue, index, array).
+ * @param {?} val The initial value to pass into the function on the first call.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @return {R} Object returned as a result of evaluating f repeatedly across the
+ * values of the array.
+ * @template T,S,R
+ */
+goog.array.reduceRight = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.reduceRight) ?
+ function(arr, f, val, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+ goog.asserts.assert(f != null);
+ if (opt_obj) {
+ f = goog.bind(f, opt_obj);
+ }
+ return Array.prototype.reduceRight.call(arr, f, val);
+ } :
+ function(arr, f, val, opt_obj) {
+ var rval = val;
+ goog.array.forEachRight(arr, function(val, index) {
+ rval = f.call(/** @type {?} */ (opt_obj), rval, val, index, arr);
+ });
+ return rval;
+ };
+
+
+/**
+ * Calls f for each element of an array. If any call returns true, some()
+ * returns true (without checking the remaining elements). If all calls
+ * return false, some() returns false.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-some}
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call for
+ * for every element. This function takes 3 arguments (the element, the
+ * index and the array) and should return a boolean.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @return {boolean} true if any element passes the test.
+ * @template T,S
+ */
+goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.some) ?
+ function(arr, f, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.some.call(arr, f, opt_obj);
+ } :
+ function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+
+/**
+ * Call f for each element of an array. If all calls return true, every()
+ * returns true. If any call returns false, every() returns false and
+ * does not continue to check the remaining elements.
+ *
+ * See {@link http://tinyurl.com/developer-mozilla-org-array-every}
+ *
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call for
+ * for every element. This function takes 3 arguments (the element, the
+ * index and the array) and should return a boolean.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within f.
+ * @return {boolean} false if any element fails the test.
+ * @template T,S
+ */
+goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES &&
+ (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.every) ?
+ function(arr, f, opt_obj) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.every.call(arr, f, opt_obj);
+ } :
+ function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2 && !f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+
+/**
+ * Counts the array elements that fulfill the predicate, i.e. for which the
+ * callback function returns true. Skips holes in the array.
+ *
+ * @param {!IArrayLike<T>|string} arr Array or array like object
+ * over which to iterate.
+ * @param {function(this: S, T, number, ?): boolean} f The function to call for
+ * every element. Takes 3 arguments (the element, the index and the array).
+ * @param {S=} opt_obj The object to be used as the value of 'this' within f.
+ * @return {number} The number of the matching elements.
+ * @template T,S
+ */
+goog.array.count = function(arr, f, opt_obj) {
+ var count = 0;
+ goog.array.forEach(arr, function(element, index, arr) {
+ if (f.call(/** @type {?} */ (opt_obj), element, index, arr)) {
+ ++count;
+ }
+ }, opt_obj);
+ return count;
+};
+
+
+/**
+ * Search an array for the first element that satisfies a given condition and
+ * return that element.
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call
+ * for every element. This function takes 3 arguments (the element, the
+ * index and the array) and should return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {T|null} The first array element that passes the test, or null if no
+ * element is found.
+ * @template T,S
+ */
+goog.array.find = function(arr, f, opt_obj) {
+ var i = goog.array.findIndex(arr, f, opt_obj);
+ return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];
+};
+
+
+/**
+ * Search an array for the first element that satisfies a given condition and
+ * return its index.
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call for
+ * every element. This function
+ * takes 3 arguments (the element, the index and the array) and should
+ * return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {number} The index of the first array element that passes the test,
+ * or -1 if no element is found.
+ * @template T,S
+ */
+goog.array.findIndex = function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = 0; i < l; i++) {
+ if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {
+ return i;
+ }
+ }
+ return -1;
+};
+
+
+/**
+ * Search an array (in reverse order) for the last element that satisfies a
+ * given condition and return that element.
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call
+ * for every element. This function
+ * takes 3 arguments (the element, the index and the array) and should
+ * return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {T|null} The last array element that passes the test, or null if no
+ * element is found.
+ * @template T,S
+ */
+goog.array.findRight = function(arr, f, opt_obj) {
+ var i = goog.array.findIndexRight(arr, f, opt_obj);
+ return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];
+};
+
+
+/**
+ * Search an array (in reverse order) for the last element that satisfies a
+ * given condition and return its index.
+ * @param {IArrayLike<T>|string} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call
+ * for every element. This function
+ * takes 3 arguments (the element, the index and the array) and should
+ * return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {number} The index of the last array element that passes the test,
+ * or -1 if no element is found.
+ * @template T,S
+ */
+goog.array.findIndexRight = function(arr, f, opt_obj) {
+ var l = arr.length; // must be fixed during loop... see docs
+ var arr2 = goog.isString(arr) ? arr.split('') : arr;
+ for (var i = l - 1; i >= 0; i--) {
+ if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {
+ return i;
+ }
+ }
+ return -1;
+};
+
+
+/**
+ * Whether the array contains the given object.
+ * @param {IArrayLike<?>|string} arr The array to test for the presence of the
+ * element.
+ * @param {*} obj The object for which to test.
+ * @return {boolean} true if obj is present.
+ */
+goog.array.contains = function(arr, obj) {
+ return goog.array.indexOf(arr, obj) >= 0;
+};
+
+
+/**
+ * Whether the array is empty.
+ * @param {IArrayLike<?>|string} arr The array to test.
+ * @return {boolean} true if empty.
+ */
+goog.array.isEmpty = function(arr) {
+ return arr.length == 0;
+};
+
+
+/**
+ * Clears the array.
+ * @param {IArrayLike<?>} arr Array or array like object to clear.
+ */
+goog.array.clear = function(arr) {
+ // For non real arrays we don't have the magic length so we delete the
+ // indices.
+ if (!goog.isArray(arr)) {
+ for (var i = arr.length - 1; i >= 0; i--) {
+ delete arr[i];
+ }
+ }
+ arr.length = 0;
+};
+
+
+/**
+ * Pushes an item into an array, if it's not already in the array.
+ * @param {Array<T>} arr Array into which to insert the item.
+ * @param {T} obj Value to add.
+ * @template T
+ */
+goog.array.insert = function(arr, obj) {
+ if (!goog.array.contains(arr, obj)) {
+ arr.push(obj);
+ }
+};
+
+
+/**
+ * Inserts an object at the given index of the array.
+ * @param {IArrayLike<?>} arr The array to modify.
+ * @param {*} obj The object to insert.
+ * @param {number=} opt_i The index at which to insert the object. If omitted,
+ * treated as 0. A negative index is counted from the end of the array.
+ */
+goog.array.insertAt = function(arr, obj, opt_i) {
+ goog.array.splice(arr, opt_i, 0, obj);
+};
+
+
+/**
+ * Inserts at the given index of the array, all elements of another array.
+ * @param {IArrayLike<?>} arr The array to modify.
+ * @param {IArrayLike<?>} elementsToAdd The array of elements to add.
+ * @param {number=} opt_i The index at which to insert the object. If omitted,
+ * treated as 0. A negative index is counted from the end of the array.
+ */
+goog.array.insertArrayAt = function(arr, elementsToAdd, opt_i) {
+ goog.partial(goog.array.splice, arr, opt_i, 0).apply(null, elementsToAdd);
+};
+
+
+/**
+ * Inserts an object into an array before a specified object.
+ * @param {Array<T>} arr The array to modify.
+ * @param {T} obj The object to insert.
+ * @param {T=} opt_obj2 The object before which obj should be inserted. If obj2
+ * is omitted or not found, obj is inserted at the end of the array.
+ * @template T
+ */
+goog.array.insertBefore = function(arr, obj, opt_obj2) {
+ var i;
+ if (arguments.length == 2 || (i = goog.array.indexOf(arr, opt_obj2)) < 0) {
+ arr.push(obj);
+ } else {
+ goog.array.insertAt(arr, obj, i);
+ }
+};
+
+
+/**
+ * Removes the first occurrence of a particular value from an array.
+ * @param {IArrayLike<T>} arr Array from which to remove
+ * value.
+ * @param {T} obj Object to remove.
+ * @return {boolean} True if an element was removed.
+ * @template T
+ */
+goog.array.remove = function(arr, obj) {
+ var i = goog.array.indexOf(arr, obj);
+ var rv;
+ if ((rv = i >= 0)) {
+ goog.array.removeAt(arr, i);
+ }
+ return rv;
+};
+
+
+/**
+ * Removes the last occurrence of a particular value from an array.
+ * @param {!IArrayLike<T>} arr Array from which to remove value.
+ * @param {T} obj Object to remove.
+ * @return {boolean} True if an element was removed.
+ * @template T
+ */
+goog.array.removeLast = function(arr, obj) {
+ var i = goog.array.lastIndexOf(arr, obj);
+ if (i >= 0) {
+ goog.array.removeAt(arr, i);
+ return true;
+ }
+ return false;
+};
+
+
+/**
+ * Removes from an array the element at index i
+ * @param {IArrayLike<?>} arr Array or array like object from which to
+ * remove value.
+ * @param {number} i The index to remove.
+ * @return {boolean} True if an element was removed.
+ */
+goog.array.removeAt = function(arr, i) {
+ goog.asserts.assert(arr.length != null);
+
+ // use generic form of splice
+ // splice returns the removed items and if successful the length of that
+ // will be 1
+ return Array.prototype.splice.call(arr, i, 1).length == 1;
+};
+
+
+/**
+ * Removes the first value that satisfies the given condition.
+ * @param {IArrayLike<T>} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call
+ * for every element. This function
+ * takes 3 arguments (the element, the index and the array) and should
+ * return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {boolean} True if an element was removed.
+ * @template T,S
+ */
+goog.array.removeIf = function(arr, f, opt_obj) {
+ var i = goog.array.findIndex(arr, f, opt_obj);
+ if (i >= 0) {
+ goog.array.removeAt(arr, i);
+ return true;
+ }
+ return false;
+};
+
+
+/**
+ * Removes all values that satisfy the given condition.
+ * @param {IArrayLike<T>} arr Array or array
+ * like object over which to iterate.
+ * @param {?function(this:S, T, number, ?) : boolean} f The function to call
+ * for every element. This function
+ * takes 3 arguments (the element, the index and the array) and should
+ * return a boolean.
+ * @param {S=} opt_obj An optional "this" context for the function.
+ * @return {number} The number of items removed
+ * @template T,S
+ */
+goog.array.removeAllIf = function(arr, f, opt_obj) {
+ var removedCount = 0;
+ goog.array.forEachRight(arr, function(val, index) {
+ if (f.call(/** @type {?} */ (opt_obj), val, index, arr)) {
+ if (goog.array.removeAt(arr, index)) {
+ removedCount++;
+ }
+ }
+ });
+ return removedCount;
+};
+
+
+/**
+ * Returns a new array that is the result of joining the arguments. If arrays
+ * are passed then their items are added, however, if non-arrays are passed they
+ * will be added to the return array as is.
+ *
+ * Note that ArrayLike objects will be added as is, rather than having their
+ * items added.
+ *
+ * goog.array.concat([1, 2], [3, 4]) -> [1, 2, 3, 4]
+ * goog.array.concat(0, [1, 2]) -> [0, 1, 2]
+ * goog.array.concat([1, 2], null) -> [1, 2, null]
+ *
+ * There is bug in all current versions of IE (6, 7 and 8) where arrays created
+ * in an iframe become corrupted soon (not immediately) after the iframe is
+ * destroyed. This is common if loading data via goog.net.IframeIo, for example.
+ * This corruption only affects the concat method which will start throwing
+ * Catastrophic Errors (#-2147418113).
+ *
+ * See http://endoflow.com/scratch/corrupted-arrays.html for a test case.
+ *
+ * Internally goog.array should use this, so that all methods will continue to
+ * work on these broken array objects.
+ *
+ * @param {...*} var_args Items to concatenate. Arrays will have each item
+ * added, while primitives and objects will be added as is.
+ * @return {!Array<?>} The new resultant array.
+ */
+goog.array.concat = function(var_args) {
+ return Array.prototype.concat.apply([], arguments);
+};
+
+
+/**
+ * Returns a new array that contains the contents of all the arrays passed.
+ * @param {...!Array<T>} var_args
+ * @return {!Array<T>}
+ * @template T
+ */
+goog.array.join = function(var_args) {
+ return Array.prototype.concat.apply([], arguments);
+};
+
+
+/**
+ * Converts an object to an array.
+ * @param {IArrayLike<T>|string} object The object to convert to an
+ * array.
+ * @return {!Array<T>} The object converted into an array. If object has a
+ * length property, every property indexed with a non-negative number
+ * less than length will be included in the result. If object does not
+ * have a length property, an empty array will be returned.
+ * @template T
+ */
+goog.array.toArray = function(object) {
+ var length = object.length;
+
+ // If length is not a number the following it false. This case is kept for
+ // backwards compatibility since there are callers that pass objects that are
+ // not array like.
+ if (length > 0) {
+ var rv = new Array(length);
+ for (var i = 0; i < length; i++) {
+ rv[i] = object[i];
+ }
+ return rv;
+ }
+ return [];
+};
+
+
+/**
+ * Does a shallow copy of an array.
+ * @param {IArrayLike<T>|string} arr Array or array-like object to
+ * clone.
+ * @return {!Array<T>} Clone of the input array.
+ * @template T
+ */
+goog.array.clone = goog.array.toArray;
+
+
+/**
+ * Extends an array with another array, element, or "array like" object.
+ * This function operates 'in-place', it does not create a new Array.
+ *
+ * Example:
+ * var a = [];
+ * goog.array.extend(a, [0, 1]);
+ * a; // [0, 1]
+ * goog.array.extend(a, 2);
+ * a; // [0, 1, 2]
+ *
+ * @param {Array<VALUE>} arr1 The array to modify.
+ * @param {...(Array<VALUE>|VALUE)} var_args The elements or arrays of elements
+ * to add to arr1.
+ * @template VALUE
+ */
+goog.array.extend = function(arr1, var_args) {
+ for (var i = 1; i < arguments.length; i++) {
+ var arr2 = arguments[i];
+ if (goog.isArrayLike(arr2)) {
+ var len1 = arr1.length || 0;
+ var len2 = arr2.length || 0;
+ arr1.length = len1 + len2;
+ for (var j = 0; j < len2; j++) {
+ arr1[len1 + j] = arr2[j];
+ }
+ } else {
+ arr1.push(arr2);
+ }
+ }
+};
+
+
+/**
+ * Adds or removes elements from an array. This is a generic version of Array
+ * splice. This means that it might work on other objects similar to arrays,
+ * such as the arguments object.
+ *
+ * @param {IArrayLike<T>} arr The array to modify.
+ * @param {number|undefined} index The index at which to start changing the
+ * array. If not defined, treated as 0.
+ * @param {number} howMany How many elements to remove (0 means no removal. A
+ * value below 0 is treated as zero and so is any other non number. Numbers
+ * are floored).
+ * @param {...T} var_args Optional, additional elements to insert into the
+ * array.
+ * @return {!Array<T>} the removed elements.
+ * @template T
+ */
+goog.array.splice = function(arr, index, howMany, var_args) {
+ goog.asserts.assert(arr.length != null);
+
+ return Array.prototype.splice.apply(arr, goog.array.slice(arguments, 1));
+};
+
+
+/**
+ * Returns a new array from a segment of an array. This is a generic version of
+ * Array slice. This means that it might work on other objects similar to
+ * arrays, such as the arguments object.
+ *
+ * @param {IArrayLike<T>|string} arr The array from
+ * which to copy a segment.
+ * @param {number} start The index of the first element to copy.
+ * @param {number=} opt_end The index after the last element to copy.
+ * @return {!Array<T>} A new array containing the specified segment of the
+ * original array.
+ * @template T
+ */
+goog.array.slice = function(arr, start, opt_end) {
+ goog.asserts.assert(arr.length != null);
+
+ // passing 1 arg to slice is not the same as passing 2 where the second is
+ // null or undefined (in that case the second argument is treated as 0).
+ // we could use slice on the arguments object and then use apply instead of
+ // testing the length
+ if (arguments.length <= 2) {
+ return Array.prototype.slice.call(arr, start);
+ } else {
+ return Array.prototype.slice.call(arr, start, opt_end);
+ }
+};
+
+
+/**
+ * Removes all duplicates from an array (retaining only the first
+ * occurrence of each array element). This function modifies the
+ * array in place and doesn't change the order of the non-duplicate items.
+ *
+ * For objects, duplicates are identified as having the same unique ID as
+ * defined by {@link goog.getUid}.
+ *
+ * Alternatively you can specify a custom hash function that returns a unique
+ * value for each item in the array it should consider unique.
+ *
+ * Runtime: N,
+ * Worstcase space: 2N (no dupes)
+ *
+ * @param {IArrayLike<T>} arr The array from which to remove
+ * duplicates.
+ * @param {Array=} opt_rv An optional array in which to return the results,
+ * instead of performing the removal inplace. If specified, the original
+ * array will remain unchanged.
+ * @param {function(T):string=} opt_hashFn An optional function to use to
+ * apply to every item in the array. This function should return a unique
+ * value for each item in the array it should consider unique.
+ * @template T
+ */
+goog.array.removeDuplicates = function(arr, opt_rv, opt_hashFn) {
+ var returnArray = opt_rv || arr;
+ var defaultHashFn = function(item) {
+ // Prefix each type with a single character representing the type to
+ // prevent conflicting keys (e.g. true and 'true').
+ return goog.isObject(item) ? 'o' + goog.getUid(item) :
+ (typeof item).charAt(0) + item;
+ };
+ var hashFn = opt_hashFn || defaultHashFn;
+
+ var seen = {}, cursorInsert = 0, cursorRead = 0;
+ while (cursorRead < arr.length) {
+ var current = arr[cursorRead++];
+ var key = hashFn(current);
+ if (!Object.prototype.hasOwnProperty.call(seen, key)) {
+ seen[key] = true;
+ returnArray[cursorInsert++] = current;
+ }
+ }
+ returnArray.length = cursorInsert;
+};
+
+
+/**
+ * Searches the specified array for the specified target using the binary
+ * search algorithm. If no opt_compareFn is specified, elements are compared
+ * using <code>goog.array.defaultCompare</code>, which compares the elements
+ * using the built in < and > operators. This will produce the expected
+ * behavior for homogeneous arrays of String(s) and Number(s). The array
+ * specified <b>must</b> be sorted in ascending order (as defined by the
+ * comparison function). If the array is not sorted, results are undefined.
+ * If the array contains multiple instances of the specified target value, any
+ * of these instances may be found.
+ *
+ * Runtime: O(log n)
+ *
+ * @param {IArrayLike<VALUE>} arr The array to be searched.
+ * @param {TARGET} target The sought value.
+ * @param {function(TARGET, VALUE): number=} opt_compareFn Optional comparison
+ * function by which the array is ordered. Should take 2 arguments to
+ * compare, and return a negative number, zero, or a positive number
+ * depending on whether the first argument is less than, equal to, or
+ * greater than the second.
+ * @return {number} Lowest index of the target value if found, otherwise
+ * (-(insertion point) - 1). The insertion point is where the value should
+ * be inserted into arr to preserve the sorted property. Return value >= 0
+ * iff target is found.
+ * @template TARGET, VALUE
+ */
+goog.array.binarySearch = function(arr, target, opt_compareFn) {
+ return goog.array.binarySearch_(
+ arr, opt_compareFn || goog.array.defaultCompare, false /* isEvaluator */,
+ target);
+};
+
+
+/**
+ * Selects an index in the specified array using the binary search algorithm.
+ * The evaluator receives an element and determines whether the desired index
+ * is before, at, or after it. The evaluator must be consistent (formally,
+ * goog.array.map(goog.array.map(arr, evaluator, opt_obj), goog.math.sign)
+ * must be monotonically non-increasing).
+ *
+ * Runtime: O(log n)
+ *
+ * @param {IArrayLike<VALUE>} arr The array to be searched.
+ * @param {function(this:THIS, VALUE, number, ?): number} evaluator
+ * Evaluator function that receives 3 arguments (the element, the index and
+ * the array). Should return a negative number, zero, or a positive number
+ * depending on whether the desired index is before, at, or after the
+ * element passed to it.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this'
+ * within evaluator.
+ * @return {number} Index of the leftmost element matched by the evaluator, if
+ * such exists; otherwise (-(insertion point) - 1). The insertion point is
+ * the index of the first element for which the evaluator returns negative,
+ * or arr.length if no such element exists. The return value is non-negative
+ * iff a match is found.
+ * @template THIS, VALUE
+ */
+goog.array.binarySelect = function(arr, evaluator, opt_obj) {
+ return goog.array.binarySearch_(
+ arr, evaluator, true /* isEvaluator */, undefined /* opt_target */,
+ opt_obj);
+};
+
+
+/**
+ * Implementation of a binary search algorithm which knows how to use both
+ * comparison functions and evaluators. If an evaluator is provided, will call
+ * the evaluator with the given optional data object, conforming to the
+ * interface defined in binarySelect. Otherwise, if a comparison function is
+ * provided, will call the comparison function against the given data object.
+ *
+ * This implementation purposefully does not use goog.bind or goog.partial for
+ * performance reasons.
+ *
+ * Runtime: O(log n)
+ *
+ * @param {IArrayLike<?>} arr The array to be searched.
+ * @param {function(?, ?, ?): number | function(?, ?): number} compareFn
+ * Either an evaluator or a comparison function, as defined by binarySearch
+ * and binarySelect above.
+ * @param {boolean} isEvaluator Whether the function is an evaluator or a
+ * comparison function.
+ * @param {?=} opt_target If the function is a comparison function, then
+ * this is the target to binary search for.
+ * @param {Object=} opt_selfObj If the function is an evaluator, this is an
+ * optional this object for the evaluator.
+ * @return {number} Lowest index of the target value if found, otherwise
+ * (-(insertion point) - 1). The insertion point is where the value should
+ * be inserted into arr to preserve the sorted property. Return value >= 0
+ * iff target is found.
+ * @private
+ */
+goog.array.binarySearch_ = function(
+ arr, compareFn, isEvaluator, opt_target, opt_selfObj) {
+ var left = 0; // inclusive
+ var right = arr.length; // exclusive
+ var found;
+ while (left < right) {
+ var middle = (left + right) >> 1;
+ var compareResult;
+ if (isEvaluator) {
+ compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr);
+ } else {
+ // NOTE(dimvar): To avoid this cast, we'd have to use function overloading
+ // for the type of binarySearch_, which the type system can't express yet.
+ compareResult = /** @type {function(?, ?): number} */ (compareFn)(
+ opt_target, arr[middle]);
+ }
+ if (compareResult > 0) {
+ left = middle + 1;
+ } else {
+ right = middle;
+ // We are looking for the lowest index so we can't return immediately.
+ found = !compareResult;
+ }
+ }
+ // left is the index if found, or the insertion point otherwise.
+ // ~left is a shorthand for -left - 1.
+ return found ? left : ~left;
+};
+
+
+/**
+ * Sorts the specified array into ascending order. If no opt_compareFn is
+ * specified, elements are compared using
+ * <code>goog.array.defaultCompare</code>, which compares the elements using
+ * the built in < and > operators. This will produce the expected behavior
+ * for homogeneous arrays of String(s) and Number(s), unlike the native sort,
+ * but will give unpredictable results for heterogeneous lists of strings and
+ * numbers with different numbers of digits.
+ *
+ * This sort is not guaranteed to be stable.
+ *
+ * Runtime: Same as <code>Array.prototype.sort</code>
+ *
+ * @param {Array<T>} arr The array to be sorted.
+ * @param {?function(T,T):number=} opt_compareFn Optional comparison
+ * function by which the
+ * array is to be ordered. Should take 2 arguments to compare, and return a
+ * negative number, zero, or a positive number depending on whether the
+ * first argument is less than, equal to, or greater than the second.
+ * @template T
+ */
+goog.array.sort = function(arr, opt_compareFn) {
+ // TODO(arv): Update type annotation since null is not accepted.
+ arr.sort(opt_compareFn || goog.array.defaultCompare);
+};
+
+
+/**
+ * Sorts the specified array into ascending order in a stable way. If no
+ * opt_compareFn is specified, elements are compared using
+ * <code>goog.array.defaultCompare</code>, which compares the elements using
+ * the built in < and > operators. This will produce the expected behavior
+ * for homogeneous arrays of String(s) and Number(s).
+ *
+ * Runtime: Same as <code>Array.prototype.sort</code>, plus an additional
+ * O(n) overhead of copying the array twice.
+ *
+ * @param {Array<T>} arr The array to be sorted.
+ * @param {?function(T, T): number=} opt_compareFn Optional comparison function
+ * by which the array is to be ordered. Should take 2 arguments to compare,
+ * and return a negative number, zero, or a positive number depending on
+ * whether the first argument is less than, equal to, or greater than the
+ * second.
+ * @template T
+ */
+goog.array.stableSort = function(arr, opt_compareFn) {
+ var compArr = new Array(arr.length);
+ for (var i = 0; i < arr.length; i++) {
+ compArr[i] = {index: i, value: arr[i]};
+ }
+ var valueCompareFn = opt_compareFn || goog.array.defaultCompare;
+ function stableCompareFn(obj1, obj2) {
+ return valueCompareFn(obj1.value, obj2.value) || obj1.index - obj2.index;
+ }
+ goog.array.sort(compArr, stableCompareFn);
+ for (var i = 0; i < arr.length; i++) {
+ arr[i] = compArr[i].value;
+ }
+};
+
+
+/**
+ * Sort the specified array into ascending order based on item keys
+ * returned by the specified key function.
+ * If no opt_compareFn is specified, the keys are compared in ascending order
+ * using <code>goog.array.defaultCompare</code>.
+ *
+ * Runtime: O(S(f(n)), where S is runtime of <code>goog.array.sort</code>
+ * and f(n) is runtime of the key function.
+ *
+ * @param {Array<T>} arr The array to be sorted.
+ * @param {function(T): K} keyFn Function taking array element and returning
+ * a key used for sorting this element.
+ * @param {?function(K, K): number=} opt_compareFn Optional comparison function
+ * by which the keys are to be ordered. Should take 2 arguments to compare,
+ * and return a negative number, zero, or a positive number depending on
+ * whether the first argument is less than, equal to, or greater than the
+ * second.
+ * @template T,K
+ */
+goog.array.sortByKey = function(arr, keyFn, opt_compareFn) {
+ var keyCompareFn = opt_compareFn || goog.array.defaultCompare;
+ goog.array.sort(
+ arr, function(a, b) { return keyCompareFn(keyFn(a), keyFn(b)); });
+};
+
+
+/**
+ * Sorts an array of objects by the specified object key and compare
+ * function. If no compare function is provided, the key values are
+ * compared in ascending order using <code>goog.array.defaultCompare</code>.
+ * This won't work for keys that get renamed by the compiler. So use
+ * {'foo': 1, 'bar': 2} rather than {foo: 1, bar: 2}.
+ * @param {Array<Object>} arr An array of objects to sort.
+ * @param {string} key The object key to sort by.
+ * @param {Function=} opt_compareFn The function to use to compare key
+ * values.
+ */
+goog.array.sortObjectsByKey = function(arr, key, opt_compareFn) {
+ goog.array.sortByKey(arr, function(obj) { return obj[key]; }, opt_compareFn);
+};
+
+
+/**
+ * Tells if the array is sorted.
+ * @param {!Array<T>} arr The array.
+ * @param {?function(T,T):number=} opt_compareFn Function to compare the
+ * array elements.
+ * Should take 2 arguments to compare, and return a negative number, zero,
+ * or a positive number depending on whether the first argument is less
+ * than, equal to, or greater than the second.
+ * @param {boolean=} opt_strict If true no equal elements are allowed.
+ * @return {boolean} Whether the array is sorted.
+ * @template T
+ */
+goog.array.isSorted = function(arr, opt_compareFn, opt_strict) {
+ var compare = opt_compareFn || goog.array.defaultCompare;
+ for (var i = 1; i < arr.length; i++) {
+ var compareResult = compare(arr[i - 1], arr[i]);
+ if (compareResult > 0 || compareResult == 0 && opt_strict) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * Compares two arrays for equality. Two arrays are considered equal if they
+ * have the same length and their corresponding elements are equal according to
+ * the comparison function.
+ *
+ * @param {IArrayLike<?>} arr1 The first array to compare.
+ * @param {IArrayLike<?>} arr2 The second array to compare.
+ * @param {Function=} opt_equalsFn Optional comparison function.
+ * Should take 2 arguments to compare, and return true if the arguments
+ * are equal. Defaults to {@link goog.array.defaultCompareEquality} which
+ * compares the elements using the built-in '===' operator.
+ * @return {boolean} Whether the two arrays are equal.
+ */
+goog.array.equals = function(arr1, arr2, opt_equalsFn) {
+ if (!goog.isArrayLike(arr1) || !goog.isArrayLike(arr2) ||
+ arr1.length != arr2.length) {
+ return false;
+ }
+ var l = arr1.length;
+ var equalsFn = opt_equalsFn || goog.array.defaultCompareEquality;
+ for (var i = 0; i < l; i++) {
+ if (!equalsFn(arr1[i], arr2[i])) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * 3-way array compare function.
+ * @param {!IArrayLike<VALUE>} arr1 The first array to
+ * compare.
+ * @param {!IArrayLike<VALUE>} arr2 The second array to
+ * compare.
+ * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison
+ * function by which the array is to be ordered. Should take 2 arguments to
+ * compare, and return a negative number, zero, or a positive number
+ * depending on whether the first argument is less than, equal to, or
+ * greater than the second.
+ * @return {number} Negative number, zero, or a positive number depending on
+ * whether the first argument is less than, equal to, or greater than the
+ * second.
+ * @template VALUE
+ */
+goog.array.compare3 = function(arr1, arr2, opt_compareFn) {
+ var compare = opt_compareFn || goog.array.defaultCompare;
+ var l = Math.min(arr1.length, arr2.length);
+ for (var i = 0; i < l; i++) {
+ var result = compare(arr1[i], arr2[i]);
+ if (result != 0) {
+ return result;
+ }
+ }
+ return goog.array.defaultCompare(arr1.length, arr2.length);
+};
+
+
+/**
+ * Compares its two arguments for order, using the built in < and >
+ * operators.
+ * @param {VALUE} a The first object to be compared.
+ * @param {VALUE} b The second object to be compared.
+ * @return {number} A negative number, zero, or a positive number as the first
+ * argument is less than, equal to, or greater than the second,
+ * respectively.
+ * @template VALUE
+ */
+goog.array.defaultCompare = function(a, b) {
+ return a > b ? 1 : a < b ? -1 : 0;
+};
+
+
+/**
+ * Compares its two arguments for inverse order, using the built in < and >
+ * operators.
+ * @param {VALUE} a The first object to be compared.
+ * @param {VALUE} b The second object to be compared.
+ * @return {number} A negative number, zero, or a positive number as the first
+ * argument is greater than, equal to, or less than the second,
+ * respectively.
+ * @template VALUE
+ */
+goog.array.inverseDefaultCompare = function(a, b) {
+ return -goog.array.defaultCompare(a, b);
+};
+
+
+/**
+ * Compares its two arguments for equality, using the built in === operator.
+ * @param {*} a The first object to compare.
+ * @param {*} b The second object to compare.
+ * @return {boolean} True if the two arguments are equal, false otherwise.
+ */
+goog.array.defaultCompareEquality = function(a, b) {
+ return a === b;
+};
+
+
+/**
+ * Inserts a value into a sorted array. The array is not modified if the
+ * value is already present.
+ * @param {IArrayLike<VALUE>} array The array to modify.
+ * @param {VALUE} value The object to insert.
+ * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison
+ * function by which the array is ordered. Should take 2 arguments to
+ * compare, and return a negative number, zero, or a positive number
+ * depending on whether the first argument is less than, equal to, or
+ * greater than the second.
+ * @return {boolean} True if an element was inserted.
+ * @template VALUE
+ */
+goog.array.binaryInsert = function(array, value, opt_compareFn) {
+ var index = goog.array.binarySearch(array, value, opt_compareFn);
+ if (index < 0) {
+ goog.array.insertAt(array, value, -(index + 1));
+ return true;
+ }
+ return false;
+};
+
+
+/**
+ * Removes a value from a sorted array.
+ * @param {!IArrayLike<VALUE>} array The array to modify.
+ * @param {VALUE} value The object to remove.
+ * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison
+ * function by which the array is ordered. Should take 2 arguments to
+ * compare, and return a negative number, zero, or a positive number
+ * depending on whether the first argument is less than, equal to, or
+ * greater than the second.
+ * @return {boolean} True if an element was removed.
+ * @template VALUE
+ */
+goog.array.binaryRemove = function(array, value, opt_compareFn) {
+ var index = goog.array.binarySearch(array, value, opt_compareFn);
+ return (index >= 0) ? goog.array.removeAt(array, index) : false;
+};
+
+
+/**
+ * Splits an array into disjoint buckets according to a splitting function.
+ * @param {Array<T>} array The array.
+ * @param {function(this:S, T, number, !Array<T>):?} sorter Function to call for
+ * every element. This takes 3 arguments (the element, the index and the
+ * array) and must return a valid object key (a string, number, etc), or
+ * undefined, if that object should not be placed in a bucket.
+ * @param {S=} opt_obj The object to be used as the value of 'this' within
+ * sorter.
+ * @return {!Object<!Array<T>>} An object, with keys being all of the unique
+ * return values of sorter, and values being arrays containing the items for
+ * which the splitter returned that key.
+ * @template T,S
+ */
+goog.array.bucket = function(array, sorter, opt_obj) {
+ var buckets = {};
+
+ for (var i = 0; i < array.length; i++) {
+ var value = array[i];
+ var key = sorter.call(/** @type {?} */ (opt_obj), value, i, array);
+ if (goog.isDef(key)) {
+ // Push the value to the right bucket, creating it if necessary.
+ var bucket = buckets[key] || (buckets[key] = []);
+ bucket.push(value);
+ }
+ }
+
+ return buckets;
+};
+
+
+/**
+ * Creates a new object built from the provided array and the key-generation
+ * function.
+ * @param {IArrayLike<T>} arr Array or array like object over
+ * which to iterate whose elements will be the values in the new object.
+ * @param {?function(this:S, T, number, ?) : string} keyFunc The function to
+ * call for every element. This function takes 3 arguments (the element, the
+ * index and the array) and should return a string that will be used as the
+ * key for the element in the new object. If the function returns the same
+ * key for more than one element, the value for that key is
+ * implementation-defined.
+ * @param {S=} opt_obj The object to be used as the value of 'this'
+ * within keyFunc.
+ * @return {!Object<T>} The new object.
+ * @template T,S
+ */
+goog.array.toObject = function(arr, keyFunc, opt_obj) {
+ var ret = {};
+ goog.array.forEach(arr, function(element, index) {
+ ret[keyFunc.call(/** @type {?} */ (opt_obj), element, index, arr)] =
+ element;
+ });
+ return ret;
+};
+
+
+/**
+ * Creates a range of numbers in an arithmetic progression.
+ *
+ * Range takes 1, 2, or 3 arguments:
+ * <pre>
+ * range(5) is the same as range(0, 5, 1) and produces [0, 1, 2, 3, 4]
+ * range(2, 5) is the same as range(2, 5, 1) and produces [2, 3, 4]
+ * range(-2, -5, -1) produces [-2, -3, -4]
+ * range(-2, -5, 1) produces [], since stepping by 1 wouldn't ever reach -5.
+ * </pre>
+ *
+ * @param {number} startOrEnd The starting value of the range if an end argument
+ * is provided. Otherwise, the start value is 0, and this is the end value.
+ * @param {number=} opt_end The optional end value of the range.
+ * @param {number=} opt_step The step size between range values. Defaults to 1
+ * if opt_step is undefined or 0.
+ * @return {!Array<number>} An array of numbers for the requested range. May be
+ * an empty array if adding the step would not converge toward the end
+ * value.
+ */
+goog.array.range = function(startOrEnd, opt_end, opt_step) {
+ var array = [];
+ var start = 0;
+ var end = startOrEnd;
+ var step = opt_step || 1;
+ if (opt_end !== undefined) {
+ start = startOrEnd;
+ end = opt_end;
+ }
+
+ if (step * (end - start) < 0) {
+ // Sign mismatch: start + step will never reach the end value.
+ return [];
+ }
+
+ if (step > 0) {
+ for (var i = start; i < end; i += step) {
+ array.push(i);
+ }
+ } else {
+ for (var i = start; i > end; i += step) {
+ array.push(i);
+ }
+ }
+ return array;
+};
+
+
+/**
+ * Returns an array consisting of the given value repeated N times.
+ *
+ * @param {VALUE} value The value to repeat.
+ * @param {number} n The repeat count.
+ * @return {!Array<VALUE>} An array with the repeated value.
+ * @template VALUE
+ */
+goog.array.repeat = function(value, n) {
+ var array = [];
+ for (var i = 0; i < n; i++) {
+ array[i] = value;
+ }
+ return array;
+};
+
+
+/**
+ * Returns an array consisting of every argument with all arrays
+ * expanded in-place recursively.
+ *
+ * @param {...*} var_args The values to flatten.
+ * @return {!Array<?>} An array containing the flattened values.
+ */
+goog.array.flatten = function(var_args) {
+ var CHUNK_SIZE = 8192;
+
+ var result = [];
+ for (var i = 0; i < arguments.length; i++) {
+ var element = arguments[i];
+ if (goog.isArray(element)) {
+ for (var c = 0; c < element.length; c += CHUNK_SIZE) {
+ var chunk = goog.array.slice(element, c, c + CHUNK_SIZE);
+ var recurseResult = goog.array.flatten.apply(null, chunk);
+ for (var r = 0; r < recurseResult.length; r++) {
+ result.push(recurseResult[r]);
+ }
+ }
+ } else {
+ result.push(element);
+ }
+ }
+ return result;
+};
+
+
+/**
+ * Rotates an array in-place. After calling this method, the element at
+ * index i will be the element previously at index (i - n) %
+ * array.length, for all values of i between 0 and array.length - 1,
+ * inclusive.
+ *
+ * For example, suppose list comprises [t, a, n, k, s]. After invoking
+ * rotate(array, 1) (or rotate(array, -4)), array will comprise [s, t, a, n, k].
+ *
+ * @param {!Array<T>} array The array to rotate.
+ * @param {number} n The amount to rotate.
+ * @return {!Array<T>} The array.
+ * @template T
+ */
+goog.array.rotate = function(array, n) {
+ goog.asserts.assert(array.length != null);
+
+ if (array.length) {
+ n %= array.length;
+ if (n > 0) {
+ Array.prototype.unshift.apply(array, array.splice(-n, n));
+ } else if (n < 0) {
+ Array.prototype.push.apply(array, array.splice(0, -n));
+ }
+ }
+ return array;
+};
+
+
+/**
+ * Moves one item of an array to a new position keeping the order of the rest
+ * of the items. Example use case: keeping a list of JavaScript objects
+ * synchronized with the corresponding list of DOM elements after one of the
+ * elements has been dragged to a new position.
+ * @param {!IArrayLike<?>} arr The array to modify.
+ * @param {number} fromIndex Index of the item to move between 0 and
+ * {@code arr.length - 1}.
+ * @param {number} toIndex Target index between 0 and {@code arr.length - 1}.
+ */
+goog.array.moveItem = function(arr, fromIndex, toIndex) {
+ goog.asserts.assert(fromIndex >= 0 && fromIndex < arr.length);
+ goog.asserts.assert(toIndex >= 0 && toIndex < arr.length);
+ // Remove 1 item at fromIndex.
+ var removedItems = Array.prototype.splice.call(arr, fromIndex, 1);
+ // Insert the removed item at toIndex.
+ Array.prototype.splice.call(arr, toIndex, 0, removedItems[0]);
+ // We don't use goog.array.insertAt and goog.array.removeAt, because they're
+ // significantly slower than splice.
+};
+
+
+/**
+ * Creates a new array for which the element at position i is an array of the
+ * ith element of the provided arrays. The returned array will only be as long
+ * as the shortest array provided; additional values are ignored. For example,
+ * the result of zipping [1, 2] and [3, 4, 5] is [[1,3], [2, 4]].
+ *
+ * This is similar to the zip() function in Python. See {@link
+ * http://docs.python.org/library/functions.html#zip}
+ *
+ * @param {...!IArrayLike<?>} var_args Arrays to be combined.
+ * @return {!Array<!Array<?>>} A new array of arrays created from
+ * provided arrays.
+ */
+goog.array.zip = function(var_args) {
+ if (!arguments.length) {
+ return [];
+ }
+ var result = [];
+ var minLen = arguments[0].length;
+ for (var i = 1; i < arguments.length; i++) {
+ if (arguments[i].length < minLen) {
+ minLen = arguments[i].length;
+ }
+ }
+ for (var i = 0; i < minLen; i++) {
+ var value = [];
+ for (var j = 0; j < arguments.length; j++) {
+ value.push(arguments[j][i]);
+ }
+ result.push(value);
+ }
+ return result;
+};
+
+
+/**
+ * Shuffles the values in the specified array using the Fisher-Yates in-place
+ * shuffle (also known as the Knuth Shuffle). By default, calls Math.random()
+ * and so resets the state of that random number generator. Similarly, may reset
+ * the state of the any other specified random number generator.
+ *
+ * Runtime: O(n)
+ *
+ * @param {!Array<?>} arr The array to be shuffled.
+ * @param {function():number=} opt_randFn Optional random function to use for
+ * shuffling.
+ * Takes no arguments, and returns a random number on the interval [0, 1).
+ * Defaults to Math.random() using JavaScript's built-in Math library.
+ */
+goog.array.shuffle = function(arr, opt_randFn) {
+ var randFn = opt_randFn || Math.random;
+
+ for (var i = arr.length - 1; i > 0; i--) {
+ // Choose a random array index in [0, i] (inclusive with i).
+ var j = Math.floor(randFn() * (i + 1));
+
+ var tmp = arr[i];
+ arr[i] = arr[j];
+ arr[j] = tmp;
+ }
+};
+
+
+/**
+ * Returns a new array of elements from arr, based on the indexes of elements
+ * provided by index_arr. For example, the result of index copying
+ * ['a', 'b', 'c'] with index_arr [1,0,0,2] is ['b', 'a', 'a', 'c'].
+ *
+ * @param {!Array<T>} arr The array to get a indexed copy from.
+ * @param {!Array<number>} index_arr An array of indexes to get from arr.
+ * @return {!Array<T>} A new array of elements from arr in index_arr order.
+ * @template T
+ */
+goog.array.copyByIndex = function(arr, index_arr) {
+ var result = [];
+ goog.array.forEach(index_arr, function(index) { result.push(arr[index]); });
+ return result;
+};
+
+
+/**
+ * Maps each element of the input array into zero or more elements of the output
+ * array.
+ *
+ * @param {!IArrayLike<VALUE>|string} arr Array or array like object
+ * over which to iterate.
+ * @param {function(this:THIS, VALUE, number, ?): !Array<RESULT>} f The function
+ * to call for every element. This function takes 3 arguments (the element,
+ * the index and the array) and should return an array. The result will be
+ * used to extend a new array.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within f.
+ * @return {!Array<RESULT>} a new array with the concatenation of all arrays
+ * returned from f.
+ * @template THIS, VALUE, RESULT
+ */
+goog.array.concatMap = function(arr, f, opt_obj) {
+ return goog.array.concat.apply([], goog.array.map(arr, f, opt_obj));
+};
diff --git a/src/http/static/viz/2/goog/asserts/asserts.js b/src/http/static/viz/2/goog/asserts/asserts.js
new file mode 100644
index 0000000..1f4b653
--- /dev/null
+++ b/src/http/static/viz/2/goog/asserts/asserts.js
@@ -0,0 +1,369 @@
+// Copyright 2008 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities to check the preconditions, postconditions and
+ * invariants runtime.
+ *
+ * Methods in this package should be given special treatment by the compiler
+ * for type-inference. For example, <code>goog.asserts.assert(foo)</code>
+ * will restrict <code>foo</code> to a truthy value.
+ *
+ * The compiler has an option to disable asserts. So code like:
+ * <code>
+ * var x = goog.asserts.assert(foo()); goog.asserts.assert(bar());
+ * </code>
+ * will be transformed into:
+ * <code>
+ * var x = foo();
+ * </code>
+ * The compiler will leave in foo() (because its return value is used),
+ * but it will remove bar() because it assumes it does not have side-effects.
+ *
+ * @author agrieve@google.com (Andrew Grieve)
+ */
+
+goog.provide('goog.asserts');
+goog.provide('goog.asserts.AssertionError');
+
+goog.require('goog.debug.Error');
+goog.require('goog.dom.NodeType');
+goog.require('goog.string');
+
+
+/**
+ * @define {boolean} Whether to strip out asserts or to leave them in.
+ */
+goog.define('goog.asserts.ENABLE_ASSERTS', goog.DEBUG);
+
+
+
+/**
+ * Error object for failed assertions.
+ * @param {string} messagePattern The pattern that was used to form message.
+ * @param {!Array<*>} messageArgs The items to substitute into the pattern.
+ * @constructor
+ * @extends {goog.debug.Error}
+ * @final
+ */
+goog.asserts.AssertionError = function(messagePattern, messageArgs) {
+ messageArgs.unshift(messagePattern);
+ goog.debug.Error.call(this, goog.string.subs.apply(null, messageArgs));
+ // Remove the messagePattern afterwards to avoid permanently modifying the
+ // passed in array.
+ messageArgs.shift();
+
+ /**
+ * The message pattern used to format the error message. Error handlers can
+ * use this to uniquely identify the assertion.
+ * @type {string}
+ */
+ this.messagePattern = messagePattern;
+};
+goog.inherits(goog.asserts.AssertionError, goog.debug.Error);
+
+
+/** @override */
+goog.asserts.AssertionError.prototype.name = 'AssertionError';
+
+
+/**
+ * The default error handler.
+ * @param {!goog.asserts.AssertionError} e The exception to be handled.
+ */
+goog.asserts.DEFAULT_ERROR_HANDLER = function(e) {
+ throw e;
+};
+
+
+/**
+ * The handler responsible for throwing or logging assertion errors.
+ * @private {function(!goog.asserts.AssertionError)}
+ */
+goog.asserts.errorHandler_ = goog.asserts.DEFAULT_ERROR_HANDLER;
+
+
+/**
+ * Throws an exception with the given message and "Assertion failed" prefixed
+ * onto it.
+ * @param {string} defaultMessage The message to use if givenMessage is empty.
+ * @param {Array<*>} defaultArgs The substitution arguments for defaultMessage.
+ * @param {string|undefined} givenMessage Message supplied by the caller.
+ * @param {Array<*>} givenArgs The substitution arguments for givenMessage.
+ * @throws {goog.asserts.AssertionError} When the value is not a number.
+ * @private
+ */
+goog.asserts.doAssertFailure_ = function(
+ defaultMessage, defaultArgs, givenMessage, givenArgs) {
+ var message = 'Assertion failed';
+ if (givenMessage) {
+ message += ': ' + givenMessage;
+ var args = givenArgs;
+ } else if (defaultMessage) {
+ message += ': ' + defaultMessage;
+ args = defaultArgs;
+ }
+ // The '' + works around an Opera 10 bug in the unit tests. Without it,
+ // a stack trace is added to var message above. With this, a stack trace is
+ // not added until this line (it causes the extra garbage to be added after
+ // the assertion message instead of in the middle of it).
+ var e = new goog.asserts.AssertionError('' + message, args || []);
+ goog.asserts.errorHandler_(e);
+};
+
+
+/**
+ * Sets a custom error handler that can be used to customize the behavior of
+ * assertion failures, for example by turning all assertion failures into log
+ * messages.
+ * @param {function(!goog.asserts.AssertionError)} errorHandler
+ */
+goog.asserts.setErrorHandler = function(errorHandler) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ goog.asserts.errorHandler_ = errorHandler;
+ }
+};
+
+
+/**
+ * Checks if the condition evaluates to true if goog.asserts.ENABLE_ASSERTS is
+ * true.
+ * @template T
+ * @param {T} condition The condition to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {T} The value of the condition.
+ * @throws {goog.asserts.AssertionError} When the condition evaluates to false.
+ */
+goog.asserts.assert = function(condition, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !condition) {
+ goog.asserts.doAssertFailure_(
+ '', null, opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return condition;
+};
+
+
+/**
+ * Fails if goog.asserts.ENABLE_ASSERTS is true. This function is useful in case
+ * when we want to add a check in the unreachable area like switch-case
+ * statement:
+ *
+ * <pre>
+ * switch(type) {
+ * case FOO: doSomething(); break;
+ * case BAR: doSomethingElse(); break;
+ * default: goog.asserts.fail('Unrecognized type: ' + type);
+ * // We have only 2 types - "default:" section is unreachable code.
+ * }
+ * </pre>
+ *
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @throws {goog.asserts.AssertionError} Failure.
+ */
+goog.asserts.fail = function(opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ goog.asserts.errorHandler_(
+ new goog.asserts.AssertionError(
+ 'Failure' + (opt_message ? ': ' + opt_message : ''),
+ Array.prototype.slice.call(arguments, 1)));
+ }
+};
+
+
+/**
+ * Checks if the value is a number if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {number} The value, guaranteed to be a number when asserts enabled.
+ * @throws {goog.asserts.AssertionError} When the value is not a number.
+ */
+goog.asserts.assertNumber = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isNumber(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected number but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {number} */ (value);
+};
+
+
+/**
+ * Checks if the value is a string if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {string} The value, guaranteed to be a string when asserts enabled.
+ * @throws {goog.asserts.AssertionError} When the value is not a string.
+ */
+goog.asserts.assertString = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isString(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected string but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {string} */ (value);
+};
+
+
+/**
+ * Checks if the value is a function if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {!Function} The value, guaranteed to be a function when asserts
+ * enabled.
+ * @throws {goog.asserts.AssertionError} When the value is not a function.
+ */
+goog.asserts.assertFunction = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isFunction(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected function but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {!Function} */ (value);
+};
+
+
+/**
+ * Checks if the value is an Object if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {!Object} The value, guaranteed to be a non-null object.
+ * @throws {goog.asserts.AssertionError} When the value is not an object.
+ */
+goog.asserts.assertObject = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isObject(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected object but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {!Object} */ (value);
+};
+
+
+/**
+ * Checks if the value is an Array if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {!Array<?>} The value, guaranteed to be a non-null array.
+ * @throws {goog.asserts.AssertionError} When the value is not an array.
+ */
+goog.asserts.assertArray = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isArray(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected array but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {!Array<?>} */ (value);
+};
+
+
+/**
+ * Checks if the value is a boolean if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {boolean} The value, guaranteed to be a boolean when asserts are
+ * enabled.
+ * @throws {goog.asserts.AssertionError} When the value is not a boolean.
+ */
+goog.asserts.assertBoolean = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !goog.isBoolean(value)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected boolean but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {boolean} */ (value);
+};
+
+
+/**
+ * Checks if the value is a DOM Element if goog.asserts.ENABLE_ASSERTS is true.
+ * @param {*} value The value to check.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @return {!Element} The value, likely to be a DOM Element when asserts are
+ * enabled.
+ * @throws {goog.asserts.AssertionError} When the value is not an Element.
+ */
+goog.asserts.assertElement = function(value, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS &&
+ (!goog.isObject(value) || value.nodeType != goog.dom.NodeType.ELEMENT)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected Element but got %s: %s.', [goog.typeOf(value), value],
+ opt_message, Array.prototype.slice.call(arguments, 2));
+ }
+ return /** @type {!Element} */ (value);
+};
+
+
+/**
+ * Checks if the value is an instance of the user-defined type if
+ * goog.asserts.ENABLE_ASSERTS is true.
+ *
+ * The compiler may tighten the type returned by this function.
+ *
+ * @param {?} value The value to check.
+ * @param {function(new: T, ...)} type A user-defined constructor.
+ * @param {string=} opt_message Error message in case of failure.
+ * @param {...*} var_args The items to substitute into the failure message.
+ * @throws {goog.asserts.AssertionError} When the value is not an instance of
+ * type.
+ * @return {T}
+ * @template T
+ */
+goog.asserts.assertInstanceof = function(value, type, opt_message, var_args) {
+ if (goog.asserts.ENABLE_ASSERTS && !(value instanceof type)) {
+ goog.asserts.doAssertFailure_(
+ 'Expected instanceof %s but got %s.',
+ [goog.asserts.getType_(type), goog.asserts.getType_(value)],
+ opt_message, Array.prototype.slice.call(arguments, 3));
+ }
+ return value;
+};
+
+
+/**
+ * Checks that no enumerable keys are present in Object.prototype. Such keys
+ * would break most code that use {@code for (var ... in ...)} loops.
+ */
+goog.asserts.assertObjectPrototypeIsIntact = function() {
+ for (var key in Object.prototype) {
+ goog.asserts.fail(key + ' should not be enumerable in Object.prototype.');
+ }
+};
+
+
+/**
+ * Returns the type of a value. If a constructor is passed, and a suitable
+ * string cannot be found, 'unknown type name' will be returned.
+ * @param {*} value A constructor, object, or primitive.
+ * @return {string} The best display name for the value, or 'unknown type name'.
+ * @private
+ */
+goog.asserts.getType_ = function(value) {
+ if (value instanceof Function) {
+ return value.displayName || value.name || 'unknown type name';
+ } else if (value instanceof Object) {
+ return value.constructor.displayName || value.constructor.name ||
+ Object.prototype.toString.call(value);
+ } else {
+ return value === null ? 'null' : typeof value;
+ }
+};
diff --git a/src/http/static/viz/2/goog/base.js b/src/http/static/viz/2/goog/base.js
new file mode 100644
index 0000000..46b2f09
--- /dev/null
+++ b/src/http/static/viz/2/goog/base.js
@@ -0,0 +1,2921 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Bootstrap for the Google JS Library (Closure).
+ *
+ * In uncompiled mode base.js will attempt to load Closure's deps file, unless
+ * the global <code>CLOSURE_NO_DEPS</code> is set to true. This allows projects
+ * to include their own deps file(s) from different locations.
+ *
+ * Avoid including base.js more than once. This is strictly discouraged and not
+ * supported. goog.require(...) won't work properly in that case.
+ *
+ * @provideGoog
+ */
+
+
+/**
+ * @define {boolean} Overridden to true by the compiler.
+ */
+var COMPILED = false;
+
+
+/**
+ * Base namespace for the Closure library. Checks to see goog is already
+ * defined in the current scope before assigning to prevent clobbering if
+ * base.js is loaded more than once.
+ *
+ * @const
+ */
+var goog = goog || {};
+
+
+/**
+ * Reference to the global context. In most cases this will be 'window'.
+ */
+goog.global = this;
+
+
+/**
+ * A hook for overriding the define values in uncompiled mode.
+ *
+ * In uncompiled mode, {@code CLOSURE_UNCOMPILED_DEFINES} may be defined before
+ * loading base.js. If a key is defined in {@code CLOSURE_UNCOMPILED_DEFINES},
+ * {@code goog.define} will use the value instead of the default value. This
+ * allows flags to be overwritten without compilation (this is normally
+ * accomplished with the compiler's "define" flag).
+ *
+ * Example:
+ * <pre>
+ * var CLOSURE_UNCOMPILED_DEFINES = {'goog.DEBUG': false};
+ * </pre>
+ *
+ * @type {Object<string, (string|number|boolean)>|undefined}
+ */
+goog.global.CLOSURE_UNCOMPILED_DEFINES;
+
+
+/**
+ * A hook for overriding the define values in uncompiled or compiled mode,
+ * like CLOSURE_UNCOMPILED_DEFINES but effective in compiled code. In
+ * uncompiled code CLOSURE_UNCOMPILED_DEFINES takes precedence.
+ *
+ * Also unlike CLOSURE_UNCOMPILED_DEFINES the values must be number, boolean or
+ * string literals or the compiler will emit an error.
+ *
+ * While any @define value may be set, only those set with goog.define will be
+ * effective for uncompiled code.
+ *
+ * Example:
+ * <pre>
+ * var CLOSURE_DEFINES = {'goog.DEBUG': false} ;
+ * </pre>
+ *
+ * @type {Object<string, (string|number|boolean)>|undefined}
+ */
+goog.global.CLOSURE_DEFINES;
+
+
+/**
+ * Returns true if the specified value is not undefined.
+ *
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is defined.
+ */
+goog.isDef = function(val) {
+ // void 0 always evaluates to undefined and hence we do not need to depend on
+ // the definition of the global variable named 'undefined'.
+ return val !== void 0;
+};
+
+/**
+ * Returns true if the specified value is a string.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is a string.
+ */
+goog.isString = function(val) {
+ return typeof val == 'string';
+};
+
+
+/**
+ * Returns true if the specified value is a boolean.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is boolean.
+ */
+goog.isBoolean = function(val) {
+ return typeof val == 'boolean';
+};
+
+
+/**
+ * Returns true if the specified value is a number.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is a number.
+ */
+goog.isNumber = function(val) {
+ return typeof val == 'number';
+};
+
+
+/**
+ * Builds an object structure for the provided namespace path, ensuring that
+ * names that already exist are not overwritten. For example:
+ * "a.b.c" -> a = {};a.b={};a.b.c={};
+ * Used by goog.provide and goog.exportSymbol.
+ * @param {string} name name of the object that this file defines.
+ * @param {*=} opt_object the object to expose at the end of the path.
+ * @param {Object=} opt_objectToExportTo The object to add the path to; default
+ * is `goog.global`.
+ * @private
+ */
+goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) {
+ var parts = name.split('.');
+ var cur = opt_objectToExportTo || goog.global;
+
+ // Internet Explorer exhibits strange behavior when throwing errors from
+ // methods externed in this manner. See the testExportSymbolExceptions in
+ // base_test.html for an example.
+ if (!(parts[0] in cur) && cur.execScript) {
+ cur.execScript('var ' + parts[0]);
+ }
+
+ for (var part; parts.length && (part = parts.shift());) {
+ if (!parts.length && goog.isDef(opt_object)) {
+ // last part and we have an object; use it
+ cur[part] = opt_object;
+ } else if (cur[part] && cur[part] !== Object.prototype[part]) {
+ cur = cur[part];
+ } else {
+ cur = cur[part] = {};
+ }
+ }
+};
+
+
+/**
+ * Defines a named value. In uncompiled mode, the value is retrieved from
+ * CLOSURE_DEFINES or CLOSURE_UNCOMPILED_DEFINES if the object is defined and
+ * has the property specified, and otherwise used the defined defaultValue.
+ * When compiled the default can be overridden using the compiler
+ * options or the value set in the CLOSURE_DEFINES object.
+ *
+ * @param {string} name The distinguished name to provide.
+ * @param {string|number|boolean} defaultValue
+ */
+goog.define = function(name, defaultValue) {
+ var value = defaultValue;
+ if (!COMPILED) {
+ if (goog.global.CLOSURE_UNCOMPILED_DEFINES &&
+ // Anti DOM-clobbering runtime check (b/37736576).
+ /** @type {?} */ (goog.global.CLOSURE_UNCOMPILED_DEFINES).nodeType ===
+ undefined &&
+ Object.prototype.hasOwnProperty.call(
+ goog.global.CLOSURE_UNCOMPILED_DEFINES, name)) {
+ value = goog.global.CLOSURE_UNCOMPILED_DEFINES[name];
+ } else if (
+ goog.global.CLOSURE_DEFINES &&
+ // Anti DOM-clobbering runtime check (b/37736576).
+ /** @type {?} */ (goog.global.CLOSURE_DEFINES).nodeType === undefined &&
+ Object.prototype.hasOwnProperty.call(
+ goog.global.CLOSURE_DEFINES, name)) {
+ value = goog.global.CLOSURE_DEFINES[name];
+ }
+ }
+ goog.exportPath_(name, value);
+};
+
+
+/**
+ * @define {boolean} DEBUG is provided as a convenience so that debugging code
+ * that should not be included in a production. It can be easily stripped
+ * by specifying --define goog.DEBUG=false to the Closure Compiler aka
+ * JSCompiler. For example, most toString() methods should be declared inside an
+ * "if (goog.DEBUG)" conditional because they are generally used for debugging
+ * purposes and it is difficult for the JSCompiler to statically determine
+ * whether they are used.
+ */
+goog.define('goog.DEBUG', true);
+
+
+/**
+ * @define {string} LOCALE defines the locale being used for compilation. It is
+ * used to select locale specific data to be compiled in js binary. BUILD rule
+ * can specify this value by "--define goog.LOCALE=<locale_name>" as a compiler
+ * option.
+ *
+ * Take into account that the locale code format is important. You should use
+ * the canonical Unicode format with hyphen as a delimiter. Language must be
+ * lowercase, Language Script - Capitalized, Region - UPPERCASE.
+ * There are few examples: pt-BR, en, en-US, sr-Latin-BO, zh-Hans-CN.
+ *
+ * See more info about locale codes here:
+ * http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers
+ *
+ * For language codes you should use values defined by ISO 693-1. See it here
+ * http://www.w3.org/WAI/ER/IG/ert/iso639.htm. There is only one exception from
+ * this rule: the Hebrew language. For legacy reasons the old code (iw) should
+ * be used instead of the new code (he).
+ *
+ */
+goog.define('goog.LOCALE', 'en'); // default to en
+
+
+/**
+ * @define {boolean} Whether this code is running on trusted sites.
+ *
+ * On untrusted sites, several native functions can be defined or overridden by
+ * external libraries like Prototype, Datejs, and JQuery and setting this flag
+ * to false forces closure to use its own implementations when possible.
+ *
+ * If your JavaScript can be loaded by a third party site and you are wary about
+ * relying on non-standard implementations, specify
+ * "--define goog.TRUSTED_SITE=false" to the compiler.
+ */
+goog.define('goog.TRUSTED_SITE', true);
+
+
+/**
+ * @define {boolean} Whether a project is expected to be running in strict mode.
+ *
+ * This define can be used to trigger alternate implementations compatible with
+ * running in EcmaScript Strict mode or warn about unavailable functionality.
+ * @see https://goo.gl/PudQ4y
+ *
+ */
+goog.define('goog.STRICT_MODE_COMPATIBLE', false);
+
+
+/**
+ * @define {boolean} Whether code that calls {@link goog.setTestOnly} should
+ * be disallowed in the compilation unit.
+ */
+goog.define('goog.DISALLOW_TEST_ONLY_CODE', COMPILED && !goog.DEBUG);
+
+
+/**
+ * @define {boolean} Whether to use a Chrome app CSP-compliant method for
+ * loading scripts via goog.require. @see appendScriptSrcNode_.
+ */
+goog.define('goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING', false);
+
+
+/**
+ * Defines a namespace in Closure.
+ *
+ * A namespace may only be defined once in a codebase. It may be defined using
+ * goog.provide() or goog.module().
+ *
+ * The presence of one or more goog.provide() calls in a file indicates
+ * that the file defines the given objects/namespaces.
+ * Provided symbols must not be null or undefined.
+ *
+ * In addition, goog.provide() creates the object stubs for a namespace
+ * (for example, goog.provide("goog.foo.bar") will create the object
+ * goog.foo.bar if it does not already exist).
+ *
+ * Build tools also scan for provide/require/module statements
+ * to discern dependencies, build dependency files (see deps.js), etc.
+ *
+ * @see goog.require
+ * @see goog.module
+ * @param {string} name Namespace provided by this file in the form
+ * "goog.package.part".
+ */
+goog.provide = function(name) {
+ if (goog.isInModuleLoader_()) {
+ throw Error('goog.provide can not be used within a goog.module.');
+ }
+ if (!COMPILED) {
+ // Ensure that the same namespace isn't provided twice.
+ // A goog.module/goog.provide maps a goog.require to a specific file
+ if (goog.isProvided_(name)) {
+ throw Error('Namespace "' + name + '" already declared.');
+ }
+ }
+
+ goog.constructNamespace_(name);
+};
+
+
+/**
+ * @param {string} name Namespace provided by this file in the form
+ * "goog.package.part".
+ * @param {Object=} opt_obj The object to embed in the namespace.
+ * @private
+ */
+goog.constructNamespace_ = function(name, opt_obj) {
+ if (!COMPILED) {
+ delete goog.implicitNamespaces_[name];
+
+ var namespace = name;
+ while ((namespace = namespace.substring(0, namespace.lastIndexOf('.')))) {
+ if (goog.getObjectByName(namespace)) {
+ break;
+ }
+ goog.implicitNamespaces_[namespace] = true;
+ }
+ }
+
+ goog.exportPath_(name, opt_obj);
+};
+
+
+/**
+ * Module identifier validation regexp.
+ * Note: This is a conservative check, it is very possible to be more lenient,
+ * the primary exclusion here is "/" and "\" and a leading ".", these
+ * restrictions are intended to leave the door open for using goog.require
+ * with relative file paths rather than module identifiers.
+ * @private
+ */
+goog.VALID_MODULE_RE_ = /^[a-zA-Z_$][a-zA-Z0-9._$]*$/;
+
+
+/**
+ * Defines a module in Closure.
+ *
+ * Marks that this file must be loaded as a module and claims the namespace.
+ *
+ * A namespace may only be defined once in a codebase. It may be defined using
+ * goog.provide() or goog.module().
+ *
+ * goog.module() has three requirements:
+ * - goog.module may not be used in the same file as goog.provide.
+ * - goog.module must be the first statement in the file.
+ * - only one goog.module is allowed per file.
+ *
+ * When a goog.module annotated file is loaded, it is enclosed in
+ * a strict function closure. This means that:
+ * - any variables declared in a goog.module file are private to the file
+ * (not global), though the compiler is expected to inline the module.
+ * - The code must obey all the rules of "strict" JavaScript.
+ * - the file will be marked as "use strict"
+ *
+ * NOTE: unlike goog.provide, goog.module does not declare any symbols by
+ * itself. If declared symbols are desired, use
+ * goog.module.declareLegacyNamespace().
+ *
+ *
+ * See the public goog.module proposal: http://goo.gl/Va1hin
+ *
+ * @param {string} name Namespace provided by this file in the form
+ * "goog.package.part", is expected but not required.
+ * @return {void}
+ */
+goog.module = function(name) {
+ if (!goog.isString(name) || !name ||
+ name.search(goog.VALID_MODULE_RE_) == -1) {
+ throw Error('Invalid module identifier');
+ }
+ if (!goog.isInModuleLoader_()) {
+ throw Error(
+ 'Module ' + name + ' has been loaded incorrectly. Note, ' +
+ 'modules cannot be loaded as normal scripts. They require some kind of ' +
+ 'pre-processing step. You\'re likely trying to load a module via a ' +
+ 'script tag or as a part of a concatenated bundle without rewriting the ' +
+ 'module. For more info see: ' +
+ 'https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide.');
+ }
+ if (goog.moduleLoaderState_.moduleName) {
+ throw Error('goog.module may only be called once per module.');
+ }
+
+ // Store the module name for the loader.
+ goog.moduleLoaderState_.moduleName = name;
+ if (!COMPILED) {
+ // Ensure that the same namespace isn't provided twice.
+ // A goog.module/goog.provide maps a goog.require to a specific file
+ if (goog.isProvided_(name)) {
+ throw Error('Namespace "' + name + '" already declared.');
+ }
+ delete goog.implicitNamespaces_[name];
+ }
+};
+
+
+/**
+ * @param {string} name The module identifier.
+ * @return {?} The module exports for an already loaded module or null.
+ *
+ * Note: This is not an alternative to goog.require, it does not
+ * indicate a hard dependency, instead it is used to indicate
+ * an optional dependency or to access the exports of a module
+ * that has already been loaded.
+ * @suppress {missingProvide}
+ */
+goog.module.get = function(name) {
+ return goog.module.getInternal_(name);
+};
+
+
+/**
+ * @param {string} name The module identifier.
+ * @return {?} The module exports for an already loaded module or null.
+ * @private
+ */
+goog.module.getInternal_ = function(name) {
+ if (!COMPILED) {
+ if (name in goog.loadedModules_) {
+ return goog.loadedModules_[name];
+ } else if (!goog.implicitNamespaces_[name]) {
+ var ns = goog.getObjectByName(name);
+ return ns != null ? ns : null;
+ }
+ }
+ return null;
+};
+
+
+/**
+ * @private {?{moduleName: (string|undefined), declareLegacyNamespace:boolean}}
+ */
+goog.moduleLoaderState_ = null;
+
+
+/**
+ * @private
+ * @return {boolean} Whether a goog.module is currently being initialized.
+ */
+goog.isInModuleLoader_ = function() {
+ return goog.moduleLoaderState_ != null;
+};
+
+
+/**
+ * Provide the module's exports as a globally accessible object under the
+ * module's declared name. This is intended to ease migration to goog.module
+ * for files that have existing usages.
+ * @suppress {missingProvide}
+ */
+goog.module.declareLegacyNamespace = function() {
+ if (!COMPILED && !goog.isInModuleLoader_()) {
+ throw new Error(
+ 'goog.module.declareLegacyNamespace must be called from ' +
+ 'within a goog.module');
+ }
+ if (!COMPILED && !goog.moduleLoaderState_.moduleName) {
+ throw Error(
+ 'goog.module must be called prior to ' +
+ 'goog.module.declareLegacyNamespace.');
+ }
+ goog.moduleLoaderState_.declareLegacyNamespace = true;
+};
+
+
+/**
+ * Marks that the current file should only be used for testing, and never for
+ * live code in production.
+ *
+ * In the case of unit tests, the message may optionally be an exact namespace
+ * for the test (e.g. 'goog.stringTest'). The linter will then ignore the extra
+ * provide (if not explicitly defined in the code).
+ *
+ * @param {string=} opt_message Optional message to add to the error that's
+ * raised when used in production code.
+ */
+goog.setTestOnly = function(opt_message) {
+ if (goog.DISALLOW_TEST_ONLY_CODE) {
+ opt_message = opt_message || '';
+ throw Error(
+ 'Importing test-only code into non-debug environment' +
+ (opt_message ? ': ' + opt_message : '.'));
+ }
+};
+
+
+/**
+ * Forward declares a symbol. This is an indication to the compiler that the
+ * symbol may be used in the source yet is not required and may not be provided
+ * in compilation.
+ *
+ * The most common usage of forward declaration is code that takes a type as a
+ * function parameter but does not need to require it. By forward declaring
+ * instead of requiring, no hard dependency is made, and (if not required
+ * elsewhere) the namespace may never be required and thus, not be pulled
+ * into the JavaScript binary. If it is required elsewhere, it will be type
+ * checked as normal.
+ *
+ * Before using goog.forwardDeclare, please read the documentation at
+ * https://github.com/google/closure-compiler/wiki/Bad-Type-Annotation to
+ * understand the options and tradeoffs when working with forward declarations.
+ *
+ * @param {string} name The namespace to forward declare in the form of
+ * "goog.package.part".
+ */
+goog.forwardDeclare = function(name) {};
+
+
+/**
+ * Forward declare type information. Used to assign types to goog.global
+ * referenced object that would otherwise result in unknown type references
+ * and thus block property disambiguation.
+ */
+goog.forwardDeclare('Document');
+goog.forwardDeclare('HTMLScriptElement');
+goog.forwardDeclare('XMLHttpRequest');
+
+
+if (!COMPILED) {
+ /**
+ * Check if the given name has been goog.provided. This will return false for
+ * names that are available only as implicit namespaces.
+ * @param {string} name name of the object to look for.
+ * @return {boolean} Whether the name has been provided.
+ * @private
+ */
+ goog.isProvided_ = function(name) {
+ return (name in goog.loadedModules_) ||
+ (!goog.implicitNamespaces_[name] &&
+ goog.isDefAndNotNull(goog.getObjectByName(name)));
+ };
+
+ /**
+ * Namespaces implicitly defined by goog.provide. For example,
+ * goog.provide('goog.events.Event') implicitly declares that 'goog' and
+ * 'goog.events' must be namespaces.
+ *
+ * @type {!Object<string, (boolean|undefined)>}
+ * @private
+ */
+ goog.implicitNamespaces_ = {'goog.module': true};
+
+ // NOTE: We add goog.module as an implicit namespace as goog.module is defined
+ // here and because the existing module package has not been moved yet out of
+ // the goog.module namespace. This satisifies both the debug loader and
+ // ahead-of-time dependency management.
+}
+
+
+/**
+ * Returns an object based on its fully qualified external name. The object
+ * is not found if null or undefined. If you are using a compilation pass that
+ * renames property names beware that using this function will not find renamed
+ * properties.
+ *
+ * @param {string} name The fully qualified name.
+ * @param {Object=} opt_obj The object within which to look; default is
+ * |goog.global|.
+ * @return {?} The value (object or primitive) or, if not found, null.
+ */
+goog.getObjectByName = function(name, opt_obj) {
+ var parts = name.split('.');
+ var cur = opt_obj || goog.global;
+ for (var part; part = parts.shift();) {
+ if (goog.isDefAndNotNull(cur[part])) {
+ cur = cur[part];
+ } else {
+ return null;
+ }
+ }
+ return cur;
+};
+
+
+/**
+ * Globalizes a whole namespace, such as goog or goog.lang.
+ *
+ * @param {!Object} obj The namespace to globalize.
+ * @param {Object=} opt_global The object to add the properties to.
+ * @deprecated Properties may be explicitly exported to the global scope, but
+ * this should no longer be done in bulk.
+ */
+goog.globalize = function(obj, opt_global) {
+ var global = opt_global || goog.global;
+ for (var x in obj) {
+ global[x] = obj[x];
+ }
+};
+
+
+/**
+ * Adds a dependency from a file to the files it requires.
+ * @param {string} relPath The path to the js file.
+ * @param {!Array<string>} provides An array of strings with
+ * the names of the objects this file provides.
+ * @param {!Array<string>} requires An array of strings with
+ * the names of the objects this file requires.
+ * @param {boolean|!Object<string>=} opt_loadFlags Parameters indicating
+ * how the file must be loaded. The boolean 'true' is equivalent
+ * to {'module': 'goog'} for backwards-compatibility. Valid properties
+ * and values include {'module': 'goog'} and {'lang': 'es6'}.
+ */
+goog.addDependency = function(relPath, provides, requires, opt_loadFlags) {
+ if (goog.DEPENDENCIES_ENABLED) {
+ var provide, require;
+ var path = relPath.replace(/\\/g, '/');
+ var deps = goog.dependencies_;
+ if (!opt_loadFlags || typeof opt_loadFlags === 'boolean') {
+ opt_loadFlags = opt_loadFlags ? {'module': 'goog'} : {};
+ }
+ for (var i = 0; provide = provides[i]; i++) {
+ deps.nameToPath[provide] = path;
+ deps.loadFlags[path] = opt_loadFlags;
+ }
+ for (var j = 0; require = requires[j]; j++) {
+ if (!(path in deps.requires)) {
+ deps.requires[path] = {};
+ }
+ deps.requires[path][require] = true;
+ }
+ }
+};
+
+
+
+
+// NOTE(nnaze): The debug DOM loader was included in base.js as an original way
+// to do "debug-mode" development. The dependency system can sometimes be
+// confusing, as can the debug DOM loader's asynchronous nature.
+//
+// With the DOM loader, a call to goog.require() is not blocking -- the script
+// will not load until some point after the current script. If a namespace is
+// needed at runtime, it needs to be defined in a previous script, or loaded via
+// require() with its registered dependencies.
+//
+// User-defined namespaces may need their own deps file. For a reference on
+// creating a deps file, see:
+// Externally: https://developers.google.com/closure/library/docs/depswriter
+//
+// Because of legacy clients, the DOM loader can't be easily removed from
+// base.js. Work was done to make it disableable or replaceable for
+// different environments (DOM-less JavaScript interpreters like Rhino or V8,
+// for example). See bootstrap/ for more information.
+
+
+/**
+ * @define {boolean} Whether to enable the debug loader.
+ *
+ * If enabled, a call to goog.require() will attempt to load the namespace by
+ * appending a script tag to the DOM (if the namespace has been registered).
+ *
+ * If disabled, goog.require() will simply assert that the namespace has been
+ * provided (and depend on the fact that some outside tool correctly ordered
+ * the script).
+ */
+goog.define('goog.ENABLE_DEBUG_LOADER', true);
+
+
+/**
+ * @param {string} msg
+ * @private
+ */
+goog.logToConsole_ = function(msg) {
+ if (goog.global.console) {
+ goog.global.console['error'](msg);
+ }
+};
+
+
+/**
+ * Implements a system for the dynamic resolution of dependencies that works in
+ * parallel with the BUILD system. Note that all calls to goog.require will be
+ * stripped by the compiler.
+ * @see goog.provide
+ * @param {string} name Namespace to include (as was given in goog.provide()) in
+ * the form "goog.package.part".
+ * @return {?} If called within a goog.module file, the associated namespace or
+ * module otherwise null.
+ */
+goog.require = function(name) {
+ // If the object already exists we do not need to do anything.
+ if (!COMPILED) {
+ if (goog.ENABLE_DEBUG_LOADER && goog.IS_OLD_IE_) {
+ goog.maybeProcessDeferredDep_(name);
+ }
+
+ if (goog.isProvided_(name)) {
+ if (goog.isInModuleLoader_()) {
+ return goog.module.getInternal_(name);
+ }
+ } else if (goog.ENABLE_DEBUG_LOADER) {
+ var path = goog.getPathFromDeps_(name);
+ if (path) {
+ goog.writeScripts_(path);
+ } else {
+ var errorMessage = 'goog.require could not find: ' + name;
+ goog.logToConsole_(errorMessage);
+
+ throw Error(errorMessage);
+ }
+ }
+
+ return null;
+ }
+};
+
+
+/**
+ * Path for included scripts.
+ * @type {string}
+ */
+goog.basePath = '';
+
+
+/**
+ * A hook for overriding the base path.
+ * @type {string|undefined}
+ */
+goog.global.CLOSURE_BASE_PATH;
+
+
+/**
+ * Whether to attempt to load Closure's deps file. By default, when uncompiled,
+ * deps files will attempt to be loaded.
+ * @type {boolean|undefined}
+ */
+goog.global.CLOSURE_NO_DEPS;
+
+
+/**
+ * A function to import a single script. This is meant to be overridden when
+ * Closure is being run in non-HTML contexts, such as web workers. It's defined
+ * in the global scope so that it can be set before base.js is loaded, which
+ * allows deps.js to be imported properly.
+ *
+ * The function is passed the script source, which is a relative URI. It should
+ * return true if the script was imported, false otherwise.
+ * @type {(function(string): boolean)|undefined}
+ */
+goog.global.CLOSURE_IMPORT_SCRIPT;
+
+
+/**
+ * Null function used for default values of callbacks, etc.
+ * @return {void} Nothing.
+ */
+goog.nullFunction = function() {};
+
+
+/**
+ * When defining a class Foo with an abstract method bar(), you can do:
+ * Foo.prototype.bar = goog.abstractMethod
+ *
+ * Now if a subclass of Foo fails to override bar(), an error will be thrown
+ * when bar() is invoked.
+ *
+ * @type {!Function}
+ * @throws {Error} when invoked to indicate the method should be overridden.
+ */
+goog.abstractMethod = function() {
+ throw Error('unimplemented abstract method');
+};
+
+
+/**
+ * Adds a {@code getInstance} static method that always returns the same
+ * instance object.
+ * @param {!Function} ctor The constructor for the class to add the static
+ * method to.
+ */
+goog.addSingletonGetter = function(ctor) {
+ // instance_ is immediately set to prevent issues with sealed constructors
+ // such as are encountered when a constructor is returned as the export object
+ // of a goog.module in unoptimized code.
+ ctor.instance_ = undefined;
+ ctor.getInstance = function() {
+ if (ctor.instance_) {
+ return ctor.instance_;
+ }
+ if (goog.DEBUG) {
+ // NOTE: JSCompiler can't optimize away Array#push.
+ goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor;
+ }
+ return ctor.instance_ = new ctor;
+ };
+};
+
+
+/**
+ * All singleton classes that have been instantiated, for testing. Don't read
+ * it directly, use the {@code goog.testing.singleton} module. The compiler
+ * removes this variable if unused.
+ * @type {!Array<!Function>}
+ * @private
+ */
+goog.instantiatedSingletons_ = [];
+
+
+/**
+ * @define {boolean} Whether to load goog.modules using {@code eval} when using
+ * the debug loader. This provides a better debugging experience as the
+ * source is unmodified and can be edited using Chrome Workspaces or similar.
+ * However in some environments the use of {@code eval} is banned
+ * so we provide an alternative.
+ */
+goog.define('goog.LOAD_MODULE_USING_EVAL', true);
+
+
+/**
+ * @define {boolean} Whether the exports of goog.modules should be sealed when
+ * possible.
+ */
+goog.define('goog.SEAL_MODULE_EXPORTS', goog.DEBUG);
+
+
+/**
+ * The registry of initialized modules:
+ * the module identifier to module exports map.
+ * @private @const {!Object<string, ?>}
+ */
+goog.loadedModules_ = {};
+
+
+/**
+ * True if goog.dependencies_ is available.
+ * @const {boolean}
+ */
+goog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER;
+
+
+/**
+ * @define {string} How to decide whether to transpile. Valid values
+ * are 'always', 'never', and 'detect'. The default ('detect') is to
+ * use feature detection to determine which language levels need
+ * transpilation.
+ */
+// NOTE(user): we could expand this to accept a language level to bypass
+// detection: e.g. goog.TRANSPILE == 'es5' would transpile ES6 files but
+// would leave ES3 and ES5 files alone.
+goog.define('goog.TRANSPILE', 'detect');
+
+
+/**
+ * @define {string} Path to the transpiler. Executing the script at this
+ * path (relative to base.js) should define a function $jscomp.transpile.
+ */
+goog.define('goog.TRANSPILER', 'transpile.js');
+
+
+if (goog.DEPENDENCIES_ENABLED) {
+ /**
+ * This object is used to keep track of dependencies and other data that is
+ * used for loading scripts.
+ * @private
+ * @type {{
+ * loadFlags: !Object<string, !Object<string, string>>,
+ * nameToPath: !Object<string, string>,
+ * requires: !Object<string, !Object<string, boolean>>,
+ * visited: !Object<string, boolean>,
+ * written: !Object<string, boolean>,
+ * deferred: !Object<string, string>
+ * }}
+ */
+ goog.dependencies_ = {
+ loadFlags: {}, // 1 to 1
+
+ nameToPath: {}, // 1 to 1
+
+ requires: {}, // 1 to many
+
+ // Used when resolving dependencies to prevent us from visiting file twice.
+ visited: {},
+
+ written: {}, // Used to keep track of script files we have written.
+
+ deferred: {} // Used to track deferred module evaluations in old IEs
+ };
+
+
+ /**
+ * Tries to detect whether is in the context of an HTML document.
+ * @return {boolean} True if it looks like HTML document.
+ * @private
+ */
+ goog.inHtmlDocument_ = function() {
+ /** @type {Document} */
+ var doc = goog.global.document;
+ return doc != null && 'write' in doc; // XULDocument misses write.
+ };
+
+
+ /**
+ * Tries to detect the base path of base.js script that bootstraps Closure.
+ * @private
+ */
+ goog.findBasePath_ = function() {
+ if (goog.isDef(goog.global.CLOSURE_BASE_PATH) &&
+ // Anti DOM-clobbering runtime check (b/37736576).
+ goog.isString(goog.global.CLOSURE_BASE_PATH)) {
+ goog.basePath = goog.global.CLOSURE_BASE_PATH;
+ return;
+ } else if (!goog.inHtmlDocument_()) {
+ return;
+ }
+ /** @type {Document} */
+ var doc = goog.global.document;
+ // If we have a currentScript available, use it exclusively.
+ var currentScript = doc.currentScript;
+ if (currentScript) {
+ var scripts = [currentScript];
+ } else {
+ var scripts = doc.getElementsByTagName('SCRIPT');
+ }
+ // Search backwards since the current script is in almost all cases the one
+ // that has base.js.
+ for (var i = scripts.length - 1; i >= 0; --i) {
+ var script = /** @type {!HTMLScriptElement} */ (scripts[i]);
+ var src = script.src;
+ var qmark = src.lastIndexOf('?');
+ var l = qmark == -1 ? src.length : qmark;
+ if (src.substr(l - 7, 7) == 'base.js') {
+ goog.basePath = src.substr(0, l - 7);
+ return;
+ }
+ }
+ };
+
+
+ /**
+ * Imports a script if, and only if, that script hasn't already been imported.
+ * (Must be called at execution time)
+ * @param {string} src Script source.
+ * @param {string=} opt_sourceText The optionally source text to evaluate
+ * @private
+ */
+ goog.importScript_ = function(src, opt_sourceText) {
+ var importScript =
+ goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_;
+ if (importScript(src, opt_sourceText)) {
+ goog.dependencies_.written[src] = true;
+ }
+ };
+
+
+ /**
+ * Whether the browser is IE9 or earlier, which needs special handling
+ * for deferred modules.
+ * @const @private {boolean}
+ */
+ goog.IS_OLD_IE_ =
+ !!(!goog.global.atob && goog.global.document && goog.global.document.all);
+
+
+ /**
+ * Whether IE9 or earlier is waiting on a dependency. This ensures that
+ * deferred modules that have no non-deferred dependencies actually get
+ * loaded, since if we defer them and then never pull in a non-deferred
+ * script, then `goog.loadQueuedModules_` will never be called. Instead,
+ * if not waiting on anything we simply don't defer in the first place.
+ * @private {boolean}
+ */
+ goog.oldIeWaiting_ = false;
+
+
+ /**
+ * Given a URL initiate retrieval and execution of a script that needs
+ * pre-processing.
+ * @param {string} src Script source URL.
+ * @param {boolean} isModule Whether this is a goog.module.
+ * @param {boolean} needsTranspile Whether this source needs transpilation.
+ * @private
+ */
+ goog.importProcessedScript_ = function(src, isModule, needsTranspile) {
+ // In an attempt to keep browsers from timing out loading scripts using
+ // synchronous XHRs, put each load in its own script block.
+ var bootstrap = 'goog.retrieveAndExec_("' + src + '", ' + isModule + ', ' +
+ needsTranspile + ');';
+
+ goog.importScript_('', bootstrap);
+ };
+
+
+ /** @private {!Array<string>} */
+ goog.queuedModules_ = [];
+
+
+ /**
+ * Return an appropriate module text. Suitable to insert into
+ * a script tag (that is unescaped).
+ * @param {string} srcUrl
+ * @param {string} scriptText
+ * @return {string}
+ * @private
+ */
+ goog.wrapModule_ = function(srcUrl, scriptText) {
+ if (!goog.LOAD_MODULE_USING_EVAL || !goog.isDef(goog.global.JSON)) {
+ return '' +
+ 'goog.loadModule(function(exports) {' +
+ '"use strict";' + scriptText +
+ '\n' + // terminate any trailing single line comment.
+ ';return exports' +
+ '});' +
+ '\n//# sourceURL=' + srcUrl + '\n';
+ } else {
+ return '' +
+ 'goog.loadModule(' +
+ goog.global.JSON.stringify(
+ scriptText + '\n//# sourceURL=' + srcUrl + '\n') +
+ ');';
+ }
+ };
+
+ // On IE9 and earlier, it is necessary to handle
+ // deferred module loads. In later browsers, the
+ // code to be evaluated is simply inserted as a script
+ // block in the correct order. To eval deferred
+ // code at the right time, we piggy back on goog.require to call
+ // goog.maybeProcessDeferredDep_.
+ //
+ // The goog.requires are used both to bootstrap
+ // the loading process (when no deps are available) and
+ // declare that they should be available.
+ //
+ // Here we eval the sources, if all the deps are available
+ // either already eval'd or goog.require'd. This will
+ // be the case when all the dependencies have already
+ // been loaded, and the dependent module is loaded.
+ //
+ // But this alone isn't sufficient because it is also
+ // necessary to handle the case where there is no root
+ // that is not deferred. For that there we register for an event
+ // and trigger goog.loadQueuedModules_ handle any remaining deferred
+ // evaluations.
+
+ /**
+ * Handle any remaining deferred goog.module evals.
+ * @private
+ */
+ goog.loadQueuedModules_ = function() {
+ var count = goog.queuedModules_.length;
+ if (count > 0) {
+ var queue = goog.queuedModules_;
+ goog.queuedModules_ = [];
+ for (var i = 0; i < count; i++) {
+ var path = queue[i];
+ goog.maybeProcessDeferredPath_(path);
+ }
+ }
+ goog.oldIeWaiting_ = false;
+ };
+
+
+ /**
+ * Eval the named module if its dependencies are
+ * available.
+ * @param {string} name The module to load.
+ * @private
+ */
+ goog.maybeProcessDeferredDep_ = function(name) {
+ if (goog.isDeferredModule_(name) && goog.allDepsAreAvailable_(name)) {
+ var path = goog.getPathFromDeps_(name);
+ goog.maybeProcessDeferredPath_(goog.basePath + path);
+ }
+ };
+
+ /**
+ * @param {string} name The module to check.
+ * @return {boolean} Whether the name represents a
+ * module whose evaluation has been deferred.
+ * @private
+ */
+ goog.isDeferredModule_ = function(name) {
+ var path = goog.getPathFromDeps_(name);
+ var loadFlags = path && goog.dependencies_.loadFlags[path] || {};
+ var languageLevel = loadFlags['lang'] || 'es3';
+ if (path && (loadFlags['module'] == 'goog' ||
+ goog.needsTranspile_(languageLevel))) {
+ var abspath = goog.basePath + path;
+ return (abspath) in goog.dependencies_.deferred;
+ }
+ return false;
+ };
+
+ /**
+ * @param {string} name The module to check.
+ * @return {boolean} Whether the name represents a
+ * module whose declared dependencies have all been loaded
+ * (eval'd or a deferred module load)
+ * @private
+ */
+ goog.allDepsAreAvailable_ = function(name) {
+ var path = goog.getPathFromDeps_(name);
+ if (path && (path in goog.dependencies_.requires)) {
+ for (var requireName in goog.dependencies_.requires[path]) {
+ if (!goog.isProvided_(requireName) &&
+ !goog.isDeferredModule_(requireName)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ };
+
+
+ /**
+ * @param {string} abspath
+ * @private
+ */
+ goog.maybeProcessDeferredPath_ = function(abspath) {
+ if (abspath in goog.dependencies_.deferred) {
+ var src = goog.dependencies_.deferred[abspath];
+ delete goog.dependencies_.deferred[abspath];
+ goog.globalEval(src);
+ }
+ };
+
+
+ /**
+ * Load a goog.module from the provided URL. This is not a general purpose
+ * code loader and does not support late loading code, that is it should only
+ * be used during page load. This method exists to support unit tests and
+ * "debug" loaders that would otherwise have inserted script tags. Under the
+ * hood this needs to use a synchronous XHR and is not recommeneded for
+ * production code.
+ *
+ * The module's goog.requires must have already been satisified; an exception
+ * will be thrown if this is not the case. This assumption is that no
+ * "deps.js" file exists, so there is no way to discover and locate the
+ * module-to-be-loaded's dependencies and no attempt is made to do so.
+ *
+ * There should only be one attempt to load a module. If
+ * "goog.loadModuleFromUrl" is called for an already loaded module, an
+ * exception will be throw.
+ *
+ * @param {string} url The URL from which to attempt to load the goog.module.
+ */
+ goog.loadModuleFromUrl = function(url) {
+ // Because this executes synchronously, we don't need to do any additional
+ // bookkeeping. When "goog.loadModule" the namespace will be marked as
+ // having been provided which is sufficient.
+ goog.retrieveAndExec_(url, true, false);
+ };
+
+
+ /**
+ * Writes a new script pointing to {@code src} directly into the DOM.
+ *
+ * NOTE: This method is not CSP-compliant. @see goog.appendScriptSrcNode_ for
+ * the fallback mechanism.
+ *
+ * @param {string} src The script URL.
+ * @private
+ */
+ goog.writeScriptSrcNode_ = function(src) {
+ goog.global.document.write(
+ '<script type="text/javascript" src="' + src + '"></' +
+ 'script>');
+ };
+
+
+ /**
+ * Appends a new script node to the DOM using a CSP-compliant mechanism. This
+ * method exists as a fallback for document.write (which is not allowed in a
+ * strict CSP context, e.g., Chrome apps).
+ *
+ * NOTE: This method is not analogous to using document.write to insert a
+ * <script> tag; specifically, the user agent will execute a script added by
+ * document.write immediately after the current script block finishes
+ * executing, whereas the DOM-appended script node will not be executed until
+ * the entire document is parsed and executed. That is to say, this script is
+ * added to the end of the script execution queue.
+ *
+ * The page must not attempt to call goog.required entities until after the
+ * document has loaded, e.g., in or after the window.onload callback.
+ *
+ * @param {string} src The script URL.
+ * @private
+ */
+ goog.appendScriptSrcNode_ = function(src) {
+ /** @type {Document} */
+ var doc = goog.global.document;
+ var scriptEl =
+ /** @type {HTMLScriptElement} */ (doc.createElement('script'));
+ scriptEl.type = 'text/javascript';
+ scriptEl.src = src;
+ scriptEl.defer = false;
+ scriptEl.async = false;
+ doc.head.appendChild(scriptEl);
+ };
+
+
+ /**
+ * The default implementation of the import function. Writes a script tag to
+ * import the script.
+ *
+ * @param {string} src The script url.
+ * @param {string=} opt_sourceText The optionally source text to evaluate
+ * @return {boolean} True if the script was imported, false otherwise.
+ * @private
+ */
+ goog.writeScriptTag_ = function(src, opt_sourceText) {
+ if (goog.inHtmlDocument_()) {
+ /** @type {!HTMLDocument} */
+ var doc = goog.global.document;
+
+ // If the user tries to require a new symbol after document load,
+ // something has gone terribly wrong. Doing a document.write would
+ // wipe out the page. This does not apply to the CSP-compliant method
+ // of writing script tags.
+ if (!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING &&
+ doc.readyState == 'complete') {
+ // Certain test frameworks load base.js multiple times, which tries
+ // to write deps.js each time. If that happens, just fail silently.
+ // These frameworks wipe the page between each load of base.js, so this
+ // is OK.
+ var isDeps = /\bdeps.js$/.test(src);
+ if (isDeps) {
+ return false;
+ } else {
+ throw Error('Cannot write "' + src + '" after document load');
+ }
+ }
+
+ if (opt_sourceText === undefined) {
+ if (!goog.IS_OLD_IE_) {
+ if (goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING) {
+ goog.appendScriptSrcNode_(src);
+ } else {
+ goog.writeScriptSrcNode_(src);
+ }
+ } else {
+ goog.oldIeWaiting_ = true;
+ var state = ' onreadystatechange=\'goog.onScriptLoad_(this, ' +
+ ++goog.lastNonModuleScriptIndex_ + ')\' ';
+ doc.write(
+ '<script type="text/javascript" src="' + src + '"' + state +
+ '></' +
+ 'script>');
+ }
+ } else {
+ doc.write(
+ '<script type="text/javascript">' +
+ goog.protectScriptTag_(opt_sourceText) + '</' +
+ 'script>');
+ }
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ /**
+ * Rewrites closing script tags in input to avoid ending an enclosing script
+ * tag.
+ *
+ * @param {string} str
+ * @return {string}
+ * @private
+ */
+ goog.protectScriptTag_ = function(str) {
+ return str.replace(/<\/(SCRIPT)/ig, '\\x3c/$1');
+ };
+
+ /**
+ * Determines whether the given language needs to be transpiled.
+ * @param {string} lang
+ * @return {boolean}
+ * @private
+ */
+ goog.needsTranspile_ = function(lang) {
+ if (goog.TRANSPILE == 'always') {
+ return true;
+ } else if (goog.TRANSPILE == 'never') {
+ return false;
+ } else if (!goog.requiresTranspilation_) {
+ goog.requiresTranspilation_ = goog.createRequiresTranspilation_();
+ }
+ if (lang in goog.requiresTranspilation_) {
+ return goog.requiresTranspilation_[lang];
+ } else {
+ throw new Error('Unknown language mode: ' + lang);
+ }
+ };
+
+ /** @private {?Object<string, boolean>} */
+ goog.requiresTranspilation_ = null;
+
+
+ /** @private {number} */
+ goog.lastNonModuleScriptIndex_ = 0;
+
+
+ /**
+ * A readystatechange handler for legacy IE
+ * @param {?} script
+ * @param {number} scriptIndex
+ * @return {boolean}
+ * @private
+ */
+ goog.onScriptLoad_ = function(script, scriptIndex) {
+ // for now load the modules when we reach the last script,
+ // later allow more inter-mingling.
+ if (script.readyState == 'complete' &&
+ goog.lastNonModuleScriptIndex_ == scriptIndex) {
+ goog.loadQueuedModules_();
+ }
+ return true;
+ };
+
+ /**
+ * Resolves dependencies based on the dependencies added using addDependency
+ * and calls importScript_ in the correct order.
+ * @param {string} pathToLoad The path from which to start discovering
+ * dependencies.
+ * @private
+ */
+ goog.writeScripts_ = function(pathToLoad) {
+ /** @type {!Array<string>} The scripts we need to write this time. */
+ var scripts = [];
+ var seenScript = {};
+ var deps = goog.dependencies_;
+
+ /** @param {string} path */
+ function visitNode(path) {
+ if (path in deps.written) {
+ return;
+ }
+
+ // We have already visited this one. We can get here if we have cyclic
+ // dependencies.
+ if (path in deps.visited) {
+ return;
+ }
+
+ deps.visited[path] = true;
+
+ if (path in deps.requires) {
+ for (var requireName in deps.requires[path]) {
+ // If the required name is defined, we assume that it was already
+ // bootstrapped by other means.
+ if (!goog.isProvided_(requireName)) {
+ if (requireName in deps.nameToPath) {
+ visitNode(deps.nameToPath[requireName]);
+ } else {
+ throw Error('Undefined nameToPath for ' + requireName);
+ }
+ }
+ }
+ }
+
+ if (!(path in seenScript)) {
+ seenScript[path] = true;
+ scripts.push(path);
+ }
+ }
+
+ visitNode(pathToLoad);
+
+ // record that we are going to load all these scripts.
+ for (var i = 0; i < scripts.length; i++) {
+ var path = scripts[i];
+ goog.dependencies_.written[path] = true;
+ }
+
+ // If a module is loaded synchronously then we need to
+ // clear the current inModuleLoader value, and restore it when we are
+ // done loading the current "requires".
+ var moduleState = goog.moduleLoaderState_;
+ goog.moduleLoaderState_ = null;
+
+ for (var i = 0; i < scripts.length; i++) {
+ var path = scripts[i];
+ if (path) {
+ var loadFlags = deps.loadFlags[path] || {};
+ var languageLevel = loadFlags['lang'] || 'es3';
+ var needsTranspile = goog.needsTranspile_(languageLevel);
+ if (loadFlags['module'] == 'goog' || needsTranspile) {
+ goog.importProcessedScript_(
+ goog.basePath + path, loadFlags['module'] == 'goog',
+ needsTranspile);
+ } else {
+ goog.importScript_(goog.basePath + path);
+ }
+ } else {
+ goog.moduleLoaderState_ = moduleState;
+ throw Error('Undefined script input');
+ }
+ }
+
+ // restore the current "module loading state"
+ goog.moduleLoaderState_ = moduleState;
+ };
+
+
+ /**
+ * Looks at the dependency rules and tries to determine the script file that
+ * fulfills a particular rule.
+ * @param {string} rule In the form goog.namespace.Class or project.script.
+ * @return {?string} Url corresponding to the rule, or null.
+ * @private
+ */
+ goog.getPathFromDeps_ = function(rule) {
+ if (rule in goog.dependencies_.nameToPath) {
+ return goog.dependencies_.nameToPath[rule];
+ } else {
+ return null;
+ }
+ };
+
+ goog.findBasePath_();
+
+ // Allow projects to manage the deps files themselves.
+ if (!goog.global.CLOSURE_NO_DEPS) {
+ goog.importScript_(goog.basePath + 'deps.js');
+ }
+}
+
+
+/**
+ * @package {?boolean}
+ * Visible for testing.
+ */
+goog.hasBadLetScoping = null;
+
+
+/**
+ * @return {boolean}
+ * @package Visible for testing.
+ */
+goog.useSafari10Workaround = function() {
+ if (goog.hasBadLetScoping == null) {
+ var hasBadLetScoping;
+ try {
+ hasBadLetScoping = !eval(
+ '"use strict";' +
+ 'let x = 1; function f() { return typeof x; };' +
+ 'f() == "number";');
+ } catch (e) {
+ // Assume that ES6 syntax isn't supported.
+ hasBadLetScoping = false;
+ }
+ goog.hasBadLetScoping = hasBadLetScoping;
+ }
+ return goog.hasBadLetScoping;
+};
+
+
+/**
+ * @param {string} moduleDef
+ * @return {string}
+ * @package Visible for testing.
+ */
+goog.workaroundSafari10EvalBug = function(moduleDef) {
+ return '(function(){' + moduleDef +
+ '\n' + // Terminate any trailing single line comment.
+ ';' + // Terminate any trailing expression.
+ '})();\n';
+};
+
+
+/**
+ * @param {function(?):?|string} moduleDef The module definition.
+ */
+goog.loadModule = function(moduleDef) {
+ // NOTE: we allow function definitions to be either in the from
+ // of a string to eval (which keeps the original source intact) or
+ // in a eval forbidden environment (CSP) we allow a function definition
+ // which in its body must call {@code goog.module}, and return the exports
+ // of the module.
+ var previousState = goog.moduleLoaderState_;
+ try {
+ goog.moduleLoaderState_ = {
+ moduleName: undefined,
+ declareLegacyNamespace: false
+ };
+ var exports;
+ if (goog.isFunction(moduleDef)) {
+ exports = moduleDef.call(undefined, {});
+ } else if (goog.isString(moduleDef)) {
+ if (goog.useSafari10Workaround()) {
+ moduleDef = goog.workaroundSafari10EvalBug(moduleDef);
+ }
+
+ exports = goog.loadModuleFromSource_.call(undefined, moduleDef);
+ } else {
+ throw Error('Invalid module definition');
+ }
+
+ var moduleName = goog.moduleLoaderState_.moduleName;
+ if (!goog.isString(moduleName) || !moduleName) {
+ throw Error('Invalid module name \"' + moduleName + '\"');
+ }
+
+ // Don't seal legacy namespaces as they may be uses as a parent of
+ // another namespace
+ if (goog.moduleLoaderState_.declareLegacyNamespace) {
+ goog.constructNamespace_(moduleName, exports);
+ } else if (
+ goog.SEAL_MODULE_EXPORTS && Object.seal && typeof exports == 'object' &&
+ exports != null) {
+ Object.seal(exports);
+ }
+
+ goog.loadedModules_[moduleName] = exports;
+ } finally {
+ goog.moduleLoaderState_ = previousState;
+ }
+};
+
+
+/**
+ * @private @const
+ */
+goog.loadModuleFromSource_ = /** @type {function(string):?} */ (function() {
+ // NOTE: we avoid declaring parameters or local variables here to avoid
+ // masking globals or leaking values into the module definition.
+ 'use strict';
+ var exports = {};
+ eval(arguments[0]);
+ return exports;
+});
+
+
+/**
+ * Normalize a file path by removing redundant ".." and extraneous "." file
+ * path components.
+ * @param {string} path
+ * @return {string}
+ * @private
+ */
+goog.normalizePath_ = function(path) {
+ var components = path.split('/');
+ var i = 0;
+ while (i < components.length) {
+ if (components[i] == '.') {
+ components.splice(i, 1);
+ } else if (
+ i && components[i] == '..' && components[i - 1] &&
+ components[i - 1] != '..') {
+ components.splice(--i, 2);
+ } else {
+ i++;
+ }
+ }
+ return components.join('/');
+};
+
+
+/**
+ * Provides a hook for loading a file when using Closure's goog.require() API
+ * with goog.modules. In particular this hook is provided to support Node.js.
+ *
+ * @type {(function(string):string)|undefined}
+ */
+goog.global.CLOSURE_LOAD_FILE_SYNC;
+
+
+/**
+ * Loads file by synchronous XHR. Should not be used in production environments.
+ * @param {string} src Source URL.
+ * @return {?string} File contents, or null if load failed.
+ * @private
+ */
+goog.loadFileSync_ = function(src) {
+ if (goog.global.CLOSURE_LOAD_FILE_SYNC) {
+ return goog.global.CLOSURE_LOAD_FILE_SYNC(src);
+ } else {
+ try {
+ /** @type {XMLHttpRequest} */
+ var xhr = new goog.global['XMLHttpRequest']();
+ xhr.open('get', src, false);
+ xhr.send();
+ // NOTE: Successful http: requests have a status of 200, but successful
+ // file: requests may have a status of zero. Any other status, or a
+ // thrown exception (particularly in case of file: requests) indicates
+ // some sort of error, which we treat as a missing or unavailable file.
+ return xhr.status == 0 || xhr.status == 200 ? xhr.responseText : null;
+ } catch (err) {
+ // No need to rethrow or log, since errors should show up on their own.
+ return null;
+ }
+ }
+};
+
+
+/**
+ * Retrieve and execute a script that needs some sort of wrapping.
+ * @param {string} src Script source URL.
+ * @param {boolean} isModule Whether to load as a module.
+ * @param {boolean} needsTranspile Whether to transpile down to ES3.
+ * @private
+ */
+goog.retrieveAndExec_ = function(src, isModule, needsTranspile) {
+ if (!COMPILED) {
+ // The full but non-canonicalized URL for later use.
+ var originalPath = src;
+ // Canonicalize the path, removing any /./ or /../ since Chrome's debugging
+ // console doesn't auto-canonicalize XHR loads as it does <script> srcs.
+ src = goog.normalizePath_(src);
+
+ var importScript =
+ goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_;
+
+ var scriptText = goog.loadFileSync_(src);
+ if (scriptText == null) {
+ throw new Error('Load of "' + src + '" failed');
+ }
+
+ if (needsTranspile) {
+ scriptText = goog.transpile_.call(goog.global, scriptText, src);
+ }
+
+ if (isModule) {
+ scriptText = goog.wrapModule_(src, scriptText);
+ } else {
+ scriptText += '\n//# sourceURL=' + src;
+ }
+ var isOldIE = goog.IS_OLD_IE_;
+ if (isOldIE && goog.oldIeWaiting_) {
+ goog.dependencies_.deferred[originalPath] = scriptText;
+ goog.queuedModules_.push(originalPath);
+ } else {
+ importScript(src, scriptText);
+ }
+ }
+};
+
+
+/**
+ * Lazily retrieves the transpiler and applies it to the source.
+ * @param {string} code JS code.
+ * @param {string} path Path to the code.
+ * @return {string} The transpiled code.
+ * @private
+ */
+goog.transpile_ = function(code, path) {
+ var jscomp = goog.global['$jscomp'];
+ if (!jscomp) {
+ goog.global['$jscomp'] = jscomp = {};
+ }
+ var transpile = jscomp.transpile;
+ if (!transpile) {
+ var transpilerPath = goog.basePath + goog.TRANSPILER;
+ var transpilerCode = goog.loadFileSync_(transpilerPath);
+ if (transpilerCode) {
+ // This must be executed synchronously, since by the time we know we
+ // need it, we're about to load and write the ES6 code synchronously,
+ // so a normal script-tag load will be too slow.
+ eval(transpilerCode + '\n//# sourceURL=' + transpilerPath);
+ // Even though the transpiler is optional, if $gwtExport is found, it's
+ // a sign the transpiler was loaded and the $jscomp.transpile *should*
+ // be there.
+ if (goog.global['$gwtExport'] && goog.global['$gwtExport']['$jscomp'] &&
+ !goog.global['$gwtExport']['$jscomp']['transpile']) {
+ throw new Error(
+ 'The transpiler did not properly export the "transpile" ' +
+ 'method. $gwtExport: ' + JSON.stringify(goog.global['$gwtExport']));
+ }
+ // transpile.js only exports a single $jscomp function, transpile. We
+ // grab just that and add it to the existing definition of $jscomp which
+ // contains the polyfills.
+ goog.global['$jscomp'].transpile =
+ goog.global['$gwtExport']['$jscomp']['transpile'];
+ jscomp = goog.global['$jscomp'];
+ transpile = jscomp.transpile;
+ }
+ }
+ if (!transpile) {
+ // The transpiler is an optional component. If it's not available then
+ // replace it with a pass-through function that simply logs.
+ var suffix = ' requires transpilation but no transpiler was found.';
+ transpile = jscomp.transpile = function(code, path) {
+ // TODO(user): figure out some way to get this error to show up
+ // in test results, noting that the failure may occur in many
+ // different ways, including in loadModule() before the test
+ // runner even comes up.
+ goog.logToConsole_(path + suffix);
+ return code;
+ };
+ }
+ // Note: any transpilation errors/warnings will be logged to the console.
+ return transpile(code, path);
+};
+
+
+//==============================================================================
+// Language Enhancements
+//==============================================================================
+
+
+/**
+ * This is a "fixed" version of the typeof operator. It differs from the typeof
+ * operator in such a way that null returns 'null' and arrays return 'array'.
+ * @param {?} value The value to get the type of.
+ * @return {string} The name of the type.
+ */
+goog.typeOf = function(value) {
+ var s = typeof value;
+ if (s == 'object') {
+ if (value) {
+ // Check these first, so we can avoid calling Object.prototype.toString if
+ // possible.
+ //
+ // IE improperly marshals typeof across execution contexts, but a
+ // cross-context object will still return false for "instanceof Object".
+ if (value instanceof Array) {
+ return 'array';
+ } else if (value instanceof Object) {
+ return s;
+ }
+
+ // HACK: In order to use an Object prototype method on the arbitrary
+ // value, the compiler requires the value be cast to type Object,
+ // even though the ECMA spec explicitly allows it.
+ var className = Object.prototype.toString.call(
+ /** @type {!Object} */ (value));
+ // In Firefox 3.6, attempting to access iframe window objects' length
+ // property throws an NS_ERROR_FAILURE, so we need to special-case it
+ // here.
+ if (className == '[object Window]') {
+ return 'object';
+ }
+
+ // We cannot always use constructor == Array or instanceof Array because
+ // different frames have different Array objects. In IE6, if the iframe
+ // where the array was created is destroyed, the array loses its
+ // prototype. Then dereferencing val.splice here throws an exception, so
+ // we can't use goog.isFunction. Calling typeof directly returns 'unknown'
+ // so that will work. In this case, this function will return false and
+ // most array functions will still work because the array is still
+ // array-like (supports length and []) even though it has lost its
+ // prototype.
+ // Mark Miller noticed that Object.prototype.toString
+ // allows access to the unforgeable [[Class]] property.
+ // 15.2.4.2 Object.prototype.toString ( )
+ // When the toString method is called, the following steps are taken:
+ // 1. Get the [[Class]] property of this object.
+ // 2. Compute a string value by concatenating the three strings
+ // "[object ", Result(1), and "]".
+ // 3. Return Result(2).
+ // and this behavior survives the destruction of the execution context.
+ if ((className == '[object Array]' ||
+ // In IE all non value types are wrapped as objects across window
+ // boundaries (not iframe though) so we have to do object detection
+ // for this edge case.
+ typeof value.length == 'number' &&
+ typeof value.splice != 'undefined' &&
+ typeof value.propertyIsEnumerable != 'undefined' &&
+ !value.propertyIsEnumerable('splice')
+
+ )) {
+ return 'array';
+ }
+ // HACK: There is still an array case that fails.
+ // function ArrayImpostor() {}
+ // ArrayImpostor.prototype = [];
+ // var impostor = new ArrayImpostor;
+ // this can be fixed by getting rid of the fast path
+ // (value instanceof Array) and solely relying on
+ // (value && Object.prototype.toString.vall(value) === '[object Array]')
+ // but that would require many more function calls and is not warranted
+ // unless closure code is receiving objects from untrusted sources.
+
+ // IE in cross-window calls does not correctly marshal the function type
+ // (it appears just as an object) so we cannot use just typeof val ==
+ // 'function'. However, if the object has a call property, it is a
+ // function.
+ if ((className == '[object Function]' ||
+ typeof value.call != 'undefined' &&
+ typeof value.propertyIsEnumerable != 'undefined' &&
+ !value.propertyIsEnumerable('call'))) {
+ return 'function';
+ }
+
+ } else {
+ return 'null';
+ }
+
+ } else if (s == 'function' && typeof value.call == 'undefined') {
+ // In Safari typeof nodeList returns 'function', and on Firefox typeof
+ // behaves similarly for HTML{Applet,Embed,Object}, Elements and RegExps. We
+ // would like to return object for those and we can detect an invalid
+ // function by making sure that the function object has a call method.
+ return 'object';
+ }
+ return s;
+};
+
+
+/**
+ * Returns true if the specified value is null.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is null.
+ */
+goog.isNull = function(val) {
+ return val === null;
+};
+
+
+/**
+ * Returns true if the specified value is defined and not null.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is defined and not null.
+ */
+goog.isDefAndNotNull = function(val) {
+ // Note that undefined == null.
+ return val != null;
+};
+
+
+/**
+ * Returns true if the specified value is an array.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is an array.
+ */
+goog.isArray = function(val) {
+ return goog.typeOf(val) == 'array';
+};
+
+
+/**
+ * Returns true if the object looks like an array. To qualify as array like
+ * the value needs to be either a NodeList or an object with a Number length
+ * property. As a special case, a function value is not array like, because its
+ * length property is fixed to correspond to the number of expected arguments.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is an array.
+ */
+goog.isArrayLike = function(val) {
+ var type = goog.typeOf(val);
+ // We do not use goog.isObject here in order to exclude function values.
+ return type == 'array' || type == 'object' && typeof val.length == 'number';
+};
+
+
+/**
+ * Returns true if the object looks like a Date. To qualify as Date-like the
+ * value needs to be an object and have a getFullYear() function.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is a like a Date.
+ */
+goog.isDateLike = function(val) {
+ return goog.isObject(val) && typeof val.getFullYear == 'function';
+};
+
+
+/**
+ * Returns true if the specified value is a function.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is a function.
+ */
+goog.isFunction = function(val) {
+ return goog.typeOf(val) == 'function';
+};
+
+
+/**
+ * Returns true if the specified value is an object. This includes arrays and
+ * functions.
+ * @param {?} val Variable to test.
+ * @return {boolean} Whether variable is an object.
+ */
+goog.isObject = function(val) {
+ var type = typeof val;
+ return type == 'object' && val != null || type == 'function';
+ // return Object(val) === val also works, but is slower, especially if val is
+ // not an object.
+};
+
+
+/**
+ * Gets a unique ID for an object. This mutates the object so that further calls
+ * with the same object as a parameter returns the same value. The unique ID is
+ * guaranteed to be unique across the current session amongst objects that are
+ * passed into {@code getUid}. There is no guarantee that the ID is unique or
+ * consistent across sessions. It is unsafe to generate unique ID for function
+ * prototypes.
+ *
+ * @param {Object} obj The object to get the unique ID for.
+ * @return {number} The unique ID for the object.
+ */
+goog.getUid = function(obj) {
+ // TODO(arv): Make the type stricter, do not accept null.
+
+ // In Opera window.hasOwnProperty exists but always returns false so we avoid
+ // using it. As a consequence the unique ID generated for BaseClass.prototype
+ // and SubClass.prototype will be the same.
+ return obj[goog.UID_PROPERTY_] ||
+ (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_);
+};
+
+
+/**
+ * Whether the given object is already assigned a unique ID.
+ *
+ * This does not modify the object.
+ *
+ * @param {!Object} obj The object to check.
+ * @return {boolean} Whether there is an assigned unique id for the object.
+ */
+goog.hasUid = function(obj) {
+ return !!obj[goog.UID_PROPERTY_];
+};
+
+
+/**
+ * Removes the unique ID from an object. This is useful if the object was
+ * previously mutated using {@code goog.getUid} in which case the mutation is
+ * undone.
+ * @param {Object} obj The object to remove the unique ID field from.
+ */
+goog.removeUid = function(obj) {
+ // TODO(arv): Make the type stricter, do not accept null.
+
+ // In IE, DOM nodes are not instances of Object and throw an exception if we
+ // try to delete. Instead we try to use removeAttribute.
+ if (obj !== null && 'removeAttribute' in obj) {
+ obj.removeAttribute(goog.UID_PROPERTY_);
+ }
+
+ try {
+ delete obj[goog.UID_PROPERTY_];
+ } catch (ex) {
+ }
+};
+
+
+/**
+ * Name for unique ID property. Initialized in a way to help avoid collisions
+ * with other closure JavaScript on the same page.
+ * @type {string}
+ * @private
+ */
+goog.UID_PROPERTY_ = 'closure_uid_' + ((Math.random() * 1e9) >>> 0);
+
+
+/**
+ * Counter for UID.
+ * @type {number}
+ * @private
+ */
+goog.uidCounter_ = 0;
+
+
+/**
+ * Adds a hash code field to an object. The hash code is unique for the
+ * given object.
+ * @param {Object} obj The object to get the hash code for.
+ * @return {number} The hash code for the object.
+ * @deprecated Use goog.getUid instead.
+ */
+goog.getHashCode = goog.getUid;
+
+
+/**
+ * Removes the hash code field from an object.
+ * @param {Object} obj The object to remove the field from.
+ * @deprecated Use goog.removeUid instead.
+ */
+goog.removeHashCode = goog.removeUid;
+
+
+/**
+ * Clones a value. The input may be an Object, Array, or basic type. Objects and
+ * arrays will be cloned recursively.
+ *
+ * WARNINGS:
+ * <code>goog.cloneObject</code> does not detect reference loops. Objects that
+ * refer to themselves will cause infinite recursion.
+ *
+ * <code>goog.cloneObject</code> is unaware of unique identifiers, and copies
+ * UIDs created by <code>getUid</code> into cloned results.
+ *
+ * @param {*} obj The value to clone.
+ * @return {*} A clone of the input value.
+ * @deprecated goog.cloneObject is unsafe. Prefer the goog.object methods.
+ */
+goog.cloneObject = function(obj) {
+ var type = goog.typeOf(obj);
+ if (type == 'object' || type == 'array') {
+ if (obj.clone) {
+ return obj.clone();
+ }
+ var clone = type == 'array' ? [] : {};
+ for (var key in obj) {
+ clone[key] = goog.cloneObject(obj[key]);
+ }
+ return clone;
+ }
+
+ return obj;
+};
+
+
+/**
+ * A native implementation of goog.bind.
+ * @param {?function(this:T, ...)} fn A function to partially apply.
+ * @param {T} selfObj Specifies the object which this should point to when the
+ * function is run.
+ * @param {...*} var_args Additional arguments that are partially applied to the
+ * function.
+ * @return {!Function} A partially-applied form of the function goog.bind() was
+ * invoked as a method of.
+ * @template T
+ * @private
+ */
+goog.bindNative_ = function(fn, selfObj, var_args) {
+ return /** @type {!Function} */ (fn.call.apply(fn.bind, arguments));
+};
+
+
+/**
+ * A pure-JS implementation of goog.bind.
+ * @param {?function(this:T, ...)} fn A function to partially apply.
+ * @param {T} selfObj Specifies the object which this should point to when the
+ * function is run.
+ * @param {...*} var_args Additional arguments that are partially applied to the
+ * function.
+ * @return {!Function} A partially-applied form of the function goog.bind() was
+ * invoked as a method of.
+ * @template T
+ * @private
+ */
+goog.bindJs_ = function(fn, selfObj, var_args) {
+ if (!fn) {
+ throw new Error();
+ }
+
+ if (arguments.length > 2) {
+ var boundArgs = Array.prototype.slice.call(arguments, 2);
+ return function() {
+ // Prepend the bound arguments to the current arguments.
+ var newArgs = Array.prototype.slice.call(arguments);
+ Array.prototype.unshift.apply(newArgs, boundArgs);
+ return fn.apply(selfObj, newArgs);
+ };
+
+ } else {
+ return function() {
+ return fn.apply(selfObj, arguments);
+ };
+ }
+};
+
+
+/**
+ * Partially applies this function to a particular 'this object' and zero or
+ * more arguments. The result is a new function with some arguments of the first
+ * function pre-filled and the value of this 'pre-specified'.
+ *
+ * Remaining arguments specified at call-time are appended to the pre-specified
+ * ones.
+ *
+ * Also see: {@link #partial}.
+ *
+ * Usage:
+ * <pre>var barMethBound = goog.bind(myFunction, myObj, 'arg1', 'arg2');
+ * barMethBound('arg3', 'arg4');</pre>
+ *
+ * @param {?function(this:T, ...)} fn A function to partially apply.
+ * @param {T} selfObj Specifies the object which this should point to when the
+ * function is run.
+ * @param {...*} var_args Additional arguments that are partially applied to the
+ * function.
+ * @return {!Function} A partially-applied form of the function goog.bind() was
+ * invoked as a method of.
+ * @template T
+ * @suppress {deprecated} See above.
+ */
+goog.bind = function(fn, selfObj, var_args) {
+ // TODO(nicksantos): narrow the type signature.
+ if (Function.prototype.bind &&
+ // NOTE(nicksantos): Somebody pulled base.js into the default Chrome
+ // extension environment. This means that for Chrome extensions, they get
+ // the implementation of Function.prototype.bind that calls goog.bind
+ // instead of the native one. Even worse, we don't want to introduce a
+ // circular dependency between goog.bind and Function.prototype.bind, so
+ // we have to hack this to make sure it works correctly.
+ Function.prototype.bind.toString().indexOf('native code') != -1) {
+ goog.bind = goog.bindNative_;
+ } else {
+ goog.bind = goog.bindJs_;
+ }
+ return goog.bind.apply(null, arguments);
+};
+
+
+/**
+ * Like goog.bind(), except that a 'this object' is not required. Useful when
+ * the target function is already bound.
+ *
+ * Usage:
+ * var g = goog.partial(f, arg1, arg2);
+ * g(arg3, arg4);
+ *
+ * @param {Function} fn A function to partially apply.
+ * @param {...*} var_args Additional arguments that are partially applied to fn.
+ * @return {!Function} A partially-applied form of the function goog.partial()
+ * was invoked as a method of.
+ */
+goog.partial = function(fn, var_args) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ return function() {
+ // Clone the array (with slice()) and append additional arguments
+ // to the existing arguments.
+ var newArgs = args.slice();
+ newArgs.push.apply(newArgs, arguments);
+ return fn.apply(this, newArgs);
+ };
+};
+
+
+/**
+ * Copies all the members of a source object to a target object. This method
+ * does not work on all browsers for all objects that contain keys such as
+ * toString or hasOwnProperty. Use goog.object.extend for this purpose.
+ * @param {Object} target Target.
+ * @param {Object} source Source.
+ */
+goog.mixin = function(target, source) {
+ for (var x in source) {
+ target[x] = source[x];
+ }
+
+ // For IE7 or lower, the for-in-loop does not contain any properties that are
+ // not enumerable on the prototype object (for example, isPrototypeOf from
+ // Object.prototype) but also it will not include 'replace' on objects that
+ // extend String and change 'replace' (not that it is common for anyone to
+ // extend anything except Object).
+};
+
+
+/**
+ * @return {number} An integer value representing the number of milliseconds
+ * between midnight, January 1, 1970 and the current time.
+ */
+goog.now = (goog.TRUSTED_SITE && Date.now) || (function() {
+ // Unary plus operator converts its operand to a number which in
+ // the case of
+ // a date is done by calling getTime().
+ return +new Date();
+ });
+
+
+/**
+ * Evals JavaScript in the global scope. In IE this uses execScript, other
+ * browsers use goog.global.eval. If goog.global.eval does not evaluate in the
+ * global scope (for example, in Safari), appends a script tag instead.
+ * Throws an exception if neither execScript or eval is defined.
+ * @param {string} script JavaScript string.
+ */
+goog.globalEval = function(script) {
+ if (goog.global.execScript) {
+ goog.global.execScript(script, 'JavaScript');
+ } else if (goog.global.eval) {
+ // Test to see if eval works
+ if (goog.evalWorksForGlobals_ == null) {
+ goog.global.eval('var _evalTest_ = 1;');
+ if (typeof goog.global['_evalTest_'] != 'undefined') {
+ try {
+ delete goog.global['_evalTest_'];
+ } catch (ignore) {
+ // Microsoft edge fails the deletion above in strict mode.
+ }
+ goog.evalWorksForGlobals_ = true;
+ } else {
+ goog.evalWorksForGlobals_ = false;
+ }
+ }
+
+ if (goog.evalWorksForGlobals_) {
+ goog.global.eval(script);
+ } else {
+ /** @type {Document} */
+ var doc = goog.global.document;
+ var scriptElt =
+ /** @type {!HTMLScriptElement} */ (doc.createElement('SCRIPT'));
+ scriptElt.type = 'text/javascript';
+ scriptElt.defer = false;
+ // Note(user): can't use .innerHTML since "t('<test>')" will fail and
+ // .text doesn't work in Safari 2. Therefore we append a text node.
+ scriptElt.appendChild(doc.createTextNode(script));
+ doc.body.appendChild(scriptElt);
+ doc.body.removeChild(scriptElt);
+ }
+ } else {
+ throw Error('goog.globalEval not available');
+ }
+};
+
+
+/**
+ * Indicates whether or not we can call 'eval' directly to eval code in the
+ * global scope. Set to a Boolean by the first call to goog.globalEval (which
+ * empirically tests whether eval works for globals). @see goog.globalEval
+ * @type {?boolean}
+ * @private
+ */
+goog.evalWorksForGlobals_ = null;
+
+
+/**
+ * Optional map of CSS class names to obfuscated names used with
+ * goog.getCssName().
+ * @private {!Object<string, string>|undefined}
+ * @see goog.setCssNameMapping
+ */
+goog.cssNameMapping_;
+
+
+/**
+ * Optional obfuscation style for CSS class names. Should be set to either
+ * 'BY_WHOLE' or 'BY_PART' if defined.
+ * @type {string|undefined}
+ * @private
+ * @see goog.setCssNameMapping
+ */
+goog.cssNameMappingStyle_;
+
+
+
+/**
+ * A hook for modifying the default behavior goog.getCssName. The function
+ * if present, will recieve the standard output of the goog.getCssName as
+ * its input.
+ *
+ * @type {(function(string):string)|undefined}
+ */
+goog.global.CLOSURE_CSS_NAME_MAP_FN;
+
+
+/**
+ * Handles strings that are intended to be used as CSS class names.
+ *
+ * This function works in tandem with @see goog.setCssNameMapping.
+ *
+ * Without any mapping set, the arguments are simple joined with a hyphen and
+ * passed through unaltered.
+ *
+ * When there is a mapping, there are two possible styles in which these
+ * mappings are used. In the BY_PART style, each part (i.e. in between hyphens)
+ * of the passed in css name is rewritten according to the map. In the BY_WHOLE
+ * style, the full css name is looked up in the map directly. If a rewrite is
+ * not specified by the map, the compiler will output a warning.
+ *
+ * When the mapping is passed to the compiler, it will replace calls to
+ * goog.getCssName with the strings from the mapping, e.g.
+ * var x = goog.getCssName('foo');
+ * var y = goog.getCssName(this.baseClass, 'active');
+ * becomes:
+ * var x = 'foo';
+ * var y = this.baseClass + '-active';
+ *
+ * If one argument is passed it will be processed, if two are passed only the
+ * modifier will be processed, as it is assumed the first argument was generated
+ * as a result of calling goog.getCssName.
+ *
+ * @param {string} className The class name.
+ * @param {string=} opt_modifier A modifier to be appended to the class name.
+ * @return {string} The class name or the concatenation of the class name and
+ * the modifier.
+ */
+goog.getCssName = function(className, opt_modifier) {
+ // String() is used for compatibility with compiled soy where the passed
+ // className can be non-string objects.
+ if (String(className).charAt(0) == '.') {
+ throw new Error(
+ 'className passed in goog.getCssName must not start with ".".' +
+ ' You passed: ' + className);
+ }
+
+ var getMapping = function(cssName) {
+ return goog.cssNameMapping_[cssName] || cssName;
+ };
+
+ var renameByParts = function(cssName) {
+ // Remap all the parts individually.
+ var parts = cssName.split('-');
+ var mapped = [];
+ for (var i = 0; i < parts.length; i++) {
+ mapped.push(getMapping(parts[i]));
+ }
+ return mapped.join('-');
+ };
+
+ var rename;
+ if (goog.cssNameMapping_) {
+ rename =
+ goog.cssNameMappingStyle_ == 'BY_WHOLE' ? getMapping : renameByParts;
+ } else {
+ rename = function(a) {
+ return a;
+ };
+ }
+
+ var result =
+ opt_modifier ? className + '-' + rename(opt_modifier) : rename(className);
+
+ // The special CLOSURE_CSS_NAME_MAP_FN allows users to specify further
+ // processing of the class name.
+ if (goog.global.CLOSURE_CSS_NAME_MAP_FN) {
+ return goog.global.CLOSURE_CSS_NAME_MAP_FN(result);
+ }
+
+ return result;
+};
+
+
+/**
+ * Sets the map to check when returning a value from goog.getCssName(). Example:
+ * <pre>
+ * goog.setCssNameMapping({
+ * "goog": "a",
+ * "disabled": "b",
+ * });
+ *
+ * var x = goog.getCssName('goog');
+ * // The following evaluates to: "a a-b".
+ * goog.getCssName('goog') + ' ' + goog.getCssName(x, 'disabled')
+ * </pre>
+ * When declared as a map of string literals to string literals, the JSCompiler
+ * will replace all calls to goog.getCssName() using the supplied map if the
+ * --process_closure_primitives flag is set.
+ *
+ * @param {!Object} mapping A map of strings to strings where keys are possible
+ * arguments to goog.getCssName() and values are the corresponding values
+ * that should be returned.
+ * @param {string=} opt_style The style of css name mapping. There are two valid
+ * options: 'BY_PART', and 'BY_WHOLE'.
+ * @see goog.getCssName for a description.
+ */
+goog.setCssNameMapping = function(mapping, opt_style) {
+ goog.cssNameMapping_ = mapping;
+ goog.cssNameMappingStyle_ = opt_style;
+};
+
+
+/**
+ * To use CSS renaming in compiled mode, one of the input files should have a
+ * call to goog.setCssNameMapping() with an object literal that the JSCompiler
+ * can extract and use to replace all calls to goog.getCssName(). In uncompiled
+ * mode, JavaScript code should be loaded before this base.js file that declares
+ * a global variable, CLOSURE_CSS_NAME_MAPPING, which is used below. This is
+ * to ensure that the mapping is loaded before any calls to goog.getCssName()
+ * are made in uncompiled mode.
+ *
+ * A hook for overriding the CSS name mapping.
+ * @type {!Object<string, string>|undefined}
+ */
+goog.global.CLOSURE_CSS_NAME_MAPPING;
+
+
+if (!COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING) {
+ // This does not call goog.setCssNameMapping() because the JSCompiler
+ // requires that goog.setCssNameMapping() be called with an object literal.
+ goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING;
+}
+
+
+/**
+ * Gets a localized message.
+ *
+ * This function is a compiler primitive. If you give the compiler a localized
+ * message bundle, it will replace the string at compile-time with a localized
+ * version, and expand goog.getMsg call to a concatenated string.
+ *
+ * Messages must be initialized in the form:
+ * <code>
+ * var MSG_NAME = goog.getMsg('Hello {$placeholder}', {'placeholder': 'world'});
+ * </code>
+ *
+ * This function produces a string which should be treated as plain text. Use
+ * {@link goog.html.SafeHtmlFormatter} in conjunction with goog.getMsg to
+ * produce SafeHtml.
+ *
+ * @param {string} str Translatable string, places holders in the form {$foo}.
+ * @param {Object<string, string>=} opt_values Maps place holder name to value.
+ * @return {string} message with placeholders filled.
+ */
+goog.getMsg = function(str, opt_values) {
+ if (opt_values) {
+ str = str.replace(/\{\$([^}]+)}/g, function(match, key) {
+ return (opt_values != null && key in opt_values) ? opt_values[key] :
+ match;
+ });
+ }
+ return str;
+};
+
+
+/**
+ * Gets a localized message. If the message does not have a translation, gives a
+ * fallback message.
+ *
+ * This is useful when introducing a new message that has not yet been
+ * translated into all languages.
+ *
+ * This function is a compiler primitive. Must be used in the form:
+ * <code>var x = goog.getMsgWithFallback(MSG_A, MSG_B);</code>
+ * where MSG_A and MSG_B were initialized with goog.getMsg.
+ *
+ * @param {string} a The preferred message.
+ * @param {string} b The fallback message.
+ * @return {string} The best translated message.
+ */
+goog.getMsgWithFallback = function(a, b) {
+ return a;
+};
+
+
+/**
+ * Exposes an unobfuscated global namespace path for the given object.
+ * Note that fields of the exported object *will* be obfuscated, unless they are
+ * exported in turn via this function or goog.exportProperty.
+ *
+ * Also handy for making public items that are defined in anonymous closures.
+ *
+ * ex. goog.exportSymbol('public.path.Foo', Foo);
+ *
+ * ex. goog.exportSymbol('public.path.Foo.staticFunction', Foo.staticFunction);
+ * public.path.Foo.staticFunction();
+ *
+ * ex. goog.exportSymbol('public.path.Foo.prototype.myMethod',
+ * Foo.prototype.myMethod);
+ * new public.path.Foo().myMethod();
+ *
+ * @param {string} publicPath Unobfuscated name to export.
+ * @param {*} object Object the name should point to.
+ * @param {Object=} opt_objectToExportTo The object to add the path to; default
+ * is goog.global.
+ */
+goog.exportSymbol = function(publicPath, object, opt_objectToExportTo) {
+ goog.exportPath_(publicPath, object, opt_objectToExportTo);
+};
+
+
+/**
+ * Exports a property unobfuscated into the object's namespace.
+ * ex. goog.exportProperty(Foo, 'staticFunction', Foo.staticFunction);
+ * ex. goog.exportProperty(Foo.prototype, 'myMethod', Foo.prototype.myMethod);
+ * @param {Object} object Object whose static property is being exported.
+ * @param {string} publicName Unobfuscated name to export.
+ * @param {*} symbol Object the name should point to.
+ */
+goog.exportProperty = function(object, publicName, symbol) {
+ object[publicName] = symbol;
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * Usage:
+ * <pre>
+ * function ParentClass(a, b) { }
+ * ParentClass.prototype.foo = function(a) { };
+ *
+ * function ChildClass(a, b, c) {
+ * ChildClass.base(this, 'constructor', a, b);
+ * }
+ * goog.inherits(ChildClass, ParentClass);
+ *
+ * var child = new ChildClass('a', 'b', 'see');
+ * child.foo(); // This works.
+ * </pre>
+ *
+ * @param {!Function} childCtor Child class.
+ * @param {!Function} parentCtor Parent class.
+ */
+goog.inherits = function(childCtor, parentCtor) {
+ /** @constructor */
+ function tempCtor() {}
+ tempCtor.prototype = parentCtor.prototype;
+ childCtor.superClass_ = parentCtor.prototype;
+ childCtor.prototype = new tempCtor();
+ /** @override */
+ childCtor.prototype.constructor = childCtor;
+
+ /**
+ * Calls superclass constructor/method.
+ *
+ * This function is only available if you use goog.inherits to
+ * express inheritance relationships between classes.
+ *
+ * NOTE: This is a replacement for goog.base and for superClass_
+ * property defined in childCtor.
+ *
+ * @param {!Object} me Should always be "this".
+ * @param {string} methodName The method name to call. Calling
+ * superclass constructor can be done with the special string
+ * 'constructor'.
+ * @param {...*} var_args The arguments to pass to superclass
+ * method/constructor.
+ * @return {*} The return value of the superclass method/constructor.
+ */
+ childCtor.base = function(me, methodName, var_args) {
+ // Copying using loop to avoid deop due to passing arguments object to
+ // function. This is faster in many JS engines as of late 2014.
+ var args = new Array(arguments.length - 2);
+ for (var i = 2; i < arguments.length; i++) {
+ args[i - 2] = arguments[i];
+ }
+ return parentCtor.prototype[methodName].apply(me, args);
+ };
+};
+
+
+/**
+ * Call up to the superclass.
+ *
+ * If this is called from a constructor, then this calls the superclass
+ * constructor with arguments 1-N.
+ *
+ * If this is called from a prototype method, then you must pass the name of the
+ * method as the second argument to this function. If you do not, you will get a
+ * runtime error. This calls the superclass' method with arguments 2-N.
+ *
+ * This function only works if you use goog.inherits to express inheritance
+ * relationships between your classes.
+ *
+ * This function is a compiler primitive. At compile-time, the compiler will do
+ * macro expansion to remove a lot of the extra overhead that this function
+ * introduces. The compiler will also enforce a lot of the assumptions that this
+ * function makes, and treat it as a compiler error if you break them.
+ *
+ * @param {!Object} me Should always be "this".
+ * @param {*=} opt_methodName The method name if calling a super method.
+ * @param {...*} var_args The rest of the arguments.
+ * @return {*} The return value of the superclass method.
+ * @suppress {es5Strict} This method can not be used in strict mode, but
+ * all Closure Library consumers must depend on this file.
+ * @deprecated goog.base is not strict mode compatible. Prefer the static
+ * "base" method added to the constructor by goog.inherits
+ * or ES6 classes and the "super" keyword.
+ */
+goog.base = function(me, opt_methodName, var_args) {
+ var caller = arguments.callee.caller;
+
+ if (goog.STRICT_MODE_COMPATIBLE || (goog.DEBUG && !caller)) {
+ throw Error(
+ 'arguments.caller not defined. goog.base() cannot be used ' +
+ 'with strict mode code. See ' +
+ 'http://www.ecma-international.org/ecma-262/5.1/#sec-C');
+ }
+
+ if (caller.superClass_) {
+ // Copying using loop to avoid deop due to passing arguments object to
+ // function. This is faster in many JS engines as of late 2014.
+ var ctorArgs = new Array(arguments.length - 1);
+ for (var i = 1; i < arguments.length; i++) {
+ ctorArgs[i - 1] = arguments[i];
+ }
+ // This is a constructor. Call the superclass constructor.
+ return caller.superClass_.constructor.apply(me, ctorArgs);
+ }
+
+ // Copying using loop to avoid deop due to passing arguments object to
+ // function. This is faster in many JS engines as of late 2014.
+ var args = new Array(arguments.length - 2);
+ for (var i = 2; i < arguments.length; i++) {
+ args[i - 2] = arguments[i];
+ }
+ var foundCaller = false;
+ for (var ctor = me.constructor; ctor;
+ ctor = ctor.superClass_ && ctor.superClass_.constructor) {
+ if (ctor.prototype[opt_methodName] === caller) {
+ foundCaller = true;
+ } else if (foundCaller) {
+ return ctor.prototype[opt_methodName].apply(me, args);
+ }
+ }
+
+ // If we did not find the caller in the prototype chain, then one of two
+ // things happened:
+ // 1) The caller is an instance method.
+ // 2) This method was not called by the right caller.
+ if (me[opt_methodName] === caller) {
+ return me.constructor.prototype[opt_methodName].apply(me, args);
+ } else {
+ throw Error(
+ 'goog.base called from a method of one name ' +
+ 'to a method of a different name');
+ }
+};
+
+
+/**
+ * Allow for aliasing within scope functions. This function exists for
+ * uncompiled code - in compiled code the calls will be inlined and the aliases
+ * applied. In uncompiled code the function is simply run since the aliases as
+ * written are valid JavaScript.
+ *
+ *
+ * @param {function()} fn Function to call. This function can contain aliases
+ * to namespaces (e.g. "var dom = goog.dom") or classes
+ * (e.g. "var Timer = goog.Timer").
+ */
+goog.scope = function(fn) {
+ if (goog.isInModuleLoader_()) {
+ throw Error('goog.scope is not supported within a goog.module.');
+ }
+ fn.call(goog.global);
+};
+
+
+/*
+ * To support uncompiled, strict mode bundles that use eval to divide source
+ * like so:
+ * eval('someSource;//# sourceUrl sourcefile.js');
+ * We need to export the globally defined symbols "goog" and "COMPILED".
+ * Exporting "goog" breaks the compiler optimizations, so we required that
+ * be defined externally.
+ * NOTE: We don't use goog.exportSymbol here because we don't want to trigger
+ * extern generation when that compiler option is enabled.
+ */
+if (!COMPILED) {
+ goog.global['COMPILED'] = COMPILED;
+}
+
+
+//==============================================================================
+// goog.defineClass implementation
+//==============================================================================
+
+
+/**
+ * Creates a restricted form of a Closure "class":
+ * - from the compiler's perspective, the instance returned from the
+ * constructor is sealed (no new properties may be added). This enables
+ * better checks.
+ * - the compiler will rewrite this definition to a form that is optimal
+ * for type checking and optimization (initially this will be a more
+ * traditional form).
+ *
+ * @param {Function} superClass The superclass, Object or null.
+ * @param {goog.defineClass.ClassDescriptor} def
+ * An object literal describing
+ * the class. It may have the following properties:
+ * "constructor": the constructor function
+ * "statics": an object literal containing methods to add to the constructor
+ * as "static" methods or a function that will receive the constructor
+ * function as its only parameter to which static properties can
+ * be added.
+ * all other properties are added to the prototype.
+ * @return {!Function} The class constructor.
+ */
+goog.defineClass = function(superClass, def) {
+ // TODO(johnlenz): consider making the superClass an optional parameter.
+ var constructor = def.constructor;
+ var statics = def.statics;
+ // Wrap the constructor prior to setting up the prototype and static methods.
+ if (!constructor || constructor == Object.prototype.constructor) {
+ constructor = function() {
+ throw Error('cannot instantiate an interface (no constructor defined).');
+ };
+ }
+
+ var cls = goog.defineClass.createSealingConstructor_(constructor, superClass);
+ if (superClass) {
+ goog.inherits(cls, superClass);
+ }
+
+ // Remove all the properties that should not be copied to the prototype.
+ delete def.constructor;
+ delete def.statics;
+
+ goog.defineClass.applyProperties_(cls.prototype, def);
+ if (statics != null) {
+ if (statics instanceof Function) {
+ statics(cls);
+ } else {
+ goog.defineClass.applyProperties_(cls, statics);
+ }
+ }
+
+ return cls;
+};
+
+
+/**
+ * @typedef {{
+ * constructor: (!Function|undefined),
+ * statics: (Object|undefined|function(Function):void)
+ * }}
+ */
+goog.defineClass.ClassDescriptor;
+
+
+/**
+ * @define {boolean} Whether the instances returned by goog.defineClass should
+ * be sealed when possible.
+ *
+ * When sealing is disabled the constructor function will not be wrapped by
+ * goog.defineClass, making it incompatible with ES6 class methods.
+ */
+goog.define('goog.defineClass.SEAL_CLASS_INSTANCES', goog.DEBUG);
+
+
+/**
+ * If goog.defineClass.SEAL_CLASS_INSTANCES is enabled and Object.seal is
+ * defined, this function will wrap the constructor in a function that seals the
+ * results of the provided constructor function.
+ *
+ * @param {!Function} ctr The constructor whose results maybe be sealed.
+ * @param {Function} superClass The superclass constructor.
+ * @return {!Function} The replacement constructor.
+ * @private
+ */
+goog.defineClass.createSealingConstructor_ = function(ctr, superClass) {
+ if (!goog.defineClass.SEAL_CLASS_INSTANCES) {
+ // Do now wrap the constructor when sealing is disabled. Angular code
+ // depends on this for injection to work properly.
+ return ctr;
+ }
+
+ // Compute whether the constructor is sealable at definition time, rather
+ // than when the instance is being constructed.
+ var superclassSealable = !goog.defineClass.isUnsealable_(superClass);
+
+ /**
+ * @this {Object}
+ * @return {?}
+ */
+ var wrappedCtr = function() {
+ // Don't seal an instance of a subclass when it calls the constructor of
+ // its super class as there is most likely still setup to do.
+ var instance = ctr.apply(this, arguments) || this;
+ instance[goog.UID_PROPERTY_] = instance[goog.UID_PROPERTY_];
+
+ if (this.constructor === wrappedCtr && superclassSealable &&
+ Object.seal instanceof Function) {
+ Object.seal(instance);
+ }
+ return instance;
+ };
+
+ return wrappedCtr;
+};
+
+
+/**
+ * @param {Function} ctr The constructor to test.
+ * @return {boolean} Whether the constructor has been tagged as unsealable
+ * using goog.tagUnsealableClass.
+ * @private
+ */
+goog.defineClass.isUnsealable_ = function(ctr) {
+ return ctr && ctr.prototype &&
+ ctr.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_];
+};
+
+
+// TODO(johnlenz): share these values with the goog.object
+/**
+ * The names of the fields that are defined on Object.prototype.
+ * @type {!Array<string>}
+ * @private
+ * @const
+ */
+goog.defineClass.OBJECT_PROTOTYPE_FIELDS_ = [
+ 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
+ 'toLocaleString', 'toString', 'valueOf'
+];
+
+
+// TODO(johnlenz): share this function with the goog.object
+/**
+ * @param {!Object} target The object to add properties to.
+ * @param {!Object} source The object to copy properties from.
+ * @private
+ */
+goog.defineClass.applyProperties_ = function(target, source) {
+ // TODO(johnlenz): update this to support ES5 getters/setters
+
+ var key;
+ for (key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+
+ // For IE the for-in-loop does not contain any properties that are not
+ // enumerable on the prototype object (for example isPrototypeOf from
+ // Object.prototype) and it will also not include 'replace' on objects that
+ // extend String and change 'replace' (not that it is common for anyone to
+ // extend anything except Object).
+ for (var i = 0; i < goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length; i++) {
+ key = goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[i];
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+};
+
+
+/**
+ * Sealing classes breaks the older idiom of assigning properties on the
+ * prototype rather than in the constructor. As such, goog.defineClass
+ * must not seal subclasses of these old-style classes until they are fixed.
+ * Until then, this marks a class as "broken", instructing defineClass
+ * not to seal subclasses.
+ * @param {!Function} ctr The legacy constructor to tag as unsealable.
+ */
+goog.tagUnsealableClass = function(ctr) {
+ if (!COMPILED && goog.defineClass.SEAL_CLASS_INSTANCES) {
+ ctr.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_] = true;
+ }
+};
+
+
+/**
+ * Name for unsealable tag property.
+ * @const @private {string}
+ */
+goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_ = 'goog_defineClass_legacy_unsealable';
+
+
+/**
+ * Returns a newly created map from language mode string to a boolean
+ * indicating whether transpilation should be done for that mode.
+ *
+ * Guaranteed invariant:
+ * For any two modes, l1 and l2 where l2 is a newer mode than l1,
+ * `map[l1] == true` implies that `map[l2] == true`.
+ * @private
+ * @return {!Object<string, boolean>}
+ */
+goog.createRequiresTranspilation_ = function() {
+ var /** !Object<string, boolean> */ requiresTranspilation = {'es3': false};
+ var transpilationRequiredForAllLaterModes = false;
+
+ /**
+ * Adds an entry to requiresTranspliation for the given language mode.
+ *
+ * IMPORTANT: Calls must be made in order from oldest to newest language
+ * mode.
+ * @param {string} modeName
+ * @param {function(): boolean} isSupported Returns true if the JS engine
+ * supports the given mode.
+ */
+ function addNewerLanguageTranspilationCheck(modeName, isSupported) {
+ if (transpilationRequiredForAllLaterModes) {
+ requiresTranspilation[modeName] = true;
+ } else if (isSupported()) {
+ requiresTranspilation[modeName] = false;
+ } else {
+ requiresTranspilation[modeName] = true;
+ transpilationRequiredForAllLaterModes = true;
+ }
+ }
+
+ /**
+ * Does the given code evaluate without syntax errors and return a truthy
+ * result?
+ */
+ function /** boolean */ evalCheck(/** string */ code) {
+ try {
+ return !!eval(code);
+ } catch (ignored) {
+ return false;
+ }
+ }
+
+ var userAgent = goog.global.navigator && goog.global.navigator.userAgent ?
+ goog.global.navigator.userAgent :
+ '';
+
+ // Identify ES3-only browsers by their incorrect treatment of commas.
+ addNewerLanguageTranspilationCheck('es5', function() {
+ return evalCheck('[1,].length==1');
+ });
+ addNewerLanguageTranspilationCheck('es6', function() {
+ // Edge has a non-deterministic (i.e., not reproducible) bug with ES6:
+ // https://github.com/Microsoft/ChakraCore/issues/1496.
+ var re = /Edge\/(\d+)(\.\d)*/i;
+ var edgeUserAgent = userAgent.match(re);
+ if (edgeUserAgent && Number(edgeUserAgent[1]) < 15) {
+ return false;
+ }
+ // Test es6: [FF50 (?), Edge 14 (?), Chrome 50]
+ // (a) default params (specifically shadowing locals),
+ // (b) destructuring, (c) block-scoped functions,
+ // (d) for-of (const), (e) new.target/Reflect.construct
+ var es6fullTest =
+ 'class X{constructor(){if(new.target!=String)throw 1;this.x=42}}' +
+ 'let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof ' +
+ 'String))throw 1;for(const a of[2,3]){if(a==2)continue;function ' +
+ 'f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()' +
+ '==3}';
+
+ return evalCheck('(()=>{"use strict";' + es6fullTest + '})()');
+ });
+ // TODO(joeltine): Remove es6-impl references for b/31340605.
+ // Consider es6-impl (widely-implemented es6 features) to be supported
+ // whenever es6 is supported. Technically es6-impl is a lower level of
+ // support than es6, but we don't have tests specifically for it.
+ addNewerLanguageTranspilationCheck('es6-impl', function() {
+ return true;
+ });
+ // ** and **= are the only new features in 'es7'
+ addNewerLanguageTranspilationCheck('es7', function() {
+ return evalCheck('2 ** 2 == 4');
+ });
+ // async functions are the only new features in 'es8'
+ addNewerLanguageTranspilationCheck('es8', function() {
+ return evalCheck('async () => 1, true');
+ });
+ return requiresTranspilation;
+};
diff --git a/src/http/static/viz/2/goog/debug/entrypointregistry.js b/src/http/static/viz/2/goog/debug/entrypointregistry.js
new file mode 100644
index 0000000..336e146
--- /dev/null
+++ b/src/http/static/viz/2/goog/debug/entrypointregistry.js
@@ -0,0 +1,159 @@
+// Copyright 2010 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A global registry for entry points into a program,
+ * so that they can be instrumented. Each module should register their
+ * entry points with this registry. Designed to be compiled out
+ * if no instrumentation is requested.
+ *
+ * Entry points may be registered before or after a call to
+ * goog.debug.entryPointRegistry.monitorAll. If an entry point is registered
+ * later, the existing monitor will instrument the new entry point.
+ *
+ * @author nicksantos@google.com (Nick Santos)
+ */
+
+goog.provide('goog.debug.EntryPointMonitor');
+goog.provide('goog.debug.entryPointRegistry');
+
+goog.require('goog.asserts');
+
+
+
+/**
+ * @interface
+ */
+goog.debug.EntryPointMonitor = function() {};
+
+
+/**
+ * Instruments a function.
+ *
+ * @param {!Function} fn A function to instrument.
+ * @return {!Function} The instrumented function.
+ */
+goog.debug.EntryPointMonitor.prototype.wrap;
+
+
+/**
+ * Try to remove an instrumentation wrapper created by this monitor.
+ * If the function passed to unwrap is not a wrapper created by this
+ * monitor, then we will do nothing.
+ *
+ * Notice that some wrappers may not be unwrappable. For example, if other
+ * monitors have applied their own wrappers, then it will be impossible to
+ * unwrap them because their wrappers will have captured our wrapper.
+ *
+ * So it is important that entry points are unwrapped in the reverse
+ * order that they were wrapped.
+ *
+ * @param {!Function} fn A function to unwrap.
+ * @return {!Function} The unwrapped function, or {@code fn} if it was not
+ * a wrapped function created by this monitor.
+ */
+goog.debug.EntryPointMonitor.prototype.unwrap;
+
+
+/**
+ * An array of entry point callbacks.
+ * @type {!Array<function(!Function)>}
+ * @private
+ */
+goog.debug.entryPointRegistry.refList_ = [];
+
+
+/**
+ * Monitors that should wrap all the entry points.
+ * @type {!Array<!goog.debug.EntryPointMonitor>}
+ * @private
+ */
+goog.debug.entryPointRegistry.monitors_ = [];
+
+
+/**
+ * Whether goog.debug.entryPointRegistry.monitorAll has ever been called.
+ * Checking this allows the compiler to optimize out the registrations.
+ * @type {boolean}
+ * @private
+ */
+goog.debug.entryPointRegistry.monitorsMayExist_ = false;
+
+
+/**
+ * Register an entry point with this module.
+ *
+ * The entry point will be instrumented when a monitor is passed to
+ * goog.debug.entryPointRegistry.monitorAll. If this has already occurred, the
+ * entry point is instrumented immediately.
+ *
+ * @param {function(!Function)} callback A callback function which is called
+ * with a transforming function to instrument the entry point. The callback
+ * is responsible for wrapping the relevant entry point with the
+ * transforming function.
+ */
+goog.debug.entryPointRegistry.register = function(callback) {
+ // Don't use push(), so that this can be compiled out.
+ goog.debug.entryPointRegistry
+ .refList_[goog.debug.entryPointRegistry.refList_.length] = callback;
+ // If no one calls monitorAll, this can be compiled out.
+ if (goog.debug.entryPointRegistry.monitorsMayExist_) {
+ var monitors = goog.debug.entryPointRegistry.monitors_;
+ for (var i = 0; i < monitors.length; i++) {
+ callback(goog.bind(monitors[i].wrap, monitors[i]));
+ }
+ }
+};
+
+
+/**
+ * Configures a monitor to wrap all entry points.
+ *
+ * Entry points that have already been registered are immediately wrapped by
+ * the monitor. When an entry point is registered in the future, it will also
+ * be wrapped by the monitor when it is registered.
+ *
+ * @param {!goog.debug.EntryPointMonitor} monitor An entry point monitor.
+ */
+goog.debug.entryPointRegistry.monitorAll = function(monitor) {
+ goog.debug.entryPointRegistry.monitorsMayExist_ = true;
+ var transformer = goog.bind(monitor.wrap, monitor);
+ for (var i = 0; i < goog.debug.entryPointRegistry.refList_.length; i++) {
+ goog.debug.entryPointRegistry.refList_[i](transformer);
+ }
+ goog.debug.entryPointRegistry.monitors_.push(monitor);
+};
+
+
+/**
+ * Try to unmonitor all the entry points that have already been registered. If
+ * an entry point is registered in the future, it will not be wrapped by the
+ * monitor when it is registered. Note that this may fail if the entry points
+ * have additional wrapping.
+ *
+ * @param {!goog.debug.EntryPointMonitor} monitor The last monitor to wrap
+ * the entry points.
+ * @throws {Error} If the monitor is not the most recently configured monitor.
+ */
+goog.debug.entryPointRegistry.unmonitorAllIfPossible = function(monitor) {
+ var monitors = goog.debug.entryPointRegistry.monitors_;
+ goog.asserts.assert(
+ monitor == monitors[monitors.length - 1],
+ 'Only the most recent monitor can be unwrapped.');
+ var transformer = goog.bind(monitor.unwrap, monitor);
+ for (var i = 0; i < goog.debug.entryPointRegistry.refList_.length; i++) {
+ goog.debug.entryPointRegistry.refList_[i](transformer);
+ }
+ monitors.length--;
+};
diff --git a/src/http/static/viz/2/goog/debug/error.js b/src/http/static/viz/2/goog/debug/error.js
new file mode 100644
index 0000000..5f1bd3e
--- /dev/null
+++ b/src/http/static/viz/2/goog/debug/error.js
@@ -0,0 +1,63 @@
+// Copyright 2009 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Provides a base class for custom Error objects such that the
+ * stack is correctly maintained.
+ *
+ * You should never need to throw goog.debug.Error(msg) directly, Error(msg) is
+ * sufficient.
+ *
+ */
+
+goog.provide('goog.debug.Error');
+
+
+
+/**
+ * Base class for custom error objects.
+ * @param {*=} opt_msg The message associated with the error.
+ * @constructor
+ * @extends {Error}
+ */
+goog.debug.Error = function(opt_msg) {
+
+ // Attempt to ensure there is a stack trace.
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, goog.debug.Error);
+ } else {
+ var stack = new Error().stack;
+ if (stack) {
+ this.stack = stack;
+ }
+ }
+
+ if (opt_msg) {
+ this.message = String(opt_msg);
+ }
+
+ /**
+ * Whether to report this error to the server. Setting this to false will
+ * cause the error reporter to not report the error back to the server,
+ * which can be useful if the client knows that the error has already been
+ * logged on the server.
+ * @type {boolean}
+ */
+ this.reportErrorToServer = true;
+};
+goog.inherits(goog.debug.Error, Error);
+
+
+/** @override */
+goog.debug.Error.prototype.name = 'CustomError';
diff --git a/src/http/static/viz/2/goog/deps.js b/src/http/static/viz/2/goog/deps.js
new file mode 100644
index 0000000..5cd5066
--- /dev/null
+++ b/src/http/static/viz/2/goog/deps.js
@@ -0,0 +1,1564 @@
+// Copyright 2017 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// This file has been auto-generated by GenJsDeps, please do not edit.
+
+// Disable Clang formatter for this file.
+// See http://goo.gl/SdiwZH
+// clang-format off
+
+goog.addDependency('caja/string/html/htmlparser.js', ['goog.string.html', 'goog.string.html.HtmlParser', 'goog.string.html.HtmlParser.EFlags', 'goog.string.html.HtmlParser.Elements', 'goog.string.html.HtmlParser.Entities', 'goog.string.html.HtmlSaxHandler'], [], {});
+goog.addDependency('dojo/dom/query.js', ['goog.dom.query'], ['goog.array', 'goog.dom', 'goog.functions', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('dojo/dom/query_test.js', ['goog.dom.query_test'], ['goog.dom', 'goog.dom.query', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('loremipsum/text/loremipsum.js', ['goog.text.LoremIpsum'], ['goog.array', 'goog.math', 'goog.string', 'goog.structs.Map', 'goog.structs.Set'], {});
+goog.addDependency('mochikit/async/deferred.js', ['goog.async.Deferred', 'goog.async.Deferred.AlreadyCalledError', 'goog.async.Deferred.CanceledError'], ['goog.Promise', 'goog.Thenable', 'goog.array', 'goog.asserts', 'goog.debug.Error'], {});
+goog.addDependency('mochikit/async/deferredlist.js', ['goog.async.DeferredList'], ['goog.async.Deferred'], {});
+goog.addDependency('svgpan/svgpan.js', ['svgpan.SvgPan'], ['goog.Disposable', 'goog.events', 'goog.events.EventType', 'goog.events.MouseWheelHandler'], {});
+goog.addDependency('a11y/aria/announcer.js', ['goog.a11y.aria.Announcer'], ['goog.Disposable', 'goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.object'], {});
+goog.addDependency('a11y/aria/announcer_test.js', ['goog.a11y.aria.AnnouncerTest'], ['goog.a11y.aria', 'goog.a11y.aria.Announcer', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.iframe', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('a11y/aria/aria.js', ['goog.a11y.aria'], ['goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.a11y.aria.datatables', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.object', 'goog.string'], {});
+goog.addDependency('a11y/aria/aria_test.js', ['goog.a11y.ariaTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit'], {});
+goog.addDependency('a11y/aria/attributes.js', ['goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.CheckedValues', 'goog.a11y.aria.DropEffectValues', 'goog.a11y.aria.ExpandedValues', 'goog.a11y.aria.GrabbedValues', 'goog.a11y.aria.InvalidValues', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.OrientationValues', 'goog.a11y.aria.PressedValues', 'goog.a11y.aria.RelevantValues', 'goog.a11y.aria.SelectedValues', 'goog.a11y.aria.SortValues', 'goog.a11y.aria.State'], [], {});
+goog.addDependency('a11y/aria/datatables.js', ['goog.a11y.aria.datatables'], ['goog.a11y.aria.State', 'goog.object'], {});
+goog.addDependency('a11y/aria/roles.js', ['goog.a11y.aria.Role'], [], {});
+goog.addDependency('array/array.js', ['goog.array'], ['goog.asserts'], {});
+goog.addDependency('array/array_test.js', ['goog.arrayTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('asserts/asserts.js', ['goog.asserts', 'goog.asserts.AssertionError'], ['goog.debug.Error', 'goog.dom.NodeType', 'goog.string'], {});
+goog.addDependency('asserts/asserts_test.js', ['goog.assertsTest'], ['goog.asserts', 'goog.asserts.AssertionError', 'goog.dom', 'goog.dom.TagName', 'goog.string', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('async/animationdelay.js', ['goog.async.AnimationDelay'], ['goog.Disposable', 'goog.events', 'goog.functions'], {});
+goog.addDependency('async/animationdelay_test.js', ['goog.async.AnimationDelayTest'], ['goog.Promise', 'goog.Timer', 'goog.async.AnimationDelay', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('async/conditionaldelay.js', ['goog.async.ConditionalDelay'], ['goog.Disposable', 'goog.async.Delay'], {});
+goog.addDependency('async/conditionaldelay_test.js', ['goog.async.ConditionalDelayTest'], ['goog.async.ConditionalDelay', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('async/debouncer.js', ['goog.async.Debouncer'], ['goog.Disposable', 'goog.Timer'], {});
+goog.addDependency('async/debouncer_test.js', ['goog.async.DebouncerTest'], ['goog.array', 'goog.async.Debouncer', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('async/delay.js', ['goog.Delay', 'goog.async.Delay'], ['goog.Disposable', 'goog.Timer'], {});
+goog.addDependency('async/delay_test.js', ['goog.async.DelayTest'], ['goog.async.Delay', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('async/freelist.js', ['goog.async.FreeList'], [], {});
+goog.addDependency('async/freelist_test.js', ['goog.async.FreeListTest'], ['goog.async.FreeList', 'goog.testing.jsunit'], {});
+goog.addDependency('async/nexttick.js', ['goog.async.nextTick', 'goog.async.throwException'], ['goog.debug.entryPointRegistry', 'goog.dom.TagName', 'goog.functions', 'goog.labs.userAgent.browser', 'goog.labs.userAgent.engine'], {});
+goog.addDependency('async/nexttick_test.js', ['goog.async.nextTickTest'], ['goog.Promise', 'goog.Timer', 'goog.async.nextTick', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.dom', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('async/run.js', ['goog.async.run'], ['goog.async.WorkQueue', 'goog.async.nextTick', 'goog.async.throwException'], {});
+goog.addDependency('async/run_test.js', ['goog.async.runTest'], ['goog.async.run', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('async/throttle.js', ['goog.Throttle', 'goog.async.Throttle'], ['goog.Disposable', 'goog.Timer'], {});
+goog.addDependency('async/throttle_test.js', ['goog.async.ThrottleTest'], ['goog.async.Throttle', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('async/workqueue.js', ['goog.async.WorkItem', 'goog.async.WorkQueue'], ['goog.asserts', 'goog.async.FreeList'], {});
+goog.addDependency('async/workqueue_test.js', ['goog.async.WorkQueueTest'], ['goog.async.WorkQueue', 'goog.testing.jsunit'], {});
+goog.addDependency('base.js', ['goog'], [], {});
+goog.addDependency('base_module_test.js', ['goog.baseModuleTest'], ['goog.Timer', 'goog.test_module', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('base_test.js', ['goog.baseTest'], ['goog.Promise', 'goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.object', 'goog.test_module', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('color/alpha.js', ['goog.color.alpha'], ['goog.color'], {});
+goog.addDependency('color/alpha_test.js', ['goog.color.alphaTest'], ['goog.array', 'goog.color', 'goog.color.alpha', 'goog.testing.jsunit'], {});
+goog.addDependency('color/color.js', ['goog.color', 'goog.color.Hsl', 'goog.color.Hsv', 'goog.color.Rgb'], ['goog.color.names', 'goog.math'], {});
+goog.addDependency('color/color_test.js', ['goog.colorTest'], ['goog.array', 'goog.color', 'goog.color.names', 'goog.testing.jsunit'], {});
+goog.addDependency('color/names.js', ['goog.color.names'], [], {});
+goog.addDependency('crypt/aes.js', ['goog.crypt.Aes'], ['goog.asserts', 'goog.crypt.BlockCipher'], {});
+goog.addDependency('crypt/aes_test.js', ['goog.crypt.AesTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/arc4.js', ['goog.crypt.Arc4'], ['goog.asserts'], {});
+goog.addDependency('crypt/arc4_test.js', ['goog.crypt.Arc4Test'], ['goog.array', 'goog.crypt.Arc4', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/base64.js', ['goog.crypt.base64'], ['goog.asserts', 'goog.crypt', 'goog.string', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('crypt/base64_test.js', ['goog.crypt.base64Test'], ['goog.crypt', 'goog.crypt.base64', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/basen.js', ['goog.crypt.baseN'], [], {});
+goog.addDependency('crypt/basen_test.js', ['goog.crypt.baseNTest'], ['goog.crypt.baseN', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/blobhasher.js', ['goog.crypt.BlobHasher', 'goog.crypt.BlobHasher.EventType'], ['goog.asserts', 'goog.events.EventTarget', 'goog.fs', 'goog.log'], {});
+goog.addDependency('crypt/blobhasher_test.js', ['goog.crypt.BlobHasherTest'], ['goog.crypt', 'goog.crypt.BlobHasher', 'goog.crypt.Md5', 'goog.events', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/blockcipher.js', ['goog.crypt.BlockCipher'], [], {});
+goog.addDependency('crypt/bytestring_perf.js', ['goog.crypt.byteArrayToStringPerf'], ['goog.array', 'goog.dom', 'goog.testing.PerformanceTable'], {});
+goog.addDependency('crypt/cbc.js', ['goog.crypt.Cbc'], ['goog.array', 'goog.asserts', 'goog.crypt', 'goog.crypt.BlockCipher'], {});
+goog.addDependency('crypt/cbc_test.js', ['goog.crypt.CbcTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.crypt.Cbc', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/crypt.js', ['goog.crypt'], ['goog.array', 'goog.asserts'], {});
+goog.addDependency('crypt/crypt_test.js', ['goog.cryptTest'], ['goog.crypt', 'goog.string', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/ctr.js', ['goog.crypt.Ctr'], ['goog.array', 'goog.asserts', 'goog.crypt'], {});
+goog.addDependency('crypt/ctr_test.js', ['goog.crypt.CtrTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.crypt.Ctr', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/hash.js', ['goog.crypt.Hash'], [], {});
+goog.addDependency('crypt/hash32.js', ['goog.crypt.hash32'], ['goog.crypt'], {});
+goog.addDependency('crypt/hash32_test.js', ['goog.crypt.hash32Test'], ['goog.crypt.hash32', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/hashtester.js', ['goog.crypt.hashTester'], ['goog.array', 'goog.crypt', 'goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTable', 'goog.testing.PseudoRandom', 'goog.testing.asserts'], {});
+goog.addDependency('crypt/hmac.js', ['goog.crypt.Hmac'], ['goog.crypt.Hash'], {});
+goog.addDependency('crypt/hmac_test.js', ['goog.crypt.HmacTest'], ['goog.crypt.Hmac', 'goog.crypt.Sha1', 'goog.crypt.hashTester', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/md5.js', ['goog.crypt.Md5'], ['goog.crypt.Hash'], {});
+goog.addDependency('crypt/md5_test.js', ['goog.crypt.Md5Test'], ['goog.crypt', 'goog.crypt.Md5', 'goog.crypt.hashTester', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/pbkdf2.js', ['goog.crypt.pbkdf2'], ['goog.array', 'goog.asserts', 'goog.crypt', 'goog.crypt.Hmac', 'goog.crypt.Sha1'], {});
+goog.addDependency('crypt/pbkdf2_test.js', ['goog.crypt.pbkdf2Test'], ['goog.crypt', 'goog.crypt.pbkdf2', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('crypt/sha1.js', ['goog.crypt.Sha1'], ['goog.crypt.Hash'], {});
+goog.addDependency('crypt/sha1_test.js', ['goog.crypt.Sha1Test'], ['goog.crypt', 'goog.crypt.Sha1', 'goog.crypt.hashTester', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('crypt/sha2.js', ['goog.crypt.Sha2'], ['goog.array', 'goog.asserts', 'goog.crypt.Hash'], {});
+goog.addDependency('crypt/sha224.js', ['goog.crypt.Sha224'], ['goog.crypt.Sha2'], {});
+goog.addDependency('crypt/sha224_test.js', ['goog.crypt.Sha224Test'], ['goog.crypt', 'goog.crypt.Sha224', 'goog.crypt.hashTester', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/sha256.js', ['goog.crypt.Sha256'], ['goog.crypt.Sha2'], {});
+goog.addDependency('crypt/sha256_test.js', ['goog.crypt.Sha256Test'], ['goog.crypt', 'goog.crypt.Sha256', 'goog.crypt.hashTester', 'goog.testing.jsunit'], {});
+goog.addDependency('crypt/sha2_64bit.js', ['goog.crypt.Sha2_64bit'], ['goog.array', 'goog.asserts', 'goog.crypt.Hash', 'goog.math.Long'], {});
+goog.addDependency('crypt/sha2_64bit_test.js', ['goog.crypt.Sha2_64bit_test'], ['goog.array', 'goog.crypt', 'goog.crypt.Sha384', 'goog.crypt.Sha512', 'goog.crypt.Sha512_256', 'goog.crypt.hashTester', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('crypt/sha384.js', ['goog.crypt.Sha384'], ['goog.crypt.Sha2_64bit'], {});
+goog.addDependency('crypt/sha512.js', ['goog.crypt.Sha512'], ['goog.crypt.Sha2_64bit'], {});
+goog.addDependency('crypt/sha512_256.js', ['goog.crypt.Sha512_256'], ['goog.crypt.Sha2_64bit'], {});
+goog.addDependency('cssom/cssom.js', ['goog.cssom', 'goog.cssom.CssRuleType'], ['goog.array', 'goog.dom', 'goog.dom.TagName'], {});
+goog.addDependency('cssom/cssom_test.js', ['goog.cssomTest'], ['goog.array', 'goog.cssom', 'goog.cssom.CssRuleType', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('cssom/iframe/style.js', ['goog.cssom.iframe.style'], ['goog.asserts', 'goog.cssom', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('cssom/iframe/style_test.js', ['goog.cssom.iframe.styleTest'], ['goog.cssom', 'goog.cssom.iframe.style', 'goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('datasource/datamanager.js', ['goog.ds.DataManager'], ['goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.Expr', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.Map'], {});
+goog.addDependency('datasource/datasource.js', ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.DataNodeList', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState', 'goog.ds.SortedNodeList', 'goog.ds.Util', 'goog.ds.logger'], ['goog.array', 'goog.log'], {});
+goog.addDependency('datasource/datasource_test.js', ['goog.ds.JsDataSourceTest'], ['goog.dom.xml', 'goog.ds.DataManager', 'goog.ds.JsDataSource', 'goog.ds.SortedNodeList', 'goog.ds.XmlDataSource', 'goog.testing.jsunit'], {});
+goog.addDependency('datasource/expr.js', ['goog.ds.Expr'], ['goog.ds.BasicNodeList', 'goog.ds.EmptyNodeList', 'goog.string'], {});
+goog.addDependency('datasource/expr_test.js', ['goog.ds.ExprTest'], ['goog.ds.DataManager', 'goog.ds.Expr', 'goog.ds.JsDataSource', 'goog.testing.jsunit'], {});
+goog.addDependency('datasource/fastdatanode.js', ['goog.ds.AbstractFastDataNode', 'goog.ds.FastDataNode', 'goog.ds.FastListNode', 'goog.ds.PrimitiveFastDataNode'], ['goog.ds.DataManager', 'goog.ds.DataNodeList', 'goog.ds.EmptyNodeList', 'goog.string'], {});
+goog.addDependency('datasource/fastdatanode_test.js', ['goog.ds.FastDataNodeTest'], ['goog.array', 'goog.ds.DataManager', 'goog.ds.Expr', 'goog.ds.FastDataNode', 'goog.testing.jsunit'], {});
+goog.addDependency('datasource/jsdatasource.js', ['goog.ds.JsDataSource', 'goog.ds.JsPropertyDataSource'], ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.DataNode', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState'], {});
+goog.addDependency('datasource/jsondatasource.js', ['goog.ds.JsonDataSource'], ['goog.Uri', 'goog.dom', 'goog.dom.TagName', 'goog.ds.DataManager', 'goog.ds.JsDataSource', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.log'], {});
+goog.addDependency('datasource/jsxmlhttpdatasource.js', ['goog.ds.JsXmlHttpDataSource'], ['goog.Uri', 'goog.ds.DataManager', 'goog.ds.FastDataNode', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.events', 'goog.json', 'goog.log', 'goog.net.EventType', 'goog.net.XhrIo'], {});
+goog.addDependency('datasource/jsxmlhttpdatasource_test.js', ['goog.ds.JsXmlHttpDataSourceTest'], ['goog.ds.JsXmlHttpDataSource', 'goog.testing.TestQueue', 'goog.testing.jsunit', 'goog.testing.net.XhrIo'], {});
+goog.addDependency('datasource/xmldatasource.js', ['goog.ds.XmlDataSource', 'goog.ds.XmlHttpDataSource'], ['goog.Uri', 'goog.dom.NodeType', 'goog.dom.xml', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.DataNode', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.log', 'goog.net.XhrIo', 'goog.string'], {});
+goog.addDependency('date/date.js', ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay'], ['goog.asserts', 'goog.date.DateLike', 'goog.i18n.DateTimeSymbols', 'goog.string'], {});
+goog.addDependency('date/date_test.js', ['goog.dateTest'], ['goog.array', 'goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay', 'goog.i18n.DateTimeSymbols', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.platform', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('date/datelike.js', ['goog.date.DateLike'], [], {});
+goog.addDependency('date/daterange.js', ['goog.date.DateRange', 'goog.date.DateRange.Iterator', 'goog.date.DateRange.StandardDateRangeKeys'], ['goog.date.Date', 'goog.date.Interval', 'goog.iter.Iterator', 'goog.iter.StopIteration'], {});
+goog.addDependency('date/daterange_test.js', ['goog.date.DateRangeTest'], ['goog.date.Date', 'goog.date.DateRange', 'goog.date.Interval', 'goog.i18n.DateTimeSymbols', 'goog.testing.jsunit'], {});
+goog.addDependency('date/duration.js', ['goog.date.duration'], ['goog.i18n.DateTimeFormat', 'goog.i18n.MessageFormat'], {});
+goog.addDependency('date/duration_test.js', ['goog.date.durationTest'], ['goog.date.duration', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.testing.jsunit'], {});
+goog.addDependency('date/relative.js', ['goog.date.relative', 'goog.date.relative.TimeDeltaFormatter', 'goog.date.relative.Unit'], ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns'], {});
+goog.addDependency('date/relative_test.js', ['goog.date.relativeTest'], ['goog.date.DateTime', 'goog.date.relative', 'goog.i18n.DateTimeFormat', 'goog.testing.jsunit'], {});
+goog.addDependency('date/relativewithplurals.js', ['goog.date.relativeWithPlurals'], ['goog.date.relative', 'goog.date.relative.Unit', 'goog.i18n.MessageFormat'], {});
+goog.addDependency('date/relativewithplurals_test.js', ['goog.date.relativeWithPluralsTest'], ['goog.date.relative', 'goog.date.relativeTest', 'goog.date.relativeWithPlurals', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_fa'], {});
+goog.addDependency('date/utcdatetime.js', ['goog.date.UtcDateTime'], ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval'], {});
+goog.addDependency('date/utcdatetime_test.js', ['goog.date.UtcDateTimeTest'], ['goog.date.Interval', 'goog.date.UtcDateTime', 'goog.date.month', 'goog.date.weekDay', 'goog.testing.jsunit'], {});
+goog.addDependency('db/cursor.js', ['goog.db.Cursor'], ['goog.async.Deferred', 'goog.db.Error', 'goog.db.KeyRange', 'goog.debug', 'goog.events.EventTarget'], {});
+goog.addDependency('db/db.js', ['goog.db', 'goog.db.BlockedCallback', 'goog.db.UpgradeNeededCallback'], ['goog.asserts', 'goog.async.Deferred', 'goog.db.Error', 'goog.db.IndexedDb', 'goog.db.Transaction'], {});
+goog.addDependency('db/db_test.js', ['goog.dbTest'], ['goog.Disposable', 'goog.Promise', 'goog.array', 'goog.db', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.IndexedDb', 'goog.db.KeyRange', 'goog.db.Transaction', 'goog.events', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent.product'], {});
+goog.addDependency('db/error.js', ['goog.db.DomErrorLike', 'goog.db.Error', 'goog.db.Error.ErrorCode', 'goog.db.Error.ErrorName', 'goog.db.Error.VersionChangeBlockedError'], ['goog.asserts', 'goog.debug.Error'], {});
+goog.addDependency('db/index.js', ['goog.db.Index'], ['goog.async.Deferred', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.KeyRange', 'goog.debug'], {});
+goog.addDependency('db/indexeddb.js', ['goog.db.IndexedDb'], ['goog.db.Error', 'goog.db.ObjectStore', 'goog.db.Transaction', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget'], {});
+goog.addDependency('db/keyrange.js', ['goog.db.KeyRange'], [], {});
+goog.addDependency('db/objectstore.js', ['goog.db.ObjectStore'], ['goog.async.Deferred', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.Index', 'goog.db.KeyRange', 'goog.debug', 'goog.events'], {});
+goog.addDependency('db/transaction.js', ['goog.db.Transaction', 'goog.db.Transaction.TransactionMode'], ['goog.async.Deferred', 'goog.db.Error', 'goog.db.ObjectStore', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget'], {});
+goog.addDependency('debug/console.js', ['goog.debug.Console'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.debug.TextFormatter'], {});
+goog.addDependency('debug/console_test.js', ['goog.debug.ConsoleTest'], ['goog.debug.Console', 'goog.debug.LogRecord', 'goog.debug.Logger', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('debug/debug.js', ['goog.debug'], ['goog.array', 'goog.debug.errorcontext', 'goog.userAgent'], {});
+goog.addDependency('debug/debug_test.js', ['goog.debugTest'], ['goog.debug', 'goog.debug.errorcontext', 'goog.structs.Set', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/debugwindow.js', ['goog.debug.DebugWindow'], ['goog.debug.HtmlFormatter', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.string.Const', 'goog.structs.CircularBuffer', 'goog.userAgent'], {});
+goog.addDependency('debug/debugwindow_test.js', ['goog.debug.DebugWindowTest'], ['goog.debug.DebugWindow', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/devcss/devcss.js', ['goog.debug.DevCss', 'goog.debug.DevCss.UserAgent'], ['goog.asserts', 'goog.cssom', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('debug/devcss/devcss_test.js', ['goog.debug.DevCssTest'], ['goog.debug.DevCss', 'goog.style', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/devcss/devcssrunner.js', ['goog.debug.devCssRunner'], ['goog.debug.DevCss'], {});
+goog.addDependency('debug/divconsole.js', ['goog.debug.DivConsole'], ['goog.debug.HtmlFormatter', 'goog.debug.LogManager', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.string.Const', 'goog.style'], {});
+goog.addDependency('debug/enhanceerror_test.js', ['goog.debugEnhanceErrorTest'], ['goog.debug', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/entrypointregistry.js', ['goog.debug.EntryPointMonitor', 'goog.debug.entryPointRegistry'], ['goog.asserts'], {});
+goog.addDependency('debug/entrypointregistry_test.js', ['goog.debug.entryPointRegistryTest'], ['goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/error.js', ['goog.debug.Error'], [], {});
+goog.addDependency('debug/error_test.js', ['goog.debug.ErrorTest'], ['goog.debug.Error', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('debug/errorcontext.js', ['goog.debug.errorcontext'], [], {});
+goog.addDependency('debug/errorcontext_test.js', ['goog.debug.errorcontextTest'], ['goog.debug.errorcontext', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});
+goog.addDependency('debug/errorhandler.js', ['goog.debug.ErrorHandler', 'goog.debug.ErrorHandler.ProtectedFunctionError'], ['goog.Disposable', 'goog.asserts', 'goog.debug', 'goog.debug.EntryPointMonitor', 'goog.debug.Error', 'goog.debug.Trace'], {});
+goog.addDependency('debug/errorhandler_async_test.js', ['goog.debug.ErrorHandlerAsyncTest'], ['goog.Promise', 'goog.debug.ErrorHandler', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('debug/errorhandler_test.js', ['goog.debug.ErrorHandlerTest'], ['goog.debug.ErrorHandler', 'goog.testing.MockControl', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/errorhandlerweakdep.js', ['goog.debug.errorHandlerWeakDep'], [], {});
+goog.addDependency('debug/errorreporter.js', ['goog.debug.ErrorReporter', 'goog.debug.ErrorReporter.ExceptionEvent'], ['goog.asserts', 'goog.debug', 'goog.debug.Error', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.debug.errorcontext', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.log', 'goog.net.XhrIo', 'goog.object', 'goog.string', 'goog.uri.utils', 'goog.userAgent'], {});
+goog.addDependency('debug/errorreporter_test.js', ['goog.debug.ErrorReporterTest'], ['goog.debug.Error', 'goog.debug.ErrorReporter', 'goog.debug.errorcontext', 'goog.events', 'goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('debug/fancywindow.js', ['goog.debug.FancyWindow'], ['goog.array', 'goog.asserts', 'goog.debug.DebugWindow', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('debug/formatter.js', ['goog.debug.Formatter', 'goog.debug.HtmlFormatter', 'goog.debug.TextFormatter'], ['goog.debug', 'goog.debug.Logger', 'goog.debug.RelativeTimeProvider', 'goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.uncheckedconversions', 'goog.string.Const'], {});
+goog.addDependency('debug/formatter_test.js', ['goog.debug.FormatterTest'], ['goog.debug.HtmlFormatter', 'goog.debug.LogRecord', 'goog.debug.Logger', 'goog.html.SafeHtml', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/fpsdisplay.js', ['goog.debug.FpsDisplay'], ['goog.asserts', 'goog.async.AnimationDelay', 'goog.dom', 'goog.dom.TagName', 'goog.ui.Component'], {});
+goog.addDependency('debug/fpsdisplay_test.js', ['goog.debug.FpsDisplayTest'], ['goog.Timer', 'goog.debug.FpsDisplay', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/logbuffer.js', ['goog.debug.LogBuffer'], ['goog.asserts', 'goog.debug.LogRecord'], {});
+goog.addDependency('debug/logbuffer_test.js', ['goog.debug.LogBufferTest'], ['goog.debug.LogBuffer', 'goog.debug.Logger', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/logger.js', ['goog.debug.LogManager', 'goog.debug.Loggable', 'goog.debug.Logger', 'goog.debug.Logger.Level'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.LogBuffer', 'goog.debug.LogRecord'], {});
+goog.addDependency('debug/logger_test.js', ['goog.debug.LoggerTest'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/logrecord.js', ['goog.debug.LogRecord'], [], {});
+goog.addDependency('debug/logrecordserializer.js', ['goog.debug.logRecordSerializer'], ['goog.debug.LogRecord', 'goog.debug.Logger', 'goog.json', 'goog.object'], {});
+goog.addDependency('debug/logrecordserializer_test.js', ['goog.debug.logRecordSerializerTest'], ['goog.debug.LogRecord', 'goog.debug.Logger', 'goog.debug.logRecordSerializer', 'goog.testing.jsunit'], {});
+goog.addDependency('debug/relativetimeprovider.js', ['goog.debug.RelativeTimeProvider'], [], {});
+goog.addDependency('debug/tracer.js', ['goog.debug.Trace'], ['goog.array', 'goog.debug.Logger', 'goog.iter', 'goog.log', 'goog.structs.Map', 'goog.structs.SimplePool'], {});
+goog.addDependency('debug/tracer_test.js', ['goog.debug.TraceTest'], ['goog.debug.Trace', 'goog.testing.jsunit'], {});
+goog.addDependency('defineclass_test.js', ['goog.defineClassTest'], ['goog.testing.jsunit'], {});
+goog.addDependency('disposable/disposable.js', ['goog.Disposable', 'goog.dispose', 'goog.disposeAll'], ['goog.disposable.IDisposable'], {});
+goog.addDependency('disposable/disposable_test.js', ['goog.DisposableTest'], ['goog.Disposable', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('disposable/idisposable.js', ['goog.disposable.IDisposable'], [], {});
+goog.addDependency('dom/abstractmultirange.js', ['goog.dom.AbstractMultiRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange', 'goog.dom.TextRange'], {});
+goog.addDependency('dom/abstractrange.js', ['goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.SavedCaretRange', 'goog.dom.TagIterator', 'goog.userAgent'], {});
+goog.addDependency('dom/abstractrange_test.js', ['goog.dom.AbstractRangeTest'], ['goog.dom', 'goog.dom.AbstractRange', 'goog.dom.Range', 'goog.dom.TagName', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/animationframe/animationframe.js', ['goog.dom.animationFrame', 'goog.dom.animationFrame.Spec', 'goog.dom.animationFrame.State'], ['goog.dom.animationFrame.polyfill'], {});
+goog.addDependency('dom/animationframe/animationframe_test.js', ['goog.dom.AnimationFrameTest'], ['goog.dom.animationFrame', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/animationframe/polyfill.js', ['goog.dom.animationFrame.polyfill'], [], {});
+goog.addDependency('dom/annotate.js', ['goog.dom.annotate', 'goog.dom.annotate.AnnotateFn'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.object'], {});
+goog.addDependency('dom/annotate_test.js', ['goog.dom.annotateTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.annotate', 'goog.html.SafeHtml', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/asserts.js', ['goog.dom.asserts'], ['goog.asserts'], {});
+goog.addDependency('dom/asserts_test.js', ['goog.dom.assertsTest'], ['goog.dom.asserts', 'goog.testing.StrictMock', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/attr.js', ['goog.dom.Attr'], [], {});
+goog.addDependency('dom/browserfeature.js', ['goog.dom.BrowserFeature'], ['goog.userAgent'], {});
+goog.addDependency('dom/browserrange/abstractrange.js', ['goog.dom.browserrange.AbstractRange'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.iter', 'goog.math.Coordinate', 'goog.string', 'goog.string.StringBuffer', 'goog.userAgent'], {});
+goog.addDependency('dom/browserrange/browserrange.js', ['goog.dom.browserrange', 'goog.dom.browserrange.Error'], ['goog.dom', 'goog.dom.BrowserFeature', 'goog.dom.NodeType', 'goog.dom.browserrange.GeckoRange', 'goog.dom.browserrange.IeRange', 'goog.dom.browserrange.OperaRange', 'goog.dom.browserrange.W3cRange', 'goog.dom.browserrange.WebKitRange', 'goog.userAgent'], {});
+goog.addDependency('dom/browserrange/browserrange_test.js', ['goog.dom.browserrangeTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange', 'goog.html.testing', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/browserrange/geckorange.js', ['goog.dom.browserrange.GeckoRange'], ['goog.dom.browserrange.W3cRange'], {});
+goog.addDependency('dom/browserrange/ierange.js', ['goog.dom.browserrange.IeRange'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange.AbstractRange', 'goog.log', 'goog.string'], {});
+goog.addDependency('dom/browserrange/operarange.js', ['goog.dom.browserrange.OperaRange'], ['goog.dom.browserrange.W3cRange'], {});
+goog.addDependency('dom/browserrange/w3crange.js', ['goog.dom.browserrange.W3cRange'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange.AbstractRange', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('dom/browserrange/webkitrange.js', ['goog.dom.browserrange.WebKitRange'], ['goog.dom.RangeEndpoint', 'goog.dom.browserrange.W3cRange', 'goog.userAgent'], {});
+goog.addDependency('dom/bufferedviewportsizemonitor.js', ['goog.dom.BufferedViewportSizeMonitor'], ['goog.asserts', 'goog.async.Delay', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType'], {});
+goog.addDependency('dom/bufferedviewportsizemonitor_test.js', ['goog.dom.BufferedViewportSizeMonitorTest'], ['goog.dom.BufferedViewportSizeMonitor', 'goog.dom.ViewportSizeMonitor', 'goog.events', 'goog.events.EventType', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/classes.js', ['goog.dom.classes'], ['goog.array'], {});
+goog.addDependency('dom/classes_test.js', ['goog.dom.classes_test'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classes', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/classlist.js', ['goog.dom.classlist'], ['goog.array'], {});
+goog.addDependency('dom/classlist_test.js', ['goog.dom.classlist_test'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/controlrange.js', ['goog.dom.ControlRange', 'goog.dom.ControlRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagWalkType', 'goog.dom.TextRange', 'goog.iter.StopIteration', 'goog.userAgent'], {});
+goog.addDependency('dom/controlrange_test.js', ['goog.dom.ControlRangeTest'], ['goog.dom', 'goog.dom.ControlRange', 'goog.dom.RangeType', 'goog.dom.TagName', 'goog.dom.TextRange', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/dataset.js', ['goog.dom.dataset'], ['goog.labs.userAgent.browser', 'goog.string', 'goog.userAgent.product'], {});
+goog.addDependency('dom/dataset_test.js', ['goog.dom.datasetTest'], ['goog.dom', 'goog.dom.dataset', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/dom.js', ['goog.dom', 'goog.dom.Appendable', 'goog.dom.DomHelper'], ['goog.array', 'goog.asserts', 'goog.dom.BrowserFeature', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.uncheckedconversions', 'goog.math.Coordinate', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.userAgent'], {});
+goog.addDependency('dom/dom_compile_test.js', ['goog.dom.DomCompileTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/dom_test.js', ['goog.dom.dom_test'], ['goog.array', 'goog.dom', 'goog.dom.BrowserFeature', 'goog.dom.DomHelper', 'goog.dom.InputType', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.functions', 'goog.html.SafeUrl', 'goog.html.testing', 'goog.object', 'goog.string.Const', 'goog.string.Unicode', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('dom/fontsizemonitor.js', ['goog.dom.FontSizeMonitor', 'goog.dom.FontSizeMonitor.EventType'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent'], {});
+goog.addDependency('dom/fontsizemonitor_test.js', ['goog.dom.FontSizeMonitorTest'], ['goog.dom', 'goog.dom.FontSizeMonitor', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/forms.js', ['goog.dom.forms'], ['goog.dom.InputType', 'goog.dom.TagName', 'goog.structs.Map', 'goog.window'], {});
+goog.addDependency('dom/forms_test.js', ['goog.dom.formsTest'], ['goog.dom', 'goog.dom.forms', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/fullscreen.js', ['goog.dom.fullscreen', 'goog.dom.fullscreen.EventType'], ['goog.dom', 'goog.userAgent'], {});
+goog.addDependency('dom/fullscreen_test.js', ['goog.dom.fullscreen_test'], ['goog.dom.DomHelper', 'goog.dom.fullscreen', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/htmlelement.js', ['goog.dom.HtmlElement'], [], {});
+goog.addDependency('dom/iframe.js', ['goog.dom.iframe'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('dom/iframe_test.js', ['goog.dom.iframeTest'], ['goog.dom', 'goog.dom.iframe', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/inputtype.js', ['goog.dom.InputType'], [], {});
+goog.addDependency('dom/inputtype_test.js', ['goog.dom.InputTypeTest'], ['goog.dom.InputType', 'goog.object', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/iter.js', ['goog.dom.iter.AncestorIterator', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator'], ['goog.iter.Iterator', 'goog.iter.StopIteration'], {});
+goog.addDependency('dom/iter_test.js', ['goog.dom.iterTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.iter.AncestorIterator', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/multirange.js', ['goog.dom.MultiRange', 'goog.dom.MultiRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TextRange', 'goog.iter', 'goog.iter.StopIteration', 'goog.log'], {});
+goog.addDependency('dom/multirange_test.js', ['goog.dom.MultiRangeTest'], ['goog.dom', 'goog.dom.MultiRange', 'goog.dom.Range', 'goog.iter', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/nodeiterator.js', ['goog.dom.NodeIterator'], ['goog.dom.TagIterator'], {});
+goog.addDependency('dom/nodeiterator_test.js', ['goog.dom.NodeIteratorTest'], ['goog.dom', 'goog.dom.NodeIterator', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/nodeoffset.js', ['goog.dom.NodeOffset'], ['goog.Disposable', 'goog.dom.TagName'], {});
+goog.addDependency('dom/nodeoffset_test.js', ['goog.dom.NodeOffsetTest'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/nodetype.js', ['goog.dom.NodeType'], [], {});
+goog.addDependency('dom/pattern/abstractpattern.js', ['goog.dom.pattern.AbstractPattern'], ['goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/allchildren.js', ['goog.dom.pattern.AllChildren'], ['goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/callback/callback.js', ['goog.dom.pattern.callback'], ['goog.dom', 'goog.dom.TagWalkType', 'goog.iter'], {});
+goog.addDependency('dom/pattern/callback/counter.js', ['goog.dom.pattern.callback.Counter'], [], {});
+goog.addDependency('dom/pattern/callback/test.js', ['goog.dom.pattern.callback.Test'], ['goog.iter.StopIteration'], {});
+goog.addDependency('dom/pattern/childmatches.js', ['goog.dom.pattern.ChildMatches'], ['goog.dom.pattern.AllChildren', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/endtag.js', ['goog.dom.pattern.EndTag'], ['goog.dom.TagWalkType', 'goog.dom.pattern.Tag'], {});
+goog.addDependency('dom/pattern/fulltag.js', ['goog.dom.pattern.FullTag'], ['goog.dom.pattern.MatchType', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.Tag'], {});
+goog.addDependency('dom/pattern/matcher.js', ['goog.dom.pattern.Matcher'], ['goog.dom.TagIterator', 'goog.dom.pattern.MatchType', 'goog.iter'], {});
+goog.addDependency('dom/pattern/matcher_test.js', ['goog.dom.pattern.matcherTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.pattern.EndTag', 'goog.dom.pattern.FullTag', 'goog.dom.pattern.Matcher', 'goog.dom.pattern.Repeat', 'goog.dom.pattern.Sequence', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.callback.Counter', 'goog.dom.pattern.callback.Test', 'goog.iter.StopIteration', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/pattern/nodetype.js', ['goog.dom.pattern.NodeType'], ['goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/pattern.js', ['goog.dom.pattern', 'goog.dom.pattern.MatchType'], [], {});
+goog.addDependency('dom/pattern/pattern_test.js', ['goog.dom.patternTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagWalkType', 'goog.dom.pattern.AllChildren', 'goog.dom.pattern.ChildMatches', 'goog.dom.pattern.EndTag', 'goog.dom.pattern.FullTag', 'goog.dom.pattern.MatchType', 'goog.dom.pattern.NodeType', 'goog.dom.pattern.Repeat', 'goog.dom.pattern.Sequence', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.Text', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/pattern/repeat.js', ['goog.dom.pattern.Repeat'], ['goog.dom.NodeType', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/sequence.js', ['goog.dom.pattern.Sequence'], ['goog.dom.NodeType', 'goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/pattern/starttag.js', ['goog.dom.pattern.StartTag'], ['goog.dom.TagWalkType', 'goog.dom.pattern.Tag'], {});
+goog.addDependency('dom/pattern/tag.js', ['goog.dom.pattern.Tag'], ['goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType', 'goog.object'], {});
+goog.addDependency('dom/pattern/text.js', ['goog.dom.pattern.Text'], ['goog.dom.NodeType', 'goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});
+goog.addDependency('dom/range.js', ['goog.dom.Range'], ['goog.dom', 'goog.dom.AbstractRange', 'goog.dom.BrowserFeature', 'goog.dom.ControlRange', 'goog.dom.MultiRange', 'goog.dom.NodeType', 'goog.dom.TextRange'], {});
+goog.addDependency('dom/range_test.js', ['goog.dom.RangeTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeType', 'goog.dom.TagName', 'goog.dom.TextRange', 'goog.dom.browserrange', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/rangeendpoint.js', ['goog.dom.RangeEndpoint'], [], {});
+goog.addDependency('dom/safe.js', ['goog.dom.safe', 'goog.dom.safe.InsertAdjacentHtmlPosition'], ['goog.asserts', 'goog.dom.asserts', 'goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.string', 'goog.string.Const'], {});
+goog.addDependency('dom/safe_test.js', ['goog.dom.safeTest'], ['goog.asserts', 'goog.dom.safe', 'goog.dom.safe.InsertAdjacentHtmlPosition', 'goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.testing', 'goog.string', 'goog.string.Const', 'goog.testing', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/savedcaretrange.js', ['goog.dom.SavedCaretRange'], ['goog.array', 'goog.dom', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.string'], {});
+goog.addDependency('dom/savedcaretrange_test.js', ['goog.dom.SavedCaretRangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.SavedCaretRange', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/savedrange.js', ['goog.dom.SavedRange'], ['goog.Disposable', 'goog.log'], {});
+goog.addDependency('dom/savedrange_test.js', ['goog.dom.SavedRangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/selection.js', ['goog.dom.selection'], ['goog.dom.InputType', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('dom/selection_test.js', ['goog.dom.selectionTest'], ['goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.selection', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('dom/tagiterator.js', ['goog.dom.TagIterator', 'goog.dom.TagWalkType'], ['goog.dom', 'goog.dom.NodeType', 'goog.iter.Iterator', 'goog.iter.StopIteration'], {});
+goog.addDependency('dom/tagiterator_test.js', ['goog.dom.TagIteratorTest'], ['goog.dom', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.dom.TagWalkType', 'goog.iter', 'goog.iter.StopIteration', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/tagname.js', ['goog.dom.TagName'], ['goog.dom.HtmlElement'], {});
+goog.addDependency('dom/tagname_test.js', ['goog.dom.TagNameTest'], ['goog.dom.TagName', 'goog.object', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/tags.js', ['goog.dom.tags'], ['goog.object'], {});
+goog.addDependency('dom/tags_test.js', ['goog.dom.tagsTest'], ['goog.dom.tags', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/textrange.js', ['goog.dom.TextRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.dom.browserrange', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('dom/textrange_test.js', ['goog.dom.TextRangeTest'], ['goog.dom', 'goog.dom.ControlRange', 'goog.dom.Range', 'goog.dom.TextRange', 'goog.math.Coordinate', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('dom/textrangeiterator.js', ['goog.dom.TextRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeIterator', 'goog.dom.TagName', 'goog.iter.StopIteration'], {});
+goog.addDependency('dom/textrangeiterator_test.js', ['goog.dom.TextRangeIteratorTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.iter.StopIteration', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/vendor.js', ['goog.dom.vendor'], ['goog.string', 'goog.userAgent'], {});
+goog.addDependency('dom/vendor_test.js', ['goog.dom.vendorTest'], ['goog.array', 'goog.dom.vendor', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgentTestUtil'], {});
+goog.addDependency('dom/viewportsizemonitor.js', ['goog.dom.ViewportSizeMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Size'], {});
+goog.addDependency('dom/viewportsizemonitor_test.js', ['goog.dom.ViewportSizeMonitorTest'], ['goog.dom.ViewportSizeMonitor', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('dom/xml.js', ['goog.dom.xml'], ['goog.dom', 'goog.dom.NodeType', 'goog.userAgent'], {});
+goog.addDependency('dom/xml_test.js', ['goog.dom.xmlTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.xml', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/browserfeature.js', ['goog.editor.BrowserFeature'], ['goog.editor.defines', 'goog.labs.userAgent.browser', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('editor/browserfeature_test.js', ['goog.editor.BrowserFeatureTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/clicktoeditwrapper.js', ['goog.editor.ClickToEditWrapper'], ['goog.Disposable', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.range', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventType'], {});
+goog.addDependency('editor/clicktoeditwrapper_test.js', ['goog.editor.ClickToEditWrapperTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.ClickToEditWrapper', 'goog.editor.SeamlessField', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/command.js', ['goog.editor.Command'], [], {});
+goog.addDependency('editor/contenteditablefield.js', ['goog.editor.ContentEditableField'], ['goog.asserts', 'goog.editor.Field', 'goog.log'], {});
+goog.addDependency('editor/contenteditablefield_test.js', ['goog.editor.ContentEditableFieldTest'], ['goog.dom', 'goog.editor.ContentEditableField', 'goog.editor.field_test', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/defines.js', ['goog.editor.defines'], [], {});
+goog.addDependency('editor/field.js', ['goog.editor.Field', 'goog.editor.Field.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.array', 'goog.asserts', 'goog.async.Delay', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.safe', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.editor.range', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.html.SafeHtml', 'goog.html.legacyconversions', 'goog.log', 'goog.log.Level', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('editor/field_test.js', ['goog.editor.field_test'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.range', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.LooseMock', 'goog.testing.MockClock', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('editor/focus.js', ['goog.editor.focus'], ['goog.dom.selection'], {});
+goog.addDependency('editor/focus_test.js', ['goog.editor.focusTest'], ['goog.dom.selection', 'goog.editor.BrowserFeature', 'goog.editor.focus', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/icontent.js', ['goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo'], ['goog.dom', 'goog.editor.BrowserFeature', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('editor/icontent_test.js', ['goog.editor.icontentTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/link.js', ['goog.editor.Link'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.node', 'goog.editor.range', 'goog.string', 'goog.string.Unicode', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex'], {});
+goog.addDependency('editor/link_test.js', ['goog.editor.LinkTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Link', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/node.js', ['goog.editor.node'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator', 'goog.iter', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.userAgent'], {});
+goog.addDependency('editor/node_test.js', ['goog.editor.nodeTest'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.node', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugin.js', ['goog.editor.Plugin'], ['goog.events.EventTarget', 'goog.functions', 'goog.log', 'goog.object', 'goog.reflect', 'goog.userAgent'], {});
+goog.addDependency('editor/plugin_test.js', ['goog.editor.PluginTest'], ['goog.editor.Field', 'goog.editor.Plugin', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/abstractbubbleplugin.js', ['goog.editor.plugins.AbstractBubblePlugin'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.Plugin', 'goog.editor.style', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.actionEventWrapper', 'goog.functions', 'goog.string.Unicode', 'goog.ui.Component', 'goog.ui.editor.Bubble', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/abstractbubbleplugin_test.js', ['goog.editor.plugins.AbstractBubblePluginTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.style', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.editor.Bubble', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/abstractdialogplugin.js', ['goog.editor.plugins.AbstractDialogPlugin', 'goog.editor.plugins.AbstractDialogPlugin.EventType'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.range', 'goog.events', 'goog.ui.editor.AbstractDialog'], {});
+goog.addDependency('editor/plugins/abstractdialogplugin_test.js', ['goog.editor.plugins.AbstractDialogPluginTest'], ['goog.dom', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.editor.Field', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.events.Event', 'goog.events.EventHandler', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.ui.editor.AbstractDialog', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/abstracttabhandler.js', ['goog.editor.plugins.AbstractTabHandler'], ['goog.editor.Plugin', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/abstracttabhandler_test.js', ['goog.editor.plugins.AbstractTabHandlerTest'], ['goog.editor.Field', 'goog.editor.plugins.AbstractTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/basictextformatter.js', ['goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.BasicTextFormatter.COMMAND'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.editor.style', 'goog.iter', 'goog.iter.StopIteration', 'goog.log', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.editor.messages', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/basictextformatter_test.js', ['goog.editor.plugins.BasicTextFormatterTest'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.BasicTextFormatter', 'goog.object', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.LooseMock', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('editor/plugins/blockquote.js', ['goog.editor.plugins.Blockquote'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions', 'goog.log'], {});
+goog.addDependency('editor/plugins/blockquote_test.js', ['goog.editor.plugins.BlockquoteTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.plugins.Blockquote', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/plugins/emoticons.js', ['goog.editor.plugins.Emoticons'], ['goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.range', 'goog.functions', 'goog.ui.emoji.Emoji', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/emoticons_test.js', ['goog.editor.plugins.EmoticonsTest'], ['goog.Uri', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.editor.Field', 'goog.editor.plugins.Emoticons', 'goog.testing.jsunit', 'goog.ui.emoji.Emoji', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/enterhandler.js', ['goog.editor.plugins.EnterHandler'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.plugins.Blockquote', 'goog.editor.range', 'goog.editor.style', 'goog.events.KeyCodes', 'goog.functions', 'goog.object', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/enterhandler_test.js', ['goog.editor.plugins.EnterHandlerTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.Blockquote', 'goog.editor.plugins.EnterHandler', 'goog.editor.range', 'goog.events', 'goog.events.KeyCodes', 'goog.testing.ExpectedFailures', 'goog.testing.MockClock', 'goog.testing.dom', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/firststrong.js', ['goog.editor.plugins.FirstStrong'], ['goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.i18n.bidi', 'goog.i18n.uChar', 'goog.iter', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/firststrong_test.js', ['goog.editor.plugins.FirstStrongTest'], ['goog.dom.Range', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.plugins.FirstStrong', 'goog.editor.range', 'goog.events.KeyCodes', 'goog.testing.MockClock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/headerformatter.js', ['goog.editor.plugins.HeaderFormatter'], ['goog.editor.Command', 'goog.editor.Plugin', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/headerformatter_test.js', ['goog.editor.plugins.HeaderFormatterTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.HeaderFormatter', 'goog.events.BrowserEvent', 'goog.testing.LooseMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/linkbubble.js', ['goog.editor.plugins.LinkBubble', 'goog.editor.plugins.LinkBubble.Action'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.functions', 'goog.string', 'goog.style', 'goog.ui.editor.messages', 'goog.uri.utils', 'goog.window'], {});
+goog.addDependency('editor/plugins/linkbubble_test.js', ['goog.editor.plugins.LinkBubbleTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.plugins.LinkBubble', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.testing.FunctionMock', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/linkdialogplugin.js', ['goog.editor.plugins.LinkDialogPlugin'], ['goog.array', 'goog.dom', 'goog.editor.Command', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.events.EventHandler', 'goog.functions', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.LinkDialog', 'goog.uri.utils'], {});
+goog.addDependency('editor/plugins/linkdialogplugin_test.js', ['goog.ui.editor.plugins.LinkDialogTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Link', 'goog.editor.plugins.LinkDialogPlugin', 'goog.string', 'goog.string.Unicode', 'goog.testing.MockControl', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.editor.dom', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.LinkDialog', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/linkshortcutplugin.js', ['goog.editor.plugins.LinkShortcutPlugin'], ['goog.editor.Command', 'goog.editor.Plugin'], {});
+goog.addDependency('editor/plugins/linkshortcutplugin_test.js', ['goog.editor.plugins.LinkShortcutPluginTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Field', 'goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.LinkBubble', 'goog.editor.plugins.LinkShortcutPlugin', 'goog.events.KeyCodes', 'goog.testing.PropertyReplacer', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent.product'], {});
+goog.addDependency('editor/plugins/listtabhandler.js', ['goog.editor.plugins.ListTabHandler'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.plugins.AbstractTabHandler', 'goog.iter'], {});
+goog.addDependency('editor/plugins/listtabhandler_test.js', ['goog.editor.plugins.ListTabHandlerTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.plugins.ListTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/plugins/loremipsum.js', ['goog.editor.plugins.LoremIpsum'], ['goog.asserts', 'goog.dom', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions', 'goog.html.SafeHtml', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/loremipsum_test.js', ['goog.editor.plugins.LoremIpsumTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.plugins.LoremIpsum', 'goog.string.Unicode', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/removeformatting.js', ['goog.editor.plugins.RemoveFormatting'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/removeformatting_test.js', ['goog.editor.plugins.RemoveFormattingTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.plugins.RemoveFormatting', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.dom', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('editor/plugins/spacestabhandler.js', ['goog.editor.plugins.SpacesTabHandler'], ['goog.dom.TagName', 'goog.editor.plugins.AbstractTabHandler', 'goog.editor.range'], {});
+goog.addDependency('editor/plugins/spacestabhandler_test.js', ['goog.editor.plugins.SpacesTabHandlerTest'], ['goog.dom', 'goog.dom.Range', 'goog.editor.plugins.SpacesTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/plugins/tableeditor.js', ['goog.editor.plugins.TableEditor'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.Table', 'goog.editor.node', 'goog.editor.range', 'goog.object', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/tableeditor_test.js', ['goog.editor.plugins.TableEditorTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.plugins.TableEditor', 'goog.object', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/tagonenterhandler.js', ['goog.editor.plugins.TagOnEnterHandler'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.node', 'goog.editor.plugins.EnterHandler', 'goog.editor.range', 'goog.editor.style', 'goog.events.KeyCodes', 'goog.functions', 'goog.string.Unicode', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/tagonenterhandler_test.js', ['goog.editor.plugins.TagOnEnterHandlerTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.TagOnEnterHandler', 'goog.events.KeyCodes', 'goog.string.Unicode', 'goog.testing.dom', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/plugins/undoredo.js', ['goog.editor.plugins.UndoRedo'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.events.EventHandler', 'goog.log', 'goog.object'], {});
+goog.addDependency('editor/plugins/undoredo_test.js', ['goog.editor.plugins.UndoRedoTest'], ['goog.array', 'goog.dom', 'goog.dom.browserrange', 'goog.editor.Field', 'goog.editor.plugins.LoremIpsum', 'goog.editor.plugins.UndoRedo', 'goog.events', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/plugins/undoredomanager.js', ['goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoManager.EventType'], ['goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.events.EventTarget'], {});
+goog.addDependency('editor/plugins/undoredomanager_test.js', ['goog.editor.plugins.UndoRedoManagerTest'], ['goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.testing.StrictMock', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/plugins/undoredostate.js', ['goog.editor.plugins.UndoRedoState'], ['goog.events.EventTarget'], {});
+goog.addDependency('editor/plugins/undoredostate_test.js', ['goog.editor.plugins.UndoRedoStateTest'], ['goog.editor.plugins.UndoRedoState', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/range.js', ['goog.editor.range', 'goog.editor.range.Point'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeEndpoint', 'goog.dom.SavedCaretRange', 'goog.editor.node', 'goog.editor.style', 'goog.iter', 'goog.userAgent'], {});
+goog.addDependency('editor/range_test.js', ['goog.editor.rangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.range', 'goog.editor.range.Point', 'goog.string', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('editor/seamlessfield.js', ['goog.editor.SeamlessField'], ['goog.cssom.iframe.style', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.safe', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.events', 'goog.events.EventType', 'goog.html.legacyconversions', 'goog.html.uncheckedconversions', 'goog.log', 'goog.string.Const', 'goog.style'], {});
+goog.addDependency('editor/seamlessfield_test.js', ['goog.editor.seamlessfield_test'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.SeamlessField', 'goog.events', 'goog.functions', 'goog.style', 'goog.testing.MockClock', 'goog.testing.MockRange', 'goog.testing.jsunit'], {});
+goog.addDependency('editor/style.js', ['goog.editor.style'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.object', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('editor/style_test.js', ['goog.editor.styleTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.style', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.style', 'goog.testing.LooseMock', 'goog.testing.jsunit', 'goog.testing.mockmatchers'], {});
+goog.addDependency('editor/table.js', ['goog.editor.Table', 'goog.editor.TableCell', 'goog.editor.TableRow'], ['goog.asserts', 'goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.log', 'goog.string.Unicode', 'goog.style'], {});
+goog.addDependency('editor/table_test.js', ['goog.editor.TableTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Table', 'goog.testing.jsunit'], {});
+goog.addDependency('events/actioneventwrapper.js', ['goog.events.actionEventWrapper'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.EventWrapper', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('events/actioneventwrapper_test.js', ['goog.events.actionEventWrapperTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.events', 'goog.events.EventHandler', 'goog.events.KeyCodes', 'goog.events.actionEventWrapper', 'goog.testing.events', 'goog.testing.jsunit'], {});
+goog.addDependency('events/actionhandler.js', ['goog.events.ActionEvent', 'goog.events.ActionHandler', 'goog.events.ActionHandler.EventType', 'goog.events.BeforeActionEvent'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('events/actionhandler_test.js', ['goog.events.ActionHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.ActionHandler', 'goog.testing.events', 'goog.testing.jsunit'], {});
+goog.addDependency('events/browserevent.js', ['goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton'], ['goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventType', 'goog.reflect', 'goog.userAgent'], {});
+goog.addDependency('events/browserevent_test.js', ['goog.events.BrowserEventTest'], ['goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.math.Coordinate', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/browserfeature.js', ['goog.events.BrowserFeature'], ['goog.userAgent'], {});
+goog.addDependency('events/event.js', ['goog.events.Event', 'goog.events.EventLike'], ['goog.Disposable', 'goog.events.EventId'], {});
+goog.addDependency('events/event_test.js', ['goog.events.EventTest'], ['goog.events.Event', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.testing.jsunit'], {});
+goog.addDependency('events/eventhandler.js', ['goog.events.EventHandler'], ['goog.Disposable', 'goog.events', 'goog.object'], {});
+goog.addDependency('events/eventhandler_test.js', ['goog.events.EventHandlerTest'], ['goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('events/eventid.js', ['goog.events.EventId'], [], {});
+goog.addDependency('events/events.js', ['goog.events', 'goog.events.CaptureSimulationMode', 'goog.events.Key', 'goog.events.ListenableType'], ['goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.Listenable', 'goog.events.ListenerMap'], {});
+goog.addDependency('events/events_test.js', ['goog.eventsTest'], ['goog.asserts.AssertionError', 'goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.BrowserFeature', 'goog.events.CaptureSimulationMode', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.Listener', 'goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('events/eventtarget.js', ['goog.events.EventTarget'], ['goog.Disposable', 'goog.asserts', 'goog.events', 'goog.events.Event', 'goog.events.Listenable', 'goog.events.ListenerMap', 'goog.object'], {});
+goog.addDependency('events/eventtarget_test.js', ['goog.events.EventTargetTest'], ['goog.events.EventTarget', 'goog.events.Listenable', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.testing.jsunit'], {});
+goog.addDependency('events/eventtarget_via_googevents_test.js', ['goog.events.EventTargetGoogEventsTest'], ['goog.events', 'goog.events.EventTarget', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.testing', 'goog.testing.jsunit'], {});
+goog.addDependency('events/eventtarget_via_w3cinterface_test.js', ['goog.events.EventTargetW3CTest'], ['goog.events.EventTarget', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.testing.jsunit'], {});
+goog.addDependency('events/eventtargettester.js', ['goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType'], ['goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.testing.asserts', 'goog.testing.recordFunction'], {});
+goog.addDependency('events/eventtype.js', ['goog.events.EventType'], ['goog.userAgent'], {});
+goog.addDependency('events/eventwrapper.js', ['goog.events.EventWrapper'], [], {});
+goog.addDependency('events/filedrophandler.js', ['goog.events.FileDropHandler', 'goog.events.FileDropHandler.EventType'], ['goog.array', 'goog.dom', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.log', 'goog.log.Level'], {});
+goog.addDependency('events/filedrophandler_test.js', ['goog.events.FileDropHandlerTest'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.FileDropHandler', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/focushandler.js', ['goog.events.FocusHandler', 'goog.events.FocusHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.userAgent'], {});
+goog.addDependency('events/imehandler.js', ['goog.events.ImeHandler', 'goog.events.ImeHandler.Event', 'goog.events.ImeHandler.EventType'], ['goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('events/imehandler_test.js', ['goog.events.ImeHandlerTest'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.ImeHandler', 'goog.events.KeyCodes', 'goog.object', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/inputhandler.js', ['goog.events.InputHandler', 'goog.events.InputHandler.EventType'], ['goog.Timer', 'goog.dom.TagName', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('events/inputhandler_test.js', ['goog.events.InputHandlerTest'], ['goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('events/keycodes.js', ['goog.events.KeyCodes'], ['goog.userAgent'], {});
+goog.addDependency('events/keycodes_test.js', ['goog.events.KeyCodesTest'], ['goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/keyhandler.js', ['goog.events.KeyEvent', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent'], {});
+goog.addDependency('events/keyhandler_test.js', ['goog.events.KeyEventTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/keynames.js', ['goog.events.KeyNames'], [], {});
+goog.addDependency('events/keys.js', ['goog.events.Keys'], [], {});
+goog.addDependency('events/listenable.js', ['goog.events.Listenable', 'goog.events.ListenableKey'], ['goog.events.EventId'], {});
+goog.addDependency('events/listenable_test.js', ['goog.events.ListenableTest'], ['goog.events.Listenable', 'goog.testing.jsunit'], {});
+goog.addDependency('events/listener.js', ['goog.events.Listener'], ['goog.events.ListenableKey'], {});
+goog.addDependency('events/listenermap.js', ['goog.events.ListenerMap'], ['goog.array', 'goog.events.Listener', 'goog.object'], {});
+goog.addDependency('events/listenermap_test.js', ['goog.events.ListenerMapTest'], ['goog.dispose', 'goog.events', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.events.ListenerMap', 'goog.testing.jsunit'], {});
+goog.addDependency('events/mousewheelhandler.js', ['goog.events.MouseWheelEvent', 'goog.events.MouseWheelHandler', 'goog.events.MouseWheelHandler.EventType'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.math', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('events/mousewheelhandler_test.js', ['goog.events.MouseWheelHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.MouseWheelEvent', 'goog.events.MouseWheelHandler', 'goog.functions', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/onlinehandler.js', ['goog.events.OnlineHandler', 'goog.events.OnlineHandler.EventType'], ['goog.Timer', 'goog.events.BrowserFeature', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.net.NetworkStatusMonitor'], {});
+goog.addDependency('events/onlinelistener_test.js', ['goog.events.OnlineHandlerTest'], ['goog.events', 'goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.OnlineHandler', 'goog.net.NetworkStatusMonitor', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('events/pastehandler.js', ['goog.events.PasteHandler', 'goog.events.PasteHandler.EventType', 'goog.events.PasteHandler.State'], ['goog.Timer', 'goog.async.ConditionalDelay', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.log', 'goog.userAgent'], {});
+goog.addDependency('events/pastehandler_test.js', ['goog.events.PasteHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.PasteHandler', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('events/wheelevent.js', ['goog.events.WheelEvent'], ['goog.asserts', 'goog.events.BrowserEvent'], {});
+goog.addDependency('events/wheelhandler.js', ['goog.events.WheelHandler'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.WheelEvent', 'goog.style', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('events/wheelhandler_test.js', ['goog.events.WheelHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.WheelEvent', 'goog.events.WheelHandler', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('format/emailaddress.js', ['goog.format.EmailAddress'], ['goog.string'], {});
+goog.addDependency('format/emailaddress_test.js', ['goog.format.EmailAddressTest'], ['goog.array', 'goog.format.EmailAddress', 'goog.testing.jsunit'], {});
+goog.addDependency('format/format.js', ['goog.format'], ['goog.i18n.GraphemeBreak', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('format/format_test.js', ['goog.formatTest'], ['goog.dom', 'goog.dom.TagName', 'goog.format', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('format/htmlprettyprinter.js', ['goog.format.HtmlPrettyPrinter', 'goog.format.HtmlPrettyPrinter.Buffer'], ['goog.dom.TagName', 'goog.object', 'goog.string.StringBuffer'], {});
+goog.addDependency('format/htmlprettyprinter_test.js', ['goog.format.HtmlPrettyPrinterTest'], ['goog.format.HtmlPrettyPrinter', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('format/internationalizedemailaddress.js', ['goog.format.InternationalizedEmailAddress'], ['goog.format.EmailAddress', 'goog.string'], {});
+goog.addDependency('format/internationalizedemailaddress_test.js', ['goog.format.InternationalizedEmailAddressTest'], ['goog.array', 'goog.format.InternationalizedEmailAddress', 'goog.testing.jsunit'], {});
+goog.addDependency('format/jsonprettyprinter.js', ['goog.format.JsonPrettyPrinter', 'goog.format.JsonPrettyPrinter.SafeHtmlDelimiters', 'goog.format.JsonPrettyPrinter.TextDelimiters'], ['goog.html.SafeHtml', 'goog.json', 'goog.json.Serializer', 'goog.string', 'goog.string.format'], {});
+goog.addDependency('format/jsonprettyprinter_test.js', ['goog.format.JsonPrettyPrinterTest'], ['goog.format.JsonPrettyPrinter', 'goog.testing.jsunit'], {});
+goog.addDependency('fs/entry.js', ['goog.fs.DirectoryEntry', 'goog.fs.DirectoryEntry.Behavior', 'goog.fs.Entry', 'goog.fs.FileEntry'], [], {});
+goog.addDependency('fs/entryimpl.js', ['goog.fs.DirectoryEntryImpl', 'goog.fs.EntryImpl', 'goog.fs.FileEntryImpl'], ['goog.array', 'goog.async.Deferred', 'goog.fs.DirectoryEntry', 'goog.fs.Entry', 'goog.fs.Error', 'goog.fs.FileEntry', 'goog.fs.FileWriter', 'goog.functions', 'goog.string'], {});
+goog.addDependency('fs/error.js', ['goog.fs.DOMErrorLike', 'goog.fs.Error', 'goog.fs.Error.ErrorCode'], ['goog.asserts', 'goog.debug.Error', 'goog.object', 'goog.string'], {});
+goog.addDependency('fs/filereader.js', ['goog.fs.FileReader', 'goog.fs.FileReader.EventType', 'goog.fs.FileReader.ReadyState'], ['goog.async.Deferred', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.ProgressEvent'], {});
+goog.addDependency('fs/filesaver.js', ['goog.fs.FileSaver', 'goog.fs.FileSaver.EventType', 'goog.fs.FileSaver.ReadyState'], ['goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.ProgressEvent'], {});
+goog.addDependency('fs/filesystem.js', ['goog.fs.FileSystem'], [], {});
+goog.addDependency('fs/filesystemimpl.js', ['goog.fs.FileSystemImpl'], ['goog.fs.DirectoryEntryImpl', 'goog.fs.FileSystem'], {});
+goog.addDependency('fs/filewriter.js', ['goog.fs.FileWriter'], ['goog.fs.Error', 'goog.fs.FileSaver'], {});
+goog.addDependency('fs/fs.js', ['goog.fs'], ['goog.array', 'goog.async.Deferred', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.fs.FileSystemImpl', 'goog.fs.url', 'goog.userAgent'], {});
+goog.addDependency('fs/fs_test.js', ['goog.fsTest'], ['goog.Promise', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.fs.FileSaver', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('fs/progressevent.js', ['goog.fs.ProgressEvent'], ['goog.events.Event'], {});
+goog.addDependency('fs/url.js', ['goog.fs.url'], [], {});
+goog.addDependency('fs/url_test.js', ['goog.urlTest'], ['goog.fs.url', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('functions/functions.js', ['goog.functions'], [], {});
+goog.addDependency('functions/functions_test.js', ['goog.functionsTest'], ['goog.array', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('fx/abstractdragdrop.js', ['goog.fx.AbstractDragDrop', 'goog.fx.AbstractDragDrop.EventType', 'goog.fx.DragDropEvent', 'goog.fx.DragDropItem'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style'], {});
+goog.addDependency('fx/abstractdragdrop_test.js', ['goog.fx.AbstractDragDropTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit'], {'lang': 'es5'});
+goog.addDependency('fx/anim/anim.js', ['goog.fx.anim', 'goog.fx.anim.Animated'], ['goog.async.AnimationDelay', 'goog.async.Delay', 'goog.object'], {});
+goog.addDependency('fx/anim/anim_test.js', ['goog.fx.animTest'], ['goog.async.AnimationDelay', 'goog.async.Delay', 'goog.events', 'goog.functions', 'goog.fx.Animation', 'goog.fx.anim', 'goog.object', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('fx/animation.js', ['goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent'], ['goog.array', 'goog.asserts', 'goog.events.Event', 'goog.fx.Transition', 'goog.fx.TransitionBase', 'goog.fx.anim', 'goog.fx.anim.Animated'], {});
+goog.addDependency('fx/animation_test.js', ['goog.fx.AnimationTest'], ['goog.events', 'goog.fx.Animation', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/animationqueue.js', ['goog.fx.AnimationParallelQueue', 'goog.fx.AnimationQueue', 'goog.fx.AnimationSerialQueue'], ['goog.array', 'goog.asserts', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.fx.TransitionBase'], {});
+goog.addDependency('fx/animationqueue_test.js', ['goog.fx.AnimationQueueTest'], ['goog.events', 'goog.fx.Animation', 'goog.fx.AnimationParallelQueue', 'goog.fx.AnimationSerialQueue', 'goog.fx.Transition', 'goog.fx.anim', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/css3/fx.js', ['goog.fx.css3'], ['goog.fx.css3.Transition'], {});
+goog.addDependency('fx/css3/transition.js', ['goog.fx.css3.Transition'], ['goog.Timer', 'goog.asserts', 'goog.fx.TransitionBase', 'goog.style', 'goog.style.transition'], {});
+goog.addDependency('fx/css3/transition_test.js', ['goog.fx.css3.TransitionTest'], ['goog.dispose', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.fx.Transition', 'goog.fx.css3.Transition', 'goog.style.transition', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('fx/cssspriteanimation.js', ['goog.fx.CssSpriteAnimation'], ['goog.fx.Animation'], {});
+goog.addDependency('fx/cssspriteanimation_test.js', ['goog.fx.CssSpriteAnimationTest'], ['goog.fx.CssSpriteAnimation', 'goog.math.Box', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/dom.js', ['goog.fx.dom', 'goog.fx.dom.BgColorTransform', 'goog.fx.dom.ColorTransform', 'goog.fx.dom.Fade', 'goog.fx.dom.FadeIn', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOut', 'goog.fx.dom.FadeOutAndHide', 'goog.fx.dom.PredefinedEffect', 'goog.fx.dom.Resize', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Scroll', 'goog.fx.dom.Slide', 'goog.fx.dom.SlideFrom', 'goog.fx.dom.Swipe'], ['goog.color', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.style', 'goog.style.bidi'], {});
+goog.addDependency('fx/dragdrop.js', ['goog.fx.DragDrop'], ['goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem'], {});
+goog.addDependency('fx/dragdropgroup.js', ['goog.fx.DragDropGroup'], ['goog.dom', 'goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem'], {});
+goog.addDependency('fx/dragdropgroup_test.js', ['goog.fx.DragDropGroupTest'], ['goog.events', 'goog.fx.DragDropGroup', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/dragger.js', ['goog.fx.DragEvent', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.style', 'goog.style.bidi', 'goog.userAgent'], {});
+goog.addDependency('fx/dragger_test.js', ['goog.fx.DraggerTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.style.bidi', 'goog.testing.StrictMock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('fx/draglistgroup.js', ['goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.DragListGroup.EventType', 'goog.fx.DragListGroupEvent'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Coordinate', 'goog.string', 'goog.style'], {});
+goog.addDependency('fx/draglistgroup_test.js', ['goog.fx.DragListGroupTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventType', 'goog.fx.DragEvent', 'goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.Dragger', 'goog.math.Coordinate', 'goog.object', 'goog.testing.events', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/dragscrollsupport.js', ['goog.fx.DragScrollSupport'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.style'], {});
+goog.addDependency('fx/dragscrollsupport_test.js', ['goog.fx.DragScrollSupportTest'], ['goog.fx.DragScrollSupport', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/easing.js', ['goog.fx.easing'], [], {});
+goog.addDependency('fx/easing_test.js', ['goog.fx.easingTest'], ['goog.fx.easing', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/fx.js', ['goog.fx'], ['goog.asserts', 'goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent', 'goog.fx.Transition.EventType', 'goog.fx.easing'], {});
+goog.addDependency('fx/fx_test.js', ['goog.fxTest'], ['goog.fx.Animation', 'goog.object', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('fx/transition.js', ['goog.fx.Transition', 'goog.fx.Transition.EventType'], [], {});
+goog.addDependency('fx/transitionbase.js', ['goog.fx.TransitionBase', 'goog.fx.TransitionBase.State'], ['goog.events.EventTarget', 'goog.fx.Transition'], {});
+goog.addDependency('graphics/abstractgraphics.js', ['goog.graphics.AbstractGraphics'], ['goog.dom', 'goog.graphics.AffineTransform', 'goog.graphics.Element', 'goog.graphics.EllipseElement', 'goog.graphics.Fill', 'goog.graphics.Font', 'goog.graphics.GroupElement', 'goog.graphics.Path', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.Stroke', 'goog.graphics.StrokeAndFillElement', 'goog.graphics.TextElement', 'goog.math.Coordinate', 'goog.math.Size', 'goog.style', 'goog.ui.Component'], {});
+goog.addDependency('graphics/affinetransform.js', ['goog.graphics.AffineTransform'], [], {});
+goog.addDependency('graphics/affinetransform_test.js', ['goog.graphics.AffineTransformTest'], ['goog.graphics', 'goog.graphics.AffineTransform', 'goog.testing.jsunit'], {});
+goog.addDependency('graphics/canvaselement.js', ['goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.graphics.EllipseElement', 'goog.graphics.Font', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.Path', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement', 'goog.html.SafeHtml', 'goog.html.uncheckedconversions', 'goog.math', 'goog.string', 'goog.string.Const'], {});
+goog.addDependency('graphics/canvasgraphics.js', ['goog.graphics.CanvasGraphics'], ['goog.dom.TagName', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement', 'goog.graphics.Font', 'goog.graphics.SolidFill', 'goog.math.Size', 'goog.style'], {});
+goog.addDependency('graphics/canvasgraphics_test.js', ['goog.graphics.CanvasGraphicsTest'], ['goog.dom', 'goog.graphics.CanvasGraphics', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.testing.jsunit'], {});
+goog.addDependency('graphics/element.js', ['goog.graphics.Element'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.events.Listenable', 'goog.graphics.AffineTransform', 'goog.math'], {});
+goog.addDependency('graphics/ellipseelement.js', ['goog.graphics.EllipseElement'], ['goog.graphics.StrokeAndFillElement'], {});
+goog.addDependency('graphics/ext/coordinates.js', ['goog.graphics.ext.coordinates'], ['goog.string'], {});
+goog.addDependency('graphics/ext/coordinates_test.js', ['goog.graphics.ext.coordinatesTest'], ['goog.graphics', 'goog.graphics.ext.coordinates', 'goog.testing.jsunit'], {});
+goog.addDependency('graphics/ext/element.js', ['goog.graphics.ext.Element'], ['goog.events.EventTarget', 'goog.functions', 'goog.graphics.ext.coordinates'], {});
+goog.addDependency('graphics/ext/element_test.js', ['goog.graphics.ext.ElementTest'], ['goog.graphics', 'goog.graphics.ext', 'goog.testing.StrictMock', 'goog.testing.jsunit'], {});
+goog.addDependency('graphics/ext/ellipse.js', ['goog.graphics.ext.Ellipse'], ['goog.graphics.ext.StrokeAndFillElement'], {});
+goog.addDependency('graphics/ext/ext.js', ['goog.graphics.ext'], ['goog.graphics.ext.Ellipse', 'goog.graphics.ext.Graphics', 'goog.graphics.ext.Group', 'goog.graphics.ext.Image', 'goog.graphics.ext.Rectangle', 'goog.graphics.ext.Shape', 'goog.graphics.ext.coordinates'], {});
+goog.addDependency('graphics/ext/graphics.js', ['goog.graphics.ext.Graphics'], ['goog.events', 'goog.events.EventType', 'goog.graphics', 'goog.graphics.ext.Group'], {});
+goog.addDependency('graphics/ext/group.js', ['goog.graphics.ext.Group'], ['goog.array', 'goog.graphics.ext.Element'], {});
+goog.addDependency('graphics/ext/image.js', ['goog.graphics.ext.Image'], ['goog.graphics.ext.Element'], {});
+goog.addDependency('graphics/ext/path.js', ['goog.graphics.ext.Path'], ['goog.graphics.AffineTransform', 'goog.graphics.Path', 'goog.math.Rect'], {});
+goog.addDependency('graphics/ext/path_test.js', ['goog.graphics.ext.PathTest'], ['goog.graphics', 'goog.graphics.ext.Path', 'goog.testing.graphics', 'goog.testing.jsunit'], {});
+goog.addDependency('graphics/ext/rectangle.js', ['goog.graphics.ext.Rectangle'], ['goog.graphics.ext.StrokeAndFillElement'], {});
+goog.addDependency('graphics/ext/shape.js', ['goog.graphics.ext.Shape'], ['goog.graphics.ext.StrokeAndFillElement'], {});
+goog.addDependency('graphics/ext/strokeandfillelement.js', ['goog.graphics.ext.StrokeAndFillElement'], ['goog.graphics.ext.Element'], {});
+goog.addDependency('graphics/fill.js', ['goog.graphics.Fill'], [], {});
+goog.addDependency('graphics/font.js', ['goog.graphics.Font'], [], {});
+goog.addDependency('graphics/graphics.js', ['goog.graphics'], ['goog.dom', 'goog.graphics.CanvasGraphics', 'goog.graphics.SvgGraphics', 'goog.graphics.VmlGraphics', 'goog.userAgent'], {});
+goog.addDependency('graphics/groupelement.js', ['goog.graphics.GroupElement'], ['goog.graphics.Element'], {});
+goog.addDependency('graphics/imageelement.js', ['goog.graphics.ImageElement'], ['goog.graphics.Element'], {});
+goog.addDependency('graphics/lineargradient.js', ['goog.graphics.LinearGradient'], ['goog.asserts', 'goog.graphics.Fill'], {});
+goog.addDependency('graphics/path.js', ['goog.graphics.Path', 'goog.graphics.Path.Segment'], ['goog.array', 'goog.graphics.AffineTransform', 'goog.math'], {});
+goog.addDependency('graphics/path_test.js', ['goog.graphics.PathTest'], ['goog.array', 'goog.graphics.AffineTransform', 'goog.graphics.Path', 'goog.math', 'goog.testing.graphics', 'goog.testing.jsunit'], {});
+goog.addDependency('graphics/pathelement.js', ['goog.graphics.PathElement'], ['goog.graphics.StrokeAndFillElement'], {});
+goog.addDependency('graphics/paths.js', ['goog.graphics.paths'], ['goog.graphics.Path', 'goog.math.Coordinate'], {});
+goog.addDependency('graphics/paths_test.js', ['goog.graphics.pathsTest'], ['goog.dom', 'goog.graphics', 'goog.graphics.paths', 'goog.testing.jsunit'], {});
+goog.addDependency('graphics/rectelement.js', ['goog.graphics.RectElement'], ['goog.graphics.StrokeAndFillElement'], {});
+goog.addDependency('graphics/solidfill.js', ['goog.graphics.SolidFill'], ['goog.graphics.Fill'], {});
+goog.addDependency('graphics/solidfill_test.js', ['goog.graphics.SolidFillTest'], ['goog.graphics.SolidFill', 'goog.testing.jsunit'], {});
+goog.addDependency('graphics/stroke.js', ['goog.graphics.Stroke'], [], {});
+goog.addDependency('graphics/strokeandfillelement.js', ['goog.graphics.StrokeAndFillElement'], ['goog.graphics.Element'], {});
+goog.addDependency('graphics/svgelement.js', ['goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement'], ['goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement'], {});
+goog.addDependency('graphics/svggraphics.js', ['goog.graphics.SvgGraphics'], ['goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement', 'goog.math', 'goog.math.Size', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('graphics/svggraphics_test.js', ['goog.graphics.SvgGraphicsTest'], ['goog.dom', 'goog.graphics.SvgGraphics', 'goog.testing.graphics', 'goog.testing.jsunit'], {});
+goog.addDependency('graphics/textelement.js', ['goog.graphics.TextElement'], ['goog.graphics.StrokeAndFillElement'], {});
+goog.addDependency('graphics/vmlelement.js', ['goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement'], ['goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement'], {});
+goog.addDependency('graphics/vmlgraphics.js', ['goog.graphics.VmlGraphics'], ['goog.array', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement', 'goog.html.uncheckedconversions', 'goog.math', 'goog.math.Size', 'goog.reflect', 'goog.string', 'goog.string.Const', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('history/event.js', ['goog.history.Event'], ['goog.events.Event', 'goog.history.EventType'], {});
+goog.addDependency('history/eventtype.js', ['goog.history.EventType'], [], {});
+goog.addDependency('history/history.js', ['goog.History', 'goog.History.Event', 'goog.History.EventType'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.safe', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event', 'goog.history.EventType', 'goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.labs.userAgent.device', 'goog.memoize', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('history/history_test.js', ['goog.HistoryTest'], ['goog.History', 'goog.dispose', 'goog.dom', 'goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('history/html5history.js', ['goog.history.Html5History', 'goog.history.Html5History.TokenTransformer'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event'], {});
+goog.addDependency('history/html5history_test.js', ['goog.history.Html5HistoryTest'], ['goog.Timer', 'goog.events', 'goog.events.EventType', 'goog.history.EventType', 'goog.history.Html5History', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.recordFunction'], {});
+goog.addDependency('html/flash.js', ['goog.html.flash'], ['goog.asserts', 'goog.html.SafeHtml'], {});
+goog.addDependency('html/flash_test.js', ['goog.html.flashTest'], ['goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.html.flash', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/legacyconversions.js', ['goog.html.legacyconversions'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl'], {});
+goog.addDependency('html/legacyconversions_test.js', ['goog.html.legacyconversionsTest'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.legacyconversions', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safehtml.js', ['goog.html.SafeHtml'], ['goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.tags', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.labs.userAgent.browser', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/safehtml_test.js', ['goog.html.safeHtmlTest'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.testing', 'goog.i18n.bidi.Dir', 'goog.labs.userAgent.browser', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safehtmlformatter.js', ['goog.html.SafeHtmlFormatter'], ['goog.asserts', 'goog.dom.tags', 'goog.html.SafeHtml', 'goog.string'], {});
+goog.addDependency('html/safehtmlformatter_test.js', ['goog.html.safeHtmlFormatterTest'], ['goog.html.SafeHtml', 'goog.html.SafeHtmlFormatter', 'goog.string', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safescript.js', ['goog.html.SafeScript'], ['goog.asserts', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/safescript_test.js', ['goog.html.safeScriptTest'], ['goog.html.SafeScript', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safestyle.js', ['goog.html.SafeStyle'], ['goog.array', 'goog.asserts', 'goog.html.SafeUrl', 'goog.string', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/safestyle_test.js', ['goog.html.safeStyleTest'], ['goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safestylesheet.js', ['goog.html.SafeStyleSheet'], ['goog.array', 'goog.asserts', 'goog.html.SafeStyle', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/safestylesheet_test.js', ['goog.html.safeStyleSheetTest'], ['goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/safeurl.js', ['goog.html.SafeUrl'], ['goog.asserts', 'goog.fs.url', 'goog.html.TrustedResourceUrl', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.string', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/safeurl_test.js', ['goog.html.safeUrlTest'], ['goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.i18n.bidi.Dir', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('html/sanitizer/attributewhitelist.js', ['goog.html.sanitizer.AttributeSanitizedWhitelist', 'goog.html.sanitizer.AttributeWhitelist'], [], {});
+goog.addDependency('html/sanitizer/csssanitizer.js', ['goog.html.sanitizer.CssSanitizer'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.uncheckedconversions', 'goog.object', 'goog.string'], {});
+goog.addDependency('html/sanitizer/csssanitizer_test.js', ['goog.html.CssSanitizerTest'], ['goog.array', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.sanitizer.CssSanitizer', 'goog.html.testing', 'goog.string', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('html/sanitizer/htmlsanitizer.js', ['goog.html.sanitizer.HtmlSanitizer', 'goog.html.sanitizer.HtmlSanitizer.Builder', 'goog.html.sanitizer.HtmlSanitizerAttributePolicy', 'goog.html.sanitizer.HtmlSanitizerPolicy', 'goog.html.sanitizer.HtmlSanitizerPolicyContext', 'goog.html.sanitizer.HtmlSanitizerPolicyHints', 'goog.html.sanitizer.HtmlSanitizerUrlPolicy'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.functions', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.sanitizer.AttributeSanitizedWhitelist', 'goog.html.sanitizer.AttributeWhitelist', 'goog.html.sanitizer.CssSanitizer', 'goog.html.sanitizer.TagBlacklist', 'goog.html.sanitizer.TagWhitelist', 'goog.html.uncheckedconversions', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('html/sanitizer/htmlsanitizer_test.js', ['goog.html.HtmlSanitizerTest'], ['goog.array', 'goog.dom', 'goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.sanitizer.HtmlSanitizer', 'goog.html.sanitizer.HtmlSanitizer.Builder', 'goog.html.sanitizer.TagWhitelist', 'goog.html.sanitizer.unsafe', 'goog.html.testing', 'goog.object', 'goog.string.Const', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('html/sanitizer/tagblacklist.js', ['goog.html.sanitizer.TagBlacklist'], [], {});
+goog.addDependency('html/sanitizer/tagwhitelist.js', ['goog.html.sanitizer.TagWhitelist'], [], {});
+goog.addDependency('html/sanitizer/unsafe.js', ['goog.html.sanitizer.unsafe'], ['goog.asserts', 'goog.html.sanitizer.HtmlSanitizer.Builder', 'goog.string', 'goog.string.Const'], {});
+goog.addDependency('html/sanitizer/unsafe_test.js', ['goog.html.UnsafeTest'], ['goog.html.SafeHtml', 'goog.html.sanitizer.HtmlSanitizer', 'goog.html.sanitizer.TagBlacklist', 'goog.html.sanitizer.unsafe', 'goog.string.Const', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('html/silverlight.js', ['goog.html.silverlight'], ['goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.html.flash', 'goog.string.Const'], {});
+goog.addDependency('html/silverlight_test.js', ['goog.html.silverlightTest'], ['goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.html.silverlight', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/testing.js', ['goog.html.testing'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.testing.mockmatchers.ArgumentMatcher'], {});
+goog.addDependency('html/textextractor.js', ['goog.html.textExtractor'], ['goog.array', 'goog.dom.TagName', 'goog.html.sanitizer.HtmlSanitizer', 'goog.object', 'goog.userAgent'], {});
+goog.addDependency('html/textextractor_test.js', ['goog.html.textExtractorTest'], ['goog.html.textExtractor', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('html/trustedresourceurl.js', ['goog.html.TrustedResourceUrl'], ['goog.asserts', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.string.Const', 'goog.string.TypedString'], {});
+goog.addDependency('html/trustedresourceurl_test.js', ['goog.html.trustedResourceUrlTest'], ['goog.html.TrustedResourceUrl', 'goog.i18n.bidi.Dir', 'goog.object', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/uncheckedconversions.js', ['goog.html.uncheckedconversions'], ['goog.asserts', 'goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.string', 'goog.string.Const'], {});
+goog.addDependency('html/uncheckedconversions_test.js', ['goog.html.uncheckedconversionsTest'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.uncheckedconversions', 'goog.i18n.bidi.Dir', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('html/utils.js', ['goog.html.utils'], ['goog.string'], {});
+goog.addDependency('html/utils_test.js', ['goog.html.UtilsTest'], ['goog.array', 'goog.dom.TagName', 'goog.html.utils', 'goog.object', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/bidi.js', ['goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.i18n.bidi.Format'], [], {});
+goog.addDependency('i18n/bidi_test.js', ['goog.i18n.bidiTest'], ['goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/bidiformatter.js', ['goog.i18n.BidiFormatter'], ['goog.html.SafeHtml', 'goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.Format'], {});
+goog.addDependency('i18n/bidiformatter_test.js', ['goog.i18n.BidiFormatterTest'], ['goog.html.SafeHtml', 'goog.html.testing', 'goog.i18n.BidiFormatter', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.Format', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/charlistdecompressor.js', ['goog.i18n.CharListDecompressor'], ['goog.array', 'goog.i18n.uChar'], {});
+goog.addDependency('i18n/charlistdecompressor_test.js', ['goog.i18n.CharListDecompressorTest'], ['goog.i18n.CharListDecompressor', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/charpickerdata.js', ['goog.i18n.CharPickerData'], [], {});
+goog.addDependency('i18n/collation.js', ['goog.i18n.collation'], [], {});
+goog.addDependency('i18n/collation_test.js', ['goog.i18n.collationTest'], ['goog.i18n.collation', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('i18n/compactnumberformatsymbols.js', ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_af', 'goog.i18n.CompactNumberFormatSymbols_am', 'goog.i18n.CompactNumberFormatSymbols_ar', 'goog.i18n.CompactNumberFormatSymbols_ar_DZ', 'goog.i18n.CompactNumberFormatSymbols_az', 'goog.i18n.CompactNumberFormatSymbols_be', 'goog.i18n.CompactNumberFormatSymbols_bg', 'goog.i18n.CompactNumberFormatSymbols_bn', 'goog.i18n.CompactNumberFormatSymbols_br', 'goog.i18n.CompactNumberFormatSymbols_bs', 'goog.i18n.CompactNumberFormatSymbols_ca', 'goog.i18n.CompactNumberFormatSymbols_chr', 'goog.i18n.CompactNumberFormatSymbols_cs', 'goog.i18n.CompactNumberFormatSymbols_cy', 'goog.i18n.CompactNumberFormatSymbols_da', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_de_AT', 'goog.i18n.CompactNumberFormatSymbols_de_CH', 'goog.i18n.CompactNumberFormatSymbols_el', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_en_AU', 'goog.i18n.CompactNumberFormatSymbols_en_CA', 'goog.i18n.CompactNumberFormatSymbols_en_GB', 'goog.i18n.CompactNumberFormatSymbols_en_IE', 'goog.i18n.CompactNumberFormatSymbols_en_IN', 'goog.i18n.CompactNumberFormatSymbols_en_SG', 'goog.i18n.CompactNumberFormatSymbols_en_US', 'goog.i18n.CompactNumberFormatSymbols_en_ZA', 'goog.i18n.CompactNumberFormatSymbols_es', 'goog.i18n.CompactNumberFormatSymbols_es_419', 'goog.i18n.CompactNumberFormatSymbols_es_ES', 'goog.i18n.CompactNumberFormatSymbols_es_MX', 'goog.i18n.CompactNumberFormatSymbols_es_US', 'goog.i18n.CompactNumberFormatSymbols_et', 'goog.i18n.CompactNumberFormatSymbols_eu', 'goog.i18n.CompactNumberFormatSymbols_fa', 'goog.i18n.CompactNumberFormatSymbols_fi', 'goog.i18n.CompactNumberFormatSymbols_fil', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.CompactNumberFormatSymbols_fr_CA', 'goog.i18n.CompactNumberFormatSymbols_ga', 'goog.i18n.CompactNumberFormatSymbols_gl', 'goog.i18n.CompactNumberFormatSymbols_gsw', 'goog.i18n.CompactNumberFormatSymbols_gu', 'goog.i18n.CompactNumberFormatSymbols_haw', 'goog.i18n.CompactNumberFormatSymbols_he', 'goog.i18n.CompactNumberFormatSymbols_hi', 'goog.i18n.CompactNumberFormatSymbols_hr', 'goog.i18n.CompactNumberFormatSymbols_hu', 'goog.i18n.CompactNumberFormatSymbols_hy', 'goog.i18n.CompactNumberFormatSymbols_id', 'goog.i18n.CompactNumberFormatSymbols_in', 'goog.i18n.CompactNumberFormatSymbols_is', 'goog.i18n.CompactNumberFormatSymbols_it', 'goog.i18n.CompactNumberFormatSymbols_iw', 'goog.i18n.CompactNumberFormatSymbols_ja', 'goog.i18n.CompactNumberFormatSymbols_ka', 'goog.i18n.CompactNumberFormatSymbols_kk', 'goog.i18n.CompactNumberFormatSymbols_km', 'goog.i18n.CompactNumberFormatSymbols_kn', 'goog.i18n.CompactNumberFormatSymbols_ko', 'goog.i18n.CompactNumberFormatSymbols_ky', 'goog.i18n.CompactNumberFormatSymbols_ln', 'goog.i18n.CompactNumberFormatSymbols_lo', 'goog.i18n.CompactNumberFormatSymbols_lt', 'goog.i18n.CompactNumberFormatSymbols_lv', 'goog.i18n.CompactNumberFormatSymbols_mk', 'goog.i18n.CompactNumberFormatSymbols_ml', 'goog.i18n.CompactNumberFormatSymbols_mn', 'goog.i18n.CompactNumberFormatSymbols_mo', 'goog.i18n.CompactNumberFormatSymbols_mr', 'goog.i18n.CompactNumberFormatSymbols_ms', 'goog.i18n.CompactNumberFormatSymbols_mt', 'goog.i18n.CompactNumberFormatSymbols_my', 'goog.i18n.CompactNumberFormatSymbols_nb', 'goog.i18n.CompactNumberFormatSymbols_ne', 'goog.i18n.CompactNumberFormatSymbols_nl', 'goog.i18n.CompactNumberFormatSymbols_no', 'goog.i18n.CompactNumberFormatSymbols_no_NO', 'goog.i18n.CompactNumberFormatSymbols_or', 'goog.i18n.CompactNumberFormatSymbols_pa', 'goog.i18n.CompactNumberFormatSymbols_pl', 'goog.i18n.CompactNumberFormatSymbols_pt', 'goog.i18n.CompactNumberFormatSymbols_pt_BR', 'goog.i18n.CompactNumberFormatSymbols_pt_PT', 'goog.i18n.CompactNumberFormatSymbols_ro', 'goog.i18n.CompactNumberFormatSymbols_ru', 'goog.i18n.CompactNumberFormatSymbols_sh', 'goog.i18n.CompactNumberFormatSymbols_si', 'goog.i18n.CompactNumberFormatSymbols_sk', 'goog.i18n.CompactNumberFormatSymbols_sl', 'goog.i18n.CompactNumberFormatSymbols_sq', 'goog.i18n.CompactNumberFormatSymbols_sr', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn', 'goog.i18n.CompactNumberFormatSymbols_sv', 'goog.i18n.CompactNumberFormatSymbols_sw', 'goog.i18n.CompactNumberFormatSymbols_ta', 'goog.i18n.CompactNumberFormatSymbols_te', 'goog.i18n.CompactNumberFormatSymbols_th', 'goog.i18n.CompactNumberFormatSymbols_tl', 'goog.i18n.CompactNumberFormatSymbols_tr', 'goog.i18n.CompactNumberFormatSymbols_uk', 'goog.i18n.CompactNumberFormatSymbols_ur', 'goog.i18n.CompactNumberFormatSymbols_uz', 'goog.i18n.CompactNumberFormatSymbols_vi', 'goog.i18n.CompactNumberFormatSymbols_zh', 'goog.i18n.CompactNumberFormatSymbols_zh_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_TW', 'goog.i18n.CompactNumberFormatSymbols_zu'], [], {});
+goog.addDependency('i18n/compactnumberformatsymbolsext.js', ['goog.i18n.CompactNumberFormatSymbolsExt', 'goog.i18n.CompactNumberFormatSymbols_af_NA', 'goog.i18n.CompactNumberFormatSymbols_af_ZA', 'goog.i18n.CompactNumberFormatSymbols_agq', 'goog.i18n.CompactNumberFormatSymbols_agq_CM', 'goog.i18n.CompactNumberFormatSymbols_ak', 'goog.i18n.CompactNumberFormatSymbols_ak_GH', 'goog.i18n.CompactNumberFormatSymbols_am_ET', 'goog.i18n.CompactNumberFormatSymbols_ar_001', 'goog.i18n.CompactNumberFormatSymbols_ar_AE', 'goog.i18n.CompactNumberFormatSymbols_ar_BH', 'goog.i18n.CompactNumberFormatSymbols_ar_DJ', 'goog.i18n.CompactNumberFormatSymbols_ar_EG', 'goog.i18n.CompactNumberFormatSymbols_ar_EH', 'goog.i18n.CompactNumberFormatSymbols_ar_ER', 'goog.i18n.CompactNumberFormatSymbols_ar_IL', 'goog.i18n.CompactNumberFormatSymbols_ar_IQ', 'goog.i18n.CompactNumberFormatSymbols_ar_JO', 'goog.i18n.CompactNumberFormatSymbols_ar_KM', 'goog.i18n.CompactNumberFormatSymbols_ar_KW', 'goog.i18n.CompactNumberFormatSymbols_ar_LB', 'goog.i18n.CompactNumberFormatSymbols_ar_LY', 'goog.i18n.CompactNumberFormatSymbols_ar_MA', 'goog.i18n.CompactNumberFormatSymbols_ar_MR', 'goog.i18n.CompactNumberFormatSymbols_ar_OM', 'goog.i18n.CompactNumberFormatSymbols_ar_PS', 'goog.i18n.CompactNumberFormatSymbols_ar_QA', 'goog.i18n.CompactNumberFormatSymbols_ar_SA', 'goog.i18n.CompactNumberFormatSymbols_ar_SD', 'goog.i18n.CompactNumberFormatSymbols_ar_SO', 'goog.i18n.CompactNumberFormatSymbols_ar_SS', 'goog.i18n.CompactNumberFormatSymbols_ar_SY', 'goog.i18n.CompactNumberFormatSymbols_ar_TD', 'goog.i18n.CompactNumberFormatSymbols_ar_TN', 'goog.i18n.CompactNumberFormatSymbols_ar_XB', 'goog.i18n.CompactNumberFormatSymbols_ar_YE', 'goog.i18n.CompactNumberFormatSymbols_as', 'goog.i18n.CompactNumberFormatSymbols_as_IN', 'goog.i18n.CompactNumberFormatSymbols_asa', 'goog.i18n.CompactNumberFormatSymbols_asa_TZ', 'goog.i18n.CompactNumberFormatSymbols_ast', 'goog.i18n.CompactNumberFormatSymbols_ast_ES', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.CompactNumberFormatSymbols_az_Latn', 'goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ', 'goog.i18n.CompactNumberFormatSymbols_bas', 'goog.i18n.CompactNumberFormatSymbols_bas_CM', 'goog.i18n.CompactNumberFormatSymbols_be_BY', 'goog.i18n.CompactNumberFormatSymbols_bem', 'goog.i18n.CompactNumberFormatSymbols_bem_ZM', 'goog.i18n.CompactNumberFormatSymbols_bez', 'goog.i18n.CompactNumberFormatSymbols_bez_TZ', 'goog.i18n.CompactNumberFormatSymbols_bg_BG', 'goog.i18n.CompactNumberFormatSymbols_bm', 'goog.i18n.CompactNumberFormatSymbols_bm_ML', 'goog.i18n.CompactNumberFormatSymbols_bn_BD', 'goog.i18n.CompactNumberFormatSymbols_bn_IN', 'goog.i18n.CompactNumberFormatSymbols_bo', 'goog.i18n.CompactNumberFormatSymbols_bo_CN', 'goog.i18n.CompactNumberFormatSymbols_bo_IN', 'goog.i18n.CompactNumberFormatSymbols_br_FR', 'goog.i18n.CompactNumberFormatSymbols_brx', 'goog.i18n.CompactNumberFormatSymbols_brx_IN', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_ca_AD', 'goog.i18n.CompactNumberFormatSymbols_ca_ES', 'goog.i18n.CompactNumberFormatSymbols_ca_FR', 'goog.i18n.CompactNumberFormatSymbols_ca_IT', 'goog.i18n.CompactNumberFormatSymbols_ce', 'goog.i18n.CompactNumberFormatSymbols_ce_RU', 'goog.i18n.CompactNumberFormatSymbols_cgg', 'goog.i18n.CompactNumberFormatSymbols_cgg_UG', 'goog.i18n.CompactNumberFormatSymbols_chr_US', 'goog.i18n.CompactNumberFormatSymbols_ckb', 'goog.i18n.CompactNumberFormatSymbols_ckb_IQ', 'goog.i18n.CompactNumberFormatSymbols_ckb_IR', 'goog.i18n.CompactNumberFormatSymbols_cs_CZ', 'goog.i18n.CompactNumberFormatSymbols_cy_GB', 'goog.i18n.CompactNumberFormatSymbols_da_DK', 'goog.i18n.CompactNumberFormatSymbols_da_GL', 'goog.i18n.CompactNumberFormatSymbols_dav', 'goog.i18n.CompactNumberFormatSymbols_dav_KE', 'goog.i18n.CompactNumberFormatSymbols_de_BE', 'goog.i18n.CompactNumberFormatSymbols_de_DE', 'goog.i18n.CompactNumberFormatSymbols_de_IT', 'goog.i18n.CompactNumberFormatSymbols_de_LI', 'goog.i18n.CompactNumberFormatSymbols_de_LU', 'goog.i18n.CompactNumberFormatSymbols_dje', 'goog.i18n.CompactNumberFormatSymbols_dje_NE', 'goog.i18n.CompactNumberFormatSymbols_dsb', 'goog.i18n.CompactNumberFormatSymbols_dsb_DE', 'goog.i18n.CompactNumberFormatSymbols_dua', 'goog.i18n.CompactNumberFormatSymbols_dua_CM', 'goog.i18n.CompactNumberFormatSymbols_dyo', 'goog.i18n.CompactNumberFormatSymbols_dyo_SN', 'goog.i18n.CompactNumberFormatSymbols_dz', 'goog.i18n.CompactNumberFormatSymbols_dz_BT', 'goog.i18n.CompactNumberFormatSymbols_ebu', 'goog.i18n.CompactNumberFormatSymbols_ebu_KE', 'goog.i18n.CompactNumberFormatSymbols_ee', 'goog.i18n.CompactNumberFormatSymbols_ee_GH', 'goog.i18n.CompactNumberFormatSymbols_ee_TG', 'goog.i18n.CompactNumberFormatSymbols_el_CY', 'goog.i18n.CompactNumberFormatSymbols_el_GR', 'goog.i18n.CompactNumberFormatSymbols_en_001', 'goog.i18n.CompactNumberFormatSymbols_en_150', 'goog.i18n.CompactNumberFormatSymbols_en_AG', 'goog.i18n.CompactNumberFormatSymbols_en_AI', 'goog.i18n.CompactNumberFormatSymbols_en_AS', 'goog.i18n.CompactNumberFormatSymbols_en_AT', 'goog.i18n.CompactNumberFormatSymbols_en_BB', 'goog.i18n.CompactNumberFormatSymbols_en_BE', 'goog.i18n.CompactNumberFormatSymbols_en_BI', 'goog.i18n.CompactNumberFormatSymbols_en_BM', 'goog.i18n.CompactNumberFormatSymbols_en_BS', 'goog.i18n.CompactNumberFormatSymbols_en_BW', 'goog.i18n.CompactNumberFormatSymbols_en_BZ', 'goog.i18n.CompactNumberFormatSymbols_en_CC', 'goog.i18n.CompactNumberFormatSymbols_en_CH', 'goog.i18n.CompactNumberFormatSymbols_en_CK', 'goog.i18n.CompactNumberFormatSymbols_en_CM', 'goog.i18n.CompactNumberFormatSymbols_en_CX', 'goog.i18n.CompactNumberFormatSymbols_en_CY', 'goog.i18n.CompactNumberFormatSymbols_en_DE', 'goog.i18n.CompactNumberFormatSymbols_en_DG', 'goog.i18n.CompactNumberFormatSymbols_en_DK', 'goog.i18n.CompactNumberFormatSymbols_en_DM', 'goog.i18n.CompactNumberFormatSymbols_en_ER', 'goog.i18n.CompactNumberFormatSymbols_en_FI', 'goog.i18n.CompactNumberFormatSymbols_en_FJ', 'goog.i18n.CompactNumberFormatSymbols_en_FK', 'goog.i18n.CompactNumberFormatSymbols_en_FM', 'goog.i18n.CompactNumberFormatSymbols_en_GD', 'goog.i18n.CompactNumberFormatSymbols_en_GG', 'goog.i18n.CompactNumberFormatSymbols_en_GH', 'goog.i18n.CompactNumberFormatSymbols_en_GI', 'goog.i18n.CompactNumberFormatSymbols_en_GM', 'goog.i18n.CompactNumberFormatSymbols_en_GU', 'goog.i18n.CompactNumberFormatSymbols_en_GY', 'goog.i18n.CompactNumberFormatSymbols_en_HK', 'goog.i18n.CompactNumberFormatSymbols_en_IL', 'goog.i18n.CompactNumberFormatSymbols_en_IM', 'goog.i18n.CompactNumberFormatSymbols_en_IO', 'goog.i18n.CompactNumberFormatSymbols_en_JE', 'goog.i18n.CompactNumberFormatSymbols_en_JM', 'goog.i18n.CompactNumberFormatSymbols_en_KE', 'goog.i18n.CompactNumberFormatSymbols_en_KI', 'goog.i18n.CompactNumberFormatSymbols_en_KN', 'goog.i18n.CompactNumberFormatSymbols_en_KY', 'goog.i18n.CompactNumberFormatSymbols_en_LC', 'goog.i18n.CompactNumberFormatSymbols_en_LR', 'goog.i18n.CompactNumberFormatSymbols_en_LS', 'goog.i18n.CompactNumberFormatSymbols_en_MG', 'goog.i18n.CompactNumberFormatSymbols_en_MH', 'goog.i18n.CompactNumberFormatSymbols_en_MO', 'goog.i18n.CompactNumberFormatSymbols_en_MP', 'goog.i18n.CompactNumberFormatSymbols_en_MS', 'goog.i18n.CompactNumberFormatSymbols_en_MT', 'goog.i18n.CompactNumberFormatSymbols_en_MU', 'goog.i18n.CompactNumberFormatSymbols_en_MW', 'goog.i18n.CompactNumberFormatSymbols_en_MY', 'goog.i18n.CompactNumberFormatSymbols_en_NA', 'goog.i18n.CompactNumberFormatSymbols_en_NF', 'goog.i18n.CompactNumberFormatSymbols_en_NG', 'goog.i18n.CompactNumberFormatSymbols_en_NL', 'goog.i18n.CompactNumberFormatSymbols_en_NR', 'goog.i18n.CompactNumberFormatSymbols_en_NU', 'goog.i18n.CompactNumberFormatSymbols_en_NZ', 'goog.i18n.CompactNumberFormatSymbols_en_PG', 'goog.i18n.CompactNumberFormatSymbols_en_PH', 'goog.i18n.CompactNumberFormatSymbols_en_PK', 'goog.i18n.CompactNumberFormatSymbols_en_PN', 'goog.i18n.CompactNumberFormatSymbols_en_PR', 'goog.i18n.CompactNumberFormatSymbols_en_PW', 'goog.i18n.CompactNumberFormatSymbols_en_RW', 'goog.i18n.CompactNumberFormatSymbols_en_SB', 'goog.i18n.CompactNumberFormatSymbols_en_SC', 'goog.i18n.CompactNumberFormatSymbols_en_SD', 'goog.i18n.CompactNumberFormatSymbols_en_SE', 'goog.i18n.CompactNumberFormatSymbols_en_SH', 'goog.i18n.CompactNumberFormatSymbols_en_SI', 'goog.i18n.CompactNumberFormatSymbols_en_SL', 'goog.i18n.CompactNumberFormatSymbols_en_SS', 'goog.i18n.CompactNumberFormatSymbols_en_SX', 'goog.i18n.CompactNumberFormatSymbols_en_SZ', 'goog.i18n.CompactNumberFormatSymbols_en_TC', 'goog.i18n.CompactNumberFormatSymbols_en_TK', 'goog.i18n.CompactNumberFormatSymbols_en_TO', 'goog.i18n.CompactNumberFormatSymbols_en_TT', 'goog.i18n.CompactNumberFormatSymbols_en_TV', 'goog.i18n.CompactNumberFormatSymbols_en_TZ', 'goog.i18n.CompactNumberFormatSymbols_en_UG', 'goog.i18n.CompactNumberFormatSymbols_en_UM', 'goog.i18n.CompactNumberFormatSymbols_en_US_POSIX', 'goog.i18n.CompactNumberFormatSymbols_en_VC', 'goog.i18n.CompactNumberFormatSymbols_en_VG', 'goog.i18n.CompactNumberFormatSymbols_en_VI', 'goog.i18n.CompactNumberFormatSymbols_en_VU', 'goog.i18n.CompactNumberFormatSymbols_en_WS', 'goog.i18n.CompactNumberFormatSymbols_en_XA', 'goog.i18n.CompactNumberFormatSymbols_en_ZM', 'goog.i18n.CompactNumberFormatSymbols_en_ZW', 'goog.i18n.CompactNumberFormatSymbols_eo', 'goog.i18n.CompactNumberFormatSymbols_es_AR', 'goog.i18n.CompactNumberFormatSymbols_es_BO', 'goog.i18n.CompactNumberFormatSymbols_es_BR', 'goog.i18n.CompactNumberFormatSymbols_es_BZ', 'goog.i18n.CompactNumberFormatSymbols_es_CL', 'goog.i18n.CompactNumberFormatSymbols_es_CO', 'goog.i18n.CompactNumberFormatSymbols_es_CR', 'goog.i18n.CompactNumberFormatSymbols_es_CU', 'goog.i18n.CompactNumberFormatSymbols_es_DO', 'goog.i18n.CompactNumberFormatSymbols_es_EA', 'goog.i18n.CompactNumberFormatSymbols_es_EC', 'goog.i18n.CompactNumberFormatSymbols_es_GQ', 'goog.i18n.CompactNumberFormatSymbols_es_GT', 'goog.i18n.CompactNumberFormatSymbols_es_HN', 'goog.i18n.CompactNumberFormatSymbols_es_IC', 'goog.i18n.CompactNumberFormatSymbols_es_NI', 'goog.i18n.CompactNumberFormatSymbols_es_PA', 'goog.i18n.CompactNumberFormatSymbols_es_PE', 'goog.i18n.CompactNumberFormatSymbols_es_PH', 'goog.i18n.CompactNumberFormatSymbols_es_PR', 'goog.i18n.CompactNumberFormatSymbols_es_PY', 'goog.i18n.CompactNumberFormatSymbols_es_SV', 'goog.i18n.CompactNumberFormatSymbols_es_UY', 'goog.i18n.CompactNumberFormatSymbols_es_VE', 'goog.i18n.CompactNumberFormatSymbols_et_EE', 'goog.i18n.CompactNumberFormatSymbols_eu_ES', 'goog.i18n.CompactNumberFormatSymbols_ewo', 'goog.i18n.CompactNumberFormatSymbols_ewo_CM', 'goog.i18n.CompactNumberFormatSymbols_fa_AF', 'goog.i18n.CompactNumberFormatSymbols_fa_IR', 'goog.i18n.CompactNumberFormatSymbols_ff', 'goog.i18n.CompactNumberFormatSymbols_ff_CM', 'goog.i18n.CompactNumberFormatSymbols_ff_GN', 'goog.i18n.CompactNumberFormatSymbols_ff_MR', 'goog.i18n.CompactNumberFormatSymbols_ff_SN', 'goog.i18n.CompactNumberFormatSymbols_fi_FI', 'goog.i18n.CompactNumberFormatSymbols_fil_PH', 'goog.i18n.CompactNumberFormatSymbols_fo', 'goog.i18n.CompactNumberFormatSymbols_fo_DK', 'goog.i18n.CompactNumberFormatSymbols_fo_FO', 'goog.i18n.CompactNumberFormatSymbols_fr_BE', 'goog.i18n.CompactNumberFormatSymbols_fr_BF', 'goog.i18n.CompactNumberFormatSymbols_fr_BI', 'goog.i18n.CompactNumberFormatSymbols_fr_BJ', 'goog.i18n.CompactNumberFormatSymbols_fr_BL', 'goog.i18n.CompactNumberFormatSymbols_fr_CD', 'goog.i18n.CompactNumberFormatSymbols_fr_CF', 'goog.i18n.CompactNumberFormatSymbols_fr_CG', 'goog.i18n.CompactNumberFormatSymbols_fr_CH', 'goog.i18n.CompactNumberFormatSymbols_fr_CI', 'goog.i18n.CompactNumberFormatSymbols_fr_CM', 'goog.i18n.CompactNumberFormatSymbols_fr_DJ', 'goog.i18n.CompactNumberFormatSymbols_fr_DZ', 'goog.i18n.CompactNumberFormatSymbols_fr_FR', 'goog.i18n.CompactNumberFormatSymbols_fr_GA', 'goog.i18n.CompactNumberFormatSymbols_fr_GF', 'goog.i18n.CompactNumberFormatSymbols_fr_GN', 'goog.i18n.CompactNumberFormatSymbols_fr_GP', 'goog.i18n.CompactNumberFormatSymbols_fr_GQ', 'goog.i18n.CompactNumberFormatSymbols_fr_HT', 'goog.i18n.CompactNumberFormatSymbols_fr_KM', 'goog.i18n.CompactNumberFormatSymbols_fr_LU', 'goog.i18n.CompactNumberFormatSymbols_fr_MA', 'goog.i18n.CompactNumberFormatSymbols_fr_MC', 'goog.i18n.CompactNumberFormatSymbols_fr_MF', 'goog.i18n.CompactNumberFormatSymbols_fr_MG', 'goog.i18n.CompactNumberFormatSymbols_fr_ML', 'goog.i18n.CompactNumberFormatSymbols_fr_MQ', 'goog.i18n.CompactNumberFormatSymbols_fr_MR', 'goog.i18n.CompactNumberFormatSymbols_fr_MU', 'goog.i18n.CompactNumberFormatSymbols_fr_NC', 'goog.i18n.CompactNumberFormatSymbols_fr_NE', 'goog.i18n.CompactNumberFormatSymbols_fr_PF', 'goog.i18n.CompactNumberFormatSymbols_fr_PM', 'goog.i18n.CompactNumberFormatSymbols_fr_RE', 'goog.i18n.CompactNumberFormatSymbols_fr_RW', 'goog.i18n.CompactNumberFormatSymbols_fr_SC', 'goog.i18n.CompactNumberFormatSymbols_fr_SN', 'goog.i18n.CompactNumberFormatSymbols_fr_SY', 'goog.i18n.CompactNumberFormatSymbols_fr_TD', 'goog.i18n.CompactNumberFormatSymbols_fr_TG', 'goog.i18n.CompactNumberFormatSymbols_fr_TN', 'goog.i18n.CompactNumberFormatSymbols_fr_VU', 'goog.i18n.CompactNumberFormatSymbols_fr_WF', 'goog.i18n.CompactNumberFormatSymbols_fr_YT', 'goog.i18n.CompactNumberFormatSymbols_fur', 'goog.i18n.CompactNumberFormatSymbols_fur_IT', 'goog.i18n.CompactNumberFormatSymbols_fy', 'goog.i18n.CompactNumberFormatSymbols_fy_NL', 'goog.i18n.CompactNumberFormatSymbols_ga_IE', 'goog.i18n.CompactNumberFormatSymbols_gd', 'goog.i18n.CompactNumberFormatSymbols_gd_GB', 'goog.i18n.CompactNumberFormatSymbols_gl_ES', 'goog.i18n.CompactNumberFormatSymbols_gsw_CH', 'goog.i18n.CompactNumberFormatSymbols_gsw_FR', 'goog.i18n.CompactNumberFormatSymbols_gsw_LI', 'goog.i18n.CompactNumberFormatSymbols_gu_IN', 'goog.i18n.CompactNumberFormatSymbols_guz', 'goog.i18n.CompactNumberFormatSymbols_guz_KE', 'goog.i18n.CompactNumberFormatSymbols_gv', 'goog.i18n.CompactNumberFormatSymbols_gv_IM', 'goog.i18n.CompactNumberFormatSymbols_ha', 'goog.i18n.CompactNumberFormatSymbols_ha_GH', 'goog.i18n.CompactNumberFormatSymbols_ha_NE', 'goog.i18n.CompactNumberFormatSymbols_ha_NG', 'goog.i18n.CompactNumberFormatSymbols_haw_US', 'goog.i18n.CompactNumberFormatSymbols_he_IL', 'goog.i18n.CompactNumberFormatSymbols_hi_IN', 'goog.i18n.CompactNumberFormatSymbols_hr_BA', 'goog.i18n.CompactNumberFormatSymbols_hr_HR', 'goog.i18n.CompactNumberFormatSymbols_hsb', 'goog.i18n.CompactNumberFormatSymbols_hsb_DE', 'goog.i18n.CompactNumberFormatSymbols_hu_HU', 'goog.i18n.CompactNumberFormatSymbols_hy_AM', 'goog.i18n.CompactNumberFormatSymbols_id_ID', 'goog.i18n.CompactNumberFormatSymbols_ig', 'goog.i18n.CompactNumberFormatSymbols_ig_NG', 'goog.i18n.CompactNumberFormatSymbols_ii', 'goog.i18n.CompactNumberFormatSymbols_ii_CN', 'goog.i18n.CompactNumberFormatSymbols_is_IS', 'goog.i18n.CompactNumberFormatSymbols_it_CH', 'goog.i18n.CompactNumberFormatSymbols_it_IT', 'goog.i18n.CompactNumberFormatSymbols_it_SM', 'goog.i18n.CompactNumberFormatSymbols_it_VA', 'goog.i18n.CompactNumberFormatSymbols_ja_JP', 'goog.i18n.CompactNumberFormatSymbols_jgo', 'goog.i18n.CompactNumberFormatSymbols_jgo_CM', 'goog.i18n.CompactNumberFormatSymbols_jmc', 'goog.i18n.CompactNumberFormatSymbols_jmc_TZ', 'goog.i18n.CompactNumberFormatSymbols_ka_GE', 'goog.i18n.CompactNumberFormatSymbols_kab', 'goog.i18n.CompactNumberFormatSymbols_kab_DZ', 'goog.i18n.CompactNumberFormatSymbols_kam', 'goog.i18n.CompactNumberFormatSymbols_kam_KE', 'goog.i18n.CompactNumberFormatSymbols_kde', 'goog.i18n.CompactNumberFormatSymbols_kde_TZ', 'goog.i18n.CompactNumberFormatSymbols_kea', 'goog.i18n.CompactNumberFormatSymbols_kea_CV', 'goog.i18n.CompactNumberFormatSymbols_khq', 'goog.i18n.CompactNumberFormatSymbols_khq_ML', 'goog.i18n.CompactNumberFormatSymbols_ki', 'goog.i18n.CompactNumberFormatSymbols_ki_KE', 'goog.i18n.CompactNumberFormatSymbols_kk_KZ', 'goog.i18n.CompactNumberFormatSymbols_kkj', 'goog.i18n.CompactNumberFormatSymbols_kkj_CM', 'goog.i18n.CompactNumberFormatSymbols_kl', 'goog.i18n.CompactNumberFormatSymbols_kl_GL', 'goog.i18n.CompactNumberFormatSymbols_kln', 'goog.i18n.CompactNumberFormatSymbols_kln_KE', 'goog.i18n.CompactNumberFormatSymbols_km_KH', 'goog.i18n.CompactNumberFormatSymbols_kn_IN', 'goog.i18n.CompactNumberFormatSymbols_ko_KP', 'goog.i18n.CompactNumberFormatSymbols_ko_KR', 'goog.i18n.CompactNumberFormatSymbols_kok', 'goog.i18n.CompactNumberFormatSymbols_kok_IN', 'goog.i18n.CompactNumberFormatSymbols_ks', 'goog.i18n.CompactNumberFormatSymbols_ks_IN', 'goog.i18n.CompactNumberFormatSymbols_ksb', 'goog.i18n.CompactNumberFormatSymbols_ksb_TZ', 'goog.i18n.CompactNumberFormatSymbols_ksf', 'goog.i18n.CompactNumberFormatSymbols_ksf_CM', 'goog.i18n.CompactNumberFormatSymbols_ksh', 'goog.i18n.CompactNumberFormatSymbols_ksh_DE', 'goog.i18n.CompactNumberFormatSymbols_kw', 'goog.i18n.CompactNumberFormatSymbols_kw_GB', 'goog.i18n.CompactNumberFormatSymbols_ky_KG', 'goog.i18n.CompactNumberFormatSymbols_lag', 'goog.i18n.CompactNumberFormatSymbols_lag_TZ', 'goog.i18n.CompactNumberFormatSymbols_lb', 'goog.i18n.CompactNumberFormatSymbols_lb_LU', 'goog.i18n.CompactNumberFormatSymbols_lg', 'goog.i18n.CompactNumberFormatSymbols_lg_UG', 'goog.i18n.CompactNumberFormatSymbols_lkt', 'goog.i18n.CompactNumberFormatSymbols_lkt_US', 'goog.i18n.CompactNumberFormatSymbols_ln_AO', 'goog.i18n.CompactNumberFormatSymbols_ln_CD', 'goog.i18n.CompactNumberFormatSymbols_ln_CF', 'goog.i18n.CompactNumberFormatSymbols_ln_CG', 'goog.i18n.CompactNumberFormatSymbols_lo_LA', 'goog.i18n.CompactNumberFormatSymbols_lrc', 'goog.i18n.CompactNumberFormatSymbols_lrc_IQ', 'goog.i18n.CompactNumberFormatSymbols_lrc_IR', 'goog.i18n.CompactNumberFormatSymbols_lt_LT', 'goog.i18n.CompactNumberFormatSymbols_lu', 'goog.i18n.CompactNumberFormatSymbols_lu_CD', 'goog.i18n.CompactNumberFormatSymbols_luo', 'goog.i18n.CompactNumberFormatSymbols_luo_KE', 'goog.i18n.CompactNumberFormatSymbols_luy', 'goog.i18n.CompactNumberFormatSymbols_luy_KE', 'goog.i18n.CompactNumberFormatSymbols_lv_LV', 'goog.i18n.CompactNumberFormatSymbols_mas', 'goog.i18n.CompactNumberFormatSymbols_mas_KE', 'goog.i18n.CompactNumberFormatSymbols_mas_TZ', 'goog.i18n.CompactNumberFormatSymbols_mer', 'goog.i18n.CompactNumberFormatSymbols_mer_KE', 'goog.i18n.CompactNumberFormatSymbols_mfe', 'goog.i18n.CompactNumberFormatSymbols_mfe_MU', 'goog.i18n.CompactNumberFormatSymbols_mg', 'goog.i18n.CompactNumberFormatSymbols_mg_MG', 'goog.i18n.CompactNumberFormatSymbols_mgh', 'goog.i18n.CompactNumberFormatSymbols_mgh_MZ', 'goog.i18n.CompactNumberFormatSymbols_mgo', 'goog.i18n.CompactNumberFormatSymbols_mgo_CM', 'goog.i18n.CompactNumberFormatSymbols_mk_MK', 'goog.i18n.CompactNumberFormatSymbols_ml_IN', 'goog.i18n.CompactNumberFormatSymbols_mn_MN', 'goog.i18n.CompactNumberFormatSymbols_mr_IN', 'goog.i18n.CompactNumberFormatSymbols_ms_BN', 'goog.i18n.CompactNumberFormatSymbols_ms_MY', 'goog.i18n.CompactNumberFormatSymbols_ms_SG', 'goog.i18n.CompactNumberFormatSymbols_mt_MT', 'goog.i18n.CompactNumberFormatSymbols_mua', 'goog.i18n.CompactNumberFormatSymbols_mua_CM', 'goog.i18n.CompactNumberFormatSymbols_my_MM', 'goog.i18n.CompactNumberFormatSymbols_mzn', 'goog.i18n.CompactNumberFormatSymbols_mzn_IR', 'goog.i18n.CompactNumberFormatSymbols_naq', 'goog.i18n.CompactNumberFormatSymbols_naq_NA', 'goog.i18n.CompactNumberFormatSymbols_nb_NO', 'goog.i18n.CompactNumberFormatSymbols_nb_SJ', 'goog.i18n.CompactNumberFormatSymbols_nd', 'goog.i18n.CompactNumberFormatSymbols_nd_ZW', 'goog.i18n.CompactNumberFormatSymbols_nds', 'goog.i18n.CompactNumberFormatSymbols_nds_DE', 'goog.i18n.CompactNumberFormatSymbols_nds_NL', 'goog.i18n.CompactNumberFormatSymbols_ne_IN', 'goog.i18n.CompactNumberFormatSymbols_ne_NP', 'goog.i18n.CompactNumberFormatSymbols_nl_AW', 'goog.i18n.CompactNumberFormatSymbols_nl_BE', 'goog.i18n.CompactNumberFormatSymbols_nl_BQ', 'goog.i18n.CompactNumberFormatSymbols_nl_CW', 'goog.i18n.CompactNumberFormatSymbols_nl_NL', 'goog.i18n.CompactNumberFormatSymbols_nl_SR', 'goog.i18n.CompactNumberFormatSymbols_nl_SX', 'goog.i18n.CompactNumberFormatSymbols_nmg', 'goog.i18n.CompactNumberFormatSymbols_nmg_CM', 'goog.i18n.CompactNumberFormatSymbols_nn', 'goog.i18n.CompactNumberFormatSymbols_nn_NO', 'goog.i18n.CompactNumberFormatSymbols_nnh', 'goog.i18n.CompactNumberFormatSymbols_nnh_CM', 'goog.i18n.CompactNumberFormatSymbols_nus', 'goog.i18n.CompactNumberFormatSymbols_nus_SS', 'goog.i18n.CompactNumberFormatSymbols_nyn', 'goog.i18n.CompactNumberFormatSymbols_nyn_UG', 'goog.i18n.CompactNumberFormatSymbols_om', 'goog.i18n.CompactNumberFormatSymbols_om_ET', 'goog.i18n.CompactNumberFormatSymbols_om_KE', 'goog.i18n.CompactNumberFormatSymbols_or_IN', 'goog.i18n.CompactNumberFormatSymbols_os', 'goog.i18n.CompactNumberFormatSymbols_os_GE', 'goog.i18n.CompactNumberFormatSymbols_os_RU', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN', 'goog.i18n.CompactNumberFormatSymbols_pl_PL', 'goog.i18n.CompactNumberFormatSymbols_ps', 'goog.i18n.CompactNumberFormatSymbols_ps_AF', 'goog.i18n.CompactNumberFormatSymbols_pt_AO', 'goog.i18n.CompactNumberFormatSymbols_pt_CH', 'goog.i18n.CompactNumberFormatSymbols_pt_CV', 'goog.i18n.CompactNumberFormatSymbols_pt_GQ', 'goog.i18n.CompactNumberFormatSymbols_pt_GW', 'goog.i18n.CompactNumberFormatSymbols_pt_LU', 'goog.i18n.CompactNumberFormatSymbols_pt_MO', 'goog.i18n.CompactNumberFormatSymbols_pt_MZ', 'goog.i18n.CompactNumberFormatSymbols_pt_ST', 'goog.i18n.CompactNumberFormatSymbols_pt_TL', 'goog.i18n.CompactNumberFormatSymbols_qu', 'goog.i18n.CompactNumberFormatSymbols_qu_BO', 'goog.i18n.CompactNumberFormatSymbols_qu_EC', 'goog.i18n.CompactNumberFormatSymbols_qu_PE', 'goog.i18n.CompactNumberFormatSymbols_rm', 'goog.i18n.CompactNumberFormatSymbols_rm_CH', 'goog.i18n.CompactNumberFormatSymbols_rn', 'goog.i18n.CompactNumberFormatSymbols_rn_BI', 'goog.i18n.CompactNumberFormatSymbols_ro_MD', 'goog.i18n.CompactNumberFormatSymbols_ro_RO', 'goog.i18n.CompactNumberFormatSymbols_rof', 'goog.i18n.CompactNumberFormatSymbols_rof_TZ', 'goog.i18n.CompactNumberFormatSymbols_ru_BY', 'goog.i18n.CompactNumberFormatSymbols_ru_KG', 'goog.i18n.CompactNumberFormatSymbols_ru_KZ', 'goog.i18n.CompactNumberFormatSymbols_ru_MD', 'goog.i18n.CompactNumberFormatSymbols_ru_RU', 'goog.i18n.CompactNumberFormatSymbols_ru_UA', 'goog.i18n.CompactNumberFormatSymbols_rw', 'goog.i18n.CompactNumberFormatSymbols_rw_RW', 'goog.i18n.CompactNumberFormatSymbols_rwk', 'goog.i18n.CompactNumberFormatSymbols_rwk_TZ', 'goog.i18n.CompactNumberFormatSymbols_sah', 'goog.i18n.CompactNumberFormatSymbols_sah_RU', 'goog.i18n.CompactNumberFormatSymbols_saq', 'goog.i18n.CompactNumberFormatSymbols_saq_KE', 'goog.i18n.CompactNumberFormatSymbols_sbp', 'goog.i18n.CompactNumberFormatSymbols_sbp_TZ', 'goog.i18n.CompactNumberFormatSymbols_se', 'goog.i18n.CompactNumberFormatSymbols_se_FI', 'goog.i18n.CompactNumberFormatSymbols_se_NO', 'goog.i18n.CompactNumberFormatSymbols_se_SE', 'goog.i18n.CompactNumberFormatSymbols_seh', 'goog.i18n.CompactNumberFormatSymbols_seh_MZ', 'goog.i18n.CompactNumberFormatSymbols_ses', 'goog.i18n.CompactNumberFormatSymbols_ses_ML', 'goog.i18n.CompactNumberFormatSymbols_sg', 'goog.i18n.CompactNumberFormatSymbols_sg_CF', 'goog.i18n.CompactNumberFormatSymbols_shi', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.CompactNumberFormatSymbols_si_LK', 'goog.i18n.CompactNumberFormatSymbols_sk_SK', 'goog.i18n.CompactNumberFormatSymbols_sl_SI', 'goog.i18n.CompactNumberFormatSymbols_smn', 'goog.i18n.CompactNumberFormatSymbols_smn_FI', 'goog.i18n.CompactNumberFormatSymbols_sn', 'goog.i18n.CompactNumberFormatSymbols_sn_ZW', 'goog.i18n.CompactNumberFormatSymbols_so', 'goog.i18n.CompactNumberFormatSymbols_so_DJ', 'goog.i18n.CompactNumberFormatSymbols_so_ET', 'goog.i18n.CompactNumberFormatSymbols_so_KE', 'goog.i18n.CompactNumberFormatSymbols_so_SO', 'goog.i18n.CompactNumberFormatSymbols_sq_AL', 'goog.i18n.CompactNumberFormatSymbols_sq_MK', 'goog.i18n.CompactNumberFormatSymbols_sq_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK', 'goog.i18n.CompactNumberFormatSymbols_sv_AX', 'goog.i18n.CompactNumberFormatSymbols_sv_FI', 'goog.i18n.CompactNumberFormatSymbols_sv_SE', 'goog.i18n.CompactNumberFormatSymbols_sw_CD', 'goog.i18n.CompactNumberFormatSymbols_sw_KE', 'goog.i18n.CompactNumberFormatSymbols_sw_TZ', 'goog.i18n.CompactNumberFormatSymbols_sw_UG', 'goog.i18n.CompactNumberFormatSymbols_ta_IN', 'goog.i18n.CompactNumberFormatSymbols_ta_LK', 'goog.i18n.CompactNumberFormatSymbols_ta_MY', 'goog.i18n.CompactNumberFormatSymbols_ta_SG', 'goog.i18n.CompactNumberFormatSymbols_te_IN', 'goog.i18n.CompactNumberFormatSymbols_teo', 'goog.i18n.CompactNumberFormatSymbols_teo_KE', 'goog.i18n.CompactNumberFormatSymbols_teo_UG', 'goog.i18n.CompactNumberFormatSymbols_th_TH', 'goog.i18n.CompactNumberFormatSymbols_ti', 'goog.i18n.CompactNumberFormatSymbols_ti_ER', 'goog.i18n.CompactNumberFormatSymbols_ti_ET', 'goog.i18n.CompactNumberFormatSymbols_to', 'goog.i18n.CompactNumberFormatSymbols_to_TO', 'goog.i18n.CompactNumberFormatSymbols_tr_CY', 'goog.i18n.CompactNumberFormatSymbols_tr_TR', 'goog.i18n.CompactNumberFormatSymbols_twq', 'goog.i18n.CompactNumberFormatSymbols_twq_NE', 'goog.i18n.CompactNumberFormatSymbols_tzm', 'goog.i18n.CompactNumberFormatSymbols_tzm_MA', 'goog.i18n.CompactNumberFormatSymbols_ug', 'goog.i18n.CompactNumberFormatSymbols_ug_CN', 'goog.i18n.CompactNumberFormatSymbols_uk_UA', 'goog.i18n.CompactNumberFormatSymbols_ur_IN', 'goog.i18n.CompactNumberFormatSymbols_ur_PK', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.CompactNumberFormatSymbols_vai', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.CompactNumberFormatSymbols_vi_VN', 'goog.i18n.CompactNumberFormatSymbols_vun', 'goog.i18n.CompactNumberFormatSymbols_vun_TZ', 'goog.i18n.CompactNumberFormatSymbols_wae', 'goog.i18n.CompactNumberFormatSymbols_wae_CH', 'goog.i18n.CompactNumberFormatSymbols_xog', 'goog.i18n.CompactNumberFormatSymbols_xog_UG', 'goog.i18n.CompactNumberFormatSymbols_yav', 'goog.i18n.CompactNumberFormatSymbols_yav_CM', 'goog.i18n.CompactNumberFormatSymbols_yi', 'goog.i18n.CompactNumberFormatSymbols_yi_001', 'goog.i18n.CompactNumberFormatSymbols_yo', 'goog.i18n.CompactNumberFormatSymbols_yo_BJ', 'goog.i18n.CompactNumberFormatSymbols_yo_NG', 'goog.i18n.CompactNumberFormatSymbols_yue', 'goog.i18n.CompactNumberFormatSymbols_yue_HK', 'goog.i18n.CompactNumberFormatSymbols_zgh', 'goog.i18n.CompactNumberFormatSymbols_zgh_MA', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW', 'goog.i18n.CompactNumberFormatSymbols_zu_ZA'], ['goog.i18n.CompactNumberFormatSymbols'], {});
+goog.addDependency('i18n/currency.js', ['goog.i18n.currency', 'goog.i18n.currency.CurrencyInfo', 'goog.i18n.currency.CurrencyInfoTier2'], [], {});
+goog.addDependency('i18n/currency_test.js', ['goog.i18n.currencyTest'], ['goog.i18n.NumberFormat', 'goog.i18n.currency', 'goog.i18n.currency.CurrencyInfo', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/currencycodemap.js', ['goog.i18n.currencyCodeMap', 'goog.i18n.currencyCodeMapTier2'], [], {});
+goog.addDependency('i18n/dateintervalformat.js', ['goog.i18n.DateIntervalFormat'], ['goog.array', 'goog.asserts', 'goog.date.DateLike', 'goog.date.DateRange', 'goog.date.DateTime', 'goog.date.Interval', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbolsType', 'goog.i18n.TimeZone', 'goog.i18n.dateIntervalSymbols', 'goog.object'], {'lang': 'es5', 'module': 'goog'});
+goog.addDependency('i18n/dateintervalformat_test.js', ['goog.i18n.DateIntervalFormatTest'], ['goog.date.Date', 'goog.date.DateRange', 'goog.date.DateTime', 'goog.date.Interval', 'goog.i18n.DateIntervalFormat', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.TimeZone', 'goog.i18n.dateIntervalPatterns', 'goog.i18n.dateIntervalSymbols', 'goog.object', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('i18n/dateintervalpatterns.js', ['goog.i18n.dateIntervalPatterns'], ['goog.i18n.dateIntervalSymbols'], {'module': 'goog'});
+goog.addDependency('i18n/dateintervalpatternsext.js', ['goog.i18n.dateIntervalPatternsExt'], ['goog.i18n.dateIntervalPatterns'], {'module': 'goog'});
+goog.addDependency('i18n/dateintervalsymbols.js', ['goog.i18n.dateIntervalSymbols'], [], {'module': 'goog'});
+goog.addDependency('i18n/dateintervalsymbolsext.js', ['goog.i18n.dateIntervalSymbolsExt'], ['goog.i18n.dateIntervalSymbols'], {'module': 'goog'});
+goog.addDependency('i18n/datetimeformat.js', ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeFormat.Format'], ['goog.asserts', 'goog.date', 'goog.i18n.DateTimeSymbols', 'goog.i18n.TimeZone', 'goog.string'], {});
+goog.addDependency('i18n/datetimeformat_test.js', ['goog.i18n.DateTimeFormatTest'], ['goog.date.Date', 'goog.date.DateTime', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.TimeZone', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/datetimeparse.js', ['goog.i18n.DateTimeParse'], ['goog.asserts', 'goog.date', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols'], {});
+goog.addDependency('i18n/datetimeparse_test.js', ['goog.i18n.DateTimeParseTest'], ['goog.date.Date', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeParse', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_zh', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('i18n/datetimepatterns.js', ['goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_af', 'goog.i18n.DateTimePatterns_am', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_ar_DZ', 'goog.i18n.DateTimePatterns_az', 'goog.i18n.DateTimePatterns_be', 'goog.i18n.DateTimePatterns_bg', 'goog.i18n.DateTimePatterns_bn', 'goog.i18n.DateTimePatterns_br', 'goog.i18n.DateTimePatterns_bs', 'goog.i18n.DateTimePatterns_ca', 'goog.i18n.DateTimePatterns_chr', 'goog.i18n.DateTimePatterns_cs', 'goog.i18n.DateTimePatterns_cy', 'goog.i18n.DateTimePatterns_da', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_de_AT', 'goog.i18n.DateTimePatterns_de_CH', 'goog.i18n.DateTimePatterns_el', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_en_AU', 'goog.i18n.DateTimePatterns_en_CA', 'goog.i18n.DateTimePatterns_en_GB', 'goog.i18n.DateTimePatterns_en_IE', 'goog.i18n.DateTimePatterns_en_IN', 'goog.i18n.DateTimePatterns_en_SG', 'goog.i18n.DateTimePatterns_en_US', 'goog.i18n.DateTimePatterns_en_ZA', 'goog.i18n.DateTimePatterns_es', 'goog.i18n.DateTimePatterns_es_419', 'goog.i18n.DateTimePatterns_es_ES', 'goog.i18n.DateTimePatterns_es_MX', 'goog.i18n.DateTimePatterns_es_US', 'goog.i18n.DateTimePatterns_et', 'goog.i18n.DateTimePatterns_eu', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fi', 'goog.i18n.DateTimePatterns_fil', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_fr_CA', 'goog.i18n.DateTimePatterns_ga', 'goog.i18n.DateTimePatterns_gl', 'goog.i18n.DateTimePatterns_gsw', 'goog.i18n.DateTimePatterns_gu', 'goog.i18n.DateTimePatterns_haw', 'goog.i18n.DateTimePatterns_he', 'goog.i18n.DateTimePatterns_hi', 'goog.i18n.DateTimePatterns_hr', 'goog.i18n.DateTimePatterns_hu', 'goog.i18n.DateTimePatterns_hy', 'goog.i18n.DateTimePatterns_id', 'goog.i18n.DateTimePatterns_in', 'goog.i18n.DateTimePatterns_is', 'goog.i18n.DateTimePatterns_it', 'goog.i18n.DateTimePatterns_iw', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_ka', 'goog.i18n.DateTimePatterns_kk', 'goog.i18n.DateTimePatterns_km', 'goog.i18n.DateTimePatterns_kn', 'goog.i18n.DateTimePatterns_ko', 'goog.i18n.DateTimePatterns_ky', 'goog.i18n.DateTimePatterns_ln', 'goog.i18n.DateTimePatterns_lo', 'goog.i18n.DateTimePatterns_lt', 'goog.i18n.DateTimePatterns_lv', 'goog.i18n.DateTimePatterns_mk', 'goog.i18n.DateTimePatterns_ml', 'goog.i18n.DateTimePatterns_mn', 'goog.i18n.DateTimePatterns_mo', 'goog.i18n.DateTimePatterns_mr', 'goog.i18n.DateTimePatterns_ms', 'goog.i18n.DateTimePatterns_mt', 'goog.i18n.DateTimePatterns_my', 'goog.i18n.DateTimePatterns_nb', 'goog.i18n.DateTimePatterns_ne', 'goog.i18n.DateTimePatterns_nl', 'goog.i18n.DateTimePatterns_no', 'goog.i18n.DateTimePatterns_no_NO', 'goog.i18n.DateTimePatterns_or', 'goog.i18n.DateTimePatterns_pa', 'goog.i18n.DateTimePatterns_pl', 'goog.i18n.DateTimePatterns_pt', 'goog.i18n.DateTimePatterns_pt_BR', 'goog.i18n.DateTimePatterns_pt_PT', 'goog.i18n.DateTimePatterns_ro', 'goog.i18n.DateTimePatterns_ru', 'goog.i18n.DateTimePatterns_sh', 'goog.i18n.DateTimePatterns_si', 'goog.i18n.DateTimePatterns_sk', 'goog.i18n.DateTimePatterns_sl', 'goog.i18n.DateTimePatterns_sq', 'goog.i18n.DateTimePatterns_sr', 'goog.i18n.DateTimePatterns_sr_Latn', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimePatterns_sw', 'goog.i18n.DateTimePatterns_ta', 'goog.i18n.DateTimePatterns_te', 'goog.i18n.DateTimePatterns_th', 'goog.i18n.DateTimePatterns_tl', 'goog.i18n.DateTimePatterns_tr', 'goog.i18n.DateTimePatterns_uk', 'goog.i18n.DateTimePatterns_ur', 'goog.i18n.DateTimePatterns_uz', 'goog.i18n.DateTimePatterns_vi', 'goog.i18n.DateTimePatterns_zh', 'goog.i18n.DateTimePatterns_zh_CN', 'goog.i18n.DateTimePatterns_zh_HK', 'goog.i18n.DateTimePatterns_zh_TW', 'goog.i18n.DateTimePatterns_zu'], [], {});
+goog.addDependency('i18n/datetimepatternsext.js', ['goog.i18n.DateTimePatternsExt', 'goog.i18n.DateTimePatterns_af_NA', 'goog.i18n.DateTimePatterns_af_ZA', 'goog.i18n.DateTimePatterns_agq', 'goog.i18n.DateTimePatterns_agq_CM', 'goog.i18n.DateTimePatterns_ak', 'goog.i18n.DateTimePatterns_ak_GH', 'goog.i18n.DateTimePatterns_am_ET', 'goog.i18n.DateTimePatterns_ar_001', 'goog.i18n.DateTimePatterns_ar_AE', 'goog.i18n.DateTimePatterns_ar_BH', 'goog.i18n.DateTimePatterns_ar_DJ', 'goog.i18n.DateTimePatterns_ar_EG', 'goog.i18n.DateTimePatterns_ar_EH', 'goog.i18n.DateTimePatterns_ar_ER', 'goog.i18n.DateTimePatterns_ar_IL', 'goog.i18n.DateTimePatterns_ar_IQ', 'goog.i18n.DateTimePatterns_ar_JO', 'goog.i18n.DateTimePatterns_ar_KM', 'goog.i18n.DateTimePatterns_ar_KW', 'goog.i18n.DateTimePatterns_ar_LB', 'goog.i18n.DateTimePatterns_ar_LY', 'goog.i18n.DateTimePatterns_ar_MA', 'goog.i18n.DateTimePatterns_ar_MR', 'goog.i18n.DateTimePatterns_ar_OM', 'goog.i18n.DateTimePatterns_ar_PS', 'goog.i18n.DateTimePatterns_ar_QA', 'goog.i18n.DateTimePatterns_ar_SA', 'goog.i18n.DateTimePatterns_ar_SD', 'goog.i18n.DateTimePatterns_ar_SO', 'goog.i18n.DateTimePatterns_ar_SS', 'goog.i18n.DateTimePatterns_ar_SY', 'goog.i18n.DateTimePatterns_ar_TD', 'goog.i18n.DateTimePatterns_ar_TN', 'goog.i18n.DateTimePatterns_ar_XB', 'goog.i18n.DateTimePatterns_ar_YE', 'goog.i18n.DateTimePatterns_as', 'goog.i18n.DateTimePatterns_as_IN', 'goog.i18n.DateTimePatterns_asa', 'goog.i18n.DateTimePatterns_asa_TZ', 'goog.i18n.DateTimePatterns_ast', 'goog.i18n.DateTimePatterns_ast_ES', 'goog.i18n.DateTimePatterns_az_Cyrl', 'goog.i18n.DateTimePatterns_az_Cyrl_AZ', 'goog.i18n.DateTimePatterns_az_Latn', 'goog.i18n.DateTimePatterns_az_Latn_AZ', 'goog.i18n.DateTimePatterns_bas', 'goog.i18n.DateTimePatterns_bas_CM', 'goog.i18n.DateTimePatterns_be_BY', 'goog.i18n.DateTimePatterns_bem', 'goog.i18n.DateTimePatterns_bem_ZM', 'goog.i18n.DateTimePatterns_bez', 'goog.i18n.DateTimePatterns_bez_TZ', 'goog.i18n.DateTimePatterns_bg_BG', 'goog.i18n.DateTimePatterns_bm', 'goog.i18n.DateTimePatterns_bm_ML', 'goog.i18n.DateTimePatterns_bn_BD', 'goog.i18n.DateTimePatterns_bn_IN', 'goog.i18n.DateTimePatterns_bo', 'goog.i18n.DateTimePatterns_bo_CN', 'goog.i18n.DateTimePatterns_bo_IN', 'goog.i18n.DateTimePatterns_br_FR', 'goog.i18n.DateTimePatterns_brx', 'goog.i18n.DateTimePatterns_brx_IN', 'goog.i18n.DateTimePatterns_bs_Cyrl', 'goog.i18n.DateTimePatterns_bs_Cyrl_BA', 'goog.i18n.DateTimePatterns_bs_Latn', 'goog.i18n.DateTimePatterns_bs_Latn_BA', 'goog.i18n.DateTimePatterns_ca_AD', 'goog.i18n.DateTimePatterns_ca_ES', 'goog.i18n.DateTimePatterns_ca_FR', 'goog.i18n.DateTimePatterns_ca_IT', 'goog.i18n.DateTimePatterns_ce', 'goog.i18n.DateTimePatterns_ce_RU', 'goog.i18n.DateTimePatterns_cgg', 'goog.i18n.DateTimePatterns_cgg_UG', 'goog.i18n.DateTimePatterns_chr_US', 'goog.i18n.DateTimePatterns_ckb', 'goog.i18n.DateTimePatterns_ckb_IQ', 'goog.i18n.DateTimePatterns_ckb_IR', 'goog.i18n.DateTimePatterns_cs_CZ', 'goog.i18n.DateTimePatterns_cy_GB', 'goog.i18n.DateTimePatterns_da_DK', 'goog.i18n.DateTimePatterns_da_GL', 'goog.i18n.DateTimePatterns_dav', 'goog.i18n.DateTimePatterns_dav_KE', 'goog.i18n.DateTimePatterns_de_BE', 'goog.i18n.DateTimePatterns_de_DE', 'goog.i18n.DateTimePatterns_de_IT', 'goog.i18n.DateTimePatterns_de_LI', 'goog.i18n.DateTimePatterns_de_LU', 'goog.i18n.DateTimePatterns_dje', 'goog.i18n.DateTimePatterns_dje_NE', 'goog.i18n.DateTimePatterns_dsb', 'goog.i18n.DateTimePatterns_dsb_DE', 'goog.i18n.DateTimePatterns_dua', 'goog.i18n.DateTimePatterns_dua_CM', 'goog.i18n.DateTimePatterns_dyo', 'goog.i18n.DateTimePatterns_dyo_SN', 'goog.i18n.DateTimePatterns_dz', 'goog.i18n.DateTimePatterns_dz_BT', 'goog.i18n.DateTimePatterns_ebu', 'goog.i18n.DateTimePatterns_ebu_KE', 'goog.i18n.DateTimePatterns_ee', 'goog.i18n.DateTimePatterns_ee_GH', 'goog.i18n.DateTimePatterns_ee_TG', 'goog.i18n.DateTimePatterns_el_CY', 'goog.i18n.DateTimePatterns_el_GR', 'goog.i18n.DateTimePatterns_en_001', 'goog.i18n.DateTimePatterns_en_150', 'goog.i18n.DateTimePatterns_en_AG', 'goog.i18n.DateTimePatterns_en_AI', 'goog.i18n.DateTimePatterns_en_AS', 'goog.i18n.DateTimePatterns_en_AT', 'goog.i18n.DateTimePatterns_en_BB', 'goog.i18n.DateTimePatterns_en_BE', 'goog.i18n.DateTimePatterns_en_BI', 'goog.i18n.DateTimePatterns_en_BM', 'goog.i18n.DateTimePatterns_en_BS', 'goog.i18n.DateTimePatterns_en_BW', 'goog.i18n.DateTimePatterns_en_BZ', 'goog.i18n.DateTimePatterns_en_CC', 'goog.i18n.DateTimePatterns_en_CH', 'goog.i18n.DateTimePatterns_en_CK', 'goog.i18n.DateTimePatterns_en_CM', 'goog.i18n.DateTimePatterns_en_CX', 'goog.i18n.DateTimePatterns_en_CY', 'goog.i18n.DateTimePatterns_en_DE', 'goog.i18n.DateTimePatterns_en_DG', 'goog.i18n.DateTimePatterns_en_DK', 'goog.i18n.DateTimePatterns_en_DM', 'goog.i18n.DateTimePatterns_en_ER', 'goog.i18n.DateTimePatterns_en_FI', 'goog.i18n.DateTimePatterns_en_FJ', 'goog.i18n.DateTimePatterns_en_FK', 'goog.i18n.DateTimePatterns_en_FM', 'goog.i18n.DateTimePatterns_en_GD', 'goog.i18n.DateTimePatterns_en_GG', 'goog.i18n.DateTimePatterns_en_GH', 'goog.i18n.DateTimePatterns_en_GI', 'goog.i18n.DateTimePatterns_en_GM', 'goog.i18n.DateTimePatterns_en_GU', 'goog.i18n.DateTimePatterns_en_GY', 'goog.i18n.DateTimePatterns_en_HK', 'goog.i18n.DateTimePatterns_en_IL', 'goog.i18n.DateTimePatterns_en_IM', 'goog.i18n.DateTimePatterns_en_IO', 'goog.i18n.DateTimePatterns_en_JE', 'goog.i18n.DateTimePatterns_en_JM', 'goog.i18n.DateTimePatterns_en_KE', 'goog.i18n.DateTimePatterns_en_KI', 'goog.i18n.DateTimePatterns_en_KN', 'goog.i18n.DateTimePatterns_en_KY', 'goog.i18n.DateTimePatterns_en_LC', 'goog.i18n.DateTimePatterns_en_LR', 'goog.i18n.DateTimePatterns_en_LS', 'goog.i18n.DateTimePatterns_en_MG', 'goog.i18n.DateTimePatterns_en_MH', 'goog.i18n.DateTimePatterns_en_MO', 'goog.i18n.DateTimePatterns_en_MP', 'goog.i18n.DateTimePatterns_en_MS', 'goog.i18n.DateTimePatterns_en_MT', 'goog.i18n.DateTimePatterns_en_MU', 'goog.i18n.DateTimePatterns_en_MW', 'goog.i18n.DateTimePatterns_en_MY', 'goog.i18n.DateTimePatterns_en_NA', 'goog.i18n.DateTimePatterns_en_NF', 'goog.i18n.DateTimePatterns_en_NG', 'goog.i18n.DateTimePatterns_en_NL', 'goog.i18n.DateTimePatterns_en_NR', 'goog.i18n.DateTimePatterns_en_NU', 'goog.i18n.DateTimePatterns_en_NZ', 'goog.i18n.DateTimePatterns_en_PG', 'goog.i18n.DateTimePatterns_en_PH', 'goog.i18n.DateTimePatterns_en_PK', 'goog.i18n.DateTimePatterns_en_PN', 'goog.i18n.DateTimePatterns_en_PR', 'goog.i18n.DateTimePatterns_en_PW', 'goog.i18n.DateTimePatterns_en_RW', 'goog.i18n.DateTimePatterns_en_SB', 'goog.i18n.DateTimePatterns_en_SC', 'goog.i18n.DateTimePatterns_en_SD', 'goog.i18n.DateTimePatterns_en_SE', 'goog.i18n.DateTimePatterns_en_SH', 'goog.i18n.DateTimePatterns_en_SI', 'goog.i18n.DateTimePatterns_en_SL', 'goog.i18n.DateTimePatterns_en_SS', 'goog.i18n.DateTimePatterns_en_SX', 'goog.i18n.DateTimePatterns_en_SZ', 'goog.i18n.DateTimePatterns_en_TC', 'goog.i18n.DateTimePatterns_en_TK', 'goog.i18n.DateTimePatterns_en_TO', 'goog.i18n.DateTimePatterns_en_TT', 'goog.i18n.DateTimePatterns_en_TV', 'goog.i18n.DateTimePatterns_en_TZ', 'goog.i18n.DateTimePatterns_en_UG', 'goog.i18n.DateTimePatterns_en_UM', 'goog.i18n.DateTimePatterns_en_US_POSIX', 'goog.i18n.DateTimePatterns_en_VC', 'goog.i18n.DateTimePatterns_en_VG', 'goog.i18n.DateTimePatterns_en_VI', 'goog.i18n.DateTimePatterns_en_VU', 'goog.i18n.DateTimePatterns_en_WS', 'goog.i18n.DateTimePatterns_en_XA', 'goog.i18n.DateTimePatterns_en_ZM', 'goog.i18n.DateTimePatterns_en_ZW', 'goog.i18n.DateTimePatterns_eo', 'goog.i18n.DateTimePatterns_es_AR', 'goog.i18n.DateTimePatterns_es_BO', 'goog.i18n.DateTimePatterns_es_BR', 'goog.i18n.DateTimePatterns_es_BZ', 'goog.i18n.DateTimePatterns_es_CL', 'goog.i18n.DateTimePatterns_es_CO', 'goog.i18n.DateTimePatterns_es_CR', 'goog.i18n.DateTimePatterns_es_CU', 'goog.i18n.DateTimePatterns_es_DO', 'goog.i18n.DateTimePatterns_es_EA', 'goog.i18n.DateTimePatterns_es_EC', 'goog.i18n.DateTimePatterns_es_GQ', 'goog.i18n.DateTimePatterns_es_GT', 'goog.i18n.DateTimePatterns_es_HN', 'goog.i18n.DateTimePatterns_es_IC', 'goog.i18n.DateTimePatterns_es_NI', 'goog.i18n.DateTimePatterns_es_PA', 'goog.i18n.DateTimePatterns_es_PE', 'goog.i18n.DateTimePatterns_es_PH', 'goog.i18n.DateTimePatterns_es_PR', 'goog.i18n.DateTimePatterns_es_PY', 'goog.i18n.DateTimePatterns_es_SV', 'goog.i18n.DateTimePatterns_es_UY', 'goog.i18n.DateTimePatterns_es_VE', 'goog.i18n.DateTimePatterns_et_EE', 'goog.i18n.DateTimePatterns_eu_ES', 'goog.i18n.DateTimePatterns_ewo', 'goog.i18n.DateTimePatterns_ewo_CM', 'goog.i18n.DateTimePatterns_fa_AF', 'goog.i18n.DateTimePatterns_fa_IR', 'goog.i18n.DateTimePatterns_ff', 'goog.i18n.DateTimePatterns_ff_CM', 'goog.i18n.DateTimePatterns_ff_GN', 'goog.i18n.DateTimePatterns_ff_MR', 'goog.i18n.DateTimePatterns_ff_SN', 'goog.i18n.DateTimePatterns_fi_FI', 'goog.i18n.DateTimePatterns_fil_PH', 'goog.i18n.DateTimePatterns_fo', 'goog.i18n.DateTimePatterns_fo_DK', 'goog.i18n.DateTimePatterns_fo_FO', 'goog.i18n.DateTimePatterns_fr_BE', 'goog.i18n.DateTimePatterns_fr_BF', 'goog.i18n.DateTimePatterns_fr_BI', 'goog.i18n.DateTimePatterns_fr_BJ', 'goog.i18n.DateTimePatterns_fr_BL', 'goog.i18n.DateTimePatterns_fr_CD', 'goog.i18n.DateTimePatterns_fr_CF', 'goog.i18n.DateTimePatterns_fr_CG', 'goog.i18n.DateTimePatterns_fr_CH', 'goog.i18n.DateTimePatterns_fr_CI', 'goog.i18n.DateTimePatterns_fr_CM', 'goog.i18n.DateTimePatterns_fr_DJ', 'goog.i18n.DateTimePatterns_fr_DZ', 'goog.i18n.DateTimePatterns_fr_FR', 'goog.i18n.DateTimePatterns_fr_GA', 'goog.i18n.DateTimePatterns_fr_GF', 'goog.i18n.DateTimePatterns_fr_GN', 'goog.i18n.DateTimePatterns_fr_GP', 'goog.i18n.DateTimePatterns_fr_GQ', 'goog.i18n.DateTimePatterns_fr_HT', 'goog.i18n.DateTimePatterns_fr_KM', 'goog.i18n.DateTimePatterns_fr_LU', 'goog.i18n.DateTimePatterns_fr_MA', 'goog.i18n.DateTimePatterns_fr_MC', 'goog.i18n.DateTimePatterns_fr_MF', 'goog.i18n.DateTimePatterns_fr_MG', 'goog.i18n.DateTimePatterns_fr_ML', 'goog.i18n.DateTimePatterns_fr_MQ', 'goog.i18n.DateTimePatterns_fr_MR', 'goog.i18n.DateTimePatterns_fr_MU', 'goog.i18n.DateTimePatterns_fr_NC', 'goog.i18n.DateTimePatterns_fr_NE', 'goog.i18n.DateTimePatterns_fr_PF', 'goog.i18n.DateTimePatterns_fr_PM', 'goog.i18n.DateTimePatterns_fr_RE', 'goog.i18n.DateTimePatterns_fr_RW', 'goog.i18n.DateTimePatterns_fr_SC', 'goog.i18n.DateTimePatterns_fr_SN', 'goog.i18n.DateTimePatterns_fr_SY', 'goog.i18n.DateTimePatterns_fr_TD', 'goog.i18n.DateTimePatterns_fr_TG', 'goog.i18n.DateTimePatterns_fr_TN', 'goog.i18n.DateTimePatterns_fr_VU', 'goog.i18n.DateTimePatterns_fr_WF', 'goog.i18n.DateTimePatterns_fr_YT', 'goog.i18n.DateTimePatterns_fur', 'goog.i18n.DateTimePatterns_fur_IT', 'goog.i18n.DateTimePatterns_fy', 'goog.i18n.DateTimePatterns_fy_NL', 'goog.i18n.DateTimePatterns_ga_IE', 'goog.i18n.DateTimePatterns_gd', 'goog.i18n.DateTimePatterns_gd_GB', 'goog.i18n.DateTimePatterns_gl_ES', 'goog.i18n.DateTimePatterns_gsw_CH', 'goog.i18n.DateTimePatterns_gsw_FR', 'goog.i18n.DateTimePatterns_gsw_LI', 'goog.i18n.DateTimePatterns_gu_IN', 'goog.i18n.DateTimePatterns_guz', 'goog.i18n.DateTimePatterns_guz_KE', 'goog.i18n.DateTimePatterns_gv', 'goog.i18n.DateTimePatterns_gv_IM', 'goog.i18n.DateTimePatterns_ha', 'goog.i18n.DateTimePatterns_ha_GH', 'goog.i18n.DateTimePatterns_ha_NE', 'goog.i18n.DateTimePatterns_ha_NG', 'goog.i18n.DateTimePatterns_haw_US', 'goog.i18n.DateTimePatterns_he_IL', 'goog.i18n.DateTimePatterns_hi_IN', 'goog.i18n.DateTimePatterns_hr_BA', 'goog.i18n.DateTimePatterns_hr_HR', 'goog.i18n.DateTimePatterns_hsb', 'goog.i18n.DateTimePatterns_hsb_DE', 'goog.i18n.DateTimePatterns_hu_HU', 'goog.i18n.DateTimePatterns_hy_AM', 'goog.i18n.DateTimePatterns_id_ID', 'goog.i18n.DateTimePatterns_ig', 'goog.i18n.DateTimePatterns_ig_NG', 'goog.i18n.DateTimePatterns_ii', 'goog.i18n.DateTimePatterns_ii_CN', 'goog.i18n.DateTimePatterns_is_IS', 'goog.i18n.DateTimePatterns_it_CH', 'goog.i18n.DateTimePatterns_it_IT', 'goog.i18n.DateTimePatterns_it_SM', 'goog.i18n.DateTimePatterns_it_VA', 'goog.i18n.DateTimePatterns_ja_JP', 'goog.i18n.DateTimePatterns_jgo', 'goog.i18n.DateTimePatterns_jgo_CM', 'goog.i18n.DateTimePatterns_jmc', 'goog.i18n.DateTimePatterns_jmc_TZ', 'goog.i18n.DateTimePatterns_ka_GE', 'goog.i18n.DateTimePatterns_kab', 'goog.i18n.DateTimePatterns_kab_DZ', 'goog.i18n.DateTimePatterns_kam', 'goog.i18n.DateTimePatterns_kam_KE', 'goog.i18n.DateTimePatterns_kde', 'goog.i18n.DateTimePatterns_kde_TZ', 'goog.i18n.DateTimePatterns_kea', 'goog.i18n.DateTimePatterns_kea_CV', 'goog.i18n.DateTimePatterns_khq', 'goog.i18n.DateTimePatterns_khq_ML', 'goog.i18n.DateTimePatterns_ki', 'goog.i18n.DateTimePatterns_ki_KE', 'goog.i18n.DateTimePatterns_kk_KZ', 'goog.i18n.DateTimePatterns_kkj', 'goog.i18n.DateTimePatterns_kkj_CM', 'goog.i18n.DateTimePatterns_kl', 'goog.i18n.DateTimePatterns_kl_GL', 'goog.i18n.DateTimePatterns_kln', 'goog.i18n.DateTimePatterns_kln_KE', 'goog.i18n.DateTimePatterns_km_KH', 'goog.i18n.DateTimePatterns_kn_IN', 'goog.i18n.DateTimePatterns_ko_KP', 'goog.i18n.DateTimePatterns_ko_KR', 'goog.i18n.DateTimePatterns_kok', 'goog.i18n.DateTimePatterns_kok_IN', 'goog.i18n.DateTimePatterns_ks', 'goog.i18n.DateTimePatterns_ks_IN', 'goog.i18n.DateTimePatterns_ksb', 'goog.i18n.DateTimePatterns_ksb_TZ', 'goog.i18n.DateTimePatterns_ksf', 'goog.i18n.DateTimePatterns_ksf_CM', 'goog.i18n.DateTimePatterns_ksh', 'goog.i18n.DateTimePatterns_ksh_DE', 'goog.i18n.DateTimePatterns_kw', 'goog.i18n.DateTimePatterns_kw_GB', 'goog.i18n.DateTimePatterns_ky_KG', 'goog.i18n.DateTimePatterns_lag', 'goog.i18n.DateTimePatterns_lag_TZ', 'goog.i18n.DateTimePatterns_lb', 'goog.i18n.DateTimePatterns_lb_LU', 'goog.i18n.DateTimePatterns_lg', 'goog.i18n.DateTimePatterns_lg_UG', 'goog.i18n.DateTimePatterns_lkt', 'goog.i18n.DateTimePatterns_lkt_US', 'goog.i18n.DateTimePatterns_ln_AO', 'goog.i18n.DateTimePatterns_ln_CD', 'goog.i18n.DateTimePatterns_ln_CF', 'goog.i18n.DateTimePatterns_ln_CG', 'goog.i18n.DateTimePatterns_lo_LA', 'goog.i18n.DateTimePatterns_lrc', 'goog.i18n.DateTimePatterns_lrc_IQ', 'goog.i18n.DateTimePatterns_lrc_IR', 'goog.i18n.DateTimePatterns_lt_LT', 'goog.i18n.DateTimePatterns_lu', 'goog.i18n.DateTimePatterns_lu_CD', 'goog.i18n.DateTimePatterns_luo', 'goog.i18n.DateTimePatterns_luo_KE', 'goog.i18n.DateTimePatterns_luy', 'goog.i18n.DateTimePatterns_luy_KE', 'goog.i18n.DateTimePatterns_lv_LV', 'goog.i18n.DateTimePatterns_mas', 'goog.i18n.DateTimePatterns_mas_KE', 'goog.i18n.DateTimePatterns_mas_TZ', 'goog.i18n.DateTimePatterns_mer', 'goog.i18n.DateTimePatterns_mer_KE', 'goog.i18n.DateTimePatterns_mfe', 'goog.i18n.DateTimePatterns_mfe_MU', 'goog.i18n.DateTimePatterns_mg', 'goog.i18n.DateTimePatterns_mg_MG', 'goog.i18n.DateTimePatterns_mgh', 'goog.i18n.DateTimePatterns_mgh_MZ', 'goog.i18n.DateTimePatterns_mgo', 'goog.i18n.DateTimePatterns_mgo_CM', 'goog.i18n.DateTimePatterns_mk_MK', 'goog.i18n.DateTimePatterns_ml_IN', 'goog.i18n.DateTimePatterns_mn_MN', 'goog.i18n.DateTimePatterns_mr_IN', 'goog.i18n.DateTimePatterns_ms_BN', 'goog.i18n.DateTimePatterns_ms_MY', 'goog.i18n.DateTimePatterns_ms_SG', 'goog.i18n.DateTimePatterns_mt_MT', 'goog.i18n.DateTimePatterns_mua', 'goog.i18n.DateTimePatterns_mua_CM', 'goog.i18n.DateTimePatterns_my_MM', 'goog.i18n.DateTimePatterns_mzn', 'goog.i18n.DateTimePatterns_mzn_IR', 'goog.i18n.DateTimePatterns_naq', 'goog.i18n.DateTimePatterns_naq_NA', 'goog.i18n.DateTimePatterns_nb_NO', 'goog.i18n.DateTimePatterns_nb_SJ', 'goog.i18n.DateTimePatterns_nd', 'goog.i18n.DateTimePatterns_nd_ZW', 'goog.i18n.DateTimePatterns_nds', 'goog.i18n.DateTimePatterns_nds_DE', 'goog.i18n.DateTimePatterns_nds_NL', 'goog.i18n.DateTimePatterns_ne_IN', 'goog.i18n.DateTimePatterns_ne_NP', 'goog.i18n.DateTimePatterns_nl_AW', 'goog.i18n.DateTimePatterns_nl_BE', 'goog.i18n.DateTimePatterns_nl_BQ', 'goog.i18n.DateTimePatterns_nl_CW', 'goog.i18n.DateTimePatterns_nl_NL', 'goog.i18n.DateTimePatterns_nl_SR', 'goog.i18n.DateTimePatterns_nl_SX', 'goog.i18n.DateTimePatterns_nmg', 'goog.i18n.DateTimePatterns_nmg_CM', 'goog.i18n.DateTimePatterns_nn', 'goog.i18n.DateTimePatterns_nn_NO', 'goog.i18n.DateTimePatterns_nnh', 'goog.i18n.DateTimePatterns_nnh_CM', 'goog.i18n.DateTimePatterns_nus', 'goog.i18n.DateTimePatterns_nus_SS', 'goog.i18n.DateTimePatterns_nyn', 'goog.i18n.DateTimePatterns_nyn_UG', 'goog.i18n.DateTimePatterns_om', 'goog.i18n.DateTimePatterns_om_ET', 'goog.i18n.DateTimePatterns_om_KE', 'goog.i18n.DateTimePatterns_or_IN', 'goog.i18n.DateTimePatterns_os', 'goog.i18n.DateTimePatterns_os_GE', 'goog.i18n.DateTimePatterns_os_RU', 'goog.i18n.DateTimePatterns_pa_Arab', 'goog.i18n.DateTimePatterns_pa_Arab_PK', 'goog.i18n.DateTimePatterns_pa_Guru', 'goog.i18n.DateTimePatterns_pa_Guru_IN', 'goog.i18n.DateTimePatterns_pl_PL', 'goog.i18n.DateTimePatterns_ps', 'goog.i18n.DateTimePatterns_ps_AF', 'goog.i18n.DateTimePatterns_pt_AO', 'goog.i18n.DateTimePatterns_pt_CH', 'goog.i18n.DateTimePatterns_pt_CV', 'goog.i18n.DateTimePatterns_pt_GQ', 'goog.i18n.DateTimePatterns_pt_GW', 'goog.i18n.DateTimePatterns_pt_LU', 'goog.i18n.DateTimePatterns_pt_MO', 'goog.i18n.DateTimePatterns_pt_MZ', 'goog.i18n.DateTimePatterns_pt_ST', 'goog.i18n.DateTimePatterns_pt_TL', 'goog.i18n.DateTimePatterns_qu', 'goog.i18n.DateTimePatterns_qu_BO', 'goog.i18n.DateTimePatterns_qu_EC', 'goog.i18n.DateTimePatterns_qu_PE', 'goog.i18n.DateTimePatterns_rm', 'goog.i18n.DateTimePatterns_rm_CH', 'goog.i18n.DateTimePatterns_rn', 'goog.i18n.DateTimePatterns_rn_BI', 'goog.i18n.DateTimePatterns_ro_MD', 'goog.i18n.DateTimePatterns_ro_RO', 'goog.i18n.DateTimePatterns_rof', 'goog.i18n.DateTimePatterns_rof_TZ', 'goog.i18n.DateTimePatterns_ru_BY', 'goog.i18n.DateTimePatterns_ru_KG', 'goog.i18n.DateTimePatterns_ru_KZ', 'goog.i18n.DateTimePatterns_ru_MD', 'goog.i18n.DateTimePatterns_ru_RU', 'goog.i18n.DateTimePatterns_ru_UA', 'goog.i18n.DateTimePatterns_rw', 'goog.i18n.DateTimePatterns_rw_RW', 'goog.i18n.DateTimePatterns_rwk', 'goog.i18n.DateTimePatterns_rwk_TZ', 'goog.i18n.DateTimePatterns_sah', 'goog.i18n.DateTimePatterns_sah_RU', 'goog.i18n.DateTimePatterns_saq', 'goog.i18n.DateTimePatterns_saq_KE', 'goog.i18n.DateTimePatterns_sbp', 'goog.i18n.DateTimePatterns_sbp_TZ', 'goog.i18n.DateTimePatterns_se', 'goog.i18n.DateTimePatterns_se_FI', 'goog.i18n.DateTimePatterns_se_NO', 'goog.i18n.DateTimePatterns_se_SE', 'goog.i18n.DateTimePatterns_seh', 'goog.i18n.DateTimePatterns_seh_MZ', 'goog.i18n.DateTimePatterns_ses', 'goog.i18n.DateTimePatterns_ses_ML', 'goog.i18n.DateTimePatterns_sg', 'goog.i18n.DateTimePatterns_sg_CF', 'goog.i18n.DateTimePatterns_shi', 'goog.i18n.DateTimePatterns_shi_Latn', 'goog.i18n.DateTimePatterns_shi_Latn_MA', 'goog.i18n.DateTimePatterns_shi_Tfng', 'goog.i18n.DateTimePatterns_shi_Tfng_MA', 'goog.i18n.DateTimePatterns_si_LK', 'goog.i18n.DateTimePatterns_sk_SK', 'goog.i18n.DateTimePatterns_sl_SI', 'goog.i18n.DateTimePatterns_smn', 'goog.i18n.DateTimePatterns_smn_FI', 'goog.i18n.DateTimePatterns_sn', 'goog.i18n.DateTimePatterns_sn_ZW', 'goog.i18n.DateTimePatterns_so', 'goog.i18n.DateTimePatterns_so_DJ', 'goog.i18n.DateTimePatterns_so_ET', 'goog.i18n.DateTimePatterns_so_KE', 'goog.i18n.DateTimePatterns_so_SO', 'goog.i18n.DateTimePatterns_sq_AL', 'goog.i18n.DateTimePatterns_sq_MK', 'goog.i18n.DateTimePatterns_sq_XK', 'goog.i18n.DateTimePatterns_sr_Cyrl', 'goog.i18n.DateTimePatterns_sr_Cyrl_BA', 'goog.i18n.DateTimePatterns_sr_Cyrl_ME', 'goog.i18n.DateTimePatterns_sr_Cyrl_RS', 'goog.i18n.DateTimePatterns_sr_Cyrl_XK', 'goog.i18n.DateTimePatterns_sr_Latn_BA', 'goog.i18n.DateTimePatterns_sr_Latn_ME', 'goog.i18n.DateTimePatterns_sr_Latn_RS', 'goog.i18n.DateTimePatterns_sr_Latn_XK', 'goog.i18n.DateTimePatterns_sv_AX', 'goog.i18n.DateTimePatterns_sv_FI', 'goog.i18n.DateTimePatterns_sv_SE', 'goog.i18n.DateTimePatterns_sw_CD', 'goog.i18n.DateTimePatterns_sw_KE', 'goog.i18n.DateTimePatterns_sw_TZ', 'goog.i18n.DateTimePatterns_sw_UG', 'goog.i18n.DateTimePatterns_ta_IN', 'goog.i18n.DateTimePatterns_ta_LK', 'goog.i18n.DateTimePatterns_ta_MY', 'goog.i18n.DateTimePatterns_ta_SG', 'goog.i18n.DateTimePatterns_te_IN', 'goog.i18n.DateTimePatterns_teo', 'goog.i18n.DateTimePatterns_teo_KE', 'goog.i18n.DateTimePatterns_teo_UG', 'goog.i18n.DateTimePatterns_th_TH', 'goog.i18n.DateTimePatterns_ti', 'goog.i18n.DateTimePatterns_ti_ER', 'goog.i18n.DateTimePatterns_ti_ET', 'goog.i18n.DateTimePatterns_to', 'goog.i18n.DateTimePatterns_to_TO', 'goog.i18n.DateTimePatterns_tr_CY', 'goog.i18n.DateTimePatterns_tr_TR', 'goog.i18n.DateTimePatterns_twq', 'goog.i18n.DateTimePatterns_twq_NE', 'goog.i18n.DateTimePatterns_tzm', 'goog.i18n.DateTimePatterns_tzm_MA', 'goog.i18n.DateTimePatterns_ug', 'goog.i18n.DateTimePatterns_ug_CN', 'goog.i18n.DateTimePatterns_uk_UA', 'goog.i18n.DateTimePatterns_ur_IN', 'goog.i18n.DateTimePatterns_ur_PK', 'goog.i18n.DateTimePatterns_uz_Arab', 'goog.i18n.DateTimePatterns_uz_Arab_AF', 'goog.i18n.DateTimePatterns_uz_Cyrl', 'goog.i18n.DateTimePatterns_uz_Cyrl_UZ', 'goog.i18n.DateTimePatterns_uz_Latn', 'goog.i18n.DateTimePatterns_uz_Latn_UZ', 'goog.i18n.DateTimePatterns_vai', 'goog.i18n.DateTimePatterns_vai_Latn', 'goog.i18n.DateTimePatterns_vai_Latn_LR', 'goog.i18n.DateTimePatterns_vai_Vaii', 'goog.i18n.DateTimePatterns_vai_Vaii_LR', 'goog.i18n.DateTimePatterns_vi_VN', 'goog.i18n.DateTimePatterns_vun', 'goog.i18n.DateTimePatterns_vun_TZ', 'goog.i18n.DateTimePatterns_wae', 'goog.i18n.DateTimePatterns_wae_CH', 'goog.i18n.DateTimePatterns_xog', 'goog.i18n.DateTimePatterns_xog_UG', 'goog.i18n.DateTimePatterns_yav', 'goog.i18n.DateTimePatterns_yav_CM', 'goog.i18n.DateTimePatterns_yi', 'goog.i18n.DateTimePatterns_yi_001', 'goog.i18n.DateTimePatterns_yo', 'goog.i18n.DateTimePatterns_yo_BJ', 'goog.i18n.DateTimePatterns_yo_NG', 'goog.i18n.DateTimePatterns_yue', 'goog.i18n.DateTimePatterns_yue_HK', 'goog.i18n.DateTimePatterns_zgh', 'goog.i18n.DateTimePatterns_zgh_MA', 'goog.i18n.DateTimePatterns_zh_Hans', 'goog.i18n.DateTimePatterns_zh_Hans_CN', 'goog.i18n.DateTimePatterns_zh_Hans_HK', 'goog.i18n.DateTimePatterns_zh_Hans_MO', 'goog.i18n.DateTimePatterns_zh_Hans_SG', 'goog.i18n.DateTimePatterns_zh_Hant', 'goog.i18n.DateTimePatterns_zh_Hant_HK', 'goog.i18n.DateTimePatterns_zh_Hant_MO', 'goog.i18n.DateTimePatterns_zh_Hant_TW', 'goog.i18n.DateTimePatterns_zu_ZA'], ['goog.i18n.DateTimePatterns'], {});
+goog.addDependency('i18n/datetimesymbols.js', ['goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbolsType', 'goog.i18n.DateTimeSymbols_af', 'goog.i18n.DateTimeSymbols_am', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_ar_DZ', 'goog.i18n.DateTimeSymbols_az', 'goog.i18n.DateTimeSymbols_be', 'goog.i18n.DateTimeSymbols_bg', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_br', 'goog.i18n.DateTimeSymbols_bs', 'goog.i18n.DateTimeSymbols_ca', 'goog.i18n.DateTimeSymbols_chr', 'goog.i18n.DateTimeSymbols_cs', 'goog.i18n.DateTimeSymbols_cy', 'goog.i18n.DateTimeSymbols_da', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_de_AT', 'goog.i18n.DateTimeSymbols_de_CH', 'goog.i18n.DateTimeSymbols_el', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_AU', 'goog.i18n.DateTimeSymbols_en_CA', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_ISO', 'goog.i18n.DateTimeSymbols_en_SG', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_en_ZA', 'goog.i18n.DateTimeSymbols_es', 'goog.i18n.DateTimeSymbols_es_419', 'goog.i18n.DateTimeSymbols_es_ES', 'goog.i18n.DateTimeSymbols_es_MX', 'goog.i18n.DateTimeSymbols_es_US', 'goog.i18n.DateTimeSymbols_et', 'goog.i18n.DateTimeSymbols_eu', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fi', 'goog.i18n.DateTimeSymbols_fil', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_ga', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_gsw', 'goog.i18n.DateTimeSymbols_gu', 'goog.i18n.DateTimeSymbols_haw', 'goog.i18n.DateTimeSymbols_he', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_hr', 'goog.i18n.DateTimeSymbols_hu', 'goog.i18n.DateTimeSymbols_hy', 'goog.i18n.DateTimeSymbols_id', 'goog.i18n.DateTimeSymbols_in', 'goog.i18n.DateTimeSymbols_is', 'goog.i18n.DateTimeSymbols_it', 'goog.i18n.DateTimeSymbols_iw', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_ka', 'goog.i18n.DateTimeSymbols_kk', 'goog.i18n.DateTimeSymbols_km', 'goog.i18n.DateTimeSymbols_kn', 'goog.i18n.DateTimeSymbols_ko', 'goog.i18n.DateTimeSymbols_ky', 'goog.i18n.DateTimeSymbols_ln', 'goog.i18n.DateTimeSymbols_lo', 'goog.i18n.DateTimeSymbols_lt', 'goog.i18n.DateTimeSymbols_lv', 'goog.i18n.DateTimeSymbols_mk', 'goog.i18n.DateTimeSymbols_ml', 'goog.i18n.DateTimeSymbols_mn', 'goog.i18n.DateTimeSymbols_mo', 'goog.i18n.DateTimeSymbols_mr', 'goog.i18n.DateTimeSymbols_ms', 'goog.i18n.DateTimeSymbols_mt', 'goog.i18n.DateTimeSymbols_my', 'goog.i18n.DateTimeSymbols_nb', 'goog.i18n.DateTimeSymbols_ne', 'goog.i18n.DateTimeSymbols_nl', 'goog.i18n.DateTimeSymbols_no', 'goog.i18n.DateTimeSymbols_no_NO', 'goog.i18n.DateTimeSymbols_or', 'goog.i18n.DateTimeSymbols_pa', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_pt', 'goog.i18n.DateTimeSymbols_pt_BR', 'goog.i18n.DateTimeSymbols_pt_PT', 'goog.i18n.DateTimeSymbols_ro', 'goog.i18n.DateTimeSymbols_ru', 'goog.i18n.DateTimeSymbols_sh', 'goog.i18n.DateTimeSymbols_si', 'goog.i18n.DateTimeSymbols_sk', 'goog.i18n.DateTimeSymbols_sl', 'goog.i18n.DateTimeSymbols_sq', 'goog.i18n.DateTimeSymbols_sr', 'goog.i18n.DateTimeSymbols_sr_Latn', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.DateTimeSymbols_sw', 'goog.i18n.DateTimeSymbols_ta', 'goog.i18n.DateTimeSymbols_te', 'goog.i18n.DateTimeSymbols_th', 'goog.i18n.DateTimeSymbols_tl', 'goog.i18n.DateTimeSymbols_tr', 'goog.i18n.DateTimeSymbols_uk', 'goog.i18n.DateTimeSymbols_ur', 'goog.i18n.DateTimeSymbols_uz', 'goog.i18n.DateTimeSymbols_vi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.DateTimeSymbols_zh_CN', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.i18n.DateTimeSymbols_zh_TW', 'goog.i18n.DateTimeSymbols_zu'], [], {});
+goog.addDependency('i18n/datetimesymbolsext.js', ['goog.i18n.DateTimeSymbolsExt', 'goog.i18n.DateTimeSymbols_af_NA', 'goog.i18n.DateTimeSymbols_af_ZA', 'goog.i18n.DateTimeSymbols_agq', 'goog.i18n.DateTimeSymbols_agq_CM', 'goog.i18n.DateTimeSymbols_ak', 'goog.i18n.DateTimeSymbols_ak_GH', 'goog.i18n.DateTimeSymbols_am_ET', 'goog.i18n.DateTimeSymbols_ar_001', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_BH', 'goog.i18n.DateTimeSymbols_ar_DJ', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_ar_EH', 'goog.i18n.DateTimeSymbols_ar_ER', 'goog.i18n.DateTimeSymbols_ar_IL', 'goog.i18n.DateTimeSymbols_ar_IQ', 'goog.i18n.DateTimeSymbols_ar_JO', 'goog.i18n.DateTimeSymbols_ar_KM', 'goog.i18n.DateTimeSymbols_ar_KW', 'goog.i18n.DateTimeSymbols_ar_LB', 'goog.i18n.DateTimeSymbols_ar_LY', 'goog.i18n.DateTimeSymbols_ar_MA', 'goog.i18n.DateTimeSymbols_ar_MR', 'goog.i18n.DateTimeSymbols_ar_OM', 'goog.i18n.DateTimeSymbols_ar_PS', 'goog.i18n.DateTimeSymbols_ar_QA', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_ar_SD', 'goog.i18n.DateTimeSymbols_ar_SO', 'goog.i18n.DateTimeSymbols_ar_SS', 'goog.i18n.DateTimeSymbols_ar_SY', 'goog.i18n.DateTimeSymbols_ar_TD', 'goog.i18n.DateTimeSymbols_ar_TN', 'goog.i18n.DateTimeSymbols_ar_XB', 'goog.i18n.DateTimeSymbols_ar_YE', 'goog.i18n.DateTimeSymbols_as', 'goog.i18n.DateTimeSymbols_as_IN', 'goog.i18n.DateTimeSymbols_asa', 'goog.i18n.DateTimeSymbols_asa_TZ', 'goog.i18n.DateTimeSymbols_ast', 'goog.i18n.DateTimeSymbols_ast_ES', 'goog.i18n.DateTimeSymbols_az_Cyrl', 'goog.i18n.DateTimeSymbols_az_Cyrl_AZ', 'goog.i18n.DateTimeSymbols_az_Latn', 'goog.i18n.DateTimeSymbols_az_Latn_AZ', 'goog.i18n.DateTimeSymbols_bas', 'goog.i18n.DateTimeSymbols_bas_CM', 'goog.i18n.DateTimeSymbols_be_BY', 'goog.i18n.DateTimeSymbols_bem', 'goog.i18n.DateTimeSymbols_bem_ZM', 'goog.i18n.DateTimeSymbols_bez', 'goog.i18n.DateTimeSymbols_bez_TZ', 'goog.i18n.DateTimeSymbols_bg_BG', 'goog.i18n.DateTimeSymbols_bm', 'goog.i18n.DateTimeSymbols_bm_ML', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_bn_IN', 'goog.i18n.DateTimeSymbols_bo', 'goog.i18n.DateTimeSymbols_bo_CN', 'goog.i18n.DateTimeSymbols_bo_IN', 'goog.i18n.DateTimeSymbols_br_FR', 'goog.i18n.DateTimeSymbols_brx', 'goog.i18n.DateTimeSymbols_brx_IN', 'goog.i18n.DateTimeSymbols_bs_Cyrl', 'goog.i18n.DateTimeSymbols_bs_Cyrl_BA', 'goog.i18n.DateTimeSymbols_bs_Latn', 'goog.i18n.DateTimeSymbols_bs_Latn_BA', 'goog.i18n.DateTimeSymbols_ca_AD', 'goog.i18n.DateTimeSymbols_ca_ES', 'goog.i18n.DateTimeSymbols_ca_FR', 'goog.i18n.DateTimeSymbols_ca_IT', 'goog.i18n.DateTimeSymbols_ce', 'goog.i18n.DateTimeSymbols_ce_RU', 'goog.i18n.DateTimeSymbols_cgg', 'goog.i18n.DateTimeSymbols_cgg_UG', 'goog.i18n.DateTimeSymbols_chr_US', 'goog.i18n.DateTimeSymbols_ckb', 'goog.i18n.DateTimeSymbols_ckb_IQ', 'goog.i18n.DateTimeSymbols_ckb_IR', 'goog.i18n.DateTimeSymbols_cs_CZ', 'goog.i18n.DateTimeSymbols_cy_GB', 'goog.i18n.DateTimeSymbols_da_DK', 'goog.i18n.DateTimeSymbols_da_GL', 'goog.i18n.DateTimeSymbols_dav', 'goog.i18n.DateTimeSymbols_dav_KE', 'goog.i18n.DateTimeSymbols_de_BE', 'goog.i18n.DateTimeSymbols_de_DE', 'goog.i18n.DateTimeSymbols_de_IT', 'goog.i18n.DateTimeSymbols_de_LI', 'goog.i18n.DateTimeSymbols_de_LU', 'goog.i18n.DateTimeSymbols_dje', 'goog.i18n.DateTimeSymbols_dje_NE', 'goog.i18n.DateTimeSymbols_dsb', 'goog.i18n.DateTimeSymbols_dsb_DE', 'goog.i18n.DateTimeSymbols_dua', 'goog.i18n.DateTimeSymbols_dua_CM', 'goog.i18n.DateTimeSymbols_dyo', 'goog.i18n.DateTimeSymbols_dyo_SN', 'goog.i18n.DateTimeSymbols_dz', 'goog.i18n.DateTimeSymbols_dz_BT', 'goog.i18n.DateTimeSymbols_ebu', 'goog.i18n.DateTimeSymbols_ebu_KE', 'goog.i18n.DateTimeSymbols_ee', 'goog.i18n.DateTimeSymbols_ee_GH', 'goog.i18n.DateTimeSymbols_ee_TG', 'goog.i18n.DateTimeSymbols_el_CY', 'goog.i18n.DateTimeSymbols_el_GR', 'goog.i18n.DateTimeSymbols_en_001', 'goog.i18n.DateTimeSymbols_en_150', 'goog.i18n.DateTimeSymbols_en_AG', 'goog.i18n.DateTimeSymbols_en_AI', 'goog.i18n.DateTimeSymbols_en_AS', 'goog.i18n.DateTimeSymbols_en_AT', 'goog.i18n.DateTimeSymbols_en_BB', 'goog.i18n.DateTimeSymbols_en_BE', 'goog.i18n.DateTimeSymbols_en_BI', 'goog.i18n.DateTimeSymbols_en_BM', 'goog.i18n.DateTimeSymbols_en_BS', 'goog.i18n.DateTimeSymbols_en_BW', 'goog.i18n.DateTimeSymbols_en_BZ', 'goog.i18n.DateTimeSymbols_en_CC', 'goog.i18n.DateTimeSymbols_en_CH', 'goog.i18n.DateTimeSymbols_en_CK', 'goog.i18n.DateTimeSymbols_en_CM', 'goog.i18n.DateTimeSymbols_en_CX', 'goog.i18n.DateTimeSymbols_en_CY', 'goog.i18n.DateTimeSymbols_en_DE', 'goog.i18n.DateTimeSymbols_en_DG', 'goog.i18n.DateTimeSymbols_en_DK', 'goog.i18n.DateTimeSymbols_en_DM', 'goog.i18n.DateTimeSymbols_en_ER', 'goog.i18n.DateTimeSymbols_en_FI', 'goog.i18n.DateTimeSymbols_en_FJ', 'goog.i18n.DateTimeSymbols_en_FK', 'goog.i18n.DateTimeSymbols_en_FM', 'goog.i18n.DateTimeSymbols_en_GD', 'goog.i18n.DateTimeSymbols_en_GG', 'goog.i18n.DateTimeSymbols_en_GH', 'goog.i18n.DateTimeSymbols_en_GI', 'goog.i18n.DateTimeSymbols_en_GM', 'goog.i18n.DateTimeSymbols_en_GU', 'goog.i18n.DateTimeSymbols_en_GY', 'goog.i18n.DateTimeSymbols_en_HK', 'goog.i18n.DateTimeSymbols_en_IL', 'goog.i18n.DateTimeSymbols_en_IM', 'goog.i18n.DateTimeSymbols_en_IO', 'goog.i18n.DateTimeSymbols_en_JE', 'goog.i18n.DateTimeSymbols_en_JM', 'goog.i18n.DateTimeSymbols_en_KE', 'goog.i18n.DateTimeSymbols_en_KI', 'goog.i18n.DateTimeSymbols_en_KN', 'goog.i18n.DateTimeSymbols_en_KY', 'goog.i18n.DateTimeSymbols_en_LC', 'goog.i18n.DateTimeSymbols_en_LR', 'goog.i18n.DateTimeSymbols_en_LS', 'goog.i18n.DateTimeSymbols_en_MG', 'goog.i18n.DateTimeSymbols_en_MH', 'goog.i18n.DateTimeSymbols_en_MO', 'goog.i18n.DateTimeSymbols_en_MP', 'goog.i18n.DateTimeSymbols_en_MS', 'goog.i18n.DateTimeSymbols_en_MT', 'goog.i18n.DateTimeSymbols_en_MU', 'goog.i18n.DateTimeSymbols_en_MW', 'goog.i18n.DateTimeSymbols_en_MY', 'goog.i18n.DateTimeSymbols_en_NA', 'goog.i18n.DateTimeSymbols_en_NF', 'goog.i18n.DateTimeSymbols_en_NG', 'goog.i18n.DateTimeSymbols_en_NL', 'goog.i18n.DateTimeSymbols_en_NR', 'goog.i18n.DateTimeSymbols_en_NU', 'goog.i18n.DateTimeSymbols_en_NZ', 'goog.i18n.DateTimeSymbols_en_PG', 'goog.i18n.DateTimeSymbols_en_PH', 'goog.i18n.DateTimeSymbols_en_PK', 'goog.i18n.DateTimeSymbols_en_PN', 'goog.i18n.DateTimeSymbols_en_PR', 'goog.i18n.DateTimeSymbols_en_PW', 'goog.i18n.DateTimeSymbols_en_RW', 'goog.i18n.DateTimeSymbols_en_SB', 'goog.i18n.DateTimeSymbols_en_SC', 'goog.i18n.DateTimeSymbols_en_SD', 'goog.i18n.DateTimeSymbols_en_SE', 'goog.i18n.DateTimeSymbols_en_SH', 'goog.i18n.DateTimeSymbols_en_SI', 'goog.i18n.DateTimeSymbols_en_SL', 'goog.i18n.DateTimeSymbols_en_SS', 'goog.i18n.DateTimeSymbols_en_SX', 'goog.i18n.DateTimeSymbols_en_SZ', 'goog.i18n.DateTimeSymbols_en_TC', 'goog.i18n.DateTimeSymbols_en_TK', 'goog.i18n.DateTimeSymbols_en_TO', 'goog.i18n.DateTimeSymbols_en_TT', 'goog.i18n.DateTimeSymbols_en_TV', 'goog.i18n.DateTimeSymbols_en_TZ', 'goog.i18n.DateTimeSymbols_en_UG', 'goog.i18n.DateTimeSymbols_en_UM', 'goog.i18n.DateTimeSymbols_en_US_POSIX', 'goog.i18n.DateTimeSymbols_en_VC', 'goog.i18n.DateTimeSymbols_en_VG', 'goog.i18n.DateTimeSymbols_en_VI', 'goog.i18n.DateTimeSymbols_en_VU', 'goog.i18n.DateTimeSymbols_en_WS', 'goog.i18n.DateTimeSymbols_en_XA', 'goog.i18n.DateTimeSymbols_en_ZM', 'goog.i18n.DateTimeSymbols_en_ZW', 'goog.i18n.DateTimeSymbols_eo', 'goog.i18n.DateTimeSymbols_es_AR', 'goog.i18n.DateTimeSymbols_es_BO', 'goog.i18n.DateTimeSymbols_es_BR', 'goog.i18n.DateTimeSymbols_es_BZ', 'goog.i18n.DateTimeSymbols_es_CL', 'goog.i18n.DateTimeSymbols_es_CO', 'goog.i18n.DateTimeSymbols_es_CR', 'goog.i18n.DateTimeSymbols_es_CU', 'goog.i18n.DateTimeSymbols_es_DO', 'goog.i18n.DateTimeSymbols_es_EA', 'goog.i18n.DateTimeSymbols_es_EC', 'goog.i18n.DateTimeSymbols_es_GQ', 'goog.i18n.DateTimeSymbols_es_GT', 'goog.i18n.DateTimeSymbols_es_HN', 'goog.i18n.DateTimeSymbols_es_IC', 'goog.i18n.DateTimeSymbols_es_NI', 'goog.i18n.DateTimeSymbols_es_PA', 'goog.i18n.DateTimeSymbols_es_PE', 'goog.i18n.DateTimeSymbols_es_PH', 'goog.i18n.DateTimeSymbols_es_PR', 'goog.i18n.DateTimeSymbols_es_PY', 'goog.i18n.DateTimeSymbols_es_SV', 'goog.i18n.DateTimeSymbols_es_UY', 'goog.i18n.DateTimeSymbols_es_VE', 'goog.i18n.DateTimeSymbols_et_EE', 'goog.i18n.DateTimeSymbols_eu_ES', 'goog.i18n.DateTimeSymbols_ewo', 'goog.i18n.DateTimeSymbols_ewo_CM', 'goog.i18n.DateTimeSymbols_fa_AF', 'goog.i18n.DateTimeSymbols_fa_IR', 'goog.i18n.DateTimeSymbols_ff', 'goog.i18n.DateTimeSymbols_ff_CM', 'goog.i18n.DateTimeSymbols_ff_GN', 'goog.i18n.DateTimeSymbols_ff_MR', 'goog.i18n.DateTimeSymbols_ff_SN', 'goog.i18n.DateTimeSymbols_fi_FI', 'goog.i18n.DateTimeSymbols_fil_PH', 'goog.i18n.DateTimeSymbols_fo', 'goog.i18n.DateTimeSymbols_fo_DK', 'goog.i18n.DateTimeSymbols_fo_FO', 'goog.i18n.DateTimeSymbols_fr_BE', 'goog.i18n.DateTimeSymbols_fr_BF', 'goog.i18n.DateTimeSymbols_fr_BI', 'goog.i18n.DateTimeSymbols_fr_BJ', 'goog.i18n.DateTimeSymbols_fr_BL', 'goog.i18n.DateTimeSymbols_fr_CD', 'goog.i18n.DateTimeSymbols_fr_CF', 'goog.i18n.DateTimeSymbols_fr_CG', 'goog.i18n.DateTimeSymbols_fr_CH', 'goog.i18n.DateTimeSymbols_fr_CI', 'goog.i18n.DateTimeSymbols_fr_CM', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_fr_DZ', 'goog.i18n.DateTimeSymbols_fr_FR', 'goog.i18n.DateTimeSymbols_fr_GA', 'goog.i18n.DateTimeSymbols_fr_GF', 'goog.i18n.DateTimeSymbols_fr_GN', 'goog.i18n.DateTimeSymbols_fr_GP', 'goog.i18n.DateTimeSymbols_fr_GQ', 'goog.i18n.DateTimeSymbols_fr_HT', 'goog.i18n.DateTimeSymbols_fr_KM', 'goog.i18n.DateTimeSymbols_fr_LU', 'goog.i18n.DateTimeSymbols_fr_MA', 'goog.i18n.DateTimeSymbols_fr_MC', 'goog.i18n.DateTimeSymbols_fr_MF', 'goog.i18n.DateTimeSymbols_fr_MG', 'goog.i18n.DateTimeSymbols_fr_ML', 'goog.i18n.DateTimeSymbols_fr_MQ', 'goog.i18n.DateTimeSymbols_fr_MR', 'goog.i18n.DateTimeSymbols_fr_MU', 'goog.i18n.DateTimeSymbols_fr_NC', 'goog.i18n.DateTimeSymbols_fr_NE', 'goog.i18n.DateTimeSymbols_fr_PF', 'goog.i18n.DateTimeSymbols_fr_PM', 'goog.i18n.DateTimeSymbols_fr_RE', 'goog.i18n.DateTimeSymbols_fr_RW', 'goog.i18n.DateTimeSymbols_fr_SC', 'goog.i18n.DateTimeSymbols_fr_SN', 'goog.i18n.DateTimeSymbols_fr_SY', 'goog.i18n.DateTimeSymbols_fr_TD', 'goog.i18n.DateTimeSymbols_fr_TG', 'goog.i18n.DateTimeSymbols_fr_TN', 'goog.i18n.DateTimeSymbols_fr_VU', 'goog.i18n.DateTimeSymbols_fr_WF', 'goog.i18n.DateTimeSymbols_fr_YT', 'goog.i18n.DateTimeSymbols_fur', 'goog.i18n.DateTimeSymbols_fur_IT', 'goog.i18n.DateTimeSymbols_fy', 'goog.i18n.DateTimeSymbols_fy_NL', 'goog.i18n.DateTimeSymbols_ga_IE', 'goog.i18n.DateTimeSymbols_gd', 'goog.i18n.DateTimeSymbols_gd_GB', 'goog.i18n.DateTimeSymbols_gl_ES', 'goog.i18n.DateTimeSymbols_gsw_CH', 'goog.i18n.DateTimeSymbols_gsw_FR', 'goog.i18n.DateTimeSymbols_gsw_LI', 'goog.i18n.DateTimeSymbols_gu_IN', 'goog.i18n.DateTimeSymbols_guz', 'goog.i18n.DateTimeSymbols_guz_KE', 'goog.i18n.DateTimeSymbols_gv', 'goog.i18n.DateTimeSymbols_gv_IM', 'goog.i18n.DateTimeSymbols_ha', 'goog.i18n.DateTimeSymbols_ha_GH', 'goog.i18n.DateTimeSymbols_ha_NE', 'goog.i18n.DateTimeSymbols_ha_NG', 'goog.i18n.DateTimeSymbols_haw_US', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_hi_IN', 'goog.i18n.DateTimeSymbols_hr_BA', 'goog.i18n.DateTimeSymbols_hr_HR', 'goog.i18n.DateTimeSymbols_hsb', 'goog.i18n.DateTimeSymbols_hsb_DE', 'goog.i18n.DateTimeSymbols_hu_HU', 'goog.i18n.DateTimeSymbols_hy_AM', 'goog.i18n.DateTimeSymbols_id_ID', 'goog.i18n.DateTimeSymbols_ig', 'goog.i18n.DateTimeSymbols_ig_NG', 'goog.i18n.DateTimeSymbols_ii', 'goog.i18n.DateTimeSymbols_ii_CN', 'goog.i18n.DateTimeSymbols_is_IS', 'goog.i18n.DateTimeSymbols_it_CH', 'goog.i18n.DateTimeSymbols_it_IT', 'goog.i18n.DateTimeSymbols_it_SM', 'goog.i18n.DateTimeSymbols_it_VA', 'goog.i18n.DateTimeSymbols_ja_JP', 'goog.i18n.DateTimeSymbols_jgo', 'goog.i18n.DateTimeSymbols_jgo_CM', 'goog.i18n.DateTimeSymbols_jmc', 'goog.i18n.DateTimeSymbols_jmc_TZ', 'goog.i18n.DateTimeSymbols_ka_GE', 'goog.i18n.DateTimeSymbols_kab', 'goog.i18n.DateTimeSymbols_kab_DZ', 'goog.i18n.DateTimeSymbols_kam', 'goog.i18n.DateTimeSymbols_kam_KE', 'goog.i18n.DateTimeSymbols_kde', 'goog.i18n.DateTimeSymbols_kde_TZ', 'goog.i18n.DateTimeSymbols_kea', 'goog.i18n.DateTimeSymbols_kea_CV', 'goog.i18n.DateTimeSymbols_khq', 'goog.i18n.DateTimeSymbols_khq_ML', 'goog.i18n.DateTimeSymbols_ki', 'goog.i18n.DateTimeSymbols_ki_KE', 'goog.i18n.DateTimeSymbols_kk_KZ', 'goog.i18n.DateTimeSymbols_kkj', 'goog.i18n.DateTimeSymbols_kkj_CM', 'goog.i18n.DateTimeSymbols_kl', 'goog.i18n.DateTimeSymbols_kl_GL', 'goog.i18n.DateTimeSymbols_kln', 'goog.i18n.DateTimeSymbols_kln_KE', 'goog.i18n.DateTimeSymbols_km_KH', 'goog.i18n.DateTimeSymbols_kn_IN', 'goog.i18n.DateTimeSymbols_ko_KP', 'goog.i18n.DateTimeSymbols_ko_KR', 'goog.i18n.DateTimeSymbols_kok', 'goog.i18n.DateTimeSymbols_kok_IN', 'goog.i18n.DateTimeSymbols_ks', 'goog.i18n.DateTimeSymbols_ks_IN', 'goog.i18n.DateTimeSymbols_ksb', 'goog.i18n.DateTimeSymbols_ksb_TZ', 'goog.i18n.DateTimeSymbols_ksf', 'goog.i18n.DateTimeSymbols_ksf_CM', 'goog.i18n.DateTimeSymbols_ksh', 'goog.i18n.DateTimeSymbols_ksh_DE', 'goog.i18n.DateTimeSymbols_kw', 'goog.i18n.DateTimeSymbols_kw_GB', 'goog.i18n.DateTimeSymbols_ky_KG', 'goog.i18n.DateTimeSymbols_lag', 'goog.i18n.DateTimeSymbols_lag_TZ', 'goog.i18n.DateTimeSymbols_lb', 'goog.i18n.DateTimeSymbols_lb_LU', 'goog.i18n.DateTimeSymbols_lg', 'goog.i18n.DateTimeSymbols_lg_UG', 'goog.i18n.DateTimeSymbols_lkt', 'goog.i18n.DateTimeSymbols_lkt_US', 'goog.i18n.DateTimeSymbols_ln_AO', 'goog.i18n.DateTimeSymbols_ln_CD', 'goog.i18n.DateTimeSymbols_ln_CF', 'goog.i18n.DateTimeSymbols_ln_CG', 'goog.i18n.DateTimeSymbols_lo_LA', 'goog.i18n.DateTimeSymbols_lrc', 'goog.i18n.DateTimeSymbols_lrc_IQ', 'goog.i18n.DateTimeSymbols_lrc_IR', 'goog.i18n.DateTimeSymbols_lt_LT', 'goog.i18n.DateTimeSymbols_lu', 'goog.i18n.DateTimeSymbols_lu_CD', 'goog.i18n.DateTimeSymbols_luo', 'goog.i18n.DateTimeSymbols_luo_KE', 'goog.i18n.DateTimeSymbols_luy', 'goog.i18n.DateTimeSymbols_luy_KE', 'goog.i18n.DateTimeSymbols_lv_LV', 'goog.i18n.DateTimeSymbols_mas', 'goog.i18n.DateTimeSymbols_mas_KE', 'goog.i18n.DateTimeSymbols_mas_TZ', 'goog.i18n.DateTimeSymbols_mer', 'goog.i18n.DateTimeSymbols_mer_KE', 'goog.i18n.DateTimeSymbols_mfe', 'goog.i18n.DateTimeSymbols_mfe_MU', 'goog.i18n.DateTimeSymbols_mg', 'goog.i18n.DateTimeSymbols_mg_MG', 'goog.i18n.DateTimeSymbols_mgh', 'goog.i18n.DateTimeSymbols_mgh_MZ', 'goog.i18n.DateTimeSymbols_mgo', 'goog.i18n.DateTimeSymbols_mgo_CM', 'goog.i18n.DateTimeSymbols_mk_MK', 'goog.i18n.DateTimeSymbols_ml_IN', 'goog.i18n.DateTimeSymbols_mn_MN', 'goog.i18n.DateTimeSymbols_mr_IN', 'goog.i18n.DateTimeSymbols_ms_BN', 'goog.i18n.DateTimeSymbols_ms_MY', 'goog.i18n.DateTimeSymbols_ms_SG', 'goog.i18n.DateTimeSymbols_mt_MT', 'goog.i18n.DateTimeSymbols_mua', 'goog.i18n.DateTimeSymbols_mua_CM', 'goog.i18n.DateTimeSymbols_my_MM', 'goog.i18n.DateTimeSymbols_mzn', 'goog.i18n.DateTimeSymbols_mzn_IR', 'goog.i18n.DateTimeSymbols_naq', 'goog.i18n.DateTimeSymbols_naq_NA', 'goog.i18n.DateTimeSymbols_nb_NO', 'goog.i18n.DateTimeSymbols_nb_SJ', 'goog.i18n.DateTimeSymbols_nd', 'goog.i18n.DateTimeSymbols_nd_ZW', 'goog.i18n.DateTimeSymbols_nds', 'goog.i18n.DateTimeSymbols_nds_DE', 'goog.i18n.DateTimeSymbols_nds_NL', 'goog.i18n.DateTimeSymbols_ne_IN', 'goog.i18n.DateTimeSymbols_ne_NP', 'goog.i18n.DateTimeSymbols_nl_AW', 'goog.i18n.DateTimeSymbols_nl_BE', 'goog.i18n.DateTimeSymbols_nl_BQ', 'goog.i18n.DateTimeSymbols_nl_CW', 'goog.i18n.DateTimeSymbols_nl_NL', 'goog.i18n.DateTimeSymbols_nl_SR', 'goog.i18n.DateTimeSymbols_nl_SX', 'goog.i18n.DateTimeSymbols_nmg', 'goog.i18n.DateTimeSymbols_nmg_CM', 'goog.i18n.DateTimeSymbols_nn', 'goog.i18n.DateTimeSymbols_nn_NO', 'goog.i18n.DateTimeSymbols_nnh', 'goog.i18n.DateTimeSymbols_nnh_CM', 'goog.i18n.DateTimeSymbols_nus', 'goog.i18n.DateTimeSymbols_nus_SS', 'goog.i18n.DateTimeSymbols_nyn', 'goog.i18n.DateTimeSymbols_nyn_UG', 'goog.i18n.DateTimeSymbols_om', 'goog.i18n.DateTimeSymbols_om_ET', 'goog.i18n.DateTimeSymbols_om_KE', 'goog.i18n.DateTimeSymbols_or_IN', 'goog.i18n.DateTimeSymbols_os', 'goog.i18n.DateTimeSymbols_os_GE', 'goog.i18n.DateTimeSymbols_os_RU', 'goog.i18n.DateTimeSymbols_pa_Arab', 'goog.i18n.DateTimeSymbols_pa_Arab_PK', 'goog.i18n.DateTimeSymbols_pa_Guru', 'goog.i18n.DateTimeSymbols_pa_Guru_IN', 'goog.i18n.DateTimeSymbols_pl_PL', 'goog.i18n.DateTimeSymbols_ps', 'goog.i18n.DateTimeSymbols_ps_AF', 'goog.i18n.DateTimeSymbols_pt_AO', 'goog.i18n.DateTimeSymbols_pt_CH', 'goog.i18n.DateTimeSymbols_pt_CV', 'goog.i18n.DateTimeSymbols_pt_GQ', 'goog.i18n.DateTimeSymbols_pt_GW', 'goog.i18n.DateTimeSymbols_pt_LU', 'goog.i18n.DateTimeSymbols_pt_MO', 'goog.i18n.DateTimeSymbols_pt_MZ', 'goog.i18n.DateTimeSymbols_pt_ST', 'goog.i18n.DateTimeSymbols_pt_TL', 'goog.i18n.DateTimeSymbols_qu', 'goog.i18n.DateTimeSymbols_qu_BO', 'goog.i18n.DateTimeSymbols_qu_EC', 'goog.i18n.DateTimeSymbols_qu_PE', 'goog.i18n.DateTimeSymbols_rm', 'goog.i18n.DateTimeSymbols_rm_CH', 'goog.i18n.DateTimeSymbols_rn', 'goog.i18n.DateTimeSymbols_rn_BI', 'goog.i18n.DateTimeSymbols_ro_MD', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_rof', 'goog.i18n.DateTimeSymbols_rof_TZ', 'goog.i18n.DateTimeSymbols_ru_BY', 'goog.i18n.DateTimeSymbols_ru_KG', 'goog.i18n.DateTimeSymbols_ru_KZ', 'goog.i18n.DateTimeSymbols_ru_MD', 'goog.i18n.DateTimeSymbols_ru_RU', 'goog.i18n.DateTimeSymbols_ru_UA', 'goog.i18n.DateTimeSymbols_rw', 'goog.i18n.DateTimeSymbols_rw_RW', 'goog.i18n.DateTimeSymbols_rwk', 'goog.i18n.DateTimeSymbols_rwk_TZ', 'goog.i18n.DateTimeSymbols_sah', 'goog.i18n.DateTimeSymbols_sah_RU', 'goog.i18n.DateTimeSymbols_saq', 'goog.i18n.DateTimeSymbols_saq_KE', 'goog.i18n.DateTimeSymbols_sbp', 'goog.i18n.DateTimeSymbols_sbp_TZ', 'goog.i18n.DateTimeSymbols_se', 'goog.i18n.DateTimeSymbols_se_FI', 'goog.i18n.DateTimeSymbols_se_NO', 'goog.i18n.DateTimeSymbols_se_SE', 'goog.i18n.DateTimeSymbols_seh', 'goog.i18n.DateTimeSymbols_seh_MZ', 'goog.i18n.DateTimeSymbols_ses', 'goog.i18n.DateTimeSymbols_ses_ML', 'goog.i18n.DateTimeSymbols_sg', 'goog.i18n.DateTimeSymbols_sg_CF', 'goog.i18n.DateTimeSymbols_shi', 'goog.i18n.DateTimeSymbols_shi_Latn', 'goog.i18n.DateTimeSymbols_shi_Latn_MA', 'goog.i18n.DateTimeSymbols_shi_Tfng', 'goog.i18n.DateTimeSymbols_shi_Tfng_MA', 'goog.i18n.DateTimeSymbols_si_LK', 'goog.i18n.DateTimeSymbols_sk_SK', 'goog.i18n.DateTimeSymbols_sl_SI', 'goog.i18n.DateTimeSymbols_smn', 'goog.i18n.DateTimeSymbols_smn_FI', 'goog.i18n.DateTimeSymbols_sn', 'goog.i18n.DateTimeSymbols_sn_ZW', 'goog.i18n.DateTimeSymbols_so', 'goog.i18n.DateTimeSymbols_so_DJ', 'goog.i18n.DateTimeSymbols_so_ET', 'goog.i18n.DateTimeSymbols_so_KE', 'goog.i18n.DateTimeSymbols_so_SO', 'goog.i18n.DateTimeSymbols_sq_AL', 'goog.i18n.DateTimeSymbols_sq_MK', 'goog.i18n.DateTimeSymbols_sq_XK', 'goog.i18n.DateTimeSymbols_sr_Cyrl', 'goog.i18n.DateTimeSymbols_sr_Cyrl_BA', 'goog.i18n.DateTimeSymbols_sr_Cyrl_ME', 'goog.i18n.DateTimeSymbols_sr_Cyrl_RS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_XK', 'goog.i18n.DateTimeSymbols_sr_Latn_BA', 'goog.i18n.DateTimeSymbols_sr_Latn_ME', 'goog.i18n.DateTimeSymbols_sr_Latn_RS', 'goog.i18n.DateTimeSymbols_sr_Latn_XK', 'goog.i18n.DateTimeSymbols_sv_AX', 'goog.i18n.DateTimeSymbols_sv_FI', 'goog.i18n.DateTimeSymbols_sv_SE', 'goog.i18n.DateTimeSymbols_sw_CD', 'goog.i18n.DateTimeSymbols_sw_KE', 'goog.i18n.DateTimeSymbols_sw_TZ', 'goog.i18n.DateTimeSymbols_sw_UG', 'goog.i18n.DateTimeSymbols_ta_IN', 'goog.i18n.DateTimeSymbols_ta_LK', 'goog.i18n.DateTimeSymbols_ta_MY', 'goog.i18n.DateTimeSymbols_ta_SG', 'goog.i18n.DateTimeSymbols_te_IN', 'goog.i18n.DateTimeSymbols_teo', 'goog.i18n.DateTimeSymbols_teo_KE', 'goog.i18n.DateTimeSymbols_teo_UG', 'goog.i18n.DateTimeSymbols_th_TH', 'goog.i18n.DateTimeSymbols_ti', 'goog.i18n.DateTimeSymbols_ti_ER', 'goog.i18n.DateTimeSymbols_ti_ET', 'goog.i18n.DateTimeSymbols_to', 'goog.i18n.DateTimeSymbols_to_TO', 'goog.i18n.DateTimeSymbols_tr_CY', 'goog.i18n.DateTimeSymbols_tr_TR', 'goog.i18n.DateTimeSymbols_twq', 'goog.i18n.DateTimeSymbols_twq_NE', 'goog.i18n.DateTimeSymbols_tzm', 'goog.i18n.DateTimeSymbols_tzm_MA', 'goog.i18n.DateTimeSymbols_ug', 'goog.i18n.DateTimeSymbols_ug_CN', 'goog.i18n.DateTimeSymbols_uk_UA', 'goog.i18n.DateTimeSymbols_ur_IN', 'goog.i18n.DateTimeSymbols_ur_PK', 'goog.i18n.DateTimeSymbols_uz_Arab', 'goog.i18n.DateTimeSymbols_uz_Arab_AF', 'goog.i18n.DateTimeSymbols_uz_Cyrl', 'goog.i18n.DateTimeSymbols_uz_Cyrl_UZ', 'goog.i18n.DateTimeSymbols_uz_Latn', 'goog.i18n.DateTimeSymbols_uz_Latn_UZ', 'goog.i18n.DateTimeSymbols_vai', 'goog.i18n.DateTimeSymbols_vai_Latn', 'goog.i18n.DateTimeSymbols_vai_Latn_LR', 'goog.i18n.DateTimeSymbols_vai_Vaii', 'goog.i18n.DateTimeSymbols_vai_Vaii_LR', 'goog.i18n.DateTimeSymbols_vi_VN', 'goog.i18n.DateTimeSymbols_vun', 'goog.i18n.DateTimeSymbols_vun_TZ', 'goog.i18n.DateTimeSymbols_wae', 'goog.i18n.DateTimeSymbols_wae_CH', 'goog.i18n.DateTimeSymbols_xog', 'goog.i18n.DateTimeSymbols_xog_UG', 'goog.i18n.DateTimeSymbols_yav', 'goog.i18n.DateTimeSymbols_yav_CM', 'goog.i18n.DateTimeSymbols_yi', 'goog.i18n.DateTimeSymbols_yi_001', 'goog.i18n.DateTimeSymbols_yo', 'goog.i18n.DateTimeSymbols_yo_BJ', 'goog.i18n.DateTimeSymbols_yo_NG', 'goog.i18n.DateTimeSymbols_yue', 'goog.i18n.DateTimeSymbols_yue_HK', 'goog.i18n.DateTimeSymbols_zgh', 'goog.i18n.DateTimeSymbols_zgh_MA', 'goog.i18n.DateTimeSymbols_zh_Hans', 'goog.i18n.DateTimeSymbols_zh_Hans_CN', 'goog.i18n.DateTimeSymbols_zh_Hans_HK', 'goog.i18n.DateTimeSymbols_zh_Hans_MO', 'goog.i18n.DateTimeSymbols_zh_Hans_SG', 'goog.i18n.DateTimeSymbols_zh_Hant', 'goog.i18n.DateTimeSymbols_zh_Hant_HK', 'goog.i18n.DateTimeSymbols_zh_Hant_MO', 'goog.i18n.DateTimeSymbols_zh_Hant_TW', 'goog.i18n.DateTimeSymbols_zu_ZA'], ['goog.i18n.DateTimeSymbols'], {});
+goog.addDependency('i18n/graphemebreak.js', ['goog.i18n.GraphemeBreak'], ['goog.asserts', 'goog.i18n.uChar', 'goog.structs.InversionMap'], {});
+goog.addDependency('i18n/graphemebreak_test.js', ['goog.i18n.GraphemeBreakTest'], ['goog.i18n.GraphemeBreak', 'goog.i18n.uChar', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/messageformat.js', ['goog.i18n.MessageFormat'], ['goog.array', 'goog.asserts', 'goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.NumberFormat', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.ordinalRules', 'goog.i18n.pluralRules'], {});
+goog.addDependency('i18n/messageformat_test.js', ['goog.i18n.MessageFormatTest'], ['goog.i18n.MessageFormat', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.pluralRules', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/mime.js', ['goog.i18n.mime', 'goog.i18n.mime.encode'], ['goog.array'], {});
+goog.addDependency('i18n/mime_test.js', ['goog.i18n.mime.encodeTest'], ['goog.i18n.mime.encode', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/numberformat.js', ['goog.i18n.NumberFormat', 'goog.i18n.NumberFormat.CurrencyStyle', 'goog.i18n.NumberFormat.Format'], ['goog.asserts', 'goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_u_nu_latn', 'goog.i18n.currency', 'goog.math', 'goog.string'], {});
+goog.addDependency('i18n/numberformat_test.js', ['goog.i18n.NumberFormatTest'], ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.NumberFormat', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_ar_u_nu_latn', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_u_nu_latn', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('i18n/numberformatsymbols.js', ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_af', 'goog.i18n.NumberFormatSymbols_am', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_ar_DZ', 'goog.i18n.NumberFormatSymbols_ar_u_nu_latn', 'goog.i18n.NumberFormatSymbols_az', 'goog.i18n.NumberFormatSymbols_be', 'goog.i18n.NumberFormatSymbols_bg', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_bn_u_nu_latn', 'goog.i18n.NumberFormatSymbols_br', 'goog.i18n.NumberFormatSymbols_bs', 'goog.i18n.NumberFormatSymbols_ca', 'goog.i18n.NumberFormatSymbols_chr', 'goog.i18n.NumberFormatSymbols_cs', 'goog.i18n.NumberFormatSymbols_cy', 'goog.i18n.NumberFormatSymbols_da', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_de_AT', 'goog.i18n.NumberFormatSymbols_de_CH', 'goog.i18n.NumberFormatSymbols_el', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_CA', 'goog.i18n.NumberFormatSymbols_en_GB', 'goog.i18n.NumberFormatSymbols_en_IE', 'goog.i18n.NumberFormatSymbols_en_IN', 'goog.i18n.NumberFormatSymbols_en_SG', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_en_ZA', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_es_419', 'goog.i18n.NumberFormatSymbols_es_ES', 'goog.i18n.NumberFormatSymbols_es_MX', 'goog.i18n.NumberFormatSymbols_es_US', 'goog.i18n.NumberFormatSymbols_et', 'goog.i18n.NumberFormatSymbols_eu', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_fa_u_nu_latn', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fil', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_fr_CA', 'goog.i18n.NumberFormatSymbols_ga', 'goog.i18n.NumberFormatSymbols_gl', 'goog.i18n.NumberFormatSymbols_gsw', 'goog.i18n.NumberFormatSymbols_gu', 'goog.i18n.NumberFormatSymbols_haw', 'goog.i18n.NumberFormatSymbols_he', 'goog.i18n.NumberFormatSymbols_hi', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.NumberFormatSymbols_hu', 'goog.i18n.NumberFormatSymbols_hy', 'goog.i18n.NumberFormatSymbols_id', 'goog.i18n.NumberFormatSymbols_in', 'goog.i18n.NumberFormatSymbols_is', 'goog.i18n.NumberFormatSymbols_it', 'goog.i18n.NumberFormatSymbols_iw', 'goog.i18n.NumberFormatSymbols_ja', 'goog.i18n.NumberFormatSymbols_ka', 'goog.i18n.NumberFormatSymbols_kk', 'goog.i18n.NumberFormatSymbols_km', 'goog.i18n.NumberFormatSymbols_kn', 'goog.i18n.NumberFormatSymbols_ko', 'goog.i18n.NumberFormatSymbols_ky', 'goog.i18n.NumberFormatSymbols_ln', 'goog.i18n.NumberFormatSymbols_lo', 'goog.i18n.NumberFormatSymbols_lt', 'goog.i18n.NumberFormatSymbols_lv', 'goog.i18n.NumberFormatSymbols_mk', 'goog.i18n.NumberFormatSymbols_ml', 'goog.i18n.NumberFormatSymbols_mn', 'goog.i18n.NumberFormatSymbols_mo', 'goog.i18n.NumberFormatSymbols_mr', 'goog.i18n.NumberFormatSymbols_mr_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ms', 'goog.i18n.NumberFormatSymbols_mt', 'goog.i18n.NumberFormatSymbols_my', 'goog.i18n.NumberFormatSymbols_my_u_nu_latn', 'goog.i18n.NumberFormatSymbols_nb', 'goog.i18n.NumberFormatSymbols_ne', 'goog.i18n.NumberFormatSymbols_ne_u_nu_latn', 'goog.i18n.NumberFormatSymbols_nl', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.NumberFormatSymbols_no_NO', 'goog.i18n.NumberFormatSymbols_or', 'goog.i18n.NumberFormatSymbols_pa', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_pt', 'goog.i18n.NumberFormatSymbols_pt_BR', 'goog.i18n.NumberFormatSymbols_pt_PT', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_ru', 'goog.i18n.NumberFormatSymbols_sh', 'goog.i18n.NumberFormatSymbols_si', 'goog.i18n.NumberFormatSymbols_sk', 'goog.i18n.NumberFormatSymbols_sl', 'goog.i18n.NumberFormatSymbols_sq', 'goog.i18n.NumberFormatSymbols_sr', 'goog.i18n.NumberFormatSymbols_sr_Latn', 'goog.i18n.NumberFormatSymbols_sv', 'goog.i18n.NumberFormatSymbols_sw', 'goog.i18n.NumberFormatSymbols_ta', 'goog.i18n.NumberFormatSymbols_te', 'goog.i18n.NumberFormatSymbols_th', 'goog.i18n.NumberFormatSymbols_tl', 'goog.i18n.NumberFormatSymbols_tr', 'goog.i18n.NumberFormatSymbols_u_nu_latn', 'goog.i18n.NumberFormatSymbols_uk', 'goog.i18n.NumberFormatSymbols_ur', 'goog.i18n.NumberFormatSymbols_uz', 'goog.i18n.NumberFormatSymbols_vi', 'goog.i18n.NumberFormatSymbols_zh', 'goog.i18n.NumberFormatSymbols_zh_CN', 'goog.i18n.NumberFormatSymbols_zh_HK', 'goog.i18n.NumberFormatSymbols_zh_TW', 'goog.i18n.NumberFormatSymbols_zu'], [], {});
+goog.addDependency('i18n/numberformatsymbolsext.js', ['goog.i18n.NumberFormatSymbolsExt', 'goog.i18n.NumberFormatSymbols_af_NA', 'goog.i18n.NumberFormatSymbols_af_ZA', 'goog.i18n.NumberFormatSymbols_agq', 'goog.i18n.NumberFormatSymbols_agq_CM', 'goog.i18n.NumberFormatSymbols_ak', 'goog.i18n.NumberFormatSymbols_ak_GH', 'goog.i18n.NumberFormatSymbols_am_ET', 'goog.i18n.NumberFormatSymbols_ar_001', 'goog.i18n.NumberFormatSymbols_ar_001_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_AE', 'goog.i18n.NumberFormatSymbols_ar_AE_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_BH', 'goog.i18n.NumberFormatSymbols_ar_BH_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_DJ', 'goog.i18n.NumberFormatSymbols_ar_DJ_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_ar_EG_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_EH', 'goog.i18n.NumberFormatSymbols_ar_ER', 'goog.i18n.NumberFormatSymbols_ar_ER_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_IL', 'goog.i18n.NumberFormatSymbols_ar_IL_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_IQ', 'goog.i18n.NumberFormatSymbols_ar_IQ_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_JO', 'goog.i18n.NumberFormatSymbols_ar_JO_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_KM', 'goog.i18n.NumberFormatSymbols_ar_KM_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_KW', 'goog.i18n.NumberFormatSymbols_ar_KW_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_LB', 'goog.i18n.NumberFormatSymbols_ar_LB_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_LY', 'goog.i18n.NumberFormatSymbols_ar_MA', 'goog.i18n.NumberFormatSymbols_ar_MR', 'goog.i18n.NumberFormatSymbols_ar_MR_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_OM', 'goog.i18n.NumberFormatSymbols_ar_OM_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_PS', 'goog.i18n.NumberFormatSymbols_ar_PS_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_QA', 'goog.i18n.NumberFormatSymbols_ar_QA_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_SA', 'goog.i18n.NumberFormatSymbols_ar_SA_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_SD', 'goog.i18n.NumberFormatSymbols_ar_SD_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_SO', 'goog.i18n.NumberFormatSymbols_ar_SO_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_SS', 'goog.i18n.NumberFormatSymbols_ar_SS_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_SY', 'goog.i18n.NumberFormatSymbols_ar_SY_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_TD', 'goog.i18n.NumberFormatSymbols_ar_TD_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_TN', 'goog.i18n.NumberFormatSymbols_ar_XB', 'goog.i18n.NumberFormatSymbols_ar_YE', 'goog.i18n.NumberFormatSymbols_ar_YE_u_nu_latn', 'goog.i18n.NumberFormatSymbols_as', 'goog.i18n.NumberFormatSymbols_as_IN', 'goog.i18n.NumberFormatSymbols_as_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_as_u_nu_latn', 'goog.i18n.NumberFormatSymbols_asa', 'goog.i18n.NumberFormatSymbols_asa_TZ', 'goog.i18n.NumberFormatSymbols_ast', 'goog.i18n.NumberFormatSymbols_ast_ES', 'goog.i18n.NumberFormatSymbols_az_Cyrl', 'goog.i18n.NumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.NumberFormatSymbols_az_Latn', 'goog.i18n.NumberFormatSymbols_az_Latn_AZ', 'goog.i18n.NumberFormatSymbols_bas', 'goog.i18n.NumberFormatSymbols_bas_CM', 'goog.i18n.NumberFormatSymbols_be_BY', 'goog.i18n.NumberFormatSymbols_bem', 'goog.i18n.NumberFormatSymbols_bem_ZM', 'goog.i18n.NumberFormatSymbols_bez', 'goog.i18n.NumberFormatSymbols_bez_TZ', 'goog.i18n.NumberFormatSymbols_bg_BG', 'goog.i18n.NumberFormatSymbols_bm', 'goog.i18n.NumberFormatSymbols_bm_ML', 'goog.i18n.NumberFormatSymbols_bn_BD', 'goog.i18n.NumberFormatSymbols_bn_BD_u_nu_latn', 'goog.i18n.NumberFormatSymbols_bn_IN', 'goog.i18n.NumberFormatSymbols_bn_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_bo', 'goog.i18n.NumberFormatSymbols_bo_CN', 'goog.i18n.NumberFormatSymbols_bo_IN', 'goog.i18n.NumberFormatSymbols_br_FR', 'goog.i18n.NumberFormatSymbols_brx', 'goog.i18n.NumberFormatSymbols_brx_IN', 'goog.i18n.NumberFormatSymbols_bs_Cyrl', 'goog.i18n.NumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_bs_Latn', 'goog.i18n.NumberFormatSymbols_bs_Latn_BA', 'goog.i18n.NumberFormatSymbols_ca_AD', 'goog.i18n.NumberFormatSymbols_ca_ES', 'goog.i18n.NumberFormatSymbols_ca_FR', 'goog.i18n.NumberFormatSymbols_ca_IT', 'goog.i18n.NumberFormatSymbols_ce', 'goog.i18n.NumberFormatSymbols_ce_RU', 'goog.i18n.NumberFormatSymbols_cgg', 'goog.i18n.NumberFormatSymbols_cgg_UG', 'goog.i18n.NumberFormatSymbols_chr_US', 'goog.i18n.NumberFormatSymbols_ckb', 'goog.i18n.NumberFormatSymbols_ckb_IQ', 'goog.i18n.NumberFormatSymbols_ckb_IQ_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ckb_IR', 'goog.i18n.NumberFormatSymbols_ckb_IR_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ckb_u_nu_latn', 'goog.i18n.NumberFormatSymbols_cs_CZ', 'goog.i18n.NumberFormatSymbols_cy_GB', 'goog.i18n.NumberFormatSymbols_da_DK', 'goog.i18n.NumberFormatSymbols_da_GL', 'goog.i18n.NumberFormatSymbols_dav', 'goog.i18n.NumberFormatSymbols_dav_KE', 'goog.i18n.NumberFormatSymbols_de_BE', 'goog.i18n.NumberFormatSymbols_de_DE', 'goog.i18n.NumberFormatSymbols_de_IT', 'goog.i18n.NumberFormatSymbols_de_LI', 'goog.i18n.NumberFormatSymbols_de_LU', 'goog.i18n.NumberFormatSymbols_dje', 'goog.i18n.NumberFormatSymbols_dje_NE', 'goog.i18n.NumberFormatSymbols_dsb', 'goog.i18n.NumberFormatSymbols_dsb_DE', 'goog.i18n.NumberFormatSymbols_dua', 'goog.i18n.NumberFormatSymbols_dua_CM', 'goog.i18n.NumberFormatSymbols_dyo', 'goog.i18n.NumberFormatSymbols_dyo_SN', 'goog.i18n.NumberFormatSymbols_dz', 'goog.i18n.NumberFormatSymbols_dz_BT', 'goog.i18n.NumberFormatSymbols_dz_BT_u_nu_latn', 'goog.i18n.NumberFormatSymbols_dz_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ebu', 'goog.i18n.NumberFormatSymbols_ebu_KE', 'goog.i18n.NumberFormatSymbols_ee', 'goog.i18n.NumberFormatSymbols_ee_GH', 'goog.i18n.NumberFormatSymbols_ee_TG', 'goog.i18n.NumberFormatSymbols_el_CY', 'goog.i18n.NumberFormatSymbols_el_GR', 'goog.i18n.NumberFormatSymbols_en_001', 'goog.i18n.NumberFormatSymbols_en_150', 'goog.i18n.NumberFormatSymbols_en_AG', 'goog.i18n.NumberFormatSymbols_en_AI', 'goog.i18n.NumberFormatSymbols_en_AS', 'goog.i18n.NumberFormatSymbols_en_AT', 'goog.i18n.NumberFormatSymbols_en_BB', 'goog.i18n.NumberFormatSymbols_en_BE', 'goog.i18n.NumberFormatSymbols_en_BI', 'goog.i18n.NumberFormatSymbols_en_BM', 'goog.i18n.NumberFormatSymbols_en_BS', 'goog.i18n.NumberFormatSymbols_en_BW', 'goog.i18n.NumberFormatSymbols_en_BZ', 'goog.i18n.NumberFormatSymbols_en_CC', 'goog.i18n.NumberFormatSymbols_en_CH', 'goog.i18n.NumberFormatSymbols_en_CK', 'goog.i18n.NumberFormatSymbols_en_CM', 'goog.i18n.NumberFormatSymbols_en_CX', 'goog.i18n.NumberFormatSymbols_en_CY', 'goog.i18n.NumberFormatSymbols_en_DE', 'goog.i18n.NumberFormatSymbols_en_DG', 'goog.i18n.NumberFormatSymbols_en_DK', 'goog.i18n.NumberFormatSymbols_en_DM', 'goog.i18n.NumberFormatSymbols_en_ER', 'goog.i18n.NumberFormatSymbols_en_FI', 'goog.i18n.NumberFormatSymbols_en_FJ', 'goog.i18n.NumberFormatSymbols_en_FK', 'goog.i18n.NumberFormatSymbols_en_FM', 'goog.i18n.NumberFormatSymbols_en_GD', 'goog.i18n.NumberFormatSymbols_en_GG', 'goog.i18n.NumberFormatSymbols_en_GH', 'goog.i18n.NumberFormatSymbols_en_GI', 'goog.i18n.NumberFormatSymbols_en_GM', 'goog.i18n.NumberFormatSymbols_en_GU', 'goog.i18n.NumberFormatSymbols_en_GY', 'goog.i18n.NumberFormatSymbols_en_HK', 'goog.i18n.NumberFormatSymbols_en_IL', 'goog.i18n.NumberFormatSymbols_en_IM', 'goog.i18n.NumberFormatSymbols_en_IO', 'goog.i18n.NumberFormatSymbols_en_JE', 'goog.i18n.NumberFormatSymbols_en_JM', 'goog.i18n.NumberFormatSymbols_en_KE', 'goog.i18n.NumberFormatSymbols_en_KI', 'goog.i18n.NumberFormatSymbols_en_KN', 'goog.i18n.NumberFormatSymbols_en_KY', 'goog.i18n.NumberFormatSymbols_en_LC', 'goog.i18n.NumberFormatSymbols_en_LR', 'goog.i18n.NumberFormatSymbols_en_LS', 'goog.i18n.NumberFormatSymbols_en_MG', 'goog.i18n.NumberFormatSymbols_en_MH', 'goog.i18n.NumberFormatSymbols_en_MO', 'goog.i18n.NumberFormatSymbols_en_MP', 'goog.i18n.NumberFormatSymbols_en_MS', 'goog.i18n.NumberFormatSymbols_en_MT', 'goog.i18n.NumberFormatSymbols_en_MU', 'goog.i18n.NumberFormatSymbols_en_MW', 'goog.i18n.NumberFormatSymbols_en_MY', 'goog.i18n.NumberFormatSymbols_en_NA', 'goog.i18n.NumberFormatSymbols_en_NF', 'goog.i18n.NumberFormatSymbols_en_NG', 'goog.i18n.NumberFormatSymbols_en_NL', 'goog.i18n.NumberFormatSymbols_en_NR', 'goog.i18n.NumberFormatSymbols_en_NU', 'goog.i18n.NumberFormatSymbols_en_NZ', 'goog.i18n.NumberFormatSymbols_en_PG', 'goog.i18n.NumberFormatSymbols_en_PH', 'goog.i18n.NumberFormatSymbols_en_PK', 'goog.i18n.NumberFormatSymbols_en_PN', 'goog.i18n.NumberFormatSymbols_en_PR', 'goog.i18n.NumberFormatSymbols_en_PW', 'goog.i18n.NumberFormatSymbols_en_RW', 'goog.i18n.NumberFormatSymbols_en_SB', 'goog.i18n.NumberFormatSymbols_en_SC', 'goog.i18n.NumberFormatSymbols_en_SD', 'goog.i18n.NumberFormatSymbols_en_SE', 'goog.i18n.NumberFormatSymbols_en_SH', 'goog.i18n.NumberFormatSymbols_en_SI', 'goog.i18n.NumberFormatSymbols_en_SL', 'goog.i18n.NumberFormatSymbols_en_SS', 'goog.i18n.NumberFormatSymbols_en_SX', 'goog.i18n.NumberFormatSymbols_en_SZ', 'goog.i18n.NumberFormatSymbols_en_TC', 'goog.i18n.NumberFormatSymbols_en_TK', 'goog.i18n.NumberFormatSymbols_en_TO', 'goog.i18n.NumberFormatSymbols_en_TT', 'goog.i18n.NumberFormatSymbols_en_TV', 'goog.i18n.NumberFormatSymbols_en_TZ', 'goog.i18n.NumberFormatSymbols_en_UG', 'goog.i18n.NumberFormatSymbols_en_UM', 'goog.i18n.NumberFormatSymbols_en_US_POSIX', 'goog.i18n.NumberFormatSymbols_en_VC', 'goog.i18n.NumberFormatSymbols_en_VG', 'goog.i18n.NumberFormatSymbols_en_VI', 'goog.i18n.NumberFormatSymbols_en_VU', 'goog.i18n.NumberFormatSymbols_en_WS', 'goog.i18n.NumberFormatSymbols_en_XA', 'goog.i18n.NumberFormatSymbols_en_ZM', 'goog.i18n.NumberFormatSymbols_en_ZW', 'goog.i18n.NumberFormatSymbols_eo', 'goog.i18n.NumberFormatSymbols_es_AR', 'goog.i18n.NumberFormatSymbols_es_BO', 'goog.i18n.NumberFormatSymbols_es_BR', 'goog.i18n.NumberFormatSymbols_es_BZ', 'goog.i18n.NumberFormatSymbols_es_CL', 'goog.i18n.NumberFormatSymbols_es_CO', 'goog.i18n.NumberFormatSymbols_es_CR', 'goog.i18n.NumberFormatSymbols_es_CU', 'goog.i18n.NumberFormatSymbols_es_DO', 'goog.i18n.NumberFormatSymbols_es_EA', 'goog.i18n.NumberFormatSymbols_es_EC', 'goog.i18n.NumberFormatSymbols_es_GQ', 'goog.i18n.NumberFormatSymbols_es_GT', 'goog.i18n.NumberFormatSymbols_es_HN', 'goog.i18n.NumberFormatSymbols_es_IC', 'goog.i18n.NumberFormatSymbols_es_NI', 'goog.i18n.NumberFormatSymbols_es_PA', 'goog.i18n.NumberFormatSymbols_es_PE', 'goog.i18n.NumberFormatSymbols_es_PH', 'goog.i18n.NumberFormatSymbols_es_PR', 'goog.i18n.NumberFormatSymbols_es_PY', 'goog.i18n.NumberFormatSymbols_es_SV', 'goog.i18n.NumberFormatSymbols_es_UY', 'goog.i18n.NumberFormatSymbols_es_VE', 'goog.i18n.NumberFormatSymbols_et_EE', 'goog.i18n.NumberFormatSymbols_eu_ES', 'goog.i18n.NumberFormatSymbols_ewo', 'goog.i18n.NumberFormatSymbols_ewo_CM', 'goog.i18n.NumberFormatSymbols_fa_AF', 'goog.i18n.NumberFormatSymbols_fa_AF_u_nu_latn', 'goog.i18n.NumberFormatSymbols_fa_IR', 'goog.i18n.NumberFormatSymbols_fa_IR_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ff', 'goog.i18n.NumberFormatSymbols_ff_CM', 'goog.i18n.NumberFormatSymbols_ff_GN', 'goog.i18n.NumberFormatSymbols_ff_MR', 'goog.i18n.NumberFormatSymbols_ff_SN', 'goog.i18n.NumberFormatSymbols_fi_FI', 'goog.i18n.NumberFormatSymbols_fil_PH', 'goog.i18n.NumberFormatSymbols_fo', 'goog.i18n.NumberFormatSymbols_fo_DK', 'goog.i18n.NumberFormatSymbols_fo_FO', 'goog.i18n.NumberFormatSymbols_fr_BE', 'goog.i18n.NumberFormatSymbols_fr_BF', 'goog.i18n.NumberFormatSymbols_fr_BI', 'goog.i18n.NumberFormatSymbols_fr_BJ', 'goog.i18n.NumberFormatSymbols_fr_BL', 'goog.i18n.NumberFormatSymbols_fr_CD', 'goog.i18n.NumberFormatSymbols_fr_CF', 'goog.i18n.NumberFormatSymbols_fr_CG', 'goog.i18n.NumberFormatSymbols_fr_CH', 'goog.i18n.NumberFormatSymbols_fr_CI', 'goog.i18n.NumberFormatSymbols_fr_CM', 'goog.i18n.NumberFormatSymbols_fr_DJ', 'goog.i18n.NumberFormatSymbols_fr_DZ', 'goog.i18n.NumberFormatSymbols_fr_FR', 'goog.i18n.NumberFormatSymbols_fr_GA', 'goog.i18n.NumberFormatSymbols_fr_GF', 'goog.i18n.NumberFormatSymbols_fr_GN', 'goog.i18n.NumberFormatSymbols_fr_GP', 'goog.i18n.NumberFormatSymbols_fr_GQ', 'goog.i18n.NumberFormatSymbols_fr_HT', 'goog.i18n.NumberFormatSymbols_fr_KM', 'goog.i18n.NumberFormatSymbols_fr_LU', 'goog.i18n.NumberFormatSymbols_fr_MA', 'goog.i18n.NumberFormatSymbols_fr_MC', 'goog.i18n.NumberFormatSymbols_fr_MF', 'goog.i18n.NumberFormatSymbols_fr_MG', 'goog.i18n.NumberFormatSymbols_fr_ML', 'goog.i18n.NumberFormatSymbols_fr_MQ', 'goog.i18n.NumberFormatSymbols_fr_MR', 'goog.i18n.NumberFormatSymbols_fr_MU', 'goog.i18n.NumberFormatSymbols_fr_NC', 'goog.i18n.NumberFormatSymbols_fr_NE', 'goog.i18n.NumberFormatSymbols_fr_PF', 'goog.i18n.NumberFormatSymbols_fr_PM', 'goog.i18n.NumberFormatSymbols_fr_RE', 'goog.i18n.NumberFormatSymbols_fr_RW', 'goog.i18n.NumberFormatSymbols_fr_SC', 'goog.i18n.NumberFormatSymbols_fr_SN', 'goog.i18n.NumberFormatSymbols_fr_SY', 'goog.i18n.NumberFormatSymbols_fr_TD', 'goog.i18n.NumberFormatSymbols_fr_TG', 'goog.i18n.NumberFormatSymbols_fr_TN', 'goog.i18n.NumberFormatSymbols_fr_VU', 'goog.i18n.NumberFormatSymbols_fr_WF', 'goog.i18n.NumberFormatSymbols_fr_YT', 'goog.i18n.NumberFormatSymbols_fur', 'goog.i18n.NumberFormatSymbols_fur_IT', 'goog.i18n.NumberFormatSymbols_fy', 'goog.i18n.NumberFormatSymbols_fy_NL', 'goog.i18n.NumberFormatSymbols_ga_IE', 'goog.i18n.NumberFormatSymbols_gd', 'goog.i18n.NumberFormatSymbols_gd_GB', 'goog.i18n.NumberFormatSymbols_gl_ES', 'goog.i18n.NumberFormatSymbols_gsw_CH', 'goog.i18n.NumberFormatSymbols_gsw_FR', 'goog.i18n.NumberFormatSymbols_gsw_LI', 'goog.i18n.NumberFormatSymbols_gu_IN', 'goog.i18n.NumberFormatSymbols_guz', 'goog.i18n.NumberFormatSymbols_guz_KE', 'goog.i18n.NumberFormatSymbols_gv', 'goog.i18n.NumberFormatSymbols_gv_IM', 'goog.i18n.NumberFormatSymbols_ha', 'goog.i18n.NumberFormatSymbols_ha_GH', 'goog.i18n.NumberFormatSymbols_ha_NE', 'goog.i18n.NumberFormatSymbols_ha_NG', 'goog.i18n.NumberFormatSymbols_haw_US', 'goog.i18n.NumberFormatSymbols_he_IL', 'goog.i18n.NumberFormatSymbols_hi_IN', 'goog.i18n.NumberFormatSymbols_hr_BA', 'goog.i18n.NumberFormatSymbols_hr_HR', 'goog.i18n.NumberFormatSymbols_hsb', 'goog.i18n.NumberFormatSymbols_hsb_DE', 'goog.i18n.NumberFormatSymbols_hu_HU', 'goog.i18n.NumberFormatSymbols_hy_AM', 'goog.i18n.NumberFormatSymbols_id_ID', 'goog.i18n.NumberFormatSymbols_ig', 'goog.i18n.NumberFormatSymbols_ig_NG', 'goog.i18n.NumberFormatSymbols_ii', 'goog.i18n.NumberFormatSymbols_ii_CN', 'goog.i18n.NumberFormatSymbols_is_IS', 'goog.i18n.NumberFormatSymbols_it_CH', 'goog.i18n.NumberFormatSymbols_it_IT', 'goog.i18n.NumberFormatSymbols_it_SM', 'goog.i18n.NumberFormatSymbols_it_VA', 'goog.i18n.NumberFormatSymbols_ja_JP', 'goog.i18n.NumberFormatSymbols_jgo', 'goog.i18n.NumberFormatSymbols_jgo_CM', 'goog.i18n.NumberFormatSymbols_jmc', 'goog.i18n.NumberFormatSymbols_jmc_TZ', 'goog.i18n.NumberFormatSymbols_ka_GE', 'goog.i18n.NumberFormatSymbols_kab', 'goog.i18n.NumberFormatSymbols_kab_DZ', 'goog.i18n.NumberFormatSymbols_kam', 'goog.i18n.NumberFormatSymbols_kam_KE', 'goog.i18n.NumberFormatSymbols_kde', 'goog.i18n.NumberFormatSymbols_kde_TZ', 'goog.i18n.NumberFormatSymbols_kea', 'goog.i18n.NumberFormatSymbols_kea_CV', 'goog.i18n.NumberFormatSymbols_khq', 'goog.i18n.NumberFormatSymbols_khq_ML', 'goog.i18n.NumberFormatSymbols_ki', 'goog.i18n.NumberFormatSymbols_ki_KE', 'goog.i18n.NumberFormatSymbols_kk_KZ', 'goog.i18n.NumberFormatSymbols_kkj', 'goog.i18n.NumberFormatSymbols_kkj_CM', 'goog.i18n.NumberFormatSymbols_kl', 'goog.i18n.NumberFormatSymbols_kl_GL', 'goog.i18n.NumberFormatSymbols_kln', 'goog.i18n.NumberFormatSymbols_kln_KE', 'goog.i18n.NumberFormatSymbols_km_KH', 'goog.i18n.NumberFormatSymbols_kn_IN', 'goog.i18n.NumberFormatSymbols_ko_KP', 'goog.i18n.NumberFormatSymbols_ko_KR', 'goog.i18n.NumberFormatSymbols_kok', 'goog.i18n.NumberFormatSymbols_kok_IN', 'goog.i18n.NumberFormatSymbols_ks', 'goog.i18n.NumberFormatSymbols_ks_IN', 'goog.i18n.NumberFormatSymbols_ks_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ks_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ksb', 'goog.i18n.NumberFormatSymbols_ksb_TZ', 'goog.i18n.NumberFormatSymbols_ksf', 'goog.i18n.NumberFormatSymbols_ksf_CM', 'goog.i18n.NumberFormatSymbols_ksh', 'goog.i18n.NumberFormatSymbols_ksh_DE', 'goog.i18n.NumberFormatSymbols_kw', 'goog.i18n.NumberFormatSymbols_kw_GB', 'goog.i18n.NumberFormatSymbols_ky_KG', 'goog.i18n.NumberFormatSymbols_lag', 'goog.i18n.NumberFormatSymbols_lag_TZ', 'goog.i18n.NumberFormatSymbols_lb', 'goog.i18n.NumberFormatSymbols_lb_LU', 'goog.i18n.NumberFormatSymbols_lg', 'goog.i18n.NumberFormatSymbols_lg_UG', 'goog.i18n.NumberFormatSymbols_lkt', 'goog.i18n.NumberFormatSymbols_lkt_US', 'goog.i18n.NumberFormatSymbols_ln_AO', 'goog.i18n.NumberFormatSymbols_ln_CD', 'goog.i18n.NumberFormatSymbols_ln_CF', 'goog.i18n.NumberFormatSymbols_ln_CG', 'goog.i18n.NumberFormatSymbols_lo_LA', 'goog.i18n.NumberFormatSymbols_lrc', 'goog.i18n.NumberFormatSymbols_lrc_IQ', 'goog.i18n.NumberFormatSymbols_lrc_IQ_u_nu_latn', 'goog.i18n.NumberFormatSymbols_lrc_IR', 'goog.i18n.NumberFormatSymbols_lrc_IR_u_nu_latn', 'goog.i18n.NumberFormatSymbols_lrc_u_nu_latn', 'goog.i18n.NumberFormatSymbols_lt_LT', 'goog.i18n.NumberFormatSymbols_lu', 'goog.i18n.NumberFormatSymbols_lu_CD', 'goog.i18n.NumberFormatSymbols_luo', 'goog.i18n.NumberFormatSymbols_luo_KE', 'goog.i18n.NumberFormatSymbols_luy', 'goog.i18n.NumberFormatSymbols_luy_KE', 'goog.i18n.NumberFormatSymbols_lv_LV', 'goog.i18n.NumberFormatSymbols_mas', 'goog.i18n.NumberFormatSymbols_mas_KE', 'goog.i18n.NumberFormatSymbols_mas_TZ', 'goog.i18n.NumberFormatSymbols_mer', 'goog.i18n.NumberFormatSymbols_mer_KE', 'goog.i18n.NumberFormatSymbols_mfe', 'goog.i18n.NumberFormatSymbols_mfe_MU', 'goog.i18n.NumberFormatSymbols_mg', 'goog.i18n.NumberFormatSymbols_mg_MG', 'goog.i18n.NumberFormatSymbols_mgh', 'goog.i18n.NumberFormatSymbols_mgh_MZ', 'goog.i18n.NumberFormatSymbols_mgo', 'goog.i18n.NumberFormatSymbols_mgo_CM', 'goog.i18n.NumberFormatSymbols_mk_MK', 'goog.i18n.NumberFormatSymbols_ml_IN', 'goog.i18n.NumberFormatSymbols_mn_MN', 'goog.i18n.NumberFormatSymbols_mr_IN', 'goog.i18n.NumberFormatSymbols_mr_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ms_BN', 'goog.i18n.NumberFormatSymbols_ms_MY', 'goog.i18n.NumberFormatSymbols_ms_SG', 'goog.i18n.NumberFormatSymbols_mt_MT', 'goog.i18n.NumberFormatSymbols_mua', 'goog.i18n.NumberFormatSymbols_mua_CM', 'goog.i18n.NumberFormatSymbols_my_MM', 'goog.i18n.NumberFormatSymbols_my_MM_u_nu_latn', 'goog.i18n.NumberFormatSymbols_mzn', 'goog.i18n.NumberFormatSymbols_mzn_IR', 'goog.i18n.NumberFormatSymbols_mzn_IR_u_nu_latn', 'goog.i18n.NumberFormatSymbols_mzn_u_nu_latn', 'goog.i18n.NumberFormatSymbols_naq', 'goog.i18n.NumberFormatSymbols_naq_NA', 'goog.i18n.NumberFormatSymbols_nb_NO', 'goog.i18n.NumberFormatSymbols_nb_SJ', 'goog.i18n.NumberFormatSymbols_nd', 'goog.i18n.NumberFormatSymbols_nd_ZW', 'goog.i18n.NumberFormatSymbols_nds', 'goog.i18n.NumberFormatSymbols_nds_DE', 'goog.i18n.NumberFormatSymbols_nds_NL', 'goog.i18n.NumberFormatSymbols_ne_IN', 'goog.i18n.NumberFormatSymbols_ne_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ne_NP', 'goog.i18n.NumberFormatSymbols_ne_NP_u_nu_latn', 'goog.i18n.NumberFormatSymbols_nl_AW', 'goog.i18n.NumberFormatSymbols_nl_BE', 'goog.i18n.NumberFormatSymbols_nl_BQ', 'goog.i18n.NumberFormatSymbols_nl_CW', 'goog.i18n.NumberFormatSymbols_nl_NL', 'goog.i18n.NumberFormatSymbols_nl_SR', 'goog.i18n.NumberFormatSymbols_nl_SX', 'goog.i18n.NumberFormatSymbols_nmg', 'goog.i18n.NumberFormatSymbols_nmg_CM', 'goog.i18n.NumberFormatSymbols_nn', 'goog.i18n.NumberFormatSymbols_nn_NO', 'goog.i18n.NumberFormatSymbols_nnh', 'goog.i18n.NumberFormatSymbols_nnh_CM', 'goog.i18n.NumberFormatSymbols_nus', 'goog.i18n.NumberFormatSymbols_nus_SS', 'goog.i18n.NumberFormatSymbols_nyn', 'goog.i18n.NumberFormatSymbols_nyn_UG', 'goog.i18n.NumberFormatSymbols_om', 'goog.i18n.NumberFormatSymbols_om_ET', 'goog.i18n.NumberFormatSymbols_om_KE', 'goog.i18n.NumberFormatSymbols_or_IN', 'goog.i18n.NumberFormatSymbols_os', 'goog.i18n.NumberFormatSymbols_os_GE', 'goog.i18n.NumberFormatSymbols_os_RU', 'goog.i18n.NumberFormatSymbols_pa_Arab', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK_u_nu_latn', 'goog.i18n.NumberFormatSymbols_pa_Arab_u_nu_latn', 'goog.i18n.NumberFormatSymbols_pa_Guru', 'goog.i18n.NumberFormatSymbols_pa_Guru_IN', 'goog.i18n.NumberFormatSymbols_pl_PL', 'goog.i18n.NumberFormatSymbols_ps', 'goog.i18n.NumberFormatSymbols_ps_AF', 'goog.i18n.NumberFormatSymbols_ps_AF_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ps_u_nu_latn', 'goog.i18n.NumberFormatSymbols_pt_AO', 'goog.i18n.NumberFormatSymbols_pt_CH', 'goog.i18n.NumberFormatSymbols_pt_CV', 'goog.i18n.NumberFormatSymbols_pt_GQ', 'goog.i18n.NumberFormatSymbols_pt_GW', 'goog.i18n.NumberFormatSymbols_pt_LU', 'goog.i18n.NumberFormatSymbols_pt_MO', 'goog.i18n.NumberFormatSymbols_pt_MZ', 'goog.i18n.NumberFormatSymbols_pt_ST', 'goog.i18n.NumberFormatSymbols_pt_TL', 'goog.i18n.NumberFormatSymbols_qu', 'goog.i18n.NumberFormatSymbols_qu_BO', 'goog.i18n.NumberFormatSymbols_qu_EC', 'goog.i18n.NumberFormatSymbols_qu_PE', 'goog.i18n.NumberFormatSymbols_rm', 'goog.i18n.NumberFormatSymbols_rm_CH', 'goog.i18n.NumberFormatSymbols_rn', 'goog.i18n.NumberFormatSymbols_rn_BI', 'goog.i18n.NumberFormatSymbols_ro_MD', 'goog.i18n.NumberFormatSymbols_ro_RO', 'goog.i18n.NumberFormatSymbols_rof', 'goog.i18n.NumberFormatSymbols_rof_TZ', 'goog.i18n.NumberFormatSymbols_ru_BY', 'goog.i18n.NumberFormatSymbols_ru_KG', 'goog.i18n.NumberFormatSymbols_ru_KZ', 'goog.i18n.NumberFormatSymbols_ru_MD', 'goog.i18n.NumberFormatSymbols_ru_RU', 'goog.i18n.NumberFormatSymbols_ru_UA', 'goog.i18n.NumberFormatSymbols_rw', 'goog.i18n.NumberFormatSymbols_rw_RW', 'goog.i18n.NumberFormatSymbols_rwk', 'goog.i18n.NumberFormatSymbols_rwk_TZ', 'goog.i18n.NumberFormatSymbols_sah', 'goog.i18n.NumberFormatSymbols_sah_RU', 'goog.i18n.NumberFormatSymbols_saq', 'goog.i18n.NumberFormatSymbols_saq_KE', 'goog.i18n.NumberFormatSymbols_sbp', 'goog.i18n.NumberFormatSymbols_sbp_TZ', 'goog.i18n.NumberFormatSymbols_se', 'goog.i18n.NumberFormatSymbols_se_FI', 'goog.i18n.NumberFormatSymbols_se_NO', 'goog.i18n.NumberFormatSymbols_se_SE', 'goog.i18n.NumberFormatSymbols_seh', 'goog.i18n.NumberFormatSymbols_seh_MZ', 'goog.i18n.NumberFormatSymbols_ses', 'goog.i18n.NumberFormatSymbols_ses_ML', 'goog.i18n.NumberFormatSymbols_sg', 'goog.i18n.NumberFormatSymbols_sg_CF', 'goog.i18n.NumberFormatSymbols_shi', 'goog.i18n.NumberFormatSymbols_shi_Latn', 'goog.i18n.NumberFormatSymbols_shi_Latn_MA', 'goog.i18n.NumberFormatSymbols_shi_Tfng', 'goog.i18n.NumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.NumberFormatSymbols_si_LK', 'goog.i18n.NumberFormatSymbols_sk_SK', 'goog.i18n.NumberFormatSymbols_sl_SI', 'goog.i18n.NumberFormatSymbols_smn', 'goog.i18n.NumberFormatSymbols_smn_FI', 'goog.i18n.NumberFormatSymbols_sn', 'goog.i18n.NumberFormatSymbols_sn_ZW', 'goog.i18n.NumberFormatSymbols_so', 'goog.i18n.NumberFormatSymbols_so_DJ', 'goog.i18n.NumberFormatSymbols_so_ET', 'goog.i18n.NumberFormatSymbols_so_KE', 'goog.i18n.NumberFormatSymbols_so_SO', 'goog.i18n.NumberFormatSymbols_sq_AL', 'goog.i18n.NumberFormatSymbols_sq_MK', 'goog.i18n.NumberFormatSymbols_sq_XK', 'goog.i18n.NumberFormatSymbols_sr_Cyrl', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.NumberFormatSymbols_sr_Latn_BA', 'goog.i18n.NumberFormatSymbols_sr_Latn_ME', 'goog.i18n.NumberFormatSymbols_sr_Latn_RS', 'goog.i18n.NumberFormatSymbols_sr_Latn_XK', 'goog.i18n.NumberFormatSymbols_sv_AX', 'goog.i18n.NumberFormatSymbols_sv_FI', 'goog.i18n.NumberFormatSymbols_sv_SE', 'goog.i18n.NumberFormatSymbols_sw_CD', 'goog.i18n.NumberFormatSymbols_sw_KE', 'goog.i18n.NumberFormatSymbols_sw_TZ', 'goog.i18n.NumberFormatSymbols_sw_UG', 'goog.i18n.NumberFormatSymbols_ta_IN', 'goog.i18n.NumberFormatSymbols_ta_LK', 'goog.i18n.NumberFormatSymbols_ta_MY', 'goog.i18n.NumberFormatSymbols_ta_SG', 'goog.i18n.NumberFormatSymbols_te_IN', 'goog.i18n.NumberFormatSymbols_teo', 'goog.i18n.NumberFormatSymbols_teo_KE', 'goog.i18n.NumberFormatSymbols_teo_UG', 'goog.i18n.NumberFormatSymbols_th_TH', 'goog.i18n.NumberFormatSymbols_ti', 'goog.i18n.NumberFormatSymbols_ti_ER', 'goog.i18n.NumberFormatSymbols_ti_ET', 'goog.i18n.NumberFormatSymbols_to', 'goog.i18n.NumberFormatSymbols_to_TO', 'goog.i18n.NumberFormatSymbols_tr_CY', 'goog.i18n.NumberFormatSymbols_tr_TR', 'goog.i18n.NumberFormatSymbols_twq', 'goog.i18n.NumberFormatSymbols_twq_NE', 'goog.i18n.NumberFormatSymbols_tzm', 'goog.i18n.NumberFormatSymbols_tzm_MA', 'goog.i18n.NumberFormatSymbols_ug', 'goog.i18n.NumberFormatSymbols_ug_CN', 'goog.i18n.NumberFormatSymbols_uk_UA', 'goog.i18n.NumberFormatSymbols_ur_IN', 'goog.i18n.NumberFormatSymbols_ur_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ur_PK', 'goog.i18n.NumberFormatSymbols_uz_Arab', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF_u_nu_latn', 'goog.i18n.NumberFormatSymbols_uz_Arab_u_nu_latn', 'goog.i18n.NumberFormatSymbols_uz_Cyrl', 'goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.NumberFormatSymbols_uz_Latn', 'goog.i18n.NumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.NumberFormatSymbols_vai', 'goog.i18n.NumberFormatSymbols_vai_Latn', 'goog.i18n.NumberFormatSymbols_vai_Latn_LR', 'goog.i18n.NumberFormatSymbols_vai_Vaii', 'goog.i18n.NumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.NumberFormatSymbols_vi_VN', 'goog.i18n.NumberFormatSymbols_vun', 'goog.i18n.NumberFormatSymbols_vun_TZ', 'goog.i18n.NumberFormatSymbols_wae', 'goog.i18n.NumberFormatSymbols_wae_CH', 'goog.i18n.NumberFormatSymbols_xog', 'goog.i18n.NumberFormatSymbols_xog_UG', 'goog.i18n.NumberFormatSymbols_yav', 'goog.i18n.NumberFormatSymbols_yav_CM', 'goog.i18n.NumberFormatSymbols_yi', 'goog.i18n.NumberFormatSymbols_yi_001', 'goog.i18n.NumberFormatSymbols_yo', 'goog.i18n.NumberFormatSymbols_yo_BJ', 'goog.i18n.NumberFormatSymbols_yo_NG', 'goog.i18n.NumberFormatSymbols_yue', 'goog.i18n.NumberFormatSymbols_yue_HK', 'goog.i18n.NumberFormatSymbols_zgh', 'goog.i18n.NumberFormatSymbols_zgh_MA', 'goog.i18n.NumberFormatSymbols_zh_Hans', 'goog.i18n.NumberFormatSymbols_zh_Hans_CN', 'goog.i18n.NumberFormatSymbols_zh_Hans_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_MO', 'goog.i18n.NumberFormatSymbols_zh_Hans_SG', 'goog.i18n.NumberFormatSymbols_zh_Hant', 'goog.i18n.NumberFormatSymbols_zh_Hant_HK', 'goog.i18n.NumberFormatSymbols_zh_Hant_MO', 'goog.i18n.NumberFormatSymbols_zh_Hant_TW', 'goog.i18n.NumberFormatSymbols_zu_ZA'], ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_u_nu_latn'], {});
+goog.addDependency('i18n/ordinalrules.js', ['goog.i18n.ordinalRules'], [], {});
+goog.addDependency('i18n/pluralrules.js', ['goog.i18n.pluralRules'], [], {});
+goog.addDependency('i18n/pluralrules_test.js', ['goog.i18n.pluralRulesTest'], ['goog.i18n.pluralRules', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/timezone.js', ['goog.i18n.TimeZone'], ['goog.array', 'goog.date.DateLike', 'goog.object', 'goog.string'], {});
+goog.addDependency('i18n/timezone_test.js', ['goog.i18n.TimeZoneTest'], ['goog.i18n.TimeZone', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/uchar.js', ['goog.i18n.uChar'], [], {});
+goog.addDependency('i18n/uchar/localnamefetcher.js', ['goog.i18n.uChar.LocalNameFetcher'], ['goog.i18n.uChar.NameFetcher', 'goog.i18n.uCharNames', 'goog.log'], {});
+goog.addDependency('i18n/uchar/localnamefetcher_test.js', ['goog.i18n.uChar.LocalNameFetcherTest'], ['goog.i18n.uChar.LocalNameFetcher', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('i18n/uchar/namefetcher.js', ['goog.i18n.uChar.NameFetcher'], [], {});
+goog.addDependency('i18n/uchar/remotenamefetcher.js', ['goog.i18n.uChar.RemoteNameFetcher'], ['goog.Disposable', 'goog.Uri', 'goog.events', 'goog.i18n.uChar', 'goog.i18n.uChar.NameFetcher', 'goog.log', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.structs.Map'], {});
+goog.addDependency('i18n/uchar/remotenamefetcher_test.js', ['goog.i18n.uChar.RemoteNameFetcherTest'], ['goog.i18n.uChar.RemoteNameFetcher', 'goog.net.XhrIo', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction'], {});
+goog.addDependency('i18n/uchar_test.js', ['goog.i18n.uCharTest'], ['goog.i18n.uChar', 'goog.testing.jsunit'], {});
+goog.addDependency('i18n/ucharnames.js', ['goog.i18n.uCharNames'], ['goog.i18n.uChar'], {});
+goog.addDependency('i18n/ucharnames_test.js', ['goog.i18n.uCharNamesTest'], ['goog.i18n.uCharNames', 'goog.testing.jsunit'], {});
+goog.addDependency('iter/es6.js', ['goog.iter.es6'], ['goog.iter.Iterable', 'goog.iter.Iterator', 'goog.iter.StopIteration'], {'lang': 'es6', 'module': 'goog'});
+goog.addDependency('iter/es6_test.js', ['goog.iter.es6Test'], ['goog.iter', 'goog.iter.es6', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});
+goog.addDependency('iter/iter.js', ['goog.iter', 'goog.iter.Iterable', 'goog.iter.Iterator', 'goog.iter.StopIteration'], ['goog.array', 'goog.asserts', 'goog.functions', 'goog.math'], {});
+goog.addDependency('iter/iter_test.js', ['goog.iterTest'], ['goog.iter', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.testing.jsunit'], {});
+goog.addDependency('json/evaljsonprocessor.js', ['goog.json.EvalJsonProcessor'], ['goog.json', 'goog.json.Processor', 'goog.json.Serializer'], {});
+goog.addDependency('json/hybrid.js', ['goog.json.hybrid'], ['goog.asserts', 'goog.json'], {});
+goog.addDependency('json/hybrid_test.js', ['goog.json.hybridTest'], ['goog.json', 'goog.json.hybrid', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('json/json.js', ['goog.json', 'goog.json.Replacer', 'goog.json.Reviver', 'goog.json.Serializer'], [], {});
+goog.addDependency('json/json_perf.js', ['goog.jsonPerf'], ['goog.dom', 'goog.json', 'goog.math', 'goog.string', 'goog.testing.PerformanceTable', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('json/json_test.js', ['goog.jsonTest'], ['goog.functions', 'goog.json', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('json/nativejsonprocessor.js', ['goog.json.NativeJsonProcessor'], ['goog.asserts', 'goog.json.Processor'], {});
+goog.addDependency('json/processor.js', ['goog.json.Processor'], ['goog.string.Parser', 'goog.string.Stringifier'], {});
+goog.addDependency('json/processor_test.js', ['goog.json.processorTest'], ['goog.json.EvalJsonProcessor', 'goog.json.NativeJsonProcessor', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('labs/dom/pagevisibilitymonitor.js', ['goog.labs.dom.PageVisibilityEvent', 'goog.labs.dom.PageVisibilityMonitor', 'goog.labs.dom.PageVisibilityState'], ['goog.dom', 'goog.dom.vendor', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.memoize'], {});
+goog.addDependency('labs/dom/pagevisibilitymonitor_test.js', ['goog.labs.dom.PageVisibilityMonitorTest'], ['goog.events', 'goog.functions', 'goog.labs.dom.PageVisibilityMonitor', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('labs/events/nondisposableeventtarget.js', ['goog.labs.events.NonDisposableEventTarget'], ['goog.array', 'goog.asserts', 'goog.events.Event', 'goog.events.Listenable', 'goog.events.ListenerMap', 'goog.object'], {});
+goog.addDependency('labs/events/nondisposableeventtarget_test.js', ['goog.labs.events.NonDisposableEventTargetTest'], ['goog.events.Listenable', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.labs.events.NonDisposableEventTarget', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/events/nondisposableeventtarget_via_googevents_test.js', ['goog.labs.events.NonDisposableEventTargetGoogEventsTest'], ['goog.events', 'goog.events.eventTargetTester', 'goog.events.eventTargetTester.KeyType', 'goog.events.eventTargetTester.UnlistenReturnType', 'goog.labs.events.NonDisposableEventTarget', 'goog.testing', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/events/touch.js', ['goog.labs.events.touch', 'goog.labs.events.touch.TouchData'], ['goog.array', 'goog.asserts', 'goog.events.EventType', 'goog.string'], {});
+goog.addDependency('labs/events/touch_test.js', ['goog.labs.events.touchTest'], ['goog.labs.events.touch', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/format/csv.js', ['goog.labs.format.csv', 'goog.labs.format.csv.ParseError', 'goog.labs.format.csv.Token'], ['goog.array', 'goog.asserts', 'goog.debug.Error', 'goog.object', 'goog.string', 'goog.string.newlines'], {});
+goog.addDependency('labs/format/csv_test.js', ['goog.labs.format.csvTest'], ['goog.labs.format.csv', 'goog.labs.format.csv.ParseError', 'goog.object', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/i18n/listformat.js', ['goog.labs.i18n.GenderInfo', 'goog.labs.i18n.GenderInfo.Gender', 'goog.labs.i18n.ListFormat'], ['goog.asserts', 'goog.labs.i18n.ListFormatSymbols'], {});
+goog.addDependency('labs/i18n/listformat_test.js', ['goog.labs.i18n.ListFormatTest'], ['goog.labs.i18n.GenderInfo', 'goog.labs.i18n.ListFormat', 'goog.labs.i18n.ListFormatSymbols', 'goog.labs.i18n.ListFormatSymbols_el', 'goog.labs.i18n.ListFormatSymbols_en', 'goog.labs.i18n.ListFormatSymbols_fr', 'goog.labs.i18n.ListFormatSymbols_ml', 'goog.labs.i18n.ListFormatSymbols_zu', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/i18n/listsymbols.js', ['goog.labs.i18n.ListFormatSymbols', 'goog.labs.i18n.ListFormatSymbols_af', 'goog.labs.i18n.ListFormatSymbols_am', 'goog.labs.i18n.ListFormatSymbols_ar', 'goog.labs.i18n.ListFormatSymbols_ar_DZ', 'goog.labs.i18n.ListFormatSymbols_az', 'goog.labs.i18n.ListFormatSymbols_be', 'goog.labs.i18n.ListFormatSymbols_bg', 'goog.labs.i18n.ListFormatSymbols_bn', 'goog.labs.i18n.ListFormatSymbols_br', 'goog.labs.i18n.ListFormatSymbols_bs', 'goog.labs.i18n.ListFormatSymbols_ca', 'goog.labs.i18n.ListFormatSymbols_chr', 'goog.labs.i18n.ListFormatSymbols_cs', 'goog.labs.i18n.ListFormatSymbols_cy', 'goog.labs.i18n.ListFormatSymbols_da', 'goog.labs.i18n.ListFormatSymbols_de', 'goog.labs.i18n.ListFormatSymbols_de_AT', 'goog.labs.i18n.ListFormatSymbols_de_CH', 'goog.labs.i18n.ListFormatSymbols_el', 'goog.labs.i18n.ListFormatSymbols_en', 'goog.labs.i18n.ListFormatSymbols_en_AU', 'goog.labs.i18n.ListFormatSymbols_en_CA', 'goog.labs.i18n.ListFormatSymbols_en_GB', 'goog.labs.i18n.ListFormatSymbols_en_IE', 'goog.labs.i18n.ListFormatSymbols_en_IN', 'goog.labs.i18n.ListFormatSymbols_en_SG', 'goog.labs.i18n.ListFormatSymbols_en_US', 'goog.labs.i18n.ListFormatSymbols_en_ZA', 'goog.labs.i18n.ListFormatSymbols_es', 'goog.labs.i18n.ListFormatSymbols_es_419', 'goog.labs.i18n.ListFormatSymbols_es_ES', 'goog.labs.i18n.ListFormatSymbols_es_MX', 'goog.labs.i18n.ListFormatSymbols_es_US', 'goog.labs.i18n.ListFormatSymbols_et', 'goog.labs.i18n.ListFormatSymbols_eu', 'goog.labs.i18n.ListFormatSymbols_fa', 'goog.labs.i18n.ListFormatSymbols_fi', 'goog.labs.i18n.ListFormatSymbols_fil', 'goog.labs.i18n.ListFormatSymbols_fr', 'goog.labs.i18n.ListFormatSymbols_fr_CA', 'goog.labs.i18n.ListFormatSymbols_ga', 'goog.labs.i18n.ListFormatSymbols_gl', 'goog.labs.i18n.ListFormatSymbols_gsw', 'goog.labs.i18n.ListFormatSymbols_gu', 'goog.labs.i18n.ListFormatSymbols_haw', 'goog.labs.i18n.ListFormatSymbols_he', 'goog.labs.i18n.ListFormatSymbols_hi', 'goog.labs.i18n.ListFormatSymbols_hr', 'goog.labs.i18n.ListFormatSymbols_hu', 'goog.labs.i18n.ListFormatSymbols_hy', 'goog.labs.i18n.ListFormatSymbols_id', 'goog.labs.i18n.ListFormatSymbols_in', 'goog.labs.i18n.ListFormatSymbols_is', 'goog.labs.i18n.ListFormatSymbols_it', 'goog.labs.i18n.ListFormatSymbols_iw', 'goog.labs.i18n.ListFormatSymbols_ja', 'goog.labs.i18n.ListFormatSymbols_ka', 'goog.labs.i18n.ListFormatSymbols_kk', 'goog.labs.i18n.ListFormatSymbols_km', 'goog.labs.i18n.ListFormatSymbols_kn', 'goog.labs.i18n.ListFormatSymbols_ko', 'goog.labs.i18n.ListFormatSymbols_ky', 'goog.labs.i18n.ListFormatSymbols_ln', 'goog.labs.i18n.ListFormatSymbols_lo', 'goog.labs.i18n.ListFormatSymbols_lt', 'goog.labs.i18n.ListFormatSymbols_lv', 'goog.labs.i18n.ListFormatSymbols_mk', 'goog.labs.i18n.ListFormatSymbols_ml', 'goog.labs.i18n.ListFormatSymbols_mn', 'goog.labs.i18n.ListFormatSymbols_mo', 'goog.labs.i18n.ListFormatSymbols_mr', 'goog.labs.i18n.ListFormatSymbols_ms', 'goog.labs.i18n.ListFormatSymbols_mt', 'goog.labs.i18n.ListFormatSymbols_my', 'goog.labs.i18n.ListFormatSymbols_nb', 'goog.labs.i18n.ListFormatSymbols_ne', 'goog.labs.i18n.ListFormatSymbols_nl', 'goog.labs.i18n.ListFormatSymbols_no', 'goog.labs.i18n.ListFormatSymbols_no_NO', 'goog.labs.i18n.ListFormatSymbols_or', 'goog.labs.i18n.ListFormatSymbols_pa', 'goog.labs.i18n.ListFormatSymbols_pl', 'goog.labs.i18n.ListFormatSymbols_pt', 'goog.labs.i18n.ListFormatSymbols_pt_BR', 'goog.labs.i18n.ListFormatSymbols_pt_PT', 'goog.labs.i18n.ListFormatSymbols_ro', 'goog.labs.i18n.ListFormatSymbols_ru', 'goog.labs.i18n.ListFormatSymbols_sh', 'goog.labs.i18n.ListFormatSymbols_si', 'goog.labs.i18n.ListFormatSymbols_sk', 'goog.labs.i18n.ListFormatSymbols_sl', 'goog.labs.i18n.ListFormatSymbols_sq', 'goog.labs.i18n.ListFormatSymbols_sr', 'goog.labs.i18n.ListFormatSymbols_sr_Latn', 'goog.labs.i18n.ListFormatSymbols_sv', 'goog.labs.i18n.ListFormatSymbols_sw', 'goog.labs.i18n.ListFormatSymbols_ta', 'goog.labs.i18n.ListFormatSymbols_te', 'goog.labs.i18n.ListFormatSymbols_th', 'goog.labs.i18n.ListFormatSymbols_tl', 'goog.labs.i18n.ListFormatSymbols_tr', 'goog.labs.i18n.ListFormatSymbols_uk', 'goog.labs.i18n.ListFormatSymbols_ur', 'goog.labs.i18n.ListFormatSymbols_uz', 'goog.labs.i18n.ListFormatSymbols_vi', 'goog.labs.i18n.ListFormatSymbols_zh', 'goog.labs.i18n.ListFormatSymbols_zh_CN', 'goog.labs.i18n.ListFormatSymbols_zh_HK', 'goog.labs.i18n.ListFormatSymbols_zh_TW', 'goog.labs.i18n.ListFormatSymbols_zu'], [], {});
+goog.addDependency('labs/i18n/listsymbolsext.js', ['goog.labs.i18n.ListFormatSymbolsExt', 'goog.labs.i18n.ListFormatSymbols_af_NA', 'goog.labs.i18n.ListFormatSymbols_af_ZA', 'goog.labs.i18n.ListFormatSymbols_agq', 'goog.labs.i18n.ListFormatSymbols_agq_CM', 'goog.labs.i18n.ListFormatSymbols_ak', 'goog.labs.i18n.ListFormatSymbols_ak_GH', 'goog.labs.i18n.ListFormatSymbols_am_ET', 'goog.labs.i18n.ListFormatSymbols_ar_001', 'goog.labs.i18n.ListFormatSymbols_ar_AE', 'goog.labs.i18n.ListFormatSymbols_ar_BH', 'goog.labs.i18n.ListFormatSymbols_ar_DJ', 'goog.labs.i18n.ListFormatSymbols_ar_EG', 'goog.labs.i18n.ListFormatSymbols_ar_EH', 'goog.labs.i18n.ListFormatSymbols_ar_ER', 'goog.labs.i18n.ListFormatSymbols_ar_IL', 'goog.labs.i18n.ListFormatSymbols_ar_IQ', 'goog.labs.i18n.ListFormatSymbols_ar_JO', 'goog.labs.i18n.ListFormatSymbols_ar_KM', 'goog.labs.i18n.ListFormatSymbols_ar_KW', 'goog.labs.i18n.ListFormatSymbols_ar_LB', 'goog.labs.i18n.ListFormatSymbols_ar_LY', 'goog.labs.i18n.ListFormatSymbols_ar_MA', 'goog.labs.i18n.ListFormatSymbols_ar_MR', 'goog.labs.i18n.ListFormatSymbols_ar_OM', 'goog.labs.i18n.ListFormatSymbols_ar_PS', 'goog.labs.i18n.ListFormatSymbols_ar_QA', 'goog.labs.i18n.ListFormatSymbols_ar_SA', 'goog.labs.i18n.ListFormatSymbols_ar_SD', 'goog.labs.i18n.ListFormatSymbols_ar_SO', 'goog.labs.i18n.ListFormatSymbols_ar_SS', 'goog.labs.i18n.ListFormatSymbols_ar_SY', 'goog.labs.i18n.ListFormatSymbols_ar_TD', 'goog.labs.i18n.ListFormatSymbols_ar_TN', 'goog.labs.i18n.ListFormatSymbols_ar_XB', 'goog.labs.i18n.ListFormatSymbols_ar_YE', 'goog.labs.i18n.ListFormatSymbols_as', 'goog.labs.i18n.ListFormatSymbols_as_IN', 'goog.labs.i18n.ListFormatSymbols_asa', 'goog.labs.i18n.ListFormatSymbols_asa_TZ', 'goog.labs.i18n.ListFormatSymbols_ast', 'goog.labs.i18n.ListFormatSymbols_ast_ES', 'goog.labs.i18n.ListFormatSymbols_az_Cyrl', 'goog.labs.i18n.ListFormatSymbols_az_Cyrl_AZ', 'goog.labs.i18n.ListFormatSymbols_az_Latn', 'goog.labs.i18n.ListFormatSymbols_az_Latn_AZ', 'goog.labs.i18n.ListFormatSymbols_bas', 'goog.labs.i18n.ListFormatSymbols_bas_CM', 'goog.labs.i18n.ListFormatSymbols_be_BY', 'goog.labs.i18n.ListFormatSymbols_bem', 'goog.labs.i18n.ListFormatSymbols_bem_ZM', 'goog.labs.i18n.ListFormatSymbols_bez', 'goog.labs.i18n.ListFormatSymbols_bez_TZ', 'goog.labs.i18n.ListFormatSymbols_bg_BG', 'goog.labs.i18n.ListFormatSymbols_bm', 'goog.labs.i18n.ListFormatSymbols_bm_ML', 'goog.labs.i18n.ListFormatSymbols_bn_BD', 'goog.labs.i18n.ListFormatSymbols_bn_IN', 'goog.labs.i18n.ListFormatSymbols_bo', 'goog.labs.i18n.ListFormatSymbols_bo_CN', 'goog.labs.i18n.ListFormatSymbols_bo_IN', 'goog.labs.i18n.ListFormatSymbols_br_FR', 'goog.labs.i18n.ListFormatSymbols_brx', 'goog.labs.i18n.ListFormatSymbols_brx_IN', 'goog.labs.i18n.ListFormatSymbols_bs_Cyrl', 'goog.labs.i18n.ListFormatSymbols_bs_Cyrl_BA', 'goog.labs.i18n.ListFormatSymbols_bs_Latn', 'goog.labs.i18n.ListFormatSymbols_bs_Latn_BA', 'goog.labs.i18n.ListFormatSymbols_ca_AD', 'goog.labs.i18n.ListFormatSymbols_ca_ES', 'goog.labs.i18n.ListFormatSymbols_ca_FR', 'goog.labs.i18n.ListFormatSymbols_ca_IT', 'goog.labs.i18n.ListFormatSymbols_ce', 'goog.labs.i18n.ListFormatSymbols_ce_RU', 'goog.labs.i18n.ListFormatSymbols_cgg', 'goog.labs.i18n.ListFormatSymbols_cgg_UG', 'goog.labs.i18n.ListFormatSymbols_chr_US', 'goog.labs.i18n.ListFormatSymbols_ckb', 'goog.labs.i18n.ListFormatSymbols_ckb_IQ', 'goog.labs.i18n.ListFormatSymbols_ckb_IR', 'goog.labs.i18n.ListFormatSymbols_cs_CZ', 'goog.labs.i18n.ListFormatSymbols_cy_GB', 'goog.labs.i18n.ListFormatSymbols_da_DK', 'goog.labs.i18n.ListFormatSymbols_da_GL', 'goog.labs.i18n.ListFormatSymbols_dav', 'goog.labs.i18n.ListFormatSymbols_dav_KE', 'goog.labs.i18n.ListFormatSymbols_de_BE', 'goog.labs.i18n.ListFormatSymbols_de_DE', 'goog.labs.i18n.ListFormatSymbols_de_IT', 'goog.labs.i18n.ListFormatSymbols_de_LI', 'goog.labs.i18n.ListFormatSymbols_de_LU', 'goog.labs.i18n.ListFormatSymbols_dje', 'goog.labs.i18n.ListFormatSymbols_dje_NE', 'goog.labs.i18n.ListFormatSymbols_dsb', 'goog.labs.i18n.ListFormatSymbols_dsb_DE', 'goog.labs.i18n.ListFormatSymbols_dua', 'goog.labs.i18n.ListFormatSymbols_dua_CM', 'goog.labs.i18n.ListFormatSymbols_dyo', 'goog.labs.i18n.ListFormatSymbols_dyo_SN', 'goog.labs.i18n.ListFormatSymbols_dz', 'goog.labs.i18n.ListFormatSymbols_dz_BT', 'goog.labs.i18n.ListFormatSymbols_ebu', 'goog.labs.i18n.ListFormatSymbols_ebu_KE', 'goog.labs.i18n.ListFormatSymbols_ee', 'goog.labs.i18n.ListFormatSymbols_ee_GH', 'goog.labs.i18n.ListFormatSymbols_ee_TG', 'goog.labs.i18n.ListFormatSymbols_el_CY', 'goog.labs.i18n.ListFormatSymbols_el_GR', 'goog.labs.i18n.ListFormatSymbols_en_001', 'goog.labs.i18n.ListFormatSymbols_en_150', 'goog.labs.i18n.ListFormatSymbols_en_AG', 'goog.labs.i18n.ListFormatSymbols_en_AI', 'goog.labs.i18n.ListFormatSymbols_en_AS', 'goog.labs.i18n.ListFormatSymbols_en_AT', 'goog.labs.i18n.ListFormatSymbols_en_BB', 'goog.labs.i18n.ListFormatSymbols_en_BE', 'goog.labs.i18n.ListFormatSymbols_en_BI', 'goog.labs.i18n.ListFormatSymbols_en_BM', 'goog.labs.i18n.ListFormatSymbols_en_BS', 'goog.labs.i18n.ListFormatSymbols_en_BW', 'goog.labs.i18n.ListFormatSymbols_en_BZ', 'goog.labs.i18n.ListFormatSymbols_en_CC', 'goog.labs.i18n.ListFormatSymbols_en_CH', 'goog.labs.i18n.ListFormatSymbols_en_CK', 'goog.labs.i18n.ListFormatSymbols_en_CM', 'goog.labs.i18n.ListFormatSymbols_en_CX', 'goog.labs.i18n.ListFormatSymbols_en_CY', 'goog.labs.i18n.ListFormatSymbols_en_DE', 'goog.labs.i18n.ListFormatSymbols_en_DG', 'goog.labs.i18n.ListFormatSymbols_en_DK', 'goog.labs.i18n.ListFormatSymbols_en_DM', 'goog.labs.i18n.ListFormatSymbols_en_ER', 'goog.labs.i18n.ListFormatSymbols_en_FI', 'goog.labs.i18n.ListFormatSymbols_en_FJ', 'goog.labs.i18n.ListFormatSymbols_en_FK', 'goog.labs.i18n.ListFormatSymbols_en_FM', 'goog.labs.i18n.ListFormatSymbols_en_GD', 'goog.labs.i18n.ListFormatSymbols_en_GG', 'goog.labs.i18n.ListFormatSymbols_en_GH', 'goog.labs.i18n.ListFormatSymbols_en_GI', 'goog.labs.i18n.ListFormatSymbols_en_GM', 'goog.labs.i18n.ListFormatSymbols_en_GU', 'goog.labs.i18n.ListFormatSymbols_en_GY', 'goog.labs.i18n.ListFormatSymbols_en_HK', 'goog.labs.i18n.ListFormatSymbols_en_IL', 'goog.labs.i18n.ListFormatSymbols_en_IM', 'goog.labs.i18n.ListFormatSymbols_en_IO', 'goog.labs.i18n.ListFormatSymbols_en_JE', 'goog.labs.i18n.ListFormatSymbols_en_JM', 'goog.labs.i18n.ListFormatSymbols_en_KE', 'goog.labs.i18n.ListFormatSymbols_en_KI', 'goog.labs.i18n.ListFormatSymbols_en_KN', 'goog.labs.i18n.ListFormatSymbols_en_KY', 'goog.labs.i18n.ListFormatSymbols_en_LC', 'goog.labs.i18n.ListFormatSymbols_en_LR', 'goog.labs.i18n.ListFormatSymbols_en_LS', 'goog.labs.i18n.ListFormatSymbols_en_MG', 'goog.labs.i18n.ListFormatSymbols_en_MH', 'goog.labs.i18n.ListFormatSymbols_en_MO', 'goog.labs.i18n.ListFormatSymbols_en_MP', 'goog.labs.i18n.ListFormatSymbols_en_MS', 'goog.labs.i18n.ListFormatSymbols_en_MT', 'goog.labs.i18n.ListFormatSymbols_en_MU', 'goog.labs.i18n.ListFormatSymbols_en_MW', 'goog.labs.i18n.ListFormatSymbols_en_MY', 'goog.labs.i18n.ListFormatSymbols_en_NA', 'goog.labs.i18n.ListFormatSymbols_en_NF', 'goog.labs.i18n.ListFormatSymbols_en_NG', 'goog.labs.i18n.ListFormatSymbols_en_NL', 'goog.labs.i18n.ListFormatSymbols_en_NR', 'goog.labs.i18n.ListFormatSymbols_en_NU', 'goog.labs.i18n.ListFormatSymbols_en_NZ', 'goog.labs.i18n.ListFormatSymbols_en_PG', 'goog.labs.i18n.ListFormatSymbols_en_PH', 'goog.labs.i18n.ListFormatSymbols_en_PK', 'goog.labs.i18n.ListFormatSymbols_en_PN', 'goog.labs.i18n.ListFormatSymbols_en_PR', 'goog.labs.i18n.ListFormatSymbols_en_PW', 'goog.labs.i18n.ListFormatSymbols_en_RW', 'goog.labs.i18n.ListFormatSymbols_en_SB', 'goog.labs.i18n.ListFormatSymbols_en_SC', 'goog.labs.i18n.ListFormatSymbols_en_SD', 'goog.labs.i18n.ListFormatSymbols_en_SE', 'goog.labs.i18n.ListFormatSymbols_en_SH', 'goog.labs.i18n.ListFormatSymbols_en_SI', 'goog.labs.i18n.ListFormatSymbols_en_SL', 'goog.labs.i18n.ListFormatSymbols_en_SS', 'goog.labs.i18n.ListFormatSymbols_en_SX', 'goog.labs.i18n.ListFormatSymbols_en_SZ', 'goog.labs.i18n.ListFormatSymbols_en_TC', 'goog.labs.i18n.ListFormatSymbols_en_TK', 'goog.labs.i18n.ListFormatSymbols_en_TO', 'goog.labs.i18n.ListFormatSymbols_en_TT', 'goog.labs.i18n.ListFormatSymbols_en_TV', 'goog.labs.i18n.ListFormatSymbols_en_TZ', 'goog.labs.i18n.ListFormatSymbols_en_UG', 'goog.labs.i18n.ListFormatSymbols_en_UM', 'goog.labs.i18n.ListFormatSymbols_en_US_POSIX', 'goog.labs.i18n.ListFormatSymbols_en_VC', 'goog.labs.i18n.ListFormatSymbols_en_VG', 'goog.labs.i18n.ListFormatSymbols_en_VI', 'goog.labs.i18n.ListFormatSymbols_en_VU', 'goog.labs.i18n.ListFormatSymbols_en_WS', 'goog.labs.i18n.ListFormatSymbols_en_XA', 'goog.labs.i18n.ListFormatSymbols_en_ZM', 'goog.labs.i18n.ListFormatSymbols_en_ZW', 'goog.labs.i18n.ListFormatSymbols_eo', 'goog.labs.i18n.ListFormatSymbols_es_AR', 'goog.labs.i18n.ListFormatSymbols_es_BO', 'goog.labs.i18n.ListFormatSymbols_es_BR', 'goog.labs.i18n.ListFormatSymbols_es_BZ', 'goog.labs.i18n.ListFormatSymbols_es_CL', 'goog.labs.i18n.ListFormatSymbols_es_CO', 'goog.labs.i18n.ListFormatSymbols_es_CR', 'goog.labs.i18n.ListFormatSymbols_es_CU', 'goog.labs.i18n.ListFormatSymbols_es_DO', 'goog.labs.i18n.ListFormatSymbols_es_EA', 'goog.labs.i18n.ListFormatSymbols_es_EC', 'goog.labs.i18n.ListFormatSymbols_es_GQ', 'goog.labs.i18n.ListFormatSymbols_es_GT', 'goog.labs.i18n.ListFormatSymbols_es_HN', 'goog.labs.i18n.ListFormatSymbols_es_IC', 'goog.labs.i18n.ListFormatSymbols_es_NI', 'goog.labs.i18n.ListFormatSymbols_es_PA', 'goog.labs.i18n.ListFormatSymbols_es_PE', 'goog.labs.i18n.ListFormatSymbols_es_PH', 'goog.labs.i18n.ListFormatSymbols_es_PR', 'goog.labs.i18n.ListFormatSymbols_es_PY', 'goog.labs.i18n.ListFormatSymbols_es_SV', 'goog.labs.i18n.ListFormatSymbols_es_UY', 'goog.labs.i18n.ListFormatSymbols_es_VE', 'goog.labs.i18n.ListFormatSymbols_et_EE', 'goog.labs.i18n.ListFormatSymbols_eu_ES', 'goog.labs.i18n.ListFormatSymbols_ewo', 'goog.labs.i18n.ListFormatSymbols_ewo_CM', 'goog.labs.i18n.ListFormatSymbols_fa_AF', 'goog.labs.i18n.ListFormatSymbols_fa_IR', 'goog.labs.i18n.ListFormatSymbols_ff', 'goog.labs.i18n.ListFormatSymbols_ff_CM', 'goog.labs.i18n.ListFormatSymbols_ff_GN', 'goog.labs.i18n.ListFormatSymbols_ff_MR', 'goog.labs.i18n.ListFormatSymbols_ff_SN', 'goog.labs.i18n.ListFormatSymbols_fi_FI', 'goog.labs.i18n.ListFormatSymbols_fil_PH', 'goog.labs.i18n.ListFormatSymbols_fo', 'goog.labs.i18n.ListFormatSymbols_fo_DK', 'goog.labs.i18n.ListFormatSymbols_fo_FO', 'goog.labs.i18n.ListFormatSymbols_fr_BE', 'goog.labs.i18n.ListFormatSymbols_fr_BF', 'goog.labs.i18n.ListFormatSymbols_fr_BI', 'goog.labs.i18n.ListFormatSymbols_fr_BJ', 'goog.labs.i18n.ListFormatSymbols_fr_BL', 'goog.labs.i18n.ListFormatSymbols_fr_CD', 'goog.labs.i18n.ListFormatSymbols_fr_CF', 'goog.labs.i18n.ListFormatSymbols_fr_CG', 'goog.labs.i18n.ListFormatSymbols_fr_CH', 'goog.labs.i18n.ListFormatSymbols_fr_CI', 'goog.labs.i18n.ListFormatSymbols_fr_CM', 'goog.labs.i18n.ListFormatSymbols_fr_DJ', 'goog.labs.i18n.ListFormatSymbols_fr_DZ', 'goog.labs.i18n.ListFormatSymbols_fr_FR', 'goog.labs.i18n.ListFormatSymbols_fr_GA', 'goog.labs.i18n.ListFormatSymbols_fr_GF', 'goog.labs.i18n.ListFormatSymbols_fr_GN', 'goog.labs.i18n.ListFormatSymbols_fr_GP', 'goog.labs.i18n.ListFormatSymbols_fr_GQ', 'goog.labs.i18n.ListFormatSymbols_fr_HT', 'goog.labs.i18n.ListFormatSymbols_fr_KM', 'goog.labs.i18n.ListFormatSymbols_fr_LU', 'goog.labs.i18n.ListFormatSymbols_fr_MA', 'goog.labs.i18n.ListFormatSymbols_fr_MC', 'goog.labs.i18n.ListFormatSymbols_fr_MF', 'goog.labs.i18n.ListFormatSymbols_fr_MG', 'goog.labs.i18n.ListFormatSymbols_fr_ML', 'goog.labs.i18n.ListFormatSymbols_fr_MQ', 'goog.labs.i18n.ListFormatSymbols_fr_MR', 'goog.labs.i18n.ListFormatSymbols_fr_MU', 'goog.labs.i18n.ListFormatSymbols_fr_NC', 'goog.labs.i18n.ListFormatSymbols_fr_NE', 'goog.labs.i18n.ListFormatSymbols_fr_PF', 'goog.labs.i18n.ListFormatSymbols_fr_PM', 'goog.labs.i18n.ListFormatSymbols_fr_RE', 'goog.labs.i18n.ListFormatSymbols_fr_RW', 'goog.labs.i18n.ListFormatSymbols_fr_SC', 'goog.labs.i18n.ListFormatSymbols_fr_SN', 'goog.labs.i18n.ListFormatSymbols_fr_SY', 'goog.labs.i18n.ListFormatSymbols_fr_TD', 'goog.labs.i18n.ListFormatSymbols_fr_TG', 'goog.labs.i18n.ListFormatSymbols_fr_TN', 'goog.labs.i18n.ListFormatSymbols_fr_VU', 'goog.labs.i18n.ListFormatSymbols_fr_WF', 'goog.labs.i18n.ListFormatSymbols_fr_YT', 'goog.labs.i18n.ListFormatSymbols_fur', 'goog.labs.i18n.ListFormatSymbols_fur_IT', 'goog.labs.i18n.ListFormatSymbols_fy', 'goog.labs.i18n.ListFormatSymbols_fy_NL', 'goog.labs.i18n.ListFormatSymbols_ga_IE', 'goog.labs.i18n.ListFormatSymbols_gd', 'goog.labs.i18n.ListFormatSymbols_gd_GB', 'goog.labs.i18n.ListFormatSymbols_gl_ES', 'goog.labs.i18n.ListFormatSymbols_gsw_CH', 'goog.labs.i18n.ListFormatSymbols_gsw_FR', 'goog.labs.i18n.ListFormatSymbols_gsw_LI', 'goog.labs.i18n.ListFormatSymbols_gu_IN', 'goog.labs.i18n.ListFormatSymbols_guz', 'goog.labs.i18n.ListFormatSymbols_guz_KE', 'goog.labs.i18n.ListFormatSymbols_gv', 'goog.labs.i18n.ListFormatSymbols_gv_IM', 'goog.labs.i18n.ListFormatSymbols_ha', 'goog.labs.i18n.ListFormatSymbols_ha_GH', 'goog.labs.i18n.ListFormatSymbols_ha_NE', 'goog.labs.i18n.ListFormatSymbols_ha_NG', 'goog.labs.i18n.ListFormatSymbols_haw_US', 'goog.labs.i18n.ListFormatSymbols_he_IL', 'goog.labs.i18n.ListFormatSymbols_hi_IN', 'goog.labs.i18n.ListFormatSymbols_hr_BA', 'goog.labs.i18n.ListFormatSymbols_hr_HR', 'goog.labs.i18n.ListFormatSymbols_hsb', 'goog.labs.i18n.ListFormatSymbols_hsb_DE', 'goog.labs.i18n.ListFormatSymbols_hu_HU', 'goog.labs.i18n.ListFormatSymbols_hy_AM', 'goog.labs.i18n.ListFormatSymbols_id_ID', 'goog.labs.i18n.ListFormatSymbols_ig', 'goog.labs.i18n.ListFormatSymbols_ig_NG', 'goog.labs.i18n.ListFormatSymbols_ii', 'goog.labs.i18n.ListFormatSymbols_ii_CN', 'goog.labs.i18n.ListFormatSymbols_is_IS', 'goog.labs.i18n.ListFormatSymbols_it_CH', 'goog.labs.i18n.ListFormatSymbols_it_IT', 'goog.labs.i18n.ListFormatSymbols_it_SM', 'goog.labs.i18n.ListFormatSymbols_it_VA', 'goog.labs.i18n.ListFormatSymbols_ja_JP', 'goog.labs.i18n.ListFormatSymbols_jgo', 'goog.labs.i18n.ListFormatSymbols_jgo_CM', 'goog.labs.i18n.ListFormatSymbols_jmc', 'goog.labs.i18n.ListFormatSymbols_jmc_TZ', 'goog.labs.i18n.ListFormatSymbols_ka_GE', 'goog.labs.i18n.ListFormatSymbols_kab', 'goog.labs.i18n.ListFormatSymbols_kab_DZ', 'goog.labs.i18n.ListFormatSymbols_kam', 'goog.labs.i18n.ListFormatSymbols_kam_KE', 'goog.labs.i18n.ListFormatSymbols_kde', 'goog.labs.i18n.ListFormatSymbols_kde_TZ', 'goog.labs.i18n.ListFormatSymbols_kea', 'goog.labs.i18n.ListFormatSymbols_kea_CV', 'goog.labs.i18n.ListFormatSymbols_khq', 'goog.labs.i18n.ListFormatSymbols_khq_ML', 'goog.labs.i18n.ListFormatSymbols_ki', 'goog.labs.i18n.ListFormatSymbols_ki_KE', 'goog.labs.i18n.ListFormatSymbols_kk_KZ', 'goog.labs.i18n.ListFormatSymbols_kkj', 'goog.labs.i18n.ListFormatSymbols_kkj_CM', 'goog.labs.i18n.ListFormatSymbols_kl', 'goog.labs.i18n.ListFormatSymbols_kl_GL', 'goog.labs.i18n.ListFormatSymbols_kln', 'goog.labs.i18n.ListFormatSymbols_kln_KE', 'goog.labs.i18n.ListFormatSymbols_km_KH', 'goog.labs.i18n.ListFormatSymbols_kn_IN', 'goog.labs.i18n.ListFormatSymbols_ko_KP', 'goog.labs.i18n.ListFormatSymbols_ko_KR', 'goog.labs.i18n.ListFormatSymbols_kok', 'goog.labs.i18n.ListFormatSymbols_kok_IN', 'goog.labs.i18n.ListFormatSymbols_ks', 'goog.labs.i18n.ListFormatSymbols_ks_IN', 'goog.labs.i18n.ListFormatSymbols_ksb', 'goog.labs.i18n.ListFormatSymbols_ksb_TZ', 'goog.labs.i18n.ListFormatSymbols_ksf', 'goog.labs.i18n.ListFormatSymbols_ksf_CM', 'goog.labs.i18n.ListFormatSymbols_ksh', 'goog.labs.i18n.ListFormatSymbols_ksh_DE', 'goog.labs.i18n.ListFormatSymbols_kw', 'goog.labs.i18n.ListFormatSymbols_kw_GB', 'goog.labs.i18n.ListFormatSymbols_ky_KG', 'goog.labs.i18n.ListFormatSymbols_lag', 'goog.labs.i18n.ListFormatSymbols_lag_TZ', 'goog.labs.i18n.ListFormatSymbols_lb', 'goog.labs.i18n.ListFormatSymbols_lb_LU', 'goog.labs.i18n.ListFormatSymbols_lg', 'goog.labs.i18n.ListFormatSymbols_lg_UG', 'goog.labs.i18n.ListFormatSymbols_lkt', 'goog.labs.i18n.ListFormatSymbols_lkt_US', 'goog.labs.i18n.ListFormatSymbols_ln_AO', 'goog.labs.i18n.ListFormatSymbols_ln_CD', 'goog.labs.i18n.ListFormatSymbols_ln_CF', 'goog.labs.i18n.ListFormatSymbols_ln_CG', 'goog.labs.i18n.ListFormatSymbols_lo_LA', 'goog.labs.i18n.ListFormatSymbols_lrc', 'goog.labs.i18n.ListFormatSymbols_lrc_IQ', 'goog.labs.i18n.ListFormatSymbols_lrc_IR', 'goog.labs.i18n.ListFormatSymbols_lt_LT', 'goog.labs.i18n.ListFormatSymbols_lu', 'goog.labs.i18n.ListFormatSymbols_lu_CD', 'goog.labs.i18n.ListFormatSymbols_luo', 'goog.labs.i18n.ListFormatSymbols_luo_KE', 'goog.labs.i18n.ListFormatSymbols_luy', 'goog.labs.i18n.ListFormatSymbols_luy_KE', 'goog.labs.i18n.ListFormatSymbols_lv_LV', 'goog.labs.i18n.ListFormatSymbols_mas', 'goog.labs.i18n.ListFormatSymbols_mas_KE', 'goog.labs.i18n.ListFormatSymbols_mas_TZ', 'goog.labs.i18n.ListFormatSymbols_mer', 'goog.labs.i18n.ListFormatSymbols_mer_KE', 'goog.labs.i18n.ListFormatSymbols_mfe', 'goog.labs.i18n.ListFormatSymbols_mfe_MU', 'goog.labs.i18n.ListFormatSymbols_mg', 'goog.labs.i18n.ListFormatSymbols_mg_MG', 'goog.labs.i18n.ListFormatSymbols_mgh', 'goog.labs.i18n.ListFormatSymbols_mgh_MZ', 'goog.labs.i18n.ListFormatSymbols_mgo', 'goog.labs.i18n.ListFormatSymbols_mgo_CM', 'goog.labs.i18n.ListFormatSymbols_mk_MK', 'goog.labs.i18n.ListFormatSymbols_ml_IN', 'goog.labs.i18n.ListFormatSymbols_mn_MN', 'goog.labs.i18n.ListFormatSymbols_mr_IN', 'goog.labs.i18n.ListFormatSymbols_ms_BN', 'goog.labs.i18n.ListFormatSymbols_ms_MY', 'goog.labs.i18n.ListFormatSymbols_ms_SG', 'goog.labs.i18n.ListFormatSymbols_mt_MT', 'goog.labs.i18n.ListFormatSymbols_mua', 'goog.labs.i18n.ListFormatSymbols_mua_CM', 'goog.labs.i18n.ListFormatSymbols_my_MM', 'goog.labs.i18n.ListFormatSymbols_mzn', 'goog.labs.i18n.ListFormatSymbols_mzn_IR', 'goog.labs.i18n.ListFormatSymbols_naq', 'goog.labs.i18n.ListFormatSymbols_naq_NA', 'goog.labs.i18n.ListFormatSymbols_nb_NO', 'goog.labs.i18n.ListFormatSymbols_nb_SJ', 'goog.labs.i18n.ListFormatSymbols_nd', 'goog.labs.i18n.ListFormatSymbols_nd_ZW', 'goog.labs.i18n.ListFormatSymbols_nds', 'goog.labs.i18n.ListFormatSymbols_nds_DE', 'goog.labs.i18n.ListFormatSymbols_nds_NL', 'goog.labs.i18n.ListFormatSymbols_ne_IN', 'goog.labs.i18n.ListFormatSymbols_ne_NP', 'goog.labs.i18n.ListFormatSymbols_nl_AW', 'goog.labs.i18n.ListFormatSymbols_nl_BE', 'goog.labs.i18n.ListFormatSymbols_nl_BQ', 'goog.labs.i18n.ListFormatSymbols_nl_CW', 'goog.labs.i18n.ListFormatSymbols_nl_NL', 'goog.labs.i18n.ListFormatSymbols_nl_SR', 'goog.labs.i18n.ListFormatSymbols_nl_SX', 'goog.labs.i18n.ListFormatSymbols_nmg', 'goog.labs.i18n.ListFormatSymbols_nmg_CM', 'goog.labs.i18n.ListFormatSymbols_nn', 'goog.labs.i18n.ListFormatSymbols_nn_NO', 'goog.labs.i18n.ListFormatSymbols_nnh', 'goog.labs.i18n.ListFormatSymbols_nnh_CM', 'goog.labs.i18n.ListFormatSymbols_nus', 'goog.labs.i18n.ListFormatSymbols_nus_SS', 'goog.labs.i18n.ListFormatSymbols_nyn', 'goog.labs.i18n.ListFormatSymbols_nyn_UG', 'goog.labs.i18n.ListFormatSymbols_om', 'goog.labs.i18n.ListFormatSymbols_om_ET', 'goog.labs.i18n.ListFormatSymbols_om_KE', 'goog.labs.i18n.ListFormatSymbols_or_IN', 'goog.labs.i18n.ListFormatSymbols_os', 'goog.labs.i18n.ListFormatSymbols_os_GE', 'goog.labs.i18n.ListFormatSymbols_os_RU', 'goog.labs.i18n.ListFormatSymbols_pa_Arab', 'goog.labs.i18n.ListFormatSymbols_pa_Arab_PK', 'goog.labs.i18n.ListFormatSymbols_pa_Guru', 'goog.labs.i18n.ListFormatSymbols_pa_Guru_IN', 'goog.labs.i18n.ListFormatSymbols_pl_PL', 'goog.labs.i18n.ListFormatSymbols_ps', 'goog.labs.i18n.ListFormatSymbols_ps_AF', 'goog.labs.i18n.ListFormatSymbols_pt_AO', 'goog.labs.i18n.ListFormatSymbols_pt_CH', 'goog.labs.i18n.ListFormatSymbols_pt_CV', 'goog.labs.i18n.ListFormatSymbols_pt_GQ', 'goog.labs.i18n.ListFormatSymbols_pt_GW', 'goog.labs.i18n.ListFormatSymbols_pt_LU', 'goog.labs.i18n.ListFormatSymbols_pt_MO', 'goog.labs.i18n.ListFormatSymbols_pt_MZ', 'goog.labs.i18n.ListFormatSymbols_pt_ST', 'goog.labs.i18n.ListFormatSymbols_pt_TL', 'goog.labs.i18n.ListFormatSymbols_qu', 'goog.labs.i18n.ListFormatSymbols_qu_BO', 'goog.labs.i18n.ListFormatSymbols_qu_EC', 'goog.labs.i18n.ListFormatSymbols_qu_PE', 'goog.labs.i18n.ListFormatSymbols_rm', 'goog.labs.i18n.ListFormatSymbols_rm_CH', 'goog.labs.i18n.ListFormatSymbols_rn', 'goog.labs.i18n.ListFormatSymbols_rn_BI', 'goog.labs.i18n.ListFormatSymbols_ro_MD', 'goog.labs.i18n.ListFormatSymbols_ro_RO', 'goog.labs.i18n.ListFormatSymbols_rof', 'goog.labs.i18n.ListFormatSymbols_rof_TZ', 'goog.labs.i18n.ListFormatSymbols_ru_BY', 'goog.labs.i18n.ListFormatSymbols_ru_KG', 'goog.labs.i18n.ListFormatSymbols_ru_KZ', 'goog.labs.i18n.ListFormatSymbols_ru_MD', 'goog.labs.i18n.ListFormatSymbols_ru_RU', 'goog.labs.i18n.ListFormatSymbols_ru_UA', 'goog.labs.i18n.ListFormatSymbols_rw', 'goog.labs.i18n.ListFormatSymbols_rw_RW', 'goog.labs.i18n.ListFormatSymbols_rwk', 'goog.labs.i18n.ListFormatSymbols_rwk_TZ', 'goog.labs.i18n.ListFormatSymbols_sah', 'goog.labs.i18n.ListFormatSymbols_sah_RU', 'goog.labs.i18n.ListFormatSymbols_saq', 'goog.labs.i18n.ListFormatSymbols_saq_KE', 'goog.labs.i18n.ListFormatSymbols_sbp', 'goog.labs.i18n.ListFormatSymbols_sbp_TZ', 'goog.labs.i18n.ListFormatSymbols_se', 'goog.labs.i18n.ListFormatSymbols_se_FI', 'goog.labs.i18n.ListFormatSymbols_se_NO', 'goog.labs.i18n.ListFormatSymbols_se_SE', 'goog.labs.i18n.ListFormatSymbols_seh', 'goog.labs.i18n.ListFormatSymbols_seh_MZ', 'goog.labs.i18n.ListFormatSymbols_ses', 'goog.labs.i18n.ListFormatSymbols_ses_ML', 'goog.labs.i18n.ListFormatSymbols_sg', 'goog.labs.i18n.ListFormatSymbols_sg_CF', 'goog.labs.i18n.ListFormatSymbols_shi', 'goog.labs.i18n.ListFormatSymbols_shi_Latn', 'goog.labs.i18n.ListFormatSymbols_shi_Latn_MA', 'goog.labs.i18n.ListFormatSymbols_shi_Tfng', 'goog.labs.i18n.ListFormatSymbols_shi_Tfng_MA', 'goog.labs.i18n.ListFormatSymbols_si_LK', 'goog.labs.i18n.ListFormatSymbols_sk_SK', 'goog.labs.i18n.ListFormatSymbols_sl_SI', 'goog.labs.i18n.ListFormatSymbols_smn', 'goog.labs.i18n.ListFormatSymbols_smn_FI', 'goog.labs.i18n.ListFormatSymbols_sn', 'goog.labs.i18n.ListFormatSymbols_sn_ZW', 'goog.labs.i18n.ListFormatSymbols_so', 'goog.labs.i18n.ListFormatSymbols_so_DJ', 'goog.labs.i18n.ListFormatSymbols_so_ET', 'goog.labs.i18n.ListFormatSymbols_so_KE', 'goog.labs.i18n.ListFormatSymbols_so_SO', 'goog.labs.i18n.ListFormatSymbols_sq_AL', 'goog.labs.i18n.ListFormatSymbols_sq_MK', 'goog.labs.i18n.ListFormatSymbols_sq_XK', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_BA', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_ME', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_RS', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_XK', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_BA', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_ME', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_RS', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_XK', 'goog.labs.i18n.ListFormatSymbols_sv_AX', 'goog.labs.i18n.ListFormatSymbols_sv_FI', 'goog.labs.i18n.ListFormatSymbols_sv_SE', 'goog.labs.i18n.ListFormatSymbols_sw_CD', 'goog.labs.i18n.ListFormatSymbols_sw_KE', 'goog.labs.i18n.ListFormatSymbols_sw_TZ', 'goog.labs.i18n.ListFormatSymbols_sw_UG', 'goog.labs.i18n.ListFormatSymbols_ta_IN', 'goog.labs.i18n.ListFormatSymbols_ta_LK', 'goog.labs.i18n.ListFormatSymbols_ta_MY', 'goog.labs.i18n.ListFormatSymbols_ta_SG', 'goog.labs.i18n.ListFormatSymbols_te_IN', 'goog.labs.i18n.ListFormatSymbols_teo', 'goog.labs.i18n.ListFormatSymbols_teo_KE', 'goog.labs.i18n.ListFormatSymbols_teo_UG', 'goog.labs.i18n.ListFormatSymbols_th_TH', 'goog.labs.i18n.ListFormatSymbols_ti', 'goog.labs.i18n.ListFormatSymbols_ti_ER', 'goog.labs.i18n.ListFormatSymbols_ti_ET', 'goog.labs.i18n.ListFormatSymbols_to', 'goog.labs.i18n.ListFormatSymbols_to_TO', 'goog.labs.i18n.ListFormatSymbols_tr_CY', 'goog.labs.i18n.ListFormatSymbols_tr_TR', 'goog.labs.i18n.ListFormatSymbols_twq', 'goog.labs.i18n.ListFormatSymbols_twq_NE', 'goog.labs.i18n.ListFormatSymbols_tzm', 'goog.labs.i18n.ListFormatSymbols_tzm_MA', 'goog.labs.i18n.ListFormatSymbols_ug', 'goog.labs.i18n.ListFormatSymbols_ug_CN', 'goog.labs.i18n.ListFormatSymbols_uk_UA', 'goog.labs.i18n.ListFormatSymbols_ur_IN', 'goog.labs.i18n.ListFormatSymbols_ur_PK', 'goog.labs.i18n.ListFormatSymbols_uz_Arab', 'goog.labs.i18n.ListFormatSymbols_uz_Arab_AF', 'goog.labs.i18n.ListFormatSymbols_uz_Cyrl', 'goog.labs.i18n.ListFormatSymbols_uz_Cyrl_UZ', 'goog.labs.i18n.ListFormatSymbols_uz_Latn', 'goog.labs.i18n.ListFormatSymbols_uz_Latn_UZ', 'goog.labs.i18n.ListFormatSymbols_vai', 'goog.labs.i18n.ListFormatSymbols_vai_Latn', 'goog.labs.i18n.ListFormatSymbols_vai_Latn_LR', 'goog.labs.i18n.ListFormatSymbols_vai_Vaii', 'goog.labs.i18n.ListFormatSymbols_vai_Vaii_LR', 'goog.labs.i18n.ListFormatSymbols_vi_VN', 'goog.labs.i18n.ListFormatSymbols_vun', 'goog.labs.i18n.ListFormatSymbols_vun_TZ', 'goog.labs.i18n.ListFormatSymbols_wae', 'goog.labs.i18n.ListFormatSymbols_wae_CH', 'goog.labs.i18n.ListFormatSymbols_xog', 'goog.labs.i18n.ListFormatSymbols_xog_UG', 'goog.labs.i18n.ListFormatSymbols_yav', 'goog.labs.i18n.ListFormatSymbols_yav_CM', 'goog.labs.i18n.ListFormatSymbols_yi', 'goog.labs.i18n.ListFormatSymbols_yi_001', 'goog.labs.i18n.ListFormatSymbols_yo', 'goog.labs.i18n.ListFormatSymbols_yo_BJ', 'goog.labs.i18n.ListFormatSymbols_yo_NG', 'goog.labs.i18n.ListFormatSymbols_yue', 'goog.labs.i18n.ListFormatSymbols_yue_HK', 'goog.labs.i18n.ListFormatSymbols_zgh', 'goog.labs.i18n.ListFormatSymbols_zgh_MA', 'goog.labs.i18n.ListFormatSymbols_zh_Hans', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_CN', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_HK', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_MO', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_SG', 'goog.labs.i18n.ListFormatSymbols_zh_Hant', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_HK', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_MO', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_TW', 'goog.labs.i18n.ListFormatSymbols_zu_ZA'], ['goog.labs.i18n.ListFormatSymbols'], {});
+goog.addDependency('labs/iterable/iterable.js', ['goog.labs.iterable'], [], {'module': 'goog'});
+goog.addDependency('labs/iterable/iterable_test.js', ['goog.labs.iterableTest'], ['goog.labs.iterable', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('labs/mock/mock.js', ['goog.labs.mock', 'goog.labs.mock.VerificationError'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.Error', 'goog.functions', 'goog.labs.mock.verification', 'goog.labs.mock.verification.VerificationMode', 'goog.object'], {});
+goog.addDependency('labs/mock/mock_test.js', ['goog.labs.mockTest'], ['goog.array', 'goog.labs.mock', 'goog.labs.mock.VerificationError', 'goog.labs.testing.AnythingMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.string', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/mock/verificationmode.js', ['goog.labs.mock.verification', 'goog.labs.mock.verification.VerificationMode'], [], {});
+goog.addDependency('labs/mock/verificationmode_test.js', ['goog.labs.mock.VerificationModeTest'], ['goog.labs.mock.verification', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('labs/net/image.js', ['goog.labs.net.image'], ['goog.Promise', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.net.EventType', 'goog.userAgent'], {});
+goog.addDependency('labs/net/image_test.js', ['goog.labs.net.imageTest'], ['goog.labs.net.image', 'goog.string', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('labs/net/webchannel.js', ['goog.net.WebChannel'], ['goog.events', 'goog.events.Event'], {});
+goog.addDependency('labs/net/webchannel/basetestchannel.js', ['goog.labs.net.webChannel.BaseTestChannel'], ['goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.net.WebChannel'], {});
+goog.addDependency('labs/net/webchannel/channel.js', ['goog.labs.net.webChannel.Channel'], [], {});
+goog.addDependency('labs/net/webchannel/channelrequest.js', ['goog.labs.net.webChannel.ChannelRequest'], ['goog.Timer', 'goog.async.Throttle', 'goog.events.EventHandler', 'goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.userAgent'], {});
+goog.addDependency('labs/net/webchannel/channelrequest_test.js', ['goog.labs.net.webChannel.channelRequestTest'], ['goog.Uri', 'goog.functions', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction'], {});
+goog.addDependency('labs/net/webchannel/connectionstate.js', ['goog.labs.net.webChannel.ConnectionState'], [], {});
+goog.addDependency('labs/net/webchannel/forwardchannelrequestpool.js', ['goog.labs.net.webChannel.ForwardChannelRequestPool'], ['goog.array', 'goog.string', 'goog.structs.Set'], {});
+goog.addDependency('labs/net/webchannel/forwardchannelrequestpool_test.js', ['goog.labs.net.webChannel.forwardChannelRequestPoolTest'], ['goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/net/webchannel/netutils.js', ['goog.labs.net.webChannel.netUtils'], ['goog.Uri', 'goog.labs.net.webChannel.WebChannelDebug'], {});
+goog.addDependency('labs/net/webchannel/requeststats.js', ['goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Event', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.labs.net.webChannel.requestStats.ServerReachabilityEvent', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.labs.net.webChannel.requestStats.StatEvent', 'goog.labs.net.webChannel.requestStats.TimingEvent'], ['goog.events.Event', 'goog.events.EventTarget'], {});
+goog.addDependency('labs/net/webchannel/webchannelbase.js', ['goog.labs.net.webChannel.WebChannelBase'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.async.run', 'goog.debug.TextFormatter', 'goog.json', 'goog.labs.net.webChannel.BaseTestChannel', 'goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ConnectionState', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.Wire', 'goog.labs.net.webChannel.WireV8', 'goog.labs.net.webChannel.netUtils', 'goog.labs.net.webChannel.requestStats', 'goog.log', 'goog.net.WebChannel', 'goog.net.XhrIo', 'goog.net.rpc.HttpCors', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.CircularBuffer'], {});
+goog.addDependency('labs/net/webchannel/webchannelbase_test.js', ['goog.labs.net.webChannel.webChannelBaseTest'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.functions', 'goog.json', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.labs.net.webChannel.WebChannelBase', 'goog.labs.net.webChannel.WebChannelBaseTransport', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.Wire', 'goog.labs.net.webChannel.netUtils', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/net/webchannel/webchannelbasetransport.js', ['goog.labs.net.webChannel.WebChannelBaseTransport'], ['goog.asserts', 'goog.events.EventTarget', 'goog.json', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelBase', 'goog.log', 'goog.net.WebChannel', 'goog.net.WebChannelTransport', 'goog.object', 'goog.string', 'goog.string.path'], {});
+goog.addDependency('labs/net/webchannel/webchannelbasetransport_test.js', ['goog.labs.net.webChannel.webChannelBaseTransportTest'], ['goog.events', 'goog.functions', 'goog.json', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelBase', 'goog.labs.net.webChannel.WebChannelBaseTransport', 'goog.net.WebChannel', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/net/webchannel/webchanneldebug.js', ['goog.labs.net.webChannel.WebChannelDebug'], ['goog.json', 'goog.log'], {});
+goog.addDependency('labs/net/webchannel/wire.js', ['goog.labs.net.webChannel.Wire'], [], {});
+goog.addDependency('labs/net/webchannel/wirev8.js', ['goog.labs.net.webChannel.WireV8'], ['goog.asserts', 'goog.json', 'goog.json.NativeJsonProcessor', 'goog.labs.net.webChannel.Wire', 'goog.structs'], {});
+goog.addDependency('labs/net/webchannel/wirev8_test.js', ['goog.labs.net.webChannel.WireV8Test'], ['goog.labs.net.webChannel.WireV8', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/net/webchanneltransport.js', ['goog.net.WebChannelTransport'], [], {});
+goog.addDependency('labs/net/webchanneltransportfactory.js', ['goog.net.createWebChannelTransport'], ['goog.functions', 'goog.labs.net.webChannel.WebChannelBaseTransport'], {});
+goog.addDependency('labs/net/xhr.js', ['goog.labs.net.xhr', 'goog.labs.net.xhr.Error', 'goog.labs.net.xhr.HttpError', 'goog.labs.net.xhr.Options', 'goog.labs.net.xhr.PostData', 'goog.labs.net.xhr.ResponseType', 'goog.labs.net.xhr.TimeoutError'], ['goog.Promise', 'goog.asserts', 'goog.debug.Error', 'goog.json', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.uri.utils', 'goog.userAgent'], {});
+goog.addDependency('labs/net/xhr_test.js', ['goog.labs.net.xhrTest'], ['goog.Promise', 'goog.events', 'goog.events.EventType', 'goog.labs.net.xhr', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XhrLike', 'goog.net.XmlHttp', 'goog.testing.MockClock', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('labs/promise/promise.js', ['goog.labs.promise'], ['goog.Promise'], {'module': 'goog'});
+goog.addDependency('labs/promise/promise_test.js', ['goog.labs.promiseTest'], ['goog.Promise', 'goog.Timer', 'goog.labs.promise', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('labs/pubsub/broadcastpubsub.js', ['goog.labs.pubsub.BroadcastPubSub'], ['goog.Disposable', 'goog.Timer', 'goog.array', 'goog.async.run', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.math', 'goog.pubsub.PubSub', 'goog.storage.Storage', 'goog.storage.mechanism.HTML5LocalStorage', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('labs/pubsub/broadcastpubsub_test.js', ['goog.labs.pubsub.BroadcastPubSubTest'], ['goog.array', 'goog.debug.Logger', 'goog.json', 'goog.labs.pubsub.BroadcastPubSub', 'goog.storage.Storage', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('labs/storage/boundedcollectablestorage.js', ['goog.labs.storage.BoundedCollectableStorage'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.storage.CollectableStorage', 'goog.storage.ErrorCode', 'goog.storage.ExpiringStorage'], {});
+goog.addDependency('labs/storage/boundedcollectablestorage_test.js', ['goog.labs.storage.BoundedCollectableStorageTest'], ['goog.labs.storage.BoundedCollectableStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storageTester', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('labs/structs/map.js', ['goog.labs.structs.Map'], ['goog.array', 'goog.asserts', 'goog.object'], {});
+goog.addDependency('labs/structs/map_perf.js', ['goog.labs.structs.MapPerf'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.labs.structs.Map', 'goog.structs.Map', 'goog.testing.PerformanceTable', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/structs/map_test.js', ['goog.labs.structs.MapTest'], ['goog.labs.structs.Map', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/structs/multimap.js', ['goog.labs.structs.Multimap'], ['goog.array', 'goog.labs.structs.Map', 'goog.object'], {});
+goog.addDependency('labs/structs/multimap_test.js', ['goog.labs.structs.MultimapTest'], ['goog.labs.structs.Map', 'goog.labs.structs.Multimap', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/style/pixeldensitymonitor.js', ['goog.labs.style.PixelDensityMonitor', 'goog.labs.style.PixelDensityMonitor.Density', 'goog.labs.style.PixelDensityMonitor.EventType'], ['goog.events', 'goog.events.EventTarget'], {});
+goog.addDependency('labs/style/pixeldensitymonitor_test.js', ['goog.labs.style.PixelDensityMonitorTest'], ['goog.array', 'goog.dom.DomHelper', 'goog.events', 'goog.labs.style.PixelDensityMonitor', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('labs/testing/assertthat.js', ['goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat'], ['goog.debug.Error'], {});
+goog.addDependency('labs/testing/assertthat_test.js', ['goog.labs.testing.assertThatTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('labs/testing/decoratormatcher.js', ['goog.labs.testing.AnythingMatcher'], ['goog.labs.testing.Matcher'], {});
+goog.addDependency('labs/testing/decoratormatcher_test.js', ['goog.labs.testing.decoratorMatcherTest'], ['goog.labs.testing.AnythingMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/dictionarymatcher.js', ['goog.labs.testing.HasEntriesMatcher', 'goog.labs.testing.HasEntryMatcher', 'goog.labs.testing.HasKeyMatcher', 'goog.labs.testing.HasValueMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher', 'goog.object'], {});
+goog.addDependency('labs/testing/dictionarymatcher_test.js', ['goog.labs.testing.dictionaryMatcherTest'], ['goog.labs.testing.HasEntryMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/environment.js', ['goog.labs.testing.Environment'], ['goog.Thenable', 'goog.array', 'goog.asserts', 'goog.debug.Console', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/environment_test.js', ['goog.labs.testing.environmentTest'], ['goog.Promise', 'goog.labs.testing.Environment', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.testSuite'], {});
+goog.addDependency('labs/testing/environment_usage_test.js', ['goog.labs.testing.environmentUsageTest'], ['goog.labs.testing.Environment'], {});
+goog.addDependency('labs/testing/json_fuzzing.js', ['goog.labs.testing.JsonFuzzing'], ['goog.string', 'goog.testing.PseudoRandom'], {});
+goog.addDependency('labs/testing/json_fuzzing_test.js', ['goog.labs.testing.JsonFuzzingTest'], ['goog.json', 'goog.labs.testing.JsonFuzzing', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/logicmatcher.js', ['goog.labs.testing.AllOfMatcher', 'goog.labs.testing.AnyOfMatcher', 'goog.labs.testing.IsNotMatcher'], ['goog.array', 'goog.labs.testing.Matcher'], {});
+goog.addDependency('labs/testing/logicmatcher_test.js', ['goog.labs.testing.logicMatcherTest'], ['goog.labs.testing.AllOfMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/matcher.js', ['goog.labs.testing.Matcher'], [], {});
+goog.addDependency('labs/testing/numbermatcher.js', ['goog.labs.testing.AnyNumberMatcher', 'goog.labs.testing.CloseToMatcher', 'goog.labs.testing.EqualToMatcher', 'goog.labs.testing.GreaterThanEqualToMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.LessThanEqualToMatcher', 'goog.labs.testing.LessThanMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher'], {});
+goog.addDependency('labs/testing/numbermatcher_test.js', ['goog.labs.testing.numberMatcherTest'], ['goog.labs.testing.LessThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/objectmatcher.js', ['goog.labs.testing.AnyObjectMatcher', 'goog.labs.testing.HasPropertyMatcher', 'goog.labs.testing.InstanceOfMatcher', 'goog.labs.testing.IsNullMatcher', 'goog.labs.testing.IsNullOrUndefinedMatcher', 'goog.labs.testing.IsUndefinedMatcher', 'goog.labs.testing.ObjectEqualsMatcher'], ['goog.labs.testing.Matcher'], {});
+goog.addDependency('labs/testing/objectmatcher_test.js', ['goog.labs.testing.objectMatcherTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.ObjectEqualsMatcher', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/testing/stringmatcher.js', ['goog.labs.testing.AnyStringMatcher', 'goog.labs.testing.ContainsStringMatcher', 'goog.labs.testing.EndsWithMatcher', 'goog.labs.testing.EqualToIgnoringWhitespaceMatcher', 'goog.labs.testing.EqualsMatcher', 'goog.labs.testing.RegexMatcher', 'goog.labs.testing.StartsWithMatcher', 'goog.labs.testing.StringContainsInOrderMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher', 'goog.string'], {});
+goog.addDependency('labs/testing/stringmatcher_test.js', ['goog.labs.testing.stringMatcherTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.StringContainsInOrderMatcher', 'goog.labs.testing.assertThat', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/browser.js', ['goog.labs.userAgent.browser'], ['goog.array', 'goog.labs.userAgent.util', 'goog.object', 'goog.string'], {});
+goog.addDependency('labs/useragent/browser_test.js', ['goog.labs.userAgent.browserTest'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.object', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/device.js', ['goog.labs.userAgent.device'], ['goog.labs.userAgent.util'], {});
+goog.addDependency('labs/useragent/device_test.js', ['goog.labs.userAgent.deviceTest'], ['goog.labs.userAgent.device', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/engine.js', ['goog.labs.userAgent.engine'], ['goog.array', 'goog.labs.userAgent.util', 'goog.string'], {});
+goog.addDependency('labs/useragent/engine_test.js', ['goog.labs.userAgent.engineTest'], ['goog.labs.userAgent.engine', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/platform.js', ['goog.labs.userAgent.platform'], ['goog.labs.userAgent.util', 'goog.string'], {});
+goog.addDependency('labs/useragent/platform_test.js', ['goog.labs.userAgent.platformTest'], ['goog.labs.userAgent.platform', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/test_agents.js', ['goog.labs.userAgent.testAgents'], [], {});
+goog.addDependency('labs/useragent/util.js', ['goog.labs.userAgent.util'], ['goog.string'], {});
+goog.addDependency('labs/useragent/util_test.js', ['goog.labs.userAgent.utilTest'], ['goog.functions', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('labs/useragent/verifier.js', ['goog.labs.useragent.verifier'], [], {});
+goog.addDependency('labs/useragent/verifier_test.js', ['goog.labs.useragent.verifierTest'], ['goog.labs.userAgent.browser', 'goog.labs.useragent.verifier', 'goog.testing.testSuite'], {'lang': 'es5', 'module': 'goog'});
+goog.addDependency('locale/countries.js', ['goog.locale.countries'], [], {});
+goog.addDependency('locale/countrylanguagenames_test.js', ['goog.locale.countryLanguageNamesTest'], ['goog.locale', 'goog.testing.jsunit'], {});
+goog.addDependency('locale/defaultlocalenameconstants.js', ['goog.locale.defaultLocaleNameConstants'], [], {});
+goog.addDependency('locale/genericfontnames.js', ['goog.locale.genericFontNames'], [], {});
+goog.addDependency('locale/genericfontnames_test.js', ['goog.locale.genericFontNamesTest'], ['goog.locale.genericFontNames', 'goog.testing.jsunit'], {});
+goog.addDependency('locale/genericfontnamesdata.js', ['goog.locale.genericFontNamesData'], [], {});
+goog.addDependency('locale/locale.js', ['goog.locale'], ['goog.locale.nativeNameConstants'], {});
+goog.addDependency('locale/nativenameconstants.js', ['goog.locale.nativeNameConstants'], [], {});
+goog.addDependency('locale/scriptToLanguages.js', ['goog.locale.scriptToLanguages'], ['goog.locale'], {});
+goog.addDependency('locale/timezonedetection.js', ['goog.locale.timeZoneDetection'], ['goog.locale.TimeZoneFingerprint'], {});
+goog.addDependency('locale/timezonedetection_test.js', ['goog.locale.timeZoneDetectionTest'], ['goog.locale.timeZoneDetection', 'goog.testing.jsunit'], {});
+goog.addDependency('locale/timezonefingerprint.js', ['goog.locale.TimeZoneFingerprint'], [], {});
+goog.addDependency('locale/timezonelist.js', ['goog.locale.TimeZoneList'], ['goog.locale'], {});
+goog.addDependency('locale/timezonelist_test.js', ['goog.locale.TimeZoneListTest'], ['goog.locale', 'goog.locale.TimeZoneList', 'goog.testing.jsunit'], {});
+goog.addDependency('log/log.js', ['goog.log', 'goog.log.Level', 'goog.log.LogRecord', 'goog.log.Logger'], ['goog.debug', 'goog.debug.LogManager', 'goog.debug.LogRecord', 'goog.debug.Logger'], {});
+goog.addDependency('log/log_test.js', ['goog.logTest'], ['goog.debug.LogManager', 'goog.log', 'goog.log.Level', 'goog.testing.jsunit'], {});
+goog.addDependency('math/affinetransform.js', ['goog.math.AffineTransform'], [], {});
+goog.addDependency('math/affinetransform_test.js', ['goog.math.AffineTransformTest'], ['goog.array', 'goog.math', 'goog.math.AffineTransform', 'goog.testing.jsunit'], {});
+goog.addDependency('math/bezier.js', ['goog.math.Bezier'], ['goog.math', 'goog.math.Coordinate'], {});
+goog.addDependency('math/bezier_test.js', ['goog.math.BezierTest'], ['goog.math', 'goog.math.Bezier', 'goog.math.Coordinate', 'goog.testing.jsunit'], {});
+goog.addDependency('math/box.js', ['goog.math.Box'], ['goog.asserts', 'goog.math.Coordinate'], {});
+goog.addDependency('math/box_test.js', ['goog.math.BoxTest'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.testing.jsunit'], {});
+goog.addDependency('math/coordinate.js', ['goog.math.Coordinate'], ['goog.math'], {});
+goog.addDependency('math/coordinate3.js', ['goog.math.Coordinate3'], [], {});
+goog.addDependency('math/coordinate3_test.js', ['goog.math.Coordinate3Test'], ['goog.math.Coordinate3', 'goog.testing.jsunit'], {});
+goog.addDependency('math/coordinate_test.js', ['goog.math.CoordinateTest'], ['goog.math.Coordinate', 'goog.testing.jsunit'], {});
+goog.addDependency('math/exponentialbackoff.js', ['goog.math.ExponentialBackoff'], ['goog.asserts'], {});
+goog.addDependency('math/exponentialbackoff_test.js', ['goog.math.ExponentialBackoffTest'], ['goog.math.ExponentialBackoff', 'goog.testing.jsunit'], {});
+goog.addDependency('math/integer.js', ['goog.math.Integer'], [], {});
+goog.addDependency('math/integer_test.js', ['goog.math.IntegerTest'], ['goog.math.Integer', 'goog.testing.jsunit'], {});
+goog.addDependency('math/interpolator/interpolator1.js', ['goog.math.interpolator.Interpolator1'], [], {});
+goog.addDependency('math/interpolator/linear1.js', ['goog.math.interpolator.Linear1'], ['goog.array', 'goog.asserts', 'goog.math', 'goog.math.interpolator.Interpolator1'], {});
+goog.addDependency('math/interpolator/linear1_test.js', ['goog.math.interpolator.Linear1Test'], ['goog.math.interpolator.Linear1', 'goog.testing.jsunit'], {});
+goog.addDependency('math/interpolator/pchip1.js', ['goog.math.interpolator.Pchip1'], ['goog.math', 'goog.math.interpolator.Spline1'], {});
+goog.addDependency('math/interpolator/pchip1_test.js', ['goog.math.interpolator.Pchip1Test'], ['goog.math.interpolator.Pchip1', 'goog.testing.jsunit'], {});
+goog.addDependency('math/interpolator/spline1.js', ['goog.math.interpolator.Spline1'], ['goog.array', 'goog.asserts', 'goog.math', 'goog.math.interpolator.Interpolator1', 'goog.math.tdma'], {});
+goog.addDependency('math/interpolator/spline1_test.js', ['goog.math.interpolator.Spline1Test'], ['goog.math.interpolator.Spline1', 'goog.testing.jsunit'], {});
+goog.addDependency('math/irect.js', ['goog.math.IRect'], [], {});
+goog.addDependency('math/line.js', ['goog.math.Line'], ['goog.math', 'goog.math.Coordinate'], {});
+goog.addDependency('math/line_test.js', ['goog.math.LineTest'], ['goog.math.Coordinate', 'goog.math.Line', 'goog.testing.jsunit'], {});
+goog.addDependency('math/long.js', ['goog.math.Long'], ['goog.asserts', 'goog.reflect'], {});
+goog.addDependency('math/long_test.js', ['goog.math.LongTest'], ['goog.asserts', 'goog.math.Long', 'goog.testing.jsunit'], {});
+goog.addDependency('math/math.js', ['goog.math'], ['goog.array', 'goog.asserts'], {});
+goog.addDependency('math/math_test.js', ['goog.mathTest'], ['goog.math', 'goog.testing.jsunit'], {});
+goog.addDependency('math/matrix.js', ['goog.math.Matrix'], ['goog.array', 'goog.asserts', 'goog.math', 'goog.math.Size', 'goog.string'], {});
+goog.addDependency('math/matrix_test.js', ['goog.math.MatrixTest'], ['goog.math.Matrix', 'goog.testing.jsunit'], {});
+goog.addDependency('math/path.js', ['goog.math.Path', 'goog.math.Path.Segment'], ['goog.array', 'goog.math', 'goog.math.AffineTransform'], {});
+goog.addDependency('math/path_test.js', ['goog.math.PathTest'], ['goog.array', 'goog.math.AffineTransform', 'goog.math.Path', 'goog.testing.jsunit'], {});
+goog.addDependency('math/paths.js', ['goog.math.paths'], ['goog.math.Coordinate', 'goog.math.Path'], {});
+goog.addDependency('math/paths_test.js', ['goog.math.pathsTest'], ['goog.math.Coordinate', 'goog.math.paths', 'goog.testing.jsunit'], {});
+goog.addDependency('math/range.js', ['goog.math.Range'], ['goog.asserts'], {});
+goog.addDependency('math/range_test.js', ['goog.math.RangeTest'], ['goog.math.Range', 'goog.testing.jsunit'], {});
+goog.addDependency('math/rangeset.js', ['goog.math.RangeSet'], ['goog.array', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.math.Range'], {});
+goog.addDependency('math/rangeset_test.js', ['goog.math.RangeSetTest'], ['goog.iter', 'goog.math.Range', 'goog.math.RangeSet', 'goog.testing.jsunit'], {});
+goog.addDependency('math/rect.js', ['goog.math.Rect'], ['goog.asserts', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.IRect', 'goog.math.Size'], {});
+goog.addDependency('math/rect_test.js', ['goog.math.RectTest'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.testing.jsunit'], {});
+goog.addDependency('math/size.js', ['goog.math.Size'], [], {});
+goog.addDependency('math/size_test.js', ['goog.math.SizeTest'], ['goog.math.Size', 'goog.testing.jsunit'], {});
+goog.addDependency('math/tdma.js', ['goog.math.tdma'], [], {});
+goog.addDependency('math/tdma_test.js', ['goog.math.tdmaTest'], ['goog.math.tdma', 'goog.testing.jsunit'], {});
+goog.addDependency('math/vec2.js', ['goog.math.Vec2'], ['goog.math', 'goog.math.Coordinate'], {});
+goog.addDependency('math/vec2_test.js', ['goog.math.Vec2Test'], ['goog.math.Vec2', 'goog.testing.jsunit'], {});
+goog.addDependency('math/vec3.js', ['goog.math.Vec3'], ['goog.math', 'goog.math.Coordinate3'], {});
+goog.addDependency('math/vec3_test.js', ['goog.math.Vec3Test'], ['goog.math.Coordinate3', 'goog.math.Vec3', 'goog.testing.jsunit'], {});
+goog.addDependency('memoize/memoize.js', ['goog.memoize'], [], {});
+goog.addDependency('memoize/memoize_test.js', ['goog.memoizeTest'], ['goog.memoize', 'goog.testing.jsunit'], {});
+goog.addDependency('messaging/abstractchannel.js', ['goog.messaging.AbstractChannel'], ['goog.Disposable', 'goog.json', 'goog.log', 'goog.messaging.MessageChannel'], {});
+goog.addDependency('messaging/abstractchannel_test.js', ['goog.messaging.AbstractChannelTest'], ['goog.messaging.AbstractChannel', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.jsunit'], {});
+goog.addDependency('messaging/bufferedchannel.js', ['goog.messaging.BufferedChannel'], ['goog.Disposable', 'goog.Timer', 'goog.events', 'goog.log', 'goog.messaging.MessageChannel', 'goog.messaging.MultiChannel'], {});
+goog.addDependency('messaging/bufferedchannel_test.js', ['goog.messaging.BufferedChannelTest'], ['goog.debug.Console', 'goog.dom', 'goog.dom.TagName', 'goog.log', 'goog.log.Level', 'goog.messaging.BufferedChannel', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/deferredchannel.js', ['goog.messaging.DeferredChannel'], ['goog.Disposable', 'goog.messaging.MessageChannel'], {});
+goog.addDependency('messaging/deferredchannel_test.js', ['goog.messaging.DeferredChannelTest'], ['goog.async.Deferred', 'goog.messaging.DeferredChannel', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/loggerclient.js', ['goog.messaging.LoggerClient'], ['goog.Disposable', 'goog.debug', 'goog.debug.LogManager', 'goog.debug.Logger'], {});
+goog.addDependency('messaging/loggerclient_test.js', ['goog.messaging.LoggerClientTest'], ['goog.debug', 'goog.debug.Logger', 'goog.messaging.LoggerClient', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/loggerserver.js', ['goog.messaging.LoggerServer'], ['goog.Disposable', 'goog.log', 'goog.log.Level'], {});
+goog.addDependency('messaging/loggerserver_test.js', ['goog.messaging.LoggerServerTest'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.log', 'goog.log.Level', 'goog.messaging.LoggerServer', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/messagechannel.js', ['goog.messaging.MessageChannel'], [], {});
+goog.addDependency('messaging/messaging.js', ['goog.messaging'], [], {});
+goog.addDependency('messaging/messaging_test.js', ['goog.testing.messaging.MockMessageChannelTest'], ['goog.messaging', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/multichannel.js', ['goog.messaging.MultiChannel', 'goog.messaging.MultiChannel.VirtualChannel'], ['goog.Disposable', 'goog.log', 'goog.messaging.MessageChannel', 'goog.object'], {});
+goog.addDependency('messaging/multichannel_test.js', ['goog.messaging.MultiChannelTest'], ['goog.messaging.MultiChannel', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.mockmatchers.IgnoreArgument'], {});
+goog.addDependency('messaging/portcaller.js', ['goog.messaging.PortCaller'], ['goog.Disposable', 'goog.async.Deferred', 'goog.messaging.DeferredChannel', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object'], {});
+goog.addDependency('messaging/portcaller_test.js', ['goog.messaging.PortCallerTest'], ['goog.events.EventTarget', 'goog.messaging.PortCaller', 'goog.messaging.PortNetwork', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/portchannel.js', ['goog.messaging.PortChannel'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.debug', 'goog.events', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.messaging.AbstractChannel', 'goog.messaging.DeferredChannel', 'goog.object', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('messaging/portchannel_test.js', ['goog.messaging.PortChannelTest'], ['goog.Promise', 'goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.messaging.PortChannel', 'goog.testing.MockControl', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageEvent'], {});
+goog.addDependency('messaging/portnetwork.js', ['goog.messaging.PortNetwork'], [], {});
+goog.addDependency('messaging/portnetwork_test.js', ['goog.messaging.PortNetworkTest'], ['goog.Promise', 'goog.Timer', 'goog.labs.userAgent.browser', 'goog.messaging.PortChannel', 'goog.messaging.PortOperator', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('messaging/portoperator.js', ['goog.messaging.PortOperator'], ['goog.Disposable', 'goog.asserts', 'goog.log', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object'], {});
+goog.addDependency('messaging/portoperator_test.js', ['goog.messaging.PortOperatorTest'], ['goog.messaging.PortNetwork', 'goog.messaging.PortOperator', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.messaging.MockMessagePort'], {});
+goog.addDependency('messaging/respondingchannel.js', ['goog.messaging.RespondingChannel'], ['goog.Disposable', 'goog.log', 'goog.messaging.MultiChannel'], {});
+goog.addDependency('messaging/respondingchannel_test.js', ['goog.messaging.RespondingChannelTest'], ['goog.messaging.RespondingChannel', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('messaging/testdata/portchannel_worker.js', ['goog.messaging.testdata.portchannel_worker'], ['goog.messaging.PortChannel'], {});
+goog.addDependency('messaging/testdata/portnetwork_worker1.js', ['goog.messaging.testdata.portnetwork_worker1'], ['goog.messaging.PortCaller', 'goog.messaging.PortChannel'], {});
+goog.addDependency('messaging/testdata/portnetwork_worker2.js', ['goog.messaging.testdata.portnetwork_worker2'], ['goog.messaging.PortCaller', 'goog.messaging.PortChannel'], {});
+goog.addDependency('module/abstractmoduleloader.js', ['goog.module.AbstractModuleLoader'], ['goog.module', 'goog.module.ModuleInfo'], {});
+goog.addDependency('module/basemodule.js', ['goog.module.BaseModule'], ['goog.Disposable', 'goog.module'], {});
+goog.addDependency('module/loader.js', ['goog.module.Loader'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.module', 'goog.object'], {});
+goog.addDependency('module/module.js', ['goog.module'], [], {});
+goog.addDependency('module/moduleinfo.js', ['goog.module.ModuleInfo'], ['goog.Disposable', 'goog.async.throwException', 'goog.functions', 'goog.module', 'goog.module.BaseModule', 'goog.module.ModuleLoadCallback'], {});
+goog.addDependency('module/moduleinfo_test.js', ['goog.module.ModuleInfoTest'], ['goog.module.BaseModule', 'goog.module.ModuleInfo', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('module/moduleloadcallback.js', ['goog.module.ModuleLoadCallback'], ['goog.debug.entryPointRegistry', 'goog.module'], {});
+goog.addDependency('module/moduleloadcallback_test.js', ['goog.module.ModuleLoadCallbackTest'], ['goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.functions', 'goog.module.ModuleLoadCallback', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('module/moduleloader.js', ['goog.module.ModuleLoader'], ['goog.Timer', 'goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.html.legacyconversions', 'goog.labs.userAgent.browser', 'goog.log', 'goog.module.AbstractModuleLoader', 'goog.net.BulkLoader', 'goog.net.EventType', 'goog.net.jsloader', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('module/moduleloader_test.js', ['goog.module.ModuleLoaderTest'], ['goog.Promise', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.functions', 'goog.module.ModuleLoader', 'goog.module.ModuleManager', 'goog.net.BulkLoader', 'goog.net.XmlHttp', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.events.EventObserver', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('module/modulemanager.js', ['goog.module.ModuleManager', 'goog.module.ModuleManager.CallbackType', 'goog.module.ModuleManager.FailureType'], ['goog.Disposable', 'goog.array', 'goog.asserts', 'goog.async.Deferred', 'goog.debug.Trace', 'goog.dispose', 'goog.log', 'goog.module', 'goog.module.AbstractModuleLoader', 'goog.module.ModuleInfo', 'goog.module.ModuleLoadCallback', 'goog.object'], {});
+goog.addDependency('module/modulemanager_test.js', ['goog.module.ModuleManagerTest'], ['goog.array', 'goog.functions', 'goog.module.BaseModule', 'goog.module.ModuleManager', 'goog.testing', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('module/testdata/modA_1.js', ['goog.module.testdata.modA_1'], [], {});
+goog.addDependency('module/testdata/modA_2.js', ['goog.module.testdata.modA_2'], ['goog.module.ModuleManager'], {});
+goog.addDependency('module/testdata/modB_1.js', ['goog.module.testdata.modB_1'], ['goog.module.ModuleManager'], {});
+goog.addDependency('net/browserchannel.js', ['goog.net.BrowserChannel', 'goog.net.BrowserChannel.Error', 'goog.net.BrowserChannel.Event', 'goog.net.BrowserChannel.Handler', 'goog.net.BrowserChannel.LogSaver', 'goog.net.BrowserChannel.QueuedMap', 'goog.net.BrowserChannel.ServerReachability', 'goog.net.BrowserChannel.ServerReachabilityEvent', 'goog.net.BrowserChannel.Stat', 'goog.net.BrowserChannel.StatEvent', 'goog.net.BrowserChannel.State', 'goog.net.BrowserChannel.TimingEvent'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug.TextFormatter', 'goog.events.Event', 'goog.events.EventTarget', 'goog.json', 'goog.json.NativeJsonProcessor', 'goog.log', 'goog.net.BrowserTestChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.XhrIo', 'goog.net.tmpnetwork', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.CircularBuffer'], {});
+goog.addDependency('net/browserchannel_test.js', ['goog.net.BrowserChannelTest'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.functions', 'goog.json', 'goog.net.BrowserChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.tmpnetwork', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/browsertestchannel.js', ['goog.net.BrowserTestChannel'], ['goog.json.NativeJsonProcessor', 'goog.net.ChannelRequest', 'goog.net.ChannelRequest.Error', 'goog.net.tmpnetwork', 'goog.string.Parser'], {});
+goog.addDependency('net/bulkloader.js', ['goog.net.BulkLoader'], ['goog.events.EventHandler', 'goog.events.EventTarget', 'goog.log', 'goog.net.BulkLoaderHelper', 'goog.net.EventType', 'goog.net.XhrIo'], {});
+goog.addDependency('net/bulkloader_test.js', ['goog.net.BulkLoaderTest'], ['goog.events.Event', 'goog.events.EventHandler', 'goog.net.BulkLoader', 'goog.net.EventType', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('net/bulkloaderhelper.js', ['goog.net.BulkLoaderHelper'], ['goog.Disposable'], {});
+goog.addDependency('net/channeldebug.js', ['goog.net.ChannelDebug'], ['goog.json', 'goog.log'], {});
+goog.addDependency('net/channelrequest.js', ['goog.net.ChannelRequest', 'goog.net.ChannelRequest.Error'], ['goog.Timer', 'goog.async.Throttle', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events.EventHandler', 'goog.html.SafeUrl', 'goog.html.uncheckedconversions', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('net/channelrequest_test.js', ['goog.net.ChannelRequestTest'], ['goog.Uri', 'goog.functions', 'goog.net.BrowserChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/cookies.js', ['goog.net.Cookies', 'goog.net.cookies'], ['goog.string'], {});
+goog.addDependency('net/cookies_test.js', ['goog.net.cookiesTest'], ['goog.array', 'goog.net.cookies', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('net/corsxmlhttpfactory.js', ['goog.net.CorsXmlHttpFactory', 'goog.net.IeCorsXhrAdapter'], ['goog.net.HttpStatus', 'goog.net.XhrLike', 'goog.net.XmlHttp', 'goog.net.XmlHttpFactory'], {});
+goog.addDependency('net/corsxmlhttpfactory_test.js', ['goog.net.CorsXmlHttpFactoryTest'], ['goog.net.CorsXmlHttpFactory', 'goog.net.IeCorsXhrAdapter', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('net/crossdomainrpc.js', ['goog.net.CrossDomainRpc'], ['goog.Uri', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.html.SafeHtml', 'goog.log', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('net/crossdomainrpc_test.js', ['goog.net.CrossDomainRpcTest'], ['goog.Promise', 'goog.log', 'goog.net.CrossDomainRpc', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('net/errorcode.js', ['goog.net.ErrorCode'], [], {});
+goog.addDependency('net/eventtype.js', ['goog.net.EventType'], [], {});
+goog.addDependency('net/fetchxmlhttpfactory.js', ['goog.net.FetchXmlHttp', 'goog.net.FetchXmlHttpFactory'], ['goog.asserts', 'goog.events.EventTarget', 'goog.functions', 'goog.log', 'goog.net.XhrLike', 'goog.net.XmlHttpFactory'], {});
+goog.addDependency('net/fetchxmlhttpfactory_test.js', ['goog.net.FetchXmlHttpFactoryTest'], ['goog.net.FetchXmlHttp', 'goog.net.FetchXmlHttpFactory', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('net/filedownloader.js', ['goog.net.FileDownloader', 'goog.net.FileDownloader.Error'], ['goog.Disposable', 'goog.asserts', 'goog.async.Deferred', 'goog.crypt.hash32', 'goog.debug.Error', 'goog.events', 'goog.events.EventHandler', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrIoPool', 'goog.object'], {});
+goog.addDependency('net/filedownloader_test.js', ['goog.net.FileDownloaderTest'], ['goog.fs.Error', 'goog.net.ErrorCode', 'goog.net.FileDownloader', 'goog.net.XhrIo', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.fs', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit', 'goog.testing.net.XhrIoPool'], {});
+goog.addDependency('net/httpstatus.js', ['goog.net.HttpStatus'], [], {});
+goog.addDependency('net/httpstatusname.js', ['goog.net.HttpStatusName'], [], {});
+goog.addDependency('net/iframeio.js', ['goog.net.IframeIo', 'goog.net.IframeIo.IncrementalDataEvent'], ['goog.Timer', 'goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug.HtmlFormatter', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.html.uncheckedconversions', 'goog.json', 'goog.log', 'goog.log.Level', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.reflect', 'goog.string', 'goog.string.Const', 'goog.structs', 'goog.userAgent'], {});
+goog.addDependency('net/iframeio_different_base_test.js', ['goog.net.iframeIoDifferentBaseTest'], ['goog.Promise', 'goog.events', 'goog.net.EventType', 'goog.net.IframeIo', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('net/iframeio_test.js', ['goog.net.IframeIoTest'], ['goog.debug', 'goog.debug.DivConsole', 'goog.debug.LogManager', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.log', 'goog.log.Level', 'goog.net.IframeIo', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('net/iframeloadmonitor.js', ['goog.net.IframeLoadMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent'], {});
+goog.addDependency('net/iframeloadmonitor_test.js', ['goog.net.IframeLoadMonitorTest'], ['goog.Promise', 'goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.net.IframeLoadMonitor', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('net/imageloader.js', ['goog.net.ImageLoader'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.net.EventType', 'goog.object', 'goog.userAgent'], {});
+goog.addDependency('net/imageloader_test.js', ['goog.net.ImageLoaderTest'], ['goog.Promise', 'goog.Timer', 'goog.array', 'goog.dispose', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.net.EventType', 'goog.net.ImageLoader', 'goog.object', 'goog.string', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/ipaddress.js', ['goog.net.IpAddress', 'goog.net.Ipv4Address', 'goog.net.Ipv6Address'], ['goog.array', 'goog.math.Integer', 'goog.object', 'goog.string'], {});
+goog.addDependency('net/ipaddress_test.js', ['goog.net.IpAddressTest'], ['goog.array', 'goog.math.Integer', 'goog.net.IpAddress', 'goog.net.Ipv4Address', 'goog.net.Ipv6Address', 'goog.testing.jsunit'], {});
+goog.addDependency('net/jsloader.js', ['goog.net.jsloader', 'goog.net.jsloader.Error', 'goog.net.jsloader.ErrorCode', 'goog.net.jsloader.Options'], ['goog.array', 'goog.async.Deferred', 'goog.debug.Error', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.TrustedResourceUrl', 'goog.object'], {});
+goog.addDependency('net/jsloader_test.js', ['goog.net.jsloaderTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.html.TrustedResourceUrl', 'goog.net.jsloader', 'goog.net.jsloader.ErrorCode', 'goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('net/jsonp.js', ['goog.net.Jsonp'], ['goog.Uri', 'goog.html.legacyconversions', 'goog.net.jsloader'], {});
+goog.addDependency('net/jsonp_test.js', ['goog.net.JsonpTest'], ['goog.net.Jsonp', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('net/mockiframeio.js', ['goog.net.MockIFrameIo'], ['goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.IframeIo'], {});
+goog.addDependency('net/multiiframeloadmonitor.js', ['goog.net.MultiIframeLoadMonitor'], ['goog.events', 'goog.net.IframeLoadMonitor'], {});
+goog.addDependency('net/multiiframeloadmonitor_test.js', ['goog.net.MultiIframeLoadMonitorTest'], ['goog.Promise', 'goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.net.IframeLoadMonitor', 'goog.net.MultiIframeLoadMonitor', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('net/networkstatusmonitor.js', ['goog.net.NetworkStatusMonitor'], ['goog.events.Listenable'], {});
+goog.addDependency('net/networktester.js', ['goog.net.NetworkTester'], ['goog.Timer', 'goog.Uri', 'goog.log'], {});
+goog.addDependency('net/networktester_test.js', ['goog.net.NetworkTesterTest'], ['goog.Uri', 'goog.net.NetworkTester', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('net/rpc/httpcors.js', ['goog.net.rpc.HttpCors'], ['goog.Uri', 'goog.object', 'goog.string', 'goog.uri.utils'], {'module': 'goog'});
+goog.addDependency('net/rpc/httpcors_test.js', ['goog.net.rpc.HttpCorsTest'], ['goog.Uri', 'goog.net.rpc.HttpCors', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('net/streams/base64pbstreamparser.js', ['goog.net.streams.Base64PbStreamParser'], ['goog.asserts', 'goog.net.streams.Base64StreamDecoder', 'goog.net.streams.PbStreamParser', 'goog.net.streams.StreamParser'], {'module': 'goog'});
+goog.addDependency('net/streams/base64pbstreamparser_test.js', ['goog.net.streams.Base64PbStreamParserTest'], ['goog.crypt.base64', 'goog.net.streams.Base64PbStreamParser', 'goog.object', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('net/streams/base64streamdecoder.js', ['goog.net.streams.Base64StreamDecoder'], ['goog.asserts', 'goog.crypt.base64'], {});
+goog.addDependency('net/streams/base64streamdecoder_test.js', ['goog.net.streams.Base64StreamDecoderTest'], ['goog.net.streams.Base64StreamDecoder', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('net/streams/jsonstreamparser.js', ['goog.net.streams.JsonStreamParser', 'goog.net.streams.JsonStreamParser.Options'], ['goog.asserts', 'goog.json', 'goog.net.streams.StreamParser', 'goog.net.streams.utils'], {});
+goog.addDependency('net/streams/jsonstreamparser_test.js', ['goog.net.streams.JsonStreamParserTest'], ['goog.array', 'goog.json', 'goog.labs.testing.JsonFuzzing', 'goog.net.streams.JsonStreamParser', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.uri.utils'], {'lang': 'es5'});
+goog.addDependency('net/streams/nodereadablestream.js', ['goog.net.streams.NodeReadableStream'], [], {});
+goog.addDependency('net/streams/pbjsonstreamparser.js', ['goog.net.streams.PbJsonStreamParser'], ['goog.asserts', 'goog.net.streams.JsonStreamParser', 'goog.net.streams.StreamParser', 'goog.net.streams.utils'], {'module': 'goog'});
+goog.addDependency('net/streams/pbjsonstreamparser_test.js', ['goog.net.streams.PbJsonStreamParserTest'], ['goog.net.streams.PbJsonStreamParser', 'goog.object', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('net/streams/pbstreamparser.js', ['goog.net.streams.PbStreamParser'], ['goog.asserts', 'goog.net.streams.StreamParser'], {});
+goog.addDependency('net/streams/pbstreamparser_test.js', ['goog.net.streams.PbStreamParserTest'], ['goog.net.streams.PbStreamParser', 'goog.object', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('net/streams/streamfactory.js', ['goog.net.streams.createXhrNodeReadableStream'], ['goog.asserts', 'goog.net.streams.XhrNodeReadableStream', 'goog.net.streams.XhrStreamReader'], {});
+goog.addDependency('net/streams/streamparser.js', ['goog.net.streams.StreamParser'], [], {});
+goog.addDependency('net/streams/utils.js', ['goog.net.streams.utils'], [], {'module': 'goog'});
+goog.addDependency('net/streams/xhrnodereadablestream.js', ['goog.net.streams.XhrNodeReadableStream'], ['goog.array', 'goog.log', 'goog.net.streams.NodeReadableStream', 'goog.net.streams.XhrStreamReader'], {});
+goog.addDependency('net/streams/xhrnodereadablestream_test.js', ['goog.net.streams.XhrNodeReadableStreamTest'], ['goog.net.streams.NodeReadableStream', 'goog.net.streams.XhrNodeReadableStream', 'goog.net.streams.XhrStreamReader', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('net/streams/xhrstreamreader.js', ['goog.net.streams.XhrStreamReader'], ['goog.events.EventHandler', 'goog.log', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.net.streams.Base64PbStreamParser', 'goog.net.streams.JsonStreamParser', 'goog.net.streams.PbJsonStreamParser', 'goog.net.streams.PbStreamParser', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('net/streams/xhrstreamreader_test.js', ['goog.net.streams.XhrStreamReaderTest'], ['goog.net.ErrorCode', 'goog.net.XmlHttp', 'goog.net.streams.Base64PbStreamParser', 'goog.net.streams.JsonStreamParser', 'goog.net.streams.PbJsonStreamParser', 'goog.net.streams.PbStreamParser', 'goog.net.streams.XhrStreamReader', 'goog.object', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.net.XhrIo'], {});
+goog.addDependency('net/testdata/jsloader_test1.js', ['goog.net.testdata.jsloader_test1'], [], {});
+goog.addDependency('net/testdata/jsloader_test2.js', ['goog.net.testdata.jsloader_test2'], [], {});
+goog.addDependency('net/testdata/jsloader_test3.js', ['goog.net.testdata.jsloader_test3'], [], {});
+goog.addDependency('net/testdata/jsloader_test4.js', ['goog.net.testdata.jsloader_test4'], [], {});
+goog.addDependency('net/tmpnetwork.js', ['goog.net.tmpnetwork'], ['goog.Uri', 'goog.net.ChannelDebug'], {});
+goog.addDependency('net/websocket.js', ['goog.net.WebSocket', 'goog.net.WebSocket.ErrorEvent', 'goog.net.WebSocket.EventType', 'goog.net.WebSocket.MessageEvent'], ['goog.Timer', 'goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.log'], {});
+goog.addDependency('net/websocket_test.js', ['goog.net.WebSocketTest'], ['goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.functions', 'goog.net.WebSocket', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/wrapperxmlhttpfactory.js', ['goog.net.WrapperXmlHttpFactory'], ['goog.net.XhrLike', 'goog.net.XmlHttpFactory'], {});
+goog.addDependency('net/xhrio.js', ['goog.net.XhrIo', 'goog.net.XhrIo.ResponseType'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events.EventTarget', 'goog.json.hybrid', 'goog.log', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.userAgent'], {});
+goog.addDependency('net/xhrio_test.js', ['goog.net.XhrIoTest'], ['goog.Uri', 'goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.functions', 'goog.net.EventType', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction', 'goog.userAgent.product'], {});
+goog.addDependency('net/xhriopool.js', ['goog.net.XhrIoPool'], ['goog.net.XhrIo', 'goog.structs.PriorityPool'], {});
+goog.addDependency('net/xhriopool_test.js', ['goog.net.XhrIoPoolTest'], ['goog.net.XhrIoPool', 'goog.structs.Map', 'goog.testing.jsunit'], {});
+goog.addDependency('net/xhrlike.js', ['goog.net.XhrLike'], [], {});
+goog.addDependency('net/xhrmanager.js', ['goog.net.XhrManager', 'goog.net.XhrManager.Event', 'goog.net.XhrManager.Request'], ['goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrIoPool', 'goog.structs.Map'], {});
+goog.addDependency('net/xhrmanager_test.js', ['goog.net.XhrManagerTest'], ['goog.events', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrManager', 'goog.testing.jsunit', 'goog.testing.net.XhrIoPool', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/xmlhttp.js', ['goog.net.DefaultXmlHttpFactory', 'goog.net.XmlHttp', 'goog.net.XmlHttp.OptionType', 'goog.net.XmlHttp.ReadyState', 'goog.net.XmlHttpDefines'], ['goog.asserts', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XmlHttpFactory'], {});
+goog.addDependency('net/xmlhttpfactory.js', ['goog.net.XmlHttpFactory'], ['goog.net.XhrLike'], {});
+goog.addDependency('net/xpc/crosspagechannel.js', ['goog.net.xpc.CrossPageChannel'], ['goog.Uri', 'goog.async.Deferred', 'goog.async.Delay', 'goog.dispose', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.messaging.AbstractChannel', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.ChannelStates', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.DirectTransport', 'goog.net.xpc.FrameElementMethodTransport', 'goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframeRelayTransport', 'goog.net.xpc.NativeMessagingTransport', 'goog.net.xpc.NixTransport', 'goog.net.xpc.TransportTypes', 'goog.net.xpc.UriCfgFields', 'goog.string', 'goog.uri.utils', 'goog.userAgent'], {});
+goog.addDependency('net/xpc/crosspagechannel_test.js', ['goog.net.xpc.CrossPageChannelTest'], ['goog.Disposable', 'goog.Promise', 'goog.Timer', 'goog.Uri', 'goog.dom', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('net/xpc/crosspagechannelrole.js', ['goog.net.xpc.CrossPageChannelRole'], [], {});
+goog.addDependency('net/xpc/directtransport.js', ['goog.net.xpc.DirectTransport'], ['goog.Timer', 'goog.async.Deferred', 'goog.events.EventHandler', 'goog.log', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.object'], {});
+goog.addDependency('net/xpc/directtransport_test.js', ['goog.net.xpc.DirectTransportTest'], ['goog.Promise', 'goog.dom', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('net/xpc/frameelementmethodtransport.js', ['goog.net.xpc.FrameElementMethodTransport'], ['goog.log', 'goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes'], {});
+goog.addDependency('net/xpc/iframepollingtransport.js', ['goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframePollingTransport.Receiver', 'goog.net.xpc.IframePollingTransport.Sender'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.userAgent'], {});
+goog.addDependency('net/xpc/iframepollingtransport_test.js', ['goog.net.xpc.IframePollingTransportTest'], ['goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.object', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('net/xpc/iframerelaytransport.js', ['goog.net.xpc.IframeRelayTransport'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.html.SafeHtml', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('net/xpc/nativemessagingtransport.js', ['goog.net.xpc.NativeMessagingTransport'], ['goog.Timer', 'goog.asserts', 'goog.async.Deferred', 'goog.events', 'goog.events.EventHandler', 'goog.log', 'goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes'], {});
+goog.addDependency('net/xpc/nativemessagingtransport_test.js', ['goog.net.xpc.NativeMessagingTransportTest'], ['goog.dom', 'goog.events', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.NativeMessagingTransport', 'goog.testing.jsunit'], {});
+goog.addDependency('net/xpc/nixtransport.js', ['goog.net.xpc.NixTransport'], ['goog.log', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.reflect'], {});
+goog.addDependency('net/xpc/relay.js', ['goog.net.xpc.relay'], [], {});
+goog.addDependency('net/xpc/transport.js', ['goog.net.xpc.Transport'], ['goog.Disposable', 'goog.dom', 'goog.net.xpc.TransportNames'], {});
+goog.addDependency('net/xpc/xpc.js', ['goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.ChannelStates', 'goog.net.xpc.TransportNames', 'goog.net.xpc.TransportTypes', 'goog.net.xpc.UriCfgFields'], ['goog.log'], {});
+goog.addDependency('object/object.js', ['goog.object'], [], {});
+goog.addDependency('object/object_test.js', ['goog.objectTest'], ['goog.array', 'goog.functions', 'goog.object', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('positioning/absoluteposition.js', ['goog.positioning.AbsolutePosition'], ['goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AbstractPosition'], {});
+goog.addDependency('positioning/abstractposition.js', ['goog.positioning.AbstractPosition'], [], {});
+goog.addDependency('positioning/anchoredposition.js', ['goog.positioning.AnchoredPosition'], ['goog.positioning', 'goog.positioning.AbstractPosition'], {});
+goog.addDependency('positioning/anchoredposition_test.js', ['goog.positioning.AnchoredPositionTest'], ['goog.dom', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.style', 'goog.testing.jsunit'], {});
+goog.addDependency('positioning/anchoredviewportposition.js', ['goog.positioning.AnchoredViewportPosition'], ['goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus'], {});
+goog.addDependency('positioning/anchoredviewportposition_test.js', ['goog.positioning.AnchoredViewportPositionTest'], ['goog.dom', 'goog.math.Box', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.OverflowStatus', 'goog.style', 'goog.testing.jsunit'], {});
+goog.addDependency('positioning/clientposition.js', ['goog.positioning.ClientPosition'], ['goog.asserts', 'goog.dom', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AbstractPosition', 'goog.style'], {});
+goog.addDependency('positioning/clientposition_test.js', ['goog.positioning.clientPositionTest'], ['goog.dom', 'goog.dom.TagName', 'goog.positioning.ClientPosition', 'goog.positioning.Corner', 'goog.style', 'goog.testing.jsunit'], {});
+goog.addDependency('positioning/menuanchoredposition.js', ['goog.positioning.MenuAnchoredPosition'], ['goog.positioning.AnchoredViewportPosition', 'goog.positioning.Overflow'], {});
+goog.addDependency('positioning/menuanchoredposition_test.js', ['goog.positioning.MenuAnchoredPositionTest'], ['goog.dom', 'goog.dom.TagName', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.testing.jsunit'], {});
+goog.addDependency('positioning/positioning.js', ['goog.positioning', 'goog.positioning.Corner', 'goog.positioning.CornerBit', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.style', 'goog.style.bidi'], {});
+goog.addDependency('positioning/positioning_test.js', ['goog.positioningTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('positioning/viewportclientposition.js', ['goog.positioning.ViewportClientPosition'], ['goog.dom', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.ClientPosition', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.style'], {});
+goog.addDependency('positioning/viewportclientposition_test.js', ['goog.positioning.ViewportClientPositionTest'], ['goog.dom', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.ViewportClientPosition', 'goog.style', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('positioning/viewportposition.js', ['goog.positioning.ViewportPosition'], ['goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AbstractPosition', 'goog.positioning.Corner', 'goog.style'], {});
+goog.addDependency('promise/promise.js', ['goog.Promise'], ['goog.Thenable', 'goog.asserts', 'goog.async.FreeList', 'goog.async.run', 'goog.async.throwException', 'goog.debug.Error', 'goog.promise.Resolver'], {});
+goog.addDependency('promise/promise_test.js', ['goog.PromiseTest'], ['goog.Promise', 'goog.Thenable', 'goog.Timer', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('promise/resolver.js', ['goog.promise.Resolver'], [], {});
+goog.addDependency('promise/testsuiteadapter.js', ['goog.promise.testSuiteAdapter'], ['goog.Promise'], {});
+goog.addDependency('promise/thenable.js', ['goog.Thenable'], [], {});
+goog.addDependency('proto/proto.js', ['goog.proto'], ['goog.proto.Serializer'], {});
+goog.addDependency('proto/serializer.js', ['goog.proto.Serializer'], ['goog.json.Serializer', 'goog.string'], {});
+goog.addDependency('proto/serializer_test.js', ['goog.protoTest'], ['goog.proto', 'goog.testing.jsunit'], {});
+goog.addDependency('proto2/descriptor.js', ['goog.proto2.Descriptor', 'goog.proto2.Metadata'], ['goog.array', 'goog.asserts', 'goog.object', 'goog.string'], {});
+goog.addDependency('proto2/descriptor_test.js', ['goog.proto2.DescriptorTest'], ['goog.proto2.Descriptor', 'goog.proto2.Message', 'goog.testing.jsunit'], {});
+goog.addDependency('proto2/fielddescriptor.js', ['goog.proto2.FieldDescriptor'], ['goog.asserts', 'goog.string'], {});
+goog.addDependency('proto2/fielddescriptor_test.js', ['goog.proto2.FieldDescriptorTest'], ['goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.testing.jsunit'], {});
+goog.addDependency('proto2/lazydeserializer.js', ['goog.proto2.LazyDeserializer'], ['goog.asserts', 'goog.proto2.Message', 'goog.proto2.Serializer'], {});
+goog.addDependency('proto2/message.js', ['goog.proto2.Message'], ['goog.asserts', 'goog.proto2.Descriptor', 'goog.proto2.FieldDescriptor'], {});
+goog.addDependency('proto2/message_test.js', ['goog.proto2.MessageTest'], ['goog.testing.TestCase', 'goog.testing.jsunit', 'proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup'], {});
+goog.addDependency('proto2/objectserializer.js', ['goog.proto2.ObjectSerializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.Serializer', 'goog.string'], {});
+goog.addDependency('proto2/objectserializer_test.js', ['goog.proto2.ObjectSerializerTest'], ['goog.proto2.ObjectSerializer', 'goog.proto2.Serializer', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'proto2.TestAllTypes'], {});
+goog.addDependency('proto2/package_test.pb.js', ['someprotopackage.TestPackageTypes'], ['goog.proto2.Message', 'proto2.TestAllTypes'], {});
+goog.addDependency('proto2/pbliteserializer.js', ['goog.proto2.PbLiteSerializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.LazyDeserializer', 'goog.proto2.Serializer'], {});
+goog.addDependency('proto2/pbliteserializer_test.js', ['goog.proto2.PbLiteSerializerTest'], ['goog.proto2.PbLiteSerializer', 'goog.testing.jsunit', 'proto2.TestAllTypes'], {});
+goog.addDependency('proto2/proto_test.js', ['goog.proto2.messageTest'], ['goog.proto2.FieldDescriptor', 'goog.testing.jsunit', 'proto2.TestAllTypes', 'proto2.TestDefaultParent', 'someprotopackage.TestPackageTypes'], {});
+goog.addDependency('proto2/serializer.js', ['goog.proto2.Serializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message'], {});
+goog.addDependency('proto2/test.pb.js', ['proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup', 'proto2.TestDefaultChild', 'proto2.TestDefaultParent'], ['goog.proto2.Message'], {});
+goog.addDependency('proto2/textformatserializer.js', ['goog.proto2.TextFormatSerializer'], ['goog.array', 'goog.asserts', 'goog.json', 'goog.math', 'goog.object', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.proto2.Serializer', 'goog.string'], {});
+goog.addDependency('proto2/textformatserializer_test.js', ['goog.proto2.TextFormatSerializerTest'], ['goog.proto2.ObjectSerializer', 'goog.proto2.TextFormatSerializer', 'goog.testing.jsunit', 'proto2.TestAllTypes'], {});
+goog.addDependency('proto2/util.js', ['goog.proto2.Util'], ['goog.asserts'], {});
+goog.addDependency('pubsub/pubsub.js', ['goog.pubsub.PubSub'], ['goog.Disposable', 'goog.array', 'goog.async.run'], {});
+goog.addDependency('pubsub/pubsub_test.js', ['goog.pubsub.PubSubTest'], ['goog.array', 'goog.pubsub.PubSub', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('pubsub/topicid.js', ['goog.pubsub.TopicId'], [], {});
+goog.addDependency('pubsub/typedpubsub.js', ['goog.pubsub.TypedPubSub'], ['goog.Disposable', 'goog.pubsub.PubSub'], {});
+goog.addDependency('pubsub/typedpubsub_test.js', ['goog.pubsub.TypedPubSubTest'], ['goog.array', 'goog.pubsub.TopicId', 'goog.pubsub.TypedPubSub', 'goog.testing.jsunit'], {});
+goog.addDependency('reflect/reflect.js', ['goog.reflect'], [], {});
+goog.addDependency('reflect/reflect_test.js', ['goog.reflectTest'], ['goog.object', 'goog.reflect', 'goog.testing.jsunit'], {});
+goog.addDependency('result/chain_test.js', ['goog.result.chainTest'], ['goog.Timer', 'goog.result', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('result/combine_test.js', ['goog.result.combineTest'], ['goog.Timer', 'goog.array', 'goog.result', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('result/deferredadaptor.js', ['goog.result.DeferredAdaptor'], ['goog.async.Deferred', 'goog.result', 'goog.result.Result'], {});
+goog.addDependency('result/deferredadaptor_test.js', ['goog.result.DeferredAdaptorTest'], ['goog.result', 'goog.result.DeferredAdaptor', 'goog.result.SimpleResult', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('result/dependentresult.js', ['goog.result.DependentResult'], ['goog.result.Result'], {});
+goog.addDependency('result/result_interface.js', ['goog.result.Result'], ['goog.Thenable'], {});
+goog.addDependency('result/resultutil.js', ['goog.result'], ['goog.array', 'goog.result.DependentResult', 'goog.result.Result', 'goog.result.SimpleResult'], {});
+goog.addDependency('result/resultutil_test.js', ['goog.resultTest'], ['goog.result', 'goog.testing.jsunit'], {});
+goog.addDependency('result/simpleresult.js', ['goog.result.SimpleResult', 'goog.result.SimpleResult.StateError'], ['goog.Promise', 'goog.Thenable', 'goog.debug.Error', 'goog.result.Result'], {});
+goog.addDependency('result/simpleresult_test.js', ['goog.result.SimpleResultTest'], ['goog.Promise', 'goog.Thenable', 'goog.Timer', 'goog.result', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('result/transform_test.js', ['goog.result.transformTest'], ['goog.Timer', 'goog.result', 'goog.result.SimpleResult', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('result/wait_test.js', ['goog.result.waitTest'], ['goog.Timer', 'goog.result', 'goog.result.SimpleResult', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('soy/data.js', ['goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.soy.data.SanitizedCss', 'goog.soy.data.SanitizedHtml', 'goog.soy.data.SanitizedHtmlAttribute', 'goog.soy.data.SanitizedJs', 'goog.soy.data.SanitizedStyle', 'goog.soy.data.SanitizedTrustedResourceUri', 'goog.soy.data.SanitizedUri', 'goog.soy.data.UnsanitizedText'], ['goog.Uri', 'goog.asserts', 'goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.uncheckedconversions', 'goog.i18n.bidi.Dir', 'goog.string.Const'], {});
+goog.addDependency('soy/data_test.js', ['goog.soy.dataTest'], ['goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.soy.testHelper', 'goog.testing.jsunit'], {});
+goog.addDependency('soy/renderer.js', ['goog.soy.InjectedDataSupplier', 'goog.soy.Renderer'], ['goog.asserts', 'goog.dom', 'goog.soy', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind'], {});
+goog.addDependency('soy/renderer_test.js', ['goog.soy.RendererTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.html.SafeHtml', 'goog.i18n.bidi.Dir', 'goog.soy.Renderer', 'goog.soy.data.SanitizedContentKind', 'goog.soy.testHelper', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('soy/soy.js', ['goog.soy'], ['goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.html.legacyconversions', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.string'], {});
+goog.addDependency('soy/soy_test.js', ['goog.soyTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.functions', 'goog.soy', 'goog.soy.testHelper', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('soy/soy_testhelper.js', ['goog.soy.testHelper'], ['goog.dom', 'goog.dom.TagName', 'goog.i18n.bidi.Dir', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.soy.data.SanitizedCss', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('spell/spellcheck.js', ['goog.spell.SpellCheck', 'goog.spell.SpellCheck.WordChangedEvent'], ['goog.Timer', 'goog.events.Event', 'goog.events.EventTarget', 'goog.structs.Set'], {});
+goog.addDependency('spell/spellcheck_test.js', ['goog.spell.SpellCheckTest'], ['goog.spell.SpellCheck', 'goog.testing.jsunit'], {});
+goog.addDependency('stats/basicstat.js', ['goog.stats.BasicStat'], ['goog.asserts', 'goog.log', 'goog.string.format', 'goog.structs.CircularBuffer'], {});
+goog.addDependency('stats/basicstat_test.js', ['goog.stats.BasicStatTest'], ['goog.array', 'goog.stats.BasicStat', 'goog.string.format', 'goog.testing.PseudoRandom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('storage/collectablestorage.js', ['goog.storage.CollectableStorage'], ['goog.array', 'goog.iter', 'goog.storage.ErrorCode', 'goog.storage.ExpiringStorage', 'goog.storage.RichStorage'], {});
+goog.addDependency('storage/collectablestorage_test.js', ['goog.storage.CollectableStorageTest'], ['goog.storage.CollectableStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storageTester', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('storage/collectablestoragetester.js', ['goog.storage.collectableStorageTester'], ['goog.testing.asserts'], {});
+goog.addDependency('storage/encryptedstorage.js', ['goog.storage.EncryptedStorage'], ['goog.crypt', 'goog.crypt.Arc4', 'goog.crypt.Sha1', 'goog.crypt.base64', 'goog.json', 'goog.json.Serializer', 'goog.storage.CollectableStorage', 'goog.storage.ErrorCode', 'goog.storage.RichStorage'], {});
+goog.addDependency('storage/encryptedstorage_test.js', ['goog.storage.EncryptedStorageTest'], ['goog.json', 'goog.storage.EncryptedStorage', 'goog.storage.ErrorCode', 'goog.storage.RichStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storageTester', 'goog.testing.MockClock', 'goog.testing.PseudoRandom', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('storage/errorcode.js', ['goog.storage.ErrorCode'], [], {});
+goog.addDependency('storage/expiringstorage.js', ['goog.storage.ExpiringStorage'], ['goog.storage.RichStorage'], {});
+goog.addDependency('storage/expiringstorage_test.js', ['goog.storage.ExpiringStorageTest'], ['goog.storage.ExpiringStorage', 'goog.storage.storageTester', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('storage/mechanism/errorcode.js', ['goog.storage.mechanism.ErrorCode'], [], {});
+goog.addDependency('storage/mechanism/errorhandlingmechanism.js', ['goog.storage.mechanism.ErrorHandlingMechanism'], ['goog.storage.mechanism.Mechanism'], {});
+goog.addDependency('storage/mechanism/errorhandlingmechanism_test.js', ['goog.storage.mechanism.ErrorHandlingMechanismTest'], ['goog.storage.mechanism.ErrorHandlingMechanism', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('storage/mechanism/html5localstorage.js', ['goog.storage.mechanism.HTML5LocalStorage'], ['goog.storage.mechanism.HTML5WebStorage'], {});
+goog.addDependency('storage/mechanism/html5localstorage_test.js', ['goog.storage.mechanism.HTML5LocalStorageTest'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('storage/mechanism/html5sessionstorage.js', ['goog.storage.mechanism.HTML5SessionStorage'], ['goog.storage.mechanism.HTML5WebStorage'], {});
+goog.addDependency('storage/mechanism/html5sessionstorage_test.js', ['goog.storage.mechanism.HTML5SessionStorageTest'], ['goog.storage.mechanism.HTML5SessionStorage', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('storage/mechanism/html5webstorage.js', ['goog.storage.mechanism.HTML5WebStorage'], ['goog.asserts', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.IterableMechanism'], {});
+goog.addDependency('storage/mechanism/html5webstorage_test.js', ['goog.storage.mechanism.HTML5MockStorage', 'goog.storage.mechanism.HTML5WebStorageTest', 'goog.storage.mechanism.MockThrowableStorage'], ['goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.HTML5WebStorage', 'goog.testing.jsunit'], {});
+goog.addDependency('storage/mechanism/ieuserdata.js', ['goog.storage.mechanism.IEUserData'], ['goog.asserts', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.IterableMechanism', 'goog.structs.Map', 'goog.userAgent'], {});
+goog.addDependency('storage/mechanism/ieuserdata_test.js', ['goog.storage.mechanism.IEUserDataTest'], ['goog.storage.mechanism.IEUserData', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('storage/mechanism/iterablemechanism.js', ['goog.storage.mechanism.IterableMechanism'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.storage.mechanism.Mechanism'], {});
+goog.addDependency('storage/mechanism/iterablemechanismtester.js', ['goog.storage.mechanism.iterableMechanismTester'], ['goog.iter', 'goog.iter.StopIteration', 'goog.testing.asserts'], {});
+goog.addDependency('storage/mechanism/mechanism.js', ['goog.storage.mechanism.Mechanism'], [], {});
+goog.addDependency('storage/mechanism/mechanismfactory.js', ['goog.storage.mechanism.mechanismfactory'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.HTML5SessionStorage', 'goog.storage.mechanism.IEUserData', 'goog.storage.mechanism.PrefixedMechanism'], {});
+goog.addDependency('storage/mechanism/mechanismfactory_test.js', ['goog.storage.mechanism.mechanismfactoryTest'], ['goog.storage.mechanism.mechanismfactory', 'goog.testing.jsunit'], {});
+goog.addDependency('storage/mechanism/mechanismseparationtester.js', ['goog.storage.mechanism.mechanismSeparationTester'], ['goog.iter.StopIteration', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.asserts'], {});
+goog.addDependency('storage/mechanism/mechanismsharingtester.js', ['goog.storage.mechanism.mechanismSharingTester'], ['goog.iter.StopIteration', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.asserts'], {});
+goog.addDependency('storage/mechanism/mechanismtestdefinition.js', ['goog.storage.mechanism.mechanismTestDefinition'], [], {});
+goog.addDependency('storage/mechanism/mechanismtester.js', ['goog.storage.mechanism.mechanismTester'], ['goog.storage.mechanism.ErrorCode', 'goog.testing.asserts', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('storage/mechanism/prefixedmechanism.js', ['goog.storage.mechanism.PrefixedMechanism'], ['goog.iter.Iterator', 'goog.storage.mechanism.IterableMechanism'], {});
+goog.addDependency('storage/mechanism/prefixedmechanism_test.js', ['goog.storage.mechanism.PrefixedMechanismTest'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.PrefixedMechanism', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.testing.jsunit'], {});
+goog.addDependency('storage/richstorage.js', ['goog.storage.RichStorage', 'goog.storage.RichStorage.Wrapper'], ['goog.storage.ErrorCode', 'goog.storage.Storage'], {});
+goog.addDependency('storage/richstorage_test.js', ['goog.storage.RichStorageTest'], ['goog.storage.ErrorCode', 'goog.storage.RichStorage', 'goog.storage.storageTester', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('storage/storage.js', ['goog.storage.Storage'], ['goog.json', 'goog.storage.ErrorCode'], {});
+goog.addDependency('storage/storage_test.js', ['goog.storage.storage_test'], ['goog.functions', 'goog.storage.ErrorCode', 'goog.storage.Storage', 'goog.storage.mechanism.mechanismfactory', 'goog.storage.storageTester', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.storage.FakeMechanism'], {});
+goog.addDependency('storage/storagetester.js', ['goog.storage.storageTester'], ['goog.storage.Storage', 'goog.structs.Map', 'goog.testing.asserts'], {});
+goog.addDependency('string/const.js', ['goog.string.Const'], ['goog.asserts', 'goog.string.TypedString'], {});
+goog.addDependency('string/const_test.js', ['goog.string.constTest'], ['goog.string.Const', 'goog.testing.jsunit'], {});
+goog.addDependency('string/linkify.js', ['goog.string.linkify'], ['goog.html.SafeHtml', 'goog.string'], {});
+goog.addDependency('string/linkify_test.js', ['goog.string.linkifyTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.string', 'goog.string.linkify', 'goog.testing.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('string/newlines.js', ['goog.string.newlines', 'goog.string.newlines.Line'], ['goog.array'], {});
+goog.addDependency('string/newlines_test.js', ['goog.string.newlinesTest'], ['goog.string.newlines', 'goog.testing.jsunit'], {});
+goog.addDependency('string/parser.js', ['goog.string.Parser'], [], {});
+goog.addDependency('string/path.js', ['goog.string.path'], ['goog.array', 'goog.string'], {});
+goog.addDependency('string/path_test.js', ['goog.string.pathTest'], ['goog.string.path', 'goog.testing.jsunit'], {});
+goog.addDependency('string/string.js', ['goog.string', 'goog.string.Unicode'], [], {});
+goog.addDependency('string/string_test.js', ['goog.stringTest'], ['goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});
+goog.addDependency('string/stringbuffer.js', ['goog.string.StringBuffer'], [], {});
+goog.addDependency('string/stringbuffer_test.js', ['goog.string.StringBufferTest'], ['goog.string.StringBuffer', 'goog.testing.jsunit'], {});
+goog.addDependency('string/stringformat.js', ['goog.string.format'], ['goog.string'], {});
+goog.addDependency('string/stringformat_test.js', ['goog.string.formatTest'], ['goog.string.format', 'goog.testing.jsunit'], {});
+goog.addDependency('string/stringifier.js', ['goog.string.Stringifier'], [], {});
+goog.addDependency('string/typedstring.js', ['goog.string.TypedString'], [], {});
+goog.addDependency('structs/avltree.js', ['goog.structs.AvlTree', 'goog.structs.AvlTree.Node'], ['goog.structs.Collection'], {});
+goog.addDependency('structs/avltree_test.js', ['goog.structs.AvlTreeTest'], ['goog.array', 'goog.structs.AvlTree', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/circularbuffer.js', ['goog.structs.CircularBuffer'], [], {});
+goog.addDependency('structs/circularbuffer_test.js', ['goog.structs.CircularBufferTest'], ['goog.structs.CircularBuffer', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/collection.js', ['goog.structs.Collection'], [], {});
+goog.addDependency('structs/collection_test.js', ['goog.structs.CollectionTest'], ['goog.structs.AvlTree', 'goog.structs.Set', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/heap.js', ['goog.structs.Heap'], ['goog.array', 'goog.object', 'goog.structs.Node'], {});
+goog.addDependency('structs/heap_test.js', ['goog.structs.HeapTest'], ['goog.structs', 'goog.structs.Heap', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/inversionmap.js', ['goog.structs.InversionMap'], ['goog.array', 'goog.asserts'], {});
+goog.addDependency('structs/inversionmap_test.js', ['goog.structs.InversionMapTest'], ['goog.structs.InversionMap', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/linkedmap.js', ['goog.structs.LinkedMap'], ['goog.structs.Map'], {});
+goog.addDependency('structs/linkedmap_test.js', ['goog.structs.LinkedMapTest'], ['goog.structs.LinkedMap', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('structs/map.js', ['goog.structs.Map'], ['goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.object'], {});
+goog.addDependency('structs/map_test.js', ['goog.structs.MapTest'], ['goog.iter', 'goog.structs', 'goog.structs.Map', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/node.js', ['goog.structs.Node'], [], {});
+goog.addDependency('structs/pool.js', ['goog.structs.Pool'], ['goog.Disposable', 'goog.structs.Queue', 'goog.structs.Set'], {});
+goog.addDependency('structs/pool_test.js', ['goog.structs.PoolTest'], ['goog.structs.Pool', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/prioritypool.js', ['goog.structs.PriorityPool'], ['goog.structs.Pool', 'goog.structs.PriorityQueue'], {});
+goog.addDependency('structs/prioritypool_test.js', ['goog.structs.PriorityPoolTest'], ['goog.structs.PriorityPool', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/priorityqueue.js', ['goog.structs.PriorityQueue'], ['goog.structs.Heap'], {});
+goog.addDependency('structs/priorityqueue_test.js', ['goog.structs.PriorityQueueTest'], ['goog.structs', 'goog.structs.PriorityQueue', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/quadtree.js', ['goog.structs.QuadTree', 'goog.structs.QuadTree.Node', 'goog.structs.QuadTree.Point'], ['goog.math.Coordinate'], {});
+goog.addDependency('structs/quadtree_test.js', ['goog.structs.QuadTreeTest'], ['goog.structs', 'goog.structs.QuadTree', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/queue.js', ['goog.structs.Queue'], ['goog.array'], {});
+goog.addDependency('structs/queue_test.js', ['goog.structs.QueueTest'], ['goog.structs.Queue', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/set.js', ['goog.structs.Set'], ['goog.structs', 'goog.structs.Collection', 'goog.structs.Map'], {});
+goog.addDependency('structs/set_test.js', ['goog.structs.SetTest'], ['goog.iter', 'goog.structs', 'goog.structs.Set', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/simplepool.js', ['goog.structs.SimplePool'], ['goog.Disposable'], {});
+goog.addDependency('structs/stringset.js', ['goog.structs.StringSet'], ['goog.asserts', 'goog.iter'], {});
+goog.addDependency('structs/stringset_test.js', ['goog.structs.StringSetTest'], ['goog.array', 'goog.iter', 'goog.structs.StringSet', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/structs.js', ['goog.structs'], ['goog.array', 'goog.object'], {});
+goog.addDependency('structs/structs_test.js', ['goog.structsTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.structs', 'goog.structs.Map', 'goog.structs.Set', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/treenode.js', ['goog.structs.TreeNode'], ['goog.array', 'goog.asserts', 'goog.structs.Node'], {});
+goog.addDependency('structs/treenode_test.js', ['goog.structs.TreeNodeTest'], ['goog.structs.TreeNode', 'goog.testing.jsunit'], {});
+goog.addDependency('structs/trie.js', ['goog.structs.Trie'], ['goog.object', 'goog.structs'], {});
+goog.addDependency('structs/trie_test.js', ['goog.structs.TrieTest'], ['goog.object', 'goog.structs', 'goog.structs.Trie', 'goog.testing.jsunit'], {});
+goog.addDependency('style/bidi.js', ['goog.style.bidi'], ['goog.dom', 'goog.style', 'goog.userAgent', 'goog.userAgent.platform', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('style/bidi_test.js', ['goog.style.bidiTest'], ['goog.dom', 'goog.style', 'goog.style.bidi', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('style/cursor.js', ['goog.style.cursor'], ['goog.userAgent'], {});
+goog.addDependency('style/cursor_test.js', ['goog.style.cursorTest'], ['goog.style.cursor', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('style/style.js', ['goog.style'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.vendor', 'goog.html.SafeStyleSheet', 'goog.html.legacyconversions', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.reflect', 'goog.string', 'goog.userAgent'], {});
+goog.addDependency('style/style_document_scroll_test.js', ['goog.style.style_document_scroll_test'], ['goog.dom', 'goog.style', 'goog.testing.jsunit'], {});
+goog.addDependency('style/style_test.js', ['goog.style_test'], ['goog.array', 'goog.color', 'goog.dom', 'goog.dom.TagName', 'goog.events.BrowserEvent', 'goog.html.testing', 'goog.labs.userAgent.util', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.MockUserAgent', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgentTestUtil', 'goog.userAgentTestUtil.UserAgents'], {});
+goog.addDependency('style/style_webkit_scrollbars_test.js', ['goog.style.webkitScrollbarsTest'], ['goog.asserts', 'goog.style', 'goog.styleScrollbarTester', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('style/stylescrollbartester.js', ['goog.styleScrollbarTester'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.asserts'], {});
+goog.addDependency('style/transform.js', ['goog.style.transform'], ['goog.functions', 'goog.math.Coordinate', 'goog.math.Coordinate3', 'goog.style', 'goog.userAgent', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('style/transform_test.js', ['goog.style.transformTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.style.transform', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('style/transition.js', ['goog.style.transition', 'goog.style.transition.Css3Property'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.dom.vendor', 'goog.functions', 'goog.html.SafeHtml', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('style/transition_test.js', ['goog.style.transitionTest'], ['goog.style', 'goog.style.transition', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('test_module.js', ['goog.test_module'], ['goog.test_module_dep'], {'module': 'goog'});
+goog.addDependency('test_module_dep.js', ['goog.test_module_dep'], [], {'module': 'goog'});
+goog.addDependency('testing/asserts.js', ['goog.testing.asserts'], ['goog.testing.JsUnitException'], {});
+goog.addDependency('testing/asserts_test.js', ['goog.testing.assertsTest'], ['goog.array', 'goog.dom', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.labs.userAgent.browser', 'goog.string', 'goog.structs.Map', 'goog.structs.Set', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('testing/async/mockcontrol.js', ['goog.testing.async.MockControl'], ['goog.asserts', 'goog.async.Deferred', 'goog.debug', 'goog.testing.asserts', 'goog.testing.mockmatchers.IgnoreArgument'], {});
+goog.addDependency('testing/async/mockcontrol_test.js', ['goog.testing.async.MockControlTest'], ['goog.async.Deferred', 'goog.testing.MockControl', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.async.MockControl', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/asynctestcase.js', ['goog.testing.AsyncTestCase', 'goog.testing.AsyncTestCase.ControlBreakingException'], ['goog.testing.TestCase', 'goog.testing.asserts'], {});
+goog.addDependency('testing/asynctestcase_async_test.js', ['goog.testing.AsyncTestCaseAsyncTest'], ['goog.testing.AsyncTestCase', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/asynctestcase_noasync_test.js', ['goog.testing.AsyncTestCaseSyncTest'], ['goog.testing.AsyncTestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/asynctestcase_test.js', ['goog.testing.AsyncTestCaseTest'], ['goog.debug.Error', 'goog.testing.AsyncTestCase', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/benchmark.js', ['goog.testing.benchmark'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTable', 'goog.testing.PerformanceTimer', 'goog.testing.TestCase'], {});
+goog.addDependency('testing/continuationtestcase.js', ['goog.testing.ContinuationTestCase', 'goog.testing.ContinuationTestCase.ContinuationTest', 'goog.testing.ContinuationTestCase.Step'], ['goog.array', 'goog.events.EventHandler', 'goog.testing.TestCase', 'goog.testing.asserts'], {});
+goog.addDependency('testing/continuationtestcase_test.js', ['goog.testing.ContinuationTestCaseTest'], ['goog.events', 'goog.events.EventTarget', 'goog.testing.ContinuationTestCase', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/deferredtestcase.js', ['goog.testing.DeferredTestCase'], ['goog.testing.AsyncTestCase', 'goog.testing.TestCase'], {});
+goog.addDependency('testing/deferredtestcase_test.js', ['goog.testing.DeferredTestCaseTest'], ['goog.async.Deferred', 'goog.testing.DeferredTestCase', 'goog.testing.TestCase', 'goog.testing.TestRunner', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('testing/dom.js', ['goog.testing.dom'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.iter', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.asserts', 'goog.userAgent'], {});
+goog.addDependency('testing/dom_test.js', ['goog.testing.domTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.TestCase', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('testing/editor/dom.js', ['goog.testing.editor.dom'], ['goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagWalkType', 'goog.iter', 'goog.string', 'goog.testing.asserts'], {});
+goog.addDependency('testing/editor/dom_test.js', ['goog.testing.editor.domTest'], ['goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.testing.TestCase', 'goog.testing.editor.dom', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/editor/fieldmock.js', ['goog.testing.editor.FieldMock'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field', 'goog.testing.LooseMock', 'goog.testing.mockmatchers'], {});
+goog.addDependency('testing/editor/testhelper.js', ['goog.testing.editor.TestHelper'], ['goog.Disposable', 'goog.dom', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.node', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.testing.dom'], {});
+goog.addDependency('testing/editor/testhelper_test.js', ['goog.testing.editor.TestHelperTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.node', 'goog.testing.TestCase', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('testing/events/eventobserver.js', ['goog.testing.events.EventObserver'], ['goog.array'], {});
+goog.addDependency('testing/events/eventobserver_test.js', ['goog.testing.events.EventObserverTest'], ['goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.testing.events.EventObserver', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/events/events.js', ['goog.testing.events', 'goog.testing.events.Event'], ['goog.Disposable', 'goog.asserts', 'goog.dom.NodeType', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.object', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('testing/events/events_test.js', ['goog.testing.eventsTest'], ['goog.array', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {});
+goog.addDependency('testing/events/matchers.js', ['goog.testing.events.EventMatcher'], ['goog.events.Event', 'goog.testing.mockmatchers.ArgumentMatcher'], {});
+goog.addDependency('testing/events/matchers_test.js', ['goog.testing.events.EventMatcherTest'], ['goog.events.Event', 'goog.testing.events.EventMatcher', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/events/onlinehandler.js', ['goog.testing.events.OnlineHandler'], ['goog.events.EventTarget', 'goog.net.NetworkStatusMonitor'], {});
+goog.addDependency('testing/events/onlinehandler_test.js', ['goog.testing.events.OnlineHandlerTest'], ['goog.events', 'goog.net.NetworkStatusMonitor', 'goog.testing.events.EventObserver', 'goog.testing.events.OnlineHandler', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/expectedfailures.js', ['goog.testing.ExpectedFailures'], ['goog.asserts', 'goog.debug.DivConsole', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.log', 'goog.style', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.asserts'], {});
+goog.addDependency('testing/expectedfailures_test.js', ['goog.testing.ExpectedFailuresTest'], ['goog.debug.Logger', 'goog.testing.ExpectedFailures', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/blob.js', ['goog.testing.fs.Blob'], ['goog.crypt', 'goog.crypt.base64'], {});
+goog.addDependency('testing/fs/blob_test.js', ['goog.testing.fs.BlobTest'], ['goog.dom', 'goog.testing.fs.Blob', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/directoryentry_test.js', ['goog.testing.fs.DirectoryEntryTest'], ['goog.array', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.testing.MockClock', 'goog.testing.TestCase', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/entry.js', ['goog.testing.fs.DirectoryEntry', 'goog.testing.fs.Entry', 'goog.testing.fs.FileEntry'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.async.Deferred', 'goog.fs.DirectoryEntry', 'goog.fs.DirectoryEntryImpl', 'goog.fs.Entry', 'goog.fs.Error', 'goog.fs.FileEntry', 'goog.functions', 'goog.object', 'goog.string', 'goog.testing.fs.File', 'goog.testing.fs.FileWriter'], {});
+goog.addDependency('testing/fs/entry_test.js', ['goog.testing.fs.EntryTest'], ['goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.testing.MockClock', 'goog.testing.TestCase', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/file.js', ['goog.testing.fs.File'], ['goog.testing.fs.Blob'], {});
+goog.addDependency('testing/fs/fileentry_test.js', ['goog.testing.fs.FileEntryTest'], ['goog.testing.MockClock', 'goog.testing.fs.FileEntry', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/filereader.js', ['goog.testing.fs.FileReader'], ['goog.Timer', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.testing.fs.ProgressEvent'], {});
+goog.addDependency('testing/fs/filereader_test.js', ['goog.testing.fs.FileReaderTest'], ['goog.Promise', 'goog.array', 'goog.events', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.object', 'goog.testing.events.EventObserver', 'goog.testing.fs.FileReader', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/filesystem.js', ['goog.testing.fs.FileSystem'], ['goog.fs.FileSystem', 'goog.testing.fs.DirectoryEntry'], {});
+goog.addDependency('testing/fs/filewriter.js', ['goog.testing.fs.FileWriter'], ['goog.Timer', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.string', 'goog.testing.fs.ProgressEvent'], {});
+goog.addDependency('testing/fs/filewriter_test.js', ['goog.testing.fs.FileWriterTest'], ['goog.Promise', 'goog.array', 'goog.events', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.object', 'goog.testing.MockClock', 'goog.testing.events.EventObserver', 'goog.testing.fs.Blob', 'goog.testing.fs.FileSystem', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/fs.js', ['goog.testing.fs'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.fs', 'goog.testing.fs.Blob', 'goog.testing.fs.FileSystem'], {});
+goog.addDependency('testing/fs/fs_test.js', ['goog.testing.fsTest'], ['goog.testing.fs', 'goog.testing.fs.Blob', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/integration_test.js', ['goog.testing.fs.integrationTest'], ['goog.Promise', 'goog.events', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.testing.PropertyReplacer', 'goog.testing.fs', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/fs/progressevent.js', ['goog.testing.fs.ProgressEvent'], ['goog.events.Event'], {});
+goog.addDependency('testing/functionmock.js', ['goog.testing', 'goog.testing.FunctionMock', 'goog.testing.GlobalFunctionMock', 'goog.testing.MethodMock'], ['goog.object', 'goog.testing.LooseMock', 'goog.testing.Mock', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock'], {});
+goog.addDependency('testing/functionmock_test.js', ['goog.testing.FunctionMockTest'], ['goog.array', 'goog.string', 'goog.testing', 'goog.testing.FunctionMock', 'goog.testing.Mock', 'goog.testing.ObjectPropertyString', 'goog.testing.StrictMock', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.mockmatchers'], {});
+goog.addDependency('testing/graphics.js', ['goog.testing.graphics'], ['goog.graphics.Path', 'goog.testing.asserts'], {});
+goog.addDependency('testing/i18n/asserts.js', ['goog.testing.i18n.asserts'], ['goog.testing.jsunit'], {});
+goog.addDependency('testing/i18n/asserts_test.js', ['goog.testing.i18n.assertsTest'], ['goog.testing.ExpectedFailures', 'goog.testing.i18n.asserts'], {});
+goog.addDependency('testing/jstdasyncwrapper.js', ['goog.testing.JsTdAsyncWrapper'], ['goog.Promise'], {});
+goog.addDependency('testing/jstdtestcaseadapter.js', ['goog.testing.JsTdTestCaseAdapter'], ['goog.async.run', 'goog.functions', 'goog.testing.JsTdAsyncWrapper', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/jsunit.js', ['goog.testing.jsunit'], ['goog.dom.TagName', 'goog.testing.TestCase', 'goog.testing.TestRunner'], {});
+goog.addDependency('testing/jsunitexception.js', ['goog.testing.JsUnitException'], ['goog.testing.stacktrace'], {});
+goog.addDependency('testing/loosemock.js', ['goog.testing.LooseExpectationCollection', 'goog.testing.LooseMock'], ['goog.array', 'goog.structs.Map', 'goog.testing.Mock'], {});
+goog.addDependency('testing/loosemock_test.js', ['goog.testing.LooseMockTest'], ['goog.testing.LooseMock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.mockmatchers'], {});
+goog.addDependency('testing/messaging/mockmessagechannel.js', ['goog.testing.messaging.MockMessageChannel'], ['goog.messaging.AbstractChannel', 'goog.testing.asserts'], {});
+goog.addDependency('testing/messaging/mockmessageevent.js', ['goog.testing.messaging.MockMessageEvent'], ['goog.events.BrowserEvent', 'goog.events.EventType', 'goog.testing.events.Event'], {});
+goog.addDependency('testing/messaging/mockmessageport.js', ['goog.testing.messaging.MockMessagePort'], ['goog.events.EventTarget'], {});
+goog.addDependency('testing/messaging/mockportnetwork.js', ['goog.testing.messaging.MockPortNetwork'], ['goog.messaging.PortNetwork', 'goog.testing.messaging.MockMessageChannel'], {});
+goog.addDependency('testing/mock.js', ['goog.testing.Mock', 'goog.testing.MockExpectation'], ['goog.array', 'goog.object', 'goog.testing.JsUnitException', 'goog.testing.MockInterface', 'goog.testing.mockmatchers'], {});
+goog.addDependency('testing/mock_test.js', ['goog.testing.MockTest'], ['goog.array', 'goog.testing', 'goog.testing.Mock', 'goog.testing.MockControl', 'goog.testing.MockExpectation', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockclassfactory.js', ['goog.testing.MockClassFactory', 'goog.testing.MockClassRecord'], ['goog.array', 'goog.object', 'goog.testing.LooseMock', 'goog.testing.StrictMock', 'goog.testing.TestCase', 'goog.testing.mockmatchers'], {});
+goog.addDependency('testing/mockclassfactory_test.js', ['fake.BaseClass', 'fake.ChildClass', 'goog.testing.MockClassFactoryTest'], ['goog.testing', 'goog.testing.MockClassFactory', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockclock.js', ['goog.testing.MockClock'], ['goog.Disposable', 'goog.Promise', 'goog.Thenable', 'goog.async.run', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event'], {});
+goog.addDependency('testing/mockclock_test.js', ['goog.testing.MockClockTest'], ['goog.Promise', 'goog.Timer', 'goog.events', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction'], {});
+goog.addDependency('testing/mockcontrol.js', ['goog.testing.MockControl'], ['goog.array', 'goog.testing', 'goog.testing.LooseMock', 'goog.testing.StrictMock'], {});
+goog.addDependency('testing/mockcontrol_test.js', ['goog.testing.MockControlTest'], ['goog.testing.Mock', 'goog.testing.MockControl', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockinterface.js', ['goog.testing.MockInterface'], [], {});
+goog.addDependency('testing/mockmatchers.js', ['goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.mockmatchers.IgnoreArgument', 'goog.testing.mockmatchers.InstanceOf', 'goog.testing.mockmatchers.ObjectEquals', 'goog.testing.mockmatchers.RegexpMatch', 'goog.testing.mockmatchers.SaveArgument', 'goog.testing.mockmatchers.TypeOf'], ['goog.array', 'goog.dom', 'goog.testing.asserts'], {});
+goog.addDependency('testing/mockmatchers_test.js', ['goog.testing.mockmatchersTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher'], {});
+goog.addDependency('testing/mockrandom.js', ['goog.testing.MockRandom'], ['goog.Disposable'], {});
+goog.addDependency('testing/mockrandom_test.js', ['goog.testing.MockRandomTest'], ['goog.testing.MockRandom', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockrange.js', ['goog.testing.MockRange'], ['goog.dom.AbstractRange', 'goog.testing.LooseMock'], {});
+goog.addDependency('testing/mockrange_test.js', ['goog.testing.MockRangeTest'], ['goog.testing.MockRange', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockstorage.js', ['goog.testing.MockStorage'], ['goog.structs.Map'], {});
+goog.addDependency('testing/mockstorage_test.js', ['goog.testing.MockStorageTest'], ['goog.testing.MockStorage', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/mockuseragent.js', ['goog.testing.MockUserAgent'], ['goog.Disposable', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.userAgent'], {});
+goog.addDependency('testing/mockuseragent_test.js', ['goog.testing.MockUserAgentTest'], ['goog.dispose', 'goog.testing.MockUserAgent', 'goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('testing/multitestrunner.js', ['goog.testing.MultiTestRunner', 'goog.testing.MultiTestRunner.TestFrame'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.functions', 'goog.object', 'goog.string', 'goog.testing.TestCase', 'goog.ui.Component', 'goog.ui.ServerChart', 'goog.ui.TableSorter'], {});
+goog.addDependency('testing/multitestrunner_test.js', ['goog.testing.MultiTestRunnerTest'], ['goog.Promise', 'goog.events', 'goog.testing.MockControl', 'goog.testing.MultiTestRunner', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('testing/net/mockiframeio.js', ['goog.testing.net.MockIFrameIo'], ['goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.IframeIo', 'goog.testing.TestQueue'], {});
+goog.addDependency('testing/net/xhrio.js', ['goog.testing.net.XhrIo'], ['goog.array', 'goog.dom.xml', 'goog.events', 'goog.events.EventTarget', 'goog.json', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.object', 'goog.structs', 'goog.structs.Map', 'goog.testing.TestQueue', 'goog.uri.utils'], {});
+goog.addDependency('testing/net/xhrio_test.js', ['goog.testing.net.XhrIoTest'], ['goog.dom.xml', 'goog.events', 'goog.events.Event', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.testing.MockControl', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.mockmatchers.InstanceOf', 'goog.testing.net.XhrIo'], {});
+goog.addDependency('testing/net/xhriopool.js', ['goog.testing.net.XhrIoPool'], ['goog.net.XhrIoPool', 'goog.testing.net.XhrIo'], {});
+goog.addDependency('testing/objectpropertystring.js', ['goog.testing.ObjectPropertyString'], [], {});
+goog.addDependency('testing/parallel_closure_test_suite.js', ['goog.testing.parallelClosureTestSuite'], ['goog.Promise', 'goog.events', 'goog.json', 'goog.testing.MultiTestRunner', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('testing/parallel_closure_test_suite_test.js', ['goog.testing.parallelClosureTestSuiteTest'], ['goog.dom', 'goog.testing.MockControl', 'goog.testing.MultiTestRunner', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.parallelClosureTestSuite', 'goog.testing.testSuite'], {'module': 'goog'});
+goog.addDependency('testing/performancetable.js', ['goog.testing.PerformanceTable'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTimer'], {});
+goog.addDependency('testing/performancetimer.js', ['goog.testing.PerformanceTimer', 'goog.testing.PerformanceTimer.Task'], ['goog.array', 'goog.async.Deferred', 'goog.math'], {'lang': 'es6'});
+goog.addDependency('testing/performancetimer_test.js', ['goog.testing.PerformanceTimerTest'], ['goog.async.Deferred', 'goog.dom', 'goog.math', 'goog.testing.MockClock', 'goog.testing.PerformanceTimer', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/propertyreplacer.js', ['goog.testing.PropertyReplacer'], ['goog.testing.ObjectPropertyString', 'goog.userAgent'], {});
+goog.addDependency('testing/propertyreplacer_test.js', ['goog.testing.PropertyReplacerTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('testing/proto2/proto2.js', ['goog.testing.proto2'], ['goog.proto2.Message', 'goog.proto2.ObjectSerializer', 'goog.testing.asserts'], {});
+goog.addDependency('testing/proto2/proto2_test.js', ['goog.testing.proto2Test'], ['goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.proto2', 'proto2.TestAllTypes'], {});
+goog.addDependency('testing/pseudorandom.js', ['goog.testing.PseudoRandom'], ['goog.Disposable'], {});
+goog.addDependency('testing/pseudorandom_test.js', ['goog.testing.PseudoRandomTest'], ['goog.testing.PseudoRandom', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/recordfunction.js', ['goog.testing.FunctionCall', 'goog.testing.recordConstructor', 'goog.testing.recordFunction'], ['goog.testing.asserts'], {});
+goog.addDependency('testing/recordfunction_test.js', ['goog.testing.recordFunctionTest'], ['goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.recordConstructor', 'goog.testing.recordFunction'], {});
+goog.addDependency('testing/shardingtestcase.js', ['goog.testing.ShardingTestCase'], ['goog.asserts', 'goog.testing.TestCase'], {});
+goog.addDependency('testing/shardingtestcase_test.js', ['goog.testing.ShardingTestCaseTest'], ['goog.testing.ShardingTestCase', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/singleton.js', ['goog.testing.singleton'], [], {});
+goog.addDependency('testing/singleton_test.js', ['goog.testing.singletonTest'], ['goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.singleton'], {});
+goog.addDependency('testing/stacktrace.js', ['goog.testing.stacktrace', 'goog.testing.stacktrace.Frame'], [], {});
+goog.addDependency('testing/stacktrace_test.js', ['goog.testing.stacktraceTest'], ['goog.functions', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.stacktrace', 'goog.testing.stacktrace.Frame', 'goog.userAgent'], {});
+goog.addDependency('testing/storage/fakemechanism.js', ['goog.testing.storage.FakeMechanism'], ['goog.storage.mechanism.IterableMechanism', 'goog.structs.Map'], {});
+goog.addDependency('testing/strictmock.js', ['goog.testing.StrictMock'], ['goog.array', 'goog.testing.Mock'], {});
+goog.addDependency('testing/strictmock_test.js', ['goog.testing.StrictMockTest'], ['goog.testing.StrictMock', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/style/layoutasserts.js', ['goog.testing.style.layoutasserts'], ['goog.style', 'goog.testing.asserts', 'goog.testing.style'], {});
+goog.addDependency('testing/style/layoutasserts_test.js', ['goog.testing.style.layoutassertsTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.style.layoutasserts'], {});
+goog.addDependency('testing/style/style.js', ['goog.testing.style'], ['goog.dom', 'goog.math.Rect', 'goog.style'], {});
+goog.addDependency('testing/style/style_test.js', ['goog.testing.styleTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.jsunit', 'goog.testing.style'], {});
+goog.addDependency('testing/testcase.js', ['goog.testing.TestCase', 'goog.testing.TestCase.Error', 'goog.testing.TestCase.Order', 'goog.testing.TestCase.Result', 'goog.testing.TestCase.Test'], ['goog.Promise', 'goog.Thenable', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.json', 'goog.object', 'goog.testing.JsUnitException', 'goog.testing.asserts'], {});
+goog.addDependency('testing/testcase_test.js', ['goog.testing.TestCaseTest'], ['goog.Promise', 'goog.Timer', 'goog.functions', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.JsUnitException', 'goog.testing.MethodMock', 'goog.testing.MockRandom', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});
+goog.addDependency('testing/testqueue.js', ['goog.testing.TestQueue'], [], {});
+goog.addDependency('testing/testrunner.js', ['goog.testing.TestRunner'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.TestCase'], {});
+goog.addDependency('testing/testrunner_test.js', ['goog.testing.TestRunnerTest'], ['goog.testing.TestCase', 'goog.testing.TestRunner', 'goog.testing.asserts', 'goog.testing.jsunit'], {'lang': 'es6'});
+goog.addDependency('testing/testsuite.js', ['goog.testing.testSuite'], ['goog.labs.testing.Environment', 'goog.testing.TestCase'], {});
+goog.addDependency('testing/ui/rendererasserts.js', ['goog.testing.ui.rendererasserts'], ['goog.testing.asserts', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('testing/ui/rendererasserts_test.js', ['goog.testing.ui.rendererassertsTest'], ['goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('testing/ui/rendererharness.js', ['goog.testing.ui.RendererHarness'], ['goog.Disposable', 'goog.dom.NodeType', 'goog.testing.asserts', 'goog.testing.dom'], {});
+goog.addDependency('testing/ui/style.js', ['goog.testing.ui.style'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.testing.asserts'], {});
+goog.addDependency('testing/ui/style_test.js', ['goog.testing.ui.styleTest'], ['goog.dom', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.testing.ui.style'], {});
+goog.addDependency('timer/timer.js', ['goog.Timer'], ['goog.Promise', 'goog.events.EventTarget'], {});
+goog.addDependency('timer/timer_test.js', ['goog.TimerTest'], ['goog.Promise', 'goog.Timer', 'goog.events', 'goog.testing.MockClock', 'goog.testing.jsunit'], {});
+goog.addDependency('tweak/entries.js', ['goog.tweak.BaseEntry', 'goog.tweak.BasePrimitiveSetting', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting'], ['goog.array', 'goog.asserts', 'goog.log', 'goog.object'], {});
+goog.addDependency('tweak/entries_test.js', ['goog.tweak.BaseEntryTest'], ['goog.testing.MockControl', 'goog.testing.jsunit', 'goog.tweak.testhelpers'], {});
+goog.addDependency('tweak/registry.js', ['goog.tweak.Registry'], ['goog.array', 'goog.asserts', 'goog.log', 'goog.string', 'goog.tweak.BasePrimitiveSetting', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting', 'goog.uri.utils'], {});
+goog.addDependency('tweak/registry_test.js', ['goog.tweak.RegistryTest'], ['goog.asserts.AssertionError', 'goog.testing.jsunit', 'goog.tweak', 'goog.tweak.testhelpers'], {});
+goog.addDependency('tweak/testhelpers.js', ['goog.tweak.testhelpers'], ['goog.tweak', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.Registry', 'goog.tweak.StringSetting'], {});
+goog.addDependency('tweak/tweak.js', ['goog.tweak', 'goog.tweak.ConfigParams'], ['goog.asserts', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.Registry', 'goog.tweak.StringSetting'], {});
+goog.addDependency('tweak/tweakui.js', ['goog.tweak.EntriesPanel', 'goog.tweak.TweakUi'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.object', 'goog.string.Const', 'goog.style', 'goog.tweak', 'goog.tweak.BaseEntry', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting', 'goog.ui.Zippy', 'goog.userAgent'], {});
+goog.addDependency('tweak/tweakui_test.js', ['goog.tweak.TweakUiTest'], ['goog.dom', 'goog.dom.TagName', 'goog.string', 'goog.testing.jsunit', 'goog.tweak', 'goog.tweak.TweakUi', 'goog.tweak.testhelpers'], {});
+goog.addDependency('ui/abstractspellchecker.js', ['goog.ui.AbstractSpellChecker', 'goog.ui.AbstractSpellChecker.AsyncResult'], ['goog.a11y.aria', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.selection', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.spell.SpellCheck', 'goog.structs.Set', 'goog.style', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.PopupMenu'], {});
+goog.addDependency('ui/ac/ac.js', ['goog.ui.ac'], ['goog.ui.ac.ArrayMatcher', 'goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.Renderer'], {});
+goog.addDependency('ui/ac/ac_test.js', ['goog.ui.acTest'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.dom.selection', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.ui.ac', 'goog.userAgent'], {});
+goog.addDependency('ui/ac/arraymatcher.js', ['goog.ui.ac.ArrayMatcher'], ['goog.string'], {});
+goog.addDependency('ui/ac/arraymatcher_test.js', ['goog.ui.ac.ArrayMatcherTest'], ['goog.testing.jsunit', 'goog.ui.ac.ArrayMatcher'], {});
+goog.addDependency('ui/ac/autocomplete.js', ['goog.ui.ac.AutoComplete', 'goog.ui.ac.AutoComplete.EventType'], ['goog.array', 'goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.object', 'goog.ui.ac.RenderOptions'], {});
+goog.addDependency('ui/ac/autocomplete_test.js', ['goog.ui.ac.AutoCompleteTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.string', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.RenderOptions', 'goog.ui.ac.Renderer'], {});
+goog.addDependency('ui/ac/cachingmatcher.js', ['goog.ui.ac.CachingMatcher'], ['goog.array', 'goog.async.Throttle', 'goog.ui.ac.ArrayMatcher', 'goog.ui.ac.RenderOptions'], {});
+goog.addDependency('ui/ac/cachingmatcher_test.js', ['goog.ui.ac.CachingMatcherTest'], ['goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.ui.ac.CachingMatcher'], {});
+goog.addDependency('ui/ac/inputhandler.js', ['goog.ui.ac.InputHandler'], ['goog.Disposable', 'goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.selection', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('ui/ac/inputhandler_test.js', ['goog.ui.ac.InputHandlerTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.selection', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.KeyCodes', 'goog.functions', 'goog.object', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.ui.ac.InputHandler', 'goog.userAgent'], {});
+goog.addDependency('ui/ac/remote.js', ['goog.ui.ac.Remote'], ['goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.RemoteArrayMatcher', 'goog.ui.ac.Renderer'], {});
+goog.addDependency('ui/ac/remotearraymatcher.js', ['goog.ui.ac.RemoteArrayMatcher'], ['goog.Disposable', 'goog.Uri', 'goog.events', 'goog.net.EventType', 'goog.net.XhrIo'], {});
+goog.addDependency('ui/ac/remotearraymatcher_test.js', ['goog.ui.ac.RemoteArrayMatcherTest'], ['goog.net.XhrIo', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.ui.ac.RemoteArrayMatcher'], {});
+goog.addDependency('ui/ac/renderer.js', ['goog.ui.ac.Renderer', 'goog.ui.ac.Renderer.CustomRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dispose', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOutAndHide', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.string', 'goog.style', 'goog.ui.IdGenerator', 'goog.ui.ac.AutoComplete'], {});
+goog.addDependency('ui/ac/renderer_test.js', ['goog.ui.ac.RendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOutAndHide', 'goog.string', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.ac.AutoComplete', 'goog.ui.ac.Renderer'], {});
+goog.addDependency('ui/ac/renderoptions.js', ['goog.ui.ac.RenderOptions'], [], {});
+goog.addDependency('ui/ac/richinputhandler.js', ['goog.ui.ac.RichInputHandler'], ['goog.ui.ac.InputHandler'], {});
+goog.addDependency('ui/ac/richremote.js', ['goog.ui.ac.RichRemote'], ['goog.ui.ac.AutoComplete', 'goog.ui.ac.Remote', 'goog.ui.ac.Renderer', 'goog.ui.ac.RichInputHandler', 'goog.ui.ac.RichRemoteArrayMatcher'], {});
+goog.addDependency('ui/ac/richremotearraymatcher.js', ['goog.ui.ac.RichRemoteArrayMatcher'], ['goog.dom', 'goog.ui.ac.RemoteArrayMatcher'], {});
+goog.addDependency('ui/ac/richremotearraymatcher_test.js', ['goog.ui.ac.RichRemoteArrayMatcherTest'], ['goog.net.XhrIo', 'goog.testing.MockControl', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.ui.ac.RichRemoteArrayMatcher'], {});
+goog.addDependency('ui/activitymonitor.js', ['goog.ui.ActivityMonitor'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType'], {});
+goog.addDependency('ui/activitymonitor_test.js', ['goog.ui.ActivityMonitorTest'], ['goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.ActivityMonitor'], {});
+goog.addDependency('ui/advancedtooltip.js', ['goog.ui.AdvancedTooltip'], ['goog.events', 'goog.events.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Tooltip', 'goog.userAgent'], {});
+goog.addDependency('ui/advancedtooltip_test.js', ['goog.ui.AdvancedTooltipTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.AdvancedTooltip', 'goog.ui.Tooltip', 'goog.userAgent'], {});
+goog.addDependency('ui/animatedzippy.js', ['goog.ui.AnimatedZippy'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.fx.easing', 'goog.ui.Zippy', 'goog.ui.ZippyEvent'], {});
+goog.addDependency('ui/animatedzippy_test.js', ['goog.ui.AnimatedZippyTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events', 'goog.functions', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.ui.AnimatedZippy', 'goog.ui.Zippy'], {});
+goog.addDependency('ui/attachablemenu.js', ['goog.ui.AttachableMenu'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.ui.ItemEvent', 'goog.ui.MenuBase', 'goog.ui.PopupBase', 'goog.userAgent'], {});
+goog.addDependency('ui/bidiinput.js', ['goog.ui.BidiInput'], ['goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.InputHandler', 'goog.i18n.bidi', 'goog.ui.Component'], {});
+goog.addDependency('ui/bidiinput_test.js', ['goog.ui.BidiInputTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.BidiInput'], {});
+goog.addDependency('ui/bubble.js', ['goog.ui.Bubble'], ['goog.Timer', 'goog.dom.safe', 'goog.events', 'goog.events.EventType', 'goog.html.SafeHtml', 'goog.math.Box', 'goog.positioning', 'goog.positioning.AbsolutePosition', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.CornerBit', 'goog.string.Const', 'goog.style', 'goog.ui.Component', 'goog.ui.Popup'], {});
+goog.addDependency('ui/button.js', ['goog.ui.Button', 'goog.ui.Button.Side'], ['goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.NativeButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/button_test.js', ['goog.ui.ButtonTest'], ['goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.NativeButtonRenderer'], {});
+goog.addDependency('ui/buttonrenderer.js', ['goog.ui.ButtonRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/buttonrenderer_test.js', ['goog.ui.ButtonRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.ExpectedFailures', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/buttonside.js', ['goog.ui.ButtonSide'], [], {});
+goog.addDependency('ui/charcounter.js', ['goog.ui.CharCounter', 'goog.ui.CharCounter.Display'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.InputHandler'], {});
+goog.addDependency('ui/charcounter_test.js', ['goog.ui.CharCounterTest'], ['goog.dom', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.ui.CharCounter', 'goog.userAgent'], {});
+goog.addDependency('ui/charpicker.js', ['goog.ui.CharPicker'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.i18n.CharListDecompressor', 'goog.i18n.CharPickerData', 'goog.i18n.uChar', 'goog.i18n.uChar.NameFetcher', 'goog.structs.Set', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.ContainerScroller', 'goog.ui.FlatButtonRenderer', 'goog.ui.HoverCard', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.Tooltip'], {});
+goog.addDependency('ui/charpicker_test.js', ['goog.ui.CharPickerTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dispose', 'goog.dom', 'goog.events.Event', 'goog.events.EventType', 'goog.i18n.CharPickerData', 'goog.i18n.uChar.NameFetcher', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.ui.CharPicker', 'goog.ui.FlatButtonRenderer'], {});
+goog.addDependency('ui/checkbox.js', ['goog.ui.Checkbox', 'goog.ui.Checkbox.State'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.string', 'goog.ui.CheckboxRenderer', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.registry'], {});
+goog.addDependency('ui/checkbox_test.js', ['goog.ui.CheckboxTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.KeyCodes', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Checkbox', 'goog.ui.CheckboxRenderer', 'goog.ui.Component', 'goog.ui.ControlRenderer', 'goog.ui.decorate'], {});
+goog.addDependency('ui/checkboxmenuitem.js', ['goog.ui.CheckBoxMenuItem'], ['goog.ui.MenuItem', 'goog.ui.registry'], {});
+goog.addDependency('ui/checkboxrenderer.js', ['goog.ui.CheckboxRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.object', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/colormenubutton.js', ['goog.ui.ColorMenuButton'], ['goog.array', 'goog.object', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.ColorPalette', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.registry'], {});
+goog.addDependency('ui/colormenubuttonrenderer.js', ['goog.ui.ColorMenuButtonRenderer'], ['goog.asserts', 'goog.color', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.MenuButtonRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/colormenubuttonrenderer_test.js', ['goog.ui.ColorMenuButtonTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.testing.ui.RendererHarness', 'goog.testing.ui.rendererasserts', 'goog.ui.ColorMenuButton', 'goog.ui.ColorMenuButtonRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/colorpalette.js', ['goog.ui.ColorPalette'], ['goog.array', 'goog.color', 'goog.dom.TagName', 'goog.style', 'goog.ui.Palette', 'goog.ui.PaletteRenderer'], {});
+goog.addDependency('ui/colorpalette_test.js', ['goog.ui.ColorPaletteTest'], ['goog.color', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.ui.ColorPalette'], {});
+goog.addDependency('ui/colorpicker.js', ['goog.ui.ColorPicker', 'goog.ui.ColorPicker.EventType'], ['goog.ui.ColorPalette', 'goog.ui.Component'], {});
+goog.addDependency('ui/combobox.js', ['goog.ui.ComboBox', 'goog.ui.ComboBoxItem'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.log', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ItemEvent', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.registry', 'goog.userAgent'], {});
+goog.addDependency('ui/combobox_test.js', ['goog.ui.ComboBoxTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.ComboBox', 'goog.ui.ComboBoxItem', 'goog.ui.Component', 'goog.ui.ControlRenderer', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuItem'], {});
+goog.addDependency('ui/component.js', ['goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Component.State'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.object', 'goog.style', 'goog.ui.IdGenerator'], {});
+goog.addDependency('ui/component_test.js', ['goog.ui.ComponentTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.events.EventTarget', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.Component'], {});
+goog.addDependency('ui/container.js', ['goog.ui.Container', 'goog.ui.Container.EventType', 'goog.ui.Container.Orientation'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.object', 'goog.style', 'goog.ui.Component', 'goog.ui.ContainerRenderer', 'goog.ui.Control'], {});
+goog.addDependency('ui/container_test.js', ['goog.ui.ContainerTest'], ['goog.a11y.aria', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.events.KeyEvent', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Control'], {});
+goog.addDependency('ui/containerrenderer.js', ['goog.ui.ContainerRenderer'], ['goog.a11y.aria', 'goog.array', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.style', 'goog.ui.registry', 'goog.userAgent'], {});
+goog.addDependency('ui/containerrenderer_test.js', ['goog.ui.ContainerRendererTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Container', 'goog.ui.ContainerRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/containerscroller.js', ['goog.ui.ContainerScroller'], ['goog.Disposable', 'goog.Timer', 'goog.events.EventHandler', 'goog.style', 'goog.ui.Component', 'goog.ui.Container'], {});
+goog.addDependency('ui/containerscroller_test.js', ['goog.ui.ContainerScrollerTest'], ['goog.dom', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Container', 'goog.ui.ContainerScroller'], {});
+goog.addDependency('ui/control.js', ['goog.ui.Control'], ['goog.Disposable', 'goog.array', 'goog.dom', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.ui.Component', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer', 'goog.ui.registry', 'goog.userAgent'], {});
+goog.addDependency('ui/control_test.js', ['goog.ui.ControlTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.html.testing', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.ControlRenderer', 'goog.ui.registry', 'goog.userAgent'], {});
+goog.addDependency('ui/controlcontent.js', ['goog.ui.ControlContent'], [], {});
+goog.addDependency('ui/controlrenderer.js', ['goog.ui.ControlRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.object', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ControlContent', 'goog.userAgent'], {});
+goog.addDependency('ui/controlrenderer_test.js', ['goog.ui.ControlRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.object', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.ControlRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/cookieeditor.js', ['goog.ui.CookieEditor'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.events.EventType', 'goog.net.cookies', 'goog.string', 'goog.style', 'goog.ui.Component'], {});
+goog.addDependency('ui/cookieeditor_test.js', ['goog.ui.CookieEditorTest'], ['goog.dom', 'goog.events.Event', 'goog.events.EventType', 'goog.net.cookies', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.CookieEditor'], {});
+goog.addDependency('ui/css3buttonrenderer.js', ['goog.ui.Css3ButtonRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.Component', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});
+goog.addDependency('ui/css3menubuttonrenderer.js', ['goog.ui.Css3MenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/cssnames.js', ['goog.ui.INLINE_BLOCK_CLASSNAME'], [], {});
+goog.addDependency('ui/custombutton.js', ['goog.ui.CustomButton'], ['goog.ui.Button', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/custombuttonrenderer.js', ['goog.ui.CustomButtonRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.ui.ButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME'], {});
+goog.addDependency('ui/customcolorpalette.js', ['goog.ui.CustomColorPalette'], ['goog.color', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.ColorPalette', 'goog.ui.Component'], {});
+goog.addDependency('ui/customcolorpalette_test.js', ['goog.ui.CustomColorPaletteTest'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.ui.CustomColorPalette'], {});
+goog.addDependency('ui/datepicker.js', ['goog.ui.DatePicker', 'goog.ui.DatePicker.Events', 'goog.ui.DatePickerEvent'], ['goog.a11y.aria', 'goog.asserts', 'goog.date.Date', 'goog.date.DateRange', 'goog.date.Interval', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns', 'goog.i18n.DateTimeSymbols', 'goog.style', 'goog.ui.Component', 'goog.ui.DefaultDatePickerRenderer', 'goog.ui.IdGenerator'], {});
+goog.addDependency('ui/datepicker_test.js', ['goog.ui.DatePickerTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.date.Date', 'goog.date.DateRange', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.KeyCodes', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.DatePicker'], {});
+goog.addDependency('ui/datepickerrenderer.js', ['goog.ui.DatePickerRenderer'], [], {});
+goog.addDependency('ui/decorate.js', ['goog.ui.decorate'], ['goog.ui.registry'], {});
+goog.addDependency('ui/decorate_test.js', ['goog.ui.decorateTest'], ['goog.testing.jsunit', 'goog.ui.decorate', 'goog.ui.registry'], {});
+goog.addDependency('ui/defaultdatepickerrenderer.js', ['goog.ui.DefaultDatePickerRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.DatePickerRenderer'], {});
+goog.addDependency('ui/dialog.js', ['goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.ButtonSet.DefaultButtons', 'goog.ui.Dialog.DefaultButtonCaptions', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.Event', 'goog.ui.Dialog.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.safe', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Dragger', 'goog.html.SafeHtml', 'goog.math.Rect', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.ModalPopup'], {});
+goog.addDependency('ui/dialog_test.js', ['goog.ui.DialogTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.css3', 'goog.html.SafeHtml', 'goog.html.testing', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Dialog', 'goog.userAgent'], {});
+goog.addDependency('ui/dimensionpicker.js', ['goog.ui.DimensionPicker'], ['goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.DimensionPickerRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/dimensionpicker_test.js', ['goog.ui.DimensionPickerTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.DimensionPicker', 'goog.ui.DimensionPickerRenderer'], {});
+goog.addDependency('ui/dimensionpickerrenderer.js', ['goog.ui.DimensionPickerRenderer'], ['goog.a11y.aria.Announcer', 'goog.a11y.aria.LivePriority', 'goog.dom', 'goog.dom.TagName', 'goog.i18n.bidi', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/dimensionpickerrenderer_test.js', ['goog.ui.DimensionPickerRendererTest'], ['goog.a11y.aria.LivePriority', 'goog.array', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.DimensionPicker', 'goog.ui.DimensionPickerRenderer'], {});
+goog.addDependency('ui/dragdropdetector.js', ['goog.ui.DragDropDetector', 'goog.ui.DragDropDetector.EventType', 'goog.ui.DragDropDetector.ImageDropEvent', 'goog.ui.DragDropDetector.LinkDropEvent'], ['goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('ui/drilldownrow.js', ['goog.ui.DrilldownRow'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.string.Unicode', 'goog.ui.Component'], {});
+goog.addDependency('ui/drilldownrow_test.js', ['goog.ui.DrilldownRowTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.SafeHtml', 'goog.testing.jsunit', 'goog.ui.DrilldownRow'], {});
+goog.addDependency('ui/editor/abstractdialog.js', ['goog.ui.editor.AbstractDialog', 'goog.ui.editor.AbstractDialog.Builder', 'goog.ui.editor.AbstractDialog.EventType'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventTarget', 'goog.string', 'goog.ui.Dialog', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/editor/abstractdialog_test.js', ['goog.ui.editor.AbstractDialogTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.KeyCodes', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.ui.editor.AbstractDialog', 'goog.userAgent'], {});
+goog.addDependency('ui/editor/bubble.js', ['goog.ui.editor.Bubble'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.ViewportSizeMonitor', 'goog.dom.classlist', 'goog.editor.style', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.functions', 'goog.log', 'goog.math.Box', 'goog.object', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.PopupBase', 'goog.userAgent'], {});
+goog.addDependency('ui/editor/bubble_test.js', ['goog.ui.editor.BubbleTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.positioning.Corner', 'goog.positioning.OverflowStatus', 'goog.string', 'goog.style', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.editor.Bubble', 'goog.userAgent.product'], {});
+goog.addDependency('ui/editor/defaulttoolbar.js', ['goog.ui.editor.ButtonDescriptor', 'goog.ui.editor.DefaultToolbar'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.Command', 'goog.style', 'goog.ui.editor.ToolbarFactory', 'goog.ui.editor.messages', 'goog.userAgent'], {});
+goog.addDependency('ui/editor/linkdialog.js', ['goog.ui.editor.LinkDialog', 'goog.ui.editor.LinkDialog.BeforeTestLinkEvent', 'goog.ui.editor.LinkDialog.EventType', 'goog.ui.editor.LinkDialog.OkEvent'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.editor.BrowserFeature', 'goog.editor.Link', 'goog.editor.focus', 'goog.editor.node', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.InputHandler', 'goog.html.SafeHtml', 'goog.html.SafeHtmlFormatter', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.LinkButtonRenderer', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.TabPane', 'goog.ui.editor.messages', 'goog.userAgent', 'goog.window'], {});
+goog.addDependency('ui/editor/linkdialog_test.js', ['goog.ui.editor.LinkDialogTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Link', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.LinkDialog', 'goog.ui.editor.messages', 'goog.userAgent'], {});
+goog.addDependency('ui/editor/messages.js', ['goog.ui.editor.messages'], ['goog.html.uncheckedconversions', 'goog.string.Const'], {});
+goog.addDependency('ui/editor/tabpane.js', ['goog.ui.editor.TabPane'], ['goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.Tab', 'goog.ui.TabBar'], {});
+goog.addDependency('ui/editor/toolbarcontroller.js', ['goog.ui.editor.ToolbarController'], ['goog.editor.Field', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.ui.Component'], {});
+goog.addDependency('ui/editor/toolbarfactory.js', ['goog.ui.editor.ToolbarFactory'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Option', 'goog.ui.Toolbar', 'goog.ui.ToolbarButton', 'goog.ui.ToolbarColorMenuButton', 'goog.ui.ToolbarMenuButton', 'goog.ui.ToolbarRenderer', 'goog.ui.ToolbarSelect', 'goog.userAgent'], {});
+goog.addDependency('ui/editor/toolbarfactory_test.js', ['goog.ui.editor.ToolbarFactoryTest'], ['goog.dom', 'goog.testing.ExpectedFailures', 'goog.testing.editor.TestHelper', 'goog.testing.jsunit', 'goog.ui.editor.ToolbarFactory', 'goog.userAgent'], {});
+goog.addDependency('ui/emoji/emoji.js', ['goog.ui.emoji.Emoji'], [], {});
+goog.addDependency('ui/emoji/emojipalette.js', ['goog.ui.emoji.EmojiPalette'], ['goog.events.EventType', 'goog.net.ImageLoader', 'goog.ui.Palette', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPaletteRenderer'], {});
+goog.addDependency('ui/emoji/emojipaletterenderer.js', ['goog.ui.emoji.EmojiPaletteRenderer'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.style', 'goog.ui.PaletteRenderer', 'goog.ui.emoji.Emoji'], {});
+goog.addDependency('ui/emoji/emojipicker.js', ['goog.ui.emoji.EmojiPicker'], ['goog.dom.TagName', 'goog.style', 'goog.ui.Component', 'goog.ui.TabPane', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPalette', 'goog.ui.emoji.EmojiPaletteRenderer', 'goog.ui.emoji.ProgressiveEmojiPaletteRenderer'], {});
+goog.addDependency('ui/emoji/emojipicker_test.js', ['goog.ui.emoji.EmojiPickerTest'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPicker', 'goog.ui.emoji.SpriteInfo'], {});
+goog.addDependency('ui/emoji/fast_nonprogressive_emojipicker_test.js', ['goog.ui.emoji.FastNonProgressiveEmojiPickerTest'], ['goog.Promise', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.net.EventType', 'goog.style', 'goog.testing.jsunit', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPicker', 'goog.ui.emoji.SpriteInfo'], {});
+goog.addDependency('ui/emoji/fast_progressive_emojipicker_test.js', ['goog.ui.emoji.FastProgressiveEmojiPickerTest'], ['goog.Promise', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.net.EventType', 'goog.style', 'goog.testing.jsunit', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPicker', 'goog.ui.emoji.SpriteInfo'], {});
+goog.addDependency('ui/emoji/popupemojipicker.js', ['goog.ui.emoji.PopupEmojiPicker'], ['goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.Component', 'goog.ui.Popup', 'goog.ui.emoji.EmojiPicker'], {});
+goog.addDependency('ui/emoji/popupemojipicker_test.js', ['goog.ui.emoji.PopupEmojiPickerTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.emoji.PopupEmojiPicker'], {});
+goog.addDependency('ui/emoji/progressiveemojipaletterenderer.js', ['goog.ui.emoji.ProgressiveEmojiPaletteRenderer'], ['goog.dom.TagName', 'goog.style', 'goog.ui.emoji.EmojiPaletteRenderer'], {});
+goog.addDependency('ui/emoji/spriteinfo.js', ['goog.ui.emoji.SpriteInfo'], [], {});
+goog.addDependency('ui/emoji/spriteinfo_test.js', ['goog.ui.emoji.SpriteInfoTest'], ['goog.testing.jsunit', 'goog.ui.emoji.SpriteInfo'], {});
+goog.addDependency('ui/filteredmenu.js', ['goog.ui.FilteredMenu'], ['goog.a11y.aria', 'goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.FilterObservingMenuItem', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.userAgent'], {});
+goog.addDependency('ui/filteredmenu_test.js', ['goog.ui.FilteredMenuTest'], ['goog.a11y.aria', 'goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Rect', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.FilteredMenu', 'goog.ui.MenuItem'], {});
+goog.addDependency('ui/filterobservingmenuitem.js', ['goog.ui.FilterObservingMenuItem'], ['goog.ui.FilterObservingMenuItemRenderer', 'goog.ui.MenuItem', 'goog.ui.registry'], {});
+goog.addDependency('ui/filterobservingmenuitemrenderer.js', ['goog.ui.FilterObservingMenuItemRenderer'], ['goog.ui.MenuItemRenderer'], {});
+goog.addDependency('ui/flatbuttonrenderer.js', ['goog.ui.FlatButtonRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});
+goog.addDependency('ui/flatmenubuttonrenderer.js', ['goog.ui.FlatMenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.ui.FlatButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/formpost.js', ['goog.ui.FormPost'], ['goog.array', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.ui.Component'], {});
+goog.addDependency('ui/formpost_test.js', ['goog.ui.FormPostTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.object', 'goog.testing.jsunit', 'goog.ui.FormPost', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('ui/gauge.js', ['goog.ui.Gauge', 'goog.ui.GaugeColoredRange'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.TagName', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.fx.easing', 'goog.graphics', 'goog.graphics.Font', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.math', 'goog.ui.Component', 'goog.ui.GaugeTheme'], {});
+goog.addDependency('ui/gaugetheme.js', ['goog.ui.GaugeTheme'], ['goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke'], {});
+goog.addDependency('ui/hovercard.js', ['goog.ui.HoverCard', 'goog.ui.HoverCard.EventType', 'goog.ui.HoverCard.TriggerEvent'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.ui.AdvancedTooltip', 'goog.ui.PopupBase', 'goog.ui.Tooltip'], {});
+goog.addDependency('ui/hovercard_test.js', ['goog.ui.HoverCardTest'], ['goog.dom', 'goog.events', 'goog.math.Coordinate', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.HoverCard'], {});
+goog.addDependency('ui/hsvapalette.js', ['goog.ui.HsvaPalette'], ['goog.array', 'goog.color.alpha', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.HsvPalette'], {});
+goog.addDependency('ui/hsvapalette_test.js', ['goog.ui.HsvaPaletteTest'], ['goog.color.alpha', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.Event', 'goog.math.Coordinate', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.HsvaPalette', 'goog.userAgent'], {});
+goog.addDependency('ui/hsvpalette.js', ['goog.ui.HsvPalette'], ['goog.color', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.style', 'goog.style.bidi', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/hsvpalette_test.js', ['goog.ui.HsvPaletteTest'], ['goog.color', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.math.Coordinate', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.HsvPalette', 'goog.userAgent'], {});
+goog.addDependency('ui/idgenerator.js', ['goog.ui.IdGenerator'], [], {});
+goog.addDependency('ui/idletimer.js', ['goog.ui.IdleTimer'], ['goog.Timer', 'goog.events', 'goog.events.EventTarget', 'goog.structs.Set', 'goog.ui.ActivityMonitor'], {});
+goog.addDependency('ui/idletimer_test.js', ['goog.ui.IdleTimerTest'], ['goog.events', 'goog.testing.MockClock', 'goog.testing.jsunit', 'goog.ui.IdleTimer', 'goog.ui.MockActivityMonitor'], {});
+goog.addDependency('ui/iframemask.js', ['goog.ui.IframeMask'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.dom.iframe', 'goog.events.EventHandler', 'goog.structs.Pool', 'goog.style'], {});
+goog.addDependency('ui/iframemask_test.js', ['goog.ui.IframeMaskTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.iframe', 'goog.structs.Pool', 'goog.style', 'goog.testing.MockClock', 'goog.testing.StrictMock', 'goog.testing.jsunit', 'goog.ui.IframeMask', 'goog.ui.Popup', 'goog.ui.PopupBase', 'goog.userAgent'], {});
+goog.addDependency('ui/imagelessbuttonrenderer.js', ['goog.ui.ImagelessButtonRenderer'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});
+goog.addDependency('ui/imagelessmenubuttonrenderer.js', ['goog.ui.ImagelessMenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/inputdatepicker.js', ['goog.ui.InputDatePicker'], ['goog.date.DateTime', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.i18n.DateTimeParse', 'goog.string', 'goog.ui.Component', 'goog.ui.DatePicker', 'goog.ui.LabelInput', 'goog.ui.PopupBase', 'goog.ui.PopupDatePicker'], {});
+goog.addDependency('ui/inputdatepicker_test.js', ['goog.ui.InputDatePickerTest'], ['goog.dom', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeParse', 'goog.testing.jsunit', 'goog.ui.InputDatePicker'], {});
+goog.addDependency('ui/itemevent.js', ['goog.ui.ItemEvent'], ['goog.events.Event'], {});
+goog.addDependency('ui/keyboardshortcuthandler.js', ['goog.ui.KeyboardShortcutEvent', 'goog.ui.KeyboardShortcutHandler', 'goog.ui.KeyboardShortcutHandler.EventType', 'goog.ui.KeyboardShortcutHandler.Modifiers'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyNames', 'goog.events.Keys', 'goog.object', 'goog.userAgent'], {});
+goog.addDependency('ui/keyboardshortcuthandler_test.js', ['goog.ui.KeyboardShortcutHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.KeyboardShortcutHandler', 'goog.userAgent'], {});
+goog.addDependency('ui/labelinput.js', ['goog.ui.LabelInput'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/labelinput_test.js', ['goog.ui.LabelInputTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventType', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.LabelInput', 'goog.userAgent'], {});
+goog.addDependency('ui/linkbuttonrenderer.js', ['goog.ui.LinkButtonRenderer'], ['goog.ui.Button', 'goog.ui.FlatButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/media/flashobject.js', ['goog.ui.media.FlashObject', 'goog.ui.media.FlashObject.ScriptAccessLevel', 'goog.ui.media.FlashObject.Wmodes'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.html.TrustedResourceUrl', 'goog.html.flash', 'goog.log', 'goog.object', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.userAgent', 'goog.userAgent.flash'], {});
+goog.addDependency('ui/media/flashobject_test.js', ['goog.ui.media.FlashObjectTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.html.testing', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.userAgent'], {});
+goog.addDependency('ui/media/flickr.js', ['goog.ui.media.FlickrSet', 'goog.ui.media.FlickrSetModel'], ['goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/flickr_test.js', ['goog.ui.media.FlickrSetTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.FlickrSet', 'goog.ui.media.FlickrSetModel', 'goog.ui.media.Media'], {});
+goog.addDependency('ui/media/googlevideo.js', ['goog.ui.media.GoogleVideo', 'goog.ui.media.GoogleVideoModel'], ['goog.html.uncheckedconversions', 'goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/googlevideo_test.js', ['goog.ui.media.GoogleVideoTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.GoogleVideo', 'goog.ui.media.GoogleVideoModel', 'goog.ui.media.Media'], {});
+goog.addDependency('ui/media/media.js', ['goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.style', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/media/media_test.js', ['goog.ui.media.MediaTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.math.Size', 'goog.testing.jsunit', 'goog.ui.ControlRenderer', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/mediamodel.js', ['goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Category', 'goog.ui.media.MediaModel.Credit', 'goog.ui.media.MediaModel.Credit.Role', 'goog.ui.media.MediaModel.Credit.Scheme', 'goog.ui.media.MediaModel.Medium', 'goog.ui.media.MediaModel.MimeType', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaModel.SubTitle', 'goog.ui.media.MediaModel.Thumbnail'], ['goog.array', 'goog.html.TrustedResourceUrl'], {});
+goog.addDependency('ui/media/mediamodel_test.js', ['goog.ui.media.MediaModelTest'], ['goog.testing.jsunit', 'goog.ui.media.MediaModel'], {});
+goog.addDependency('ui/media/mp3.js', ['goog.ui.media.Mp3'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/mp3_test.js', ['goog.ui.media.Mp3Test'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.Mp3'], {});
+goog.addDependency('ui/media/photo.js', ['goog.ui.media.Photo'], ['goog.dom.TagName', 'goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/photo_test.js', ['goog.ui.media.PhotoTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.jsunit', 'goog.ui.media.MediaModel', 'goog.ui.media.Photo'], {});
+goog.addDependency('ui/media/picasa.js', ['goog.ui.media.PicasaAlbum', 'goog.ui.media.PicasaAlbumModel'], ['goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/picasa_test.js', ['goog.ui.media.PicasaTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.PicasaAlbum', 'goog.ui.media.PicasaAlbumModel'], {});
+goog.addDependency('ui/media/vimeo.js', ['goog.ui.media.Vimeo', 'goog.ui.media.VimeoModel'], ['goog.html.uncheckedconversions', 'goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/vimeo_test.js', ['goog.ui.media.VimeoTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.Vimeo', 'goog.ui.media.VimeoModel'], {});
+goog.addDependency('ui/media/youtube.js', ['goog.ui.media.Youtube', 'goog.ui.media.YoutubeModel'], ['goog.dom.TagName', 'goog.html.uncheckedconversions', 'goog.string', 'goog.ui.Component', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});
+goog.addDependency('ui/media/youtube_test.js', ['goog.ui.media.YoutubeTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.ui.media.FlashObject', 'goog.ui.media.Youtube', 'goog.ui.media.YoutubeModel'], {});
+goog.addDependency('ui/menu.js', ['goog.ui.Menu', 'goog.ui.Menu.EventType'], ['goog.dom.TagName', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.MenuHeader', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.MenuSeparator'], {});
+goog.addDependency('ui/menu_test.js', ['goog.ui.MenuTest'], ['goog.dom', 'goog.events', 'goog.math.Coordinate', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Menu'], {});
+goog.addDependency('ui/menubar.js', ['goog.ui.menuBar'], ['goog.ui.Container', 'goog.ui.MenuBarRenderer'], {});
+goog.addDependency('ui/menubardecorator.js', ['goog.ui.menuBarDecorator'], ['goog.ui.MenuBarRenderer', 'goog.ui.menuBar', 'goog.ui.registry'], {});
+goog.addDependency('ui/menubarrenderer.js', ['goog.ui.MenuBarRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Container', 'goog.ui.ContainerRenderer'], {});
+goog.addDependency('ui/menubase.js', ['goog.ui.MenuBase'], ['goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.ui.Popup'], {});
+goog.addDependency('ui/menubutton.js', ['goog.ui.MenuButton'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.math.Box', 'goog.math.Rect', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.IdGenerator', 'goog.ui.Menu', 'goog.ui.MenuButtonRenderer', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.registry', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('ui/menubutton_test.js', ['goog.ui.MenuButtonTest'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.SubMenu', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('ui/menubuttonrenderer.js', ['goog.ui.MenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuRenderer'], {});
+goog.addDependency('ui/menubuttonrenderer_test.js', ['goog.ui.MenuButtonRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/menuheader.js', ['goog.ui.MenuHeader'], ['goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuHeaderRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/menuheaderrenderer.js', ['goog.ui.MenuHeaderRenderer'], ['goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/menuitem.js', ['goog.ui.MenuItem'], ['goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.dom.classlist', 'goog.math.Coordinate', 'goog.string', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuItemRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/menuitem_test.js', ['goog.ui.MenuItemTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.html.testing', 'goog.math.Coordinate', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuItemRenderer'], {});
+goog.addDependency('ui/menuitemrenderer.js', ['goog.ui.MenuItemRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/menuitemrenderer_test.js', ['goog.ui.MenuItemRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuItemRenderer'], {});
+goog.addDependency('ui/menurenderer.js', ['goog.ui.MenuRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.ui.ContainerRenderer', 'goog.ui.Separator'], {});
+goog.addDependency('ui/menuseparator.js', ['goog.ui.MenuSeparator'], ['goog.ui.MenuSeparatorRenderer', 'goog.ui.Separator', 'goog.ui.registry'], {});
+goog.addDependency('ui/menuseparatorrenderer.js', ['goog.ui.MenuSeparatorRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/menuseparatorrenderer_test.js', ['goog.ui.MenuSeparatorRendererTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.MenuSeparator', 'goog.ui.MenuSeparatorRenderer'], {});
+goog.addDependency('ui/mockactivitymonitor.js', ['goog.ui.MockActivityMonitor'], ['goog.events.EventType', 'goog.ui.ActivityMonitor'], {});
+goog.addDependency('ui/mockactivitymonitor_test.js', ['goog.ui.MockActivityMonitorTest'], ['goog.events', 'goog.functions', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.ActivityMonitor', 'goog.ui.MockActivityMonitor'], {});
+goog.addDependency('ui/modalariavisibilityhelper.js', ['goog.ui.ModalAriaVisibilityHelper'], ['goog.a11y.aria', 'goog.a11y.aria.State'], {});
+goog.addDependency('ui/modalariavisibilityhelper_test.js', ['goog.ui.ModalAriaVisibilityHelperTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.string', 'goog.testing.jsunit', 'goog.ui.ModalAriaVisibilityHelper'], {});
+goog.addDependency('ui/modalpopup.js', ['goog.ui.ModalPopup'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.animationFrame', 'goog.dom.classlist', 'goog.dom.iframe', 'goog.events', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.fx.Transition', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ModalAriaVisibilityHelper', 'goog.ui.PopupBase', 'goog.userAgent'], {});
+goog.addDependency('ui/modalpopup_test.js', ['goog.ui.ModalPopupTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dispose', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Transition', 'goog.fx.css3', 'goog.string', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.ModalPopup', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/nativebuttonrenderer.js', ['goog.ui.NativeButtonRenderer'], ['goog.asserts', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.ui.ButtonRenderer', 'goog.ui.Component'], {});
+goog.addDependency('ui/nativebuttonrenderer_test.js', ['goog.ui.NativeButtonRendererTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.testing.ExpectedFailures', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.NativeButtonRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/option.js', ['goog.ui.Option'], ['goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.registry'], {});
+goog.addDependency('ui/palette.js', ['goog.ui.Palette'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.PaletteRenderer', 'goog.ui.SelectionModel'], {});
+goog.addDependency('ui/palette_test.js', ['goog.ui.PaletteTest'], ['goog.a11y.aria', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyEvent', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Palette'], {});
+goog.addDependency('ui/paletterenderer.js', ['goog.ui.PaletteRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.iter', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/paletterenderer_test.js', ['goog.ui.PaletteRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.jsunit', 'goog.ui.Palette', 'goog.ui.PaletteRenderer'], {});
+goog.addDependency('ui/plaintextspellchecker.js', ['goog.ui.PlainTextSpellChecker'], ['goog.Timer', 'goog.a11y.aria', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.spell.SpellCheck', 'goog.style', 'goog.ui.AbstractSpellChecker', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/plaintextspellchecker_test.js', ['goog.ui.PlainTextSpellCheckerTest'], ['goog.Timer', 'goog.dom', 'goog.events.KeyCodes', 'goog.spell.SpellCheck', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.PlainTextSpellChecker'], {});
+goog.addDependency('ui/popup.js', ['goog.ui.Popup'], ['goog.math.Box', 'goog.positioning.AbstractPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/popup_test.js', ['goog.ui.PopupTest'], ['goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.style', 'goog.testing.jsunit', 'goog.ui.Popup', 'goog.userAgent'], {});
+goog.addDependency('ui/popupbase.js', ['goog.ui.PopupBase', 'goog.ui.PopupBase.EventType', 'goog.ui.PopupBase.Type'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Transition', 'goog.style', 'goog.userAgent'], {});
+goog.addDependency('ui/popupbase_test.js', ['goog.ui.PopupBaseTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Transition', 'goog.fx.css3', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/popupcolorpicker.js', ['goog.ui.PopupColorPicker'], ['goog.asserts', 'goog.dom.classlist', 'goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.ColorPicker', 'goog.ui.Component', 'goog.ui.Popup'], {});
+goog.addDependency('ui/popupcolorpicker_test.js', ['goog.ui.PopupColorPickerTest'], ['goog.dom', 'goog.events', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.ColorPicker', 'goog.ui.PopupColorPicker'], {});
+goog.addDependency('ui/popupdatepicker.js', ['goog.ui.PopupDatePicker'], ['goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.style', 'goog.ui.Component', 'goog.ui.DatePicker', 'goog.ui.Popup', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/popupdatepicker_test.js', ['goog.ui.PopupDatePickerTest'], ['goog.date.Date', 'goog.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.PopupBase', 'goog.ui.PopupDatePicker'], {});
+goog.addDependency('ui/popupmenu.js', ['goog.ui.PopupMenu'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.positioning.ViewportClientPosition', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/popupmenu_test.js', ['goog.ui.PopupMenuTest'], ['goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Box', 'goog.math.Coordinate', 'goog.positioning.Corner', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.PopupMenu'], {});
+goog.addDependency('ui/progressbar.js', ['goog.ui.ProgressBar', 'goog.ui.ProgressBar.Orientation'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.ui.Component', 'goog.ui.RangeModel', 'goog.userAgent'], {});
+goog.addDependency('ui/prompt.js', ['goog.ui.Prompt'], ['goog.Timer', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.html.SafeHtml', 'goog.ui.Component', 'goog.ui.Dialog', 'goog.userAgent'], {});
+goog.addDependency('ui/prompt_test.js', ['goog.ui.PromptTest'], ['goog.dom.selection', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.functions', 'goog.string', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.BidiInput', 'goog.ui.Dialog', 'goog.ui.Prompt', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('ui/rangemodel.js', ['goog.ui.RangeModel'], ['goog.events.EventTarget', 'goog.ui.Component'], {});
+goog.addDependency('ui/rangemodel_test.js', ['goog.ui.RangeModelTest'], ['goog.testing.jsunit', 'goog.ui.RangeModel'], {});
+goog.addDependency('ui/ratings.js', ['goog.ui.Ratings', 'goog.ui.Ratings.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.ui.Component'], {});
+goog.addDependency('ui/registry.js', ['goog.ui.registry'], ['goog.asserts', 'goog.dom.classlist'], {});
+goog.addDependency('ui/registry_test.js', ['goog.ui.registryTest'], ['goog.object', 'goog.testing.jsunit', 'goog.ui.registry'], {});
+goog.addDependency('ui/richtextspellchecker.js', ['goog.ui.RichTextSpellChecker'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.math.Coordinate', 'goog.spell.SpellCheck', 'goog.string.StringBuffer', 'goog.style', 'goog.ui.AbstractSpellChecker', 'goog.ui.Component', 'goog.ui.PopupMenu'], {});
+goog.addDependency('ui/richtextspellchecker_test.js', ['goog.ui.RichTextSpellCheckerTest'], ['goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.object', 'goog.spell.SpellCheck', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.RichTextSpellChecker'], {});
+goog.addDependency('ui/roundedpanel.js', ['goog.ui.BaseRoundedPanel', 'goog.ui.CssRoundedPanel', 'goog.ui.GraphicsRoundedPanel', 'goog.ui.RoundedPanel', 'goog.ui.RoundedPanel.Corner'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.graphics', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/roundedpanel_test.js', ['goog.ui.RoundedPanelTest'], ['goog.testing.jsunit', 'goog.ui.CssRoundedPanel', 'goog.ui.GraphicsRoundedPanel', 'goog.ui.RoundedPanel', 'goog.userAgent'], {});
+goog.addDependency('ui/roundedtabrenderer.js', ['goog.ui.RoundedTabRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.Tab', 'goog.ui.TabBar', 'goog.ui.TabRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/scrollfloater.js', ['goog.ui.ScrollFloater', 'goog.ui.ScrollFloater.EventType'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/scrollfloater_test.js', ['goog.ui.ScrollFloaterTest'], ['goog.dom', 'goog.events', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.ui.ScrollFloater'], {});
+goog.addDependency('ui/select.js', ['goog.ui.Select'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.events.EventType', 'goog.ui.Component', 'goog.ui.IdGenerator', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.SelectionModel', 'goog.ui.registry'], {});
+goog.addDependency('ui/select_test.js', ['goog.ui.SelectTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.Select', 'goog.ui.Separator'], {});
+goog.addDependency('ui/selectionmenubutton.js', ['goog.ui.SelectionMenuButton', 'goog.ui.SelectionMenuButton.SelectionState'], ['goog.dom.InputType', 'goog.dom.TagName', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.registry'], {});
+goog.addDependency('ui/selectionmenubutton_test.js', ['goog.ui.SelectionMenuButtonTest'], ['goog.dom', 'goog.events', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.SelectionMenuButton'], {});
+goog.addDependency('ui/selectionmodel.js', ['goog.ui.SelectionModel'], ['goog.array', 'goog.events.EventTarget', 'goog.events.EventType'], {});
+goog.addDependency('ui/selectionmodel_test.js', ['goog.ui.SelectionModelTest'], ['goog.array', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.SelectionModel'], {});
+goog.addDependency('ui/separator.js', ['goog.ui.Separator'], ['goog.a11y.aria', 'goog.asserts', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuSeparatorRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/serverchart.js', ['goog.ui.ServerChart', 'goog.ui.ServerChart.AxisDisplayType', 'goog.ui.ServerChart.ChartType', 'goog.ui.ServerChart.EncodingType', 'goog.ui.ServerChart.Event', 'goog.ui.ServerChart.LegendPosition', 'goog.ui.ServerChart.MaximumValue', 'goog.ui.ServerChart.MultiAxisAlignment', 'goog.ui.ServerChart.MultiAxisType', 'goog.ui.ServerChart.UriParam', 'goog.ui.ServerChart.UriTooLongEvent'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events.Event', 'goog.string', 'goog.ui.Component'], {});
+goog.addDependency('ui/serverchart_test.js', ['goog.ui.ServerChartTest'], ['goog.Uri', 'goog.events', 'goog.testing.jsunit', 'goog.ui.ServerChart'], {});
+goog.addDependency('ui/slider.js', ['goog.ui.Slider', 'goog.ui.Slider.Orientation'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.ui.SliderBase'], {});
+goog.addDependency('ui/sliderbase.js', ['goog.ui.SliderBase', 'goog.ui.SliderBase.AnimationFactory', 'goog.ui.SliderBase.Orientation'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.MouseWheelHandler', 'goog.functions', 'goog.fx.AnimationParallelQueue', 'goog.fx.Dragger', 'goog.fx.Transition', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Slide', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.ui.Component', 'goog.ui.RangeModel'], {});
+goog.addDependency('ui/sliderbase_test.js', ['goog.ui.SliderBaseTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Animation', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.SliderBase', 'goog.userAgent'], {});
+goog.addDependency('ui/splitpane.js', ['goog.ui.SplitPane', 'goog.ui.SplitPane.Orientation'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.math.Size', 'goog.style', 'goog.ui.Component', 'goog.userAgent'], {});
+goog.addDependency('ui/splitpane_test.js', ['goog.ui.SplitPaneTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.math.Size', 'goog.style', 'goog.testing.events', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.ui.Component', 'goog.ui.SplitPane'], {});
+goog.addDependency('ui/style/app/buttonrenderer.js', ['goog.ui.style.app.ButtonRenderer'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});
+goog.addDependency('ui/style/app/buttonrenderer_test.js', ['goog.ui.style.app.ButtonRendererTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.testing.ui.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.style.app.ButtonRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/style/app/menubuttonrenderer.js', ['goog.ui.style.app.MenuButtonRenderer'], ['goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.ui.Menu', 'goog.ui.MenuRenderer', 'goog.ui.style.app.ButtonRenderer'], {});
+goog.addDependency('ui/style/app/menubuttonrenderer_test.js', ['goog.ui.style.app.MenuButtonRendererTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.testing.ui.style', 'goog.ui.Component', 'goog.ui.MenuButton', 'goog.ui.style.app.MenuButtonRenderer'], {});
+goog.addDependency('ui/style/app/primaryactionbuttonrenderer.js', ['goog.ui.style.app.PrimaryActionButtonRenderer'], ['goog.ui.Button', 'goog.ui.registry', 'goog.ui.style.app.ButtonRenderer'], {});
+goog.addDependency('ui/style/app/primaryactionbuttonrenderer_test.js', ['goog.ui.style.app.PrimaryActionButtonRendererTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.testing.ui.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.style.app.PrimaryActionButtonRenderer'], {});
+goog.addDependency('ui/submenu.js', ['goog.ui.SubMenu'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.SubMenuRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/submenu_test.js', ['goog.ui.SubMenuTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.functions', 'goog.positioning', 'goog.positioning.Overflow', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.SubMenu', 'goog.ui.SubMenuRenderer'], {});
+goog.addDependency('ui/submenurenderer.js', ['goog.ui.SubMenuRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.style', 'goog.ui.Menu', 'goog.ui.MenuItemRenderer'], {});
+goog.addDependency('ui/tab.js', ['goog.ui.Tab'], ['goog.ui.Component', 'goog.ui.Control', 'goog.ui.TabRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/tab_test.js', ['goog.ui.TabTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Tab', 'goog.ui.TabRenderer'], {});
+goog.addDependency('ui/tabbar.js', ['goog.ui.TabBar', 'goog.ui.TabBar.Location'], ['goog.ui.Component.EventType', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.Tab', 'goog.ui.TabBarRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/tabbar_test.js', ['goog.ui.TabBarTest'], ['goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Tab', 'goog.ui.TabBar', 'goog.ui.TabBarRenderer'], {});
+goog.addDependency('ui/tabbarrenderer.js', ['goog.ui.TabBarRenderer'], ['goog.a11y.aria.Role', 'goog.object', 'goog.ui.ContainerRenderer'], {});
+goog.addDependency('ui/tabbarrenderer_test.js', ['goog.ui.TabBarRendererTest'], ['goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Container', 'goog.ui.TabBar', 'goog.ui.TabBarRenderer'], {});
+goog.addDependency('ui/tablesorter.js', ['goog.ui.TableSorter', 'goog.ui.TableSorter.EventType'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.functions', 'goog.ui.Component'], {});
+goog.addDependency('ui/tablesorter_test.js', ['goog.ui.TableSorterTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.TableSorter'], {});
+goog.addDependency('ui/tabpane.js', ['goog.ui.TabPane', 'goog.ui.TabPane.Events', 'goog.ui.TabPane.TabLocation', 'goog.ui.TabPane.TabPage', 'goog.ui.TabPaneEvent'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.html.SafeStyleSheet', 'goog.style'], {});
+goog.addDependency('ui/tabpane_test.js', ['goog.ui.TabPaneTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.TabPane'], {});
+goog.addDependency('ui/tabrenderer.js', ['goog.ui.TabRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/tabrenderer_test.js', ['goog.ui.TabRendererTest'], ['goog.a11y.aria.Role', 'goog.dom', 'goog.dom.classlist', 'goog.testing.dom', 'goog.testing.jsunit', 'goog.testing.ui.rendererasserts', 'goog.ui.Tab', 'goog.ui.TabRenderer'], {});
+goog.addDependency('ui/textarea.js', ['goog.ui.Textarea', 'goog.ui.Textarea.EventType'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventType', 'goog.style', 'goog.ui.Control', 'goog.ui.TextareaRenderer', 'goog.userAgent'], {});
+goog.addDependency('ui/textarea_test.js', ['goog.ui.TextareaTest'], ['goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.events.EventObserver', 'goog.testing.jsunit', 'goog.ui.Textarea', 'goog.ui.TextareaRenderer', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('ui/textarearenderer.js', ['goog.ui.TextareaRenderer'], ['goog.dom.TagName', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});
+goog.addDependency('ui/togglebutton.js', ['goog.ui.ToggleButton'], ['goog.ui.Button', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbar.js', ['goog.ui.Toolbar'], ['goog.ui.Container', 'goog.ui.ToolbarRenderer'], {});
+goog.addDependency('ui/toolbar_test.js', ['goog.ui.ToolbarTest'], ['goog.a11y.aria', 'goog.dom', 'goog.events.EventType', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.ui.Toolbar', 'goog.ui.ToolbarMenuButton'], {});
+goog.addDependency('ui/toolbarbutton.js', ['goog.ui.ToolbarButton'], ['goog.ui.Button', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbarbuttonrenderer.js', ['goog.ui.ToolbarButtonRenderer'], ['goog.ui.CustomButtonRenderer'], {});
+goog.addDependency('ui/toolbarcolormenubutton.js', ['goog.ui.ToolbarColorMenuButton'], ['goog.ui.ColorMenuButton', 'goog.ui.ToolbarColorMenuButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbarcolormenubuttonrenderer.js', ['goog.ui.ToolbarColorMenuButtonRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.MenuButtonRenderer', 'goog.ui.ToolbarMenuButtonRenderer'], {});
+goog.addDependency('ui/toolbarcolormenubuttonrenderer_test.js', ['goog.ui.ToolbarColorMenuButtonRendererTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.testing.ui.RendererHarness', 'goog.testing.ui.rendererasserts', 'goog.ui.ToolbarColorMenuButton', 'goog.ui.ToolbarColorMenuButtonRenderer'], {});
+goog.addDependency('ui/toolbarmenubutton.js', ['goog.ui.ToolbarMenuButton'], ['goog.ui.MenuButton', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbarmenubuttonrenderer.js', ['goog.ui.ToolbarMenuButtonRenderer'], ['goog.ui.MenuButtonRenderer'], {});
+goog.addDependency('ui/toolbarrenderer.js', ['goog.ui.ToolbarRenderer'], ['goog.a11y.aria.Role', 'goog.dom.TagName', 'goog.ui.Container', 'goog.ui.ContainerRenderer', 'goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer'], {});
+goog.addDependency('ui/toolbarselect.js', ['goog.ui.ToolbarSelect'], ['goog.ui.Select', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbarseparator.js', ['goog.ui.ToolbarSeparator'], ['goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/toolbarseparatorrenderer.js', ['goog.ui.ToolbarSeparatorRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuSeparatorRenderer'], {});
+goog.addDependency('ui/toolbarseparatorrenderer_test.js', ['goog.ui.ToolbarSeparatorRendererTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.ToolbarSeparator', 'goog.ui.ToolbarSeparatorRenderer'], {});
+goog.addDependency('ui/toolbartogglebutton.js', ['goog.ui.ToolbarToggleButton'], ['goog.ui.ToggleButton', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/tooltip.js', ['goog.ui.Tooltip', 'goog.ui.Tooltip.CursorTooltipPosition', 'goog.ui.Tooltip.ElementTooltipPosition', 'goog.ui.Tooltip.State'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.math.Box', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.positioning.ViewportPosition', 'goog.structs.Set', 'goog.style', 'goog.ui.Popup', 'goog.ui.PopupBase'], {});
+goog.addDependency('ui/tooltip_test.js', ['goog.ui.TooltipTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.html.testing', 'goog.math.Coordinate', 'goog.positioning.AbsolutePosition', 'goog.style', 'goog.testing.MockClock', 'goog.testing.TestQueue', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.PopupBase', 'goog.ui.Tooltip', 'goog.userAgent'], {});
+goog.addDependency('ui/tree/basenode.js', ['goog.ui.tree.BaseNode', 'goog.ui.tree.BaseNode.EventType'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom.safe', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.string', 'goog.string.StringBuffer', 'goog.style', 'goog.ui.Component'], {});
+goog.addDependency('ui/tree/basenode_test.js', ['goog.ui.tree.BaseNodeTest'], ['goog.a11y.aria', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.html.testing', 'goog.testing.jsunit', 'goog.ui.Component', 'goog.ui.tree.BaseNode', 'goog.ui.tree.TreeControl', 'goog.ui.tree.TreeNode'], {});
+goog.addDependency('ui/tree/treecontrol.js', ['goog.ui.tree.TreeControl'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.classlist', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.events.KeyHandler', 'goog.html.SafeHtml', 'goog.log', 'goog.ui.tree.BaseNode', 'goog.ui.tree.TreeNode', 'goog.ui.tree.TypeAhead', 'goog.userAgent'], {});
+goog.addDependency('ui/tree/treecontrol_test.js', ['goog.ui.tree.TreeControlTest'], ['goog.dom', 'goog.testing.jsunit', 'goog.ui.tree.TreeControl'], {});
+goog.addDependency('ui/tree/treenode.js', ['goog.ui.tree.TreeNode'], ['goog.ui.tree.BaseNode'], {});
+goog.addDependency('ui/tree/typeahead.js', ['goog.ui.tree.TypeAhead', 'goog.ui.tree.TypeAhead.Offset'], ['goog.array', 'goog.events.KeyCodes', 'goog.string', 'goog.structs.Trie'], {});
+goog.addDependency('ui/tree/typeahead_test.js', ['goog.ui.tree.TypeAheadTest'], ['goog.dom', 'goog.events.KeyCodes', 'goog.testing.jsunit', 'goog.ui.tree.TreeControl', 'goog.ui.tree.TypeAhead'], {});
+goog.addDependency('ui/tristatemenuitem.js', ['goog.ui.TriStateMenuItem', 'goog.ui.TriStateMenuItem.State'], ['goog.dom.classlist', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.TriStateMenuItemRenderer', 'goog.ui.registry'], {});
+goog.addDependency('ui/tristatemenuitemrenderer.js', ['goog.ui.TriStateMenuItemRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.ui.MenuItemRenderer'], {});
+goog.addDependency('ui/twothumbslider.js', ['goog.ui.TwoThumbSlider'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.ui.SliderBase'], {});
+goog.addDependency('ui/twothumbslider_test.js', ['goog.ui.TwoThumbSliderTest'], ['goog.testing.jsunit', 'goog.ui.SliderBase', 'goog.ui.TwoThumbSlider'], {});
+goog.addDependency('ui/zippy.js', ['goog.ui.Zippy', 'goog.ui.Zippy.Events', 'goog.ui.ZippyEvent'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.style'], {});
+goog.addDependency('ui/zippy_test.js', ['goog.ui.ZippyTest'], ['goog.a11y.aria', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.KeyCodes', 'goog.object', 'goog.testing.events', 'goog.testing.jsunit', 'goog.ui.Zippy'], {});
+goog.addDependency('uri/uri.js', ['goog.Uri', 'goog.Uri.QueryData'], ['goog.array', 'goog.asserts', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex', 'goog.uri.utils.StandardQueryParam'], {});
+goog.addDependency('uri/uri_test.js', ['goog.UriTest'], ['goog.Uri', 'goog.testing.jsunit'], {});
+goog.addDependency('uri/utils.js', ['goog.uri.utils', 'goog.uri.utils.ComponentIndex', 'goog.uri.utils.QueryArray', 'goog.uri.utils.QueryValue', 'goog.uri.utils.StandardQueryParam'], ['goog.array', 'goog.asserts', 'goog.string'], {});
+goog.addDependency('uri/utils_test.js', ['goog.uri.utilsTest'], ['goog.functions', 'goog.string', 'goog.testing.jsunit', 'goog.uri.utils'], {});
+goog.addDependency('useragent/adobereader.js', ['goog.userAgent.adobeReader'], ['goog.string', 'goog.userAgent'], {});
+goog.addDependency('useragent/adobereader_test.js', ['goog.userAgent.adobeReaderTest'], ['goog.testing.jsunit', 'goog.userAgent.adobeReader'], {});
+goog.addDependency('useragent/flash.js', ['goog.userAgent.flash'], ['goog.string'], {});
+goog.addDependency('useragent/flash_test.js', ['goog.userAgent.flashTest'], ['goog.testing.jsunit', 'goog.userAgent.flash'], {});
+goog.addDependency('useragent/iphoto.js', ['goog.userAgent.iphoto'], ['goog.string', 'goog.userAgent'], {});
+goog.addDependency('useragent/jscript.js', ['goog.userAgent.jscript'], ['goog.string'], {});
+goog.addDependency('useragent/jscript_test.js', ['goog.userAgent.jscriptTest'], ['goog.testing.jsunit', 'goog.userAgent.jscript'], {});
+goog.addDependency('useragent/keyboard.js', ['goog.userAgent.keyboard'], ['goog.labs.userAgent.platform'], {});
+goog.addDependency('useragent/keyboard_test.js', ['goog.userAgent.keyboardTest'], ['goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.jsunit', 'goog.userAgent.keyboard', 'goog.userAgentTestUtil'], {});
+goog.addDependency('useragent/platform.js', ['goog.userAgent.platform'], ['goog.string', 'goog.userAgent'], {});
+goog.addDependency('useragent/platform_test.js', ['goog.userAgent.platformTest'], ['goog.testing.MockUserAgent', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.platform', 'goog.userAgentTestUtil'], {});
+goog.addDependency('useragent/product.js', ['goog.userAgent.product'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.platform', 'goog.userAgent'], {});
+goog.addDependency('useragent/product_isversion.js', ['goog.userAgent.product.isVersion'], ['goog.labs.userAgent.platform', 'goog.string', 'goog.userAgent', 'goog.userAgent.product'], {});
+goog.addDependency('useragent/product_test.js', ['goog.userAgent.productTest'], ['goog.array', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion', 'goog.userAgentTestUtil'], {});
+goog.addDependency('useragent/useragent.js', ['goog.userAgent'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.labs.userAgent.platform', 'goog.labs.userAgent.util', 'goog.reflect', 'goog.string'], {});
+goog.addDependency('useragent/useragent_quirks_test.js', ['goog.userAgentQuirksTest'], ['goog.testing.jsunit', 'goog.userAgent'], {});
+goog.addDependency('useragent/useragent_test.js', ['goog.userAgentTest'], ['goog.array', 'goog.labs.userAgent.platform', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent', 'goog.userAgentTestUtil'], {'lang': 'es5'});
+goog.addDependency('useragent/useragenttestutil.js', ['goog.userAgentTestUtil', 'goog.userAgentTestUtil.UserAgents'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.labs.userAgent.platform', 'goog.object', 'goog.userAgent', 'goog.userAgent.keyboard', 'goog.userAgent.platform', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});
+goog.addDependency('vec/float32array.js', ['goog.vec.Float32Array'], [], {});
+goog.addDependency('vec/float32array_test.js', ['goog.vec.Float32ArrayTest'], ['goog.testing.jsunit', 'goog.vec.Float32Array'], {});
+goog.addDependency('vec/float64array.js', ['goog.vec.Float64Array'], [], {});
+goog.addDependency('vec/float64array_test.js', ['goog.vec.Float64ArrayTest'], ['goog.testing.jsunit', 'goog.vec.Float64Array'], {});
+goog.addDependency('vec/mat3.js', ['goog.vec.Mat3'], ['goog.vec'], {});
+goog.addDependency('vec/mat3_test.js', ['goog.vec.Mat3Test'], ['goog.testing.jsunit', 'goog.vec.Mat3'], {});
+goog.addDependency('vec/mat3d.js', ['goog.vec.mat3d', 'goog.vec.mat3d.Type'], ['goog.vec', 'goog.vec.vec3d.Type'], {});
+goog.addDependency('vec/mat3d_test.js', ['goog.vec.mat3dTest'], ['goog.testing.jsunit', 'goog.vec.mat3d'], {});
+goog.addDependency('vec/mat3f.js', ['goog.vec.mat3f', 'goog.vec.mat3f.Type'], ['goog.vec', 'goog.vec.vec3f.Type'], {});
+goog.addDependency('vec/mat3f_test.js', ['goog.vec.mat3fTest'], ['goog.testing.jsunit', 'goog.vec.mat3f'], {});
+goog.addDependency('vec/mat4.js', ['goog.vec.Mat4'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4'], {});
+goog.addDependency('vec/mat4_test.js', ['goog.vec.Mat4Test'], ['goog.testing.jsunit', 'goog.vec.Mat4'], {});
+goog.addDependency('vec/mat4d.js', ['goog.vec.mat4d', 'goog.vec.mat4d.Type'], ['goog.vec', 'goog.vec.Quaternion', 'goog.vec.vec3d', 'goog.vec.vec4d'], {});
+goog.addDependency('vec/mat4d_test.js', ['goog.vec.mat4dTest'], ['goog.testing.jsunit', 'goog.vec.Quaternion', 'goog.vec.mat4d'], {});
+goog.addDependency('vec/mat4f.js', ['goog.vec.mat4f', 'goog.vec.mat4f.Type'], ['goog.vec', 'goog.vec.Quaternion', 'goog.vec.vec3f', 'goog.vec.vec4f'], {});
+goog.addDependency('vec/mat4f_test.js', ['goog.vec.mat4fTest'], ['goog.testing.jsunit', 'goog.vec.Quaternion', 'goog.vec.mat4f'], {});
+goog.addDependency('vec/quaternion.js', ['goog.vec.Quaternion', 'goog.vec.Quaternion.AnyType'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4'], {});
+goog.addDependency('vec/quaternion_test.js', ['goog.vec.QuaternionTest'], ['goog.testing.jsunit', 'goog.vec.Float32Array', 'goog.vec.Mat3', 'goog.vec.Mat4', 'goog.vec.Quaternion', 'goog.vec.Vec3', 'goog.vec.Vec4', 'goog.vec.vec3f'], {});
+goog.addDependency('vec/ray.js', ['goog.vec.Ray'], ['goog.vec.Vec3'], {});
+goog.addDependency('vec/ray_test.js', ['goog.vec.RayTest'], ['goog.testing.jsunit', 'goog.vec.Float32Array', 'goog.vec.Ray'], {});
+goog.addDependency('vec/vec.js', ['goog.vec', 'goog.vec.AnyType', 'goog.vec.ArrayType', 'goog.vec.Float32', 'goog.vec.Float64', 'goog.vec.Number'], ['goog.vec.Float32Array', 'goog.vec.Float64Array'], {});
+goog.addDependency('vec/vec2.js', ['goog.vec.Vec2'], ['goog.vec'], {});
+goog.addDependency('vec/vec2_test.js', ['goog.vec.Vec2Test'], ['goog.testing.jsunit', 'goog.vec.Float32Array', 'goog.vec.Vec2'], {});
+goog.addDependency('vec/vec2d.js', ['goog.vec.vec2d', 'goog.vec.vec2d.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec2d_test.js', ['goog.vec.vec2dTest'], ['goog.testing.jsunit', 'goog.vec.Float64Array', 'goog.vec.vec2d'], {});
+goog.addDependency('vec/vec2f.js', ['goog.vec.vec2f', 'goog.vec.vec2f.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec2f_test.js', ['goog.vec.vec2fTest'], ['goog.testing.jsunit', 'goog.vec.Float32Array', 'goog.vec.vec2f'], {});
+goog.addDependency('vec/vec3.js', ['goog.vec.Vec3'], ['goog.vec'], {});
+goog.addDependency('vec/vec3_test.js', ['goog.vec.Vec3Test'], ['goog.testing.jsunit', 'goog.vec.Float32Array', 'goog.vec.Vec3'], {});
+goog.addDependency('vec/vec3d.js', ['goog.vec.vec3d', 'goog.vec.vec3d.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec3d_test.js', ['goog.vec.vec3dTest'], ['goog.testing.jsunit', 'goog.vec.Float64Array', 'goog.vec.vec3d'], {});
+goog.addDependency('vec/vec3f.js', ['goog.vec.vec3f', 'goog.vec.vec3f.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec3f_test.js', ['goog.vec.vec3fTest'], ['goog.testing.jsunit', 'goog.vec.Float32Array', 'goog.vec.vec3f'], {});
+goog.addDependency('vec/vec4.js', ['goog.vec.Vec4'], ['goog.vec'], {});
+goog.addDependency('vec/vec4_test.js', ['goog.vec.Vec4Test'], ['goog.testing.jsunit', 'goog.vec.Float32Array', 'goog.vec.Vec4'], {});
+goog.addDependency('vec/vec4d.js', ['goog.vec.vec4d', 'goog.vec.vec4d.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec4d_test.js', ['goog.vec.vec4dTest'], ['goog.testing.jsunit', 'goog.vec.Float64Array', 'goog.vec.vec4d'], {});
+goog.addDependency('vec/vec4f.js', ['goog.vec.vec4f', 'goog.vec.vec4f.Type'], ['goog.vec'], {});
+goog.addDependency('vec/vec4f_test.js', ['goog.vec.vec4fTest'], ['goog.testing.jsunit', 'goog.vec.Float32Array', 'goog.vec.vec4f'], {});
+goog.addDependency('webgl/webgl.js', ['goog.webgl'], [], {});
+goog.addDependency('window/window.js', ['goog.window'], ['goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeUrl', 'goog.html.uncheckedconversions', 'goog.labs.userAgent.platform', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});
+goog.addDependency('window/window_test.js', ['goog.windowTest'], ['goog.Promise', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.functions', 'goog.html.SafeUrl', 'goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.labs.userAgent.platform', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.window'], {});
diff --git a/src/http/static/viz/2/goog/disposable/disposable.js b/src/http/static/viz/2/goog/disposable/disposable.js
new file mode 100644
index 0000000..a86f549
--- /dev/null
+++ b/src/http/static/viz/2/goog/disposable/disposable.js
@@ -0,0 +1,305 @@
+// Copyright 2005 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Implements the disposable interface. The dispose method is used
+ * to clean up references and resources.
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+goog.provide('goog.Disposable');
+goog.provide('goog.dispose');
+goog.provide('goog.disposeAll');
+
+goog.require('goog.disposable.IDisposable');
+
+
+
+/**
+ * Class that provides the basic implementation for disposable objects. If your
+ * class holds one or more references to COM objects, DOM nodes, or other
+ * disposable objects, it should extend this class or implement the disposable
+ * interface (defined in goog.disposable.IDisposable).
+ * @constructor
+ * @implements {goog.disposable.IDisposable}
+ */
+goog.Disposable = function() {
+ /**
+ * If monitoring the goog.Disposable instances is enabled, stores the creation
+ * stack trace of the Disposable instance.
+ * @type {string|undefined}
+ */
+ this.creationStack;
+
+ if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) {
+ if (goog.Disposable.INCLUDE_STACK_ON_CREATION) {
+ this.creationStack = new Error().stack;
+ }
+ goog.Disposable.instances_[goog.getUid(this)] = this;
+ }
+ // Support sealing
+ this.disposed_ = this.disposed_;
+ this.onDisposeCallbacks_ = this.onDisposeCallbacks_;
+};
+
+
+/**
+ * @enum {number} Different monitoring modes for Disposable.
+ */
+goog.Disposable.MonitoringMode = {
+ /**
+ * No monitoring.
+ */
+ OFF: 0,
+ /**
+ * Creating and disposing the goog.Disposable instances is monitored. All
+ * disposable objects need to call the {@code goog.Disposable} base
+ * constructor. The PERMANENT mode must be switched on before creating any
+ * goog.Disposable instances.
+ */
+ PERMANENT: 1,
+ /**
+ * INTERACTIVE mode can be switched on and off on the fly without producing
+ * errors. It also doesn't warn if the disposable objects don't call the
+ * {@code goog.Disposable} base constructor.
+ */
+ INTERACTIVE: 2
+};
+
+
+/**
+ * @define {number} The monitoring mode of the goog.Disposable
+ * instances. Default is OFF. Switching on the monitoring is only
+ * recommended for debugging because it has a significant impact on
+ * performance and memory usage. If switched off, the monitoring code
+ * compiles down to 0 bytes.
+ */
+goog.define('goog.Disposable.MONITORING_MODE', 0);
+
+
+/**
+ * @define {boolean} Whether to attach creation stack to each created disposable
+ * instance; This is only relevant for when MonitoringMode != OFF.
+ */
+goog.define('goog.Disposable.INCLUDE_STACK_ON_CREATION', true);
+
+
+/**
+ * Maps the unique ID of every undisposed {@code goog.Disposable} object to
+ * the object itself.
+ * @type {!Object<number, !goog.Disposable>}
+ * @private
+ */
+goog.Disposable.instances_ = {};
+
+
+/**
+ * @return {!Array<!goog.Disposable>} All {@code goog.Disposable} objects that
+ * haven't been disposed of.
+ */
+goog.Disposable.getUndisposedObjects = function() {
+ var ret = [];
+ for (var id in goog.Disposable.instances_) {
+ if (goog.Disposable.instances_.hasOwnProperty(id)) {
+ ret.push(goog.Disposable.instances_[Number(id)]);
+ }
+ }
+ return ret;
+};
+
+
+/**
+ * Clears the registry of undisposed objects but doesn't dispose of them.
+ */
+goog.Disposable.clearUndisposedObjects = function() {
+ goog.Disposable.instances_ = {};
+};
+
+
+/**
+ * Whether the object has been disposed of.
+ * @type {boolean}
+ * @private
+ */
+goog.Disposable.prototype.disposed_ = false;
+
+
+/**
+ * Callbacks to invoke when this object is disposed.
+ * @type {Array<!Function>}
+ * @private
+ */
+goog.Disposable.prototype.onDisposeCallbacks_;
+
+
+/**
+ * @return {boolean} Whether the object has been disposed of.
+ * @override
+ */
+goog.Disposable.prototype.isDisposed = function() {
+ return this.disposed_;
+};
+
+
+/**
+ * @return {boolean} Whether the object has been disposed of.
+ * @deprecated Use {@link #isDisposed} instead.
+ */
+goog.Disposable.prototype.getDisposed = goog.Disposable.prototype.isDisposed;
+
+
+/**
+ * Disposes of the object. If the object hasn't already been disposed of, calls
+ * {@link #disposeInternal}. Classes that extend {@code goog.Disposable} should
+ * override {@link #disposeInternal} in order to delete references to COM
+ * objects, DOM nodes, and other disposable objects. Reentrant.
+ *
+ * @return {void} Nothing.
+ * @override
+ */
+goog.Disposable.prototype.dispose = function() {
+ if (!this.disposed_) {
+ // Set disposed_ to true first, in case during the chain of disposal this
+ // gets disposed recursively.
+ this.disposed_ = true;
+ this.disposeInternal();
+ if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) {
+ var uid = goog.getUid(this);
+ if (goog.Disposable.MONITORING_MODE ==
+ goog.Disposable.MonitoringMode.PERMANENT &&
+ !goog.Disposable.instances_.hasOwnProperty(uid)) {
+ throw Error(
+ this + ' did not call the goog.Disposable base ' +
+ 'constructor or was disposed of after a clearUndisposedObjects ' +
+ 'call');
+ }
+ delete goog.Disposable.instances_[uid];
+ }
+ }
+};
+
+
+/**
+ * Associates a disposable object with this object so that they will be disposed
+ * together.
+ * @param {goog.disposable.IDisposable} disposable that will be disposed when
+ * this object is disposed.
+ */
+goog.Disposable.prototype.registerDisposable = function(disposable) {
+ this.addOnDisposeCallback(goog.partial(goog.dispose, disposable));
+};
+
+
+/**
+ * Invokes a callback function when this object is disposed. Callbacks are
+ * invoked in the order in which they were added. If a callback is added to
+ * an already disposed Disposable, it will be called immediately.
+ * @param {function(this:T):?} callback The callback function.
+ * @param {T=} opt_scope An optional scope to call the callback in.
+ * @template T
+ */
+goog.Disposable.prototype.addOnDisposeCallback = function(callback, opt_scope) {
+ if (this.disposed_) {
+ goog.isDef(opt_scope) ? callback.call(opt_scope) : callback();
+ return;
+ }
+ if (!this.onDisposeCallbacks_) {
+ this.onDisposeCallbacks_ = [];
+ }
+
+ this.onDisposeCallbacks_.push(
+ goog.isDef(opt_scope) ? goog.bind(callback, opt_scope) : callback);
+};
+
+
+/**
+ * Deletes or nulls out any references to COM objects, DOM nodes, or other
+ * disposable objects. Classes that extend {@code goog.Disposable} should
+ * override this method.
+ * Not reentrant. To avoid calling it twice, it must only be called from the
+ * subclass' {@code disposeInternal} method. Everywhere else the public
+ * {@code dispose} method must be used.
+ * For example:
+ * <pre>
+ * mypackage.MyClass = function() {
+ * mypackage.MyClass.base(this, 'constructor');
+ * // Constructor logic specific to MyClass.
+ * ...
+ * };
+ * goog.inherits(mypackage.MyClass, goog.Disposable);
+ *
+ * mypackage.MyClass.prototype.disposeInternal = function() {
+ * // Dispose logic specific to MyClass.
+ * ...
+ * // Call superclass's disposeInternal at the end of the subclass's, like
+ * // in C++, to avoid hard-to-catch issues.
+ * mypackage.MyClass.base(this, 'disposeInternal');
+ * };
+ * </pre>
+ * @protected
+ */
+goog.Disposable.prototype.disposeInternal = function() {
+ if (this.onDisposeCallbacks_) {
+ while (this.onDisposeCallbacks_.length) {
+ this.onDisposeCallbacks_.shift()();
+ }
+ }
+};
+
+
+/**
+ * Returns True if we can verify the object is disposed.
+ * Calls {@code isDisposed} on the argument if it supports it. If obj
+ * is not an object with an isDisposed() method, return false.
+ * @param {*} obj The object to investigate.
+ * @return {boolean} True if we can verify the object is disposed.
+ */
+goog.Disposable.isDisposed = function(obj) {
+ if (obj && typeof obj.isDisposed == 'function') {
+ return obj.isDisposed();
+ }
+ return false;
+};
+
+
+/**
+ * Calls {@code dispose} on the argument if it supports it. If obj is not an
+ * object with a dispose() method, this is a no-op.
+ * @param {*} obj The object to dispose of.
+ */
+goog.dispose = function(obj) {
+ if (obj && typeof obj.dispose == 'function') {
+ obj.dispose();
+ }
+};
+
+
+/**
+ * Calls {@code dispose} on each member of the list that supports it. (If the
+ * member is an ArrayLike, then {@code goog.disposeAll()} will be called
+ * recursively on each of its members.) If the member is not an object with a
+ * {@code dispose()} method, then it is ignored.
+ * @param {...*} var_args The list.
+ */
+goog.disposeAll = function(var_args) {
+ for (var i = 0, len = arguments.length; i < len; ++i) {
+ var disposable = arguments[i];
+ if (goog.isArrayLike(disposable)) {
+ goog.disposeAll.apply(null, disposable);
+ } else {
+ goog.dispose(disposable);
+ }
+ }
+};
diff --git a/src/http/static/viz/2/goog/disposable/idisposable.js b/src/http/static/viz/2/goog/disposable/idisposable.js
new file mode 100644
index 0000000..b539eb6
--- /dev/null
+++ b/src/http/static/viz/2/goog/disposable/idisposable.js
@@ -0,0 +1,45 @@
+// Copyright 2011 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Definition of the disposable interface. A disposable object
+ * has a dispose method to to clean up references and resources.
+ * @author nnaze@google.com (Nathan Naze)
+ */
+
+
+goog.provide('goog.disposable.IDisposable');
+
+
+
+/**
+ * Interface for a disposable object. If a instance requires cleanup
+ * (references COM objects, DOM nodes, or other disposable objects), it should
+ * implement this interface (it may subclass goog.Disposable).
+ * @record
+ */
+goog.disposable.IDisposable = function() {};
+
+
+/**
+ * Disposes of the object and its resources.
+ * @return {void} Nothing.
+ */
+goog.disposable.IDisposable.prototype.dispose = goog.abstractMethod;
+
+
+/**
+ * @return {boolean} Whether the object has been disposed of.
+ */
+goog.disposable.IDisposable.prototype.isDisposed = goog.abstractMethod;
diff --git a/src/http/static/viz/2/goog/dom/asserts.js b/src/http/static/viz/2/goog/dom/asserts.js
new file mode 100644
index 0000000..a8f93ba
--- /dev/null
+++ b/src/http/static/viz/2/goog/dom/asserts.js
@@ -0,0 +1,311 @@
+// Copyright 2017 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+goog.provide('goog.dom.asserts');
+
+goog.require('goog.asserts');
+
+/**
+ * @fileoverview Custom assertions to ensure that an element has the appropriate
+ * type.
+ *
+ * Using a goog.dom.safe wrapper on an object on the incorrect type (via an
+ * incorrect static type cast) can result in security bugs: For instance,
+ * g.d.s.setAnchorHref ensures that the URL assigned to the .href attribute
+ * satisfies the SafeUrl contract, i.e., is safe to dereference as a hyperlink.
+ * However, the value assigned to a HTMLLinkElement's .href property requires
+ * the stronger TrustedResourceUrl contract, since it can refer to a stylesheet.
+ * Thus, using g.d.s.setAnchorHref on an (incorrectly statically typed) object
+ * of type HTMLLinkElement can result in a security vulnerability.
+ * Assertions of the correct run-time type help prevent such incorrect use.
+ *
+ * In some cases, code using the DOM API is tested using mock objects (e.g., a
+ * plain object such as {'href': url} instead of an actual Location object).
+ * To allow such mocking, the assertions permit objects of types that are not
+ * relevant DOM API objects at all (for instance, not Element or Location).
+ *
+ * Note that instanceof checks don't work straightforwardly in older versions of
+ * IE, or across frames (see,
+ * http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object,
+ * http://stackoverflow.com/questions/26248599/instanceof-htmlelement-in-iframe-is-not-element-or-object).
+ *
+ * Hence, these assertions may pass vacuously in such scenarios. The resulting
+ * risk of security bugs is limited by the following factors:
+ * - A bug can only arise in scenarios involving incorrect static typing (the
+ * wrapper methods are statically typed to demand objects of the appropriate,
+ * precise type).
+ * - Typically, code is tested and exercised in multiple browsers.
+ */
+
+/**
+ * Asserts that a given object is a Location.
+ *
+ * To permit this assertion to pass in the context of tests where DOM APIs might
+ * be mocked, also accepts any other type except for subtypes of {!Element}.
+ * This is to ensure that, for instance, HTMLLinkElement is not being used in
+ * place of a Location, since this could result in security bugs due to stronger
+ * contracts required for assignments to the href property of the latter.
+ *
+ * @param {?Object} o The object whose type to assert.
+ * @return {!Location}
+ */
+goog.dom.asserts.assertIsLocation = function(o) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ var win = goog.dom.asserts.getWindow_(o);
+ if (typeof win.Location != 'undefined' &&
+ typeof win.Element != 'undefined') {
+ goog.asserts.assert(
+ o && (o instanceof win.Location || !(o instanceof win.Element)),
+ 'Argument is not a Location (or a non-Element mock); got: %s',
+ goog.dom.asserts.debugStringForType_(o));
+ }
+ }
+ return /** @type {!Location} */ (o);
+};
+
+/**
+ * Asserts that a given object is a HTMLAnchorElement.
+ *
+ * To permit this assertion to pass in the context of tests where elements might
+ * be mocked, also accepts objects that are not of type Location nor a subtype
+ * of Element.
+ *
+ * @param {?Object} o The object whose type to assert.
+ * @return {!HTMLAnchorElement}
+ */
+goog.dom.asserts.assertIsHTMLAnchorElement = function(o) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ var win = goog.dom.asserts.getWindow_(o);
+ if (typeof win.HTMLAnchorElement != 'undefined' &&
+ typeof win.Location != 'undefined' &&
+ typeof win.Element != 'undefined') {
+ goog.asserts.assert(
+ o &&
+ (o instanceof win.HTMLAnchorElement ||
+ !((o instanceof win.Location) || (o instanceof win.Element))),
+ 'Argument is not a HTMLAnchorElement (or a non-Element mock); ' +
+ 'got: %s',
+ goog.dom.asserts.debugStringForType_(o));
+ }
+ }
+ return /** @type {!HTMLAnchorElement} */ (o);
+};
+
+/**
+ * Asserts that a given object is a HTMLLinkElement.
+ *
+ * To permit this assertion to pass in the context of tests where elements might
+ * be mocked, also accepts objects that are not a subtype of Element.
+ *
+ * @param {?Object} o The object whose type to assert.
+ * @return {!HTMLLinkElement}
+ */
+goog.dom.asserts.assertIsHTMLLinkElement = function(o) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ var win = goog.dom.asserts.getWindow_(o);
+ if (typeof win.HTMLLinkElement != 'undefined' &&
+ typeof win.Location != 'undefined' &&
+ typeof win.Element != 'undefined') {
+ goog.asserts.assert(
+ o &&
+ (o instanceof win.HTMLLinkElement ||
+ !((o instanceof win.Location) || (o instanceof win.Element))),
+ 'Argument is not a HTMLLinkElement (or a non-Element mock); got: %s',
+ goog.dom.asserts.debugStringForType_(o));
+ }
+ }
+ return /** @type {!HTMLLinkElement} */ (o);
+};
+
+/**
+ * Asserts that a given object is a HTMLImageElement.
+ *
+ * To permit this assertion to pass in the context of tests where elements might
+ * be mocked, also accepts objects that are not a subtype of Element.
+ *
+ * @param {?Object} o The object whose type to assert.
+ * @return {!HTMLImageElement}
+ */
+goog.dom.asserts.assertIsHTMLImageElement = function(o) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ var win = goog.dom.asserts.getWindow_(o);
+ if (typeof win.HTMLImageElement != 'undefined' &&
+ typeof win.Element != 'undefined') {
+ goog.asserts.assert(
+ o &&
+ (o instanceof win.HTMLImageElement ||
+ !(o instanceof win.Element)),
+ 'Argument is not a HTMLImageElement (or a non-Element mock); got: %s',
+ goog.dom.asserts.debugStringForType_(o));
+ }
+ }
+ return /** @type {!HTMLImageElement} */ (o);
+};
+
+/**
+ * Asserts that a given object is a HTMLEmbedElement.
+ *
+ * To permit this assertion to pass in the context of tests where elements might
+ * be mocked, also accepts objects that are not a subtype of Element.
+ *
+ * @param {?Object} o The object whose type to assert.
+ * @return {!HTMLEmbedElement}
+ */
+goog.dom.asserts.assertIsHTMLEmbedElement = function(o) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ var win = goog.dom.asserts.getWindow_(o);
+ if (typeof win.HTMLEmbedElement != 'undefined' &&
+ typeof win.Element != 'undefined') {
+ goog.asserts.assert(
+ o &&
+ (o instanceof win.HTMLEmbedElement ||
+ !(o instanceof win.Element)),
+ 'Argument is not a HTMLEmbedElement (or a non-Element mock); got: %s',
+ goog.dom.asserts.debugStringForType_(o));
+ }
+ }
+ return /** @type {!HTMLEmbedElement} */ (o);
+};
+
+/**
+ * Asserts that a given object is a HTMLFrameElement.
+ *
+ * To permit this assertion to pass in the context of tests where elements might
+ * be mocked, also accepts objects that are not a subtype of Element.
+ *
+ * @param {?Object} o The object whose type to assert.
+ * @return {!HTMLFrameElement}
+ */
+goog.dom.asserts.assertIsHTMLFrameElement = function(o) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ var win = goog.dom.asserts.getWindow_(o);
+ if (typeof win.HTMLFrameElement != 'undefined' &&
+ typeof win.Element != 'undefined') {
+ goog.asserts.assert(
+ o &&
+ (o instanceof win.HTMLFrameElement ||
+ !(o instanceof win.Element)),
+ 'Argument is not a HTMLFrameElement (or a non-Element mock); got: %s',
+ goog.dom.asserts.debugStringForType_(o));
+ }
+ }
+ return /** @type {!HTMLFrameElement} */ (o);
+};
+
+/**
+ * Asserts that a given object is a HTMLIFrameElement.
+ *
+ * To permit this assertion to pass in the context of tests where elements might
+ * be mocked, also accepts objects that are not a subtype of Element.
+ *
+ * @param {?Object} o The object whose type to assert.
+ * @return {!HTMLIFrameElement}
+ */
+goog.dom.asserts.assertIsHTMLIFrameElement = function(o) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ var win = goog.dom.asserts.getWindow_(o);
+ if (typeof win.HTMLIFrameElement != 'undefined' &&
+ typeof win.Element != 'undefined') {
+ goog.asserts.assert(
+ o &&
+ (o instanceof win.HTMLIFrameElement ||
+ !(o instanceof win.Element)),
+ 'Argument is not a HTMLIFrameElement (or a non-Element mock); ' +
+ 'got: %s',
+ goog.dom.asserts.debugStringForType_(o));
+ }
+ }
+ return /** @type {!HTMLIFrameElement} */ (o);
+};
+
+/**
+ * Asserts that a given object is a HTMLObjectElement.
+ *
+ * To permit this assertion to pass in the context of tests where elements might
+ * be mocked, also accepts objects that are not a subtype of Element.
+ *
+ * @param {?Object} o The object whose type to assert.
+ * @return {!HTMLObjectElement}
+ */
+goog.dom.asserts.assertIsHTMLObjectElement = function(o) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ var win = goog.dom.asserts.getWindow_(o);
+ if (typeof win.HTMLObjectElement != 'undefined' &&
+ typeof win.Element != 'undefined') {
+ goog.asserts.assert(
+ o &&
+ (o instanceof win.HTMLObjectElement ||
+ !(o instanceof win.Element)),
+ 'Argument is not a HTMLObjectElement (or a non-Element mock); ' +
+ 'got: %s',
+ goog.dom.asserts.debugStringForType_(o));
+ }
+ }
+ return /** @type {!HTMLObjectElement} */ (o);
+};
+
+/**
+ * Asserts that a given object is a HTMLScriptElement.
+ *
+ * To permit this assertion to pass in the context of tests where elements might
+ * be mocked, also accepts objects that are not a subtype of Element.
+ *
+ * @param {?Object} o The object whose type to assert.
+ * @return {!HTMLScriptElement}
+ */
+goog.dom.asserts.assertIsHTMLScriptElement = function(o) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ var win = goog.dom.asserts.getWindow_(o);
+ if (typeof win.HTMLScriptElement != 'undefined' &&
+ typeof win.Element != 'undefined') {
+ goog.asserts.assert(
+ o &&
+ (o instanceof win.HTMLScriptElement ||
+ !(o instanceof win.Element)),
+ 'Argument is not a HTMLScriptElement (or a non-Element mock); ' +
+ 'got: %s',
+ goog.dom.asserts.debugStringForType_(o));
+ }
+ }
+ return /** @type {!HTMLScriptElement} */ (o);
+};
+
+/**
+ * Returns a string representation of a value's type.
+ *
+ * @param {*} value An object, or primitive.
+ * @return {string} The best display name for the value.
+ * @private
+ */
+goog.dom.asserts.debugStringForType_ = function(value) {
+ if (goog.isObject(value)) {
+ return value.constructor.displayName || value.constructor.name ||
+ Object.prototype.toString.call(value);
+ } else {
+ return value === undefined ? 'undefined' :
+ value === null ? 'null' : typeof value;
+ }
+};
+
+/**
+ * Gets window of element.
+ * @param {?Object} o
+ * @return {!Window}
+ * @private
+ */
+goog.dom.asserts.getWindow_ = function(o) {
+ var doc = o && o.ownerDocument;
+ var win = doc && /** @type {?Window} */ (doc.defaultView || doc.parentWindow);
+ return win || /** @type {!Window} */ (goog.global);
+};
diff --git a/src/http/static/viz/2/goog/dom/browserfeature.js b/src/http/static/viz/2/goog/dom/browserfeature.js
new file mode 100644
index 0000000..1172166
--- /dev/null
+++ b/src/http/static/viz/2/goog/dom/browserfeature.js
@@ -0,0 +1,73 @@
+// Copyright 2010 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Browser capability checks for the dom package.
+ *
+ */
+
+
+goog.provide('goog.dom.BrowserFeature');
+
+goog.require('goog.userAgent');
+
+
+/**
+ * Enum of browser capabilities.
+ * @enum {boolean}
+ */
+goog.dom.BrowserFeature = {
+ /**
+ * Whether attributes 'name' and 'type' can be added to an element after it's
+ * created. False in Internet Explorer prior to version 9.
+ */
+ CAN_ADD_NAME_OR_TYPE_ATTRIBUTES:
+ !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9),
+
+ /**
+ * Whether we can use element.children to access an element's Element
+ * children. Available since Gecko 1.9.1, IE 9. (IE<9 also includes comment
+ * nodes in the collection.)
+ */
+ CAN_USE_CHILDREN_ATTRIBUTE: !goog.userAgent.GECKO && !goog.userAgent.IE ||
+ goog.userAgent.IE && goog.userAgent.isDocumentModeOrHigher(9) ||
+ goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9.1'),
+
+ /**
+ * Opera, Safari 3, and Internet Explorer 9 all support innerText but they
+ * include text nodes in script and style tags. Not document-mode-dependent.
+ */
+ CAN_USE_INNER_TEXT:
+ (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9')),
+
+ /**
+ * MSIE, Opera, and Safari>=4 support element.parentElement to access an
+ * element's parent if it is an Element.
+ */
+ CAN_USE_PARENT_ELEMENT_PROPERTY:
+ goog.userAgent.IE || goog.userAgent.OPERA || goog.userAgent.WEBKIT,
+
+ /**
+ * Whether NoScope elements need a scoped element written before them in
+ * innerHTML.
+ * MSDN: http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx#1
+ */
+ INNER_HTML_NEEDS_SCOPED_ELEMENT: goog.userAgent.IE,
+
+ /**
+ * Whether we use legacy IE range API.
+ */
+ LEGACY_IE_RANGES:
+ goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)
+};
diff --git a/src/http/static/viz/2/goog/dom/dom.js b/src/http/static/viz/2/goog/dom/dom.js
new file mode 100644
index 0000000..919a0b6
--- /dev/null
+++ b/src/http/static/viz/2/goog/dom/dom.js
@@ -0,0 +1,3233 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for manipulating the browser's Document Object Model
+ * Inspiration taken *heavily* from mochikit (http://mochikit.com/).
+ *
+ * You can use {@link goog.dom.DomHelper} to create new dom helpers that refer
+ * to a different document object. This is useful if you are working with
+ * frames or multiple windows.
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+// TODO(arv): Rename/refactor getTextContent and getRawTextContent. The problem
+// is that getTextContent should mimic the DOM3 textContent. We should add a
+// getInnerText (or getText) which tries to return the visible text, innerText.
+
+
+goog.provide('goog.dom');
+goog.provide('goog.dom.Appendable');
+goog.provide('goog.dom.DomHelper');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom.BrowserFeature');
+goog.require('goog.dom.NodeType');
+goog.require('goog.dom.TagName');
+goog.require('goog.dom.safe');
+goog.require('goog.html.SafeHtml');
+goog.require('goog.html.uncheckedconversions');
+goog.require('goog.math.Coordinate');
+goog.require('goog.math.Size');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('goog.string.Unicode');
+goog.require('goog.userAgent');
+
+
+/**
+ * @define {boolean} Whether we know at compile time that the browser is in
+ * quirks mode.
+ */
+goog.define('goog.dom.ASSUME_QUIRKS_MODE', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile time that the browser is in
+ * standards compliance mode.
+ */
+goog.define('goog.dom.ASSUME_STANDARDS_MODE', false);
+
+
+/**
+ * Whether we know the compatibility mode at compile time.
+ * @type {boolean}
+ * @private
+ */
+goog.dom.COMPAT_MODE_KNOWN_ =
+ goog.dom.ASSUME_QUIRKS_MODE || goog.dom.ASSUME_STANDARDS_MODE;
+
+
+/**
+ * Gets the DomHelper object for the document where the element resides.
+ * @param {(Node|Window)=} opt_element If present, gets the DomHelper for this
+ * element.
+ * @return {!goog.dom.DomHelper} The DomHelper.
+ */
+goog.dom.getDomHelper = function(opt_element) {
+ return opt_element ?
+ new goog.dom.DomHelper(goog.dom.getOwnerDocument(opt_element)) :
+ (goog.dom.defaultDomHelper_ ||
+ (goog.dom.defaultDomHelper_ = new goog.dom.DomHelper()));
+};
+
+
+/**
+ * Cached default DOM helper.
+ * @type {!goog.dom.DomHelper|undefined}
+ * @private
+ */
+goog.dom.defaultDomHelper_;
+
+
+/**
+ * Gets the document object being used by the dom library.
+ * @return {!Document} Document object.
+ */
+goog.dom.getDocument = function() {
+ return document;
+};
+
+
+/**
+ * Gets an element from the current document by element id.
+ *
+ * If an Element is passed in, it is returned.
+ *
+ * @param {string|Element} element Element ID or a DOM node.
+ * @return {Element} The element with the given ID, or the node passed in.
+ */
+goog.dom.getElement = function(element) {
+ return goog.dom.getElementHelper_(document, element);
+};
+
+
+/**
+ * Gets an element by id from the given document (if present).
+ * If an element is given, it is returned.
+ * @param {!Document} doc
+ * @param {string|Element} element Element ID or a DOM node.
+ * @return {Element} The resulting element.
+ * @private
+ */
+goog.dom.getElementHelper_ = function(doc, element) {
+ return goog.isString(element) ? doc.getElementById(element) : element;
+};
+
+
+/**
+ * Gets an element by id, asserting that the element is found.
+ *
+ * This is used when an element is expected to exist, and should fail with
+ * an assertion error if it does not (if assertions are enabled).
+ *
+ * @param {string} id Element ID.
+ * @return {!Element} The element with the given ID, if it exists.
+ */
+goog.dom.getRequiredElement = function(id) {
+ return goog.dom.getRequiredElementHelper_(document, id);
+};
+
+
+/**
+ * Helper function for getRequiredElementHelper functions, both static and
+ * on DomHelper. Asserts the element with the given id exists.
+ * @param {!Document} doc
+ * @param {string} id
+ * @return {!Element} The element with the given ID, if it exists.
+ * @private
+ */
+goog.dom.getRequiredElementHelper_ = function(doc, id) {
+ // To prevent users passing in Elements as is permitted in getElement().
+ goog.asserts.assertString(id);
+ var element = goog.dom.getElementHelper_(doc, id);
+ element =
+ goog.asserts.assertElement(element, 'No element found with id: ' + id);
+ return element;
+};
+
+
+/**
+ * Alias for getElement.
+ * @param {string|Element} element Element ID or a DOM node.
+ * @return {Element} The element with the given ID, or the node passed in.
+ * @deprecated Use {@link goog.dom.getElement} instead.
+ */
+goog.dom.$ = goog.dom.getElement;
+
+
+/**
+ * Gets elements by tag name.
+ * @param {!goog.dom.TagName<T>} tagName
+ * @param {(!Document|!Element)=} opt_parent Parent element or document where to
+ * look for elements. Defaults to document.
+ * @return {!NodeList<R>} List of elements. The members of the list are
+ * {!Element} if tagName is not a member of goog.dom.TagName or more
+ * specific types if it is (e.g. {!HTMLAnchorElement} for
+ * goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.getElementsByTagName = function(tagName, opt_parent) {
+ var parent = opt_parent || document;
+ return parent.getElementsByTagName(String(tagName));
+};
+
+
+/**
+ * Looks up elements by both tag and class name, using browser native functions
+ * ({@code querySelectorAll}, {@code getElementsByTagName} or
+ * {@code getElementsByClassName}) where possible. This function
+ * is a useful, if limited, way of collecting a list of DOM elements
+ * with certain characteristics. {@code goog.dom.query} offers a
+ * more powerful and general solution which allows matching on CSS3
+ * selector expressions, but at increased cost in code size. If all you
+ * need is particular tags belonging to a single class, this function
+ * is fast and sleek.
+ *
+ * Note that tag names are case sensitive in the SVG namespace, and this
+ * function converts opt_tag to uppercase for comparisons. For queries in the
+ * SVG namespace you should use querySelector or querySelectorAll instead.
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=963870
+ * https://bugs.webkit.org/show_bug.cgi?id=83438
+ *
+ * @see {goog.dom.query}
+ *
+ * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {!IArrayLike<R>} Array-like list of elements (only a length property
+ * and numerical indices are guaranteed to exist). The members of the array
+ * are {!Element} if opt_tag is not a member of goog.dom.TagName or more
+ * specific types if it is (e.g. {!HTMLAnchorElement} for
+ * goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) {
+ return goog.dom.getElementsByTagNameAndClass_(
+ document, opt_tag, opt_class, opt_el);
+};
+
+
+/**
+ * Gets the first element matching the tag and the class.
+ *
+ * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {?R} Reference to a DOM node. The return type is {?Element} if
+ * tagName is a string or a more specific type if it is a member of
+ * goog.dom.TagName (e.g. {?HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.getElementByTagNameAndClass = function(opt_tag, opt_class, opt_el) {
+ return goog.dom.getElementByTagNameAndClass_(
+ document, opt_tag, opt_class, opt_el);
+};
+
+
+/**
+ * Returns a static, array-like list of the elements with the provided
+ * className.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {!IArrayLike<!Element>} The items found with the class name provided.
+ */
+goog.dom.getElementsByClass = function(className, opt_el) {
+ var parent = opt_el || document;
+ if (goog.dom.canUseQuerySelector_(parent)) {
+ return parent.querySelectorAll('.' + className);
+ }
+ return goog.dom.getElementsByTagNameAndClass_(
+ document, '*', className, opt_el);
+};
+
+
+/**
+ * Returns the first element with the provided className.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {Element|Document=} opt_el Optional element to look in.
+ * @return {Element} The first item with the class name provided.
+ */
+goog.dom.getElementByClass = function(className, opt_el) {
+ var parent = opt_el || document;
+ var retVal = null;
+ if (parent.getElementsByClassName) {
+ retVal = parent.getElementsByClassName(className)[0];
+ } else {
+ retVal =
+ goog.dom.getElementByTagNameAndClass_(document, '*', className, opt_el);
+ }
+ return retVal || null;
+};
+
+
+/**
+ * Ensures an element with the given className exists, and then returns the
+ * first element with the provided className.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {!Element|!Document=} opt_root Optional element or document to look
+ * in.
+ * @return {!Element} The first item with the class name provided.
+ * @throws {goog.asserts.AssertionError} Thrown if no element is found.
+ */
+goog.dom.getRequiredElementByClass = function(className, opt_root) {
+ var retValue = goog.dom.getElementByClass(className, opt_root);
+ return goog.asserts.assert(
+ retValue, 'No element found with className: ' + className);
+};
+
+
+/**
+ * Prefer the standardized (http://www.w3.org/TR/selectors-api/), native and
+ * fast W3C Selectors API.
+ * @param {!(Element|Document)} parent The parent document object.
+ * @return {boolean} whether or not we can use parent.querySelector* APIs.
+ * @private
+ */
+goog.dom.canUseQuerySelector_ = function(parent) {
+ return !!(parent.querySelectorAll && parent.querySelector);
+};
+
+
+/**
+ * Helper for {@code getElementsByTagNameAndClass}.
+ * @param {!Document} doc The document to get the elements in.
+ * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {!IArrayLike<R>} Array-like list of elements (only a length property
+ * and numerical indices are guaranteed to exist). The members of the array
+ * are {!Element} if opt_tag is not a member of goog.dom.TagName or more
+ * specific types if it is (e.g. {!HTMLAnchorElement} for
+ * goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ * @private
+ */
+goog.dom.getElementsByTagNameAndClass_ = function(
+ doc, opt_tag, opt_class, opt_el) {
+ var parent = opt_el || doc;
+ var tagName =
+ (opt_tag && opt_tag != '*') ? String(opt_tag).toUpperCase() : '';
+
+ if (goog.dom.canUseQuerySelector_(parent) && (tagName || opt_class)) {
+ var query = tagName + (opt_class ? '.' + opt_class : '');
+ return parent.querySelectorAll(query);
+ }
+
+ // Use the native getElementsByClassName if available, under the assumption
+ // that even when the tag name is specified, there will be fewer elements to
+ // filter through when going by class than by tag name
+ if (opt_class && parent.getElementsByClassName) {
+ var els = parent.getElementsByClassName(opt_class);
+
+ if (tagName) {
+ var arrayLike = {};
+ var len = 0;
+
+ // Filter for specific tags if requested.
+ for (var i = 0, el; el = els[i]; i++) {
+ if (tagName == el.nodeName) {
+ arrayLike[len++] = el;
+ }
+ }
+ arrayLike.length = len;
+
+ return /** @type {!IArrayLike<!Element>} */ (arrayLike);
+ } else {
+ return els;
+ }
+ }
+
+ var els = parent.getElementsByTagName(tagName || '*');
+
+ if (opt_class) {
+ var arrayLike = {};
+ var len = 0;
+ for (var i = 0, el; el = els[i]; i++) {
+ var className = el.className;
+ // Check if className has a split function since SVG className does not.
+ if (typeof className.split == 'function' &&
+ goog.array.contains(className.split(/\s+/), opt_class)) {
+ arrayLike[len++] = el;
+ }
+ }
+ arrayLike.length = len;
+ return /** @type {!IArrayLike<!Element>} */ (arrayLike);
+ } else {
+ return els;
+ }
+};
+
+
+/**
+ * Helper for goog.dom.getElementByTagNameAndClass.
+ *
+ * @param {!Document} doc The document to get the elements in.
+ * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {?R} Reference to a DOM node. The return type is {?Element} if
+ * tagName is a string or a more specific type if it is a member of
+ * goog.dom.TagName (e.g. {?HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ * @private
+ */
+goog.dom.getElementByTagNameAndClass_ = function(
+ doc, opt_tag, opt_class, opt_el) {
+ var parent = opt_el || doc;
+ var tag = (opt_tag && opt_tag != '*') ? String(opt_tag).toUpperCase() : '';
+ if (goog.dom.canUseQuerySelector_(parent) && (tag || opt_class)) {
+ return parent.querySelector(tag + (opt_class ? '.' + opt_class : ''));
+ }
+ var elements =
+ goog.dom.getElementsByTagNameAndClass_(doc, opt_tag, opt_class, opt_el);
+ return elements[0] || null;
+};
+
+
+
+/**
+ * Alias for {@code getElementsByTagNameAndClass}.
+ * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {Element=} opt_el Optional element to look in.
+ * @return {!IArrayLike<R>} Array-like list of elements (only a length property
+ * and numerical indices are guaranteed to exist). The members of the array
+ * are {!Element} if opt_tag is not a member of goog.dom.TagName or more
+ * specific types if it is (e.g. {!HTMLAnchorElement} for
+ * goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ * @deprecated Use {@link goog.dom.getElementsByTagNameAndClass} instead.
+ */
+goog.dom.$$ = goog.dom.getElementsByTagNameAndClass;
+
+
+/**
+ * Sets multiple properties, and sometimes attributes, on an element. Note that
+ * properties are simply object properties on the element instance, while
+ * attributes are visible in the DOM. Many properties map to attributes with the
+ * same names, some with different names, and there are also unmappable cases.
+ *
+ * This method sets properties by default (which means that custom attributes
+ * are not supported). These are the exeptions (some of which is legacy):
+ * - "style": Even though this is an attribute name, it is translated to a
+ * property, "style.cssText". Note that this property sanitizes and formats
+ * its value, unlike the attribute.
+ * - "class": This is an attribute name, it is translated to the "className"
+ * property.
+ * - "for": This is an attribute name, it is translated to the "htmlFor"
+ * property.
+ * - Entries in {@see goog.dom.DIRECT_ATTRIBUTE_MAP_} are set as attributes,
+ * this is probably due to browser quirks.
+ * - "aria-*", "data-*": Always set as attributes, they have no property
+ * counterparts.
+ *
+ * @param {Element} element DOM node to set properties on.
+ * @param {Object} properties Hash of property:value pairs.
+ * Property values can be strings or goog.string.TypedString values (such as
+ * goog.html.SafeUrl).
+ */
+goog.dom.setProperties = function(element, properties) {
+ goog.object.forEach(properties, function(val, key) {
+ if (val && val.implementsGoogStringTypedString) {
+ val = val.getTypedStringValue();
+ }
+ if (key == 'style') {
+ element.style.cssText = val;
+ } else if (key == 'class') {
+ element.className = val;
+ } else if (key == 'for') {
+ element.htmlFor = val;
+ } else if (goog.dom.DIRECT_ATTRIBUTE_MAP_.hasOwnProperty(key)) {
+ element.setAttribute(goog.dom.DIRECT_ATTRIBUTE_MAP_[key], val);
+ } else if (
+ goog.string.startsWith(key, 'aria-') ||
+ goog.string.startsWith(key, 'data-')) {
+ element.setAttribute(key, val);
+ } else {
+ element[key] = val;
+ }
+ });
+};
+
+
+/**
+ * Map of attributes that should be set using
+ * element.setAttribute(key, val) instead of element[key] = val. Used
+ * by goog.dom.setProperties.
+ *
+ * @private {!Object<string, string>}
+ * @const
+ */
+goog.dom.DIRECT_ATTRIBUTE_MAP_ = {
+ 'cellpadding': 'cellPadding',
+ 'cellspacing': 'cellSpacing',
+ 'colspan': 'colSpan',
+ 'frameborder': 'frameBorder',
+ 'height': 'height',
+ 'maxlength': 'maxLength',
+ 'nonce': 'nonce',
+ 'role': 'role',
+ 'rowspan': 'rowSpan',
+ 'type': 'type',
+ 'usemap': 'useMap',
+ 'valign': 'vAlign',
+ 'width': 'width'
+};
+
+
+/**
+ * Gets the dimensions of the viewport.
+ *
+ * Gecko Standards mode:
+ * docEl.clientWidth Width of viewport excluding scrollbar.
+ * win.innerWidth Width of viewport including scrollbar.
+ * body.clientWidth Width of body element.
+ *
+ * docEl.clientHeight Height of viewport excluding scrollbar.
+ * win.innerHeight Height of viewport including scrollbar.
+ * body.clientHeight Height of document.
+ *
+ * Gecko Backwards compatible mode:
+ * docEl.clientWidth Width of viewport excluding scrollbar.
+ * win.innerWidth Width of viewport including scrollbar.
+ * body.clientWidth Width of viewport excluding scrollbar.
+ *
+ * docEl.clientHeight Height of document.
+ * win.innerHeight Height of viewport including scrollbar.
+ * body.clientHeight Height of viewport excluding scrollbar.
+ *
+ * IE6/7 Standards mode:
+ * docEl.clientWidth Width of viewport excluding scrollbar.
+ * win.innerWidth Undefined.
+ * body.clientWidth Width of body element.
+ *
+ * docEl.clientHeight Height of viewport excluding scrollbar.
+ * win.innerHeight Undefined.
+ * body.clientHeight Height of document element.
+ *
+ * IE5 + IE6/7 Backwards compatible mode:
+ * docEl.clientWidth 0.
+ * win.innerWidth Undefined.
+ * body.clientWidth Width of viewport excluding scrollbar.
+ *
+ * docEl.clientHeight 0.
+ * win.innerHeight Undefined.
+ * body.clientHeight Height of viewport excluding scrollbar.
+ *
+ * Opera 9 Standards and backwards compatible mode:
+ * docEl.clientWidth Width of viewport excluding scrollbar.
+ * win.innerWidth Width of viewport including scrollbar.
+ * body.clientWidth Width of viewport excluding scrollbar.
+ *
+ * docEl.clientHeight Height of document.
+ * win.innerHeight Height of viewport including scrollbar.
+ * body.clientHeight Height of viewport excluding scrollbar.
+ *
+ * WebKit:
+ * Safari 2
+ * docEl.clientHeight Same as scrollHeight.
+ * docEl.clientWidth Same as innerWidth.
+ * win.innerWidth Width of viewport excluding scrollbar.
+ * win.innerHeight Height of the viewport including scrollbar.
+ * frame.innerHeight Height of the viewport exluding scrollbar.
+ *
+ * Safari 3 (tested in 522)
+ *
+ * docEl.clientWidth Width of viewport excluding scrollbar.
+ * docEl.clientHeight Height of viewport excluding scrollbar in strict mode.
+ * body.clientHeight Height of viewport excluding scrollbar in quirks mode.
+ *
+ * @param {Window=} opt_window Optional window element to test.
+ * @return {!goog.math.Size} Object with values 'width' and 'height'.
+ */
+goog.dom.getViewportSize = function(opt_window) {
+ // TODO(arv): This should not take an argument
+ return goog.dom.getViewportSize_(opt_window || window);
+};
+
+
+/**
+ * Helper for {@code getViewportSize}.
+ * @param {Window} win The window to get the view port size for.
+ * @return {!goog.math.Size} Object with values 'width' and 'height'.
+ * @private
+ */
+goog.dom.getViewportSize_ = function(win) {
+ var doc = win.document;
+ var el = goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body;
+ return new goog.math.Size(el.clientWidth, el.clientHeight);
+};
+
+
+/**
+ * Calculates the height of the document.
+ *
+ * @return {number} The height of the current document.
+ */
+goog.dom.getDocumentHeight = function() {
+ return goog.dom.getDocumentHeight_(window);
+};
+
+/**
+ * Calculates the height of the document of the given window.
+ *
+ * @param {!Window} win The window whose document height to retrieve.
+ * @return {number} The height of the document of the given window.
+ */
+goog.dom.getDocumentHeightForWindow = function(win) {
+ return goog.dom.getDocumentHeight_(win);
+};
+
+/**
+ * Calculates the height of the document of the given window.
+ *
+ * Function code copied from the opensocial gadget api:
+ * gadgets.window.adjustHeight(opt_height)
+ *
+ * @private
+ * @param {!Window} win The window whose document height to retrieve.
+ * @return {number} The height of the document of the given window.
+ */
+goog.dom.getDocumentHeight_ = function(win) {
+ // NOTE(eae): This method will return the window size rather than the document
+ // size in webkit quirks mode.
+ var doc = win.document;
+ var height = 0;
+
+ if (doc) {
+ // Calculating inner content height is hard and different between
+ // browsers rendering in Strict vs. Quirks mode. We use a combination of
+ // three properties within document.body and document.documentElement:
+ // - scrollHeight
+ // - offsetHeight
+ // - clientHeight
+ // These values differ significantly between browsers and rendering modes.
+ // But there are patterns. It just takes a lot of time and persistence
+ // to figure out.
+
+ var body = doc.body;
+ var docEl = /** @type {!HTMLElement} */ (doc.documentElement);
+ if (!(docEl && body)) {
+ return 0;
+ }
+
+ // Get the height of the viewport
+ var vh = goog.dom.getViewportSize_(win).height;
+ if (goog.dom.isCss1CompatMode_(doc) && docEl.scrollHeight) {
+ // In Strict mode:
+ // The inner content height is contained in either:
+ // document.documentElement.scrollHeight
+ // document.documentElement.offsetHeight
+ // Based on studying the values output by different browsers,
+ // use the value that's NOT equal to the viewport height found above.
+ height =
+ docEl.scrollHeight != vh ? docEl.scrollHeight : docEl.offsetHeight;
+ } else {
+ // In Quirks mode:
+ // documentElement.clientHeight is equal to documentElement.offsetHeight
+ // except in IE. In most browsers, document.documentElement can be used
+ // to calculate the inner content height.
+ // However, in other browsers (e.g. IE), document.body must be used
+ // instead. How do we know which one to use?
+ // If document.documentElement.clientHeight does NOT equal
+ // document.documentElement.offsetHeight, then use document.body.
+ var sh = docEl.scrollHeight;
+ var oh = docEl.offsetHeight;
+ if (docEl.clientHeight != oh) {
+ sh = body.scrollHeight;
+ oh = body.offsetHeight;
+ }
+
+ // Detect whether the inner content height is bigger or smaller
+ // than the bounding box (viewport). If bigger, take the larger
+ // value. If smaller, take the smaller value.
+ if (sh > vh) {
+ // Content is larger
+ height = sh > oh ? sh : oh;
+ } else {
+ // Content is smaller
+ height = sh < oh ? sh : oh;
+ }
+ }
+ }
+
+ return height;
+};
+
+
+/**
+ * Gets the page scroll distance as a coordinate object.
+ *
+ * @param {Window=} opt_window Optional window element to test.
+ * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.
+ * @deprecated Use {@link goog.dom.getDocumentScroll} instead.
+ */
+goog.dom.getPageScroll = function(opt_window) {
+ var win = opt_window || goog.global || window;
+ return goog.dom.getDomHelper(win.document).getDocumentScroll();
+};
+
+
+/**
+ * Gets the document scroll distance as a coordinate object.
+ *
+ * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.
+ */
+goog.dom.getDocumentScroll = function() {
+ return goog.dom.getDocumentScroll_(document);
+};
+
+
+/**
+ * Helper for {@code getDocumentScroll}.
+ *
+ * @param {!Document} doc The document to get the scroll for.
+ * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.
+ * @private
+ */
+goog.dom.getDocumentScroll_ = function(doc) {
+ var el = goog.dom.getDocumentScrollElement_(doc);
+ var win = goog.dom.getWindow_(doc);
+ if (goog.userAgent.IE && goog.userAgent.isVersionOrHigher('10') &&
+ win.pageYOffset != el.scrollTop) {
+ // The keyboard on IE10 touch devices shifts the page using the pageYOffset
+ // without modifying scrollTop. For this case, we want the body scroll
+ // offsets.
+ return new goog.math.Coordinate(el.scrollLeft, el.scrollTop);
+ }
+ return new goog.math.Coordinate(
+ win.pageXOffset || el.scrollLeft, win.pageYOffset || el.scrollTop);
+};
+
+
+/**
+ * Gets the document scroll element.
+ * @return {!Element} Scrolling element.
+ */
+goog.dom.getDocumentScrollElement = function() {
+ return goog.dom.getDocumentScrollElement_(document);
+};
+
+
+/**
+ * Helper for {@code getDocumentScrollElement}.
+ * @param {!Document} doc The document to get the scroll element for.
+ * @return {!Element} Scrolling element.
+ * @private
+ */
+goog.dom.getDocumentScrollElement_ = function(doc) {
+ // Old WebKit needs body.scrollLeft in both quirks mode and strict mode. We
+ // also default to the documentElement if the document does not have a body
+ // (e.g. a SVG document).
+ // Uses http://dev.w3.org/csswg/cssom-view/#dom-document-scrollingelement to
+ // avoid trying to guess about browser behavior from the UA string.
+ if (doc.scrollingElement) {
+ return doc.scrollingElement;
+ }
+ if (!goog.userAgent.WEBKIT && goog.dom.isCss1CompatMode_(doc)) {
+ return doc.documentElement;
+ }
+ return doc.body || doc.documentElement;
+};
+
+
+/**
+ * Gets the window object associated with the given document.
+ *
+ * @param {Document=} opt_doc Document object to get window for.
+ * @return {!Window} The window associated with the given document.
+ */
+goog.dom.getWindow = function(opt_doc) {
+ // TODO(arv): This should not take an argument.
+ return opt_doc ? goog.dom.getWindow_(opt_doc) : window;
+};
+
+
+/**
+ * Helper for {@code getWindow}.
+ *
+ * @param {!Document} doc Document object to get window for.
+ * @return {!Window} The window associated with the given document.
+ * @private
+ */
+goog.dom.getWindow_ = function(doc) {
+ return /** @type {!Window} */ (doc.parentWindow || doc.defaultView);
+};
+
+
+/**
+ * Returns a dom node with a set of attributes. This function accepts varargs
+ * for subsequent nodes to be added. Subsequent nodes will be added to the
+ * first node as childNodes.
+ *
+ * So:
+ * <code>createDom(goog.dom.TagName.DIV, null, createDom(goog.dom.TagName.P),
+ * createDom(goog.dom.TagName.P));</code> would return a div with two child
+ * paragraphs
+ *
+ * For passing properties, please see {@link goog.dom.setProperties} for more
+ * information.
+ *
+ * @param {string|!goog.dom.TagName<T>} tagName Tag to create.
+ * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map
+ * of name-value pairs for attributes. If a string, then this is the
+ * className of the new element. If an array, the elements will be joined
+ * together as the className of the new element.
+ * @param {...(Object|string|Array|NodeList)} var_args Further DOM nodes or
+ * strings for text nodes. If one of the var_args is an array or NodeList,
+ * its elements will be added as childNodes instead.
+ * @return {R} Reference to a DOM node. The return type is {!Element} if tagName
+ * is a string or a more specific type if it is a member of
+ * goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.createDom = function(tagName, opt_attributes, var_args) {
+ return goog.dom.createDom_(document, arguments);
+};
+
+
+/**
+ * Helper for {@code createDom}.
+ * @param {!Document} doc The document to create the DOM in.
+ * @param {!Arguments} args Argument object passed from the callers. See
+ * {@code goog.dom.createDom} for details.
+ * @return {!Element} Reference to a DOM node.
+ * @private
+ */
+goog.dom.createDom_ = function(doc, args) {
+ var tagName = String(args[0]);
+ var attributes = args[1];
+
+ // Internet Explorer is dumb:
+ // name: https://msdn.microsoft.com/en-us/library/ms534184(v=vs.85).aspx
+ // type: https://msdn.microsoft.com/en-us/library/ms534700(v=vs.85).aspx
+ // Also does not allow setting of 'type' attribute on 'input' or 'button'.
+ if (!goog.dom.BrowserFeature.CAN_ADD_NAME_OR_TYPE_ATTRIBUTES && attributes &&
+ (attributes.name || attributes.type)) {
+ var tagNameArr = ['<', tagName];
+ if (attributes.name) {
+ tagNameArr.push(' name="', goog.string.htmlEscape(attributes.name), '"');
+ }
+ if (attributes.type) {
+ tagNameArr.push(' type="', goog.string.htmlEscape(attributes.type), '"');
+
+ // Clone attributes map to remove 'type' without mutating the input.
+ var clone = {};
+ goog.object.extend(clone, attributes);
+
+ // JSCompiler can't see how goog.object.extend added this property,
+ // because it was essentially added by reflection.
+ // So it needs to be quoted.
+ delete clone['type'];
+
+ attributes = clone;
+ }
+ tagNameArr.push('>');
+ tagName = tagNameArr.join('');
+ }
+
+ var element = doc.createElement(tagName);
+
+ if (attributes) {
+ if (goog.isString(attributes)) {
+ element.className = attributes;
+ } else if (goog.isArray(attributes)) {
+ element.className = attributes.join(' ');
+ } else {
+ goog.dom.setProperties(element, attributes);
+ }
+ }
+
+ if (args.length > 2) {
+ goog.dom.append_(doc, element, args, 2);
+ }
+
+ return element;
+};
+
+
+/**
+ * Appends a node with text or other nodes.
+ * @param {!Document} doc The document to create new nodes in.
+ * @param {!Node} parent The node to append nodes to.
+ * @param {!Arguments} args The values to add. See {@code goog.dom.append}.
+ * @param {number} startIndex The index of the array to start from.
+ * @private
+ */
+goog.dom.append_ = function(doc, parent, args, startIndex) {
+ function childHandler(child) {
+ // TODO(user): More coercion, ala MochiKit?
+ if (child) {
+ parent.appendChild(
+ goog.isString(child) ? doc.createTextNode(child) : child);
+ }
+ }
+
+ for (var i = startIndex; i < args.length; i++) {
+ var arg = args[i];
+ // TODO(attila): Fix isArrayLike to return false for a text node.
+ if (goog.isArrayLike(arg) && !goog.dom.isNodeLike(arg)) {
+ // If the argument is a node list, not a real array, use a clone,
+ // because forEach can't be used to mutate a NodeList.
+ goog.array.forEach(
+ goog.dom.isNodeList(arg) ? goog.array.toArray(arg) : arg,
+ childHandler);
+ } else {
+ childHandler(arg);
+ }
+ }
+};
+
+
+/**
+ * Alias for {@code createDom}.
+ * @param {string|!goog.dom.TagName<T>} tagName Tag to create.
+ * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map
+ * of name-value pairs for attributes. If a string, then this is the
+ * className of the new element. If an array, the elements will be joined
+ * together as the className of the new element.
+ * @param {...(Object|string|Array|NodeList)} var_args Further DOM nodes or
+ * strings for text nodes. If one of the var_args is an array, its
+ * children will be added as childNodes instead.
+ * @return {R} Reference to a DOM node. The return type is {!Element} if tagName
+ * is a string or a more specific type if it is a member of
+ * goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ * @deprecated Use {@link goog.dom.createDom} instead.
+ */
+goog.dom.$dom = goog.dom.createDom;
+
+
+/**
+ * Creates a new element.
+ * @param {string|!goog.dom.TagName<T>} name Tag to create.
+ * @return {R} The new element. The return type is {!Element} if name is
+ * a string or a more specific type if it is a member of goog.dom.TagName
+ * (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.createElement = function(name) {
+ return goog.dom.createElement_(document, name);
+};
+
+
+/**
+ * Creates a new element.
+ * @param {!Document} doc The document to create the element in.
+ * @param {string|!goog.dom.TagName<T>} name Tag to create.
+ * @return {R} The new element. The return type is {!Element} if name is
+ * a string or a more specific type if it is a member of goog.dom.TagName
+ * (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ * @private
+ */
+goog.dom.createElement_ = function(doc, name) {
+ return doc.createElement(String(name));
+};
+
+
+/**
+ * Creates a new text node.
+ * @param {number|string} content Content.
+ * @return {!Text} The new text node.
+ */
+goog.dom.createTextNode = function(content) {
+ return document.createTextNode(String(content));
+};
+
+
+/**
+ * Create a table.
+ * @param {number} rows The number of rows in the table. Must be >= 1.
+ * @param {number} columns The number of columns in the table. Must be >= 1.
+ * @param {boolean=} opt_fillWithNbsp If true, fills table entries with
+ * {@code goog.string.Unicode.NBSP} characters.
+ * @return {!Element} The created table.
+ */
+goog.dom.createTable = function(rows, columns, opt_fillWithNbsp) {
+ // TODO(mlourenco): Return HTMLTableElement, also in prototype function.
+ // Callers need to be updated to e.g. not assign numbers to table.cellSpacing.
+ return goog.dom.createTable_(document, rows, columns, !!opt_fillWithNbsp);
+};
+
+
+/**
+ * Create a table.
+ * @param {!Document} doc Document object to use to create the table.
+ * @param {number} rows The number of rows in the table. Must be >= 1.
+ * @param {number} columns The number of columns in the table. Must be >= 1.
+ * @param {boolean} fillWithNbsp If true, fills table entries with
+ * {@code goog.string.Unicode.NBSP} characters.
+ * @return {!HTMLTableElement} The created table.
+ * @private
+ */
+goog.dom.createTable_ = function(doc, rows, columns, fillWithNbsp) {
+ var table = goog.dom.createElement_(doc, goog.dom.TagName.TABLE);
+ var tbody =
+ table.appendChild(goog.dom.createElement_(doc, goog.dom.TagName.TBODY));
+ for (var i = 0; i < rows; i++) {
+ var tr = goog.dom.createElement_(doc, goog.dom.TagName.TR);
+ for (var j = 0; j < columns; j++) {
+ var td = goog.dom.createElement_(doc, goog.dom.TagName.TD);
+ // IE <= 9 will create a text node if we set text content to the empty
+ // string, so we avoid doing it unless necessary. This ensures that the
+ // same DOM tree is returned on all browsers.
+ if (fillWithNbsp) {
+ goog.dom.setTextContent(td, goog.string.Unicode.NBSP);
+ }
+ tr.appendChild(td);
+ }
+ tbody.appendChild(tr);
+ }
+ return table;
+};
+
+
+
+/**
+ * Creates a new Node from constant strings of HTML markup.
+ * @param {...!goog.string.Const} var_args The HTML strings to concatenate then
+ * convert into a node.
+ * @return {!Node}
+ */
+goog.dom.constHtmlToNode = function(var_args) {
+ var stringArray = goog.array.map(arguments, goog.string.Const.unwrap);
+ var safeHtml =
+ goog.html.uncheckedconversions
+ .safeHtmlFromStringKnownToSatisfyTypeContract(
+ goog.string.Const.from(
+ 'Constant HTML string, that gets turned into a ' +
+ 'Node later, so it will be automatically balanced.'),
+ stringArray.join(''));
+ return goog.dom.safeHtmlToNode(safeHtml);
+};
+
+
+/**
+ * Converts HTML markup into a node. This is a safe version of
+ * {@code goog.dom.htmlToDocumentFragment} which is now deleted.
+ * @param {!goog.html.SafeHtml} html The HTML markup to convert.
+ * @return {!Node} The resulting node.
+ */
+goog.dom.safeHtmlToNode = function(html) {
+ return goog.dom.safeHtmlToNode_(document, html);
+};
+
+
+/**
+ * Helper for {@code safeHtmlToNode}.
+ * @param {!Document} doc The document.
+ * @param {!goog.html.SafeHtml} html The HTML markup to convert.
+ * @return {!Node} The resulting node.
+ * @private
+ */
+goog.dom.safeHtmlToNode_ = function(doc, html) {
+ var tempDiv = goog.dom.createElement_(doc, goog.dom.TagName.DIV);
+ if (goog.dom.BrowserFeature.INNER_HTML_NEEDS_SCOPED_ELEMENT) {
+ goog.dom.safe.setInnerHtml(
+ tempDiv, goog.html.SafeHtml.concat(goog.html.SafeHtml.BR, html));
+ tempDiv.removeChild(tempDiv.firstChild);
+ } else {
+ goog.dom.safe.setInnerHtml(tempDiv, html);
+ }
+ return goog.dom.childrenToNode_(doc, tempDiv);
+};
+
+
+/**
+ * Helper for {@code safeHtmlToNode_}.
+ * @param {!Document} doc The document.
+ * @param {!Node} tempDiv The input node.
+ * @return {!Node} The resulting node.
+ * @private
+ */
+goog.dom.childrenToNode_ = function(doc, tempDiv) {
+ if (tempDiv.childNodes.length == 1) {
+ return tempDiv.removeChild(tempDiv.firstChild);
+ } else {
+ var fragment = doc.createDocumentFragment();
+ while (tempDiv.firstChild) {
+ fragment.appendChild(tempDiv.firstChild);
+ }
+ return fragment;
+ }
+};
+
+
+/**
+ * Returns true if the browser is in "CSS1-compatible" (standards-compliant)
+ * mode, false otherwise.
+ * @return {boolean} True if in CSS1-compatible mode.
+ */
+goog.dom.isCss1CompatMode = function() {
+ return goog.dom.isCss1CompatMode_(document);
+};
+
+
+/**
+ * Returns true if the browser is in "CSS1-compatible" (standards-compliant)
+ * mode, false otherwise.
+ * @param {!Document} doc The document to check.
+ * @return {boolean} True if in CSS1-compatible mode.
+ * @private
+ */
+goog.dom.isCss1CompatMode_ = function(doc) {
+ if (goog.dom.COMPAT_MODE_KNOWN_) {
+ return goog.dom.ASSUME_STANDARDS_MODE;
+ }
+
+ return doc.compatMode == 'CSS1Compat';
+};
+
+
+/**
+ * Determines if the given node can contain children, intended to be used for
+ * HTML generation.
+ *
+ * IE natively supports node.canHaveChildren but has inconsistent behavior.
+ * Prior to IE8 the base tag allows children and in IE9 all nodes return true
+ * for canHaveChildren.
+ *
+ * In practice all non-IE browsers allow you to add children to any node, but
+ * the behavior is inconsistent:
+ *
+ * <pre>
+ * var a = goog.dom.createElement(goog.dom.TagName.BR);
+ * a.appendChild(document.createTextNode('foo'));
+ * a.appendChild(document.createTextNode('bar'));
+ * console.log(a.childNodes.length); // 2
+ * console.log(a.innerHTML); // Chrome: "", IE9: "foobar", FF3.5: "foobar"
+ * </pre>
+ *
+ * For more information, see:
+ * http://dev.w3.org/html5/markup/syntax.html#syntax-elements
+ *
+ * TODO(user): Rename shouldAllowChildren() ?
+ *
+ * @param {Node} node The node to check.
+ * @return {boolean} Whether the node can contain children.
+ */
+goog.dom.canHaveChildren = function(node) {
+ if (node.nodeType != goog.dom.NodeType.ELEMENT) {
+ return false;
+ }
+ switch (/** @type {!Element} */ (node).tagName) {
+ case String(goog.dom.TagName.APPLET):
+ case String(goog.dom.TagName.AREA):
+ case String(goog.dom.TagName.BASE):
+ case String(goog.dom.TagName.BR):
+ case String(goog.dom.TagName.COL):
+ case String(goog.dom.TagName.COMMAND):
+ case String(goog.dom.TagName.EMBED):
+ case String(goog.dom.TagName.FRAME):
+ case String(goog.dom.TagName.HR):
+ case String(goog.dom.TagName.IMG):
+ case String(goog.dom.TagName.INPUT):
+ case String(goog.dom.TagName.IFRAME):
+ case String(goog.dom.TagName.ISINDEX):
+ case String(goog.dom.TagName.KEYGEN):
+ case String(goog.dom.TagName.LINK):
+ case String(goog.dom.TagName.NOFRAMES):
+ case String(goog.dom.TagName.NOSCRIPT):
+ case String(goog.dom.TagName.META):
+ case String(goog.dom.TagName.OBJECT):
+ case String(goog.dom.TagName.PARAM):
+ case String(goog.dom.TagName.SCRIPT):
+ case String(goog.dom.TagName.SOURCE):
+ case String(goog.dom.TagName.STYLE):
+ case String(goog.dom.TagName.TRACK):
+ case String(goog.dom.TagName.WBR):
+ return false;
+ }
+ return true;
+};
+
+
+/**
+ * Appends a child to a node.
+ * @param {Node} parent Parent.
+ * @param {Node} child Child.
+ */
+goog.dom.appendChild = function(parent, child) {
+ parent.appendChild(child);
+};
+
+
+/**
+ * Appends a node with text or other nodes.
+ * @param {!Node} parent The node to append nodes to.
+ * @param {...goog.dom.Appendable} var_args The things to append to the node.
+ * If this is a Node it is appended as is.
+ * If this is a string then a text node is appended.
+ * If this is an array like object then fields 0 to length - 1 are appended.
+ */
+goog.dom.append = function(parent, var_args) {
+ goog.dom.append_(goog.dom.getOwnerDocument(parent), parent, arguments, 1);
+};
+
+
+/**
+ * Removes all the child nodes on a DOM node.
+ * @param {Node} node Node to remove children from.
+ */
+goog.dom.removeChildren = function(node) {
+ // Note: Iterations over live collections can be slow, this is the fastest
+ // we could find. The double parenthesis are used to prevent JsCompiler and
+ // strict warnings.
+ var child;
+ while ((child = node.firstChild)) {
+ node.removeChild(child);
+ }
+};
+
+
+/**
+ * Inserts a new node before an existing reference node (i.e. as the previous
+ * sibling). If the reference node has no parent, then does nothing.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} refNode Reference node to insert before.
+ */
+goog.dom.insertSiblingBefore = function(newNode, refNode) {
+ if (refNode.parentNode) {
+ refNode.parentNode.insertBefore(newNode, refNode);
+ }
+};
+
+
+/**
+ * Inserts a new node after an existing reference node (i.e. as the next
+ * sibling). If the reference node has no parent, then does nothing.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} refNode Reference node to insert after.
+ */
+goog.dom.insertSiblingAfter = function(newNode, refNode) {
+ if (refNode.parentNode) {
+ refNode.parentNode.insertBefore(newNode, refNode.nextSibling);
+ }
+};
+
+
+/**
+ * Insert a child at a given index. If index is larger than the number of child
+ * nodes that the parent currently has, the node is inserted as the last child
+ * node.
+ * @param {Element} parent The element into which to insert the child.
+ * @param {Node} child The element to insert.
+ * @param {number} index The index at which to insert the new child node. Must
+ * not be negative.
+ */
+goog.dom.insertChildAt = function(parent, child, index) {
+ // Note that if the second argument is null, insertBefore
+ // will append the child at the end of the list of children.
+ parent.insertBefore(child, parent.childNodes[index] || null);
+};
+
+
+/**
+ * Removes a node from its parent.
+ * @param {Node} node The node to remove.
+ * @return {Node} The node removed if removed; else, null.
+ */
+goog.dom.removeNode = function(node) {
+ return node && node.parentNode ? node.parentNode.removeChild(node) : null;
+};
+
+
+/**
+ * Replaces a node in the DOM tree. Will do nothing if {@code oldNode} has no
+ * parent.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} oldNode Node to replace.
+ */
+goog.dom.replaceNode = function(newNode, oldNode) {
+ var parent = oldNode.parentNode;
+ if (parent) {
+ parent.replaceChild(newNode, oldNode);
+ }
+};
+
+
+/**
+ * Flattens an element. That is, removes it and replace it with its children.
+ * Does nothing if the element is not in the document.
+ * @param {Element} element The element to flatten.
+ * @return {Element|undefined} The original element, detached from the document
+ * tree, sans children; or undefined, if the element was not in the document
+ * to begin with.
+ */
+goog.dom.flattenElement = function(element) {
+ var child, parent = element.parentNode;
+ if (parent && parent.nodeType != goog.dom.NodeType.DOCUMENT_FRAGMENT) {
+ // Use IE DOM method (supported by Opera too) if available
+ if (element.removeNode) {
+ return /** @type {Element} */ (element.removeNode(false));
+ } else {
+ // Move all children of the original node up one level.
+ while ((child = element.firstChild)) {
+ parent.insertBefore(child, element);
+ }
+
+ // Detach the original element.
+ return /** @type {Element} */ (goog.dom.removeNode(element));
+ }
+ }
+};
+
+
+/**
+ * Returns an array containing just the element children of the given element.
+ * @param {Element} element The element whose element children we want.
+ * @return {!(Array<!Element>|NodeList<!Element>)} An array or array-like list
+ * of just the element children of the given element.
+ */
+goog.dom.getChildren = function(element) {
+ // We check if the children attribute is supported for child elements
+ // since IE8 misuses the attribute by also including comments.
+ if (goog.dom.BrowserFeature.CAN_USE_CHILDREN_ATTRIBUTE &&
+ element.children != undefined) {
+ return element.children;
+ }
+ // Fall back to manually filtering the element's child nodes.
+ return goog.array.filter(element.childNodes, function(node) {
+ return node.nodeType == goog.dom.NodeType.ELEMENT;
+ });
+};
+
+
+/**
+ * Returns the first child node that is an element.
+ * @param {Node} node The node to get the first child element of.
+ * @return {Element} The first child node of {@code node} that is an element.
+ */
+goog.dom.getFirstElementChild = function(node) {
+ if (goog.isDef(node.firstElementChild)) {
+ return /** @type {!Element} */ (node).firstElementChild;
+ }
+ return goog.dom.getNextElementNode_(node.firstChild, true);
+};
+
+
+/**
+ * Returns the last child node that is an element.
+ * @param {Node} node The node to get the last child element of.
+ * @return {Element} The last child node of {@code node} that is an element.
+ */
+goog.dom.getLastElementChild = function(node) {
+ if (goog.isDef(node.lastElementChild)) {
+ return /** @type {!Element} */ (node).lastElementChild;
+ }
+ return goog.dom.getNextElementNode_(node.lastChild, false);
+};
+
+
+/**
+ * Returns the first next sibling that is an element.
+ * @param {Node} node The node to get the next sibling element of.
+ * @return {Element} The next sibling of {@code node} that is an element.
+ */
+goog.dom.getNextElementSibling = function(node) {
+ if (goog.isDef(node.nextElementSibling)) {
+ return /** @type {!Element} */ (node).nextElementSibling;
+ }
+ return goog.dom.getNextElementNode_(node.nextSibling, true);
+};
+
+
+/**
+ * Returns the first previous sibling that is an element.
+ * @param {Node} node The node to get the previous sibling element of.
+ * @return {Element} The first previous sibling of {@code node} that is
+ * an element.
+ */
+goog.dom.getPreviousElementSibling = function(node) {
+ if (goog.isDef(node.previousElementSibling)) {
+ return /** @type {!Element} */ (node).previousElementSibling;
+ }
+ return goog.dom.getNextElementNode_(node.previousSibling, false);
+};
+
+
+/**
+ * Returns the first node that is an element in the specified direction,
+ * starting with {@code node}.
+ * @param {Node} node The node to get the next element from.
+ * @param {boolean} forward Whether to look forwards or backwards.
+ * @return {Element} The first element.
+ * @private
+ */
+goog.dom.getNextElementNode_ = function(node, forward) {
+ while (node && node.nodeType != goog.dom.NodeType.ELEMENT) {
+ node = forward ? node.nextSibling : node.previousSibling;
+ }
+
+ return /** @type {Element} */ (node);
+};
+
+
+/**
+ * Returns the next node in source order from the given node.
+ * @param {Node} node The node.
+ * @return {Node} The next node in the DOM tree, or null if this was the last
+ * node.
+ */
+goog.dom.getNextNode = function(node) {
+ if (!node) {
+ return null;
+ }
+
+ if (node.firstChild) {
+ return node.firstChild;
+ }
+
+ while (node && !node.nextSibling) {
+ node = node.parentNode;
+ }
+
+ return node ? node.nextSibling : null;
+};
+
+
+/**
+ * Returns the previous node in source order from the given node.
+ * @param {Node} node The node.
+ * @return {Node} The previous node in the DOM tree, or null if this was the
+ * first node.
+ */
+goog.dom.getPreviousNode = function(node) {
+ if (!node) {
+ return null;
+ }
+
+ if (!node.previousSibling) {
+ return node.parentNode;
+ }
+
+ node = node.previousSibling;
+ while (node && node.lastChild) {
+ node = node.lastChild;
+ }
+
+ return node;
+};
+
+
+/**
+ * Whether the object looks like a DOM node.
+ * @param {?} obj The object being tested for node likeness.
+ * @return {boolean} Whether the object looks like a DOM node.
+ */
+goog.dom.isNodeLike = function(obj) {
+ return goog.isObject(obj) && obj.nodeType > 0;
+};
+
+
+/**
+ * Whether the object looks like an Element.
+ * @param {?} obj The object being tested for Element likeness.
+ * @return {boolean} Whether the object looks like an Element.
+ */
+goog.dom.isElement = function(obj) {
+ return goog.isObject(obj) && obj.nodeType == goog.dom.NodeType.ELEMENT;
+};
+
+
+/**
+ * Returns true if the specified value is a Window object. This includes the
+ * global window for HTML pages, and iframe windows.
+ * @param {?} obj Variable to test.
+ * @return {boolean} Whether the variable is a window.
+ */
+goog.dom.isWindow = function(obj) {
+ return goog.isObject(obj) && obj['window'] == obj;
+};
+
+
+/**
+ * Returns an element's parent, if it's an Element.
+ * @param {Element} element The DOM element.
+ * @return {Element} The parent, or null if not an Element.
+ */
+goog.dom.getParentElement = function(element) {
+ var parent;
+ if (goog.dom.BrowserFeature.CAN_USE_PARENT_ELEMENT_PROPERTY) {
+ var isIe9 = goog.userAgent.IE && goog.userAgent.isVersionOrHigher('9') &&
+ !goog.userAgent.isVersionOrHigher('10');
+ // SVG elements in IE9 can't use the parentElement property.
+ // goog.global['SVGElement'] is not defined in IE9 quirks mode.
+ if (!(isIe9 && goog.global['SVGElement'] &&
+ element instanceof goog.global['SVGElement'])) {
+ parent = element.parentElement;
+ if (parent) {
+ return parent;
+ }
+ }
+ }
+ parent = element.parentNode;
+ return goog.dom.isElement(parent) ? /** @type {!Element} */ (parent) : null;
+};
+
+
+/**
+ * Whether a node contains another node.
+ * @param {?Node|undefined} parent The node that should contain the other node.
+ * @param {?Node|undefined} descendant The node to test presence of.
+ * @return {boolean} Whether the parent node contains the descendent node.
+ */
+goog.dom.contains = function(parent, descendant) {
+ if (!parent || !descendant) {
+ return false;
+ }
+ // We use browser specific methods for this if available since it is faster
+ // that way.
+
+ // IE DOM
+ if (parent.contains && descendant.nodeType == goog.dom.NodeType.ELEMENT) {
+ return parent == descendant || parent.contains(descendant);
+ }
+
+ // W3C DOM Level 3
+ if (typeof parent.compareDocumentPosition != 'undefined') {
+ return parent == descendant ||
+ Boolean(parent.compareDocumentPosition(descendant) & 16);
+ }
+
+ // W3C DOM Level 1
+ while (descendant && parent != descendant) {
+ descendant = descendant.parentNode;
+ }
+ return descendant == parent;
+};
+
+
+/**
+ * Compares the document order of two nodes, returning 0 if they are the same
+ * node, a negative number if node1 is before node2, and a positive number if
+ * node2 is before node1. Note that we compare the order the tags appear in the
+ * document so in the tree <b><i>text</i></b> the B node is considered to be
+ * before the I node.
+ *
+ * @param {Node} node1 The first node to compare.
+ * @param {Node} node2 The second node to compare.
+ * @return {number} 0 if the nodes are the same node, a negative number if node1
+ * is before node2, and a positive number if node2 is before node1.
+ */
+goog.dom.compareNodeOrder = function(node1, node2) {
+ // Fall out quickly for equality.
+ if (node1 == node2) {
+ return 0;
+ }
+
+ // Use compareDocumentPosition where available
+ if (node1.compareDocumentPosition) {
+ // 4 is the bitmask for FOLLOWS.
+ return node1.compareDocumentPosition(node2) & 2 ? 1 : -1;
+ }
+
+ // Special case for document nodes on IE 7 and 8.
+ if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {
+ if (node1.nodeType == goog.dom.NodeType.DOCUMENT) {
+ return -1;
+ }
+ if (node2.nodeType == goog.dom.NodeType.DOCUMENT) {
+ return 1;
+ }
+ }
+
+ // Process in IE using sourceIndex - we check to see if the first node has
+ // a source index or if its parent has one.
+ if ('sourceIndex' in node1 ||
+ (node1.parentNode && 'sourceIndex' in node1.parentNode)) {
+ var isElement1 = node1.nodeType == goog.dom.NodeType.ELEMENT;
+ var isElement2 = node2.nodeType == goog.dom.NodeType.ELEMENT;
+
+ if (isElement1 && isElement2) {
+ return node1.sourceIndex - node2.sourceIndex;
+ } else {
+ var parent1 = node1.parentNode;
+ var parent2 = node2.parentNode;
+
+ if (parent1 == parent2) {
+ return goog.dom.compareSiblingOrder_(node1, node2);
+ }
+
+ if (!isElement1 && goog.dom.contains(parent1, node2)) {
+ return -1 * goog.dom.compareParentsDescendantNodeIe_(node1, node2);
+ }
+
+
+ if (!isElement2 && goog.dom.contains(parent2, node1)) {
+ return goog.dom.compareParentsDescendantNodeIe_(node2, node1);
+ }
+
+ return (isElement1 ? node1.sourceIndex : parent1.sourceIndex) -
+ (isElement2 ? node2.sourceIndex : parent2.sourceIndex);
+ }
+ }
+
+ // For Safari, we compare ranges.
+ var doc = goog.dom.getOwnerDocument(node1);
+
+ var range1, range2;
+ range1 = doc.createRange();
+ range1.selectNode(node1);
+ range1.collapse(true);
+
+ range2 = doc.createRange();
+ range2.selectNode(node2);
+ range2.collapse(true);
+
+ return range1.compareBoundaryPoints(
+ goog.global['Range'].START_TO_END, range2);
+};
+
+
+/**
+ * Utility function to compare the position of two nodes, when
+ * {@code textNode}'s parent is an ancestor of {@code node}. If this entry
+ * condition is not met, this function will attempt to reference a null object.
+ * @param {!Node} textNode The textNode to compare.
+ * @param {Node} node The node to compare.
+ * @return {number} -1 if node is before textNode, +1 otherwise.
+ * @private
+ */
+goog.dom.compareParentsDescendantNodeIe_ = function(textNode, node) {
+ var parent = textNode.parentNode;
+ if (parent == node) {
+ // If textNode is a child of node, then node comes first.
+ return -1;
+ }
+ var sibling = node;
+ while (sibling.parentNode != parent) {
+ sibling = sibling.parentNode;
+ }
+ return goog.dom.compareSiblingOrder_(sibling, textNode);
+};
+
+
+/**
+ * Utility function to compare the position of two nodes known to be non-equal
+ * siblings.
+ * @param {Node} node1 The first node to compare.
+ * @param {!Node} node2 The second node to compare.
+ * @return {number} -1 if node1 is before node2, +1 otherwise.
+ * @private
+ */
+goog.dom.compareSiblingOrder_ = function(node1, node2) {
+ var s = node2;
+ while ((s = s.previousSibling)) {
+ if (s == node1) {
+ // We just found node1 before node2.
+ return -1;
+ }
+ }
+
+ // Since we didn't find it, node1 must be after node2.
+ return 1;
+};
+
+
+/**
+ * Find the deepest common ancestor of the given nodes.
+ * @param {...Node} var_args The nodes to find a common ancestor of.
+ * @return {Node} The common ancestor of the nodes, or null if there is none.
+ * null will only be returned if two or more of the nodes are from different
+ * documents.
+ */
+goog.dom.findCommonAncestor = function(var_args) {
+ var i, count = arguments.length;
+ if (!count) {
+ return null;
+ } else if (count == 1) {
+ return arguments[0];
+ }
+
+ var paths = [];
+ var minLength = Infinity;
+ for (i = 0; i < count; i++) {
+ // Compute the list of ancestors.
+ var ancestors = [];
+ var node = arguments[i];
+ while (node) {
+ ancestors.unshift(node);
+ node = node.parentNode;
+ }
+
+ // Save the list for comparison.
+ paths.push(ancestors);
+ minLength = Math.min(minLength, ancestors.length);
+ }
+ var output = null;
+ for (i = 0; i < minLength; i++) {
+ var first = paths[0][i];
+ for (var j = 1; j < count; j++) {
+ if (first != paths[j][i]) {
+ return output;
+ }
+ }
+ output = first;
+ }
+ return output;
+};
+
+
+/**
+ * Returns the owner document for a node.
+ * @param {Node|Window} node The node to get the document for.
+ * @return {!Document} The document owning the node.
+ */
+goog.dom.getOwnerDocument = function(node) {
+ // TODO(nnaze): Update param signature to be non-nullable.
+ goog.asserts.assert(node, 'Node cannot be null or undefined.');
+ return /** @type {!Document} */ (
+ node.nodeType == goog.dom.NodeType.DOCUMENT ? node : node.ownerDocument ||
+ node.document);
+};
+
+
+/**
+ * Cross-browser function for getting the document element of a frame or iframe.
+ * @param {Element} frame Frame element.
+ * @return {!Document} The frame content document.
+ */
+goog.dom.getFrameContentDocument = function(frame) {
+ return frame.contentDocument ||
+ /** @type {!HTMLFrameElement} */ (frame).contentWindow.document;
+};
+
+
+/**
+ * Cross-browser function for getting the window of a frame or iframe.
+ * @param {Element} frame Frame element.
+ * @return {Window} The window associated with the given frame, or null if none
+ * exists.
+ */
+goog.dom.getFrameContentWindow = function(frame) {
+ try {
+ return frame.contentWindow ||
+ (frame.contentDocument ? goog.dom.getWindow(frame.contentDocument) :
+ null);
+ } catch (e) {
+ // NOTE(user): In IE8, checking the contentWindow or contentDocument
+ // properties will throw a "Unspecified Error" exception if the iframe is
+ // not inserted in the DOM. If we get this we can be sure that no window
+ // exists, so return null.
+ }
+ return null;
+};
+
+
+/**
+ * Sets the text content of a node, with cross-browser support.
+ * @param {Node} node The node to change the text content of.
+ * @param {string|number} text The value that should replace the node's content.
+ */
+goog.dom.setTextContent = function(node, text) {
+ goog.asserts.assert(
+ node != null,
+ 'goog.dom.setTextContent expects a non-null value for node');
+
+ if ('textContent' in node) {
+ node.textContent = text;
+ } else if (node.nodeType == goog.dom.NodeType.TEXT) {
+ /** @type {!Text} */ (node).data = String(text);
+ } else if (
+ node.firstChild && node.firstChild.nodeType == goog.dom.NodeType.TEXT) {
+ // If the first child is a text node we just change its data and remove the
+ // rest of the children.
+ while (node.lastChild != node.firstChild) {
+ node.removeChild(node.lastChild);
+ }
+ /** @type {!Text} */ (node.firstChild).data = String(text);
+ } else {
+ goog.dom.removeChildren(node);
+ var doc = goog.dom.getOwnerDocument(node);
+ node.appendChild(doc.createTextNode(String(text)));
+ }
+};
+
+
+/**
+ * Gets the outerHTML of a node, which islike innerHTML, except that it
+ * actually contains the HTML of the node itself.
+ * @param {Element} element The element to get the HTML of.
+ * @return {string} The outerHTML of the given element.
+ */
+goog.dom.getOuterHtml = function(element) {
+ goog.asserts.assert(
+ element !== null,
+ 'goog.dom.getOuterHtml expects a non-null value for element');
+ // IE, Opera and WebKit all have outerHTML.
+ if ('outerHTML' in element) {
+ return element.outerHTML;
+ } else {
+ var doc = goog.dom.getOwnerDocument(element);
+ var div = goog.dom.createElement_(doc, goog.dom.TagName.DIV);
+ div.appendChild(element.cloneNode(true));
+ return div.innerHTML;
+ }
+};
+
+
+/**
+ * Finds the first descendant node that matches the filter function, using
+ * a depth first search. This function offers the most general purpose way
+ * of finding a matching element. You may also wish to consider
+ * {@code goog.dom.query} which can express many matching criteria using
+ * CSS selector expressions. These expressions often result in a more
+ * compact representation of the desired result.
+ * @see goog.dom.query
+ *
+ * @param {Node} root The root of the tree to search.
+ * @param {function(Node) : boolean} p The filter function.
+ * @return {Node|undefined} The found node or undefined if none is found.
+ */
+goog.dom.findNode = function(root, p) {
+ var rv = [];
+ var found = goog.dom.findNodes_(root, p, rv, true);
+ return found ? rv[0] : undefined;
+};
+
+
+/**
+ * Finds all the descendant nodes that match the filter function, using a
+ * a depth first search. This function offers the most general-purpose way
+ * of finding a set of matching elements. You may also wish to consider
+ * {@code goog.dom.query} which can express many matching criteria using
+ * CSS selector expressions. These expressions often result in a more
+ * compact representation of the desired result.
+
+ * @param {Node} root The root of the tree to search.
+ * @param {function(Node) : boolean} p The filter function.
+ * @return {!Array<!Node>} The found nodes or an empty array if none are found.
+ */
+goog.dom.findNodes = function(root, p) {
+ var rv = [];
+ goog.dom.findNodes_(root, p, rv, false);
+ return rv;
+};
+
+
+/**
+ * Finds the first or all the descendant nodes that match the filter function,
+ * using a depth first search.
+ * @param {Node} root The root of the tree to search.
+ * @param {function(Node) : boolean} p The filter function.
+ * @param {!Array<!Node>} rv The found nodes are added to this array.
+ * @param {boolean} findOne If true we exit after the first found node.
+ * @return {boolean} Whether the search is complete or not. True in case findOne
+ * is true and the node is found. False otherwise.
+ * @private
+ */
+goog.dom.findNodes_ = function(root, p, rv, findOne) {
+ if (root != null) {
+ var child = root.firstChild;
+ while (child) {
+ if (p(child)) {
+ rv.push(child);
+ if (findOne) {
+ return true;
+ }
+ }
+ if (goog.dom.findNodes_(child, p, rv, findOne)) {
+ return true;
+ }
+ child = child.nextSibling;
+ }
+ }
+ return false;
+};
+
+
+/**
+ * Map of tags whose content to ignore when calculating text length.
+ * @private {!Object<string, number>}
+ * @const
+ */
+goog.dom.TAGS_TO_IGNORE_ = {
+ 'SCRIPT': 1,
+ 'STYLE': 1,
+ 'HEAD': 1,
+ 'IFRAME': 1,
+ 'OBJECT': 1
+};
+
+
+/**
+ * Map of tags which have predefined values with regard to whitespace.
+ * @private {!Object<string, string>}
+ * @const
+ */
+goog.dom.PREDEFINED_TAG_VALUES_ = {
+ 'IMG': ' ',
+ 'BR': '\n'
+};
+
+
+/**
+ * Returns true if the element has a tab index that allows it to receive
+ * keyboard focus (tabIndex >= 0), false otherwise. Note that some elements
+ * natively support keyboard focus, even if they have no tab index.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element has a tab index that allows keyboard
+ * focus.
+ */
+goog.dom.isFocusableTabIndex = function(element) {
+ return goog.dom.hasSpecifiedTabIndex_(element) &&
+ goog.dom.isTabIndexFocusable_(element);
+};
+
+
+/**
+ * Enables or disables keyboard focus support on the element via its tab index.
+ * Only elements for which {@link goog.dom.isFocusableTabIndex} returns true
+ * (or elements that natively support keyboard focus, like form elements) can
+ * receive keyboard focus. See http://go/tabindex for more info.
+ * @param {Element} element Element whose tab index is to be changed.
+ * @param {boolean} enable Whether to set or remove a tab index on the element
+ * that supports keyboard focus.
+ */
+goog.dom.setFocusableTabIndex = function(element, enable) {
+ if (enable) {
+ element.tabIndex = 0;
+ } else {
+ // Set tabIndex to -1 first, then remove it. This is a workaround for
+ // Safari (confirmed in version 4 on Windows). When removing the attribute
+ // without setting it to -1 first, the element remains keyboard focusable
+ // despite not having a tabIndex attribute anymore.
+ element.tabIndex = -1;
+ element.removeAttribute('tabIndex'); // Must be camelCase!
+ }
+};
+
+
+/**
+ * Returns true if the element can be focused, i.e. it has a tab index that
+ * allows it to receive keyboard focus (tabIndex >= 0), or it is an element
+ * that natively supports keyboard focus.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element allows keyboard focus.
+ */
+goog.dom.isFocusable = function(element) {
+ var focusable;
+ // Some elements can have unspecified tab index and still receive focus.
+ if (goog.dom.nativelySupportsFocus_(element)) {
+ // Make sure the element is not disabled ...
+ focusable = !element.disabled &&
+ // ... and if a tab index is specified, it allows focus.
+ (!goog.dom.hasSpecifiedTabIndex_(element) ||
+ goog.dom.isTabIndexFocusable_(element));
+ } else {
+ focusable = goog.dom.isFocusableTabIndex(element);
+ }
+
+ // IE requires elements to be visible in order to focus them.
+ return focusable && goog.userAgent.IE ?
+ goog.dom.hasNonZeroBoundingRect_(/** @type {!HTMLElement} */ (element)) :
+ focusable;
+};
+
+
+/**
+ * Returns true if the element has a specified tab index.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element has a specified tab index.
+ * @private
+ */
+goog.dom.hasSpecifiedTabIndex_ = function(element) {
+ // IE8 and below don't support hasAttribute(), instead check whether the
+ // 'tabindex' attributeNode is specified. Otherwise check hasAttribute().
+ if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9')) {
+ var attrNode = element.getAttributeNode('tabindex'); // Must be lowercase!
+ return goog.isDefAndNotNull(attrNode) && attrNode.specified;
+ } else {
+ return element.hasAttribute('tabindex');
+ }
+};
+
+
+/**
+ * Returns true if the element's tab index allows the element to be focused.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element's tab index allows focus.
+ * @private
+ */
+goog.dom.isTabIndexFocusable_ = function(element) {
+ var index = /** @type {!HTMLElement} */ (element).tabIndex;
+ // NOTE: IE9 puts tabIndex in 16-bit int, e.g. -2 is 65534.
+ return goog.isNumber(index) && index >= 0 && index < 32768;
+};
+
+
+/**
+ * Returns true if the element is focusable even when tabIndex is not set.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element natively supports focus.
+ * @private
+ */
+goog.dom.nativelySupportsFocus_ = function(element) {
+ return element.tagName == goog.dom.TagName.A ||
+ element.tagName == goog.dom.TagName.INPUT ||
+ element.tagName == goog.dom.TagName.TEXTAREA ||
+ element.tagName == goog.dom.TagName.SELECT ||
+ element.tagName == goog.dom.TagName.BUTTON;
+};
+
+
+/**
+ * Returns true if the element has a bounding rectangle that would be visible
+ * (i.e. its width and height are greater than zero).
+ * @param {!HTMLElement} element Element to check.
+ * @return {boolean} Whether the element has a non-zero bounding rectangle.
+ * @private
+ */
+goog.dom.hasNonZeroBoundingRect_ = function(element) {
+ var rect;
+ if (!goog.isFunction(element['getBoundingClientRect']) ||
+ // In IE, getBoundingClientRect throws on detached nodes.
+ (goog.userAgent.IE && element.parentElement == null)) {
+ rect = {'height': element.offsetHeight, 'width': element.offsetWidth};
+ } else {
+ rect = element.getBoundingClientRect();
+ }
+ return goog.isDefAndNotNull(rect) && rect.height > 0 && rect.width > 0;
+};
+
+
+/**
+ * Returns the text content of the current node, without markup and invisible
+ * symbols. New lines are stripped and whitespace is collapsed,
+ * such that each character would be visible.
+ *
+ * In browsers that support it, innerText is used. Other browsers attempt to
+ * simulate it via node traversal. Line breaks are canonicalized in IE.
+ *
+ * @param {Node} node The node from which we are getting content.
+ * @return {string} The text content.
+ */
+goog.dom.getTextContent = function(node) {
+ var textContent;
+ // Note(arv): IE9, Opera, and Safari 3 support innerText but they include
+ // text nodes in script tags. So we revert to use a user agent test here.
+ if (goog.dom.BrowserFeature.CAN_USE_INNER_TEXT && node !== null &&
+ ('innerText' in node)) {
+ textContent = goog.string.canonicalizeNewlines(node.innerText);
+ // Unfortunately .innerText() returns text with &shy; symbols
+ // We need to filter it out and then remove duplicate whitespaces
+ } else {
+ var buf = [];
+ goog.dom.getTextContent_(node, buf, true);
+ textContent = buf.join('');
+ }
+
+ // Strip &shy; entities. goog.format.insertWordBreaks inserts them in Opera.
+ textContent = textContent.replace(/ \xAD /g, ' ').replace(/\xAD/g, '');
+ // Strip &#8203; entities. goog.format.insertWordBreaks inserts them in IE8.
+ textContent = textContent.replace(/\u200B/g, '');
+
+ // Skip this replacement on old browsers with working innerText, which
+ // automatically turns &nbsp; into ' ' and / +/ into ' ' when reading
+ // innerText.
+ if (!goog.dom.BrowserFeature.CAN_USE_INNER_TEXT) {
+ textContent = textContent.replace(/ +/g, ' ');
+ }
+ if (textContent != ' ') {
+ textContent = textContent.replace(/^\s*/, '');
+ }
+
+ return textContent;
+};
+
+
+/**
+ * Returns the text content of the current node, without markup.
+ *
+ * Unlike {@code getTextContent} this method does not collapse whitespaces
+ * or normalize lines breaks.
+ *
+ * @param {Node} node The node from which we are getting content.
+ * @return {string} The raw text content.
+ */
+goog.dom.getRawTextContent = function(node) {
+ var buf = [];
+ goog.dom.getTextContent_(node, buf, false);
+
+ return buf.join('');
+};
+
+
+/**
+ * Recursive support function for text content retrieval.
+ *
+ * @param {Node} node The node from which we are getting content.
+ * @param {Array<string>} buf string buffer.
+ * @param {boolean} normalizeWhitespace Whether to normalize whitespace.
+ * @private
+ */
+goog.dom.getTextContent_ = function(node, buf, normalizeWhitespace) {
+ if (node.nodeName in goog.dom.TAGS_TO_IGNORE_) {
+ // ignore certain tags
+ } else if (node.nodeType == goog.dom.NodeType.TEXT) {
+ if (normalizeWhitespace) {
+ buf.push(String(node.nodeValue).replace(/(\r\n|\r|\n)/g, ''));
+ } else {
+ buf.push(node.nodeValue);
+ }
+ } else if (node.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {
+ buf.push(goog.dom.PREDEFINED_TAG_VALUES_[node.nodeName]);
+ } else {
+ var child = node.firstChild;
+ while (child) {
+ goog.dom.getTextContent_(child, buf, normalizeWhitespace);
+ child = child.nextSibling;
+ }
+ }
+};
+
+
+/**
+ * Returns the text length of the text contained in a node, without markup. This
+ * is equivalent to the selection length if the node was selected, or the number
+ * of cursor movements to traverse the node. Images & BRs take one space. New
+ * lines are ignored.
+ *
+ * @param {Node} node The node whose text content length is being calculated.
+ * @return {number} The length of {@code node}'s text content.
+ */
+goog.dom.getNodeTextLength = function(node) {
+ return goog.dom.getTextContent(node).length;
+};
+
+
+/**
+ * Returns the text offset of a node relative to one of its ancestors. The text
+ * length is the same as the length calculated by goog.dom.getNodeTextLength.
+ *
+ * @param {Node} node The node whose offset is being calculated.
+ * @param {Node=} opt_offsetParent The node relative to which the offset will
+ * be calculated. Defaults to the node's owner document's body.
+ * @return {number} The text offset.
+ */
+goog.dom.getNodeTextOffset = function(node, opt_offsetParent) {
+ var root = opt_offsetParent || goog.dom.getOwnerDocument(node).body;
+ var buf = [];
+ while (node && node != root) {
+ var cur = node;
+ while ((cur = cur.previousSibling)) {
+ buf.unshift(goog.dom.getTextContent(cur));
+ }
+ node = node.parentNode;
+ }
+ // Trim left to deal with FF cases when there might be line breaks and empty
+ // nodes at the front of the text
+ return goog.string.trimLeft(buf.join('')).replace(/ +/g, ' ').length;
+};
+
+
+/**
+ * Returns the node at a given offset in a parent node. If an object is
+ * provided for the optional third parameter, the node and the remainder of the
+ * offset will stored as properties of this object.
+ * @param {Node} parent The parent node.
+ * @param {number} offset The offset into the parent node.
+ * @param {Object=} opt_result Object to be used to store the return value. The
+ * return value will be stored in the form {node: Node, remainder: number}
+ * if this object is provided.
+ * @return {Node} The node at the given offset.
+ */
+goog.dom.getNodeAtOffset = function(parent, offset, opt_result) {
+ var stack = [parent], pos = 0, cur = null;
+ while (stack.length > 0 && pos < offset) {
+ cur = stack.pop();
+ if (cur.nodeName in goog.dom.TAGS_TO_IGNORE_) {
+ // ignore certain tags
+ } else if (cur.nodeType == goog.dom.NodeType.TEXT) {
+ var text = cur.nodeValue.replace(/(\r\n|\r|\n)/g, '').replace(/ +/g, ' ');
+ pos += text.length;
+ } else if (cur.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {
+ pos += goog.dom.PREDEFINED_TAG_VALUES_[cur.nodeName].length;
+ } else {
+ for (var i = cur.childNodes.length - 1; i >= 0; i--) {
+ stack.push(cur.childNodes[i]);
+ }
+ }
+ }
+ if (goog.isObject(opt_result)) {
+ opt_result.remainder = cur ? cur.nodeValue.length + offset - pos - 1 : 0;
+ opt_result.node = cur;
+ }
+
+ return cur;
+};
+
+
+/**
+ * Returns true if the object is a {@code NodeList}. To qualify as a NodeList,
+ * the object must have a numeric length property and an item function (which
+ * has type 'string' on IE for some reason).
+ * @param {Object} val Object to test.
+ * @return {boolean} Whether the object is a NodeList.
+ */
+goog.dom.isNodeList = function(val) {
+ // TODO(attila): Now the isNodeList is part of goog.dom we can use
+ // goog.userAgent to make this simpler.
+ // A NodeList must have a length property of type 'number' on all platforms.
+ if (val && typeof val.length == 'number') {
+ // A NodeList is an object everywhere except Safari, where it's a function.
+ if (goog.isObject(val)) {
+ // A NodeList must have an item function (on non-IE platforms) or an item
+ // property of type 'string' (on IE).
+ return typeof val.item == 'function' || typeof val.item == 'string';
+ } else if (goog.isFunction(val)) {
+ // On Safari, a NodeList is a function with an item property that is also
+ // a function.
+ return typeof val.item == 'function';
+ }
+ }
+
+ // Not a NodeList.
+ return false;
+};
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that has the passed
+ * tag name and/or class name. If the passed element matches the specified
+ * criteria, the element itself is returned.
+ * @param {Node} element The DOM node to start with.
+ * @param {?(goog.dom.TagName<T>|string)=} opt_tag The tag name to match (or
+ * null/undefined to match only based on class name).
+ * @param {?string=} opt_class The class name to match (or null/undefined to
+ * match only based on tag name).
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {?R} The first ancestor that matches the passed criteria, or
+ * null if no match is found. The return type is {?Element} if opt_tag is
+ * not a member of goog.dom.TagName or a more specific type if it is (e.g.
+ * {?HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.getAncestorByTagNameAndClass = function(
+ element, opt_tag, opt_class, opt_maxSearchSteps) {
+ if (!opt_tag && !opt_class) {
+ return null;
+ }
+ var tagName = opt_tag ? String(opt_tag).toUpperCase() : null;
+ return /** @type {Element} */ (goog.dom.getAncestor(element, function(node) {
+ return (!tagName || node.nodeName == tagName) &&
+ (!opt_class ||
+ goog.isString(node.className) &&
+ goog.array.contains(node.className.split(/\s+/), opt_class));
+ }, true, opt_maxSearchSteps));
+};
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that has the passed
+ * class name. If the passed element matches the specified criteria, the
+ * element itself is returned.
+ * @param {Node} element The DOM node to start with.
+ * @param {string} className The class name to match.
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {Element} The first ancestor that matches the passed criteria, or
+ * null if none match.
+ */
+goog.dom.getAncestorByClass = function(element, className, opt_maxSearchSteps) {
+ return goog.dom.getAncestorByTagNameAndClass(
+ element, null, className, opt_maxSearchSteps);
+};
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that passes the
+ * matcher function.
+ * @param {Node} element The DOM node to start with.
+ * @param {function(Node) : boolean} matcher A function that returns true if the
+ * passed node matches the desired criteria.
+ * @param {boolean=} opt_includeNode If true, the node itself is included in
+ * the search (the first call to the matcher will pass startElement as
+ * the node to test).
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {Node} DOM node that matched the matcher, or null if there was
+ * no match.
+ */
+goog.dom.getAncestor = function(
+ element, matcher, opt_includeNode, opt_maxSearchSteps) {
+ if (element && !opt_includeNode) {
+ element = element.parentNode;
+ }
+ var steps = 0;
+ while (element &&
+ (opt_maxSearchSteps == null || steps <= opt_maxSearchSteps)) {
+ goog.asserts.assert(element.name != 'parentNode');
+ if (matcher(element)) {
+ return element;
+ }
+ element = element.parentNode;
+ steps++;
+ }
+ // Reached the root of the DOM without a match
+ return null;
+};
+
+
+/**
+ * Determines the active element in the given document.
+ * @param {Document} doc The document to look in.
+ * @return {Element} The active element.
+ */
+goog.dom.getActiveElement = function(doc) {
+ try {
+ return doc && doc.activeElement;
+ } catch (e) {
+ // NOTE(nicksantos): Sometimes, evaluating document.activeElement in IE
+ // throws an exception. I'm not 100% sure why, but I suspect it chokes
+ // on document.activeElement if the activeElement has been recently
+ // removed from the DOM by a JS operation.
+ //
+ // We assume that an exception here simply means
+ // "there is no active element."
+ }
+
+ return null;
+};
+
+
+/**
+ * Gives the current devicePixelRatio.
+ *
+ * By default, this is the value of window.devicePixelRatio (which should be
+ * preferred if present).
+ *
+ * If window.devicePixelRatio is not present, the ratio is calculated with
+ * window.matchMedia, if present. Otherwise, gives 1.0.
+ *
+ * Some browsers (including Chrome) consider the browser zoom level in the pixel
+ * ratio, so the value may change across multiple calls.
+ *
+ * @return {number} The number of actual pixels per virtual pixel.
+ */
+goog.dom.getPixelRatio = function() {
+ var win = goog.dom.getWindow();
+ if (goog.isDef(win.devicePixelRatio)) {
+ return win.devicePixelRatio;
+ } else if (win.matchMedia) {
+ // Should be for IE10 and FF6-17 (this basically clamps to lower)
+ // Note that the order of these statements is important
+ return goog.dom.matchesPixelRatio_(3) || goog.dom.matchesPixelRatio_(2) ||
+ goog.dom.matchesPixelRatio_(1.5) || goog.dom.matchesPixelRatio_(1) ||
+ .75;
+ }
+ return 1;
+};
+
+
+/**
+ * Calculates a mediaQuery to check if the current device supports the
+ * given actual to virtual pixel ratio.
+ * @param {number} pixelRatio The ratio of actual pixels to virtual pixels.
+ * @return {number} pixelRatio if applicable, otherwise 0.
+ * @private
+ */
+goog.dom.matchesPixelRatio_ = function(pixelRatio) {
+ var win = goog.dom.getWindow();
+ /**
+ * Due to the 1:96 fixed ratio of CSS in to CSS px, 1dppx is equivalent to
+ * 96dpi.
+ * @const {number}
+ */
+ var dpiPerDppx = 96;
+ var query =
+ // FF16-17
+ '(min-resolution: ' + pixelRatio + 'dppx),' +
+ // FF6-15
+ '(min--moz-device-pixel-ratio: ' + pixelRatio + '),' +
+ // IE10 (this works for the two browsers above too but I don't want to
+ // trust the 1:96 fixed ratio magic)
+ '(min-resolution: ' + (pixelRatio * dpiPerDppx) + 'dpi)';
+ return win.matchMedia(query).matches ? pixelRatio : 0;
+};
+
+
+/**
+ * Gets '2d' context of a canvas. Shortcut for canvas.getContext('2d') with a
+ * type information.
+ * @param {!HTMLCanvasElement} canvas
+ * @return {!CanvasRenderingContext2D}
+ */
+goog.dom.getCanvasContext2D = function(canvas) {
+ return /** @type {!CanvasRenderingContext2D} */ (canvas.getContext('2d'));
+};
+
+
+
+/**
+ * Create an instance of a DOM helper with a new document object.
+ * @param {Document=} opt_document Document object to associate with this
+ * DOM helper.
+ * @constructor
+ */
+goog.dom.DomHelper = function(opt_document) {
+ /**
+ * Reference to the document object to use
+ * @type {!Document}
+ * @private
+ */
+ this.document_ = opt_document || goog.global.document || document;
+};
+
+
+/**
+ * Gets the dom helper object for the document where the element resides.
+ * @param {Node=} opt_node If present, gets the DomHelper for this node.
+ * @return {!goog.dom.DomHelper} The DomHelper.
+ */
+goog.dom.DomHelper.prototype.getDomHelper = goog.dom.getDomHelper;
+
+
+/**
+ * Sets the document object.
+ * @param {!Document} document Document object.
+ */
+goog.dom.DomHelper.prototype.setDocument = function(document) {
+ this.document_ = document;
+};
+
+
+/**
+ * Gets the document object being used by the dom library.
+ * @return {!Document} Document object.
+ */
+goog.dom.DomHelper.prototype.getDocument = function() {
+ return this.document_;
+};
+
+
+/**
+ * Alias for {@code getElementById}. If a DOM node is passed in then we just
+ * return that.
+ * @param {string|Element} element Element ID or a DOM node.
+ * @return {Element} The element with the given ID, or the node passed in.
+ */
+goog.dom.DomHelper.prototype.getElement = function(element) {
+ return goog.dom.getElementHelper_(this.document_, element);
+};
+
+
+/**
+ * Gets an element by id, asserting that the element is found.
+ *
+ * This is used when an element is expected to exist, and should fail with
+ * an assertion error if it does not (if assertions are enabled).
+ *
+ * @param {string} id Element ID.
+ * @return {!Element} The element with the given ID, if it exists.
+ */
+goog.dom.DomHelper.prototype.getRequiredElement = function(id) {
+ return goog.dom.getRequiredElementHelper_(this.document_, id);
+};
+
+
+/**
+ * Alias for {@code getElement}.
+ * @param {string|Element} element Element ID or a DOM node.
+ * @return {Element} The element with the given ID, or the node passed in.
+ * @deprecated Use {@link goog.dom.DomHelper.prototype.getElement} instead.
+ */
+goog.dom.DomHelper.prototype.$ = goog.dom.DomHelper.prototype.getElement;
+
+
+/**
+ * Gets elements by tag name.
+ * @param {!goog.dom.TagName<T>} tagName
+ * @param {(!Document|!Element)=} opt_parent Parent element or document where to
+ * look for elements. Defaults to document of this DomHelper.
+ * @return {!NodeList<R>} List of elements. The members of the list are
+ * {!Element} if tagName is not a member of goog.dom.TagName or more
+ * specific types if it is (e.g. {!HTMLAnchorElement} for
+ * goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.DomHelper.prototype.getElementsByTagName =
+ function(tagName, opt_parent) {
+ var parent = opt_parent || this.document_;
+ return parent.getElementsByTagName(String(tagName));
+};
+
+
+/**
+ * Looks up elements by both tag and class name, using browser native functions
+ * ({@code querySelectorAll}, {@code getElementsByTagName} or
+ * {@code getElementsByClassName}) where possible. The returned array is a live
+ * NodeList or a static list depending on the code path taken.
+ *
+ * @see goog.dom.query
+ *
+ * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name or * for all
+ * tags.
+ * @param {?string=} opt_class Optional class name.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {!IArrayLike<R>} Array-like list of elements (only a length property
+ * and numerical indices are guaranteed to exist). The members of the array
+ * are {!Element} if opt_tag is not a member of goog.dom.TagName or more
+ * specific types if it is (e.g. {!HTMLAnchorElement} for
+ * goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.DomHelper.prototype.getElementsByTagNameAndClass = function(
+ opt_tag, opt_class, opt_el) {
+ return goog.dom.getElementsByTagNameAndClass_(
+ this.document_, opt_tag, opt_class, opt_el);
+};
+
+
+/**
+ * Gets the first element matching the tag and the class.
+ *
+ * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {(Document|Element)=} opt_el Optional element to look in.
+ * @return {?R} Reference to a DOM node. The return type is {?Element} if
+ * tagName is a string or a more specific type if it is a member of
+ * goog.dom.TagName (e.g. {?HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.DomHelper.prototype.getElementByTagNameAndClass = function(
+ opt_tag, opt_class, opt_el) {
+ return goog.dom.getElementByTagNameAndClass_(
+ this.document_, opt_tag, opt_class, opt_el);
+};
+
+
+/**
+ * Returns an array of all the elements with the provided className.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {Element|Document=} opt_el Optional element to look in.
+ * @return {!IArrayLike<!Element>} The items found with the class name provided.
+ */
+goog.dom.DomHelper.prototype.getElementsByClass = function(className, opt_el) {
+ var doc = opt_el || this.document_;
+ return goog.dom.getElementsByClass(className, doc);
+};
+
+
+/**
+ * Returns the first element we find matching the provided class name.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {(Element|Document)=} opt_el Optional element to look in.
+ * @return {Element} The first item found with the class name provided.
+ */
+goog.dom.DomHelper.prototype.getElementByClass = function(className, opt_el) {
+ var doc = opt_el || this.document_;
+ return goog.dom.getElementByClass(className, doc);
+};
+
+
+/**
+ * Ensures an element with the given className exists, and then returns the
+ * first element with the provided className.
+ * @see {goog.dom.query}
+ * @param {string} className the name of the class to look for.
+ * @param {(!Element|!Document)=} opt_root Optional element or document to look
+ * in.
+ * @return {!Element} The first item found with the class name provided.
+ * @throws {goog.asserts.AssertionError} Thrown if no element is found.
+ */
+goog.dom.DomHelper.prototype.getRequiredElementByClass = function(
+ className, opt_root) {
+ var root = opt_root || this.document_;
+ return goog.dom.getRequiredElementByClass(className, root);
+};
+
+
+/**
+ * Alias for {@code getElementsByTagNameAndClass}.
+ * @deprecated Use DomHelper getElementsByTagNameAndClass.
+ * @see goog.dom.query
+ *
+ * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.
+ * @param {?string=} opt_class Optional class name.
+ * @param {Element=} opt_el Optional element to look in.
+ * @return {!IArrayLike<R>} Array-like list of elements (only a length property
+ * and numerical indices are guaranteed to exist). The members of the array
+ * are {!Element} if opt_tag is a string or more specific types if it is
+ * a member of goog.dom.TagName (e.g. {!HTMLAnchorElement} for
+ * goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.DomHelper.prototype.$$ =
+ goog.dom.DomHelper.prototype.getElementsByTagNameAndClass;
+
+
+/**
+ * Sets a number of properties on a node.
+ * @param {Element} element DOM node to set properties on.
+ * @param {Object} properties Hash of property:value pairs.
+ */
+goog.dom.DomHelper.prototype.setProperties = goog.dom.setProperties;
+
+
+/**
+ * Gets the dimensions of the viewport.
+ * @param {Window=} opt_window Optional window element to test. Defaults to
+ * the window of the Dom Helper.
+ * @return {!goog.math.Size} Object with values 'width' and 'height'.
+ */
+goog.dom.DomHelper.prototype.getViewportSize = function(opt_window) {
+ // TODO(arv): This should not take an argument. That breaks the rule of a
+ // a DomHelper representing a single frame/window/document.
+ return goog.dom.getViewportSize(opt_window || this.getWindow());
+};
+
+
+/**
+ * Calculates the height of the document.
+ *
+ * @return {number} The height of the document.
+ */
+goog.dom.DomHelper.prototype.getDocumentHeight = function() {
+ return goog.dom.getDocumentHeight_(this.getWindow());
+};
+
+
+/**
+ * Typedef for use with goog.dom.createDom and goog.dom.append.
+ * @typedef {Object|string|Array|NodeList}
+ */
+goog.dom.Appendable;
+
+
+/**
+ * Returns a dom node with a set of attributes. This function accepts varargs
+ * for subsequent nodes to be added. Subsequent nodes will be added to the
+ * first node as childNodes.
+ *
+ * So:
+ * <code>createDom(goog.dom.TagName.DIV, null, createDom(goog.dom.TagName.P),
+ * createDom(goog.dom.TagName.P));</code> would return a div with two child
+ * paragraphs
+ *
+ * An easy way to move all child nodes of an existing element to a new parent
+ * element is:
+ * <code>createDom(goog.dom.TagName.DIV, null, oldElement.childNodes);</code>
+ * which will remove all child nodes from the old element and add them as
+ * child nodes of the new DIV.
+ *
+ * @param {string|!goog.dom.TagName<T>} tagName Tag to create.
+ * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map
+ * of name-value pairs for attributes. If a string, then this is the
+ * className of the new element. If an array, the elements will be joined
+ * together as the className of the new element.
+ * @param {...goog.dom.Appendable} var_args Further DOM nodes or
+ * strings for text nodes. If one of the var_args is an array or
+ * NodeList, its elements will be added as childNodes instead.
+ * @return {R} Reference to a DOM node. The return type is {!Element} if tagName
+ * is a string or a more specific type if it is a member of
+ * goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.DomHelper.prototype.createDom = function(
+ tagName, opt_attributes, var_args) {
+ return goog.dom.createDom_(this.document_, arguments);
+};
+
+
+/**
+ * Alias for {@code createDom}.
+ * @param {string|!goog.dom.TagName<T>} tagName Tag to create.
+ * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map
+ * of name-value pairs for attributes. If a string, then this is the
+ * className of the new element. If an array, the elements will be joined
+ * together as the className of the new element.
+ * @param {...goog.dom.Appendable} var_args Further DOM nodes or strings for
+ * text nodes. If one of the var_args is an array, its children will be
+ * added as childNodes instead.
+ * @return {R} Reference to a DOM node. The return type is {!Element} if tagName
+ * is a string or a more specific type if it is a member of
+ * goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ * @deprecated Use {@link goog.dom.DomHelper.prototype.createDom} instead.
+ */
+goog.dom.DomHelper.prototype.$dom = goog.dom.DomHelper.prototype.createDom;
+
+
+/**
+ * Creates a new element.
+ * @param {string|!goog.dom.TagName<T>} name Tag to create.
+ * @return {R} The new element. The return type is {!Element} if name is
+ * a string or a more specific type if it is a member of goog.dom.TagName
+ * (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.DomHelper.prototype.createElement = function(name) {
+ return goog.dom.createElement_(this.document_, name);
+};
+
+
+/**
+ * Creates a new text node.
+ * @param {number|string} content Content.
+ * @return {!Text} The new text node.
+ */
+goog.dom.DomHelper.prototype.createTextNode = function(content) {
+ return this.document_.createTextNode(String(content));
+};
+
+
+/**
+ * Create a table.
+ * @param {number} rows The number of rows in the table. Must be >= 1.
+ * @param {number} columns The number of columns in the table. Must be >= 1.
+ * @param {boolean=} opt_fillWithNbsp If true, fills table entries with
+ * {@code goog.string.Unicode.NBSP} characters.
+ * @return {!HTMLElement} The created table.
+ */
+goog.dom.DomHelper.prototype.createTable = function(
+ rows, columns, opt_fillWithNbsp) {
+ return goog.dom.createTable_(
+ this.document_, rows, columns, !!opt_fillWithNbsp);
+};
+
+
+/**
+ * Converts an HTML into a node or a document fragment. A single Node is used if
+ * {@code html} only generates a single node. If {@code html} generates multiple
+ * nodes then these are put inside a {@code DocumentFragment}. This is a safe
+ * version of {@code goog.dom.DomHelper#htmlToDocumentFragment} which is now
+ * deleted.
+ * @param {!goog.html.SafeHtml} html The HTML markup to convert.
+ * @return {!Node} The resulting node.
+ */
+goog.dom.DomHelper.prototype.safeHtmlToNode = function(html) {
+ return goog.dom.safeHtmlToNode_(this.document_, html);
+};
+
+
+/**
+ * Returns true if the browser is in "CSS1-compatible" (standards-compliant)
+ * mode, false otherwise.
+ * @return {boolean} True if in CSS1-compatible mode.
+ */
+goog.dom.DomHelper.prototype.isCss1CompatMode = function() {
+ return goog.dom.isCss1CompatMode_(this.document_);
+};
+
+
+/**
+ * Gets the window object associated with the document.
+ * @return {!Window} The window associated with the given document.
+ */
+goog.dom.DomHelper.prototype.getWindow = function() {
+ return goog.dom.getWindow_(this.document_);
+};
+
+
+/**
+ * Gets the document scroll element.
+ * @return {!Element} Scrolling element.
+ */
+goog.dom.DomHelper.prototype.getDocumentScrollElement = function() {
+ return goog.dom.getDocumentScrollElement_(this.document_);
+};
+
+
+/**
+ * Gets the document scroll distance as a coordinate object.
+ * @return {!goog.math.Coordinate} Object with properties 'x' and 'y'.
+ */
+goog.dom.DomHelper.prototype.getDocumentScroll = function() {
+ return goog.dom.getDocumentScroll_(this.document_);
+};
+
+
+/**
+ * Determines the active element in the given document.
+ * @param {Document=} opt_doc The document to look in.
+ * @return {Element} The active element.
+ */
+goog.dom.DomHelper.prototype.getActiveElement = function(opt_doc) {
+ return goog.dom.getActiveElement(opt_doc || this.document_);
+};
+
+
+/**
+ * Appends a child to a node.
+ * @param {Node} parent Parent.
+ * @param {Node} child Child.
+ */
+goog.dom.DomHelper.prototype.appendChild = goog.dom.appendChild;
+
+
+/**
+ * Appends a node with text or other nodes.
+ * @param {!Node} parent The node to append nodes to.
+ * @param {...goog.dom.Appendable} var_args The things to append to the node.
+ * If this is a Node it is appended as is.
+ * If this is a string then a text node is appended.
+ * If this is an array like object then fields 0 to length - 1 are appended.
+ */
+goog.dom.DomHelper.prototype.append = goog.dom.append;
+
+
+/**
+ * Determines if the given node can contain children, intended to be used for
+ * HTML generation.
+ *
+ * @param {Node} node The node to check.
+ * @return {boolean} Whether the node can contain children.
+ */
+goog.dom.DomHelper.prototype.canHaveChildren = goog.dom.canHaveChildren;
+
+
+/**
+ * Removes all the child nodes on a DOM node.
+ * @param {Node} node Node to remove children from.
+ */
+goog.dom.DomHelper.prototype.removeChildren = goog.dom.removeChildren;
+
+
+/**
+ * Inserts a new node before an existing reference node (i.e., as the previous
+ * sibling). If the reference node has no parent, then does nothing.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} refNode Reference node to insert before.
+ */
+goog.dom.DomHelper.prototype.insertSiblingBefore = goog.dom.insertSiblingBefore;
+
+
+/**
+ * Inserts a new node after an existing reference node (i.e., as the next
+ * sibling). If the reference node has no parent, then does nothing.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} refNode Reference node to insert after.
+ */
+goog.dom.DomHelper.prototype.insertSiblingAfter = goog.dom.insertSiblingAfter;
+
+
+/**
+ * Insert a child at a given index. If index is larger than the number of child
+ * nodes that the parent currently has, the node is inserted as the last child
+ * node.
+ * @param {Element} parent The element into which to insert the child.
+ * @param {Node} child The element to insert.
+ * @param {number} index The index at which to insert the new child node. Must
+ * not be negative.
+ */
+goog.dom.DomHelper.prototype.insertChildAt = goog.dom.insertChildAt;
+
+
+/**
+ * Removes a node from its parent.
+ * @param {Node} node The node to remove.
+ * @return {Node} The node removed if removed; else, null.
+ */
+goog.dom.DomHelper.prototype.removeNode = goog.dom.removeNode;
+
+
+/**
+ * Replaces a node in the DOM tree. Will do nothing if {@code oldNode} has no
+ * parent.
+ * @param {Node} newNode Node to insert.
+ * @param {Node} oldNode Node to replace.
+ */
+goog.dom.DomHelper.prototype.replaceNode = goog.dom.replaceNode;
+
+
+/**
+ * Flattens an element. That is, removes it and replace it with its children.
+ * @param {Element} element The element to flatten.
+ * @return {Element|undefined} The original element, detached from the document
+ * tree, sans children, or undefined if the element was already not in the
+ * document.
+ */
+goog.dom.DomHelper.prototype.flattenElement = goog.dom.flattenElement;
+
+
+/**
+ * Returns an array containing just the element children of the given element.
+ * @param {Element} element The element whose element children we want.
+ * @return {!(Array<!Element>|NodeList<!Element>)} An array or array-like list
+ * of just the element children of the given element.
+ */
+goog.dom.DomHelper.prototype.getChildren = goog.dom.getChildren;
+
+
+/**
+ * Returns the first child node that is an element.
+ * @param {Node} node The node to get the first child element of.
+ * @return {Element} The first child node of {@code node} that is an element.
+ */
+goog.dom.DomHelper.prototype.getFirstElementChild =
+ goog.dom.getFirstElementChild;
+
+
+/**
+ * Returns the last child node that is an element.
+ * @param {Node} node The node to get the last child element of.
+ * @return {Element} The last child node of {@code node} that is an element.
+ */
+goog.dom.DomHelper.prototype.getLastElementChild = goog.dom.getLastElementChild;
+
+
+/**
+ * Returns the first next sibling that is an element.
+ * @param {Node} node The node to get the next sibling element of.
+ * @return {Element} The next sibling of {@code node} that is an element.
+ */
+goog.dom.DomHelper.prototype.getNextElementSibling =
+ goog.dom.getNextElementSibling;
+
+
+/**
+ * Returns the first previous sibling that is an element.
+ * @param {Node} node The node to get the previous sibling element of.
+ * @return {Element} The first previous sibling of {@code node} that is
+ * an element.
+ */
+goog.dom.DomHelper.prototype.getPreviousElementSibling =
+ goog.dom.getPreviousElementSibling;
+
+
+/**
+ * Returns the next node in source order from the given node.
+ * @param {Node} node The node.
+ * @return {Node} The next node in the DOM tree, or null if this was the last
+ * node.
+ */
+goog.dom.DomHelper.prototype.getNextNode = goog.dom.getNextNode;
+
+
+/**
+ * Returns the previous node in source order from the given node.
+ * @param {Node} node The node.
+ * @return {Node} The previous node in the DOM tree, or null if this was the
+ * first node.
+ */
+goog.dom.DomHelper.prototype.getPreviousNode = goog.dom.getPreviousNode;
+
+
+/**
+ * Whether the object looks like a DOM node.
+ * @param {?} obj The object being tested for node likeness.
+ * @return {boolean} Whether the object looks like a DOM node.
+ */
+goog.dom.DomHelper.prototype.isNodeLike = goog.dom.isNodeLike;
+
+
+/**
+ * Whether the object looks like an Element.
+ * @param {?} obj The object being tested for Element likeness.
+ * @return {boolean} Whether the object looks like an Element.
+ */
+goog.dom.DomHelper.prototype.isElement = goog.dom.isElement;
+
+
+/**
+ * Returns true if the specified value is a Window object. This includes the
+ * global window for HTML pages, and iframe windows.
+ * @param {?} obj Variable to test.
+ * @return {boolean} Whether the variable is a window.
+ */
+goog.dom.DomHelper.prototype.isWindow = goog.dom.isWindow;
+
+
+/**
+ * Returns an element's parent, if it's an Element.
+ * @param {Element} element The DOM element.
+ * @return {Element} The parent, or null if not an Element.
+ */
+goog.dom.DomHelper.prototype.getParentElement = goog.dom.getParentElement;
+
+
+/**
+ * Whether a node contains another node.
+ * @param {Node} parent The node that should contain the other node.
+ * @param {Node} descendant The node to test presence of.
+ * @return {boolean} Whether the parent node contains the descendent node.
+ */
+goog.dom.DomHelper.prototype.contains = goog.dom.contains;
+
+
+/**
+ * Compares the document order of two nodes, returning 0 if they are the same
+ * node, a negative number if node1 is before node2, and a positive number if
+ * node2 is before node1. Note that we compare the order the tags appear in the
+ * document so in the tree <b><i>text</i></b> the B node is considered to be
+ * before the I node.
+ *
+ * @param {Node} node1 The first node to compare.
+ * @param {Node} node2 The second node to compare.
+ * @return {number} 0 if the nodes are the same node, a negative number if node1
+ * is before node2, and a positive number if node2 is before node1.
+ */
+goog.dom.DomHelper.prototype.compareNodeOrder = goog.dom.compareNodeOrder;
+
+
+/**
+ * Find the deepest common ancestor of the given nodes.
+ * @param {...Node} var_args The nodes to find a common ancestor of.
+ * @return {Node} The common ancestor of the nodes, or null if there is none.
+ * null will only be returned if two or more of the nodes are from different
+ * documents.
+ */
+goog.dom.DomHelper.prototype.findCommonAncestor = goog.dom.findCommonAncestor;
+
+
+/**
+ * Returns the owner document for a node.
+ * @param {Node} node The node to get the document for.
+ * @return {!Document} The document owning the node.
+ */
+goog.dom.DomHelper.prototype.getOwnerDocument = goog.dom.getOwnerDocument;
+
+
+/**
+ * Cross browser function for getting the document element of an iframe.
+ * @param {Element} iframe Iframe element.
+ * @return {!Document} The frame content document.
+ */
+goog.dom.DomHelper.prototype.getFrameContentDocument =
+ goog.dom.getFrameContentDocument;
+
+
+/**
+ * Cross browser function for getting the window of a frame or iframe.
+ * @param {Element} frame Frame element.
+ * @return {Window} The window associated with the given frame.
+ */
+goog.dom.DomHelper.prototype.getFrameContentWindow =
+ goog.dom.getFrameContentWindow;
+
+
+/**
+ * Sets the text content of a node, with cross-browser support.
+ * @param {Node} node The node to change the text content of.
+ * @param {string|number} text The value that should replace the node's content.
+ */
+goog.dom.DomHelper.prototype.setTextContent = goog.dom.setTextContent;
+
+
+/**
+ * Gets the outerHTML of a node, which islike innerHTML, except that it
+ * actually contains the HTML of the node itself.
+ * @param {Element} element The element to get the HTML of.
+ * @return {string} The outerHTML of the given element.
+ */
+goog.dom.DomHelper.prototype.getOuterHtml = goog.dom.getOuterHtml;
+
+
+/**
+ * Finds the first descendant node that matches the filter function. This does
+ * a depth first search.
+ * @param {Node} root The root of the tree to search.
+ * @param {function(Node) : boolean} p The filter function.
+ * @return {Node|undefined} The found node or undefined if none is found.
+ */
+goog.dom.DomHelper.prototype.findNode = goog.dom.findNode;
+
+
+/**
+ * Finds all the descendant nodes that matches the filter function. This does a
+ * depth first search.
+ * @param {Node} root The root of the tree to search.
+ * @param {function(Node) : boolean} p The filter function.
+ * @return {Array<Node>} The found nodes or an empty array if none are found.
+ */
+goog.dom.DomHelper.prototype.findNodes = goog.dom.findNodes;
+
+
+/**
+ * Returns true if the element has a tab index that allows it to receive
+ * keyboard focus (tabIndex >= 0), false otherwise. Note that some elements
+ * natively support keyboard focus, even if they have no tab index.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element has a tab index that allows keyboard
+ * focus.
+ */
+goog.dom.DomHelper.prototype.isFocusableTabIndex = goog.dom.isFocusableTabIndex;
+
+
+/**
+ * Enables or disables keyboard focus support on the element via its tab index.
+ * Only elements for which {@link goog.dom.isFocusableTabIndex} returns true
+ * (or elements that natively support keyboard focus, like form elements) can
+ * receive keyboard focus. See http://go/tabindex for more info.
+ * @param {Element} element Element whose tab index is to be changed.
+ * @param {boolean} enable Whether to set or remove a tab index on the element
+ * that supports keyboard focus.
+ */
+goog.dom.DomHelper.prototype.setFocusableTabIndex =
+ goog.dom.setFocusableTabIndex;
+
+
+/**
+ * Returns true if the element can be focused, i.e. it has a tab index that
+ * allows it to receive keyboard focus (tabIndex >= 0), or it is an element
+ * that natively supports keyboard focus.
+ * @param {!Element} element Element to check.
+ * @return {boolean} Whether the element allows keyboard focus.
+ */
+goog.dom.DomHelper.prototype.isFocusable = goog.dom.isFocusable;
+
+
+/**
+ * Returns the text contents of the current node, without markup. New lines are
+ * stripped and whitespace is collapsed, such that each character would be
+ * visible.
+ *
+ * In browsers that support it, innerText is used. Other browsers attempt to
+ * simulate it via node traversal. Line breaks are canonicalized in IE.
+ *
+ * @param {Node} node The node from which we are getting content.
+ * @return {string} The text content.
+ */
+goog.dom.DomHelper.prototype.getTextContent = goog.dom.getTextContent;
+
+
+/**
+ * Returns the text length of the text contained in a node, without markup. This
+ * is equivalent to the selection length if the node was selected, or the number
+ * of cursor movements to traverse the node. Images & BRs take one space. New
+ * lines are ignored.
+ *
+ * @param {Node} node The node whose text content length is being calculated.
+ * @return {number} The length of {@code node}'s text content.
+ */
+goog.dom.DomHelper.prototype.getNodeTextLength = goog.dom.getNodeTextLength;
+
+
+/**
+ * Returns the text offset of a node relative to one of its ancestors. The text
+ * length is the same as the length calculated by
+ * {@code goog.dom.getNodeTextLength}.
+ *
+ * @param {Node} node The node whose offset is being calculated.
+ * @param {Node=} opt_offsetParent Defaults to the node's owner document's body.
+ * @return {number} The text offset.
+ */
+goog.dom.DomHelper.prototype.getNodeTextOffset = goog.dom.getNodeTextOffset;
+
+
+/**
+ * Returns the node at a given offset in a parent node. If an object is
+ * provided for the optional third parameter, the node and the remainder of the
+ * offset will stored as properties of this object.
+ * @param {Node} parent The parent node.
+ * @param {number} offset The offset into the parent node.
+ * @param {Object=} opt_result Object to be used to store the return value. The
+ * return value will be stored in the form {node: Node, remainder: number}
+ * if this object is provided.
+ * @return {Node} The node at the given offset.
+ */
+goog.dom.DomHelper.prototype.getNodeAtOffset = goog.dom.getNodeAtOffset;
+
+
+/**
+ * Returns true if the object is a {@code NodeList}. To qualify as a NodeList,
+ * the object must have a numeric length property and an item function (which
+ * has type 'string' on IE for some reason).
+ * @param {Object} val Object to test.
+ * @return {boolean} Whether the object is a NodeList.
+ */
+goog.dom.DomHelper.prototype.isNodeList = goog.dom.isNodeList;
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that has the passed
+ * tag name and/or class name. If the passed element matches the specified
+ * criteria, the element itself is returned.
+ * @param {Node} element The DOM node to start with.
+ * @param {?(goog.dom.TagName<T>|string)=} opt_tag The tag name to match (or
+ * null/undefined to match only based on class name).
+ * @param {?string=} opt_class The class name to match (or null/undefined to
+ * match only based on tag name).
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {?R} The first ancestor that matches the passed criteria, or
+ * null if no match is found. The return type is {?Element} if opt_tag is
+ * not a member of goog.dom.TagName or a more specific type if it is (e.g.
+ * {?HTMLAnchorElement} for goog.dom.TagName.A).
+ * @template T
+ * @template R := cond(isUnknown(T), 'Element', T) =:
+ */
+goog.dom.DomHelper.prototype.getAncestorByTagNameAndClass =
+ goog.dom.getAncestorByTagNameAndClass;
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that has the passed
+ * class name. If the passed element matches the specified criteria, the
+ * element itself is returned.
+ * @param {Node} element The DOM node to start with.
+ * @param {string} class The class name to match.
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {Element} The first ancestor that matches the passed criteria, or
+ * null if none match.
+ */
+goog.dom.DomHelper.prototype.getAncestorByClass = goog.dom.getAncestorByClass;
+
+
+/**
+ * Walks up the DOM hierarchy returning the first ancestor that passes the
+ * matcher function.
+ * @param {Node} element The DOM node to start with.
+ * @param {function(Node) : boolean} matcher A function that returns true if the
+ * passed node matches the desired criteria.
+ * @param {boolean=} opt_includeNode If true, the node itself is included in
+ * the search (the first call to the matcher will pass startElement as
+ * the node to test).
+ * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the
+ * dom.
+ * @return {Node} DOM node that matched the matcher, or null if there was
+ * no match.
+ */
+goog.dom.DomHelper.prototype.getAncestor = goog.dom.getAncestor;
+
+
+/**
+ * Gets '2d' context of a canvas. Shortcut for canvas.getContext('2d') with a
+ * type information.
+ * @param {!HTMLCanvasElement} canvas
+ * @return {!CanvasRenderingContext2D}
+ */
+goog.dom.DomHelper.prototype.getCanvasContext2D = goog.dom.getCanvasContext2D;
diff --git a/src/http/static/viz/2/goog/dom/htmlelement.js b/src/http/static/viz/2/goog/dom/htmlelement.js
new file mode 100644
index 0000000..c48f753
--- /dev/null
+++ b/src/http/static/viz/2/goog/dom/htmlelement.js
@@ -0,0 +1,29 @@
+// Copyright 2017 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+goog.provide('goog.dom.HtmlElement');
+
+
+
+/**
+ * This subclass of HTMLElement is used when only a HTMLElement is possible and
+ * not any of its subclasses. Normally, a type can refer to an instance of
+ * itself or an instance of any subtype. More concretely, if HTMLElement is used
+ * then the compiler must assume that it might still be e.g. HTMLScriptElement.
+ * With this, the type check knows that it couldn't be any special element.
+ *
+ * @constructor
+ * @extends {HTMLElement}
+ */
+goog.dom.HtmlElement = function() {};
diff --git a/src/http/static/viz/2/goog/dom/nodetype.js b/src/http/static/viz/2/goog/dom/nodetype.js
new file mode 100644
index 0000000..cccb470
--- /dev/null
+++ b/src/http/static/viz/2/goog/dom/nodetype.js
@@ -0,0 +1,48 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Definition of goog.dom.NodeType.
+ */
+
+goog.provide('goog.dom.NodeType');
+
+
+/**
+ * Constants for the nodeType attribute in the Node interface.
+ *
+ * These constants match those specified in the Node interface. These are
+ * usually present on the Node object in recent browsers, but not in older
+ * browsers (specifically, early IEs) and thus are given here.
+ *
+ * In some browsers (early IEs), these are not defined on the Node object,
+ * so they are provided here.
+ *
+ * See http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
+ * @enum {number}
+ */
+goog.dom.NodeType = {
+ ELEMENT: 1,
+ ATTRIBUTE: 2,
+ TEXT: 3,
+ CDATA_SECTION: 4,
+ ENTITY_REFERENCE: 5,
+ ENTITY: 6,
+ PROCESSING_INSTRUCTION: 7,
+ COMMENT: 8,
+ DOCUMENT: 9,
+ DOCUMENT_TYPE: 10,
+ DOCUMENT_FRAGMENT: 11,
+ NOTATION: 12
+};
diff --git a/src/http/static/viz/2/goog/dom/safe.js b/src/http/static/viz/2/goog/dom/safe.js
new file mode 100644
index 0000000..b9390a0
--- /dev/null
+++ b/src/http/static/viz/2/goog/dom/safe.js
@@ -0,0 +1,458 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Type-safe wrappers for unsafe DOM APIs.
+ *
+ * This file provides type-safe wrappers for DOM APIs that can result in
+ * cross-site scripting (XSS) vulnerabilities, if the API is supplied with
+ * untrusted (attacker-controlled) input. Instead of plain strings, the type
+ * safe wrappers consume values of types from the goog.html package whose
+ * contract promises that values are safe to use in the corresponding context.
+ *
+ * Hence, a program that exclusively uses the wrappers in this file (i.e., whose
+ * only reference to security-sensitive raw DOM APIs are in this file) is
+ * guaranteed to be free of XSS due to incorrect use of such DOM APIs (modulo
+ * correctness of code that produces values of the respective goog.html types,
+ * and absent code that violates type safety).
+ *
+ * For example, assigning to an element's .innerHTML property a string that is
+ * derived (even partially) from untrusted input typically results in an XSS
+ * vulnerability. The type-safe wrapper goog.dom.safe.setInnerHtml consumes a
+ * value of type goog.html.SafeHtml, whose contract states that using its values
+ * in a HTML context will not result in XSS. Hence a program that is free of
+ * direct assignments to any element's innerHTML property (with the exception of
+ * the assignment to .innerHTML in this file) is guaranteed to be free of XSS
+ * due to assignment of untrusted strings to the innerHTML property.
+ */
+
+goog.provide('goog.dom.safe');
+goog.provide('goog.dom.safe.InsertAdjacentHtmlPosition');
+
+goog.require('goog.asserts');
+goog.require('goog.dom.asserts');
+goog.require('goog.html.SafeHtml');
+goog.require('goog.html.SafeScript');
+goog.require('goog.html.SafeStyle');
+goog.require('goog.html.SafeUrl');
+goog.require('goog.html.TrustedResourceUrl');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+
+
+/** @enum {string} */
+goog.dom.safe.InsertAdjacentHtmlPosition = {
+ AFTERBEGIN: 'afterbegin',
+ AFTEREND: 'afterend',
+ BEFOREBEGIN: 'beforebegin',
+ BEFOREEND: 'beforeend'
+};
+
+
+/**
+ * Inserts known-safe HTML into a Node, at the specified position.
+ * @param {!Node} node The node on which to call insertAdjacentHTML.
+ * @param {!goog.dom.safe.InsertAdjacentHtmlPosition} position Position where
+ * to insert the HTML.
+ * @param {!goog.html.SafeHtml} html The known-safe HTML to insert.
+ */
+goog.dom.safe.insertAdjacentHtml = function(node, position, html) {
+ node.insertAdjacentHTML(position, goog.html.SafeHtml.unwrap(html));
+};
+
+
+/**
+ * Tags not allowed in goog.dom.safe.setInnerHtml.
+ * @private @const {!Object<string, boolean>}
+ */
+goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_ = {
+ 'MATH': true,
+ 'SCRIPT': true,
+ 'STYLE': true,
+ 'SVG': true,
+ 'TEMPLATE': true
+};
+
+
+/**
+ * Assigns known-safe HTML to an element's innerHTML property.
+ * @param {!Element} elem The element whose innerHTML is to be assigned to.
+ * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.
+ * @throws {Error} If called with one of these tags: math, script, style, svg,
+ * template.
+ */
+goog.dom.safe.setInnerHtml = function(elem, html) {
+ if (goog.asserts.ENABLE_ASSERTS) {
+ var tagName = elem.tagName.toUpperCase();
+ if (goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_[tagName]) {
+ throw Error(
+ 'goog.dom.safe.setInnerHtml cannot be used to set content of ' +
+ elem.tagName + '.');
+ }
+ }
+ elem.innerHTML = goog.html.SafeHtml.unwrap(html);
+};
+
+
+/**
+ * Assigns known-safe HTML to an element's outerHTML property.
+ * @param {!Element} elem The element whose outerHTML is to be assigned to.
+ * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.
+ */
+goog.dom.safe.setOuterHtml = function(elem, html) {
+ elem.outerHTML = goog.html.SafeHtml.unwrap(html);
+};
+
+
+/**
+ * Sets the given element's style property to the contents of the provided
+ * SafeStyle object.
+ * @param {!Element} elem
+ * @param {!goog.html.SafeStyle} style
+ */
+goog.dom.safe.setStyle = function(elem, style) {
+ elem.style.cssText = goog.html.SafeStyle.unwrap(style);
+};
+
+
+/**
+ * Writes known-safe HTML to a document.
+ * @param {!Document} doc The document to be written to.
+ * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.
+ */
+goog.dom.safe.documentWrite = function(doc, html) {
+ doc.write(goog.html.SafeHtml.unwrap(html));
+};
+
+
+/**
+ * Safely assigns a URL to an anchor element's href property.
+ *
+ * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to
+ * anchor's href property. If url is of type string however, it is first
+ * sanitized using goog.html.SafeUrl.sanitize.
+ *
+ * Example usage:
+ * goog.dom.safe.setAnchorHref(anchorEl, url);
+ * which is a safe alternative to
+ * anchorEl.href = url;
+ * The latter can result in XSS vulnerabilities if url is a
+ * user-/attacker-controlled value.
+ *
+ * @param {!HTMLAnchorElement} anchor The anchor element whose href property
+ * is to be assigned to.
+ * @param {string|!goog.html.SafeUrl} url The URL to assign.
+ * @see goog.html.SafeUrl#sanitize
+ */
+goog.dom.safe.setAnchorHref = function(anchor, url) {
+ goog.dom.asserts.assertIsHTMLAnchorElement(anchor);
+ /** @type {!goog.html.SafeUrl} */
+ var safeUrl;
+ if (url instanceof goog.html.SafeUrl) {
+ safeUrl = url;
+ } else {
+ safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);
+ }
+ anchor.href = goog.html.SafeUrl.unwrap(safeUrl);
+};
+
+
+/**
+ * Safely assigns a URL to an image element's src property.
+ *
+ * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to
+ * image's src property. If url is of type string however, it is first
+ * sanitized using goog.html.SafeUrl.sanitize.
+ *
+ * @param {!HTMLImageElement} imageElement The image element whose src property
+ * is to be assigned to.
+ * @param {string|!goog.html.SafeUrl} url The URL to assign.
+ * @see goog.html.SafeUrl#sanitize
+ */
+goog.dom.safe.setImageSrc = function(imageElement, url) {
+ goog.dom.asserts.assertIsHTMLImageElement(imageElement);
+ /** @type {!goog.html.SafeUrl} */
+ var safeUrl;
+ if (url instanceof goog.html.SafeUrl) {
+ safeUrl = url;
+ } else {
+ safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);
+ }
+ imageElement.src = goog.html.SafeUrl.unwrap(safeUrl);
+};
+
+
+/**
+ * Safely assigns a URL to an embed element's src property.
+ *
+ * Example usage:
+ * goog.dom.safe.setEmbedSrc(embedEl, url);
+ * which is a safe alternative to
+ * embedEl.src = url;
+ * The latter can result in loading untrusted code unless it is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLEmbedElement} embed The embed element whose src property
+ * is to be assigned to.
+ * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
+ */
+goog.dom.safe.setEmbedSrc = function(embed, url) {
+ goog.dom.asserts.assertIsHTMLEmbedElement(embed);
+ embed.src = goog.html.TrustedResourceUrl.unwrap(url);
+};
+
+
+/**
+ * Safely assigns a URL to a frame element's src property.
+ *
+ * Example usage:
+ * goog.dom.safe.setFrameSrc(frameEl, url);
+ * which is a safe alternative to
+ * frameEl.src = url;
+ * The latter can result in loading untrusted code unless it is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLFrameElement} frame The frame element whose src property
+ * is to be assigned to.
+ * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
+ */
+goog.dom.safe.setFrameSrc = function(frame, url) {
+ goog.dom.asserts.assertIsHTMLFrameElement(frame);
+ frame.src = goog.html.TrustedResourceUrl.unwrap(url);
+};
+
+
+/**
+ * Safely assigns a URL to an iframe element's src property.
+ *
+ * Example usage:
+ * goog.dom.safe.setIframeSrc(iframeEl, url);
+ * which is a safe alternative to
+ * iframeEl.src = url;
+ * The latter can result in loading untrusted code unless it is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLIFrameElement} iframe The iframe element whose src property
+ * is to be assigned to.
+ * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
+ */
+goog.dom.safe.setIframeSrc = function(iframe, url) {
+ goog.dom.asserts.assertIsHTMLIFrameElement(iframe);
+ iframe.src = goog.html.TrustedResourceUrl.unwrap(url);
+};
+
+
+/**
+ * Safely assigns HTML to an iframe element's srcdoc property.
+ *
+ * Example usage:
+ * goog.dom.safe.setIframeSrcdoc(iframeEl, safeHtml);
+ * which is a safe alternative to
+ * iframeEl.srcdoc = html;
+ * The latter can result in loading untrusted code.
+ *
+ * @param {!HTMLIFrameElement} iframe The iframe element whose srcdoc property
+ * is to be assigned to.
+ * @param {!goog.html.SafeHtml} html The HTML to assign.
+ */
+goog.dom.safe.setIframeSrcdoc = function(iframe, html) {
+ goog.dom.asserts.assertIsHTMLIFrameElement(iframe);
+ iframe.srcdoc = goog.html.SafeHtml.unwrap(html);
+};
+
+
+/**
+ * Safely sets a link element's href and rel properties. Whether or not
+ * the URL assigned to href has to be a goog.html.TrustedResourceUrl
+ * depends on the value of the rel property. If rel contains "stylesheet"
+ * then a TrustedResourceUrl is required.
+ *
+ * Example usage:
+ * goog.dom.safe.setLinkHrefAndRel(linkEl, url, 'stylesheet');
+ * which is a safe alternative to
+ * linkEl.rel = 'stylesheet';
+ * linkEl.href = url;
+ * The latter can result in loading untrusted code unless it is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLLinkElement} link The link element whose href property
+ * is to be assigned to.
+ * @param {string|!goog.html.SafeUrl|!goog.html.TrustedResourceUrl} url The URL
+ * to assign to the href property. Must be a TrustedResourceUrl if the
+ * value assigned to rel contains "stylesheet". A string value is
+ * sanitized with goog.html.SafeUrl.sanitize.
+ * @param {string} rel The value to assign to the rel property.
+ * @throws {Error} if rel contains "stylesheet" and url is not a
+ * TrustedResourceUrl
+ * @see goog.html.SafeUrl#sanitize
+ */
+goog.dom.safe.setLinkHrefAndRel = function(link, url, rel) {
+ goog.dom.asserts.assertIsHTMLLinkElement(link);
+ link.rel = rel;
+ if (goog.string.caseInsensitiveContains(rel, 'stylesheet')) {
+ goog.asserts.assert(
+ url instanceof goog.html.TrustedResourceUrl,
+ 'URL must be TrustedResourceUrl because "rel" contains "stylesheet"');
+ link.href = goog.html.TrustedResourceUrl.unwrap(url);
+ } else if (url instanceof goog.html.TrustedResourceUrl) {
+ link.href = goog.html.TrustedResourceUrl.unwrap(url);
+ } else if (url instanceof goog.html.SafeUrl) {
+ link.href = goog.html.SafeUrl.unwrap(url);
+ } else { // string
+ // SafeUrl.sanitize must return legitimate SafeUrl when passed a string.
+ link.href =
+ goog.html.SafeUrl.sanitizeAssertUnchanged(url).getTypedStringValue();
+ }
+};
+
+
+/**
+ * Safely assigns a URL to an object element's data property.
+ *
+ * Example usage:
+ * goog.dom.safe.setObjectData(objectEl, url);
+ * which is a safe alternative to
+ * objectEl.data = url;
+ * The latter can result in loading untrusted code unless setit is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLObjectElement} object The object element whose data property
+ * is to be assigned to.
+ * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
+ */
+goog.dom.safe.setObjectData = function(object, url) {
+ goog.dom.asserts.assertIsHTMLObjectElement(object);
+ object.data = goog.html.TrustedResourceUrl.unwrap(url);
+};
+
+
+/**
+ * Safely assigns a URL to a script element's src property.
+ *
+ * Example usage:
+ * goog.dom.safe.setScriptSrc(scriptEl, url);
+ * which is a safe alternative to
+ * scriptEl.src = url;
+ * The latter can result in loading untrusted code unless it is ensured that
+ * the URL refers to a trustworthy resource.
+ *
+ * @param {!HTMLScriptElement} script The script element whose src property
+ * is to be assigned to.
+ * @param {!goog.html.TrustedResourceUrl} url The URL to assign.
+ */
+goog.dom.safe.setScriptSrc = function(script, url) {
+ goog.dom.asserts.assertIsHTMLScriptElement(script);
+ script.src = goog.html.TrustedResourceUrl.unwrap(url);
+};
+
+
+/**
+ * Safely assigns a value to a script element's content.
+ *
+ * Example usage:
+ * goog.dom.safe.setScriptContent(scriptEl, content);
+ * which is a safe alternative to
+ * scriptEl.text = content;
+ * The latter can result in executing untrusted code unless it is ensured that
+ * the code is loaded from a trustworthy resource.
+ *
+ * @param {!HTMLScriptElement} script The script element whose content is being
+ * set.
+ * @param {!goog.html.SafeScript} content The content to assign.
+ */
+goog.dom.safe.setScriptContent = function(script, content) {
+ goog.dom.asserts.assertIsHTMLScriptElement(script);
+ script.text = goog.html.SafeScript.unwrap(content);
+};
+
+
+/**
+ * Safely assigns a URL to a Location object's href property.
+ *
+ * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to
+ * loc's href property. If url is of type string however, it is first sanitized
+ * using goog.html.SafeUrl.sanitize.
+ *
+ * Example usage:
+ * goog.dom.safe.setLocationHref(document.location, redirectUrl);
+ * which is a safe alternative to
+ * document.location.href = redirectUrl;
+ * The latter can result in XSS vulnerabilities if redirectUrl is a
+ * user-/attacker-controlled value.
+ *
+ * @param {!Location} loc The Location object whose href property is to be
+ * assigned to.
+ * @param {string|!goog.html.SafeUrl} url The URL to assign.
+ * @see goog.html.SafeUrl#sanitize
+ */
+goog.dom.safe.setLocationHref = function(loc, url) {
+ goog.dom.asserts.assertIsLocation(loc);
+ /** @type {!goog.html.SafeUrl} */
+ var safeUrl;
+ if (url instanceof goog.html.SafeUrl) {
+ safeUrl = url;
+ } else {
+ safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);
+ }
+ loc.href = goog.html.SafeUrl.unwrap(safeUrl);
+};
+
+
+/**
+ * Safely opens a URL in a new window (via window.open).
+ *
+ * If url is of type goog.html.SafeUrl, its value is unwrapped and passed in to
+ * window.open. If url is of type string however, it is first sanitized
+ * using goog.html.SafeUrl.sanitize.
+ *
+ * Note that this function does not prevent leakages via the referer that is
+ * sent by window.open. It is advised to only use this to open 1st party URLs.
+ *
+ * Example usage:
+ * goog.dom.safe.openInWindow(url);
+ * which is a safe alternative to
+ * window.open(url);
+ * The latter can result in XSS vulnerabilities if redirectUrl is a
+ * user-/attacker-controlled value.
+ *
+ * @param {string|!goog.html.SafeUrl} url The URL to open.
+ * @param {Window=} opt_openerWin Window of which to call the .open() method.
+ * Defaults to the global window.
+ * @param {!goog.string.Const=} opt_name Name of the window to open in. Can be
+ * _top, etc as allowed by window.open().
+ * @param {string=} opt_specs Comma-separated list of specifications, same as
+ * in window.open().
+ * @param {boolean=} opt_replace Whether to replace the current entry in browser
+ * history, same as in window.open().
+ * @return {Window} Window the url was opened in.
+ */
+goog.dom.safe.openInWindow = function(
+ url, opt_openerWin, opt_name, opt_specs, opt_replace) {
+ /** @type {!goog.html.SafeUrl} */
+ var safeUrl;
+ if (url instanceof goog.html.SafeUrl) {
+ safeUrl = url;
+ } else {
+ safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);
+ }
+ var win = opt_openerWin || window;
+ return win.open(
+ goog.html.SafeUrl.unwrap(safeUrl),
+ // If opt_name is undefined, simply passing that in to open() causes IE to
+ // reuse the current window instead of opening a new one. Thus we pass ''
+ // in instead, which according to spec opens a new window. See
+ // https://html.spec.whatwg.org/multipage/browsers.html#dom-open .
+ opt_name ? goog.string.Const.unwrap(opt_name) : '', opt_specs,
+ opt_replace);
+};
diff --git a/src/http/static/viz/2/goog/dom/tagname.js b/src/http/static/viz/2/goog/dom/tagname.js
new file mode 100644
index 0000000..b3808ad
--- /dev/null
+++ b/src/http/static/viz/2/goog/dom/tagname.js
@@ -0,0 +1,562 @@
+// Copyright 2007 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Defines the goog.dom.TagName class. Its constants enumerate
+ * all HTML tag names specified in either the the W3C HTML 4.01 index of
+ * elements or the HTML5 draft specification.
+ *
+ * References:
+ * http://www.w3.org/TR/html401/index/elements.html
+ * http://dev.w3.org/html5/spec/section-index.html
+ */
+goog.provide('goog.dom.TagName');
+
+goog.require('goog.dom.HtmlElement');
+
+
+/**
+ * A tag name with the type of the element stored in the generic.
+ * @param {string} tagName
+ * @constructor
+ * @template T
+ */
+goog.dom.TagName = function(tagName) {
+ /** @private {string} */
+ this.tagName_ = tagName;
+};
+
+
+/**
+ * Returns the tag name.
+ * @return {string}
+ * @override
+ */
+goog.dom.TagName.prototype.toString = function() {
+ return this.tagName_;
+};
+
+
+// Closure Compiler unconditionally converts the following constants to their
+// string value (goog.dom.TagName.A -> 'A'). These are the consequences:
+// 1. Don't add any members or static members to goog.dom.TagName as they
+// couldn't be accessed after this optimization.
+// 2. Keep the constant name and its string value the same:
+// goog.dom.TagName.X = new goog.dom.TagName('Y');
+// is converted to 'X', not 'Y'.
+
+
+/** @type {!goog.dom.TagName<!HTMLAnchorElement>} */
+goog.dom.TagName.A = new goog.dom.TagName('A');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.ABBR = new goog.dom.TagName('ABBR');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.ACRONYM = new goog.dom.TagName('ACRONYM');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.ADDRESS = new goog.dom.TagName('ADDRESS');
+
+
+/** @type {!goog.dom.TagName<!HTMLAppletElement>} */
+goog.dom.TagName.APPLET = new goog.dom.TagName('APPLET');
+
+
+/** @type {!goog.dom.TagName<!HTMLAreaElement>} */
+goog.dom.TagName.AREA = new goog.dom.TagName('AREA');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.ARTICLE = new goog.dom.TagName('ARTICLE');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.ASIDE = new goog.dom.TagName('ASIDE');
+
+
+/** @type {!goog.dom.TagName<!HTMLAudioElement>} */
+goog.dom.TagName.AUDIO = new goog.dom.TagName('AUDIO');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.B = new goog.dom.TagName('B');
+
+
+/** @type {!goog.dom.TagName<!HTMLBaseElement>} */
+goog.dom.TagName.BASE = new goog.dom.TagName('BASE');
+
+
+/** @type {!goog.dom.TagName<!HTMLBaseFontElement>} */
+goog.dom.TagName.BASEFONT = new goog.dom.TagName('BASEFONT');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.BDI = new goog.dom.TagName('BDI');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.BDO = new goog.dom.TagName('BDO');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.BIG = new goog.dom.TagName('BIG');
+
+
+/** @type {!goog.dom.TagName<!HTMLQuoteElement>} */
+goog.dom.TagName.BLOCKQUOTE = new goog.dom.TagName('BLOCKQUOTE');
+
+
+/** @type {!goog.dom.TagName<!HTMLBodyElement>} */
+goog.dom.TagName.BODY = new goog.dom.TagName('BODY');
+
+
+/** @type {!goog.dom.TagName<!HTMLBRElement>} */
+goog.dom.TagName.BR = new goog.dom.TagName('BR');
+
+
+/** @type {!goog.dom.TagName<!HTMLButtonElement>} */
+goog.dom.TagName.BUTTON = new goog.dom.TagName('BUTTON');
+
+
+/** @type {!goog.dom.TagName<!HTMLCanvasElement>} */
+goog.dom.TagName.CANVAS = new goog.dom.TagName('CANVAS');
+
+
+/** @type {!goog.dom.TagName<!HTMLTableCaptionElement>} */
+goog.dom.TagName.CAPTION = new goog.dom.TagName('CAPTION');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.CENTER = new goog.dom.TagName('CENTER');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.CITE = new goog.dom.TagName('CITE');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.CODE = new goog.dom.TagName('CODE');
+
+
+/** @type {!goog.dom.TagName<!HTMLTableColElement>} */
+goog.dom.TagName.COL = new goog.dom.TagName('COL');
+
+
+/** @type {!goog.dom.TagName<!HTMLTableColElement>} */
+goog.dom.TagName.COLGROUP = new goog.dom.TagName('COLGROUP');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.COMMAND = new goog.dom.TagName('COMMAND');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.DATA = new goog.dom.TagName('DATA');
+
+
+/** @type {!goog.dom.TagName<!HTMLDataListElement>} */
+goog.dom.TagName.DATALIST = new goog.dom.TagName('DATALIST');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.DD = new goog.dom.TagName('DD');
+
+
+/** @type {!goog.dom.TagName<!HTMLModElement>} */
+goog.dom.TagName.DEL = new goog.dom.TagName('DEL');
+
+
+/** @type {!goog.dom.TagName<!HTMLDetailsElement>} */
+goog.dom.TagName.DETAILS = new goog.dom.TagName('DETAILS');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.DFN = new goog.dom.TagName('DFN');
+
+
+/** @type {!goog.dom.TagName<!HTMLDialogElement>} */
+goog.dom.TagName.DIALOG = new goog.dom.TagName('DIALOG');
+
+
+/** @type {!goog.dom.TagName<!HTMLDirectoryElement>} */
+goog.dom.TagName.DIR = new goog.dom.TagName('DIR');
+
+
+/** @type {!goog.dom.TagName<!HTMLDivElement>} */
+goog.dom.TagName.DIV = new goog.dom.TagName('DIV');
+
+
+/** @type {!goog.dom.TagName<!HTMLDListElement>} */
+goog.dom.TagName.DL = new goog.dom.TagName('DL');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.DT = new goog.dom.TagName('DT');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.EM = new goog.dom.TagName('EM');
+
+
+/** @type {!goog.dom.TagName<!HTMLEmbedElement>} */
+goog.dom.TagName.EMBED = new goog.dom.TagName('EMBED');
+
+
+/** @type {!goog.dom.TagName<!HTMLFieldSetElement>} */
+goog.dom.TagName.FIELDSET = new goog.dom.TagName('FIELDSET');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.FIGCAPTION = new goog.dom.TagName('FIGCAPTION');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.FIGURE = new goog.dom.TagName('FIGURE');
+
+
+/** @type {!goog.dom.TagName<!HTMLFontElement>} */
+goog.dom.TagName.FONT = new goog.dom.TagName('FONT');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.FOOTER = new goog.dom.TagName('FOOTER');
+
+
+/** @type {!goog.dom.TagName<!HTMLFormElement>} */
+goog.dom.TagName.FORM = new goog.dom.TagName('FORM');
+
+
+/** @type {!goog.dom.TagName<!HTMLFrameElement>} */
+goog.dom.TagName.FRAME = new goog.dom.TagName('FRAME');
+
+
+/** @type {!goog.dom.TagName<!HTMLFrameSetElement>} */
+goog.dom.TagName.FRAMESET = new goog.dom.TagName('FRAMESET');
+
+
+/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
+goog.dom.TagName.H1 = new goog.dom.TagName('H1');
+
+
+/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
+goog.dom.TagName.H2 = new goog.dom.TagName('H2');
+
+
+/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
+goog.dom.TagName.H3 = new goog.dom.TagName('H3');
+
+
+/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
+goog.dom.TagName.H4 = new goog.dom.TagName('H4');
+
+
+/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
+goog.dom.TagName.H5 = new goog.dom.TagName('H5');
+
+
+/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */
+goog.dom.TagName.H6 = new goog.dom.TagName('H6');
+
+
+/** @type {!goog.dom.TagName<!HTMLHeadElement>} */
+goog.dom.TagName.HEAD = new goog.dom.TagName('HEAD');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.HEADER = new goog.dom.TagName('HEADER');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.HGROUP = new goog.dom.TagName('HGROUP');
+
+
+/** @type {!goog.dom.TagName<!HTMLHRElement>} */
+goog.dom.TagName.HR = new goog.dom.TagName('HR');
+
+
+/** @type {!goog.dom.TagName<!HTMLHtmlElement>} */
+goog.dom.TagName.HTML = new goog.dom.TagName('HTML');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.I = new goog.dom.TagName('I');
+
+
+/** @type {!goog.dom.TagName<!HTMLIFrameElement>} */
+goog.dom.TagName.IFRAME = new goog.dom.TagName('IFRAME');
+
+
+/** @type {!goog.dom.TagName<!HTMLImageElement>} */
+goog.dom.TagName.IMG = new goog.dom.TagName('IMG');
+
+
+/** @type {!goog.dom.TagName<!HTMLInputElement>} */
+goog.dom.TagName.INPUT = new goog.dom.TagName('INPUT');
+
+
+/** @type {!goog.dom.TagName<!HTMLModElement>} */
+goog.dom.TagName.INS = new goog.dom.TagName('INS');
+
+
+/** @type {!goog.dom.TagName<!HTMLIsIndexElement>} */
+goog.dom.TagName.ISINDEX = new goog.dom.TagName('ISINDEX');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.KBD = new goog.dom.TagName('KBD');
+
+
+// HTMLKeygenElement is deprecated.
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.KEYGEN = new goog.dom.TagName('KEYGEN');
+
+
+/** @type {!goog.dom.TagName<!HTMLLabelElement>} */
+goog.dom.TagName.LABEL = new goog.dom.TagName('LABEL');
+
+
+/** @type {!goog.dom.TagName<!HTMLLegendElement>} */
+goog.dom.TagName.LEGEND = new goog.dom.TagName('LEGEND');
+
+
+/** @type {!goog.dom.TagName<!HTMLLIElement>} */
+goog.dom.TagName.LI = new goog.dom.TagName('LI');
+
+
+/** @type {!goog.dom.TagName<!HTMLLinkElement>} */
+goog.dom.TagName.LINK = new goog.dom.TagName('LINK');
+
+
+/** @type {!goog.dom.TagName<!HTMLMapElement>} */
+goog.dom.TagName.MAP = new goog.dom.TagName('MAP');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.MARK = new goog.dom.TagName('MARK');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.MATH = new goog.dom.TagName('MATH');
+
+
+/** @type {!goog.dom.TagName<!HTMLMenuElement>} */
+goog.dom.TagName.MENU = new goog.dom.TagName('MENU');
+
+
+/** @type {!goog.dom.TagName<!HTMLMetaElement>} */
+goog.dom.TagName.META = new goog.dom.TagName('META');
+
+
+/** @type {!goog.dom.TagName<!HTMLMeterElement>} */
+goog.dom.TagName.METER = new goog.dom.TagName('METER');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.NAV = new goog.dom.TagName('NAV');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.NOFRAMES = new goog.dom.TagName('NOFRAMES');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.NOSCRIPT = new goog.dom.TagName('NOSCRIPT');
+
+
+/** @type {!goog.dom.TagName<!HTMLObjectElement>} */
+goog.dom.TagName.OBJECT = new goog.dom.TagName('OBJECT');
+
+
+/** @type {!goog.dom.TagName<!HTMLOListElement>} */
+goog.dom.TagName.OL = new goog.dom.TagName('OL');
+
+
+/** @type {!goog.dom.TagName<!HTMLOptGroupElement>} */
+goog.dom.TagName.OPTGROUP = new goog.dom.TagName('OPTGROUP');
+
+
+/** @type {!goog.dom.TagName<!HTMLOptionElement>} */
+goog.dom.TagName.OPTION = new goog.dom.TagName('OPTION');
+
+
+/** @type {!goog.dom.TagName<!HTMLOutputElement>} */
+goog.dom.TagName.OUTPUT = new goog.dom.TagName('OUTPUT');
+
+
+/** @type {!goog.dom.TagName<!HTMLParagraphElement>} */
+goog.dom.TagName.P = new goog.dom.TagName('P');
+
+
+/** @type {!goog.dom.TagName<!HTMLParamElement>} */
+goog.dom.TagName.PARAM = new goog.dom.TagName('PARAM');
+
+
+/** @type {!goog.dom.TagName<!HTMLPreElement>} */
+goog.dom.TagName.PRE = new goog.dom.TagName('PRE');
+
+
+/** @type {!goog.dom.TagName<!HTMLProgressElement>} */
+goog.dom.TagName.PROGRESS = new goog.dom.TagName('PROGRESS');
+
+
+/** @type {!goog.dom.TagName<!HTMLQuoteElement>} */
+goog.dom.TagName.Q = new goog.dom.TagName('Q');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.RP = new goog.dom.TagName('RP');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.RT = new goog.dom.TagName('RT');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.RUBY = new goog.dom.TagName('RUBY');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.S = new goog.dom.TagName('S');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.SAMP = new goog.dom.TagName('SAMP');
+
+
+/** @type {!goog.dom.TagName<!HTMLScriptElement>} */
+goog.dom.TagName.SCRIPT = new goog.dom.TagName('SCRIPT');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.SECTION = new goog.dom.TagName('SECTION');
+
+
+/** @type {!goog.dom.TagName<!HTMLSelectElement>} */
+goog.dom.TagName.SELECT = new goog.dom.TagName('SELECT');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.SMALL = new goog.dom.TagName('SMALL');
+
+
+/** @type {!goog.dom.TagName<!HTMLSourceElement>} */
+goog.dom.TagName.SOURCE = new goog.dom.TagName('SOURCE');
+
+
+/** @type {!goog.dom.TagName<!HTMLSpanElement>} */
+goog.dom.TagName.SPAN = new goog.dom.TagName('SPAN');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.STRIKE = new goog.dom.TagName('STRIKE');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.STRONG = new goog.dom.TagName('STRONG');
+
+
+/** @type {!goog.dom.TagName<!HTMLStyleElement>} */
+goog.dom.TagName.STYLE = new goog.dom.TagName('STYLE');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.SUB = new goog.dom.TagName('SUB');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.SUMMARY = new goog.dom.TagName('SUMMARY');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.SUP = new goog.dom.TagName('SUP');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.SVG = new goog.dom.TagName('SVG');
+
+
+/** @type {!goog.dom.TagName<!HTMLTableElement>} */
+goog.dom.TagName.TABLE = new goog.dom.TagName('TABLE');
+
+
+/** @type {!goog.dom.TagName<!HTMLTableSectionElement>} */
+goog.dom.TagName.TBODY = new goog.dom.TagName('TBODY');
+
+
+/** @type {!goog.dom.TagName<!HTMLTableCellElement>} */
+goog.dom.TagName.TD = new goog.dom.TagName('TD');
+
+
+/** @type {!goog.dom.TagName<!HTMLTemplateElement>} */
+goog.dom.TagName.TEMPLATE = new goog.dom.TagName('TEMPLATE');
+
+
+/** @type {!goog.dom.TagName<!HTMLTextAreaElement>} */
+goog.dom.TagName.TEXTAREA = new goog.dom.TagName('TEXTAREA');
+
+
+/** @type {!goog.dom.TagName<!HTMLTableSectionElement>} */
+goog.dom.TagName.TFOOT = new goog.dom.TagName('TFOOT');
+
+
+/** @type {!goog.dom.TagName<!HTMLTableCellElement>} */
+goog.dom.TagName.TH = new goog.dom.TagName('TH');
+
+
+/** @type {!goog.dom.TagName<!HTMLTableSectionElement>} */
+goog.dom.TagName.THEAD = new goog.dom.TagName('THEAD');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.TIME = new goog.dom.TagName('TIME');
+
+
+/** @type {!goog.dom.TagName<!HTMLTitleElement>} */
+goog.dom.TagName.TITLE = new goog.dom.TagName('TITLE');
+
+
+/** @type {!goog.dom.TagName<!HTMLTableRowElement>} */
+goog.dom.TagName.TR = new goog.dom.TagName('TR');
+
+
+/** @type {!goog.dom.TagName<!HTMLTrackElement>} */
+goog.dom.TagName.TRACK = new goog.dom.TagName('TRACK');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.TT = new goog.dom.TagName('TT');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.U = new goog.dom.TagName('U');
+
+
+/** @type {!goog.dom.TagName<!HTMLUListElement>} */
+goog.dom.TagName.UL = new goog.dom.TagName('UL');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.VAR = new goog.dom.TagName('VAR');
+
+
+/** @type {!goog.dom.TagName<!HTMLVideoElement>} */
+goog.dom.TagName.VIDEO = new goog.dom.TagName('VIDEO');
+
+
+/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */
+goog.dom.TagName.WBR = new goog.dom.TagName('WBR');
diff --git a/src/http/static/viz/2/goog/dom/tags.js b/src/http/static/viz/2/goog/dom/tags.js
new file mode 100644
index 0000000..7c12938
--- /dev/null
+++ b/src/http/static/viz/2/goog/dom/tags.js
@@ -0,0 +1,41 @@
+// Copyright 2014 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for HTML element tag names.
+ */
+goog.provide('goog.dom.tags');
+
+goog.require('goog.object');
+
+
+/**
+ * The void elements specified by
+ * http://www.w3.org/TR/html-markup/syntax.html#void-elements.
+ * @const @private {!Object<string, boolean>}
+ */
+goog.dom.tags.VOID_TAGS_ = goog.object.createSet(
+ 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input',
+ 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr');
+
+
+/**
+ * Checks whether the tag is void (with no contents allowed and no legal end
+ * tag), for example 'br'.
+ * @param {string} tagName The tag name in lower case.
+ * @return {boolean}
+ */
+goog.dom.tags.isVoidTag = function(tagName) {
+ return goog.dom.tags.VOID_TAGS_[tagName] === true;
+};
diff --git a/src/http/static/viz/2/goog/events/browserevent.js b/src/http/static/viz/2/goog/events/browserevent.js
new file mode 100644
index 0000000..b2261a3
--- /dev/null
+++ b/src/http/static/viz/2/goog/events/browserevent.js
@@ -0,0 +1,409 @@
+// Copyright 2005 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A patched, standardized event object for browser events.
+ *
+ * <pre>
+ * The patched event object contains the following members:
+ * - type {string} Event type, e.g. 'click'
+ * - target {Object} The element that actually triggered the event
+ * - currentTarget {Object} The element the listener is attached to
+ * - relatedTarget {Object} For mouseover and mouseout, the previous object
+ * - offsetX {number} X-coordinate relative to target
+ * - offsetY {number} Y-coordinate relative to target
+ * - clientX {number} X-coordinate relative to viewport
+ * - clientY {number} Y-coordinate relative to viewport
+ * - screenX {number} X-coordinate relative to the edge of the screen
+ * - screenY {number} Y-coordinate relative to the edge of the screen
+ * - button {number} Mouse button. Use isButton() to test.
+ * - keyCode {number} Key-code
+ * - ctrlKey {boolean} Was ctrl key depressed
+ * - altKey {boolean} Was alt key depressed
+ * - shiftKey {boolean} Was shift key depressed
+ * - metaKey {boolean} Was meta key depressed
+ * - defaultPrevented {boolean} Whether the default action has been prevented
+ * - state {Object} History state object
+ *
+ * NOTE: The keyCode member contains the raw browser keyCode. For normalized
+ * key and character code use {@link goog.events.KeyHandler}.
+ * </pre>
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+goog.provide('goog.events.BrowserEvent');
+goog.provide('goog.events.BrowserEvent.MouseButton');
+
+goog.require('goog.events.BrowserFeature');
+goog.require('goog.events.Event');
+goog.require('goog.events.EventType');
+goog.require('goog.reflect');
+goog.require('goog.userAgent');
+
+
+
+/**
+ * Accepts a browser event object and creates a patched, cross browser event
+ * object.
+ * The content of this object will not be initialized if no event object is
+ * provided. If this is the case, init() needs to be invoked separately.
+ * @param {Event=} opt_e Browser event object.
+ * @param {EventTarget=} opt_currentTarget Current target for event.
+ * @constructor
+ * @extends {goog.events.Event}
+ */
+goog.events.BrowserEvent = function(opt_e, opt_currentTarget) {
+ goog.events.BrowserEvent.base(this, 'constructor', opt_e ? opt_e.type : '');
+
+ /**
+ * Target that fired the event.
+ * @override
+ * @type {Node}
+ */
+ this.target = null;
+
+ /**
+ * Node that had the listener attached.
+ * @override
+ * @type {Node|undefined}
+ */
+ this.currentTarget = null;
+
+ /**
+ * For mouseover and mouseout events, the related object for the event.
+ * @type {Node}
+ */
+ this.relatedTarget = null;
+
+ /**
+ * X-coordinate relative to target.
+ * @type {number}
+ */
+ this.offsetX = 0;
+
+ /**
+ * Y-coordinate relative to target.
+ * @type {number}
+ */
+ this.offsetY = 0;
+
+ /**
+ * X-coordinate relative to the window.
+ * @type {number}
+ */
+ this.clientX = 0;
+
+ /**
+ * Y-coordinate relative to the window.
+ * @type {number}
+ */
+ this.clientY = 0;
+
+ /**
+ * X-coordinate relative to the monitor.
+ * @type {number}
+ */
+ this.screenX = 0;
+
+ /**
+ * Y-coordinate relative to the monitor.
+ * @type {number}
+ */
+ this.screenY = 0;
+
+ /**
+ * Which mouse button was pressed.
+ * @type {number}
+ */
+ this.button = 0;
+
+ /**
+ * Key of key press.
+ * @type {string}
+ */
+ this.key = '';
+
+ /**
+ * Keycode of key press.
+ * @type {number}
+ */
+ this.keyCode = 0;
+
+ /**
+ * Keycode of key press.
+ * @type {number}
+ */
+ this.charCode = 0;
+
+ /**
+ * Whether control was pressed at time of event.
+ * @type {boolean}
+ */
+ this.ctrlKey = false;
+
+ /**
+ * Whether alt was pressed at time of event.
+ * @type {boolean}
+ */
+ this.altKey = false;
+
+ /**
+ * Whether shift was pressed at time of event.
+ * @type {boolean}
+ */
+ this.shiftKey = false;
+
+ /**
+ * Whether the meta key was pressed at time of event.
+ * @type {boolean}
+ */
+ this.metaKey = false;
+
+ /**
+ * History state object, only set for PopState events where it's a copy of the
+ * state object provided to pushState or replaceState.
+ * @type {Object}
+ */
+ this.state = null;
+
+ /**
+ * Whether the default platform modifier key was pressed at time of event.
+ * (This is control for all platforms except Mac, where it's Meta.)
+ * @type {boolean}
+ */
+ this.platformModifierKey = false;
+
+ /**
+ * The browser event object.
+ * @private {Event}
+ */
+ this.event_ = null;
+
+ if (opt_e) {
+ this.init(opt_e, opt_currentTarget);
+ }
+};
+goog.inherits(goog.events.BrowserEvent, goog.events.Event);
+
+
+/**
+ * Normalized button constants for the mouse.
+ * @enum {number}
+ */
+goog.events.BrowserEvent.MouseButton = {
+ LEFT: 0,
+ MIDDLE: 1,
+ RIGHT: 2
+};
+
+
+/**
+ * Static data for mapping mouse buttons.
+ * @type {!Array<number>}
+ */
+goog.events.BrowserEvent.IEButtonMap = [
+ 1, // LEFT
+ 4, // MIDDLE
+ 2 // RIGHT
+];
+
+
+/**
+ * Accepts a browser event object and creates a patched, cross browser event
+ * object.
+ * @param {Event} e Browser event object.
+ * @param {EventTarget=} opt_currentTarget Current target for event.
+ */
+goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) {
+ var type = this.type = e.type;
+
+ /**
+ * On touch devices use the first "changed touch" as the relevant touch.
+ * @type {Touch}
+ */
+ var relevantTouch = e.changedTouches ? e.changedTouches[0] : null;
+
+ // TODO(nicksantos): Change this.target to type EventTarget.
+ this.target = /** @type {Node} */ (e.target) || e.srcElement;
+
+ // TODO(nicksantos): Change this.currentTarget to type EventTarget.
+ this.currentTarget = /** @type {Node} */ (opt_currentTarget);
+
+ var relatedTarget = /** @type {Node} */ (e.relatedTarget);
+ if (relatedTarget) {
+ // There's a bug in FireFox where sometimes, relatedTarget will be a
+ // chrome element, and accessing any property of it will get a permission
+ // denied exception. See:
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=497780
+ if (goog.userAgent.GECKO) {
+ if (!goog.reflect.canAccessProperty(relatedTarget, 'nodeName')) {
+ relatedTarget = null;
+ }
+ }
+ // TODO(arv): Use goog.events.EventType when it has been refactored into its
+ // own file.
+ } else if (type == goog.events.EventType.MOUSEOVER) {
+ relatedTarget = e.fromElement;
+ } else if (type == goog.events.EventType.MOUSEOUT) {
+ relatedTarget = e.toElement;
+ }
+
+ this.relatedTarget = relatedTarget;
+
+ if (!goog.isNull(relevantTouch)) {
+ this.clientX = relevantTouch.clientX !== undefined ? relevantTouch.clientX :
+ relevantTouch.pageX;
+ this.clientY = relevantTouch.clientY !== undefined ? relevantTouch.clientY :
+ relevantTouch.pageY;
+ this.screenX = relevantTouch.screenX || 0;
+ this.screenY = relevantTouch.screenY || 0;
+ } else {
+ // Webkit emits a lame warning whenever layerX/layerY is accessed.
+ // http://code.google.com/p/chromium/issues/detail?id=101733
+ this.offsetX = (goog.userAgent.WEBKIT || e.offsetX !== undefined) ?
+ e.offsetX :
+ e.layerX;
+ this.offsetY = (goog.userAgent.WEBKIT || e.offsetY !== undefined) ?
+ e.offsetY :
+ e.layerY;
+ this.clientX = e.clientX !== undefined ? e.clientX : e.pageX;
+ this.clientY = e.clientY !== undefined ? e.clientY : e.pageY;
+ this.screenX = e.screenX || 0;
+ this.screenY = e.screenY || 0;
+ }
+
+ this.button = e.button;
+
+ this.keyCode = e.keyCode || 0;
+ this.key = e.key || '';
+ this.charCode = e.charCode || (type == 'keypress' ? e.keyCode : 0);
+ this.ctrlKey = e.ctrlKey;
+ this.altKey = e.altKey;
+ this.shiftKey = e.shiftKey;
+ this.metaKey = e.metaKey;
+ this.platformModifierKey = goog.userAgent.MAC ? e.metaKey : e.ctrlKey;
+ this.state = e.state;
+ this.event_ = e;
+ if (e.defaultPrevented) {
+ this.preventDefault();
+ }
+};
+
+
+/**
+ * Tests to see which button was pressed during the event. This is really only
+ * useful in IE and Gecko browsers. And in IE, it's only useful for
+ * mousedown/mouseup events, because click only fires for the left mouse button.
+ *
+ * Safari 2 only reports the left button being clicked, and uses the value '1'
+ * instead of 0. Opera only reports a mousedown event for the middle button, and
+ * no mouse events for the right button. Opera has default behavior for left and
+ * middle click that can only be overridden via a configuration setting.
+ *
+ * There's a nice table of this mess at http://www.unixpapa.com/js/mouse.html.
+ *
+ * @param {goog.events.BrowserEvent.MouseButton} button The button
+ * to test for.
+ * @return {boolean} True if button was pressed.
+ */
+goog.events.BrowserEvent.prototype.isButton = function(button) {
+ if (!goog.events.BrowserFeature.HAS_W3C_BUTTON) {
+ if (this.type == 'click') {
+ return button == goog.events.BrowserEvent.MouseButton.LEFT;
+ } else {
+ return !!(
+ this.event_.button & goog.events.BrowserEvent.IEButtonMap[button]);
+ }
+ } else {
+ return this.event_.button == button;
+ }
+};
+
+
+/**
+ * Whether this has an "action"-producing mouse button.
+ *
+ * By definition, this includes left-click on windows/linux, and left-click
+ * without the ctrl key on Macs.
+ *
+ * @return {boolean} The result.
+ */
+goog.events.BrowserEvent.prototype.isMouseActionButton = function() {
+ // Webkit does not ctrl+click to be a right-click, so we
+ // normalize it to behave like Gecko and Opera.
+ return this.isButton(goog.events.BrowserEvent.MouseButton.LEFT) &&
+ !(goog.userAgent.WEBKIT && goog.userAgent.MAC && this.ctrlKey);
+};
+
+
+/**
+ * @override
+ */
+goog.events.BrowserEvent.prototype.stopPropagation = function() {
+ goog.events.BrowserEvent.superClass_.stopPropagation.call(this);
+ if (this.event_.stopPropagation) {
+ this.event_.stopPropagation();
+ } else {
+ this.event_.cancelBubble = true;
+ }
+};
+
+
+/**
+ * @override
+ */
+goog.events.BrowserEvent.prototype.preventDefault = function() {
+ goog.events.BrowserEvent.superClass_.preventDefault.call(this);
+ var be = this.event_;
+ if (!be.preventDefault) {
+ be.returnValue = false;
+ if (goog.events.BrowserFeature.SET_KEY_CODE_TO_PREVENT_DEFAULT) {
+
+ try {
+ // Most keys can be prevented using returnValue. Some special keys
+ // require setting the keyCode to -1 as well:
+ //
+ // In IE7:
+ // F3, F5, F10, F11, Ctrl+P, Crtl+O, Ctrl+F (these are taken from IE6)
+ //
+ // In IE8:
+ // Ctrl+P, Crtl+O, Ctrl+F (F1-F12 cannot be stopped through the event)
+ //
+ // We therefore do this for all function keys as well as when Ctrl key
+ // is pressed.
+ var VK_F1 = 112;
+ var VK_F12 = 123;
+ if (be.ctrlKey || be.keyCode >= VK_F1 && be.keyCode <= VK_F12) {
+ be.keyCode = -1;
+ }
+ } catch (ex) {
+ // IE throws an 'access denied' exception when trying to change
+ // keyCode in some situations (e.g. srcElement is input[type=file],
+ // or srcElement is an anchor tag rewritten by parent's innerHTML).
+ // Do nothing in this case.
+ }
+ }
+ } else {
+ be.preventDefault();
+ }
+};
+
+
+/**
+ * @return {Event} The underlying browser event object.
+ */
+goog.events.BrowserEvent.prototype.getBrowserEvent = function() {
+ return this.event_;
+};
diff --git a/src/http/static/viz/2/goog/events/browserfeature.js b/src/http/static/viz/2/goog/events/browserfeature.js
new file mode 100644
index 0000000..7cc7bd6
--- /dev/null
+++ b/src/http/static/viz/2/goog/events/browserfeature.js
@@ -0,0 +1,122 @@
+// Copyright 2010 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Browser capability checks for the events package.
+ *
+ */
+
+
+goog.provide('goog.events.BrowserFeature');
+
+goog.require('goog.userAgent');
+goog.scope(function() {
+
+
+
+/**
+ * Enum of browser capabilities.
+ * @enum {boolean}
+ */
+goog.events.BrowserFeature = {
+ /**
+ * Whether the button attribute of the event is W3C compliant. False in
+ * Internet Explorer prior to version 9; document-version dependent.
+ */
+ HAS_W3C_BUTTON:
+ !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9),
+
+ /**
+ * Whether the browser supports full W3C event model.
+ */
+ HAS_W3C_EVENT_SUPPORT:
+ !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9),
+
+ /**
+ * To prevent default in IE7-8 for certain keydown events we need set the
+ * keyCode to -1.
+ */
+ SET_KEY_CODE_TO_PREVENT_DEFAULT:
+ goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9'),
+
+ /**
+ * Whether the {@code navigator.onLine} property is supported.
+ */
+ HAS_NAVIGATOR_ONLINE_PROPERTY:
+ !goog.userAgent.WEBKIT || goog.userAgent.isVersionOrHigher('528'),
+
+ /**
+ * Whether HTML5 network online/offline events are supported.
+ */
+ HAS_HTML5_NETWORK_EVENT_SUPPORT:
+ goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9b') ||
+ goog.userAgent.IE && goog.userAgent.isVersionOrHigher('8') ||
+ goog.userAgent.OPERA && goog.userAgent.isVersionOrHigher('9.5') ||
+ goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher('528'),
+
+ /**
+ * Whether HTML5 network events fire on document.body, or otherwise the
+ * window.
+ */
+ HTML5_NETWORK_EVENTS_FIRE_ON_BODY:
+ goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher('8') ||
+ goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9'),
+
+ /**
+ * Whether touch is enabled in the browser.
+ */
+ TOUCH_ENABLED:
+ ('ontouchstart' in goog.global ||
+ !!(goog.global['document'] && document.documentElement &&
+ 'ontouchstart' in document.documentElement) ||
+ // IE10 uses non-standard touch events, so it has a different check.
+ !!(goog.global['navigator'] &&
+ goog.global['navigator']['msMaxTouchPoints'])),
+
+ /**
+ * Whether addEventListener supports {passive: true}.
+ * https://developers.google.com/web/updates/2016/06/passive-event-listeners
+ */
+ PASSIVE_EVENTS: purify(function() {
+ // If we're in a web worker or other custom environment, we can't tell.
+ if (!goog.global.addEventListener || !Object.defineProperty) { // IE 8
+ return false;
+ }
+
+ var passive = false;
+ var options = Object.defineProperty({}, 'passive', {
+ get: function() {
+ passive = true;
+ }
+ });
+ goog.global.addEventListener('test', goog.nullFunction, options);
+ goog.global.removeEventListener('test', goog.nullFunction, options);
+
+ return passive;
+ })
+};
+
+
+/**
+ * Tricks Closure Compiler into believing that a function is pure. The compiler
+ * assumes that any `valueOf` function is pure, without analyzing its contents.
+ *
+ * @param {function(): T} fn
+ * @return {T}
+ * @template T
+ */
+function purify(fn) {
+ return ({valueOf: fn}).valueOf();
+}
+}); // goog.scope
diff --git a/src/http/static/viz/2/goog/events/event.js b/src/http/static/viz/2/goog/events/event.js
new file mode 100644
index 0000000..ee3b3af
--- /dev/null
+++ b/src/http/static/viz/2/goog/events/event.js
@@ -0,0 +1,143 @@
+// Copyright 2005 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A base class for event objects.
+ *
+ */
+
+
+goog.provide('goog.events.Event');
+goog.provide('goog.events.EventLike');
+
+/**
+ * goog.events.Event no longer depends on goog.Disposable. Keep requiring
+ * goog.Disposable here to not break projects which assume this dependency.
+ * @suppress {extraRequire}
+ */
+goog.require('goog.Disposable');
+goog.require('goog.events.EventId');
+
+
+/**
+ * A typedef for event like objects that are dispatchable via the
+ * goog.events.dispatchEvent function. strings are treated as the type for a
+ * goog.events.Event. Objects are treated as an extension of a new
+ * goog.events.Event with the type property of the object being used as the type
+ * of the Event.
+ * @typedef {string|Object|goog.events.Event|goog.events.EventId}
+ */
+goog.events.EventLike;
+
+
+
+/**
+ * A base class for event objects, so that they can support preventDefault and
+ * stopPropagation.
+ *
+ * @suppress {underscore} Several properties on this class are technically
+ * public, but referencing these properties outside this package is strongly
+ * discouraged.
+ *
+ * @param {string|!goog.events.EventId} type Event Type.
+ * @param {Object=} opt_target Reference to the object that is the target of
+ * this event. It has to implement the {@code EventTarget} interface
+ * declared at {@link http://developer.mozilla.org/en/DOM/EventTarget}.
+ * @constructor
+ */
+goog.events.Event = function(type, opt_target) {
+ /**
+ * Event type.
+ * @type {string}
+ */
+ this.type = type instanceof goog.events.EventId ? String(type) : type;
+
+ /**
+ * TODO(tbreisacher): The type should probably be
+ * EventTarget|goog.events.EventTarget.
+ *
+ * Target of the event.
+ * @type {Object|undefined}
+ */
+ this.target = opt_target;
+
+ /**
+ * Object that had the listener attached.
+ * @type {Object|undefined}
+ */
+ this.currentTarget = this.target;
+
+ /**
+ * Whether to cancel the event in internal capture/bubble processing for IE.
+ * @type {boolean}
+ * @public
+ */
+ this.propagationStopped_ = false;
+
+ /**
+ * Whether the default action has been prevented.
+ * This is a property to match the W3C specification at
+ * {@link http://www.w3.org/TR/DOM-Level-3-Events/
+ * #events-event-type-defaultPrevented}.
+ * Must be treated as read-only outside the class.
+ * @type {boolean}
+ */
+ this.defaultPrevented = false;
+
+ /**
+ * Return value for in internal capture/bubble processing for IE.
+ * @type {boolean}
+ * @public
+ */
+ this.returnValue_ = true;
+};
+
+
+/**
+ * Stops event propagation.
+ */
+goog.events.Event.prototype.stopPropagation = function() {
+ this.propagationStopped_ = true;
+};
+
+
+/**
+ * Prevents the default action, for example a link redirecting to a url.
+ */
+goog.events.Event.prototype.preventDefault = function() {
+ this.defaultPrevented = true;
+ this.returnValue_ = false;
+};
+
+
+/**
+ * Stops the propagation of the event. It is equivalent to
+ * {@code e.stopPropagation()}, but can be used as the callback argument of
+ * {@link goog.events.listen} without declaring another function.
+ * @param {!goog.events.Event} e An event.
+ */
+goog.events.Event.stopPropagation = function(e) {
+ e.stopPropagation();
+};
+
+
+/**
+ * Prevents the default action. It is equivalent to
+ * {@code e.preventDefault()}, but can be used as the callback argument of
+ * {@link goog.events.listen} without declaring another function.
+ * @param {!goog.events.Event} e An event.
+ */
+goog.events.Event.preventDefault = function(e) {
+ e.preventDefault();
+};
diff --git a/src/http/static/viz/2/goog/events/eventid.js b/src/http/static/viz/2/goog/events/eventid.js
new file mode 100644
index 0000000..9ff9e40
--- /dev/null
+++ b/src/http/static/viz/2/goog/events/eventid.js
@@ -0,0 +1,46 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+goog.provide('goog.events.EventId');
+
+
+
+/**
+ * A templated class that is used when registering for events. Typical usage:
+ *
+ * /** @type {goog.events.EventId<MyEventObj>} *\
+ * var myEventId = new goog.events.EventId(
+ * goog.events.getUniqueId(('someEvent'));
+ *
+ * // No need to cast or declare here since the compiler knows the
+ * // correct type of 'evt' (MyEventObj).
+ * something.listen(myEventId, function(evt) {});
+ *
+ * @param {string} eventId
+ * @template T
+ * @constructor
+ * @struct
+ * @final
+ */
+goog.events.EventId = function(eventId) {
+ /** @const */ this.id = eventId;
+};
+
+
+/**
+ * @override
+ */
+goog.events.EventId.prototype.toString = function() {
+ return this.id;
+};
diff --git a/src/http/static/viz/2/goog/events/events.js b/src/http/static/viz/2/goog/events/events.js
new file mode 100644
index 0000000..2787340
--- /dev/null
+++ b/src/http/static/viz/2/goog/events/events.js
@@ -0,0 +1,1003 @@
+// Copyright 2005 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview An event manager for both native browser event
+ * targets and custom JavaScript event targets
+ * ({@code goog.events.Listenable}). This provides an abstraction
+ * over browsers' event systems.
+ *
+ * It also provides a simulation of W3C event model's capture phase in
+ * Internet Explorer (IE 8 and below). Caveat: the simulation does not
+ * interact well with listeners registered directly on the elements
+ * (bypassing goog.events) or even with listeners registered via
+ * goog.events in a separate JS binary. In these cases, we provide
+ * no ordering guarantees.
+ *
+ * The listeners will receive a "patched" event object. Such event object
+ * contains normalized values for certain event properties that differs in
+ * different browsers.
+ *
+ * Example usage:
+ * <pre>
+ * goog.events.listen(myNode, 'click', function(e) { alert('woo') });
+ * goog.events.listen(myNode, 'mouseover', mouseHandler, true);
+ * goog.events.unlisten(myNode, 'mouseover', mouseHandler, true);
+ * goog.events.removeAll(myNode);
+ * </pre>
+ *
+ * in IE and event object patching]
+ * @author arv@google.com (Erik Arvidsson)
+ *
+ * @see ../demos/events.html
+ * @see ../demos/event-propagation.html
+ * @see ../demos/stopevent.html
+ */
+
+// IMPLEMENTATION NOTES:
+// goog.events stores an auxiliary data structure on each EventTarget
+// source being listened on. This allows us to take advantage of GC,
+// having the data structure GC'd when the EventTarget is GC'd. This
+// GC behavior is equivalent to using W3C DOM Events directly.
+
+goog.provide('goog.events');
+goog.provide('goog.events.CaptureSimulationMode');
+goog.provide('goog.events.Key');
+goog.provide('goog.events.ListenableType');
+
+goog.require('goog.asserts');
+goog.require('goog.debug.entryPointRegistry');
+goog.require('goog.events.BrowserEvent');
+goog.require('goog.events.BrowserFeature');
+goog.require('goog.events.Listenable');
+goog.require('goog.events.ListenerMap');
+
+goog.forwardDeclare('goog.debug.ErrorHandler');
+goog.forwardDeclare('goog.events.EventWrapper');
+
+
+/**
+ * @typedef {number|goog.events.ListenableKey}
+ */
+goog.events.Key;
+
+
+/**
+ * @typedef {EventTarget|goog.events.Listenable}
+ */
+goog.events.ListenableType;
+
+
+/**
+ * Property name on a native event target for the listener map
+ * associated with the event target.
+ * @private @const {string}
+ */
+goog.events.LISTENER_MAP_PROP_ = 'closure_lm_' + ((Math.random() * 1e6) | 0);
+
+
+/**
+ * String used to prepend to IE event types.
+ * @const
+ * @private
+ */
+goog.events.onString_ = 'on';
+
+
+/**
+ * Map of computed "on<eventname>" strings for IE event types. Caching
+ * this removes an extra object allocation in goog.events.listen which
+ * improves IE6 performance.
+ * @const
+ * @dict
+ * @private
+ */
+goog.events.onStringMap_ = {};
+
+
+/**
+ * @enum {number} Different capture simulation mode for IE8-.
+ */
+goog.events.CaptureSimulationMode = {
+ /**
+ * Does not perform capture simulation. Will asserts in IE8- when you
+ * add capture listeners.
+ */
+ OFF_AND_FAIL: 0,
+
+ /**
+ * Does not perform capture simulation, silently ignore capture
+ * listeners.
+ */
+ OFF_AND_SILENT: 1,
+
+ /**
+ * Performs capture simulation.
+ */
+ ON: 2
+};
+
+
+/**
+ * @define {number} The capture simulation mode for IE8-. By default,
+ * this is ON.
+ */
+goog.define('goog.events.CAPTURE_SIMULATION_MODE', 2);
+
+
+/**
+ * Estimated count of total native listeners.
+ * @private {number}
+ */
+goog.events.listenerCountEstimate_ = 0;
+
+
+/**
+ * Adds an event listener for a specific event on a native event
+ * target (such as a DOM element) or an object that has implemented
+ * {@link goog.events.Listenable}. A listener can only be added once
+ * to an object and if it is added again the key for the listener is
+ * returned. Note that if the existing listener is a one-off listener
+ * (registered via listenOnce), it will no longer be a one-off
+ * listener after a call to listen().
+ *
+ * @param {EventTarget|goog.events.Listenable} src The node to listen
+ * to events on.
+ * @param {string|Array<string>|
+ * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}
+ * type Event type or array of event types.
+ * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null}
+ * listener Callback method, or an object with a handleEvent function.
+ * WARNING: passing an Object is now softly deprecated.
+ * @param {(boolean|!AddEventListenerOptions)=} opt_options
+ * @param {T=} opt_handler Element in whose scope to call the listener.
+ * @return {goog.events.Key} Unique key for the listener.
+ * @template T,EVENTOBJ
+ */
+goog.events.listen = function(src, type, listener, opt_options, opt_handler) {
+ if (opt_options && opt_options.once) {
+ return goog.events.listenOnce(
+ src, type, listener, opt_options, opt_handler);
+ }
+ if (goog.isArray(type)) {
+ for (var i = 0; i < type.length; i++) {
+ goog.events.listen(src, type[i], listener, opt_options, opt_handler);
+ }
+ return null;
+ }
+
+ listener = goog.events.wrapListener(listener);
+ if (goog.events.Listenable.isImplementedBy(src)) {
+ var capture =
+ goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;
+ return src.listen(
+ /** @type {string|!goog.events.EventId} */ (type), listener, capture,
+ opt_handler);
+ } else {
+ return goog.events.listen_(
+ /** @type {!EventTarget} */ (src), type, listener,
+ /* callOnce */ false, opt_options, opt_handler);
+ }
+};
+
+
+/**
+ * Adds an event listener for a specific event on a native event
+ * target. A listener can only be added once to an object and if it
+ * is added again the key for the listener is returned.
+ *
+ * Note that a one-off listener will not change an existing listener,
+ * if any. On the other hand a normal listener will change existing
+ * one-off listener to become a normal listener.
+ *
+ * @param {EventTarget} src The node to listen to events on.
+ * @param {string|?goog.events.EventId<EVENTOBJ>} type Event type.
+ * @param {!Function} listener Callback function.
+ * @param {boolean} callOnce Whether the listener is a one-off
+ * listener or otherwise.
+ * @param {(boolean|!AddEventListenerOptions)=} opt_options
+ * @param {Object=} opt_handler Element in whose scope to call the listener.
+ * @return {goog.events.ListenableKey} Unique key for the listener.
+ * @template EVENTOBJ
+ * @private
+ */
+goog.events.listen_ = function(
+ src, type, listener, callOnce, opt_options, opt_handler) {
+ if (!type) {
+ throw Error('Invalid event type');
+ }
+
+ var capture =
+ goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;
+ if (capture && !goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {
+ if (goog.events.CAPTURE_SIMULATION_MODE ==
+ goog.events.CaptureSimulationMode.OFF_AND_FAIL) {
+ goog.asserts.fail('Can not register capture listener in IE8-.');
+ return null;
+ } else if (
+ goog.events.CAPTURE_SIMULATION_MODE ==
+ goog.events.CaptureSimulationMode.OFF_AND_SILENT) {
+ return null;
+ }
+ }
+
+ var listenerMap = goog.events.getListenerMap_(src);
+ if (!listenerMap) {
+ src[goog.events.LISTENER_MAP_PROP_] = listenerMap =
+ new goog.events.ListenerMap(src);
+ }
+
+ var listenerObj = /** @type {goog.events.Listener} */ (
+ listenerMap.add(type, listener, callOnce, capture, opt_handler));
+
+ // If the listenerObj already has a proxy, it has been set up
+ // previously. We simply return.
+ if (listenerObj.proxy) {
+ return listenerObj;
+ }
+
+ var proxy = goog.events.getProxy();
+ listenerObj.proxy = proxy;
+
+ proxy.src = src;
+ proxy.listener = listenerObj;
+
+ // Attach the proxy through the browser's API
+ if (src.addEventListener) {
+ // Don't pass an object as `capture` if the browser doesn't support that.
+ if (!goog.events.BrowserFeature.PASSIVE_EVENTS) {
+ opt_options = capture;
+ }
+ // Don't break tests that expect a boolean.
+ if (opt_options === undefined) opt_options = false;
+ src.addEventListener(type.toString(), proxy, opt_options);
+ } else if (src.attachEvent) {
+ // The else if above used to be an unconditional else. It would call
+ // exception on IE11, spoiling the day of some callers. The previous
+ // incarnation of this code, from 2007, indicates that it replaced an
+ // earlier still version that caused excess allocations on IE6.
+ src.attachEvent(goog.events.getOnString_(type.toString()), proxy);
+ } else {
+ throw Error('addEventListener and attachEvent are unavailable.');
+ }
+
+ goog.events.listenerCountEstimate_++;
+ return listenerObj;
+};
+
+
+/**
+ * Helper function for returning a proxy function.
+ * @return {!Function} A new or reused function object.
+ */
+goog.events.getProxy = function() {
+ var proxyCallbackFunction = goog.events.handleBrowserEvent_;
+ // Use a local var f to prevent one allocation.
+ var f =
+ goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT ? function(eventObject) {
+ return proxyCallbackFunction.call(f.src, f.listener, eventObject);
+ } : function(eventObject) {
+ var v = proxyCallbackFunction.call(f.src, f.listener, eventObject);
+ // NOTE(chrishenry): In IE, we hack in a capture phase. However, if
+ // there is inline event handler which tries to prevent default (for
+ // example <a href="..." onclick="return false">...</a>) in a
+ // descendant element, the prevent default will be overridden
+ // by this listener if this listener were to return true. Hence, we
+ // return undefined.
+ if (!v) return v;
+ };
+ return f;
+};
+
+
+/**
+ * Adds an event listener for a specific event on a native event
+ * target (such as a DOM element) or an object that has implemented
+ * {@link goog.events.Listenable}. After the event has fired the event
+ * listener is removed from the target.
+ *
+ * If an existing listener already exists, listenOnce will do
+ * nothing. In particular, if the listener was previously registered
+ * via listen(), listenOnce() will not turn the listener into a
+ * one-off listener. Similarly, if there is already an existing
+ * one-off listener, listenOnce does not modify the listeners (it is
+ * still a once listener).
+ *
+ * @param {EventTarget|goog.events.Listenable} src The node to listen
+ * to events on.
+ * @param {string|Array<string>|
+ * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}
+ * type Event type or array of event types.
+ * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null}
+ * listener Callback method.
+ * @param {(boolean|!AddEventListenerOptions)=} opt_options
+ * @param {T=} opt_handler Element in whose scope to call the listener.
+ * @return {goog.events.Key} Unique key for the listener.
+ * @template T,EVENTOBJ
+ */
+goog.events.listenOnce = function(
+ src, type, listener, opt_options, opt_handler) {
+ if (goog.isArray(type)) {
+ for (var i = 0; i < type.length; i++) {
+ goog.events.listenOnce(src, type[i], listener, opt_options, opt_handler);
+ }
+ return null;
+ }
+
+ listener = goog.events.wrapListener(listener);
+ if (goog.events.Listenable.isImplementedBy(src)) {
+ var capture =
+ goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;
+ return src.listenOnce(
+ /** @type {string|!goog.events.EventId} */ (type), listener, capture,
+ opt_handler);
+ } else {
+ return goog.events.listen_(
+ /** @type {!EventTarget} */ (src), type, listener,
+ /* callOnce */ true, opt_options, opt_handler);
+ }
+};
+
+
+/**
+ * Adds an event listener with a specific event wrapper on a DOM Node or an
+ * object that has implemented {@link goog.events.Listenable}. A listener can
+ * only be added once to an object.
+ *
+ * @param {EventTarget|goog.events.Listenable} src The target to
+ * listen to events on.
+ * @param {goog.events.EventWrapper} wrapper Event wrapper to use.
+ * @param {function(this:T, ?):?|{handleEvent:function(?):?}|null} listener
+ * Callback method, or an object with a handleEvent function.
+ * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to
+ * false).
+ * @param {T=} opt_handler Element in whose scope to call the listener.
+ * @template T
+ */
+goog.events.listenWithWrapper = function(
+ src, wrapper, listener, opt_capt, opt_handler) {
+ wrapper.listen(src, listener, opt_capt, opt_handler);
+};
+
+
+/**
+ * Removes an event listener which was added with listen().
+ *
+ * @param {EventTarget|goog.events.Listenable} src The target to stop
+ * listening to events on.
+ * @param {string|Array<string>|
+ * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}
+ * type Event type or array of event types to unlisten to.
+ * @param {function(?):?|{handleEvent:function(?):?}|null} listener The
+ * listener function to remove.
+ * @param {(boolean|!EventListenerOptions)=} opt_options
+ * whether the listener is fired during the capture or bubble phase of the
+ * event.
+ * @param {Object=} opt_handler Element in whose scope to call the listener.
+ * @return {?boolean} indicating whether the listener was there to remove.
+ * @template EVENTOBJ
+ */
+goog.events.unlisten = function(src, type, listener, opt_options, opt_handler) {
+ if (goog.isArray(type)) {
+ for (var i = 0; i < type.length; i++) {
+ goog.events.unlisten(src, type[i], listener, opt_options, opt_handler);
+ }
+ return null;
+ }
+ var capture =
+ goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;
+
+ listener = goog.events.wrapListener(listener);
+ if (goog.events.Listenable.isImplementedBy(src)) {
+ return src.unlisten(
+ /** @type {string|!goog.events.EventId} */ (type), listener, capture,
+ opt_handler);
+ }
+
+ if (!src) {
+ // TODO(chrishenry): We should tighten the API to only accept
+ // non-null objects, or add an assertion here.
+ return false;
+ }
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (src));
+ if (listenerMap) {
+ var listenerObj = listenerMap.getListener(
+ /** @type {string|!goog.events.EventId} */ (type), listener, capture,
+ opt_handler);
+ if (listenerObj) {
+ return goog.events.unlistenByKey(listenerObj);
+ }
+ }
+
+ return false;
+};
+
+
+/**
+ * Removes an event listener which was added with listen() by the key
+ * returned by listen().
+ *
+ * @param {goog.events.Key} key The key returned by listen() for this
+ * event listener.
+ * @return {boolean} indicating whether the listener was there to remove.
+ */
+goog.events.unlistenByKey = function(key) {
+ // TODO(chrishenry): Remove this check when tests that rely on this
+ // are fixed.
+ if (goog.isNumber(key)) {
+ return false;
+ }
+
+ var listener = key;
+ if (!listener || listener.removed) {
+ return false;
+ }
+
+ var src = listener.src;
+ if (goog.events.Listenable.isImplementedBy(src)) {
+ return /** @type {!goog.events.Listenable} */ (src).unlistenByKey(listener);
+ }
+
+ var type = listener.type;
+ var proxy = listener.proxy;
+ if (src.removeEventListener) {
+ src.removeEventListener(type, proxy, listener.capture);
+ } else if (src.detachEvent) {
+ src.detachEvent(goog.events.getOnString_(type), proxy);
+ }
+ goog.events.listenerCountEstimate_--;
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (src));
+ // TODO(chrishenry): Try to remove this conditional and execute the
+ // first branch always. This should be safe.
+ if (listenerMap) {
+ listenerMap.removeByKey(listener);
+ if (listenerMap.getTypeCount() == 0) {
+ // Null the src, just because this is simple to do (and useful
+ // for IE <= 7).
+ listenerMap.src = null;
+ // We don't use delete here because IE does not allow delete
+ // on a window object.
+ src[goog.events.LISTENER_MAP_PROP_] = null;
+ }
+ } else {
+ /** @type {!goog.events.Listener} */ (listener).markAsRemoved();
+ }
+
+ return true;
+};
+
+
+/**
+ * Removes an event listener which was added with listenWithWrapper().
+ *
+ * @param {EventTarget|goog.events.Listenable} src The target to stop
+ * listening to events on.
+ * @param {goog.events.EventWrapper} wrapper Event wrapper to use.
+ * @param {function(?):?|{handleEvent:function(?):?}|null} listener The
+ * listener function to remove.
+ * @param {boolean=} opt_capt In DOM-compliant browsers, this determines
+ * whether the listener is fired during the capture or bubble phase of the
+ * event.
+ * @param {Object=} opt_handler Element in whose scope to call the listener.
+ */
+goog.events.unlistenWithWrapper = function(
+ src, wrapper, listener, opt_capt, opt_handler) {
+ wrapper.unlisten(src, listener, opt_capt, opt_handler);
+};
+
+
+/**
+ * Removes all listeners from an object. You can also optionally
+ * remove listeners of a particular type.
+ *
+ * @param {Object|undefined} obj Object to remove listeners from. Must be an
+ * EventTarget or a goog.events.Listenable.
+ * @param {string|!goog.events.EventId=} opt_type Type of event to remove.
+ * Default is all types.
+ * @return {number} Number of listeners removed.
+ */
+goog.events.removeAll = function(obj, opt_type) {
+ // TODO(chrishenry): Change the type of obj to
+ // (!EventTarget|!goog.events.Listenable).
+
+ if (!obj) {
+ return 0;
+ }
+
+ if (goog.events.Listenable.isImplementedBy(obj)) {
+ return /** @type {?} */ (obj).removeAllListeners(opt_type);
+ }
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (obj));
+ if (!listenerMap) {
+ return 0;
+ }
+
+ var count = 0;
+ var typeStr = opt_type && opt_type.toString();
+ for (var type in listenerMap.listeners) {
+ if (!typeStr || type == typeStr) {
+ // Clone so that we don't need to worry about unlistenByKey
+ // changing the content of the ListenerMap.
+ var listeners = listenerMap.listeners[type].concat();
+ for (var i = 0; i < listeners.length; ++i) {
+ if (goog.events.unlistenByKey(listeners[i])) {
+ ++count;
+ }
+ }
+ }
+ }
+ return count;
+};
+
+
+/**
+ * Gets the listeners for a given object, type and capture phase.
+ *
+ * @param {Object} obj Object to get listeners for.
+ * @param {string|!goog.events.EventId} type Event type.
+ * @param {boolean} capture Capture phase?.
+ * @return {Array<!goog.events.Listener>} Array of listener objects.
+ */
+goog.events.getListeners = function(obj, type, capture) {
+ if (goog.events.Listenable.isImplementedBy(obj)) {
+ return /** @type {!goog.events.Listenable} */ (obj).getListeners(
+ type, capture);
+ } else {
+ if (!obj) {
+ // TODO(chrishenry): We should tighten the API to accept
+ // !EventTarget|goog.events.Listenable, and add an assertion here.
+ return [];
+ }
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (obj));
+ return listenerMap ? listenerMap.getListeners(type, capture) : [];
+ }
+};
+
+
+/**
+ * Gets the goog.events.Listener for the event or null if no such listener is
+ * in use.
+ *
+ * @param {EventTarget|goog.events.Listenable} src The target from
+ * which to get listeners.
+ * @param {?string|!goog.events.EventId<EVENTOBJ>} type The type of the event.
+ * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null} listener The
+ * listener function to get.
+ * @param {boolean=} opt_capt In DOM-compliant browsers, this determines
+ * whether the listener is fired during the
+ * capture or bubble phase of the event.
+ * @param {Object=} opt_handler Element in whose scope to call the listener.
+ * @return {goog.events.ListenableKey} the found listener or null if not found.
+ * @template EVENTOBJ
+ */
+goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) {
+ // TODO(chrishenry): Change type from ?string to string, or add assertion.
+ type = /** @type {string} */ (type);
+ listener = goog.events.wrapListener(listener);
+ var capture = !!opt_capt;
+ if (goog.events.Listenable.isImplementedBy(src)) {
+ return src.getListener(type, listener, capture, opt_handler);
+ }
+
+ if (!src) {
+ // TODO(chrishenry): We should tighten the API to only accept
+ // non-null objects, or add an assertion here.
+ return null;
+ }
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (src));
+ if (listenerMap) {
+ return listenerMap.getListener(type, listener, capture, opt_handler);
+ }
+ return null;
+};
+
+
+/**
+ * Returns whether an event target has any active listeners matching the
+ * specified signature. If either the type or capture parameters are
+ * unspecified, the function will match on the remaining criteria.
+ *
+ * @param {EventTarget|goog.events.Listenable} obj Target to get
+ * listeners for.
+ * @param {string|!goog.events.EventId=} opt_type Event type.
+ * @param {boolean=} opt_capture Whether to check for capture or bubble-phase
+ * listeners.
+ * @return {boolean} Whether an event target has one or more listeners matching
+ * the requested type and/or capture phase.
+ */
+goog.events.hasListener = function(obj, opt_type, opt_capture) {
+ if (goog.events.Listenable.isImplementedBy(obj)) {
+ return obj.hasListener(opt_type, opt_capture);
+ }
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {!EventTarget} */ (obj));
+ return !!listenerMap && listenerMap.hasListener(opt_type, opt_capture);
+};
+
+
+/**
+ * Provides a nice string showing the normalized event objects public members
+ * @param {Object} e Event Object.
+ * @return {string} String of the public members of the normalized event object.
+ */
+goog.events.expose = function(e) {
+ var str = [];
+ for (var key in e) {
+ if (e[key] && e[key].id) {
+ str.push(key + ' = ' + e[key] + ' (' + e[key].id + ')');
+ } else {
+ str.push(key + ' = ' + e[key]);
+ }
+ }
+ return str.join('\n');
+};
+
+
+/**
+ * Returns a string with on prepended to the specified type. This is used for IE
+ * which expects "on" to be prepended. This function caches the string in order
+ * to avoid extra allocations in steady state.
+ * @param {string} type Event type.
+ * @return {string} The type string with 'on' prepended.
+ * @private
+ */
+goog.events.getOnString_ = function(type) {
+ if (type in goog.events.onStringMap_) {
+ return goog.events.onStringMap_[type];
+ }
+ return goog.events.onStringMap_[type] = goog.events.onString_ + type;
+};
+
+
+/**
+ * Fires an object's listeners of a particular type and phase
+ *
+ * @param {Object} obj Object whose listeners to call.
+ * @param {string|!goog.events.EventId} type Event type.
+ * @param {boolean} capture Which event phase.
+ * @param {Object} eventObject Event object to be passed to listener.
+ * @return {boolean} True if all listeners returned true else false.
+ */
+goog.events.fireListeners = function(obj, type, capture, eventObject) {
+ if (goog.events.Listenable.isImplementedBy(obj)) {
+ return /** @type {!goog.events.Listenable} */ (obj).fireListeners(
+ type, capture, eventObject);
+ }
+
+ return goog.events.fireListeners_(obj, type, capture, eventObject);
+};
+
+
+/**
+ * Fires an object's listeners of a particular type and phase.
+ * @param {Object} obj Object whose listeners to call.
+ * @param {string|!goog.events.EventId} type Event type.
+ * @param {boolean} capture Which event phase.
+ * @param {Object} eventObject Event object to be passed to listener.
+ * @return {boolean} True if all listeners returned true else false.
+ * @private
+ */
+goog.events.fireListeners_ = function(obj, type, capture, eventObject) {
+ /** @type {boolean} */
+ var retval = true;
+
+ var listenerMap = goog.events.getListenerMap_(
+ /** @type {EventTarget} */ (obj));
+ if (listenerMap) {
+ // TODO(chrishenry): Original code avoids array creation when there
+ // is no listener, so we do the same. If this optimization turns
+ // out to be not required, we can replace this with
+ // listenerMap.getListeners(type, capture) instead, which is simpler.
+ var listenerArray = listenerMap.listeners[type.toString()];
+ if (listenerArray) {
+ listenerArray = listenerArray.concat();
+ for (var i = 0; i < listenerArray.length; i++) {
+ var listener = listenerArray[i];
+ // We might not have a listener if the listener was removed.
+ if (listener && listener.capture == capture && !listener.removed) {
+ var result = goog.events.fireListener(listener, eventObject);
+ retval = retval && (result !== false);
+ }
+ }
+ }
+ }
+ return retval;
+};
+
+
+/**
+ * Fires a listener with a set of arguments
+ *
+ * @param {goog.events.Listener} listener The listener object to call.
+ * @param {Object} eventObject The event object to pass to the listener.
+ * @return {*} Result of listener.
+ */
+goog.events.fireListener = function(listener, eventObject) {
+ var listenerFn = listener.listener;
+ var listenerHandler = listener.handler || listener.src;
+
+ if (listener.callOnce) {
+ goog.events.unlistenByKey(listener);
+ }
+ return listenerFn.call(listenerHandler, eventObject);
+};
+
+
+/**
+ * Gets the total number of listeners currently in the system.
+ * @return {number} Number of listeners.
+ * @deprecated This returns estimated count, now that Closure no longer
+ * stores a central listener registry. We still return an estimation
+ * to keep existing listener-related tests passing. In the near future,
+ * this function will be removed.
+ */
+goog.events.getTotalListenerCount = function() {
+ return goog.events.listenerCountEstimate_;
+};
+
+
+/**
+ * Dispatches an event (or event like object) and calls all listeners
+ * listening for events of this type. The type of the event is decided by the
+ * type property on the event object.
+ *
+ * If any of the listeners returns false OR calls preventDefault then this
+ * function will return false. If one of the capture listeners calls
+ * stopPropagation, then the bubble listeners won't fire.
+ *
+ * @param {goog.events.Listenable} src The event target.
+ * @param {goog.events.EventLike} e Event object.
+ * @return {boolean} If anyone called preventDefault on the event object (or
+ * if any of the handlers returns false) this will also return false.
+ * If there are no handlers, or if all handlers return true, this returns
+ * true.
+ */
+goog.events.dispatchEvent = function(src, e) {
+ goog.asserts.assert(
+ goog.events.Listenable.isImplementedBy(src),
+ 'Can not use goog.events.dispatchEvent with ' +
+ 'non-goog.events.Listenable instance.');
+ return src.dispatchEvent(e);
+};
+
+
+/**
+ * Installs exception protection for the browser event entry point using the
+ * given error handler.
+ *
+ * @param {goog.debug.ErrorHandler} errorHandler Error handler with which to
+ * protect the entry point.
+ */
+goog.events.protectBrowserEventEntryPoint = function(errorHandler) {
+ goog.events.handleBrowserEvent_ =
+ errorHandler.protectEntryPoint(goog.events.handleBrowserEvent_);
+};
+
+
+/**
+ * Handles an event and dispatches it to the correct listeners. This
+ * function is a proxy for the real listener the user specified.
+ *
+ * @param {goog.events.Listener} listener The listener object.
+ * @param {Event=} opt_evt Optional event object that gets passed in via the
+ * native event handlers.
+ * @return {*} Result of the event handler.
+ * @this {EventTarget} The object or Element that fired the event.
+ * @private
+ */
+goog.events.handleBrowserEvent_ = function(listener, opt_evt) {
+ if (listener.removed) {
+ return true;
+ }
+
+ // Synthesize event propagation if the browser does not support W3C
+ // event model.
+ if (!goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {
+ var ieEvent = opt_evt ||
+ /** @type {Event} */ (goog.getObjectByName('window.event'));
+ var evt = new goog.events.BrowserEvent(ieEvent, this);
+ /** @type {*} */
+ var retval = true;
+
+ if (goog.events.CAPTURE_SIMULATION_MODE ==
+ goog.events.CaptureSimulationMode.ON) {
+ // If we have not marked this event yet, we should perform capture
+ // simulation.
+ if (!goog.events.isMarkedIeEvent_(ieEvent)) {
+ goog.events.markIeEvent_(ieEvent);
+
+ var ancestors = [];
+ for (var parent = evt.currentTarget; parent;
+ parent = parent.parentNode) {
+ ancestors.push(parent);
+ }
+
+ // Fire capture listeners.
+ var type = listener.type;
+ for (var i = ancestors.length - 1; !evt.propagationStopped_ && i >= 0;
+ i--) {
+ evt.currentTarget = ancestors[i];
+ var result =
+ goog.events.fireListeners_(ancestors[i], type, true, evt);
+ retval = retval && result;
+ }
+
+ // Fire bubble listeners.
+ //
+ // We can technically rely on IE to perform bubble event
+ // propagation. However, it turns out that IE fires events in
+ // opposite order of attachEvent registration, which broke
+ // some code and tests that rely on the order. (While W3C DOM
+ // Level 2 Events TR leaves the event ordering unspecified,
+ // modern browsers and W3C DOM Level 3 Events Working Draft
+ // actually specify the order as the registration order.)
+ for (var i = 0; !evt.propagationStopped_ && i < ancestors.length; i++) {
+ evt.currentTarget = ancestors[i];
+ var result =
+ goog.events.fireListeners_(ancestors[i], type, false, evt);
+ retval = retval && result;
+ }
+ }
+ } else {
+ retval = goog.events.fireListener(listener, evt);
+ }
+ return retval;
+ }
+
+ // Otherwise, simply fire the listener.
+ return goog.events.fireListener(
+ listener, new goog.events.BrowserEvent(opt_evt, this));
+};
+
+
+/**
+ * This is used to mark the IE event object so we do not do the Closure pass
+ * twice for a bubbling event.
+ * @param {Event} e The IE browser event.
+ * @private
+ */
+goog.events.markIeEvent_ = function(e) {
+ // Only the keyCode and the returnValue can be changed. We use keyCode for
+ // non keyboard events.
+ // event.returnValue is a bit more tricky. It is undefined by default. A
+ // boolean false prevents the default action. In a window.onbeforeunload and
+ // the returnValue is non undefined it will be alerted. However, we will only
+ // modify the returnValue for keyboard events. We can get a problem if non
+ // closure events sets the keyCode or the returnValue
+
+ var useReturnValue = false;
+
+ if (e.keyCode == 0) {
+ // We cannot change the keyCode in case that srcElement is input[type=file].
+ // We could test that that is the case but that would allocate 3 objects.
+ // If we use try/catch we will only allocate extra objects in the case of a
+ // failure.
+
+ try {
+ e.keyCode = -1;
+ return;
+ } catch (ex) {
+ useReturnValue = true;
+ }
+ }
+
+ if (useReturnValue ||
+ /** @type {boolean|undefined} */ (e.returnValue) == undefined) {
+ e.returnValue = true;
+ }
+};
+
+
+/**
+ * This is used to check if an IE event has already been handled by the Closure
+ * system so we do not do the Closure pass twice for a bubbling event.
+ * @param {Event} e The IE browser event.
+ * @return {boolean} True if the event object has been marked.
+ * @private
+ */
+goog.events.isMarkedIeEvent_ = function(e) {
+ return e.keyCode < 0 || e.returnValue != undefined;
+};
+
+
+/**
+ * Counter to create unique event ids.
+ * @private {number}
+ */
+goog.events.uniqueIdCounter_ = 0;
+
+
+/**
+ * Creates a unique event id.
+ *
+ * @param {string} identifier The identifier.
+ * @return {string} A unique identifier.
+ * @idGenerator {unique}
+ */
+goog.events.getUniqueId = function(identifier) {
+ return identifier + '_' + goog.events.uniqueIdCounter_++;
+};
+
+
+/**
+ * @param {EventTarget} src The source object.
+ * @return {goog.events.ListenerMap} A listener map for the given
+ * source object, or null if none exists.
+ * @private
+ */
+goog.events.getListenerMap_ = function(src) {
+ var listenerMap = src[goog.events.LISTENER_MAP_PROP_];
+ // IE serializes the property as well (e.g. when serializing outer
+ // HTML). So we must check that the value is of the correct type.
+ return listenerMap instanceof goog.events.ListenerMap ? listenerMap : null;
+};
+
+
+/**
+ * Expando property for listener function wrapper for Object with
+ * handleEvent.
+ * @private @const {string}
+ */
+goog.events.LISTENER_WRAPPER_PROP_ =
+ '__closure_events_fn_' + ((Math.random() * 1e9) >>> 0);
+
+
+/**
+ * @param {Object|Function} listener The listener function or an
+ * object that contains handleEvent method.
+ * @return {!Function} Either the original function or a function that
+ * calls obj.handleEvent. If the same listener is passed to this
+ * function more than once, the same function is guaranteed to be
+ * returned.
+ */
+goog.events.wrapListener = function(listener) {
+ goog.asserts.assert(listener, 'Listener can not be null.');
+
+ if (goog.isFunction(listener)) {
+ return listener;
+ }
+
+ goog.asserts.assert(
+ listener.handleEvent, 'An object listener must have handleEvent method.');
+ if (!listener[goog.events.LISTENER_WRAPPER_PROP_]) {
+ listener[goog.events.LISTENER_WRAPPER_PROP_] = function(e) {
+ return /** @type {?} */ (listener).handleEvent(e);
+ };
+ }
+ return listener[goog.events.LISTENER_WRAPPER_PROP_];
+};
+
+
+// Register the browser event handler as an entry point, so that
+// it can be monitored for exception handling, etc.
+goog.debug.entryPointRegistry.register(
+ /**
+ * @param {function(!Function): !Function} transformer The transforming
+ * function.
+ */
+ function(transformer) {
+ goog.events.handleBrowserEvent_ =
+ transformer(goog.events.handleBrowserEvent_);
+ });
diff --git a/src/http/static/viz/2/goog/events/eventtype.js b/src/http/static/viz/2/goog/events/eventtype.js
new file mode 100644
index 0000000..7d991ea
--- /dev/null
+++ b/src/http/static/viz/2/goog/events/eventtype.js
@@ -0,0 +1,295 @@
+// Copyright 2010 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Event Types.
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+goog.provide('goog.events.EventType');
+
+goog.require('goog.userAgent');
+
+
+/**
+ * Returns a prefixed event name for the current browser.
+ * @param {string} eventName The name of the event.
+ * @return {string} The prefixed event name.
+ * @suppress {missingRequire|missingProvide}
+ * @private
+ */
+goog.events.getVendorPrefixedName_ = function(eventName) {
+ return goog.userAgent.WEBKIT ?
+ 'webkit' + eventName :
+ (goog.userAgent.OPERA ? 'o' + eventName.toLowerCase() :
+ eventName.toLowerCase());
+};
+
+
+/**
+ * Constants for event names.
+ * @enum {string}
+ */
+goog.events.EventType = {
+ // Mouse events
+ CLICK: 'click',
+ RIGHTCLICK: 'rightclick',
+ DBLCLICK: 'dblclick',
+ MOUSEDOWN: 'mousedown',
+ MOUSEUP: 'mouseup',
+ MOUSEOVER: 'mouseover',
+ MOUSEOUT: 'mouseout',
+ MOUSEMOVE: 'mousemove',
+ MOUSEENTER: 'mouseenter',
+ MOUSELEAVE: 'mouseleave',
+
+ // Selection events.
+ // https://www.w3.org/TR/selection-api/
+ SELECTIONCHANGE: 'selectionchange',
+ SELECTSTART: 'selectstart', // IE, Safari, Chrome
+
+ // Wheel events
+ // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
+ WHEEL: 'wheel',
+
+ // Key events
+ KEYPRESS: 'keypress',
+ KEYDOWN: 'keydown',
+ KEYUP: 'keyup',
+
+ // Focus
+ BLUR: 'blur',
+ FOCUS: 'focus',
+ DEACTIVATE: 'deactivate', // IE only
+ // NOTE: The following two events are not stable in cross-browser usage.
+ // WebKit and Opera implement DOMFocusIn/Out.
+ // IE implements focusin/out.
+ // Gecko implements neither see bug at
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=396927.
+ // The DOM Events Level 3 Draft deprecates DOMFocusIn in favor of focusin:
+ // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html
+ // You can use FOCUS in Capture phase until implementations converge.
+ FOCUSIN: goog.userAgent.IE ? 'focusin' : 'DOMFocusIn',
+ FOCUSOUT: goog.userAgent.IE ? 'focusout' : 'DOMFocusOut',
+
+ // Forms
+ CHANGE: 'change',
+ RESET: 'reset',
+ SELECT: 'select',
+ SUBMIT: 'submit',
+ INPUT: 'input',
+ PROPERTYCHANGE: 'propertychange', // IE only
+
+ // Drag and drop
+ DRAGSTART: 'dragstart',
+ DRAG: 'drag',
+ DRAGENTER: 'dragenter',
+ DRAGOVER: 'dragover',
+ DRAGLEAVE: 'dragleave',
+ DROP: 'drop',
+ DRAGEND: 'dragend',
+
+ // Touch events
+ // Note that other touch events exist, but we should follow the W3C list here.
+ // http://www.w3.org/TR/touch-events/#list-of-touchevent-types
+ TOUCHSTART: 'touchstart',
+ TOUCHMOVE: 'touchmove',
+ TOUCHEND: 'touchend',
+ TOUCHCANCEL: 'touchcancel',
+
+ // Misc
+ BEFOREUNLOAD: 'beforeunload',
+ CONSOLEMESSAGE: 'consolemessage',
+ CONTEXTMENU: 'contextmenu',
+ DEVICEMOTION: 'devicemotion',
+ DEVICEORIENTATION: 'deviceorientation',
+ DOMCONTENTLOADED: 'DOMContentLoaded',
+ ERROR: 'error',
+ HELP: 'help',
+ LOAD: 'load',
+ LOSECAPTURE: 'losecapture',
+ ORIENTATIONCHANGE: 'orientationchange',
+ READYSTATECHANGE: 'readystatechange',
+ RESIZE: 'resize',
+ SCROLL: 'scroll',
+ UNLOAD: 'unload',
+
+ // Media events
+ CANPLAY: 'canplay',
+ CANPLAYTHROUGH: 'canplaythrough',
+ DURATIONCHANGE: 'durationchange',
+ EMPTIED: 'emptied',
+ ENDED: 'ended',
+ LOADEDDATA: 'loadeddata',
+ LOADEDMETADATA: 'loadedmetadata',
+ PAUSE: 'pause',
+ PLAY: 'play',
+ PLAYING: 'playing',
+ RATECHANGE: 'ratechange',
+ SEEKED: 'seeked',
+ SEEKING: 'seeking',
+ STALLED: 'stalled',
+ SUSPEND: 'suspend',
+ TIMEUPDATE: 'timeupdate',
+ VOLUMECHANGE: 'volumechange',
+ WAITING: 'waiting',
+
+ // Media Source Extensions events
+ // https://www.w3.org/TR/media-source/#mediasource-events
+ SOURCEOPEN: 'sourceopen',
+ SOURCEENDED: 'sourceended',
+ SOURCECLOSED: 'sourceclosed',
+ // https://www.w3.org/TR/media-source/#sourcebuffer-events
+ ABORT: 'abort',
+ UPDATE: 'update',
+ UPDATESTART: 'updatestart',
+ UPDATEEND: 'updateend',
+
+ // HTML 5 History events
+ // See http://www.w3.org/TR/html5/browsers.html#event-definitions-0
+ HASHCHANGE: 'hashchange',
+ PAGEHIDE: 'pagehide',
+ PAGESHOW: 'pageshow',
+ POPSTATE: 'popstate',
+
+ // Copy and Paste
+ // Support is limited. Make sure it works on your favorite browser
+ // before using.
+ // http://www.quirksmode.org/dom/events/cutcopypaste.html
+ COPY: 'copy',
+ PASTE: 'paste',
+ CUT: 'cut',
+ BEFORECOPY: 'beforecopy',
+ BEFORECUT: 'beforecut',
+ BEFOREPASTE: 'beforepaste',
+
+ // HTML5 online/offline events.
+ // http://www.w3.org/TR/offline-webapps/#related
+ ONLINE: 'online',
+ OFFLINE: 'offline',
+
+ // HTML 5 worker events
+ MESSAGE: 'message',
+ CONNECT: 'connect',
+
+ // Service Worker Events - ServiceWorkerGlobalScope context
+ // See https://w3c.github.io/ServiceWorker/#execution-context-events
+ // Note: message event defined in worker events section
+ INSTALL: 'install',
+ ACTIVATE: 'activate',
+ FETCH: 'fetch',
+ FOREIGNFETCH: 'foreignfetch',
+ MESSAGEERROR: 'messageerror',
+
+ // Service Worker Events - Document context
+ // See https://w3c.github.io/ServiceWorker/#document-context-events
+ STATECHANGE: 'statechange',
+ UPDATEFOUND: 'updatefound',
+ CONTROLLERCHANGE: 'controllerchange',
+
+ // CSS animation events.
+ /** @suppress {missingRequire} */
+ ANIMATIONSTART: goog.events.getVendorPrefixedName_('AnimationStart'),
+ /** @suppress {missingRequire} */
+ ANIMATIONEND: goog.events.getVendorPrefixedName_('AnimationEnd'),
+ /** @suppress {missingRequire} */
+ ANIMATIONITERATION: goog.events.getVendorPrefixedName_('AnimationIteration'),
+
+ // CSS transition events. Based on the browser support described at:
+ // https://developer.mozilla.org/en/css/css_transitions#Browser_compatibility
+ /** @suppress {missingRequire} */
+ TRANSITIONEND: goog.events.getVendorPrefixedName_('TransitionEnd'),
+
+ // W3C Pointer Events
+ // http://www.w3.org/TR/pointerevents/
+ POINTERDOWN: 'pointerdown',
+ POINTERUP: 'pointerup',
+ POINTERCANCEL: 'pointercancel',
+ POINTERMOVE: 'pointermove',
+ POINTEROVER: 'pointerover',
+ POINTEROUT: 'pointerout',
+ POINTERENTER: 'pointerenter',
+ POINTERLEAVE: 'pointerleave',
+ GOTPOINTERCAPTURE: 'gotpointercapture',
+ LOSTPOINTERCAPTURE: 'lostpointercapture',
+
+ // IE specific events.
+ // See http://msdn.microsoft.com/en-us/library/ie/hh772103(v=vs.85).aspx
+ // Note: these events will be supplanted in IE11.
+ MSGESTURECHANGE: 'MSGestureChange',
+ MSGESTUREEND: 'MSGestureEnd',
+ MSGESTUREHOLD: 'MSGestureHold',
+ MSGESTURESTART: 'MSGestureStart',
+ MSGESTURETAP: 'MSGestureTap',
+ MSGOTPOINTERCAPTURE: 'MSGotPointerCapture',
+ MSINERTIASTART: 'MSInertiaStart',
+ MSLOSTPOINTERCAPTURE: 'MSLostPointerCapture',
+ MSPOINTERCANCEL: 'MSPointerCancel',
+ MSPOINTERDOWN: 'MSPointerDown',
+ MSPOINTERENTER: 'MSPointerEnter',
+ MSPOINTERHOVER: 'MSPointerHover',
+ MSPOINTERLEAVE: 'MSPointerLeave',
+ MSPOINTERMOVE: 'MSPointerMove',
+ MSPOINTEROUT: 'MSPointerOut',
+ MSPOINTEROVER: 'MSPointerOver',
+ MSPOINTERUP: 'MSPointerUp',
+
+ // Native IMEs/input tools events.
+ TEXT: 'text',
+ // The textInput event is supported in IE9+, but only in lower case. All other
+ // browsers use the camel-case event name.
+ TEXTINPUT: goog.userAgent.IE ? 'textinput' : 'textInput',
+ COMPOSITIONSTART: 'compositionstart',
+ COMPOSITIONUPDATE: 'compositionupdate',
+ COMPOSITIONEND: 'compositionend',
+
+ // The beforeinput event is initially only supported in Safari. See
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=342670 for Chrome
+ // implementation tracking.
+ BEFOREINPUT: 'beforeinput',
+
+ // Webview tag events
+ // See http://developer.chrome.com/dev/apps/webview_tag.html
+ EXIT: 'exit',
+ LOADABORT: 'loadabort',
+ LOADCOMMIT: 'loadcommit',
+ LOADREDIRECT: 'loadredirect',
+ LOADSTART: 'loadstart',
+ LOADSTOP: 'loadstop',
+ RESPONSIVE: 'responsive',
+ SIZECHANGED: 'sizechanged',
+ UNRESPONSIVE: 'unresponsive',
+
+ // HTML5 Page Visibility API. See details at
+ // {@code goog.labs.dom.PageVisibilityMonitor}.
+ VISIBILITYCHANGE: 'visibilitychange',
+
+ // LocalStorage event.
+ STORAGE: 'storage',
+
+ // DOM Level 2 mutation events (deprecated).
+ DOMSUBTREEMODIFIED: 'DOMSubtreeModified',
+ DOMNODEINSERTED: 'DOMNodeInserted',
+ DOMNODEREMOVED: 'DOMNodeRemoved',
+ DOMNODEREMOVEDFROMDOCUMENT: 'DOMNodeRemovedFromDocument',
+ DOMNODEINSERTEDINTODOCUMENT: 'DOMNodeInsertedIntoDocument',
+ DOMATTRMODIFIED: 'DOMAttrModified',
+ DOMCHARACTERDATAMODIFIED: 'DOMCharacterDataModified',
+
+ // Print events.
+ BEFOREPRINT: 'beforeprint',
+ AFTERPRINT: 'afterprint'
+};
diff --git a/src/http/static/viz/2/goog/events/listenable.js b/src/http/static/viz/2/goog/events/listenable.js
new file mode 100644
index 0000000..0f29d81
--- /dev/null
+++ b/src/http/static/viz/2/goog/events/listenable.js
@@ -0,0 +1,338 @@
+// Copyright 2012 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview An interface for a listenable JavaScript object.
+ * @author chrishenry@google.com (Chris Henry)
+ */
+
+goog.provide('goog.events.Listenable');
+goog.provide('goog.events.ListenableKey');
+
+/** @suppress {extraRequire} */
+goog.require('goog.events.EventId');
+
+goog.forwardDeclare('goog.events.EventLike');
+goog.forwardDeclare('goog.events.EventTarget');
+
+
+
+/**
+ * A listenable interface. A listenable is an object with the ability
+ * to dispatch/broadcast events to "event listeners" registered via
+ * listen/listenOnce.
+ *
+ * The interface allows for an event propagation mechanism similar
+ * to one offered by native browser event targets, such as
+ * capture/bubble mechanism, stopping propagation, and preventing
+ * default actions. Capture/bubble mechanism depends on the ancestor
+ * tree constructed via {@code #getParentEventTarget}; this tree
+ * must be directed acyclic graph. The meaning of default action(s)
+ * in preventDefault is specific to a particular use case.
+ *
+ * Implementations that do not support capture/bubble or can not have
+ * a parent listenable can simply not implement any ability to set the
+ * parent listenable (and have {@code #getParentEventTarget} return
+ * null).
+ *
+ * Implementation of this class can be used with or independently from
+ * goog.events.
+ *
+ * Implementation must call {@code #addImplementation(implClass)}.
+ *
+ * @interface
+ * @see goog.events
+ * @see http://www.w3.org/TR/DOM-Level-2-Events/events.html
+ */
+goog.events.Listenable = function() {};
+
+
+/**
+ * An expando property to indicate that an object implements
+ * goog.events.Listenable.
+ *
+ * See addImplementation/isImplementedBy.
+ *
+ * @type {string}
+ * @const
+ */
+goog.events.Listenable.IMPLEMENTED_BY_PROP =
+ 'closure_listenable_' + ((Math.random() * 1e6) | 0);
+
+
+/**
+ * Marks a given class (constructor) as an implementation of
+ * Listenable, do that we can query that fact at runtime. The class
+ * must have already implemented the interface.
+ * @param {!function(new:goog.events.Listenable,...)} cls The class constructor.
+ * The corresponding class must have already implemented the interface.
+ */
+goog.events.Listenable.addImplementation = function(cls) {
+ cls.prototype[goog.events.Listenable.IMPLEMENTED_BY_PROP] = true;
+};
+
+
+/**
+ * @param {Object} obj The object to check.
+ * @return {boolean} Whether a given instance implements Listenable. The
+ * class/superclass of the instance must call addImplementation.
+ */
+goog.events.Listenable.isImplementedBy = function(obj) {
+ return !!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]);
+};
+
+
+/**
+ * Adds an event listener. A listener can only be added once to an
+ * object and if it is added again the key for the listener is
+ * returned. Note that if the existing listener is a one-off listener
+ * (registered via listenOnce), it will no longer be a one-off
+ * listener after a call to listen().
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback
+ * method.
+ * @param {boolean=} opt_useCapture Whether to fire in capture phase
+ * (defaults to false).
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {!goog.events.ListenableKey} Unique key for the listener.
+ * @template SCOPE,EVENTOBJ
+ */
+goog.events.Listenable.prototype.listen;
+
+
+/**
+ * Adds an event listener that is removed automatically after the
+ * listener fired once.
+ *
+ * If an existing listener already exists, listenOnce will do
+ * nothing. In particular, if the listener was previously registered
+ * via listen(), listenOnce() will not turn the listener into a
+ * one-off listener. Similarly, if there is already an existing
+ * one-off listener, listenOnce does not modify the listeners (it is
+ * still a once listener).
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback
+ * method.
+ * @param {boolean=} opt_useCapture Whether to fire in capture phase
+ * (defaults to false).
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {!goog.events.ListenableKey} Unique key for the listener.
+ * @template SCOPE,EVENTOBJ
+ */
+goog.events.Listenable.prototype.listenOnce;
+
+
+/**
+ * Removes an event listener which was added with listen() or listenOnce().
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback
+ * method.
+ * @param {boolean=} opt_useCapture Whether to fire in capture phase
+ * (defaults to false).
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call
+ * the listener.
+ * @return {boolean} Whether any listener was removed.
+ * @template SCOPE,EVENTOBJ
+ */
+goog.events.Listenable.prototype.unlisten;
+
+
+/**
+ * Removes an event listener which was added with listen() by the key
+ * returned by listen().
+ *
+ * @param {!goog.events.ListenableKey} key The key returned by
+ * listen() or listenOnce().
+ * @return {boolean} Whether any listener was removed.
+ */
+goog.events.Listenable.prototype.unlistenByKey;
+
+
+/**
+ * Dispatches an event (or event like object) and calls all listeners
+ * listening for events of this type. The type of the event is decided by the
+ * type property on the event object.
+ *
+ * If any of the listeners returns false OR calls preventDefault then this
+ * function will return false. If one of the capture listeners calls
+ * stopPropagation, then the bubble listeners won't fire.
+ *
+ * @param {goog.events.EventLike} e Event object.
+ * @return {boolean} If anyone called preventDefault on the event object (or
+ * if any of the listeners returns false) this will also return false.
+ */
+goog.events.Listenable.prototype.dispatchEvent;
+
+
+/**
+ * Removes all listeners from this listenable. If type is specified,
+ * it will only remove listeners of the particular type. otherwise all
+ * registered listeners will be removed.
+ *
+ * @param {string=} opt_type Type of event to remove, default is to
+ * remove all types.
+ * @return {number} Number of listeners removed.
+ */
+goog.events.Listenable.prototype.removeAllListeners;
+
+
+/**
+ * Returns the parent of this event target to use for capture/bubble
+ * mechanism.
+ *
+ * NOTE(chrishenry): The name reflects the original implementation of
+ * custom event target ({@code goog.events.EventTarget}). We decided
+ * that changing the name is not worth it.
+ *
+ * @return {goog.events.Listenable} The parent EventTarget or null if
+ * there is no parent.
+ */
+goog.events.Listenable.prototype.getParentEventTarget;
+
+
+/**
+ * Fires all registered listeners in this listenable for the given
+ * type and capture mode, passing them the given eventObject. This
+ * does not perform actual capture/bubble. Only implementors of the
+ * interface should be using this.
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>} type The type of the
+ * listeners to fire.
+ * @param {boolean} capture The capture mode of the listeners to fire.
+ * @param {EVENTOBJ} eventObject The event object to fire.
+ * @return {boolean} Whether all listeners succeeded without
+ * attempting to prevent default behavior. If any listener returns
+ * false or called goog.events.Event#preventDefault, this returns
+ * false.
+ * @template EVENTOBJ
+ */
+goog.events.Listenable.prototype.fireListeners;
+
+
+/**
+ * Gets all listeners in this listenable for the given type and
+ * capture mode.
+ *
+ * @param {string|!goog.events.EventId} type The type of the listeners to fire.
+ * @param {boolean} capture The capture mode of the listeners to fire.
+ * @return {!Array<!goog.events.ListenableKey>} An array of registered
+ * listeners.
+ * @template EVENTOBJ
+ */
+goog.events.Listenable.prototype.getListeners;
+
+
+/**
+ * Gets the goog.events.ListenableKey for the event or null if no such
+ * listener is in use.
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>} type The name of the event
+ * without the 'on' prefix.
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener The
+ * listener function to get.
+ * @param {boolean} capture Whether the listener is a capturing listener.
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {goog.events.ListenableKey} the found listener or null if not found.
+ * @template SCOPE,EVENTOBJ
+ */
+goog.events.Listenable.prototype.getListener;
+
+
+/**
+ * Whether there is any active listeners matching the specified
+ * signature. If either the type or capture parameters are
+ * unspecified, the function will match on the remaining criteria.
+ *
+ * @param {string|!goog.events.EventId<EVENTOBJ>=} opt_type Event type.
+ * @param {boolean=} opt_capture Whether to check for capture or bubble
+ * listeners.
+ * @return {boolean} Whether there is any active listeners matching
+ * the requested type and/or capture phase.
+ * @template EVENTOBJ
+ */
+goog.events.Listenable.prototype.hasListener;
+
+
+
+/**
+ * An interface that describes a single registered listener.
+ * @interface
+ */
+goog.events.ListenableKey = function() {};
+
+
+/**
+ * Counter used to create a unique key
+ * @type {number}
+ * @private
+ */
+goog.events.ListenableKey.counter_ = 0;
+
+
+/**
+ * Reserves a key to be used for ListenableKey#key field.
+ * @return {number} A number to be used to fill ListenableKey#key
+ * field.
+ */
+goog.events.ListenableKey.reserveKey = function() {
+ return ++goog.events.ListenableKey.counter_;
+};
+
+
+/**
+ * The source event target.
+ * @type {Object|goog.events.Listenable|goog.events.EventTarget}
+ */
+goog.events.ListenableKey.prototype.src;
+
+
+/**
+ * The event type the listener is listening to.
+ * @type {string}
+ */
+goog.events.ListenableKey.prototype.type;
+
+
+/**
+ * The listener function.
+ * @type {function(?):?|{handleEvent:function(?):?}|null}
+ */
+goog.events.ListenableKey.prototype.listener;
+
+
+/**
+ * Whether the listener works on capture phase.
+ * @type {boolean}
+ */
+goog.events.ListenableKey.prototype.capture;
+
+
+/**
+ * The 'this' object for the listener function's scope.
+ * @type {Object|undefined}
+ */
+goog.events.ListenableKey.prototype.handler;
+
+
+/**
+ * A globally unique number to identify the key.
+ * @type {number}
+ */
+goog.events.ListenableKey.prototype.key;
diff --git a/src/http/static/viz/2/goog/events/listener.js b/src/http/static/viz/2/goog/events/listener.js
new file mode 100644
index 0000000..5ac7b85
--- /dev/null
+++ b/src/http/static/viz/2/goog/events/listener.js
@@ -0,0 +1,128 @@
+// Copyright 2005 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Listener object.
+ * @see ../demos/events.html
+ */
+
+goog.provide('goog.events.Listener');
+
+goog.require('goog.events.ListenableKey');
+
+
+
+/**
+ * Simple class that stores information about a listener
+ * @param {function(?):?} listener Callback function.
+ * @param {Function} proxy Wrapper for the listener that patches the event.
+ * @param {EventTarget|goog.events.Listenable} src Source object for
+ * the event.
+ * @param {string} type Event type.
+ * @param {boolean} capture Whether in capture or bubble phase.
+ * @param {Object=} opt_handler Object in whose context to execute the callback.
+ * @implements {goog.events.ListenableKey}
+ * @constructor
+ */
+goog.events.Listener = function(
+ listener, proxy, src, type, capture, opt_handler) {
+ if (goog.events.Listener.ENABLE_MONITORING) {
+ this.creationStack = new Error().stack;
+ }
+
+ /** @override */
+ this.listener = listener;
+
+ /**
+ * A wrapper over the original listener. This is used solely to
+ * handle native browser events (it is used to simulate the capture
+ * phase and to patch the event object).
+ * @type {Function}
+ */
+ this.proxy = proxy;
+
+ /**
+ * Object or node that callback is listening to
+ * @type {EventTarget|goog.events.Listenable}
+ */
+ this.src = src;
+
+ /**
+ * The event type.
+ * @const {string}
+ */
+ this.type = type;
+
+ /**
+ * Whether the listener is being called in the capture or bubble phase
+ * @const {boolean}
+ */
+ this.capture = !!capture;
+
+ /**
+ * Optional object whose context to execute the listener in
+ * @type {Object|undefined}
+ */
+ this.handler = opt_handler;
+
+ /**
+ * The key of the listener.
+ * @const {number}
+ * @override
+ */
+ this.key = goog.events.ListenableKey.reserveKey();
+
+ /**
+ * Whether to remove the listener after it has been called.
+ * @type {boolean}
+ */
+ this.callOnce = false;
+
+ /**
+ * Whether the listener has been removed.
+ * @type {boolean}
+ */
+ this.removed = false;
+};
+
+
+/**
+ * @define {boolean} Whether to enable the monitoring of the
+ * goog.events.Listener instances. Switching on the monitoring is only
+ * recommended for debugging because it has a significant impact on
+ * performance and memory usage. If switched off, the monitoring code
+ * compiles down to 0 bytes.
+ */
+goog.define('goog.events.Listener.ENABLE_MONITORING', false);
+
+
+/**
+ * If monitoring the goog.events.Listener instances is enabled, stores the
+ * creation stack trace of the Disposable instance.
+ * @type {string}
+ */
+goog.events.Listener.prototype.creationStack;
+
+
+/**
+ * Marks this listener as removed. This also remove references held by
+ * this listener object (such as listener and event source).
+ */
+goog.events.Listener.prototype.markAsRemoved = function() {
+ this.removed = true;
+ this.listener = null;
+ this.proxy = null;
+ this.src = null;
+ this.handler = null;
+};
diff --git a/src/http/static/viz/2/goog/events/listenermap.js b/src/http/static/viz/2/goog/events/listenermap.js
new file mode 100644
index 0000000..0375cf2
--- /dev/null
+++ b/src/http/static/viz/2/goog/events/listenermap.js
@@ -0,0 +1,307 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A map of listeners that provides utility functions to
+ * deal with listeners on an event target. Used by
+ * {@code goog.events.EventTarget}.
+ *
+ * WARNING: Do not use this class from outside goog.events package.
+ *
+ * @visibility {//closure/goog/bin/sizetests:__pkg__}
+ * @visibility {//closure/goog:__pkg__}
+ * @visibility {//closure/goog/events:__pkg__}
+ * @visibility {//closure/goog/labs/events:__pkg__}
+ */
+
+goog.provide('goog.events.ListenerMap');
+
+goog.require('goog.array');
+goog.require('goog.events.Listener');
+goog.require('goog.object');
+
+
+
+/**
+ * Creates a new listener map.
+ * @param {EventTarget|goog.events.Listenable} src The src object.
+ * @constructor
+ * @final
+ */
+goog.events.ListenerMap = function(src) {
+ /** @type {EventTarget|goog.events.Listenable} */
+ this.src = src;
+
+ /**
+ * Maps of event type to an array of listeners.
+ * @type {!Object<string, !Array<!goog.events.Listener>>}
+ */
+ this.listeners = {};
+
+ /**
+ * The count of types in this map that have registered listeners.
+ * @private {number}
+ */
+ this.typeCount_ = 0;
+};
+
+
+/**
+ * @return {number} The count of event types in this map that actually
+ * have registered listeners.
+ */
+goog.events.ListenerMap.prototype.getTypeCount = function() {
+ return this.typeCount_;
+};
+
+
+/**
+ * @return {number} Total number of registered listeners.
+ */
+goog.events.ListenerMap.prototype.getListenerCount = function() {
+ var count = 0;
+ for (var type in this.listeners) {
+ count += this.listeners[type].length;
+ }
+ return count;
+};
+
+
+/**
+ * Adds an event listener. A listener can only be added once to an
+ * object and if it is added again the key for the listener is
+ * returned.
+ *
+ * Note that a one-off listener will not change an existing listener,
+ * if any. On the other hand a normal listener will change existing
+ * one-off listener to become a normal listener.
+ *
+ * @param {string|!goog.events.EventId} type The listener event type.
+ * @param {!Function} listener This listener callback method.
+ * @param {boolean} callOnce Whether the listener is a one-off
+ * listener.
+ * @param {boolean=} opt_useCapture The capture mode of the listener.
+ * @param {Object=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {!goog.events.ListenableKey} Unique key for the listener.
+ */
+goog.events.ListenerMap.prototype.add = function(
+ type, listener, callOnce, opt_useCapture, opt_listenerScope) {
+ var typeStr = type.toString();
+ var listenerArray = this.listeners[typeStr];
+ if (!listenerArray) {
+ listenerArray = this.listeners[typeStr] = [];
+ this.typeCount_++;
+ }
+
+ var listenerObj;
+ var index = goog.events.ListenerMap.findListenerIndex_(
+ listenerArray, listener, opt_useCapture, opt_listenerScope);
+ if (index > -1) {
+ listenerObj = listenerArray[index];
+ if (!callOnce) {
+ // Ensure that, if there is an existing callOnce listener, it is no
+ // longer a callOnce listener.
+ listenerObj.callOnce = false;
+ }
+ } else {
+ listenerObj = new goog.events.Listener(
+ listener, null, this.src, typeStr, !!opt_useCapture, opt_listenerScope);
+ listenerObj.callOnce = callOnce;
+ listenerArray.push(listenerObj);
+ }
+ return listenerObj;
+};
+
+
+/**
+ * Removes a matching listener.
+ * @param {string|!goog.events.EventId} type The listener event type.
+ * @param {!Function} listener This listener callback method.
+ * @param {boolean=} opt_useCapture The capture mode of the listener.
+ * @param {Object=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {boolean} Whether any listener was removed.
+ */
+goog.events.ListenerMap.prototype.remove = function(
+ type, listener, opt_useCapture, opt_listenerScope) {
+ var typeStr = type.toString();
+ if (!(typeStr in this.listeners)) {
+ return false;
+ }
+
+ var listenerArray = this.listeners[typeStr];
+ var index = goog.events.ListenerMap.findListenerIndex_(
+ listenerArray, listener, opt_useCapture, opt_listenerScope);
+ if (index > -1) {
+ var listenerObj = listenerArray[index];
+ listenerObj.markAsRemoved();
+ goog.array.removeAt(listenerArray, index);
+ if (listenerArray.length == 0) {
+ delete this.listeners[typeStr];
+ this.typeCount_--;
+ }
+ return true;
+ }
+ return false;
+};
+
+
+/**
+ * Removes the given listener object.
+ * @param {!goog.events.ListenableKey} listener The listener to remove.
+ * @return {boolean} Whether the listener is removed.
+ */
+goog.events.ListenerMap.prototype.removeByKey = function(listener) {
+ var type = listener.type;
+ if (!(type in this.listeners)) {
+ return false;
+ }
+
+ var removed = goog.array.remove(this.listeners[type], listener);
+ if (removed) {
+ /** @type {!goog.events.Listener} */ (listener).markAsRemoved();
+ if (this.listeners[type].length == 0) {
+ delete this.listeners[type];
+ this.typeCount_--;
+ }
+ }
+ return removed;
+};
+
+
+/**
+ * Removes all listeners from this map. If opt_type is provided, only
+ * listeners that match the given type are removed.
+ * @param {string|!goog.events.EventId=} opt_type Type of event to remove.
+ * @return {number} Number of listeners removed.
+ */
+goog.events.ListenerMap.prototype.removeAll = function(opt_type) {
+ var typeStr = opt_type && opt_type.toString();
+ var count = 0;
+ for (var type in this.listeners) {
+ if (!typeStr || type == typeStr) {
+ var listenerArray = this.listeners[type];
+ for (var i = 0; i < listenerArray.length; i++) {
+ ++count;
+ listenerArray[i].markAsRemoved();
+ }
+ delete this.listeners[type];
+ this.typeCount_--;
+ }
+ }
+ return count;
+};
+
+
+/**
+ * Gets all listeners that match the given type and capture mode. The
+ * returned array is a copy (but the listener objects are not).
+ * @param {string|!goog.events.EventId} type The type of the listeners
+ * to retrieve.
+ * @param {boolean} capture The capture mode of the listeners to retrieve.
+ * @return {!Array<!goog.events.ListenableKey>} An array of matching
+ * listeners.
+ */
+goog.events.ListenerMap.prototype.getListeners = function(type, capture) {
+ var listenerArray = this.listeners[type.toString()];
+ var rv = [];
+ if (listenerArray) {
+ for (var i = 0; i < listenerArray.length; ++i) {
+ var listenerObj = listenerArray[i];
+ if (listenerObj.capture == capture) {
+ rv.push(listenerObj);
+ }
+ }
+ }
+ return rv;
+};
+
+
+/**
+ * Gets the goog.events.ListenableKey for the event or null if no such
+ * listener is in use.
+ *
+ * @param {string|!goog.events.EventId} type The type of the listener
+ * to retrieve.
+ * @param {!Function} listener The listener function to get.
+ * @param {boolean} capture Whether the listener is a capturing listener.
+ * @param {Object=} opt_listenerScope Object in whose scope to call the
+ * listener.
+ * @return {goog.events.ListenableKey} the found listener or null if not found.
+ */
+goog.events.ListenerMap.prototype.getListener = function(
+ type, listener, capture, opt_listenerScope) {
+ var listenerArray = this.listeners[type.toString()];
+ var i = -1;
+ if (listenerArray) {
+ i = goog.events.ListenerMap.findListenerIndex_(
+ listenerArray, listener, capture, opt_listenerScope);
+ }
+ return i > -1 ? listenerArray[i] : null;
+};
+
+
+/**
+ * Whether there is a matching listener. If either the type or capture
+ * parameters are unspecified, the function will match on the
+ * remaining criteria.
+ *
+ * @param {string|!goog.events.EventId=} opt_type The type of the listener.
+ * @param {boolean=} opt_capture The capture mode of the listener.
+ * @return {boolean} Whether there is an active listener matching
+ * the requested type and/or capture phase.
+ */
+goog.events.ListenerMap.prototype.hasListener = function(
+ opt_type, opt_capture) {
+ var hasType = goog.isDef(opt_type);
+ var typeStr = hasType ? opt_type.toString() : '';
+ var hasCapture = goog.isDef(opt_capture);
+
+ return goog.object.some(this.listeners, function(listenerArray, type) {
+ for (var i = 0; i < listenerArray.length; ++i) {
+ if ((!hasType || listenerArray[i].type == typeStr) &&
+ (!hasCapture || listenerArray[i].capture == opt_capture)) {
+ return true;
+ }
+ }
+
+ return false;
+ });
+};
+
+
+/**
+ * Finds the index of a matching goog.events.Listener in the given
+ * listenerArray.
+ * @param {!Array<!goog.events.Listener>} listenerArray Array of listener.
+ * @param {!Function} listener The listener function.
+ * @param {boolean=} opt_useCapture The capture flag for the listener.
+ * @param {Object=} opt_listenerScope The listener scope.
+ * @return {number} The index of the matching listener within the
+ * listenerArray.
+ * @private
+ */
+goog.events.ListenerMap.findListenerIndex_ = function(
+ listenerArray, listener, opt_useCapture, opt_listenerScope) {
+ for (var i = 0; i < listenerArray.length; ++i) {
+ var listenerObj = listenerArray[i];
+ if (!listenerObj.removed && listenerObj.listener == listener &&
+ listenerObj.capture == !!opt_useCapture &&
+ listenerObj.handler == opt_listenerScope) {
+ return i;
+ }
+ }
+ return -1;
+};
diff --git a/src/http/static/viz/2/goog/fs/url.js b/src/http/static/viz/2/goog/fs/url.js
new file mode 100644
index 0000000..364615e
--- /dev/null
+++ b/src/http/static/viz/2/goog/fs/url.js
@@ -0,0 +1,106 @@
+// Copyright 2015 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Wrapper for URL and its createObjectUrl and revokeObjectUrl
+ * methods that are part of the HTML5 File API.
+ */
+
+goog.provide('goog.fs.url');
+
+
+/**
+ * Creates a blob URL for a blob object.
+ * Throws an error if the browser does not support Object Urls.
+ *
+ * @param {!Blob} blob The object for which to create the URL.
+ * @return {string} The URL for the object.
+ */
+goog.fs.url.createObjectUrl = function(blob) {
+ return goog.fs.url.getUrlObject_().createObjectURL(blob);
+};
+
+
+/**
+ * Revokes a URL created by {@link goog.fs.url.createObjectUrl}.
+ * Throws an error if the browser does not support Object Urls.
+ *
+ * @param {string} url The URL to revoke.
+ */
+goog.fs.url.revokeObjectUrl = function(url) {
+ goog.fs.url.getUrlObject_().revokeObjectURL(url);
+};
+
+
+/**
+ * @typedef {{createObjectURL: (function(!Blob): string),
+ * revokeObjectURL: function(string): void}}
+ */
+goog.fs.url.UrlObject_;
+
+
+/**
+ * Get the object that has the createObjectURL and revokeObjectURL functions for
+ * this browser.
+ *
+ * @return {goog.fs.url.UrlObject_} The object for this browser.
+ * @private
+ */
+goog.fs.url.getUrlObject_ = function() {
+ var urlObject = goog.fs.url.findUrlObject_();
+ if (urlObject != null) {
+ return urlObject;
+ } else {
+ throw Error('This browser doesn\'t seem to support blob URLs');
+ }
+};
+
+
+/**
+ * Finds the object that has the createObjectURL and revokeObjectURL functions
+ * for this browser.
+ *
+ * @return {?goog.fs.url.UrlObject_} The object for this browser or null if the
+ * browser does not support Object Urls.
+ * @private
+ */
+goog.fs.url.findUrlObject_ = function() {
+ // This is what the spec says to do
+ // http://dev.w3.org/2006/webapi/FileAPI/#dfn-createObjectURL
+ if (goog.isDef(goog.global.URL) &&
+ goog.isDef(goog.global.URL.createObjectURL)) {
+ return /** @type {goog.fs.url.UrlObject_} */ (goog.global.URL);
+ // This is what Chrome does (as of 10.0.648.6 dev)
+ } else if (
+ goog.isDef(goog.global.webkitURL) &&
+ goog.isDef(goog.global.webkitURL.createObjectURL)) {
+ return /** @type {goog.fs.url.UrlObject_} */ (goog.global.webkitURL);
+ // This is what the spec used to say to do
+ } else if (goog.isDef(goog.global.createObjectURL)) {
+ return /** @type {goog.fs.url.UrlObject_} */ (goog.global);
+ } else {
+ return null;
+ }
+};
+
+
+/**
+ * Checks whether this browser supports Object Urls. If not, calls to
+ * createObjectUrl and revokeObjectUrl will result in an error.
+ *
+ * @return {boolean} True if this browser supports Object Urls.
+ */
+goog.fs.url.browserSupportsObjectUrls = function() {
+ return goog.fs.url.findUrlObject_() != null;
+};
diff --git a/src/http/static/viz/2/goog/functions/functions.js b/src/http/static/viz/2/goog/functions/functions.js
new file mode 100644
index 0000000..61849e9
--- /dev/null
+++ b/src/http/static/viz/2/goog/functions/functions.js
@@ -0,0 +1,483 @@
+// Copyright 2008 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for creating functions. Loosely inspired by the
+ * java classes: http://goo.gl/GM0Hmu and http://goo.gl/6k7nI8.
+ *
+ * @author nicksantos@google.com (Nick Santos)
+ */
+
+
+goog.provide('goog.functions');
+
+
+/**
+ * Creates a function that always returns the same value.
+ * @param {T} retValue The value to return.
+ * @return {function():T} The new function.
+ * @template T
+ */
+goog.functions.constant = function(retValue) {
+ return function() { return retValue; };
+};
+
+
+/**
+ * Always returns false.
+ * @type {function(...): boolean}
+ */
+goog.functions.FALSE = goog.functions.constant(false);
+
+
+/**
+ * Always returns true.
+ * @type {function(...): boolean}
+ */
+goog.functions.TRUE = goog.functions.constant(true);
+
+
+/**
+ * Always returns NULL.
+ * @type {function(...): null}
+ */
+goog.functions.NULL = goog.functions.constant(null);
+
+
+/**
+ * A simple function that returns the first argument of whatever is passed
+ * into it.
+ * @param {T=} opt_returnValue The single value that will be returned.
+ * @param {...*} var_args Optional trailing arguments. These are ignored.
+ * @return {T} The first argument passed in, or undefined if nothing was passed.
+ * @template T
+ */
+goog.functions.identity = function(opt_returnValue, var_args) {
+ return opt_returnValue;
+};
+
+
+/**
+ * Creates a function that always throws an error with the given message.
+ * @param {string} message The error message.
+ * @return {!Function} The error-throwing function.
+ */
+goog.functions.error = function(message) {
+ return function() { throw Error(message); };
+};
+
+
+/**
+ * Creates a function that throws the given object.
+ * @param {*} err An object to be thrown.
+ * @return {!Function} The error-throwing function.
+ */
+goog.functions.fail = function(err) {
+ return function() { throw err; };
+};
+
+
+/**
+ * Given a function, create a function that keeps opt_numArgs arguments and
+ * silently discards all additional arguments.
+ * @param {Function} f The original function.
+ * @param {number=} opt_numArgs The number of arguments to keep. Defaults to 0.
+ * @return {!Function} A version of f that only keeps the first opt_numArgs
+ * arguments.
+ */
+goog.functions.lock = function(f, opt_numArgs) {
+ opt_numArgs = opt_numArgs || 0;
+ return function() {
+ return f.apply(this, Array.prototype.slice.call(arguments, 0, opt_numArgs));
+ };
+};
+
+
+/**
+ * Creates a function that returns its nth argument.
+ * @param {number} n The position of the return argument.
+ * @return {!Function} A new function.
+ */
+goog.functions.nth = function(n) {
+ return function() { return arguments[n]; };
+};
+
+
+/**
+ * Like goog.partial(), except that arguments are added after arguments to the
+ * returned function.
+ *
+ * Usage:
+ * function f(arg1, arg2, arg3, arg4) { ... }
+ * var g = goog.functions.partialRight(f, arg3, arg4);
+ * g(arg1, arg2);
+ *
+ * @param {!Function} fn A function to partially apply.
+ * @param {...*} var_args Additional arguments that are partially applied to fn
+ * at the end.
+ * @return {!Function} A partially-applied form of the function goog.partial()
+ * was invoked as a method of.
+ */
+goog.functions.partialRight = function(fn, var_args) {
+ var rightArgs = Array.prototype.slice.call(arguments, 1);
+ return function() {
+ var newArgs = Array.prototype.slice.call(arguments);
+ newArgs.push.apply(newArgs, rightArgs);
+ return fn.apply(this, newArgs);
+ };
+};
+
+
+/**
+ * Given a function, create a new function that swallows its return value
+ * and replaces it with a new one.
+ * @param {Function} f A function.
+ * @param {T} retValue A new return value.
+ * @return {function(...?):T} A new function.
+ * @template T
+ */
+goog.functions.withReturnValue = function(f, retValue) {
+ return goog.functions.sequence(f, goog.functions.constant(retValue));
+};
+
+
+/**
+ * Creates a function that returns whether its argument equals the given value.
+ *
+ * Example:
+ * var key = goog.object.findKey(obj, goog.functions.equalTo('needle'));
+ *
+ * @param {*} value The value to compare to.
+ * @param {boolean=} opt_useLooseComparison Whether to use a loose (==)
+ * comparison rather than a strict (===) one. Defaults to false.
+ * @return {function(*):boolean} The new function.
+ */
+goog.functions.equalTo = function(value, opt_useLooseComparison) {
+ return function(other) {
+ return opt_useLooseComparison ? (value == other) : (value === other);
+ };
+};
+
+
+/**
+ * Creates the composition of the functions passed in.
+ * For example, (goog.functions.compose(f, g))(a) is equivalent to f(g(a)).
+ * @param {function(...?):T} fn The final function.
+ * @param {...Function} var_args A list of functions.
+ * @return {function(...?):T} The composition of all inputs.
+ * @template T
+ */
+goog.functions.compose = function(fn, var_args) {
+ var functions = arguments;
+ var length = functions.length;
+ return function() {
+ var result;
+ if (length) {
+ result = functions[length - 1].apply(this, arguments);
+ }
+
+ for (var i = length - 2; i >= 0; i--) {
+ result = functions[i].call(this, result);
+ }
+ return result;
+ };
+};
+
+
+/**
+ * Creates a function that calls the functions passed in in sequence, and
+ * returns the value of the last function. For example,
+ * (goog.functions.sequence(f, g))(x) is equivalent to f(x),g(x).
+ * @param {...Function} var_args A list of functions.
+ * @return {!Function} A function that calls all inputs in sequence.
+ */
+goog.functions.sequence = function(var_args) {
+ var functions = arguments;
+ var length = functions.length;
+ return function() {
+ var result;
+ for (var i = 0; i < length; i++) {
+ result = functions[i].apply(this, arguments);
+ }
+ return result;
+ };
+};
+
+
+/**
+ * Creates a function that returns true if each of its components evaluates
+ * to true. The components are evaluated in order, and the evaluation will be
+ * short-circuited as soon as a function returns false.
+ * For example, (goog.functions.and(f, g))(x) is equivalent to f(x) && g(x).
+ * @param {...Function} var_args A list of functions.
+ * @return {function(...?):boolean} A function that ANDs its component
+ * functions.
+ */
+goog.functions.and = function(var_args) {
+ var functions = arguments;
+ var length = functions.length;
+ return function() {
+ for (var i = 0; i < length; i++) {
+ if (!functions[i].apply(this, arguments)) {
+ return false;
+ }
+ }
+ return true;
+ };
+};
+
+
+/**
+ * Creates a function that returns true if any of its components evaluates
+ * to true. The components are evaluated in order, and the evaluation will be
+ * short-circuited as soon as a function returns true.
+ * For example, (goog.functions.or(f, g))(x) is equivalent to f(x) || g(x).
+ * @param {...Function} var_args A list of functions.
+ * @return {function(...?):boolean} A function that ORs its component
+ * functions.
+ */
+goog.functions.or = function(var_args) {
+ var functions = arguments;
+ var length = functions.length;
+ return function() {
+ for (var i = 0; i < length; i++) {
+ if (functions[i].apply(this, arguments)) {
+ return true;
+ }
+ }
+ return false;
+ };
+};
+
+
+/**
+ * Creates a function that returns the Boolean opposite of a provided function.
+ * For example, (goog.functions.not(f))(x) is equivalent to !f(x).
+ * @param {!Function} f The original function.
+ * @return {function(...?):boolean} A function that delegates to f and returns
+ * opposite.
+ */
+goog.functions.not = function(f) {
+ return function() { return !f.apply(this, arguments); };
+};
+
+
+/**
+ * Generic factory function to construct an object given the constructor
+ * and the arguments. Intended to be bound to create object factories.
+ *
+ * Example:
+ *
+ * var factory = goog.partial(goog.functions.create, Class);
+ *
+ * @param {function(new:T, ...)} constructor The constructor for the Object.
+ * @param {...*} var_args The arguments to be passed to the constructor.
+ * @return {T} A new instance of the class given in {@code constructor}.
+ * @template T
+ */
+goog.functions.create = function(constructor, var_args) {
+ /**
+ * @constructor
+ * @final
+ */
+ var temp = function() {};
+ temp.prototype = constructor.prototype;
+
+ // obj will have constructor's prototype in its chain and
+ // 'obj instanceof constructor' will be true.
+ var obj = new temp();
+
+ // obj is initialized by constructor.
+ // arguments is only array-like so lacks shift(), but can be used with
+ // the Array prototype function.
+ constructor.apply(obj, Array.prototype.slice.call(arguments, 1));
+ return obj;
+};
+
+
+/**
+ * @define {boolean} Whether the return value cache should be used.
+ * This should only be used to disable caches when testing.
+ */
+goog.define('goog.functions.CACHE_RETURN_VALUE', true);
+
+
+/**
+ * Gives a wrapper function that caches the return value of a parameterless
+ * function when first called.
+ *
+ * When called for the first time, the given function is called and its
+ * return value is cached (thus this is only appropriate for idempotent
+ * functions). Subsequent calls will return the cached return value. This
+ * allows the evaluation of expensive functions to be delayed until first used.
+ *
+ * To cache the return values of functions with parameters, see goog.memoize.
+ *
+ * @param {function():T} fn A function to lazily evaluate.
+ * @return {function():T} A wrapped version the function.
+ * @template T
+ */
+goog.functions.cacheReturnValue = function(fn) {
+ var called = false;
+ var value;
+
+ return function() {
+ if (!goog.functions.CACHE_RETURN_VALUE) {
+ return fn();
+ }
+
+ if (!called) {
+ value = fn();
+ called = true;
+ }
+
+ return value;
+ };
+};
+
+
+/**
+ * Wraps a function to allow it to be called, at most, once. All
+ * additional calls are no-ops.
+ *
+ * This is particularly useful for initialization functions
+ * that should be called, at most, once.
+ *
+ * @param {function():*} f Function to call.
+ * @return {function():undefined} Wrapped function.
+ */
+goog.functions.once = function(f) {
+ // Keep a reference to the function that we null out when we're done with
+ // it -- that way, the function can be GC'd when we're done with it.
+ var inner = f;
+ return function() {
+ if (inner) {
+ var tmp = inner;
+ inner = null;
+ tmp();
+ }
+ };
+};
+
+
+/**
+ * Wraps a function to allow it to be called, at most, once per interval
+ * (specified in milliseconds). If the wrapper function is called N times within
+ * that interval, only the Nth call will go through.
+ *
+ * This is particularly useful for batching up repeated actions where the
+ * last action should win. This can be used, for example, for refreshing an
+ * autocomplete pop-up every so often rather than updating with every keystroke,
+ * since the final text typed by the user is the one that should produce the
+ * final autocomplete results. For more stateful debouncing with support for
+ * pausing, resuming, and canceling debounced actions, use {@code
+ * goog.async.Debouncer}.
+ *
+ * @param {function(this:SCOPE, ...?)} f Function to call.
+ * @param {number} interval Interval over which to debounce. The function will
+ * only be called after the full interval has elapsed since the last call.
+ * @param {SCOPE=} opt_scope Object in whose scope to call the function.
+ * @return {function(...?): undefined} Wrapped function.
+ * @template SCOPE
+ */
+goog.functions.debounce = function(f, interval, opt_scope) {
+ var timeout = 0;
+ return /** @type {function(...?)} */ (function(var_args) {
+ goog.global.clearTimeout(timeout);
+ var args = arguments;
+ timeout = goog.global.setTimeout(function() {
+ f.apply(opt_scope, args);
+ }, interval);
+ });
+};
+
+
+/**
+ * Wraps a function to allow it to be called, at most, once per interval
+ * (specified in milliseconds). If the wrapper function is called N times in
+ * that interval, both the 1st and the Nth calls will go through.
+ *
+ * This is particularly useful for limiting repeated user requests where the
+ * the last action should win, but you also don't want to wait until the end of
+ * the interval before sending a request out, as it leads to a perception of
+ * slowness for the user.
+ *
+ * @param {function(this:SCOPE, ...?)} f Function to call.
+ * @param {number} interval Interval over which to throttle. The function can
+ * only be called once per interval.
+ * @param {SCOPE=} opt_scope Object in whose scope to call the function.
+ * @return {function(...?): undefined} Wrapped function.
+ * @template SCOPE
+ */
+goog.functions.throttle = function(f, interval, opt_scope) {
+ var timeout = 0;
+ var shouldFire = false;
+ var args = [];
+
+ var handleTimeout = function() {
+ timeout = 0;
+ if (shouldFire) {
+ shouldFire = false;
+ fire();
+ }
+ };
+
+ var fire = function() {
+ timeout = goog.global.setTimeout(handleTimeout, interval);
+ f.apply(opt_scope, args);
+ };
+
+ return /** @type {function(...?)} */ (function(var_args) {
+ args = arguments;
+ if (!timeout) {
+ fire();
+ } else {
+ shouldFire = true;
+ }
+ });
+};
+
+
+/**
+ * Wraps a function to allow it to be called, at most, once per interval
+ * (specified in milliseconds). If the wrapper function is called N times within
+ * that interval, only the 1st call will go through.
+ *
+ * This is particularly useful for limiting repeated user requests where the
+ * first request is guaranteed to have all the data required to perform the
+ * final action, so there's no need to wait until the end of the interval before
+ * sending the request out.
+ *
+ * @param {function(this:SCOPE, ...?)} f Function to call.
+ * @param {number} interval Interval over which to rate-limit. The function will
+ * only be called once per interval, and ignored for the remainer of the
+ * interval.
+ * @param {SCOPE=} opt_scope Object in whose scope to call the function.
+ * @return {function(...?): undefined} Wrapped function.
+ * @template SCOPE
+ */
+goog.functions.rateLimit = function(f, interval, opt_scope) {
+ var timeout = 0;
+
+ var handleTimeout = function() {
+ timeout = 0;
+ };
+
+ return /** @type {function(...?)} */ (function(var_args) {
+ if (!timeout) {
+ timeout = goog.global.setTimeout(handleTimeout, interval);
+ f.apply(opt_scope, arguments);
+ }
+ });
+};
diff --git a/src/http/static/viz/2/goog/html/safehtml.js b/src/http/static/viz/2/goog/html/safehtml.js
new file mode 100644
index 0000000..4bffbff
--- /dev/null
+++ b/src/http/static/viz/2/goog/html/safehtml.js
@@ -0,0 +1,994 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+/**
+ * @fileoverview The SafeHtml type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.SafeHtml');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom.TagName');
+goog.require('goog.dom.tags');
+goog.require('goog.html.SafeScript');
+goog.require('goog.html.SafeStyle');
+goog.require('goog.html.SafeStyleSheet');
+goog.require('goog.html.SafeUrl');
+goog.require('goog.html.TrustedResourceUrl');
+goog.require('goog.i18n.bidi.Dir');
+goog.require('goog.i18n.bidi.DirectionalString');
+goog.require('goog.labs.userAgent.browser');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A string that is safe to use in HTML context in DOM APIs and HTML documents.
+ *
+ * A SafeHtml is a string-like object that carries the security type contract
+ * that its value as a string will not cause untrusted script execution when
+ * evaluated as HTML in a browser.
+ *
+ * Values of this type are guaranteed to be safe to use in HTML contexts,
+ * such as, assignment to the innerHTML DOM property, or interpolation into
+ * a HTML template in HTML PC_DATA context, in the sense that the use will not
+ * result in a Cross-Site-Scripting vulnerability.
+ *
+ * Instances of this type must be created via the factory methods
+ * ({@code goog.html.SafeHtml.create}, {@code goog.html.SafeHtml.htmlEscape}),
+ * etc and not by invoking its constructor. The constructor intentionally
+ * takes no parameters and the type is immutable; hence only a default instance
+ * corresponding to the empty string can be obtained via constructor invocation.
+ *
+ * @see goog.html.SafeHtml#create
+ * @see goog.html.SafeHtml#htmlEscape
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.i18n.bidi.DirectionalString}
+ * @implements {goog.string.TypedString}
+ */
+goog.html.SafeHtml = function() {
+ /**
+ * The contained value of this SafeHtml. The field has a purposely ugly
+ * name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.SafeHtml#unwrap
+ * @const {!Object}
+ * @private
+ */
+ this.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+
+ /**
+ * This SafeHtml's directionality, or null if unknown.
+ * @private {?goog.i18n.bidi.Dir}
+ */
+ this.dir_ = null;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeHtml.prototype.implementsGoogI18nBidiDirectionalString = true;
+
+
+/** @override */
+goog.html.SafeHtml.prototype.getDirection = function() {
+ return this.dir_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeHtml.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Returns this SafeHtml's value as string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code SafeHtml}, use {@code goog.html.SafeHtml.unwrap} instead of
+ * this method. If in doubt, assume that it's security relevant. In particular,
+ * note that goog.html functions which return a goog.html type do not guarantee
+ * that the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml
+ * // instanceof goog.html.SafeHtml.
+ * </pre>
+ *
+ * @see goog.html.SafeHtml#unwrap
+ * @override
+ */
+goog.html.SafeHtml.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a SafeHtml, use
+ * {@code goog.html.SafeHtml.unwrap}.
+ *
+ * @see goog.html.SafeHtml#unwrap
+ * @override
+ */
+ goog.html.SafeHtml.prototype.toString = function() {
+ return 'SafeHtml{' + this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ +
+ '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a SafeHtml
+ * object, and returns its value.
+ * @param {!goog.html.SafeHtml} safeHtml The object to extract from.
+ * @return {string} The SafeHtml object's contained string, unless the run-time
+ * type check fails. In that case, {@code unwrap} returns an innocuous
+ * string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.SafeHtml.unwrap = function(safeHtml) {
+ // Perform additional run-time type-checking to ensure that safeHtml is indeed
+ // an instance of the expected type. This provides some additional protection
+ // against security bugs due to application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (safeHtml instanceof goog.html.SafeHtml &&
+ safeHtml.constructor === goog.html.SafeHtml &&
+ safeHtml.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return safeHtml.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type SafeHtml, got \'' +
+ safeHtml + '\' of type ' + goog.typeOf(safeHtml));
+ return 'type_error:SafeHtml';
+ }
+};
+
+
+/**
+ * Shorthand for union of types that can sensibly be converted to strings
+ * or might already be SafeHtml (as SafeHtml is a goog.string.TypedString).
+ * @private
+ * @typedef {string|number|boolean|!goog.string.TypedString|
+ * !goog.i18n.bidi.DirectionalString}
+ */
+goog.html.SafeHtml.TextOrHtml_;
+
+
+/**
+ * Returns HTML-escaped text as a SafeHtml object.
+ *
+ * If text is of a type that implements
+ * {@code goog.i18n.bidi.DirectionalString}, the directionality of the new
+ * {@code SafeHtml} object is set to {@code text}'s directionality, if known.
+ * Otherwise, the directionality of the resulting SafeHtml is unknown (i.e.,
+ * {@code null}).
+ *
+ * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If
+ * the parameter is of type SafeHtml it is returned directly (no escaping
+ * is done).
+ * @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.
+ */
+goog.html.SafeHtml.htmlEscape = function(textOrHtml) {
+ if (textOrHtml instanceof goog.html.SafeHtml) {
+ return textOrHtml;
+ }
+ var dir = null;
+ if (textOrHtml.implementsGoogI18nBidiDirectionalString) {
+ dir = textOrHtml.getDirection();
+ }
+ var textAsString;
+ if (textOrHtml.implementsGoogStringTypedString) {
+ textAsString = textOrHtml.getTypedStringValue();
+ } else {
+ textAsString = String(textOrHtml);
+ }
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ goog.string.htmlEscape(textAsString), dir);
+};
+
+
+/**
+ * Returns HTML-escaped text as a SafeHtml object, with newlines changed to
+ * &lt;br&gt;.
+ * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If
+ * the parameter is of type SafeHtml it is returned directly (no escaping
+ * is done).
+ * @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.
+ */
+goog.html.SafeHtml.htmlEscapePreservingNewlines = function(textOrHtml) {
+ if (textOrHtml instanceof goog.html.SafeHtml) {
+ return textOrHtml;
+ }
+ var html = goog.html.SafeHtml.htmlEscape(textOrHtml);
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ goog.string.newLineToBr(goog.html.SafeHtml.unwrap(html)),
+ html.getDirection());
+};
+
+
+/**
+ * Returns HTML-escaped text as a SafeHtml object, with newlines changed to
+ * &lt;br&gt; and escaping whitespace to preserve spatial formatting. Character
+ * entity #160 is used to make it safer for XML.
+ * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If
+ * the parameter is of type SafeHtml it is returned directly (no escaping
+ * is done).
+ * @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.
+ */
+goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces = function(
+ textOrHtml) {
+ if (textOrHtml instanceof goog.html.SafeHtml) {
+ return textOrHtml;
+ }
+ var html = goog.html.SafeHtml.htmlEscape(textOrHtml);
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ goog.string.whitespaceEscape(goog.html.SafeHtml.unwrap(html)),
+ html.getDirection());
+};
+
+
+/**
+ * Coerces an arbitrary object into a SafeHtml object.
+ *
+ * If {@code textOrHtml} is already of type {@code goog.html.SafeHtml}, the same
+ * object is returned. Otherwise, {@code textOrHtml} is coerced to string, and
+ * HTML-escaped. If {@code textOrHtml} is of a type that implements
+ * {@code goog.i18n.bidi.DirectionalString}, its directionality, if known, is
+ * preserved.
+ *
+ * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text or SafeHtml to
+ * coerce.
+ * @return {!goog.html.SafeHtml} The resulting SafeHtml object.
+ * @deprecated Use goog.html.SafeHtml.htmlEscape.
+ */
+goog.html.SafeHtml.from = goog.html.SafeHtml.htmlEscape;
+
+
+/**
+ * @const
+ * @private
+ */
+goog.html.SafeHtml.VALID_NAMES_IN_TAG_ = /^[a-zA-Z0-9-]+$/;
+
+
+/**
+ * Set of attributes containing URL as defined at
+ * http://www.w3.org/TR/html5/index.html#attributes-1.
+ * @private @const {!Object<string,boolean>}
+ */
+goog.html.SafeHtml.URL_ATTRIBUTES_ = goog.object.createSet(
+ 'action', 'cite', 'data', 'formaction', 'href', 'manifest', 'poster',
+ 'src');
+
+
+/**
+ * Tags which are unsupported via create(). They might be supported via a
+ * tag-specific create method. These are tags which might require a
+ * TrustedResourceUrl in one of their attributes or a restricted type for
+ * their content.
+ * @private @const {!Object<string,boolean>}
+ */
+goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_ = goog.object.createSet(
+ goog.dom.TagName.APPLET, goog.dom.TagName.BASE, goog.dom.TagName.EMBED,
+ goog.dom.TagName.IFRAME, goog.dom.TagName.LINK, goog.dom.TagName.MATH,
+ goog.dom.TagName.META, goog.dom.TagName.OBJECT, goog.dom.TagName.SCRIPT,
+ goog.dom.TagName.STYLE, goog.dom.TagName.SVG, goog.dom.TagName.TEMPLATE);
+
+
+/**
+ * @typedef {string|number|goog.string.TypedString|
+ * goog.html.SafeStyle.PropertyMap|undefined}
+ */
+goog.html.SafeHtml.AttributeValue;
+
+
+/**
+ * Creates a SafeHtml content consisting of a tag with optional attributes and
+ * optional content.
+ *
+ * For convenience tag names and attribute names are accepted as regular
+ * strings, instead of goog.string.Const. Nevertheless, you should not pass
+ * user-controlled values to these parameters. Note that these parameters are
+ * syntactically validated at runtime, and invalid values will result in
+ * an exception.
+ *
+ * Example usage:
+ *
+ * goog.html.SafeHtml.create('br');
+ * goog.html.SafeHtml.create('div', {'class': 'a'});
+ * goog.html.SafeHtml.create('p', {}, 'a');
+ * goog.html.SafeHtml.create('p', {}, goog.html.SafeHtml.create('br'));
+ *
+ * goog.html.SafeHtml.create('span', {
+ * 'style': {'margin': '0'}
+ * });
+ *
+ * To guarantee SafeHtml's type contract is upheld there are restrictions on
+ * attribute values and tag names.
+ *
+ * - For attributes which contain script code (on*), a goog.string.Const is
+ * required.
+ * - For attributes which contain style (style), a goog.html.SafeStyle or a
+ * goog.html.SafeStyle.PropertyMap is required.
+ * - For attributes which are interpreted as URLs (e.g. src, href) a
+ * goog.html.SafeUrl, goog.string.Const or string is required. If a string
+ * is passed, it will be sanitized with SafeUrl.sanitize().
+ * - For tags which can load code or set security relevant page metadata,
+ * more specific goog.html.SafeHtml.create*() functions must be used. Tags
+ * which are not supported by this function are applet, base, embed, iframe,
+ * link, math, object, script, style, svg, and template.
+ *
+ * @param {!goog.dom.TagName|string} tagName The name of the tag. Only tag names
+ * consisting of [a-zA-Z0-9-] are allowed. Tag names documented above are
+ * disallowed.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes
+ * the attribute to be omitted.
+ * @param {!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to
+ * HTML-escape and put inside the tag. This must be empty for void tags
+ * like <br>. Array elements are concatenated.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid tag name, attribute name, or attribute value is
+ * provided.
+ * @throws {goog.asserts.AssertionError} If content for void tag is provided.
+ */
+goog.html.SafeHtml.create = function(tagName, opt_attributes, opt_content) {
+ goog.html.SafeHtml.verifyTagName(String(tagName));
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ String(tagName), opt_attributes, opt_content);
+};
+
+
+/**
+ * Verifies if the tag name is valid and if it doesn't change the context.
+ * E.g. STRONG is fine but SCRIPT throws because it changes context. See
+ * goog.html.SafeHtml.create for an explanation of allowed tags.
+ * @param {string} tagName
+ * @throws {Error} If invalid tag name is provided.
+ * @package
+ */
+goog.html.SafeHtml.verifyTagName = function(tagName) {
+ if (!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(tagName)) {
+ throw Error('Invalid tag name <' + tagName + '>.');
+ }
+ if (tagName.toUpperCase() in goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_) {
+ throw Error('Tag name <' + tagName + '> is not allowed for SafeHtml.');
+ }
+};
+
+
+/**
+ * Creates a SafeHtml representing an iframe tag.
+ *
+ * This by default restricts the iframe as much as possible by setting the
+ * sandbox attribute to the empty string. If the iframe requires less
+ * restrictions, set the sandbox attribute as tight as possible, but do not rely
+ * on the sandbox as a security feature because it is not supported by older
+ * browsers. If a sandbox is essential to security (e.g. for third-party
+ * frames), use createSandboxIframe which checks for browser support.
+ *
+ * @see https://developer.mozilla.org/en/docs/Web/HTML/Element/iframe#attr-sandbox
+ *
+ * @param {?goog.html.TrustedResourceUrl=} opt_src The value of the src
+ * attribute. If null or undefined src will not be set.
+ * @param {?goog.html.SafeHtml=} opt_srcdoc The value of the srcdoc attribute.
+ * If null or undefined srcdoc will not be set.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes
+ * the attribute to be omitted.
+ * @param {!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to
+ * HTML-escape and put inside the tag. Array elements are concatenated.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid tag name, attribute name, or attribute value is
+ * provided. If opt_attributes contains the src or srcdoc attributes.
+ */
+goog.html.SafeHtml.createIframe = function(
+ opt_src, opt_srcdoc, opt_attributes, opt_content) {
+ if (opt_src) {
+ // Check whether this is really TrustedResourceUrl.
+ goog.html.TrustedResourceUrl.unwrap(opt_src);
+ }
+
+ var fixedAttributes = {};
+ fixedAttributes['src'] = opt_src || null;
+ fixedAttributes['srcdoc'] =
+ opt_srcdoc && goog.html.SafeHtml.unwrap(opt_srcdoc);
+ var defaultAttributes = {'sandbox': ''};
+ var attributes = goog.html.SafeHtml.combineAttributes(
+ fixedAttributes, defaultAttributes, opt_attributes);
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'iframe', attributes, opt_content);
+};
+
+
+/**
+ * Creates a SafeHtml representing a sandboxed iframe tag.
+ *
+ * The sandbox attribute is enforced in its most restrictive mode, an empty
+ * string. Consequently, the security requirements for the src and srcdoc
+ * attributes are relaxed compared to SafeHtml.createIframe. This function
+ * will throw on browsers that do not support the sandbox attribute, as
+ * determined by SafeHtml.canUseSandboxIframe.
+ *
+ * The SafeHtml returned by this function can trigger downloads with no
+ * user interaction on Chrome (though only a few, further attempts are blocked).
+ * Firefox and IE will block all downloads from the sandbox.
+ *
+ * @see https://developer.mozilla.org/en/docs/Web/HTML/Element/iframe#attr-sandbox
+ * @see https://lists.w3.org/Archives/Public/public-whatwg-archive/2013Feb/0112.html
+ *
+ * @param {string|!goog.html.SafeUrl=} opt_src The value of the src
+ * attribute. If null or undefined src will not be set.
+ * @param {string=} opt_srcdoc The value of the srcdoc attribute.
+ * If null or undefined srcdoc will not be set. Will not be sanitized.
+ * @param {!Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes
+ * the attribute to be omitted.
+ * @param {!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to
+ * HTML-escape and put inside the tag. Array elements are concatenated.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid tag name, attribute name, or attribute value is
+ * provided. If opt_attributes contains the src, srcdoc or sandbox
+ * attributes. If browser does not support the sandbox attribute on iframe.
+ */
+goog.html.SafeHtml.createSandboxIframe = function(
+ opt_src, opt_srcdoc, opt_attributes, opt_content) {
+ if (!goog.html.SafeHtml.canUseSandboxIframe()) {
+ throw new Error('The browser does not support sandboxed iframes.');
+ }
+
+ var fixedAttributes = {};
+ if (opt_src) {
+ // Note that sanitize is a no-op on SafeUrl.
+ fixedAttributes['src'] =
+ goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(opt_src));
+ } else {
+ fixedAttributes['src'] = null;
+ }
+ fixedAttributes['srcdoc'] = opt_srcdoc || null;
+ fixedAttributes['sandbox'] = '';
+ var attributes =
+ goog.html.SafeHtml.combineAttributes(fixedAttributes, {}, opt_attributes);
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'iframe', attributes, opt_content);
+};
+
+
+/**
+ * Checks if the user agent supports sandboxed iframes.
+ * @return {boolean}
+ */
+goog.html.SafeHtml.canUseSandboxIframe = function() {
+ return goog.global['HTMLIFrameElement'] &&
+ ('sandbox' in goog.global['HTMLIFrameElement'].prototype);
+};
+
+
+/**
+ * Creates a SafeHtml representing a script tag with the src attribute.
+ * @param {!goog.html.TrustedResourceUrl} src The value of the src
+ * attribute.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=}
+ * opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined
+ * causes the attribute to be omitted.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid attribute name or value is provided. If
+ * opt_attributes contains the src attribute.
+ */
+goog.html.SafeHtml.createScriptSrc = function(src, opt_attributes) {
+ // TODO(mlourenco): The charset attribute should probably be blocked. If
+ // its value is attacker controlled, the script contains attacker controlled
+ // sub-strings (even if properly escaped) and the server does not set charset
+ // then XSS is likely possible.
+ // https://html.spec.whatwg.org/multipage/scripting.html#dom-script-charset
+
+ // Check whether this is really TrustedResourceUrl.
+ goog.html.TrustedResourceUrl.unwrap(src);
+
+ var fixedAttributes = {'src': src};
+ var defaultAttributes = {};
+ var attributes = goog.html.SafeHtml.combineAttributes(
+ fixedAttributes, defaultAttributes, opt_attributes);
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'script', attributes);
+};
+
+
+/**
+ * Creates a SafeHtml representing a script tag. Does not allow the language,
+ * src, text or type attributes to be set.
+ * @param {!goog.html.SafeScript|!Array<!goog.html.SafeScript>}
+ * script Content to put inside the tag. Array elements are
+ * concatenated.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes
+ * the attribute to be omitted.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid attribute name or attribute value is provided. If
+ * opt_attributes contains the language, src, text or type attribute.
+ */
+goog.html.SafeHtml.createScript = function(script, opt_attributes) {
+ for (var attr in opt_attributes) {
+ var attrLower = attr.toLowerCase();
+ if (attrLower == 'language' || attrLower == 'src' || attrLower == 'text' ||
+ attrLower == 'type') {
+ throw Error('Cannot set "' + attrLower + '" attribute');
+ }
+ }
+
+ var content = '';
+ script = goog.array.concat(script);
+ for (var i = 0; i < script.length; i++) {
+ content += goog.html.SafeScript.unwrap(script[i]);
+ }
+ // Convert to SafeHtml so that it's not HTML-escaped. This is safe because
+ // as part of its contract, SafeScript should have no dangerous '<'.
+ var htmlContent =
+ goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ content, goog.i18n.bidi.Dir.NEUTRAL);
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'script', opt_attributes, htmlContent);
+};
+
+
+/**
+ * Creates a SafeHtml representing a style tag. The type attribute is set
+ * to "text/css".
+ * @param {!goog.html.SafeStyleSheet|!Array<!goog.html.SafeStyleSheet>}
+ * styleSheet Content to put inside the tag. Array elements are
+ * concatenated.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Mapping from attribute names to their values. Only attribute names
+ * consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes
+ * the attribute to be omitted.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ * @throws {Error} If invalid attribute name or attribute value is provided. If
+ * opt_attributes contains the type attribute.
+ */
+goog.html.SafeHtml.createStyle = function(styleSheet, opt_attributes) {
+ var fixedAttributes = {'type': 'text/css'};
+ var defaultAttributes = {};
+ var attributes = goog.html.SafeHtml.combineAttributes(
+ fixedAttributes, defaultAttributes, opt_attributes);
+
+ var content = '';
+ styleSheet = goog.array.concat(styleSheet);
+ for (var i = 0; i < styleSheet.length; i++) {
+ content += goog.html.SafeStyleSheet.unwrap(styleSheet[i]);
+ }
+ // Convert to SafeHtml so that it's not HTML-escaped. This is safe because
+ // as part of its contract, SafeStyleSheet should have no dangerous '<'.
+ var htmlContent =
+ goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ content, goog.i18n.bidi.Dir.NEUTRAL);
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'style', attributes, htmlContent);
+};
+
+
+/**
+ * Creates a SafeHtml representing a meta refresh tag.
+ * @param {!goog.html.SafeUrl|string} url Where to redirect. If a string is
+ * passed, it will be sanitized with SafeUrl.sanitize().
+ * @param {number=} opt_secs Number of seconds until the page should be
+ * reloaded. Will be set to 0 if unspecified.
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ */
+goog.html.SafeHtml.createMetaRefresh = function(url, opt_secs) {
+
+ // Note that sanitize is a no-op on SafeUrl.
+ var unwrappedUrl = goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(url));
+
+ if (goog.labs.userAgent.browser.isIE() ||
+ goog.labs.userAgent.browser.isEdge()) {
+ // IE/EDGE can't parse the content attribute if the url contains a
+ // semicolon. We can fix this by adding quotes around the url, but then we
+ // can't parse quotes in the URL correctly. Also, it seems that IE/EDGE
+ // did not unescape semicolons in these URLs at some point in the past. We
+ // take a best-effort approach.
+ //
+ // If the URL has semicolons (which may happen in some cases, see
+ // http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.2
+ // for instance), wrap it in single quotes to protect the semicolons.
+ // If the URL has semicolons and single quotes, url-encode the single quotes
+ // as well.
+ //
+ // This is imperfect. Notice that both ' and ; are reserved characters in
+ // URIs, so this could do the wrong thing, but at least it will do the wrong
+ // thing in only rare cases.
+ if (goog.string.contains(unwrappedUrl, ';')) {
+ unwrappedUrl = "'" + unwrappedUrl.replace(/'/g, '%27') + "'";
+ }
+ }
+ var attributes = {
+ 'http-equiv': 'refresh',
+ 'content': (opt_secs || 0) + '; url=' + unwrappedUrl
+ };
+
+ // This function will handle the HTML escaping for attributes.
+ return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
+ 'meta', attributes);
+};
+
+
+/**
+ * @param {string} tagName The tag name.
+ * @param {string} name The attribute name.
+ * @param {!goog.html.SafeHtml.AttributeValue} value The attribute value.
+ * @return {string} A "name=value" string.
+ * @throws {Error} If attribute value is unsafe for the given tag and attribute.
+ * @private
+ */
+goog.html.SafeHtml.getAttrNameAndValue_ = function(tagName, name, value) {
+ // If it's goog.string.Const, allow any valid attribute name.
+ if (value instanceof goog.string.Const) {
+ value = goog.string.Const.unwrap(value);
+ } else if (name.toLowerCase() == 'style') {
+ value = goog.html.SafeHtml.getStyleValue_(value);
+ } else if (/^on/i.test(name)) {
+ // TODO(jakubvrana): Disallow more attributes with a special meaning.
+ throw Error(
+ 'Attribute "' + name + '" requires goog.string.Const value, "' + value +
+ '" given.');
+ // URL attributes handled differently according to tag.
+ } else if (name.toLowerCase() in goog.html.SafeHtml.URL_ATTRIBUTES_) {
+ if (value instanceof goog.html.TrustedResourceUrl) {
+ value = goog.html.TrustedResourceUrl.unwrap(value);
+ } else if (value instanceof goog.html.SafeUrl) {
+ value = goog.html.SafeUrl.unwrap(value);
+ } else if (goog.isString(value)) {
+ value = goog.html.SafeUrl.sanitize(value).getTypedStringValue();
+ } else {
+ throw Error(
+ 'Attribute "' + name + '" on tag "' + tagName +
+ '" requires goog.html.SafeUrl, goog.string.Const, or string,' +
+ ' value "' + value + '" given.');
+ }
+ }
+
+ // Accept SafeUrl, TrustedResourceUrl, etc. for attributes which only require
+ // HTML-escaping.
+ if (value.implementsGoogStringTypedString) {
+ // Ok to call getTypedStringValue() since there's no reliance on the type
+ // contract for security here.
+ value = value.getTypedStringValue();
+ }
+
+ goog.asserts.assert(
+ goog.isString(value) || goog.isNumber(value),
+ 'String or number value expected, got ' + (typeof value) +
+ ' with value: ' + value);
+ return name + '="' + goog.string.htmlEscape(String(value)) + '"';
+};
+
+
+/**
+ * Gets value allowed in "style" attribute.
+ * @param {!goog.html.SafeHtml.AttributeValue} value It could be SafeStyle or a
+ * map which will be passed to goog.html.SafeStyle.create.
+ * @return {string} Unwrapped value.
+ * @throws {Error} If string value is given.
+ * @private
+ */
+goog.html.SafeHtml.getStyleValue_ = function(value) {
+ if (!goog.isObject(value)) {
+ throw Error(
+ 'The "style" attribute requires goog.html.SafeStyle or map ' +
+ 'of style properties, ' + (typeof value) + ' given: ' + value);
+ }
+ if (!(value instanceof goog.html.SafeStyle)) {
+ // Process the property bag into a style object.
+ value = goog.html.SafeStyle.create(value);
+ }
+ return goog.html.SafeStyle.unwrap(value);
+};
+
+
+/**
+ * Creates a SafeHtml content with known directionality consisting of a tag with
+ * optional attributes and optional content.
+ * @param {!goog.i18n.bidi.Dir} dir Directionality.
+ * @param {string} tagName
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * @param {!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content
+ * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
+ */
+goog.html.SafeHtml.createWithDir = function(
+ dir, tagName, opt_attributes, opt_content) {
+ var html = goog.html.SafeHtml.create(tagName, opt_attributes, opt_content);
+ html.dir_ = dir;
+ return html;
+};
+
+
+/**
+ * Creates a new SafeHtml object by concatenating values.
+ * @param {...(!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>)} var_args Values to concatenate.
+ * @return {!goog.html.SafeHtml}
+ */
+goog.html.SafeHtml.concat = function(var_args) {
+ var dir = goog.i18n.bidi.Dir.NEUTRAL;
+ var content = '';
+
+ /**
+ * @param {!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>} argument
+ */
+ var addArgument = function(argument) {
+ if (goog.isArray(argument)) {
+ goog.array.forEach(argument, addArgument);
+ } else {
+ var html = goog.html.SafeHtml.htmlEscape(argument);
+ content += goog.html.SafeHtml.unwrap(html);
+ var htmlDir = html.getDirection();
+ if (dir == goog.i18n.bidi.Dir.NEUTRAL) {
+ dir = htmlDir;
+ } else if (htmlDir != goog.i18n.bidi.Dir.NEUTRAL && dir != htmlDir) {
+ dir = null;
+ }
+ }
+ };
+
+ goog.array.forEach(arguments, addArgument);
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ content, dir);
+};
+
+
+/**
+ * Creates a new SafeHtml object with known directionality by concatenating the
+ * values.
+ * @param {!goog.i18n.bidi.Dir} dir Directionality.
+ * @param {...(!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>)} var_args Elements of array
+ * arguments would be processed recursively.
+ * @return {!goog.html.SafeHtml}
+ */
+goog.html.SafeHtml.concatWithDir = function(dir, var_args) {
+ var html = goog.html.SafeHtml.concat(goog.array.slice(arguments, 1));
+ html.dir_ = dir;
+ return html;
+};
+
+
+/**
+ * Type marker for the SafeHtml type, used to implement additional run-time
+ * type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Package-internal utility method to create SafeHtml instances.
+ *
+ * @param {string} html The string to initialize the SafeHtml object with.
+ * @param {?goog.i18n.bidi.Dir} dir The directionality of the SafeHtml to be
+ * constructed, or null if unknown.
+ * @return {!goog.html.SafeHtml} The initialized SafeHtml object.
+ * @package
+ */
+goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse = function(
+ html, dir) {
+ return new goog.html.SafeHtml().initSecurityPrivateDoNotAccessOrElse_(
+ html, dir);
+};
+
+
+/**
+ * Called from createSafeHtmlSecurityPrivateDoNotAccessOrElse(). This
+ * method exists only so that the compiler can dead code eliminate static
+ * fields (like EMPTY) when they're not accessed.
+ * @param {string} html
+ * @param {?goog.i18n.bidi.Dir} dir
+ * @return {!goog.html.SafeHtml}
+ * @private
+ */
+goog.html.SafeHtml.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(
+ html, dir) {
+ this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = html;
+ this.dir_ = dir;
+ return this;
+};
+
+
+/**
+ * Like create() but does not restrict which tags can be constructed.
+ *
+ * @param {string} tagName Tag name. Set or validated by caller.
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * @param {(!goog.html.SafeHtml.TextOrHtml_|
+ * !Array<!goog.html.SafeHtml.TextOrHtml_>)=} opt_content
+ * @return {!goog.html.SafeHtml}
+ * @throws {Error} If invalid or unsafe attribute name or value is provided.
+ * @throws {goog.asserts.AssertionError} If content for void tag is provided.
+ * @package
+ */
+goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse = function(
+ tagName, opt_attributes, opt_content) {
+ var dir = null;
+ var result = '<' + tagName;
+ result += goog.html.SafeHtml.stringifyAttributes(tagName, opt_attributes);
+
+ var content = opt_content;
+ if (!goog.isDefAndNotNull(content)) {
+ content = [];
+ } else if (!goog.isArray(content)) {
+ content = [content];
+ }
+
+ if (goog.dom.tags.isVoidTag(tagName.toLowerCase())) {
+ goog.asserts.assert(
+ !content.length, 'Void tag <' + tagName + '> does not allow content.');
+ result += '>';
+ } else {
+ var html = goog.html.SafeHtml.concat(content);
+ result += '>' + goog.html.SafeHtml.unwrap(html) + '</' + tagName + '>';
+ dir = html.getDirection();
+ }
+
+ var dirAttribute = opt_attributes && opt_attributes['dir'];
+ if (dirAttribute) {
+ if (/^(ltr|rtl|auto)$/i.test(dirAttribute)) {
+ // If the tag has the "dir" attribute specified then its direction is
+ // neutral because it can be safely used in any context.
+ dir = goog.i18n.bidi.Dir.NEUTRAL;
+ } else {
+ dir = null;
+ }
+ }
+
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ result, dir);
+};
+
+
+/**
+ * Creates a string with attributes to insert after tagName.
+ * @param {string} tagName
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * @return {string} Returns an empty string if there are no attributes, returns
+ * a string starting with a space otherwise.
+ * @throws {Error} If attribute value is unsafe for the given tag and attribute.
+ * @package
+ */
+goog.html.SafeHtml.stringifyAttributes = function(tagName, opt_attributes) {
+ var result = '';
+ if (opt_attributes) {
+ for (var name in opt_attributes) {
+ if (!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(name)) {
+ throw Error('Invalid attribute name "' + name + '".');
+ }
+ var value = opt_attributes[name];
+ if (!goog.isDefAndNotNull(value)) {
+ continue;
+ }
+ result +=
+ ' ' + goog.html.SafeHtml.getAttrNameAndValue_(tagName, name, value);
+ }
+ }
+ return result;
+};
+
+
+/**
+ * @param {!Object<string, ?goog.html.SafeHtml.AttributeValue>} fixedAttributes
+ * @param {!Object<string, string>} defaultAttributes
+ * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes
+ * Optional attributes passed to create*().
+ * @return {!Object<string, ?goog.html.SafeHtml.AttributeValue>}
+ * @throws {Error} If opt_attributes contains an attribute with the same name
+ * as an attribute in fixedAttributes.
+ * @package
+ */
+goog.html.SafeHtml.combineAttributes = function(
+ fixedAttributes, defaultAttributes, opt_attributes) {
+ var combinedAttributes = {};
+ var name;
+
+ for (name in fixedAttributes) {
+ goog.asserts.assert(name.toLowerCase() == name, 'Must be lower case');
+ combinedAttributes[name] = fixedAttributes[name];
+ }
+ for (name in defaultAttributes) {
+ goog.asserts.assert(name.toLowerCase() == name, 'Must be lower case');
+ combinedAttributes[name] = defaultAttributes[name];
+ }
+
+ for (name in opt_attributes) {
+ var nameLower = name.toLowerCase();
+ if (nameLower in fixedAttributes) {
+ throw Error(
+ 'Cannot override "' + nameLower + '" attribute, got "' + name +
+ '" with value "' + opt_attributes[name] + '"');
+ }
+ if (nameLower in defaultAttributes) {
+ delete combinedAttributes[nameLower];
+ }
+ combinedAttributes[name] = opt_attributes[name];
+ }
+
+ return combinedAttributes;
+};
+
+
+/**
+ * A SafeHtml instance corresponding to the HTML doctype: "<!DOCTYPE html>".
+ * @const {!goog.html.SafeHtml}
+ */
+goog.html.SafeHtml.DOCTYPE_HTML =
+ goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ '<!DOCTYPE html>', goog.i18n.bidi.Dir.NEUTRAL);
+
+
+/**
+ * A SafeHtml instance corresponding to the empty string.
+ * @const {!goog.html.SafeHtml}
+ */
+goog.html.SafeHtml.EMPTY =
+ goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ '', goog.i18n.bidi.Dir.NEUTRAL);
+
+
+/**
+ * A SafeHtml instance corresponding to the <br> tag.
+ * @const {!goog.html.SafeHtml}
+ */
+goog.html.SafeHtml.BR =
+ goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ '<br>', goog.i18n.bidi.Dir.NEUTRAL);
diff --git a/src/http/static/viz/2/goog/html/safescript.js b/src/http/static/viz/2/goog/html/safescript.js
new file mode 100644
index 0000000..7a945eb
--- /dev/null
+++ b/src/http/static/viz/2/goog/html/safescript.js
@@ -0,0 +1,234 @@
+// Copyright 2014 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview The SafeScript type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.SafeScript');
+
+goog.require('goog.asserts');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A string-like object which represents JavaScript code and that carries the
+ * security type contract that its value, as a string, will not cause execution
+ * of unconstrained attacker controlled code (XSS) when evaluated as JavaScript
+ * in a browser.
+ *
+ * Instances of this type must be created via the factory method
+ * {@code goog.html.SafeScript.fromConstant} and not by invoking its
+ * constructor. The constructor intentionally takes no parameters and the type
+ * is immutable; hence only a default instance corresponding to the empty string
+ * can be obtained via constructor invocation.
+ *
+ * A SafeScript's string representation can safely be interpolated as the
+ * content of a script element within HTML. The SafeScript string should not be
+ * escaped before interpolation.
+ *
+ * Note that the SafeScript might contain text that is attacker-controlled but
+ * that text should have been interpolated with appropriate escaping,
+ * sanitization and/or validation into the right location in the script, such
+ * that it is highly constrained in its effect (for example, it had to match a
+ * set of whitelisted words).
+ *
+ * A SafeScript can be constructed via security-reviewed unchecked
+ * conversions. In this case producers of SafeScript must ensure themselves that
+ * the SafeScript does not contain unsafe script. Note in particular that
+ * {@code &lt;} is dangerous, even when inside JavaScript strings, and so should
+ * always be forbidden or JavaScript escaped in user controlled input. For
+ * example, if {@code &lt;/script&gt;&lt;script&gt;evil&lt;/script&gt;"} were
+ * interpolated inside a JavaScript string, it would break out of the context
+ * of the original script element and {@code evil} would execute. Also note
+ * that within an HTML script (raw text) element, HTML character references,
+ * such as "&lt;" are not allowed. See
+ * http://www.w3.org/TR/html5/scripting-1.html#restrictions-for-contents-of-script-elements.
+ *
+ * @see goog.html.SafeScript#fromConstant
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.string.TypedString}
+ */
+goog.html.SafeScript = function() {
+ /**
+ * The contained value of this SafeScript. The field has a purposely
+ * ugly name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseSafeScriptWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.SafeScript#unwrap
+ * @const {!Object}
+ * @private
+ */
+ this.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeScript.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Type marker for the SafeScript type, used to implement additional
+ * run-time type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Creates a SafeScript object from a compile-time constant string.
+ *
+ * @param {!goog.string.Const} script A compile-time-constant string from which
+ * to create a SafeScript.
+ * @return {!goog.html.SafeScript} A SafeScript object initialized to
+ * {@code script}.
+ */
+goog.html.SafeScript.fromConstant = function(script) {
+ var scriptString = goog.string.Const.unwrap(script);
+ if (scriptString.length === 0) {
+ return goog.html.SafeScript.EMPTY;
+ }
+ return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(
+ scriptString);
+};
+
+
+/**
+ * Returns this SafeScript's value as a string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code SafeScript}, use {@code goog.html.SafeScript.unwrap} instead of
+ * this method. If in doubt, assume that it's security relevant. In particular,
+ * note that goog.html functions which return a goog.html type do not guarantee
+ * the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml
+ * // instanceof goog.html.SafeHtml.
+ * </pre>
+ *
+ * @see goog.html.SafeScript#unwrap
+ * @override
+ */
+goog.html.SafeScript.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseSafeScriptWrappedValue_;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a SafeScript, use
+ * {@code goog.html.SafeScript.unwrap}.
+ *
+ * @see goog.html.SafeScript#unwrap
+ * @override
+ */
+ goog.html.SafeScript.prototype.toString = function() {
+ return 'SafeScript{' +
+ this.privateDoNotAccessOrElseSafeScriptWrappedValue_ + '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a
+ * SafeScript object, and returns its value.
+ *
+ * @param {!goog.html.SafeScript} safeScript The object to extract from.
+ * @return {string} The safeScript object's contained string, unless
+ * the run-time type check fails. In that case, {@code unwrap} returns an
+ * innocuous string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.SafeScript.unwrap = function(safeScript) {
+ // Perform additional Run-time type-checking to ensure that
+ // safeScript is indeed an instance of the expected type. This
+ // provides some additional protection against security bugs due to
+ // application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (safeScript instanceof goog.html.SafeScript &&
+ safeScript.constructor === goog.html.SafeScript &&
+ safeScript.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return safeScript.privateDoNotAccessOrElseSafeScriptWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type SafeScript, got \'' +
+ safeScript + '\' of type ' + goog.typeOf(safeScript));
+ return 'type_error:SafeScript';
+ }
+};
+
+
+/**
+ * Package-internal utility method to create SafeScript instances.
+ *
+ * @param {string} script The string to initialize the SafeScript object with.
+ * @return {!goog.html.SafeScript} The initialized SafeScript object.
+ * @package
+ */
+goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse =
+ function(script) {
+ return new goog.html.SafeScript().initSecurityPrivateDoNotAccessOrElse_(
+ script);
+};
+
+
+/**
+ * Called from createSafeScriptSecurityPrivateDoNotAccessOrElse(). This
+ * method exists only so that the compiler can dead code eliminate static
+ * fields (like EMPTY) when they're not accessed.
+ * @param {string} script
+ * @return {!goog.html.SafeScript}
+ * @private
+ */
+goog.html.SafeScript.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(
+ script) {
+ this.privateDoNotAccessOrElseSafeScriptWrappedValue_ = script;
+ return this;
+};
+
+
+/**
+ * A SafeScript instance corresponding to the empty string.
+ * @const {!goog.html.SafeScript}
+ */
+goog.html.SafeScript.EMPTY =
+ goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse('');
diff --git a/src/http/static/viz/2/goog/html/safestyle.js b/src/http/static/viz/2/goog/html/safestyle.js
new file mode 100644
index 0000000..506a475
--- /dev/null
+++ b/src/http/static/viz/2/goog/html/safestyle.js
@@ -0,0 +1,560 @@
+// Copyright 2014 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview The SafeStyle type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.SafeStyle');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.html.SafeUrl');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A string-like object which represents a sequence of CSS declarations
+ * ({@code propertyName1: propertyvalue1; propertyName2: propertyValue2; ...})
+ * and that carries the security type contract that its value, as a string,
+ * will not cause untrusted script execution (XSS) when evaluated as CSS in a
+ * browser.
+ *
+ * Instances of this type must be created via the factory methods
+ * ({@code goog.html.SafeStyle.create} or
+ * {@code goog.html.SafeStyle.fromConstant}) and not by invoking its
+ * constructor. The constructor intentionally takes no parameters and the type
+ * is immutable; hence only a default instance corresponding to the empty string
+ * can be obtained via constructor invocation.
+ *
+ * SafeStyle's string representation can safely be:
+ * <ul>
+ * <li>Interpolated as the content of a *quoted* HTML style attribute.
+ * However, the SafeStyle string *must be HTML-attribute-escaped* before
+ * interpolation.
+ * <li>Interpolated as the content of a {}-wrapped block within a stylesheet.
+ * '<' characters in the SafeStyle string *must be CSS-escaped* before
+ * interpolation. The SafeStyle string is also guaranteed not to be able
+ * to introduce new properties or elide existing ones.
+ * <li>Interpolated as the content of a {}-wrapped block within an HTML
+ * <style> element. '<' characters in the SafeStyle string
+ * *must be CSS-escaped* before interpolation.
+ * <li>Assigned to the style property of a DOM node. The SafeStyle string
+ * should not be escaped before being assigned to the property.
+ * </ul>
+ *
+ * A SafeStyle may never contain literal angle brackets. Otherwise, it could
+ * be unsafe to place a SafeStyle into a &lt;style&gt; tag (where it can't
+ * be HTML escaped). For example, if the SafeStyle containing
+ * "{@code font: 'foo &lt;style/&gt;&lt;script&gt;evil&lt;/script&gt;'}" were
+ * interpolated within a &lt;style&gt; tag, this would then break out of the
+ * style context into HTML.
+ *
+ * A SafeStyle may contain literal single or double quotes, and as such the
+ * entire style string must be escaped when used in a style attribute (if
+ * this were not the case, the string could contain a matching quote that
+ * would escape from the style attribute).
+ *
+ * Values of this type must be composable, i.e. for any two values
+ * {@code style1} and {@code style2} of this type,
+ * {@code goog.html.SafeStyle.unwrap(style1) +
+ * goog.html.SafeStyle.unwrap(style2)} must itself be a value that satisfies
+ * the SafeStyle type constraint. This requirement implies that for any value
+ * {@code style} of this type, {@code goog.html.SafeStyle.unwrap(style)} must
+ * not end in a "property value" or "property name" context. For example,
+ * a value of {@code background:url("} or {@code font-} would not satisfy the
+ * SafeStyle contract. This is because concatenating such strings with a
+ * second value that itself does not contain unsafe CSS can result in an
+ * overall string that does. For example, if {@code javascript:evil())"} is
+ * appended to {@code background:url("}, the resulting string may result in
+ * the execution of a malicious script.
+ *
+ * TODO(mlourenco): Consider whether we should implement UTF-8 interchange
+ * validity checks and blacklisting of newlines (including Unicode ones) and
+ * other whitespace characters (\t, \f). Document here if so and also update
+ * SafeStyle.fromConstant().
+ *
+ * The following example values comply with this type's contract:
+ * <ul>
+ * <li><pre>width: 1em;</pre>
+ * <li><pre>height:1em;</pre>
+ * <li><pre>width: 1em;height: 1em;</pre>
+ * <li><pre>background:url('http://url');</pre>
+ * </ul>
+ * In addition, the empty string is safe for use in a CSS attribute.
+ *
+ * The following example values do NOT comply with this type's contract:
+ * <ul>
+ * <li><pre>background: red</pre> (missing a trailing semi-colon)
+ * <li><pre>background:</pre> (missing a value and a trailing semi-colon)
+ * <li><pre>1em</pre> (missing an attribute name, which provides context for
+ * the value)
+ * </ul>
+ *
+ * @see goog.html.SafeStyle#create
+ * @see goog.html.SafeStyle#fromConstant
+ * @see http://www.w3.org/TR/css3-syntax/
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.string.TypedString}
+ */
+goog.html.SafeStyle = function() {
+ /**
+ * The contained value of this SafeStyle. The field has a purposely
+ * ugly name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseSafeStyleWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.SafeStyle#unwrap
+ * @const {!Object}
+ * @private
+ */
+ this.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeStyle.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Type marker for the SafeStyle type, used to implement additional
+ * run-time type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Creates a SafeStyle object from a compile-time constant string.
+ *
+ * {@code style} should be in the format
+ * {@code name: value; [name: value; ...]} and must not have any < or >
+ * characters in it. This is so that SafeStyle's contract is preserved,
+ * allowing the SafeStyle to correctly be interpreted as a sequence of CSS
+ * declarations and without affecting the syntactic structure of any
+ * surrounding CSS and HTML.
+ *
+ * This method performs basic sanity checks on the format of {@code style}
+ * but does not constrain the format of {@code name} and {@code value}, except
+ * for disallowing tag characters.
+ *
+ * @param {!goog.string.Const} style A compile-time-constant string from which
+ * to create a SafeStyle.
+ * @return {!goog.html.SafeStyle} A SafeStyle object initialized to
+ * {@code style}.
+ */
+goog.html.SafeStyle.fromConstant = function(style) {
+ var styleString = goog.string.Const.unwrap(style);
+ if (styleString.length === 0) {
+ return goog.html.SafeStyle.EMPTY;
+ }
+ goog.html.SafeStyle.checkStyle_(styleString);
+ goog.asserts.assert(
+ goog.string.endsWith(styleString, ';'),
+ 'Last character of style string is not \';\': ' + styleString);
+ goog.asserts.assert(
+ goog.string.contains(styleString, ':'),
+ 'Style string must contain at least one \':\', to ' +
+ 'specify a "name: value" pair: ' + styleString);
+ return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(
+ styleString);
+};
+
+
+/**
+ * Checks if the style definition is valid.
+ * @param {string} style
+ * @private
+ */
+goog.html.SafeStyle.checkStyle_ = function(style) {
+ goog.asserts.assert(
+ !/[<>]/.test(style), 'Forbidden characters in style string: ' + style);
+};
+
+
+/**
+ * Returns this SafeStyle's value as a string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code SafeStyle}, use {@code goog.html.SafeStyle.unwrap} instead of
+ * this method. If in doubt, assume that it's security relevant. In particular,
+ * note that goog.html functions which return a goog.html type do not guarantee
+ * the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml
+ * // instanceof goog.html.SafeHtml.
+ * </pre>
+ *
+ * @see goog.html.SafeStyle#unwrap
+ * @override
+ */
+goog.html.SafeStyle.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseSafeStyleWrappedValue_;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a SafeStyle, use
+ * {@code goog.html.SafeStyle.unwrap}.
+ *
+ * @see goog.html.SafeStyle#unwrap
+ * @override
+ */
+ goog.html.SafeStyle.prototype.toString = function() {
+ return 'SafeStyle{' + this.privateDoNotAccessOrElseSafeStyleWrappedValue_ +
+ '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a
+ * SafeStyle object, and returns its value.
+ *
+ * @param {!goog.html.SafeStyle} safeStyle The object to extract from.
+ * @return {string} The safeStyle object's contained string, unless
+ * the run-time type check fails. In that case, {@code unwrap} returns an
+ * innocuous string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.SafeStyle.unwrap = function(safeStyle) {
+ // Perform additional Run-time type-checking to ensure that
+ // safeStyle is indeed an instance of the expected type. This
+ // provides some additional protection against security bugs due to
+ // application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (safeStyle instanceof goog.html.SafeStyle &&
+ safeStyle.constructor === goog.html.SafeStyle &&
+ safeStyle.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return safeStyle.privateDoNotAccessOrElseSafeStyleWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type SafeStyle, got \'' +
+ safeStyle + '\' of type ' + goog.typeOf(safeStyle));
+ return 'type_error:SafeStyle';
+ }
+};
+
+
+/**
+ * Package-internal utility method to create SafeStyle instances.
+ *
+ * @param {string} style The string to initialize the SafeStyle object with.
+ * @return {!goog.html.SafeStyle} The initialized SafeStyle object.
+ * @package
+ */
+goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse = function(
+ style) {
+ return new goog.html.SafeStyle().initSecurityPrivateDoNotAccessOrElse_(style);
+};
+
+
+/**
+ * Called from createSafeStyleSecurityPrivateDoNotAccessOrElse(). This
+ * method exists only so that the compiler can dead code eliminate static
+ * fields (like EMPTY) when they're not accessed.
+ * @param {string} style
+ * @return {!goog.html.SafeStyle}
+ * @private
+ */
+goog.html.SafeStyle.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(
+ style) {
+ this.privateDoNotAccessOrElseSafeStyleWrappedValue_ = style;
+ return this;
+};
+
+
+/**
+ * A SafeStyle instance corresponding to the empty string.
+ * @const {!goog.html.SafeStyle}
+ */
+goog.html.SafeStyle.EMPTY =
+ goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse('');
+
+
+/**
+ * The innocuous string generated by goog.html.SafeStyle.create when passed
+ * an unsafe value.
+ * @const {string}
+ */
+goog.html.SafeStyle.INNOCUOUS_STRING = 'zClosurez';
+
+
+/**
+ * A single property value.
+ * @typedef {string|!goog.string.Const|!goog.html.SafeUrl}
+ */
+goog.html.SafeStyle.PropertyValue;
+
+
+/**
+ * Mapping of property names to their values.
+ * We don't support numbers even though some values might be numbers (e.g.
+ * line-height or 0 for any length). The reason is that most numeric values need
+ * units (e.g. '1px') and allowing numbers could cause users forgetting about
+ * them.
+ * @typedef {!Object<string, ?goog.html.SafeStyle.PropertyValue|
+ * ?Array<!goog.html.SafeStyle.PropertyValue>>}
+ */
+goog.html.SafeStyle.PropertyMap;
+
+
+/**
+ * Creates a new SafeStyle object from the properties specified in the map.
+ * @param {goog.html.SafeStyle.PropertyMap} map Mapping of property names to
+ * their values, for example {'margin': '1px'}. Names must consist of
+ * [-_a-zA-Z0-9]. Values might be strings consisting of
+ * [-,.'"%_!# a-zA-Z0-9], where " and ' must be properly balanced. We also
+ * allow simple functions like rgb() and url() which sanitizes its contents.
+ * Other values must be wrapped in goog.string.Const. URLs might be passed
+ * as goog.html.SafeUrl which will be wrapped into url(""). We also support
+ * array whose elements are joined with ' '. Null value causes skipping the
+ * property.
+ * @return {!goog.html.SafeStyle}
+ * @throws {Error} If invalid name is provided.
+ * @throws {goog.asserts.AssertionError} If invalid value is provided. With
+ * disabled assertions, invalid value is replaced by
+ * goog.html.SafeStyle.INNOCUOUS_STRING.
+ */
+goog.html.SafeStyle.create = function(map) {
+ var style = '';
+ for (var name in map) {
+ if (!/^[-_a-zA-Z0-9]+$/.test(name)) {
+ throw Error('Name allows only [-_a-zA-Z0-9], got: ' + name);
+ }
+ var value = map[name];
+ if (value == null) {
+ continue;
+ }
+ if (goog.isArray(value)) {
+ value = goog.array.map(value, goog.html.SafeStyle.sanitizePropertyValue_)
+ .join(' ');
+ } else {
+ value = goog.html.SafeStyle.sanitizePropertyValue_(value);
+ }
+ style += name + ':' + value + ';';
+ }
+ if (!style) {
+ return goog.html.SafeStyle.EMPTY;
+ }
+ goog.html.SafeStyle.checkStyle_(style);
+ return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(
+ style);
+};
+
+
+/**
+ * Checks and converts value to string.
+ * @param {!goog.html.SafeStyle.PropertyValue} value
+ * @return {string}
+ * @private
+ */
+goog.html.SafeStyle.sanitizePropertyValue_ = function(value) {
+ if (value instanceof goog.html.SafeUrl) {
+ var url = goog.html.SafeUrl.unwrap(value);
+ return 'url("' + url.replace(/</g, '%3c').replace(/[\\"]/g, '\\$&') + '")';
+ }
+ var result = value instanceof goog.string.Const ?
+ goog.string.Const.unwrap(value) :
+ goog.html.SafeStyle.sanitizePropertyValueString_(String(value));
+ // These characters can be used to change context and we don't want that even
+ // with const values.
+ goog.asserts.assert(!/[{;}]/.test(result), 'Value does not allow [{;}].');
+ return result;
+};
+
+
+/**
+ * Checks string value.
+ * @param {string} value
+ * @return {string}
+ * @private
+ */
+goog.html.SafeStyle.sanitizePropertyValueString_ = function(value) {
+ var valueWithoutFunctions =
+ value.replace(goog.html.SafeUrl.FUNCTIONS_RE_, '$1')
+ .replace(goog.html.SafeUrl.URL_RE_, 'url');
+ if (!goog.html.SafeStyle.VALUE_RE_.test(valueWithoutFunctions)) {
+ goog.asserts.fail(
+ 'String value allows only ' + goog.html.SafeStyle.VALUE_ALLOWED_CHARS_ +
+ ' and simple functions, got: ' + value);
+ return goog.html.SafeStyle.INNOCUOUS_STRING;
+ } else if (!goog.html.SafeStyle.hasBalancedQuotes_(value)) {
+ goog.asserts.fail('String value requires balanced quotes, got: ' + value);
+ return goog.html.SafeStyle.INNOCUOUS_STRING;
+ }
+ return goog.html.SafeStyle.sanitizeUrl_(value);
+};
+
+
+/**
+ * Checks that quotes (" and ') are properly balanced inside a string. Assumes
+ * that neither escape (\) nor any other character that could result in
+ * breaking out of a string parsing context are allowed;
+ * see http://www.w3.org/TR/css3-syntax/#string-token-diagram.
+ * @param {string} value Untrusted CSS property value.
+ * @return {boolean} True if property value is safe with respect to quote
+ * balancedness.
+ * @private
+ */
+goog.html.SafeStyle.hasBalancedQuotes_ = function(value) {
+ var outsideSingle = true;
+ var outsideDouble = true;
+ for (var i = 0; i < value.length; i++) {
+ var c = value.charAt(i);
+ if (c == "'" && outsideDouble) {
+ outsideSingle = !outsideSingle;
+ } else if (c == '"' && outsideSingle) {
+ outsideDouble = !outsideDouble;
+ }
+ }
+ return outsideSingle && outsideDouble;
+};
+
+
+/**
+ * Characters allowed in goog.html.SafeStyle.VALUE_RE_.
+ * @private {string}
+ */
+goog.html.SafeStyle.VALUE_ALLOWED_CHARS_ = '[-,."\'%_!# a-zA-Z0-9]';
+
+
+/**
+ * Regular expression for safe values.
+ *
+ * Quotes (" and ') are allowed, but a check must be done elsewhere to ensure
+ * they're balanced.
+ *
+ * ',' allows multiple values to be assigned to the same property
+ * (e.g. background-attachment or font-family) and hence could allow
+ * multiple values to get injected, but that should pose no risk of XSS.
+ *
+ * The expression checks only for XSS safety, not for CSS validity.
+ * @const {!RegExp}
+ * @private
+ */
+goog.html.SafeStyle.VALUE_RE_ =
+ new RegExp('^' + goog.html.SafeStyle.VALUE_ALLOWED_CHARS_ + '+$');
+
+
+/**
+ * Regular expression for url(). We support URLs allowed by
+ * https://www.w3.org/TR/css-syntax-3/#url-token-diagram without using escape
+ * sequences. Use percent-encoding if you need to use special characters like
+ * backslash.
+ * @private @const {!RegExp}
+ */
+goog.html.SafeUrl.URL_RE_ = new RegExp(
+ '\\b(url\\([ \t\n]*)(' +
+ '\'[ -&(-\\[\\]-~]*\'' + // Printable characters except ' and \.
+ '|"[ !#-\\[\\]-~]*"' + // Printable characters except " and \.
+ '|[!#-&*-\\[\\]-~]*' + // Printable characters except [ "'()\\].
+ ')([ \t\n]*\\))',
+ 'g');
+
+
+/**
+ * Regular expression for simple functions.
+ * @private @const {!RegExp}
+ */
+goog.html.SafeUrl.FUNCTIONS_RE_ = new RegExp(
+ '\\b(hsl|hsla|rgb|rgba|(rotate|scale|translate)(X|Y|Z|3d)?)' +
+ '\\([-0-9a-z.%, ]+\\)',
+ 'g');
+
+
+/**
+ * Sanitize URLs inside url().
+ *
+ * NOTE: We could also consider using CSS.escape once that's available in the
+ * browsers. However, loosely matching URL e.g. with url\(.*\) and then escaping
+ * the contents would result in a slightly different language than CSS leading
+ * to confusion of users. E.g. url(")") is valid in CSS but it would be invalid
+ * as seen by our parser. On the other hand, url(\) is invalid in CSS but our
+ * parser would be fine with it.
+ *
+ * @param {string} value Untrusted CSS property value.
+ * @return {string}
+ * @private
+ */
+goog.html.SafeStyle.sanitizeUrl_ = function(value) {
+ return value.replace(
+ goog.html.SafeUrl.URL_RE_, function(match, before, url, after) {
+ var quote = '';
+ url = url.replace(/^(['"])(.*)\1$/, function(match, start, inside) {
+ quote = start;
+ return inside;
+ });
+ var sanitized = goog.html.SafeUrl.sanitize(url).getTypedStringValue();
+ return before + quote + sanitized + quote + after;
+ });
+};
+
+
+/**
+ * Creates a new SafeStyle object by concatenating the values.
+ * @param {...(!goog.html.SafeStyle|!Array<!goog.html.SafeStyle>)} var_args
+ * SafeStyles to concatenate.
+ * @return {!goog.html.SafeStyle}
+ */
+goog.html.SafeStyle.concat = function(var_args) {
+ var style = '';
+
+ /**
+ * @param {!goog.html.SafeStyle|!Array<!goog.html.SafeStyle>} argument
+ */
+ var addArgument = function(argument) {
+ if (goog.isArray(argument)) {
+ goog.array.forEach(argument, addArgument);
+ } else {
+ style += goog.html.SafeStyle.unwrap(argument);
+ }
+ };
+
+ goog.array.forEach(arguments, addArgument);
+ if (!style) {
+ return goog.html.SafeStyle.EMPTY;
+ }
+ return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(
+ style);
+};
diff --git a/src/http/static/viz/2/goog/html/safestylesheet.js b/src/http/static/viz/2/goog/html/safestylesheet.js
new file mode 100644
index 0000000..cdd9e31
--- /dev/null
+++ b/src/http/static/viz/2/goog/html/safestylesheet.js
@@ -0,0 +1,344 @@
+// Copyright 2014 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview The SafeStyleSheet type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.SafeStyleSheet');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.html.SafeStyle');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A string-like object which represents a CSS style sheet and that carries the
+ * security type contract that its value, as a string, will not cause untrusted
+ * script execution (XSS) when evaluated as CSS in a browser.
+ *
+ * Instances of this type must be created via the factory method
+ * {@code goog.html.SafeStyleSheet.fromConstant} and not by invoking its
+ * constructor. The constructor intentionally takes no parameters and the type
+ * is immutable; hence only a default instance corresponding to the empty string
+ * can be obtained via constructor invocation.
+ *
+ * A SafeStyleSheet's string representation can safely be interpolated as the
+ * content of a style element within HTML. The SafeStyleSheet string should
+ * not be escaped before interpolation.
+ *
+ * Values of this type must be composable, i.e. for any two values
+ * {@code styleSheet1} and {@code styleSheet2} of this type,
+ * {@code goog.html.SafeStyleSheet.unwrap(styleSheet1) +
+ * goog.html.SafeStyleSheet.unwrap(styleSheet2)} must itself be a value that
+ * satisfies the SafeStyleSheet type constraint. This requirement implies that
+ * for any value {@code styleSheet} of this type,
+ * {@code goog.html.SafeStyleSheet.unwrap(styleSheet1)} must end in
+ * "beginning of rule" context.
+
+ * A SafeStyleSheet can be constructed via security-reviewed unchecked
+ * conversions. In this case producers of SafeStyleSheet must ensure themselves
+ * that the SafeStyleSheet does not contain unsafe script. Note in particular
+ * that {@code &lt;} is dangerous, even when inside CSS strings, and so should
+ * always be forbidden or CSS-escaped in user controlled input. For example, if
+ * {@code &lt;/style&gt;&lt;script&gt;evil&lt;/script&gt;"} were interpolated
+ * inside a CSS string, it would break out of the context of the original
+ * style element and {@code evil} would execute. Also note that within an HTML
+ * style (raw text) element, HTML character references, such as
+ * {@code &amp;lt;}, are not allowed. See
+ *
+ http://www.w3.org/TR/html5/scripting-1.html#restrictions-for-contents-of-script-elements
+ * (similar considerations apply to the style element).
+ *
+ * @see goog.html.SafeStyleSheet#fromConstant
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.string.TypedString}
+ */
+goog.html.SafeStyleSheet = function() {
+ /**
+ * The contained value of this SafeStyleSheet. The field has a purposely
+ * ugly name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.SafeStyleSheet#unwrap
+ * @const {!Object}
+ * @private
+ */
+ this.SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeStyleSheet.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Type marker for the SafeStyleSheet type, used to implement additional
+ * run-time type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Creates a style sheet consisting of one selector and one style definition.
+ * Use {@link goog.html.SafeStyleSheet.concat} to create longer style sheets.
+ * This function doesn't support @import, @media and similar constructs.
+ * @param {string} selector CSS selector, e.g. '#id' or 'tag .class, #id'. We
+ * support CSS3 selectors: https://w3.org/TR/css3-selectors/#selectors.
+ * @param {!goog.html.SafeStyle.PropertyMap|!goog.html.SafeStyle} style Style
+ * definition associated with the selector.
+ * @return {!goog.html.SafeStyleSheet}
+ * @throws {Error} If invalid selector is provided.
+ */
+goog.html.SafeStyleSheet.createRule = function(selector, style) {
+ if (goog.string.contains(selector, '<')) {
+ throw Error('Selector does not allow \'<\', got: ' + selector);
+ }
+
+ // Remove strings.
+ var selectorToCheck =
+ selector.replace(/('|")((?!\1)[^\r\n\f\\]|\\[\s\S])*\1/g, '');
+
+ // Check characters allowed in CSS3 selectors.
+ if (!/^[-_a-zA-Z0-9#.:* ,>+~[\]()=^$|]+$/.test(selectorToCheck)) {
+ throw Error(
+ 'Selector allows only [-_a-zA-Z0-9#.:* ,>+~[\\]()=^$|] and ' +
+ 'strings, got: ' + selector);
+ }
+
+ // Check balanced () and [].
+ if (!goog.html.SafeStyleSheet.hasBalancedBrackets_(selectorToCheck)) {
+ throw Error('() and [] in selector must be balanced, got: ' + selector);
+ }
+
+ if (!(style instanceof goog.html.SafeStyle)) {
+ style = goog.html.SafeStyle.create(style);
+ }
+ var styleSheet = selector + '{' + goog.html.SafeStyle.unwrap(style) + '}';
+ return goog.html.SafeStyleSheet
+ .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheet);
+};
+
+
+/**
+ * Checks if a string has balanced () and [] brackets.
+ * @param {string} s String to check.
+ * @return {boolean}
+ * @private
+ */
+goog.html.SafeStyleSheet.hasBalancedBrackets_ = function(s) {
+ var brackets = {'(': ')', '[': ']'};
+ var expectedBrackets = [];
+ for (var i = 0; i < s.length; i++) {
+ var ch = s[i];
+ if (brackets[ch]) {
+ expectedBrackets.push(brackets[ch]);
+ } else if (goog.object.contains(brackets, ch)) {
+ if (expectedBrackets.pop() != ch) {
+ return false;
+ }
+ }
+ }
+ return expectedBrackets.length == 0;
+};
+
+
+/**
+ * Creates a new SafeStyleSheet object by concatenating values.
+ * @param {...(!goog.html.SafeStyleSheet|!Array<!goog.html.SafeStyleSheet>)}
+ * var_args Values to concatenate.
+ * @return {!goog.html.SafeStyleSheet}
+ */
+goog.html.SafeStyleSheet.concat = function(var_args) {
+ var result = '';
+
+ /**
+ * @param {!goog.html.SafeStyleSheet|!Array<!goog.html.SafeStyleSheet>}
+ * argument
+ */
+ var addArgument = function(argument) {
+ if (goog.isArray(argument)) {
+ goog.array.forEach(argument, addArgument);
+ } else {
+ result += goog.html.SafeStyleSheet.unwrap(argument);
+ }
+ };
+
+ goog.array.forEach(arguments, addArgument);
+ return goog.html.SafeStyleSheet
+ .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(result);
+};
+
+
+/**
+ * Creates a SafeStyleSheet object from a compile-time constant string.
+ *
+ * {@code styleSheet} must not have any &lt; characters in it, so that
+ * the syntactic structure of the surrounding HTML is not affected.
+ *
+ * @param {!goog.string.Const} styleSheet A compile-time-constant string from
+ * which to create a SafeStyleSheet.
+ * @return {!goog.html.SafeStyleSheet} A SafeStyleSheet object initialized to
+ * {@code styleSheet}.
+ */
+goog.html.SafeStyleSheet.fromConstant = function(styleSheet) {
+ var styleSheetString = goog.string.Const.unwrap(styleSheet);
+ if (styleSheetString.length === 0) {
+ return goog.html.SafeStyleSheet.EMPTY;
+ }
+ // > is a valid character in CSS selectors and there's no strict need to
+ // block it if we already block <.
+ goog.asserts.assert(
+ !goog.string.contains(styleSheetString, '<'),
+ "Forbidden '<' character in style sheet string: " + styleSheetString);
+ return goog.html.SafeStyleSheet
+ .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheetString);
+};
+
+
+/**
+ * Returns this SafeStyleSheet's value as a string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code SafeStyleSheet}, use {@code goog.html.SafeStyleSheet.unwrap}
+ * instead of this method. If in doubt, assume that it's security relevant. In
+ * particular, note that goog.html functions which return a goog.html type do
+ * not guarantee the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml
+ * // instanceof goog.html.SafeHtml.
+ * </pre>
+ *
+ * @see goog.html.SafeStyleSheet#unwrap
+ * @override
+ */
+goog.html.SafeStyleSheet.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a SafeStyleSheet, use
+ * {@code goog.html.SafeStyleSheet.unwrap}.
+ *
+ * @see goog.html.SafeStyleSheet#unwrap
+ * @override
+ */
+ goog.html.SafeStyleSheet.prototype.toString = function() {
+ return 'SafeStyleSheet{' +
+ this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ + '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a
+ * SafeStyleSheet object, and returns its value.
+ *
+ * @param {!goog.html.SafeStyleSheet} safeStyleSheet The object to extract from.
+ * @return {string} The safeStyleSheet object's contained string, unless
+ * the run-time type check fails. In that case, {@code unwrap} returns an
+ * innocuous string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.SafeStyleSheet.unwrap = function(safeStyleSheet) {
+ // Perform additional Run-time type-checking to ensure that
+ // safeStyleSheet is indeed an instance of the expected type. This
+ // provides some additional protection against security bugs due to
+ // application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (safeStyleSheet instanceof goog.html.SafeStyleSheet &&
+ safeStyleSheet.constructor === goog.html.SafeStyleSheet &&
+ safeStyleSheet
+ .SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return safeStyleSheet.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type SafeStyleSheet, got \'' +
+ safeStyleSheet + '\' of type ' + goog.typeOf(safeStyleSheet));
+ return 'type_error:SafeStyleSheet';
+ }
+};
+
+
+/**
+ * Package-internal utility method to create SafeStyleSheet instances.
+ *
+ * @param {string} styleSheet The string to initialize the SafeStyleSheet
+ * object with.
+ * @return {!goog.html.SafeStyleSheet} The initialized SafeStyleSheet object.
+ * @package
+ */
+goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse =
+ function(styleSheet) {
+ return new goog.html.SafeStyleSheet().initSecurityPrivateDoNotAccessOrElse_(
+ styleSheet);
+};
+
+
+/**
+ * Called from createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(). This
+ * method exists only so that the compiler can dead code eliminate static
+ * fields (like EMPTY) when they're not accessed.
+ * @param {string} styleSheet
+ * @return {!goog.html.SafeStyleSheet}
+ * @private
+ */
+goog.html.SafeStyleSheet.prototype.initSecurityPrivateDoNotAccessOrElse_ =
+ function(styleSheet) {
+ this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ = styleSheet;
+ return this;
+};
+
+
+/**
+ * A SafeStyleSheet instance corresponding to the empty string.
+ * @const {!goog.html.SafeStyleSheet}
+ */
+goog.html.SafeStyleSheet.EMPTY =
+ goog.html.SafeStyleSheet
+ .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse('');
diff --git a/src/http/static/viz/2/goog/html/safeurl.js b/src/http/static/viz/2/goog/html/safeurl.js
new file mode 100644
index 0000000..3d1ee11
--- /dev/null
+++ b/src/http/static/viz/2/goog/html/safeurl.js
@@ -0,0 +1,454 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview The SafeUrl type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.SafeUrl');
+
+goog.require('goog.asserts');
+goog.require('goog.fs.url');
+goog.require('goog.html.TrustedResourceUrl');
+goog.require('goog.i18n.bidi.Dir');
+goog.require('goog.i18n.bidi.DirectionalString');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A string that is safe to use in URL context in DOM APIs and HTML documents.
+ *
+ * A SafeUrl is a string-like object that carries the security type contract
+ * that its value as a string will not cause untrusted script execution
+ * when evaluated as a hyperlink URL in a browser.
+ *
+ * Values of this type are guaranteed to be safe to use in URL/hyperlink
+ * contexts, such as assignment to URL-valued DOM properties, in the sense that
+ * the use will not result in a Cross-Site-Scripting vulnerability. Similarly,
+ * SafeUrls can be interpolated into the URL context of an HTML template (e.g.,
+ * inside a href attribute). However, appropriate HTML-escaping must still be
+ * applied.
+ *
+ * Note that, as documented in {@code goog.html.SafeUrl.unwrap}, this type's
+ * contract does not guarantee that instances are safe to interpolate into HTML
+ * without appropriate escaping.
+ *
+ * Note also that this type's contract does not imply any guarantees regarding
+ * the resource the URL refers to. In particular, SafeUrls are <b>not</b>
+ * safe to use in a context where the referred-to resource is interpreted as
+ * trusted code, e.g., as the src of a script tag.
+ *
+ * Instances of this type must be created via the factory methods
+ * ({@code goog.html.SafeUrl.fromConstant}, {@code goog.html.SafeUrl.sanitize}),
+ * etc and not by invoking its constructor. The constructor intentionally
+ * takes no parameters and the type is immutable; hence only a default instance
+ * corresponding to the empty string can be obtained via constructor invocation.
+ *
+ * @see goog.html.SafeUrl#fromConstant
+ * @see goog.html.SafeUrl#from
+ * @see goog.html.SafeUrl#sanitize
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.i18n.bidi.DirectionalString}
+ * @implements {goog.string.TypedString}
+ */
+goog.html.SafeUrl = function() {
+ /**
+ * The contained value of this SafeUrl. The field has a purposely ugly
+ * name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.SafeUrl#unwrap
+ * @const {!Object}
+ * @private
+ */
+ this.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+};
+
+
+/**
+ * The innocuous string generated by goog.html.SafeUrl.sanitize when passed
+ * an unsafe URL.
+ *
+ * about:invalid is registered in
+ * http://www.w3.org/TR/css3-values/#about-invalid.
+ * http://tools.ietf.org/html/rfc6694#section-2.2.1 permits about URLs to
+ * contain a fragment, which is not to be considered when determining if an
+ * about URL is well-known.
+ *
+ * Using about:invalid seems preferable to using a fixed data URL, since
+ * browsers might choose to not report CSP violations on it, as legitimate
+ * CSS function calls to attr() can result in this URL being produced. It is
+ * also a standard URL which matches exactly the semantics we need:
+ * "The about:invalid URI references a non-existent document with a generic
+ * error condition. It can be used when a URI is necessary, but the default
+ * value shouldn't be resolveable as any type of document".
+ *
+ * @const {string}
+ */
+goog.html.SafeUrl.INNOCUOUS_STRING = 'about:invalid#zClosurez';
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeUrl.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Returns this SafeUrl's value a string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code SafeUrl}, use {@code goog.html.SafeUrl.unwrap} instead of this
+ * method. If in doubt, assume that it's security relevant. In particular, note
+ * that goog.html functions which return a goog.html type do not guarantee that
+ * the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml instanceof
+ * // goog.html.SafeHtml.
+ * </pre>
+ *
+ * IMPORTANT: The guarantees of the SafeUrl type contract only extend to the
+ * behavior of browsers when interpreting URLs. Values of SafeUrl objects MUST
+ * be appropriately escaped before embedding in a HTML document. Note that the
+ * required escaping is context-sensitive (e.g. a different escaping is
+ * required for embedding a URL in a style property within a style
+ * attribute, as opposed to embedding in a href attribute).
+ *
+ * @see goog.html.SafeUrl#unwrap
+ * @override
+ */
+goog.html.SafeUrl.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.SafeUrl.prototype.implementsGoogI18nBidiDirectionalString = true;
+
+
+/**
+ * Returns this URLs directionality, which is always {@code LTR}.
+ * @override
+ */
+goog.html.SafeUrl.prototype.getDirection = function() {
+ return goog.i18n.bidi.Dir.LTR;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a SafeUrl, use
+ * {@code goog.html.SafeUrl.unwrap}.
+ *
+ * @see goog.html.SafeUrl#unwrap
+ * @override
+ */
+ goog.html.SafeUrl.prototype.toString = function() {
+ return 'SafeUrl{' + this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ +
+ '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a SafeUrl
+ * object, and returns its value.
+ *
+ * IMPORTANT: The guarantees of the SafeUrl type contract only extend to the
+ * behavior of browsers when interpreting URLs. Values of SafeUrl objects MUST
+ * be appropriately escaped before embedding in a HTML document. Note that the
+ * required escaping is context-sensitive (e.g. a different escaping is
+ * required for embedding a URL in a style property within a style
+ * attribute, as opposed to embedding in a href attribute).
+ *
+ * @param {!goog.html.SafeUrl} safeUrl The object to extract from.
+ * @return {string} The SafeUrl object's contained string, unless the run-time
+ * type check fails. In that case, {@code unwrap} returns an innocuous
+ * string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.SafeUrl.unwrap = function(safeUrl) {
+ // Perform additional Run-time type-checking to ensure that safeUrl is indeed
+ // an instance of the expected type. This provides some additional protection
+ // against security bugs due to application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (safeUrl instanceof goog.html.SafeUrl &&
+ safeUrl.constructor === goog.html.SafeUrl &&
+ safeUrl.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return safeUrl.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type SafeUrl, got \'' +
+ safeUrl + '\' of type ' + goog.typeOf(safeUrl));
+ return 'type_error:SafeUrl';
+ }
+};
+
+
+/**
+ * Creates a SafeUrl object from a compile-time constant string.
+ *
+ * Compile-time constant strings are inherently program-controlled and hence
+ * trusted.
+ *
+ * @param {!goog.string.Const} url A compile-time-constant string from which to
+ * create a SafeUrl.
+ * @return {!goog.html.SafeUrl} A SafeUrl object initialized to {@code url}.
+ */
+goog.html.SafeUrl.fromConstant = function(url) {
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(
+ goog.string.Const.unwrap(url));
+};
+
+
+/**
+ * A pattern that matches Blob or data types that can have SafeUrls created
+ * from URL.createObjectURL(blob) or via a data: URI.
+ * @const
+ * @private
+ */
+goog.html.SAFE_MIME_TYPE_PATTERN_ = new RegExp(
+ '^(?:audio/(?:3gpp|3gpp2|aac|midi|mp4|mpeg|ogg|x-m4a|x-wav|webm)|' +
+ 'image/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|' +
+ 'text/csv|' +
+ 'video/(?:mpeg|mp4|ogg|webm))$',
+ 'i');
+
+
+/**
+ * Creates a SafeUrl wrapping a blob URL for the given {@code blob}.
+ *
+ * The blob URL is created with {@code URL.createObjectURL}. If the MIME type
+ * for {@code blob} is not of a known safe audio, image or video MIME type,
+ * then the SafeUrl will wrap {@link #INNOCUOUS_STRING}.
+ *
+ * @see http://www.w3.org/TR/FileAPI/#url
+ * @param {!Blob} blob
+ * @return {!goog.html.SafeUrl} The blob URL, or an innocuous string wrapped
+ * as a SafeUrl.
+ */
+goog.html.SafeUrl.fromBlob = function(blob) {
+ var url = goog.html.SAFE_MIME_TYPE_PATTERN_.test(blob.type) ?
+ goog.fs.url.createObjectUrl(blob) :
+ goog.html.SafeUrl.INNOCUOUS_STRING;
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);
+};
+
+
+/**
+ * Matches a base-64 data URL, with the first match group being the MIME type.
+ * @const
+ * @private
+ */
+goog.html.DATA_URL_PATTERN_ = /^data:([^;,]*);base64,[a-z0-9+\/]+=*$/i;
+
+
+/**
+ * Creates a SafeUrl wrapping a data: URL, after validating it matches a
+ * known-safe audio, image or video MIME type.
+ *
+ * @param {string} dataUrl A valid base64 data URL with one of the whitelisted
+ * audio, image or video MIME types.
+ * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}
+ * wrapped as a SafeUrl if it does not pass.
+ */
+goog.html.SafeUrl.fromDataUrl = function(dataUrl) {
+ // There's a slight risk here that a browser sniffs the content type if it
+ // doesn't know the MIME type and executes HTML within the data: URL. For this
+ // to cause XSS it would also have to execute the HTML in the same origin
+ // of the page with the link. It seems unlikely that both of these will
+ // happen, particularly in not really old IEs.
+ var match = dataUrl.match(goog.html.DATA_URL_PATTERN_);
+ var valid = match && goog.html.SAFE_MIME_TYPE_PATTERN_.test(match[1]);
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(
+ valid ? dataUrl : goog.html.SafeUrl.INNOCUOUS_STRING);
+};
+
+
+/**
+ * Creates a SafeUrl wrapping a tel: URL.
+ *
+ * @param {string} telUrl A tel URL.
+ * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}
+ * wrapped as a SafeUrl if it does not pass.
+ */
+goog.html.SafeUrl.fromTelUrl = function(telUrl) {
+ // There's a risk that a tel: URL could immediately place a call once
+ // clicked, without requiring user confirmation. For that reason it is
+ // handled in this separate function.
+ if (!goog.string.caseInsensitiveStartsWith(telUrl, 'tel:')) {
+ telUrl = goog.html.SafeUrl.INNOCUOUS_STRING;
+ }
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(
+ telUrl);
+};
+
+
+/**
+ * Creates a SafeUrl from TrustedResourceUrl. This is safe because
+ * TrustedResourceUrl is more tightly restricted than SafeUrl.
+ *
+ * @param {!goog.html.TrustedResourceUrl} trustedResourceUrl
+ * @return {!goog.html.SafeUrl}
+ */
+goog.html.SafeUrl.fromTrustedResourceUrl = function(trustedResourceUrl) {
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(
+ goog.html.TrustedResourceUrl.unwrap(trustedResourceUrl));
+};
+
+
+/**
+ * A pattern that recognizes a commonly useful subset of URLs that satisfy
+ * the SafeUrl contract.
+ *
+ * This regular expression matches a subset of URLs that will not cause script
+ * execution if used in URL context within a HTML document. Specifically, this
+ * regular expression matches if (comment from here on and regex copied from
+ * Soy's EscapingConventions):
+ * (1) Either a protocol in a whitelist (http, https, mailto or ftp).
+ * (2) or no protocol. A protocol must be followed by a colon. The below
+ * allows that by allowing colons only after one of the characters [/?#].
+ * A colon after a hash (#) must be in the fragment.
+ * Otherwise, a colon after a (?) must be in a query.
+ * Otherwise, a colon after a single solidus (/) must be in a path.
+ * Otherwise, a colon after a double solidus (//) must be in the authority
+ * (before port).
+ *
+ * @private
+ * @const {!RegExp}
+ */
+goog.html.SAFE_URL_PATTERN_ =
+ /^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;
+
+
+/**
+ * Creates a SafeUrl object from {@code url}. If {@code url} is a
+ * goog.html.SafeUrl then it is simply returned. Otherwise the input string is
+ * validated to match a pattern of commonly used safe URLs.
+ *
+ * {@code url} may be a URL with the http, https, mailto or ftp scheme,
+ * or a relative URL (i.e., a URL without a scheme; specifically, a
+ * scheme-relative, absolute-path-relative, or path-relative URL).
+ *
+ * @see http://url.spec.whatwg.org/#concept-relative-url
+ * @param {string|!goog.string.TypedString} url The URL to validate.
+ * @return {!goog.html.SafeUrl} The validated URL, wrapped as a SafeUrl.
+ */
+goog.html.SafeUrl.sanitize = function(url) {
+ if (url instanceof goog.html.SafeUrl) {
+ return url;
+ } else if (url.implementsGoogStringTypedString) {
+ url = url.getTypedStringValue();
+ } else {
+ url = String(url);
+ }
+ if (!goog.html.SAFE_URL_PATTERN_.test(url)) {
+ url = goog.html.SafeUrl.INNOCUOUS_STRING;
+ }
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);
+};
+
+/**
+ * Creates a SafeUrl object from {@code url}. If {@code url} is a
+ * goog.html.SafeUrl then it is simply returned. Otherwise the input string is
+ * validated to match a pattern of commonly used safe URLs.
+ *
+ * {@code url} may be a URL with the http, https, mailto or ftp scheme,
+ * or a relative URL (i.e., a URL without a scheme; specifically, a
+ * scheme-relative, absolute-path-relative, or path-relative URL).
+ *
+ * This function asserts (using goog.asserts) that the URL matches this pattern.
+ * If it does not, in addition to failing the assert, an innocous URL will be
+ * returned.
+ *
+ * @see http://url.spec.whatwg.org/#concept-relative-url
+ * @param {string|!goog.string.TypedString} url The URL to validate.
+ * @return {!goog.html.SafeUrl} The validated URL, wrapped as a SafeUrl.
+ */
+goog.html.SafeUrl.sanitizeAssertUnchanged = function(url) {
+ if (url instanceof goog.html.SafeUrl) {
+ return url;
+ } else if (url.implementsGoogStringTypedString) {
+ url = url.getTypedStringValue();
+ } else {
+ url = String(url);
+ }
+ if (!goog.asserts.assert(goog.html.SAFE_URL_PATTERN_.test(url))) {
+ url = goog.html.SafeUrl.INNOCUOUS_STRING;
+ }
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);
+};
+
+
+
+/**
+ * Type marker for the SafeUrl type, used to implement additional run-time
+ * type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Package-internal utility method to create SafeUrl instances.
+ *
+ * @param {string} url The string to initialize the SafeUrl object with.
+ * @return {!goog.html.SafeUrl} The initialized SafeUrl object.
+ * @package
+ */
+goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse = function(
+ url) {
+ var safeUrl = new goog.html.SafeUrl();
+ safeUrl.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = url;
+ return safeUrl;
+};
+
+
+/**
+ * A SafeUrl corresponding to the special about:blank url.
+ * @const {!goog.html.SafeUrl}
+ */
+goog.html.SafeUrl.ABOUT_BLANK =
+ goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(
+ 'about:blank');
diff --git a/src/http/static/viz/2/goog/html/trustedresourceurl.js b/src/http/static/viz/2/goog/html/trustedresourceurl.js
new file mode 100644
index 0000000..c043ef1
--- /dev/null
+++ b/src/http/static/viz/2/goog/html/trustedresourceurl.js
@@ -0,0 +1,408 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview The TrustedResourceUrl type and its builders.
+ *
+ * TODO(xtof): Link to document stating type contract.
+ */
+
+goog.provide('goog.html.TrustedResourceUrl');
+
+goog.require('goog.asserts');
+goog.require('goog.i18n.bidi.Dir');
+goog.require('goog.i18n.bidi.DirectionalString');
+goog.require('goog.string.Const');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * A URL which is under application control and from which script, CSS, and
+ * other resources that represent executable code, can be fetched.
+ *
+ * Given that the URL can only be constructed from strings under application
+ * control and is used to load resources, bugs resulting in a malformed URL
+ * should not have a security impact and are likely to be easily detectable
+ * during testing. Given the wide number of non-RFC compliant URLs in use,
+ * stricter validation could prevent some applications from being able to use
+ * this type.
+ *
+ * Instances of this type must be created via the factory method,
+ * ({@code fromConstant}, {@code fromConstants}, {@code format} or {@code
+ * formatWithParams}), and not by invoking its constructor. The constructor
+ * intentionally takes no parameters and the type is immutable; hence only a
+ * default instance corresponding to the empty string can be obtained via
+ * constructor invocation.
+ *
+ * @see goog.html.TrustedResourceUrl#fromConstant
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.i18n.bidi.DirectionalString}
+ * @implements {goog.string.TypedString}
+ */
+goog.html.TrustedResourceUrl = function() {
+ /**
+ * The contained value of this TrustedResourceUrl. The field has a purposely
+ * ugly name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.html.TrustedResourceUrl#unwrap
+ * @const {!Object}
+ * @private
+ */
+ this.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
+ goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.TrustedResourceUrl.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Returns this TrustedResourceUrl's value as a string.
+ *
+ * IMPORTANT: In code where it is security relevant that an object's type is
+ * indeed {@code TrustedResourceUrl}, use
+ * {@code goog.html.TrustedResourceUrl.unwrap} instead of this method. If in
+ * doubt, assume that it's security relevant. In particular, note that
+ * goog.html functions which return a goog.html type do not guarantee that
+ * the returned instance is of the right type. For example:
+ *
+ * <pre>
+ * var fakeSafeHtml = new String('fake');
+ * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
+ * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
+ * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
+ * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml instanceof
+ * // goog.html.SafeHtml.
+ * </pre>
+ *
+ * @see goog.html.TrustedResourceUrl#unwrap
+ * @override
+ */
+goog.html.TrustedResourceUrl.prototype.getTypedStringValue = function() {
+ return this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.html.TrustedResourceUrl.prototype.implementsGoogI18nBidiDirectionalString =
+ true;
+
+
+/**
+ * Returns this URLs directionality, which is always {@code LTR}.
+ * @override
+ */
+goog.html.TrustedResourceUrl.prototype.getDirection = function() {
+ return goog.i18n.bidi.Dir.LTR;
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a debug string-representation of this value.
+ *
+ * To obtain the actual string value wrapped in a TrustedResourceUrl, use
+ * {@code goog.html.TrustedResourceUrl.unwrap}.
+ *
+ * @see goog.html.TrustedResourceUrl#unwrap
+ * @override
+ */
+ goog.html.TrustedResourceUrl.prototype.toString = function() {
+ return 'TrustedResourceUrl{' +
+ this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ + '}';
+ };
+}
+
+
+/**
+ * Performs a runtime check that the provided object is indeed a
+ * TrustedResourceUrl object, and returns its value.
+ *
+ * @param {!goog.html.TrustedResourceUrl} trustedResourceUrl The object to
+ * extract from.
+ * @return {string} The trustedResourceUrl object's contained string, unless
+ * the run-time type check fails. In that case, {@code unwrap} returns an
+ * innocuous string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.html.TrustedResourceUrl.unwrap = function(trustedResourceUrl) {
+ // Perform additional Run-time type-checking to ensure that
+ // trustedResourceUrl is indeed an instance of the expected type. This
+ // provides some additional protection against security bugs due to
+ // application code that disables type checks.
+ // Specifically, the following checks are performed:
+ // 1. The object is an instance of the expected type.
+ // 2. The object is not an instance of a subclass.
+ // 3. The object carries a type marker for the expected type. "Faking" an
+ // object requires a reference to the type marker, which has names intended
+ // to stand out in code reviews.
+ if (trustedResourceUrl instanceof goog.html.TrustedResourceUrl &&
+ trustedResourceUrl.constructor === goog.html.TrustedResourceUrl &&
+ trustedResourceUrl
+ .TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
+ goog.html.TrustedResourceUrl
+ .TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
+ return trustedResourceUrl
+ .privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;
+ } else {
+ goog.asserts.fail('expected object of type TrustedResourceUrl, got \'' +
+ trustedResourceUrl + '\' of type ' + goog.typeOf(trustedResourceUrl));
+ return 'type_error:TrustedResourceUrl';
+ }
+};
+
+
+/**
+ * Creates a TrustedResourceUrl from a format string and arguments.
+ *
+ * The arguments for interpolation into the format string map labels to values.
+ * Values of type `goog.string.Const` are interpolated without modifcation.
+ * Values of other types are cast to string and encoded with
+ * encodeURIComponent.
+ *
+ * `%{<label>}` markers are used in the format string to indicate locations
+ * to be interpolated with the valued mapped to the given label. `<label>`
+ * must contain only alphanumeric and `_` characters.
+ *
+ * The format string must start with one of the following:
+ * - `https://<origin>/`
+ * - `//<origin>/`
+ * - `/<pathStart>`
+ * - `about:blank`
+ *
+ * `<origin>` must contain only alphanumeric or any of the following: `-.:[]`.
+ * `<pathStart>` is any character except `/` and `\`.
+ *
+ * Example usage:
+ *
+ * var url = goog.html.TrustedResourceUrl.format(goog.string.Const.from(
+ * 'https://www.google.com/search?q=%{query}), {'query': searchTerm});
+ *
+ * var url = goog.html.TrustedResourceUrl.format(goog.string.Const.from(
+ * '//www.youtube.com/v/%{videoId}?hl=en&fs=1%{autoplay}'), {
+ * 'videoId': videoId,
+ * 'autoplay': opt_autoplay ?
+ * goog.string.Const.EMPTY : goog.string.Const.from('&autoplay=1')
+ * });
+ *
+ * While this function can be used to create a TrustedResourceUrl from only
+ * constants, fromConstant() and fromConstants() are generally preferable for
+ * that purpose.
+ *
+ * @param {!goog.string.Const} format The format string.
+ * @param {!Object<string, (string|number|!goog.string.Const)>} args Mapping
+ * of labels to values to be interpolated into the format string.
+ * goog.string.Const values are interpolated without encoding.
+ * @return {!goog.html.TrustedResourceUrl}
+ * @throws {!Error} On an invalid format string or if a label used in the
+ * the format string is not present in args.
+ */
+goog.html.TrustedResourceUrl.format = function(format, args) {
+ var result = goog.html.TrustedResourceUrl.format_(format, args);
+ return goog.html.TrustedResourceUrl
+ .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(result);
+};
+
+
+/**
+ * String version of TrustedResourceUrl.format.
+ * @param {!goog.string.Const} format
+ * @param {!Object<string, (string|number|!goog.string.Const)>} args
+ * @return {string}
+ * @throws {!Error}
+ * @private
+ */
+goog.html.TrustedResourceUrl.format_ = function(format, args) {
+ var formatStr = goog.string.Const.unwrap(format);
+ if (!goog.html.TrustedResourceUrl.BASE_URL_.test(formatStr)) {
+ throw new Error('Invalid TrustedResourceUrl format: ' + formatStr);
+ }
+ return formatStr.replace(
+ goog.html.TrustedResourceUrl.FORMAT_MARKER_, function(match, id) {
+ if (!Object.prototype.hasOwnProperty.call(args, id)) {
+ throw new Error(
+ 'Found marker, "' + id + '", in format string, "' + formatStr +
+ '", but no valid label mapping found ' +
+ 'in args: ' + JSON.stringify(args));
+ }
+ var arg = args[id];
+ if (arg instanceof goog.string.Const) {
+ return goog.string.Const.unwrap(arg);
+ } else {
+ return encodeURIComponent(String(arg));
+ }
+ });
+};
+
+
+/**
+ * @private @const {!RegExp}
+ */
+goog.html.TrustedResourceUrl.FORMAT_MARKER_ = /%{(\w+)}/g;
+
+
+/**
+ * The URL must be absolute, scheme-relative or path-absolute. So it must
+ * start with:
+ * - https:// followed by allowed origin characters.
+ * - // followed by allowed origin characters.
+ * - / not followed by / or \. There will only be an absolute path.
+ *
+ * Based on
+ * https://url.spec.whatwg.org/commit-snapshots/56b74ce7cca8883eab62e9a12666e2fac665d03d/#url-parsing
+ * an initial / which is not followed by another / or \ will end up in the "path
+ * state" and from there it can only go to "fragment state" and "query state".
+ *
+ * We don't enforce a well-formed domain name. So '.' or '1.2' are valid.
+ * That's ok because the origin comes from a compile-time constant.
+ *
+ * A regular expression is used instead of goog.uri for several reasons:
+ * - Strictness. E.g. we don't want any userinfo component and we don't
+ * want '/./, nor \' in the first path component.
+ * - Small trusted base. goog.uri is generic and might need to change,
+ * reasoning about all the ways it can parse a URL now and in the future
+ * is error-prone.
+ * - Code size. We expect many calls to .format(), many of which might
+ * not be using goog.uri.
+ * - Simplicity. Using goog.uri would likely not result in simpler nor shorter
+ * code.
+ * @private @const {!RegExp}
+ */
+goog.html.TrustedResourceUrl.BASE_URL_ =
+ /^(?:https:)?\/\/[0-9a-z.:[\]-]+\/|^\/[^\/\\]|^about:blank(#|$)/i;
+
+
+/**
+ * Formats the URL same as TrustedResourceUrl.format and then adds extra URL
+ * parameters.
+ *
+ * Example usage:
+ *
+ * // Creates '//www.youtube.com/v/abc?autoplay=1' for videoId='abc' and
+ * // opt_autoplay=1. Creates '//www.youtube.com/v/abc' for videoId='abc'
+ * // and opt_autoplay=undefined.
+ * var url = goog.html.TrustedResourceUrl.formatWithParams(
+ * goog.string.Const.from('//www.youtube.com/v/%{videoId}'),
+ * {'videoId': videoId},
+ * {'autoplay': opt_autoplay});
+ *
+ * @param {!goog.string.Const} format The format string.
+ * @param {!Object<string, (string|number|!goog.string.Const)>} args Mapping
+ * of labels to values to be interpolated into the format string.
+ * goog.string.Const values are interpolated without encoding.
+ * @param {!Object<string, *>} params Parameters to add to URL. Parameters with
+ * value {@code null} or {@code undefined} are skipped. Both keys and values
+ * are encoded. Note that JavaScript doesn't guarantee the order of values
+ * in an object which might result in non-deterministic order of the
+ * parameters. However, browsers currently preserve the order.
+ * @return {!goog.html.TrustedResourceUrl}
+ * @throws {!Error} On an invalid format string or if a label used in the
+ * the format string is not present in args.
+ */
+goog.html.TrustedResourceUrl.formatWithParams = function(format, args, params) {
+ var url = goog.html.TrustedResourceUrl.format_(format, args);
+ var separator = /\?/.test(url) ? '&' : '?';
+ for (var key in params) {
+ if (params[key] == null) {
+ continue;
+ }
+ url += separator + encodeURIComponent(key) + '=' +
+ encodeURIComponent(String(params[key]));
+ separator = '&';
+ }
+ return goog.html.TrustedResourceUrl
+ .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(url);
+};
+
+
+/**
+ * Creates a TrustedResourceUrl object from a compile-time constant string.
+ *
+ * Compile-time constant strings are inherently program-controlled and hence
+ * trusted.
+ *
+ * @param {!goog.string.Const} url A compile-time-constant string from which to
+ * create a TrustedResourceUrl.
+ * @return {!goog.html.TrustedResourceUrl} A TrustedResourceUrl object
+ * initialized to {@code url}.
+ */
+goog.html.TrustedResourceUrl.fromConstant = function(url) {
+ return goog.html.TrustedResourceUrl
+ .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(
+ goog.string.Const.unwrap(url));
+};
+
+
+/**
+ * Creates a TrustedResourceUrl object from a compile-time constant strings.
+ *
+ * Compile-time constant strings are inherently program-controlled and hence
+ * trusted.
+ *
+ * @param {!Array<!goog.string.Const>} parts Compile-time-constant strings from
+ * which to create a TrustedResourceUrl.
+ * @return {!goog.html.TrustedResourceUrl} A TrustedResourceUrl object
+ * initialized to concatenation of {@code parts}.
+ */
+goog.html.TrustedResourceUrl.fromConstants = function(parts) {
+ var unwrapped = '';
+ for (var i = 0; i < parts.length; i++) {
+ unwrapped += goog.string.Const.unwrap(parts[i]);
+ }
+ return goog.html.TrustedResourceUrl
+ .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(unwrapped);
+};
+
+
+/**
+ * Type marker for the TrustedResourceUrl type, used to implement additional
+ * run-time type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
+
+
+/**
+ * Package-internal utility method to create TrustedResourceUrl instances.
+ *
+ * @param {string} url The string to initialize the TrustedResourceUrl object
+ * with.
+ * @return {!goog.html.TrustedResourceUrl} The initialized TrustedResourceUrl
+ * object.
+ * @package
+ */
+goog.html.TrustedResourceUrl
+ .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse = function(url) {
+ var trustedResourceUrl = new goog.html.TrustedResourceUrl();
+ trustedResourceUrl.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ =
+ url;
+ return trustedResourceUrl;
+};
diff --git a/src/http/static/viz/2/goog/html/uncheckedconversions.js b/src/http/static/viz/2/goog/html/uncheckedconversions.js
new file mode 100644
index 0000000..e96697c
--- /dev/null
+++ b/src/http/static/viz/2/goog/html/uncheckedconversions.js
@@ -0,0 +1,228 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Unchecked conversions to create values of goog.html types from
+ * plain strings. Use of these functions could potentially result in instances
+ * of goog.html types that violate their type contracts, and hence result in
+ * security vulnerabilties.
+ *
+ * Therefore, all uses of the methods herein must be carefully security
+ * reviewed. Avoid use of the methods in this file whenever possible; instead
+ * prefer to create instances of goog.html types using inherently safe builders
+ * or template systems.
+ *
+ *
+ *
+ * @visibility {//closure/goog/html:approved_for_unchecked_conversion}
+ * @visibility {//closure/goog/bin/sizetests:__pkg__}
+ */
+
+
+goog.provide('goog.html.uncheckedconversions');
+
+goog.require('goog.asserts');
+goog.require('goog.html.SafeHtml');
+goog.require('goog.html.SafeScript');
+goog.require('goog.html.SafeStyle');
+goog.require('goog.html.SafeStyleSheet');
+goog.require('goog.html.SafeUrl');
+goog.require('goog.html.TrustedResourceUrl');
+goog.require('goog.string');
+goog.require('goog.string.Const');
+
+
+/**
+ * Performs an "unchecked conversion" to SafeHtml from a plain string that is
+ * known to satisfy the SafeHtml type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code html} satisfies the SafeHtml type contract in all
+ * possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} html A string that is claimed to adhere to the SafeHtml
+ * contract.
+ * @param {?goog.i18n.bidi.Dir=} opt_dir The optional directionality of the
+ * SafeHtml to be constructed. A null or undefined value signifies an
+ * unknown directionality.
+ * @return {!goog.html.SafeHtml} The value of html, wrapped in a SafeHtml
+ * object.
+ */
+goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract =
+ function(justification, html, opt_dir) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
+ html, opt_dir || null);
+};
+
+
+/**
+ * Performs an "unchecked conversion" to SafeScript from a plain string that is
+ * known to satisfy the SafeScript type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code script} satisfies the SafeScript type contract in
+ * all possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} script The string to wrap as a SafeScript.
+ * @return {!goog.html.SafeScript} The value of {@code script}, wrapped in a
+ * SafeScript object.
+ */
+goog.html.uncheckedconversions.safeScriptFromStringKnownToSatisfyTypeContract =
+ function(justification, script) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(
+ script);
+};
+
+
+/**
+ * Performs an "unchecked conversion" to SafeStyle from a plain string that is
+ * known to satisfy the SafeStyle type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code style} satisfies the SafeStyle type contract in all
+ * possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} style The string to wrap as a SafeStyle.
+ * @return {!goog.html.SafeStyle} The value of {@code style}, wrapped in a
+ * SafeStyle object.
+ */
+goog.html.uncheckedconversions.safeStyleFromStringKnownToSatisfyTypeContract =
+ function(justification, style) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(
+ style);
+};
+
+
+/**
+ * Performs an "unchecked conversion" to SafeStyleSheet from a plain string
+ * that is known to satisfy the SafeStyleSheet type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code styleSheet} satisfies the SafeStyleSheet type
+ * contract in all possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} styleSheet The string to wrap as a SafeStyleSheet.
+ * @return {!goog.html.SafeStyleSheet} The value of {@code styleSheet}, wrapped
+ * in a SafeStyleSheet object.
+ */
+goog.html.uncheckedconversions
+ .safeStyleSheetFromStringKnownToSatisfyTypeContract = function(
+ justification, styleSheet) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.SafeStyleSheet
+ .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheet);
+};
+
+
+/**
+ * Performs an "unchecked conversion" to SafeUrl from a plain string that is
+ * known to satisfy the SafeUrl type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code url} satisfies the SafeUrl type contract in all
+ * possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} url The string to wrap as a SafeUrl.
+ * @return {!goog.html.SafeUrl} The value of {@code url}, wrapped in a SafeUrl
+ * object.
+ */
+goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract =
+ function(justification, url) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);
+};
+
+
+/**
+ * Performs an "unchecked conversion" to TrustedResourceUrl from a plain string
+ * that is known to satisfy the TrustedResourceUrl type contract.
+ *
+ * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure
+ * that the value of {@code url} satisfies the TrustedResourceUrl type contract
+ * in all possible program states.
+ *
+ *
+ * @param {!goog.string.Const} justification A constant string explaining why
+ * this use of this method is safe. May include a security review ticket
+ * number.
+ * @param {string} url The string to wrap as a TrustedResourceUrl.
+ * @return {!goog.html.TrustedResourceUrl} The value of {@code url}, wrapped in
+ * a TrustedResourceUrl object.
+ */
+goog.html.uncheckedconversions
+ .trustedResourceUrlFromStringKnownToSatisfyTypeContract = function(
+ justification, url) {
+ // unwrap() called inside an assert so that justification can be optimized
+ // away in production code.
+ goog.asserts.assertString(
+ goog.string.Const.unwrap(justification), 'must provide justification');
+ goog.asserts.assert(
+ !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),
+ 'must provide non-empty justification');
+ return goog.html.TrustedResourceUrl
+ .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(url);
+};
diff --git a/src/http/static/viz/2/goog/i18n/bidi.js b/src/http/static/viz/2/goog/i18n/bidi.js
new file mode 100644
index 0000000..695cfda
--- /dev/null
+++ b/src/http/static/viz/2/goog/i18n/bidi.js
@@ -0,0 +1,876 @@
+// Copyright 2007 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utility functions for supporting Bidi issues.
+ */
+
+
+/**
+ * Namespace for bidi supporting functions.
+ */
+goog.provide('goog.i18n.bidi');
+goog.provide('goog.i18n.bidi.Dir');
+goog.provide('goog.i18n.bidi.DirectionalString');
+goog.provide('goog.i18n.bidi.Format');
+
+
+/**
+ * @define {boolean} FORCE_RTL forces the {@link goog.i18n.bidi.IS_RTL} constant
+ * to say that the current locale is a RTL locale. This should only be used
+ * if you want to override the default behavior for deciding whether the
+ * current locale is RTL or not.
+ *
+ * {@see goog.i18n.bidi.IS_RTL}
+ */
+goog.define('goog.i18n.bidi.FORCE_RTL', false);
+
+
+/**
+ * Constant that defines whether or not the current locale is a RTL locale.
+ * If {@link goog.i18n.bidi.FORCE_RTL} is not true, this constant will default
+ * to check that {@link goog.LOCALE} is one of a few major RTL locales.
+ *
+ * <p>This is designed to be a maximally efficient compile-time constant. For
+ * example, for the default goog.LOCALE, compiling
+ * "if (goog.i18n.bidi.IS_RTL) alert('rtl') else {}" should produce no code. It
+ * is this design consideration that limits the implementation to only
+ * supporting a few major RTL locales, as opposed to the broader repertoire of
+ * something like goog.i18n.bidi.isRtlLanguage.
+ *
+ * <p>Since this constant refers to the directionality of the locale, it is up
+ * to the caller to determine if this constant should also be used for the
+ * direction of the UI.
+ *
+ * {@see goog.LOCALE}
+ *
+ * @type {boolean}
+ *
+ * TODO(user): write a test that checks that this is a compile-time constant.
+ */
+goog.i18n.bidi.IS_RTL = goog.i18n.bidi.FORCE_RTL ||
+ ((goog.LOCALE.substring(0, 2).toLowerCase() == 'ar' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'fa' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'he' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'iw' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'ps' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'sd' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'ug' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'ur' ||
+ goog.LOCALE.substring(0, 2).toLowerCase() == 'yi') &&
+ (goog.LOCALE.length == 2 || goog.LOCALE.substring(2, 3) == '-' ||
+ goog.LOCALE.substring(2, 3) == '_')) ||
+ (goog.LOCALE.length >= 3 &&
+ goog.LOCALE.substring(0, 3).toLowerCase() == 'ckb' &&
+ (goog.LOCALE.length == 3 || goog.LOCALE.substring(3, 4) == '-' ||
+ goog.LOCALE.substring(3, 4) == '_'));
+
+
+/**
+ * Unicode formatting characters and directionality string constants.
+ * @enum {string}
+ */
+goog.i18n.bidi.Format = {
+ /** Unicode "Left-To-Right Embedding" (LRE) character. */
+ LRE: '\u202A',
+ /** Unicode "Right-To-Left Embedding" (RLE) character. */
+ RLE: '\u202B',
+ /** Unicode "Pop Directional Formatting" (PDF) character. */
+ PDF: '\u202C',
+ /** Unicode "Left-To-Right Mark" (LRM) character. */
+ LRM: '\u200E',
+ /** Unicode "Right-To-Left Mark" (RLM) character. */
+ RLM: '\u200F'
+};
+
+
+/**
+ * Directionality enum.
+ * @enum {number}
+ */
+goog.i18n.bidi.Dir = {
+ /**
+ * Left-to-right.
+ */
+ LTR: 1,
+
+ /**
+ * Right-to-left.
+ */
+ RTL: -1,
+
+ /**
+ * Neither left-to-right nor right-to-left.
+ */
+ NEUTRAL: 0
+};
+
+
+/**
+ * 'right' string constant.
+ * @type {string}
+ */
+goog.i18n.bidi.RIGHT = 'right';
+
+
+/**
+ * 'left' string constant.
+ * @type {string}
+ */
+goog.i18n.bidi.LEFT = 'left';
+
+
+/**
+ * 'left' if locale is RTL, 'right' if not.
+ * @type {string}
+ */
+goog.i18n.bidi.I18N_RIGHT =
+ goog.i18n.bidi.IS_RTL ? goog.i18n.bidi.LEFT : goog.i18n.bidi.RIGHT;
+
+
+/**
+ * 'right' if locale is RTL, 'left' if not.
+ * @type {string}
+ */
+goog.i18n.bidi.I18N_LEFT =
+ goog.i18n.bidi.IS_RTL ? goog.i18n.bidi.RIGHT : goog.i18n.bidi.LEFT;
+
+
+/**
+ * Convert a directionality given in various formats to a goog.i18n.bidi.Dir
+ * constant. Useful for interaction with different standards of directionality
+ * representation.
+ *
+ * @param {goog.i18n.bidi.Dir|number|boolean|null} givenDir Directionality given
+ * in one of the following formats:
+ * 1. A goog.i18n.bidi.Dir constant.
+ * 2. A number (positive = LTR, negative = RTL, 0 = neutral).
+ * 3. A boolean (true = RTL, false = LTR).
+ * 4. A null for unknown directionality.
+ * @param {boolean=} opt_noNeutral Whether a givenDir of zero or
+ * goog.i18n.bidi.Dir.NEUTRAL should be treated as null, i.e. unknown, in
+ * order to preserve legacy behavior.
+ * @return {?goog.i18n.bidi.Dir} A goog.i18n.bidi.Dir constant matching the
+ * given directionality. If given null, returns null (i.e. unknown).
+ */
+goog.i18n.bidi.toDir = function(givenDir, opt_noNeutral) {
+ if (typeof givenDir == 'number') {
+ // This includes the non-null goog.i18n.bidi.Dir case.
+ return givenDir > 0 ? goog.i18n.bidi.Dir.LTR : givenDir < 0 ?
+ goog.i18n.bidi.Dir.RTL :
+ opt_noNeutral ? null : goog.i18n.bidi.Dir.NEUTRAL;
+ } else if (givenDir == null) {
+ return null;
+ } else {
+ // Must be typeof givenDir == 'boolean'.
+ return givenDir ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.LTR;
+ }
+};
+
+
+/**
+ * A practical pattern to identify strong LTR characters. This pattern is not
+ * theoretically correct according to the Unicode standard. It is simplified for
+ * performance and small code size.
+ * @type {string}
+ * @private
+ */
+goog.i18n.bidi.ltrChars_ =
+ 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF' +
+ '\u200E\u2C00-\uFB1C\uFE00-\uFE6F\uFEFD-\uFFFF';
+
+
+/**
+ * A practical pattern to identify strong RTL character. This pattern is not
+ * theoretically correct according to the Unicode standard. It is simplified
+ * for performance and small code size.
+ * @type {string}
+ * @private
+ */
+goog.i18n.bidi.rtlChars_ =
+ '\u0591-\u06EF\u06FA-\u07FF\u200F\uFB1D-\uFDFF\uFE70-\uFEFC';
+
+
+/**
+ * Simplified regular expression for an HTML tag (opening or closing) or an HTML
+ * escape. We might want to skip over such expressions when estimating the text
+ * directionality.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.htmlSkipReg_ = /<[^>]*>|&[^;]+;/g;
+
+
+/**
+ * Returns the input text with spaces instead of HTML tags or HTML escapes, if
+ * opt_isStripNeeded is true. Else returns the input as is.
+ * Useful for text directionality estimation.
+ * Note: the function should not be used in other contexts; it is not 100%
+ * correct, but rather a good-enough implementation for directionality
+ * estimation purposes.
+ * @param {string} str The given string.
+ * @param {boolean=} opt_isStripNeeded Whether to perform the stripping.
+ * Default: false (to retain consistency with calling functions).
+ * @return {string} The given string cleaned of HTML tags / escapes.
+ * @private
+ */
+goog.i18n.bidi.stripHtmlIfNeeded_ = function(str, opt_isStripNeeded) {
+ return opt_isStripNeeded ? str.replace(goog.i18n.bidi.htmlSkipReg_, '') : str;
+};
+
+
+/**
+ * Regular expression to check for RTL characters.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rtlCharReg_ = new RegExp('[' + goog.i18n.bidi.rtlChars_ + ']');
+
+
+/**
+ * Regular expression to check for LTR characters.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.ltrCharReg_ = new RegExp('[' + goog.i18n.bidi.ltrChars_ + ']');
+
+
+/**
+ * Test whether the given string has any RTL characters in it.
+ * @param {string} str The given string that need to be tested.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether the string contains RTL characters.
+ */
+goog.i18n.bidi.hasAnyRtl = function(str, opt_isHtml) {
+ return goog.i18n.bidi.rtlCharReg_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Test whether the given string has any RTL characters in it.
+ * @param {string} str The given string that need to be tested.
+ * @return {boolean} Whether the string contains RTL characters.
+ * @deprecated Use hasAnyRtl.
+ */
+goog.i18n.bidi.hasRtlChar = goog.i18n.bidi.hasAnyRtl;
+
+
+/**
+ * Test whether the given string has any LTR characters in it.
+ * @param {string} str The given string that need to be tested.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether the string contains LTR characters.
+ */
+goog.i18n.bidi.hasAnyLtr = function(str, opt_isHtml) {
+ return goog.i18n.bidi.ltrCharReg_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Regular expression pattern to check if the first character in the string
+ * is LTR.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.ltrRe_ = new RegExp('^[' + goog.i18n.bidi.ltrChars_ + ']');
+
+
+/**
+ * Regular expression pattern to check if the first character in the string
+ * is RTL.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rtlRe_ = new RegExp('^[' + goog.i18n.bidi.rtlChars_ + ']');
+
+
+/**
+ * Check if the first character in the string is RTL or not.
+ * @param {string} str The given string that need to be tested.
+ * @return {boolean} Whether the first character in str is an RTL char.
+ */
+goog.i18n.bidi.isRtlChar = function(str) {
+ return goog.i18n.bidi.rtlRe_.test(str);
+};
+
+
+/**
+ * Check if the first character in the string is LTR or not.
+ * @param {string} str The given string that need to be tested.
+ * @return {boolean} Whether the first character in str is an LTR char.
+ */
+goog.i18n.bidi.isLtrChar = function(str) {
+ return goog.i18n.bidi.ltrRe_.test(str);
+};
+
+
+/**
+ * Check if the first character in the string is neutral or not.
+ * @param {string} str The given string that need to be tested.
+ * @return {boolean} Whether the first character in str is a neutral char.
+ */
+goog.i18n.bidi.isNeutralChar = function(str) {
+ return !goog.i18n.bidi.isLtrChar(str) && !goog.i18n.bidi.isRtlChar(str);
+};
+
+
+/**
+ * Regular expressions to check if a piece of text is of LTR directionality
+ * on first character with strong directionality.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.ltrDirCheckRe_ = new RegExp(
+ '^[^' + goog.i18n.bidi.rtlChars_ + ']*[' + goog.i18n.bidi.ltrChars_ + ']');
+
+
+/**
+ * Regular expressions to check if a piece of text is of RTL directionality
+ * on first character with strong directionality.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rtlDirCheckRe_ = new RegExp(
+ '^[^' + goog.i18n.bidi.ltrChars_ + ']*[' + goog.i18n.bidi.rtlChars_ + ']');
+
+
+/**
+ * Check whether the first strongly directional character (if any) is RTL.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether RTL directionality is detected using the first
+ * strongly-directional character method.
+ */
+goog.i18n.bidi.startsWithRtl = function(str, opt_isHtml) {
+ return goog.i18n.bidi.rtlDirCheckRe_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Check whether the first strongly directional character (if any) is RTL.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether RTL directionality is detected using the first
+ * strongly-directional character method.
+ * @deprecated Use startsWithRtl.
+ */
+goog.i18n.bidi.isRtlText = goog.i18n.bidi.startsWithRtl;
+
+
+/**
+ * Check whether the first strongly directional character (if any) is LTR.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether LTR directionality is detected using the first
+ * strongly-directional character method.
+ */
+goog.i18n.bidi.startsWithLtr = function(str, opt_isHtml) {
+ return goog.i18n.bidi.ltrDirCheckRe_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Check whether the first strongly directional character (if any) is LTR.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether LTR directionality is detected using the first
+ * strongly-directional character method.
+ * @deprecated Use startsWithLtr.
+ */
+goog.i18n.bidi.isLtrText = goog.i18n.bidi.startsWithLtr;
+
+
+/**
+ * Regular expression to check if a string looks like something that must
+ * always be LTR even in RTL text, e.g. a URL. When estimating the
+ * directionality of text containing these, we treat these as weakly LTR,
+ * like numbers.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.isRequiredLtrRe_ = /^http:\/\/.*/;
+
+
+/**
+ * Check whether the input string either contains no strongly directional
+ * characters or looks like a url.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether neutral directionality is detected.
+ */
+goog.i18n.bidi.isNeutralText = function(str, opt_isHtml) {
+ str = goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml);
+ return goog.i18n.bidi.isRequiredLtrRe_.test(str) ||
+ !goog.i18n.bidi.hasAnyLtr(str) && !goog.i18n.bidi.hasAnyRtl(str);
+};
+
+
+/**
+ * Regular expressions to check if the last strongly-directional character in a
+ * piece of text is LTR.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.ltrExitDirCheckRe_ = new RegExp(
+ '[' + goog.i18n.bidi.ltrChars_ + '][^' + goog.i18n.bidi.rtlChars_ + ']*$');
+
+
+/**
+ * Regular expressions to check if the last strongly-directional character in a
+ * piece of text is RTL.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rtlExitDirCheckRe_ = new RegExp(
+ '[' + goog.i18n.bidi.rtlChars_ + '][^' + goog.i18n.bidi.ltrChars_ + ']*$');
+
+
+/**
+ * Check if the exit directionality a piece of text is LTR, i.e. if the last
+ * strongly-directional character in the string is LTR.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether LTR exit directionality was detected.
+ */
+goog.i18n.bidi.endsWithLtr = function(str, opt_isHtml) {
+ return goog.i18n.bidi.ltrExitDirCheckRe_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Check if the exit directionality a piece of text is LTR, i.e. if the last
+ * strongly-directional character in the string is LTR.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether LTR exit directionality was detected.
+ * @deprecated Use endsWithLtr.
+ */
+goog.i18n.bidi.isLtrExitText = goog.i18n.bidi.endsWithLtr;
+
+
+/**
+ * Check if the exit directionality a piece of text is RTL, i.e. if the last
+ * strongly-directional character in the string is RTL.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether RTL exit directionality was detected.
+ */
+goog.i18n.bidi.endsWithRtl = function(str, opt_isHtml) {
+ return goog.i18n.bidi.rtlExitDirCheckRe_.test(
+ goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));
+};
+
+
+/**
+ * Check if the exit directionality a piece of text is RTL, i.e. if the last
+ * strongly-directional character in the string is RTL.
+ * @param {string} str String being checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether RTL exit directionality was detected.
+ * @deprecated Use endsWithRtl.
+ */
+goog.i18n.bidi.isRtlExitText = goog.i18n.bidi.endsWithRtl;
+
+
+/**
+ * A regular expression for matching right-to-left language codes.
+ * See {@link #isRtlLanguage} for the design.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rtlLocalesRe_ = new RegExp(
+ '^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|' +
+ '.*[-_](Arab|Hebr|Thaa|Nkoo|Tfng))' +
+ '(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)',
+ 'i');
+
+
+/**
+ * Check if a BCP 47 / III language code indicates an RTL language, i.e. either:
+ * - a language code explicitly specifying one of the right-to-left scripts,
+ * e.g. "az-Arab", or<p>
+ * - a language code specifying one of the languages normally written in a
+ * right-to-left script, e.g. "fa" (Farsi), except ones explicitly specifying
+ * Latin or Cyrillic script (which are the usual LTR alternatives).<p>
+ * The list of right-to-left scripts appears in the 100-199 range in
+ * http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic and
+ * Hebrew are by far the most widely used. We also recognize Thaana, N'Ko, and
+ * Tifinagh, which also have significant modern usage. The rest (Syriac,
+ * Samaritan, Mandaic, etc.) seem to have extremely limited or no modern usage
+ * and are not recognized to save on code size.
+ * The languages usually written in a right-to-left script are taken as those
+ * with Suppress-Script: Hebr|Arab|Thaa|Nkoo|Tfng in
+ * http://www.iana.org/assignments/language-subtag-registry,
+ * as well as Central (or Sorani) Kurdish (ckb), Sindhi (sd) and Uyghur (ug).
+ * Other subtags of the language code, e.g. regions like EG (Egypt), are
+ * ignored.
+ * @param {string} lang BCP 47 (a.k.a III) language code.
+ * @return {boolean} Whether the language code is an RTL language.
+ */
+goog.i18n.bidi.isRtlLanguage = function(lang) {
+ return goog.i18n.bidi.rtlLocalesRe_.test(lang);
+};
+
+
+/**
+ * Regular expression for bracket guard replacement in text.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.bracketGuardTextRe_ =
+ /(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)/g;
+
+
+/**
+ * Apply bracket guard using LRM and RLM. This is to address the problem of
+ * messy bracket display frequently happens in RTL layout.
+ * This function works for plain text, not for HTML. In HTML, the opening
+ * bracket might be in a different context than the closing bracket (such as
+ * an attribute value).
+ * @param {string} s The string that need to be processed.
+ * @param {boolean=} opt_isRtlContext specifies default direction (usually
+ * direction of the UI).
+ * @return {string} The processed string, with all bracket guarded.
+ */
+goog.i18n.bidi.guardBracketInText = function(s, opt_isRtlContext) {
+ var useRtl = opt_isRtlContext === undefined ? goog.i18n.bidi.hasAnyRtl(s) :
+ opt_isRtlContext;
+ var mark = useRtl ? goog.i18n.bidi.Format.RLM : goog.i18n.bidi.Format.LRM;
+ return s.replace(goog.i18n.bidi.bracketGuardTextRe_, mark + '$&' + mark);
+};
+
+
+/**
+ * Enforce the html snippet in RTL directionality regardless overall context.
+ * If the html piece was enclosed by tag, dir will be applied to existing
+ * tag, otherwise a span tag will be added as wrapper. For this reason, if
+ * html snippet start with with tag, this tag must enclose the whole piece. If
+ * the tag already has a dir specified, this new one will override existing
+ * one in behavior (tested on FF and IE).
+ * @param {string} html The string that need to be processed.
+ * @return {string} The processed string, with directionality enforced to RTL.
+ */
+goog.i18n.bidi.enforceRtlInHtml = function(html) {
+ if (html.charAt(0) == '<') {
+ return html.replace(/<\w+/, '$& dir=rtl');
+ }
+ // '\n' is important for FF so that it won't incorrectly merge span groups
+ return '\n<span dir=rtl>' + html + '</span>';
+};
+
+
+/**
+ * Enforce RTL on both end of the given text piece using unicode BiDi formatting
+ * characters RLE and PDF.
+ * @param {string} text The piece of text that need to be wrapped.
+ * @return {string} The wrapped string after process.
+ */
+goog.i18n.bidi.enforceRtlInText = function(text) {
+ return goog.i18n.bidi.Format.RLE + text + goog.i18n.bidi.Format.PDF;
+};
+
+
+/**
+ * Enforce the html snippet in RTL directionality regardless overall context.
+ * If the html piece was enclosed by tag, dir will be applied to existing
+ * tag, otherwise a span tag will be added as wrapper. For this reason, if
+ * html snippet start with with tag, this tag must enclose the whole piece. If
+ * the tag already has a dir specified, this new one will override existing
+ * one in behavior (tested on FF and IE).
+ * @param {string} html The string that need to be processed.
+ * @return {string} The processed string, with directionality enforced to RTL.
+ */
+goog.i18n.bidi.enforceLtrInHtml = function(html) {
+ if (html.charAt(0) == '<') {
+ return html.replace(/<\w+/, '$& dir=ltr');
+ }
+ // '\n' is important for FF so that it won't incorrectly merge span groups
+ return '\n<span dir=ltr>' + html + '</span>';
+};
+
+
+/**
+ * Enforce LTR on both end of the given text piece using unicode BiDi formatting
+ * characters LRE and PDF.
+ * @param {string} text The piece of text that need to be wrapped.
+ * @return {string} The wrapped string after process.
+ */
+goog.i18n.bidi.enforceLtrInText = function(text) {
+ return goog.i18n.bidi.Format.LRE + text + goog.i18n.bidi.Format.PDF;
+};
+
+
+/**
+ * Regular expression to find dimensions such as "padding: .3 0.4ex 5px 6;"
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.dimensionsRe_ =
+ /:\s*([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)/g;
+
+
+/**
+ * Regular expression for left.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.leftRe_ = /left/gi;
+
+
+/**
+ * Regular expression for right.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.rightRe_ = /right/gi;
+
+
+/**
+ * Placeholder regular expression for swapping.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.tempRe_ = /%%%%/g;
+
+
+/**
+ * Swap location parameters and 'left'/'right' in CSS specification. The
+ * processed string will be suited for RTL layout. Though this function can
+ * cover most cases, there are always exceptions. It is suggested to put
+ * those exceptions in separate group of CSS string.
+ * @param {string} cssStr CSS spefication string.
+ * @return {string} Processed CSS specification string.
+ */
+goog.i18n.bidi.mirrorCSS = function(cssStr) {
+ return cssStr
+ .
+ // reverse dimensions
+ replace(goog.i18n.bidi.dimensionsRe_, ':$1 $4 $3 $2')
+ .replace(goog.i18n.bidi.leftRe_, '%%%%')
+ . // swap left and right
+ replace(goog.i18n.bidi.rightRe_, goog.i18n.bidi.LEFT)
+ .replace(goog.i18n.bidi.tempRe_, goog.i18n.bidi.RIGHT);
+};
+
+
+/**
+ * Regular expression for hebrew double quote substitution, finding quote
+ * directly after hebrew characters.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.doubleQuoteSubstituteRe_ = /([\u0591-\u05f2])"/g;
+
+
+/**
+ * Regular expression for hebrew single quote substitution, finding quote
+ * directly after hebrew characters.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.singleQuoteSubstituteRe_ = /([\u0591-\u05f2])'/g;
+
+
+/**
+ * Replace the double and single quote directly after a Hebrew character with
+ * GERESH and GERSHAYIM. In such case, most likely that's user intention.
+ * @param {string} str String that need to be processed.
+ * @return {string} Processed string with double/single quote replaced.
+ */
+goog.i18n.bidi.normalizeHebrewQuote = function(str) {
+ return str.replace(goog.i18n.bidi.doubleQuoteSubstituteRe_, '$1\u05f4')
+ .replace(goog.i18n.bidi.singleQuoteSubstituteRe_, '$1\u05f3');
+};
+
+
+/**
+ * Regular expression to split a string into "words" for directionality
+ * estimation based on relative word counts.
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.wordSeparatorRe_ = /\s+/;
+
+
+/**
+ * Regular expression to check if a string contains any numerals. Used to
+ * differentiate between completely neutral strings and those containing
+ * numbers, which are weakly LTR.
+ *
+ * Native Arabic digits (\u0660 - \u0669) are not included because although they
+ * do flow left-to-right inside a number, this is the case even if the overall
+ * directionality is RTL, and a mathematical expression using these digits is
+ * supposed to flow right-to-left overall, including unary plus and minus
+ * appearing to the right of a number, and this does depend on the overall
+ * directionality being RTL. The digits used in Farsi (\u06F0 - \u06F9), on the
+ * other hand, are included, since Farsi math (including unary plus and minus)
+ * does flow left-to-right.
+ *
+ * @type {RegExp}
+ * @private
+ */
+goog.i18n.bidi.hasNumeralsRe_ = /[\d\u06f0-\u06f9]/;
+
+
+/**
+ * This constant controls threshold of RTL directionality.
+ * @type {number}
+ * @private
+ */
+goog.i18n.bidi.rtlDetectionThreshold_ = 0.40;
+
+
+/**
+ * Estimates the directionality of a string based on relative word counts.
+ * If the number of RTL words is above a certain percentage of the total number
+ * of strongly directional words, returns RTL.
+ * Otherwise, if any words are strongly or weakly LTR, returns LTR.
+ * Otherwise, returns UNKNOWN, which is used to mean "neutral".
+ * Numbers are counted as weakly LTR.
+ * @param {string} str The string to be checked.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {goog.i18n.bidi.Dir} Estimated overall directionality of {@code str}.
+ */
+goog.i18n.bidi.estimateDirection = function(str, opt_isHtml) {
+ var rtlCount = 0;
+ var totalCount = 0;
+ var hasWeaklyLtr = false;
+ var tokens = goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml)
+ .split(goog.i18n.bidi.wordSeparatorRe_);
+ for (var i = 0; i < tokens.length; i++) {
+ var token = tokens[i];
+ if (goog.i18n.bidi.startsWithRtl(token)) {
+ rtlCount++;
+ totalCount++;
+ } else if (goog.i18n.bidi.isRequiredLtrRe_.test(token)) {
+ hasWeaklyLtr = true;
+ } else if (goog.i18n.bidi.hasAnyLtr(token)) {
+ totalCount++;
+ } else if (goog.i18n.bidi.hasNumeralsRe_.test(token)) {
+ hasWeaklyLtr = true;
+ }
+ }
+
+ return totalCount == 0 ?
+ (hasWeaklyLtr ? goog.i18n.bidi.Dir.LTR : goog.i18n.bidi.Dir.NEUTRAL) :
+ (rtlCount / totalCount > goog.i18n.bidi.rtlDetectionThreshold_ ?
+ goog.i18n.bidi.Dir.RTL :
+ goog.i18n.bidi.Dir.LTR);
+};
+
+
+/**
+ * Check the directionality of a piece of text, return true if the piece of
+ * text should be laid out in RTL direction.
+ * @param {string} str The piece of text that need to be detected.
+ * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.
+ * Default: false.
+ * @return {boolean} Whether this piece of text should be laid out in RTL.
+ */
+goog.i18n.bidi.detectRtlDirectionality = function(str, opt_isHtml) {
+ return goog.i18n.bidi.estimateDirection(str, opt_isHtml) ==
+ goog.i18n.bidi.Dir.RTL;
+};
+
+
+/**
+ * Sets text input element's directionality and text alignment based on a
+ * given directionality. Does nothing if the given directionality is unknown or
+ * neutral.
+ * @param {Element} element Input field element to set directionality to.
+ * @param {goog.i18n.bidi.Dir|number|boolean|null} dir Desired directionality,
+ * given in one of the following formats:
+ * 1. A goog.i18n.bidi.Dir constant.
+ * 2. A number (positive = LRT, negative = RTL, 0 = neutral).
+ * 3. A boolean (true = RTL, false = LTR).
+ * 4. A null for unknown directionality.
+ */
+goog.i18n.bidi.setElementDirAndAlign = function(element, dir) {
+ if (element) {
+ dir = goog.i18n.bidi.toDir(dir);
+ if (dir) {
+ element.style.textAlign = dir == goog.i18n.bidi.Dir.RTL ?
+ goog.i18n.bidi.RIGHT :
+ goog.i18n.bidi.LEFT;
+ element.dir = dir == goog.i18n.bidi.Dir.RTL ? 'rtl' : 'ltr';
+ }
+ }
+};
+
+
+/**
+ * Sets element dir based on estimated directionality of the given text.
+ * @param {!Element} element
+ * @param {string} text
+ */
+goog.i18n.bidi.setElementDirByTextDirectionality = function(element, text) {
+ switch (goog.i18n.bidi.estimateDirection(text)) {
+ case (goog.i18n.bidi.Dir.LTR):
+ element.dir = 'ltr';
+ break;
+ case (goog.i18n.bidi.Dir.RTL):
+ element.dir = 'rtl';
+ break;
+ default:
+ // Default for no direction, inherit from document.
+ element.removeAttribute('dir');
+ }
+};
+
+
+
+/**
+ * Strings that have an (optional) known direction.
+ *
+ * Implementations of this interface are string-like objects that carry an
+ * attached direction, if known.
+ * @interface
+ */
+goog.i18n.bidi.DirectionalString = function() {};
+
+
+/**
+ * Interface marker of the DirectionalString interface.
+ *
+ * This property can be used to determine at runtime whether or not an object
+ * implements this interface. All implementations of this interface set this
+ * property to {@code true}.
+ * @type {boolean}
+ */
+goog.i18n.bidi.DirectionalString.prototype
+ .implementsGoogI18nBidiDirectionalString;
+
+
+/**
+ * Retrieves this object's known direction (if any).
+ * @return {?goog.i18n.bidi.Dir} The known direction. Null if unknown.
+ */
+goog.i18n.bidi.DirectionalString.prototype.getDirection;
diff --git a/src/http/static/viz/2/goog/iter/iter.js b/src/http/static/viz/2/goog/iter/iter.js
new file mode 100644
index 0000000..5bbb0bb
--- /dev/null
+++ b/src/http/static/viz/2/goog/iter/iter.js
@@ -0,0 +1,1284 @@
+// Copyright 2007 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Python style iteration utilities.
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+goog.provide('goog.iter');
+goog.provide('goog.iter.Iterable');
+goog.provide('goog.iter.Iterator');
+goog.provide('goog.iter.StopIteration');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.functions');
+goog.require('goog.math');
+
+
+/**
+ * @typedef {goog.iter.Iterator|{length:number}|{__iterator__}}
+ */
+goog.iter.Iterable;
+
+
+/**
+ * Singleton Error object that is used to terminate iterations.
+ * @const {!Error}
+ */
+goog.iter.StopIteration = ('StopIteration' in goog.global) ?
+ // For script engines that support legacy iterators.
+ goog.global['StopIteration'] :
+ {message: 'StopIteration', stack: ''};
+
+
+
+/**
+ * Class/interface for iterators. An iterator needs to implement a {@code next}
+ * method and it needs to throw a {@code goog.iter.StopIteration} when the
+ * iteration passes beyond the end. Iterators have no {@code hasNext} method.
+ * It is recommended to always use the helper functions to iterate over the
+ * iterator or in case you are only targeting JavaScript 1.7 for in loops.
+ * @constructor
+ * @template VALUE
+ */
+goog.iter.Iterator = function() {};
+
+
+/**
+ * Returns the next value of the iteration. This will throw the object
+ * {@see goog.iter#StopIteration} when the iteration passes the end.
+ * @return {VALUE} Any object or value.
+ */
+goog.iter.Iterator.prototype.next = function() {
+ throw goog.iter.StopIteration;
+};
+
+
+/**
+ * Returns the {@code Iterator} object itself. This is used to implement
+ * the iterator protocol in JavaScript 1.7
+ * @param {boolean=} opt_keys Whether to return the keys or values. Default is
+ * to only return the values. This is being used by the for-in loop (true)
+ * and the for-each-in loop (false). Even though the param gives a hint
+ * about what the iterator will return there is no guarantee that it will
+ * return the keys when true is passed.
+ * @return {!goog.iter.Iterator<VALUE>} The object itself.
+ */
+goog.iter.Iterator.prototype.__iterator__ = function(opt_keys) {
+ return this;
+};
+
+
+/**
+ * Returns an iterator that knows how to iterate over the values in the object.
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable If the
+ * object is an iterator it will be returned as is. If the object has an
+ * {@code __iterator__} method that will be called to get the value
+ * iterator. If the object is an array-like object we create an iterator
+ * for that.
+ * @return {!goog.iter.Iterator<VALUE>} An iterator that knows how to iterate
+ * over the values in {@code iterable}.
+ * @template VALUE
+ */
+goog.iter.toIterator = function(iterable) {
+ if (iterable instanceof goog.iter.Iterator) {
+ return iterable;
+ }
+ if (typeof iterable.__iterator__ == 'function') {
+ return iterable.__iterator__(false);
+ }
+ if (goog.isArrayLike(iterable)) {
+ var i = 0;
+ var newIter = new goog.iter.Iterator;
+ newIter.next = function() {
+ while (true) {
+ if (i >= iterable.length) {
+ throw goog.iter.StopIteration;
+ }
+ // Don't include deleted elements.
+ if (!(i in iterable)) {
+ i++;
+ continue;
+ }
+ return iterable[i++];
+ }
+ };
+ return newIter;
+ }
+
+
+ // TODO(arv): Should we fall back on goog.structs.getValues()?
+ throw Error('Not implemented');
+};
+
+
+/**
+ * Calls a function for each element in the iterator with the element of the
+ * iterator passed as argument.
+ *
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator
+ * to iterate over. If the iterable is an object {@code toIterator} will be
+ * called on it.
+ * @param {function(this:THIS,VALUE,?,!goog.iter.Iterator<VALUE>)} f
+ * The function to call for every element. This function takes 3 arguments
+ * (the element, undefined, and the iterator) and the return value is
+ * irrelevant. The reason for passing undefined as the second argument is
+ * so that the same function can be used in {@see goog.array#forEach} as
+ * well as others. The third parameter is of type "number" for
+ * arraylike objects, undefined, otherwise.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within
+ * {@code f}.
+ * @template THIS, VALUE
+ */
+goog.iter.forEach = function(iterable, f, opt_obj) {
+ if (goog.isArrayLike(iterable)) {
+
+ try {
+ // NOTES: this passes the index number to the second parameter
+ // of the callback contrary to the documentation above.
+ goog.array.forEach(
+ /** @type {IArrayLike<?>} */ (iterable), f, opt_obj);
+ } catch (ex) {
+ if (ex !== goog.iter.StopIteration) {
+ throw ex;
+ }
+ }
+ } else {
+ iterable = goog.iter.toIterator(iterable);
+
+ try {
+ while (true) {
+ f.call(opt_obj, iterable.next(), undefined, iterable);
+ }
+ } catch (ex) {
+ if (ex !== goog.iter.StopIteration) {
+ throw ex;
+ }
+ }
+ }
+};
+
+
+/**
+ * Calls a function for every element in the iterator, and if the function
+ * returns true adds the element to a new iterator.
+ *
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator
+ * to iterate over.
+ * @param {
+ * function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f
+ * The function to call for every element. This function takes 3 arguments
+ * (the element, undefined, and the iterator) and should return a boolean.
+ * If the return value is true the element will be included in the returned
+ * iterator. If it is false the element is not included.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within
+ * {@code f}.
+ * @return {!goog.iter.Iterator<VALUE>} A new iterator in which only elements
+ * that passed the test are present.
+ * @template THIS, VALUE
+ */
+goog.iter.filter = function(iterable, f, opt_obj) {
+ var iterator = goog.iter.toIterator(iterable);
+ var newIter = new goog.iter.Iterator;
+ newIter.next = function() {
+ while (true) {
+ var val = iterator.next();
+ if (f.call(opt_obj, val, undefined, iterator)) {
+ return val;
+ }
+ }
+ };
+ return newIter;
+};
+
+
+/**
+ * Calls a function for every element in the iterator, and if the function
+ * returns false adds the element to a new iterator.
+ *
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator
+ * to iterate over.
+ * @param {
+ * function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f
+ * The function to call for every element. This function takes 3 arguments
+ * (the element, undefined, and the iterator) and should return a boolean.
+ * If the return value is false the element will be included in the returned
+ * iterator. If it is true the element is not included.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within
+ * {@code f}.
+ * @return {!goog.iter.Iterator<VALUE>} A new iterator in which only elements
+ * that did not pass the test are present.
+ * @template THIS, VALUE
+ */
+goog.iter.filterFalse = function(iterable, f, opt_obj) {
+ return goog.iter.filter(iterable, goog.functions.not(f), opt_obj);
+};
+
+
+/**
+ * Creates a new iterator that returns the values in a range. This function
+ * can take 1, 2 or 3 arguments:
+ * <pre>
+ * range(5) same as range(0, 5, 1)
+ * range(2, 5) same as range(2, 5, 1)
+ * </pre>
+ *
+ * @param {number} startOrStop The stop value if only one argument is provided.
+ * The start value if 2 or more arguments are provided. If only one
+ * argument is used the start value is 0.
+ * @param {number=} opt_stop The stop value. If left out then the first
+ * argument is used as the stop value.
+ * @param {number=} opt_step The number to increment with between each call to
+ * next. This can be negative.
+ * @return {!goog.iter.Iterator<number>} A new iterator that returns the values
+ * in the range.
+ */
+goog.iter.range = function(startOrStop, opt_stop, opt_step) {
+ var start = 0;
+ var stop = startOrStop;
+ var step = opt_step || 1;
+ if (arguments.length > 1) {
+ start = startOrStop;
+ stop = opt_stop;
+ }
+ if (step == 0) {
+ throw Error('Range step argument must not be zero');
+ }
+
+ var newIter = new goog.iter.Iterator;
+ newIter.next = function() {
+ if (step > 0 && start >= stop || step < 0 && start <= stop) {
+ throw goog.iter.StopIteration;
+ }
+ var rv = start;
+ start += step;
+ return rv;
+ };
+ return newIter;
+};
+
+
+/**
+ * Joins the values in a iterator with a delimiter.
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator
+ * to get the values from.
+ * @param {string} deliminator The text to put between the values.
+ * @return {string} The joined value string.
+ * @template VALUE
+ */
+goog.iter.join = function(iterable, deliminator) {
+ return goog.iter.toArray(iterable).join(deliminator);
+};
+
+
+/**
+ * For every element in the iterator call a function and return a new iterator
+ * with that value.
+ *
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterator to iterate over.
+ * @param {
+ * function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):RESULT} f
+ * The function to call for every element. This function takes 3 arguments
+ * (the element, undefined, and the iterator) and should return a new value.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within
+ * {@code f}.
+ * @return {!goog.iter.Iterator<RESULT>} A new iterator that returns the
+ * results of applying the function to each element in the original
+ * iterator.
+ * @template THIS, VALUE, RESULT
+ */
+goog.iter.map = function(iterable, f, opt_obj) {
+ var iterator = goog.iter.toIterator(iterable);
+ var newIter = new goog.iter.Iterator;
+ newIter.next = function() {
+ var val = iterator.next();
+ return f.call(opt_obj, val, undefined, iterator);
+ };
+ return newIter;
+};
+
+
+/**
+ * Passes every element of an iterator into a function and accumulates the
+ * result.
+ *
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator
+ * to iterate over.
+ * @param {function(this:THIS,VALUE,VALUE):VALUE} f The function to call for
+ * every element. This function takes 2 arguments (the function's previous
+ * result or the initial value, and the value of the current element).
+ * function(previousValue, currentElement) : newValue.
+ * @param {VALUE} val The initial value to pass into the function on the first
+ * call.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within
+ * f.
+ * @return {VALUE} Result of evaluating f repeatedly across the values of
+ * the iterator.
+ * @template THIS, VALUE
+ */
+goog.iter.reduce = function(iterable, f, val, opt_obj) {
+ var rval = val;
+ goog.iter.forEach(
+ iterable, function(val) { rval = f.call(opt_obj, rval, val); });
+ return rval;
+};
+
+
+/**
+ * Goes through the values in the iterator. Calls f for each of these, and if
+ * any of them returns true, this returns true (without checking the rest). If
+ * all return false this will return false.
+ *
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator
+ * object.
+ * @param {
+ * function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f
+ * The function to call for every value. This function takes 3 arguments
+ * (the value, undefined, and the iterator) and should return a boolean.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within
+ * {@code f}.
+ * @return {boolean} true if any value passes the test.
+ * @template THIS, VALUE
+ */
+goog.iter.some = function(iterable, f, opt_obj) {
+ iterable = goog.iter.toIterator(iterable);
+
+ try {
+ while (true) {
+ if (f.call(opt_obj, iterable.next(), undefined, iterable)) {
+ return true;
+ }
+ }
+ } catch (ex) {
+ if (ex !== goog.iter.StopIteration) {
+ throw ex;
+ }
+ }
+ return false;
+};
+
+
+/**
+ * Goes through the values in the iterator. Calls f for each of these and if any
+ * of them returns false this returns false (without checking the rest). If all
+ * return true this will return true.
+ *
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator
+ * object.
+ * @param {
+ * function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f
+ * The function to call for every value. This function takes 3 arguments
+ * (the value, undefined, and the iterator) and should return a boolean.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within
+ * {@code f}.
+ * @return {boolean} true if every value passes the test.
+ * @template THIS, VALUE
+ */
+goog.iter.every = function(iterable, f, opt_obj) {
+ iterable = goog.iter.toIterator(iterable);
+
+ try {
+ while (true) {
+ if (!f.call(opt_obj, iterable.next(), undefined, iterable)) {
+ return false;
+ }
+ }
+ } catch (ex) {
+ if (ex !== goog.iter.StopIteration) {
+ throw ex;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * Takes zero or more iterables and returns one iterator that will iterate over
+ * them in the order chained.
+ * @param {...!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} var_args Any
+ * number of iterable objects.
+ * @return {!goog.iter.Iterator<VALUE>} Returns a new iterator that will
+ * iterate over all the given iterables' contents.
+ * @template VALUE
+ */
+goog.iter.chain = function(var_args) {
+ return goog.iter.chainFromIterable(arguments);
+};
+
+
+/**
+ * Takes a single iterable containing zero or more iterables and returns one
+ * iterator that will iterate over each one in the order given.
+ * @see https://goo.gl/5NRp5d
+ * @param {goog.iter.Iterable} iterable The iterable of iterables to chain.
+ * @return {!goog.iter.Iterator<VALUE>} Returns a new iterator that will
+ * iterate over all the contents of the iterables contained within
+ * {@code iterable}.
+ * @template VALUE
+ */
+goog.iter.chainFromIterable = function(iterable) {
+ var iterator = goog.iter.toIterator(iterable);
+ var iter = new goog.iter.Iterator();
+ var current = null;
+
+ iter.next = function() {
+ while (true) {
+ if (current == null) {
+ var it = iterator.next();
+ current = goog.iter.toIterator(it);
+ }
+ try {
+ return current.next();
+ } catch (ex) {
+ if (ex !== goog.iter.StopIteration) {
+ throw ex;
+ }
+ current = null;
+ }
+ }
+ };
+
+ return iter;
+};
+
+
+/**
+ * Builds a new iterator that iterates over the original, but skips elements as
+ * long as a supplied function returns true.
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator
+ * object.
+ * @param {
+ * function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f
+ * The function to call for every value. This function takes 3 arguments
+ * (the value, undefined, and the iterator) and should return a boolean.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within
+ * {@code f}.
+ * @return {!goog.iter.Iterator<VALUE>} A new iterator that drops elements from
+ * the original iterator as long as {@code f} is true.
+ * @template THIS, VALUE
+ */
+goog.iter.dropWhile = function(iterable, f, opt_obj) {
+ var iterator = goog.iter.toIterator(iterable);
+ var newIter = new goog.iter.Iterator;
+ var dropping = true;
+ newIter.next = function() {
+ while (true) {
+ var val = iterator.next();
+ if (dropping && f.call(opt_obj, val, undefined, iterator)) {
+ continue;
+ } else {
+ dropping = false;
+ }
+ return val;
+ }
+ };
+ return newIter;
+};
+
+
+/**
+ * Builds a new iterator that iterates over the original, but only as long as a
+ * supplied function returns true.
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator
+ * object.
+ * @param {
+ * function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f
+ * The function to call for every value. This function takes 3 arguments
+ * (the value, undefined, and the iterator) and should return a boolean.
+ * @param {THIS=} opt_obj This is used as the 'this' object in f when called.
+ * @return {!goog.iter.Iterator<VALUE>} A new iterator that keeps elements in
+ * the original iterator as long as the function is true.
+ * @template THIS, VALUE
+ */
+goog.iter.takeWhile = function(iterable, f, opt_obj) {
+ var iterator = goog.iter.toIterator(iterable);
+ var iter = new goog.iter.Iterator();
+ iter.next = function() {
+ var val = iterator.next();
+ if (f.call(opt_obj, val, undefined, iterator)) {
+ return val;
+ }
+ throw goog.iter.StopIteration;
+ };
+ return iter;
+};
+
+
+/**
+ * Converts the iterator to an array
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator
+ * to convert to an array.
+ * @return {!Array<VALUE>} An array of the elements the iterator iterates over.
+ * @template VALUE
+ */
+goog.iter.toArray = function(iterable) {
+ // Fast path for array-like.
+ if (goog.isArrayLike(iterable)) {
+ return goog.array.toArray(/** @type {!IArrayLike<?>} */ (iterable));
+ }
+ iterable = goog.iter.toIterator(iterable);
+ var array = [];
+ goog.iter.forEach(iterable, function(val) { array.push(val); });
+ return array;
+};
+
+
+/**
+ * Iterates over two iterables and returns true if they contain the same
+ * sequence of elements and have the same length.
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable1 The first
+ * iterable object.
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable2 The second
+ * iterable object.
+ * @param {function(VALUE,VALUE):boolean=} opt_equalsFn Optional comparison
+ * function.
+ * Should take two arguments to compare, and return true if the arguments
+ * are equal. Defaults to {@link goog.array.defaultCompareEquality} which
+ * compares the elements using the built-in '===' operator.
+ * @return {boolean} true if the iterables contain the same sequence of elements
+ * and have the same length.
+ * @template VALUE
+ */
+goog.iter.equals = function(iterable1, iterable2, opt_equalsFn) {
+ var fillValue = {};
+ var pairs = goog.iter.zipLongest(fillValue, iterable1, iterable2);
+ var equalsFn = opt_equalsFn || goog.array.defaultCompareEquality;
+ return goog.iter.every(
+ pairs, function(pair) { return equalsFn(pair[0], pair[1]); });
+};
+
+
+/**
+ * Advances the iterator to the next position, returning the given default value
+ * instead of throwing an exception if the iterator has no more entries.
+ * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterable
+ * object.
+ * @param {VALUE} defaultValue The value to return if the iterator is empty.
+ * @return {VALUE} The next item in the iteration, or defaultValue if the
+ * iterator was empty.
+ * @template VALUE
+ */
+goog.iter.nextOrValue = function(iterable, defaultValue) {
+ try {
+ return goog.iter.toIterator(iterable).next();
+ } catch (e) {
+ if (e != goog.iter.StopIteration) {
+ throw e;
+ }
+ return defaultValue;
+ }
+};
+
+
+/**
+ * Cartesian product of zero or more sets. Gives an iterator that gives every
+ * combination of one element chosen from each set. For example,
+ * ([1, 2], [3, 4]) gives ([1, 3], [1, 4], [2, 3], [2, 4]).
+ * @see http://docs.python.org/library/itertools.html#itertools.product
+ * @param {...!IArrayLike<VALUE>} var_args Zero or more sets, as
+ * arrays.
+ * @return {!goog.iter.Iterator<!Array<VALUE>>} An iterator that gives each
+ * n-tuple (as an array).
+ * @template VALUE
+ */
+goog.iter.product = function(var_args) {
+ var someArrayEmpty =
+ goog.array.some(arguments, function(arr) { return !arr.length; });
+
+ // An empty set in a cartesian product gives an empty set.
+ if (someArrayEmpty || !arguments.length) {
+ return new goog.iter.Iterator();
+ }
+
+ var iter = new goog.iter.Iterator();
+ var arrays = arguments;
+
+ // The first indices are [0, 0, ...]
+ var indicies = goog.array.repeat(0, arrays.length);
+
+ iter.next = function() {
+
+ if (indicies) {
+ var retVal = goog.array.map(indicies, function(valueIndex, arrayIndex) {
+ return arrays[arrayIndex][valueIndex];
+ });
+
+ // Generate the next-largest indices for the next call.
+ // Increase the rightmost index. If it goes over, increase the next
+ // rightmost (like carry-over addition).
+ for (var i = indicies.length - 1; i >= 0; i--) {
+ // Assertion prevents compiler warning below.
+ goog.asserts.assert(indicies);
+ if (indicies[i] < arrays[i].length - 1) {
+ indicies[i]++;
+ break;
+ }
+
+ // We're at the last indices (the last element of every array), so
+ // the iteration is over on the next call.
+ if (i == 0) {
+ indicies = null;
+ break;
+ }
+ // Reset the index in this column and loop back to increment the
+ // next one.
+ indicies[i] = 0;
+ }
+ return retVal;
+ }
+
+ throw goog.iter.StopIteration;
+ };
+
+ return iter;
+};
+
+
+/**
+ * Create an iterator to cycle over the iterable's elements indefinitely.
+ * For example, ([1, 2, 3]) would return : 1, 2, 3, 1, 2, 3, ...
+ * @see: http://docs.python.org/library/itertools.html#itertools.cycle.
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable object.
+ * @return {!goog.iter.Iterator<VALUE>} An iterator that iterates indefinitely
+ * over the values in {@code iterable}.
+ * @template VALUE
+ */
+goog.iter.cycle = function(iterable) {
+ var baseIterator = goog.iter.toIterator(iterable);
+
+ // We maintain a cache to store the iterable elements as we iterate
+ // over them. The cache is used to return elements once we have
+ // iterated over the iterable once.
+ var cache = [];
+ var cacheIndex = 0;
+
+ var iter = new goog.iter.Iterator();
+
+ // This flag is set after the iterable is iterated over once
+ var useCache = false;
+
+ iter.next = function() {
+ var returnElement = null;
+
+ // Pull elements off the original iterator if not using cache
+ if (!useCache) {
+ try {
+ // Return the element from the iterable
+ returnElement = baseIterator.next();
+ cache.push(returnElement);
+ return returnElement;
+ } catch (e) {
+ // If an exception other than StopIteration is thrown
+ // or if there are no elements to iterate over (the iterable was empty)
+ // throw an exception
+ if (e != goog.iter.StopIteration || goog.array.isEmpty(cache)) {
+ throw e;
+ }
+ // set useCache to true after we know that a 'StopIteration' exception
+ // was thrown and the cache is not empty (to handle the 'empty iterable'
+ // use case)
+ useCache = true;
+ }
+ }
+
+ returnElement = cache[cacheIndex];
+ cacheIndex = (cacheIndex + 1) % cache.length;
+
+ return returnElement;
+ };
+
+ return iter;
+};
+
+
+/**
+ * Creates an iterator that counts indefinitely from a starting value.
+ * @see http://docs.python.org/2/library/itertools.html#itertools.count
+ * @param {number=} opt_start The starting value. Default is 0.
+ * @param {number=} opt_step The number to increment with between each call to
+ * next. Negative and floating point numbers are allowed. Default is 1.
+ * @return {!goog.iter.Iterator<number>} A new iterator that returns the values
+ * in the series.
+ */
+goog.iter.count = function(opt_start, opt_step) {
+ var counter = opt_start || 0;
+ var step = goog.isDef(opt_step) ? opt_step : 1;
+ var iter = new goog.iter.Iterator();
+
+ iter.next = function() {
+ var returnValue = counter;
+ counter += step;
+ return returnValue;
+ };
+
+ return iter;
+};
+
+
+/**
+ * Creates an iterator that returns the same object or value repeatedly.
+ * @param {VALUE} value Any object or value to repeat.
+ * @return {!goog.iter.Iterator<VALUE>} A new iterator that returns the
+ * repeated value.
+ * @template VALUE
+ */
+goog.iter.repeat = function(value) {
+ var iter = new goog.iter.Iterator();
+
+ iter.next = goog.functions.constant(value);
+
+ return iter;
+};
+
+
+/**
+ * Creates an iterator that returns running totals from the numbers in
+ * {@code iterable}. For example, the array {@code [1, 2, 3, 4, 5]} yields
+ * {@code 1 -> 3 -> 6 -> 10 -> 15}.
+ * @see http://docs.python.org/3.2/library/itertools.html#itertools.accumulate
+ * @param {!goog.iter.Iterable} iterable The iterable of numbers to
+ * accumulate.
+ * @return {!goog.iter.Iterator<number>} A new iterator that returns the
+ * numbers in the series.
+ */
+goog.iter.accumulate = function(iterable) {
+ var iterator = goog.iter.toIterator(iterable);
+ var total = 0;
+ var iter = new goog.iter.Iterator();
+
+ iter.next = function() {
+ total += iterator.next();
+ return total;
+ };
+
+ return iter;
+};
+
+
+/**
+ * Creates an iterator that returns arrays containing the ith elements from the
+ * provided iterables. The returned arrays will be the same size as the number
+ * of iterables given in {@code var_args}. Once the shortest iterable is
+ * exhausted, subsequent calls to {@code next()} will throw
+ * {@code goog.iter.StopIteration}.
+ * @see http://docs.python.org/2/library/itertools.html#itertools.izip
+ * @param {...!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} var_args Any
+ * number of iterable objects.
+ * @return {!goog.iter.Iterator<!Array<VALUE>>} A new iterator that returns
+ * arrays of elements from the provided iterables.
+ * @template VALUE
+ */
+goog.iter.zip = function(var_args) {
+ var args = arguments;
+ var iter = new goog.iter.Iterator();
+
+ if (args.length > 0) {
+ var iterators = goog.array.map(args, goog.iter.toIterator);
+ iter.next = function() {
+ var arr = goog.array.map(iterators, function(it) { return it.next(); });
+ return arr;
+ };
+ }
+
+ return iter;
+};
+
+
+/**
+ * Creates an iterator that returns arrays containing the ith elements from the
+ * provided iterables. The returned arrays will be the same size as the number
+ * of iterables given in {@code var_args}. Shorter iterables will be extended
+ * with {@code fillValue}. Once the longest iterable is exhausted, subsequent
+ * calls to {@code next()} will throw {@code goog.iter.StopIteration}.
+ * @see http://docs.python.org/2/library/itertools.html#itertools.izip_longest
+ * @param {VALUE} fillValue The object or value used to fill shorter iterables.
+ * @param {...!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} var_args Any
+ * number of iterable objects.
+ * @return {!goog.iter.Iterator<!Array<VALUE>>} A new iterator that returns
+ * arrays of elements from the provided iterables.
+ * @template VALUE
+ */
+goog.iter.zipLongest = function(fillValue, var_args) {
+ var args = goog.array.slice(arguments, 1);
+ var iter = new goog.iter.Iterator();
+
+ if (args.length > 0) {
+ var iterators = goog.array.map(args, goog.iter.toIterator);
+
+ iter.next = function() {
+ var iteratorsHaveValues = false; // false when all iterators are empty.
+ var arr = goog.array.map(iterators, function(it) {
+ var returnValue;
+ try {
+ returnValue = it.next();
+ // Iterator had a value, so we've not exhausted the iterators.
+ // Set flag accordingly.
+ iteratorsHaveValues = true;
+ } catch (ex) {
+ if (ex !== goog.iter.StopIteration) {
+ throw ex;
+ }
+ returnValue = fillValue;
+ }
+ return returnValue;
+ });
+
+ if (!iteratorsHaveValues) {
+ throw goog.iter.StopIteration;
+ }
+ return arr;
+ };
+ }
+
+ return iter;
+};
+
+
+/**
+ * Creates an iterator that filters {@code iterable} based on a series of
+ * {@code selectors}. On each call to {@code next()}, one item is taken from
+ * both the {@code iterable} and {@code selectors} iterators. If the item from
+ * {@code selectors} evaluates to true, the item from {@code iterable} is given.
+ * Otherwise, it is skipped. Once either {@code iterable} or {@code selectors}
+ * is exhausted, subsequent calls to {@code next()} will throw
+ * {@code goog.iter.StopIteration}.
+ * @see http://docs.python.org/2/library/itertools.html#itertools.compress
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable to filter.
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} selectors An
+ * iterable of items to be evaluated in a boolean context to determine if
+ * the corresponding element in {@code iterable} should be included in the
+ * result.
+ * @return {!goog.iter.Iterator<VALUE>} A new iterator that returns the
+ * filtered values.
+ * @template VALUE
+ */
+goog.iter.compress = function(iterable, selectors) {
+ var selectorIterator = goog.iter.toIterator(selectors);
+
+ return goog.iter.filter(
+ iterable, function() { return !!selectorIterator.next(); });
+};
+
+
+
+/**
+ * Implements the {@code goog.iter.groupBy} iterator.
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable to group.
+ * @param {function(VALUE): KEY=} opt_keyFunc Optional function for
+ * determining the key value for each group in the {@code iterable}. Default
+ * is the identity function.
+ * @constructor
+ * @extends {goog.iter.Iterator<!Array<?>>}
+ * @template KEY, VALUE
+ * @private
+ */
+goog.iter.GroupByIterator_ = function(iterable, opt_keyFunc) {
+
+ /**
+ * The iterable to group, coerced to an iterator.
+ * @type {!goog.iter.Iterator}
+ */
+ this.iterator = goog.iter.toIterator(iterable);
+
+ /**
+ * A function for determining the key value for each element in the iterable.
+ * If no function is provided, the identity function is used and returns the
+ * element unchanged.
+ * @type {function(VALUE): KEY}
+ */
+ this.keyFunc = opt_keyFunc || goog.functions.identity;
+
+ /**
+ * The target key for determining the start of a group.
+ * @type {KEY}
+ */
+ this.targetKey;
+
+ /**
+ * The current key visited during iteration.
+ * @type {KEY}
+ */
+ this.currentKey;
+
+ /**
+ * The current value being added to the group.
+ * @type {VALUE}
+ */
+ this.currentValue;
+};
+goog.inherits(goog.iter.GroupByIterator_, goog.iter.Iterator);
+
+
+/** @override */
+goog.iter.GroupByIterator_.prototype.next = function() {
+ while (this.currentKey == this.targetKey) {
+ this.currentValue = this.iterator.next(); // Exits on StopIteration
+ this.currentKey = this.keyFunc(this.currentValue);
+ }
+ this.targetKey = this.currentKey;
+ return [this.currentKey, this.groupItems_(this.targetKey)];
+};
+
+
+/**
+ * Performs the grouping of objects using the given key.
+ * @param {KEY} targetKey The target key object for the group.
+ * @return {!Array<VALUE>} An array of grouped objects.
+ * @private
+ */
+goog.iter.GroupByIterator_.prototype.groupItems_ = function(targetKey) {
+ var arr = [];
+ while (this.currentKey == targetKey) {
+ arr.push(this.currentValue);
+ try {
+ this.currentValue = this.iterator.next();
+ } catch (ex) {
+ if (ex !== goog.iter.StopIteration) {
+ throw ex;
+ }
+ break;
+ }
+ this.currentKey = this.keyFunc(this.currentValue);
+ }
+ return arr;
+};
+
+
+/**
+ * Creates an iterator that returns arrays containing elements from the
+ * {@code iterable} grouped by a key value. For iterables with repeated
+ * elements (i.e. sorted according to a particular key function), this function
+ * has a {@code uniq}-like effect. For example, grouping the array:
+ * {@code [A, B, B, C, C, A]} produces
+ * {@code [A, [A]], [B, [B, B]], [C, [C, C]], [A, [A]]}.
+ * @see http://docs.python.org/2/library/itertools.html#itertools.groupby
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable to group.
+ * @param {function(VALUE): KEY=} opt_keyFunc Optional function for
+ * determining the key value for each group in the {@code iterable}. Default
+ * is the identity function.
+ * @return {!goog.iter.Iterator<!Array<?>>} A new iterator that returns
+ * arrays of consecutive key and groups.
+ * @template KEY, VALUE
+ */
+goog.iter.groupBy = function(iterable, opt_keyFunc) {
+ return new goog.iter.GroupByIterator_(iterable, opt_keyFunc);
+};
+
+
+/**
+ * Gives an iterator that gives the result of calling the given function
+ * <code>f</code> with the arguments taken from the next element from
+ * <code>iterable</code> (the elements are expected to also be iterables).
+ *
+ * Similar to {@see goog.iter#map} but allows the function to accept multiple
+ * arguments from the iterable.
+ *
+ * @param {!goog.iter.Iterable} iterable The iterable of
+ * iterables to iterate over.
+ * @param {function(this:THIS,...*):RESULT} f The function to call for every
+ * element. This function takes N+2 arguments, where N represents the
+ * number of items from the next element of the iterable. The two
+ * additional arguments passed to the function are undefined and the
+ * iterator itself. The function should return a new value.
+ * @param {THIS=} opt_obj The object to be used as the value of 'this' within
+ * {@code f}.
+ * @return {!goog.iter.Iterator<RESULT>} A new iterator that returns the
+ * results of applying the function to each element in the original
+ * iterator.
+ * @template THIS, RESULT
+ */
+goog.iter.starMap = function(iterable, f, opt_obj) {
+ var iterator = goog.iter.toIterator(iterable);
+ var iter = new goog.iter.Iterator();
+
+ iter.next = function() {
+ var args = goog.iter.toArray(iterator.next());
+ return f.apply(opt_obj, goog.array.concat(args, undefined, iterator));
+ };
+
+ return iter;
+};
+
+
+/**
+ * Returns an array of iterators each of which can iterate over the values in
+ * {@code iterable} without advancing the others.
+ * @see http://docs.python.org/2/library/itertools.html#itertools.tee
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable to tee.
+ * @param {number=} opt_num The number of iterators to create. Default is 2.
+ * @return {!Array<goog.iter.Iterator<VALUE>>} An array of iterators.
+ * @template VALUE
+ */
+goog.iter.tee = function(iterable, opt_num) {
+ var iterator = goog.iter.toIterator(iterable);
+ var num = goog.isNumber(opt_num) ? opt_num : 2;
+ var buffers =
+ goog.array.map(goog.array.range(num), function() { return []; });
+
+ var addNextIteratorValueToBuffers = function() {
+ var val = iterator.next();
+ goog.array.forEach(buffers, function(buffer) { buffer.push(val); });
+ };
+
+ var createIterator = function(buffer) {
+ // Each tee'd iterator has an associated buffer (initially empty). When a
+ // tee'd iterator's buffer is empty, it calls
+ // addNextIteratorValueToBuffers(), adding the next value to all tee'd
+ // iterators' buffers, and then returns that value. This allows each
+ // iterator to be advanced independently.
+ var iter = new goog.iter.Iterator();
+
+ iter.next = function() {
+ if (goog.array.isEmpty(buffer)) {
+ addNextIteratorValueToBuffers();
+ }
+ goog.asserts.assert(!goog.array.isEmpty(buffer));
+ return buffer.shift();
+ };
+
+ return iter;
+ };
+
+ return goog.array.map(buffers, createIterator);
+};
+
+
+/**
+ * Creates an iterator that returns arrays containing a count and an element
+ * obtained from the given {@code iterable}.
+ * @see http://docs.python.org/2/library/functions.html#enumerate
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable to enumerate.
+ * @param {number=} opt_start Optional starting value. Default is 0.
+ * @return {!goog.iter.Iterator<!Array<?>>} A new iterator containing
+ * count/item pairs.
+ * @template VALUE
+ */
+goog.iter.enumerate = function(iterable, opt_start) {
+ return goog.iter.zip(goog.iter.count(opt_start), iterable);
+};
+
+
+/**
+ * Creates an iterator that returns the first {@code limitSize} elements from an
+ * iterable. If this number is greater than the number of elements in the
+ * iterable, all the elements are returned.
+ * @see http://goo.gl/V0sihp Inspired by the limit iterator in Guava.
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable to limit.
+ * @param {number} limitSize The maximum number of elements to return.
+ * @return {!goog.iter.Iterator<VALUE>} A new iterator containing
+ * {@code limitSize} elements.
+ * @template VALUE
+ */
+goog.iter.limit = function(iterable, limitSize) {
+ goog.asserts.assert(goog.math.isInt(limitSize) && limitSize >= 0);
+
+ var iterator = goog.iter.toIterator(iterable);
+
+ var iter = new goog.iter.Iterator();
+ var remaining = limitSize;
+
+ iter.next = function() {
+ if (remaining-- > 0) {
+ return iterator.next();
+ }
+ throw goog.iter.StopIteration;
+ };
+
+ return iter;
+};
+
+
+/**
+ * Creates an iterator that is advanced {@code count} steps ahead. Consumed
+ * values are silently discarded. If {@code count} is greater than the number
+ * of elements in {@code iterable}, an empty iterator is returned. Subsequent
+ * calls to {@code next()} will throw {@code goog.iter.StopIteration}.
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable to consume.
+ * @param {number} count The number of elements to consume from the iterator.
+ * @return {!goog.iter.Iterator<VALUE>} An iterator advanced zero or more steps
+ * ahead.
+ * @template VALUE
+ */
+goog.iter.consume = function(iterable, count) {
+ goog.asserts.assert(goog.math.isInt(count) && count >= 0);
+
+ var iterator = goog.iter.toIterator(iterable);
+
+ while (count-- > 0) {
+ goog.iter.nextOrValue(iterator, null);
+ }
+
+ return iterator;
+};
+
+
+/**
+ * Creates an iterator that returns a range of elements from an iterable.
+ * Similar to {@see goog.array#slice} but does not support negative indexes.
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable to slice.
+ * @param {number} start The index of the first element to return.
+ * @param {number=} opt_end The index after the last element to return. If
+ * defined, must be greater than or equal to {@code start}.
+ * @return {!goog.iter.Iterator<VALUE>} A new iterator containing a slice of
+ * the original.
+ * @template VALUE
+ */
+goog.iter.slice = function(iterable, start, opt_end) {
+ goog.asserts.assert(goog.math.isInt(start) && start >= 0);
+
+ var iterator = goog.iter.consume(iterable, start);
+
+ if (goog.isNumber(opt_end)) {
+ goog.asserts.assert(goog.math.isInt(opt_end) && opt_end >= start);
+ iterator = goog.iter.limit(iterator, opt_end - start /* limitSize */);
+ }
+
+ return iterator;
+};
+
+
+/**
+ * Checks an array for duplicate elements.
+ * @param {?IArrayLike<VALUE>} arr The array to check for
+ * duplicates.
+ * @return {boolean} True, if the array contains duplicates, false otherwise.
+ * @private
+ * @template VALUE
+ */
+// TODO(user): Consider moving this into goog.array as a public function.
+goog.iter.hasDuplicates_ = function(arr) {
+ var deduped = [];
+ goog.array.removeDuplicates(arr, deduped);
+ return arr.length != deduped.length;
+};
+
+
+/**
+ * Creates an iterator that returns permutations of elements in
+ * {@code iterable}.
+ *
+ * Permutations are obtained by taking the Cartesian product of
+ * {@code opt_length} iterables and filtering out those with repeated
+ * elements. For example, the permutations of {@code [1,2,3]} are
+ * {@code [[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]}.
+ * @see http://docs.python.org/2/library/itertools.html#itertools.permutations
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable from which to generate permutations.
+ * @param {number=} opt_length Length of each permutation. If omitted, defaults
+ * to the length of {@code iterable}.
+ * @return {!goog.iter.Iterator<!Array<VALUE>>} A new iterator containing the
+ * permutations of {@code iterable}.
+ * @template VALUE
+ */
+goog.iter.permutations = function(iterable, opt_length) {
+ var elements = goog.iter.toArray(iterable);
+ var length = goog.isNumber(opt_length) ? opt_length : elements.length;
+
+ var sets = goog.array.repeat(elements, length);
+ var product = goog.iter.product.apply(undefined, sets);
+
+ return goog.iter.filter(
+ product, function(arr) { return !goog.iter.hasDuplicates_(arr); });
+};
+
+
+/**
+ * Creates an iterator that returns combinations of elements from
+ * {@code iterable}.
+ *
+ * Combinations are obtained by taking the {@see goog.iter#permutations} of
+ * {@code iterable} and filtering those whose elements appear in the order they
+ * are encountered in {@code iterable}. For example, the 3-length combinations
+ * of {@code [0,1,2,3]} are {@code [[0,1,2], [0,1,3], [0,2,3], [1,2,3]]}.
+ * @see http://docs.python.org/2/library/itertools.html#itertools.combinations
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable from which to generate combinations.
+ * @param {number} length The length of each combination.
+ * @return {!goog.iter.Iterator<!Array<VALUE>>} A new iterator containing
+ * combinations from the {@code iterable}.
+ * @template VALUE
+ */
+goog.iter.combinations = function(iterable, length) {
+ var elements = goog.iter.toArray(iterable);
+ var indexes = goog.iter.range(elements.length);
+ var indexIterator = goog.iter.permutations(indexes, length);
+ // sortedIndexIterator will now give arrays of with the given length that
+ // indicate what indexes into "elements" should be returned on each iteration.
+ var sortedIndexIterator = goog.iter.filter(
+ indexIterator, function(arr) { return goog.array.isSorted(arr); });
+
+ var iter = new goog.iter.Iterator();
+
+ function getIndexFromElements(index) { return elements[index]; }
+
+ iter.next = function() {
+ return goog.array.map(sortedIndexIterator.next(), getIndexFromElements);
+ };
+
+ return iter;
+};
+
+
+/**
+ * Creates an iterator that returns combinations of elements from
+ * {@code iterable}, with repeated elements possible.
+ *
+ * Combinations are obtained by taking the Cartesian product of {@code length}
+ * iterables and filtering those whose elements appear in the order they are
+ * encountered in {@code iterable}. For example, the 2-length combinations of
+ * {@code [1,2,3]} are {@code [[1,1], [1,2], [1,3], [2,2], [2,3], [3,3]]}.
+ * @see https://goo.gl/C0yXe4
+ * @see https://goo.gl/djOCsk
+ * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The
+ * iterable to combine.
+ * @param {number} length The length of each combination.
+ * @return {!goog.iter.Iterator<!Array<VALUE>>} A new iterator containing
+ * combinations from the {@code iterable}.
+ * @template VALUE
+ */
+goog.iter.combinationsWithReplacement = function(iterable, length) {
+ var elements = goog.iter.toArray(iterable);
+ var indexes = goog.array.range(elements.length);
+ var sets = goog.array.repeat(indexes, length);
+ var indexIterator = goog.iter.product.apply(undefined, sets);
+ // sortedIndexIterator will now give arrays of with the given length that
+ // indicate what indexes into "elements" should be returned on each iteration.
+ var sortedIndexIterator = goog.iter.filter(
+ indexIterator, function(arr) { return goog.array.isSorted(arr); });
+
+ var iter = new goog.iter.Iterator();
+
+ function getIndexFromElements(index) { return elements[index]; }
+
+ iter.next = function() {
+ return goog.array.map(
+ /** @type {!Array<number>} */
+ (sortedIndexIterator.next()), getIndexFromElements);
+ };
+
+ return iter;
+};
diff --git a/src/http/static/viz/2/goog/labs/useragent/browser.js b/src/http/static/viz/2/goog/labs/useragent/browser.js
new file mode 100644
index 0000000..a7dd638
--- /dev/null
+++ b/src/http/static/viz/2/goog/labs/useragent/browser.js
@@ -0,0 +1,338 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Closure user agent detection (Browser).
+ * @see <a href="http://www.useragentstring.com/">User agent strings</a>
+ * For more information on rendering engine, platform, or device see the other
+ * sub-namespaces in goog.labs.userAgent, goog.labs.userAgent.platform,
+ * goog.labs.userAgent.device respectively.)
+ *
+ * @author martone@google.com (Andy Martone)
+ */
+
+goog.provide('goog.labs.userAgent.browser');
+
+goog.require('goog.array');
+goog.require('goog.labs.userAgent.util');
+goog.require('goog.object');
+goog.require('goog.string');
+
+
+// TODO(nnaze): Refactor to remove excessive exclusion logic in matching
+// functions.
+
+
+/**
+ * @return {boolean} Whether the user's browser is Opera. Note: Chromium
+ * based Opera (Opera 15+) is detected as Chrome to avoid unnecessary
+ * special casing.
+ * @private
+ */
+goog.labs.userAgent.browser.matchOpera_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Opera');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is IE.
+ * @private
+ */
+goog.labs.userAgent.browser.matchIE_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Trident') ||
+ goog.labs.userAgent.util.matchUserAgent('MSIE');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Edge.
+ * @private
+ */
+goog.labs.userAgent.browser.matchEdge_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Edge');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Firefox.
+ * @private
+ */
+goog.labs.userAgent.browser.matchFirefox_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Firefox');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Safari.
+ * @private
+ */
+goog.labs.userAgent.browser.matchSafari_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Safari') &&
+ !(goog.labs.userAgent.browser.matchChrome_() ||
+ goog.labs.userAgent.browser.matchCoast_() ||
+ goog.labs.userAgent.browser.matchOpera_() ||
+ goog.labs.userAgent.browser.matchEdge_() ||
+ goog.labs.userAgent.browser.isSilk() ||
+ goog.labs.userAgent.util.matchUserAgent('Android'));
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Coast (Opera's Webkit-based
+ * iOS browser).
+ * @private
+ */
+goog.labs.userAgent.browser.matchCoast_ = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Coast');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is iOS Webview.
+ * @private
+ */
+goog.labs.userAgent.browser.matchIosWebview_ = function() {
+ // iOS Webview does not show up as Chrome or Safari. Also check for Opera's
+ // WebKit-based iOS browser, Coast.
+ return (goog.labs.userAgent.util.matchUserAgent('iPad') ||
+ goog.labs.userAgent.util.matchUserAgent('iPhone')) &&
+ !goog.labs.userAgent.browser.matchSafari_() &&
+ !goog.labs.userAgent.browser.matchChrome_() &&
+ !goog.labs.userAgent.browser.matchCoast_() &&
+ goog.labs.userAgent.util.matchUserAgent('AppleWebKit');
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Chrome.
+ * @private
+ */
+goog.labs.userAgent.browser.matchChrome_ = function() {
+ return (goog.labs.userAgent.util.matchUserAgent('Chrome') ||
+ goog.labs.userAgent.util.matchUserAgent('CriOS')) &&
+ !goog.labs.userAgent.browser.matchEdge_();
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is the Android browser.
+ * @private
+ */
+goog.labs.userAgent.browser.matchAndroidBrowser_ = function() {
+ // Android can appear in the user agent string for Chrome on Android.
+ // This is not the Android standalone browser if it does.
+ return goog.labs.userAgent.util.matchUserAgent('Android') &&
+ !(goog.labs.userAgent.browser.isChrome() ||
+ goog.labs.userAgent.browser.isFirefox() ||
+ goog.labs.userAgent.browser.isOpera() ||
+ goog.labs.userAgent.browser.isSilk());
+};
+
+
+/**
+ * @return {boolean} Whether the user's browser is Opera.
+ */
+goog.labs.userAgent.browser.isOpera = goog.labs.userAgent.browser.matchOpera_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is IE.
+ */
+goog.labs.userAgent.browser.isIE = goog.labs.userAgent.browser.matchIE_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is Edge.
+ */
+goog.labs.userAgent.browser.isEdge = goog.labs.userAgent.browser.matchEdge_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is Firefox.
+ */
+goog.labs.userAgent.browser.isFirefox =
+ goog.labs.userAgent.browser.matchFirefox_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is Safari.
+ */
+goog.labs.userAgent.browser.isSafari = goog.labs.userAgent.browser.matchSafari_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is Coast (Opera's Webkit-based
+ * iOS browser).
+ */
+goog.labs.userAgent.browser.isCoast = goog.labs.userAgent.browser.matchCoast_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is iOS Webview.
+ */
+goog.labs.userAgent.browser.isIosWebview =
+ goog.labs.userAgent.browser.matchIosWebview_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is Chrome.
+ */
+goog.labs.userAgent.browser.isChrome = goog.labs.userAgent.browser.matchChrome_;
+
+
+/**
+ * @return {boolean} Whether the user's browser is the Android browser.
+ */
+goog.labs.userAgent.browser.isAndroidBrowser =
+ goog.labs.userAgent.browser.matchAndroidBrowser_;
+
+
+/**
+ * For more information, see:
+ * http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html
+ * @return {boolean} Whether the user's browser is Silk.
+ */
+goog.labs.userAgent.browser.isSilk = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Silk');
+};
+
+
+/**
+ * @return {string} The browser version or empty string if version cannot be
+ * determined. Note that for Internet Explorer, this returns the version of
+ * the browser, not the version of the rendering engine. (IE 8 in
+ * compatibility mode will return 8.0 rather than 7.0. To determine the
+ * rendering engine version, look at document.documentMode instead. See
+ * http://msdn.microsoft.com/en-us/library/cc196988(v=vs.85).aspx for more
+ * details.)
+ */
+goog.labs.userAgent.browser.getVersion = function() {
+ var userAgentString = goog.labs.userAgent.util.getUserAgent();
+ // Special case IE since IE's version is inside the parenthesis and
+ // without the '/'.
+ if (goog.labs.userAgent.browser.isIE()) {
+ return goog.labs.userAgent.browser.getIEVersion_(userAgentString);
+ }
+
+ var versionTuples =
+ goog.labs.userAgent.util.extractVersionTuples(userAgentString);
+
+ // Construct a map for easy lookup.
+ var versionMap = {};
+ goog.array.forEach(versionTuples, function(tuple) {
+ // Note that the tuple is of length three, but we only care about the
+ // first two.
+ var key = tuple[0];
+ var value = tuple[1];
+ versionMap[key] = value;
+ });
+
+ var versionMapHasKey = goog.partial(goog.object.containsKey, versionMap);
+
+ // Gives the value with the first key it finds, otherwise empty string.
+ function lookUpValueWithKeys(keys) {
+ var key = goog.array.find(keys, versionMapHasKey);
+ return versionMap[key] || '';
+ }
+
+ // Check Opera before Chrome since Opera 15+ has "Chrome" in the string.
+ // See
+ // http://my.opera.com/ODIN/blog/2013/07/15/opera-user-agent-strings-opera-15-and-beyond
+ if (goog.labs.userAgent.browser.isOpera()) {
+ // Opera 10 has Version/10.0 but Opera/9.8, so look for "Version" first.
+ // Opera uses 'OPR' for more recent UAs.
+ return lookUpValueWithKeys(['Version', 'Opera']);
+ }
+
+ // Check Edge before Chrome since it has Chrome in the string.
+ if (goog.labs.userAgent.browser.isEdge()) {
+ return lookUpValueWithKeys(['Edge']);
+ }
+
+ if (goog.labs.userAgent.browser.isChrome()) {
+ return lookUpValueWithKeys(['Chrome', 'CriOS']);
+ }
+
+ // Usually products browser versions are in the third tuple after "Mozilla"
+ // and the engine.
+ var tuple = versionTuples[2];
+ return tuple && tuple[1] || '';
+};
+
+
+/**
+ * @param {string|number} version The version to check.
+ * @return {boolean} Whether the browser version is higher or the same as the
+ * given version.
+ */
+goog.labs.userAgent.browser.isVersionOrHigher = function(version) {
+ return goog.string.compareVersions(
+ goog.labs.userAgent.browser.getVersion(), version) >= 0;
+};
+
+
+/**
+ * Determines IE version. More information:
+ * http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx#uaString
+ * http://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx
+ * http://blogs.msdn.com/b/ie/archive/2010/03/23/introducing-ie9-s-user-agent-string.aspx
+ * http://blogs.msdn.com/b/ie/archive/2009/01/09/the-internet-explorer-8-user-agent-string-updated-edition.aspx
+ *
+ * @param {string} userAgent the User-Agent.
+ * @return {string}
+ * @private
+ */
+goog.labs.userAgent.browser.getIEVersion_ = function(userAgent) {
+ // IE11 may identify itself as MSIE 9.0 or MSIE 10.0 due to an IE 11 upgrade
+ // bug. Example UA:
+ // Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)
+ // like Gecko.
+ // See http://www.whatismybrowser.com/developers/unknown-user-agent-fragments.
+ var rv = /rv: *([\d\.]*)/.exec(userAgent);
+ if (rv && rv[1]) {
+ return rv[1];
+ }
+
+ var version = '';
+ var msie = /MSIE +([\d\.]+)/.exec(userAgent);
+ if (msie && msie[1]) {
+ // IE in compatibility mode usually identifies itself as MSIE 7.0; in this
+ // case, use the Trident version to determine the version of IE. For more
+ // details, see the links above.
+ var tridentVersion = /Trident\/(\d.\d)/.exec(userAgent);
+ if (msie[1] == '7.0') {
+ if (tridentVersion && tridentVersion[1]) {
+ switch (tridentVersion[1]) {
+ case '4.0':
+ version = '8.0';
+ break;
+ case '5.0':
+ version = '9.0';
+ break;
+ case '6.0':
+ version = '10.0';
+ break;
+ case '7.0':
+ version = '11.0';
+ break;
+ }
+ } else {
+ version = '7.0';
+ }
+ } else {
+ version = msie[1];
+ }
+ }
+ return version;
+};
diff --git a/src/http/static/viz/2/goog/labs/useragent/engine.js b/src/http/static/viz/2/goog/labs/useragent/engine.js
new file mode 100644
index 0000000..31c5667
--- /dev/null
+++ b/src/http/static/viz/2/goog/labs/useragent/engine.js
@@ -0,0 +1,156 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Closure user agent detection.
+ * @see http://en.wikipedia.org/wiki/User_agent
+ * For more information on browser brand, platform, or device see the other
+ * sub-namespaces in goog.labs.userAgent (browser, platform, and device).
+ *
+ */
+
+goog.provide('goog.labs.userAgent.engine');
+
+goog.require('goog.array');
+goog.require('goog.labs.userAgent.util');
+goog.require('goog.string');
+
+
+/**
+ * @return {boolean} Whether the rendering engine is Presto.
+ */
+goog.labs.userAgent.engine.isPresto = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Presto');
+};
+
+
+/**
+ * @return {boolean} Whether the rendering engine is Trident.
+ */
+goog.labs.userAgent.engine.isTrident = function() {
+ // IE only started including the Trident token in IE8.
+ return goog.labs.userAgent.util.matchUserAgent('Trident') ||
+ goog.labs.userAgent.util.matchUserAgent('MSIE');
+};
+
+
+/**
+ * @return {boolean} Whether the rendering engine is Edge.
+ */
+goog.labs.userAgent.engine.isEdge = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Edge');
+};
+
+
+/**
+ * @return {boolean} Whether the rendering engine is WebKit.
+ */
+goog.labs.userAgent.engine.isWebKit = function() {
+ return goog.labs.userAgent.util.matchUserAgentIgnoreCase('WebKit') &&
+ !goog.labs.userAgent.engine.isEdge();
+};
+
+
+/**
+ * @return {boolean} Whether the rendering engine is Gecko.
+ */
+goog.labs.userAgent.engine.isGecko = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Gecko') &&
+ !goog.labs.userAgent.engine.isWebKit() &&
+ !goog.labs.userAgent.engine.isTrident() &&
+ !goog.labs.userAgent.engine.isEdge();
+};
+
+
+/**
+ * @return {string} The rendering engine's version or empty string if version
+ * can't be determined.
+ */
+goog.labs.userAgent.engine.getVersion = function() {
+ var userAgentString = goog.labs.userAgent.util.getUserAgent();
+ if (userAgentString) {
+ var tuples = goog.labs.userAgent.util.extractVersionTuples(userAgentString);
+
+ var engineTuple = goog.labs.userAgent.engine.getEngineTuple_(tuples);
+ if (engineTuple) {
+ // In Gecko, the version string is either in the browser info or the
+ // Firefox version. See Gecko user agent string reference:
+ // http://goo.gl/mULqa
+ if (engineTuple[0] == 'Gecko') {
+ return goog.labs.userAgent.engine.getVersionForKey_(tuples, 'Firefox');
+ }
+
+ return engineTuple[1];
+ }
+
+ // MSIE has only one version identifier, and the Trident version is
+ // specified in the parenthetical. IE Edge is covered in the engine tuple
+ // detection.
+ var browserTuple = tuples[0];
+ var info;
+ if (browserTuple && (info = browserTuple[2])) {
+ var match = /Trident\/([^\s;]+)/.exec(info);
+ if (match) {
+ return match[1];
+ }
+ }
+ }
+ return '';
+};
+
+
+/**
+ * @param {!Array<!Array<string>>} tuples Extracted version tuples.
+ * @return {!Array<string>|undefined} The engine tuple or undefined if not
+ * found.
+ * @private
+ */
+goog.labs.userAgent.engine.getEngineTuple_ = function(tuples) {
+ if (!goog.labs.userAgent.engine.isEdge()) {
+ return tuples[1];
+ }
+ for (var i = 0; i < tuples.length; i++) {
+ var tuple = tuples[i];
+ if (tuple[0] == 'Edge') {
+ return tuple;
+ }
+ }
+};
+
+
+/**
+ * @param {string|number} version The version to check.
+ * @return {boolean} Whether the rendering engine version is higher or the same
+ * as the given version.
+ */
+goog.labs.userAgent.engine.isVersionOrHigher = function(version) {
+ return goog.string.compareVersions(
+ goog.labs.userAgent.engine.getVersion(), version) >= 0;
+};
+
+
+/**
+ * @param {!Array<!Array<string>>} tuples Version tuples.
+ * @param {string} key The key to look for.
+ * @return {string} The version string of the given key, if present.
+ * Otherwise, the empty string.
+ * @private
+ */
+goog.labs.userAgent.engine.getVersionForKey_ = function(tuples, key) {
+ // TODO(nnaze): Move to util if useful elsewhere.
+
+ var pair = goog.array.find(tuples, function(pair) { return key == pair[0]; });
+
+ return pair && pair[1] || '';
+};
diff --git a/src/http/static/viz/2/goog/labs/useragent/platform.js b/src/http/static/viz/2/goog/labs/useragent/platform.js
new file mode 100644
index 0000000..9c72402
--- /dev/null
+++ b/src/http/static/viz/2/goog/labs/useragent/platform.js
@@ -0,0 +1,160 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Closure user agent platform detection.
+ * @see <a href="http://www.useragentstring.com/">User agent strings</a>
+ * For more information on browser brand, rendering engine, or device see the
+ * other sub-namespaces in goog.labs.userAgent (browser, engine, and device
+ * respectively).
+ *
+ */
+
+goog.provide('goog.labs.userAgent.platform');
+
+goog.require('goog.labs.userAgent.util');
+goog.require('goog.string');
+
+
+/**
+ * @return {boolean} Whether the platform is Android.
+ */
+goog.labs.userAgent.platform.isAndroid = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Android');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is iPod.
+ */
+goog.labs.userAgent.platform.isIpod = function() {
+ return goog.labs.userAgent.util.matchUserAgent('iPod');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is iPhone.
+ */
+goog.labs.userAgent.platform.isIphone = function() {
+ return goog.labs.userAgent.util.matchUserAgent('iPhone') &&
+ !goog.labs.userAgent.util.matchUserAgent('iPod') &&
+ !goog.labs.userAgent.util.matchUserAgent('iPad');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is iPad.
+ */
+goog.labs.userAgent.platform.isIpad = function() {
+ return goog.labs.userAgent.util.matchUserAgent('iPad');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is iOS.
+ */
+goog.labs.userAgent.platform.isIos = function() {
+ return goog.labs.userAgent.platform.isIphone() ||
+ goog.labs.userAgent.platform.isIpad() ||
+ goog.labs.userAgent.platform.isIpod();
+};
+
+
+/**
+ * @return {boolean} Whether the platform is Mac.
+ */
+goog.labs.userAgent.platform.isMacintosh = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Macintosh');
+};
+
+
+/**
+ * Note: ChromeOS is not considered to be Linux as it does not report itself
+ * as Linux in the user agent string.
+ * @return {boolean} Whether the platform is Linux.
+ */
+goog.labs.userAgent.platform.isLinux = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Linux');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is Windows.
+ */
+goog.labs.userAgent.platform.isWindows = function() {
+ return goog.labs.userAgent.util.matchUserAgent('Windows');
+};
+
+
+/**
+ * @return {boolean} Whether the platform is ChromeOS.
+ */
+goog.labs.userAgent.platform.isChromeOS = function() {
+ return goog.labs.userAgent.util.matchUserAgent('CrOS');
+};
+
+
+/**
+ * The version of the platform. We only determine the version for Windows,
+ * Mac, and Chrome OS. It doesn't make much sense on Linux. For Windows, we only
+ * look at the NT version. Non-NT-based versions (e.g. 95, 98, etc.) are given
+ * version 0.0.
+ *
+ * @return {string} The platform version or empty string if version cannot be
+ * determined.
+ */
+goog.labs.userAgent.platform.getVersion = function() {
+ var userAgentString = goog.labs.userAgent.util.getUserAgent();
+ var version = '', re;
+ if (goog.labs.userAgent.platform.isWindows()) {
+ re = /Windows (?:NT|Phone) ([0-9.]+)/;
+ var match = re.exec(userAgentString);
+ if (match) {
+ version = match[1];
+ } else {
+ version = '0.0';
+ }
+ } else if (goog.labs.userAgent.platform.isIos()) {
+ re = /(?:iPhone|iPod|iPad|CPU)\s+OS\s+(\S+)/;
+ var match = re.exec(userAgentString);
+ // Report the version as x.y.z and not x_y_z
+ version = match && match[1].replace(/_/g, '.');
+ } else if (goog.labs.userAgent.platform.isMacintosh()) {
+ re = /Mac OS X ([0-9_.]+)/;
+ var match = re.exec(userAgentString);
+ // Note: some old versions of Camino do not report an OSX version.
+ // Default to 10.
+ version = match ? match[1].replace(/_/g, '.') : '10';
+ } else if (goog.labs.userAgent.platform.isAndroid()) {
+ re = /Android\s+([^\);]+)(\)|;)/;
+ var match = re.exec(userAgentString);
+ version = match && match[1];
+ } else if (goog.labs.userAgent.platform.isChromeOS()) {
+ re = /(?:CrOS\s+(?:i686|x86_64)\s+([0-9.]+))/;
+ var match = re.exec(userAgentString);
+ version = match && match[1];
+ }
+ return version || '';
+};
+
+
+/**
+ * @param {string|number} version The version to check.
+ * @return {boolean} Whether the browser version is higher or the same as the
+ * given version.
+ */
+goog.labs.userAgent.platform.isVersionOrHigher = function(version) {
+ return goog.string.compareVersions(
+ goog.labs.userAgent.platform.getVersion(), version) >= 0;
+};
diff --git a/src/http/static/viz/2/goog/labs/useragent/util.js b/src/http/static/viz/2/goog/labs/useragent/util.js
new file mode 100644
index 0000000..26d4847
--- /dev/null
+++ b/src/http/static/viz/2/goog/labs/useragent/util.js
@@ -0,0 +1,147 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities used by goog.labs.userAgent tools. These functions
+ * should not be used outside of goog.labs.userAgent.*.
+ *
+ *
+ * @author nnaze@google.com (Nathan Naze)
+ */
+
+goog.provide('goog.labs.userAgent.util');
+
+goog.require('goog.string');
+
+
+/**
+ * Gets the native userAgent string from navigator if it exists.
+ * If navigator or navigator.userAgent string is missing, returns an empty
+ * string.
+ * @return {string}
+ * @private
+ */
+goog.labs.userAgent.util.getNativeUserAgentString_ = function() {
+ var navigator = goog.labs.userAgent.util.getNavigator_();
+ if (navigator) {
+ var userAgent = navigator.userAgent;
+ if (userAgent) {
+ return userAgent;
+ }
+ }
+ return '';
+};
+
+
+/**
+ * Getter for the native navigator.
+ * This is a separate function so it can be stubbed out in testing.
+ * @return {Navigator}
+ * @private
+ */
+goog.labs.userAgent.util.getNavigator_ = function() {
+ return goog.global.navigator;
+};
+
+
+/**
+ * A possible override for applications which wish to not check
+ * navigator.userAgent but use a specified value for detection instead.
+ * @private {string}
+ */
+goog.labs.userAgent.util.userAgent_ =
+ goog.labs.userAgent.util.getNativeUserAgentString_();
+
+
+/**
+ * Applications may override browser detection on the built in
+ * navigator.userAgent object by setting this string. Set to null to use the
+ * browser object instead.
+ * @param {?string=} opt_userAgent The User-Agent override.
+ */
+goog.labs.userAgent.util.setUserAgent = function(opt_userAgent) {
+ goog.labs.userAgent.util.userAgent_ =
+ opt_userAgent || goog.labs.userAgent.util.getNativeUserAgentString_();
+};
+
+
+/**
+ * @return {string} The user agent string.
+ */
+goog.labs.userAgent.util.getUserAgent = function() {
+ return goog.labs.userAgent.util.userAgent_;
+};
+
+
+/**
+ * @param {string} str
+ * @return {boolean} Whether the user agent contains the given string.
+ */
+goog.labs.userAgent.util.matchUserAgent = function(str) {
+ var userAgent = goog.labs.userAgent.util.getUserAgent();
+ return goog.string.contains(userAgent, str);
+};
+
+
+/**
+ * @param {string} str
+ * @return {boolean} Whether the user agent contains the given string, ignoring
+ * case.
+ */
+goog.labs.userAgent.util.matchUserAgentIgnoreCase = function(str) {
+ var userAgent = goog.labs.userAgent.util.getUserAgent();
+ return goog.string.caseInsensitiveContains(userAgent, str);
+};
+
+
+/**
+ * Parses the user agent into tuples for each section.
+ * @param {string} userAgent
+ * @return {!Array<!Array<string>>} Tuples of key, version, and the contents
+ * of the parenthetical.
+ */
+goog.labs.userAgent.util.extractVersionTuples = function(userAgent) {
+ // Matches each section of a user agent string.
+ // Example UA:
+ // Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us)
+ // AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405
+ // This has three version tuples: Mozilla, AppleWebKit, and Mobile.
+
+ var versionRegExp = new RegExp(
+ // Key. Note that a key may have a space.
+ // (i.e. 'Mobile Safari' in 'Mobile Safari/5.0')
+ '(\\w[\\w ]+)' +
+
+ '/' + // slash
+ '([^\\s]+)' + // version (i.e. '5.0b')
+ '\\s*' + // whitespace
+ '(?:\\((.*?)\\))?', // parenthetical info. parentheses not matched.
+ 'g');
+
+ var data = [];
+ var match;
+
+ // Iterate and collect the version tuples. Each iteration will be the
+ // next regex match.
+ while (match = versionRegExp.exec(userAgent)) {
+ data.push([
+ match[1], // key
+ match[2], // value
+ // || undefined as this is not undefined in IE7 and IE8
+ match[3] || undefined // info
+ ]);
+ }
+
+ return data;
+};
diff --git a/src/http/static/viz/2/goog/math/coordinate.js b/src/http/static/viz/2/goog/math/coordinate.js
new file mode 100644
index 0000000..0dc2469
--- /dev/null
+++ b/src/http/static/viz/2/goog/math/coordinate.js
@@ -0,0 +1,279 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A utility class for representing two-dimensional positions.
+ */
+
+
+goog.provide('goog.math.Coordinate');
+
+goog.require('goog.math');
+
+
+
+/**
+ * Class for representing coordinates and positions.
+ * @param {number=} opt_x Left, defaults to 0.
+ * @param {number=} opt_y Top, defaults to 0.
+ * @struct
+ * @constructor
+ */
+goog.math.Coordinate = function(opt_x, opt_y) {
+ /**
+ * X-value
+ * @type {number}
+ */
+ this.x = goog.isDef(opt_x) ? opt_x : 0;
+
+ /**
+ * Y-value
+ * @type {number}
+ */
+ this.y = goog.isDef(opt_y) ? opt_y : 0;
+};
+
+
+/**
+ * Returns a new copy of the coordinate.
+ * @return {!goog.math.Coordinate} A clone of this coordinate.
+ */
+goog.math.Coordinate.prototype.clone = function() {
+ return new goog.math.Coordinate(this.x, this.y);
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a nice string representing the coordinate.
+ * @return {string} In the form (50, 73).
+ * @override
+ */
+ goog.math.Coordinate.prototype.toString = function() {
+ return '(' + this.x + ', ' + this.y + ')';
+ };
+}
+
+
+/**
+ * Returns whether the specified value is equal to this coordinate.
+ * @param {*} other Some other value.
+ * @return {boolean} Whether the specified value is equal to this coordinate.
+ */
+goog.math.Coordinate.prototype.equals = function(other) {
+ return other instanceof goog.math.Coordinate &&
+ goog.math.Coordinate.equals(this, other);
+};
+
+
+/**
+ * Compares coordinates for equality.
+ * @param {goog.math.Coordinate} a A Coordinate.
+ * @param {goog.math.Coordinate} b A Coordinate.
+ * @return {boolean} True iff the coordinates are equal, or if both are null.
+ */
+goog.math.Coordinate.equals = function(a, b) {
+ if (a == b) {
+ return true;
+ }
+ if (!a || !b) {
+ return false;
+ }
+ return a.x == b.x && a.y == b.y;
+};
+
+
+/**
+ * Returns the distance between two coordinates.
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @param {!goog.math.Coordinate} b A Coordinate.
+ * @return {number} The distance between {@code a} and {@code b}.
+ */
+goog.math.Coordinate.distance = function(a, b) {
+ var dx = a.x - b.x;
+ var dy = a.y - b.y;
+ return Math.sqrt(dx * dx + dy * dy);
+};
+
+
+/**
+ * Returns the magnitude of a coordinate.
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @return {number} The distance between the origin and {@code a}.
+ */
+goog.math.Coordinate.magnitude = function(a) {
+ return Math.sqrt(a.x * a.x + a.y * a.y);
+};
+
+
+/**
+ * Returns the angle from the origin to a coordinate.
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @return {number} The angle, in degrees, clockwise from the positive X
+ * axis to {@code a}.
+ */
+goog.math.Coordinate.azimuth = function(a) {
+ return goog.math.angle(0, 0, a.x, a.y);
+};
+
+
+/**
+ * Returns the squared distance between two coordinates. Squared distances can
+ * be used for comparisons when the actual value is not required.
+ *
+ * Performance note: eliminating the square root is an optimization often used
+ * in lower-level languages, but the speed difference is not nearly as
+ * pronounced in JavaScript (only a few percent.)
+ *
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @param {!goog.math.Coordinate} b A Coordinate.
+ * @return {number} The squared distance between {@code a} and {@code b}.
+ */
+goog.math.Coordinate.squaredDistance = function(a, b) {
+ var dx = a.x - b.x;
+ var dy = a.y - b.y;
+ return dx * dx + dy * dy;
+};
+
+
+/**
+ * Returns the difference between two coordinates as a new
+ * goog.math.Coordinate.
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @param {!goog.math.Coordinate} b A Coordinate.
+ * @return {!goog.math.Coordinate} A Coordinate representing the difference
+ * between {@code a} and {@code b}.
+ */
+goog.math.Coordinate.difference = function(a, b) {
+ return new goog.math.Coordinate(a.x - b.x, a.y - b.y);
+};
+
+
+/**
+ * Returns the sum of two coordinates as a new goog.math.Coordinate.
+ * @param {!goog.math.Coordinate} a A Coordinate.
+ * @param {!goog.math.Coordinate} b A Coordinate.
+ * @return {!goog.math.Coordinate} A Coordinate representing the sum of the two
+ * coordinates.
+ */
+goog.math.Coordinate.sum = function(a, b) {
+ return new goog.math.Coordinate(a.x + b.x, a.y + b.y);
+};
+
+
+/**
+ * Rounds the x and y fields to the next larger integer values.
+ * @return {!goog.math.Coordinate} This coordinate with ceil'd fields.
+ */
+goog.math.Coordinate.prototype.ceil = function() {
+ this.x = Math.ceil(this.x);
+ this.y = Math.ceil(this.y);
+ return this;
+};
+
+
+/**
+ * Rounds the x and y fields to the next smaller integer values.
+ * @return {!goog.math.Coordinate} This coordinate with floored fields.
+ */
+goog.math.Coordinate.prototype.floor = function() {
+ this.x = Math.floor(this.x);
+ this.y = Math.floor(this.y);
+ return this;
+};
+
+
+/**
+ * Rounds the x and y fields to the nearest integer values.
+ * @return {!goog.math.Coordinate} This coordinate with rounded fields.
+ */
+goog.math.Coordinate.prototype.round = function() {
+ this.x = Math.round(this.x);
+ this.y = Math.round(this.y);
+ return this;
+};
+
+
+/**
+ * Translates this box by the given offsets. If a {@code goog.math.Coordinate}
+ * is given, then the x and y values are translated by the coordinate's x and y.
+ * Otherwise, x and y are translated by {@code tx} and {@code opt_ty}
+ * respectively.
+ * @param {number|goog.math.Coordinate} tx The value to translate x by or the
+ * the coordinate to translate this coordinate by.
+ * @param {number=} opt_ty The value to translate y by.
+ * @return {!goog.math.Coordinate} This coordinate after translating.
+ */
+goog.math.Coordinate.prototype.translate = function(tx, opt_ty) {
+ if (tx instanceof goog.math.Coordinate) {
+ this.x += tx.x;
+ this.y += tx.y;
+ } else {
+ this.x += Number(tx);
+ if (goog.isNumber(opt_ty)) {
+ this.y += opt_ty;
+ }
+ }
+ return this;
+};
+
+
+/**
+ * Scales this coordinate by the given scale factors. The x and y values are
+ * scaled by {@code sx} and {@code opt_sy} respectively. If {@code opt_sy}
+ * is not given, then {@code sx} is used for both x and y.
+ * @param {number} sx The scale factor to use for the x dimension.
+ * @param {number=} opt_sy The scale factor to use for the y dimension.
+ * @return {!goog.math.Coordinate} This coordinate after scaling.
+ */
+goog.math.Coordinate.prototype.scale = function(sx, opt_sy) {
+ var sy = goog.isNumber(opt_sy) ? opt_sy : sx;
+ this.x *= sx;
+ this.y *= sy;
+ return this;
+};
+
+
+/**
+ * Rotates this coordinate clockwise about the origin (or, optionally, the given
+ * center) by the given angle, in radians.
+ * @param {number} radians The angle by which to rotate this coordinate
+ * clockwise about the given center, in radians.
+ * @param {!goog.math.Coordinate=} opt_center The center of rotation. Defaults
+ * to (0, 0) if not given.
+ */
+goog.math.Coordinate.prototype.rotateRadians = function(radians, opt_center) {
+ var center = opt_center || new goog.math.Coordinate(0, 0);
+
+ var x = this.x;
+ var y = this.y;
+ var cos = Math.cos(radians);
+ var sin = Math.sin(radians);
+
+ this.x = (x - center.x) * cos - (y - center.y) * sin + center.x;
+ this.y = (x - center.x) * sin + (y - center.y) * cos + center.y;
+};
+
+
+/**
+ * Rotates this coordinate clockwise about the origin (or, optionally, the given
+ * center) by the given angle, in degrees.
+ * @param {number} degrees The angle by which to rotate this coordinate
+ * clockwise about the given center, in degrees.
+ * @param {!goog.math.Coordinate=} opt_center The center of rotation. Defaults
+ * to (0, 0) if not given.
+ */
+goog.math.Coordinate.prototype.rotateDegrees = function(degrees, opt_center) {
+ this.rotateRadians(goog.math.toRadians(degrees), opt_center);
+};
diff --git a/src/http/static/viz/2/goog/math/integer.js b/src/http/static/viz/2/goog/math/integer.js
new file mode 100644
index 0000000..6907546
--- /dev/null
+++ b/src/http/static/viz/2/goog/math/integer.js
@@ -0,0 +1,808 @@
+// Copyright 2009 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Defines an Integer class for representing (potentially)
+ * infinite length two's-complement integer values.
+ *
+ * For the specific case of 64-bit integers, use goog.math.Long, which is more
+ * efficient.
+ *
+ */
+
+goog.provide('goog.math.Integer');
+
+
+
+/**
+ * Constructs a two's-complement integer an array containing bits of the
+ * integer in 32-bit (signed) pieces, given in little-endian order (i.e.,
+ * lowest-order bits in the first piece), and the sign of -1 or 0.
+ *
+ * See the from* functions below for other convenient ways of constructing
+ * Integers.
+ *
+ * The internal representation of an integer is an array of 32-bit signed
+ * pieces, along with a sign (0 or -1) that indicates the contents of all the
+ * other 32-bit pieces out to infinity. We use 32-bit pieces because these are
+ * the size of integers on which Javascript performs bit-operations. For
+ * operations like addition and multiplication, we split each number into 16-bit
+ * pieces, which can easily be multiplied within Javascript's floating-point
+ * representation without overflow or change in sign.
+ *
+ * @struct
+ * @constructor
+ * @param {Array<number>} bits Array containing the bits of the number.
+ * @param {number} sign The sign of the number: -1 for negative and 0 positive.
+ * @final
+ */
+goog.math.Integer = function(bits, sign) {
+ /**
+ * @type {!Array<number>}
+ * @private
+ */
+ this.bits_ = [];
+
+ /**
+ * @type {number}
+ * @private
+ */
+ this.sign_ = sign;
+
+ // Copy the 32-bit signed integer values passed in. We prune out those at the
+ // top that equal the sign since they are redundant.
+ var top = true;
+ for (var i = bits.length - 1; i >= 0; i--) {
+ var val = bits[i] | 0;
+ if (!top || val != sign) {
+ this.bits_[i] = val;
+ top = false;
+ }
+ }
+};
+
+
+// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the
+// from* methods on which they depend.
+
+
+/**
+ * A cache of the Integer representations of small integer values.
+ * @type {!Object}
+ * @private
+ */
+goog.math.Integer.IntCache_ = {};
+
+
+/**
+ * Returns an Integer representing the given (32-bit) integer value.
+ * @param {number} value A 32-bit integer value.
+ * @return {!goog.math.Integer} The corresponding Integer value.
+ */
+goog.math.Integer.fromInt = function(value) {
+ if (-128 <= value && value < 128) {
+ var cachedObj = goog.math.Integer.IntCache_[value];
+ if (cachedObj) {
+ return cachedObj;
+ }
+ }
+
+ var obj = new goog.math.Integer([value | 0], value < 0 ? -1 : 0);
+ if (-128 <= value && value < 128) {
+ goog.math.Integer.IntCache_[value] = obj;
+ }
+ return obj;
+};
+
+
+/**
+ * Returns an Integer representing the given value, provided that it is a finite
+ * number. Otherwise, zero is returned.
+ * @param {number} value The value in question.
+ * @return {!goog.math.Integer} The corresponding Integer value.
+ */
+goog.math.Integer.fromNumber = function(value) {
+ if (isNaN(value) || !isFinite(value)) {
+ return goog.math.Integer.ZERO;
+ } else if (value < 0) {
+ return goog.math.Integer.fromNumber(-value).negate();
+ } else {
+ var bits = [];
+ var pow = 1;
+ for (var i = 0; value >= pow; i++) {
+ bits[i] = (value / pow) | 0;
+ pow *= goog.math.Integer.TWO_PWR_32_DBL_;
+ }
+ return new goog.math.Integer(bits, 0);
+ }
+};
+
+
+/**
+ * Returns a Integer representing the value that comes by concatenating the
+ * given entries, each is assumed to be 32 signed bits, given in little-endian
+ * order (lowest order bits in the lowest index), and sign-extending the highest
+ * order 32-bit value.
+ * @param {Array<number>} bits The bits of the number, in 32-bit signed pieces,
+ * in little-endian order.
+ * @return {!goog.math.Integer} The corresponding Integer value.
+ */
+goog.math.Integer.fromBits = function(bits) {
+ var high = bits[bits.length - 1];
+ return new goog.math.Integer(bits, high & (1 << 31) ? -1 : 0);
+};
+
+
+/**
+ * Returns an Integer representation of the given string, written using the
+ * given radix.
+ * @param {string} str The textual representation of the Integer.
+ * @param {number=} opt_radix The radix in which the text is written.
+ * @return {!goog.math.Integer} The corresponding Integer value.
+ */
+goog.math.Integer.fromString = function(str, opt_radix) {
+ if (str.length == 0) {
+ throw Error('number format error: empty string');
+ }
+
+ var radix = opt_radix || 10;
+ if (radix < 2 || 36 < radix) {
+ throw Error('radix out of range: ' + radix);
+ }
+
+ if (str.charAt(0) == '-') {
+ return goog.math.Integer.fromString(str.substring(1), radix).negate();
+ } else if (str.indexOf('-') >= 0) {
+ throw Error('number format error: interior "-" character');
+ }
+
+ // Do several (8) digits each time through the loop, so as to
+ // minimize the calls to the very expensive emulated div.
+ var radixToPower = goog.math.Integer.fromNumber(Math.pow(radix, 8));
+
+ var result = goog.math.Integer.ZERO;
+ for (var i = 0; i < str.length; i += 8) {
+ var size = Math.min(8, str.length - i);
+ var value = parseInt(str.substring(i, i + size), radix);
+ if (size < 8) {
+ var power = goog.math.Integer.fromNumber(Math.pow(radix, size));
+ result = result.multiply(power).add(goog.math.Integer.fromNumber(value));
+ } else {
+ result = result.multiply(radixToPower);
+ result = result.add(goog.math.Integer.fromNumber(value));
+ }
+ }
+ return result;
+};
+
+
+/**
+ * A number used repeatedly in calculations. This must appear before the first
+ * call to the from* functions below.
+ * @type {number}
+ * @private
+ */
+goog.math.Integer.TWO_PWR_32_DBL_ = (1 << 16) * (1 << 16);
+
+
+/** @type {!goog.math.Integer} */
+goog.math.Integer.ZERO = goog.math.Integer.fromInt(0);
+
+
+/** @type {!goog.math.Integer} */
+goog.math.Integer.ONE = goog.math.Integer.fromInt(1);
+
+
+/**
+ * @type {!goog.math.Integer}
+ * @private
+ */
+goog.math.Integer.TWO_PWR_24_ = goog.math.Integer.fromInt(1 << 24);
+
+
+/**
+ * Returns the value, assuming it is a 32-bit integer.
+ * @return {number} The corresponding int value.
+ */
+goog.math.Integer.prototype.toInt = function() {
+ return this.bits_.length > 0 ? this.bits_[0] : this.sign_;
+};
+
+
+/** @return {number} The closest floating-point representation to this value. */
+goog.math.Integer.prototype.toNumber = function() {
+ if (this.isNegative()) {
+ return -this.negate().toNumber();
+ } else {
+ var val = 0;
+ var pow = 1;
+ for (var i = 0; i < this.bits_.length; i++) {
+ val += this.getBitsUnsigned(i) * pow;
+ pow *= goog.math.Integer.TWO_PWR_32_DBL_;
+ }
+ return val;
+ }
+};
+
+
+/**
+ * @param {number=} opt_radix The radix in which the text should be written.
+ * @return {string} The textual representation of this value.
+ * @override
+ */
+goog.math.Integer.prototype.toString = function(opt_radix) {
+ var radix = opt_radix || 10;
+ if (radix < 2 || 36 < radix) {
+ throw Error('radix out of range: ' + radix);
+ }
+
+ if (this.isZero()) {
+ return '0';
+ } else if (this.isNegative()) {
+ return '-' + this.negate().toString(radix);
+ }
+
+ // Do several (6) digits each time through the loop, so as to
+ // minimize the calls to the very expensive emulated div.
+ var radixToPower = goog.math.Integer.fromNumber(Math.pow(radix, 6));
+
+ var rem = this;
+ var result = '';
+ while (true) {
+ var remDiv = rem.divide(radixToPower);
+ // The right shifting fixes negative values in the case when
+ // intval >= 2^31; for more details see
+ // https://github.com/google/closure-library/pull/498
+ var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt() >>> 0;
+ var digits = intval.toString(radix);
+
+ rem = remDiv;
+ if (rem.isZero()) {
+ return digits + result;
+ } else {
+ while (digits.length < 6) {
+ digits = '0' + digits;
+ }
+ result = '' + digits + result;
+ }
+ }
+};
+
+
+/**
+ * Returns the index-th 32-bit (signed) piece of the Integer according to
+ * little-endian order (i.e., index 0 contains the smallest bits).
+ * @param {number} index The index in question.
+ * @return {number} The requested 32-bits as a signed number.
+ */
+goog.math.Integer.prototype.getBits = function(index) {
+ if (index < 0) {
+ return 0; // Allowing this simplifies bit shifting operations below...
+ } else if (index < this.bits_.length) {
+ return this.bits_[index];
+ } else {
+ return this.sign_;
+ }
+};
+
+
+/**
+ * Returns the index-th 32-bit piece as an unsigned number.
+ * @param {number} index The index in question.
+ * @return {number} The requested 32-bits as an unsigned number.
+ */
+goog.math.Integer.prototype.getBitsUnsigned = function(index) {
+ var val = this.getBits(index);
+ return val >= 0 ? val : goog.math.Integer.TWO_PWR_32_DBL_ + val;
+};
+
+
+/** @return {number} The sign bit of this number, -1 or 0. */
+goog.math.Integer.prototype.getSign = function() {
+ return this.sign_;
+};
+
+
+/** @return {boolean} Whether this value is zero. */
+goog.math.Integer.prototype.isZero = function() {
+ if (this.sign_ != 0) {
+ return false;
+ }
+ for (var i = 0; i < this.bits_.length; i++) {
+ if (this.bits_[i] != 0) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/** @return {boolean} Whether this value is negative. */
+goog.math.Integer.prototype.isNegative = function() {
+ return this.sign_ == -1;
+};
+
+
+/** @return {boolean} Whether this value is odd. */
+goog.math.Integer.prototype.isOdd = function() {
+ return (this.bits_.length == 0) && (this.sign_ == -1) ||
+ (this.bits_.length > 0) && ((this.bits_[0] & 1) != 0);
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer equals the other.
+ */
+goog.math.Integer.prototype.equals = function(other) {
+ if (this.sign_ != other.sign_) {
+ return false;
+ }
+ var len = Math.max(this.bits_.length, other.bits_.length);
+ for (var i = 0; i < len; i++) {
+ if (this.getBits(i) != other.getBits(i)) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer does not equal the other.
+ */
+goog.math.Integer.prototype.notEquals = function(other) {
+ return !this.equals(other);
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer is greater than the other.
+ */
+goog.math.Integer.prototype.greaterThan = function(other) {
+ return this.compare(other) > 0;
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer is greater than or equal to the other.
+ */
+goog.math.Integer.prototype.greaterThanOrEqual = function(other) {
+ return this.compare(other) >= 0;
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer is less than the other.
+ */
+goog.math.Integer.prototype.lessThan = function(other) {
+ return this.compare(other) < 0;
+};
+
+
+/**
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {boolean} Whether this Integer is less than or equal to the other.
+ */
+goog.math.Integer.prototype.lessThanOrEqual = function(other) {
+ return this.compare(other) <= 0;
+};
+
+
+/**
+ * Compares this Integer with the given one.
+ * @param {goog.math.Integer} other Integer to compare against.
+ * @return {number} 0 if they are the same, 1 if the this is greater, and -1
+ * if the given one is greater.
+ */
+goog.math.Integer.prototype.compare = function(other) {
+ var diff = this.subtract(other);
+ if (diff.isNegative()) {
+ return -1;
+ } else if (diff.isZero()) {
+ return 0;
+ } else {
+ return +1;
+ }
+};
+
+
+/**
+ * Returns an integer with only the first numBits bits of this value, sign
+ * extended from the final bit.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Integer} The shorted integer value.
+ */
+goog.math.Integer.prototype.shorten = function(numBits) {
+ var arr_index = (numBits - 1) >> 5;
+ var bit_index = (numBits - 1) % 32;
+ var bits = [];
+ for (var i = 0; i < arr_index; i++) {
+ bits[i] = this.getBits(i);
+ }
+ var sigBits = bit_index == 31 ? 0xFFFFFFFF : (1 << (bit_index + 1)) - 1;
+ var val = this.getBits(arr_index) & sigBits;
+ if (val & (1 << bit_index)) {
+ val |= 0xFFFFFFFF - sigBits;
+ bits[arr_index] = val;
+ return new goog.math.Integer(bits, -1);
+ } else {
+ bits[arr_index] = val;
+ return new goog.math.Integer(bits, 0);
+ }
+};
+
+
+/** @return {!goog.math.Integer} The negation of this value. */
+goog.math.Integer.prototype.negate = function() {
+ return this.not().add(goog.math.Integer.ONE);
+};
+
+
+/**
+ * Returns the sum of this and the given Integer.
+ * @param {goog.math.Integer} other The Integer to add to this.
+ * @return {!goog.math.Integer} The Integer result.
+ */
+goog.math.Integer.prototype.add = function(other) {
+ var len = Math.max(this.bits_.length, other.bits_.length);
+ var arr = [];
+ var carry = 0;
+
+ for (var i = 0; i <= len; i++) {
+ var a1 = this.getBits(i) >>> 16;
+ var a0 = this.getBits(i) & 0xFFFF;
+
+ var b1 = other.getBits(i) >>> 16;
+ var b0 = other.getBits(i) & 0xFFFF;
+
+ var c0 = carry + a0 + b0;
+ var c1 = (c0 >>> 16) + a1 + b1;
+ carry = c1 >>> 16;
+ c0 &= 0xFFFF;
+ c1 &= 0xFFFF;
+ arr[i] = (c1 << 16) | c0;
+ }
+ return goog.math.Integer.fromBits(arr);
+};
+
+
+/**
+ * Returns the difference of this and the given Integer.
+ * @param {goog.math.Integer} other The Integer to subtract from this.
+ * @return {!goog.math.Integer} The Integer result.
+ */
+goog.math.Integer.prototype.subtract = function(other) {
+ return this.add(other.negate());
+};
+
+
+/**
+ * Returns the product of this and the given Integer.
+ * @param {goog.math.Integer} other The Integer to multiply against this.
+ * @return {!goog.math.Integer} The product of this and the other.
+ */
+goog.math.Integer.prototype.multiply = function(other) {
+ if (this.isZero()) {
+ return goog.math.Integer.ZERO;
+ } else if (other.isZero()) {
+ return goog.math.Integer.ZERO;
+ }
+
+ if (this.isNegative()) {
+ if (other.isNegative()) {
+ return this.negate().multiply(other.negate());
+ } else {
+ return this.negate().multiply(other).negate();
+ }
+ } else if (other.isNegative()) {
+ return this.multiply(other.negate()).negate();
+ }
+
+ // If both numbers are small, use float multiplication
+ if (this.lessThan(goog.math.Integer.TWO_PWR_24_) &&
+ other.lessThan(goog.math.Integer.TWO_PWR_24_)) {
+ return goog.math.Integer.fromNumber(this.toNumber() * other.toNumber());
+ }
+
+ // Fill in an array of 16-bit products.
+ var len = this.bits_.length + other.bits_.length;
+ var arr = [];
+ for (var i = 0; i < 2 * len; i++) {
+ arr[i] = 0;
+ }
+ for (var i = 0; i < this.bits_.length; i++) {
+ for (var j = 0; j < other.bits_.length; j++) {
+ var a1 = this.getBits(i) >>> 16;
+ var a0 = this.getBits(i) & 0xFFFF;
+
+ var b1 = other.getBits(j) >>> 16;
+ var b0 = other.getBits(j) & 0xFFFF;
+
+ arr[2 * i + 2 * j] += a0 * b0;
+ goog.math.Integer.carry16_(arr, 2 * i + 2 * j);
+ arr[2 * i + 2 * j + 1] += a1 * b0;
+ goog.math.Integer.carry16_(arr, 2 * i + 2 * j + 1);
+ arr[2 * i + 2 * j + 1] += a0 * b1;
+ goog.math.Integer.carry16_(arr, 2 * i + 2 * j + 1);
+ arr[2 * i + 2 * j + 2] += a1 * b1;
+ goog.math.Integer.carry16_(arr, 2 * i + 2 * j + 2);
+ }
+ }
+
+ // Combine the 16-bit values into 32-bit values.
+ for (var i = 0; i < len; i++) {
+ arr[i] = (arr[2 * i + 1] << 16) | arr[2 * i];
+ }
+ for (var i = len; i < 2 * len; i++) {
+ arr[i] = 0;
+ }
+ return new goog.math.Integer(arr, 0);
+};
+
+
+/**
+ * Carries any overflow from the given index into later entries.
+ * @param {Array<number>} bits Array of 16-bit values in little-endian order.
+ * @param {number} index The index in question.
+ * @private
+ */
+goog.math.Integer.carry16_ = function(bits, index) {
+ while ((bits[index] & 0xFFFF) != bits[index]) {
+ bits[index + 1] += bits[index] >>> 16;
+ bits[index] &= 0xFFFF;
+ index++;
+ }
+};
+
+
+/**
+ * Returns "this" Integer divided by the given one. Both "this" and the given
+ * Integer MUST be positive.
+ *
+ * This method is only needed for very large numbers (>10^308),
+ * for which the original division algorithm gets into an infinite
+ * loop (see https://github.com/google/closure-library/issues/500).
+ *
+ * The algorithm has some possible performance enhancements (or
+ * could be rewritten entirely), it's just an initial solution for
+ * the issue linked above.
+ *
+ * @param {!goog.math.Integer} other The Integer to divide "this" by.
+ * @return {!goog.math.Integer} "this" value divided by the given one.
+ * @private
+ */
+goog.math.Integer.prototype.slowDivide_ = function(other) {
+ if (this.isNegative() || other.isNegative()) {
+ throw Error('slowDivide_ only works with positive integers.');
+ }
+
+ var twoPower = goog.math.Integer.ONE;
+ var multiple = other;
+
+ // First we have to figure out what the highest bit of the result
+ // is, so we increase "twoPower" and "multiple" until "multiple"
+ // exceeds "this".
+ while (multiple.lessThanOrEqual(this)) {
+ twoPower = twoPower.shiftLeft(1);
+ multiple = multiple.shiftLeft(1);
+ }
+
+ // Rewind by one power of two, giving us the highest bit of the
+ // result.
+ var res = twoPower.shiftRight(1);
+ var total = multiple.shiftRight(1);
+
+ // Now we starting decreasing "multiple" and "twoPower" to find the
+ // rest of the bits of the result.
+ var total2;
+ multiple = multiple.shiftRight(2);
+ twoPower = twoPower.shiftRight(2);
+ while (!multiple.isZero()) {
+ // whenever we can add "multiple" to the total and not exceed
+ // "this", that means we've found a 1 bit. Else we've found a 0
+ // and don't need to add to the result.
+ total2 = total.add(multiple);
+ if (total2.lessThanOrEqual(this)) {
+ res = res.add(twoPower);
+ total = total2;
+ }
+ multiple = multiple.shiftRight(1);
+ twoPower = twoPower.shiftRight(1);
+ }
+ return res;
+};
+
+
+/**
+ * Returns this Integer divided by the given one.
+ * @param {!goog.math.Integer} other The Integer to divide this by.
+ * @return {!goog.math.Integer} This value divided by the given one.
+ */
+goog.math.Integer.prototype.divide = function(other) {
+ if (other.isZero()) {
+ throw Error('division by zero');
+ } else if (this.isZero()) {
+ return goog.math.Integer.ZERO;
+ }
+
+ if (this.isNegative()) {
+ if (other.isNegative()) {
+ return this.negate().divide(other.negate());
+ } else {
+ return this.negate().divide(other).negate();
+ }
+ } else if (other.isNegative()) {
+ return this.divide(other.negate()).negate();
+ }
+
+ // Have to degrade to slowDivide for Very Large Numbers, because
+ // they're out of range for the floating-point approximation
+ // technique used below.
+ if (this.bits_.length > 30) {
+ return this.slowDivide_(other);
+ }
+
+ // Repeat the following until the remainder is less than other: find a
+ // floating-point that approximates remainder / other *from below*, add this
+ // into the result, and subtract it from the remainder. It is critical that
+ // the approximate value is less than or equal to the real value so that the
+ // remainder never becomes negative.
+ var res = goog.math.Integer.ZERO;
+ var rem = this;
+ while (rem.greaterThanOrEqual(other)) {
+ // Approximate the result of division. This may be a little greater or
+ // smaller than the actual value.
+ var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));
+
+ // We will tweak the approximate result by changing it in the 48-th digit or
+ // the smallest non-fractional digit, whichever is larger.
+ var log2 = Math.ceil(Math.log(approx) / Math.LN2);
+ var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);
+
+ // Decrease the approximation until it is smaller than the remainder. Note
+ // that if it is too large, the product overflows and is negative.
+ var approxRes = goog.math.Integer.fromNumber(approx);
+ var approxRem = approxRes.multiply(other);
+ while (approxRem.isNegative() || approxRem.greaterThan(rem)) {
+ approx -= delta;
+ approxRes = goog.math.Integer.fromNumber(approx);
+ approxRem = approxRes.multiply(other);
+ }
+
+ // We know the answer can't be zero... and actually, zero would cause
+ // infinite recursion since we would make no progress.
+ if (approxRes.isZero()) {
+ approxRes = goog.math.Integer.ONE;
+ }
+
+ res = res.add(approxRes);
+ rem = rem.subtract(approxRem);
+ }
+ return res;
+};
+
+
+/**
+ * Returns this Integer modulo the given one.
+ * @param {!goog.math.Integer} other The Integer by which to mod.
+ * @return {!goog.math.Integer} This value modulo the given one.
+ */
+goog.math.Integer.prototype.modulo = function(other) {
+ return this.subtract(this.divide(other).multiply(other));
+};
+
+
+/** @return {!goog.math.Integer} The bitwise-NOT of this value. */
+goog.math.Integer.prototype.not = function() {
+ var len = this.bits_.length;
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ arr[i] = ~this.bits_[i];
+ }
+ return new goog.math.Integer(arr, ~this.sign_);
+};
+
+
+/**
+ * Returns the bitwise-AND of this Integer and the given one.
+ * @param {goog.math.Integer} other The Integer to AND with this.
+ * @return {!goog.math.Integer} The bitwise-AND of this and the other.
+ */
+goog.math.Integer.prototype.and = function(other) {
+ var len = Math.max(this.bits_.length, other.bits_.length);
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ arr[i] = this.getBits(i) & other.getBits(i);
+ }
+ return new goog.math.Integer(arr, this.sign_ & other.sign_);
+};
+
+
+/**
+ * Returns the bitwise-OR of this Integer and the given one.
+ * @param {goog.math.Integer} other The Integer to OR with this.
+ * @return {!goog.math.Integer} The bitwise-OR of this and the other.
+ */
+goog.math.Integer.prototype.or = function(other) {
+ var len = Math.max(this.bits_.length, other.bits_.length);
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ arr[i] = this.getBits(i) | other.getBits(i);
+ }
+ return new goog.math.Integer(arr, this.sign_ | other.sign_);
+};
+
+
+/**
+ * Returns the bitwise-XOR of this Integer and the given one.
+ * @param {goog.math.Integer} other The Integer to XOR with this.
+ * @return {!goog.math.Integer} The bitwise-XOR of this and the other.
+ */
+goog.math.Integer.prototype.xor = function(other) {
+ var len = Math.max(this.bits_.length, other.bits_.length);
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ arr[i] = this.getBits(i) ^ other.getBits(i);
+ }
+ return new goog.math.Integer(arr, this.sign_ ^ other.sign_);
+};
+
+
+/**
+ * Returns this value with bits shifted to the left by the given amount.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Integer} This shifted to the left by the given amount.
+ */
+goog.math.Integer.prototype.shiftLeft = function(numBits) {
+ var arr_delta = numBits >> 5;
+ var bit_delta = numBits % 32;
+ var len = this.bits_.length + arr_delta + (bit_delta > 0 ? 1 : 0);
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ if (bit_delta > 0) {
+ arr[i] = (this.getBits(i - arr_delta) << bit_delta) |
+ (this.getBits(i - arr_delta - 1) >>> (32 - bit_delta));
+ } else {
+ arr[i] = this.getBits(i - arr_delta);
+ }
+ }
+ return new goog.math.Integer(arr, this.sign_);
+};
+
+
+/**
+ * Returns this value with bits shifted to the right by the given amount.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Integer} This shifted to the right by the given amount.
+ */
+goog.math.Integer.prototype.shiftRight = function(numBits) {
+ var arr_delta = numBits >> 5;
+ var bit_delta = numBits % 32;
+ var len = this.bits_.length - arr_delta;
+ var arr = [];
+ for (var i = 0; i < len; i++) {
+ if (bit_delta > 0) {
+ arr[i] = (this.getBits(i + arr_delta) >>> bit_delta) |
+ (this.getBits(i + arr_delta + 1) << (32 - bit_delta));
+ } else {
+ arr[i] = this.getBits(i + arr_delta);
+ }
+ }
+ return new goog.math.Integer(arr, this.sign_);
+};
diff --git a/src/http/static/viz/2/goog/math/long.js b/src/http/static/viz/2/goog/math/long.js
new file mode 100644
index 0000000..5212caf
--- /dev/null
+++ b/src/http/static/viz/2/goog/math/long.js
@@ -0,0 +1,965 @@
+// Copyright 2009 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Defines a Long class for representing a 64-bit two's-complement
+ * integer value, which faithfully simulates the behavior of a Java "long". This
+ * implementation is derived from LongLib in GWT.
+ *
+ */
+
+goog.provide('goog.math.Long');
+
+goog.require('goog.asserts');
+goog.require('goog.reflect');
+
+
+
+/**
+ * Constructs a 64-bit two's-complement integer, given its low and high 32-bit
+ * values as *signed* integers. See the from* functions below for more
+ * convenient ways of constructing Longs.
+ *
+ * The internal representation of a long is the two given signed, 32-bit values.
+ * We use 32-bit pieces because these are the size of integers on which
+ * Javascript performs bit-operations. For operations like addition and
+ * multiplication, we split each number into 16-bit pieces, which can easily be
+ * multiplied within Javascript's floating-point representation without overflow
+ * or change in sign.
+ *
+ * In the algorithms below, we frequently reduce the negative case to the
+ * positive case by negating the input(s) and then post-processing the result.
+ * Note that we must ALWAYS check specially whether those values are MIN_VALUE
+ * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as
+ * a positive number, it overflows back into a negative). Not handling this
+ * case would often result in infinite recursion.
+ *
+ * @param {number} low The low (signed) 32 bits of the long.
+ * @param {number} high The high (signed) 32 bits of the long.
+ * @struct
+ * @constructor
+ * @final
+ */
+goog.math.Long = function(low, high) {
+ /**
+ * @type {number}
+ * @private
+ */
+ this.low_ = low | 0; // force into 32 signed bits.
+
+ /**
+ * @type {number}
+ * @private
+ */
+ this.high_ = high | 0; // force into 32 signed bits.
+};
+
+
+// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the
+// from* methods on which they depend.
+
+
+/**
+ * A cache of the Long representations of small integer values.
+ * @type {!Object<number, !goog.math.Long>}
+ * @private
+ */
+goog.math.Long.IntCache_ = {};
+
+
+/**
+ * A cache of the Long representations of common values.
+ * @type {!Object<goog.math.Long.ValueCacheId_, !goog.math.Long>}
+ * @private
+ */
+goog.math.Long.valueCache_ = {};
+
+/**
+ * Returns a cached long number representing the given (32-bit) integer value.
+ * @param {number} value The 32-bit integer in question.
+ * @return {!goog.math.Long} The corresponding Long value.
+ * @private
+ */
+goog.math.Long.getCachedIntValue_ = function(value) {
+ return goog.reflect.cache(goog.math.Long.IntCache_, value, function(val) {
+ return new goog.math.Long(val, val < 0 ? -1 : 0);
+ });
+};
+
+/**
+ * The array of maximum values of a Long in string representation for a given
+ * radix between 2 and 36, inclusive.
+ * @private @const {!Array<string>}
+ */
+goog.math.Long.MAX_VALUE_FOR_RADIX_ = [
+ '', '', // unused
+ '111111111111111111111111111111111111111111111111111111111111111',
+ // base 2
+ '2021110011022210012102010021220101220221', // base 3
+ '13333333333333333333333333333333', // base 4
+ '1104332401304422434310311212', // base 5
+ '1540241003031030222122211', // base 6
+ '22341010611245052052300', // base 7
+ '777777777777777777777', // base 8
+ '67404283172107811827', // base 9
+ '9223372036854775807', // base 10
+ '1728002635214590697', // base 11
+ '41a792678515120367', // base 12
+ '10b269549075433c37', // base 13
+ '4340724c6c71dc7a7', // base 14
+ '160e2ad3246366807', // base 15
+ '7fffffffffffffff', // base 16
+ '33d3d8307b214008', // base 17
+ '16agh595df825fa7', // base 18
+ 'ba643dci0ffeehh', // base 19
+ '5cbfjia3fh26ja7', // base 20
+ '2heiciiie82dh97', // base 21
+ '1adaibb21dckfa7', // base 22
+ 'i6k448cf4192c2', // base 23
+ 'acd772jnc9l0l7', // base 24
+ '64ie1focnn5g77', // base 25
+ '3igoecjbmca687', // base 26
+ '27c48l5b37oaop', // base 27
+ '1bk39f3ah3dmq7', // base 28
+ 'q1se8f0m04isb', // base 29
+ 'hajppbc1fc207', // base 30
+ 'bm03i95hia437', // base 31
+ '7vvvvvvvvvvvv', // base 32
+ '5hg4ck9jd4u37', // base 33
+ '3tdtk1v8j6tpp', // base 34
+ '2pijmikexrxp7', // base 35
+ '1y2p0ij32e8e7' // base 36
+];
+
+
+/**
+ * The array of minimum values of a Long in string representation for a given
+ * radix between 2 and 36, inclusive.
+ * @private @const {!Array<string>}
+ */
+goog.math.Long.MIN_VALUE_FOR_RADIX_ = [
+ '', '', // unused
+ '-1000000000000000000000000000000000000000000000000000000000000000',
+ // base 2
+ '-2021110011022210012102010021220101220222', // base 3
+ '-20000000000000000000000000000000', // base 4
+ '-1104332401304422434310311213', // base 5
+ '-1540241003031030222122212', // base 6
+ '-22341010611245052052301', // base 7
+ '-1000000000000000000000', // base 8
+ '-67404283172107811828', // base 9
+ '-9223372036854775808', // base 10
+ '-1728002635214590698', // base 11
+ '-41a792678515120368', // base 12
+ '-10b269549075433c38', // base 13
+ '-4340724c6c71dc7a8', // base 14
+ '-160e2ad3246366808', // base 15
+ '-8000000000000000', // base 16
+ '-33d3d8307b214009', // base 17
+ '-16agh595df825fa8', // base 18
+ '-ba643dci0ffeehi', // base 19
+ '-5cbfjia3fh26ja8', // base 20
+ '-2heiciiie82dh98', // base 21
+ '-1adaibb21dckfa8', // base 22
+ '-i6k448cf4192c3', // base 23
+ '-acd772jnc9l0l8', // base 24
+ '-64ie1focnn5g78', // base 25
+ '-3igoecjbmca688', // base 26
+ '-27c48l5b37oaoq', // base 27
+ '-1bk39f3ah3dmq8', // base 28
+ '-q1se8f0m04isc', // base 29
+ '-hajppbc1fc208', // base 30
+ '-bm03i95hia438', // base 31
+ '-8000000000000', // base 32
+ '-5hg4ck9jd4u38', // base 33
+ '-3tdtk1v8j6tpq', // base 34
+ '-2pijmikexrxp8', // base 35
+ '-1y2p0ij32e8e8' // base 36
+];
+
+
+/**
+ * Returns a Long representing the given (32-bit) integer value.
+ * @param {number} value The 32-bit integer in question.
+ * @return {!goog.math.Long} The corresponding Long value.
+ */
+goog.math.Long.fromInt = function(value) {
+ var intValue = value | 0;
+ goog.asserts.assert(value === intValue, 'value should be a 32-bit integer');
+
+ if (-128 <= intValue && intValue < 128) {
+ return goog.math.Long.getCachedIntValue_(intValue);
+ } else {
+ return new goog.math.Long(intValue, intValue < 0 ? -1 : 0);
+ }
+};
+
+
+/**
+ * Returns a Long representing the given value.
+ * NaN will be returned as zero. Infinity is converted to max value and
+ * -Infinity to min value.
+ * @param {number} value The number in question.
+ * @return {!goog.math.Long} The corresponding Long value.
+ */
+goog.math.Long.fromNumber = function(value) {
+ if (isNaN(value)) {
+ return goog.math.Long.getZero();
+ } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {
+ return goog.math.Long.getMinValue();
+ } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {
+ return goog.math.Long.getMaxValue();
+ } else if (value < 0) {
+ return goog.math.Long.fromNumber(-value).negate();
+ } else {
+ return new goog.math.Long(
+ (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,
+ (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);
+ }
+};
+
+
+/**
+ * Returns a Long representing the 64-bit integer that comes by concatenating
+ * the given high and low bits. Each is assumed to use 32 bits.
+ * @param {number} lowBits The low 32-bits.
+ * @param {number} highBits The high 32-bits.
+ * @return {!goog.math.Long} The corresponding Long value.
+ */
+goog.math.Long.fromBits = function(lowBits, highBits) {
+ return new goog.math.Long(lowBits, highBits);
+};
+
+
+/**
+ * Returns a Long representation of the given string, written using the given
+ * radix.
+ * @param {string} str The textual representation of the Long.
+ * @param {number=} opt_radix The radix in which the text is written.
+ * @return {!goog.math.Long} The corresponding Long value.
+ */
+goog.math.Long.fromString = function(str, opt_radix) {
+ if (str.length == 0) {
+ throw Error('number format error: empty string');
+ }
+
+ var radix = opt_radix || 10;
+ if (radix < 2 || 36 < radix) {
+ throw Error('radix out of range: ' + radix);
+ }
+
+ if (str.charAt(0) == '-') {
+ return goog.math.Long.fromString(str.substring(1), radix).negate();
+ } else if (str.indexOf('-') >= 0) {
+ throw Error('number format error: interior "-" character: ' + str);
+ }
+
+ // Do several (8) digits each time through the loop, so as to
+ // minimize the calls to the very expensive emulated div.
+ var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));
+
+ var result = goog.math.Long.getZero();
+ for (var i = 0; i < str.length; i += 8) {
+ var size = Math.min(8, str.length - i);
+ var value = parseInt(str.substring(i, i + size), radix);
+ if (size < 8) {
+ var power = goog.math.Long.fromNumber(Math.pow(radix, size));
+ result = result.multiply(power).add(goog.math.Long.fromNumber(value));
+ } else {
+ result = result.multiply(radixToPower);
+ result = result.add(goog.math.Long.fromNumber(value));
+ }
+ }
+ return result;
+};
+
+/**
+ * Returns the boolean value of whether the input string is within a Long's
+ * range. Assumes an input string containing only numeric characters with an
+ * optional preceding '-'.
+ * @param {string} str The textual representation of the Long.
+ * @param {number=} opt_radix The radix in which the text is written.
+ * @return {boolean} Whether the string is within the range of a Long.
+ */
+goog.math.Long.isStringInRange = function(str, opt_radix) {
+ var radix = opt_radix || 10;
+ if (radix < 2 || 36 < radix) {
+ throw Error('radix out of range: ' + radix);
+ }
+
+ var extremeValue = (str.charAt(0) == '-') ?
+ goog.math.Long.MIN_VALUE_FOR_RADIX_[radix] :
+ goog.math.Long.MAX_VALUE_FOR_RADIX_[radix];
+
+ if (str.length < extremeValue.length) {
+ return true;
+ } else if (str.length == extremeValue.length && str <= extremeValue) {
+ return true;
+ } else {
+ return false;
+ }
+};
+
+// NOTE: the compiler should inline these constant values below and then remove
+// these variables, so there should be no runtime penalty for these.
+
+
+/**
+ * Number used repeated below in calculations. This must appear before the
+ * first call to any from* function below.
+ * @type {number}
+ * @private
+ */
+goog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;
+
+
+/**
+ * @type {number}
+ * @private
+ */
+goog.math.Long.TWO_PWR_32_DBL_ =
+ goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;
+
+
+/**
+ * @type {number}
+ * @private
+ */
+goog.math.Long.TWO_PWR_64_DBL_ =
+ goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;
+
+
+/**
+ * @type {number}
+ * @private
+ */
+goog.math.Long.TWO_PWR_63_DBL_ = goog.math.Long.TWO_PWR_64_DBL_ / 2;
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getZero = function() {
+ return goog.math.Long.getCachedIntValue_(0);
+};
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getOne = function() {
+ return goog.math.Long.getCachedIntValue_(1);
+};
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getNegOne = function() {
+ return goog.math.Long.getCachedIntValue_(-1);
+};
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getMaxValue = function() {
+ return goog.reflect.cache(
+ goog.math.Long.valueCache_, goog.math.Long.ValueCacheId_.MAX_VALUE,
+ function() {
+ return goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);
+ });
+};
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getMinValue = function() {
+ return goog.reflect.cache(
+ goog.math.Long.valueCache_, goog.math.Long.ValueCacheId_.MIN_VALUE,
+ function() { return goog.math.Long.fromBits(0, 0x80000000 | 0); });
+};
+
+
+/**
+ * @return {!goog.math.Long}
+ * @public
+ */
+goog.math.Long.getTwoPwr24 = function() {
+ return goog.reflect.cache(
+ goog.math.Long.valueCache_, goog.math.Long.ValueCacheId_.TWO_PWR_24,
+ function() { return goog.math.Long.fromInt(1 << 24); });
+};
+
+
+/** @return {number} The value, assuming it is a 32-bit integer. */
+goog.math.Long.prototype.toInt = function() {
+ return this.low_;
+};
+
+
+/** @return {number} The closest floating-point representation to this value. */
+goog.math.Long.prototype.toNumber = function() {
+ return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +
+ this.getLowBitsUnsigned();
+};
+
+
+/**
+ * @param {number=} opt_radix The radix in which the text should be written.
+ * @return {string} The textual representation of this value.
+ * @override
+ */
+goog.math.Long.prototype.toString = function(opt_radix) {
+ var radix = opt_radix || 10;
+ if (radix < 2 || 36 < radix) {
+ throw Error('radix out of range: ' + radix);
+ }
+
+ if (this.isZero()) {
+ return '0';
+ }
+
+ if (this.isNegative()) {
+ if (this.equals(goog.math.Long.getMinValue())) {
+ // We need to change the Long value before it can be negated, so we remove
+ // the bottom-most digit in this base and then recurse to do the rest.
+ var radixLong = goog.math.Long.fromNumber(radix);
+ var div = this.div(radixLong);
+ var rem = div.multiply(radixLong).subtract(this);
+ return div.toString(radix) + rem.toInt().toString(radix);
+ } else {
+ return '-' + this.negate().toString(radix);
+ }
+ }
+
+ // Do several (6) digits each time through the loop, so as to
+ // minimize the calls to the very expensive emulated div.
+ var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));
+
+ var rem = this;
+ var result = '';
+ while (true) {
+ var remDiv = rem.div(radixToPower);
+ // The right shifting fixes negative values in the case when
+ // intval >= 2^31; for more details see
+ // https://github.com/google/closure-library/pull/498
+ var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt() >>> 0;
+ var digits = intval.toString(radix);
+
+ rem = remDiv;
+ if (rem.isZero()) {
+ return digits + result;
+ } else {
+ while (digits.length < 6) {
+ digits = '0' + digits;
+ }
+ result = '' + digits + result;
+ }
+ }
+};
+
+
+/** @return {number} The high 32-bits as a signed value. */
+goog.math.Long.prototype.getHighBits = function() {
+ return this.high_;
+};
+
+
+/** @return {number} The low 32-bits as a signed value. */
+goog.math.Long.prototype.getLowBits = function() {
+ return this.low_;
+};
+
+
+/** @return {number} The low 32-bits as an unsigned value. */
+goog.math.Long.prototype.getLowBitsUnsigned = function() {
+ return (this.low_ >= 0) ? this.low_ :
+ goog.math.Long.TWO_PWR_32_DBL_ + this.low_;
+};
+
+
+/**
+ * @return {number} Returns the number of bits needed to represent the absolute
+ * value of this Long.
+ */
+goog.math.Long.prototype.getNumBitsAbs = function() {
+ if (this.isNegative()) {
+ if (this.equals(goog.math.Long.getMinValue())) {
+ return 64;
+ } else {
+ return this.negate().getNumBitsAbs();
+ }
+ } else {
+ var val = this.high_ != 0 ? this.high_ : this.low_;
+ for (var bit = 31; bit > 0; bit--) {
+ if ((val & (1 << bit)) != 0) {
+ break;
+ }
+ }
+ return this.high_ != 0 ? bit + 33 : bit + 1;
+ }
+};
+
+
+/** @return {boolean} Whether this value is zero. */
+goog.math.Long.prototype.isZero = function() {
+ return this.high_ == 0 && this.low_ == 0;
+};
+
+
+/** @return {boolean} Whether this value is negative. */
+goog.math.Long.prototype.isNegative = function() {
+ return this.high_ < 0;
+};
+
+
+/** @return {boolean} Whether this value is odd. */
+goog.math.Long.prototype.isOdd = function() {
+ return (this.low_ & 1) == 1;
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long equals the other.
+ */
+goog.math.Long.prototype.equals = function(other) {
+ return (this.high_ == other.high_) && (this.low_ == other.low_);
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long does not equal the other.
+ */
+goog.math.Long.prototype.notEquals = function(other) {
+ return (this.high_ != other.high_) || (this.low_ != other.low_);
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long is less than the other.
+ */
+goog.math.Long.prototype.lessThan = function(other) {
+ return this.compare(other) < 0;
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long is less than or equal to the other.
+ */
+goog.math.Long.prototype.lessThanOrEqual = function(other) {
+ return this.compare(other) <= 0;
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long is greater than the other.
+ */
+goog.math.Long.prototype.greaterThan = function(other) {
+ return this.compare(other) > 0;
+};
+
+
+/**
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {boolean} Whether this Long is greater than or equal to the other.
+ */
+goog.math.Long.prototype.greaterThanOrEqual = function(other) {
+ return this.compare(other) >= 0;
+};
+
+
+/**
+ * Compares this Long with the given one.
+ * @param {goog.math.Long} other Long to compare against.
+ * @return {number} 0 if they are the same, 1 if the this is greater, and -1
+ * if the given one is greater.
+ */
+goog.math.Long.prototype.compare = function(other) {
+ if (this.equals(other)) {
+ return 0;
+ }
+
+ var thisNeg = this.isNegative();
+ var otherNeg = other.isNegative();
+ if (thisNeg && !otherNeg) {
+ return -1;
+ }
+ if (!thisNeg && otherNeg) {
+ return 1;
+ }
+
+ // at this point, the signs are the same, so subtraction will not overflow
+ if (this.subtract(other).isNegative()) {
+ return -1;
+ } else {
+ return 1;
+ }
+};
+
+
+/** @return {!goog.math.Long} The negation of this value. */
+goog.math.Long.prototype.negate = function() {
+ if (this.equals(goog.math.Long.getMinValue())) {
+ return goog.math.Long.getMinValue();
+ } else {
+ return this.not().add(goog.math.Long.getOne());
+ }
+};
+
+
+/**
+ * Returns the sum of this and the given Long.
+ * @param {goog.math.Long} other Long to add to this one.
+ * @return {!goog.math.Long} The sum of this and the given Long.
+ */
+goog.math.Long.prototype.add = function(other) {
+ // Divide each number into 4 chunks of 16 bits, and then sum the chunks.
+
+ var a48 = this.high_ >>> 16;
+ var a32 = this.high_ & 0xFFFF;
+ var a16 = this.low_ >>> 16;
+ var a00 = this.low_ & 0xFFFF;
+
+ var b48 = other.high_ >>> 16;
+ var b32 = other.high_ & 0xFFFF;
+ var b16 = other.low_ >>> 16;
+ var b00 = other.low_ & 0xFFFF;
+
+ var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
+ c00 += a00 + b00;
+ c16 += c00 >>> 16;
+ c00 &= 0xFFFF;
+ c16 += a16 + b16;
+ c32 += c16 >>> 16;
+ c16 &= 0xFFFF;
+ c32 += a32 + b32;
+ c48 += c32 >>> 16;
+ c32 &= 0xFFFF;
+ c48 += a48 + b48;
+ c48 &= 0xFFFF;
+ return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);
+};
+
+
+/**
+ * Returns the difference of this and the given Long.
+ * @param {goog.math.Long} other Long to subtract from this.
+ * @return {!goog.math.Long} The difference of this and the given Long.
+ */
+goog.math.Long.prototype.subtract = function(other) {
+ return this.add(other.negate());
+};
+
+
+/**
+ * Returns the product of this and the given long.
+ * @param {goog.math.Long} other Long to multiply with this.
+ * @return {!goog.math.Long} The product of this and the other.
+ */
+goog.math.Long.prototype.multiply = function(other) {
+ if (this.isZero()) {
+ return goog.math.Long.getZero();
+ } else if (other.isZero()) {
+ return goog.math.Long.getZero();
+ }
+
+ if (this.equals(goog.math.Long.getMinValue())) {
+ return other.isOdd() ? goog.math.Long.getMinValue() :
+ goog.math.Long.getZero();
+ } else if (other.equals(goog.math.Long.getMinValue())) {
+ return this.isOdd() ? goog.math.Long.getMinValue() :
+ goog.math.Long.getZero();
+ }
+
+ if (this.isNegative()) {
+ if (other.isNegative()) {
+ return this.negate().multiply(other.negate());
+ } else {
+ return this.negate().multiply(other).negate();
+ }
+ } else if (other.isNegative()) {
+ return this.multiply(other.negate()).negate();
+ }
+
+ // If both longs are small, use float multiplication
+ if (this.lessThan(goog.math.Long.getTwoPwr24()) &&
+ other.lessThan(goog.math.Long.getTwoPwr24())) {
+ return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());
+ }
+
+ // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
+ // We can skip products that would overflow.
+
+ var a48 = this.high_ >>> 16;
+ var a32 = this.high_ & 0xFFFF;
+ var a16 = this.low_ >>> 16;
+ var a00 = this.low_ & 0xFFFF;
+
+ var b48 = other.high_ >>> 16;
+ var b32 = other.high_ & 0xFFFF;
+ var b16 = other.low_ >>> 16;
+ var b00 = other.low_ & 0xFFFF;
+
+ var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
+ c00 += a00 * b00;
+ c16 += c00 >>> 16;
+ c00 &= 0xFFFF;
+ c16 += a16 * b00;
+ c32 += c16 >>> 16;
+ c16 &= 0xFFFF;
+ c16 += a00 * b16;
+ c32 += c16 >>> 16;
+ c16 &= 0xFFFF;
+ c32 += a32 * b00;
+ c48 += c32 >>> 16;
+ c32 &= 0xFFFF;
+ c32 += a16 * b16;
+ c48 += c32 >>> 16;
+ c32 &= 0xFFFF;
+ c32 += a00 * b32;
+ c48 += c32 >>> 16;
+ c32 &= 0xFFFF;
+ c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
+ c48 &= 0xFFFF;
+ return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);
+};
+
+
+/**
+ * Returns this Long divided by the given one.
+ * @param {goog.math.Long} other Long by which to divide.
+ * @return {!goog.math.Long} This Long divided by the given one.
+ */
+goog.math.Long.prototype.div = function(other) {
+ if (other.isZero()) {
+ throw Error('division by zero');
+ } else if (this.isZero()) {
+ return goog.math.Long.getZero();
+ }
+
+ if (this.equals(goog.math.Long.getMinValue())) {
+ if (other.equals(goog.math.Long.getOne()) ||
+ other.equals(goog.math.Long.getNegOne())) {
+ return goog.math.Long.getMinValue(); // recall -MIN_VALUE == MIN_VALUE
+ } else if (other.equals(goog.math.Long.getMinValue())) {
+ return goog.math.Long.getOne();
+ } else {
+ // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
+ var halfThis = this.shiftRight(1);
+ var approx = halfThis.div(other).shiftLeft(1);
+ if (approx.equals(goog.math.Long.getZero())) {
+ return other.isNegative() ? goog.math.Long.getOne() :
+ goog.math.Long.getNegOne();
+ } else {
+ var rem = this.subtract(other.multiply(approx));
+ var result = approx.add(rem.div(other));
+ return result;
+ }
+ }
+ } else if (other.equals(goog.math.Long.getMinValue())) {
+ return goog.math.Long.getZero();
+ }
+
+ if (this.isNegative()) {
+ if (other.isNegative()) {
+ return this.negate().div(other.negate());
+ } else {
+ return this.negate().div(other).negate();
+ }
+ } else if (other.isNegative()) {
+ return this.div(other.negate()).negate();
+ }
+
+ // Repeat the following until the remainder is less than other: find a
+ // floating-point that approximates remainder / other *from below*, add this
+ // into the result, and subtract it from the remainder. It is critical that
+ // the approximate value is less than or equal to the real value so that the
+ // remainder never becomes negative.
+ var res = goog.math.Long.getZero();
+ var rem = this;
+ while (rem.greaterThanOrEqual(other)) {
+ // Approximate the result of division. This may be a little greater or
+ // smaller than the actual value.
+ var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));
+
+ // We will tweak the approximate result by changing it in the 48-th digit or
+ // the smallest non-fractional digit, whichever is larger.
+ var log2 = Math.ceil(Math.log(approx) / Math.LN2);
+ var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);
+
+ // Decrease the approximation until it is smaller than the remainder. Note
+ // that if it is too large, the product overflows and is negative.
+ var approxRes = goog.math.Long.fromNumber(approx);
+ var approxRem = approxRes.multiply(other);
+ while (approxRem.isNegative() || approxRem.greaterThan(rem)) {
+ approx -= delta;
+ approxRes = goog.math.Long.fromNumber(approx);
+ approxRem = approxRes.multiply(other);
+ }
+
+ // We know the answer can't be zero... and actually, zero would cause
+ // infinite recursion since we would make no progress.
+ if (approxRes.isZero()) {
+ approxRes = goog.math.Long.getOne();
+ }
+
+ res = res.add(approxRes);
+ rem = rem.subtract(approxRem);
+ }
+ return res;
+};
+
+
+/**
+ * Returns this Long modulo the given one.
+ * @param {goog.math.Long} other Long by which to mod.
+ * @return {!goog.math.Long} This Long modulo the given one.
+ */
+goog.math.Long.prototype.modulo = function(other) {
+ return this.subtract(this.div(other).multiply(other));
+};
+
+
+/** @return {!goog.math.Long} The bitwise-NOT of this value. */
+goog.math.Long.prototype.not = function() {
+ return goog.math.Long.fromBits(~this.low_, ~this.high_);
+};
+
+
+/**
+ * Returns the bitwise-AND of this Long and the given one.
+ * @param {goog.math.Long} other The Long with which to AND.
+ * @return {!goog.math.Long} The bitwise-AND of this and the other.
+ */
+goog.math.Long.prototype.and = function(other) {
+ return goog.math.Long.fromBits(
+ this.low_ & other.low_, this.high_ & other.high_);
+};
+
+
+/**
+ * Returns the bitwise-OR of this Long and the given one.
+ * @param {goog.math.Long} other The Long with which to OR.
+ * @return {!goog.math.Long} The bitwise-OR of this and the other.
+ */
+goog.math.Long.prototype.or = function(other) {
+ return goog.math.Long.fromBits(
+ this.low_ | other.low_, this.high_ | other.high_);
+};
+
+
+/**
+ * Returns the bitwise-XOR of this Long and the given one.
+ * @param {goog.math.Long} other The Long with which to XOR.
+ * @return {!goog.math.Long} The bitwise-XOR of this and the other.
+ */
+goog.math.Long.prototype.xor = function(other) {
+ return goog.math.Long.fromBits(
+ this.low_ ^ other.low_, this.high_ ^ other.high_);
+};
+
+
+/**
+ * Returns this Long with bits shifted to the left by the given amount.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Long} This shifted to the left by the given amount.
+ */
+goog.math.Long.prototype.shiftLeft = function(numBits) {
+ numBits &= 63;
+ if (numBits == 0) {
+ return this;
+ } else {
+ var low = this.low_;
+ if (numBits < 32) {
+ var high = this.high_;
+ return goog.math.Long.fromBits(
+ low << numBits, (high << numBits) | (low >>> (32 - numBits)));
+ } else {
+ return goog.math.Long.fromBits(0, low << (numBits - 32));
+ }
+ }
+};
+
+
+/**
+ * Returns this Long with bits shifted to the right by the given amount.
+ * The new leading bits match the current sign bit.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Long} This shifted to the right by the given amount.
+ */
+goog.math.Long.prototype.shiftRight = function(numBits) {
+ numBits &= 63;
+ if (numBits == 0) {
+ return this;
+ } else {
+ var high = this.high_;
+ if (numBits < 32) {
+ var low = this.low_;
+ return goog.math.Long.fromBits(
+ (low >>> numBits) | (high << (32 - numBits)), high >> numBits);
+ } else {
+ return goog.math.Long.fromBits(
+ high >> (numBits - 32), high >= 0 ? 0 : -1);
+ }
+ }
+};
+
+
+/**
+ * Returns this Long with bits shifted to the right by the given amount, with
+ * zeros placed into the new leading bits.
+ * @param {number} numBits The number of bits by which to shift.
+ * @return {!goog.math.Long} This shifted to the right by the given amount, with
+ * zeros placed into the new leading bits.
+ */
+goog.math.Long.prototype.shiftRightUnsigned = function(numBits) {
+ numBits &= 63;
+ if (numBits == 0) {
+ return this;
+ } else {
+ var high = this.high_;
+ if (numBits < 32) {
+ var low = this.low_;
+ return goog.math.Long.fromBits(
+ (low >>> numBits) | (high << (32 - numBits)), high >>> numBits);
+ } else if (numBits == 32) {
+ return goog.math.Long.fromBits(high, 0);
+ } else {
+ return goog.math.Long.fromBits(high >>> (numBits - 32), 0);
+ }
+ }
+};
+
+
+/**
+ * @enum {number} Ids of commonly requested Long instances.
+ * @private
+ */
+goog.math.Long.ValueCacheId_ = {
+ MAX_VALUE: 1,
+ MIN_VALUE: 2,
+ TWO_PWR_24: 6
+};
diff --git a/src/http/static/viz/2/goog/math/math.js b/src/http/static/viz/2/goog/math/math.js
new file mode 100644
index 0000000..b8dbfb0
--- /dev/null
+++ b/src/http/static/viz/2/goog/math/math.js
@@ -0,0 +1,448 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Additional mathematical functions.
+ */
+
+goog.provide('goog.math');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+
+
+/**
+ * Returns a random integer greater than or equal to 0 and less than {@code a}.
+ * @param {number} a The upper bound for the random integer (exclusive).
+ * @return {number} A random integer N such that 0 <= N < a.
+ */
+goog.math.randomInt = function(a) {
+ return Math.floor(Math.random() * a);
+};
+
+
+/**
+ * Returns a random number greater than or equal to {@code a} and less than
+ * {@code b}.
+ * @param {number} a The lower bound for the random number (inclusive).
+ * @param {number} b The upper bound for the random number (exclusive).
+ * @return {number} A random number N such that a <= N < b.
+ */
+goog.math.uniformRandom = function(a, b) {
+ return a + Math.random() * (b - a);
+};
+
+
+/**
+ * Takes a number and clamps it to within the provided bounds.
+ * @param {number} value The input number.
+ * @param {number} min The minimum value to return.
+ * @param {number} max The maximum value to return.
+ * @return {number} The input number if it is within bounds, or the nearest
+ * number within the bounds.
+ */
+goog.math.clamp = function(value, min, max) {
+ return Math.min(Math.max(value, min), max);
+};
+
+
+/**
+ * The % operator in JavaScript returns the remainder of a / b, but differs from
+ * some other languages in that the result will have the same sign as the
+ * dividend. For example, -1 % 8 == -1, whereas in some other languages
+ * (such as Python) the result would be 7. This function emulates the more
+ * correct modulo behavior, which is useful for certain applications such as
+ * calculating an offset index in a circular list.
+ *
+ * @param {number} a The dividend.
+ * @param {number} b The divisor.
+ * @return {number} a % b where the result is between 0 and b (either 0 <= x < b
+ * or b < x <= 0, depending on the sign of b).
+ */
+goog.math.modulo = function(a, b) {
+ var r = a % b;
+ // If r and b differ in sign, add b to wrap the result to the correct sign.
+ return (r * b < 0) ? r + b : r;
+};
+
+
+/**
+ * Performs linear interpolation between values a and b. Returns the value
+ * between a and b proportional to x (when x is between 0 and 1. When x is
+ * outside this range, the return value is a linear extrapolation).
+ * @param {number} a A number.
+ * @param {number} b A number.
+ * @param {number} x The proportion between a and b.
+ * @return {number} The interpolated value between a and b.
+ */
+goog.math.lerp = function(a, b, x) {
+ return a + x * (b - a);
+};
+
+
+/**
+ * Tests whether the two values are equal to each other, within a certain
+ * tolerance to adjust for floating point errors.
+ * @param {number} a A number.
+ * @param {number} b A number.
+ * @param {number=} opt_tolerance Optional tolerance range. Defaults
+ * to 0.000001. If specified, should be greater than 0.
+ * @return {boolean} Whether {@code a} and {@code b} are nearly equal.
+ */
+goog.math.nearlyEquals = function(a, b, opt_tolerance) {
+ return Math.abs(a - b) <= (opt_tolerance || 0.000001);
+};
+
+
+// TODO(user): Rename to normalizeAngle, retaining old name as deprecated
+// alias.
+/**
+ * Normalizes an angle to be in range [0-360). Angles outside this range will
+ * be normalized to be the equivalent angle with that range.
+ * @param {number} angle Angle in degrees.
+ * @return {number} Standardized angle.
+ */
+goog.math.standardAngle = function(angle) {
+ return goog.math.modulo(angle, 360);
+};
+
+
+/**
+ * Normalizes an angle to be in range [0-2*PI). Angles outside this range will
+ * be normalized to be the equivalent angle with that range.
+ * @param {number} angle Angle in radians.
+ * @return {number} Standardized angle.
+ */
+goog.math.standardAngleInRadians = function(angle) {
+ return goog.math.modulo(angle, 2 * Math.PI);
+};
+
+
+/**
+ * Converts degrees to radians.
+ * @param {number} angleDegrees Angle in degrees.
+ * @return {number} Angle in radians.
+ */
+goog.math.toRadians = function(angleDegrees) {
+ return angleDegrees * Math.PI / 180;
+};
+
+
+/**
+ * Converts radians to degrees.
+ * @param {number} angleRadians Angle in radians.
+ * @return {number} Angle in degrees.
+ */
+goog.math.toDegrees = function(angleRadians) {
+ return angleRadians * 180 / Math.PI;
+};
+
+
+/**
+ * For a given angle and radius, finds the X portion of the offset.
+ * @param {number} degrees Angle in degrees (zero points in +X direction).
+ * @param {number} radius Radius.
+ * @return {number} The x-distance for the angle and radius.
+ */
+goog.math.angleDx = function(degrees, radius) {
+ return radius * Math.cos(goog.math.toRadians(degrees));
+};
+
+
+/**
+ * For a given angle and radius, finds the Y portion of the offset.
+ * @param {number} degrees Angle in degrees (zero points in +X direction).
+ * @param {number} radius Radius.
+ * @return {number} The y-distance for the angle and radius.
+ */
+goog.math.angleDy = function(degrees, radius) {
+ return radius * Math.sin(goog.math.toRadians(degrees));
+};
+
+
+/**
+ * Computes the angle between two points (x1,y1) and (x2,y2).
+ * Angle zero points in the +X direction, 90 degrees points in the +Y
+ * direction (down) and from there we grow clockwise towards 360 degrees.
+ * @param {number} x1 x of first point.
+ * @param {number} y1 y of first point.
+ * @param {number} x2 x of second point.
+ * @param {number} y2 y of second point.
+ * @return {number} Standardized angle in degrees of the vector from
+ * x1,y1 to x2,y2.
+ */
+goog.math.angle = function(x1, y1, x2, y2) {
+ return goog.math.standardAngle(
+ goog.math.toDegrees(Math.atan2(y2 - y1, x2 - x1)));
+};
+
+
+/**
+ * Computes the difference between startAngle and endAngle (angles in degrees).
+ * @param {number} startAngle Start angle in degrees.
+ * @param {number} endAngle End angle in degrees.
+ * @return {number} The number of degrees that when added to
+ * startAngle will result in endAngle. Positive numbers mean that the
+ * direction is clockwise. Negative numbers indicate a counter-clockwise
+ * direction.
+ * The shortest route (clockwise vs counter-clockwise) between the angles
+ * is used.
+ * When the difference is 180 degrees, the function returns 180 (not -180)
+ * angleDifference(30, 40) is 10, and angleDifference(40, 30) is -10.
+ * angleDifference(350, 10) is 20, and angleDifference(10, 350) is -20.
+ */
+goog.math.angleDifference = function(startAngle, endAngle) {
+ var d =
+ goog.math.standardAngle(endAngle) - goog.math.standardAngle(startAngle);
+ if (d > 180) {
+ d = d - 360;
+ } else if (d <= -180) {
+ d = 360 + d;
+ }
+ return d;
+};
+
+
+/**
+ * Returns the sign of a number as per the "sign" or "signum" function.
+ * @param {number} x The number to take the sign of.
+ * @return {number} -1 when negative, 1 when positive, 0 when 0. Preserves
+ * signed zeros and NaN.
+ */
+goog.math.sign = function(x) {
+ if (x > 0) {
+ return 1;
+ }
+ if (x < 0) {
+ return -1;
+ }
+ return x; // Preserves signed zeros and NaN.
+};
+
+
+/**
+ * JavaScript implementation of Longest Common Subsequence problem.
+ * http://en.wikipedia.org/wiki/Longest_common_subsequence
+ *
+ * Returns the longest possible array that is subarray of both of given arrays.
+ *
+ * @param {IArrayLike<S>} array1 First array of objects.
+ * @param {IArrayLike<T>} array2 Second array of objects.
+ * @param {Function=} opt_compareFn Function that acts as a custom comparator
+ * for the array ojects. Function should return true if objects are equal,
+ * otherwise false.
+ * @param {Function=} opt_collectorFn Function used to decide what to return
+ * as a result subsequence. It accepts 2 arguments: index of common element
+ * in the first array and index in the second. The default function returns
+ * element from the first array.
+ * @return {!Array<S|T>} A list of objects that are common to both arrays
+ * such that there is no common subsequence with size greater than the
+ * length of the list.
+ * @template S,T
+ */
+goog.math.longestCommonSubsequence = function(
+ array1, array2, opt_compareFn, opt_collectorFn) {
+
+ var compare = opt_compareFn || function(a, b) { return a == b; };
+
+ var collect = opt_collectorFn || function(i1, i2) { return array1[i1]; };
+
+ var length1 = array1.length;
+ var length2 = array2.length;
+
+ var arr = [];
+ for (var i = 0; i < length1 + 1; i++) {
+ arr[i] = [];
+ arr[i][0] = 0;
+ }
+
+ for (var j = 0; j < length2 + 1; j++) {
+ arr[0][j] = 0;
+ }
+
+ for (i = 1; i <= length1; i++) {
+ for (j = 1; j <= length2; j++) {
+ if (compare(array1[i - 1], array2[j - 1])) {
+ arr[i][j] = arr[i - 1][j - 1] + 1;
+ } else {
+ arr[i][j] = Math.max(arr[i - 1][j], arr[i][j - 1]);
+ }
+ }
+ }
+
+ // Backtracking
+ var result = [];
+ var i = length1, j = length2;
+ while (i > 0 && j > 0) {
+ if (compare(array1[i - 1], array2[j - 1])) {
+ result.unshift(collect(i - 1, j - 1));
+ i--;
+ j--;
+ } else {
+ if (arr[i - 1][j] > arr[i][j - 1]) {
+ i--;
+ } else {
+ j--;
+ }
+ }
+ }
+
+ return result;
+};
+
+
+/**
+ * Returns the sum of the arguments.
+ * @param {...number} var_args Numbers to add.
+ * @return {number} The sum of the arguments (0 if no arguments were provided,
+ * {@code NaN} if any of the arguments is not a valid number).
+ */
+goog.math.sum = function(var_args) {
+ return /** @type {number} */ (
+ goog.array.reduce(
+ arguments, function(sum, value) { return sum + value; }, 0));
+};
+
+
+/**
+ * Returns the arithmetic mean of the arguments.
+ * @param {...number} var_args Numbers to average.
+ * @return {number} The average of the arguments ({@code NaN} if no arguments
+ * were provided or any of the arguments is not a valid number).
+ */
+goog.math.average = function(var_args) {
+ return goog.math.sum.apply(null, arguments) / arguments.length;
+};
+
+
+/**
+ * Returns the unbiased sample variance of the arguments. For a definition,
+ * see e.g. http://en.wikipedia.org/wiki/Variance
+ * @param {...number} var_args Number samples to analyze.
+ * @return {number} The unbiased sample variance of the arguments (0 if fewer
+ * than two samples were provided, or {@code NaN} if any of the samples is
+ * not a valid number).
+ */
+goog.math.sampleVariance = function(var_args) {
+ var sampleSize = arguments.length;
+ if (sampleSize < 2) {
+ return 0;
+ }
+
+ var mean = goog.math.average.apply(null, arguments);
+ var variance =
+ goog.math.sum.apply(null, goog.array.map(arguments, function(val) {
+ return Math.pow(val - mean, 2);
+ })) / (sampleSize - 1);
+
+ return variance;
+};
+
+
+/**
+ * Returns the sample standard deviation of the arguments. For a definition of
+ * sample standard deviation, see e.g.
+ * http://en.wikipedia.org/wiki/Standard_deviation
+ * @param {...number} var_args Number samples to analyze.
+ * @return {number} The sample standard deviation of the arguments (0 if fewer
+ * than two samples were provided, or {@code NaN} if any of the samples is
+ * not a valid number).
+ */
+goog.math.standardDeviation = function(var_args) {
+ return Math.sqrt(goog.math.sampleVariance.apply(null, arguments));
+};
+
+
+/**
+ * Returns whether the supplied number represents an integer, i.e. that is has
+ * no fractional component. No range-checking is performed on the number.
+ * @param {number} num The number to test.
+ * @return {boolean} Whether {@code num} is an integer.
+ */
+goog.math.isInt = function(num) {
+ return isFinite(num) && num % 1 == 0;
+};
+
+
+/**
+ * Returns whether the supplied number is finite and not NaN.
+ * @param {number} num The number to test.
+ * @return {boolean} Whether {@code num} is a finite number.
+ * @deprecated Use {@link isFinite} instead.
+ */
+goog.math.isFiniteNumber = function(num) {
+ return isFinite(num);
+};
+
+
+/**
+ * @param {number} num The number to test.
+ * @return {boolean} Whether it is negative zero.
+ */
+goog.math.isNegativeZero = function(num) {
+ return num == 0 && 1 / num < 0;
+};
+
+
+/**
+ * Returns the precise value of floor(log10(num)).
+ * Simpler implementations didn't work because of floating point rounding
+ * errors. For example
+ * <ul>
+ * <li>Math.floor(Math.log(num) / Math.LN10) is off by one for num == 1e+3.
+ * <li>Math.floor(Math.log(num) * Math.LOG10E) is off by one for num == 1e+15.
+ * <li>Math.floor(Math.log10(num)) is off by one for num == 1e+15 - 1.
+ * </ul>
+ * @param {number} num A floating point number.
+ * @return {number} Its logarithm to base 10 rounded down to the nearest
+ * integer if num > 0. -Infinity if num == 0. NaN if num < 0.
+ */
+goog.math.log10Floor = function(num) {
+ if (num > 0) {
+ var x = Math.round(Math.log(num) * Math.LOG10E);
+ return x - (parseFloat('1e' + x) > num ? 1 : 0);
+ }
+ return num == 0 ? -Infinity : NaN;
+};
+
+
+/**
+ * A tweaked variant of {@code Math.floor} which tolerates if the passed number
+ * is infinitesimally smaller than the closest integer. It often happens with
+ * the results of floating point calculations because of the finite precision
+ * of the intermediate results. For example {@code Math.floor(Math.log(1000) /
+ * Math.LN10) == 2}, not 3 as one would expect.
+ * @param {number} num A number.
+ * @param {number=} opt_epsilon An infinitesimally small positive number, the
+ * rounding error to tolerate.
+ * @return {number} The largest integer less than or equal to {@code num}.
+ */
+goog.math.safeFloor = function(num, opt_epsilon) {
+ goog.asserts.assert(!goog.isDef(opt_epsilon) || opt_epsilon > 0);
+ return Math.floor(num + (opt_epsilon || 2e-15));
+};
+
+
+/**
+ * A tweaked variant of {@code Math.ceil}. See {@code goog.math.safeFloor} for
+ * details.
+ * @param {number} num A number.
+ * @param {number=} opt_epsilon An infinitesimally small positive number, the
+ * rounding error to tolerate.
+ * @return {number} The smallest integer greater than or equal to {@code num}.
+ */
+goog.math.safeCeil = function(num, opt_epsilon) {
+ goog.asserts.assert(!goog.isDef(opt_epsilon) || opt_epsilon > 0);
+ return Math.ceil(num - (opt_epsilon || 2e-15));
+};
diff --git a/src/http/static/viz/2/goog/math/size.js b/src/http/static/viz/2/goog/math/size.js
new file mode 100644
index 0000000..f5c379b
--- /dev/null
+++ b/src/http/static/viz/2/goog/math/size.js
@@ -0,0 +1,227 @@
+// Copyright 2007 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview A utility class for representing two-dimensional sizes.
+ * @author brenneman@google.com (Shawn Brenneman)
+ */
+
+
+goog.provide('goog.math.Size');
+
+
+
+/**
+ * Class for representing sizes consisting of a width and height. Undefined
+ * width and height support is deprecated and results in compiler warning.
+ * @param {number} width Width.
+ * @param {number} height Height.
+ * @struct
+ * @constructor
+ */
+goog.math.Size = function(width, height) {
+ /**
+ * Width
+ * @type {number}
+ */
+ this.width = width;
+
+ /**
+ * Height
+ * @type {number}
+ */
+ this.height = height;
+};
+
+
+/**
+ * Compares sizes for equality.
+ * @param {goog.math.Size} a A Size.
+ * @param {goog.math.Size} b A Size.
+ * @return {boolean} True iff the sizes have equal widths and equal
+ * heights, or if both are null.
+ */
+goog.math.Size.equals = function(a, b) {
+ if (a == b) {
+ return true;
+ }
+ if (!a || !b) {
+ return false;
+ }
+ return a.width == b.width && a.height == b.height;
+};
+
+
+/**
+ * @return {!goog.math.Size} A new copy of the Size.
+ */
+goog.math.Size.prototype.clone = function() {
+ return new goog.math.Size(this.width, this.height);
+};
+
+
+if (goog.DEBUG) {
+ /**
+ * Returns a nice string representing size.
+ * @return {string} In the form (50 x 73).
+ * @override
+ */
+ goog.math.Size.prototype.toString = function() {
+ return '(' + this.width + ' x ' + this.height + ')';
+ };
+}
+
+
+/**
+ * @return {number} The longer of the two dimensions in the size.
+ */
+goog.math.Size.prototype.getLongest = function() {
+ return Math.max(this.width, this.height);
+};
+
+
+/**
+ * @return {number} The shorter of the two dimensions in the size.
+ */
+goog.math.Size.prototype.getShortest = function() {
+ return Math.min(this.width, this.height);
+};
+
+
+/**
+ * @return {number} The area of the size (width * height).
+ */
+goog.math.Size.prototype.area = function() {
+ return this.width * this.height;
+};
+
+
+/**
+ * @return {number} The perimeter of the size (width + height) * 2.
+ */
+goog.math.Size.prototype.perimeter = function() {
+ return (this.width + this.height) * 2;
+};
+
+
+/**
+ * @return {number} The ratio of the size's width to its height.
+ */
+goog.math.Size.prototype.aspectRatio = function() {
+ return this.width / this.height;
+};
+
+
+/**
+ * @return {boolean} True if the size has zero area, false if both dimensions
+ * are non-zero numbers.
+ */
+goog.math.Size.prototype.isEmpty = function() {
+ return !this.area();
+};
+
+
+/**
+ * Clamps the width and height parameters upward to integer values.
+ * @return {!goog.math.Size} This size with ceil'd components.
+ */
+goog.math.Size.prototype.ceil = function() {
+ this.width = Math.ceil(this.width);
+ this.height = Math.ceil(this.height);
+ return this;
+};
+
+
+/**
+ * @param {!goog.math.Size} target The target size.
+ * @return {boolean} True if this Size is the same size or smaller than the
+ * target size in both dimensions.
+ */
+goog.math.Size.prototype.fitsInside = function(target) {
+ return this.width <= target.width && this.height <= target.height;
+};
+
+
+/**
+ * Clamps the width and height parameters downward to integer values.
+ * @return {!goog.math.Size} This size with floored components.
+ */
+goog.math.Size.prototype.floor = function() {
+ this.width = Math.floor(this.width);
+ this.height = Math.floor(this.height);
+ return this;
+};
+
+
+/**
+ * Rounds the width and height parameters to integer values.
+ * @return {!goog.math.Size} This size with rounded components.
+ */
+goog.math.Size.prototype.round = function() {
+ this.width = Math.round(this.width);
+ this.height = Math.round(this.height);
+ return this;
+};
+
+
+/**
+ * Scales this size by the given scale factors. The width and height are scaled
+ * by {@code sx} and {@code opt_sy} respectively. If {@code opt_sy} is not
+ * given, then {@code sx} is used for both the width and height.
+ * @param {number} sx The scale factor to use for the width.
+ * @param {number=} opt_sy The scale factor to use for the height.
+ * @return {!goog.math.Size} This Size object after scaling.
+ */
+goog.math.Size.prototype.scale = function(sx, opt_sy) {
+ var sy = goog.isNumber(opt_sy) ? opt_sy : sx;
+ this.width *= sx;
+ this.height *= sy;
+ return this;
+};
+
+
+/**
+ * Uniformly scales the size to perfectly cover the dimensions of a given size.
+ * If the size is already larger than the target, it will be scaled down to the
+ * minimum size at which it still covers the entire target. The original aspect
+ * ratio will be preserved.
+ *
+ * This function assumes that both Sizes contain strictly positive dimensions.
+ * @param {!goog.math.Size} target The target size.
+ * @return {!goog.math.Size} This Size object, after optional scaling.
+ */
+goog.math.Size.prototype.scaleToCover = function(target) {
+ var s = this.aspectRatio() <= target.aspectRatio() ?
+ target.width / this.width :
+ target.height / this.height;
+
+ return this.scale(s);
+};
+
+
+/**
+ * Uniformly scales the size to fit inside the dimensions of a given size. The
+ * original aspect ratio will be preserved.
+ *
+ * This function assumes that both Sizes contain strictly positive dimensions.
+ * @param {!goog.math.Size} target The target size.
+ * @return {!goog.math.Size} This Size object, after optional scaling.
+ */
+goog.math.Size.prototype.scaleToFit = function(target) {
+ var s = this.aspectRatio() > target.aspectRatio() ?
+ target.width / this.width :
+ target.height / this.height;
+
+ return this.scale(s);
+};
diff --git a/src/http/static/viz/2/goog/object/object.js b/src/http/static/viz/2/goog/object/object.js
new file mode 100644
index 0000000..2f26c2b
--- /dev/null
+++ b/src/http/static/viz/2/goog/object/object.js
@@ -0,0 +1,751 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for manipulating objects/maps/hashes.
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+goog.provide('goog.object');
+
+
+/**
+ * Whether two values are not observably distinguishable. This
+ * correctly detects that 0 is not the same as -0 and two NaNs are
+ * practically equivalent.
+ *
+ * The implementation is as suggested by harmony:egal proposal.
+ *
+ * @param {*} v The first value to compare.
+ * @param {*} v2 The second value to compare.
+ * @return {boolean} Whether two values are not observably distinguishable.
+ * @see http://wiki.ecmascript.org/doku.php?id=harmony:egal
+ */
+goog.object.is = function(v, v2) {
+ if (v === v2) {
+ // 0 === -0, but they are not identical.
+ // We need the cast because the compiler requires that v2 is a
+ // number (although 1/v2 works with non-number). We cast to ? to
+ // stop the compiler from type-checking this statement.
+ return v !== 0 || 1 / v === 1 / /** @type {?} */ (v2);
+ }
+
+ // NaN is non-reflexive: NaN !== NaN, although they are identical.
+ return v !== v && v2 !== v2;
+};
+
+
+/**
+ * Calls a function for each element in an object/map/hash.
+ *
+ * @param {Object<K,V>} obj The object over which to iterate.
+ * @param {function(this:T,V,?,Object<K,V>):?} f The function to call
+ * for every element. This function takes 3 arguments (the value, the
+ * key and the object) and the return value is ignored.
+ * @param {T=} opt_obj This is used as the 'this' object within f.
+ * @template T,K,V
+ */
+goog.object.forEach = function(obj, f, opt_obj) {
+ for (var key in obj) {
+ f.call(/** @type {?} */ (opt_obj), obj[key], key, obj);
+ }
+};
+
+
+/**
+ * Calls a function for each element in an object/map/hash. If that call returns
+ * true, adds the element to a new object.
+ *
+ * @param {Object<K,V>} obj The object over which to iterate.
+ * @param {function(this:T,V,?,Object<K,V>):boolean} f The function to call
+ * for every element. This
+ * function takes 3 arguments (the value, the key and the object)
+ * and should return a boolean. If the return value is true the
+ * element is added to the result object. If it is false the
+ * element is not included.
+ * @param {T=} opt_obj This is used as the 'this' object within f.
+ * @return {!Object<K,V>} a new object in which only elements that passed the
+ * test are present.
+ * @template T,K,V
+ */
+goog.object.filter = function(obj, f, opt_obj) {
+ var res = {};
+ for (var key in obj) {
+ if (f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {
+ res[key] = obj[key];
+ }
+ }
+ return res;
+};
+
+
+/**
+ * For every element in an object/map/hash calls a function and inserts the
+ * result into a new object.
+ *
+ * @param {Object<K,V>} obj The object over which to iterate.
+ * @param {function(this:T,V,?,Object<K,V>):R} f The function to call
+ * for every element. This function
+ * takes 3 arguments (the value, the key and the object)
+ * and should return something. The result will be inserted
+ * into a new object.
+ * @param {T=} opt_obj This is used as the 'this' object within f.
+ * @return {!Object<K,R>} a new object with the results from f.
+ * @template T,K,V,R
+ */
+goog.object.map = function(obj, f, opt_obj) {
+ var res = {};
+ for (var key in obj) {
+ res[key] = f.call(/** @type {?} */ (opt_obj), obj[key], key, obj);
+ }
+ return res;
+};
+
+
+/**
+ * Calls a function for each element in an object/map/hash. If any
+ * call returns true, returns true (without checking the rest). If
+ * all calls return false, returns false.
+ *
+ * @param {Object<K,V>} obj The object to check.
+ * @param {function(this:T,V,?,Object<K,V>):boolean} f The function to
+ * call for every element. This function
+ * takes 3 arguments (the value, the key and the object) and should
+ * return a boolean.
+ * @param {T=} opt_obj This is used as the 'this' object within f.
+ * @return {boolean} true if any element passes the test.
+ * @template T,K,V
+ */
+goog.object.some = function(obj, f, opt_obj) {
+ for (var key in obj) {
+ if (f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {
+ return true;
+ }
+ }
+ return false;
+};
+
+
+/**
+ * Calls a function for each element in an object/map/hash. If
+ * all calls return true, returns true. If any call returns false, returns
+ * false at this point and does not continue to check the remaining elements.
+ *
+ * @param {Object<K,V>} obj The object to check.
+ * @param {?function(this:T,V,?,Object<K,V>):boolean} f The function to
+ * call for every element. This function
+ * takes 3 arguments (the value, the key and the object) and should
+ * return a boolean.
+ * @param {T=} opt_obj This is used as the 'this' object within f.
+ * @return {boolean} false if any element fails the test.
+ * @template T,K,V
+ */
+goog.object.every = function(obj, f, opt_obj) {
+ for (var key in obj) {
+ if (!f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * Returns the number of key-value pairs in the object map.
+ *
+ * @param {Object} obj The object for which to get the number of key-value
+ * pairs.
+ * @return {number} The number of key-value pairs in the object map.
+ */
+goog.object.getCount = function(obj) {
+ var rv = 0;
+ for (var key in obj) {
+ rv++;
+ }
+ return rv;
+};
+
+
+/**
+ * Returns one key from the object map, if any exists.
+ * For map literals the returned key will be the first one in most of the
+ * browsers (a know exception is Konqueror).
+ *
+ * @param {Object} obj The object to pick a key from.
+ * @return {string|undefined} The key or undefined if the object is empty.
+ */
+goog.object.getAnyKey = function(obj) {
+ for (var key in obj) {
+ return key;
+ }
+};
+
+
+/**
+ * Returns one value from the object map, if any exists.
+ * For map literals the returned value will be the first one in most of the
+ * browsers (a know exception is Konqueror).
+ *
+ * @param {Object<K,V>} obj The object to pick a value from.
+ * @return {V|undefined} The value or undefined if the object is empty.
+ * @template K,V
+ */
+goog.object.getAnyValue = function(obj) {
+ for (var key in obj) {
+ return obj[key];
+ }
+};
+
+
+/**
+ * Whether the object/hash/map contains the given object as a value.
+ * An alias for goog.object.containsValue(obj, val).
+ *
+ * @param {Object<K,V>} obj The object in which to look for val.
+ * @param {V} val The object for which to check.
+ * @return {boolean} true if val is present.
+ * @template K,V
+ */
+goog.object.contains = function(obj, val) {
+ return goog.object.containsValue(obj, val);
+};
+
+
+/**
+ * Returns the values of the object/map/hash.
+ *
+ * @param {Object<K,V>} obj The object from which to get the values.
+ * @return {!Array<V>} The values in the object/map/hash.
+ * @template K,V
+ */
+goog.object.getValues = function(obj) {
+ var res = [];
+ var i = 0;
+ for (var key in obj) {
+ res[i++] = obj[key];
+ }
+ return res;
+};
+
+
+/**
+ * Returns the keys of the object/map/hash.
+ *
+ * @param {Object} obj The object from which to get the keys.
+ * @return {!Array<string>} Array of property keys.
+ */
+goog.object.getKeys = function(obj) {
+ var res = [];
+ var i = 0;
+ for (var key in obj) {
+ res[i++] = key;
+ }
+ return res;
+};
+
+
+/**
+ * Get a value from an object multiple levels deep. This is useful for
+ * pulling values from deeply nested objects, such as JSON responses.
+ * Example usage: getValueByKeys(jsonObj, 'foo', 'entries', 3)
+ *
+ * @param {!Object} obj An object to get the value from. Can be array-like.
+ * @param {...(string|number|!IArrayLike<number|string>)}
+ * var_args A number of keys
+ * (as strings, or numbers, for array-like objects). Can also be
+ * specified as a single array of keys.
+ * @return {*} The resulting value. If, at any point, the value for a key
+ * is undefined, returns undefined.
+ */
+goog.object.getValueByKeys = function(obj, var_args) {
+ var isArrayLike = goog.isArrayLike(var_args);
+ var keys = isArrayLike ? var_args : arguments;
+
+ // Start with the 2nd parameter for the variable parameters syntax.
+ for (var i = isArrayLike ? 0 : 1; i < keys.length; i++) {
+ obj = obj[keys[i]];
+ if (!goog.isDef(obj)) {
+ break;
+ }
+ }
+
+ return obj;
+};
+
+
+/**
+ * Whether the object/map/hash contains the given key.
+ *
+ * @param {Object} obj The object in which to look for key.
+ * @param {?} key The key for which to check.
+ * @return {boolean} true If the map contains the key.
+ */
+goog.object.containsKey = function(obj, key) {
+ return obj !== null && key in obj;
+};
+
+
+/**
+ * Whether the object/map/hash contains the given value. This is O(n).
+ *
+ * @param {Object<K,V>} obj The object in which to look for val.
+ * @param {V} val The value for which to check.
+ * @return {boolean} true If the map contains the value.
+ * @template K,V
+ */
+goog.object.containsValue = function(obj, val) {
+ for (var key in obj) {
+ if (obj[key] == val) {
+ return true;
+ }
+ }
+ return false;
+};
+
+
+/**
+ * Searches an object for an element that satisfies the given condition and
+ * returns its key.
+ * @param {Object<K,V>} obj The object to search in.
+ * @param {function(this:T,V,string,Object<K,V>):boolean} f The
+ * function to call for every element. Takes 3 arguments (the value,
+ * the key and the object) and should return a boolean.
+ * @param {T=} opt_this An optional "this" context for the function.
+ * @return {string|undefined} The key of an element for which the function
+ * returns true or undefined if no such element is found.
+ * @template T,K,V
+ */
+goog.object.findKey = function(obj, f, opt_this) {
+ for (var key in obj) {
+ if (f.call(/** @type {?} */ (opt_this), obj[key], key, obj)) {
+ return key;
+ }
+ }
+ return undefined;
+};
+
+
+/**
+ * Searches an object for an element that satisfies the given condition and
+ * returns its value.
+ * @param {Object<K,V>} obj The object to search in.
+ * @param {function(this:T,V,string,Object<K,V>):boolean} f The function
+ * to call for every element. Takes 3 arguments (the value, the key
+ * and the object) and should return a boolean.
+ * @param {T=} opt_this An optional "this" context for the function.
+ * @return {V} The value of an element for which the function returns true or
+ * undefined if no such element is found.
+ * @template T,K,V
+ */
+goog.object.findValue = function(obj, f, opt_this) {
+ var key = goog.object.findKey(obj, f, opt_this);
+ return key && obj[key];
+};
+
+
+/**
+ * Whether the object/map/hash is empty.
+ *
+ * @param {Object} obj The object to test.
+ * @return {boolean} true if obj is empty.
+ */
+goog.object.isEmpty = function(obj) {
+ for (var key in obj) {
+ return false;
+ }
+ return true;
+};
+
+
+/**
+ * Removes all key value pairs from the object/map/hash.
+ *
+ * @param {Object} obj The object to clear.
+ */
+goog.object.clear = function(obj) {
+ for (var i in obj) {
+ delete obj[i];
+ }
+};
+
+
+/**
+ * Removes a key-value pair based on the key.
+ *
+ * @param {Object} obj The object from which to remove the key.
+ * @param {?} key The key to remove.
+ * @return {boolean} Whether an element was removed.
+ */
+goog.object.remove = function(obj, key) {
+ var rv;
+ if (rv = key in /** @type {!Object} */ (obj)) {
+ delete obj[key];
+ }
+ return rv;
+};
+
+
+/**
+ * Adds a key-value pair to the object. Throws an exception if the key is
+ * already in use. Use set if you want to change an existing pair.
+ *
+ * @param {Object<K,V>} obj The object to which to add the key-value pair.
+ * @param {string} key The key to add.
+ * @param {V} val The value to add.
+ * @template K,V
+ */
+goog.object.add = function(obj, key, val) {
+ if (obj !== null && key in obj) {
+ throw Error('The object already contains the key "' + key + '"');
+ }
+ goog.object.set(obj, key, val);
+};
+
+
+/**
+ * Returns the value for the given key.
+ *
+ * @param {Object<K,V>} obj The object from which to get the value.
+ * @param {string} key The key for which to get the value.
+ * @param {R=} opt_val The value to return if no item is found for the given
+ * key (default is undefined).
+ * @return {V|R|undefined} The value for the given key.
+ * @template K,V,R
+ */
+goog.object.get = function(obj, key, opt_val) {
+ if (obj !== null && key in obj) {
+ return obj[key];
+ }
+ return opt_val;
+};
+
+
+/**
+ * Adds a key-value pair to the object/map/hash.
+ *
+ * @param {Object<K,V>} obj The object to which to add the key-value pair.
+ * @param {string} key The key to add.
+ * @param {V} value The value to add.
+ * @template K,V
+ */
+goog.object.set = function(obj, key, value) {
+ obj[key] = value;
+};
+
+
+/**
+ * Adds a key-value pair to the object/map/hash if it doesn't exist yet.
+ *
+ * @param {Object<K,V>} obj The object to which to add the key-value pair.
+ * @param {string} key The key to add.
+ * @param {V} value The value to add if the key wasn't present.
+ * @return {V} The value of the entry at the end of the function.
+ * @template K,V
+ */
+goog.object.setIfUndefined = function(obj, key, value) {
+ return key in /** @type {!Object} */ (obj) ? obj[key] : (obj[key] = value);
+};
+
+
+/**
+ * Sets a key and value to an object if the key is not set. The value will be
+ * the return value of the given function. If the key already exists, the
+ * object will not be changed and the function will not be called (the function
+ * will be lazily evaluated -- only called if necessary).
+ *
+ * This function is particularly useful for use with a map used a as a cache.
+ *
+ * @param {!Object<K,V>} obj The object to which to add the key-value pair.
+ * @param {string} key The key to add.
+ * @param {function():V} f The value to add if the key wasn't present.
+ * @return {V} The value of the entry at the end of the function.
+ * @template K,V
+ */
+goog.object.setWithReturnValueIfNotSet = function(obj, key, f) {
+ if (key in obj) {
+ return obj[key];
+ }
+
+ var val = f();
+ obj[key] = val;
+ return val;
+};
+
+
+/**
+ * Compares two objects for equality using === on the values.
+ *
+ * @param {!Object<K,V>} a
+ * @param {!Object<K,V>} b
+ * @return {boolean}
+ * @template K,V
+ */
+goog.object.equals = function(a, b) {
+ for (var k in a) {
+ if (!(k in b) || a[k] !== b[k]) {
+ return false;
+ }
+ }
+ for (var k in b) {
+ if (!(k in a)) {
+ return false;
+ }
+ }
+ return true;
+};
+
+
+/**
+ * Returns a shallow clone of the object.
+ *
+ * @param {Object<K,V>} obj Object to clone.
+ * @return {!Object<K,V>} Clone of the input object.
+ * @template K,V
+ */
+goog.object.clone = function(obj) {
+ // We cannot use the prototype trick because a lot of methods depend on where
+ // the actual key is set.
+
+ var res = {};
+ for (var key in obj) {
+ res[key] = obj[key];
+ }
+ return res;
+ // We could also use goog.mixin but I wanted this to be independent from that.
+};
+
+
+/**
+ * Clones a value. The input may be an Object, Array, or basic type. Objects and
+ * arrays will be cloned recursively.
+ *
+ * WARNINGS:
+ * <code>goog.object.unsafeClone</code> does not detect reference loops. Objects
+ * that refer to themselves will cause infinite recursion.
+ *
+ * <code>goog.object.unsafeClone</code> is unaware of unique identifiers, and
+ * copies UIDs created by <code>getUid</code> into cloned results.
+ *
+ * @param {T} obj The value to clone.
+ * @return {T} A clone of the input value.
+ * @template T
+ */
+goog.object.unsafeClone = function(obj) {
+ var type = goog.typeOf(obj);
+ if (type == 'object' || type == 'array') {
+ if (goog.isFunction(obj.clone)) {
+ return obj.clone();
+ }
+ var clone = type == 'array' ? [] : {};
+ for (var key in obj) {
+ clone[key] = goog.object.unsafeClone(obj[key]);
+ }
+ return clone;
+ }
+
+ return obj;
+};
+
+
+/**
+ * Returns a new object in which all the keys and values are interchanged
+ * (keys become values and values become keys). If multiple keys map to the
+ * same value, the chosen transposed value is implementation-dependent.
+ *
+ * @param {Object} obj The object to transpose.
+ * @return {!Object} The transposed object.
+ */
+goog.object.transpose = function(obj) {
+ var transposed = {};
+ for (var key in obj) {
+ transposed[obj[key]] = key;
+ }
+ return transposed;
+};
+
+
+/**
+ * The names of the fields that are defined on Object.prototype.
+ * @type {Array<string>}
+ * @private
+ */
+goog.object.PROTOTYPE_FIELDS_ = [
+ 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
+ 'toLocaleString', 'toString', 'valueOf'
+];
+
+
+/**
+ * Extends an object with another object.
+ * This operates 'in-place'; it does not create a new Object.
+ *
+ * Example:
+ * var o = {};
+ * goog.object.extend(o, {a: 0, b: 1});
+ * o; // {a: 0, b: 1}
+ * goog.object.extend(o, {b: 2, c: 3});
+ * o; // {a: 0, b: 2, c: 3}
+ *
+ * @param {Object} target The object to modify. Existing properties will be
+ * overwritten if they are also present in one of the objects in
+ * {@code var_args}.
+ * @param {...Object} var_args The objects from which values will be copied.
+ */
+goog.object.extend = function(target, var_args) {
+ var key, source;
+ for (var i = 1; i < arguments.length; i++) {
+ source = arguments[i];
+ for (key in source) {
+ target[key] = source[key];
+ }
+
+ // For IE the for-in-loop does not contain any properties that are not
+ // enumerable on the prototype object (for example isPrototypeOf from
+ // Object.prototype) and it will also not include 'replace' on objects that
+ // extend String and change 'replace' (not that it is common for anyone to
+ // extend anything except Object).
+
+ for (var j = 0; j < goog.object.PROTOTYPE_FIELDS_.length; j++) {
+ key = goog.object.PROTOTYPE_FIELDS_[j];
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+};
+
+
+/**
+ * Creates a new object built from the key-value pairs provided as arguments.
+ * @param {...*} var_args If only one argument is provided and it is an array
+ * then this is used as the arguments, otherwise even arguments are used as
+ * the property names and odd arguments are used as the property values.
+ * @return {!Object} The new object.
+ * @throws {Error} If there are uneven number of arguments or there is only one
+ * non array argument.
+ */
+goog.object.create = function(var_args) {
+ var argLength = arguments.length;
+ if (argLength == 1 && goog.isArray(arguments[0])) {
+ return goog.object.create.apply(null, arguments[0]);
+ }
+
+ if (argLength % 2) {
+ throw Error('Uneven number of arguments');
+ }
+
+ var rv = {};
+ for (var i = 0; i < argLength; i += 2) {
+ rv[arguments[i]] = arguments[i + 1];
+ }
+ return rv;
+};
+
+
+/**
+ * Creates a new object where the property names come from the arguments but
+ * the value is always set to true
+ * @param {...*} var_args If only one argument is provided and it is an array
+ * then this is used as the arguments, otherwise the arguments are used
+ * as the property names.
+ * @return {!Object} The new object.
+ */
+goog.object.createSet = function(var_args) {
+ var argLength = arguments.length;
+ if (argLength == 1 && goog.isArray(arguments[0])) {
+ return goog.object.createSet.apply(null, arguments[0]);
+ }
+
+ var rv = {};
+ for (var i = 0; i < argLength; i++) {
+ rv[arguments[i]] = true;
+ }
+ return rv;
+};
+
+
+/**
+ * Creates an immutable view of the underlying object, if the browser
+ * supports immutable objects.
+ *
+ * In default mode, writes to this view will fail silently. In strict mode,
+ * they will throw an error.
+ *
+ * @param {!Object<K,V>} obj An object.
+ * @return {!Object<K,V>} An immutable view of that object, or the
+ * original object if this browser does not support immutables.
+ * @template K,V
+ */
+goog.object.createImmutableView = function(obj) {
+ var result = obj;
+ if (Object.isFrozen && !Object.isFrozen(obj)) {
+ result = Object.create(obj);
+ Object.freeze(result);
+ }
+ return result;
+};
+
+
+/**
+ * @param {!Object} obj An object.
+ * @return {boolean} Whether this is an immutable view of the object.
+ */
+goog.object.isImmutableView = function(obj) {
+ return !!Object.isFrozen && Object.isFrozen(obj);
+};
+
+
+/**
+ * Get all properties names on a given Object regardless of enumerability.
+ *
+ * <p> If the browser does not support {@code Object.getOwnPropertyNames} nor
+ * {@code Object.getPrototypeOf} then this is equivalent to using {@code
+ * goog.object.getKeys}
+ *
+ * @param {?Object} obj The object to get the properties of.
+ * @param {boolean=} opt_includeObjectPrototype Whether properties defined on
+ * {@code Object.prototype} should be included in the result.
+ * @param {boolean=} opt_includeFunctionPrototype Whether properties defined on
+ * {@code Function.prototype} should be included in the result.
+ * @return {!Array<string>}
+ * @public
+ */
+goog.object.getAllPropertyNames = function(
+ obj, opt_includeObjectPrototype, opt_includeFunctionPrototype) {
+ if (!obj) {
+ return [];
+ }
+
+ // Naively use a for..in loop to get the property names if the browser doesn't
+ // support any other APIs for getting it.
+ if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {
+ return goog.object.getKeys(obj);
+ }
+
+ var visitedSet = {};
+
+ // Traverse the prototype chain and add all properties to the visited set.
+ var proto = obj;
+ while (proto &&
+ (proto !== Object.prototype || !!opt_includeObjectPrototype) &&
+ (proto !== Function.prototype || !!opt_includeFunctionPrototype)) {
+ var names = Object.getOwnPropertyNames(proto);
+ for (var i = 0; i < names.length; i++) {
+ visitedSet[names[i]] = true;
+ }
+ proto = Object.getPrototypeOf(proto);
+ }
+
+ return goog.object.getKeys(visitedSet);
+};
diff --git a/src/http/static/viz/2/goog/reflect/reflect.js b/src/http/static/viz/2/goog/reflect/reflect.js
new file mode 100644
index 0000000..a737324
--- /dev/null
+++ b/src/http/static/viz/2/goog/reflect/reflect.js
@@ -0,0 +1,138 @@
+// Copyright 2009 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Useful compiler idioms.
+ *
+ * @author johnlenz@google.com (John Lenz)
+ */
+
+goog.provide('goog.reflect');
+
+
+/**
+ * Syntax for object literal casts.
+ * @see http://go/jscompiler-renaming
+ * @see https://goo.gl/CRs09P
+ *
+ * Use this if you have an object literal whose keys need to have the same names
+ * as the properties of some class even after they are renamed by the compiler.
+ *
+ * @param {!Function} type Type to cast to.
+ * @param {Object} object Object literal to cast.
+ * @return {Object} The object literal.
+ */
+goog.reflect.object = function(type, object) {
+ return object;
+};
+
+/**
+ * Syntax for renaming property strings.
+ * @see http://go/jscompiler-renaming
+ * @see https://goo.gl/CRs09P
+ *
+ * Use this if you have an need to access a property as a string, but want
+ * to also have the property renamed by the compiler. In contrast to
+ * goog.reflect.object, this method takes an instance of an object.
+ *
+ * Properties must be simple names (not qualified names).
+ *
+ * @param {string} prop Name of the property
+ * @param {!Object} object Instance of the object whose type will be used
+ * for renaming
+ * @return {string} The renamed property.
+ */
+goog.reflect.objectProperty = function(prop, object) {
+ return prop;
+};
+
+/**
+ * To assert to the compiler that an operation is needed when it would
+ * otherwise be stripped. For example:
+ * <code>
+ * // Force a layout
+ * goog.reflect.sinkValue(dialog.offsetHeight);
+ * </code>
+ * @param {T} x
+ * @return {T}
+ * @template T
+ */
+goog.reflect.sinkValue = function(x) {
+ goog.reflect.sinkValue[' '](x);
+ return x;
+};
+
+
+/**
+ * The compiler should optimize this function away iff no one ever uses
+ * goog.reflect.sinkValue.
+ */
+goog.reflect.sinkValue[' '] = goog.nullFunction;
+
+
+/**
+ * Check if a property can be accessed without throwing an exception.
+ * @param {Object} obj The owner of the property.
+ * @param {string} prop The property name.
+ * @return {boolean} Whether the property is accessible. Will also return true
+ * if obj is null.
+ */
+goog.reflect.canAccessProperty = function(obj, prop) {
+
+ try {
+ goog.reflect.sinkValue(obj[prop]);
+ return true;
+ } catch (e) {
+ }
+ return false;
+};
+
+
+/**
+ * Retrieves a value from a cache given a key. The compiler provides special
+ * consideration for this call such that it is generally considered side-effect
+ * free. However, if the {@code opt_keyFn} or {@code valueFn} have side-effects
+ * then the entire call is considered to have side-effects.
+ *
+ * Conventionally storing the value on the cache would be considered a
+ * side-effect and preclude unused calls from being pruned, ie. even if
+ * the value was never used, it would still always be stored in the cache.
+ *
+ * Providing a side-effect free {@code valueFn} and {@code opt_keyFn}
+ * allows unused calls to {@code goog.reflect.cache} to be pruned.
+ *
+ * @param {!Object<K, V>} cacheObj The object that contains the cached values.
+ * @param {?} key The key to lookup in the cache. If it is not string or number
+ * then a {@code opt_keyFn} should be provided. The key is also used as the
+ * parameter to the {@code valueFn}.
+ * @param {function(?):V} valueFn The value provider to use to calculate the
+ * value to store in the cache. This function should be side-effect free
+ * to take advantage of the optimization.
+ * @param {function(?):K=} opt_keyFn The key provider to determine the cache
+ * map key. This should be used if the given key is not a string or number.
+ * If not provided then the given key is used. This function should be
+ * side-effect free to take advantage of the optimization.
+ * @return {V} The cached or calculated value.
+ * @template K
+ * @template V
+ */
+goog.reflect.cache = function(cacheObj, key, valueFn, opt_keyFn) {
+ var storedKey = opt_keyFn ? opt_keyFn(key) : key;
+
+ if (Object.prototype.hasOwnProperty.call(cacheObj, storedKey)) {
+ return cacheObj[storedKey];
+ }
+
+ return (cacheObj[storedKey] = valueFn(key));
+};
diff --git a/src/http/static/viz/2/goog/string/const.js b/src/http/static/viz/2/goog/string/const.js
new file mode 100644
index 0000000..30bfc4e
--- /dev/null
+++ b/src/http/static/viz/2/goog/string/const.js
@@ -0,0 +1,186 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+goog.provide('goog.string.Const');
+
+goog.require('goog.asserts');
+goog.require('goog.string.TypedString');
+
+
+
+/**
+ * Wrapper for compile-time-constant strings.
+ *
+ * Const is a wrapper for strings that can only be created from program
+ * constants (i.e., string literals). This property relies on a custom Closure
+ * compiler check that {@code goog.string.Const.from} is only invoked on
+ * compile-time-constant expressions.
+ *
+ * Const is useful in APIs whose correct and secure use requires that certain
+ * arguments are not attacker controlled: Compile-time constants are inherently
+ * under the control of the application and not under control of external
+ * attackers, and hence are safe to use in such contexts.
+ *
+ * Instances of this type must be created via its factory method
+ * {@code goog.string.Const.from} and not by invoking its constructor. The
+ * constructor intentionally takes no parameters and the type is immutable;
+ * hence only a default instance corresponding to the empty string can be
+ * obtained via constructor invocation.
+ *
+ * @see goog.string.Const#from
+ * @constructor
+ * @final
+ * @struct
+ * @implements {goog.string.TypedString}
+ */
+goog.string.Const = function() {
+ /**
+ * The wrapped value of this Const object. The field has a purposely ugly
+ * name to make (non-compiled) code that attempts to directly access this
+ * field stand out.
+ * @private {string}
+ */
+ this.stringConstValueWithSecurityContract__googStringSecurityPrivate_ = '';
+
+ /**
+ * A type marker used to implement additional run-time type checking.
+ * @see goog.string.Const#unwrap
+ * @const {!Object}
+ * @private
+ */
+ this.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_ =
+ goog.string.Const.TYPE_MARKER_;
+};
+
+
+/**
+ * @override
+ * @const
+ */
+goog.string.Const.prototype.implementsGoogStringTypedString = true;
+
+
+/**
+ * Returns this Const's value a string.
+ *
+ * IMPORTANT: In code where it is security-relevant that an object's type is
+ * indeed {@code goog.string.Const}, use {@code goog.string.Const.unwrap}
+ * instead of this method.
+ *
+ * @see goog.string.Const#unwrap
+ * @override
+ */
+goog.string.Const.prototype.getTypedStringValue = function() {
+ return this.stringConstValueWithSecurityContract__googStringSecurityPrivate_;
+};
+
+
+/**
+ * Returns a debug-string representation of this value.
+ *
+ * To obtain the actual string value wrapped inside an object of this type,
+ * use {@code goog.string.Const.unwrap}.
+ *
+ * @see goog.string.Const#unwrap
+ * @override
+ */
+goog.string.Const.prototype.toString = function() {
+ return 'Const{' +
+ this.stringConstValueWithSecurityContract__googStringSecurityPrivate_ +
+ '}';
+};
+
+
+/**
+ * Performs a runtime check that the provided object is indeed an instance
+ * of {@code goog.string.Const}, and returns its value.
+ * @param {!goog.string.Const} stringConst The object to extract from.
+ * @return {string} The Const object's contained string, unless the run-time
+ * type check fails. In that case, {@code unwrap} returns an innocuous
+ * string, or, if assertions are enabled, throws
+ * {@code goog.asserts.AssertionError}.
+ */
+goog.string.Const.unwrap = function(stringConst) {
+ // Perform additional run-time type-checking to ensure that stringConst is
+ // indeed an instance of the expected type. This provides some additional
+ // protection against security bugs due to application code that disables type
+ // checks.
+ if (stringConst instanceof goog.string.Const &&
+ stringConst.constructor === goog.string.Const &&
+ stringConst.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_ ===
+ goog.string.Const.TYPE_MARKER_) {
+ return stringConst
+ .stringConstValueWithSecurityContract__googStringSecurityPrivate_;
+ } else {
+ goog.asserts.fail(
+ 'expected object of type Const, got \'' + stringConst + '\'');
+ return 'type_error:Const';
+ }
+};
+
+
+/**
+ * Creates a Const object from a compile-time constant string.
+ *
+ * It is illegal to invoke this function on an expression whose
+ * compile-time-contant value cannot be determined by the Closure compiler.
+ *
+ * Correct invocations include,
+ * <pre>
+ * var s = goog.string.Const.from('hello');
+ * var t = goog.string.Const.from('hello' + 'world');
+ * </pre>
+ *
+ * In contrast, the following are illegal:
+ * <pre>
+ * var s = goog.string.Const.from(getHello());
+ * var t = goog.string.Const.from('hello' + world);
+ * </pre>
+ *
+ * @param {string} s A constant string from which to create a Const.
+ * @return {!goog.string.Const} A Const object initialized to stringConst.
+ */
+goog.string.Const.from = function(s) {
+ return goog.string.Const.create__googStringSecurityPrivate_(s);
+};
+
+
+/**
+ * Type marker for the Const type, used to implement additional run-time
+ * type checking.
+ * @const {!Object}
+ * @private
+ */
+goog.string.Const.TYPE_MARKER_ = {};
+
+
+/**
+ * Utility method to create Const instances.
+ * @param {string} s The string to initialize the Const object with.
+ * @return {!goog.string.Const} The initialized Const object.
+ * @private
+ */
+goog.string.Const.create__googStringSecurityPrivate_ = function(s) {
+ var stringConst = new goog.string.Const();
+ stringConst.stringConstValueWithSecurityContract__googStringSecurityPrivate_ =
+ s;
+ return stringConst;
+};
+
+
+/**
+ * A Const instance wrapping the empty string.
+ * @const {!goog.string.Const}
+ */
+goog.string.Const.EMPTY = goog.string.Const.from('');
diff --git a/src/http/static/viz/2/goog/string/string.js b/src/http/static/viz/2/goog/string/string.js
new file mode 100644
index 0000000..7a10ae0
--- /dev/null
+++ b/src/http/static/viz/2/goog/string/string.js
@@ -0,0 +1,1641 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utilities for string manipulation.
+ * @author arv@google.com (Erik Arvidsson)
+ */
+
+
+/**
+ * Namespace for string utilities
+ */
+goog.provide('goog.string');
+goog.provide('goog.string.Unicode');
+
+
+/**
+ * @define {boolean} Enables HTML escaping of lowercase letter "e" which helps
+ * with detection of double-escaping as this letter is frequently used.
+ */
+goog.define('goog.string.DETECT_DOUBLE_ESCAPING', false);
+
+
+/**
+ * @define {boolean} Whether to force non-dom html unescaping.
+ */
+goog.define('goog.string.FORCE_NON_DOM_HTML_UNESCAPING', false);
+
+
+/**
+ * Common Unicode string characters.
+ * @enum {string}
+ */
+goog.string.Unicode = {
+ NBSP: '\xa0'
+};
+
+
+/**
+ * Fast prefix-checker.
+ * @param {string} str The string to check.
+ * @param {string} prefix A string to look for at the start of {@code str}.
+ * @return {boolean} True if {@code str} begins with {@code prefix}.
+ */
+goog.string.startsWith = function(str, prefix) {
+ return str.lastIndexOf(prefix, 0) == 0;
+};
+
+
+/**
+ * Fast suffix-checker.
+ * @param {string} str The string to check.
+ * @param {string} suffix A string to look for at the end of {@code str}.
+ * @return {boolean} True if {@code str} ends with {@code suffix}.
+ */
+goog.string.endsWith = function(str, suffix) {
+ var l = str.length - suffix.length;
+ return l >= 0 && str.indexOf(suffix, l) == l;
+};
+
+
+/**
+ * Case-insensitive prefix-checker.
+ * @param {string} str The string to check.
+ * @param {string} prefix A string to look for at the end of {@code str}.
+ * @return {boolean} True if {@code str} begins with {@code prefix} (ignoring
+ * case).
+ */
+goog.string.caseInsensitiveStartsWith = function(str, prefix) {
+ return goog.string.caseInsensitiveCompare(
+ prefix, str.substr(0, prefix.length)) == 0;
+};
+
+
+/**
+ * Case-insensitive suffix-checker.
+ * @param {string} str The string to check.
+ * @param {string} suffix A string to look for at the end of {@code str}.
+ * @return {boolean} True if {@code str} ends with {@code suffix} (ignoring
+ * case).
+ */
+goog.string.caseInsensitiveEndsWith = function(str, suffix) {
+ return (
+ goog.string.caseInsensitiveCompare(
+ suffix, str.substr(str.length - suffix.length, suffix.length)) == 0);
+};
+
+
+/**
+ * Case-insensitive equality checker.
+ * @param {string} str1 First string to check.
+ * @param {string} str2 Second string to check.
+ * @return {boolean} True if {@code str1} and {@code str2} are the same string,
+ * ignoring case.
+ */
+goog.string.caseInsensitiveEquals = function(str1, str2) {
+ return str1.toLowerCase() == str2.toLowerCase();
+};
+
+
+/**
+ * Does simple python-style string substitution.
+ * subs("foo%s hot%s", "bar", "dog") becomes "foobar hotdog".
+ * @param {string} str The string containing the pattern.
+ * @param {...*} var_args The items to substitute into the pattern.
+ * @return {string} A copy of {@code str} in which each occurrence of
+ * {@code %s} has been replaced an argument from {@code var_args}.
+ */
+goog.string.subs = function(str, var_args) {
+ var splitParts = str.split('%s');
+ var returnString = '';
+
+ var subsArguments = Array.prototype.slice.call(arguments, 1);
+ while (subsArguments.length &&
+ // Replace up to the last split part. We are inserting in the
+ // positions between split parts.
+ splitParts.length > 1) {
+ returnString += splitParts.shift() + subsArguments.shift();
+ }
+
+ return returnString + splitParts.join('%s'); // Join unused '%s'
+};
+
+
+/**
+ * Converts multiple whitespace chars (spaces, non-breaking-spaces, new lines
+ * and tabs) to a single space, and strips leading and trailing whitespace.
+ * @param {string} str Input string.
+ * @return {string} A copy of {@code str} with collapsed whitespace.
+ */
+goog.string.collapseWhitespace = function(str) {
+ // Since IE doesn't include non-breaking-space (0xa0) in their \s character
+ // class (as required by section 7.2 of the ECMAScript spec), we explicitly
+ // include it in the regexp to enforce consistent cross-browser behavior.
+ return str.replace(/[\s\xa0]+/g, ' ').replace(/^\s+|\s+$/g, '');
+};
+
+
+/**
+ * Checks if a string is empty or contains only whitespaces.
+ * @param {string} str The string to check.
+ * @return {boolean} Whether {@code str} is empty or whitespace only.
+ */
+goog.string.isEmptyOrWhitespace = function(str) {
+ // testing length == 0 first is actually slower in all browsers (about the
+ // same in Opera).
+ // Since IE doesn't include non-breaking-space (0xa0) in their \s character
+ // class (as required by section 7.2 of the ECMAScript spec), we explicitly
+ // include it in the regexp to enforce consistent cross-browser behavior.
+ return /^[\s\xa0]*$/.test(str);
+};
+
+
+/**
+ * Checks if a string is empty.
+ * @param {string} str The string to check.
+ * @return {boolean} Whether {@code str} is empty.
+ */
+goog.string.isEmptyString = function(str) {
+ return str.length == 0;
+};
+
+
+/**
+ * Checks if a string is empty or contains only whitespaces.
+ *
+ * @param {string} str The string to check.
+ * @return {boolean} Whether {@code str} is empty or whitespace only.
+ * @deprecated Use goog.string.isEmptyOrWhitespace instead.
+ */
+goog.string.isEmpty = goog.string.isEmptyOrWhitespace;
+
+
+/**
+ * Checks if a string is null, undefined, empty or contains only whitespaces.
+ * @param {*} str The string to check.
+ * @return {boolean} Whether {@code str} is null, undefined, empty, or
+ * whitespace only.
+ * @deprecated Use goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str))
+ * instead.
+ */
+goog.string.isEmptyOrWhitespaceSafe = function(str) {
+ return goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str));
+};
+
+
+/**
+ * Checks if a string is null, undefined, empty or contains only whitespaces.
+ *
+ * @param {*} str The string to check.
+ * @return {boolean} Whether {@code str} is null, undefined, empty, or
+ * whitespace only.
+ * @deprecated Use goog.string.isEmptyOrWhitespace instead.
+ */
+goog.string.isEmptySafe = goog.string.isEmptyOrWhitespaceSafe;
+
+
+/**
+ * Checks if a string is all breaking whitespace.
+ * @param {string} str The string to check.
+ * @return {boolean} Whether the string is all breaking whitespace.
+ */
+goog.string.isBreakingWhitespace = function(str) {
+ return !/[^\t\n\r ]/.test(str);
+};
+
+
+/**
+ * Checks if a string contains all letters.
+ * @param {string} str string to check.
+ * @return {boolean} True if {@code str} consists entirely of letters.
+ */
+goog.string.isAlpha = function(str) {
+ return !/[^a-zA-Z]/.test(str);
+};
+
+
+/**
+ * Checks if a string contains only numbers.
+ * @param {*} str string to check. If not a string, it will be
+ * casted to one.
+ * @return {boolean} True if {@code str} is numeric.
+ */
+goog.string.isNumeric = function(str) {
+ return !/[^0-9]/.test(str);
+};
+
+
+/**
+ * Checks if a string contains only numbers or letters.
+ * @param {string} str string to check.
+ * @return {boolean} True if {@code str} is alphanumeric.
+ */
+goog.string.isAlphaNumeric = function(str) {
+ return !/[^a-zA-Z0-9]/.test(str);
+};
+
+
+/**
+ * Checks if a character is a space character.
+ * @param {string} ch Character to check.
+ * @return {boolean} True if {@code ch} is a space.
+ */
+goog.string.isSpace = function(ch) {
+ return ch == ' ';
+};
+
+
+/**
+ * Checks if a character is a valid unicode character.
+ * @param {string} ch Character to check.
+ * @return {boolean} True if {@code ch} is a valid unicode character.
+ */
+goog.string.isUnicodeChar = function(ch) {
+ return ch.length == 1 && ch >= ' ' && ch <= '~' ||
+ ch >= '\u0080' && ch <= '\uFFFD';
+};
+
+
+/**
+ * Takes a string and replaces newlines with a space. Multiple lines are
+ * replaced with a single space.
+ * @param {string} str The string from which to strip newlines.
+ * @return {string} A copy of {@code str} stripped of newlines.
+ */
+goog.string.stripNewlines = function(str) {
+ return str.replace(/(\r\n|\r|\n)+/g, ' ');
+};
+
+
+/**
+ * Replaces Windows and Mac new lines with unix style: \r or \r\n with \n.
+ * @param {string} str The string to in which to canonicalize newlines.
+ * @return {string} {@code str} A copy of {@code} with canonicalized newlines.
+ */
+goog.string.canonicalizeNewlines = function(str) {
+ return str.replace(/(\r\n|\r|\n)/g, '\n');
+};
+
+
+/**
+ * Normalizes whitespace in a string, replacing all whitespace chars with
+ * a space.
+ * @param {string} str The string in which to normalize whitespace.
+ * @return {string} A copy of {@code str} with all whitespace normalized.
+ */
+goog.string.normalizeWhitespace = function(str) {
+ return str.replace(/\xa0|\s/g, ' ');
+};
+
+
+/**
+ * Normalizes spaces in a string, replacing all consecutive spaces and tabs
+ * with a single space. Replaces non-breaking space with a space.
+ * @param {string} str The string in which to normalize spaces.
+ * @return {string} A copy of {@code str} with all consecutive spaces and tabs
+ * replaced with a single space.
+ */
+goog.string.normalizeSpaces = function(str) {
+ return str.replace(/\xa0|[ \t]+/g, ' ');
+};
+
+
+/**
+ * Removes the breaking spaces from the left and right of the string and
+ * collapses the sequences of breaking spaces in the middle into single spaces.
+ * The original and the result strings render the same way in HTML.
+ * @param {string} str A string in which to collapse spaces.
+ * @return {string} Copy of the string with normalized breaking spaces.
+ */
+goog.string.collapseBreakingSpaces = function(str) {
+ return str.replace(/[\t\r\n ]+/g, ' ')
+ .replace(/^[\t\r\n ]+|[\t\r\n ]+$/g, '');
+};
+
+
+/**
+ * Trims white spaces to the left and right of a string.
+ * @param {string} str The string to trim.
+ * @return {string} A trimmed copy of {@code str}.
+ */
+goog.string.trim =
+ (goog.TRUSTED_SITE && String.prototype.trim) ? function(str) {
+ return str.trim();
+ } : function(str) {
+ // Since IE doesn't include non-breaking-space (0xa0) in their \s
+ // character class (as required by section 7.2 of the ECMAScript spec),
+ // we explicitly include it in the regexp to enforce consistent
+ // cross-browser behavior.
+ return str.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
+ };
+
+
+/**
+ * Trims whitespaces at the left end of a string.
+ * @param {string} str The string to left trim.
+ * @return {string} A trimmed copy of {@code str}.
+ */
+goog.string.trimLeft = function(str) {
+ // Since IE doesn't include non-breaking-space (0xa0) in their \s character
+ // class (as required by section 7.2 of the ECMAScript spec), we explicitly
+ // include it in the regexp to enforce consistent cross-browser behavior.
+ return str.replace(/^[\s\xa0]+/, '');
+};
+
+
+/**
+ * Trims whitespaces at the right end of a string.
+ * @param {string} str The string to right trim.
+ * @return {string} A trimmed copy of {@code str}.
+ */
+goog.string.trimRight = function(str) {
+ // Since IE doesn't include non-breaking-space (0xa0) in their \s character
+ // class (as required by section 7.2 of the ECMAScript spec), we explicitly
+ // include it in the regexp to enforce consistent cross-browser behavior.
+ return str.replace(/[\s\xa0]+$/, '');
+};
+
+
+/**
+ * A string comparator that ignores case.
+ * -1 = str1 less than str2
+ * 0 = str1 equals str2
+ * 1 = str1 greater than str2
+ *
+ * @param {string} str1 The string to compare.
+ * @param {string} str2 The string to compare {@code str1} to.
+ * @return {number} The comparator result, as described above.
+ */
+goog.string.caseInsensitiveCompare = function(str1, str2) {
+ var test1 = String(str1).toLowerCase();
+ var test2 = String(str2).toLowerCase();
+
+ if (test1 < test2) {
+ return -1;
+ } else if (test1 == test2) {
+ return 0;
+ } else {
+ return 1;
+ }
+};
+
+
+/**
+ * Compares two strings interpreting their numeric substrings as numbers.
+ *
+ * @param {string} str1 First string.
+ * @param {string} str2 Second string.
+ * @param {!RegExp} tokenizerRegExp Splits a string into substrings of
+ * non-negative integers, non-numeric characters and optionally fractional
+ * numbers starting with a decimal point.
+ * @return {number} Negative if str1 < str2, 0 is str1 == str2, positive if
+ * str1 > str2.
+ * @private
+ */
+goog.string.numberAwareCompare_ = function(str1, str2, tokenizerRegExp) {
+ if (str1 == str2) {
+ return 0;
+ }
+ if (!str1) {
+ return -1;
+ }
+ if (!str2) {
+ return 1;
+ }
+
+ // Using match to split the entire string ahead of time turns out to be faster
+ // for most inputs than using RegExp.exec or iterating over each character.
+ var tokens1 = str1.toLowerCase().match(tokenizerRegExp);
+ var tokens2 = str2.toLowerCase().match(tokenizerRegExp);
+
+ var count = Math.min(tokens1.length, tokens2.length);
+
+ for (var i = 0; i < count; i++) {
+ var a = tokens1[i];
+ var b = tokens2[i];
+
+ // Compare pairs of tokens, returning if one token sorts before the other.
+ if (a != b) {
+ // Only if both tokens are integers is a special comparison required.
+ // Decimal numbers are sorted as strings (e.g., '.09' < '.1').
+ var num1 = parseInt(a, 10);
+ if (!isNaN(num1)) {
+ var num2 = parseInt(b, 10);
+ if (!isNaN(num2) && num1 - num2) {
+ return num1 - num2;
+ }
+ }
+ return a < b ? -1 : 1;
+ }
+ }
+
+ // If one string is a substring of the other, the shorter string sorts first.
+ if (tokens1.length != tokens2.length) {
+ return tokens1.length - tokens2.length;
+ }
+
+ // The two strings must be equivalent except for case (perfect equality is
+ // tested at the head of the function.) Revert to default ASCII string
+ // comparison to stabilize the sort.
+ return str1 < str2 ? -1 : 1;
+};
+
+
+/**
+ * String comparison function that handles non-negative integer numbers in a
+ * way humans might expect. Using this function, the string 'File 2.jpg' sorts
+ * before 'File 10.jpg', and 'Version 1.9' before 'Version 1.10'. The comparison
+ * is mostly case-insensitive, though strings that are identical except for case
+ * are sorted with the upper-case strings before lower-case.
+ *
+ * This comparison function is up to 50x slower than either the default or the
+ * case-insensitive compare. It should not be used in time-critical code, but
+ * should be fast enough to sort several hundred short strings (like filenames)
+ * with a reasonable delay.
+ *
+ * @param {string} str1 The string to compare in a numerically sensitive way.
+ * @param {string} str2 The string to compare {@code str1} to.
+ * @return {number} less than 0 if str1 < str2, 0 if str1 == str2, greater than
+ * 0 if str1 > str2.
+ */
+goog.string.intAwareCompare = function(str1, str2) {
+ return goog.string.numberAwareCompare_(str1, str2, /\d+|\D+/g);
+};
+
+
+/**
+ * String comparison function that handles non-negative integer and fractional
+ * numbers in a way humans might expect. Using this function, the string
+ * 'File 2.jpg' sorts before 'File 10.jpg', and '3.14' before '3.2'. Equivalent
+ * to {@link goog.string.intAwareCompare} apart from the way how it interprets
+ * dots.
+ *
+ * @param {string} str1 The string to compare in a numerically sensitive way.
+ * @param {string} str2 The string to compare {@code str1} to.
+ * @return {number} less than 0 if str1 < str2, 0 if str1 == str2, greater than
+ * 0 if str1 > str2.
+ */
+goog.string.floatAwareCompare = function(str1, str2) {
+ return goog.string.numberAwareCompare_(str1, str2, /\d+|\.\d+|\D+/g);
+};
+
+
+/**
+ * Alias for {@link goog.string.floatAwareCompare}.
+ *
+ * @param {string} str1
+ * @param {string} str2
+ * @return {number}
+ */
+goog.string.numerateCompare = goog.string.floatAwareCompare;
+
+
+/**
+ * URL-encodes a string
+ * @param {*} str The string to url-encode.
+ * @return {string} An encoded copy of {@code str} that is safe for urls.
+ * Note that '#', ':', and other characters used to delimit portions
+ * of URLs *will* be encoded.
+ */
+goog.string.urlEncode = function(str) {
+ return encodeURIComponent(String(str));
+};
+
+
+/**
+ * URL-decodes the string. We need to specially handle '+'s because
+ * the javascript library doesn't convert them to spaces.
+ * @param {string} str The string to url decode.
+ * @return {string} The decoded {@code str}.
+ */
+goog.string.urlDecode = function(str) {
+ return decodeURIComponent(str.replace(/\+/g, ' '));
+};
+
+
+/**
+ * Converts \n to <br>s or <br />s.
+ * @param {string} str The string in which to convert newlines.
+ * @param {boolean=} opt_xml Whether to use XML compatible tags.
+ * @return {string} A copy of {@code str} with converted newlines.
+ */
+goog.string.newLineToBr = function(str, opt_xml) {
+ return str.replace(/(\r\n|\r|\n)/g, opt_xml ? '<br />' : '<br>');
+};
+
+
+/**
+ * Escapes double quote '"' and single quote '\'' characters in addition to
+ * '&', '<', and '>' so that a string can be included in an HTML tag attribute
+ * value within double or single quotes.
+ *
+ * It should be noted that > doesn't need to be escaped for the HTML or XML to
+ * be valid, but it has been decided to escape it for consistency with other
+ * implementations.
+ *
+ * With goog.string.DETECT_DOUBLE_ESCAPING, this function escapes also the
+ * lowercase letter "e".
+ *
+ * NOTE(user):
+ * HtmlEscape is often called during the generation of large blocks of HTML.
+ * Using statics for the regular expressions and strings is an optimization
+ * that can more than half the amount of time IE spends in this function for
+ * large apps, since strings and regexes both contribute to GC allocations.
+ *
+ * Testing for the presence of a character before escaping increases the number
+ * of function calls, but actually provides a speed increase for the average
+ * case -- since the average case often doesn't require the escaping of all 4
+ * characters and indexOf() is much cheaper than replace().
+ * The worst case does suffer slightly from the additional calls, therefore the
+ * opt_isLikelyToContainHtmlChars option has been included for situations
+ * where all 4 HTML entities are very likely to be present and need escaping.
+ *
+ * Some benchmarks (times tended to fluctuate +-0.05ms):
+ * FireFox IE6
+ * (no chars / average (mix of cases) / all 4 chars)
+ * no checks 0.13 / 0.22 / 0.22 0.23 / 0.53 / 0.80
+ * indexOf 0.08 / 0.17 / 0.26 0.22 / 0.54 / 0.84
+ * indexOf + re test 0.07 / 0.17 / 0.28 0.19 / 0.50 / 0.85
+ *
+ * An additional advantage of checking if replace actually needs to be called
+ * is a reduction in the number of object allocations, so as the size of the
+ * application grows the difference between the various methods would increase.
+ *
+ * @param {string} str string to be escaped.
+ * @param {boolean=} opt_isLikelyToContainHtmlChars Don't perform a check to see
+ * if the character needs replacing - use this option if you expect each of
+ * the characters to appear often. Leave false if you expect few html
+ * characters to occur in your strings, such as if you are escaping HTML.
+ * @return {string} An escaped copy of {@code str}.
+ */
+goog.string.htmlEscape = function(str, opt_isLikelyToContainHtmlChars) {
+
+ if (opt_isLikelyToContainHtmlChars) {
+ str = str.replace(goog.string.AMP_RE_, '&amp;')
+ .replace(goog.string.LT_RE_, '&lt;')
+ .replace(goog.string.GT_RE_, '&gt;')
+ .replace(goog.string.QUOT_RE_, '&quot;')
+ .replace(goog.string.SINGLE_QUOTE_RE_, '&#39;')
+ .replace(goog.string.NULL_RE_, '&#0;');
+ if (goog.string.DETECT_DOUBLE_ESCAPING) {
+ str = str.replace(goog.string.E_RE_, '&#101;');
+ }
+ return str;
+
+ } else {
+ // quick test helps in the case when there are no chars to replace, in
+ // worst case this makes barely a difference to the time taken
+ if (!goog.string.ALL_RE_.test(str)) return str;
+
+ // str.indexOf is faster than regex.test in this case
+ if (str.indexOf('&') != -1) {
+ str = str.replace(goog.string.AMP_RE_, '&amp;');
+ }
+ if (str.indexOf('<') != -1) {
+ str = str.replace(goog.string.LT_RE_, '&lt;');
+ }
+ if (str.indexOf('>') != -1) {
+ str = str.replace(goog.string.GT_RE_, '&gt;');
+ }
+ if (str.indexOf('"') != -1) {
+ str = str.replace(goog.string.QUOT_RE_, '&quot;');
+ }
+ if (str.indexOf('\'') != -1) {
+ str = str.replace(goog.string.SINGLE_QUOTE_RE_, '&#39;');
+ }
+ if (str.indexOf('\x00') != -1) {
+ str = str.replace(goog.string.NULL_RE_, '&#0;');
+ }
+ if (goog.string.DETECT_DOUBLE_ESCAPING && str.indexOf('e') != -1) {
+ str = str.replace(goog.string.E_RE_, '&#101;');
+ }
+ return str;
+ }
+};
+
+
+/**
+ * Regular expression that matches an ampersand, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.AMP_RE_ = /&/g;
+
+
+/**
+ * Regular expression that matches a less than sign, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.LT_RE_ = /</g;
+
+
+/**
+ * Regular expression that matches a greater than sign, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.GT_RE_ = />/g;
+
+
+/**
+ * Regular expression that matches a double quote, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.QUOT_RE_ = /"/g;
+
+
+/**
+ * Regular expression that matches a single quote, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.SINGLE_QUOTE_RE_ = /'/g;
+
+
+/**
+ * Regular expression that matches null character, for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.NULL_RE_ = /\x00/g;
+
+
+/**
+ * Regular expression that matches a lowercase letter "e", for use in escaping.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.E_RE_ = /e/g;
+
+
+/**
+ * Regular expression that matches any character that needs to be escaped.
+ * @const {!RegExp}
+ * @private
+ */
+goog.string.ALL_RE_ =
+ (goog.string.DETECT_DOUBLE_ESCAPING ? /[\x00&<>"'e]/ : /[\x00&<>"']/);
+
+
+/**
+ * Unescapes an HTML string.
+ *
+ * @param {string} str The string to unescape.
+ * @return {string} An unescaped copy of {@code str}.
+ */
+goog.string.unescapeEntities = function(str) {
+ if (goog.string.contains(str, '&')) {
+ // We are careful not to use a DOM if we do not have one or we explicitly
+ // requested non-DOM html unescaping.
+ if (!goog.string.FORCE_NON_DOM_HTML_UNESCAPING &&
+ 'document' in goog.global) {
+ return goog.string.unescapeEntitiesUsingDom_(str);
+ } else {
+ // Fall back on pure XML entities
+ return goog.string.unescapePureXmlEntities_(str);
+ }
+ }
+ return str;
+};
+
+
+/**
+ * Unescapes a HTML string using the provided document.
+ *
+ * @param {string} str The string to unescape.
+ * @param {!Document} document A document to use in escaping the string.
+ * @return {string} An unescaped copy of {@code str}.
+ */
+goog.string.unescapeEntitiesWithDocument = function(str, document) {
+ if (goog.string.contains(str, '&')) {
+ return goog.string.unescapeEntitiesUsingDom_(str, document);
+ }
+ return str;
+};
+
+
+/**
+ * Unescapes an HTML string using a DOM to resolve non-XML, non-numeric
+ * entities. This function is XSS-safe and whitespace-preserving.
+ * @private
+ * @param {string} str The string to unescape.
+ * @param {Document=} opt_document An optional document to use for creating
+ * elements. If this is not specified then the default window.document
+ * will be used.
+ * @return {string} The unescaped {@code str} string.
+ */
+goog.string.unescapeEntitiesUsingDom_ = function(str, opt_document) {
+ /** @type {!Object<string, string>} */
+ var seen = {'&amp;': '&', '&lt;': '<', '&gt;': '>', '&quot;': '"'};
+ var div;
+ if (opt_document) {
+ div = opt_document.createElement('div');
+ } else {
+ div = goog.global.document.createElement('div');
+ }
+ // Match as many valid entity characters as possible. If the actual entity
+ // happens to be shorter, it will still work as innerHTML will return the
+ // trailing characters unchanged. Since the entity characters do not include
+ // open angle bracket, there is no chance of XSS from the innerHTML use.
+ // Since no whitespace is passed to innerHTML, whitespace is preserved.
+ return str.replace(goog.string.HTML_ENTITY_PATTERN_, function(s, entity) {
+ // Check for cached entity.
+ var value = seen[s];
+ if (value) {
+ return value;
+ }
+ // Check for numeric entity.
+ if (entity.charAt(0) == '#') {
+ // Prefix with 0 so that hex entities (e.g. &#x10) parse as hex numbers.
+ var n = Number('0' + entity.substr(1));
+ if (!isNaN(n)) {
+ value = String.fromCharCode(n);
+ }
+ }
+ // Fall back to innerHTML otherwise.
+ if (!value) {
+ // Append a non-entity character to avoid a bug in Webkit that parses
+ // an invalid entity at the end of innerHTML text as the empty string.
+ div.innerHTML = s + ' ';
+ // Then remove the trailing character from the result.
+ value = div.firstChild.nodeValue.slice(0, -1);
+ }
+ // Cache and return.
+ return seen[s] = value;
+ });
+};
+
+
+/**
+ * Unescapes XML entities.
+ * @private
+ * @param {string} str The string to unescape.
+ * @return {string} An unescaped copy of {@code str}.
+ */
+goog.string.unescapePureXmlEntities_ = function(str) {
+ return str.replace(/&([^;]+);/g, function(s, entity) {
+ switch (entity) {
+ case 'amp':
+ return '&';
+ case 'lt':
+ return '<';
+ case 'gt':
+ return '>';
+ case 'quot':
+ return '"';
+ default:
+ if (entity.charAt(0) == '#') {
+ // Prefix with 0 so that hex entities (e.g. &#x10) parse as hex.
+ var n = Number('0' + entity.substr(1));
+ if (!isNaN(n)) {
+ return String.fromCharCode(n);
+ }
+ }
+ // For invalid entities we just return the entity
+ return s;
+ }
+ });
+};
+
+
+/**
+ * Regular expression that matches an HTML entity.
+ * See also HTML5: Tokenization / Tokenizing character references.
+ * @private
+ * @type {!RegExp}
+ */
+goog.string.HTML_ENTITY_PATTERN_ = /&([^;\s<&]+);?/g;
+
+
+/**
+ * Do escaping of whitespace to preserve spatial formatting. We use character
+ * entity #160 to make it safer for xml.
+ * @param {string} str The string in which to escape whitespace.
+ * @param {boolean=} opt_xml Whether to use XML compatible tags.
+ * @return {string} An escaped copy of {@code str}.
+ */
+goog.string.whitespaceEscape = function(str, opt_xml) {
+ // This doesn't use goog.string.preserveSpaces for backwards compatibility.
+ return goog.string.newLineToBr(str.replace(/ /g, ' &#160;'), opt_xml);
+};
+
+
+/**
+ * Preserve spaces that would be otherwise collapsed in HTML by replacing them
+ * with non-breaking space Unicode characters.
+ * @param {string} str The string in which to preserve whitespace.
+ * @return {string} A copy of {@code str} with preserved whitespace.
+ */
+goog.string.preserveSpaces = function(str) {
+ return str.replace(/(^|[\n ]) /g, '$1' + goog.string.Unicode.NBSP);
+};
+
+
+/**
+ * Strip quote characters around a string. The second argument is a string of
+ * characters to treat as quotes. This can be a single character or a string of
+ * multiple character and in that case each of those are treated as possible
+ * quote characters. For example:
+ *
+ * <pre>
+ * goog.string.stripQuotes('"abc"', '"`') --> 'abc'
+ * goog.string.stripQuotes('`abc`', '"`') --> 'abc'
+ * </pre>
+ *
+ * @param {string} str The string to strip.
+ * @param {string} quoteChars The quote characters to strip.
+ * @return {string} A copy of {@code str} without the quotes.
+ */
+goog.string.stripQuotes = function(str, quoteChars) {
+ var length = quoteChars.length;
+ for (var i = 0; i < length; i++) {
+ var quoteChar = length == 1 ? quoteChars : quoteChars.charAt(i);
+ if (str.charAt(0) == quoteChar && str.charAt(str.length - 1) == quoteChar) {
+ return str.substring(1, str.length - 1);
+ }
+ }
+ return str;
+};
+
+
+/**
+ * Truncates a string to a certain length and adds '...' if necessary. The
+ * length also accounts for the ellipsis, so a maximum length of 10 and a string
+ * 'Hello World!' produces 'Hello W...'.
+ * @param {string} str The string to truncate.
+ * @param {number} chars Max number of characters.
+ * @param {boolean=} opt_protectEscapedCharacters Whether to protect escaped
+ * characters from being cut off in the middle.
+ * @return {string} The truncated {@code str} string.
+ */
+goog.string.truncate = function(str, chars, opt_protectEscapedCharacters) {
+ if (opt_protectEscapedCharacters) {
+ str = goog.string.unescapeEntities(str);
+ }
+
+ if (str.length > chars) {
+ str = str.substring(0, chars - 3) + '...';
+ }
+
+ if (opt_protectEscapedCharacters) {
+ str = goog.string.htmlEscape(str);
+ }
+
+ return str;
+};
+
+
+/**
+ * Truncate a string in the middle, adding "..." if necessary,
+ * and favoring the beginning of the string.
+ * @param {string} str The string to truncate the middle of.
+ * @param {number} chars Max number of characters.
+ * @param {boolean=} opt_protectEscapedCharacters Whether to protect escaped
+ * characters from being cutoff in the middle.
+ * @param {number=} opt_trailingChars Optional number of trailing characters to
+ * leave at the end of the string, instead of truncating as close to the
+ * middle as possible.
+ * @return {string} A truncated copy of {@code str}.
+ */
+goog.string.truncateMiddle = function(
+ str, chars, opt_protectEscapedCharacters, opt_trailingChars) {
+ if (opt_protectEscapedCharacters) {
+ str = goog.string.unescapeEntities(str);
+ }
+
+ if (opt_trailingChars && str.length > chars) {
+ if (opt_trailingChars > chars) {
+ opt_trailingChars = chars;
+ }
+ var endPoint = str.length - opt_trailingChars;
+ var startPoint = chars - opt_trailingChars;
+ str = str.substring(0, startPoint) + '...' + str.substring(endPoint);
+ } else if (str.length > chars) {
+ // Favor the beginning of the string:
+ var half = Math.floor(chars / 2);
+ var endPos = str.length - half;
+ half += chars % 2;
+ str = str.substring(0, half) + '...' + str.substring(endPos);
+ }
+
+ if (opt_protectEscapedCharacters) {
+ str = goog.string.htmlEscape(str);
+ }
+
+ return str;
+};
+
+
+/**
+ * Special chars that need to be escaped for goog.string.quote.
+ * @private {!Object<string, string>}
+ */
+goog.string.specialEscapeChars_ = {
+ '\0': '\\0',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\x0B': '\\x0B', // '\v' is not supported in JScript
+ '"': '\\"',
+ '\\': '\\\\',
+ // To support the use case of embedding quoted strings inside of script
+ // tags, we have to make sure HTML comments and opening/closing script tags do
+ // not appear in the resulting string. The specific strings that must be
+ // escaped are documented at:
+ // http://www.w3.org/TR/html51/semantics.html#restrictions-for-contents-of-script-elements
+ '<': '\x3c'
+};
+
+
+/**
+ * Character mappings used internally for goog.string.escapeChar.
+ * @private {!Object<string, string>}
+ */
+goog.string.jsEscapeCache_ = {
+ '\'': '\\\''
+};
+
+
+/**
+ * Encloses a string in double quotes and escapes characters so that the
+ * string is a valid JS string. The resulting string is safe to embed in
+ * `<script>` tags as "<" is escaped.
+ * @param {string} s The string to quote.
+ * @return {string} A copy of {@code s} surrounded by double quotes.
+ */
+goog.string.quote = function(s) {
+ s = String(s);
+ var sb = ['"'];
+ for (var i = 0; i < s.length; i++) {
+ var ch = s.charAt(i);
+ var cc = ch.charCodeAt(0);
+ sb[i + 1] = goog.string.specialEscapeChars_[ch] ||
+ ((cc > 31 && cc < 127) ? ch : goog.string.escapeChar(ch));
+ }
+ sb.push('"');
+ return sb.join('');
+};
+
+
+/**
+ * Takes a string and returns the escaped string for that input string.
+ * @param {string} str The string to escape.
+ * @return {string} An escaped string representing {@code str}.
+ */
+goog.string.escapeString = function(str) {
+ var sb = [];
+ for (var i = 0; i < str.length; i++) {
+ sb[i] = goog.string.escapeChar(str.charAt(i));
+ }
+ return sb.join('');
+};
+
+
+/**
+ * Takes a character and returns the escaped string for that character. For
+ * example escapeChar(String.fromCharCode(15)) -> "\\x0E".
+ * @param {string} c The character to escape.
+ * @return {string} An escaped string representing {@code c}.
+ */
+goog.string.escapeChar = function(c) {
+ if (c in goog.string.jsEscapeCache_) {
+ return goog.string.jsEscapeCache_[c];
+ }
+
+ if (c in goog.string.specialEscapeChars_) {
+ return goog.string.jsEscapeCache_[c] = goog.string.specialEscapeChars_[c];
+ }
+
+ var rv = c;
+ var cc = c.charCodeAt(0);
+ if (cc > 31 && cc < 127) {
+ rv = c;
+ } else {
+ // tab is 9 but handled above
+ if (cc < 256) {
+ rv = '\\x';
+ if (cc < 16 || cc > 256) {
+ rv += '0';
+ }
+ } else {
+ rv = '\\u';
+ if (cc < 4096) { // \u1000
+ rv += '0';
+ }
+ }
+ rv += cc.toString(16).toUpperCase();
+ }
+
+ return goog.string.jsEscapeCache_[c] = rv;
+};
+
+
+/**
+ * Determines whether a string contains a substring.
+ * @param {string} str The string to search.
+ * @param {string} subString The substring to search for.
+ * @return {boolean} Whether {@code str} contains {@code subString}.
+ */
+goog.string.contains = function(str, subString) {
+ return str.indexOf(subString) != -1;
+};
+
+
+/**
+ * Determines whether a string contains a substring, ignoring case.
+ * @param {string} str The string to search.
+ * @param {string} subString The substring to search for.
+ * @return {boolean} Whether {@code str} contains {@code subString}.
+ */
+goog.string.caseInsensitiveContains = function(str, subString) {
+ return goog.string.contains(str.toLowerCase(), subString.toLowerCase());
+};
+
+
+/**
+ * Returns the non-overlapping occurrences of ss in s.
+ * If either s or ss evalutes to false, then returns zero.
+ * @param {string} s The string to look in.
+ * @param {string} ss The string to look for.
+ * @return {number} Number of occurrences of ss in s.
+ */
+goog.string.countOf = function(s, ss) {
+ return s && ss ? s.split(ss).length - 1 : 0;
+};
+
+
+/**
+ * Removes a substring of a specified length at a specific
+ * index in a string.
+ * @param {string} s The base string from which to remove.
+ * @param {number} index The index at which to remove the substring.
+ * @param {number} stringLength The length of the substring to remove.
+ * @return {string} A copy of {@code s} with the substring removed or the full
+ * string if nothing is removed or the input is invalid.
+ */
+goog.string.removeAt = function(s, index, stringLength) {
+ var resultStr = s;
+ // If the index is greater or equal to 0 then remove substring
+ if (index >= 0 && index < s.length && stringLength > 0) {
+ resultStr = s.substr(0, index) +
+ s.substr(index + stringLength, s.length - index - stringLength);
+ }
+ return resultStr;
+};
+
+
+/**
+ * Removes the first occurrence of a substring from a string.
+ * @param {string} str The base string from which to remove.
+ * @param {string} substr The string to remove.
+ * @return {string} A copy of {@code str} with {@code substr} removed or the
+ * full string if nothing is removed.
+ */
+goog.string.remove = function(str, substr) {
+ return str.replace(substr, '');
+};
+
+
+/**
+ * Removes all occurrences of a substring from a string.
+ * @param {string} s The base string from which to remove.
+ * @param {string} ss The string to remove.
+ * @return {string} A copy of {@code s} with {@code ss} removed or the full
+ * string if nothing is removed.
+ */
+goog.string.removeAll = function(s, ss) {
+ var re = new RegExp(goog.string.regExpEscape(ss), 'g');
+ return s.replace(re, '');
+};
+
+
+/**
+ * Replaces all occurrences of a substring of a string with a new substring.
+ * @param {string} s The base string from which to remove.
+ * @param {string} ss The string to replace.
+ * @param {string} replacement The replacement string.
+ * @return {string} A copy of {@code s} with {@code ss} replaced by
+ * {@code replacement} or the original string if nothing is replaced.
+ */
+goog.string.replaceAll = function(s, ss, replacement) {
+ var re = new RegExp(goog.string.regExpEscape(ss), 'g');
+ return s.replace(re, replacement.replace(/\$/g, '$$$$'));
+};
+
+
+/**
+ * Escapes characters in the string that are not safe to use in a RegExp.
+ * @param {*} s The string to escape. If not a string, it will be casted
+ * to one.
+ * @return {string} A RegExp safe, escaped copy of {@code s}.
+ */
+goog.string.regExpEscape = function(s) {
+ return String(s)
+ .replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1')
+ .replace(/\x08/g, '\\x08');
+};
+
+
+/**
+ * Repeats a string n times.
+ * @param {string} string The string to repeat.
+ * @param {number} length The number of times to repeat.
+ * @return {string} A string containing {@code length} repetitions of
+ * {@code string}.
+ */
+goog.string.repeat = (String.prototype.repeat) ? function(string, length) {
+ // The native method is over 100 times faster than the alternative.
+ return string.repeat(length);
+} : function(string, length) {
+ return new Array(length + 1).join(string);
+};
+
+
+/**
+ * Pads number to given length and optionally rounds it to a given precision.
+ * For example:
+ * <pre>padNumber(1.25, 2, 3) -> '01.250'
+ * padNumber(1.25, 2) -> '01.25'
+ * padNumber(1.25, 2, 1) -> '01.3'
+ * padNumber(1.25, 0) -> '1.25'</pre>
+ *
+ * @param {number} num The number to pad.
+ * @param {number} length The desired length.
+ * @param {number=} opt_precision The desired precision.
+ * @return {string} {@code num} as a string with the given options.
+ */
+goog.string.padNumber = function(num, length, opt_precision) {
+ var s = goog.isDef(opt_precision) ? num.toFixed(opt_precision) : String(num);
+ var index = s.indexOf('.');
+ if (index == -1) {
+ index = s.length;
+ }
+ return goog.string.repeat('0', Math.max(0, length - index)) + s;
+};
+
+
+/**
+ * Returns a string representation of the given object, with
+ * null and undefined being returned as the empty string.
+ *
+ * @param {*} obj The object to convert.
+ * @return {string} A string representation of the {@code obj}.
+ */
+goog.string.makeSafe = function(obj) {
+ return obj == null ? '' : String(obj);
+};
+
+
+/**
+ * Concatenates string expressions. This is useful
+ * since some browsers are very inefficient when it comes to using plus to
+ * concat strings. Be careful when using null and undefined here since
+ * these will not be included in the result. If you need to represent these
+ * be sure to cast the argument to a String first.
+ * For example:
+ * <pre>buildString('a', 'b', 'c', 'd') -> 'abcd'
+ * buildString(null, undefined) -> ''
+ * </pre>
+ * @param {...*} var_args A list of strings to concatenate. If not a string,
+ * it will be casted to one.
+ * @return {string} The concatenation of {@code var_args}.
+ */
+goog.string.buildString = function(var_args) {
+ return Array.prototype.join.call(arguments, '');
+};
+
+
+/**
+ * Returns a string with at least 64-bits of randomness.
+ *
+ * Doesn't trust Javascript's random function entirely. Uses a combination of
+ * random and current timestamp, and then encodes the string in base-36 to
+ * make it shorter.
+ *
+ * @return {string} A random string, e.g. sn1s7vb4gcic.
+ */
+goog.string.getRandomString = function() {
+ var x = 2147483648;
+ return Math.floor(Math.random() * x).toString(36) +
+ Math.abs(Math.floor(Math.random() * x) ^ goog.now()).toString(36);
+};
+
+
+/**
+ * Compares two version numbers.
+ *
+ * @param {string|number} version1 Version of first item.
+ * @param {string|number} version2 Version of second item.
+ *
+ * @return {number} 1 if {@code version1} is higher.
+ * 0 if arguments are equal.
+ * -1 if {@code version2} is higher.
+ */
+goog.string.compareVersions = function(version1, version2) {
+ var order = 0;
+ // Trim leading and trailing whitespace and split the versions into
+ // subversions.
+ var v1Subs = goog.string.trim(String(version1)).split('.');
+ var v2Subs = goog.string.trim(String(version2)).split('.');
+ var subCount = Math.max(v1Subs.length, v2Subs.length);
+
+ // Iterate over the subversions, as long as they appear to be equivalent.
+ for (var subIdx = 0; order == 0 && subIdx < subCount; subIdx++) {
+ var v1Sub = v1Subs[subIdx] || '';
+ var v2Sub = v2Subs[subIdx] || '';
+
+ do {
+ // Split the subversions into pairs of numbers and qualifiers (like 'b').
+ // Two different RegExp objects are use to make it clear the code
+ // is side-effect free
+ var v1Comp = /(\d*)(\D*)(.*)/.exec(v1Sub) || ['', '', '', ''];
+ var v2Comp = /(\d*)(\D*)(.*)/.exec(v2Sub) || ['', '', '', ''];
+ // Break if there are no more matches.
+ if (v1Comp[0].length == 0 && v2Comp[0].length == 0) {
+ break;
+ }
+
+ // Parse the numeric part of the subversion. A missing number is
+ // equivalent to 0.
+ var v1CompNum = v1Comp[1].length == 0 ? 0 : parseInt(v1Comp[1], 10);
+ var v2CompNum = v2Comp[1].length == 0 ? 0 : parseInt(v2Comp[1], 10);
+
+ // Compare the subversion components. The number has the highest
+ // precedence. Next, if the numbers are equal, a subversion without any
+ // qualifier is always higher than a subversion with any qualifier. Next,
+ // the qualifiers are compared as strings.
+ order = goog.string.compareElements_(v1CompNum, v2CompNum) ||
+ goog.string.compareElements_(
+ v1Comp[2].length == 0, v2Comp[2].length == 0) ||
+ goog.string.compareElements_(v1Comp[2], v2Comp[2]);
+ // Stop as soon as an inequality is discovered.
+
+ v1Sub = v1Comp[3];
+ v2Sub = v2Comp[3];
+ } while (order == 0);
+ }
+
+ return order;
+};
+
+
+/**
+ * Compares elements of a version number.
+ *
+ * @param {string|number|boolean} left An element from a version number.
+ * @param {string|number|boolean} right An element from a version number.
+ *
+ * @return {number} 1 if {@code left} is higher.
+ * 0 if arguments are equal.
+ * -1 if {@code right} is higher.
+ * @private
+ */
+goog.string.compareElements_ = function(left, right) {
+ if (left < right) {
+ return -1;
+ } else if (left > right) {
+ return 1;
+ }
+ return 0;
+};
+
+
+/**
+ * String hash function similar to java.lang.String.hashCode().
+ * The hash code for a string is computed as
+ * s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],
+ * where s[i] is the ith character of the string and n is the length of
+ * the string. We mod the result to make it between 0 (inclusive) and 2^32
+ * (exclusive).
+ * @param {string} str A string.
+ * @return {number} Hash value for {@code str}, between 0 (inclusive) and 2^32
+ * (exclusive). The empty string returns 0.
+ */
+goog.string.hashCode = function(str) {
+ var result = 0;
+ for (var i = 0; i < str.length; ++i) {
+ // Normalize to 4 byte range, 0 ... 2^32.
+ result = (31 * result + str.charCodeAt(i)) >>> 0;
+ }
+ return result;
+};
+
+
+/**
+ * The most recent unique ID. |0 is equivalent to Math.floor in this case.
+ * @type {number}
+ * @private
+ */
+goog.string.uniqueStringCounter_ = Math.random() * 0x80000000 | 0;
+
+
+/**
+ * Generates and returns a string which is unique in the current document.
+ * This is useful, for example, to create unique IDs for DOM elements.
+ * @return {string} A unique id.
+ */
+goog.string.createUniqueString = function() {
+ return 'goog_' + goog.string.uniqueStringCounter_++;
+};
+
+
+/**
+ * Converts the supplied string to a number, which may be Infinity or NaN.
+ * This function strips whitespace: (toNumber(' 123') === 123)
+ * This function accepts scientific notation: (toNumber('1e1') === 10)
+ *
+ * This is better than Javascript's built-in conversions because, sadly:
+ * (Number(' ') === 0) and (parseFloat('123a') === 123)
+ *
+ * @param {string} str The string to convert.
+ * @return {number} The number the supplied string represents, or NaN.
+ */
+goog.string.toNumber = function(str) {
+ var num = Number(str);
+ if (num == 0 && goog.string.isEmptyOrWhitespace(str)) {
+ return NaN;
+ }
+ return num;
+};
+
+
+/**
+ * Returns whether the given string is lower camel case (e.g. "isFooBar").
+ *
+ * Note that this assumes the string is entirely letters.
+ * @see http://en.wikipedia.org/wiki/CamelCase#Variations_and_synonyms
+ *
+ * @param {string} str String to test.
+ * @return {boolean} Whether the string is lower camel case.
+ */
+goog.string.isLowerCamelCase = function(str) {
+ return /^[a-z]+([A-Z][a-z]*)*$/.test(str);
+};
+
+
+/**
+ * Returns whether the given string is upper camel case (e.g. "FooBarBaz").
+ *
+ * Note that this assumes the string is entirely letters.
+ * @see http://en.wikipedia.org/wiki/CamelCase#Variations_and_synonyms
+ *
+ * @param {string} str String to test.
+ * @return {boolean} Whether the string is upper camel case.
+ */
+goog.string.isUpperCamelCase = function(str) {
+ return /^([A-Z][a-z]*)+$/.test(str);
+};
+
+
+/**
+ * Converts a string from selector-case to camelCase (e.g. from
+ * "multi-part-string" to "multiPartString"), useful for converting
+ * CSS selectors and HTML dataset keys to their equivalent JS properties.
+ * @param {string} str The string in selector-case form.
+ * @return {string} The string in camelCase form.
+ */
+goog.string.toCamelCase = function(str) {
+ return String(str).replace(
+ /\-([a-z])/g, function(all, match) { return match.toUpperCase(); });
+};
+
+
+/**
+ * Converts a string from camelCase to selector-case (e.g. from
+ * "multiPartString" to "multi-part-string"), useful for converting JS
+ * style and dataset properties to equivalent CSS selectors and HTML keys.
+ * @param {string} str The string in camelCase form.
+ * @return {string} The string in selector-case form.
+ */
+goog.string.toSelectorCase = function(str) {
+ return String(str).replace(/([A-Z])/g, '-$1').toLowerCase();
+};
+
+
+/**
+ * Converts a string into TitleCase. First character of the string is always
+ * capitalized in addition to the first letter of every subsequent word.
+ * Words are delimited by one or more whitespaces by default. Custom delimiters
+ * can optionally be specified to replace the default, which doesn't preserve
+ * whitespace delimiters and instead must be explicitly included if needed.
+ *
+ * Default delimiter => " ":
+ * goog.string.toTitleCase('oneTwoThree') => 'OneTwoThree'
+ * goog.string.toTitleCase('one two three') => 'One Two Three'
+ * goog.string.toTitleCase(' one two ') => ' One Two '
+ * goog.string.toTitleCase('one_two_three') => 'One_two_three'
+ * goog.string.toTitleCase('one-two-three') => 'One-two-three'
+ *
+ * Custom delimiter => "_-.":
+ * goog.string.toTitleCase('oneTwoThree', '_-.') => 'OneTwoThree'
+ * goog.string.toTitleCase('one two three', '_-.') => 'One two three'
+ * goog.string.toTitleCase(' one two ', '_-.') => ' one two '
+ * goog.string.toTitleCase('one_two_three', '_-.') => 'One_Two_Three'
+ * goog.string.toTitleCase('one-two-three', '_-.') => 'One-Two-Three'
+ * goog.string.toTitleCase('one...two...three', '_-.') => 'One...Two...Three'
+ * goog.string.toTitleCase('one. two. three', '_-.') => 'One. two. three'
+ * goog.string.toTitleCase('one-two.three', '_-.') => 'One-Two.Three'
+ *
+ * @param {string} str String value in camelCase form.
+ * @param {string=} opt_delimiters Custom delimiter character set used to
+ * distinguish words in the string value. Each character represents a
+ * single delimiter. When provided, default whitespace delimiter is
+ * overridden and must be explicitly included if needed.
+ * @return {string} String value in TitleCase form.
+ */
+goog.string.toTitleCase = function(str, opt_delimiters) {
+ var delimiters = goog.isString(opt_delimiters) ?
+ goog.string.regExpEscape(opt_delimiters) :
+ '\\s';
+
+ // For IE8, we need to prevent using an empty character set. Otherwise,
+ // incorrect matching will occur.
+ delimiters = delimiters ? '|[' + delimiters + ']+' : '';
+
+ var regexp = new RegExp('(^' + delimiters + ')([a-z])', 'g');
+ return str.replace(
+ regexp, function(all, p1, p2) { return p1 + p2.toUpperCase(); });
+};
+
+
+/**
+ * Capitalizes a string, i.e. converts the first letter to uppercase
+ * and all other letters to lowercase, e.g.:
+ *
+ * goog.string.capitalize('one') => 'One'
+ * goog.string.capitalize('ONE') => 'One'
+ * goog.string.capitalize('one two') => 'One two'
+ *
+ * Note that this function does not trim initial whitespace.
+ *
+ * @param {string} str String value to capitalize.
+ * @return {string} String value with first letter in uppercase.
+ */
+goog.string.capitalize = function(str) {
+ return String(str.charAt(0)).toUpperCase() +
+ String(str.substr(1)).toLowerCase();
+};
+
+
+/**
+ * Parse a string in decimal or hexidecimal ('0xFFFF') form.
+ *
+ * To parse a particular radix, please use parseInt(string, radix) directly. See
+ * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/parseInt
+ *
+ * This is a wrapper for the built-in parseInt function that will only parse
+ * numbers as base 10 or base 16. Some JS implementations assume strings
+ * starting with "0" are intended to be octal. ES3 allowed but discouraged
+ * this behavior. ES5 forbids it. This function emulates the ES5 behavior.
+ *
+ * For more information, see Mozilla JS Reference: http://goo.gl/8RiFj
+ *
+ * @param {string|number|null|undefined} value The value to be parsed.
+ * @return {number} The number, parsed. If the string failed to parse, this
+ * will be NaN.
+ */
+goog.string.parseInt = function(value) {
+ // Force finite numbers to strings.
+ if (isFinite(value)) {
+ value = String(value);
+ }
+
+ if (goog.isString(value)) {
+ // If the string starts with '0x' or '-0x', parse as hex.
+ return /^\s*-?0x/i.test(value) ? parseInt(value, 16) : parseInt(value, 10);
+ }
+
+ return NaN;
+};
+
+
+/**
+ * Splits a string on a separator a limited number of times.
+ *
+ * This implementation is more similar to Python or Java, where the limit
+ * parameter specifies the maximum number of splits rather than truncating
+ * the number of results.
+ *
+ * See http://docs.python.org/2/library/stdtypes.html#str.split
+ * See JavaDoc: http://goo.gl/F2AsY
+ * See Mozilla reference: http://goo.gl/dZdZs
+ *
+ * @param {string} str String to split.
+ * @param {string} separator The separator.
+ * @param {number} limit The limit to the number of splits. The resulting array
+ * will have a maximum length of limit+1. Negative numbers are the same
+ * as zero.
+ * @return {!Array<string>} The string, split.
+ */
+goog.string.splitLimit = function(str, separator, limit) {
+ var parts = str.split(separator);
+ var returnVal = [];
+
+ // Only continue doing this while we haven't hit the limit and we have
+ // parts left.
+ while (limit > 0 && parts.length) {
+ returnVal.push(parts.shift());
+ limit--;
+ }
+
+ // If there are remaining parts, append them to the end.
+ if (parts.length) {
+ returnVal.push(parts.join(separator));
+ }
+
+ return returnVal;
+};
+
+
+/**
+ * Finds the characters to the right of the last instance of any separator
+ *
+ * This function is similar to goog.string.path.baseName, except it can take a
+ * list of characters to split the string on. It will return the rightmost
+ * grouping of characters to the right of any separator as a left-to-right
+ * oriented string.
+ *
+ * @see goog.string.path.baseName
+ * @param {string} str The string
+ * @param {string|!Array<string>} separators A list of separator characters
+ * @return {string} The last part of the string with respect to the separators
+ */
+goog.string.lastComponent = function(str, separators) {
+ if (!separators) {
+ return str;
+ } else if (typeof separators == 'string') {
+ separators = [separators];
+ }
+
+ var lastSeparatorIndex = -1;
+ for (var i = 0; i < separators.length; i++) {
+ if (separators[i] == '') {
+ continue;
+ }
+ var currentSeparatorIndex = str.lastIndexOf(separators[i]);
+ if (currentSeparatorIndex > lastSeparatorIndex) {
+ lastSeparatorIndex = currentSeparatorIndex;
+ }
+ }
+ if (lastSeparatorIndex == -1) {
+ return str;
+ }
+ return str.slice(lastSeparatorIndex + 1);
+};
+
+
+/**
+ * Computes the Levenshtein edit distance between two strings.
+ * @param {string} a
+ * @param {string} b
+ * @return {number} The edit distance between the two strings.
+ */
+goog.string.editDistance = function(a, b) {
+ var v0 = [];
+ var v1 = [];
+
+ if (a == b) {
+ return 0;
+ }
+
+ if (!a.length || !b.length) {
+ return Math.max(a.length, b.length);
+ }
+
+ for (var i = 0; i < b.length + 1; i++) {
+ v0[i] = i;
+ }
+
+ for (var i = 0; i < a.length; i++) {
+ v1[0] = i + 1;
+
+ for (var j = 0; j < b.length; j++) {
+ var cost = Number(a[i] != b[j]);
+ // Cost for the substring is the minimum of adding one character, removing
+ // one character, or a swap.
+ v1[j + 1] = Math.min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost);
+ }
+
+ for (var j = 0; j < v0.length; j++) {
+ v0[j] = v1[j];
+ }
+ }
+
+ return v1[b.length];
+};
diff --git a/src/http/static/viz/2/goog/string/stringbuffer.js b/src/http/static/viz/2/goog/string/stringbuffer.js
new file mode 100644
index 0000000..478b08b
--- /dev/null
+++ b/src/http/static/viz/2/goog/string/stringbuffer.js
@@ -0,0 +1,103 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Utility for fast string concatenation.
+ */
+
+goog.provide('goog.string.StringBuffer');
+
+
+
+/**
+ * Utility class to facilitate string concatenation.
+ *
+ * @param {*=} opt_a1 Optional first initial item to append.
+ * @param {...*} var_args Other initial items to
+ * append, e.g., new goog.string.StringBuffer('foo', 'bar').
+ * @constructor
+ */
+goog.string.StringBuffer = function(opt_a1, var_args) {
+ if (opt_a1 != null) {
+ this.append.apply(this, arguments);
+ }
+};
+
+
+/**
+ * Internal buffer for the string to be concatenated.
+ * @type {string}
+ * @private
+ */
+goog.string.StringBuffer.prototype.buffer_ = '';
+
+
+/**
+ * Sets the contents of the string buffer object, replacing what's currently
+ * there.
+ *
+ * @param {*} s String to set.
+ */
+goog.string.StringBuffer.prototype.set = function(s) {
+ this.buffer_ = '' + s;
+};
+
+
+/**
+ * Appends one or more items to the buffer.
+ *
+ * Calling this with null, undefined, or empty arguments is an error.
+ *
+ * @param {*} a1 Required first string.
+ * @param {*=} opt_a2 Optional second string.
+ * @param {...?} var_args Other items to append,
+ * e.g., sb.append('foo', 'bar', 'baz').
+ * @return {!goog.string.StringBuffer} This same StringBuffer object.
+ * @suppress {duplicate}
+ */
+goog.string.StringBuffer.prototype.append = function(a1, opt_a2, var_args) {
+ // Use a1 directly to avoid arguments instantiation for single-arg case.
+ this.buffer_ += String(a1);
+ if (opt_a2 != null) { // second argument is undefined (null == undefined)
+ for (var i = 1; i < arguments.length; i++) {
+ this.buffer_ += arguments[i];
+ }
+ }
+ return this;
+};
+
+
+/**
+ * Clears the internal buffer.
+ */
+goog.string.StringBuffer.prototype.clear = function() {
+ this.buffer_ = '';
+};
+
+
+/**
+ * @return {number} the length of the current contents of the buffer.
+ */
+goog.string.StringBuffer.prototype.getLength = function() {
+ return this.buffer_.length;
+};
+
+
+/**
+ * @return {string} The concatenated string.
+ * @override
+ */
+goog.string.StringBuffer.prototype.toString = function() {
+ return this.buffer_;
+};
diff --git a/src/http/static/viz/2/goog/string/stringformat.js b/src/http/static/viz/2/goog/string/stringformat.js
new file mode 100644
index 0000000..58d7af9
--- /dev/null
+++ b/src/http/static/viz/2/goog/string/stringformat.js
@@ -0,0 +1,221 @@
+// Copyright 2008 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Implementation of sprintf-like, python-%-operator-like,
+ * .NET-String.Format-like functionality. Uses JS string's replace method to
+ * extract format specifiers and sends those specifiers to a handler function,
+ * which then, based on conversion type part of the specifier, calls the
+ * appropriate function to handle the specific conversion.
+ * For specific functionality implemented, look at formatRe below, or look
+ * at the tests.
+ */
+
+goog.provide('goog.string.format');
+
+goog.require('goog.string');
+
+
+/**
+ * Performs sprintf-like conversion, i.e. puts the values in a template.
+ * DO NOT use it instead of built-in conversions in simple cases such as
+ * 'Cost: %.2f' as it would introduce unnecessary latency opposed to
+ * 'Cost: ' + cost.toFixed(2).
+ * @param {string} formatString Template string containing % specifiers.
+ * @param {...string|number} var_args Values formatString is to be filled with.
+ * @return {string} Formatted string.
+ */
+goog.string.format = function(formatString, var_args) {
+
+ // Convert the arguments to an array (MDC recommended way).
+ var args = Array.prototype.slice.call(arguments);
+
+ // Try to get the template.
+ var template = args.shift();
+ if (typeof template == 'undefined') {
+ throw Error('[goog.string.format] Template required');
+ }
+
+ // This re is used for matching, it also defines what is supported.
+ var formatRe = /%([0\-\ \+]*)(\d+)?(\.(\d+))?([%sfdiu])/g;
+
+ /**
+ * Chooses which conversion function to call based on type conversion
+ * specifier.
+ * @param {string} match Contains the re matched string.
+ * @param {string} flags Formatting flags.
+ * @param {string} width Replacement string minimum width.
+ * @param {string} dotp Matched precision including a dot.
+ * @param {string} precision Specifies floating point precision.
+ * @param {string} type Type conversion specifier.
+ * @param {string} offset Matching location in the original string.
+ * @param {string} wholeString Has the actualString being searched.
+ * @return {string} Formatted parameter.
+ */
+ function replacerDemuxer(
+ match, flags, width, dotp, precision, type, offset, wholeString) {
+ // The % is too simple and doesn't take an argument.
+ if (type == '%') {
+ return '%';
+ }
+
+ // Try to get the actual value from parent function.
+ var value = args.shift();
+
+ // If we didn't get any arguments, fail.
+ if (typeof value == 'undefined') {
+ throw Error('[goog.string.format] Not enough arguments');
+ }
+
+ // Patch the value argument to the beginning of our type specific call.
+ arguments[0] = value;
+
+ return goog.string.format.demuxes_[type].apply(null, arguments);
+ }
+
+ return template.replace(formatRe, replacerDemuxer);
+};
+
+
+/**
+ * Contains various conversion functions (to be filled in later on).
+ * @private {!Object}
+ */
+goog.string.format.demuxes_ = {};
+
+
+/**
+ * Processes %s conversion specifier.
+ * @param {string} value Contains the formatRe matched string.
+ * @param {string} flags Formatting flags.
+ * @param {string} width Replacement string minimum width.
+ * @param {string} dotp Matched precision including a dot.
+ * @param {string} precision Specifies floating point precision.
+ * @param {string} type Type conversion specifier.
+ * @param {string} offset Matching location in the original string.
+ * @param {string} wholeString Has the actualString being searched.
+ * @return {string} Replacement string.
+ */
+goog.string.format.demuxes_['s'] = function(
+ value, flags, width, dotp, precision, type, offset, wholeString) {
+ var replacement = value;
+ // If no padding is necessary we're done.
+ // The check for '' is necessary because Firefox incorrectly provides the
+ // empty string instead of undefined for non-participating capture groups,
+ // and isNaN('') == false.
+ if (isNaN(width) || width == '' || replacement.length >= Number(width)) {
+ return replacement;
+ }
+
+ // Otherwise we should find out where to put spaces.
+ if (flags.indexOf('-', 0) > -1) {
+ replacement = replacement +
+ goog.string.repeat(' ', Number(width) - replacement.length);
+ } else {
+ replacement = goog.string.repeat(' ', Number(width) - replacement.length) +
+ replacement;
+ }
+ return replacement;
+};
+
+
+/**
+ * Processes %f conversion specifier.
+ * @param {string} value Contains the formatRe matched string.
+ * @param {string} flags Formatting flags.
+ * @param {string} width Replacement string minimum width.
+ * @param {string} dotp Matched precision including a dot.
+ * @param {string} precision Specifies floating point precision.
+ * @param {string} type Type conversion specifier.
+ * @param {string} offset Matching location in the original string.
+ * @param {string} wholeString Has the actualString being searched.
+ * @return {string} Replacement string.
+ */
+goog.string.format.demuxes_['f'] = function(
+ value, flags, width, dotp, precision, type, offset, wholeString) {
+
+ var replacement = value.toString();
+
+ // The check for '' is necessary because Firefox incorrectly provides the
+ // empty string instead of undefined for non-participating capture groups,
+ // and isNaN('') == false.
+ if (!(isNaN(precision) || precision == '')) {
+ replacement = parseFloat(value).toFixed(precision);
+ }
+
+ // Generates sign string that will be attached to the replacement.
+ var sign;
+ if (Number(value) < 0) {
+ sign = '-';
+ } else if (flags.indexOf('+') >= 0) {
+ sign = '+';
+ } else if (flags.indexOf(' ') >= 0) {
+ sign = ' ';
+ } else {
+ sign = '';
+ }
+
+ if (Number(value) >= 0) {
+ replacement = sign + replacement;
+ }
+
+ // If no padding is necessary we're done.
+ if (isNaN(width) || replacement.length >= Number(width)) {
+ return replacement;
+ }
+
+ // We need a clean signless replacement to start with
+ replacement = isNaN(precision) ? Math.abs(Number(value)).toString() :
+ Math.abs(Number(value)).toFixed(precision);
+
+ var padCount = Number(width) - replacement.length - sign.length;
+
+ // Find out which side to pad, and if it's left side, then which character to
+ // pad, and set the sign on the left and padding in the middle.
+ if (flags.indexOf('-', 0) >= 0) {
+ replacement = sign + replacement + goog.string.repeat(' ', padCount);
+ } else {
+ // Decides which character to pad.
+ var paddingChar = (flags.indexOf('0', 0) >= 0) ? '0' : ' ';
+ replacement =
+ sign + goog.string.repeat(paddingChar, padCount) + replacement;
+ }
+
+ return replacement;
+};
+
+
+/**
+ * Processes %d conversion specifier.
+ * @param {string} value Contains the formatRe matched string.
+ * @param {string} flags Formatting flags.
+ * @param {string} width Replacement string minimum width.
+ * @param {string} dotp Matched precision including a dot.
+ * @param {string} precision Specifies floating point precision.
+ * @param {string} type Type conversion specifier.
+ * @param {string} offset Matching location in the original string.
+ * @param {string} wholeString Has the actualString being searched.
+ * @return {string} Replacement string.
+ */
+goog.string.format.demuxes_['d'] = function(
+ value, flags, width, dotp, precision, type, offset, wholeString) {
+ return goog.string.format.demuxes_['f'](
+ parseInt(value, 10) /* value */, flags, width, dotp, 0 /* precision */,
+ type, offset, wholeString);
+};
+
+
+// These are additional aliases, for integer conversion.
+goog.string.format.demuxes_['i'] = goog.string.format.demuxes_['d'];
+goog.string.format.demuxes_['u'] = goog.string.format.demuxes_['d'];
diff --git a/src/http/static/viz/2/goog/string/typedstring.js b/src/http/static/viz/2/goog/string/typedstring.js
new file mode 100644
index 0000000..d0d7bd9
--- /dev/null
+++ b/src/http/static/viz/2/goog/string/typedstring.js
@@ -0,0 +1,48 @@
+// Copyright 2013 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+goog.provide('goog.string.TypedString');
+
+
+
+/**
+ * Wrapper for strings that conform to a data type or language.
+ *
+ * Implementations of this interface are wrappers for strings, and typically
+ * associate a type contract with the wrapped string. Concrete implementations
+ * of this interface may choose to implement additional run-time type checking,
+ * see for example {@code goog.html.SafeHtml}. If available, client code that
+ * needs to ensure type membership of an object should use the type's function
+ * to assert type membership, such as {@code goog.html.SafeHtml.unwrap}.
+ * @interface
+ */
+goog.string.TypedString = function() {};
+
+
+/**
+ * Interface marker of the TypedString interface.
+ *
+ * This property can be used to determine at runtime whether or not an object
+ * implements this interface. All implementations of this interface set this
+ * property to {@code true}.
+ * @type {boolean}
+ */
+goog.string.TypedString.prototype.implementsGoogStringTypedString;
+
+
+/**
+ * Retrieves this wrapped string's value.
+ * @return {string} The wrapped string's value.
+ */
+goog.string.TypedString.prototype.getTypedStringValue;
diff --git a/src/http/static/viz/2/goog/structs/map.js b/src/http/static/viz/2/goog/structs/map.js
new file mode 100644
index 0000000..1cb4bcc
--- /dev/null
+++ b/src/http/static/viz/2/goog/structs/map.js
@@ -0,0 +1,458 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Datastructure: Hash Map.
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ *
+ * This file contains an implementation of a Map structure. It implements a lot
+ * of the methods used in goog.structs so those functions work on hashes. This
+ * is best suited for complex key types. For simple keys such as numbers and
+ * strings consider using the lighter-weight utilities in goog.object.
+ */
+
+
+goog.provide('goog.structs.Map');
+
+goog.require('goog.iter.Iterator');
+goog.require('goog.iter.StopIteration');
+goog.require('goog.object');
+
+
+
+/**
+ * Class for Hash Map datastructure.
+ * @param {*=} opt_map Map or Object to initialize the map with.
+ * @param {...*} var_args If 2 or more arguments are present then they
+ * will be used as key-value pairs.
+ * @constructor
+ * @template K, V
+ * @deprecated This type is misleading: use ES6 Map instead.
+ */
+goog.structs.Map = function(opt_map, var_args) {
+
+ /**
+ * Underlying JS object used to implement the map.
+ * @private {!Object}
+ */
+ this.map_ = {};
+
+ /**
+ * An array of keys. This is necessary for two reasons:
+ * 1. Iterating the keys using for (var key in this.map_) allocates an
+ * object for every key in IE which is really bad for IE6 GC perf.
+ * 2. Without a side data structure, we would need to escape all the keys
+ * as that would be the only way we could tell during iteration if the
+ * key was an internal key or a property of the object.
+ *
+ * This array can contain deleted keys so it's necessary to check the map
+ * as well to see if the key is still in the map (this doesn't require a
+ * memory allocation in IE).
+ * @private {!Array<string>}
+ */
+ this.keys_ = [];
+
+ /**
+ * The number of key value pairs in the map.
+ * @private {number}
+ */
+ this.count_ = 0;
+
+ /**
+ * Version used to detect changes while iterating.
+ * @private {number}
+ */
+ this.version_ = 0;
+
+ var argLength = arguments.length;
+
+ if (argLength > 1) {
+ if (argLength % 2) {
+ throw Error('Uneven number of arguments');
+ }
+ for (var i = 0; i < argLength; i += 2) {
+ this.set(arguments[i], arguments[i + 1]);
+ }
+ } else if (opt_map) {
+ this.addAll(/** @type {Object} */ (opt_map));
+ }
+};
+
+
+/**
+ * @return {number} The number of key-value pairs in the map.
+ */
+goog.structs.Map.prototype.getCount = function() {
+ return this.count_;
+};
+
+
+/**
+ * Returns the values of the map.
+ * @return {!Array<V>} The values in the map.
+ */
+goog.structs.Map.prototype.getValues = function() {
+ this.cleanupKeysArray_();
+
+ var rv = [];
+ for (var i = 0; i < this.keys_.length; i++) {
+ var key = this.keys_[i];
+ rv.push(this.map_[key]);
+ }
+ return rv;
+};
+
+
+/**
+ * Returns the keys of the map.
+ * @return {!Array<string>} Array of string values.
+ */
+goog.structs.Map.prototype.getKeys = function() {
+ this.cleanupKeysArray_();
+ return /** @type {!Array<string>} */ (this.keys_.concat());
+};
+
+
+/**
+ * Whether the map contains the given key.
+ * @param {*} key The key to check for.
+ * @return {boolean} Whether the map contains the key.
+ */
+goog.structs.Map.prototype.containsKey = function(key) {
+ return goog.structs.Map.hasKey_(this.map_, key);
+};
+
+
+/**
+ * Whether the map contains the given value. This is O(n).
+ * @param {V} val The value to check for.
+ * @return {boolean} Whether the map contains the value.
+ */
+goog.structs.Map.prototype.containsValue = function(val) {
+ for (var i = 0; i < this.keys_.length; i++) {
+ var key = this.keys_[i];
+ if (goog.structs.Map.hasKey_(this.map_, key) && this.map_[key] == val) {
+ return true;
+ }
+ }
+ return false;
+};
+
+
+/**
+ * Whether this map is equal to the argument map.
+ * @param {goog.structs.Map} otherMap The map against which to test equality.
+ * @param {function(V, V): boolean=} opt_equalityFn Optional equality function
+ * to test equality of values. If not specified, this will test whether
+ * the values contained in each map are identical objects.
+ * @return {boolean} Whether the maps are equal.
+ */
+goog.structs.Map.prototype.equals = function(otherMap, opt_equalityFn) {
+ if (this === otherMap) {
+ return true;
+ }
+
+ if (this.count_ != otherMap.getCount()) {
+ return false;
+ }
+
+ var equalityFn = opt_equalityFn || goog.structs.Map.defaultEquals;
+
+ this.cleanupKeysArray_();
+ for (var key, i = 0; key = this.keys_[i]; i++) {
+ if (!equalityFn(this.get(key), otherMap.get(key))) {
+ return false;
+ }
+ }
+
+ return true;
+};
+
+
+/**
+ * Default equality test for values.
+ * @param {*} a The first value.
+ * @param {*} b The second value.
+ * @return {boolean} Whether a and b reference the same object.
+ */
+goog.structs.Map.defaultEquals = function(a, b) {
+ return a === b;
+};
+
+
+/**
+ * @return {boolean} Whether the map is empty.
+ */
+goog.structs.Map.prototype.isEmpty = function() {
+ return this.count_ == 0;
+};
+
+
+/**
+ * Removes all key-value pairs from the map.
+ */
+goog.structs.Map.prototype.clear = function() {
+ this.map_ = {};
+ this.keys_.length = 0;
+ this.count_ = 0;
+ this.version_ = 0;
+};
+
+
+/**
+ * Removes a key-value pair based on the key. This is O(logN) amortized due to
+ * updating the keys array whenever the count becomes half the size of the keys
+ * in the keys array.
+ * @param {*} key The key to remove.
+ * @return {boolean} Whether object was removed.
+ */
+goog.structs.Map.prototype.remove = function(key) {
+ if (goog.structs.Map.hasKey_(this.map_, key)) {
+ delete this.map_[key];
+ this.count_--;
+ this.version_++;
+
+ // clean up the keys array if the threshold is hit
+ if (this.keys_.length > 2 * this.count_) {
+ this.cleanupKeysArray_();
+ }
+
+ return true;
+ }
+ return false;
+};
+
+
+/**
+ * Cleans up the temp keys array by removing entries that are no longer in the
+ * map.
+ * @private
+ */
+goog.structs.Map.prototype.cleanupKeysArray_ = function() {
+ if (this.count_ != this.keys_.length) {
+ // First remove keys that are no longer in the map.
+ var srcIndex = 0;
+ var destIndex = 0;
+ while (srcIndex < this.keys_.length) {
+ var key = this.keys_[srcIndex];
+ if (goog.structs.Map.hasKey_(this.map_, key)) {
+ this.keys_[destIndex++] = key;
+ }
+ srcIndex++;
+ }
+ this.keys_.length = destIndex;
+ }
+
+ if (this.count_ != this.keys_.length) {
+ // If the count still isn't correct, that means we have duplicates. This can
+ // happen when the same key is added and removed multiple times. Now we have
+ // to allocate one extra Object to remove the duplicates. This could have
+ // been done in the first pass, but in the common case, we can avoid
+ // allocating an extra object by only doing this when necessary.
+ var seen = {};
+ var srcIndex = 0;
+ var destIndex = 0;
+ while (srcIndex < this.keys_.length) {
+ var key = this.keys_[srcIndex];
+ if (!(goog.structs.Map.hasKey_(seen, key))) {
+ this.keys_[destIndex++] = key;
+ seen[key] = 1;
+ }
+ srcIndex++;
+ }
+ this.keys_.length = destIndex;
+ }
+};
+
+
+/**
+ * Returns the value for the given key. If the key is not found and the default
+ * value is not given this will return {@code undefined}.
+ * @param {*} key The key to get the value for.
+ * @param {DEFAULT=} opt_val The value to return if no item is found for the
+ * given key, defaults to undefined.
+ * @return {V|DEFAULT} The value for the given key.
+ * @template DEFAULT
+ */
+goog.structs.Map.prototype.get = function(key, opt_val) {
+ if (goog.structs.Map.hasKey_(this.map_, key)) {
+ return this.map_[key];
+ }
+ return opt_val;
+};
+
+
+/**
+ * Adds a key-value pair to the map.
+ * @param {*} key The key.
+ * @param {V} value The value to add.
+ * @return {*} Some subclasses return a value.
+ */
+goog.structs.Map.prototype.set = function(key, value) {
+ if (!(goog.structs.Map.hasKey_(this.map_, key))) {
+ this.count_++;
+ // TODO(johnlenz): This class lies, it claims to return an array of string
+ // keys, but instead returns the original object used.
+ this.keys_.push(/** @type {?} */ (key));
+ // Only change the version if we add a new key.
+ this.version_++;
+ }
+ this.map_[key] = value;
+};
+
+
+/**
+ * Adds multiple key-value pairs from another goog.structs.Map or Object.
+ * @param {Object} map Object containing the data to add.
+ */
+goog.structs.Map.prototype.addAll = function(map) {
+ var keys, values;
+ if (map instanceof goog.structs.Map) {
+ keys = map.getKeys();
+ values = map.getValues();
+ } else {
+ keys = goog.object.getKeys(map);
+ values = goog.object.getValues(map);
+ }
+ // we could use goog.array.forEach here but I don't want to introduce that
+ // dependency just for this.
+ for (var i = 0; i < keys.length; i++) {
+ this.set(keys[i], values[i]);
+ }
+};
+
+
+/**
+ * Calls the given function on each entry in the map.
+ * @param {function(this:T, V, K, goog.structs.Map<K,V>)} f
+ * @param {T=} opt_obj The value of "this" inside f.
+ * @template T
+ */
+goog.structs.Map.prototype.forEach = function(f, opt_obj) {
+ var keys = this.getKeys();
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var value = this.get(key);
+ f.call(opt_obj, value, key, this);
+ }
+};
+
+
+/**
+ * Clones a map and returns a new map.
+ * @return {!goog.structs.Map} A new map with the same key-value pairs.
+ */
+goog.structs.Map.prototype.clone = function() {
+ return new goog.structs.Map(this);
+};
+
+
+/**
+ * Returns a new map in which all the keys and values are interchanged
+ * (keys become values and values become keys). If multiple keys map to the
+ * same value, the chosen transposed value is implementation-dependent.
+ *
+ * It acts very similarly to {goog.object.transpose(Object)}.
+ *
+ * @return {!goog.structs.Map} The transposed map.
+ */
+goog.structs.Map.prototype.transpose = function() {
+ var transposed = new goog.structs.Map();
+ for (var i = 0; i < this.keys_.length; i++) {
+ var key = this.keys_[i];
+ var value = this.map_[key];
+ transposed.set(value, key);
+ }
+
+ return transposed;
+};
+
+
+/**
+ * @return {!Object} Object representation of the map.
+ */
+goog.structs.Map.prototype.toObject = function() {
+ this.cleanupKeysArray_();
+ var obj = {};
+ for (var i = 0; i < this.keys_.length; i++) {
+ var key = this.keys_[i];
+ obj[key] = this.map_[key];
+ }
+ return obj;
+};
+
+
+/**
+ * Returns an iterator that iterates over the keys in the map. Removal of keys
+ * while iterating might have undesired side effects.
+ * @return {!goog.iter.Iterator} An iterator over the keys in the map.
+ */
+goog.structs.Map.prototype.getKeyIterator = function() {
+ return this.__iterator__(true);
+};
+
+
+/**
+ * Returns an iterator that iterates over the values in the map. Removal of
+ * keys while iterating might have undesired side effects.
+ * @return {!goog.iter.Iterator} An iterator over the values in the map.
+ */
+goog.structs.Map.prototype.getValueIterator = function() {
+ return this.__iterator__(false);
+};
+
+
+/**
+ * Returns an iterator that iterates over the values or the keys in the map.
+ * This throws an exception if the map was mutated since the iterator was
+ * created.
+ * @param {boolean=} opt_keys True to iterate over the keys. False to iterate
+ * over the values. The default value is false.
+ * @return {!goog.iter.Iterator} An iterator over the values or keys in the map.
+ */
+goog.structs.Map.prototype.__iterator__ = function(opt_keys) {
+ // Clean up keys to minimize the risk of iterating over dead keys.
+ this.cleanupKeysArray_();
+
+ var i = 0;
+ var version = this.version_;
+ var selfObj = this;
+
+ var newIter = new goog.iter.Iterator;
+ newIter.next = function() {
+ if (version != selfObj.version_) {
+ throw Error('The map has changed since the iterator was created');
+ }
+ if (i >= selfObj.keys_.length) {
+ throw goog.iter.StopIteration;
+ }
+ var key = selfObj.keys_[i++];
+ return opt_keys ? key : selfObj.map_[key];
+ };
+ return newIter;
+};
+
+
+/**
+ * Safe way to test for hasOwnProperty. It even allows testing for
+ * 'hasOwnProperty'.
+ * @param {Object} obj The object to test for presence of the given key.
+ * @param {*} key The key to check for.
+ * @return {boolean} Whether the object has the key.
+ * @private
+ */
+goog.structs.Map.hasKey_ = function(obj, key) {
+ return Object.prototype.hasOwnProperty.call(obj, key);
+};
diff --git a/src/http/static/viz/2/goog/structs/structs.js b/src/http/static/viz/2/goog/structs/structs.js
new file mode 100644
index 0000000..684ddfe
--- /dev/null
+++ b/src/http/static/viz/2/goog/structs/structs.js
@@ -0,0 +1,354 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Generics method for collection-like classes and objects.
+ *
+ * @author arv@google.com (Erik Arvidsson)
+ *
+ * This file contains functions to work with collections. It supports using
+ * Map, Set, Array and Object and other classes that implement collection-like
+ * methods.
+ */
+
+
+goog.provide('goog.structs');
+
+goog.require('goog.array');
+goog.require('goog.object');
+
+
+// We treat an object as a dictionary if it has getKeys or it is an object that
+// isn't arrayLike.
+
+
+/**
+ * Returns the number of values in the collection-like object.
+ * @param {Object} col The collection-like object.
+ * @return {number} The number of values in the collection-like object.
+ */
+goog.structs.getCount = function(col) {
+ if (col.getCount && typeof col.getCount == 'function') {
+ return col.getCount();
+ }
+ if (goog.isArrayLike(col) || goog.isString(col)) {
+ return col.length;
+ }
+ return goog.object.getCount(col);
+};
+
+
+/**
+ * Returns the values of the collection-like object.
+ * @param {Object} col The collection-like object.
+ * @return {!Array<?>} The values in the collection-like object.
+ */
+goog.structs.getValues = function(col) {
+ if (col.getValues && typeof col.getValues == 'function') {
+ return col.getValues();
+ }
+ if (goog.isString(col)) {
+ return col.split('');
+ }
+ if (goog.isArrayLike(col)) {
+ var rv = [];
+ var l = col.length;
+ for (var i = 0; i < l; i++) {
+ rv.push(col[i]);
+ }
+ return rv;
+ }
+ return goog.object.getValues(col);
+};
+
+
+/**
+ * Returns the keys of the collection. Some collections have no notion of
+ * keys/indexes and this function will return undefined in those cases.
+ * @param {Object} col The collection-like object.
+ * @return {!Array|undefined} The keys in the collection.
+ */
+goog.structs.getKeys = function(col) {
+ if (col.getKeys && typeof col.getKeys == 'function') {
+ return col.getKeys();
+ }
+ // if we have getValues but no getKeys we know this is a key-less collection
+ if (col.getValues && typeof col.getValues == 'function') {
+ return undefined;
+ }
+ if (goog.isArrayLike(col) || goog.isString(col)) {
+ var rv = [];
+ var l = col.length;
+ for (var i = 0; i < l; i++) {
+ rv.push(i);
+ }
+ return rv;
+ }
+
+ return goog.object.getKeys(col);
+};
+
+
+/**
+ * Whether the collection contains the given value. This is O(n) and uses
+ * equals (==) to test the existence.
+ * @param {Object} col The collection-like object.
+ * @param {*} val The value to check for.
+ * @return {boolean} True if the map contains the value.
+ */
+goog.structs.contains = function(col, val) {
+ if (col.contains && typeof col.contains == 'function') {
+ return col.contains(val);
+ }
+ if (col.containsValue && typeof col.containsValue == 'function') {
+ return col.containsValue(val);
+ }
+ if (goog.isArrayLike(col) || goog.isString(col)) {
+ return goog.array.contains(/** @type {!Array<?>} */ (col), val);
+ }
+ return goog.object.containsValue(col, val);
+};
+
+
+/**
+ * Whether the collection is empty.
+ * @param {Object} col The collection-like object.
+ * @return {boolean} True if empty.
+ */
+goog.structs.isEmpty = function(col) {
+ if (col.isEmpty && typeof col.isEmpty == 'function') {
+ return col.isEmpty();
+ }
+
+ // We do not use goog.string.isEmptyOrWhitespace because here we treat the
+ // string as
+ // collection and as such even whitespace matters
+
+ if (goog.isArrayLike(col) || goog.isString(col)) {
+ return goog.array.isEmpty(/** @type {!Array<?>} */ (col));
+ }
+ return goog.object.isEmpty(col);
+};
+
+
+/**
+ * Removes all the elements from the collection.
+ * @param {Object} col The collection-like object.
+ */
+goog.structs.clear = function(col) {
+ // NOTE(arv): This should not contain strings because strings are immutable
+ if (col.clear && typeof col.clear == 'function') {
+ col.clear();
+ } else if (goog.isArrayLike(col)) {
+ goog.array.clear(/** @type {IArrayLike<?>} */ (col));
+ } else {
+ goog.object.clear(col);
+ }
+};
+
+
+/**
+ * Calls a function for each value in a collection. The function takes
+ * three arguments; the value, the key and the collection.
+ *
+ * @param {S} col The collection-like object.
+ * @param {function(this:T,?,?,S):?} f The function to call for every value.
+ * This function takes
+ * 3 arguments (the value, the key or undefined if the collection has no
+ * notion of keys, and the collection) and the return value is irrelevant.
+ * @param {T=} opt_obj The object to be used as the value of 'this'
+ * within {@code f}.
+ * @template T,S
+ * @deprecated Use a more specific method, e.g. goog.array.forEach,
+ * goog.object.forEach, or for-of.
+ */
+goog.structs.forEach = function(col, f, opt_obj) {
+ if (col.forEach && typeof col.forEach == 'function') {
+ col.forEach(f, opt_obj);
+ } else if (goog.isArrayLike(col) || goog.isString(col)) {
+ goog.array.forEach(/** @type {!Array<?>} */ (col), f, opt_obj);
+ } else {
+ var keys = goog.structs.getKeys(col);
+ var values = goog.structs.getValues(col);
+ var l = values.length;
+ for (var i = 0; i < l; i++) {
+ f.call(/** @type {?} */ (opt_obj), values[i], keys && keys[i], col);
+ }
+ }
+};
+
+
+/**
+ * Calls a function for every value in the collection. When a call returns true,
+ * adds the value to a new collection (Array is returned by default).
+ *
+ * @param {S} col The collection-like object.
+ * @param {function(this:T,?,?,S):boolean} f The function to call for every
+ * value. This function takes
+ * 3 arguments (the value, the key or undefined if the collection has no
+ * notion of keys, and the collection) and should return a Boolean. If the
+ * return value is true the value is added to the result collection. If it
+ * is false the value is not included.
+ * @param {T=} opt_obj The object to be used as the value of 'this'
+ * within {@code f}.
+ * @return {!Object|!Array<?>} A new collection where the passed values are
+ * present. If col is a key-less collection an array is returned. If col
+ * has keys and values a plain old JS object is returned.
+ * @template T,S
+ */
+goog.structs.filter = function(col, f, opt_obj) {
+ if (typeof col.filter == 'function') {
+ return col.filter(f, opt_obj);
+ }
+ if (goog.isArrayLike(col) || goog.isString(col)) {
+ return goog.array.filter(/** @type {!Array<?>} */ (col), f, opt_obj);
+ }
+
+ var rv;
+ var keys = goog.structs.getKeys(col);
+ var values = goog.structs.getValues(col);
+ var l = values.length;
+ if (keys) {
+ rv = {};
+ for (var i = 0; i < l; i++) {
+ if (f.call(/** @type {?} */ (opt_obj), values[i], keys[i], col)) {
+ rv[keys[i]] = values[i];
+ }
+ }
+ } else {
+ // We should not use goog.array.filter here since we want to make sure that
+ // the index is undefined as well as make sure that col is passed to the
+ // function.
+ rv = [];
+ for (var i = 0; i < l; i++) {
+ if (f.call(opt_obj, values[i], undefined, col)) {
+ rv.push(values[i]);
+ }
+ }
+ }
+ return rv;
+};
+
+
+/**
+ * Calls a function for every value in the collection and adds the result into a
+ * new collection (defaults to creating a new Array).
+ *
+ * @param {S} col The collection-like object.
+ * @param {function(this:T,?,?,S):V} f The function to call for every value.
+ * This function takes 3 arguments (the value, the key or undefined if the
+ * collection has no notion of keys, and the collection) and should return
+ * something. The result will be used as the value in the new collection.
+ * @param {T=} opt_obj The object to be used as the value of 'this'
+ * within {@code f}.
+ * @return {!Object<V>|!Array<V>} A new collection with the new values. If
+ * col is a key-less collection an array is returned. If col has keys and
+ * values a plain old JS object is returned.
+ * @template T,S,V
+ */
+goog.structs.map = function(col, f, opt_obj) {
+ if (typeof col.map == 'function') {
+ return col.map(f, opt_obj);
+ }
+ if (goog.isArrayLike(col) || goog.isString(col)) {
+ return goog.array.map(/** @type {!Array<?>} */ (col), f, opt_obj);
+ }
+
+ var rv;
+ var keys = goog.structs.getKeys(col);
+ var values = goog.structs.getValues(col);
+ var l = values.length;
+ if (keys) {
+ rv = {};
+ for (var i = 0; i < l; i++) {
+ rv[keys[i]] = f.call(/** @type {?} */ (opt_obj), values[i], keys[i], col);
+ }
+ } else {
+ // We should not use goog.array.map here since we want to make sure that
+ // the index is undefined as well as make sure that col is passed to the
+ // function.
+ rv = [];
+ for (var i = 0; i < l; i++) {
+ rv[i] = f.call(/** @type {?} */ (opt_obj), values[i], undefined, col);
+ }
+ }
+ return rv;
+};
+
+
+/**
+ * Calls f for each value in a collection. If any call returns true this returns
+ * true (without checking the rest). If all returns false this returns false.
+ *
+ * @param {S} col The collection-like object.
+ * @param {function(this:T,?,?,S):boolean} f The function to call for every
+ * value. This function takes 3 arguments (the value, the key or undefined
+ * if the collection has no notion of keys, and the collection) and should
+ * return a boolean.
+ * @param {T=} opt_obj The object to be used as the value of 'this'
+ * within {@code f}.
+ * @return {boolean} True if any value passes the test.
+ * @template T,S
+ */
+goog.structs.some = function(col, f, opt_obj) {
+ if (typeof col.some == 'function') {
+ return col.some(f, opt_obj);
+ }
+ if (goog.isArrayLike(col) || goog.isString(col)) {
+ return goog.array.some(/** @type {!Array<?>} */ (col), f, opt_obj);
+ }
+ var keys = goog.structs.getKeys(col);
+ var values = goog.structs.getValues(col);
+ var l = values.length;
+ for (var i = 0; i < l; i++) {
+ if (f.call(/** @type {?} */ (opt_obj), values[i], keys && keys[i], col)) {
+ return true;
+ }
+ }
+ return false;
+};
+
+
+/**
+ * Calls f for each value in a collection. If all calls return true this return
+ * true this returns true. If any returns false this returns false at this point
+ * and does not continue to check the remaining values.
+ *
+ * @param {S} col The collection-like object.
+ * @param {function(this:T,?,?,S):boolean} f The function to call for every
+ * value. This function takes 3 arguments (the value, the key or
+ * undefined if the collection has no notion of keys, and the collection)
+ * and should return a boolean.
+ * @param {T=} opt_obj The object to be used as the value of 'this'
+ * within {@code f}.
+ * @return {boolean} True if all key-value pairs pass the test.
+ * @template T,S
+ */
+goog.structs.every = function(col, f, opt_obj) {
+ if (typeof col.every == 'function') {
+ return col.every(f, opt_obj);
+ }
+ if (goog.isArrayLike(col) || goog.isString(col)) {
+ return goog.array.every(/** @type {!Array<?>} */ (col), f, opt_obj);
+ }
+ var keys = goog.structs.getKeys(col);
+ var values = goog.structs.getValues(col);
+ var l = values.length;
+ for (var i = 0; i < l; i++) {
+ if (!f.call(/** @type {?} */ (opt_obj), values[i], keys && keys[i], col)) {
+ return false;
+ }
+ }
+ return true;
+};
diff --git a/src/http/static/viz/2/goog/uri/uri.js b/src/http/static/viz/2/goog/uri/uri.js
new file mode 100644
index 0000000..7873de9
--- /dev/null
+++ b/src/http/static/viz/2/goog/uri/uri.js
@@ -0,0 +1,1547 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Class for parsing and formatting URIs.
+ *
+ * Use goog.Uri(string) to parse a URI string. Use goog.Uri.create(...) to
+ * create a new instance of the goog.Uri object from Uri parts.
+ *
+ * e.g: <code>var myUri = new goog.Uri(window.location);</code>
+ *
+ * Implements RFC 3986 for parsing/formatting URIs.
+ * http://www.ietf.org/rfc/rfc3986.txt
+ *
+ * Some changes have been made to the interface (more like .NETs), though the
+ * internal representation is now of un-encoded parts, this will change the
+ * behavior slightly.
+ *
+ * @author msamuel@google.com (Mike Samuel)
+ */
+
+goog.provide('goog.Uri');
+goog.provide('goog.Uri.QueryData');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.string');
+goog.require('goog.structs');
+goog.require('goog.structs.Map');
+goog.require('goog.uri.utils');
+goog.require('goog.uri.utils.ComponentIndex');
+goog.require('goog.uri.utils.StandardQueryParam');
+
+
+
+/**
+ * This class contains setters and getters for the parts of the URI.
+ * The <code>getXyz</code>/<code>setXyz</code> methods return the decoded part
+ * -- so<code>goog.Uri.parse('/foo%20bar').getPath()</code> will return the
+ * decoded path, <code>/foo bar</code>.
+ *
+ * Reserved characters (see RFC 3986 section 2.2) can be present in
+ * their percent-encoded form in scheme, domain, and path URI components and
+ * will not be auto-decoded. For example:
+ * <code>goog.Uri.parse('rel%61tive/path%2fto/resource').getPath()</code> will
+ * return <code>relative/path%2fto/resource</code>.
+ *
+ * The constructor accepts an optional unparsed, raw URI string. The parser
+ * is relaxed, so special characters that aren't escaped but don't cause
+ * ambiguities will not cause parse failures.
+ *
+ * All setters return <code>this</code> and so may be chained, a la
+ * <code>goog.Uri.parse('/foo').setFragment('part').toString()</code>.
+ *
+ * @param {*=} opt_uri Optional string URI to parse
+ * (use goog.Uri.create() to create a URI from parts), or if
+ * a goog.Uri is passed, a clone is created.
+ * @param {boolean=} opt_ignoreCase If true, #getParameterValue will ignore
+ * the case of the parameter name.
+ *
+ * @throws URIError If opt_uri is provided and URI is malformed (that is,
+ * if decodeURIComponent fails on any of the URI components).
+ * @constructor
+ * @struct
+ */
+goog.Uri = function(opt_uri, opt_ignoreCase) {
+ /**
+ * Scheme such as "http".
+ * @private {string}
+ */
+ this.scheme_ = '';
+
+ /**
+ * User credentials in the form "username:password".
+ * @private {string}
+ */
+ this.userInfo_ = '';
+
+ /**
+ * Domain part, e.g. "www.google.com".
+ * @private {string}
+ */
+ this.domain_ = '';
+
+ /**
+ * Port, e.g. 8080.
+ * @private {?number}
+ */
+ this.port_ = null;
+
+ /**
+ * Path, e.g. "/tests/img.png".
+ * @private {string}
+ */
+ this.path_ = '';
+
+ /**
+ * The fragment without the #.
+ * @private {string}
+ */
+ this.fragment_ = '';
+
+ /**
+ * Whether or not this Uri should be treated as Read Only.
+ * @private {boolean}
+ */
+ this.isReadOnly_ = false;
+
+ /**
+ * Whether or not to ignore case when comparing query params.
+ * @private {boolean}
+ */
+ this.ignoreCase_ = false;
+
+ /**
+ * Object representing query data.
+ * @private {!goog.Uri.QueryData}
+ */
+ this.queryData_;
+
+ // Parse in the uri string
+ var m;
+ if (opt_uri instanceof goog.Uri) {
+ this.ignoreCase_ =
+ goog.isDef(opt_ignoreCase) ? opt_ignoreCase : opt_uri.getIgnoreCase();
+ this.setScheme(opt_uri.getScheme());
+ this.setUserInfo(opt_uri.getUserInfo());
+ this.setDomain(opt_uri.getDomain());
+ this.setPort(opt_uri.getPort());
+ this.setPath(opt_uri.getPath());
+ this.setQueryData(opt_uri.getQueryData().clone());
+ this.setFragment(opt_uri.getFragment());
+ } else if (opt_uri && (m = goog.uri.utils.split(String(opt_uri)))) {
+ this.ignoreCase_ = !!opt_ignoreCase;
+
+ // Set the parts -- decoding as we do so.
+ // COMPATIBILITY NOTE - In IE, unmatched fields may be empty strings,
+ // whereas in other browsers they will be undefined.
+ this.setScheme(m[goog.uri.utils.ComponentIndex.SCHEME] || '', true);
+ this.setUserInfo(m[goog.uri.utils.ComponentIndex.USER_INFO] || '', true);
+ this.setDomain(m[goog.uri.utils.ComponentIndex.DOMAIN] || '', true);
+ this.setPort(m[goog.uri.utils.ComponentIndex.PORT]);
+ this.setPath(m[goog.uri.utils.ComponentIndex.PATH] || '', true);
+ this.setQueryData(m[goog.uri.utils.ComponentIndex.QUERY_DATA] || '', true);
+ this.setFragment(m[goog.uri.utils.ComponentIndex.FRAGMENT] || '', true);
+
+ } else {
+ this.ignoreCase_ = !!opt_ignoreCase;
+ this.queryData_ = new goog.Uri.QueryData(null, null, this.ignoreCase_);
+ }
+};
+
+
+/**
+ * If true, we preserve the type of query parameters set programmatically.
+ *
+ * This means that if you set a parameter to a boolean, and then call
+ * getParameterValue, you will get a boolean back.
+ *
+ * If false, we will coerce parameters to strings, just as they would
+ * appear in real URIs.
+ *
+ * TODO(nicksantos): Remove this once people have time to fix all tests.
+ *
+ * @type {boolean}
+ */
+goog.Uri.preserveParameterTypesCompatibilityFlag = false;
+
+
+/**
+ * Parameter name added to stop caching.
+ * @type {string}
+ */
+goog.Uri.RANDOM_PARAM = goog.uri.utils.StandardQueryParam.RANDOM;
+
+
+/**
+ * @return {string} The string form of the url.
+ * @override
+ */
+goog.Uri.prototype.toString = function() {
+ var out = [];
+
+ var scheme = this.getScheme();
+ if (scheme) {
+ out.push(
+ goog.Uri.encodeSpecialChars_(
+ scheme, goog.Uri.reDisallowedInSchemeOrUserInfo_, true),
+ ':');
+ }
+
+ var domain = this.getDomain();
+ if (domain || scheme == 'file') {
+ out.push('//');
+
+ var userInfo = this.getUserInfo();
+ if (userInfo) {
+ out.push(
+ goog.Uri.encodeSpecialChars_(
+ userInfo, goog.Uri.reDisallowedInSchemeOrUserInfo_, true),
+ '@');
+ }
+
+ out.push(goog.Uri.removeDoubleEncoding_(goog.string.urlEncode(domain)));
+
+ var port = this.getPort();
+ if (port != null) {
+ out.push(':', String(port));
+ }
+ }
+
+ var path = this.getPath();
+ if (path) {
+ if (this.hasDomain() && path.charAt(0) != '/') {
+ out.push('/');
+ }
+ out.push(
+ goog.Uri.encodeSpecialChars_(
+ path, path.charAt(0) == '/' ? goog.Uri.reDisallowedInAbsolutePath_ :
+ goog.Uri.reDisallowedInRelativePath_,
+ true));
+ }
+
+ var query = this.getEncodedQuery();
+ if (query) {
+ out.push('?', query);
+ }
+
+ var fragment = this.getFragment();
+ if (fragment) {
+ out.push(
+ '#', goog.Uri.encodeSpecialChars_(
+ fragment, goog.Uri.reDisallowedInFragment_));
+ }
+ return out.join('');
+};
+
+
+/**
+ * Resolves the given relative URI (a goog.Uri object), using the URI
+ * represented by this instance as the base URI.
+ *
+ * There are several kinds of relative URIs:<br>
+ * 1. foo - replaces the last part of the path, the whole query and fragment<br>
+ * 2. /foo - replaces the the path, the query and fragment<br>
+ * 3. //foo - replaces everything from the domain on. foo is a domain name<br>
+ * 4. ?foo - replace the query and fragment<br>
+ * 5. #foo - replace the fragment only
+ *
+ * Additionally, if relative URI has a non-empty path, all ".." and "."
+ * segments will be resolved, as described in RFC 3986.
+ *
+ * @param {!goog.Uri} relativeUri The relative URI to resolve.
+ * @return {!goog.Uri} The resolved URI.
+ */
+goog.Uri.prototype.resolve = function(relativeUri) {
+
+ var absoluteUri = this.clone();
+
+ // we satisfy these conditions by looking for the first part of relativeUri
+ // that is not blank and applying defaults to the rest
+
+ var overridden = relativeUri.hasScheme();
+
+ if (overridden) {
+ absoluteUri.setScheme(relativeUri.getScheme());
+ } else {
+ overridden = relativeUri.hasUserInfo();
+ }
+
+ if (overridden) {
+ absoluteUri.setUserInfo(relativeUri.getUserInfo());
+ } else {
+ overridden = relativeUri.hasDomain();
+ }
+
+ if (overridden) {
+ absoluteUri.setDomain(relativeUri.getDomain());
+ } else {
+ overridden = relativeUri.hasPort();
+ }
+
+ var path = relativeUri.getPath();
+ if (overridden) {
+ absoluteUri.setPort(relativeUri.getPort());
+ } else {
+ overridden = relativeUri.hasPath();
+ if (overridden) {
+ // resolve path properly
+ if (path.charAt(0) != '/') {
+ // path is relative
+ if (this.hasDomain() && !this.hasPath()) {
+ // RFC 3986, section 5.2.3, case 1
+ path = '/' + path;
+ } else {
+ // RFC 3986, section 5.2.3, case 2
+ var lastSlashIndex = absoluteUri.getPath().lastIndexOf('/');
+ if (lastSlashIndex != -1) {
+ path = absoluteUri.getPath().substr(0, lastSlashIndex + 1) + path;
+ }
+ }
+ }
+ path = goog.Uri.removeDotSegments(path);
+ }
+ }
+
+ if (overridden) {
+ absoluteUri.setPath(path);
+ } else {
+ overridden = relativeUri.hasQuery();
+ }
+
+ if (overridden) {
+ absoluteUri.setQueryData(relativeUri.getQueryData().clone());
+ } else {
+ overridden = relativeUri.hasFragment();
+ }
+
+ if (overridden) {
+ absoluteUri.setFragment(relativeUri.getFragment());
+ }
+
+ return absoluteUri;
+};
+
+
+/**
+ * Clones the URI instance.
+ * @return {!goog.Uri} New instance of the URI object.
+ */
+goog.Uri.prototype.clone = function() {
+ return new goog.Uri(this);
+};
+
+
+/**
+ * @return {string} The encoded scheme/protocol for the URI.
+ */
+goog.Uri.prototype.getScheme = function() {
+ return this.scheme_;
+};
+
+
+/**
+ * Sets the scheme/protocol.
+ * @throws URIError If opt_decode is true and newScheme is malformed (that is,
+ * if decodeURIComponent fails).
+ * @param {string} newScheme New scheme value.
+ * @param {boolean=} opt_decode Optional param for whether to decode new value.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.setScheme = function(newScheme, opt_decode) {
+ this.enforceReadOnly();
+ this.scheme_ =
+ opt_decode ? goog.Uri.decodeOrEmpty_(newScheme, true) : newScheme;
+
+ // remove an : at the end of the scheme so somebody can pass in
+ // window.location.protocol
+ if (this.scheme_) {
+ this.scheme_ = this.scheme_.replace(/:$/, '');
+ }
+ return this;
+};
+
+
+/**
+ * @return {boolean} Whether the scheme has been set.
+ */
+goog.Uri.prototype.hasScheme = function() {
+ return !!this.scheme_;
+};
+
+
+/**
+ * @return {string} The decoded user info.
+ */
+goog.Uri.prototype.getUserInfo = function() {
+ return this.userInfo_;
+};
+
+
+/**
+ * Sets the userInfo.
+ * @throws URIError If opt_decode is true and newUserInfo is malformed (that is,
+ * if decodeURIComponent fails).
+ * @param {string} newUserInfo New userInfo value.
+ * @param {boolean=} opt_decode Optional param for whether to decode new value.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.setUserInfo = function(newUserInfo, opt_decode) {
+ this.enforceReadOnly();
+ this.userInfo_ =
+ opt_decode ? goog.Uri.decodeOrEmpty_(newUserInfo) : newUserInfo;
+ return this;
+};
+
+
+/**
+ * @return {boolean} Whether the user info has been set.
+ */
+goog.Uri.prototype.hasUserInfo = function() {
+ return !!this.userInfo_;
+};
+
+
+/**
+ * @return {string} The decoded domain.
+ */
+goog.Uri.prototype.getDomain = function() {
+ return this.domain_;
+};
+
+
+/**
+ * Sets the domain.
+ * @throws URIError If opt_decode is true and newDomain is malformed (that is,
+ * if decodeURIComponent fails).
+ * @param {string} newDomain New domain value.
+ * @param {boolean=} opt_decode Optional param for whether to decode new value.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.setDomain = function(newDomain, opt_decode) {
+ this.enforceReadOnly();
+ this.domain_ =
+ opt_decode ? goog.Uri.decodeOrEmpty_(newDomain, true) : newDomain;
+ return this;
+};
+
+
+/**
+ * @return {boolean} Whether the domain has been set.
+ */
+goog.Uri.prototype.hasDomain = function() {
+ return !!this.domain_;
+};
+
+
+/**
+ * @return {?number} The port number.
+ */
+goog.Uri.prototype.getPort = function() {
+ return this.port_;
+};
+
+
+/**
+ * Sets the port number.
+ * @param {*} newPort Port number. Will be explicitly casted to a number.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.setPort = function(newPort) {
+ this.enforceReadOnly();
+
+ if (newPort) {
+ newPort = Number(newPort);
+ if (isNaN(newPort) || newPort < 0) {
+ throw Error('Bad port number ' + newPort);
+ }
+ this.port_ = newPort;
+ } else {
+ this.port_ = null;
+ }
+
+ return this;
+};
+
+
+/**
+ * @return {boolean} Whether the port has been set.
+ */
+goog.Uri.prototype.hasPort = function() {
+ return this.port_ != null;
+};
+
+
+/**
+ * @return {string} The decoded path.
+ */
+goog.Uri.prototype.getPath = function() {
+ return this.path_;
+};
+
+
+/**
+ * Sets the path.
+ * @throws URIError If opt_decode is true and newPath is malformed (that is,
+ * if decodeURIComponent fails).
+ * @param {string} newPath New path value.
+ * @param {boolean=} opt_decode Optional param for whether to decode new value.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.setPath = function(newPath, opt_decode) {
+ this.enforceReadOnly();
+ this.path_ = opt_decode ? goog.Uri.decodeOrEmpty_(newPath, true) : newPath;
+ return this;
+};
+
+
+/**
+ * @return {boolean} Whether the path has been set.
+ */
+goog.Uri.prototype.hasPath = function() {
+ return !!this.path_;
+};
+
+
+/**
+ * @return {boolean} Whether the query string has been set.
+ */
+goog.Uri.prototype.hasQuery = function() {
+ return this.queryData_.toString() !== '';
+};
+
+
+/**
+ * Sets the query data.
+ * @param {goog.Uri.QueryData|string|undefined} queryData QueryData object.
+ * @param {boolean=} opt_decode Optional param for whether to decode new value.
+ * Applies only if queryData is a string.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.setQueryData = function(queryData, opt_decode) {
+ this.enforceReadOnly();
+
+ if (queryData instanceof goog.Uri.QueryData) {
+ this.queryData_ = queryData;
+ this.queryData_.setIgnoreCase(this.ignoreCase_);
+ } else {
+ if (!opt_decode) {
+ // QueryData accepts encoded query string, so encode it if
+ // opt_decode flag is not true.
+ queryData = goog.Uri.encodeSpecialChars_(
+ queryData, goog.Uri.reDisallowedInQuery_);
+ }
+ this.queryData_ = new goog.Uri.QueryData(queryData, null, this.ignoreCase_);
+ }
+
+ return this;
+};
+
+
+/**
+ * Sets the URI query.
+ * @param {string} newQuery New query value.
+ * @param {boolean=} opt_decode Optional param for whether to decode new value.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.setQuery = function(newQuery, opt_decode) {
+ return this.setQueryData(newQuery, opt_decode);
+};
+
+
+/**
+ * @return {string} The encoded URI query, not including the ?.
+ */
+goog.Uri.prototype.getEncodedQuery = function() {
+ return this.queryData_.toString();
+};
+
+
+/**
+ * @return {string} The decoded URI query, not including the ?.
+ */
+goog.Uri.prototype.getDecodedQuery = function() {
+ return this.queryData_.toDecodedString();
+};
+
+
+/**
+ * Returns the query data.
+ * @return {!goog.Uri.QueryData} QueryData object.
+ */
+goog.Uri.prototype.getQueryData = function() {
+ return this.queryData_;
+};
+
+
+/**
+ * @return {string} The encoded URI query, not including the ?.
+ *
+ * Warning: This method, unlike other getter methods, returns encoded
+ * value, instead of decoded one.
+ */
+goog.Uri.prototype.getQuery = function() {
+ return this.getEncodedQuery();
+};
+
+
+/**
+ * Sets the value of the named query parameters, clearing previous values for
+ * that key.
+ *
+ * @param {string} key The parameter to set.
+ * @param {*} value The new value.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.setParameterValue = function(key, value) {
+ this.enforceReadOnly();
+ this.queryData_.set(key, value);
+ return this;
+};
+
+
+/**
+ * Sets the values of the named query parameters, clearing previous values for
+ * that key. Not new values will currently be moved to the end of the query
+ * string.
+ *
+ * So, <code>goog.Uri.parse('foo?a=b&c=d&e=f').setParameterValues('c', ['new'])
+ * </code> yields <tt>foo?a=b&e=f&c=new</tt>.</p>
+ *
+ * @param {string} key The parameter to set.
+ * @param {*} values The new values. If values is a single
+ * string then it will be treated as the sole value.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.setParameterValues = function(key, values) {
+ this.enforceReadOnly();
+
+ if (!goog.isArray(values)) {
+ values = [String(values)];
+ }
+
+ this.queryData_.setValues(key, values);
+
+ return this;
+};
+
+
+/**
+ * Returns the value<b>s</b> for a given cgi parameter as a list of decoded
+ * query parameter values.
+ * @param {string} name The parameter to get values for.
+ * @return {!Array<?>} The values for a given cgi parameter as a list of
+ * decoded query parameter values.
+ */
+goog.Uri.prototype.getParameterValues = function(name) {
+ return this.queryData_.getValues(name);
+};
+
+
+/**
+ * Returns the first value for a given cgi parameter or undefined if the given
+ * parameter name does not appear in the query string.
+ * @param {string} paramName Unescaped parameter name.
+ * @return {string|undefined} The first value for a given cgi parameter or
+ * undefined if the given parameter name does not appear in the query
+ * string.
+ */
+goog.Uri.prototype.getParameterValue = function(paramName) {
+ // NOTE(nicksantos): This type-cast is a lie when
+ // preserveParameterTypesCompatibilityFlag is set to true.
+ // But this should only be set to true in tests.
+ return /** @type {string|undefined} */ (this.queryData_.get(paramName));
+};
+
+
+/**
+ * @return {string} The URI fragment, not including the #.
+ */
+goog.Uri.prototype.getFragment = function() {
+ return this.fragment_;
+};
+
+
+/**
+ * Sets the URI fragment.
+ * @throws URIError If opt_decode is true and newFragment is malformed (that is,
+ * if decodeURIComponent fails).
+ * @param {string} newFragment New fragment value.
+ * @param {boolean=} opt_decode Optional param for whether to decode new value.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.setFragment = function(newFragment, opt_decode) {
+ this.enforceReadOnly();
+ this.fragment_ =
+ opt_decode ? goog.Uri.decodeOrEmpty_(newFragment) : newFragment;
+ return this;
+};
+
+
+/**
+ * @return {boolean} Whether the URI has a fragment set.
+ */
+goog.Uri.prototype.hasFragment = function() {
+ return !!this.fragment_;
+};
+
+
+/**
+ * Returns true if this has the same domain as that of uri2.
+ * @param {!goog.Uri} uri2 The URI object to compare to.
+ * @return {boolean} true if same domain; false otherwise.
+ */
+goog.Uri.prototype.hasSameDomainAs = function(uri2) {
+ return ((!this.hasDomain() && !uri2.hasDomain()) ||
+ this.getDomain() == uri2.getDomain()) &&
+ ((!this.hasPort() && !uri2.hasPort()) ||
+ this.getPort() == uri2.getPort());
+};
+
+
+/**
+ * Adds a random parameter to the Uri.
+ * @return {!goog.Uri} Reference to this Uri object.
+ */
+goog.Uri.prototype.makeUnique = function() {
+ this.enforceReadOnly();
+ this.setParameterValue(goog.Uri.RANDOM_PARAM, goog.string.getRandomString());
+
+ return this;
+};
+
+
+/**
+ * Removes the named query parameter.
+ *
+ * @param {string} key The parameter to remove.
+ * @return {!goog.Uri} Reference to this URI object.
+ */
+goog.Uri.prototype.removeParameter = function(key) {
+ this.enforceReadOnly();
+ this.queryData_.remove(key);
+ return this;
+};
+
+
+/**
+ * Sets whether Uri is read only. If this goog.Uri is read-only,
+ * enforceReadOnly_ will be called at the start of any function that may modify
+ * this Uri.
+ * @param {boolean} isReadOnly whether this goog.Uri should be read only.
+ * @return {!goog.Uri} Reference to this Uri object.
+ */
+goog.Uri.prototype.setReadOnly = function(isReadOnly) {
+ this.isReadOnly_ = isReadOnly;
+ return this;
+};
+
+
+/**
+ * @return {boolean} Whether the URI is read only.
+ */
+goog.Uri.prototype.isReadOnly = function() {
+ return this.isReadOnly_;
+};
+
+
+/**
+ * Checks if this Uri has been marked as read only, and if so, throws an error.
+ * This should be called whenever any modifying function is called.
+ */
+goog.Uri.prototype.enforceReadOnly = function() {
+ if (this.isReadOnly_) {
+ throw Error('Tried to modify a read-only Uri');
+ }
+};
+
+
+/**
+ * Sets whether to ignore case.
+ * NOTE: If there are already key/value pairs in the QueryData, and
+ * ignoreCase_ is set to false, the keys will all be lower-cased.
+ * @param {boolean} ignoreCase whether this goog.Uri should ignore case.
+ * @return {!goog.Uri} Reference to this Uri object.
+ */
+goog.Uri.prototype.setIgnoreCase = function(ignoreCase) {
+ this.ignoreCase_ = ignoreCase;
+ if (this.queryData_) {
+ this.queryData_.setIgnoreCase(ignoreCase);
+ }
+ return this;
+};
+
+
+/**
+ * @return {boolean} Whether to ignore case.
+ */
+goog.Uri.prototype.getIgnoreCase = function() {
+ return this.ignoreCase_;
+};
+
+
+//==============================================================================
+// Static members
+//==============================================================================
+
+
+/**
+ * Creates a uri from the string form. Basically an alias of new goog.Uri().
+ * If a Uri object is passed to parse then it will return a clone of the object.
+ *
+ * @throws URIError If parsing the URI is malformed. The passed URI components
+ * should all be parseable by decodeURIComponent.
+ * @param {*} uri Raw URI string or instance of Uri
+ * object.
+ * @param {boolean=} opt_ignoreCase Whether to ignore the case of parameter
+ * names in #getParameterValue.
+ * @return {!goog.Uri} The new URI object.
+ */
+goog.Uri.parse = function(uri, opt_ignoreCase) {
+ return uri instanceof goog.Uri ? uri.clone() :
+ new goog.Uri(uri, opt_ignoreCase);
+};
+
+
+/**
+ * Creates a new goog.Uri object from unencoded parts.
+ *
+ * @param {?string=} opt_scheme Scheme/protocol or full URI to parse.
+ * @param {?string=} opt_userInfo username:password.
+ * @param {?string=} opt_domain www.google.com.
+ * @param {?number=} opt_port 9830.
+ * @param {?string=} opt_path /some/path/to/a/file.html.
+ * @param {string|goog.Uri.QueryData=} opt_query a=1&b=2.
+ * @param {?string=} opt_fragment The fragment without the #.
+ * @param {boolean=} opt_ignoreCase Whether to ignore parameter name case in
+ * #getParameterValue.
+ *
+ * @return {!goog.Uri} The new URI object.
+ */
+goog.Uri.create = function(
+ opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_query,
+ opt_fragment, opt_ignoreCase) {
+
+ var uri = new goog.Uri(null, opt_ignoreCase);
+
+ // Only set the parts if they are defined and not empty strings.
+ opt_scheme && uri.setScheme(opt_scheme);
+ opt_userInfo && uri.setUserInfo(opt_userInfo);
+ opt_domain && uri.setDomain(opt_domain);
+ opt_port && uri.setPort(opt_port);
+ opt_path && uri.setPath(opt_path);
+ opt_query && uri.setQueryData(opt_query);
+ opt_fragment && uri.setFragment(opt_fragment);
+
+ return uri;
+};
+
+
+/**
+ * Resolves a relative Uri against a base Uri, accepting both strings and
+ * Uri objects.
+ *
+ * @param {*} base Base Uri.
+ * @param {*} rel Relative Uri.
+ * @return {!goog.Uri} Resolved uri.
+ */
+goog.Uri.resolve = function(base, rel) {
+ if (!(base instanceof goog.Uri)) {
+ base = goog.Uri.parse(base);
+ }
+
+ if (!(rel instanceof goog.Uri)) {
+ rel = goog.Uri.parse(rel);
+ }
+
+ return base.resolve(rel);
+};
+
+
+/**
+ * Removes dot segments in given path component, as described in
+ * RFC 3986, section 5.2.4.
+ *
+ * @param {string} path A non-empty path component.
+ * @return {string} Path component with removed dot segments.
+ */
+goog.Uri.removeDotSegments = function(path) {
+ if (path == '..' || path == '.') {
+ return '';
+
+ } else if (
+ !goog.string.contains(path, './') && !goog.string.contains(path, '/.')) {
+ // This optimization detects uris which do not contain dot-segments,
+ // and as a consequence do not require any processing.
+ return path;
+
+ } else {
+ var leadingSlash = goog.string.startsWith(path, '/');
+ var segments = path.split('/');
+ var out = [];
+
+ for (var pos = 0; pos < segments.length;) {
+ var segment = segments[pos++];
+
+ if (segment == '.') {
+ if (leadingSlash && pos == segments.length) {
+ out.push('');
+ }
+ } else if (segment == '..') {
+ if (out.length > 1 || out.length == 1 && out[0] != '') {
+ out.pop();
+ }
+ if (leadingSlash && pos == segments.length) {
+ out.push('');
+ }
+ } else {
+ out.push(segment);
+ leadingSlash = true;
+ }
+ }
+
+ return out.join('/');
+ }
+};
+
+
+/**
+ * Decodes a value or returns the empty string if it isn't defined or empty.
+ * @throws URIError If decodeURIComponent fails to decode val.
+ * @param {string|undefined} val Value to decode.
+ * @param {boolean=} opt_preserveReserved If true, restricted characters will
+ * not be decoded.
+ * @return {string} Decoded value.
+ * @private
+ */
+goog.Uri.decodeOrEmpty_ = function(val, opt_preserveReserved) {
+ // Don't use UrlDecode() here because val is not a query parameter.
+ if (!val) {
+ return '';
+ }
+
+ // decodeURI has the same output for '%2f' and '%252f'. We double encode %25
+ // so that we can distinguish between the 2 inputs. This is later undone by
+ // removeDoubleEncoding_.
+ return opt_preserveReserved ? decodeURI(val.replace(/%25/g, '%2525')) :
+ decodeURIComponent(val);
+};
+
+
+/**
+ * If unescapedPart is non null, then escapes any characters in it that aren't
+ * valid characters in a url and also escapes any special characters that
+ * appear in extra.
+ *
+ * @param {*} unescapedPart The string to encode.
+ * @param {RegExp} extra A character set of characters in [\01-\177].
+ * @param {boolean=} opt_removeDoubleEncoding If true, remove double percent
+ * encoding.
+ * @return {?string} null iff unescapedPart == null.
+ * @private
+ */
+goog.Uri.encodeSpecialChars_ = function(
+ unescapedPart, extra, opt_removeDoubleEncoding) {
+ if (goog.isString(unescapedPart)) {
+ var encoded = encodeURI(unescapedPart).replace(extra, goog.Uri.encodeChar_);
+ if (opt_removeDoubleEncoding) {
+ // encodeURI double-escapes %XX sequences used to represent restricted
+ // characters in some URI components, remove the double escaping here.
+ encoded = goog.Uri.removeDoubleEncoding_(encoded);
+ }
+ return encoded;
+ }
+ return null;
+};
+
+
+/**
+ * Converts a character in [\01-\177] to its unicode character equivalent.
+ * @param {string} ch One character string.
+ * @return {string} Encoded string.
+ * @private
+ */
+goog.Uri.encodeChar_ = function(ch) {
+ var n = ch.charCodeAt(0);
+ return '%' + ((n >> 4) & 0xf).toString(16) + (n & 0xf).toString(16);
+};
+
+
+/**
+ * Removes double percent-encoding from a string.
+ * @param {string} doubleEncodedString String
+ * @return {string} String with double encoding removed.
+ * @private
+ */
+goog.Uri.removeDoubleEncoding_ = function(doubleEncodedString) {
+ return doubleEncodedString.replace(/%25([0-9a-fA-F]{2})/g, '%$1');
+};
+
+
+/**
+ * Regular expression for characters that are disallowed in the scheme or
+ * userInfo part of the URI.
+ * @type {RegExp}
+ * @private
+ */
+goog.Uri.reDisallowedInSchemeOrUserInfo_ = /[#\/\?@]/g;
+
+
+/**
+ * Regular expression for characters that are disallowed in a relative path.
+ * Colon is included due to RFC 3986 3.3.
+ * @type {RegExp}
+ * @private
+ */
+goog.Uri.reDisallowedInRelativePath_ = /[\#\?:]/g;
+
+
+/**
+ * Regular expression for characters that are disallowed in an absolute path.
+ * @type {RegExp}
+ * @private
+ */
+goog.Uri.reDisallowedInAbsolutePath_ = /[\#\?]/g;
+
+
+/**
+ * Regular expression for characters that are disallowed in the query.
+ * @type {RegExp}
+ * @private
+ */
+goog.Uri.reDisallowedInQuery_ = /[\#\?@]/g;
+
+
+/**
+ * Regular expression for characters that are disallowed in the fragment.
+ * @type {RegExp}
+ * @private
+ */
+goog.Uri.reDisallowedInFragment_ = /#/g;
+
+
+/**
+ * Checks whether two URIs have the same domain.
+ * @param {string} uri1String First URI string.
+ * @param {string} uri2String Second URI string.
+ * @return {boolean} true if the two URIs have the same domain; false otherwise.
+ */
+goog.Uri.haveSameDomain = function(uri1String, uri2String) {
+ // Differs from goog.uri.utils.haveSameDomain, since this ignores scheme.
+ // TODO(gboyer): Have this just call goog.uri.util.haveSameDomain.
+ var pieces1 = goog.uri.utils.split(uri1String);
+ var pieces2 = goog.uri.utils.split(uri2String);
+ return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] ==
+ pieces2[goog.uri.utils.ComponentIndex.DOMAIN] &&
+ pieces1[goog.uri.utils.ComponentIndex.PORT] ==
+ pieces2[goog.uri.utils.ComponentIndex.PORT];
+};
+
+
+
+/**
+ * Class used to represent URI query parameters. It is essentially a hash of
+ * name-value pairs, though a name can be present more than once.
+ *
+ * Has the same interface as the collections in goog.structs.
+ *
+ * @param {?string=} opt_query Optional encoded query string to parse into
+ * the object.
+ * @param {goog.Uri=} opt_uri Optional uri object that should have its
+ * cache invalidated when this object updates. Deprecated -- this
+ * is no longer required.
+ * @param {boolean=} opt_ignoreCase If true, ignore the case of the parameter
+ * name in #get.
+ * @constructor
+ * @struct
+ * @final
+ */
+goog.Uri.QueryData = function(opt_query, opt_uri, opt_ignoreCase) {
+ /**
+ * The map containing name/value or name/array-of-values pairs.
+ * May be null if it requires parsing from the query string.
+ *
+ * We need to use a Map because we cannot guarantee that the key names will
+ * not be problematic for IE.
+ *
+ * @private {goog.structs.Map<string, !Array<*>>}
+ */
+ this.keyMap_ = null;
+
+ /**
+ * The number of params, or null if it requires computing.
+ * @private {?number}
+ */
+ this.count_ = null;
+
+ /**
+ * Encoded query string, or null if it requires computing from the key map.
+ * @private {?string}
+ */
+ this.encodedQuery_ = opt_query || null;
+
+ /**
+ * If true, ignore the case of the parameter name in #get.
+ * @private {boolean}
+ */
+ this.ignoreCase_ = !!opt_ignoreCase;
+};
+
+
+/**
+ * If the underlying key map is not yet initialized, it parses the
+ * query string and fills the map with parsed data.
+ * @private
+ */
+goog.Uri.QueryData.prototype.ensureKeyMapInitialized_ = function() {
+ if (!this.keyMap_) {
+ this.keyMap_ = new goog.structs.Map();
+ this.count_ = 0;
+ if (this.encodedQuery_) {
+ var self = this;
+ goog.uri.utils.parseQueryData(this.encodedQuery_, function(name, value) {
+ self.add(goog.string.urlDecode(name), value);
+ });
+ }
+ }
+};
+
+
+/**
+ * Creates a new query data instance from a map of names and values.
+ *
+ * @param {!goog.structs.Map<string, ?>|!Object} map Map of string parameter
+ * names to parameter value. If parameter value is an array, it is
+ * treated as if the key maps to each individual value in the
+ * array.
+ * @param {goog.Uri=} opt_uri URI object that should have its cache
+ * invalidated when this object updates.
+ * @param {boolean=} opt_ignoreCase If true, ignore the case of the parameter
+ * name in #get.
+ * @return {!goog.Uri.QueryData} The populated query data instance.
+ */
+goog.Uri.QueryData.createFromMap = function(map, opt_uri, opt_ignoreCase) {
+ var keys = goog.structs.getKeys(map);
+ if (typeof keys == 'undefined') {
+ throw Error('Keys are undefined');
+ }
+
+ var queryData = new goog.Uri.QueryData(null, null, opt_ignoreCase);
+ var values = goog.structs.getValues(map);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var value = values[i];
+ if (!goog.isArray(value)) {
+ queryData.add(key, value);
+ } else {
+ queryData.setValues(key, value);
+ }
+ }
+ return queryData;
+};
+
+
+/**
+ * Creates a new query data instance from parallel arrays of parameter names
+ * and values. Allows for duplicate parameter names. Throws an error if the
+ * lengths of the arrays differ.
+ *
+ * @param {!Array<string>} keys Parameter names.
+ * @param {!Array<?>} values Parameter values.
+ * @param {goog.Uri=} opt_uri URI object that should have its cache
+ * invalidated when this object updates.
+ * @param {boolean=} opt_ignoreCase If true, ignore the case of the parameter
+ * name in #get.
+ * @return {!goog.Uri.QueryData} The populated query data instance.
+ */
+goog.Uri.QueryData.createFromKeysValues = function(
+ keys, values, opt_uri, opt_ignoreCase) {
+ if (keys.length != values.length) {
+ throw Error('Mismatched lengths for keys/values');
+ }
+ var queryData = new goog.Uri.QueryData(null, null, opt_ignoreCase);
+ for (var i = 0; i < keys.length; i++) {
+ queryData.add(keys[i], values[i]);
+ }
+ return queryData;
+};
+
+
+/**
+ * @return {?number} The number of parameters.
+ */
+goog.Uri.QueryData.prototype.getCount = function() {
+ this.ensureKeyMapInitialized_();
+ return this.count_;
+};
+
+
+/**
+ * Adds a key value pair.
+ * @param {string} key Name.
+ * @param {*} value Value.
+ * @return {!goog.Uri.QueryData} Instance of this object.
+ */
+goog.Uri.QueryData.prototype.add = function(key, value) {
+ this.ensureKeyMapInitialized_();
+ this.invalidateCache_();
+
+ key = this.getKeyName_(key);
+ var values = this.keyMap_.get(key);
+ if (!values) {
+ this.keyMap_.set(key, (values = []));
+ }
+ values.push(value);
+ this.count_ = goog.asserts.assertNumber(this.count_) + 1;
+ return this;
+};
+
+
+/**
+ * Removes all the params with the given key.
+ * @param {string} key Name.
+ * @return {boolean} Whether any parameter was removed.
+ */
+goog.Uri.QueryData.prototype.remove = function(key) {
+ this.ensureKeyMapInitialized_();
+
+ key = this.getKeyName_(key);
+ if (this.keyMap_.containsKey(key)) {
+ this.invalidateCache_();
+
+ // Decrement parameter count.
+ this.count_ =
+ goog.asserts.assertNumber(this.count_) - this.keyMap_.get(key).length;
+ return this.keyMap_.remove(key);
+ }
+ return false;
+};
+
+
+/**
+ * Clears the parameters.
+ */
+goog.Uri.QueryData.prototype.clear = function() {
+ this.invalidateCache_();
+ this.keyMap_ = null;
+ this.count_ = 0;
+};
+
+
+/**
+ * @return {boolean} Whether we have any parameters.
+ */
+goog.Uri.QueryData.prototype.isEmpty = function() {
+ this.ensureKeyMapInitialized_();
+ return this.count_ == 0;
+};
+
+
+/**
+ * Whether there is a parameter with the given name
+ * @param {string} key The parameter name to check for.
+ * @return {boolean} Whether there is a parameter with the given name.
+ */
+goog.Uri.QueryData.prototype.containsKey = function(key) {
+ this.ensureKeyMapInitialized_();
+ key = this.getKeyName_(key);
+ return this.keyMap_.containsKey(key);
+};
+
+
+/**
+ * Whether there is a parameter with the given value.
+ * @param {*} value The value to check for.
+ * @return {boolean} Whether there is a parameter with the given value.
+ */
+goog.Uri.QueryData.prototype.containsValue = function(value) {
+ // NOTE(arv): This solution goes through all the params even if it was the
+ // first param. We can get around this by not reusing code or by switching to
+ // iterators.
+ var vals = this.getValues();
+ return goog.array.contains(vals, value);
+};
+
+
+/**
+ * Runs a callback on every key-value pair in the map, including duplicate keys.
+ * This won't maintain original order when duplicate keys are interspersed (like
+ * getKeys() / getValues()).
+ * @param {function(this:SCOPE, ?, string, !goog.Uri.QueryData)} f
+ * @param {SCOPE=} opt_scope The value of "this" inside f.
+ * @template SCOPE
+ */
+goog.Uri.QueryData.prototype.forEach = function(f, opt_scope) {
+ this.ensureKeyMapInitialized_();
+ this.keyMap_.forEach(function(values, key) {
+ goog.array.forEach(values, function(value) {
+ f.call(opt_scope, value, key, this);
+ }, this);
+ }, this);
+};
+
+
+/**
+ * Returns all the keys of the parameters. If a key is used multiple times
+ * it will be included multiple times in the returned array
+ * @return {!Array<string>} All the keys of the parameters.
+ */
+goog.Uri.QueryData.prototype.getKeys = function() {
+ this.ensureKeyMapInitialized_();
+ // We need to get the values to know how many keys to add.
+ var vals = this.keyMap_.getValues();
+ var keys = this.keyMap_.getKeys();
+ var rv = [];
+ for (var i = 0; i < keys.length; i++) {
+ var val = vals[i];
+ for (var j = 0; j < val.length; j++) {
+ rv.push(keys[i]);
+ }
+ }
+ return rv;
+};
+
+
+/**
+ * Returns all the values of the parameters with the given name. If the query
+ * data has no such key this will return an empty array. If no key is given
+ * all values wil be returned.
+ * @param {string=} opt_key The name of the parameter to get the values for.
+ * @return {!Array<?>} All the values of the parameters with the given name.
+ */
+goog.Uri.QueryData.prototype.getValues = function(opt_key) {
+ this.ensureKeyMapInitialized_();
+ var rv = [];
+ if (goog.isString(opt_key)) {
+ if (this.containsKey(opt_key)) {
+ rv = goog.array.concat(rv, this.keyMap_.get(this.getKeyName_(opt_key)));
+ }
+ } else {
+ // Return all values.
+ var values = this.keyMap_.getValues();
+ for (var i = 0; i < values.length; i++) {
+ rv = goog.array.concat(rv, values[i]);
+ }
+ }
+ return rv;
+};
+
+
+/**
+ * Sets a key value pair and removes all other keys with the same value.
+ *
+ * @param {string} key Name.
+ * @param {*} value Value.
+ * @return {!goog.Uri.QueryData} Instance of this object.
+ */
+goog.Uri.QueryData.prototype.set = function(key, value) {
+ this.ensureKeyMapInitialized_();
+ this.invalidateCache_();
+
+ // TODO(chrishenry): This could be better written as
+ // this.remove(key), this.add(key, value), but that would reorder
+ // the key (since the key is first removed and then added at the
+ // end) and we would have to fix unit tests that depend on key
+ // ordering.
+ key = this.getKeyName_(key);
+ if (this.containsKey(key)) {
+ this.count_ =
+ goog.asserts.assertNumber(this.count_) - this.keyMap_.get(key).length;
+ }
+ this.keyMap_.set(key, [value]);
+ this.count_ = goog.asserts.assertNumber(this.count_) + 1;
+ return this;
+};
+
+
+/**
+ * Returns the first value associated with the key. If the query data has no
+ * such key this will return undefined or the optional default.
+ * @param {string} key The name of the parameter to get the value for.
+ * @param {*=} opt_default The default value to return if the query data
+ * has no such key.
+ * @return {*} The first string value associated with the key, or opt_default
+ * if there's no value.
+ */
+goog.Uri.QueryData.prototype.get = function(key, opt_default) {
+ var values = key ? this.getValues(key) : [];
+ if (goog.Uri.preserveParameterTypesCompatibilityFlag) {
+ return values.length > 0 ? values[0] : opt_default;
+ } else {
+ return values.length > 0 ? String(values[0]) : opt_default;
+ }
+};
+
+
+/**
+ * Sets the values for a key. If the key already exists, this will
+ * override all of the existing values that correspond to the key.
+ * @param {string} key The key to set values for.
+ * @param {!Array<?>} values The values to set.
+ */
+goog.Uri.QueryData.prototype.setValues = function(key, values) {
+ this.remove(key);
+
+ if (values.length > 0) {
+ this.invalidateCache_();
+ this.keyMap_.set(this.getKeyName_(key), goog.array.clone(values));
+ this.count_ = goog.asserts.assertNumber(this.count_) + values.length;
+ }
+};
+
+
+/**
+ * @return {string} Encoded query string.
+ * @override
+ */
+goog.Uri.QueryData.prototype.toString = function() {
+ if (this.encodedQuery_) {
+ return this.encodedQuery_;
+ }
+
+ if (!this.keyMap_) {
+ return '';
+ }
+
+ var sb = [];
+
+ // In the past, we use this.getKeys() and this.getVals(), but that
+ // generates a lot of allocations as compared to simply iterating
+ // over the keys.
+ var keys = this.keyMap_.getKeys();
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var encodedKey = goog.string.urlEncode(key);
+ var val = this.getValues(key);
+ for (var j = 0; j < val.length; j++) {
+ var param = encodedKey;
+ // Ensure that null and undefined are encoded into the url as
+ // literal strings.
+ if (val[j] !== '') {
+ param += '=' + goog.string.urlEncode(val[j]);
+ }
+ sb.push(param);
+ }
+ }
+
+ return this.encodedQuery_ = sb.join('&');
+};
+
+
+/**
+ * @throws URIError If URI is malformed (that is, if decodeURIComponent fails on
+ * any of the URI components).
+ * @return {string} Decoded query string.
+ */
+goog.Uri.QueryData.prototype.toDecodedString = function() {
+ return goog.Uri.decodeOrEmpty_(this.toString());
+};
+
+
+/**
+ * Invalidate the cache.
+ * @private
+ */
+goog.Uri.QueryData.prototype.invalidateCache_ = function() {
+ this.encodedQuery_ = null;
+};
+
+
+/**
+ * Removes all keys that are not in the provided list. (Modifies this object.)
+ * @param {Array<string>} keys The desired keys.
+ * @return {!goog.Uri.QueryData} a reference to this object.
+ */
+goog.Uri.QueryData.prototype.filterKeys = function(keys) {
+ this.ensureKeyMapInitialized_();
+ this.keyMap_.forEach(function(value, key) {
+ if (!goog.array.contains(keys, key)) {
+ this.remove(key);
+ }
+ }, this);
+ return this;
+};
+
+
+/**
+ * Clone the query data instance.
+ * @return {!goog.Uri.QueryData} New instance of the QueryData object.
+ */
+goog.Uri.QueryData.prototype.clone = function() {
+ var rv = new goog.Uri.QueryData();
+ rv.encodedQuery_ = this.encodedQuery_;
+ if (this.keyMap_) {
+ rv.keyMap_ = this.keyMap_.clone();
+ rv.count_ = this.count_;
+ }
+ return rv;
+};
+
+
+/**
+ * Helper function to get the key name from a JavaScript object. Converts
+ * the object to a string, and to lower case if necessary.
+ * @private
+ * @param {*} arg The object to get a key name from.
+ * @return {string} valid key name which can be looked up in #keyMap_.
+ */
+goog.Uri.QueryData.prototype.getKeyName_ = function(arg) {
+ var keyName = String(arg);
+ if (this.ignoreCase_) {
+ keyName = keyName.toLowerCase();
+ }
+ return keyName;
+};
+
+
+/**
+ * Ignore case in parameter names.
+ * NOTE: If there are already key/value pairs in the QueryData, and
+ * ignoreCase_ is set to false, the keys will all be lower-cased.
+ * @param {boolean} ignoreCase whether this goog.Uri should ignore case.
+ */
+goog.Uri.QueryData.prototype.setIgnoreCase = function(ignoreCase) {
+ var resetKeys = ignoreCase && !this.ignoreCase_;
+ if (resetKeys) {
+ this.ensureKeyMapInitialized_();
+ this.invalidateCache_();
+ this.keyMap_.forEach(function(value, key) {
+ var lowerCase = key.toLowerCase();
+ if (key != lowerCase) {
+ this.remove(key);
+ this.setValues(lowerCase, value);
+ }
+ }, this);
+ }
+ this.ignoreCase_ = ignoreCase;
+};
+
+
+/**
+ * Extends a query data object with another query data or map like object. This
+ * operates 'in-place', it does not create a new QueryData object.
+ *
+ * @param {...(?goog.Uri.QueryData|?goog.structs.Map<?, ?>|?Object)} var_args
+ * The object from which key value pairs will be copied.
+ * @suppress {deprecated} Use deprecated goog.structs.forEach to allow different
+ * types of parameters.
+ */
+goog.Uri.QueryData.prototype.extend = function(var_args) {
+ for (var i = 0; i < arguments.length; i++) {
+ var data = arguments[i];
+ goog.structs.forEach(
+ data, function(value, key) { this.add(key, value); }, this);
+ }
+};
diff --git a/src/http/static/viz/2/goog/uri/utils.js b/src/http/static/viz/2/goog/uri/utils.js
new file mode 100644
index 0000000..3b8917a
--- /dev/null
+++ b/src/http/static/viz/2/goog/uri/utils.js
@@ -0,0 +1,1103 @@
+// Copyright 2008 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Simple utilities for dealing with URI strings.
+ *
+ * This is intended to be a lightweight alternative to constructing goog.Uri
+ * objects. Whereas goog.Uri adds several kilobytes to the binary regardless
+ * of how much of its functionality you use, this is designed to be a set of
+ * mostly-independent utilities so that the compiler includes only what is
+ * necessary for the task. Estimated savings of porting is 5k pre-gzip and
+ * 1.5k post-gzip. To ensure the savings remain, future developers should
+ * avoid adding new functionality to existing functions, but instead create
+ * new ones and factor out shared code.
+ *
+ * Many of these utilities have limited functionality, tailored to common
+ * cases. The query parameter utilities assume that the parameter keys are
+ * already encoded, since most keys are compile-time alphanumeric strings. The
+ * query parameter mutation utilities also do not tolerate fragment identifiers.
+ *
+ * By design, these functions can be slower than goog.Uri equivalents.
+ * Repeated calls to some of functions may be quadratic in behavior for IE,
+ * although the effect is somewhat limited given the 2kb limit.
+ *
+ * One advantage of the limited functionality here is that this approach is
+ * less sensitive to differences in URI encodings than goog.Uri, since these
+ * functions operate on strings directly, rather than decoding them and
+ * then re-encoding.
+ *
+ * Uses features of RFC 3986 for parsing/formatting URIs:
+ * http://www.ietf.org/rfc/rfc3986.txt
+ *
+ * @author gboyer@google.com (Garrett Boyer) - The "lightened" design.
+ * @author msamuel@google.com (Mike Samuel) - Domain knowledge and regexes.
+ */
+
+goog.provide('goog.uri.utils');
+goog.provide('goog.uri.utils.ComponentIndex');
+goog.provide('goog.uri.utils.QueryArray');
+goog.provide('goog.uri.utils.QueryValue');
+goog.provide('goog.uri.utils.StandardQueryParam');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.string');
+
+
+/**
+ * Character codes inlined to avoid object allocations due to charCode.
+ * @enum {number}
+ * @private
+ */
+goog.uri.utils.CharCode_ = {
+ AMPERSAND: 38,
+ EQUAL: 61,
+ HASH: 35,
+ QUESTION: 63
+};
+
+
+/**
+ * Builds a URI string from already-encoded parts.
+ *
+ * No encoding is performed. Any component may be omitted as either null or
+ * undefined.
+ *
+ * @param {?string=} opt_scheme The scheme such as 'http'.
+ * @param {?string=} opt_userInfo The user name before the '@'.
+ * @param {?string=} opt_domain The domain such as 'www.google.com', already
+ * URI-encoded.
+ * @param {(string|number|null)=} opt_port The port number.
+ * @param {?string=} opt_path The path, already URI-encoded. If it is not
+ * empty, it must begin with a slash.
+ * @param {?string=} opt_queryData The URI-encoded query data.
+ * @param {?string=} opt_fragment The URI-encoded fragment identifier.
+ * @return {string} The fully combined URI.
+ */
+goog.uri.utils.buildFromEncodedParts = function(
+ opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData,
+ opt_fragment) {
+ var out = '';
+
+ if (opt_scheme) {
+ out += opt_scheme + ':';
+ }
+
+ if (opt_domain) {
+ out += '//';
+
+ if (opt_userInfo) {
+ out += opt_userInfo + '@';
+ }
+
+ out += opt_domain;
+
+ if (opt_port) {
+ out += ':' + opt_port;
+ }
+ }
+
+ if (opt_path) {
+ out += opt_path;
+ }
+
+ if (opt_queryData) {
+ out += '?' + opt_queryData;
+ }
+
+ if (opt_fragment) {
+ out += '#' + opt_fragment;
+ }
+
+ return out;
+};
+
+
+/**
+ * A regular expression for breaking a URI into its component parts.
+ *
+ * {@link http://www.ietf.org/rfc/rfc3986.txt} says in Appendix B
+ * As the "first-match-wins" algorithm is identical to the "greedy"
+ * disambiguation method used by POSIX regular expressions, it is natural and
+ * commonplace to use a regular expression for parsing the potential five
+ * components of a URI reference.
+ *
+ * The following line is the regular expression for breaking-down a
+ * well-formed URI reference into its components.
+ *
+ * <pre>
+ * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
+ * 12 3 4 5 6 7 8 9
+ * </pre>
+ *
+ * The numbers in the second line above are only to assist readability; they
+ * indicate the reference points for each subexpression (i.e., each paired
+ * parenthesis). We refer to the value matched for subexpression <n> as $<n>.
+ * For example, matching the above expression to
+ * <pre>
+ * http://www.ics.uci.edu/pub/ietf/uri/#Related
+ * </pre>
+ * results in the following subexpression matches:
+ * <pre>
+ * $1 = http:
+ * $2 = http
+ * $3 = //www.ics.uci.edu
+ * $4 = www.ics.uci.edu
+ * $5 = /pub/ietf/uri/
+ * $6 = <undefined>
+ * $7 = <undefined>
+ * $8 = #Related
+ * $9 = Related
+ * </pre>
+ * where <undefined> indicates that the component is not present, as is the
+ * case for the query component in the above example. Therefore, we can
+ * determine the value of the five components as
+ * <pre>
+ * scheme = $2
+ * authority = $4
+ * path = $5
+ * query = $7
+ * fragment = $9
+ * </pre>
+ *
+ * The regular expression has been modified slightly to expose the
+ * userInfo, domain, and port separately from the authority.
+ * The modified version yields
+ * <pre>
+ * $1 = http scheme
+ * $2 = <undefined> userInfo -\
+ * $3 = www.ics.uci.edu domain | authority
+ * $4 = <undefined> port -/
+ * $5 = /pub/ietf/uri/ path
+ * $6 = <undefined> query without ?
+ * $7 = Related fragment without #
+ * </pre>
+ * @type {!RegExp}
+ * @private
+ */
+goog.uri.utils.splitRe_ = new RegExp(
+ '^' +
+ '(?:' +
+ '([^:/?#.]+)' + // scheme - ignore special characters
+ // used by other URL parts such as :,
+ // ?, /, #, and .
+ ':)?' +
+ '(?://' +
+ '(?:([^/?#]*)@)?' + // userInfo
+ '([^/#?]*?)' + // domain
+ '(?::([0-9]+))?' + // port
+ '(?=[/#?]|$)' + // authority-terminating character
+ ')?' +
+ '([^?#]+)?' + // path
+ '(?:\\?([^#]*))?' + // query
+ '(?:#([\\s\\S]*))?' + // fragment
+ '$');
+
+
+/**
+ * The index of each URI component in the return value of goog.uri.utils.split.
+ * @enum {number}
+ */
+goog.uri.utils.ComponentIndex = {
+ SCHEME: 1,
+ USER_INFO: 2,
+ DOMAIN: 3,
+ PORT: 4,
+ PATH: 5,
+ QUERY_DATA: 6,
+ FRAGMENT: 7
+};
+
+
+/**
+ * Splits a URI into its component parts.
+ *
+ * Each component can be accessed via the component indices; for example:
+ * <pre>
+ * goog.uri.utils.split(someStr)[goog.uri.utils.ComponentIndex.QUERY_DATA];
+ * </pre>
+ *
+ * @param {string} uri The URI string to examine.
+ * @return {!Array<string|undefined>} Each component still URI-encoded.
+ * Each component that is present will contain the encoded value, whereas
+ * components that are not present will be undefined or empty, depending
+ * on the browser's regular expression implementation. Never null, since
+ * arbitrary strings may still look like path names.
+ */
+goog.uri.utils.split = function(uri) {
+ // See @return comment -- never null.
+ return /** @type {!Array<string|undefined>} */ (
+ uri.match(goog.uri.utils.splitRe_));
+};
+
+
+/**
+ * @param {?string} uri A possibly null string.
+ * @param {boolean=} opt_preserveReserved If true, percent-encoding of RFC-3986
+ * reserved characters will not be removed.
+ * @return {?string} The string URI-decoded, or null if uri is null.
+ * @private
+ */
+goog.uri.utils.decodeIfPossible_ = function(uri, opt_preserveReserved) {
+ if (!uri) {
+ return uri;
+ }
+
+ return opt_preserveReserved ? decodeURI(uri) : decodeURIComponent(uri);
+};
+
+
+/**
+ * Gets a URI component by index.
+ *
+ * It is preferred to use the getPathEncoded() variety of functions ahead,
+ * since they are more readable.
+ *
+ * @param {goog.uri.utils.ComponentIndex} componentIndex The component index.
+ * @param {string} uri The URI to examine.
+ * @return {?string} The still-encoded component, or null if the component
+ * is not present.
+ * @private
+ */
+goog.uri.utils.getComponentByIndex_ = function(componentIndex, uri) {
+ // Convert undefined, null, and empty string into null.
+ return goog.uri.utils.split(uri)[componentIndex] || null;
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?string} The protocol or scheme, or null if none. Does not
+ * include trailing colons or slashes.
+ */
+goog.uri.utils.getScheme = function(uri) {
+ return goog.uri.utils.getComponentByIndex_(
+ goog.uri.utils.ComponentIndex.SCHEME, uri);
+};
+
+
+/**
+ * Gets the effective scheme for the URL. If the URL is relative then the
+ * scheme is derived from the page's location.
+ * @param {string} uri The URI to examine.
+ * @return {string} The protocol or scheme, always lower case.
+ */
+goog.uri.utils.getEffectiveScheme = function(uri) {
+ var scheme = goog.uri.utils.getScheme(uri);
+ if (!scheme && goog.global.self && goog.global.self.location) {
+ var protocol = goog.global.self.location.protocol;
+ scheme = protocol.substr(0, protocol.length - 1);
+ }
+ // NOTE: When called from a web worker in Firefox 3.5, location maybe null.
+ // All other browsers with web workers support self.location from the worker.
+ return scheme ? scheme.toLowerCase() : '';
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?string} The user name still encoded, or null if none.
+ */
+goog.uri.utils.getUserInfoEncoded = function(uri) {
+ return goog.uri.utils.getComponentByIndex_(
+ goog.uri.utils.ComponentIndex.USER_INFO, uri);
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?string} The decoded user info, or null if none.
+ */
+goog.uri.utils.getUserInfo = function(uri) {
+ return goog.uri.utils.decodeIfPossible_(
+ goog.uri.utils.getUserInfoEncoded(uri));
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?string} The domain name still encoded, or null if none.
+ */
+goog.uri.utils.getDomainEncoded = function(uri) {
+ return goog.uri.utils.getComponentByIndex_(
+ goog.uri.utils.ComponentIndex.DOMAIN, uri);
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?string} The decoded domain, or null if none.
+ */
+goog.uri.utils.getDomain = function(uri) {
+ return goog.uri.utils.decodeIfPossible_(
+ goog.uri.utils.getDomainEncoded(uri), true /* opt_preserveReserved */);
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?number} The port number, or null if none.
+ */
+goog.uri.utils.getPort = function(uri) {
+ // Coerce to a number. If the result of getComponentByIndex_ is null or
+ // non-numeric, the number coersion yields NaN. This will then return
+ // null for all non-numeric cases (though also zero, which isn't a relevant
+ // port number).
+ return Number(
+ goog.uri.utils.getComponentByIndex_(
+ goog.uri.utils.ComponentIndex.PORT, uri)) ||
+ null;
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?string} The path still encoded, or null if none. Includes the
+ * leading slash, if any.
+ */
+goog.uri.utils.getPathEncoded = function(uri) {
+ return goog.uri.utils.getComponentByIndex_(
+ goog.uri.utils.ComponentIndex.PATH, uri);
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?string} The decoded path, or null if none. Includes the leading
+ * slash, if any.
+ */
+goog.uri.utils.getPath = function(uri) {
+ return goog.uri.utils.decodeIfPossible_(
+ goog.uri.utils.getPathEncoded(uri), true /* opt_preserveReserved */);
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?string} The query data still encoded, or null if none. Does not
+ * include the question mark itself.
+ */
+goog.uri.utils.getQueryData = function(uri) {
+ return goog.uri.utils.getComponentByIndex_(
+ goog.uri.utils.ComponentIndex.QUERY_DATA, uri);
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?string} The fragment identifier, or null if none. Does not
+ * include the hash mark itself.
+ */
+goog.uri.utils.getFragmentEncoded = function(uri) {
+ // The hash mark may not appear in any other part of the URL.
+ var hashIndex = uri.indexOf('#');
+ return hashIndex < 0 ? null : uri.substr(hashIndex + 1);
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @param {?string} fragment The encoded fragment identifier, or null if none.
+ * Does not include the hash mark itself.
+ * @return {string} The URI with the fragment set.
+ */
+goog.uri.utils.setFragmentEncoded = function(uri, fragment) {
+ return goog.uri.utils.removeFragment(uri) + (fragment ? '#' + fragment : '');
+};
+
+
+/**
+ * @param {string} uri The URI to examine.
+ * @return {?string} The decoded fragment identifier, or null if none. Does
+ * not include the hash mark.
+ */
+goog.uri.utils.getFragment = function(uri) {
+ return goog.uri.utils.decodeIfPossible_(
+ goog.uri.utils.getFragmentEncoded(uri));
+};
+
+
+/**
+ * Extracts everything up to the port of the URI.
+ * @param {string} uri The URI string.
+ * @return {string} Everything up to and including the port.
+ */
+goog.uri.utils.getHost = function(uri) {
+ var pieces = goog.uri.utils.split(uri);
+ return goog.uri.utils.buildFromEncodedParts(
+ pieces[goog.uri.utils.ComponentIndex.SCHEME],
+ pieces[goog.uri.utils.ComponentIndex.USER_INFO],
+ pieces[goog.uri.utils.ComponentIndex.DOMAIN],
+ pieces[goog.uri.utils.ComponentIndex.PORT]);
+};
+
+
+/**
+ * Returns the origin for a given URL.
+ * @param {string} uri The URI string.
+ * @return {string} Everything up to and including the port.
+ */
+goog.uri.utils.getOrigin = function(uri) {
+ var pieces = goog.uri.utils.split(uri);
+ return goog.uri.utils.buildFromEncodedParts(
+ pieces[goog.uri.utils.ComponentIndex.SCHEME], null /* opt_userInfo */,
+ pieces[goog.uri.utils.ComponentIndex.DOMAIN],
+ pieces[goog.uri.utils.ComponentIndex.PORT]);
+};
+
+
+/**
+ * Extracts the path of the URL and everything after.
+ * @param {string} uri The URI string.
+ * @return {string} The URI, starting at the path and including the query
+ * parameters and fragment identifier.
+ */
+goog.uri.utils.getPathAndAfter = function(uri) {
+ var pieces = goog.uri.utils.split(uri);
+ return goog.uri.utils.buildFromEncodedParts(
+ null, null, null, null, pieces[goog.uri.utils.ComponentIndex.PATH],
+ pieces[goog.uri.utils.ComponentIndex.QUERY_DATA],
+ pieces[goog.uri.utils.ComponentIndex.FRAGMENT]);
+};
+
+
+/**
+ * Gets the URI with the fragment identifier removed.
+ * @param {string} uri The URI to examine.
+ * @return {string} Everything preceding the hash mark.
+ */
+goog.uri.utils.removeFragment = function(uri) {
+ // The hash mark may not appear in any other part of the URL.
+ var hashIndex = uri.indexOf('#');
+ return hashIndex < 0 ? uri : uri.substr(0, hashIndex);
+};
+
+
+/**
+ * Ensures that two URI's have the exact same domain, scheme, and port.
+ *
+ * Unlike the version in goog.Uri, this checks protocol, and therefore is
+ * suitable for checking against the browser's same-origin policy.
+ *
+ * @param {string} uri1 The first URI.
+ * @param {string} uri2 The second URI.
+ * @return {boolean} Whether they have the same scheme, domain and port.
+ */
+goog.uri.utils.haveSameDomain = function(uri1, uri2) {
+ var pieces1 = goog.uri.utils.split(uri1);
+ var pieces2 = goog.uri.utils.split(uri2);
+ return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] ==
+ pieces2[goog.uri.utils.ComponentIndex.DOMAIN] &&
+ pieces1[goog.uri.utils.ComponentIndex.SCHEME] ==
+ pieces2[goog.uri.utils.ComponentIndex.SCHEME] &&
+ pieces1[goog.uri.utils.ComponentIndex.PORT] ==
+ pieces2[goog.uri.utils.ComponentIndex.PORT];
+};
+
+
+/**
+ * Asserts that there are no fragment or query identifiers, only in uncompiled
+ * mode.
+ * @param {string} uri The URI to examine.
+ * @private
+ */
+goog.uri.utils.assertNoFragmentsOrQueries_ = function(uri) {
+ goog.asserts.assert(
+ uri.indexOf('#') < 0 && uri.indexOf('?') < 0,
+ 'goog.uri.utils: Fragment or query identifiers are not supported: [%s]',
+ uri);
+};
+
+
+/**
+ * Supported query parameter values by the parameter serializing utilities.
+ *
+ * If a value is null or undefined, the key-value pair is skipped, as an easy
+ * way to omit parameters conditionally. Non-array parameters are converted
+ * to a string and URI encoded. Array values are expanded into multiple
+ * &key=value pairs, with each element stringized and URI-encoded.
+ *
+ * @typedef {*}
+ */
+goog.uri.utils.QueryValue;
+
+
+/**
+ * An array representing a set of query parameters with alternating keys
+ * and values.
+ *
+ * Keys are assumed to be URI encoded already and live at even indices. See
+ * goog.uri.utils.QueryValue for details on how parameter values are encoded.
+ *
+ * Example:
+ * <pre>
+ * var data = [
+ * // Simple param: ?name=BobBarker
+ * 'name', 'BobBarker',
+ * // Conditional param -- may be omitted entirely.
+ * 'specialDietaryNeeds', hasDietaryNeeds() ? getDietaryNeeds() : null,
+ * // Multi-valued param: &house=LosAngeles&house=NewYork&house=null
+ * 'house', ['LosAngeles', 'NewYork', null]
+ * ];
+ * </pre>
+ *
+ * @typedef {!Array<string|goog.uri.utils.QueryValue>}
+ */
+goog.uri.utils.QueryArray;
+
+
+/**
+ * Parses encoded query parameters and calls callback function for every
+ * parameter found in the string.
+ *
+ * Missing value of parameter (e.g. “…&key&…”) is treated as if the value was an
+ * empty string. Keys may be empty strings (e.g. “…&=value&…”) which also means
+ * that “…&=&…” and “…&&…” will result in an empty key and value.
+ *
+ * @param {string} encodedQuery Encoded query string excluding question mark at
+ * the beginning.
+ * @param {function(string, string)} callback Function called for every
+ * parameter found in query string. The first argument (name) will not be
+ * urldecoded (so the function is consistent with buildQueryData), but the
+ * second will. If the parameter has no value (i.e. “=” was not present)
+ * the second argument (value) will be an empty string.
+ */
+goog.uri.utils.parseQueryData = function(encodedQuery, callback) {
+ if (!encodedQuery) {
+ return;
+ }
+ var pairs = encodedQuery.split('&');
+ for (var i = 0; i < pairs.length; i++) {
+ var indexOfEquals = pairs[i].indexOf('=');
+ var name = null;
+ var value = null;
+ if (indexOfEquals >= 0) {
+ name = pairs[i].substring(0, indexOfEquals);
+ value = pairs[i].substring(indexOfEquals + 1);
+ } else {
+ name = pairs[i];
+ }
+ callback(name, value ? goog.string.urlDecode(value) : '');
+ }
+};
+
+
+/**
+ * Split the URI into 3 parts where the [1] is the queryData without a leading
+ * '?'. For example, the URI http://foo.com/bar?a=b#abc returns
+ * ['http://foo.com/bar','a=b','#abc'].
+ * @param {string} uri The URI to parse.
+ * @return {!Array<string>} An array representation of uri of length 3 where the
+ * middle value is the queryData without a leading '?'.
+ * @private
+ */
+goog.uri.utils.splitQueryData_ = function(uri) {
+ // Find the query data and and hash.
+ var hashIndex = uri.indexOf('#');
+ if (hashIndex < 0) {
+ hashIndex = uri.length;
+ }
+ var questionIndex = uri.indexOf('?');
+ var queryData;
+ if (questionIndex < 0 || questionIndex > hashIndex) {
+ questionIndex = hashIndex;
+ queryData = '';
+ } else {
+ queryData = uri.substring(questionIndex + 1, hashIndex);
+ }
+ return [uri.substr(0, questionIndex), queryData, uri.substr(hashIndex)];
+};
+
+
+/**
+ * Join an array created by splitQueryData_ back into a URI.
+ * @param {!Array<string>} parts A URI in the form generated by splitQueryData_.
+ * @return {string} The joined URI.
+ * @private
+ */
+goog.uri.utils.joinQueryData_ = function(parts) {
+ return parts[0] + (parts[1] ? '?' + parts[1] : '') + parts[2];
+};
+
+
+/**
+ * @param {string} queryData
+ * @param {string} newData
+ * @return {string}
+ * @private
+ */
+goog.uri.utils.appendQueryData_ = function(queryData, newData) {
+ if (!newData) {
+ return queryData;
+ }
+ return queryData ? queryData + '&' + newData : newData;
+};
+
+
+/**
+ * @param {string} uri
+ * @param {string} queryData
+ * @return {string}
+ * @private
+ */
+goog.uri.utils.appendQueryDataToUri_ = function(uri, queryData) {
+ if (!queryData) {
+ return uri;
+ }
+ var parts = goog.uri.utils.splitQueryData_(uri);
+ parts[1] = goog.uri.utils.appendQueryData_(parts[1], queryData);
+ return goog.uri.utils.joinQueryData_(parts);
+};
+
+
+/**
+ * Appends key=value pairs to an array, supporting multi-valued objects.
+ * @param {*} key The key prefix.
+ * @param {goog.uri.utils.QueryValue} value The value to serialize.
+ * @param {!Array<string>} pairs The array to which the 'key=value' strings
+ * should be appended.
+ * @private
+ */
+goog.uri.utils.appendKeyValuePairs_ = function(key, value, pairs) {
+ goog.asserts.assertString(key);
+ if (goog.isArray(value)) {
+ // Convince the compiler it's an array.
+ goog.asserts.assertArray(value);
+ for (var j = 0; j < value.length; j++) {
+ // Convert to string explicitly, to short circuit the null and array
+ // logic in this function -- this ensures that null and undefined get
+ // written as literal 'null' and 'undefined', and arrays don't get
+ // expanded out but instead encoded in the default way.
+ goog.uri.utils.appendKeyValuePairs_(key, String(value[j]), pairs);
+ }
+ } else if (value != null) {
+ // Skip a top-level null or undefined entirely.
+ pairs.push(
+ key +
+ // Check for empty string. Zero gets encoded into the url as literal
+ // strings. For empty string, skip the equal sign, to be consistent
+ // with UriBuilder.java.
+ (value === '' ? '' : '=' + goog.string.urlEncode(value)));
+ }
+};
+
+
+/**
+ * Builds a query data string from a sequence of alternating keys and values.
+ * Currently generates "&key&" for empty args.
+ *
+ * @param {!IArrayLike<string|goog.uri.utils.QueryValue>} keysAndValues
+ * Alternating keys and values. See the QueryArray typedef.
+ * @param {number=} opt_startIndex A start offset into the arary, defaults to 0.
+ * @return {string} The encoded query string, in the form 'a=1&b=2'.
+ */
+goog.uri.utils.buildQueryData = function(keysAndValues, opt_startIndex) {
+ goog.asserts.assert(
+ Math.max(keysAndValues.length - (opt_startIndex || 0), 0) % 2 == 0,
+ 'goog.uri.utils: Key/value lists must be even in length.');
+
+ var params = [];
+ for (var i = opt_startIndex || 0; i < keysAndValues.length; i += 2) {
+ var key = /** @type {string} */ (keysAndValues[i]);
+ goog.uri.utils.appendKeyValuePairs_(key, keysAndValues[i + 1], params);
+ }
+ return params.join('&');
+};
+
+
+/**
+ * Builds a query data string from a map.
+ * Currently generates "&key&" for empty args.
+ *
+ * @param {!Object<string, goog.uri.utils.QueryValue>} map An object where keys
+ * are URI-encoded parameter keys, and the values are arbitrary types
+ * or arrays. Keys with a null value are dropped.
+ * @return {string} The encoded query string, in the form 'a=1&b=2'.
+ */
+goog.uri.utils.buildQueryDataFromMap = function(map) {
+ var params = [];
+ for (var key in map) {
+ goog.uri.utils.appendKeyValuePairs_(key, map[key], params);
+ }
+ return params.join('&');
+};
+
+
+/**
+ * Appends URI parameters to an existing URI.
+ *
+ * The variable arguments may contain alternating keys and values. Keys are
+ * assumed to be already URI encoded. The values should not be URI-encoded,
+ * and will instead be encoded by this function.
+ * <pre>
+ * appendParams('http://www.foo.com?existing=true',
+ * 'key1', 'value1',
+ * 'key2', 'value?willBeEncoded',
+ * 'key3', ['valueA', 'valueB', 'valueC'],
+ * 'key4', null);
+ * result: 'http://www.foo.com?existing=true&' +
+ * 'key1=value1&' +
+ * 'key2=value%3FwillBeEncoded&' +
+ * 'key3=valueA&key3=valueB&key3=valueC'
+ * </pre>
+ *
+ * A single call to this function will not exhibit quadratic behavior in IE,
+ * whereas multiple repeated calls may, although the effect is limited by
+ * fact that URL's generally can't exceed 2kb.
+ *
+ * @param {string} uri The original URI, which may already have query data.
+ * @param {...(goog.uri.utils.QueryArray|goog.uri.utils.QueryValue)}
+ * var_args
+ * An array or argument list conforming to goog.uri.utils.QueryArray.
+ * @return {string} The URI with all query parameters added.
+ */
+goog.uri.utils.appendParams = function(uri, var_args) {
+ var queryData = arguments.length == 2 ?
+ goog.uri.utils.buildQueryData(arguments[1], 0) :
+ goog.uri.utils.buildQueryData(arguments, 1);
+ return goog.uri.utils.appendQueryDataToUri_(uri, queryData);
+};
+
+
+/**
+ * Appends query parameters from a map.
+ *
+ * @param {string} uri The original URI, which may already have query data.
+ * @param {!Object<goog.uri.utils.QueryValue>} map An object where keys are
+ * URI-encoded parameter keys, and the values are arbitrary types or arrays.
+ * Keys with a null value are dropped.
+ * @return {string} The new parameters.
+ */
+goog.uri.utils.appendParamsFromMap = function(uri, map) {
+ var queryData = goog.uri.utils.buildQueryDataFromMap(map);
+ return goog.uri.utils.appendQueryDataToUri_(uri, queryData);
+};
+
+
+/**
+ * Appends a single URI parameter.
+ *
+ * Repeated calls to this can exhibit quadratic behavior in IE6 due to the
+ * way string append works, though it should be limited given the 2kb limit.
+ *
+ * @param {string} uri The original URI, which may already have query data.
+ * @param {string} key The key, which must already be URI encoded.
+ * @param {*=} opt_value The value, which will be stringized and encoded
+ * (assumed not already to be encoded). If omitted, undefined, or null, the
+ * key will be added as a valueless parameter.
+ * @return {string} The URI with the query parameter added.
+ */
+goog.uri.utils.appendParam = function(uri, key, opt_value) {
+ var value = goog.isDefAndNotNull(opt_value) ?
+ '=' + goog.string.urlEncode(opt_value) :
+ '';
+ return goog.uri.utils.appendQueryDataToUri_(uri, key + value);
+};
+
+
+/**
+ * Finds the next instance of a query parameter with the specified name.
+ *
+ * Does not instantiate any objects.
+ *
+ * @param {string} uri The URI to search. May contain a fragment identifier
+ * if opt_hashIndex is specified.
+ * @param {number} startIndex The index to begin searching for the key at. A
+ * match may be found even if this is one character after the ampersand.
+ * @param {string} keyEncoded The URI-encoded key.
+ * @param {number} hashOrEndIndex Index to stop looking at. If a hash
+ * mark is present, it should be its index, otherwise it should be the
+ * length of the string.
+ * @return {number} The position of the first character in the key's name,
+ * immediately after either a question mark or a dot.
+ * @private
+ */
+goog.uri.utils.findParam_ = function(
+ uri, startIndex, keyEncoded, hashOrEndIndex) {
+ var index = startIndex;
+ var keyLength = keyEncoded.length;
+
+ // Search for the key itself and post-filter for surronuding punctuation,
+ // rather than expensively building a regexp.
+ while ((index = uri.indexOf(keyEncoded, index)) >= 0 &&
+ index < hashOrEndIndex) {
+ var precedingChar = uri.charCodeAt(index - 1);
+ // Ensure that the preceding character is '&' or '?'.
+ if (precedingChar == goog.uri.utils.CharCode_.AMPERSAND ||
+ precedingChar == goog.uri.utils.CharCode_.QUESTION) {
+ // Ensure the following character is '&', '=', '#', or NaN
+ // (end of string).
+ var followingChar = uri.charCodeAt(index + keyLength);
+ if (!followingChar || followingChar == goog.uri.utils.CharCode_.EQUAL ||
+ followingChar == goog.uri.utils.CharCode_.AMPERSAND ||
+ followingChar == goog.uri.utils.CharCode_.HASH) {
+ return index;
+ }
+ }
+ index += keyLength + 1;
+ }
+
+ return -1;
+};
+
+
+/**
+ * Regular expression for finding a hash mark or end of string.
+ * @type {RegExp}
+ * @private
+ */
+goog.uri.utils.hashOrEndRe_ = /#|$/;
+
+
+/**
+ * Determines if the URI contains a specific key.
+ *
+ * Performs no object instantiations.
+ *
+ * @param {string} uri The URI to process. May contain a fragment
+ * identifier.
+ * @param {string} keyEncoded The URI-encoded key. Case-sensitive.
+ * @return {boolean} Whether the key is present.
+ */
+goog.uri.utils.hasParam = function(uri, keyEncoded) {
+ return goog.uri.utils.findParam_(
+ uri, 0, keyEncoded, uri.search(goog.uri.utils.hashOrEndRe_)) >= 0;
+};
+
+
+/**
+ * Gets the first value of a query parameter.
+ * @param {string} uri The URI to process. May contain a fragment.
+ * @param {string} keyEncoded The URI-encoded key. Case-sensitive.
+ * @return {?string} The first value of the parameter (URI-decoded), or null
+ * if the parameter is not found.
+ */
+goog.uri.utils.getParamValue = function(uri, keyEncoded) {
+ var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_);
+ var foundIndex =
+ goog.uri.utils.findParam_(uri, 0, keyEncoded, hashOrEndIndex);
+
+ if (foundIndex < 0) {
+ return null;
+ } else {
+ var endPosition = uri.indexOf('&', foundIndex);
+ if (endPosition < 0 || endPosition > hashOrEndIndex) {
+ endPosition = hashOrEndIndex;
+ }
+ // Progress forth to the end of the "key=" or "key&" substring.
+ foundIndex += keyEncoded.length + 1;
+ // Use substr, because it (unlike substring) will return empty string
+ // if foundIndex > endPosition.
+ return goog.string.urlDecode(
+ uri.substr(foundIndex, endPosition - foundIndex));
+ }
+};
+
+
+/**
+ * Gets all values of a query parameter.
+ * @param {string} uri The URI to process. May contain a fragment.
+ * @param {string} keyEncoded The URI-encoded key. Case-sensitive.
+ * @return {!Array<string>} All URI-decoded values with the given key.
+ * If the key is not found, this will have length 0, but never be null.
+ */
+goog.uri.utils.getParamValues = function(uri, keyEncoded) {
+ var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_);
+ var position = 0;
+ var foundIndex;
+ var result = [];
+
+ while ((foundIndex = goog.uri.utils.findParam_(
+ uri, position, keyEncoded, hashOrEndIndex)) >= 0) {
+ // Find where this parameter ends, either the '&' or the end of the
+ // query parameters.
+ position = uri.indexOf('&', foundIndex);
+ if (position < 0 || position > hashOrEndIndex) {
+ position = hashOrEndIndex;
+ }
+
+ // Progress forth to the end of the "key=" or "key&" substring.
+ foundIndex += keyEncoded.length + 1;
+ // Use substr, because it (unlike substring) will return empty string
+ // if foundIndex > position.
+ result.push(
+ goog.string.urlDecode(uri.substr(foundIndex, position - foundIndex)));
+ }
+
+ return result;
+};
+
+
+/**
+ * Regexp to find trailing question marks and ampersands.
+ * @type {RegExp}
+ * @private
+ */
+goog.uri.utils.trailingQueryPunctuationRe_ = /[?&]($|#)/;
+
+
+/**
+ * Removes all instances of a query parameter.
+ * @param {string} uri The URI to process. Must not contain a fragment.
+ * @param {string} keyEncoded The URI-encoded key.
+ * @return {string} The URI with all instances of the parameter removed.
+ */
+goog.uri.utils.removeParam = function(uri, keyEncoded) {
+ var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_);
+ var position = 0;
+ var foundIndex;
+ var buffer = [];
+
+ // Look for a query parameter.
+ while ((foundIndex = goog.uri.utils.findParam_(
+ uri, position, keyEncoded, hashOrEndIndex)) >= 0) {
+ // Get the portion of the query string up to, but not including, the ?
+ // or & starting the parameter.
+ buffer.push(uri.substring(position, foundIndex));
+ // Progress to immediately after the '&'. If not found, go to the end.
+ // Avoid including the hash mark.
+ position = Math.min(
+ (uri.indexOf('&', foundIndex) + 1) || hashOrEndIndex, hashOrEndIndex);
+ }
+
+ // Append everything that is remaining.
+ buffer.push(uri.substr(position));
+
+ // Join the buffer, and remove trailing punctuation that remains.
+ return buffer.join('').replace(
+ goog.uri.utils.trailingQueryPunctuationRe_, '$1');
+};
+
+
+/**
+ * Replaces all existing definitions of a parameter with a single definition.
+ *
+ * Repeated calls to this can exhibit quadratic behavior due to the need to
+ * find existing instances and reconstruct the string, though it should be
+ * limited given the 2kb limit. Consider using appendParams or setParamsFromMap
+ * to update multiple parameters in bulk.
+ *
+ * @param {string} uri The original URI, which may already have query data.
+ * @param {string} keyEncoded The key, which must already be URI encoded.
+ * @param {*} value The value, which will be stringized and encoded (assumed
+ * not already to be encoded).
+ * @return {string} The URI with the query parameter added.
+ */
+goog.uri.utils.setParam = function(uri, keyEncoded, value) {
+ return goog.uri.utils.appendParam(
+ goog.uri.utils.removeParam(uri, keyEncoded), keyEncoded, value);
+};
+
+
+/**
+ * Effeciently set or remove multiple query parameters in a URI. Order of
+ * unchanged parameters will not be modified, all updated parameters will be
+ * appended to the end of the query. Params with values of null or undefined are
+ * removed.
+ *
+ * @param {string} uri The URI to process.
+ * @param {!Object<string, goog.uri.utils.QueryValue>} params A list of
+ * parameters to update. If null or undefined, the param will be removed.
+ * @return {string} An updated URI where the query data has been updated with
+ * the params.
+ */
+goog.uri.utils.setParamsFromMap = function(uri, params) {
+ var parts = goog.uri.utils.splitQueryData_(uri);
+ var queryData = parts[1];
+ var buffer = [];
+ if (queryData) {
+ goog.array.forEach(queryData.split('&'), function(pair) {
+ var indexOfEquals = pair.indexOf('=');
+ var name = indexOfEquals >= 0 ? pair.substr(0, indexOfEquals) : pair;
+ if (!params.hasOwnProperty(name)) {
+ buffer.push(pair);
+ }
+ });
+ }
+ parts[1] = goog.uri.utils.appendQueryData_(
+ buffer.join('&'), goog.uri.utils.buildQueryDataFromMap(params));
+ return goog.uri.utils.joinQueryData_(parts);
+};
+
+
+/**
+ * Generates a URI path using a given URI and a path with checks to
+ * prevent consecutive "//". The baseUri passed in must not contain
+ * query or fragment identifiers. The path to append may not contain query or
+ * fragment identifiers.
+ *
+ * @param {string} baseUri URI to use as the base.
+ * @param {string} path Path to append.
+ * @return {string} Updated URI.
+ */
+goog.uri.utils.appendPath = function(baseUri, path) {
+ goog.uri.utils.assertNoFragmentsOrQueries_(baseUri);
+
+ // Remove any trailing '/'
+ if (goog.string.endsWith(baseUri, '/')) {
+ baseUri = baseUri.substr(0, baseUri.length - 1);
+ }
+ // Remove any leading '/'
+ if (goog.string.startsWith(path, '/')) {
+ path = path.substr(1);
+ }
+ return goog.string.buildString(baseUri, '/', path);
+};
+
+
+/**
+ * Replaces the path.
+ * @param {string} uri URI to use as the base.
+ * @param {string} path New path.
+ * @return {string} Updated URI.
+ */
+goog.uri.utils.setPath = function(uri, path) {
+ // Add any missing '/'.
+ if (!goog.string.startsWith(path, '/')) {
+ path = '/' + path;
+ }
+ var parts = goog.uri.utils.split(uri);
+ return goog.uri.utils.buildFromEncodedParts(
+ parts[goog.uri.utils.ComponentIndex.SCHEME],
+ parts[goog.uri.utils.ComponentIndex.USER_INFO],
+ parts[goog.uri.utils.ComponentIndex.DOMAIN],
+ parts[goog.uri.utils.ComponentIndex.PORT], path,
+ parts[goog.uri.utils.ComponentIndex.QUERY_DATA],
+ parts[goog.uri.utils.ComponentIndex.FRAGMENT]);
+};
+
+
+/**
+ * Standard supported query parameters.
+ * @enum {string}
+ */
+goog.uri.utils.StandardQueryParam = {
+
+ /** Unused parameter for unique-ifying. */
+ RANDOM: 'zx'
+};
+
+
+/**
+ * Sets the zx parameter of a URI to a random value.
+ * @param {string} uri Any URI.
+ * @return {string} That URI with the "zx" parameter added or replaced to
+ * contain a random string.
+ */
+goog.uri.utils.makeUnique = function(uri) {
+ return goog.uri.utils.setParam(
+ uri, goog.uri.utils.StandardQueryParam.RANDOM,
+ goog.string.getRandomString());
+};
diff --git a/src/http/static/viz/2/goog/useragent/useragent.js b/src/http/static/viz/2/goog/useragent/useragent.js
new file mode 100644
index 0000000..6fc5ff1
--- /dev/null
+++ b/src/http/static/viz/2/goog/useragent/useragent.js
@@ -0,0 +1,580 @@
+// Copyright 2006 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @fileoverview Rendering engine detection.
+ * @see <a href="http://www.useragentstring.com/">User agent strings</a>
+ * For information on the browser brand (such as Safari versus Chrome), see
+ * goog.userAgent.product.
+ * @author arv@google.com (Erik Arvidsson)
+ * @see ../demos/useragent.html
+ */
+
+goog.provide('goog.userAgent');
+
+goog.require('goog.labs.userAgent.browser');
+goog.require('goog.labs.userAgent.engine');
+goog.require('goog.labs.userAgent.platform');
+goog.require('goog.labs.userAgent.util');
+goog.require('goog.reflect');
+goog.require('goog.string');
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is IE.
+ */
+goog.define('goog.userAgent.ASSUME_IE', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is EDGE.
+ */
+goog.define('goog.userAgent.ASSUME_EDGE', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is GECKO.
+ */
+goog.define('goog.userAgent.ASSUME_GECKO', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is WEBKIT.
+ */
+goog.define('goog.userAgent.ASSUME_WEBKIT', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is a
+ * mobile device running WebKit e.g. iPhone or Android.
+ */
+goog.define('goog.userAgent.ASSUME_MOBILE_WEBKIT', false);
+
+
+/**
+ * @define {boolean} Whether we know at compile-time that the browser is OPERA.
+ */
+goog.define('goog.userAgent.ASSUME_OPERA', false);
+
+
+/**
+ * @define {boolean} Whether the
+ * {@code goog.userAgent.isVersionOrHigher}
+ * function will return true for any version.
+ */
+goog.define('goog.userAgent.ASSUME_ANY_VERSION', false);
+
+
+/**
+ * Whether we know the browser engine at compile-time.
+ * @type {boolean}
+ * @private
+ */
+goog.userAgent.BROWSER_KNOWN_ = goog.userAgent.ASSUME_IE ||
+ goog.userAgent.ASSUME_EDGE || goog.userAgent.ASSUME_GECKO ||
+ goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.ASSUME_WEBKIT ||
+ goog.userAgent.ASSUME_OPERA;
+
+
+/**
+ * Returns the userAgent string for the current browser.
+ *
+ * @return {string} The userAgent string.
+ */
+goog.userAgent.getUserAgentString = function() {
+ return goog.labs.userAgent.util.getUserAgent();
+};
+
+
+/**
+ * TODO(nnaze): Change type to "Navigator" and update compilation targets.
+ * @return {?Object} The native navigator object.
+ */
+goog.userAgent.getNavigator = function() {
+ // Need a local navigator reference instead of using the global one,
+ // to avoid the rare case where they reference different objects.
+ // (in a WorkerPool, for example).
+ return goog.global['navigator'] || null;
+};
+
+
+/**
+ * Whether the user agent is Opera.
+ * @type {boolean}
+ */
+goog.userAgent.OPERA = goog.userAgent.BROWSER_KNOWN_ ?
+ goog.userAgent.ASSUME_OPERA :
+ goog.labs.userAgent.browser.isOpera();
+
+
+/**
+ * Whether the user agent is Internet Explorer.
+ * @type {boolean}
+ */
+goog.userAgent.IE = goog.userAgent.BROWSER_KNOWN_ ?
+ goog.userAgent.ASSUME_IE :
+ goog.labs.userAgent.browser.isIE();
+
+
+/**
+ * Whether the user agent is Microsoft Edge.
+ * @type {boolean}
+ */
+goog.userAgent.EDGE = goog.userAgent.BROWSER_KNOWN_ ?
+ goog.userAgent.ASSUME_EDGE :
+ goog.labs.userAgent.engine.isEdge();
+
+
+/**
+ * Whether the user agent is MS Internet Explorer or MS Edge.
+ * @type {boolean}
+ */
+goog.userAgent.EDGE_OR_IE = goog.userAgent.EDGE || goog.userAgent.IE;
+
+
+/**
+ * Whether the user agent is Gecko. Gecko is the rendering engine used by
+ * Mozilla, Firefox, and others.
+ * @type {boolean}
+ */
+goog.userAgent.GECKO = goog.userAgent.BROWSER_KNOWN_ ?
+ goog.userAgent.ASSUME_GECKO :
+ goog.labs.userAgent.engine.isGecko();
+
+
+/**
+ * Whether the user agent is WebKit. WebKit is the rendering engine that
+ * Safari, Android and others use.
+ * @type {boolean}
+ */
+goog.userAgent.WEBKIT = goog.userAgent.BROWSER_KNOWN_ ?
+ goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_MOBILE_WEBKIT :
+ goog.labs.userAgent.engine.isWebKit();
+
+
+/**
+ * Whether the user agent is running on a mobile device.
+ *
+ * This is a separate function so that the logic can be tested.
+ *
+ * TODO(nnaze): Investigate swapping in goog.labs.userAgent.device.isMobile().
+ *
+ * @return {boolean} Whether the user agent is running on a mobile device.
+ * @private
+ */
+goog.userAgent.isMobile_ = function() {
+ return goog.userAgent.WEBKIT &&
+ goog.labs.userAgent.util.matchUserAgent('Mobile');
+};
+
+
+/**
+ * Whether the user agent is running on a mobile device.
+ *
+ * TODO(nnaze): Consider deprecating MOBILE when labs.userAgent
+ * is promoted as the gecko/webkit logic is likely inaccurate.
+ *
+ * @type {boolean}
+ */
+goog.userAgent.MOBILE =
+ goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.isMobile_();
+
+
+/**
+ * Used while transitioning code to use WEBKIT instead.
+ * @type {boolean}
+ * @deprecated Use {@link goog.userAgent.product.SAFARI} instead.
+ * TODO(nicksantos): Delete this from goog.userAgent.
+ */
+goog.userAgent.SAFARI = goog.userAgent.WEBKIT;
+
+
+/**
+ * @return {string} the platform (operating system) the user agent is running
+ * on. Default to empty string because navigator.platform may not be defined
+ * (on Rhino, for example).
+ * @private
+ */
+goog.userAgent.determinePlatform_ = function() {
+ var navigator = goog.userAgent.getNavigator();
+ return navigator && navigator.platform || '';
+};
+
+
+/**
+ * The platform (operating system) the user agent is running on. Default to
+ * empty string because navigator.platform may not be defined (on Rhino, for
+ * example).
+ * @type {string}
+ */
+goog.userAgent.PLATFORM = goog.userAgent.determinePlatform_();
+
+
+/**
+ * @define {boolean} Whether the user agent is running on a Macintosh operating
+ * system.
+ */
+goog.define('goog.userAgent.ASSUME_MAC', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on a Windows operating
+ * system.
+ */
+goog.define('goog.userAgent.ASSUME_WINDOWS', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on a Linux operating
+ * system.
+ */
+goog.define('goog.userAgent.ASSUME_LINUX', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on a X11 windowing
+ * system.
+ */
+goog.define('goog.userAgent.ASSUME_X11', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on Android.
+ */
+goog.define('goog.userAgent.ASSUME_ANDROID', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on an iPhone.
+ */
+goog.define('goog.userAgent.ASSUME_IPHONE', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on an iPad.
+ */
+goog.define('goog.userAgent.ASSUME_IPAD', false);
+
+
+/**
+ * @define {boolean} Whether the user agent is running on an iPod.
+ */
+goog.define('goog.userAgent.ASSUME_IPOD', false);
+
+
+/**
+ * @type {boolean}
+ * @private
+ */
+goog.userAgent.PLATFORM_KNOWN_ = goog.userAgent.ASSUME_MAC ||
+ goog.userAgent.ASSUME_WINDOWS || goog.userAgent.ASSUME_LINUX ||
+ goog.userAgent.ASSUME_X11 || goog.userAgent.ASSUME_ANDROID ||
+ goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD ||
+ goog.userAgent.ASSUME_IPOD;
+
+
+/**
+ * Whether the user agent is running on a Macintosh operating system.
+ * @type {boolean}
+ */
+goog.userAgent.MAC = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_MAC :
+ goog.labs.userAgent.platform.isMacintosh();
+
+
+/**
+ * Whether the user agent is running on a Windows operating system.
+ * @type {boolean}
+ */
+goog.userAgent.WINDOWS = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_WINDOWS :
+ goog.labs.userAgent.platform.isWindows();
+
+
+/**
+ * Whether the user agent is Linux per the legacy behavior of
+ * goog.userAgent.LINUX, which considered ChromeOS to also be
+ * Linux.
+ * @return {boolean}
+ * @private
+ */
+goog.userAgent.isLegacyLinux_ = function() {
+ return goog.labs.userAgent.platform.isLinux() ||
+ goog.labs.userAgent.platform.isChromeOS();
+};
+
+
+/**
+ * Whether the user agent is running on a Linux operating system.
+ *
+ * Note that goog.userAgent.LINUX considers ChromeOS to be Linux,
+ * while goog.labs.userAgent.platform considers ChromeOS and
+ * Linux to be different OSes.
+ *
+ * @type {boolean}
+ */
+goog.userAgent.LINUX = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_LINUX :
+ goog.userAgent.isLegacyLinux_();
+
+
+/**
+ * @return {boolean} Whether the user agent is an X11 windowing system.
+ * @private
+ */
+goog.userAgent.isX11_ = function() {
+ var navigator = goog.userAgent.getNavigator();
+ return !!navigator &&
+ goog.string.contains(navigator['appVersion'] || '', 'X11');
+};
+
+
+/**
+ * Whether the user agent is running on a X11 windowing system.
+ * @type {boolean}
+ */
+goog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_X11 :
+ goog.userAgent.isX11_();
+
+
+/**
+ * Whether the user agent is running on Android.
+ * @type {boolean}
+ */
+goog.userAgent.ANDROID = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_ANDROID :
+ goog.labs.userAgent.platform.isAndroid();
+
+
+/**
+ * Whether the user agent is running on an iPhone.
+ * @type {boolean}
+ */
+goog.userAgent.IPHONE = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_IPHONE :
+ goog.labs.userAgent.platform.isIphone();
+
+
+/**
+ * Whether the user agent is running on an iPad.
+ * @type {boolean}
+ */
+goog.userAgent.IPAD = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_IPAD :
+ goog.labs.userAgent.platform.isIpad();
+
+
+/**
+ * Whether the user agent is running on an iPod.
+ * @type {boolean}
+ */
+goog.userAgent.IPOD = goog.userAgent.PLATFORM_KNOWN_ ?
+ goog.userAgent.ASSUME_IPOD :
+ goog.labs.userAgent.platform.isIpod();
+
+
+/**
+ * Whether the user agent is running on iOS.
+ * @type {boolean}
+ */
+goog.userAgent.IOS = goog.userAgent.PLATFORM_KNOWN_ ?
+ (goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD ||
+ goog.userAgent.ASSUME_IPOD) :
+ goog.labs.userAgent.platform.isIos();
+
+/**
+ * @return {string} The string that describes the version number of the user
+ * agent.
+ * @private
+ */
+goog.userAgent.determineVersion_ = function() {
+ // All browsers have different ways to detect the version and they all have
+ // different naming schemes.
+ // version is a string rather than a number because it may contain 'b', 'a',
+ // and so on.
+ var version = '';
+ var arr = goog.userAgent.getVersionRegexResult_();
+ if (arr) {
+ version = arr ? arr[1] : '';
+ }
+
+ if (goog.userAgent.IE) {
+ // IE9 can be in document mode 9 but be reporting an inconsistent user agent
+ // version. If it is identifying as a version lower than 9 we take the
+ // documentMode as the version instead. IE8 has similar behavior.
+ // It is recommended to set the X-UA-Compatible header to ensure that IE9
+ // uses documentMode 9.
+ var docMode = goog.userAgent.getDocumentMode_();
+ if (docMode != null && docMode > parseFloat(version)) {
+ return String(docMode);
+ }
+ }
+
+ return version;
+};
+
+
+/**
+ * @return {?Array|undefined} The version regex matches from parsing the user
+ * agent string. These regex statements must be executed inline so they can
+ * be compiled out by the closure compiler with the rest of the useragent
+ * detection logic when ASSUME_* is specified.
+ * @private
+ */
+goog.userAgent.getVersionRegexResult_ = function() {
+ var userAgent = goog.userAgent.getUserAgentString();
+ if (goog.userAgent.GECKO) {
+ return /rv\:([^\);]+)(\)|;)/.exec(userAgent);
+ }
+ if (goog.userAgent.EDGE) {
+ return /Edge\/([\d\.]+)/.exec(userAgent);
+ }
+ if (goog.userAgent.IE) {
+ return /\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(userAgent);
+ }
+ if (goog.userAgent.WEBKIT) {
+ // WebKit/125.4
+ return /WebKit\/(\S+)/.exec(userAgent);
+ }
+ if (goog.userAgent.OPERA) {
+ // If none of the above browsers were detected but the browser is Opera, the
+ // only string that is of interest is 'Version/<number>'.
+ return /(?:Version)[ \/]?(\S+)/.exec(userAgent);
+ }
+ return undefined;
+};
+
+
+/**
+ * @return {number|undefined} Returns the document mode (for testing).
+ * @private
+ */
+goog.userAgent.getDocumentMode_ = function() {
+ // NOTE(user): goog.userAgent may be used in context where there is no DOM.
+ var doc = goog.global['document'];
+ return doc ? doc['documentMode'] : undefined;
+};
+
+
+/**
+ * The version of the user agent. This is a string because it might contain
+ * 'b' (as in beta) as well as multiple dots.
+ * @type {string}
+ */
+goog.userAgent.VERSION = goog.userAgent.determineVersion_();
+
+
+/**
+ * Compares two version numbers.
+ *
+ * @param {string} v1 Version of first item.
+ * @param {string} v2 Version of second item.
+ *
+ * @return {number} 1 if first argument is higher
+ * 0 if arguments are equal
+ * -1 if second argument is higher.
+ * @deprecated Use goog.string.compareVersions.
+ */
+goog.userAgent.compare = function(v1, v2) {
+ return goog.string.compareVersions(v1, v2);
+};
+
+
+/**
+ * Cache for {@link goog.userAgent.isVersionOrHigher}.
+ * Calls to compareVersions are surprisingly expensive and, as a browser's
+ * version number is unlikely to change during a session, we cache the results.
+ * @const
+ * @private
+ */
+goog.userAgent.isVersionOrHigherCache_ = {};
+
+
+/**
+ * Whether the user agent version is higher or the same as the given version.
+ * NOTE: When checking the version numbers for Firefox and Safari, be sure to
+ * use the engine's version, not the browser's version number. For example,
+ * Firefox 3.0 corresponds to Gecko 1.9 and Safari 3.0 to Webkit 522.11.
+ * Opera and Internet Explorer versions match the product release number.<br>
+ * @see <a href="http://en.wikipedia.org/wiki/Safari_version_history">
+ * Webkit</a>
+ * @see <a href="http://en.wikipedia.org/wiki/Gecko_engine">Gecko</a>
+ *
+ * @param {string|number} version The version to check.
+ * @return {boolean} Whether the user agent version is higher or the same as
+ * the given version.
+ */
+goog.userAgent.isVersionOrHigher = function(version) {
+ return goog.userAgent.ASSUME_ANY_VERSION ||
+ goog.reflect.cache(
+ goog.userAgent.isVersionOrHigherCache_, version, function() {
+ return goog.string.compareVersions(
+ goog.userAgent.VERSION, version) >= 0;
+ });
+};
+
+
+/**
+ * Deprecated alias to {@code goog.userAgent.isVersionOrHigher}.
+ * @param {string|number} version The version to check.
+ * @return {boolean} Whether the user agent version is higher or the same as
+ * the given version.
+ * @deprecated Use goog.userAgent.isVersionOrHigher().
+ */
+goog.userAgent.isVersion = goog.userAgent.isVersionOrHigher;
+
+
+/**
+ * Whether the IE effective document mode is higher or the same as the given
+ * document mode version.
+ * NOTE: Only for IE, return false for another browser.
+ *
+ * @param {number} documentMode The document mode version to check.
+ * @return {boolean} Whether the IE effective document mode is higher or the
+ * same as the given version.
+ */
+goog.userAgent.isDocumentModeOrHigher = function(documentMode) {
+ return Number(goog.userAgent.DOCUMENT_MODE) >= documentMode;
+};
+
+
+/**
+ * Deprecated alias to {@code goog.userAgent.isDocumentModeOrHigher}.
+ * @param {number} version The version to check.
+ * @return {boolean} Whether the IE effective document mode is higher or the
+ * same as the given version.
+ * @deprecated Use goog.userAgent.isDocumentModeOrHigher().
+ */
+goog.userAgent.isDocumentMode = goog.userAgent.isDocumentModeOrHigher;
+
+
+/**
+ * For IE version < 7, documentMode is undefined, so attempt to use the
+ * CSS1Compat property to see if we are in standards mode. If we are in
+ * standards mode, treat the browser version as the document mode. Otherwise,
+ * IE is emulating version 5.
+ * @type {number|undefined}
+ * @const
+ */
+goog.userAgent.DOCUMENT_MODE = (function() {
+ var doc = goog.global['document'];
+ var mode = goog.userAgent.getDocumentMode_();
+ if (!doc || !goog.userAgent.IE) {
+ return undefined;
+ }
+ return mode || (doc['compatMode'] == 'CSS1Compat' ?
+ parseInt(goog.userAgent.VERSION, 10) :
+ 5);
+})();
diff --git a/src/http/static/viz/2/process/env.cljs b/src/http/static/viz/2/process/env.cljs
new file mode 100644
index 0000000..c8a6909
--- /dev/null
+++ b/src/http/static/viz/2/process/env.cljs
@@ -0,0 +1,12 @@
+;; Copyright (c) Rich Hickey. All rights reserved.
+;; The use and distribution terms for this software are covered by the
+;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
+;; which can be found in the file epl-v10.html at the root of this distribution.
+;; By using this software in any fashion, you are agreeing to be bound by
+;; the terms of this license.
+;; You must not remove this notice, or any other, from this software.
+
+(ns process.env
+ "A shim namespace for the Node.js process library")
+
+(goog-define NODE_ENV "development")
diff --git a/src/http/static/viz/2/process/env.cljs.cache.json b/src/http/static/viz/2/process/env.cljs.cache.json
new file mode 100644
index 0000000..cde3e78
--- /dev/null
+++ b/src/http/static/viz/2/process/env.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$process.env","~:imports",null,"~:requires",null,"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$NODE_ENV",["^ ","^5","~$process.env/NODE_ENV","~:file","out/process/env.cljs","~:line",12,"~:column",1,"~:end-line",12,"~:end-column",22,"~:tag","~$string","~:declared",true,"~:meta",["^ ","^>","/home/mediocregopher/src/viz/out/process/env.cljs","^?",12,"^@",14,"^A",12,"^B",22,"^C","^D","^E",true]]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:doc","A shim namespace for the Node.js process library"] \ No newline at end of file
diff --git a/src/http/static/viz/2/process/env.js b/src/http/static/viz/2/process/env.js
new file mode 100644
index 0000000..a917edb
--- /dev/null
+++ b/src/http/static/viz/2/process/env.js
@@ -0,0 +1,8 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('process.env');
+goog.require('cljs.core');
+
+/** @define {string} */
+goog.define("process.env.NODE_ENV","development");
+
+//# sourceMappingURL=env.js.map
diff --git a/src/http/static/viz/2/process/env.js.map b/src/http/static/viz/2/process/env.js.map
new file mode 100644
index 0000000..4b5f46b
--- /dev/null
+++ b/src/http/static/viz/2/process/env.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/process\/env.js","sources":["env.cljs"],"lineCount":8,"mappings":";AAQA;;AAGA,AAAA,AAAA;AAAA;AAAA,AAAAA,YAAA,uBAAA","names":["goog\/define"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/processing.js b/src/http/static/viz/2/processing.js
new file mode 100644
index 0000000..7cfb7a8
--- /dev/null
+++ b/src/http/static/viz/2/processing.js
@@ -0,0 +1,21796 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+// build script for generating processing.js
+
+var Browser = {
+ isDomPresent: true,
+ navigator: navigator,
+ window: window,
+ document: document,
+ ajax: function(url) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url, false);
+ if (xhr.overrideMimeType) {
+ xhr.overrideMimeType("text/plain");
+ }
+ xhr.setRequestHeader("If-Modified-Since", "Fri, 01 Jan 1960 00:00:00 GMT");
+ xhr.send(null);
+ // failed request?
+ if (xhr.status !== 200 && xhr.status !== 0) { throw ("XMLHttpRequest failed, status code " + xhr.status); }
+ return xhr.responseText;
+ }
+};
+
+window.Processing = require('./src/')(Browser);
+
+},{"./src/":28}],2:[function(require,module,exports){
+module.exports={
+ "name": "processing-js",
+ "version": "1.6.4",
+ "author": "Processing.js",
+ "repository": {
+ "type": "git",
+ "url": "git@github.com/processing-js/processing-js.git"
+ },
+ "main": "processing.min.js",
+ "bugs": "https://github.com/processing-js/processing-js/issues",
+ "devDependencies": {
+ "argv": "~0.0.2",
+ "browserify": "^11.0.1",
+ "express": "~3.3.3",
+ "grunt": "~0.4.1",
+ "grunt-cli": "~0.1.8",
+ "grunt-contrib-jshint": "~0.4.3",
+ "http-server": "^0.9.0",
+ "minifier": "^0.7.1",
+ "node-minify": "~0.7.3",
+ "nunjucks": "~0.1.9",
+ "open": "0.0.3"
+ },
+ "scripts": {
+ "test": "node test",
+ "test:manual": "http-server -o test/manual",
+ "start": "browserify build.js -o processing.js && minify --output processing.min.js processing.js"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "minifier": "^0.7.1"
+ }
+}
+
+},{}],3:[function(require,module,exports){
+/**
+* A ObjectIterator is an iterator wrapper for objects. If passed object contains
+* the iterator method, the object instance will be replaced by the result returned by
+* this method call. If passed object is an array, the ObjectIterator instance iterates
+* through its items.
+*
+* @param {Object} obj The object to be iterated.
+*/
+module.exports = function ObjectIterator(obj) {
+ if (obj instanceof Array) {
+ // iterate through array items
+ var index = -1;
+ this.hasNext = function() {
+ return ++index < obj.length;
+ };
+ this.next = function() {
+ return obj[index];
+ };
+ } else if (obj.iterator instanceof Function) {
+ return obj.iterator();
+ } else {
+ throw "Unable to iterate: " + obj;
+ }
+};
+
+},{}],4:[function(require,module,exports){
+/**
+ * Processing.js environment constants
+ */
+module.exports = {
+ X: 0,
+ Y: 1,
+ Z: 2,
+
+ R: 3,
+ G: 4,
+ B: 5,
+ A: 6,
+
+ U: 7,
+ V: 8,
+
+ NX: 9,
+ NY: 10,
+ NZ: 11,
+
+ EDGE: 12,
+
+ // Stroke
+ SR: 13,
+ SG: 14,
+ SB: 15,
+ SA: 16,
+
+ SW: 17,
+
+ // Transformations (2D and 3D)
+ TX: 18,
+ TY: 19,
+ TZ: 20,
+
+ VX: 21,
+ VY: 22,
+ VZ: 23,
+ VW: 24,
+
+ // Material properties
+ AR: 25,
+ AG: 26,
+ AB: 27,
+
+ DR: 3,
+ DG: 4,
+ DB: 5,
+ DA: 6,
+
+ SPR: 28,
+ SPG: 29,
+ SPB: 30,
+
+ SHINE: 31,
+
+ ER: 32,
+ EG: 33,
+ EB: 34,
+
+ BEEN_LIT: 35,
+
+ VERTEX_FIELD_COUNT: 36,
+
+ // Renderers
+ P2D: 1,
+ JAVA2D: 1,
+ WEBGL: 2,
+ P3D: 2,
+ OPENGL: 2,
+ PDF: 0,
+ DXF: 0,
+
+ // Platform IDs
+ OTHER: 0,
+ WINDOWS: 1,
+ MAXOSX: 2,
+ LINUX: 3,
+
+ EPSILON: 0.0001,
+
+ MAX_FLOAT: 3.4028235e+38,
+ MIN_FLOAT: -3.4028235e+38,
+ MAX_INT: 2147483647,
+ MIN_INT: -2147483648,
+
+ PI: Math.PI,
+ TWO_PI: 2 * Math.PI,
+ TAU: 2 * Math.PI,
+ HALF_PI: Math.PI / 2,
+ THIRD_PI: Math.PI / 3,
+ QUARTER_PI: Math.PI / 4,
+
+ DEG_TO_RAD: Math.PI / 180,
+ RAD_TO_DEG: 180 / Math.PI,
+
+ WHITESPACE: " \t\n\r\f\u00A0",
+
+ // Color modes
+ RGB: 1,
+ ARGB: 2,
+ HSB: 3,
+ ALPHA: 4,
+ CMYK: 5,
+
+ // Image file types
+ TIFF: 0,
+ TARGA: 1,
+ JPEG: 2,
+ GIF: 3,
+
+ // Filter/convert types
+ BLUR: 11,
+ GRAY: 12,
+ INVERT: 13,
+ OPAQUE: 14,
+ POSTERIZE: 15,
+ THRESHOLD: 16,
+ ERODE: 17,
+ DILATE: 18,
+
+ // Blend modes
+ REPLACE: 0,
+ BLEND: 1 << 0,
+ ADD: 1 << 1,
+ SUBTRACT: 1 << 2,
+ LIGHTEST: 1 << 3,
+ DARKEST: 1 << 4,
+ DIFFERENCE: 1 << 5,
+ EXCLUSION: 1 << 6,
+ MULTIPLY: 1 << 7,
+ SCREEN: 1 << 8,
+ OVERLAY: 1 << 9,
+ HARD_LIGHT: 1 << 10,
+ SOFT_LIGHT: 1 << 11,
+ DODGE: 1 << 12,
+ BURN: 1 << 13,
+
+ // Color component bit masks
+ ALPHA_MASK: 0xff000000,
+ RED_MASK: 0x00ff0000,
+ GREEN_MASK: 0x0000ff00,
+ BLUE_MASK: 0x000000ff,
+
+ // Projection matrices
+ CUSTOM: 0,
+ ORTHOGRAPHIC: 2,
+ PERSPECTIVE: 3,
+
+ // Shapes
+ POINT: 2,
+ POINTS: 2,
+ LINE: 4,
+ LINES: 4,
+ TRIANGLE: 8,
+ TRIANGLES: 9,
+ TRIANGLE_STRIP: 10,
+ TRIANGLE_FAN: 11,
+ QUAD: 16,
+ QUADS: 16,
+ QUAD_STRIP: 17,
+ POLYGON: 20,
+ PATH: 21,
+ RECT: 30,
+ ELLIPSE: 31,
+ ARC: 32,
+ SPHERE: 40,
+ BOX: 41,
+
+ // Arc drawing modes
+ //OPEN: 1, // shared with Shape closing modes
+ CHORD: 2,
+ PIE: 3,
+
+
+ GROUP: 0,
+ PRIMITIVE: 1,
+ //PATH: 21, // shared with Shape PATH
+ GEOMETRY: 3,
+
+ // Shape Vertex
+ VERTEX: 0,
+ BEZIER_VERTEX: 1,
+ CURVE_VERTEX: 2,
+ BREAK: 3,
+ CLOSESHAPE: 4,
+
+ // Shape closing modes
+ OPEN: 1,
+ CLOSE: 2,
+
+ // Shape drawing modes
+ CORNER: 0, // Draw mode convention to use (x, y) to (width, height)
+ CORNERS: 1, // Draw mode convention to use (x1, y1) to (x2, y2) coordinates
+ RADIUS: 2, // Draw mode from the center, and using the radius
+ CENTER_RADIUS: 2, // Deprecated! Use RADIUS instead
+ CENTER: 3, // Draw from the center, using second pair of values as the diameter
+ DIAMETER: 3, // Synonym for the CENTER constant. Draw from the center
+ CENTER_DIAMETER: 3, // Deprecated! Use DIAMETER instead
+
+ // Text vertical alignment modes
+ BASELINE: 0, // Default vertical alignment for text placement
+ TOP: 101, // Align text to the top
+ BOTTOM: 102, // Align text from the bottom, using the baseline
+
+ // UV Texture coordinate modes
+ NORMAL: 1,
+ NORMALIZED: 1,
+ IMAGE: 2,
+
+ // Text placement modes
+ MODEL: 4,
+ SHAPE: 5,
+
+ // Stroke modes
+ SQUARE: 'butt',
+ ROUND: 'round',
+ PROJECT: 'square',
+ MITER: 'miter',
+ BEVEL: 'bevel',
+
+ // Lighting modes
+ AMBIENT: 0,
+ DIRECTIONAL: 1,
+ //POINT: 2, Shared with Shape constant
+ SPOT: 3,
+
+ // Key constants
+
+ // Both key and keyCode will be equal to these values
+ BACKSPACE: 8,
+ TAB: 9,
+ ENTER: 10,
+ RETURN: 13,
+ ESC: 27,
+ DELETE: 127,
+ CODED: 0xffff,
+
+ // p.key will be CODED and p.keyCode will be this value
+ SHIFT: 16,
+ CONTROL: 17,
+ ALT: 18,
+ CAPSLK: 20,
+ PGUP: 33,
+ PGDN: 34,
+ END: 35,
+ HOME: 36,
+ LEFT: 37,
+ UP: 38,
+ RIGHT: 39,
+ DOWN: 40,
+ F1: 112,
+ F2: 113,
+ F3: 114,
+ F4: 115,
+ F5: 116,
+ F6: 117,
+ F7: 118,
+ F8: 119,
+ F9: 120,
+ F10: 121,
+ F11: 122,
+ F12: 123,
+ NUMLK: 144,
+ META: 157,
+ INSERT: 155,
+
+ // Cursor types
+ ARROW: 'default',
+ CROSS: 'crosshair',
+ HAND: 'pointer',
+ MOVE: 'move',
+ TEXT: 'text',
+ WAIT: 'wait',
+ NOCURSOR: "url('data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='), auto",
+
+ // Hints
+ DISABLE_OPENGL_2X_SMOOTH: 1,
+ ENABLE_OPENGL_2X_SMOOTH: -1,
+ ENABLE_OPENGL_4X_SMOOTH: 2,
+ ENABLE_NATIVE_FONTS: 3,
+ DISABLE_DEPTH_TEST: 4,
+ ENABLE_DEPTH_TEST: -4,
+ ENABLE_DEPTH_SORT: 5,
+ DISABLE_DEPTH_SORT: -5,
+ DISABLE_OPENGL_ERROR_REPORT: 6,
+ ENABLE_OPENGL_ERROR_REPORT: -6,
+ ENABLE_ACCURATE_TEXTURES: 7,
+ DISABLE_ACCURATE_TEXTURES: -7,
+ HINT_COUNT: 10,
+
+ // PJS defined constants
+ SINCOS_LENGTH: 720, // every half degree
+ PRECISIONB: 15, // fixed point precision is limited to 15 bits!!
+ PRECISIONF: 1 << 15,
+ PREC_MAXVAL: (1 << 15) - 1,
+ PREC_ALPHA_SHIFT: 24 - 15,
+ PREC_RED_SHIFT: 16 - 15,
+ NORMAL_MODE_AUTO: 0,
+ NORMAL_MODE_SHAPE: 1,
+ NORMAL_MODE_VERTEX: 2,
+ MAX_LIGHTS: 8
+};
+
+},{}],5:[function(require,module,exports){
+// the logger for print() and println()
+module.exports = function PjsConsole(document) {
+ var e = { BufferMax: 200 },
+ style = document.createElement("style"),
+ added = false;
+
+ style.textContent = [
+ ".pjsconsole.hidden {",
+ " display: none!important;",
+ "}"
+ ].join('\n');
+
+ e.wrapper = document.createElement("div");
+ style.textContent += [
+ "",
+ ".pjsconsole {",
+ " opacity: .75;",
+ " display: block;",
+ " position: fixed;",
+ " bottom: 0px;",
+ " left: 0px;",
+ " right: 0px;",
+ " height: 50px;",
+ " background-color: #aaa;",
+ "}"
+ ].join('\n');
+ e.wrapper.classList.add("pjsconsole");
+
+ e.dragger = document.createElement("div");
+ style.textContent += [
+ "",
+ ".pjsconsole .dragger {",
+ " display: block;",
+ " border: 3px black raised;",
+ " cursor: n-resize;",
+ " position: absolute;",
+ " top: 0px;",
+ " left: 0px;",
+ " right: 0px;",
+ " height: 5px;",
+ " background-color: #333;",
+ "}"
+ ].join('\n');
+ e.dragger.classList.add("dragger");
+
+ e.closer = document.createElement("div");
+ style.textContent += [
+ "",
+ ".pjsconsole .closer {",
+ " opacity: .5;",
+ " display: block;",
+ " border: 3px black raised;",
+ " position: absolute;",
+ " top: 10px;",
+ " right: 30px;",
+ " height: 20px;",
+ " width: 20px;",
+ " background-color: #ddd;",
+ " color: #000;",
+ " line-height: 20px;",
+ " text-align: center;",
+ " cursor: pointer",
+ "}"
+ ].join('\n');
+ e.closer.classList.add("closer");
+ e.closer.innerHTML = "&#10006;";
+
+ e.javaconsole = document.createElement("div");
+ style.textContent += [
+ "",
+ ".pjsconsole .console {",
+ " overflow-x: auto;",
+ " display: block;",
+ " position: absolute;",
+ " left: 10px;",
+ " right: 0px;",
+ " bottom: 5px;",
+ " top: 10px;",
+ " overflow-y: scroll;",
+ " height: 40px;",
+ "}"
+ ].join('\n');
+ e.javaconsole.setAttribute("class", "console");
+
+ e.wrapper.appendChild(e.dragger);
+ e.wrapper.appendChild(e.javaconsole);
+ e.wrapper.appendChild(e.closer);
+
+ e.dragger.onmousedown = function (t) {
+ e.divheight = e.wrapper.style.height;
+ if (document.selection) document.selection.empty();
+ else window.getSelection().removeAllRanges();
+ var n = t.screenY;
+ window.onmousemove = function (t) {
+ e.wrapper.style.height = parseFloat(e.divheight) + (n - t.screenY) + "px";
+ e.javaconsole.style.height = parseFloat(e.divheight) + (n - t.screenY) - 10 + "px";
+ };
+ window.onmouseup = function (t) {
+ if (document.selection) document.selection.empty();
+ else window.getSelection().removeAllRanges();
+ e.wrapper.style.height = parseFloat(e.divheight) + (n - t.screenY) + "px";
+ e.javaconsole.style.height = parseFloat(e.divheight) + (n - t.screenY) - 10 + "px";
+ window.onmousemove = null;
+ window.onmouseup = null;
+ };
+ };
+
+ e.BufferArray = [];
+
+ e.print = e.log = function () {
+ if(!added) {
+ document.body.appendChild(style);
+ document.body.appendChild(e.wrapper);
+ added = true;
+ }
+ var args = Array.prototype.slice.call(arguments);
+ t = args.map(function(t, idx) { return t + (idx+1 === args.length ? "" : " "); }).join('');
+ if (e.BufferArray[e.BufferArray.length - 1]) e.BufferArray[e.BufferArray.length - 1] += (t) + "";
+ else e.BufferArray.push(t);
+ e.javaconsole.innerHTML = e.BufferArray.join('');
+ e.showconsole();
+ };
+
+ e.println = function () {
+ var args = Array.prototype.slice.call(arguments);
+ args.push('<br>');
+ e.print.apply(e, args);
+ if (e.BufferArray.length > e.BufferMax) {
+ e.BufferArray.splice(0, 1);
+ } else {
+ e.javaconsole.scrollTop = e.javaconsole.scrollHeight;
+ }
+ };
+
+ e.showconsole = function () { e.wrapper.classList.remove("hidden"); };
+ e.hideconsole = function () { e.wrapper.classList.add("hidden"); };
+
+ e.closer.onclick = function () { e.hideconsole(); };
+
+ e.hideconsole();
+
+ return e;
+};
+
+},{}],6:[function(require,module,exports){
+/**
+ * Processing.js default scope
+ */
+module.exports = function(options) {
+
+ // Building defaultScope. Changing of the prototype protects
+ // internal Processing code from the changes in defaultScope
+ function DefaultScope() {}
+ DefaultScope.prototype = options.PConstants;
+
+ var defaultScope = new DefaultScope();
+
+ // copy over all known Object types and helper objects
+ Object.keys(options).forEach(function(prop) {
+ defaultScope[prop] = options[prop];
+ });
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Class inheritance helper methods
+ ////////////////////////////////////////////////////////////////////////////
+
+ defaultScope.defineProperty = function(obj, name, desc) {
+ if("defineProperty" in Object) {
+ Object.defineProperty(obj, name, desc);
+ } else {
+ if (desc.hasOwnProperty("get")) {
+ obj.__defineGetter__(name, desc.get);
+ }
+ if (desc.hasOwnProperty("set")) {
+ obj.__defineSetter__(name, desc.set);
+ }
+ }
+ };
+
+ /**
+ * class overloading, part 1
+ */
+ function overloadBaseClassFunction(object, name, basefn) {
+ if (!object.hasOwnProperty(name) || typeof object[name] !== 'function') {
+ // object method is not a function or just inherited from Object.prototype
+ object[name] = basefn;
+ return;
+ }
+ var fn = object[name];
+ if ("$overloads" in fn) {
+ // the object method already overloaded (see defaultScope.addMethod)
+ // let's just change a fallback method
+ fn.$defaultOverload = basefn;
+ return;
+ }
+ if (!("$overloads" in basefn) && fn.length === basefn.length) {
+ // special case when we just overriding the method
+ return;
+ }
+ var overloads, defaultOverload;
+ if ("$overloads" in basefn) {
+ // let's inherit base class overloads to speed up things
+ overloads = basefn.$overloads.slice(0);
+ overloads[fn.length] = fn;
+ defaultOverload = basefn.$defaultOverload;
+ } else {
+ overloads = [];
+ overloads[basefn.length] = basefn;
+ overloads[fn.length] = fn;
+ defaultOverload = fn;
+ }
+ var hubfn = function() {
+ var fn = hubfn.$overloads[arguments.length] ||
+ ("$methodArgsIndex" in hubfn && arguments.length > hubfn.$methodArgsIndex ?
+ hubfn.$overloads[hubfn.$methodArgsIndex] : null) ||
+ hubfn.$defaultOverload;
+ return fn.apply(this, arguments);
+ };
+ hubfn.$overloads = overloads;
+ if ("$methodArgsIndex" in basefn) {
+ hubfn.$methodArgsIndex = basefn.$methodArgsIndex;
+ }
+ hubfn.$defaultOverload = defaultOverload;
+ hubfn.name = name;
+ object[name] = hubfn;
+ }
+
+ /**
+ * class overloading, part 2
+ */
+
+ function extendClass(subClass, baseClass) {
+ function extendGetterSetter(propertyName) {
+ defaultScope.defineProperty(subClass, propertyName, {
+ get: function() {
+ return baseClass[propertyName];
+ },
+ set: function(v) {
+ baseClass[propertyName]=v;
+ },
+ enumerable: true
+ });
+ }
+
+ var properties = [];
+ for (var propertyName in baseClass) {
+ if (typeof baseClass[propertyName] === 'function') {
+ overloadBaseClassFunction(subClass, propertyName, baseClass[propertyName]);
+ } else if(propertyName.charAt(0) !== "$" && !(propertyName in subClass)) {
+ // Delaying the properties extension due to the IE9 bug (see #918).
+ properties.push(propertyName);
+ }
+ }
+ while (properties.length > 0) {
+ extendGetterSetter(properties.shift());
+ }
+
+ subClass.$super = baseClass;
+ }
+
+ /**
+ * class overloading, part 3
+ */
+ defaultScope.extendClassChain = function(base) {
+ var path = [base];
+ for (var self = base.$upcast; self; self = self.$upcast) {
+ extendClass(self, base);
+ path.push(self);
+ base = self;
+ }
+ while (path.length > 0) {
+ path.pop().$self=base;
+ }
+ };
+
+ // static
+ defaultScope.extendStaticMembers = function(derived, base) {
+ extendClass(derived, base);
+ };
+
+ // interface
+ defaultScope.extendInterfaceMembers = function(derived, base) {
+ extendClass(derived, base);
+ };
+
+ /**
+ * Java methods and JavaScript functions differ enough that
+ * we need a special function to make sure it all links up
+ * as classical hierarchical class chains.
+ */
+ defaultScope.addMethod = function(object, name, fn, hasMethodArgs) {
+ var existingfn = object[name];
+ if (existingfn || hasMethodArgs) {
+ var args = fn.length;
+ // builds the overload methods table
+ if ("$overloads" in existingfn) {
+ existingfn.$overloads[args] = fn;
+ } else {
+ var hubfn = function() {
+ var fn = hubfn.$overloads[arguments.length] ||
+ ("$methodArgsIndex" in hubfn && arguments.length > hubfn.$methodArgsIndex ?
+ hubfn.$overloads[hubfn.$methodArgsIndex] : null) ||
+ hubfn.$defaultOverload;
+ return fn.apply(this, arguments);
+ };
+ var overloads = [];
+ if (existingfn) {
+ overloads[existingfn.length] = existingfn;
+ }
+ overloads[args] = fn;
+ hubfn.$overloads = overloads;
+ hubfn.$defaultOverload = existingfn || fn;
+ if (hasMethodArgs) {
+ hubfn.$methodArgsIndex = args;
+ }
+ hubfn.name = name;
+ object[name] = hubfn;
+ }
+ } else {
+ object[name] = fn;
+ }
+ };
+
+ // internal helper function
+ function isNumericalJavaType(type) {
+ if (typeof type !== "string") {
+ return false;
+ }
+ return ["byte", "int", "char", "color", "float", "long", "double"].indexOf(type) !== -1;
+ }
+
+ /**
+ * Java's arrays are pre-filled when declared with
+ * an initial size, but no content. JS arrays are not.
+ */
+ defaultScope.createJavaArray = function(type, bounds) {
+ var result = null,
+ defaultValue = null;
+ if (typeof type === "string") {
+ if (type === "boolean") {
+ defaultValue = false;
+ } else if (isNumericalJavaType(type)) {
+ defaultValue = 0;
+ }
+ }
+ if (typeof bounds[0] === 'number') {
+ var itemsCount = 0 | bounds[0];
+ if (bounds.length <= 1) {
+ result = [];
+ result.length = itemsCount;
+ for (var i = 0; i < itemsCount; ++i) {
+ result[i] = defaultValue;
+ }
+ } else {
+ result = [];
+ var newBounds = bounds.slice(1);
+ for (var j = 0; j < itemsCount; ++j) {
+ result.push(defaultScope.createJavaArray(type, newBounds));
+ }
+ }
+ }
+ return result;
+ };
+
+ // screenWidth and screenHeight are shared by all instances.
+ // and return the width/height of the browser's viewport.
+ defaultScope.defineProperty(defaultScope, 'screenWidth',
+ { get: function() { return window.innerWidth; } });
+
+ defaultScope.defineProperty(defaultScope, 'screenHeight',
+ { get: function() { return window.innerHeight; } });
+
+ return defaultScope;
+};
+
+},{}],7:[function(require,module,exports){
+/**
+ * Finalise the Processing.js object.
+ */
+module.exports = function finalizeProcessing(Processing, options) {
+
+ // unpack options
+ var window = options.window,
+ document = options.document,
+ XMLHttpRequest = window.XMLHttpRequest,
+ noop = options.noop,
+ isDOMPresent = options.isDOMPresent,
+ version = options.version,
+ undef;
+
+ // versioning
+ Processing.version = (version ? version : "@DEV-VERSION@");
+
+ // Share lib space
+ Processing.lib = {};
+
+ /**
+ * External libraries can be added to the global Processing
+ * objects with the `registerLibrary` function.
+ */
+ Processing.registerLibrary = function(name, library) {
+ Processing.lib[name] = library;
+ if(library.hasOwnProperty("init")) {
+ library.init(defaultScope);
+ }
+ };
+
+ /**
+ * This is the object that acts as our version of PApplet.
+ * This can be called as Processing.Sketch() or as
+ * Processing.Sketch(function) in which case the function
+ * must be an already-compiled-to-JS sketch function.
+ */
+ Processing.Sketch = function(attachFunction) {
+ this.attachFunction = attachFunction;
+ this.options = {
+ pauseOnBlur: false,
+ globalKeyEvents: false
+ };
+
+ /* Optional Sketch event hooks:
+ * onLoad - parsing/preloading is done, before sketch starts
+ * onSetup - setup() has been called, before first draw()
+ * onPause - noLoop() has been called, pausing draw loop
+ * onLoop - loop() has been called, resuming draw loop
+ * onFrameStart - draw() loop about to begin
+ * onFrameEnd - draw() loop finished
+ * onExit - exit() done being called
+ */
+ this.onLoad = noop;
+ this.onSetup = noop;
+ this.onPause = noop;
+ this.onLoop = noop;
+ this.onFrameStart = noop;
+ this.onFrameEnd = noop;
+ this.onExit = noop;
+
+ this.params = {};
+ this.imageCache = {
+ pending: 0,
+ images: {},
+ // Opera requires special administration for preloading
+ operaCache: {},
+ // Specify an optional img arg if the image is already loaded in the DOM,
+ // otherwise href will get loaded.
+ add: function(href, img) {
+ // Prevent muliple loads for an image, in case it gets
+ // preloaded more than once, or is added via JS and then preloaded.
+ if (this.images[href]) {
+ return;
+ }
+
+ if (!isDOMPresent) {
+ this.images[href] = null;
+ }
+
+ // No image in the DOM, kick-off a background load
+ if (!img) {
+ img = new Image();
+ img.onload = (function(owner) {
+ return function() {
+ owner.pending--;
+ };
+ }(this));
+ this.pending++;
+ img.src = href;
+ }
+
+ this.images[href] = img;
+
+ // Opera will not load images until they are inserted into the DOM.
+ if (window.opera) {
+ var div = document.createElement("div");
+ div.appendChild(img);
+ // we can't use "display: none", since that makes it invisible, and thus not load
+ div.style.position = "absolute";
+ div.style.opacity = 0;
+ div.style.width = "1px";
+ div.style.height= "1px";
+ if (!this.operaCache[href]) {
+ document.body.appendChild(div);
+ this.operaCache[href] = div;
+ }
+ }
+ }
+ };
+
+ this.sourceCode = undefined;
+ this.attach = function(processing) {
+ // either attachFunction or sourceCode must be present on attach
+ if(typeof this.attachFunction === "function") {
+ this.attachFunction(processing);
+ } else if(this.sourceCode) {
+ var func = ((new Function("return (" + this.sourceCode + ");"))());
+ func(processing);
+ this.attachFunction = func;
+ } else {
+ throw "Unable to attach sketch to the processing instance";
+ }
+ };
+
+ this.toString = function() {
+ var i;
+ var code = "((function(Sketch) {\n";
+ code += "var sketch = new Sketch(\n" + this.sourceCode + ");\n";
+ for(i in this.options) {
+ if(this.options.hasOwnProperty(i)) {
+ var value = this.options[i];
+ code += "sketch.options." + i + " = " +
+ (typeof value === 'string' ? '\"' + value + '\"' : "" + value) + ";\n";
+ }
+ }
+ for(i in this.imageCache) {
+ if(this.options.hasOwnProperty(i)) {
+ code += "sketch.imageCache.add(\"" + i + "\");\n";
+ }
+ }
+ // TODO serialize fonts
+ code += "return sketch;\n})(Processing.Sketch))";
+ return code;
+ };
+ };
+
+ /**
+ * aggregate all source code into a single file, then rewrite that
+ * source and bind to canvas via new Processing(canvas, sourcestring).
+ * @param {CANVAS} canvas The html canvas element to bind to
+ * @param {String[]} source The array of files that must be loaded
+ * @param {Function} onComplete A callback, called with the sketch as the argument.
+ */
+ var loadSketchFromSources = Processing.loadSketchFromSources = function(canvas, sources, onComplete) {
+ var code = [], errors = [], sourcesCount = sources.length, loaded = 0;
+
+ function ajaxAsync(url, callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState === 4) {
+ var error;
+ if (xhr.status !== 200 && xhr.status !== 0) {
+ error = "Invalid XHR status " + xhr.status;
+ } else if (xhr.responseText === "") {
+ // Give a hint when loading fails due to same-origin issues on file:/// urls
+ if ( ("withCredentials" in new XMLHttpRequest()) &&
+ (new XMLHttpRequest()).withCredentials === false &&
+ window.location.protocol === "file:" ) {
+ error = "XMLHttpRequest failure, possibly due to a same-origin policy violation. You can try loading this page in another browser, or load it from http://localhost using a local webserver. See the Processing.js README for a more detailed explanation of this problem and solutions.";
+ } else {
+ error = "File is empty.";
+ }
+ }
+
+ callback(xhr.responseText, error);
+ }
+ };
+ xhr.open("GET", url, true);
+ if (xhr.overrideMimeType) {
+ xhr.overrideMimeType("application/json");
+ }
+ xhr.setRequestHeader("If-Modified-Since", "Fri, 01 Jan 1960 00:00:00 GMT"); // no cache
+ xhr.send(null);
+ }
+
+ function loadBlock(index, filename) {
+ function callback(block, error) {
+ code[index] = block;
+ ++loaded;
+ if (error) {
+ errors.push(filename + " ==> " + error);
+ }
+ if (loaded === sourcesCount) {
+ if (errors.length === 0) {
+ // This used to throw, but it was constantly getting in the way of debugging where things go wrong!
+ var sketch = new Processing(canvas, code.join("\n"));
+ if (onComplete) {
+ onComplete(sketch);
+ }
+ } else {
+ throw "Processing.js: Unable to load pjs sketch files: " + errors.join("\n");
+ }
+ }
+ }
+ if (filename.charAt(0) === '#') {
+ // trying to get script from the element
+ var scriptElement = document.getElementById(filename.substring(1));
+ if (scriptElement) {
+ callback(scriptElement.text || scriptElement.textContent);
+ } else {
+ callback("", "Unable to load pjs sketch: element with id \'" + filename.substring(1) + "\' was not found");
+ }
+ return;
+ }
+
+ ajaxAsync(filename, callback);
+ }
+
+ for (var i = 0; i < sourcesCount; ++i) {
+ loadBlock(i, sources[i]);
+ }
+ };
+
+ /**
+ * Automatic initialization function.
+ */
+ var init = function() {
+ document.removeEventListener('DOMContentLoaded', init, false);
+ var i;
+
+ // before running through init, clear the instances list, to prevent
+ // sketch duplication when page content is dynamically swapped without
+ // swapping out processing.js
+ while (Processing.instances.length > 0) {
+ for (i = Processing.instances.length - 1; i >= 0; i--) {
+ if (Processing.instances[i]) {
+ Processing.instances[i].exit();
+ }
+ }
+ }
+
+ var canvas = document.getElementsByTagName('canvas'),
+ filenames;
+
+ for (i = 0, l = canvas.length; i < l; i++) {
+ // datasrc and data-src are deprecated.
+ var processingSources = canvas[i].getAttribute('data-processing-sources');
+ if (processingSources === null) {
+ // Temporary fallback for datasrc and data-src
+ processingSources = canvas[i].getAttribute('data-src');
+ if (processingSources === null) {
+ processingSources = canvas[i].getAttribute('datasrc');
+ }
+ }
+ if (processingSources) {
+ filenames = processingSources.split(/\s+/g);
+ for (var j = 0; j < filenames.length;) {
+ if (filenames[j]) {
+ j++;
+ } else {
+ filenames.splice(j, 1);
+ }
+ }
+ loadSketchFromSources(canvas[i], filenames);
+ }
+ }
+
+ // also process all <script>-indicated sketches, if there are any
+ var s, last, source, instance,
+ nodelist = document.getElementsByTagName('script'),
+ scripts=[];
+
+ // snapshot the DOM, as the nodelist is only a DOM view, and is
+ // updated instantly when a script element is added or removed.
+ for (s = nodelist.length - 1; s >= 0; s--) {
+ scripts.push(nodelist[s]);
+ }
+
+ // iterate over all script elements to see if they contain Processing code
+ for (s = 0, last = scripts.length; s < last; s++) {
+ var script = scripts[s];
+ if (!script.getAttribute) {
+ continue;
+ }
+
+ var type = script.getAttribute("type");
+ if (type && (type.toLowerCase() === "text/processing" || type.toLowerCase() === "application/processing")) {
+ var target = script.getAttribute("data-processing-target");
+ canvas = undef;
+ if (target) {
+ canvas = document.getElementById(target);
+ } else {
+ var nextSibling = script.nextSibling;
+ while (nextSibling && nextSibling.nodeType !== 1) {
+ nextSibling = nextSibling.nextSibling;
+ }
+ if (nextSibling && nextSibling.nodeName.toLowerCase() === "canvas") {
+ canvas = nextSibling;
+ }
+ }
+
+ if (canvas) {
+ if (script.getAttribute("src")) {
+ filenames = script.getAttribute("src").split(/\s+/);
+ loadSketchFromSources(canvas, filenames);
+ continue;
+ }
+ source = script.textContent || script.text;
+ instance = new Processing(canvas, source);
+ }
+ }
+ }
+ };
+
+ /**
+ * automatic loading of all sketches on the page
+ */
+ document.addEventListener('DOMContentLoaded', init, false);
+
+ /**
+ * Make Processing run through init after already having
+ * been set up for a page. This function exists mostly for pages
+ * that swap content in/out without reloading a page.
+ */
+ Processing.reload = init;
+
+ /**
+ * Disable the automatic loading of all sketches on the page.
+ * This will work as long as it's issued before DOMContentLoaded.
+ */
+ Processing.disableInit = function() {
+ document.removeEventListener('DOMContentLoaded', init, false);
+ };
+
+ // done.
+ return Processing;
+};
+
+},{}],8:[function(require,module,exports){
+/**
+ * Returns Java equals() result for two objects. If the first object
+ * has the "equals" function, it preforms the call of this function.
+ * Otherwise the method uses the JavaScript === operator.
+ *
+ * @param {Object} obj The first object.
+ * @param {Object} other The second object.
+ *
+ * @returns {boolean} true if the objects are equal.
+ */
+module.exports = function virtEquals(obj, other) {
+ if (obj === null || other === null) {
+ return (obj === null) && (other === null);
+ }
+ if (typeof (obj) === "string") {
+ return obj === other;
+ }
+ if (typeof(obj) !== "object") {
+ return obj === other;
+ }
+ if (obj.equals instanceof Function) {
+ return obj.equals(other);
+ }
+ return obj === other;
+};
+
+},{}],9:[function(require,module,exports){
+/**
+ * Returns Java hashCode() result for the object. If the object has the "hashCode" function,
+ * it preforms the call of this function. Otherwise it uses/creates the "$id" property,
+ * which is used as the hashCode.
+ *
+ * @param {Object} obj The object.
+ * @returns {int} The object's hash code.
+ */
+module.exports = function virtHashCode(obj, undef) {
+ if (typeof(obj) === "string") {
+ var hash = 0;
+ for (var i = 0; i < obj.length; ++i) {
+ hash = (hash * 31 + obj.charCodeAt(i)) & 0xFFFFFFFF;
+ }
+ return hash;
+ }
+ if (typeof(obj) !== "object") {
+ return obj & 0xFFFFFFFF;
+ }
+ if (obj.hashCode instanceof Function) {
+ return obj.hashCode();
+ }
+ if (obj.$id === undef) {
+ obj.$id = ((Math.floor(Math.random() * 0x10000) - 0x8000) << 16) | Math.floor(Math.random() * 0x10000);
+ }
+ return obj.$id;
+};
+
+},{}],10:[function(require,module,exports){
+/**
+ * An ArrayList stores a variable number of objects.
+ *
+ * @param {int} initialCapacity optional defines the initial capacity of the list, it's empty by default
+ *
+ * @returns {ArrayList} new ArrayList object
+ */
+module.exports = function(options) {
+ var virtHashCode = options.virtHashCode,
+ virtEquals = options.virtEquals;
+
+ function Iterator(array) {
+ var index = -1;
+ this.hasNext = function() {
+ return (index + 1) < array.length;
+ };
+
+ this.next = function() {
+ return array[++index];
+ };
+
+ this.remove = function() {
+ array.splice(index--, 1);
+ };
+ }
+
+ function ArrayList(a) {
+ var array = [];
+
+ if (a && a.toArray) {
+ array = a.toArray();
+ }
+
+ /**
+ * @member ArrayList
+ * ArrayList.get() Returns the element at the specified position in this list.
+ *
+ * @param {int} i index of element to return
+ *
+ * @returns {Object} the element at the specified position in this list.
+ */
+ this.get = function(i) {
+ return array[i];
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.contains() Returns true if this list contains the specified element.
+ *
+ * @param {Object} item element whose presence in this List is to be tested.
+ *
+ * @returns {boolean} true if the specified element is present; false otherwise.
+ */
+ this.contains = function(item) {
+ return this.indexOf(item)>-1;
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.indexOf() Returns the position this element takes in the list, or -1 if the element is not found.
+ *
+ * @param {Object} item element whose position in this List is to be tested.
+ *
+ * @returns {int} the list position that the first match for this element holds in the list, or -1 if it is not in the list.
+ */
+ this.indexOf = function(item) {
+ for (var i = 0, len = array.length; i < len; ++i) {
+ if (virtEquals(item, array[i])) {
+ return i;
+ }
+ }
+ return -1;
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.lastIndexOf() Returns the index of the last occurrence of the specified element in this list,
+ * or -1 if this list does not contain the element. More formally, returns the highest index i such that
+ * (o==null ? get(i)==null : o.equals(get(i))), or -1 if there is no such index.
+ *
+ * @param {Object} item element to search for.
+ *
+ * @returns {int} the index of the last occurrence of the specified element in this list, or -1 if this list does not contain the element.
+ */
+ this.lastIndexOf = function(item) {
+ for (var i = array.length-1; i >= 0; --i) {
+ if (virtEquals(item, array[i])) {
+ return i;
+ }
+ }
+ return -1;
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.add() Adds the specified element to this list.
+ *
+ * @param {int} index optional index at which the specified element is to be inserted
+ * @param {Object} object element to be added to the list
+ */
+ this.add = function() {
+ if (arguments.length === 1) {
+ array.push(arguments[0]); // for add(Object)
+ } else if (arguments.length === 2) {
+ var arg0 = arguments[0];
+ if (typeof arg0 === 'number') {
+ if (arg0 >= 0 && arg0 <= array.length) {
+ array.splice(arg0, 0, arguments[1]); // for add(i, Object)
+ } else {
+ throw(arg0 + " is not a valid index");
+ }
+ } else {
+ throw(typeof arg0 + " is not a number");
+ }
+ } else {
+ throw("Please use the proper number of parameters.");
+ }
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.addAll(collection) appends all of the elements in the specified
+ * Collection to the end of this list, in the order that they are returned by
+ * the specified Collection's Iterator.
+ *
+ * When called as addAll(index, collection) the elements are inserted into
+ * this list at the position indicated by index.
+ *
+ * @param {index} Optional; specifies the position the colletion should be inserted at
+ * @param {collection} Any iterable object (ArrayList, HashMap.keySet(), etc.)
+ * @throws out of bounds error for negative index, or index greater than list size.
+ */
+ this.addAll = function(arg1, arg2) {
+ // addAll(int, Collection)
+ var it;
+ if (typeof arg1 === "number") {
+ if (arg1 < 0 || arg1 > array.length) {
+ throw("Index out of bounds for addAll: " + arg1 + " greater or equal than " + array.length);
+ }
+ it = new ObjectIterator(arg2);
+ while (it.hasNext()) {
+ array.splice(arg1++, 0, it.next());
+ }
+ }
+ // addAll(Collection)
+ else {
+ it = new ObjectIterator(arg1);
+ while (it.hasNext()) {
+ array.push(it.next());
+ }
+ }
+ };
+ /**
+ * @member ArrayList
+ * ArrayList.set() Replaces the element at the specified position in this list with the specified element.
+ *
+ * @param {int} index index of element to replace
+ * @param {Object} object element to be stored at the specified position
+ */
+ this.set = function() {
+ if (arguments.length === 2) {
+ var arg0 = arguments[0];
+ if (typeof arg0 === 'number') {
+ if (arg0 >= 0 && arg0 < array.length) {
+ array.splice(arg0, 1, arguments[1]);
+ } else {
+ throw(arg0 + " is not a valid index.");
+ }
+ } else {
+ throw(typeof arg0 + " is not a number");
+ }
+ } else {
+ throw("Please use the proper number of parameters.");
+ }
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.size() Returns the number of elements in this list.
+ *
+ * @returns {int} the number of elements in this list
+ */
+ this.size = function() {
+ return array.length;
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.clear() Removes all of the elements from this list. The list will be empty after this call returns.
+ */
+ this.clear = function() {
+ array.length = 0;
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.remove() Removes an element either based on index, if the argument is a number, or
+ * by equality check, if the argument is an object.
+ *
+ * @param {int|Object} item either the index of the element to be removed, or the element itself.
+ *
+ * @returns {Object|boolean} If removal is by index, the element that was removed, or null if nothing was removed. If removal is by object, true if removal occurred, otherwise false.
+ */
+ this.remove = function(item) {
+ if (typeof item === 'number') {
+ return array.splice(item, 1)[0];
+ }
+ item = this.indexOf(item);
+ if (item > -1) {
+ array.splice(item, 1);
+ return true;
+ }
+ return false;
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.removeAll Removes from this List all of the elements from
+ * the current ArrayList which are present in the passed in paramater ArrayList 'c'.
+ * Shifts any succeeding elements to the left (reduces their index).
+ *
+ * @param {ArrayList} the ArrayList to compare to the current ArrayList
+ *
+ * @returns {boolean} true if the ArrayList had an element removed; false otherwise
+ */
+ this.removeAll = function(c) {
+ var i, x, item,
+ newList = new ArrayList();
+ newList.addAll(this);
+ this.clear();
+ // For every item that exists in the original ArrayList and not in the c ArrayList
+ // copy it into the empty 'this' ArrayList to create the new 'this' Array.
+ for (i = 0, x = 0; i < newList.size(); i++) {
+ item = newList.get(i);
+ if (!c.contains(item)) {
+ this.add(x++, item);
+ }
+ }
+ if (this.size() < newList.size()) {
+ return true;
+ }
+ return false;
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.isEmpty() Tests if this list has no elements.
+ *
+ * @returns {boolean} true if this list has no elements; false otherwise
+ */
+ this.isEmpty = function() {
+ return !array.length;
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.clone() Returns a shallow copy of this ArrayList instance. (The elements themselves are not copied.)
+ *
+ * @returns {ArrayList} a clone of this ArrayList instance
+ */
+ this.clone = function() {
+ return new ArrayList(this);
+ };
+
+ /**
+ * @member ArrayList
+ * ArrayList.toArray() Returns an array containing all of the elements in this list in the correct order.
+ *
+ * @returns {Object[]} Returns an array containing all of the elements in this list in the correct order
+ */
+ this.toArray = function() {
+ return array.slice(0);
+ };
+
+ this.iterator = function() {
+ return new Iterator(array);
+ };
+ }
+
+ return ArrayList;
+};
+
+},{}],11:[function(require,module,exports){
+module.exports = (function(charMap, undef) {
+
+ var Char = function(chr) {
+ if (typeof chr === 'string' && chr.length === 1) {
+ this.code = chr.charCodeAt(0);
+ } else if (typeof chr === 'number') {
+ this.code = chr;
+ } else if (chr instanceof Char) {
+ this.code = chr;
+ } else {
+ this.code = NaN;
+ }
+ return (charMap[this.code] === undef) ? charMap[this.code] = this : charMap[this.code];
+ };
+
+ Char.prototype.toString = function() {
+ return String.fromCharCode(this.code);
+ };
+
+ Char.prototype.valueOf = function() {
+ return this.code;
+ };
+
+ return Char;
+}({}));
+
+},{}],12:[function(require,module,exports){
+/**
+* A HashMap stores a collection of objects, each referenced by a key. This is similar to an Array, only
+* instead of accessing elements with a numeric index, a String is used. (If you are familiar with
+* associative arrays from other languages, this is the same idea.)
+*
+* @param {int} initialCapacity defines the initial capacity of the map, it's 16 by default
+* @param {float} loadFactor the load factor for the map, the default is 0.75
+* @param {Map} m gives the new HashMap the same mappings as this Map
+*/
+module.exports = function(options) {
+ var virtHashCode = options.virtHashCode,
+ virtEquals = options.virtEquals;
+
+ /**
+ * @member HashMap
+ * A HashMap stores a collection of objects, each referenced by a key. This is similar to an Array, only
+ * instead of accessing elements with a numeric index, a String is used. (If you are familiar with
+ * associative arrays from other languages, this is the same idea.)
+ *
+ * @param {int} initialCapacity defines the initial capacity of the map, it's 16 by default
+ * @param {float} loadFactor the load factor for the map, the default is 0.75
+ * @param {Map} m gives the new HashMap the same mappings as this Map
+ */
+ function HashMap() {
+ if (arguments.length === 1 && arguments[0] instanceof HashMap) {
+ return arguments[0].clone();
+ }
+
+ var initialCapacity = arguments.length > 0 ? arguments[0] : 16;
+ var loadFactor = arguments.length > 1 ? arguments[1] : 0.75;
+ var buckets = [];
+ buckets.length = initialCapacity;
+ var count = 0;
+ var hashMap = this;
+
+ function getBucketIndex(key) {
+ var index = virtHashCode(key) % buckets.length;
+ return index < 0 ? buckets.length + index : index;
+ }
+ function ensureLoad() {
+ if (count <= loadFactor * buckets.length) {
+ return;
+ }
+ var allEntries = [];
+ for (var i = 0; i < buckets.length; ++i) {
+ if (buckets[i] !== undefined) {
+ allEntries = allEntries.concat(buckets[i]);
+ }
+ }
+ var newBucketsLength = buckets.length * 2;
+ buckets = [];
+ buckets.length = newBucketsLength;
+ for (var j = 0; j < allEntries.length; ++j) {
+ var index = getBucketIndex(allEntries[j].key);
+ var bucket = buckets[index];
+ if (bucket === undefined) {
+ buckets[index] = bucket = [];
+ }
+ bucket.push(allEntries[j]);
+ }
+ }
+
+ function Iterator(conversion, removeItem) {
+ var bucketIndex = 0;
+ var itemIndex = -1;
+ var endOfBuckets = false;
+ var currentItem;
+
+ function findNext() {
+ while (!endOfBuckets) {
+ ++itemIndex;
+ if (bucketIndex >= buckets.length) {
+ endOfBuckets = true;
+ } else if (buckets[bucketIndex] === undefined || itemIndex >= buckets[bucketIndex].length) {
+ itemIndex = -1;
+ ++bucketIndex;
+ } else {
+ return;
+ }
+ }
+ }
+
+ /*
+ * @member Iterator
+ * Checks if the Iterator has more items
+ */
+ this.hasNext = function() {
+ return !endOfBuckets;
+ };
+
+ /*
+ * @member Iterator
+ * Return the next Item
+ */
+ this.next = function() {
+ currentItem = conversion(buckets[bucketIndex][itemIndex]);
+ findNext();
+ return currentItem;
+ };
+
+ /*
+ * @member Iterator
+ * Remove the current item
+ */
+ this.remove = function() {
+ if (currentItem !== undefined) {
+ removeItem(currentItem);
+ --itemIndex;
+ findNext();
+ }
+ };
+
+ findNext();
+ }
+
+ function Set(conversion, isIn, removeItem) {
+ this.clear = function() {
+ hashMap.clear();
+ };
+
+ this.contains = function(o) {
+ return isIn(o);
+ };
+
+ this.containsAll = function(o) {
+ var it = o.iterator();
+ while (it.hasNext()) {
+ if (!this.contains(it.next())) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ this.isEmpty = function() {
+ return hashMap.isEmpty();
+ };
+
+ this.iterator = function() {
+ return new Iterator(conversion, removeItem);
+ };
+
+ this.remove = function(o) {
+ if (this.contains(o)) {
+ removeItem(o);
+ return true;
+ }
+ return false;
+ };
+
+ this.removeAll = function(c) {
+ var it = c.iterator();
+ var changed = false;
+ while (it.hasNext()) {
+ var item = it.next();
+ if (this.contains(item)) {
+ removeItem(item);
+ changed = true;
+ }
+ }
+ return true;
+ };
+
+ this.retainAll = function(c) {
+ var it = this.iterator();
+ var toRemove = [];
+ while (it.hasNext()) {
+ var entry = it.next();
+ if (!c.contains(entry)) {
+ toRemove.push(entry);
+ }
+ }
+ for (var i = 0; i < toRemove.length; ++i) {
+ removeItem(toRemove[i]);
+ }
+ return toRemove.length > 0;
+ };
+
+ this.size = function() {
+ return hashMap.size();
+ };
+
+ this.toArray = function() {
+ var result = [];
+ var it = this.iterator();
+ while (it.hasNext()) {
+ result.push(it.next());
+ }
+ return result;
+ };
+ }
+
+ function Entry(pair) {
+ this._isIn = function(map) {
+ return map === hashMap && (pair.removed === undefined);
+ };
+
+ this.equals = function(o) {
+ return virtEquals(pair.key, o.getKey());
+ };
+
+ this.getKey = function() {
+ return pair.key;
+ };
+
+ this.getValue = function() {
+ return pair.value;
+ };
+
+ this.hashCode = function(o) {
+ return virtHashCode(pair.key);
+ };
+
+ this.setValue = function(value) {
+ var old = pair.value;
+ pair.value = value;
+ return old;
+ };
+ }
+
+ this.clear = function() {
+ count = 0;
+ buckets = [];
+ buckets.length = initialCapacity;
+ };
+
+ this.clone = function() {
+ var map = new HashMap();
+ map.putAll(this);
+ return map;
+ };
+
+ this.containsKey = function(key) {
+ var index = getBucketIndex(key);
+ var bucket = buckets[index];
+ if (bucket === undefined) {
+ return false;
+ }
+ for (var i = 0; i < bucket.length; ++i) {
+ if (virtEquals(bucket[i].key, key)) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ this.containsValue = function(value) {
+ for (var i = 0; i < buckets.length; ++i) {
+ var bucket = buckets[i];
+ if (bucket === undefined) {
+ continue;
+ }
+ for (var j = 0; j < bucket.length; ++j) {
+ if (virtEquals(bucket[j].value, value)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ this.entrySet = function() {
+ return new Set(
+
+ function(pair) {
+ return new Entry(pair);
+ },
+
+ function(pair) {
+ return (pair instanceof Entry) && pair._isIn(hashMap);
+ },
+
+ function(pair) {
+ return hashMap.remove(pair.getKey());
+ });
+ };
+
+ this.get = function(key) {
+ var index = getBucketIndex(key);
+ var bucket = buckets[index];
+ if (bucket === undefined) {
+ return null;
+ }
+ for (var i = 0; i < bucket.length; ++i) {
+ if (virtEquals(bucket[i].key, key)) {
+ return bucket[i].value;
+ }
+ }
+ return null;
+ };
+
+ this.isEmpty = function() {
+ return count === 0;
+ };
+
+ this.keySet = function() {
+ return new Set(
+ // get key from pair
+ function(pair) {
+ return pair.key;
+ },
+ // is-in test
+ function(key) {
+ return hashMap.containsKey(key);
+ },
+ // remove from hashmap by key
+ function(key) {
+ return hashMap.remove(key);
+ }
+ );
+ };
+
+ this.values = function() {
+ return new Set(
+ // get value from pair
+ function(pair) {
+ return pair.value;
+ },
+ // is-in test
+ function(value) {
+ return hashMap.containsValue(value);
+ },
+ // remove from hashmap by value
+ function(value) {
+ return hashMap.removeByValue(value);
+ }
+ );
+ };
+
+ this.put = function(key, value) {
+ var index = getBucketIndex(key);
+ var bucket = buckets[index];
+ if (bucket === undefined) {
+ ++count;
+ buckets[index] = [{
+ key: key,
+ value: value
+ }];
+ ensureLoad();
+ return null;
+ }
+ for (var i = 0; i < bucket.length; ++i) {
+ if (virtEquals(bucket[i].key, key)) {
+ var previous = bucket[i].value;
+ bucket[i].value = value;
+ return previous;
+ }
+ }
+ ++count;
+ bucket.push({
+ key: key,
+ value: value
+ });
+ ensureLoad();
+ return null;
+ };
+
+ this.putAll = function(m) {
+ var it = m.entrySet().iterator();
+ while (it.hasNext()) {
+ var entry = it.next();
+ this.put(entry.getKey(), entry.getValue());
+ }
+ };
+
+ this.remove = function(key) {
+ var index = getBucketIndex(key);
+ var bucket = buckets[index];
+ if (bucket === undefined) {
+ return null;
+ }
+ for (var i = 0; i < bucket.length; ++i) {
+ if (virtEquals(bucket[i].key, key)) {
+ --count;
+ var previous = bucket[i].value;
+ bucket[i].removed = true;
+ if (bucket.length > 1) {
+ bucket.splice(i, 1);
+ } else {
+ buckets[index] = undefined;
+ }
+ return previous;
+ }
+ }
+ return null;
+ };
+
+ this.removeByValue = function(value) {
+ var bucket, i, ilen, pair;
+ for (bucket in buckets) {
+ if (buckets.hasOwnProperty(bucket)) {
+ for (i = 0, ilen = buckets[bucket].length; i < ilen; i++) {
+ pair = buckets[bucket][i];
+ // removal on values is based on identity, not equality
+ if (pair.value === value) {
+ buckets[bucket].splice(i, 1);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ };
+
+ this.size = function() {
+ return count;
+ };
+ }
+
+ return HashMap;
+};
+
+},{}],13:[function(require,module,exports){
+// module export
+module.exports = function(options,undef) {
+ var window = options.Browser.window,
+ document = options.Browser.document,
+ noop = options.noop;
+
+ /**
+ * [internal function] computeFontMetrics() calculates various metrics for text
+ * placement. Currently this function computes the ascent, descent and leading
+ * (from "lead", used for vertical space) values for the currently active font.
+ */
+ function computeFontMetrics(pfont) {
+ var emQuad = 250,
+ correctionFactor = pfont.size / emQuad,
+ canvas = document.createElement("canvas");
+ canvas.width = 2*emQuad;
+ canvas.height = 2*emQuad;
+ canvas.style.opacity = 0;
+ var cfmFont = pfont.getCSSDefinition(emQuad+"px", "normal"),
+ ctx = canvas.getContext("2d");
+ ctx.font = cfmFont;
+
+ // Size the canvas using a string with common max-ascent and max-descent letters.
+ // Changing the canvas dimensions resets the context, so we must reset the font.
+ var protrusions = "dbflkhyjqpg";
+ canvas.width = ctx.measureText(protrusions).width;
+ ctx.font = cfmFont;
+
+ // for text lead values, we meaure a multiline text container.
+ var leadDiv = document.createElement("div");
+ leadDiv.style.position = "absolute";
+ leadDiv.style.opacity = 0;
+ leadDiv.style.fontFamily = '"' + pfont.name + '"';
+ leadDiv.style.fontSize = emQuad + "px";
+ leadDiv.innerHTML = protrusions + "<br/>" + protrusions;
+ document.body.appendChild(leadDiv);
+
+ var w = canvas.width,
+ h = canvas.height,
+ baseline = h/2;
+
+ // Set all canvas pixeldata values to 255, with all the content
+ // data being 0. This lets us scan for data[i] != 255.
+ ctx.fillStyle = "white";
+ ctx.fillRect(0, 0, w, h);
+ ctx.fillStyle = "black";
+ ctx.fillText(protrusions, 0, baseline);
+ var pixelData = ctx.getImageData(0, 0, w, h).data;
+
+ // canvas pixel data is w*4 by h*4, because R, G, B and A are separate,
+ // consecutive values in the array, rather than stored as 32 bit ints.
+ var i = 0,
+ w4 = w * 4,
+ len = pixelData.length;
+
+ // Finding the ascent uses a normal, forward scanline
+ while (++i < len && pixelData[i] === 255) {
+ noop();
+ }
+ var ascent = Math.round(i / w4);
+
+ // Finding the descent uses a reverse scanline
+ i = len - 1;
+ while (--i > 0 && pixelData[i] === 255) {
+ noop();
+ }
+ var descent = Math.round(i / w4);
+
+ // set font metrics
+ pfont.ascent = correctionFactor * (baseline - ascent);
+ pfont.descent = correctionFactor * (descent - baseline);
+
+ // Then we try to get the real value from the browser
+ if (document.defaultView.getComputedStyle) {
+ var leadDivHeight = document.defaultView.getComputedStyle(leadDiv,null).getPropertyValue("height");
+ leadDivHeight = correctionFactor * leadDivHeight.replace("px","");
+ if (leadDivHeight >= pfont.size * 2) {
+ pfont.leading = Math.round(leadDivHeight/2);
+ }
+ }
+ document.body.removeChild(leadDiv);
+
+ // if we're caching, cache the context used for this pfont
+ if (pfont.caching) {
+ return ctx;
+ }
+ }
+
+ /**
+ * Constructor for a system or from-file (non-SVG) font.
+ */
+ function PFont(name, size) {
+ // according to the P5 API, new PFont() is legal (albeit completely useless)
+ if (name === undef) {
+ name = "";
+ }
+ this.name = name;
+ if (size === undef) {
+ size = 0;
+ }
+ this.size = size;
+ this.glyph = false;
+ this.ascent = 0;
+ this.descent = 0;
+ // For leading, the "safe" value uses the standard TEX ratio
+ this.leading = 1.2 * size;
+
+ // Note that an italic, bold font must used "... Bold Italic"
+ // in P5. "... Italic Bold" is treated as normal/normal.
+ var illegalIndicator = name.indexOf(" Italic Bold");
+ if (illegalIndicator !== -1) {
+ name = name.substring(0, illegalIndicator);
+ }
+
+ // determine font style
+ this.style = "normal";
+ var italicsIndicator = name.indexOf(" Italic");
+ if (italicsIndicator !== -1) {
+ name = name.substring(0, italicsIndicator);
+ this.style = "italic";
+ }
+
+ // determine font weight
+ this.weight = "normal";
+ var boldIndicator = name.indexOf(" Bold");
+ if (boldIndicator !== -1) {
+ name = name.substring(0, boldIndicator);
+ this.weight = "bold";
+ }
+
+ // determine font-family name
+ this.family = "sans-serif";
+ if (name !== undef) {
+ switch(name) {
+ case "sans-serif":
+ case "serif":
+ case "monospace":
+ case "fantasy":
+ case "cursive":
+ this.family = name;
+ break;
+ default:
+ this.family = '"' + name + '", sans-serif';
+ break;
+ }
+ }
+ // Calculate the ascent/descent/leading value based on
+ // how the browser renders this font.
+ this.context2d = computeFontMetrics(this);
+ this.css = this.getCSSDefinition();
+ if (this.context2d) {
+ this.context2d.font = this.css;
+ }
+ }
+
+ /**
+ * regulates whether or not we're caching the canvas
+ * 2d context for quick text width computation.
+ */
+ PFont.prototype.caching = true;
+
+ /**
+ * This function generates the CSS "font" string for this PFont
+ */
+ PFont.prototype.getCSSDefinition = function(fontSize, lineHeight) {
+ if(fontSize===undef) {
+ fontSize = this.size + "px";
+ }
+ if(lineHeight===undef) {
+ lineHeight = this.leading + "px";
+ }
+ // CSS "font" definition: font-style font-variant font-weight font-size/line-height font-family
+ var components = [this.style, "normal", this.weight, fontSize + "/" + lineHeight, this.family];
+ return components.join(" ");
+ };
+
+ /**
+ * Rely on the cached context2d measureText function.
+ */
+ PFont.prototype.measureTextWidth = function(string) {
+ return this.context2d.measureText(string).width;
+ };
+
+ /**
+ * FALLBACK FUNCTION -- replaces Pfont.prototype.measureTextWidth
+ * when the font cache becomes too large. This contructs a new
+ * canvas 2d context object for calling measureText on.
+ */
+ PFont.prototype.measureTextWidthFallback = function(string) {
+ var canvas = document.createElement("canvas"),
+ ctx = canvas.getContext("2d");
+ ctx.font = this.css;
+ return ctx.measureText(string).width;
+ };
+
+ /**
+ * Global "loaded fonts" list, internal to PFont
+ */
+ PFont.PFontCache = { length: 0 };
+
+ /**
+ * This function acts as single access point for getting and caching
+ * fonts across all sketches handled by an instance of Processing.js
+ */
+ PFont.get = function(fontName, fontSize) {
+ // round fontSize to one decimal point
+ fontSize = ((fontSize*10)+0.5|0)/10;
+ var cache = PFont.PFontCache,
+ idx = fontName+"/"+fontSize;
+ if (!cache[idx]) {
+ cache[idx] = new PFont(fontName, fontSize);
+ cache.length++;
+
+ // FALLBACK FUNCTIONALITY 1:
+ // If the cache has become large, switch over from full caching
+ // to caching only the static metrics for each new font request.
+ if (cache.length === 50) {
+ PFont.prototype.measureTextWidth = PFont.prototype.measureTextWidthFallback;
+ PFont.prototype.caching = false;
+ // clear contexts stored for each cached font
+ var entry;
+ for (entry in cache) {
+ if (entry !== "length") {
+ cache[entry].context2d = null;
+ }
+ }
+ return new PFont(fontName, fontSize);
+ }
+
+ // FALLBACK FUNCTIONALITY 2:
+ // If the cache has become too large, switch off font caching entirely.
+ if (cache.length === 400) {
+ PFont.PFontCache = {};
+ PFont.get = PFont.getFallback;
+ return new PFont(fontName, fontSize);
+ }
+ }
+ return cache[idx];
+ };
+
+ /**
+ * FALLBACK FUNCTION -- replaces PFont.get when the font cache
+ * becomes too large. This function bypasses font caching entirely.
+ */
+ PFont.getFallback = function(fontName, fontSize) {
+ return new PFont(fontName, fontSize);
+ };
+
+ /**
+ * Lists all standard fonts. Due to browser limitations, this list is
+ * not the system font list, like in P5, but the CSS "genre" list.
+ */
+ PFont.list = function() {
+ return ["sans-serif", "serif", "monospace", "fantasy", "cursive"];
+ };
+
+ /**
+ * Loading external fonts through @font-face rules is handled by PFont,
+ * to ensure fonts loaded in this way are globally available.
+ */
+ PFont.preloading = {
+ // template element used to compare font sizes
+ template: {},
+ // indicates whether or not the reference tiny font has been loaded
+ initialized: false,
+ // load the reference tiny font via a css @font-face rule
+ initialize: function() {
+ var generateTinyFont = function() {
+ var encoded = "#E3KAI2wAgT1MvMg7Eo3VmNtYX7ABi3CxnbHlm" +
+ "7Abw3kaGVhZ7ACs3OGhoZWE7A53CRobXR47AY3" +
+ "AGbG9jYQ7G03Bm1heH7ABC3CBuYW1l7Ae3AgcG" +
+ "9zd7AI3AE#B3AQ2kgTY18PPPUACwAg3ALSRoo3" +
+ "#yld0xg32QAB77#E777773B#E3C#I#Q77773E#" +
+ "Q7777777772CMAIw7AB77732B#M#Q3wAB#g3B#" +
+ "E#E2BB//82BB////w#B7#gAEg3E77x2B32B#E#" +
+ "Q#MTcBAQ32gAe#M#QQJ#E32M#QQJ#I#g32Q77#";
+ var expand = function(input) {
+ return "AAAAAAAA".substr(~~input ? 7-input : 6);
+ };
+ return encoded.replace(/[#237]/g, expand);
+ };
+ var fontface = document.createElement("style");
+ fontface.setAttribute("type","text/css");
+ fontface.innerHTML = "@font-face {\n" +
+ ' font-family: "PjsEmptyFont";' + "\n" +
+ " src: url('data:application/x-font-ttf;base64,"+generateTinyFont()+"')\n" +
+ " format('truetype');\n" +
+ "}";
+ document.head.appendChild(fontface);
+
+ // set up the template element
+ var element = document.createElement("span");
+ element.style.cssText = 'position: absolute; top: -1000; left: 0; opacity: 0; font-family: "PjsEmptyFont", fantasy;';
+ element.innerHTML = "AAAAAAAA";
+ document.body.appendChild(element);
+ this.template = element;
+
+ this.initialized = true;
+ },
+ // Shorthand function to get the computed width for an element.
+ getElementWidth: function(element) {
+ return document.defaultView.getComputedStyle(element,"").getPropertyValue("width");
+ },
+ // time taken so far in attempting to load a font
+ timeAttempted: 0,
+ // returns false if no fonts are pending load, or true otherwise.
+ pending: function(intervallength) {
+ if (!this.initialized) {
+ this.initialize();
+ }
+ var element,
+ computedWidthFont,
+ computedWidthRef = this.getElementWidth(this.template);
+ for (var i = 0; i < this.fontList.length; i++) {
+ // compares size of text in pixels. if equal, custom font is not yet loaded
+ element = this.fontList[i];
+ computedWidthFont = this.getElementWidth(element);
+ if (this.timeAttempted < 4000 && computedWidthFont === computedWidthRef) {
+ this.timeAttempted += intervallength;
+ return true;
+ } else {
+ document.body.removeChild(element);
+ this.fontList.splice(i--, 1);
+ this.timeAttempted = 0;
+ }
+ }
+ // if there are no more fonts to load, pending is false
+ if (this.fontList.length === 0) {
+ return false;
+ }
+ // We should have already returned before getting here.
+ // But, if we do get here, length!=0 so fonts are pending.
+ return true;
+ },
+ // fontList contains elements to compare font sizes against a template
+ fontList: [],
+ // addedList contains the fontnames of all the fonts loaded via @font-face
+ addedList: {},
+ // adds a font to the font cache
+ // creates an element using the font, to start loading the font,
+ // and compare against a default font to see if the custom font is loaded
+ add: function(fontSrc) {
+ if (!this.initialized) {
+ this.initialize();
+ }
+ // fontSrc can be a string or a javascript object
+ // acceptable fonts are .ttf, .otf, and data uri
+ var fontName = (typeof fontSrc === 'object' ? fontSrc.fontFace : fontSrc),
+ fontUrl = (typeof fontSrc === 'object' ? fontSrc.url : fontSrc);
+
+ // check whether we already created the @font-face rule for this font
+ if (this.addedList[fontName]) {
+ return;
+ }
+
+ // if we didn't, create the @font-face rule
+ var style = document.createElement("style");
+ style.setAttribute("type","text/css");
+ style.innerHTML = "@font-face{\n font-family: '" + fontName + "';\n src: url('" + fontUrl + "');\n}\n";
+ document.head.appendChild(style);
+ this.addedList[fontName] = true;
+
+ // also create the element to load and compare the new font
+ var element = document.createElement("span");
+ element.style.cssText = "position: absolute; top: 0; left: 0; opacity: 0;";
+ element.style.fontFamily = '"' + fontName + '", "PjsEmptyFont", fantasy';
+ element.innerHTML = "AAAAAAAA";
+ document.body.appendChild(element);
+ this.fontList.push(element);
+ }
+ };
+
+ return PFont;
+};
+},{}],14:[function(require,module,exports){
+module.exports = function(options, undef) {
+
+ // FIXME: hack
+ var p = options.p;
+
+ /**
+ * PMatrix2D is a 3x2 affine matrix implementation. The constructor accepts another PMatrix2D or a list of six float elements.
+ * If no parameters are provided the matrix is set to the identity matrix.
+ *
+ * @param {PMatrix2D} matrix the initial matrix to set to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fifth element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ var PMatrix2D = function() {
+ if (arguments.length === 0) {
+ this.reset();
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ this.set(arguments[0].array());
+ } else if (arguments.length === 6) {
+ this.set(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
+ }
+ };
+
+ /**
+ * PMatrix2D methods
+ */
+ PMatrix2D.prototype = {
+ /**
+ * @member PMatrix2D
+ * The set() function sets the matrix elements. The function accepts either another PMatrix2D, an array of elements, or a list of six floats.
+ *
+ * @param {PMatrix2D} matrix the matrix to set this matrix to
+ * @param {float[]} elements an array of elements to set this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ set: function() {
+ if (arguments.length === 6) {
+ var a = arguments;
+ this.set([a[0], a[1], a[2],
+ a[3], a[4], a[5]]);
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ this.elements = arguments[0].array();
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ this.elements = arguments[0].slice();
+ }
+ },
+ /**
+ * @member PMatrix2D
+ * The get() function returns a copy of this PMatrix2D.
+ *
+ * @return {PMatrix2D} a copy of this PMatrix2D
+ */
+ get: function() {
+ var outgoing = new PMatrix2D();
+ outgoing.set(this.elements);
+ return outgoing;
+ },
+ /**
+ * @member PMatrix2D
+ * The reset() function sets this PMatrix2D to the identity matrix.
+ */
+ reset: function() {
+ this.set([1, 0, 0, 0, 1, 0]);
+ },
+ /**
+ * @member PMatrix2D
+ * The array() function returns a copy of the element values.
+ * @addon
+ *
+ * @return {float[]} returns a copy of the element values
+ */
+ array: function array() {
+ return this.elements.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The translate() function translates this matrix by moving the current coordinates to the location specified by tx and ty.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ */
+ translate: function(tx, ty) {
+ this.elements[2] = tx * this.elements[0] + ty * this.elements[1] + this.elements[2];
+ this.elements[5] = tx * this.elements[3] + ty * this.elements[4] + this.elements[5];
+ },
+ /**
+ * @member PMatrix2D
+ * The invTranslate() function translates this matrix by moving the current coordinates to the negative location specified by tx and ty.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ */
+ invTranslate: function(tx, ty) {
+ this.translate(-tx, -ty);
+ },
+ /**
+ * @member PMatrix2D
+ * The transpose() function is not used in processingjs.
+ */
+ transpose: function() {
+ // Does nothing in Processing.
+ },
+ /**
+ * @member PMatrix2D
+ * The mult() function multiplied this matrix.
+ * If two array elements are passed in the function will multiply a two element vector against this matrix.
+ * If target is null or not length four, a new float array will be returned.
+ * The values for vec and target can be the same (though that's less efficient).
+ * If two PVectors are passed in the function multiply the x and y coordinates of a PVector against this matrix.
+ *
+ * @param {PVector} source, target the PVectors used to multiply this matrix
+ * @param {float[]} source, target the arrays used to multiply this matrix
+ *
+ * @return {PVector|float[]} returns a PVector or an array representing the new matrix
+ */
+ mult: function(source, target) {
+ var x, y;
+ if (source instanceof PVector) {
+ x = source.x;
+ y = source.y;
+ if (!target) {
+ target = new PVector();
+ }
+ } else if (source instanceof Array) {
+ x = source[0];
+ y = source[1];
+ if (!target) {
+ target = [];
+ }
+ }
+ if (target instanceof Array) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2];
+ target[1] = this.elements[3] * x + this.elements[4] * y + this.elements[5];
+ } else if (target instanceof PVector) {
+ target.x = this.elements[0] * x + this.elements[1] * y + this.elements[2];
+ target.y = this.elements[3] * x + this.elements[4] * y + this.elements[5];
+ target.z = 0;
+ }
+ return target;
+ },
+ /**
+ * @member PMatrix2D
+ * The multX() function calculates the x component of a vector from a transformation.
+ *
+ * @param {float} x the x component of the vector being transformed
+ * @param {float} y the y component of the vector being transformed
+ *
+ * @return {float} returnes the result of the calculation
+ */
+ multX: function(x, y) {
+ return (x * this.elements[0] + y * this.elements[1] + this.elements[2]);
+ },
+ /**
+ * @member PMatrix2D
+ * The multY() function calculates the y component of a vector from a transformation.
+ *
+ * @param {float} x the x component of the vector being transformed
+ * @param {float} y the y component of the vector being transformed
+ *
+ * @return {float} returnes the result of the calculation
+ */
+ multY: function(x, y) {
+ return (x * this.elements[3] + y * this.elements[4] + this.elements[5]);
+ },
+ /**
+ * @member PMatrix2D
+ * The skewX() function skews the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewX: function(angle) {
+ this.apply(1, 0, 1, angle, 0, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The skewY() function skews the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewY: function(angle) {
+ this.apply(1, 0, 1, 0, angle, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The shearX() function shears the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ shearX: function(angle) {
+ this.apply(1, 0, 1, Math.tan(angle) , 0, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The shearY() function shears the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ shearY: function(angle) {
+ this.apply(1, 0, 1, 0, Math.tan(angle), 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The determinant() function calvculates the determinant of this matrix.
+ *
+ * @return {float} the determinant of the matrix
+ */
+ determinant: function() {
+ return (this.elements[0] * this.elements[4] - this.elements[1] * this.elements[3]);
+ },
+ /**
+ * @member PMatrix2D
+ * The invert() function inverts this matrix
+ *
+ * @return {boolean} true if successful
+ */
+ invert: function() {
+ var d = this.determinant();
+ if (Math.abs( d ) > PConstants.MIN_INT) {
+ var old00 = this.elements[0];
+ var old01 = this.elements[1];
+ var old02 = this.elements[2];
+ var old10 = this.elements[3];
+ var old11 = this.elements[4];
+ var old12 = this.elements[5];
+ this.elements[0] = old11 / d;
+ this.elements[3] = -old10 / d;
+ this.elements[1] = -old01 / d;
+ this.elements[4] = old00 / d;
+ this.elements[2] = (old01 * old12 - old11 * old02) / d;
+ this.elements[5] = (old10 * old02 - old00 * old12) / d;
+ return true;
+ }
+ return false;
+ },
+ /**
+ * @member PMatrix2D
+ * The scale() function increases or decreases the size of a shape by expanding and contracting vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a two parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ */
+ scale: function(sx, sy) {
+ if (sx && sy === undef) {
+ sy = sx;
+ }
+ if (sx && sy) {
+ this.elements[0] *= sx;
+ this.elements[1] *= sy;
+ this.elements[3] *= sx;
+ this.elements[4] *= sy;
+ }
+ },
+ /**
+ * @member PMatrix2D
+ * The invScale() function decreases or increases the size of a shape by contracting and expanding vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a two parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ */
+ invScale: function(sx, sy) {
+ if (sx && !sy) {
+ sy = sx;
+ }
+ this.scale(1 / sx, 1 / sy);
+ },
+ /**
+ * @member PMatrix2D
+ * The apply() function multiplies the current matrix by the one specified through the parameters. Note that either a PMatrix2D or a list of floats can be passed in.
+ *
+ * @param {PMatrix2D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ apply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 6) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, this.elements[2],
+ 0, 0, this.elements[5]];
+ var e = 0;
+ for (var row = 0; row < 2; row++) {
+ for (var col = 0; col < 3; col++, e++) {
+ result[e] += this.elements[row * 3 + 0] * source[col + 0] +
+ this.elements[row * 3 + 1] * source[col + 3];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The preApply() function applies another matrix to the left of this one. Note that either a PMatrix2D or elements of a matrix can be passed in.
+ *
+ * @param {PMatrix2D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ preApply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 6) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+ var result = [0, 0, source[2],
+ 0, 0, source[5]];
+ result[2] = source[2] + this.elements[2] * source[0] + this.elements[5] * source[1];
+ result[5] = source[5] + this.elements[2] * source[3] + this.elements[5] * source[4];
+ result[0] = this.elements[0] * source[0] + this.elements[3] * source[1];
+ result[3] = this.elements[0] * source[3] + this.elements[3] * source[4];
+ result[1] = this.elements[1] * source[0] + this.elements[4] * source[1];
+ result[4] = this.elements[1] * source[3] + this.elements[4] * source[4];
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The rotate() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotate: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ var temp1 = this.elements[0];
+ var temp2 = this.elements[1];
+ this.elements[0] = c * temp1 + s * temp2;
+ this.elements[1] = -s * temp1 + c * temp2;
+ temp1 = this.elements[3];
+ temp2 = this.elements[4];
+ this.elements[3] = c * temp1 + s * temp2;
+ this.elements[4] = -s * temp1 + c * temp2;
+ },
+ /**
+ * @member PMatrix2D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateZ: function(angle) {
+ this.rotate(angle);
+ },
+ /**
+ * @member PMatrix2D
+ * The invRotateZ() function rotates the matrix in opposite direction.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ invRotateZ: function(angle) {
+ this.rotateZ(angle - Math.PI);
+ },
+ /**
+ * @member PMatrix2D
+ * The print() function prints out the elements of this matrix
+ */
+ print: function() {
+ var digits = printMatrixHelper(this.elements);
+ var output = "" + p.nfs(this.elements[0], digits, 4) + " " +
+ p.nfs(this.elements[1], digits, 4) + " " +
+ p.nfs(this.elements[2], digits, 4) + "\n" +
+ p.nfs(this.elements[3], digits, 4) + " " +
+ p.nfs(this.elements[4], digits, 4) + " " +
+ p.nfs(this.elements[5], digits, 4) + "\n\n";
+ p.println(output);
+ }
+ };
+
+ return PMatrix2D;
+};
+
+},{}],15:[function(require,module,exports){
+module.exports = function(options, undef) {
+
+ // FIXME: hack
+ var p = options.p;
+
+ /**
+ * PMatrix3D is a 4x4 matrix implementation. The constructor accepts another PMatrix3D or a list of six or sixteen float elements.
+ * If no parameters are provided the matrix is set to the identity matrix.
+ */
+ var PMatrix3D = function() {
+ // When a matrix is created, it is set to an identity matrix
+ this.reset();
+ };
+
+ /**
+ * PMatrix3D methods
+ */
+ PMatrix3D.prototype = {
+ /**
+ * @member PMatrix2D
+ * The set() function sets the matrix elements. The function accepts either another PMatrix3D, an array of elements, or a list of six or sixteen floats.
+ *
+ * @param {PMatrix3D} matrix the initial matrix to set to
+ * @param {float[]} elements an array of elements to set this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ set: function() {
+ if (arguments.length === 16) {
+ this.elements = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ this.elements = arguments[0].array();
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ this.elements = arguments[0].slice();
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The get() function returns a copy of this PMatrix3D.
+ *
+ * @return {PMatrix3D} a copy of this PMatrix3D
+ */
+ get: function() {
+ var outgoing = new PMatrix3D();
+ outgoing.set(this.elements);
+ return outgoing;
+ },
+ /**
+ * @member PMatrix3D
+ * The reset() function sets this PMatrix3D to the identity matrix.
+ */
+ reset: function() {
+ this.elements = [1,0,0,0,
+ 0,1,0,0,
+ 0,0,1,0,
+ 0,0,0,1];
+ },
+ /**
+ * @member PMatrix3D
+ * The array() function returns a copy of the element values.
+ * @addon
+ *
+ * @return {float[]} returns a copy of the element values
+ */
+ array: function array() {
+ return this.elements.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The translate() function translates this matrix by moving the current coordinates to the location specified by tx, ty, and tz.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ * @param {float} tz the z-axis coordinate to move to
+ */
+ translate: function(tx, ty, tz) {
+ if (tz === undef) {
+ tz = 0;
+ }
+
+ this.elements[3] += tx * this.elements[0] + ty * this.elements[1] + tz * this.elements[2];
+ this.elements[7] += tx * this.elements[4] + ty * this.elements[5] + tz * this.elements[6];
+ this.elements[11] += tx * this.elements[8] + ty * this.elements[9] + tz * this.elements[10];
+ this.elements[15] += tx * this.elements[12] + ty * this.elements[13] + tz * this.elements[14];
+ },
+ /**
+ * @member PMatrix3D
+ * The transpose() function transpose this matrix.
+ */
+ transpose: function() {
+ var temp = this.elements[4];
+ this.elements[4] = this.elements[1];
+ this.elements[1] = temp;
+
+ temp = this.elements[8];
+ this.elements[8] = this.elements[2];
+ this.elements[2] = temp;
+
+ temp = this.elements[6];
+ this.elements[6] = this.elements[9];
+ this.elements[9] = temp;
+
+ temp = this.elements[3];
+ this.elements[3] = this.elements[12];
+ this.elements[12] = temp;
+
+ temp = this.elements[7];
+ this.elements[7] = this.elements[13];
+ this.elements[13] = temp;
+
+ temp = this.elements[11];
+ this.elements[11] = this.elements[14];
+ this.elements[14] = temp;
+ },
+ /**
+ * @member PMatrix3D
+ * The mult() function multiplied this matrix.
+ * If two array elements are passed in the function will multiply a two element vector against this matrix.
+ * If target is null or not length four, a new float array will be returned.
+ * The values for vec and target can be the same (though that's less efficient).
+ * If two PVectors are passed in the function multiply the x and y coordinates of a PVector against this matrix.
+ *
+ * @param {PVector} source, target the PVectors used to multiply this matrix
+ * @param {float[]} source, target the arrays used to multiply this matrix
+ *
+ * @return {PVector|float[]} returns a PVector or an array representing the new matrix
+ */
+ mult: function(source, target) {
+ var x, y, z, w;
+ if (source instanceof PVector) {
+ x = source.x;
+ y = source.y;
+ z = source.z;
+ w = 1;
+ if (!target) {
+ target = new PVector();
+ }
+ } else if (source instanceof Array) {
+ x = source[0];
+ y = source[1];
+ z = source[2];
+ w = source[3] || 1;
+
+ if ( !target || (target.length !== 3 && target.length !== 4) ) {
+ target = [0, 0, 0];
+ }
+ }
+
+ if (target instanceof Array) {
+ if (target.length === 3) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ target[1] = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ target[2] = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ } else if (target.length === 4) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3] * w;
+ target[1] = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7] * w;
+ target[2] = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11] * w;
+ target[3] = this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15] * w;
+ }
+ }
+ if (target instanceof PVector) {
+ target.x = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ target.y = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ target.z = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ }
+ return target;
+ },
+ /**
+ * @member PMatrix3D
+ * The preApply() function applies another matrix to the left of this one. Note that either a PMatrix3D or elements of a matrix can be passed in.
+ *
+ * @param {PMatrix3D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ preApply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 16) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0];
+ var e = 0;
+ for (var row = 0; row < 4; row++) {
+ for (var col = 0; col < 4; col++, e++) {
+ result[e] += this.elements[col + 0] * source[row * 4 + 0] + this.elements[col + 4] *
+ source[row * 4 + 1] + this.elements[col + 8] * source[row * 4 + 2] +
+ this.elements[col + 12] * source[row * 4 + 3];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The apply() function multiplies the current matrix by the one specified through the parameters. Note that either a PMatrix3D or a list of floats can be passed in.
+ *
+ * @param {PMatrix3D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ apply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 16) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0];
+ var e = 0;
+ for (var row = 0; row < 4; row++) {
+ for (var col = 0; col < 4; col++, e++) {
+ result[e] += this.elements[row * 4 + 0] * source[col + 0] + this.elements[row * 4 + 1] *
+ source[col + 4] + this.elements[row * 4 + 2] * source[col + 8] +
+ this.elements[row * 4 + 3] * source[col + 12];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The rotate() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotate: function(angle, v0, v1, v2) {
+ if (!v1) {
+ this.rotateZ(angle);
+ } else {
+ // TODO should make sure this vector is normalized
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ var t = 1.0 - c;
+
+ this.apply((t * v0 * v0) + c,
+ (t * v0 * v1) - (s * v2),
+ (t * v0 * v2) + (s * v1),
+ 0,
+ (t * v0 * v1) + (s * v2),
+ (t * v1 * v1) + c,
+ (t * v1 * v2) - (s * v0),
+ 0,
+ (t * v0 * v2) - (s * v1),
+ (t * v1 * v2) + (s * v0),
+ (t * v2 * v2) + c,
+ 0,
+ 0, 0, 0, 1);
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The invApply() function applies the inverted matrix to this matrix.
+ *
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ *
+ * @return {boolean} returns true if the operation was successful.
+ */
+ invApply: function() {
+ if (inverseCopy === undef) {
+ inverseCopy = new PMatrix3D();
+ }
+ var a = arguments;
+ inverseCopy.set(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8],
+ a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
+
+ if (!inverseCopy.invert()) {
+ return false;
+ }
+ this.preApply(inverseCopy);
+ return true;
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateX: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ this.apply([1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateY() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateY: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ this.apply([c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateZ: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ this.apply([c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The scale() function increases or decreases the size of a matrix by expanding and contracting vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a three parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ * @param {float} sz the amount to scale on the z-axis
+ */
+ scale: function(sx, sy, sz) {
+ if (sx && sy === undef && sz === undef) {
+ sy = sz = sx;
+ } else if (sx && sy && sz === undef) {
+ sz = 1;
+ }
+
+ if (sx && sy && sz) {
+ this.elements[0] *= sx;
+ this.elements[1] *= sy;
+ this.elements[2] *= sz;
+ this.elements[4] *= sx;
+ this.elements[5] *= sy;
+ this.elements[6] *= sz;
+ this.elements[8] *= sx;
+ this.elements[9] *= sy;
+ this.elements[10] *= sz;
+ this.elements[12] *= sx;
+ this.elements[13] *= sy;
+ this.elements[14] *= sz;
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The skewX() function skews the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewX: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, t, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The skewY() function skews the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewY: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, 0, 0, 0, t, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The shearX() function shears the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of shear specified in radians
+ */
+ shearX: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, t, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The shearY() function shears the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of shear specified in radians
+ */
+ shearY: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, 0, 0, 0, t, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ multX: function(x, y, z, w) {
+ if (!z) {
+ return this.elements[0] * x + this.elements[1] * y + this.elements[3];
+ }
+ if (!w) {
+ return this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ }
+ return this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3] * w;
+ },
+ multY: function(x, y, z, w) {
+ if (!z) {
+ return this.elements[4] * x + this.elements[5] * y + this.elements[7];
+ }
+ if (!w) {
+ return this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ }
+ return this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7] * w;
+ },
+ multZ: function(x, y, z, w) {
+ if (!w) {
+ return this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ }
+ return this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11] * w;
+ },
+ multW: function(x, y, z, w) {
+ if (!w) {
+ return this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15];
+ }
+ return this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15] * w;
+ },
+ /**
+ * @member PMatrix3D
+ * The invert() function inverts this matrix
+ *
+ * @return {boolean} true if successful
+ */
+ invert: function() {
+ var fA0 = this.elements[0] * this.elements[5] - this.elements[1] * this.elements[4];
+ var fA1 = this.elements[0] * this.elements[6] - this.elements[2] * this.elements[4];
+ var fA2 = this.elements[0] * this.elements[7] - this.elements[3] * this.elements[4];
+ var fA3 = this.elements[1] * this.elements[6] - this.elements[2] * this.elements[5];
+ var fA4 = this.elements[1] * this.elements[7] - this.elements[3] * this.elements[5];
+ var fA5 = this.elements[2] * this.elements[7] - this.elements[3] * this.elements[6];
+ var fB0 = this.elements[8] * this.elements[13] - this.elements[9] * this.elements[12];
+ var fB1 = this.elements[8] * this.elements[14] - this.elements[10] * this.elements[12];
+ var fB2 = this.elements[8] * this.elements[15] - this.elements[11] * this.elements[12];
+ var fB3 = this.elements[9] * this.elements[14] - this.elements[10] * this.elements[13];
+ var fB4 = this.elements[9] * this.elements[15] - this.elements[11] * this.elements[13];
+ var fB5 = this.elements[10] * this.elements[15] - this.elements[11] * this.elements[14];
+
+ // Determinant
+ var fDet = fA0 * fB5 - fA1 * fB4 + fA2 * fB3 + fA3 * fB2 - fA4 * fB1 + fA5 * fB0;
+
+ // Account for a very small value
+ // return false if not successful.
+ if (Math.abs(fDet) <= 1e-9) {
+ return false;
+ }
+
+ var kInv = [];
+ kInv[0] = +this.elements[5] * fB5 - this.elements[6] * fB4 + this.elements[7] * fB3;
+ kInv[4] = -this.elements[4] * fB5 + this.elements[6] * fB2 - this.elements[7] * fB1;
+ kInv[8] = +this.elements[4] * fB4 - this.elements[5] * fB2 + this.elements[7] * fB0;
+ kInv[12] = -this.elements[4] * fB3 + this.elements[5] * fB1 - this.elements[6] * fB0;
+ kInv[1] = -this.elements[1] * fB5 + this.elements[2] * fB4 - this.elements[3] * fB3;
+ kInv[5] = +this.elements[0] * fB5 - this.elements[2] * fB2 + this.elements[3] * fB1;
+ kInv[9] = -this.elements[0] * fB4 + this.elements[1] * fB2 - this.elements[3] * fB0;
+ kInv[13] = +this.elements[0] * fB3 - this.elements[1] * fB1 + this.elements[2] * fB0;
+ kInv[2] = +this.elements[13] * fA5 - this.elements[14] * fA4 + this.elements[15] * fA3;
+ kInv[6] = -this.elements[12] * fA5 + this.elements[14] * fA2 - this.elements[15] * fA1;
+ kInv[10] = +this.elements[12] * fA4 - this.elements[13] * fA2 + this.elements[15] * fA0;
+ kInv[14] = -this.elements[12] * fA3 + this.elements[13] * fA1 - this.elements[14] * fA0;
+ kInv[3] = -this.elements[9] * fA5 + this.elements[10] * fA4 - this.elements[11] * fA3;
+ kInv[7] = +this.elements[8] * fA5 - this.elements[10] * fA2 + this.elements[11] * fA1;
+ kInv[11] = -this.elements[8] * fA4 + this.elements[9] * fA2 - this.elements[11] * fA0;
+ kInv[15] = +this.elements[8] * fA3 - this.elements[9] * fA1 + this.elements[10] * fA0;
+
+ // Inverse using Determinant
+ var fInvDet = 1.0 / fDet;
+ kInv[0] *= fInvDet;
+ kInv[1] *= fInvDet;
+ kInv[2] *= fInvDet;
+ kInv[3] *= fInvDet;
+ kInv[4] *= fInvDet;
+ kInv[5] *= fInvDet;
+ kInv[6] *= fInvDet;
+ kInv[7] *= fInvDet;
+ kInv[8] *= fInvDet;
+ kInv[9] *= fInvDet;
+ kInv[10] *= fInvDet;
+ kInv[11] *= fInvDet;
+ kInv[12] *= fInvDet;
+ kInv[13] *= fInvDet;
+ kInv[14] *= fInvDet;
+ kInv[15] *= fInvDet;
+
+ this.elements = kInv.slice();
+ return true;
+ },
+ toString: function() {
+ var str = "";
+ for (var i = 0; i < 15; i++) {
+ str += this.elements[i] + ", ";
+ }
+ str += this.elements[15];
+ return str;
+ },
+ /**
+ * @member PMatrix3D
+ * The print() function prints out the elements of this matrix
+ */
+ print: function() {
+ var digits = printMatrixHelper(this.elements);
+
+ var output = "" + p.nfs(this.elements[0], digits, 4) + " " + p.nfs(this.elements[1], digits, 4) +
+ " " + p.nfs(this.elements[2], digits, 4) + " " + p.nfs(this.elements[3], digits, 4) +
+ "\n" + p.nfs(this.elements[4], digits, 4) + " " + p.nfs(this.elements[5], digits, 4) +
+ " " + p.nfs(this.elements[6], digits, 4) + " " + p.nfs(this.elements[7], digits, 4) +
+ "\n" + p.nfs(this.elements[8], digits, 4) + " " + p.nfs(this.elements[9], digits, 4) +
+ " " + p.nfs(this.elements[10], digits, 4) + " " + p.nfs(this.elements[11], digits, 4) +
+ "\n" + p.nfs(this.elements[12], digits, 4) + " " + p.nfs(this.elements[13], digits, 4) +
+ " " + p.nfs(this.elements[14], digits, 4) + " " + p.nfs(this.elements[15], digits, 4) + "\n\n";
+ p.println(output);
+ },
+ invTranslate: function(tx, ty, tz) {
+ this.preApply(1, 0, 0, -tx, 0, 1, 0, -ty, 0, 0, 1, -tz, 0, 0, 0, 1);
+ },
+ invRotateX: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1]);
+ },
+ invRotateY: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1]);
+ },
+ invRotateZ: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
+ },
+ invScale: function(x, y, z) {
+ this.preApply([1 / x, 0, 0, 0, 0, 1 / y, 0, 0, 0, 0, 1 / z, 0, 0, 0, 0, 1]);
+ }
+ };
+
+ return PMatrix3D;
+};
+},{}],16:[function(require,module,exports){
+module.exports = function(options) {
+ var PConstants = options.PConstants,
+ PMatrix2D = options.PMatrix2D,
+ PMatrix3D = options.PMatrix3D;
+
+ /**
+ * Datatype for storing shapes. Processing can currently load and display SVG (Scalable Vector Graphics) shapes.
+ * Before a shape is used, it must be loaded with the <b>loadShape()</b> function. The <b>shape()</b> function is used to draw the shape to the display window.
+ * The <b>PShape</b> object contain a group of methods, linked below, that can operate on the shape data.
+ * <br><br>The <b>loadShape()</b> method supports SVG files created with Inkscape and Adobe Illustrator.
+ * It is not a full SVG implementation, but offers some straightforward support for handling vector data.
+ *
+ * @param {int} family the shape type, one of GROUP, PRIMITIVE, PATH, or GEOMETRY
+ *
+ * @see #shape()
+ * @see #loadShape()
+ * @see #shapeMode()
+ */
+ var PShape = function(family) {
+ this.family = family || PConstants.GROUP;
+ this.visible = true;
+ this.style = true;
+ this.children = [];
+ this.nameTable = [];
+ this.params = [];
+ this.name = "";
+ this.image = null; //type PImage
+ this.matrix = null;
+ this.kind = null;
+ this.close = null;
+ this.width = null;
+ this.height = null;
+ this.parent = null;
+ };
+ /**
+ * PShape methods
+ * missing: findChild(), apply(), contains(), findChild(), getPrimitive(), getParams(), getVertex() , getVertexCount(),
+ * getVertexCode() , getVertexCodes() , getVertexCodeCount(), getVertexX(), getVertexY(), getVertexZ()
+ */
+ PShape.prototype = {
+ /**
+ * @member PShape
+ * The isVisible() function returns a boolean value "true" if the image is set to be visible, "false" if not. This is modified with the <b>setVisible()</b> parameter.
+ * <br><br>The visibility of a shape is usually controlled by whatever program created the SVG file.
+ * For instance, this parameter is controlled by showing or hiding the shape in the layers palette in Adobe Illustrator.
+ *
+ * @return {boolean} returns "true" if the image is set to be visible, "false" if not
+ */
+ isVisible: function(){
+ return this.visible;
+ },
+ /**
+ * @member PShape
+ * The setVisible() function sets the shape to be visible or invisible. This is determined by the value of the <b>visible</b> parameter.
+ * <br><br>The visibility of a shape is usually controlled by whatever program created the SVG file.
+ * For instance, this parameter is controlled by showing or hiding the shape in the layers palette in Adobe Illustrator.
+ *
+ * @param {boolean} visible "false" makes the shape invisible and "true" makes it visible
+ */
+ setVisible: function (visible){
+ this.visible = visible;
+ },
+ /**
+ * @member PShape
+ * The disableStyle() function disables the shape's style data and uses Processing's current styles. Styles include attributes such as colors, stroke weight, and stroke joints.
+ * Overrides this shape's style information and uses PGraphics styles and colors. Identical to ignoreStyles(true). Also disables styles for all child shapes.
+ */
+ disableStyle: function(){
+ this.style = false;
+ for(var i = 0, j=this.children.length; i<j; i++) {
+ this.children[i].disableStyle();
+ }
+ },
+ /**
+ * @member PShape
+ * The enableStyle() function enables the shape's style data and ignores Processing's current styles. Styles include attributes such as colors, stroke weight, and stroke joints.
+ */
+ enableStyle: function(){
+ this.style = true;
+ for(var i = 0, j=this.children.length; i<j; i++) {
+ this.children[i].enableStyle();
+ }
+ },
+ /**
+ * @member PShape
+ * The getFamily function returns the shape type
+ *
+ * @return {int} the shape type, one of GROUP, PRIMITIVE, PATH, or GEOMETRY
+ */
+ getFamily: function(){
+ return this.family;
+ },
+ /**
+ * @member PShape
+ * The getWidth() function gets the width of the drawing area (not necessarily the shape boundary).
+ */
+ getWidth: function(){
+ return this.width;
+ },
+ /**
+ * @member PShape
+ * The getHeight() function gets the height of the drawing area (not necessarily the shape boundary).
+ */
+ getHeight: function(){
+ return this.height;
+ },
+ /**
+ * @member PShape
+ * The setName() function sets the name of the shape
+ *
+ * @param {String} name the name of the shape
+ */
+ setName: function(name){
+ this.name = name;
+ },
+ /**
+ * @member PShape
+ * The getName() function returns the name of the shape
+ *
+ * @return {String} the name of the shape
+ */
+ getName: function(){
+ return this.name;
+ },
+ /**
+ * @member PShape
+ * Called by the following (the shape() command adds the g)
+ * PShape s = loadShapes("blah.svg");
+ * shape(s);
+ */
+ draw: function(renderContext) {
+ if(!renderContext) {
+ throw "render context missing for draw() in PShape";
+ }
+ if (this.visible) {
+ this.pre(renderContext);
+ this.drawImpl(renderContext);
+ this.post(renderContext);
+ }
+ },
+ /**
+ * @member PShape
+ * the drawImpl() function draws the SVG document.
+ */
+ drawImpl: function(renderContext) {
+ if (this.family === PConstants.GROUP) {
+ this.drawGroup(renderContext);
+ } else if (this.family === PConstants.PRIMITIVE) {
+ this.drawPrimitive(renderContext);
+ } else if (this.family === PConstants.GEOMETRY) {
+ this.drawGeometry(renderContext);
+ } else if (this.family === PConstants.PATH) {
+ this.drawPath(renderContext);
+ }
+ },
+ /**
+ * @member PShape
+ * The drawPath() function draws the <path> part of the SVG document.
+ */
+ drawPath: function(renderContext) {
+ var i, j;
+ if (this.vertices.length === 0) { return; }
+ renderContext.beginShape();
+ if (this.vertexCodes.length === 0) { // each point is a simple vertex
+ if (this.vertices[0].length === 2) { // drawing 2D vertices
+ for (i = 0, j = this.vertices.length; i < j; i++) {
+ renderContext.vertex(this.vertices[i][0], this.vertices[i][1]);
+ }
+ } else { // drawing 3D vertices
+ for (i = 0, j = this.vertices.length; i < j; i++) {
+ renderContext.vertex(this.vertices[i][0],
+ this.vertices[i][1],
+ this.vertices[i][2]);
+ }
+ }
+ } else { // coded set of vertices
+ var index = 0;
+ if (this.vertices[0].length === 2) { // drawing a 2D path
+ for (i = 0, j = this.vertexCodes.length; i < j; i++) {
+ if (this.vertexCodes[i] === PConstants.VERTEX) {
+ renderContext.vertex(this.vertices[index][0], this.vertices[index][1], this.vertices[index].moveTo);
+ renderContext.breakShape = false;
+ index++;
+ } else if (this.vertexCodes[i] === PConstants.BEZIER_VERTEX) {
+ renderContext.bezierVertex(this.vertices[index+0][0],
+ this.vertices[index+0][1],
+ this.vertices[index+1][0],
+ this.vertices[index+1][1],
+ this.vertices[index+2][0],
+ this.vertices[index+2][1]);
+ index += 3;
+ } else if (this.vertexCodes[i] === PConstants.CURVE_VERTEX) {
+ renderContext.curveVertex(this.vertices[index][0],
+ this.vertices[index][1]);
+ index++;
+ } else if (this.vertexCodes[i] === PConstants.BREAK) {
+ renderContext.breakShape = true;
+ }
+ }
+ } else { // drawing a 3D path
+ for (i = 0, j = this.vertexCodes.length; i < j; i++) {
+ if (this.vertexCodes[i] === PConstants.VERTEX) {
+ renderContext.vertex(this.vertices[index][0],
+ this.vertices[index][1],
+ this.vertices[index][2]);
+ if (this.vertices[index].moveTo === true) {
+ vertArray[vertArray.length-1].moveTo = true;
+ } else if (this.vertices[index].moveTo === false) {
+ vertArray[vertArray.length-1].moveTo = false;
+ }
+ renderContext.breakShape = false;
+ } else if (this.vertexCodes[i] === PConstants.BEZIER_VERTEX) {
+ renderContext.bezierVertex(this.vertices[index+0][0],
+ this.vertices[index+0][1],
+ this.vertices[index+0][2],
+ this.vertices[index+1][0],
+ this.vertices[index+1][1],
+ this.vertices[index+1][2],
+ this.vertices[index+2][0],
+ this.vertices[index+2][1],
+ this.vertices[index+2][2]);
+ index += 3;
+ } else if (this.vertexCodes[i] === PConstants.CURVE_VERTEX) {
+ renderContext.curveVertex(this.vertices[index][0],
+ this.vertices[index][1],
+ this.vertices[index][2]);
+ index++;
+ } else if (this.vertexCodes[i] === PConstants.BREAK) {
+ renderContext.breakShape = true;
+ }
+ }
+ }
+ }
+ renderContext.endShape(this.close ? PConstants.CLOSE : PConstants.OPEN);
+ },
+ /**
+ * @member PShape
+ * The drawGeometry() function draws the geometry part of the SVG document.
+ */
+ drawGeometry: function(renderContext) {
+ var i, j;
+ renderContext.beginShape(this.kind);
+ if (this.style) {
+ for (i = 0, j = this.vertices.length; i < j; i++) {
+ renderContext.vertex(this.vertices[i]);
+ }
+ } else {
+ for (i = 0, j = this.vertices.length; i < j; i++) {
+ var vert = this.vertices[i];
+ if (vert[2] === 0) {
+ renderContext.vertex(vert[0], vert[1]);
+ } else {
+ renderContext.vertex(vert[0], vert[1], vert[2]);
+ }
+ }
+ }
+ renderContext.endShape();
+ },
+ /**
+ * @member PShape
+ * The drawGroup() function draws the <g> part of the SVG document.
+ */
+ drawGroup: function(renderContext) {
+ for (var i = 0, j = this.children.length; i < j; i++) {
+ this.children[i].draw(renderContext);
+ }
+ },
+ /**
+ * @member PShape
+ * The drawPrimitive() function draws SVG document shape elements. These can be point, line, triangle, quad, rect, ellipse, arc, box, or sphere.
+ */
+ drawPrimitive: function(renderContext) {
+ if (this.kind === PConstants.POINT) {
+ renderContext.point(this.params[0], this.params[1]);
+ } else if (this.kind === PConstants.LINE) {
+ if (this.params.length === 4) { // 2D
+ renderContext.line(this.params[0], this.params[1],
+ this.params[2], this.params[3]);
+ } else { // 3D
+ renderContext.line(this.params[0], this.params[1], this.params[2],
+ this.params[3], this.params[4], this.params[5]);
+ }
+ } else if (this.kind === PConstants.TRIANGLE) {
+ renderContext.triangle(this.params[0], this.params[1],
+ this.params[2], this.params[3],
+ this.params[4], this.params[5]);
+ } else if (this.kind === PConstants.QUAD) {
+ renderContext.quad(this.params[0], this.params[1],
+ this.params[2], this.params[3],
+ this.params[4], this.params[5],
+ this.params[6], this.params[7]);
+ } else if (this.kind === PConstants.RECT) {
+ if (this.image !== null) {
+ var imMode = imageModeConvert;
+ renderContext.imageMode(PConstants.CORNER);
+ renderContext.image(this.image,
+ this.params[0],
+ this.params[1],
+ this.params[2],
+ this.params[3]);
+ imageModeConvert = imMode;
+ } else {
+ var rcMode = renderContext.curRectMode;
+ renderContext.rectMode(PConstants.CORNER);
+ renderContext.rect(this.params[0],
+ this.params[1],
+ this.params[2],
+ this.params[3]);
+ renderContext.curRectMode = rcMode;
+ }
+ } else if (this.kind === PConstants.ELLIPSE) {
+ var elMode = renderContext.curEllipseMode;
+ renderContext.ellipseMode(PConstants.CORNER);
+ renderContext.ellipse(this.params[0],
+ this.params[1],
+ this.params[2],
+ this.params[3]);
+ renderContext.curEllipseMode = elMode;
+ } else if (this.kind === PConstants.ARC) {
+ var eMode = curEllipseMode;
+ renderContext.ellipseMode(PConstants.CORNER);
+ renderContext.arc(this.params[0],
+ this.params[1],
+ this.params[2],
+ this.params[3],
+ this.params[4],
+ this.params[5]);
+ curEllipseMode = eMode;
+ } else if (this.kind === PConstants.BOX) {
+ if (this.params.length === 1) {
+ renderContext.box(this.params[0]);
+ } else {
+ renderContext.box(this.params[0], this.params[1], this.params[2]);
+ }
+ } else if (this.kind === PConstants.SPHERE) {
+ renderContext.sphere(this.params[0]);
+ }
+ },
+ /**
+ * @member PShape
+ * The pre() function performs the preparations before the SVG is drawn. This includes doing transformations and storing previous styles.
+ */
+ pre: function(renderContext) {
+ if (this.matrix) {
+ renderContext.pushMatrix();
+ renderContext.transform(this.matrix);
+ }
+ if (this.style) {
+ renderContext.pushStyle();
+ this.styles(renderContext);
+ }
+ },
+ /**
+ * @member PShape
+ * The post() function performs the necessary actions after the SVG is drawn. This includes removing transformations and removing added styles.
+ */
+ post: function(renderContext) {
+ if (this.matrix) {
+ renderContext.popMatrix();
+ }
+ if (this.style) {
+ renderContext.popStyle();
+ }
+ },
+ /**
+ * @member PShape
+ * The styles() function changes the Processing's current styles
+ */
+ styles: function(renderContext) {
+ if (this.stroke) {
+ renderContext.stroke(this.strokeColor);
+ renderContext.strokeWeight(this.strokeWeight);
+ renderContext.strokeCap(this.strokeCap);
+ renderContext.strokeJoin(this.strokeJoin);
+ } else {
+ renderContext.noStroke();
+ }
+
+ if (this.fill) {
+ renderContext.fill(this.fillColor);
+
+ } else {
+ renderContext.noFill();
+ }
+ },
+ /**
+ * @member PShape
+ * The getChild() function extracts a child shape from a parent shape. Specify the name of the shape with the <b>target</b> parameter or the
+ * layer position of the shape to get with the <b>index</b> parameter.
+ * The shape is returned as a <b>PShape</b> object, or <b>null</b> is returned if there is an error.
+ *
+ * @param {String} target the name of the shape to get
+ * @param {int} index the layer position of the shape to get
+ *
+ * @return {PShape} returns a child element of a shape as a PShape object or null if there is an error
+ */
+ getChild: function(child) {
+ var i, j;
+ if (typeof child === 'number') {
+ return this.children[child];
+ }
+ var found;
+ if(child === "" || this.name === child){
+ return this;
+ }
+ if(this.nameTable.length > 0) {
+ for(i = 0, j = this.nameTable.length; i < j || found; i++) {
+ if(this.nameTable[i].getName === child) {
+ found = this.nameTable[i];
+ break;
+ }
+ }
+ if (found) { return found; }
+ }
+ for(i = 0, j = this.children.length; i < j; i++) {
+ found = this.children[i].getChild(child);
+ if(found) { return found; }
+ }
+ return null;
+ },
+ /**
+ * @member PShape
+ * The getChildCount() returns the number of children
+ *
+ * @return {int} returns a count of children
+ */
+ getChildCount: function () {
+ return this.children.length;
+ },
+ /**
+ * @member PShape
+ * The addChild() adds a child to the PShape.
+ *
+ * @param {PShape} child the child to add
+ */
+ addChild: function( child ) {
+ this.children.push(child);
+ child.parent = this;
+ if (child.getName() !== null) {
+ this.addName(child.getName(), child);
+ }
+ },
+ /**
+ * @member PShape
+ * The addName() functions adds a shape to the name lookup table.
+ *
+ * @param {String} name the name to be added
+ * @param {PShape} shape the shape
+ */
+ addName: function(name, shape) {
+ if (this.parent !== null) {
+ this.parent.addName( name, shape );
+ } else {
+ this.nameTable.push( [name, shape] );
+ }
+ },
+ /**
+ * @member PShape
+ * The translate() function specifies an amount to displace the shape. The <b>x</b> parameter specifies left/right translation, the <b>y</b> parameter specifies up/down translation, and the <b>z</b> parameter specifies translations toward/away from the screen.
+ * Subsequent calls to the method accumulates the effect. For example, calling <b>translate(50, 0)</b> and then <b>translate(20, 0)</b> is the same as <b>translate(70, 0)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * <br><br>Using this method with the <b>z</b> parameter requires using the P3D or OPENGL parameter in combination with size.
+ *
+ * @param {int|float} x left/right translation
+ * @param {int|float} y up/down translation
+ * @param {int|float} z forward/back translation
+ *
+ * @see PMatrix2D#translate
+ * @see PMatrix3D#translate
+ */
+ translate: function() {
+ if(arguments.length === 2)
+ {
+ this.checkMatrix(2);
+ this.matrix.translate(arguments[0], arguments[1]);
+ } else {
+ this.checkMatrix(3);
+ this.matrix.translate(arguments[0], arguments[1], 0);
+ }
+ },
+ /**
+ * @member PShape
+ * The checkMatrix() function makes sure that the shape's matrix is 1) not null, and 2) has a matrix
+ * that can handle <em>at least</em> the specified number of dimensions.
+ *
+ * @param {int} dimensions the specified number of dimensions
+ */
+ checkMatrix: function(dimensions) {
+ if(this.matrix === null) {
+ if(dimensions === 2) {
+ this.matrix = new PMatrix2D();
+ } else {
+ this.matrix = new PMatrix3D();
+ }
+ }else if(dimensions === 3 && this.matrix instanceof PMatrix2D) {
+ this.matrix = new PMatrix3D();
+ }
+ },
+ /**
+ * @member PShape
+ * The rotateX() function rotates a shape around the x-axis the amount specified by the <b>angle</b> parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
+ * <br><br>Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction.
+ * Subsequent calls to the method accumulates the effect. For example, calling <b>rotateX(HALF_PI)</b> and then <b>rotateX(HALF_PI)</b> is the same as <b>rotateX(PI)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * <br><br>This method requires a 3D renderer. You need to pass P3D or OPENGL as a third parameter into the <b>size()</b> method as shown in the example above.
+ *
+ * @param {float}angle angle of rotation specified in radians
+ *
+ * @see PMatrix3D#rotateX
+ */
+ rotateX: function(angle) {
+ this.rotate(angle, 1, 0, 0);
+ },
+ /**
+ * @member PShape
+ * The rotateY() function rotates a shape around the y-axis the amount specified by the <b>angle</b> parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
+ * <br><br>Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction.
+ * Subsequent calls to the method accumulates the effect. For example, calling <b>rotateY(HALF_PI)</b> and then <b>rotateY(HALF_PI)</b> is the same as <b>rotateY(PI)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * <br><br>This method requires a 3D renderer. You need to pass P3D or OPENGL as a third parameter into the <b>size()</b> method as shown in the example above.
+ *
+ * @param {float}angle angle of rotation specified in radians
+ *
+ * @see PMatrix3D#rotateY
+ */
+ rotateY: function(angle) {
+ this.rotate(angle, 0, 1, 0);
+ },
+ /**
+ * @member PShape
+ * The rotateZ() function rotates a shape around the z-axis the amount specified by the <b>angle</b> parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
+ * <br><br>Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction.
+ * Subsequent calls to the method accumulates the effect. For example, calling <b>rotateZ(HALF_PI)</b> and then <b>rotateZ(HALF_PI)</b> is the same as <b>rotateZ(PI)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * <br><br>This method requires a 3D renderer. You need to pass P3D or OPENGL as a third parameter into the <b>size()</b> method as shown in the example above.
+ *
+ * @param {float}angle angle of rotation specified in radians
+ *
+ * @see PMatrix3D#rotateZ
+ */
+ rotateZ: function(angle) {
+ this.rotate(angle, 0, 0, 1);
+ },
+ /**
+ * @member PShape
+ * The rotate() function rotates a shape the amount specified by the <b>angle</b> parameter. Angles should be specified in radians (values from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
+ * <br><br>Shapes are always rotated around the upper-left corner of their bounding box. Positive numbers rotate objects in a clockwise direction.
+ * Transformations apply to everything that happens after and subsequent calls to the method accumulates the effect.
+ * For example, calling <b>rotate(HALF_PI)</b> and then <b>rotate(HALF_PI)</b> is the same as <b>rotate(PI)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * If optional parameters x,y,z are supplied, the rotate is about the point (x, y, z).
+ *
+ * @param {float}angle angle of rotation specified in radians
+ * @param {float}x x-coordinate of the point
+ * @param {float}y y-coordinate of the point
+ * @param {float}z z-coordinate of the point
+ * @see PMatrix2D#rotate
+ * @see PMatrix3D#rotate
+ */
+ rotate: function() {
+ if(arguments.length === 1){
+ this.checkMatrix(2);
+ this.matrix.rotate(arguments[0]);
+ } else {
+ this.checkMatrix(3);
+ this.matrix.rotate(arguments[0],
+ arguments[1],
+ arguments[2],
+ arguments[3]);
+ }
+ },
+ /**
+ * @member PShape
+ * The scale() function increases or decreases the size of a shape by expanding and contracting vertices. Shapes always scale from the relative origin of their bounding box.
+ * Scale values are specified as decimal percentages. For example, the method call <b>scale(2.0)</b> increases the dimension of a shape by 200%.
+ * Subsequent calls to the method multiply the effect. For example, calling <b>scale(2.0)</b> and then <b>scale(1.5)</b> is the same as <b>scale(3.0)</b>.
+ * This transformation is applied directly to the shape, it's not refreshed each time <b>draw()</b> is run.
+ * <br><br>Using this fuction with the <b>z</b> parameter requires passing P3D or OPENGL into the size() parameter.
+ *
+ * @param {float}s percentage to scale the object
+ * @param {float}x percentage to scale the object in the x-axis
+ * @param {float}y percentage to scale the object in the y-axis
+ * @param {float}z percentage to scale the object in the z-axis
+ *
+ * @see PMatrix2D#scale
+ * @see PMatrix3D#scale
+ */
+ scale: function() {
+ if(arguments.length === 2) {
+ this.checkMatrix(2);
+ this.matrix.scale(arguments[0], arguments[1]);
+ } else if (arguments.length === 3) {
+ this.checkMatrix(2);
+ this.matrix.scale(arguments[0], arguments[1], arguments[2]);
+ } else {
+ this.checkMatrix(2);
+ this.matrix.scale(arguments[0]);
+ }
+ },
+ /**
+ * @member PShape
+ * The resetMatrix() function resets the matrix
+ *
+ * @see PMatrix2D#reset
+ * @see PMatrix3D#reset
+ */
+ resetMatrix: function() {
+ this.checkMatrix(2);
+ this.matrix.reset();
+ },
+ /**
+ * @member PShape
+ * The applyMatrix() function multiplies this matrix by another matrix of type PMatrix3D or PMatrix2D.
+ * Individual elements can also be provided
+ *
+ * @param {PMatrix3D|PMatrix2D} matrix the matrix to multiply by
+ *
+ * @see PMatrix2D#apply
+ * @see PMatrix3D#apply
+ */
+ applyMatrix: function(matrix) {
+ if (arguments.length === 1) {
+ this.applyMatrix(matrix.elements[0],
+ matrix.elements[1], 0,
+ matrix.elements[2],
+ matrix.elements[3],
+ matrix.elements[4], 0,
+ matrix.elements[5],
+ 0, 0, 1, 0,
+ 0, 0, 0, 1);
+ } else if (arguments.length === 6) {
+ this.checkMatrix(2);
+ this.matrix.apply(arguments[0], arguments[1], arguments[2], 0,
+ arguments[3], arguments[4], arguments[5], 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1);
+
+ } else if (arguments.length === 16) {
+ this.checkMatrix(3);
+ this.matrix.apply(arguments[0],
+ arguments[1],
+ arguments[2],
+ arguments[3],
+ arguments[4],
+ arguments[5],
+ arguments[6],
+ arguments[7],
+ arguments[8],
+ arguments[9],
+ arguments[10],
+ arguments[11],
+ arguments[12],
+ arguments[13],
+ arguments[14],
+ arguments[15]);
+ }
+ }
+ };
+
+ return PShape;
+};
+},{}],17:[function(require,module,exports){
+/**
+ * SVG stands for Scalable Vector Graphics, a portable graphics format. It is
+ * a vector format so it allows for infinite resolution and relatively small
+ * file sizes. Most modern media software can view SVG files, including Adobe
+ * products, Firefox, etc. Illustrator and Inkscape can edit SVG files.
+ *
+ * @param {PApplet} parent typically use "this"
+ * @param {String} filename name of the SVG file to load
+ * @param {XMLElement} xml an XMLElement element
+ * @param {PShapeSVG} parent the parent PShapeSVG
+ *
+ * @see PShape
+ */
+module.exports = function(options) {
+ var CommonFunctions = options.CommonFunctions,
+ PConstants = options.PConstants,
+ PShape = options.PShape,
+ XMLElement = options.XMLElement,
+ colors = options.colors;
+
+ var PShapeSVG = function() {
+ PShape.call(this); // PShape is the base class.
+ if (arguments.length === 1) { // xml element coming in
+ this.element = arguments[0];
+
+ // set values to their defaults according to the SVG spec
+ this.vertexCodes = [];
+ this.vertices = [];
+ this.opacity = 1;
+
+ this.stroke = false;
+ this.strokeColor = PConstants.ALPHA_MASK;
+ this.strokeWeight = 1;
+ this.strokeCap = PConstants.SQUARE; // BUTT in svg spec
+ this.strokeJoin = PConstants.MITER;
+ this.strokeGradient = null;
+ this.strokeGradientPaint = null;
+ this.strokeName = null;
+ this.strokeOpacity = 1;
+
+ this.fill = true;
+ this.fillColor = PConstants.ALPHA_MASK;
+ this.fillGradient = null;
+ this.fillGradientPaint = null;
+ this.fillName = null;
+ this.fillOpacity = 1;
+
+ if (this.element.getName() !== "svg") {
+ throw("root is not <svg>, it's <" + this.element.getName() + ">");
+ }
+ }
+ else if (arguments.length === 2) {
+ if (typeof arguments[1] === 'string') {
+ if (arguments[1].indexOf(".svg") > -1) { //its a filename
+ this.element = new XMLElement(true, arguments[1]);
+ // set values to their defaults according to the SVG spec
+ this.vertexCodes = [];
+ this.vertices = [];
+ this.opacity = 1;
+
+ this.stroke = false;
+ this.strokeColor = PConstants.ALPHA_MASK;
+ this.strokeWeight = 1;
+ this.strokeCap = PConstants.SQUARE; // BUTT in svg spec
+ this.strokeJoin = PConstants.MITER;
+ this.strokeGradient = "";
+ this.strokeGradientPaint = "";
+ this.strokeName = "";
+ this.strokeOpacity = 1;
+
+ this.fill = true;
+ this.fillColor = PConstants.ALPHA_MASK;
+ this.fillGradient = null;
+ this.fillGradientPaint = null;
+ this.fillOpacity = 1;
+
+ }
+ } else { // XMLElement
+ if (arguments[0]) { // PShapeSVG
+ this.element = arguments[1];
+ this.vertexCodes = arguments[0].vertexCodes.slice();
+ this.vertices = arguments[0].vertices.slice();
+
+ this.stroke = arguments[0].stroke;
+ this.strokeColor = arguments[0].strokeColor;
+ this.strokeWeight = arguments[0].strokeWeight;
+ this.strokeCap = arguments[0].strokeCap;
+ this.strokeJoin = arguments[0].strokeJoin;
+ this.strokeGradient = arguments[0].strokeGradient;
+ this.strokeGradientPaint = arguments[0].strokeGradientPaint;
+ this.strokeName = arguments[0].strokeName;
+
+ this.fill = arguments[0].fill;
+ this.fillColor = arguments[0].fillColor;
+ this.fillGradient = arguments[0].fillGradient;
+ this.fillGradientPaint = arguments[0].fillGradientPaint;
+ this.fillName = arguments[0].fillName;
+ this.strokeOpacity = arguments[0].strokeOpacity;
+ this.fillOpacity = arguments[0].fillOpacity;
+ this.opacity = arguments[0].opacity;
+ }
+ }
+ }
+
+ this.name = this.element.getStringAttribute("id");
+ var displayStr = this.element.getStringAttribute("display", "inline");
+ this.visible = displayStr !== "none";
+ var str = this.element.getAttribute("transform");
+ if (str) {
+ this.matrix = this.parseMatrix(str);
+ }
+ // not proper parsing of the viewBox, but will cover us for cases where
+ // the width and height of the object is not specified
+ var viewBoxStr = this.element.getStringAttribute("viewBox");
+ if ( viewBoxStr !== null ) {
+ var viewBox = viewBoxStr.split(" ");
+ this.width = viewBox[2];
+ this.height = viewBox[3];
+ }
+
+ // TODO if viewbox is not same as width/height, then use it to scale
+ // the original objects. for now, viewbox only used when width/height
+ // are empty values (which by the spec means w/h of "100%"
+ var unitWidth = this.element.getStringAttribute("width");
+ var unitHeight = this.element.getStringAttribute("height");
+ if (unitWidth !== null) {
+ this.width = this.parseUnitSize(unitWidth);
+ this.height = this.parseUnitSize(unitHeight);
+ } else {
+ if ((this.width === 0) || (this.height === 0)) {
+ // For the spec, the default is 100% and 100%. For purposes
+ // here, insert a dummy value because this is prolly just a
+ // font or something for which the w/h doesn't matter.
+ this.width = 1;
+ this.height = 1;
+
+ //show warning
+ throw("The width and/or height is not " +
+ "readable in the <svg> tag of this file.");
+ }
+ }
+ this.parseColors(this.element);
+ this.parseChildren(this.element);
+
+ };
+ /**
+ * PShapeSVG methods are inherited from the PShape prototype
+ */
+ PShapeSVG.prototype = new PShape();
+ /**
+ * @member PShapeSVG
+ * The parseMatrix() function parses the specified SVG matrix into a PMatrix2D. Note that PMatrix2D
+ * is rotated relative to the SVG definition, so parameters are rearranged
+ * here. More about the transformation matrices in
+ * <a href="http://www.w3.org/TR/SVG/coords.html#TransformAttribute">this section</a>
+ * of the SVG documentation.
+ *
+ * @param {String} str text of the matrix param.
+ *
+ * @return {PMatrix2D} a PMatrix2D
+ */
+ PShapeSVG.prototype.parseMatrix = (function() {
+ function getCoords(s) {
+ var m = [];
+ s.replace(/\((.*?)\)/, (function() {
+ return function(all, params) {
+ // get the coordinates that can be separated by spaces or a comma
+ m = params.replace(/,+/g, " ").split(/\s+/);
+ };
+ }()));
+ return m;
+ }
+
+ return function(str) {
+ this.checkMatrix(2);
+ var pieces = [];
+ str.replace(/\s*(\w+)\((.*?)\)/g, function(all) {
+ // get a list of transform definitions
+ pieces.push(CommonFunctions.trim(all));
+ });
+ if (pieces.length === 0) {
+ return null;
+ }
+
+ for (var i = 0, j = pieces.length; i < j; i++) {
+ var m = getCoords(pieces[i]);
+
+ if (pieces[i].indexOf("matrix") !== -1) {
+ this.matrix.set(m[0], m[2], m[4], m[1], m[3], m[5]);
+ } else if (pieces[i].indexOf("translate") !== -1) {
+ var tx = m[0];
+ var ty = (m.length === 2) ? m[1] : 0;
+ this.matrix.translate(tx,ty);
+ } else if (pieces[i].indexOf("scale") !== -1) {
+ var sx = m[0];
+ var sy = (m.length === 2) ? m[1] : m[0];
+ this.matrix.scale(sx,sy);
+ } else if (pieces[i].indexOf("rotate") !== -1) {
+ var angle = m[0];
+ if (m.length === 1) {
+ this.matrix.rotate(CommonFunctions.radians(angle));
+ } else if (m.length === 3) {
+ this.matrix.translate(m[1], m[2]);
+ this.matrix.rotate(CommonFunctions.radians(m[0]));
+ this.matrix.translate(-m[1], -m[2]);
+ }
+ } else if (pieces[i].indexOf("skewX") !== -1) {
+ this.matrix.skewX(parseFloat(m[0]));
+ } else if (pieces[i].indexOf("skewY") !== -1) {
+ this.matrix.skewY(m[0]);
+ } else if (pieces[i].indexOf("shearX") !== -1) {
+ this.matrix.shearX(m[0]);
+ } else if (pieces[i].indexOf("shearY") !== -1) {
+ this.matrix.shearY(m[0]);
+ }
+ }
+ return this.matrix;
+ };
+ }());
+
+ /**
+ * @member PShapeSVG
+ * The parseChildren() function parses the specified XMLElement
+ *
+ * @param {XMLElement}element the XMLElement to parse
+ */
+ PShapeSVG.prototype.parseChildren = function(element) {
+ var newelement = element.getChildren();
+ var base = new PShape();
+ var i, j;
+ for (i = 0, j = newelement.length; i < j; i++) {
+ var kid = this.parseChild(newelement[i]);
+ if (kid) {
+ base.addChild(kid);
+ }
+ }
+ for (i = 0, j = base.children.length; i < j; i++) {
+ this.children.push(base.children[i]);
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * The getName() function returns the name
+ *
+ * @return {String} the name
+ */
+ PShapeSVG.prototype.getName = function() {
+ return this.name;
+ };
+ /**
+ * @member PShapeSVG
+ * The parseChild() function parses a child XML element.
+ *
+ * @param {XMLElement} elem the element to parse
+ *
+ * @return {PShape} the newly created PShape
+ */
+ PShapeSVG.prototype.parseChild = function( elem ) {
+ var name = elem.getName();
+ var shape;
+ if (name === "g") {
+ shape = new PShapeSVG(this, elem);
+ } else if (name === "defs") {
+ // generally this will contain gradient info, so may
+ // as well just throw it into a group element for parsing
+ shape = new PShapeSVG(this, elem);
+ } else if (name === "line") {
+ shape = new PShapeSVG(this, elem);
+ shape.parseLine();
+ } else if (name === "circle") {
+ shape = new PShapeSVG(this, elem);
+ shape.parseEllipse(true);
+ } else if (name === "ellipse") {
+ shape = new PShapeSVG(this, elem);
+ shape.parseEllipse(false);
+ } else if (name === "rect") {
+ shape = new PShapeSVG(this, elem);
+ shape.parseRect();
+ } else if (name === "polygon") {
+ shape = new PShapeSVG(this, elem);
+ shape.parsePoly(true);
+ } else if (name === "polyline") {
+ shape = new PShapeSVG(this, elem);
+ shape.parsePoly(false);
+ } else if (name === "path") {
+ shape = new PShapeSVG(this, elem);
+ shape.parsePath();
+ } else if (name === "radialGradient") {
+ //return new RadialGradient(this, elem);
+ unimplemented('PShapeSVG.prototype.parseChild, name = radialGradient');
+ } else if (name === "linearGradient") {
+ //return new LinearGradient(this, elem);
+ unimplemented('PShapeSVG.prototype.parseChild, name = linearGradient');
+ } else if (name === "text") {
+ unimplemented('PShapeSVG.prototype.parseChild, name = text');
+ } else if (name === "filter") {
+ unimplemented('PShapeSVG.prototype.parseChild, name = filter');
+ } else if (name === "mask") {
+ unimplemented('PShapeSVG.prototype.parseChild, name = mask');
+ } else {
+ // ignoring
+ }
+ return shape;
+ };
+ /**
+ * @member PShapeSVG
+ * The parsePath() function parses the <path> element of the svg file
+ * A path is defined by including a path element which contains a d="(path data)" attribute, where the d attribute contains
+ * the moveto, line, curve (both cubic and quadratic Beziers), arc and closepath instructions.
+ **/
+ PShapeSVG.prototype.parsePath = function() {
+ this.family = PConstants.PATH;
+ this.kind = 0;
+ var pathDataChars = [];
+ var c;
+ //change multiple spaces and commas to single space
+ var pathData = CommonFunctions.trim(this.element.getStringAttribute("d").replace(/[\s,]+/g,' '));
+ if (pathData === null) {
+ return;
+ }
+ pathData = pathData.split('');
+ var cx = 0,
+ cy = 0,
+ ctrlX = 0,
+ ctrlY = 0,
+ ctrlX1 = 0,
+ ctrlX2 = 0,
+ ctrlY1 = 0,
+ ctrlY2 = 0,
+ endX = 0,
+ endY = 0,
+ ppx = 0,
+ ppy = 0,
+ px = 0,
+ py = 0,
+ i = 0,
+ valOf = 0;
+ var str = "";
+ var tmpArray = [];
+ var flag = false;
+ var lastInstruction;
+ var command;
+ var j, k;
+ while (i< pathData.length) {
+ valOf = pathData[i].charCodeAt(0);
+ if ((valOf >= 65 && valOf <= 90) || (valOf >= 97 && valOf <= 122)) {
+ // if it's a letter
+ // populate the tmpArray with coordinates
+ j = i;
+ i++;
+ if (i < pathData.length) { // don't go over boundary of array
+ tmpArray = [];
+ valOf = pathData[i].charCodeAt(0);
+ while (!((valOf >= 65 && valOf <= 90) ||
+ (valOf >= 97 && valOf <= 100) ||
+ (valOf >= 102 && valOf <= 122)) && flag === false) { // if its NOT a letter
+ if (valOf === 32) { //if its a space and the str isn't empty
+ // sometimes you get a space after the letter
+ if (str !== "") {
+ tmpArray.push(parseFloat(str));
+ str = "";
+ }
+ i++;
+ } else if (valOf === 45) { //if it's a -
+ // allow for 'e' notation in numbers, e.g. 2.10e-9
+ if (pathData[i-1].charCodeAt(0) === 101) {
+ str += pathData[i].toString();
+ i++;
+ } else {
+ // sometimes no space separator after (ex: 104.535-16.322)
+ if (str !== "") {
+ tmpArray.push(parseFloat(str));
+ }
+ str = pathData[i].toString();
+ i++;
+ }
+ } else {
+ str += pathData[i].toString();
+ i++;
+ }
+ if (i === pathData.length) { // don't go over boundary of array
+ flag = true;
+ } else {
+ valOf = pathData[i].charCodeAt(0);
+ }
+ }
+ }
+ if (str !== "") {
+ tmpArray.push(parseFloat(str));
+ str = "";
+ }
+ command = pathData[j];
+ valOf = command.charCodeAt(0);
+ if (valOf === 77) { // M - move to (absolute)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ cx = tmpArray[0];
+ cy = tmpArray[1];
+ this.parsePathMoveto(cx, cy);
+ if (tmpArray.length > 2) {
+ for (j = 2, k = tmpArray.length; j < k; j+=2) {
+ // absolute line to
+ cx = tmpArray[j];
+ cy = tmpArray[j+1];
+ this.parsePathLineto(cx,cy);
+ }
+ }
+ }
+ } else if (valOf === 109) { // m - move to (relative)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ cx += tmpArray[0];
+ cy += tmpArray[1];
+ this.parsePathMoveto(cx,cy);
+ if (tmpArray.length > 2) {
+ for (j = 2, k = tmpArray.length; j < k; j+=2) {
+ // relative line to
+ cx += tmpArray[j];
+ cy += tmpArray[j + 1];
+ this.parsePathLineto(cx,cy);
+ }
+ }
+ }
+ } else if (valOf === 76) { // L - lineto (absolute)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=2) {
+ cx = tmpArray[j];
+ cy = tmpArray[j + 1];
+ this.parsePathLineto(cx,cy);
+ }
+ }
+ } else if (valOf === 108) { // l - lineto (relative)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=2) {
+ cx += tmpArray[j];
+ cy += tmpArray[j+1];
+ this.parsePathLineto(cx,cy);
+ }
+ }
+ } else if (valOf === 72) { // H - horizontal lineto (absolute)
+ for (j = 0, k = tmpArray.length; j < k; j++) {
+ // multiple x co-ordinates can be provided
+ cx = tmpArray[j];
+ this.parsePathLineto(cx, cy);
+ }
+ } else if (valOf === 104) { // h - horizontal lineto (relative)
+ for (j = 0, k = tmpArray.length; j < k; j++) {
+ // multiple x co-ordinates can be provided
+ cx += tmpArray[j];
+ this.parsePathLineto(cx, cy);
+ }
+ } else if (valOf === 86) { // V - vertical lineto (absolute)
+ for (j = 0, k = tmpArray.length; j < k; j++) {
+ // multiple y co-ordinates can be provided
+ cy = tmpArray[j];
+ this.parsePathLineto(cx, cy);
+ }
+ } else if (valOf === 118) { // v - vertical lineto (relative)
+ for (j = 0, k = tmpArray.length; j < k; j++) {
+ // multiple y co-ordinates can be provided
+ cy += tmpArray[j];
+ this.parsePathLineto(cx, cy);
+ }
+ } else if (valOf === 67) { // C - curve to (absolute)
+ if (tmpArray.length >= 6 && tmpArray.length % 6 === 0) {
+ // need one+ multiples of 6 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=6) {
+ ctrlX1 = tmpArray[j];
+ ctrlY1 = tmpArray[j + 1];
+ ctrlX2 = tmpArray[j + 2];
+ ctrlY2 = tmpArray[j + 3];
+ endX = tmpArray[j + 4];
+ endY = tmpArray[j + 5];
+ this.parsePathCurveto(ctrlX1,
+ ctrlY1,
+ ctrlX2,
+ ctrlY2,
+ endX,
+ endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 99) { // c - curve to (relative)
+ if (tmpArray.length >= 6 && tmpArray.length % 6 === 0) {
+ // need one+ multiples of 6 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=6) {
+ ctrlX1 = cx + tmpArray[j];
+ ctrlY1 = cy + tmpArray[j + 1];
+ ctrlX2 = cx + tmpArray[j + 2];
+ ctrlY2 = cy + tmpArray[j + 3];
+ endX = cx + tmpArray[j + 4];
+ endY = cy + tmpArray[j + 5];
+ this.parsePathCurveto(ctrlX1,
+ ctrlY1,
+ ctrlX2,
+ ctrlY2,
+ endX,
+ endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 83) { // S - curve to shorthand (absolute)
+ if (tmpArray.length >= 4 && tmpArray.length % 4 === 0) {
+ // need one+ multiples of 4 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=4) {
+ if (lastInstruction.toLowerCase() === "c" ||
+ lastInstruction.toLowerCase() === "s") {
+ ppx = this.vertices[ this.vertices.length-2 ][0];
+ ppy = this.vertices[ this.vertices.length-2 ][1];
+ px = this.vertices[ this.vertices.length-1 ][0];
+ py = this.vertices[ this.vertices.length-1 ][1];
+ ctrlX1 = px + (px - ppx);
+ ctrlY1 = py + (py - ppy);
+ } else {
+ //If there is no previous curve,
+ //the current point will be used as the first control point.
+ ctrlX1 = this.vertices[this.vertices.length-1][0];
+ ctrlY1 = this.vertices[this.vertices.length-1][1];
+ }
+ ctrlX2 = tmpArray[j];
+ ctrlY2 = tmpArray[j + 1];
+ endX = tmpArray[j + 2];
+ endY = tmpArray[j + 3];
+ this.parsePathCurveto(ctrlX1,
+ ctrlY1,
+ ctrlX2,
+ ctrlY2,
+ endX,
+ endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 115) { // s - curve to shorthand (relative)
+ if (tmpArray.length >= 4 && tmpArray.length % 4 === 0) {
+ // need one+ multiples of 4 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=4) {
+ if (lastInstruction.toLowerCase() === "c" ||
+ lastInstruction.toLowerCase() === "s") {
+ ppx = this.vertices[this.vertices.length-2][0];
+ ppy = this.vertices[this.vertices.length-2][1];
+ px = this.vertices[this.vertices.length-1][0];
+ py = this.vertices[this.vertices.length-1][1];
+ ctrlX1 = px + (px - ppx);
+ ctrlY1 = py + (py - ppy);
+ } else {
+ //If there is no previous curve,
+ //the current point will be used as the first control point.
+ ctrlX1 = this.vertices[this.vertices.length-1][0];
+ ctrlY1 = this.vertices[this.vertices.length-1][1];
+ }
+ ctrlX2 = cx + tmpArray[j];
+ ctrlY2 = cy + tmpArray[j + 1];
+ endX = cx + tmpArray[j + 2];
+ endY = cy + tmpArray[j + 3];
+ this.parsePathCurveto(ctrlX1,
+ ctrlY1,
+ ctrlX2,
+ ctrlY2,
+ endX,
+ endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 81) { // Q - quadratic curve to (absolute)
+ if (tmpArray.length >= 4 && tmpArray.length % 4 === 0) {
+ // need one+ multiples of 4 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=4) {
+ ctrlX = tmpArray[j];
+ ctrlY = tmpArray[j + 1];
+ endX = tmpArray[j + 2];
+ endY = tmpArray[j + 3];
+ this.parsePathQuadto(cx, cy, ctrlX, ctrlY, endX, endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 113) { // q - quadratic curve to (relative)
+ if (tmpArray.length >= 4 && tmpArray.length % 4 === 0) {
+ // need one+ multiples of 4 co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=4) {
+ ctrlX = cx + tmpArray[j];
+ ctrlY = cy + tmpArray[j + 1];
+ endX = cx + tmpArray[j + 2];
+ endY = cy + tmpArray[j + 3];
+ this.parsePathQuadto(cx, cy, ctrlX, ctrlY, endX, endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 84) {
+ // T - quadratic curve to shorthand (absolute)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=2) {
+ if (lastInstruction.toLowerCase() === "q" ||
+ lastInstruction.toLowerCase() === "t") {
+ ppx = this.vertices[this.vertices.length-2][0];
+ ppy = this.vertices[this.vertices.length-2][1];
+ px = this.vertices[this.vertices.length-1][0];
+ py = this.vertices[this.vertices.length-1][1];
+ ctrlX = px + (px - ppx);
+ ctrlY = py + (py - ppy);
+ } else {
+ // If there is no previous command or if the previous command
+ // was not a Q, q, T or t, assume the control point is
+ // coincident with the current point.
+ ctrlX = cx;
+ ctrlY = cy;
+ }
+ endX = tmpArray[j];
+ endY = tmpArray[j + 1];
+ this.parsePathQuadto(cx, cy, ctrlX, ctrlY, endX, endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 116) {
+ // t - quadratic curve to shorthand (relative)
+ if (tmpArray.length >= 2 && tmpArray.length % 2 === 0) {
+ // need one+ pairs of co-ordinates
+ for (j = 0, k = tmpArray.length; j < k; j+=2) {
+ if (lastInstruction.toLowerCase() === "q" ||
+ lastInstruction.toLowerCase() === "t") {
+ ppx = this.vertices[this.vertices.length-2][0];
+ ppy = this.vertices[this.vertices.length-2][1];
+ px = this.vertices[this.vertices.length-1][0];
+ py = this.vertices[this.vertices.length-1][1];
+ ctrlX = px + (px - ppx);
+ ctrlY = py + (py - ppy);
+ } else {
+ // If there is no previous command or if the previous command
+ // was not a Q, q, T or t, assume the control point is
+ // coincident with the current point.
+ ctrlX = cx;
+ ctrlY = cy;
+ }
+ endX = cx + tmpArray[j];
+ endY = cy + tmpArray[j + 1];
+ this.parsePathQuadto(cx, cy, ctrlX, ctrlY, endX, endY);
+ cx = endX;
+ cy = endY;
+ }
+ }
+ } else if (valOf === 90 || valOf === 122) { // Z or z (these do the same thing)
+ this.close = true;
+ }
+ lastInstruction = command.toString();
+ } else { i++;}
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parsePath() helper function
+ *
+ * @see PShapeSVG#parsePath
+ */
+ PShapeSVG.prototype.parsePathQuadto = function(x1, y1, cx, cy, x2, y2) {
+ if (this.vertices.length > 0) {
+ this.parsePathCode(PConstants.BEZIER_VERTEX);
+ // x1/y1 already covered by last moveto, lineto, or curveto
+ this.parsePathVertex(x1 + ((cx-x1)*2/3), y1 + ((cy-y1)*2/3));
+ this.parsePathVertex(x2 + ((cx-x2)*2/3), y2 + ((cy-y2)*2/3));
+ this.parsePathVertex(x2, y2);
+ } else {
+ throw ("Path must start with M/m");
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parsePath() helper function
+ *
+ * @see PShapeSVG#parsePath
+ */
+ PShapeSVG.prototype.parsePathCurveto = function(x1, y1, x2, y2, x3, y3) {
+ if (this.vertices.length > 0) {
+ this.parsePathCode(PConstants.BEZIER_VERTEX );
+ this.parsePathVertex(x1, y1);
+ this.parsePathVertex(x2, y2);
+ this.parsePathVertex(x3, y3);
+ } else {
+ throw ("Path must start with M/m");
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parsePath() helper function
+ *
+ * @see PShapeSVG#parsePath
+ */
+ PShapeSVG.prototype.parsePathLineto = function(px, py) {
+ if (this.vertices.length > 0) {
+ this.parsePathCode(PConstants.VERTEX);
+ this.parsePathVertex(px, py);
+ // add property to distinguish between curContext.moveTo
+ // or curContext.lineTo
+ this.vertices[this.vertices.length-1].moveTo = false;
+ } else {
+ throw ("Path must start with M/m");
+ }
+ };
+
+ PShapeSVG.prototype.parsePathMoveto = function(px, py) {
+ if (this.vertices.length > 0) {
+ this.parsePathCode(PConstants.BREAK);
+ }
+ this.parsePathCode(PConstants.VERTEX);
+ this.parsePathVertex(px, py);
+ // add property to distinguish between curContext.moveTo
+ // or curContext.lineTo
+ this.vertices[this.vertices.length-1].moveTo = true;
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parsePath() helper function
+ *
+ * @see PShapeSVG#parsePath
+ */
+ PShapeSVG.prototype.parsePathVertex = function(x, y) {
+ var verts = [];
+ verts[0] = x;
+ verts[1] = y;
+ this.vertices.push(verts);
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parsePath() helper function
+ *
+ * @see PShapeSVG#parsePath
+ */
+ PShapeSVG.prototype.parsePathCode = function(what) {
+ this.vertexCodes.push(what);
+ };
+ /**
+ * @member PShapeSVG
+ * The parsePoly() function parses a polyline or polygon from an SVG file.
+ *
+ * @param {boolean}val true if shape is closed (polygon), false if not (polyline)
+ */
+ PShapeSVG.prototype.parsePoly = function(val) {
+ this.family = PConstants.PATH;
+ this.close = val;
+ var pointsAttr = CommonFunctions.trim(this.element.getStringAttribute("points").replace(/[,\s]+/g,' '));
+ if (pointsAttr !== null) {
+ //split into array
+ var pointsBuffer = pointsAttr.split(" ");
+ if (pointsBuffer.length % 2 === 0) {
+ for (var i = 0, j = pointsBuffer.length; i < j; i++) {
+ var verts = [];
+ verts[0] = pointsBuffer[i];
+ verts[1] = pointsBuffer[++i];
+ this.vertices.push(verts);
+ }
+ } else {
+ throw("Error parsing polygon points: odd number of coordinates provided");
+ }
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * The parseRect() function parses a rect from an SVG file.
+ */
+ PShapeSVG.prototype.parseRect = function() {
+ this.kind = PConstants.RECT;
+ this.family = PConstants.PRIMITIVE;
+ this.params = [];
+ this.params[0] = this.element.getFloatAttribute("x");
+ this.params[1] = this.element.getFloatAttribute("y");
+ this.params[2] = this.element.getFloatAttribute("width");
+ this.params[3] = this.element.getFloatAttribute("height");
+ if (this.params[2] < 0 || this.params[3] < 0) {
+ throw("svg error: negative width or height found while parsing <rect>");
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * The parseEllipse() function handles parsing ellipse and circle tags.
+ *
+ * @param {boolean}val true if this is a circle and not an ellipse
+ */
+ PShapeSVG.prototype.parseEllipse = function(val) {
+ this.kind = PConstants.ELLIPSE;
+ this.family = PConstants.PRIMITIVE;
+ this.params = [];
+
+ this.params[0] = this.element.getFloatAttribute("cx") | 0 ;
+ this.params[1] = this.element.getFloatAttribute("cy") | 0;
+
+ var rx, ry;
+ if (val) {
+ rx = ry = this.element.getFloatAttribute("r");
+ if (rx < 0) {
+ throw("svg error: negative radius found while parsing <circle>");
+ }
+ } else {
+ rx = this.element.getFloatAttribute("rx");
+ ry = this.element.getFloatAttribute("ry");
+ if (rx < 0 || ry < 0) {
+ throw("svg error: negative x-axis radius or y-axis radius found while parsing <ellipse>");
+ }
+ }
+ this.params[0] -= rx;
+ this.params[1] -= ry;
+
+ this.params[2] = rx*2;
+ this.params[3] = ry*2;
+ };
+ /**
+ * @member PShapeSVG
+ * The parseLine() function handles parsing line tags.
+ *
+ * @param {boolean}val true if this is a circle and not an ellipse
+ */
+ PShapeSVG.prototype.parseLine = function() {
+ this.kind = PConstants.LINE;
+ this.family = PConstants.PRIMITIVE;
+ this.params = [];
+ this.params[0] = this.element.getFloatAttribute("x1");
+ this.params[1] = this.element.getFloatAttribute("y1");
+ this.params[2] = this.element.getFloatAttribute("x2");
+ this.params[3] = this.element.getFloatAttribute("y2");
+ };
+ /**
+ * @member PShapeSVG
+ * The parseColors() function handles parsing the opacity, strijem stroke-width, stroke-linejoin,stroke-linecap, fill, and style attributes
+ *
+ * @param {XMLElement}element the element of which attributes to parse
+ */
+ PShapeSVG.prototype.parseColors = function(element) {
+ if (element.hasAttribute("opacity")) {
+ this.setOpacity(element.getAttribute("opacity"));
+ }
+ if (element.hasAttribute("stroke")) {
+ this.setStroke(element.getAttribute("stroke"));
+ }
+ if (element.hasAttribute("stroke-width")) {
+ // if NaN (i.e. if it's 'inherit') then default
+ // back to the inherit setting
+ this.setStrokeWeight(element.getAttribute("stroke-width"));
+ }
+ if (element.hasAttribute("stroke-linejoin") ) {
+ this.setStrokeJoin(element.getAttribute("stroke-linejoin"));
+ }
+ if (element.hasAttribute("stroke-linecap")) {
+ this.setStrokeCap(element.getStringAttribute("stroke-linecap"));
+ }
+ // fill defaults to black (though stroke defaults to "none")
+ // http://www.w3.org/TR/SVG/painting.html#FillProperties
+ if (element.hasAttribute("fill")) {
+ this.setFill(element.getStringAttribute("fill"));
+ }
+ if (element.hasAttribute("style")) {
+ var styleText = element.getStringAttribute("style");
+ var styleTokens = styleText.toString().split( ";" );
+
+ for (var i = 0, j = styleTokens.length; i < j; i++) {
+ var tokens = CommonFunctions.trim(styleTokens[i].split( ":" ));
+ if (tokens[0] === "fill") {
+ this.setFill(tokens[1]);
+ } else if (tokens[0] === "fill-opacity") {
+ this.setFillOpacity(tokens[1]);
+ } else if (tokens[0] === "stroke") {
+ this.setStroke(tokens[1]);
+ } else if (tokens[0] === "stroke-width") {
+ this.setStrokeWeight(tokens[1]);
+ } else if (tokens[0] === "stroke-linecap") {
+ this.setStrokeCap(tokens[1]);
+ } else if (tokens[0] === "stroke-linejoin") {
+ this.setStrokeJoin(tokens[1]);
+ } else if (tokens[0] === "stroke-opacity") {
+ this.setStrokeOpacity(tokens[1]);
+ } else if (tokens[0] === "opacity") {
+ this.setOpacity(tokens[1]);
+ } // Other attributes are not yet implemented
+ }
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} opacityText the value of fillOpacity
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setFillOpacity = function(opacityText) {
+ this.fillOpacity = parseFloat(opacityText);
+ this.fillColor = this.fillOpacity * 255 << 24 |
+ this.fillColor & 0xFFFFFF;
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} fillText the value of fill
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setFill = function (fillText) {
+ var opacityMask = this.fillColor & 0xFF000000;
+ if (fillText === "none") {
+ this.fill = false;
+ } else if (fillText.indexOf("#") === 0) {
+ this.fill = true;
+ if (fillText.length === 4) {
+ // convert #00F to #0000FF
+ fillText = fillText.replace(/#(.)(.)(.)/,"#$1$1$2$2$3$3");
+ }
+ this.fillColor = opacityMask |
+ (parseInt(fillText.substring(1), 16 )) &
+ 0xFFFFFF;
+ } else if (fillText.indexOf("rgb") === 0) {
+ this.fill = true;
+ this.fillColor = opacityMask | this.parseRGB(fillText);
+ } else if (fillText.indexOf("url(#") === 0) {
+ this.fillName = fillText.substring(5, fillText.length - 1 );
+ } else if (colors[fillText]) {
+ this.fill = true;
+ this.fillColor = opacityMask |
+ (parseInt(colors[fillText].substring(1), 16)) &
+ 0xFFFFFF;
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} opacity the value of opacity
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setOpacity = function(opacity) {
+ this.strokeColor = parseFloat(opacity) * 255 << 24 |
+ this.strokeColor & 0xFFFFFF;
+ this.fillColor = parseFloat(opacity) * 255 << 24 |
+ this.fillColor & 0xFFFFFF;
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} strokeText the value to set stroke to
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setStroke = function(strokeText) {
+ var opacityMask = this.strokeColor & 0xFF000000;
+ if (strokeText === "none") {
+ this.stroke = false;
+ } else if (strokeText.charAt( 0 ) === "#") {
+ this.stroke = true;
+ if (strokeText.length === 4) {
+ // convert #00F to #0000FF
+ strokeText = strokeText.replace(/#(.)(.)(.)/,"#$1$1$2$2$3$3");
+ }
+ this.strokeColor = opacityMask |
+ (parseInt( strokeText.substring( 1 ), 16 )) &
+ 0xFFFFFF;
+ } else if (strokeText.indexOf( "rgb" ) === 0 ) {
+ this.stroke = true;
+ this.strokeColor = opacityMask | this.parseRGB(strokeText);
+ } else if (strokeText.indexOf( "url(#" ) === 0) {
+ this.strokeName = strokeText.substring(5, strokeText.length - 1);
+ } else if (colors[strokeText]) {
+ this.stroke = true;
+ this.strokeColor = opacityMask |
+ (parseInt(colors[strokeText].substring(1), 16)) &
+ 0xFFFFFF;
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} weight the value to set strokeWeight to
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setStrokeWeight = function(weight) {
+ this.strokeWeight = this.parseUnitSize(weight);
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} linejoin the value to set strokeJoin to
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setStrokeJoin = function(linejoin) {
+ if (linejoin === "miter") {
+ this.strokeJoin = PConstants.MITER;
+
+ } else if (linejoin === "round") {
+ this.strokeJoin = PConstants.ROUND;
+
+ } else if (linejoin === "bevel") {
+ this.strokeJoin = PConstants.BEVEL;
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} linecap the value to set strokeCap to
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setStrokeCap = function (linecap) {
+ if (linecap === "butt") {
+ this.strokeCap = PConstants.SQUARE;
+
+ } else if (linecap === "round") {
+ this.strokeCap = PConstants.ROUND;
+
+ } else if (linecap === "square") {
+ this.strokeCap = PConstants.PROJECT;
+ }
+ };
+ /**
+ * @member PShapeSVG
+ * PShapeSVG.parseColors() helper function
+ *
+ * @param {String} opacityText the value to set stroke opacity to
+ *
+ * @see PShapeSVG#parseColors
+ */
+ PShapeSVG.prototype.setStrokeOpacity = function (opacityText) {
+ this.strokeOpacity = parseFloat(opacityText);
+ this.strokeColor = this.strokeOpacity * 255 << 24 |
+ this.strokeColor &
+ 0xFFFFFF;
+ };
+ /**
+ * @member PShapeSVG
+ * The parseRGB() function parses an rbg() color string and returns a color int
+ *
+ * @param {String} color the color to parse in rbg() format
+ *
+ * @return {int} the equivalent color int
+ */
+ PShapeSVG.prototype.parseRGB = function(color) {
+ var sub = color.substring(color.indexOf('(') + 1, color.indexOf(')'));
+ var values = sub.split(", ");
+ return (values[0] << 16) | (values[1] << 8) | (values[2]);
+ };
+ /**
+ * @member PShapeSVG
+ * The parseUnitSize() function parse a size that may have a suffix for its units.
+ * Ignoring cases where this could also be a percentage.
+ * The <A HREF="http://www.w3.org/TR/SVG/coords.html#Units">units</A> spec:
+ * <UL>
+ * <LI>"1pt" equals "1.25px" (and therefore 1.25 user units)
+ * <LI>"1pc" equals "15px" (and therefore 15 user units)
+ * <LI>"1mm" would be "3.543307px" (3.543307 user units)
+ * <LI>"1cm" equals "35.43307px" (and therefore 35.43307 user units)
+ * <LI>"1in" equals "90px" (and therefore 90 user units)
+ * </UL>
+ */
+ PShapeSVG.prototype.parseUnitSize = function (text) {
+ var len = text.length - 2;
+ if (len < 0) { return text; }
+ if (text.indexOf("pt") === len) {
+ return parseFloat(text.substring(0, len)) * 1.25;
+ }
+ if (text.indexOf("pc") === len) {
+ return parseFloat( text.substring( 0, len)) * 15;
+ }
+ if (text.indexOf("mm") === len) {
+ return parseFloat( text.substring(0, len)) * 3.543307;
+ }
+ if (text.indexOf("cm") === len) {
+ return parseFloat(text.substring(0, len)) * 35.43307;
+ }
+ if (text.indexOf("in") === len) {
+ return parseFloat(text.substring(0, len)) * 90;
+ }
+ if (text.indexOf("px") === len) {
+ return parseFloat(text.substring(0, len));
+ }
+ return parseFloat(text);
+ };
+
+ return PShapeSVG;
+};
+
+},{}],18:[function(require,module,exports){
+module.exports = function(options, undef) {
+ var PConstants = options.PConstants;
+
+ function PVector(x, y, z) {
+ this.x = x || 0;
+ this.y = y || 0;
+ this.z = z || 0;
+ }
+
+ PVector.fromAngle = function(angle, v) {
+ if (v === undef || v === null) {
+ v = new PVector();
+ }
+ v.x = Math.cos(angle);
+ v.y = Math.sin(angle);
+ return v;
+ };
+
+ PVector.random2D = function(v) {
+ return PVector.fromAngle(Math.random() * PConstants.TWO_PI, v);
+ };
+
+ PVector.random3D = function(v) {
+ var angle = Math.random() * PConstants.TWO_PI;
+ var vz = Math.random() * 2 - 1;
+ var mult = Math.sqrt(1 - vz * vz);
+ var vx = mult * Math.cos(angle);
+ var vy = mult * Math.sin(angle);
+ if (v === undef || v === null) {
+ v = new PVector(vx, vy, vz);
+ } else {
+ v.set(vx, vy, vz);
+ }
+ return v;
+ };
+
+ PVector.dist = function(v1, v2) {
+ return v1.dist(v2);
+ };
+
+ PVector.dot = function(v1, v2) {
+ return v1.dot(v2);
+ };
+
+ PVector.cross = function(v1, v2) {
+ return v1.cross(v2);
+ };
+
+ PVector.sub = function(v1, v2) {
+ return new PVector(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
+ };
+
+ PVector.angleBetween = function(v1, v2) {
+ return Math.acos(v1.dot(v2) / Math.sqrt(v1.magSq() * v2.magSq()));
+ };
+
+ PVector.lerp = function(v1, v2, amt) {
+ // non-static lerp mutates object, but this version returns a new vector
+ var retval = new PVector(v1.x, v1.y, v1.z);
+ retval.lerp(v2, amt);
+ return retval;
+ };
+
+ // Common vector operations for PVector
+ PVector.prototype = {
+ set: function(v, y, z) {
+ if (arguments.length === 1) {
+ this.set(v.x || v[0] || 0,
+ v.y || v[1] || 0,
+ v.z || v[2] || 0);
+ } else {
+ this.x = v;
+ this.y = y;
+ this.z = z;
+ }
+ },
+ get: function() {
+ return new PVector(this.x, this.y, this.z);
+ },
+ mag: function() {
+ var x = this.x,
+ y = this.y,
+ z = this.z;
+ return Math.sqrt(x * x + y * y + z * z);
+ },
+ magSq: function() {
+ var x = this.x,
+ y = this.y,
+ z = this.z;
+ return (x * x + y * y + z * z);
+ },
+ setMag: function(v_or_len, len) {
+ if (len === undef) {
+ len = v_or_len;
+ this.normalize();
+ this.mult(len);
+ } else {
+ var v = v_or_len;
+ v.normalize();
+ v.mult(len);
+ return v;
+ }
+ },
+ add: function(v, y, z) {
+ if (arguments.length === 1) {
+ this.x += v.x;
+ this.y += v.y;
+ this.z += v.z;
+ } else if (arguments.length === 2) {
+ // 2D Vector
+ this.x += v;
+ this.y += y;
+ } else {
+ this.x += v;
+ this.y += y;
+ this.z += z;
+ }
+ },
+ sub: function(v, y, z) {
+ if (arguments.length === 1) {
+ this.x -= v.x;
+ this.y -= v.y;
+ this.z -= v.z;
+ } else if (arguments.length === 2) {
+ // 2D Vector
+ this.x -= v;
+ this.y -= y;
+ } else {
+ this.x -= v;
+ this.y -= y;
+ this.z -= z;
+ }
+ },
+ mult: function(v) {
+ if (typeof v === 'number') {
+ this.x *= v;
+ this.y *= v;
+ this.z *= v;
+ } else {
+ this.x *= v.x;
+ this.y *= v.y;
+ this.z *= v.z;
+ }
+ },
+ div: function(v) {
+ if (typeof v === 'number') {
+ this.x /= v;
+ this.y /= v;
+ this.z /= v;
+ } else {
+ this.x /= v.x;
+ this.y /= v.y;
+ this.z /= v.z;
+ }
+ },
+ rotate: function(angle) {
+ var prev_x = this.x;
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ this.x = c * this.x - s * this.y;
+ this.y = s * prev_x + c * this.y;
+ },
+ dist: function(v) {
+ var dx = this.x - v.x,
+ dy = this.y - v.y,
+ dz = this.z - v.z;
+ return Math.sqrt(dx * dx + dy * dy + dz * dz);
+ },
+ dot: function(v, y, z) {
+ if (arguments.length === 1) {
+ return (this.x * v.x + this.y * v.y + this.z * v.z);
+ }
+ return (this.x * v + this.y * y + this.z * z);
+ },
+ cross: function(v) {
+ var x = this.x,
+ y = this.y,
+ z = this.z;
+ return new PVector(y * v.z - v.y * z,
+ z * v.x - v.z * x,
+ x * v.y - v.x * y);
+ },
+ lerp: function(v_or_x, amt_or_y, z, amt) {
+ var lerp_val = function(start, stop, amt) {
+ return start + (stop - start) * amt;
+ };
+ var x, y;
+ if (arguments.length === 2) {
+ // given vector and amt
+ amt = amt_or_y;
+ x = v_or_x.x;
+ y = v_or_x.y;
+ z = v_or_x.z;
+ } else {
+ // given x, y, z and amt
+ x = v_or_x;
+ y = amt_or_y;
+ }
+ this.x = lerp_val(this.x, x, amt);
+ this.y = lerp_val(this.y, y, amt);
+ this.z = lerp_val(this.z, z, amt);
+ },
+ normalize: function() {
+ var m = this.mag();
+ if (m > 0) {
+ this.div(m);
+ }
+ },
+ limit: function(high) {
+ if (this.mag() > high) {
+ this.normalize();
+ this.mult(high);
+ }
+ },
+ heading: function() {
+ return (-Math.atan2(-this.y, this.x));
+ },
+ heading2D: function() {
+ return this.heading();
+ },
+ toString: function() {
+ return "[" + this.x + ", " + this.y + ", " + this.z + "]";
+ },
+ array: function() {
+ return [this.x, this.y, this.z];
+ }
+ };
+
+ function createPVectorMethod(method) {
+ return function(v1, v2) {
+ var v = v1.get();
+ v[method](v2);
+ return v;
+ };
+ }
+
+ for (var method in PVector.prototype) {
+ if (PVector.prototype.hasOwnProperty(method) && !PVector.hasOwnProperty(method)) {
+ PVector[method] = createPVectorMethod(method);
+ }
+ }
+
+ return PVector;
+};
+
+},{}],19:[function(require,module,exports){
+/**
+ * XMLAttribute is an attribute of a XML element.
+ *
+ * @param {String} fname the full name of the attribute
+ * @param {String} n the short name of the attribute
+ * @param {String} namespace the namespace URI of the attribute
+ * @param {String} v the value of the attribute
+ * @param {String }t the type of the attribute
+ *
+ * @see XMLElement
+ */
+module.exports = function() {
+
+ var XMLAttribute = function (fname, n, nameSpace, v, t){
+ this.fullName = fname || "";
+ this.name = n || "";
+ this.namespace = nameSpace || "";
+ this.value = v;
+ this.type = t;
+ };
+
+ XMLAttribute.prototype = {
+ /**
+ * @member XMLAttribute
+ * The getName() function returns the short name of the attribute
+ *
+ * @return {String} the short name of the attribute
+ */
+ getName: function() {
+ return this.name;
+ },
+ /**
+ * @member XMLAttribute
+ * The getFullName() function returns the full name of the attribute
+ *
+ * @return {String} the full name of the attribute
+ */
+ getFullName: function() {
+ return this.fullName;
+ },
+ /**
+ * @member XMLAttribute
+ * The getNamespace() function returns the namespace of the attribute
+ *
+ * @return {String} the namespace of the attribute
+ */
+ getNamespace: function() {
+ return this.namespace;
+ },
+ /**
+ * @member XMLAttribute
+ * The getValue() function returns the value of the attribute
+ *
+ * @return {String} the value of the attribute
+ */
+ getValue: function() {
+ return this.value;
+ },
+ /**
+ * @member XMLAttribute
+ * The getValue() function returns the type of the attribute
+ *
+ * @return {String} the type of the attribute
+ */
+ getType: function() {
+ return this.type;
+ },
+ /**
+ * @member XMLAttribute
+ * The setValue() function sets the value of the attribute
+ *
+ * @param {String} newval the new value
+ */
+ setValue: function(newval) {
+ this.value = newval;
+ }
+ };
+
+ return XMLAttribute;
+};
+
+},{}],20:[function(require,module,exports){
+/**
+ * XMLElement is a representation of an XML object. The object is able to parse XML code
+ *
+ * @param {PApplet} parent typically use "this"
+ * @param {String} filename name of the XML/SVG file to load
+ * @param {String} xml the xml/svg string
+ * @param {String} fullname the full name of the element
+ * @param {String} namespace the namespace of the URI
+ * @param {String} systemID the system ID of the XML data where the element starts
+ * @param {Integer }lineNr the line in the XML data where the element starts
+ */
+module.exports = function(options, undef) {
+
+ var Browser = options.Browser,
+ ajax = Browser.ajax,
+ window = Browser.window,
+ XMLHttpRequest = window.XMLHttpRequest,
+ DOMParser = window.DOMParser,
+ XMLAttribute = options. XMLAttribute;
+
+ var XMLElement = function(selector, uri, sysid, line) {
+ this.attributes = [];
+ this.children = [];
+ this.fullName = null;
+ this.name = null;
+ this.namespace = "";
+ this.content = null;
+ this.parent = null;
+ this.lineNr = "";
+ this.systemID = "";
+ this.type = "ELEMENT";
+
+ if (selector) {
+ if (typeof selector === "string") {
+ if (uri === undef && selector.indexOf("<") > -1) {
+ // load XML from text string
+ this.parse(selector);
+ } else {
+ // XMLElement(fullname, namespace, sysid, line) format
+ this.fullName = selector;
+ this.namespace = uri;
+ this.systemId = sysid;
+ this.lineNr = line;
+ }
+ } else {
+ // XMLElement(this, file uri) format
+ this.parse(uri, true);
+ }
+ }
+ };
+ /**
+ * XMLElement methods
+ * missing: enumerateAttributeNames(), enumerateChildren(),
+ * NOTE: parse does not work when a url is passed in
+ */
+ XMLElement.prototype = {
+ /**
+ * @member XMLElement
+ * The parse() function retrieves the file via ajax() and uses DOMParser()
+ * parseFromString method to make an XML document
+ * @addon
+ *
+ * @param {String} filename name of the XML/SVG file to load
+ *
+ * @throws ExceptionType Error loading document
+ *
+ * @see XMLElement#parseChildrenRecursive
+ */
+ parse: function(textstring, stringIsURI) {
+ var xmlDoc;
+ try {
+ if (stringIsURI) {
+ textstring = ajax(textstring);
+ }
+ xmlDoc = new DOMParser().parseFromString(textstring, "text/xml");
+ var elements = xmlDoc.documentElement;
+ if (elements) {
+ this.parseChildrenRecursive(null, elements);
+ } else {
+ throw ("Error loading document");
+ }
+ return this;
+ } catch(e) {
+ throw(e);
+ }
+ },
+ /**
+ * @member XMLElement
+ * Internal helper function for parse().
+ * Loops through the
+ * @addon
+ *
+ * @param {XMLElement} parent the parent node
+ * @param {XML document childNodes} elementpath the remaining nodes that need parsing
+ *
+ * @return {XMLElement} the new element and its children elements
+ */
+ parseChildrenRecursive: function (parent, elementpath){
+ var xmlelement,
+ xmlattribute,
+ tmpattrib,
+ l, m,
+ child;
+ if (!parent) { // this element is the root element
+ this.fullName = elementpath.localName;
+ this.name = elementpath.nodeName;
+ xmlelement = this;
+ } else { // this element has a parent
+ xmlelement = new XMLElement(elementpath.nodeName);
+ xmlelement.parent = parent;
+ }
+
+ // if this is a text node, return a PCData element (parsed character data)
+ if (elementpath.nodeType === 3 && elementpath.textContent !== "") {
+ return this.createPCDataElement(elementpath.textContent);
+ }
+
+ // if this is a CDATA node, return a CData element (unparsed character data)
+ if (elementpath.nodeType === 4) {
+ return this.createCDataElement(elementpath.textContent);
+ }
+
+ // bind all attributes, if there are any
+ if (elementpath.attributes) {
+ for (l = 0, m = elementpath.attributes.length; l < m; l++) {
+ tmpattrib = elementpath.attributes[l];
+ xmlattribute = new XMLAttribute(tmpattrib.getname,
+ tmpattrib.nodeName,
+ tmpattrib.namespaceURI,
+ tmpattrib.nodeValue,
+ tmpattrib.nodeType);
+ xmlelement.attributes.push(xmlattribute);
+ }
+ }
+
+ // bind all children, if there are any
+ if (elementpath.childNodes) {
+ for (l = 0, m = elementpath.childNodes.length; l < m; l++) {
+ var node = elementpath.childNodes[l];
+ child = xmlelement.parseChildrenRecursive(xmlelement, node);
+ if (child !== null) {
+ xmlelement.children.push(child);
+ }
+ }
+ }
+
+ return xmlelement;
+ },
+ /**
+ * @member XMLElement
+ * The createElement() function Creates an empty element
+ *
+ * @param {String} fullName the full name of the element
+ * @param {String} namespace the namespace URI
+ * @param {String} systemID the system ID of the XML data where the element starts
+ * @param {int} lineNr the line in the XML data where the element starts
+ */
+ createElement: function (fullname, namespaceuri, sysid, line) {
+ if (sysid === undef) {
+ return new XMLElement(fullname, namespaceuri);
+ }
+ return new XMLElement(fullname, namespaceuri, sysid, line);
+ },
+ /**
+ * @member XMLElement
+ * The createPCDataElement() function creates an element to be used for #PCDATA content.
+ * Because Processing discards whitespace TEXT nodes, this method will not build an element
+ * if the passed content is empty after trimming for whitespace.
+ *
+ * @return {XMLElement} new "pcdata" XMLElement, or null if content consists only of whitespace
+ */
+ createPCDataElement: function (content, isCDATA) {
+ if (content.replace(/^\s+$/g,"") === "") {
+ return null;
+ }
+ var pcdata = new XMLElement();
+ pcdata.type = "TEXT";
+ pcdata.content = content;
+ return pcdata;
+ },
+ /**
+ * @member XMLElement
+ * The createCDataElement() function creates an element to be used for CDATA content.
+ *
+ * @return {XMLElement} new "cdata" XMLElement, or null if content consists only of whitespace
+ */
+ createCDataElement: function (content) {
+ var cdata = this.createPCDataElement(content);
+ if (cdata === null) {
+ return null;
+ }
+
+ cdata.type = "CDATA";
+ var htmlentities = {"<": "&lt;", ">": "&gt;", "'": "&apos;", '"': "&quot;"},
+ entity;
+ for (entity in htmlentities) {
+ if (!Object.hasOwnProperty(htmlentities,entity)) {
+ content = content.replace(new RegExp(entity, "g"), htmlentities[entity]);
+ }
+ }
+ cdata.cdata = content;
+ return cdata;
+ },
+ /**
+ * @member XMLElement
+ * The hasAttribute() function returns whether an attribute exists
+ *
+ * @param {String} name name of the attribute
+ * @param {String} namespace the namespace URI of the attribute
+ *
+ * @return {boolean} true if the attribute exists
+ */
+ hasAttribute: function () {
+ if (arguments.length === 1) {
+ return this.getAttribute(arguments[0]) !== null;
+ }
+ if (arguments.length === 2) {
+ return this.getAttribute(arguments[0],arguments[1]) !== null;
+ }
+ },
+ /**
+ * @member XMLElement
+ * The equals() function checks to see if the XMLElement being passed in equals another XMLElement
+ *
+ * @param {XMLElement} rawElement the element to compare to
+ *
+ * @return {boolean} true if the element equals another element
+ */
+ equals: function(other) {
+ if (!(other instanceof XMLElement)) {
+ return false;
+ }
+ var i, j;
+ if (this.fullName !== other.fullName) { return false; }
+ if (this.attributes.length !== other.getAttributeCount()) { return false; }
+ // attributes may be ordered differently
+ if (this.attributes.length !== other.attributes.length) { return false; }
+ var attr_name, attr_ns, attr_value, attr_type, attr_other;
+ for (i = 0, j = this.attributes.length; i < j; i++) {
+ attr_name = this.attributes[i].getName();
+ attr_ns = this.attributes[i].getNamespace();
+ attr_other = other.findAttribute(attr_name, attr_ns);
+ if (attr_other === null) { return false; }
+ if (this.attributes[i].getValue() !== attr_other.getValue()) { return false; }
+ if (this.attributes[i].getType() !== attr_other.getType()) { return false; }
+ }
+ // children must be ordered identically
+ if (this.children.length !== other.getChildCount()) { return false; }
+ if (this.children.length>0) {
+ var child1, child2;
+ for (i = 0, j = this.children.length; i < j; i++) {
+ child1 = this.getChild(i);
+ child2 = other.getChild(i);
+ if (!child1.equals(child2)) { return false; }
+ }
+ return true;
+ }
+ return (this.content === other.content);
+ },
+ /**
+ * @member XMLElement
+ * The getContent() function returns the content of an element. If there is no such content, null is returned
+ *
+ * @return {String} the (possibly null) content
+ */
+ getContent: function(){
+ if (this.type === "TEXT" || this.type === "CDATA") {
+ return this.content;
+ }
+ var children = this.children;
+ if (children.length === 1 && (children[0].type === "TEXT" || children[0].type === "CDATA")) {
+ return children[0].content;
+ }
+ return null;
+ },
+ /**
+ * @member XMLElement
+ * The getAttribute() function returns the value of an attribute
+ *
+ * @param {String} name the non-null full name of the attribute
+ * @param {String} namespace the namespace URI, which may be null
+ * @param {String} defaultValue the default value of the attribute
+ *
+ * @return {String} the value, or defaultValue if the attribute does not exist
+ */
+ getAttribute: function (){
+ var attribute;
+ if (arguments.length === 2) {
+ attribute = this.findAttribute(arguments[0]);
+ if (attribute) {
+ return attribute.getValue();
+ }
+ return arguments[1];
+ } else if (arguments.length === 1) {
+ attribute = this.findAttribute(arguments[0]);
+ if (attribute) {
+ return attribute.getValue();
+ }
+ return null;
+ } else if (arguments.length === 3) {
+ attribute = this.findAttribute(arguments[0],arguments[1]);
+ if (attribute) {
+ return attribute.getValue();
+ }
+ return arguments[2];
+ }
+ },
+ /**
+ * @member XMLElement
+ * The getStringAttribute() function returns the string attribute of the element
+ * If the <b>defaultValue</b> parameter is used and the attribute doesn't exist, the <b>defaultValue</b> value is returned.
+ * When calling the function without the <b>defaultValue</b> parameter, if the attribute doesn't exist, the value 0 is returned.
+ *
+ * @param name the name of the attribute
+ * @param defaultValue value returned if the attribute is not found
+ *
+ * @return {String} the value, or defaultValue if the attribute does not exist
+ */
+ getStringAttribute: function() {
+ if (arguments.length === 1) {
+ return this.getAttribute(arguments[0]);
+ }
+ if (arguments.length === 2) {
+ return this.getAttribute(arguments[0], arguments[1]);
+ }
+ return this.getAttribute(arguments[0], arguments[1],arguments[2]);
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic String
+ * attribute getter. This may only take one argument.
+ */
+ getString: function(attributeName) {
+ return this.getStringAttribute(attributeName);
+ },
+ /**
+ * @member XMLElement
+ * The getFloatAttribute() function returns the float attribute of the element.
+ * If the <b>defaultValue</b> parameter is used and the attribute doesn't exist, the <b>defaultValue</b> value is returned.
+ * When calling the function without the <b>defaultValue</b> parameter, if the attribute doesn't exist, the value 0 is returned.
+ *
+ * @param name the name of the attribute
+ * @param defaultValue value returned if the attribute is not found
+ *
+ * @return {float} the value, or defaultValue if the attribute does not exist
+ */
+ getFloatAttribute: function() {
+ if (arguments.length === 1 ) {
+ return parseFloat(this.getAttribute(arguments[0], 0));
+ }
+ if (arguments.length === 2 ) {
+ return this.getAttribute(arguments[0], arguments[1]);
+ }
+ return this.getAttribute(arguments[0], arguments[1],arguments[2]);
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic float
+ * attribute getter. This may only take one argument.
+ */
+ getFloat: function(attributeName) {
+ return this.getFloatAttribute(attributeName);
+ },
+ /**
+ * @member XMLElement
+ * The getIntAttribute() function returns the integer attribute of the element.
+ * If the <b>defaultValue</b> parameter is used and the attribute doesn't exist, the <b>defaultValue</b> value is returned.
+ * When calling the function without the <b>defaultValue</b> parameter, if the attribute doesn't exist, the value 0 is returned.
+ *
+ * @param name the name of the attribute
+ * @param defaultValue value returned if the attribute is not found
+ *
+ * @return {int} the value, or defaultValue if the attribute does not exist
+ */
+ getIntAttribute: function () {
+ if (arguments.length === 1) {
+ return this.getAttribute( arguments[0], 0 );
+ }
+ if (arguments.length === 2) {
+ return this.getAttribute(arguments[0], arguments[1]);
+ }
+ return this.getAttribute(arguments[0], arguments[1],arguments[2]);
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic int
+ * attribute getter. This may only take one argument.
+ */
+ getInt: function(attributeName) {
+ return this.getIntAttribute(attributeName);
+ },
+ /**
+ * @member XMLElement
+ * The hasChildren() function returns whether the element has children.
+ *
+ * @return {boolean} true if the element has children.
+ */
+ hasChildren: function () {
+ return this.children.length > 0 ;
+ },
+ /**
+ * @member XMLElement
+ * The addChild() function adds a child element
+ *
+ * @param {XMLElement} child the non-null child to add.
+ */
+ addChild: function (child) {
+ if (child !== null) {
+ child.parent = this;
+ this.children.push(child);
+ }
+ },
+ /**
+ * @member XMLElement
+ * The insertChild() function inserts a child element at the index provided
+ *
+ * @param {XMLElement} child the non-null child to add.
+ * @param {int} index where to put the child.
+ */
+ insertChild: function (child, index) {
+ if (child) {
+ if ((child.getLocalName() === null) && (! this.hasChildren())) {
+ var lastChild = this.children[this.children.length -1];
+ if (lastChild.getLocalName() === null) {
+ lastChild.setContent(lastChild.getContent() + child.getContent());
+ return;
+ }
+ }
+ child.parent = this;
+ this.children.splice(index,0,child);
+ }
+ },
+ /**
+ * @member XMLElement
+ * The getChild() returns the child XMLElement as specified by the <b>index</b> parameter.
+ * The value of the <b>index</b> parameter must be less than the total number of children to avoid going out of the array storing the child elements.
+ * When the <b>path</b> parameter is specified, then it will return all children that match that path. The path is a series of elements and sub-elements, separated by slashes.
+ *
+ * @param {int} index where to put the child.
+ * @param {String} path path to a particular element
+ *
+ * @return {XMLElement} the element
+ */
+ getChild: function (selector) {
+ if (typeof selector === "number") {
+ return this.children[selector];
+ }
+ if (selector.indexOf('/') !== -1) {
+ // path traversal is required
+ return this.getChildRecursive(selector.split("/"), 0);
+ }
+ var kid, kidName;
+ for (var i = 0, j = this.getChildCount(); i < j; i++) {
+ kid = this.getChild(i);
+ kidName = kid.getName();
+ if (kidName !== null && kidName === selector) {
+ return kid;
+ }
+ }
+ return null;
+ },
+ /**
+ * @member XMLElement
+ * The getChildren() returns all of the children as an XMLElement array.
+ * When the <b>path</b> parameter is specified, then it will return all children that match that path.
+ * The path is a series of elements and sub-elements, separated by slashes.
+ *
+ * @param {String} path element name or path/to/element
+ *
+ * @return {XMLElement} array of child elements that match
+ *
+ * @see XMLElement#getChildCount()
+ * @see XMLElement#getChild()
+ */
+ getChildren: function(){
+ if (arguments.length === 1) {
+ if (typeof arguments[0] === "number") {
+ return this.getChild( arguments[0]);
+ }
+ if (arguments[0].indexOf('/') !== -1) { // path was given
+ return this.getChildrenRecursive( arguments[0].split("/"), 0);
+ }
+ var matches = [];
+ var kid, kidName;
+ for (var i = 0, j = this.getChildCount(); i < j; i++) {
+ kid = this.getChild(i);
+ kidName = kid.getName();
+ if (kidName !== null && kidName === arguments[0]) {
+ matches.push(kid);
+ }
+ }
+ return matches;
+ }
+ return this.children;
+ },
+ /**
+ * @member XMLElement
+ * The getChildCount() returns the number of children for the element.
+ *
+ * @return {int} the count
+ *
+ * @see XMLElement#getChild()
+ * @see XMLElement#getChildren()
+ */
+ getChildCount: function() {
+ return this.children.length;
+ },
+ /**
+ * @member XMLElement
+ * Internal helper function for getChild().
+ *
+ * @param {String[]} items result of splitting the query on slashes
+ * @param {int} offset where in the items[] array we're currently looking
+ *
+ * @return {XMLElement} matching element or null if no match
+ */
+ getChildRecursive: function (items, offset) {
+ // terminating clause: we are the requested candidate
+ if (offset === items.length) {
+ return this;
+ }
+ // continuation clause
+ var kid, kidName, matchName = items[offset];
+ for(var i = 0, j = this.getChildCount(); i < j; i++) {
+ kid = this.getChild(i);
+ kidName = kid.getName();
+ if (kidName !== null && kidName === matchName) {
+ return kid.getChildRecursive(items, offset+1);
+ }
+ }
+ return null;
+ },
+ /**
+ * @member XMLElement
+ * Internal helper function for getChildren().
+ *
+ * @param {String[]} items result of splitting the query on slashes
+ * @param {int} offset where in the items[] array we're currently looking
+ *
+ * @return {XMLElement[]} matching elements or empty array if no match
+ */
+ getChildrenRecursive: function (items, offset) {
+ if (offset === items.length-1) {
+ return this.getChildren(items[offset]);
+ }
+ var matches = this.getChildren(items[offset]);
+ var kidMatches = [];
+ for (var i = 0; i < matches.length; i++) {
+ kidMatches = kidMatches.concat(matches[i].getChildrenRecursive(items, offset+1));
+ }
+ return kidMatches;
+ },
+ /**
+ * @member XMLElement
+ * The isLeaf() function returns whether the element is a leaf element.
+ *
+ * @return {boolean} true if the element has no children.
+ */
+ isLeaf: function() {
+ return !this.hasChildren();
+ },
+ /**
+ * @member XMLElement
+ * The listChildren() function put the names of all children into an array. Same as looping through
+ * each child and calling getName() on each XMLElement.
+ *
+ * @return {String[]} a list of element names.
+ */
+ listChildren: function() {
+ var arr = [];
+ for (var i = 0, j = this.children.length; i < j; i++) {
+ arr.push( this.getChild(i).getName());
+ }
+ return arr;
+ },
+ /**
+ * @member XMLElement
+ * The removeAttribute() function removes an attribute
+ *
+ * @param {String} name the non-null name of the attribute.
+ * @param {String} namespace the namespace URI of the attribute, which may be null.
+ */
+ removeAttribute: function (name , namespace) {
+ this.namespace = namespace || "";
+ for (var i = 0, j = this.attributes.length; i < j; i++) {
+ if (this.attributes[i].getName() === name && this.attributes[i].getNamespace() === this.namespace) {
+ this.attributes.splice(i, 1);
+ break;
+ }
+ }
+ },
+ /**
+ * @member XMLElement
+ * The removeChild() removes a child element.
+ *
+ * @param {XMLElement} child the the non-null child to be renoved
+ */
+ removeChild: function(child) {
+ if (child) {
+ for (var i = 0, j = this.children.length; i < j; i++) {
+ if (this.children[i].equals(child)) {
+ this.children.splice(i, 1);
+ break;
+ }
+ }
+ }
+ },
+ /**
+ * @member XMLElement
+ * The removeChildAtIndex() removes the child located at a certain index
+ *
+ * @param {int} index the index of the child, where the first child has index 0
+ */
+ removeChildAtIndex: function(index) {
+ if (this.children.length > index) { //make sure its not outofbounds
+ this.children.splice(index, 1);
+ }
+ },
+ /**
+ * @member XMLElement
+ * The findAttribute() function searches an attribute
+ *
+ * @param {String} name fullName the non-null full name of the attribute
+ * @param {String} namespace the name space, which may be null
+ *
+ * @return {XMLAttribute} the attribute, or null if the attribute does not exist.
+ */
+ findAttribute: function (name, namespace) {
+ this.namespace = namespace || "";
+ for (var i = 0, j = this.attributes.length; i < j; i++) {
+ if (this.attributes[i].getName() === name && this.attributes[i].getNamespace() === this.namespace) {
+ return this.attributes[i];
+ }
+ }
+ return null;
+ },
+ /**
+ * @member XMLElement
+ * The setAttribute() function sets an attribute.
+ *
+ * @param {String} name the non-null full name of the attribute
+ * @param {String} namespace the non-null value of the attribute
+ */
+ setAttribute: function() {
+ var attr;
+ if (arguments.length === 3) {
+ var index = arguments[0].indexOf(':');
+ var name = arguments[0].substring(index + 1);
+ attr = this.findAttribute(name, arguments[1]);
+ if (attr) {
+ attr.setValue(arguments[2]);
+ } else {
+ attr = new XMLAttribute(arguments[0], name, arguments[1], arguments[2], "CDATA");
+ this.attributes.push(attr);
+ }
+ } else {
+ attr = this.findAttribute(arguments[0]);
+ if (attr) {
+ attr.setValue(arguments[1]);
+ } else {
+ attr = new XMLAttribute(arguments[0], arguments[0], null, arguments[1], "CDATA");
+ this.attributes.push(attr);
+ }
+ }
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic String
+ * attribute setter. This must take two arguments.
+ */
+ setString: function(attribute, value) {
+ this.setAttribute(attribute, value);
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic int
+ * attribute setter. This must take two arguments.
+ */
+ setInt: function(attribute, value) {
+ this.setAttribute(attribute, value);
+ },
+ /**
+ * Processing 1.5 XML API wrapper for the generic float
+ * attribute setter. This must take two arguments.
+ */
+ setFloat: function(attribute, value) {
+ this.setAttribute(attribute, value);
+ },
+ /**
+ * @member XMLElement
+ * The setContent() function sets the #PCDATA content. It is an error to call this method with a
+ * non-null value if there are child objects.
+ *
+ * @param {String} content the (possibly null) content
+ */
+ setContent: function(content) {
+ if (this.children.length > 0) {
+ Processing.debug("Tried to set content for XMLElement with children"); }
+ this.content = content;
+ },
+ /**
+ * @member XMLElement
+ * The setName() function sets the full name. This method also sets the short name and clears the
+ * namespace URI.
+ *
+ * @param {String} name the non-null name
+ * @param {String} namespace the namespace URI, which may be null.
+ */
+ setName: function() {
+ if (arguments.length === 1) {
+ this.name = arguments[0];
+ this.fullName = arguments[0];
+ this.namespace = null;
+ } else {
+ var index = arguments[0].indexOf(':');
+ if ((arguments[1] === null) || (index < 0)) {
+ this.name = arguments[0];
+ } else {
+ this.name = arguments[0].substring(index + 1);
+ }
+ this.fullName = arguments[0];
+ this.namespace = arguments[1];
+ }
+ },
+ /**
+ * @member XMLElement
+ * The getName() function returns the full name (i.e. the name including an eventual namespace
+ * prefix) of the element.
+ *
+ * @return {String} the name, or null if the element only contains #PCDATA.
+ */
+ getName: function() {
+ return this.fullName;
+ },
+ /**
+ * @member XMLElement
+ * The getLocalName() function returns the local name (i.e. the name excluding an eventual namespace
+ * prefix) of the element.
+ *
+ * @return {String} the name, or null if the element only contains #PCDATA.
+ */
+ getLocalName: function() {
+ return this.name;
+ },
+ /**
+ * @member XMLElement
+ * The getAttributeCount() function returns the number of attributes for the node
+ * that this XMLElement represents.
+ *
+ * @return {int} the number of attributes in this XMLElement
+ */
+ getAttributeCount: function() {
+ return this.attributes.length;
+ },
+ /**
+ * @member XMLElement
+ * The toString() function returns the XML definition of an XMLElement.
+ *
+ * @return {String} the XML definition of this XMLElement
+ */
+ toString: function() {
+ // shortcut for text and cdata nodes
+ if (this.type === "TEXT") {
+ return this.content || "";
+ }
+
+ if (this.type === "CDATA") {
+ return this.cdata || "";
+ }
+
+ // real XMLElements
+ var tagstring = this.fullName;
+ var xmlstring = "<" + tagstring;
+ var a,c;
+
+ // serialize the attributes to XML string
+ for (a = 0; a<this.attributes.length; a++) {
+ var attr = this.attributes[a];
+ xmlstring += " " + attr.getName() + "=" + '"' + attr.getValue() + '"';
+ }
+
+ // serialize all children to XML string
+ if (this.children.length === 0) {
+ if (this.content === "" || this.content === null || this.content === undefined) {
+ xmlstring += "/>";
+ } else {
+ xmlstring += ">" + this.content + "</"+tagstring+">";
+ }
+ } else {
+ xmlstring += ">";
+ for (c = 0; c<this.children.length; c++) {
+ xmlstring += this.children[c].toString();
+ }
+ xmlstring += "</" + tagstring + ">";
+ }
+ return xmlstring;
+ }
+ };
+
+ /**
+ * static Processing 1.5 XML API wrapper for the
+ * parse method. This may only take one argument.
+ */
+ XMLElement.parse = function(xmlstring) {
+ var element = new XMLElement();
+ element.parse(xmlstring);
+ return element;
+ };
+
+ return XMLElement;
+};
+
+},{}],21:[function(require,module,exports){
+/**
+ * web colors, by name
+ */
+module.exports = {
+ aliceblue: "#f0f8ff",
+ antiquewhite: "#faebd7",
+ aqua: "#00ffff",
+ aquamarine: "#7fffd4",
+ azure: "#f0ffff",
+ beige: "#f5f5dc",
+ bisque: "#ffe4c4",
+ black: "#000000",
+ blanchedalmond: "#ffebcd",
+ blue: "#0000ff",
+ blueviolet: "#8a2be2",
+ brown: "#a52a2a",
+ burlywood: "#deb887",
+ cadetblue: "#5f9ea0",
+ chartreuse: "#7fff00",
+ chocolate: "#d2691e",
+ coral: "#ff7f50",
+ cornflowerblue: "#6495ed",
+ cornsilk: "#fff8dc",
+ crimson: "#dc143c",
+ cyan: "#00ffff",
+ darkblue: "#00008b",
+ darkcyan: "#008b8b",
+ darkgoldenrod: "#b8860b",
+ darkgray: "#a9a9a9",
+ darkgreen: "#006400",
+ darkkhaki: "#bdb76b",
+ darkmagenta: "#8b008b",
+ darkolivegreen: "#556b2f",
+ darkorange: "#ff8c00",
+ darkorchid: "#9932cc",
+ darkred: "#8b0000",
+ darksalmon: "#e9967a",
+ darkseagreen: "#8fbc8f",
+ darkslateblue: "#483d8b",
+ darkslategray: "#2f4f4f",
+ darkturquoise: "#00ced1",
+ darkviolet: "#9400d3",
+ deeppink: "#ff1493",
+ deepskyblue: "#00bfff",
+ dimgray: "#696969",
+ dodgerblue: "#1e90ff",
+ firebrick: "#b22222",
+ floralwhite: "#fffaf0",
+ forestgreen: "#228b22",
+ fuchsia: "#ff00ff",
+ gainsboro: "#dcdcdc",
+ ghostwhite: "#f8f8ff",
+ gold: "#ffd700",
+ goldenrod: "#daa520",
+ gray: "#808080",
+ green: "#008000",
+ greenyellow: "#adff2f",
+ honeydew: "#f0fff0",
+ hotpink: "#ff69b4",
+ indianred: "#cd5c5c",
+ indigo: "#4b0082",
+ ivory: "#fffff0",
+ khaki: "#f0e68c",
+ lavender: "#e6e6fa",
+ lavenderblush: "#fff0f5",
+ lawngreen: "#7cfc00",
+ lemonchiffon: "#fffacd",
+ lightblue: "#add8e6",
+ lightcoral: "#f08080",
+ lightcyan: "#e0ffff",
+ lightgoldenrodyellow: "#fafad2",
+ lightgrey: "#d3d3d3",
+ lightgreen: "#90ee90",
+ lightpink: "#ffb6c1",
+ lightsalmon: "#ffa07a",
+ lightseagreen: "#20b2aa",
+ lightskyblue: "#87cefa",
+ lightslategray: "#778899",
+ lightsteelblue: "#b0c4de",
+ lightyellow: "#ffffe0",
+ lime: "#00ff00",
+ limegreen: "#32cd32",
+ linen: "#faf0e6",
+ magenta: "#ff00ff",
+ maroon: "#800000",
+ mediumaquamarine: "#66cdaa",
+ mediumblue: "#0000cd",
+ mediumorchid: "#ba55d3",
+ mediumpurple: "#9370d8",
+ mediumseagreen: "#3cb371",
+ mediumslateblue: "#7b68ee",
+ mediumspringgreen: "#00fa9a",
+ mediumturquoise: "#48d1cc",
+ mediumvioletred: "#c71585",
+ midnightblue: "#191970",
+ mintcream: "#f5fffa",
+ mistyrose: "#ffe4e1",
+ moccasin: "#ffe4b5",
+ navajowhite: "#ffdead",
+ navy: "#000080",
+ oldlace: "#fdf5e6",
+ olive: "#808000",
+ olivedrab: "#6b8e23",
+ orange: "#ffa500",
+ orangered: "#ff4500",
+ orchid: "#da70d6",
+ palegoldenrod: "#eee8aa",
+ palegreen: "#98fb98",
+ paleturquoise: "#afeeee",
+ palevioletred: "#d87093",
+ papayawhip: "#ffefd5",
+ peachpuff: "#ffdab9",
+ peru: "#cd853f",
+ pink: "#ffc0cb",
+ plum: "#dda0dd",
+ powderblue: "#b0e0e6",
+ purple: "#800080",
+ red: "#ff0000",
+ rosybrown: "#bc8f8f",
+ royalblue: "#4169e1",
+ saddlebrown: "#8b4513",
+ salmon: "#fa8072",
+ sandybrown: "#f4a460",
+ seagreen: "#2e8b57",
+ seashell: "#fff5ee",
+ sienna: "#a0522d",
+ silver: "#c0c0c0",
+ skyblue: "#87ceeb",
+ slateblue: "#6a5acd",
+ slategray: "#708090",
+ snow: "#fffafa",
+ springgreen: "#00ff7f",
+ steelblue: "#4682b4",
+ tan: "#d2b48c",
+ teal: "#008080",
+ thistle: "#d8bfd8",
+ tomato: "#ff6347",
+ turquoise: "#40e0d0",
+ violet: "#ee82ee",
+ wheat: "#f5deb3",
+ white: "#ffffff",
+ whitesmoke: "#f5f5f5",
+ yellow: "#ffff00",
+ yellowgreen: "#9acd32"
+ };
+
+},{}],22:[function(require,module,exports){
+module.exports = function(virtHashCode, virtEquals, undef) {
+
+ return function withProxyFunctions(p, removeFirstArgument) {
+ /**
+ * The contains(string) function returns true if the string passed in the parameter
+ * is a substring of this string. It returns false if the string passed
+ * in the parameter is not a substring of this string.
+ *
+ * @param {String} The string to look for in the current string
+ *
+ * @return {boolean} returns true if this string contains
+ * the string passed as parameter. returns false, otherwise.
+ *
+ */
+ p.__contains = function (subject, subStr) {
+ if (typeof subject !== "string") {
+ return subject.contains.apply(subject, removeFirstArgument(arguments));
+ }
+ //Parameter is not null AND
+ //The type of the parameter is the same as this object (string)
+ //The javascript function that finds a substring returns 0 or higher
+ return (
+ (subject !== null) &&
+ (subStr !== null) &&
+ (typeof subStr === "string") &&
+ (subject.indexOf(subStr) > -1)
+ );
+ };
+
+ /**
+ * The __replaceAll() function searches all matches between a substring (or regular expression) and a string,
+ * and replaces the matched substring with a new substring
+ *
+ * @param {String} subject a substring
+ * @param {String} regex a substring or a regular expression
+ * @param {String} replace the string to replace the found value
+ *
+ * @return {String} returns result
+ *
+ * @see #match
+ */
+ p.__replaceAll = function(subject, regex, replacement) {
+ if (typeof subject !== "string") {
+ return subject.replaceAll.apply(subject, removeFirstArgument(arguments));
+ }
+
+ return subject.replace(new RegExp(regex, "g"), replacement);
+ };
+
+ /**
+ * The __replaceFirst() function searches first matche between a substring (or regular expression) and a string,
+ * and replaces the matched substring with a new substring
+ *
+ * @param {String} subject a substring
+ * @param {String} regex a substring or a regular expression
+ * @param {String} replace the string to replace the found value
+ *
+ * @return {String} returns result
+ *
+ * @see #match
+ */
+ p.__replaceFirst = function(subject, regex, replacement) {
+ if (typeof subject !== "string") {
+ return subject.replaceFirst.apply(subject, removeFirstArgument(arguments));
+ }
+
+ return subject.replace(new RegExp(regex, ""), replacement);
+ };
+
+ /**
+ * The __replace() function searches all matches between a substring and a string,
+ * and replaces the matched substring with a new substring
+ *
+ * @param {String} subject a substring
+ * @param {String} what a substring to find
+ * @param {String} replacement the string to replace the found value
+ *
+ * @return {String} returns result
+ */
+ p.__replace = function(subject, what, replacement) {
+ if (typeof subject !== "string") {
+ return subject.replace.apply(subject, removeFirstArgument(arguments));
+ }
+ if (what instanceof RegExp) {
+ return subject.replace(what, replacement);
+ }
+
+ if (typeof what !== "string") {
+ what = what.toString();
+ }
+ if (what === "") {
+ return subject;
+ }
+
+ var i = subject.indexOf(what);
+ if (i < 0) {
+ return subject;
+ }
+
+ var j = 0, result = "";
+ do {
+ result += subject.substring(j, i) + replacement;
+ j = i + what.length;
+ } while ( (i = subject.indexOf(what, j)) >= 0);
+ return result + subject.substring(j);
+ };
+
+ /**
+ * The __equals() function compares two strings (or objects) to see if they are the same.
+ * This method is necessary because it's not possible to compare strings using the equality operator (==).
+ * Returns true if the strings are the same and false if they are not.
+ *
+ * @param {String} subject a string used for comparison
+ * @param {String} other a string used for comparison with
+ *
+ * @return {boolean} true is the strings are the same false otherwise
+ */
+ p.__equals = function(subject, other) {
+ if (subject.equals instanceof Function) {
+ return subject.equals.apply(subject, removeFirstArgument(arguments));
+ }
+
+ return virtEquals(subject, other);
+ };
+
+ /**
+ * The __equalsIgnoreCase() function compares two strings to see if they are the same.
+ * Returns true if the strings are the same, either when forced to all lower case or
+ * all upper case.
+ *
+ * @param {String} subject a string used for comparison
+ * @param {String} other a string used for comparison with
+ *
+ * @return {boolean} true is the strings are the same, ignoring case. false otherwise
+ */
+ p.__equalsIgnoreCase = function(subject, other) {
+ if (typeof subject !== "string") {
+ return subject.equalsIgnoreCase.apply(subject, removeFirstArgument(arguments));
+ }
+
+ return subject.toLowerCase() === other.toLowerCase();
+ };
+
+ /**
+ * The __toCharArray() function splits the string into a char array.
+ *
+ * @param {String} subject The string
+ *
+ * @return {Char[]} a char array
+ */
+ p.__toCharArray = function(subject) {
+ if (typeof subject !== "string") {
+ return subject.toCharArray.apply(subject, removeFirstArgument(arguments));
+ }
+
+ var chars = [];
+ for (var i = 0, len = subject.length; i < len; ++i) {
+ chars[i] = new Char(subject.charAt(i));
+ }
+ return chars;
+ };
+
+ /**
+ * The __split() function splits a string using the regex delimiter
+ * specified. If limit is specified, the resultant array will have number
+ * of elements equal to or less than the limit.
+ *
+ * @param {String} subject string to be split
+ * @param {String} regexp regex string used to split the subject
+ * @param {int} limit max number of tokens to be returned
+ *
+ * @return {String[]} an array of tokens from the split string
+ */
+ p.__split = function(subject, regex, limit) {
+ if (typeof subject !== "string") {
+ return subject.split.apply(subject, removeFirstArgument(arguments));
+ }
+
+ var pattern = new RegExp(regex);
+
+ // If limit is not specified, use JavaScript's built-in String.split.
+ if ((limit === undef) || (limit < 1)) {
+ return subject.split(pattern);
+ }
+
+ // If limit is specified, JavaScript's built-in String.split has a
+ // different behaviour than Java's. A Java-compatible implementation is
+ // provided here.
+ var result = [], currSubject = subject, pos;
+ while (((pos = currSubject.search(pattern)) !== -1) && (result.length < (limit - 1))) {
+ var match = pattern.exec(currSubject).toString();
+ result.push(currSubject.substring(0, pos));
+ currSubject = currSubject.substring(pos + match.length);
+ }
+ if ((pos !== -1) || (currSubject !== "")) {
+ result.push(currSubject);
+ }
+ return result;
+ };
+
+ /**
+ * The codePointAt() function returns the unicode value of the character at a given index of a string.
+ *
+ * @param {int} idx the index of the character
+ *
+ * @return {String} code the String containing the unicode value of the character
+ */
+ p.__codePointAt = function(subject, idx) {
+ var code = subject.charCodeAt(idx),
+ hi,
+ low;
+ if (0xD800 <= code && code <= 0xDBFF) {
+ hi = code;
+ low = subject.charCodeAt(idx + 1);
+ return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
+ }
+ return code;
+ };
+
+ /**
+ * The matches() function checks whether or not a string matches a given regular expression.
+ *
+ * @param {String} str the String on which the match is tested
+ * @param {String} regexp the regexp for which a match is tested
+ *
+ * @return {boolean} true if the string fits the regexp, false otherwise
+ */
+ p.__matches = function(str, regexp) {
+ return (new RegExp(regexp)).test(str);
+ };
+
+ /**
+ * The startsWith() function tests if a string starts with the specified prefix. If the prefix
+ * is the empty String or equal to the subject String, startsWith() will also return true.
+ *
+ * @param {String} prefix the String used to compare against the start of the subject String.
+ * @param {int} toffset (optional) an offset into the subject String where searching should begin.
+ *
+ * @return {boolean} true if the subject String starts with the prefix.
+ */
+ p.__startsWith = function(subject, prefix, toffset) {
+ if (typeof subject !== "string") {
+ return subject.startsWith.apply(subject, removeFirstArgument(arguments));
+ }
+
+ toffset = toffset || 0;
+ if (toffset < 0 || toffset > subject.length) {
+ return false;
+ }
+ return (prefix === '' || prefix === subject) ? true : (subject.indexOf(prefix) === toffset);
+ };
+
+ /**
+ * The endsWith() function tests if a string ends with the specified suffix. If the suffix
+ * is the empty String, endsWith() will also return true.
+ *
+ * @param {String} suffix the String used to compare against the end of the subject String.
+ *
+ * @return {boolean} true if the subject String starts with the prefix.
+ */
+ p.__endsWith = function(subject, suffix) {
+ if (typeof subject !== "string") {
+ return subject.endsWith.apply(subject, removeFirstArgument(arguments));
+ }
+
+ var suffixLen = suffix ? suffix.length : 0;
+ return (suffix === '' || suffix === subject) ? true :
+ (subject.indexOf(suffix) === subject.length - suffixLen);
+ };
+
+ /**
+ * The returns hash code of the.
+ *
+ * @param {Object} subject The string
+ *
+ * @return {int} a hash code
+ */
+ p.__hashCode = function(subject) {
+ if (subject.hashCode instanceof Function) {
+ return subject.hashCode.apply(subject, removeFirstArgument(arguments));
+ }
+ return virtHashCode(subject);
+ };
+
+ /**
+ * The __printStackTrace() prints stack trace to the console.
+ *
+ * @param {Exception} subject The error
+ */
+ p.__printStackTrace = function(subject) {
+ p.println("Exception: " + subject.toString() );
+ };
+ };
+
+};
+
+},{}],23:[function(require,module,exports){
+/**
+ * For many "math" functions, we can delegate
+ * to the Math object. For others, we can't.
+ */
+module.exports = function withMath(p, undef) {
+ var internalRandomGenerator = function() { return Math.random(); };
+
+ /**
+ * Calculates the absolute value (magnitude) of a number. The absolute value of a number is always positive.
+ *
+ * @param {int|float} value int or float
+ *
+ * @returns {int|float}
+ */
+ p.abs = Math.abs;
+
+ /**
+ * Calculates the closest int value that is greater than or equal to the value of the parameter.
+ * For example, ceil(9.03) returns the value 10.
+ *
+ * @param {float} value float
+ *
+ * @returns {int}
+ *
+ * @see floor
+ * @see round
+ */
+ p.ceil = Math.ceil;
+
+ /**
+ * Returns Euler's number e (2.71828...) raised to the power of the value parameter.
+ *
+ * @param {int|float} value int or float: the exponent to raise e to
+ *
+ * @returns {float}
+ */
+ p.exp = Math.exp;
+
+ /**
+ * Calculates the closest int value that is less than or equal to the value of the parameter.
+ *
+ * @param {int|float} value the value to floor
+ *
+ * @returns {int|float}
+ *
+ * @see ceil
+ * @see round
+ */
+ p.floor = Math.floor;
+
+ /**
+ * Calculates the natural logarithm (the base-e logarithm) of a number. This function
+ * expects the values greater than 0.0.
+ *
+ * @param {int|float} value int or float: number must be greater then 0.0
+ *
+ * @returns {float}
+ */
+ p.log = Math.log;
+
+ /**
+ * Facilitates exponential expressions. The pow() function is an efficient way of
+ * multiplying numbers by themselves (or their reciprocal) in large quantities.
+ * For example, pow(3, 5) is equivalent to the expression 3*3*3*3*3 and pow(3, -5)
+ * is equivalent to 1 / 3*3*3*3*3.
+ *
+ * @param {int|float} num base of the exponential expression
+ * @param {int|float} exponent power of which to raise the base
+ *
+ * @returns {float}
+ *
+ * @see sqrt
+ */
+ p.pow = Math.pow;
+
+ /**
+ * Calculates the integer closest to the value parameter. For example, round(9.2) returns the value 9.
+ *
+ * @param {float} value number to round
+ *
+ * @returns {int}
+ *
+ * @see floor
+ * @see ceil
+ */
+ p.round = Math.round;
+ /**
+ * Calculates the square root of a number. The square root of a number is always positive,
+ * even though there may be a valid negative root. The square root s of number a is such
+ * that s*s = a. It is the opposite of squaring.
+ *
+ * @param {float} value int or float, non negative
+ *
+ * @returns {float}
+ *
+ * @see pow
+ * @see sq
+ */
+
+ p.sqrt = Math.sqrt;
+
+ // Trigonometry
+ /**
+ * The inverse of cos(), returns the arc cosine of a value. This function expects the
+ * values in the range of -1 to 1 and values are returned in the range 0 to PI (3.1415927).
+ *
+ * @param {float} value the value whose arc cosine is to be returned
+ *
+ * @returns {float}
+ *
+ * @see cos
+ * @see asin
+ * @see atan
+ */
+ p.acos = Math.acos;
+
+ /**
+ * The inverse of sin(), returns the arc sine of a value. This function expects the values
+ * in the range of -1 to 1 and values are returned in the range -PI/2 to PI/2.
+ *
+ * @param {float} value the value whose arc sine is to be returned
+ *
+ * @returns {float}
+ *
+ * @see sin
+ * @see acos
+ * @see atan
+ */
+ p.asin = Math.asin;
+
+ /**
+ * The inverse of tan(), returns the arc tangent of a value. This function expects the values
+ * in the range of -Infinity to Infinity (exclusive) and values are returned in the range -PI/2 to PI/2 .
+ *
+ * @param {float} value -Infinity to Infinity (exclusive)
+ *
+ * @returns {float}
+ *
+ * @see tan
+ * @see asin
+ * @see acos
+ */
+ p.atan = Math.atan;
+
+ /**
+ * Calculates the angle (in radians) from a specified point to the coordinate origin as measured from
+ * the positive x-axis. Values are returned as a float in the range from PI to -PI. The atan2() function
+ * is most often used for orienting geometry to the position of the cursor. Note: The y-coordinate of the
+ * point is the first parameter and the x-coordinate is the second due the the structure of calculating the tangent.
+ *
+ * @param {float} y y-coordinate of the point
+ * @param {float} x x-coordinate of the point
+ *
+ * @returns {float}
+ *
+ * @see tan
+ */
+ p.atan2 = Math.atan2;
+
+ /**
+ * Calculates the cosine of an angle. This function expects the values of the angle parameter to be provided
+ * in radians (values from 0 to PI*2). Values are returned in the range -1 to 1.
+ *
+ * @param {float} value an angle in radians
+ *
+ * @returns {float}
+ *
+ * @see tan
+ * @see sin
+ */
+ p.cos = Math.cos;
+
+ /**
+ * Calculates the sine of an angle. This function expects the values of the angle parameter to be provided in
+ * radians (values from 0 to 6.28). Values are returned in the range -1 to 1.
+ *
+ * @param {float} value an angle in radians
+ *
+ * @returns {float}
+ *
+ * @see cos
+ * @see radians
+ */
+ p.sin = Math.sin;
+
+ /**
+ * Calculates the ratio of the sine and cosine of an angle. This function expects the values of the angle
+ * parameter to be provided in radians (values from 0 to PI*2). Values are returned in the range infinity to -infinity.
+ *
+ * @param {float} value an angle in radians
+ *
+ * @returns {float}
+ *
+ * @see cos
+ * @see sin
+ * @see radians
+ */
+ p.tan = Math.tan;
+
+ /**
+ * Constrains a value to not exceed a maximum and minimum value.
+ *
+ * @param {int|float} value the value to constrain
+ * @param {int|float} value minimum limit
+ * @param {int|float} value maximum limit
+ *
+ * @returns {int|float}
+ *
+ * @see max
+ * @see min
+ */
+ p.constrain = function(aNumber, aMin, aMax) {
+ return aNumber > aMax ? aMax : aNumber < aMin ? aMin : aNumber;
+ };
+
+ /**
+ * Calculates the distance between two points.
+ *
+ * @param {int|float} x1 int or float: x-coordinate of the first point
+ * @param {int|float} y1 int or float: y-coordinate of the first point
+ * @param {int|float} z1 int or float: z-coordinate of the first point
+ * @param {int|float} x2 int or float: x-coordinate of the second point
+ * @param {int|float} y2 int or float: y-coordinate of the second point
+ * @param {int|float} z2 int or float: z-coordinate of the second point
+ *
+ * @returns {float}
+ */
+ p.dist = function() {
+ var dx, dy, dz;
+ if (arguments.length === 4) {
+ dx = arguments[0] - arguments[2];
+ dy = arguments[1] - arguments[3];
+ return Math.sqrt(dx * dx + dy * dy);
+ }
+ if (arguments.length === 6) {
+ dx = arguments[0] - arguments[3];
+ dy = arguments[1] - arguments[4];
+ dz = arguments[2] - arguments[5];
+ return Math.sqrt(dx * dx + dy * dy + dz * dz);
+ }
+ };
+
+ /**
+ * Calculates a number between two numbers at a specific increment. The amt parameter is the
+ * amount to interpolate between the two values where 0.0 equal to the first point, 0.1 is very
+ * near the first point, 0.5 is half-way in between, etc. The lerp function is convenient for
+ * creating motion along a straight path and for drawing dotted lines.
+ *
+ * @param {int|float} value1 float or int: first value
+ * @param {int|float} value2 float or int: second value
+ * @param {int|float} amt float: between 0.0 and 1.0
+ *
+ * @returns {float}
+ *
+ * @see curvePoint
+ * @see bezierPoint
+ */
+ p.lerp = function(value1, value2, amt) {
+ return ((value2 - value1) * amt) + value1;
+ };
+
+ /**
+ * Calculates the magnitude (or length) of a vector. A vector is a direction in space commonly
+ * used in computer graphics and linear algebra. Because it has no "start" position, the magnitude
+ * of a vector can be thought of as the distance from coordinate (0,0) to its (x,y) value.
+ * Therefore, mag() is a shortcut for writing "dist(0, 0, x, y)".
+ *
+ * @param {int|float} a float or int: first value
+ * @param {int|float} b float or int: second value
+ * @param {int|float} c float or int: third value
+ *
+ * @returns {float}
+ *
+ * @see dist
+ */
+ p.mag = function(a, b, c) {
+ if (c) {
+ return Math.sqrt(a * a + b * b + c * c);
+ }
+
+ return Math.sqrt(a * a + b * b);
+ };
+
+ /**
+ * Re-maps a number from one range to another. In the example above, the number '25' is converted from
+ * a value in the range 0..100 into a value that ranges from the left edge (0) to the right edge (width) of the screen.
+ * Numbers outside the range are not clamped to 0 and 1, because out-of-range values are often intentional and useful.
+ *
+ * @param {float} value The incoming value to be converted
+ * @param {float} istart Lower bound of the value's current range
+ * @param {float} istop Upper bound of the value's current range
+ * @param {float} ostart Lower bound of the value's target range
+ * @param {float} ostop Upper bound of the value's target range
+ *
+ * @returns {float}
+ *
+ * @see norm
+ * @see lerp
+ */
+ p.map = function(value, istart, istop, ostart, ostop) {
+ return ostart + (ostop - ostart) * ((value - istart) / (istop - istart));
+ };
+
+ /**
+ * Determines the largest value in a sequence of numbers.
+ *
+ * @param {int|float} value1 int or float
+ * @param {int|float} value2 int or float
+ * @param {int|float} value3 int or float
+ * @param {int|float} array int or float array
+ *
+ * @returns {int|float}
+ *
+ * @see min
+ */
+ p.max = function() {
+ if (arguments.length === 2) {
+ return arguments[0] < arguments[1] ? arguments[1] : arguments[0];
+ }
+ var numbers = arguments.length === 1 ? arguments[0] : arguments; // if single argument, array is used
+ if (! ("length" in numbers && numbers.length > 0)) {
+ throw "Non-empty array is expected";
+ }
+ var max = numbers[0],
+ count = numbers.length;
+ for (var i = 1; i < count; ++i) {
+ if (max < numbers[i]) {
+ max = numbers[i];
+ }
+ }
+ return max;
+ };
+
+ /**
+ * Determines the smallest value in a sequence of numbers.
+ *
+ * @param {int|float} value1 int or float
+ * @param {int|float} value2 int or float
+ * @param {int|float} value3 int or float
+ * @param {int|float} array int or float array
+ *
+ * @returns {int|float}
+ *
+ * @see max
+ */
+ p.min = function() {
+ if (arguments.length === 2) {
+ return arguments[0] < arguments[1] ? arguments[0] : arguments[1];
+ }
+ var numbers = arguments.length === 1 ? arguments[0] : arguments; // if single argument, array is used
+ if (! ("length" in numbers && numbers.length > 0)) {
+ throw "Non-empty array is expected";
+ }
+ var min = numbers[0],
+ count = numbers.length;
+ for (var i = 1; i < count; ++i) {
+ if (min > numbers[i]) {
+ min = numbers[i];
+ }
+ }
+ return min;
+ };
+
+ /**
+ * Normalizes a number from another range into a value between 0 and 1.
+ * Identical to map(value, low, high, 0, 1);
+ * Numbers outside the range are not clamped to 0 and 1, because out-of-range
+ * values are often intentional and useful.
+ *
+ * @param {float} aNumber The incoming value to be converted
+ * @param {float} low Lower bound of the value's current range
+ * @param {float} high Upper bound of the value's current range
+ *
+ * @returns {float}
+ *
+ * @see map
+ * @see lerp
+ */
+ p.norm = function(aNumber, low, high) {
+ return (aNumber - low) / (high - low);
+ };
+
+ /**
+ * Squares a number (multiplies a number by itself). The result is always a positive number,
+ * as multiplying two negative numbers always yields a positive result. For example, -1 * -1 = 1.
+ *
+ * @param {float} value int or float
+ *
+ * @returns {float}
+ *
+ * @see sqrt
+ */
+ p.sq = function(aNumber) {
+ return aNumber * aNumber;
+ };
+
+ /**
+ * Converts a radian measurement to its corresponding value in degrees. Radians and degrees are two ways of
+ * measuring the same thing. There are 360 degrees in a circle and 2*PI radians in a circle. For example,
+ * 90 degrees = PI/2 = 1.5707964. All trigonometric methods in Processing require their parameters to be specified in radians.
+ *
+ * @param {int|float} value an angle in radians
+ *
+ * @returns {float}
+ *
+ * @see radians
+ */
+ p.degrees = function(aAngle) {
+ return (aAngle * 180) / Math.PI;
+ };
+
+ /**
+ * Generates random numbers. Each time the random() function is called, it returns an unexpected value within
+ * the specified range. If one parameter is passed to the function it will return a float between zero and the
+ * value of the high parameter. The function call random(5) returns values between 0 and 5 (starting at zero,
+ * up to but not including 5). If two parameters are passed, it will return a float with a value between the
+ * parameters. The function call random(-5, 10.2) returns values starting at -5 up to (but not including) 10.2.
+ * To convert a floating-point random number to an integer, use the int() function.
+ *
+ * @param {int|float} value1 if one parameter is used, the top end to random from, if two params the low end
+ * @param {int|float} value2 the top end of the random range
+ *
+ * @returns {float}
+ *
+ * @see randomSeed
+ * @see noise
+ */
+ p.random = function(aMin, aMax) {
+ if (arguments.length === 0) {
+ aMax = 1;
+ aMin = 0;
+ } else if (arguments.length === 1) {
+ aMax = aMin;
+ aMin = 0;
+ }
+ if (aMin === aMax) {
+ return aMin;
+ }
+ for (var i = 0; i < 100; i++) {
+ var ir = internalRandomGenerator();
+ var result = ir * (aMax - aMin) + aMin;
+ if (result !== aMax) {
+ return result;
+ }
+ // assertion: ir is never less than 0.5
+ }
+ return aMin;
+ };
+
+ // Pseudo-random generator
+ function Marsaglia(i1, i2) {
+ // from http://www.math.uni-bielefeld.de/~sillke/ALGORITHMS/random/marsaglia-c
+ var z=i1 || 362436069, w= i2 || 521288629;
+ var intGenerator = function() {
+ z=(36969*(z&65535)+(z>>>16)) & 0xFFFFFFFF;
+ w=(18000*(w&65535)+(w>>>16)) & 0xFFFFFFFF;
+ return (((z&0xFFFF)<<16) | (w&0xFFFF)) & 0xFFFFFFFF;
+ };
+
+ this.doubleGenerator = function() {
+ var i = intGenerator() / 4294967296;
+ return i < 0 ? 1 + i : i;
+ };
+ this.intGenerator = intGenerator;
+ }
+
+ Marsaglia.createRandomized = function() {
+ var now = new Date();
+ return new Marsaglia((now / 60000) & 0xFFFFFFFF, now & 0xFFFFFFFF);
+ };
+
+ /**
+ * Sets the seed value for random(). By default, random() produces different results each time the
+ * program is run. Set the value parameter to a constant to return the same pseudo-random numbers
+ * each time the software is run.
+ *
+ * @param {int|float} seed int
+ *
+ * @see random
+ * @see noise
+ * @see noiseSeed
+ */
+ p.randomSeed = function(seed) {
+ internalRandomGenerator = (new Marsaglia(seed, (seed<<16)+(seed>>16))).doubleGenerator;
+ this.haveNextNextGaussian = false;
+ };
+
+ /**
+ * Returns a float from a random series of numbers having a mean of 0 and standard deviation of 1. Each time
+ * the randomGaussian() function is called, it returns a number fitting a Gaussian, or normal, distribution.
+ * There is theoretically no minimum or maximum value that randomGaussian() might return. Rather, there is just a
+ * very low probability that values far from the mean will be returned; and a higher probability that numbers
+ * near the mean will be returned.
+ *
+ * @returns {float}
+ *
+ * @see random
+ * @see noise
+ */
+ p.randomGaussian = function() {
+ if (this.haveNextNextGaussian) {
+ this.haveNextNextGaussian = false;
+ return this.nextNextGaussian;
+ }
+ var v1, v2, s;
+ do {
+ v1 = 2 * internalRandomGenerator() - 1; // between -1.0 and 1.0
+ v2 = 2 * internalRandomGenerator() - 1; // between -1.0 and 1.0
+ s = v1 * v1 + v2 * v2;
+ }
+ while (s >= 1 || s === 0);
+
+ var multiplier = Math.sqrt(-2 * Math.log(s) / s);
+ this.nextNextGaussian = v2 * multiplier;
+ this.haveNextNextGaussian = true;
+
+ return v1 * multiplier;
+ };
+
+ // Noise functions and helpers
+ function PerlinNoise(seed) {
+ var rnd = seed !== undef ? new Marsaglia(seed, (seed<<16)+(seed>>16)) : Marsaglia.createRandomized();
+ var i, j;
+ // http://www.noisemachine.com/talk1/17b.html
+ // http://mrl.nyu.edu/~perlin/noise/
+ // generate permutation
+ var perm = new Uint8Array(512);
+ for(i=0;i<256;++i) { perm[i] = i; }
+ for(i=0;i<256;++i) {
+ // NOTE: we can only do this because we've made sure the Marsaglia generator
+ // gives us numbers where the last byte in a pseudo-random number is
+ // still pseudo-random. If no 2nd argument is passed in the constructor,
+ // that is no longer the case and this pair swap will always run identically.
+ var t = perm[j = rnd.intGenerator() & 0xFF];
+ perm[j] = perm[i];
+ perm[i] = t;
+ }
+ // copy to avoid taking mod in perm[0];
+ for(i=0;i<256;++i) { perm[i + 256] = perm[i]; }
+
+ function grad3d(i,x,y,z) {
+ var h = i & 15; // convert into 12 gradient directions
+ var u = h<8 ? x : y,
+ v = h<4 ? y : h===12||h===14 ? x : z;
+ return ((h&1) === 0 ? u : -u) + ((h&2) === 0 ? v : -v);
+ }
+
+ function grad2d(i,x,y) {
+ var v = (i & 1) === 0 ? x : y;
+ return (i&2) === 0 ? -v : v;
+ }
+
+ function grad1d(i,x) {
+ return (i&1) === 0 ? -x : x;
+ }
+
+ function lerp(t,a,b) { return a + t * (b - a); }
+
+ this.noise3d = function(x, y, z) {
+ var X = Math.floor(x)&255, Y = Math.floor(y)&255, Z = Math.floor(z)&255;
+ x -= Math.floor(x); y -= Math.floor(y); z -= Math.floor(z);
+ var fx = (3-2*x)*x*x, fy = (3-2*y)*y*y, fz = (3-2*z)*z*z;
+ var p0 = perm[X]+Y, p00 = perm[p0] + Z, p01 = perm[p0 + 1] + Z,
+ p1 = perm[X + 1] + Y, p10 = perm[p1] + Z, p11 = perm[p1 + 1] + Z;
+ return lerp(fz,
+ lerp(fy, lerp(fx, grad3d(perm[p00], x, y, z), grad3d(perm[p10], x-1, y, z)),
+ lerp(fx, grad3d(perm[p01], x, y-1, z), grad3d(perm[p11], x-1, y-1,z))),
+ lerp(fy, lerp(fx, grad3d(perm[p00 + 1], x, y, z-1), grad3d(perm[p10 + 1], x-1, y, z-1)),
+ lerp(fx, grad3d(perm[p01 + 1], x, y-1, z-1), grad3d(perm[p11 + 1], x-1, y-1,z-1))));
+ };
+
+ this.noise2d = function(x, y) {
+ var X = Math.floor(x)&255, Y = Math.floor(y)&255;
+ x -= Math.floor(x); y -= Math.floor(y);
+ var fx = (3-2*x)*x*x, fy = (3-2*y)*y*y;
+ var p0 = perm[X]+Y, p1 = perm[X + 1] + Y;
+ return lerp(fy,
+ lerp(fx, grad2d(perm[p0], x, y), grad2d(perm[p1], x-1, y)),
+ lerp(fx, grad2d(perm[p0 + 1], x, y-1), grad2d(perm[p1 + 1], x-1, y-1)));
+ };
+
+ this.noise1d = function(x) {
+ var X = Math.floor(x)&255;
+ x -= Math.floor(x);
+ var fx = (3-2*x)*x*x;
+ return lerp(fx, grad1d(perm[X], x), grad1d(perm[X+1], x-1));
+ };
+ }
+
+ // processing defaults
+ var noiseProfile = { generator: undef, octaves: 4, fallout: 0.5, seed: undef};
+
+ /**
+ * Returns the Perlin noise value at specified coordinates. Perlin noise is a random sequence
+ * generator producing a more natural ordered, harmonic succession of numbers compared to the
+ * standard random() function. It was invented by Ken Perlin in the 1980s and been used since
+ * in graphical applications to produce procedural textures, natural motion, shapes, terrains etc.
+ * The main difference to the random() function is that Perlin noise is defined in an infinite
+ * n-dimensional space where each pair of coordinates corresponds to a fixed semi-random value
+ * (fixed only for the lifespan of the program). The resulting value will always be between 0.0
+ * and 1.0. Processing can compute 1D, 2D and 3D noise, depending on the number of coordinates
+ * given. The noise value can be animated by moving through the noise space as demonstrated in
+ * the example above. The 2nd and 3rd dimension can also be interpreted as time.
+ * The actual noise is structured similar to an audio signal, in respect to the function's use
+ * of frequencies. Similar to the concept of harmonics in physics, perlin noise is computed over
+ * several octaves which are added together for the final result.
+ * Another way to adjust the character of the resulting sequence is the scale of the input
+ * coordinates. As the function works within an infinite space the value of the coordinates
+ * doesn't matter as such, only the distance between successive coordinates does (eg. when using
+ * noise() within a loop). As a general rule the smaller the difference between coordinates, the
+ * smoother the resulting noise sequence will be. Steps of 0.005-0.03 work best for most applications,
+ * but this will differ depending on use.
+ *
+ * @param {float} x x coordinate in noise space
+ * @param {float} y y coordinate in noise space
+ * @param {float} z z coordinate in noise space
+ *
+ * @returns {float}
+ *
+ * @see random
+ * @see noiseDetail
+ */
+ p.noise = function(x, y, z) {
+ if(noiseProfile.generator === undef) {
+ // caching
+ noiseProfile.generator = new PerlinNoise(noiseProfile.seed);
+ }
+ var generator = noiseProfile.generator;
+ var effect = 1, k = 1, sum = 0;
+ for(var i=0; i<noiseProfile.octaves; ++i) {
+ effect *= noiseProfile.fallout;
+ switch (arguments.length) {
+ case 1:
+ sum += effect * (1 + generator.noise1d(k*x))/2; break;
+ case 2:
+ sum += effect * (1 + generator.noise2d(k*x, k*y))/2; break;
+ case 3:
+ sum += effect * (1 + generator.noise3d(k*x, k*y, k*z))/2; break;
+ }
+ k *= 2;
+ }
+ return sum;
+ };
+
+ /**
+ * Adjusts the character and level of detail produced by the Perlin noise function.
+ * Similar to harmonics in physics, noise is computed over several octaves. Lower octaves
+ * contribute more to the output signal and as such define the overal intensity of the noise,
+ * whereas higher octaves create finer grained details in the noise sequence. By default,
+ * noise is computed over 4 octaves with each octave contributing exactly half than its
+ * predecessor, starting at 50% strength for the 1st octave. This falloff amount can be
+ * changed by adding an additional function parameter. Eg. a falloff factor of 0.75 means
+ * each octave will now have 75% impact (25% less) of the previous lower octave. Any value
+ * between 0.0 and 1.0 is valid, however note that values greater than 0.5 might result in
+ * greater than 1.0 values returned by noise(). By changing these parameters, the signal
+ * created by the noise() function can be adapted to fit very specific needs and characteristics.
+ *
+ * @param {int} octaves number of octaves to be used by the noise() function
+ * @param {float} falloff falloff factor for each octave
+ *
+ * @see noise
+ */
+ p.noiseDetail = function(octaves, fallout) {
+ noiseProfile.octaves = octaves;
+ if(fallout !== undef) {
+ noiseProfile.fallout = fallout;
+ }
+ };
+
+ /**
+ * Sets the seed value for noise(). By default, noise() produces different results each
+ * time the program is run. Set the value parameter to a constant to return the same
+ * pseudo-random numbers each time the software is run.
+ *
+ * @param {int} seed int
+ *
+ * @returns {float}
+ *
+ * @see random
+ * @see radomSeed
+ * @see noise
+ * @see noiseDetail
+ */
+ p.noiseSeed = function(seed) {
+ noiseProfile.seed = seed;
+ noiseProfile.generator = undef;
+ };
+};
+
+},{}],24:[function(require,module,exports){
+/**
+ * Common functions traditionally on "p" that should be class functions
+ * that get bound to "p" when an instance is actually built, instead.
+ */
+module.exports = (function commonFunctions(undef) {
+
+ var CommonFunctions = {
+ /**
+ * Remove whitespace characters from the beginning and ending
+ * of a String or a String array. Works like String.trim() but includes the
+ * unicode nbsp character as well. If an array is passed in the function will return a new array not effecting the array passed in.
+ *
+ * @param {String} str the string to trim
+ * @param {String[]} str the string array to trim
+ *
+ * @return {String|String[]} retrurns a string or an array will removed whitespaces
+ */
+ trim: function(str) {
+ if (str instanceof Array) {
+ var arr = [];
+ for (var i = 0; i < str.length; i++) {
+ arr.push(str[i].replace(/^\s*/, '').replace(/\s*$/, '').replace(/\r*$/, ''));
+ }
+ return arr;
+ }
+ return str.replace(/^\s*/, '').replace(/\s*$/, '').replace(/\r*$/, '');
+ },
+
+ /**
+ * Converts a degree measurement to its corresponding value in radians. Radians and degrees are two ways of
+ * measuring the same thing. There are 360 degrees in a circle and 2*PI radians in a circle. For example,
+ * 90 degrees = PI/2 = 1.5707964. All trigonometric methods in Processing require their parameters to be specified in radians.
+ *
+ * @param {int|float} value an angle in radians
+ *
+ * @returns {float}
+ *
+ * @see degrees
+ */
+ radians: function(aAngle) {
+ return (aAngle / 180) * Math.PI;
+ },
+
+ /**
+ * Number-to-String formatting function. Prepends "plus" or "minus" depending
+ * on whether the value is positive or negative, respectively, after padding
+ * the value with zeroes on the left and right, the number of zeroes used dictated
+ * by the values 'leftDigits' and 'rightDigits'. 'value' cannot be an array.
+ *
+ * @param {int|float} value the number to format
+ * @param {String} plus the prefix for positive numbers
+ * @param {String} minus the prefix for negative numbers
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ * @param {String} group string delimited for groups, such as the comma in "1,000"
+ *
+ * @returns {String or String[]}
+ *
+ * @see nfCore
+ */
+ nfCoreScalar: function (value, plus, minus, leftDigits, rightDigits, group) {
+ var sign = (value < 0) ? minus : plus;
+ var autoDetectDecimals = rightDigits === 0;
+ var rightDigitsOfDefault = (rightDigits === undef || rightDigits < 0) ? 0 : rightDigits;
+
+ var absValue = Math.abs(value);
+ if (autoDetectDecimals) {
+ rightDigitsOfDefault = 1;
+ absValue *= 10;
+ while (Math.abs(Math.round(absValue) - absValue) > 1e-6 && rightDigitsOfDefault < 7) {
+ ++rightDigitsOfDefault;
+ absValue *= 10;
+ }
+ } else if (rightDigitsOfDefault !== 0) {
+ absValue *= Math.pow(10, rightDigitsOfDefault);
+ }
+
+ // Using Java's default rounding policy HALF_EVEN. This policy is based
+ // on the idea that 0.5 values round to the nearest even number, and
+ // everything else is rounded normally.
+ var number, doubled = absValue * 2;
+ if (Math.floor(absValue) === absValue) {
+ number = absValue;
+ } else if (Math.floor(doubled) === doubled) {
+ var floored = Math.floor(absValue);
+ number = floored + (floored % 2);
+ } else {
+ number = Math.round(absValue);
+ }
+
+ var buffer = "";
+ var totalDigits = leftDigits + rightDigitsOfDefault;
+ while (totalDigits > 0 || number > 0) {
+ totalDigits--;
+ buffer = "" + (number % 10) + buffer;
+ number = Math.floor(number / 10);
+ }
+ if (group !== undef) {
+ var i = buffer.length - 3 - rightDigitsOfDefault;
+ while(i > 0) {
+ buffer = buffer.substring(0,i) + group + buffer.substring(i);
+ i-=3;
+ }
+ }
+ if (rightDigitsOfDefault > 0) {
+ return sign + buffer.substring(0, buffer.length - rightDigitsOfDefault) +
+ "." + buffer.substring(buffer.length - rightDigitsOfDefault, buffer.length);
+ }
+ return sign + buffer;
+ },
+
+ /**
+ * Number-to-String formatting function. Prepends "plus" or "minus" depending
+ * on whether the value is positive or negative, respectively, after padding
+ * the value with zeroes on the left and right, the number of zeroes used dictated
+ * by the values 'leftDigits' and 'rightDigits'. 'value' can be an array;
+ * if the input is an array, each value in it is formatted separately, and
+ * an array with formatted values is returned.
+ *
+ * @param {int|int[]|float|float[]} value the number(s) to format
+ * @param {String} plus the prefix for positive numbers
+ * @param {String} minus the prefix for negative numbers
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ * @param {String} group string delimited for groups, such as the comma in "1,000"
+ *
+ * @returns {String or String[]}
+ *
+ * @see nfCoreScalar
+ */
+ nfCore: function(value, plus, minus, leftDigits, rightDigits, group) {
+ if (value instanceof Array) {
+ var arr = [];
+ for (var i = 0, len = value.length; i < len; i++) {
+ arr.push(CommonFunctions.nfCoreScalar(value[i], plus, minus, leftDigits, rightDigits, group));
+ }
+ return arr;
+ }
+ return CommonFunctions.nfCoreScalar(value, plus, minus, leftDigits, rightDigits, group);
+ },
+
+ /**
+ * Utility function for formatting numbers into strings. There are two versions, one for
+ * formatting floats and one for formatting ints. The values for the digits, left, and
+ * right parameters should always be positive integers.
+ * As shown in the above example, nf() is used to add zeros to the left and/or right
+ * of a number. This is typically for aligning a list of numbers. To remove digits from
+ * a floating-point number, use the int(), ceil(), floor(), or round() functions.
+ *
+ * @param {int|int[]|float|float[]} value the number(s) to format
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ *
+ * @returns {String or String[]}
+ *
+ * @see nfs
+ * @see nfp
+ * @see nfc
+ */
+ nf: function(value, leftDigits, rightDigits) {
+ return CommonFunctions.nfCore(value, "", "-", leftDigits, rightDigits);
+ },
+
+ /**
+ * Utility function for formatting numbers into strings. Similar to nf() but leaves a blank space in front
+ * of positive numbers so they align with negative numbers in spite of the minus symbol. There are two
+ * versions, one for formatting floats and one for formatting ints. The values for the digits, left,
+ * and right parameters should always be positive integers.
+ *
+ * @param {int|int[]|float|float[]} value the number(s) to format
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ *
+ * @returns {String or String[]}
+ *
+ * @see nf
+ * @see nfp
+ * @see nfc
+ */
+ nfs: function(value, leftDigits, rightDigits) {
+ return CommonFunctions.nfCore(value, " ", "-", leftDigits, rightDigits);
+ },
+
+ /**
+ * Utility function for formatting numbers into strings. Similar to nf() but puts a "+" in front of
+ * positive numbers and a "-" in front of negative numbers. There are two versions, one for formatting
+ * floats and one for formatting ints. The values for the digits, left, and right parameters should
+ * always be positive integers.
+ *
+ * @param {int|int[]|float|float[]} value the number(s) to format
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ *
+ * @returns {String or String[]}
+ *
+ * @see nfs
+ * @see nf
+ * @see nfc
+ */
+ nfp: function(value, leftDigits, rightDigits) {
+ return CommonFunctions.nfCore(value, "+", "-", leftDigits, rightDigits);
+ },
+
+ /**
+ * Utility function for formatting numbers into strings and placing appropriate commas to mark
+ * units of 1000. There are two versions, one for formatting ints and one for formatting an array
+ * of ints. The value for the digits parameter should always be a positive integer.
+ *
+ * @param {int|int[]|float|float[]} value the number(s) to format
+ * @param {int} left number of digits to the left of the decimal point
+ * @param {int} right number of digits to the right of the decimal point
+ *
+ * @returns {String or String[]}
+ *
+ * @see nf
+ * @see nfs
+ * @see nfp
+ */
+ nfc: function(value, rightDigits) {
+ return CommonFunctions.nfCore(value, "", "-", 0, rightDigits, ",");
+ },
+
+ // used to bind all common functions to "p"
+ withCommonFunctions: function withCommonFunctions(p) {
+ ["trim", "radians", "nf", "nfs", "nfp", "nfc"].forEach(function(f){
+ p[f] = CommonFunctions[f];
+ });
+ }
+ };
+
+ return CommonFunctions;
+}());
+
+},{}],25:[function(require,module,exports){
+/**
+ * Touch and Mouse event handling
+ */
+module.exports = function withTouch(p, curElement, attachEventHandler, document, PConstants, undef) {
+
+ /**
+ * Determine the location of the (mouse) pointer.
+ */
+ function calculateOffset(curElement, event) {
+ var element = curElement,
+ offsetX = 0,
+ offsetY = 0;
+
+ p.pmouseX = p.mouseX;
+ p.pmouseY = p.mouseY;
+
+ // Find element offset
+ if (element.offsetParent) {
+ do {
+ offsetX += element.offsetLeft;
+ offsetY += element.offsetTop;
+ } while (!!(element = element.offsetParent));
+ }
+
+ // Find Scroll offset
+ element = curElement;
+ do {
+ offsetX -= element.scrollLeft || 0;
+ offsetY -= element.scrollTop || 0;
+ } while (!!(element = element.parentNode));
+
+ // Get padding and border style widths for mouse offsets
+ var stylePaddingLeft, stylePaddingTop, styleBorderLeft, styleBorderTop;
+ if (document.defaultView && document.defaultView.getComputedStyle) {
+ stylePaddingLeft = parseInt(document.defaultView.getComputedStyle(curElement, null).paddingLeft, 10) || 0;
+ stylePaddingTop = parseInt(document.defaultView.getComputedStyle(curElement, null).paddingTop, 10) || 0;
+ styleBorderLeft = parseInt(document.defaultView.getComputedStyle(curElement, null).borderLeftWidth, 10) || 0;
+ styleBorderTop = parseInt(document.defaultView.getComputedStyle(curElement, null).borderTopWidth, 10) || 0;
+ }
+
+ // Add padding and border style widths to offset
+ offsetX += stylePaddingLeft;
+ offsetY += stylePaddingTop;
+
+ offsetX += styleBorderLeft;
+ offsetY += styleBorderTop;
+
+ // Take into account any scrolling done
+ offsetX += window.pageXOffset;
+ offsetY += window.pageYOffset;
+
+ return {'X':offsetX,'Y':offsetY};
+ }
+
+ // simple relative position
+ function updateMousePosition(curElement, event) {
+ var offset = calculateOffset(curElement, event);
+ // Dropping support for IE clientX and clientY, switching to pageX and pageY
+ // so we don't have to calculate scroll offset.
+ // Removed in ticket #184. See rev: 2f106d1c7017fed92d045ba918db47d28e5c16f4
+ p.mouseX = event.pageX - offset.X;
+ p.mouseY = event.pageY - offset.Y;
+ }
+
+ /**
+ * Return a TouchEvent with canvas-specific x/y co-ordinates
+ */
+ function addTouchEventOffset(t) {
+ var offset = calculateOffset(t.changedTouches[0].target, t.changedTouches[0]),
+ i;
+
+ for (i = 0; i < t.touches.length; i++) {
+ var touch = t.touches[i];
+ touch.offsetX = touch.pageX - offset.X;
+ touch.offsetY = touch.pageY - offset.Y;
+ }
+ for (i = 0; i < t.targetTouches.length; i++) {
+ var targetTouch = t.targetTouches[i];
+ targetTouch.offsetX = targetTouch.pageX - offset.X;
+ targetTouch.offsetY = targetTouch.pageY - offset.Y;
+ }
+ for (i = 0; i < t.changedTouches.length; i++) {
+ var changedTouch = t.changedTouches[i];
+ changedTouch.offsetX = changedTouch.pageX - offset.X;
+ changedTouch.offsetY = changedTouch.pageY - offset.Y;
+ }
+
+ return t;
+ }
+
+ /**
+ * Touch event support.
+ */
+ attachEventHandler(curElement, "touchstart", function (t) {
+ // Removes unwanted behaviour of the canvas when touching canvas
+ curElement.setAttribute("style","-webkit-user-select: none");
+ curElement.setAttribute("onclick","void(0)");
+ curElement.setAttribute("style","-webkit-tap-highlight-color:rgba(0,0,0,0)");
+ // Loop though eventHandlers and remove mouse listeners
+ for (var i=0, ehl=eventHandlers.length; i<ehl; i++) {
+ var type = eventHandlers[i].type;
+ // Have this function remove itself from the eventHandlers list too
+ if (type === "mouseout" || type === "mousemove" ||
+ type === "mousedown" || type === "mouseup" ||
+ type === "DOMMouseScroll" || type === "mousewheel" || type === "touchstart") {
+ detachEventHandler(eventHandlers[i]);
+ }
+ }
+
+ // If there are any native touch events defined in the sketch, connect all of them
+ // Otherwise, connect all of the emulated mouse events
+ if (p.touchStart !== undef || p.touchMove !== undef ||
+ p.touchEnd !== undef || p.touchCancel !== undef) {
+ attachEventHandler(curElement, "touchstart", function(t) {
+ if (p.touchStart !== undef) {
+ t = addTouchEventOffset(t);
+ p.touchStart(t);
+ }
+ });
+
+ attachEventHandler(curElement, "touchmove", function(t) {
+ if (p.touchMove !== undef) {
+ t.preventDefault(); // Stop the viewport from scrolling
+ t = addTouchEventOffset(t);
+ p.touchMove(t);
+ }
+ });
+
+ attachEventHandler(curElement, "touchend", function(t) {
+ if (p.touchEnd !== undef) {
+ t = addTouchEventOffset(t);
+ p.touchEnd(t);
+ }
+ });
+
+ attachEventHandler(curElement, "touchcancel", function(t) {
+ if (p.touchCancel !== undef) {
+ t = addTouchEventOffset(t);
+ p.touchCancel(t);
+ }
+ });
+
+ } else {
+ // Emulated touch start/mouse down event
+ attachEventHandler(curElement, "touchstart", function(e) {
+ updateMousePosition(curElement, e.touches[0]);
+
+ p.__mousePressed = true;
+ p.mouseDragging = false;
+ p.mouseButton = PConstants.LEFT;
+
+ if (typeof p.mousePressed === "function") {
+ p.mousePressed();
+ }
+ });
+
+ // Emulated touch move/mouse move event
+ attachEventHandler(curElement, "touchmove", function(e) {
+ e.preventDefault();
+ updateMousePosition(curElement, e.touches[0]);
+
+ if (typeof p.mouseMoved === "function" && !p.__mousePressed) {
+ p.mouseMoved();
+ }
+ if (typeof p.mouseDragged === "function" && p.__mousePressed) {
+ p.mouseDragged();
+ p.mouseDragging = true;
+ }
+ });
+
+ // Emulated touch up/mouse up event
+ attachEventHandler(curElement, "touchend", function(e) {
+ p.__mousePressed = false;
+
+ if (typeof p.mouseClicked === "function" && !p.mouseDragging) {
+ p.mouseClicked();
+ }
+
+ if (typeof p.mouseReleased === "function") {
+ p.mouseReleased();
+ }
+ });
+ }
+
+ // Refire the touch start event we consumed in this function
+ curElement.dispatchEvent(t);
+ });
+
+ /**
+ * Context menu toggles. Most often you will not want the
+ * browser's context menu to show on a right click, but
+ * sometimes, you do, so we add two unofficial functions
+ * that can be used to trigger context menu behaviour.
+ */
+ (function() {
+ var enabled = true,
+ contextMenu = function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ };
+
+ p.disableContextMenu = function() {
+ if (!enabled) {
+ return;
+ }
+ attachEventHandler(curElement, 'contextmenu', contextMenu);
+ enabled = false;
+ };
+
+ p.enableContextMenu = function() {
+ if (enabled) {
+ return;
+ }
+ detachEventHandler({elem: curElement, type: 'contextmenu', fn: contextMenu});
+ enabled = true;
+ };
+ }());
+
+ /**
+ * Mouse moved or dragged
+ */
+ attachEventHandler(curElement, "mousemove", function(e) {
+ updateMousePosition(curElement, e);
+ if (typeof p.mouseMoved === "function" && !p.__mousePressed) {
+ p.mouseMoved();
+ }
+ if (typeof p.mouseDragged === "function" && p.__mousePressed) {
+ p.mouseDragged();
+ p.mouseDragging = true;
+ }
+ });
+
+ /**
+ * Unofficial mouse-out handling
+ */
+ attachEventHandler(curElement, "mouseout", function(e) {
+ if (typeof p.mouseOut === "function") {
+ p.mouseOut();
+ }
+ });
+
+ /**
+ * Mouse over
+ */
+ attachEventHandler(curElement, "mouseover", function(e) {
+ updateMousePosition(curElement, e);
+ if (typeof p.mouseOver === "function") {
+ p.mouseOver();
+ }
+ });
+
+ /**
+ * Disable browser's default handling for click-drag of a canvas.
+ */
+ curElement.onmousedown = function () {
+ // make sure focus happens, but nothing else
+ curElement.focus();
+ return false;
+ };
+
+ /**
+ * Mouse pressed or drag
+ */
+ attachEventHandler(curElement, "mousedown", function(e) {
+ p.__mousePressed = true;
+ p.mouseDragging = false;
+ switch (e.which) {
+ case 1:
+ p.mouseButton = PConstants.LEFT;
+ break;
+ case 2:
+ p.mouseButton = PConstants.CENTER;
+ break;
+ case 3:
+ p.mouseButton = PConstants.RIGHT;
+ break;
+ }
+
+ if (typeof p.mousePressed === "function") {
+ p.mousePressed();
+ }
+ });
+
+ /**
+ * Mouse clicked or released
+ */
+ attachEventHandler(curElement, "mouseup", function(e) {
+ p.__mousePressed = false;
+
+ if (typeof p.mouseClicked === "function" && !p.mouseDragging) {
+ p.mouseClicked();
+ }
+
+ if (typeof p.mouseReleased === "function") {
+ p.mouseReleased();
+ }
+ });
+
+ /**
+ * Unofficial scroll wheel handling.
+ */
+ var mouseWheelHandler = function(e) {
+ // do not handle scroll wheel if initiated outside of the sketch
+ if (e.target !== curElement) return;
+
+ var delta = 0;
+
+ if (e.wheelDelta) {
+ delta = e.wheelDelta / 120;
+ if (window.opera) {
+ delta = -delta;
+ }
+ } else if (e.detail) {
+ delta = -e.detail / 3;
+ }
+
+ p.mouseScroll = delta;
+
+ if (delta && typeof p.mouseScrolled === 'function') {
+ // If this sketch has explicit scroll handling,
+ // prevent scroll from kicking in globally before
+ // calling the scroll handler.
+ e.stopPropagation();
+ e.preventDefault();
+ p.mouseScrolled();
+ }
+ };
+
+ // Support Gecko and non-Gecko scroll events
+ attachEventHandler(document, 'DOMMouseScroll', mouseWheelHandler);
+ attachEventHandler(document, 'mousewheel', mouseWheelHandler);
+
+};
+
+
+},{}],26:[function(require,module,exports){
+/**
+ * The parser for turning Processing syntax into Pjs JavaScript.
+ * This code is not trivial; unless you know what you're doing,
+ * you shouldn't be changing things in here =)
+ */
+module.exports = function setupParser(Processing, options) {
+
+ var defaultScope = options.defaultScope,
+ PConstants = defaultScope.PConstants,
+ aFunctions = options.aFunctions,
+ Browser = options.Browser,
+ document = Browser.document,
+ undef;
+
+ // Processing global methods and constants for the parser
+ function getGlobalMembers() {
+ // The names array contains the names of everything that is inside "p."
+ // When something new is added to "p." it must also be added to this list.
+ var names = [ /* this code is generated by jsglobals.js */
+ "abs", "acos", "alpha", "ambient", "ambientLight", "append", "applyMatrix",
+ "arc", "arrayCopy", "asin", "atan", "atan2", "background", "beginCamera",
+ "beginDraw", "beginShape", "bezier", "bezierDetail", "bezierPoint",
+ "bezierTangent", "bezierVertex", "binary", "blend", "blendColor",
+ "blit_resize", "blue", "box", "breakShape", "brightness",
+ "camera", "ceil", "Character", "color", "colorMode",
+ "concat", "constrain", "copy", "cos", "createFont",
+ "createGraphics", "createImage", "cursor", "curve", "curveDetail",
+ "curvePoint", "curveTangent", "curveTightness", "curveVertex", "day",
+ "degrees", "directionalLight", "disableContextMenu",
+ "dist", "draw", "ellipse", "ellipseMode", "emissive", "enableContextMenu",
+ "endCamera", "endDraw", "endShape", "exit", "exp", "expand", "externals",
+ "fill", "filter", "floor", "focused", "frameCount", "frameRate", "frustum",
+ "get", "glyphLook", "glyphTable", "green", "height", "hex", "hint", "hour",
+ "hue", "image", "imageMode", "intersect", "join", "key",
+ "keyCode", "keyPressed", "keyReleased", "keyTyped", "lerp", "lerpColor",
+ "lightFalloff", "lights", "lightSpecular", "line", "link", "loadBytes",
+ "loadFont", "loadGlyphs", "loadImage", "loadPixels", "loadShape", "loadXML",
+ "loadStrings", "log", "loop", "mag", "map", "match", "matchAll", "max",
+ "millis", "min", "minute", "mix", "modelX", "modelY", "modelZ", "modes",
+ "month", "mouseButton", "mouseClicked", "mouseDragged", "mouseMoved",
+ "mouseOut", "mouseOver", "mousePressed", "mouseReleased", "mouseScroll",
+ "mouseScrolled", "mouseX", "mouseY", "name", "nf", "nfc", "nfp", "nfs",
+ "noCursor", "noFill", "noise", "noiseDetail", "noiseSeed", "noLights",
+ "noLoop", "norm", "normal", "noSmooth", "noStroke", "noTint", "ortho",
+ "param", "parseBoolean", "parseByte", "parseChar", "parseFloat",
+ "parseInt", "parseXML", "peg", "perspective", "PImage", "pixels",
+ "PMatrix2D", "PMatrix3D", "PMatrixStack", "pmouseX", "pmouseY", "point",
+ "pointLight", "popMatrix", "popStyle", "pow", "print", "printCamera",
+ "println", "printMatrix", "printProjection", "PShape", "PShapeSVG",
+ "pushMatrix", "pushStyle", "quad", "radians", "random", "randomGaussian",
+ "randomSeed", "rect", "rectMode", "red", "redraw", "requestImage",
+ "resetMatrix", "reverse", "rotate", "rotateX", "rotateY", "rotateZ",
+ "round", "saturation", "save", "saveFrame", "saveStrings", "scale",
+ "screenX", "screenY", "screenZ", "second", "set", "setup", "shape",
+ "shapeMode", "shared", "shearX", "shearY", "shininess", "shorten", "sin", "size", "smooth",
+ "sort", "specular", "sphere", "sphereDetail", "splice", "split",
+ "splitTokens", "spotLight", "sq", "sqrt", "status", "str", "stroke",
+ "strokeCap", "strokeJoin", "strokeWeight", "subset", "tan", "text",
+ "textAlign", "textAscent", "textDescent", "textFont", "textLeading",
+ "textMode", "textSize", "texture", "textureMode", "textWidth", "tint", "toImageData",
+ "touchCancel", "touchEnd", "touchMove", "touchStart", "translate", "transform",
+ "triangle", "trim", "unbinary", "unhex", "updatePixels", "use3DContext",
+ "vertex", "width", "XMLElement", "XML", "year", "__contains", "__equals",
+ "__equalsIgnoreCase", "__frameRate", "__hashCode", "__int_cast",
+ "__instanceof", "__keyPressed", "__mousePressed", "__printStackTrace",
+ "__replace", "__replaceAll", "__replaceFirst", "__toCharArray", "__split",
+ "__codePointAt", "__startsWith", "__endsWith", "__matches"];
+
+ // custom functions and properties are added here
+ if(aFunctions) {
+ Object.keys(aFunctions).forEach(function(name) {
+ names.push(name);
+ });
+ }
+
+ // custom libraries that were attached to Processing
+ var members = {};
+ var i, l;
+ for (i = 0, l = names.length; i < l ; ++i) {
+ members[names[i]] = null;
+ }
+ for (var lib in Processing.lib) {
+ if (Processing.lib.hasOwnProperty(lib)) {
+ if (Processing.lib[lib].exports) {
+ var exportedNames = Processing.lib[lib].exports;
+ for (i = 0, l = exportedNames.length; i < l; ++i) {
+ members[exportedNames[i]] = null;
+ }
+ }
+ }
+ }
+ return members;
+ }
+
+ /*
+
+ Parser converts Java-like syntax into JavaScript.
+ Creates an Abstract Syntax Tree -- "Light AST" from the Java-like code.
+
+ It is an object tree. The root object is created from the AstRoot class, which contains statements.
+
+ A statement object can be of type: AstForStatement, AstCatchStatement, AstPrefixStatement, AstMethod, AstClass,
+ AstInterface, AstFunction, AstStatementBlock and AstLabel.
+
+ AstPrefixStatement can be a statement of type: if, switch, while, with, do, else, finally, return, throw, try, break, and continue.
+
+ These object's toString function returns the JavaScript code for the statement.
+
+ Any processing calls need "processing." prepended to them.
+
+ Similarly, calls from inside classes need "$this_1.", prepended to them,
+ with 1 being the depth level for inner classes.
+ This includes members passed down from inheritance.
+
+ The resulting code is then eval'd and run.
+
+ */
+
+ function parseProcessing(code) {
+ var globalMembers = getGlobalMembers();
+
+ // masks parentheses, brackets and braces with '"A5"'
+ // where A is the bracket type, and 5 is the index in an array containing all brackets split into atoms
+ // 'while(true){}' -> 'while"B1""A2"'
+ // parentheses() = B, brackets[] = C and braces{} = A
+ function splitToAtoms(code) {
+ var atoms = [];
+ var items = code.split(/([\{\[\(\)\]\}])/);
+ var result = items[0];
+
+ var stack = [];
+ for(var i=1; i < items.length; i += 2) {
+ var item = items[i];
+ if(item === '[' || item === '{' || item === '(') {
+ stack.push(result); result = item;
+ } else if(item === ']' || item === '}' || item === ')') {
+ var kind = item === '}' ? 'A' : item === ')' ? 'B' : 'C';
+ var index = atoms.length; atoms.push(result + item);
+ result = stack.pop() + '"' + kind + (index + 1) + '"';
+ }
+ result += items[i + 1];
+ }
+ atoms.unshift(result);
+ return atoms;
+ }
+
+ // replaces strings and regexs keyed by index with an array of strings
+ function injectStrings(code, strings) {
+ return code.replace(/'(\d+)'/g, function(all, index) {
+ var val = strings[index];
+ if(val.charAt(0) === "/") {
+ return val;
+ }
+ return (/^'((?:[^'\\\n])|(?:\\.[0-9A-Fa-f]*))'$/).test(val) ? "(new $p.Character(" + val + "))" : val;
+ });
+ }
+
+ // trims off leading and trailing spaces
+ // returns an object. object.left, object.middle, object.right, object.untrim
+ function trimSpaces(string) {
+ var m1 = /^\s*/.exec(string), result;
+ if(m1[0].length === string.length) {
+ result = {left: m1[0], middle: "", right: ""};
+ } else {
+ var m2 = /\s*$/.exec(string);
+ result = {left: m1[0], middle: string.substring(m1[0].length, m2.index), right: m2[0]};
+ }
+ result.untrim = function(t) { return this.left + t + this.right; };
+ return result;
+ }
+
+ // simple trim of leading and trailing spaces
+ function trim(string) {
+ return string.replace(/^\s+/,'').replace(/\s+$/,'');
+ }
+
+ function appendToLookupTable(table, array) {
+ for(var i=0,l=array.length;i<l;++i) {
+ table[array[i]] = null;
+ }
+ return table;
+ }
+
+ function isLookupTableEmpty(table) {
+ for(var i in table) {
+ if(table.hasOwnProperty(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function getAtomIndex(templ) { return templ.substring(2, templ.length - 1); }
+
+ // remove carriage returns "\r"
+ var codeWoExtraCr = code.replace(/\r\n?|\n\r/g, "\n");
+
+ // masks strings and regexs with "'5'", where 5 is the index in an array containing all strings and regexs
+ // also removes all comments
+ var strings = [];
+ var codeWoStrings = codeWoExtraCr.replace(/("(?:[^"\\\n]|\\.)*")|('(?:[^'\\\n]|\\.)*')|(([\[\(=|&!\^:?]\s*)(\/(?![*\/])(?:[^\/\\\n]|\\.)*\/[gim]*)\b)|(\/\/[^\n]*\n)|(\/\*(?:(?!\*\/)(?:.|\n))*\*\/)/g,
+ function(all, quoted, aposed, regexCtx, prefix, regex, singleComment, comment) {
+ var index;
+ if(quoted || aposed) { // replace strings
+ index = strings.length; strings.push(all);
+ return "'" + index + "'";
+ }
+ if(regexCtx) { // replace RegExps
+ index = strings.length; strings.push(regex);
+ return prefix + "'" + index + "'";
+ }
+ // kill comments
+ return comment !== "" ? " " : "\n";
+ });
+
+ // protect character codes from namespace collision
+ codeWoStrings = codeWoStrings.replace(/__x([0-9A-F]{4})/g, function(all, hexCode) {
+ // $ = __x0024
+ // _ = __x005F
+ // this protects existing character codes from conversion
+ // __x0024 = __x005F_x0024
+ return "__x005F_x" + hexCode;
+ });
+
+ // convert dollar sign to character code
+ codeWoStrings = codeWoStrings.replace(/\$/g, "__x0024");
+
+ // Remove newlines after return statements
+ codeWoStrings = codeWoStrings.replace(/return\s*[\n\r]+/g, "return ");
+
+ // removes generics
+ var genericsWereRemoved;
+ var codeWoGenerics = codeWoStrings;
+ var replaceFunc = function(all, before, types, after) {
+ if(!!before || !!after) {
+ return all;
+ }
+ genericsWereRemoved = true;
+ return "";
+ };
+
+ do {
+ genericsWereRemoved = false;
+ codeWoGenerics = codeWoGenerics.replace(/([<]?)<\s*((?:\?|[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\[\])*(?:\s+(?:extends|super)\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)?(?:\s*,\s*(?:\?|[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\[\])*(?:\s+(?:extends|super)\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)?)*)\s*>([=]?)/g, replaceFunc);
+ } while (genericsWereRemoved);
+
+ var atoms = splitToAtoms(codeWoGenerics);
+ var replaceContext;
+ var declaredClasses = {}, currentClassId, classIdSeed = 0;
+
+ function addAtom(text, type) {
+ var lastIndex = atoms.length;
+ atoms.push(text);
+ return '"' + type + lastIndex + '"';
+ }
+
+ function generateClassId() {
+ return "class" + (++classIdSeed);
+ }
+
+ function appendClass(class_, classId, scopeId) {
+ class_.classId = classId;
+ class_.scopeId = scopeId;
+ declaredClasses[classId] = class_;
+ }
+
+ // functions defined below
+ var transformClassBody, transformInterfaceBody, transformStatementsBlock, transformStatements, transformMain, transformExpression;
+
+ var classesRegex = /\b((?:(?:public|private|final|protected|static|abstract)\s+)*)(class|interface)\s+([A-Za-z_$][\w$]*\b)(\s+extends\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*\b)*)?(\s+implements\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*\b)*)?\s*("A\d+")/g;
+ var methodsRegex = /\b((?:(?:public|private|final|protected|static|abstract|synchronized)\s+)*)((?!(?:else|new|return|throw|function|public|private|protected)\b)[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*"C\d+")*)\s*([A-Za-z_$][\w$]*\b)\s*("B\d+")(\s*throws\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)*)?\s*("A\d+"|;)/g;
+ var fieldTest = /^((?:(?:public|private|final|protected|static)\s+)*)((?!(?:else|new|return|throw)\b)[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*"C\d+")*)\s*([A-Za-z_$][\w$]*\b)\s*(?:"C\d+"\s*)*([=,]|$)/;
+ var cstrsRegex = /\b((?:(?:public|private|final|protected|static|abstract)\s+)*)((?!(?:new|return|throw)\b)[A-Za-z_$][\w$]*\b)\s*("B\d+")(\s*throws\s+[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*,\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)*)?\s*("A\d+")/g;
+ var attrAndTypeRegex = /^((?:(?:public|private|final|protected|static)\s+)*)((?!(?:new|return|throw)\b)[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*(?:\s*"C\d+")*)\s*/;
+ var functionsRegex = /\bfunction(?:\s+([A-Za-z_$][\w$]*))?\s*("B\d+")\s*("A\d+")/g;
+
+ // This converts classes, methods and functions into atoms, and adds them to the atoms array.
+ // classes = E, methods = D and functions = H
+ function extractClassesAndMethods(code) {
+ var s = code;
+ s = s.replace(classesRegex, function(all) {
+ return addAtom(all, 'E');
+ });
+ s = s.replace(methodsRegex, function(all) {
+ return addAtom(all, 'D');
+ });
+ s = s.replace(functionsRegex, function(all) {
+ return addAtom(all, 'H');
+ });
+ return s;
+ }
+
+ // This converts constructors into atoms, and adds them to the atoms array.
+ // constructors = G
+ function extractConstructors(code, className) {
+ var result = code.replace(cstrsRegex, function(all, attr, name, params, throws_, body) {
+ if(name !== className) {
+ return all;
+ }
+ return addAtom(all, 'G');
+ });
+ return result;
+ }
+
+ // AstParam contains the name of a parameter inside a function declaration
+ function AstParam(name) {
+ this.name = name;
+ }
+ AstParam.prototype.toString = function() {
+ return this.name;
+ };
+ // AstParams contains an array of AstParam objects
+ function AstParams(params, methodArgsParam) {
+ this.params = params;
+ this.methodArgsParam = methodArgsParam;
+ }
+ AstParams.prototype.getNames = function() {
+ var names = [];
+ for(var i=0,l=this.params.length;i<l;++i) {
+ names.push(this.params[i].name);
+ }
+ return names;
+ };
+ AstParams.prototype.prependMethodArgs = function(body) {
+ if (!this.methodArgsParam) {
+ return body;
+ }
+ return "{\nvar " + this.methodArgsParam.name +
+ " = Array.prototype.slice.call(arguments, " +
+ this.params.length + ");\n" + body.substring(1);
+ };
+ AstParams.prototype.toString = function() {
+ if(this.params.length === 0) {
+ return "()";
+ }
+ var result = "(";
+ for(var i=0,l=this.params.length;i<l;++i) {
+ result += this.params[i] + ", ";
+ }
+ return result.substring(0, result.length - 2) + ")";
+ };
+
+ function transformParams(params) {
+ var paramsWoPars = trim(params.substring(1, params.length - 1));
+ var result = [], methodArgsParam = null;
+ if(paramsWoPars !== "") {
+ var paramList = paramsWoPars.split(",");
+ for(var i=0; i < paramList.length; ++i) {
+ var param = /\b([A-Za-z_$][\w$]*\b)(\s*"[ABC][\d]*")*\s*$/.exec(paramList[i]);
+ if (i === paramList.length - 1 && paramList[i].indexOf('...') >= 0) {
+ methodArgsParam = new AstParam(param[1]);
+ break;
+ }
+ result.push(new AstParam(param[1]));
+ }
+ }
+ return new AstParams(result, methodArgsParam);
+ }
+
+ function preExpressionTransform(expr) {
+ var s = expr;
+ // new type[] {...} --> {...}
+ s = s.replace(/\bnew\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\s*"C\d+")+\s*("A\d+")/g, function(all, type, init) {
+ return init;
+ });
+ // new Runnable() {...} --> "F???"
+ s = s.replace(/\bnew\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)(?:\s*"B\d+")\s*("A\d+")/g, function(all, type, init) {
+ return addAtom(all, 'F');
+ });
+ // function(...) { } --> "H???"
+ s = s.replace(functionsRegex, function(all) {
+ return addAtom(all, 'H');
+ });
+ // new type[?] --> createJavaArray('type', [?])
+ s = s.replace(/\bnew\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)\s*("C\d+"(?:\s*"C\d+")*)/g, function(all, type, index) {
+ var args = index.replace(/"C(\d+)"/g, function(all, j) { return atoms[j]; })
+ .replace(/\[\s*\]/g, "[null]").replace(/\s*\]\s*\[\s*/g, ", ");
+ var arrayInitializer = "{" + args.substring(1, args.length - 1) + "}";
+ var createArrayArgs = "('" + type + "', " + addAtom(arrayInitializer, 'A') + ")";
+ return '$p.createJavaArray' + addAtom(createArrayArgs, 'B');
+ });
+ // .length() --> .length
+ s = s.replace(/(\.\s*length)\s*"B\d+"/g, "$1");
+ // #000000 --> 0x000000
+ s = s.replace(/#([0-9A-Fa-f]{6})\b/g, function(all, digits) {
+ return "0xFF" + digits;
+ });
+ // delete (type)???, except (int)???
+ s = s.replace(/"B(\d+)"(\s*(?:[\w$']|"B))/g, function(all, index, next) {
+ var atom = atoms[index];
+ if(!/^\(\s*[A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*\s*(?:"C\d+"\s*)*\)$/.test(atom)) {
+ return all;
+ }
+ if(/^\(\s*int\s*\)$/.test(atom)) {
+ return "(int)" + next;
+ }
+ var indexParts = atom.split(/"C(\d+)"/g);
+ if(indexParts.length > 1) {
+ // even items contains atom numbers, can check only first
+ if(! /^\[\s*\]$/.test(atoms[indexParts[1]])) {
+ return all; // fallback - not a cast
+ }
+ }
+ return "" + next;
+ });
+ // (int)??? -> __int_cast(???)
+ s = s.replace(/\(int\)([^,\]\)\}\?\:\*\+\-\/\^\|\%\&\~<\>\=]+)/g, function(all, arg) {
+ var trimmed = trimSpaces(arg);
+ return trimmed.untrim("__int_cast(" + trimmed.middle + ")");
+ });
+ // super() -> $superCstr(), super. -> $super.;
+ s = s.replace(/\bsuper(\s*"B\d+")/g, "$$superCstr$1").replace(/\bsuper(\s*\.)/g, "$$super$1");
+ // 000.43->0.43 and 0010f->10, but not 0010
+ s = s.replace(/\b0+((\d*)(?:\.[\d*])?(?:[eE][\-\+]?\d+)?[fF]?)\b/, function(all, numberWo0, intPart) {
+ if( numberWo0 === intPart) {
+ return all;
+ }
+ return intPart === "" ? "0" + numberWo0 : numberWo0;
+ });
+ // 3.0f -> 3.0
+ s = s.replace(/\b(\.?\d+\.?)[fF]\b/g, "$1");
+ // Weird (?) parsing errors with %
+ s = s.replace(/([^\s])%([^=\s])/g, "$1 % $2");
+ // Since frameRate() and frameRate are different things,
+ // we need to differentiate them somehow. So when we parse
+ // the Processing.js source, replace frameRate so it isn't
+ // confused with frameRate(), as well as keyPressed and mousePressed
+ s = s.replace(/\b(frameRate|keyPressed|mousePressed)\b(?!\s*"B)/g, "__$1");
+ // "boolean", "byte", "int", etc. => "parseBoolean", "parseByte", "parseInt", etc.
+ s = s.replace(/\b(boolean|byte|char|float|int)\s*"B/g, function(all, name) {
+ return "parse" + name.substring(0, 1).toUpperCase() + name.substring(1) + "\"B";
+ });
+ // "pixels" replacements:
+ // pixels[i] = c => pixels.setPixel(i,c) | pixels[i] => pixels.getPixel(i)
+ // pixels.length => pixels.getLength()
+ // pixels = ar => pixels.set(ar) | pixels => pixels.toArray()
+ s = s.replace(/\bpixels\b\s*(("C(\d+)")|\.length)?(\s*=(?!=)([^,\]\)\}]+))?/g,
+ function(all, indexOrLength, index, atomIndex, equalsPart, rightSide) {
+ if(index) {
+ var atom = atoms[atomIndex];
+ if(equalsPart) {
+ return "pixels.setPixel" + addAtom("(" +atom.substring(1, atom.length - 1) +
+ "," + rightSide + ")", 'B');
+ }
+ return "pixels.getPixel" + addAtom("(" + atom.substring(1, atom.length - 1) +
+ ")", 'B');
+ }
+ if(indexOrLength) {
+ // length
+ return "pixels.getLength" + addAtom("()", 'B');
+ }
+ if(equalsPart) {
+ return "pixels.set" + addAtom("(" + rightSide + ")", 'B');
+ }
+ return "pixels.toArray" + addAtom("()", 'B');
+ });
+ // Java method replacements for: replace, replaceAll, replaceFirst, equals, hashCode, etc.
+ // xxx.replace(yyy) -> __replace(xxx, yyy)
+ // "xx".replace(yyy) -> __replace("xx", yyy)
+ var repeatJavaReplacement;
+ function replacePrototypeMethods(all, subject, method, atomIndex) {
+ var atom = atoms[atomIndex];
+ repeatJavaReplacement = true;
+ var trimmed = trimSpaces(atom.substring(1, atom.length - 1));
+ return "__" + method + ( trimmed.middle === "" ? addAtom("(" + subject.replace(/\.\s*$/, "") + ")", 'B') :
+ addAtom("(" + subject.replace(/\.\s*$/, "") + "," + trimmed.middle + ")", 'B') );
+ }
+ do {
+ repeatJavaReplacement = false;
+ s = s.replace(/((?:'\d+'|\b[A-Za-z_$][\w$]*\s*(?:"[BC]\d+")*)\s*\.\s*(?:[A-Za-z_$][\w$]*\s*(?:"[BC]\d+"\s*)*\.\s*)*)(replace|replaceAll|replaceFirst|contains|equals|equalsIgnoreCase|hashCode|toCharArray|printStackTrace|split|startsWith|endsWith|codePointAt|matches)\s*"B(\d+)"/g,
+ replacePrototypeMethods);
+ } while (repeatJavaReplacement);
+ // xxx instanceof yyy -> __instanceof(xxx, yyy)
+ function replaceInstanceof(all, subject, type) {
+ repeatJavaReplacement = true;
+ return "__instanceof" + addAtom("(" + subject + ", " + type + ")", 'B');
+ }
+ do {
+ repeatJavaReplacement = false;
+ s = s.replace(/((?:'\d+'|\b[A-Za-z_$][\w$]*\s*(?:"[BC]\d+")*)\s*(?:\.\s*[A-Za-z_$][\w$]*\s*(?:"[BC]\d+"\s*)*)*)instanceof\s+([A-Za-z_$][\w$]*\s*(?:\.\s*[A-Za-z_$][\w$]*)*)/g,
+ replaceInstanceof);
+ } while (repeatJavaReplacement);
+ // this() -> $constr()
+ s = s.replace(/\bthis(\s*"B\d+")/g, "$$constr$1");
+
+ return s;
+ }
+
+ function AstInlineClass(baseInterfaceName, body) {
+ this.baseInterfaceName = baseInterfaceName;
+ this.body = body;
+ body.owner = this;
+ }
+ AstInlineClass.prototype.toString = function() {
+ return "new (" + this.body + ")";
+ };
+
+ function transformInlineClass(class_) {
+ var m = new RegExp(/\bnew\s*([A-Za-z_$][\w$]*\s*(?:\.\s*[A-Za-z_$][\w$]*)*)\s*"B\d+"\s*"A(\d+)"/).exec(class_);
+ var oldClassId = currentClassId, newClassId = generateClassId();
+ currentClassId = newClassId;
+ var uniqueClassName = m[1] + "$" + newClassId;
+ var inlineClass = new AstInlineClass(uniqueClassName,
+ transformClassBody(atoms[m[2]], uniqueClassName, "", "implements " + m[1]));
+ appendClass(inlineClass, newClassId, oldClassId);
+ currentClassId = oldClassId;
+ return inlineClass;
+ }
+
+ function AstFunction(name, params, body) {
+ this.name = name;
+ this.params = params;
+ this.body = body;
+ }
+ AstFunction.prototype.toString = function() {
+ var oldContext = replaceContext;
+ // saving "this." and parameters
+ var names = appendToLookupTable({"this":null}, this.params.getNames());
+ replaceContext = function (subject) {
+ return names.hasOwnProperty(subject.name) ? subject.name : oldContext(subject);
+ };
+ var result = "function";
+ if(this.name) {
+ result += " " + this.name;
+ }
+ var body = this.params.prependMethodArgs(this.body.toString());
+ result += this.params + " " + body;
+ replaceContext = oldContext;
+ return result;
+ };
+
+ function transformFunction(class_) {
+ var m = new RegExp(/\b([A-Za-z_$][\w$]*)\s*"B(\d+)"\s*"A(\d+)"/).exec(class_);
+ return new AstFunction( m[1] !== "function" ? m[1] : null,
+ transformParams(atoms[m[2]]), transformStatementsBlock(atoms[m[3]]));
+ }
+
+ function AstInlineObject(members) {
+ this.members = members;
+ }
+ AstInlineObject.prototype.toString = function() {
+ var oldContext = replaceContext;
+ replaceContext = function (subject) {
+ return subject.name === "this" ? "this" : oldContext(subject); // saving "this."
+ };
+ var result = "";
+ for(var i=0,l=this.members.length;i<l;++i) {
+ if(this.members[i].label) {
+ result += this.members[i].label + ": ";
+ }
+ result += this.members[i].value.toString() + ", ";
+ }
+ replaceContext = oldContext;
+ return result.substring(0, result.length - 2);
+ };
+
+ function transformInlineObject(obj) {
+ var members = obj.split(',');
+ for(var i=0; i < members.length; ++i) {
+ var label = members[i].indexOf(':');
+ if(label < 0) {
+ members[i] = { value: transformExpression(members[i]) };
+ } else {
+ members[i] = { label: trim(members[i].substring(0, label)),
+ value: transformExpression( trim(members[i].substring(label + 1)) ) };
+ }
+ }
+ return new AstInlineObject(members);
+ }
+
+ function expandExpression(expr) {
+ if(expr.charAt(0) === '(' || expr.charAt(0) === '[') {
+ return expr.charAt(0) + expandExpression(expr.substring(1, expr.length - 1)) + expr.charAt(expr.length - 1);
+ }
+ if(expr.charAt(0) === '{') {
+ if(/^\{\s*(?:[A-Za-z_$][\w$]*|'\d+')\s*:/.test(expr)) {
+ return "{" + addAtom(expr.substring(1, expr.length - 1), 'I') + "}";
+ }
+ return "[" + expandExpression(expr.substring(1, expr.length - 1)) + "]";
+ }
+ var trimmed = trimSpaces(expr);
+ var result = preExpressionTransform(trimmed.middle);
+ result = result.replace(/"[ABC](\d+)"/g, function(all, index) {
+ return expandExpression(atoms[index]);
+ });
+ return trimmed.untrim(result);
+ }
+
+ function replaceContextInVars(expr) {
+ return expr.replace(/(\.\s*)?((?:\b[A-Za-z_]|\$)[\w$]*)(\s*\.\s*([A-Za-z_$][\w$]*)(\s*\()?)?/g,
+ function(all, memberAccessSign, identifier, suffix, subMember, callSign) {
+ if(memberAccessSign) {
+ return all;
+ }
+ var subject = { name: identifier, member: subMember, callSign: !!callSign };
+ return replaceContext(subject) + (suffix === undef ? "" : suffix);
+ });
+ }
+
+ function AstExpression(expr, transforms) {
+ this.expr = expr;
+ this.transforms = transforms;
+ }
+ AstExpression.prototype.toString = function() {
+ var transforms = this.transforms;
+ var expr = replaceContextInVars(this.expr);
+ return expr.replace(/"!(\d+)"/g, function(all, index) {
+ return transforms[index].toString();
+ });
+ };
+
+ transformExpression = function(expr) {
+ var transforms = [];
+ var s = expandExpression(expr);
+ s = s.replace(/"H(\d+)"/g, function(all, index) {
+ transforms.push(transformFunction(atoms[index]));
+ return '"!' + (transforms.length - 1) + '"';
+ });
+ s = s.replace(/"F(\d+)"/g, function(all, index) {
+ transforms.push(transformInlineClass(atoms[index]));
+ return '"!' + (transforms.length - 1) + '"';
+ });
+ s = s.replace(/"I(\d+)"/g, function(all, index) {
+ transforms.push(transformInlineObject(atoms[index]));
+ return '"!' + (transforms.length - 1) + '"';
+ });
+
+ return new AstExpression(s, transforms);
+ };
+
+ function AstVarDefinition(name, value, isDefault) {
+ this.name = name;
+ this.value = value;
+ this.isDefault = isDefault;
+ }
+ AstVarDefinition.prototype.toString = function() {
+ return this.name + ' = ' + this.value;
+ };
+
+ function transformVarDefinition(def, defaultTypeValue) {
+ var eqIndex = def.indexOf("=");
+ var name, value, isDefault;
+ if(eqIndex < 0) {
+ name = def;
+ value = defaultTypeValue;
+ isDefault = true;
+ } else {
+ name = def.substring(0, eqIndex);
+ value = transformExpression(def.substring(eqIndex + 1));
+ isDefault = false;
+ }
+ return new AstVarDefinition( trim(name.replace(/(\s*"C\d+")+/g, "")),
+ value, isDefault);
+ }
+
+ function getDefaultValueForType(type) {
+ if(type === "int" || type === "float") {
+ return "0";
+ }
+ if(type === "boolean") {
+ return "false";
+ }
+ if(type === "color") {
+ return "0x00000000";
+ }
+ return "null";
+ }
+
+ function AstVar(definitions, varType) {
+ this.definitions = definitions;
+ this.varType = varType;
+ }
+ AstVar.prototype.getNames = function() {
+ var names = [];
+ for(var i=0,l=this.definitions.length;i<l;++i) {
+ names.push(this.definitions[i].name);
+ }
+ return names;
+ };
+ AstVar.prototype.toString = function() {
+ return "var " + this.definitions.join(",");
+ };
+ function AstStatement(expression) {
+ this.expression = expression;
+ }
+ AstStatement.prototype.toString = function() {
+ return this.expression.toString();
+ };
+
+ function transformStatement(statement) {
+ if(fieldTest.test(statement)) {
+ var attrAndType = attrAndTypeRegex.exec(statement);
+ var definitions = statement.substring(attrAndType[0].length).split(",");
+ var defaultTypeValue = getDefaultValueForType(attrAndType[2]);
+ for(var i=0; i < definitions.length; ++i) {
+ definitions[i] = transformVarDefinition(definitions[i], defaultTypeValue);
+ }
+ return new AstVar(definitions, attrAndType[2]);
+ }
+ return new AstStatement(transformExpression(statement));
+ }
+
+ function AstForExpression(initStatement, condition, step) {
+ this.initStatement = initStatement;
+ this.condition = condition;
+ this.step = step;
+ }
+ AstForExpression.prototype.toString = function() {
+ return "(" + this.initStatement + "; " + this.condition + "; " + this.step + ")";
+ };
+
+ function AstForInExpression(initStatement, container) {
+ this.initStatement = initStatement;
+ this.container = container;
+ }
+ AstForInExpression.prototype.toString = function() {
+ var init = this.initStatement.toString();
+ if(init.indexOf("=") >= 0) { // can be without var declaration
+ init = init.substring(0, init.indexOf("="));
+ }
+ return "(" + init + " in " + this.container + ")";
+ };
+
+ function AstForEachExpression(initStatement, container) {
+ this.initStatement = initStatement;
+ this.container = container;
+ }
+ AstForEachExpression.iteratorId = 0;
+ AstForEachExpression.prototype.toString = function() {
+ var init = this.initStatement.toString();
+ var iterator = "$it" + (AstForEachExpression.iteratorId++);
+ var variableName = init.replace(/^\s*var\s*/, "").split("=")[0];
+ var initIteratorAndVariable = "var " + iterator + " = new $p.ObjectIterator(" + this.container + "), " +
+ variableName + " = void(0)";
+ var nextIterationCondition = iterator + ".hasNext() && ((" +
+ variableName + " = " + iterator + ".next()) || true)";
+ return "(" + initIteratorAndVariable + "; " + nextIterationCondition + ";)";
+ };
+
+ function transformForExpression(expr) {
+ var content;
+ if (/\bin\b/.test(expr)) {
+ content = expr.substring(1, expr.length - 1).split(/\bin\b/g);
+ return new AstForInExpression( transformStatement(trim(content[0])),
+ transformExpression(content[1]));
+ }
+ if (expr.indexOf(":") >= 0 && expr.indexOf(";") < 0) {
+ content = expr.substring(1, expr.length - 1).split(":");
+ return new AstForEachExpression( transformStatement(trim(content[0])),
+ transformExpression(content[1]));
+ }
+ content = expr.substring(1, expr.length - 1).split(";");
+ return new AstForExpression( transformStatement(trim(content[0])),
+ transformExpression(content[1]), transformExpression(content[2]));
+ }
+
+ function sortByWeight(array) {
+ array.sort(function (a,b) {
+ return b.weight - a.weight;
+ });
+ }
+
+ function AstInnerInterface(name, body, isStatic) {
+ this.name = name;
+ this.body = body;
+ this.isStatic = isStatic;
+ body.owner = this;
+ }
+ AstInnerInterface.prototype.toString = function() {
+ return "" + this.body;
+ };
+ function AstInnerClass(name, body, isStatic) {
+ this.name = name;
+ this.body = body;
+ this.isStatic = isStatic;
+ body.owner = this;
+ }
+ AstInnerClass.prototype.toString = function() {
+ return "" + this.body;
+ };
+
+ function transformInnerClass(class_) {
+ var m = classesRegex.exec(class_); // 1 - attr, 2 - class|int, 3 - name, 4 - extends, 5 - implements, 6 - body
+ classesRegex.lastIndex = 0;
+ var isStatic = m[1].indexOf("static") >= 0;
+ var body = atoms[getAtomIndex(m[6])], innerClass;
+ var oldClassId = currentClassId, newClassId = generateClassId();
+ currentClassId = newClassId;
+ if(m[2] === "interface") {
+ innerClass = new AstInnerInterface(m[3], transformInterfaceBody(body, m[3], m[4]), isStatic);
+ } else {
+ innerClass = new AstInnerClass(m[3], transformClassBody(body, m[3], m[4], m[5]), isStatic);
+ }
+ appendClass(innerClass, newClassId, oldClassId);
+ currentClassId = oldClassId;
+ return innerClass;
+ }
+
+ function AstClassMethod(name, params, body, isStatic) {
+ this.name = name;
+ this.params = params;
+ this.body = body;
+ this.isStatic = isStatic;
+ }
+ AstClassMethod.prototype.toString = function(){
+ var paramNames = appendToLookupTable({}, this.params.getNames());
+ var oldContext = replaceContext;
+ replaceContext = function (subject) {
+ return paramNames.hasOwnProperty(subject.name) ? subject.name : oldContext(subject);
+ };
+ var body = this.params.prependMethodArgs(this.body.toString());
+ var result = "function " + this.methodId + this.params + " " + body +"\n";
+ replaceContext = oldContext;
+ return result;
+ };
+
+ function transformClassMethod(method) {
+ var m = methodsRegex.exec(method);
+ methodsRegex.lastIndex = 0;
+ var isStatic = m[1].indexOf("static") >= 0;
+ var body = m[6] !== ';' ? atoms[getAtomIndex(m[6])] : "{}";
+ return new AstClassMethod(m[3], transformParams(atoms[getAtomIndex(m[4])]),
+ transformStatementsBlock(body), isStatic );
+ }
+
+ function AstClassField(definitions, fieldType, isStatic) {
+ this.definitions = definitions;
+ this.fieldType = fieldType;
+ this.isStatic = isStatic;
+ }
+ AstClassField.prototype.getNames = function() {
+ var names = [];
+ for(var i=0,l=this.definitions.length;i<l;++i) {
+ names.push(this.definitions[i].name);
+ }
+ return names;
+ };
+ AstClassField.prototype.toString = function() {
+ var thisPrefix = replaceContext({ name: "[this]" });
+ if(this.isStatic) {
+ var className = this.owner.name;
+ var staticDeclarations = [];
+ for(var i=0,l=this.definitions.length;i<l;++i) {
+ var definition = this.definitions[i];
+ var name = definition.name, staticName = className + "." + name;
+ var declaration = "if(" + staticName + " === void(0)) {\n" +
+ " " + staticName + " = " + definition.value + "; }\n" +
+ "$p.defineProperty(" + thisPrefix + ", " +
+ "'" + name + "', { get: function(){return " + staticName + ";}, " +
+ "set: function(val){" + staticName + " = val;} });\n";
+ staticDeclarations.push(declaration);
+ }
+ return staticDeclarations.join("");
+ }
+ return thisPrefix + "." + this.definitions.join("; " + thisPrefix + ".");
+ };
+
+ function transformClassField(statement) {
+ var attrAndType = attrAndTypeRegex.exec(statement);
+ var isStatic = attrAndType[1].indexOf("static") >= 0;
+ var definitions = statement.substring(attrAndType[0].length).split(/,\s*/g);
+ var defaultTypeValue = getDefaultValueForType(attrAndType[2]);
+ for(var i=0; i < definitions.length; ++i) {
+ definitions[i] = transformVarDefinition(definitions[i], defaultTypeValue);
+ }
+ return new AstClassField(definitions, attrAndType[2], isStatic);
+ }
+
+ function AstConstructor(params, body) {
+ this.params = params;
+ this.body = body;
+ }
+ AstConstructor.prototype.toString = function() {
+ var paramNames = appendToLookupTable({}, this.params.getNames());
+ var oldContext = replaceContext;
+ replaceContext = function (subject) {
+ return paramNames.hasOwnProperty(subject.name) ? subject.name : oldContext(subject);
+ };
+ var prefix = "function $constr_" + this.params.params.length + this.params.toString();
+ var body = this.params.prependMethodArgs(this.body.toString());
+ if(!/\$(superCstr|constr)\b/.test(body)) {
+ body = "{\n$superCstr();\n" + body.substring(1);
+ }
+ replaceContext = oldContext;
+ return prefix + body + "\n";
+ };
+
+ function transformConstructor(cstr) {
+ var m = new RegExp(/"B(\d+)"\s*"A(\d+)"/).exec(cstr);
+ var params = transformParams(atoms[m[1]]);
+
+ return new AstConstructor(params, transformStatementsBlock(atoms[m[2]]));
+ }
+
+ function AstInterfaceBody(name, interfacesNames, methodsNames, fields, innerClasses, misc) {
+ var i,l;
+ this.name = name;
+ this.interfacesNames = interfacesNames;
+ this.methodsNames = methodsNames;
+ this.fields = fields;
+ this.innerClasses = innerClasses;
+ this.misc = misc;
+ for(i=0,l=fields.length; i<l; ++i) {
+ fields[i].owner = this;
+ }
+ }
+ AstInterfaceBody.prototype.getMembers = function(classFields, classMethods, classInners) {
+ if(this.owner.base) {
+ this.owner.base.body.getMembers(classFields, classMethods, classInners);
+ }
+ var i, j, l, m;
+ for(i=0,l=this.fields.length;i<l;++i) {
+ var fieldNames = this.fields[i].getNames();
+ for(j=0,m=fieldNames.length;j<m;++j) {
+ classFields[fieldNames[j]] = this.fields[i];
+ }
+ }
+ for(i=0,l=this.methodsNames.length;i<l;++i) {
+ var methodName = this.methodsNames[i];
+ classMethods[methodName] = true;
+ }
+ for(i=0,l=this.innerClasses.length;i<l;++i) {
+ var innerClass = this.innerClasses[i];
+ classInners[innerClass.name] = innerClass;
+ }
+ };
+ AstInterfaceBody.prototype.toString = function() {
+ function getScopeLevel(p) {
+ var i = 0;
+ while(p) {
+ ++i;
+ p=p.scope;
+ }
+ return i;
+ }
+
+ var scopeLevel = getScopeLevel(this.owner);
+
+ var className = this.name;
+ var staticDefinitions = "";
+ var metadata = "";
+
+ var thisClassFields = {}, thisClassMethods = {}, thisClassInners = {};
+ this.getMembers(thisClassFields, thisClassMethods, thisClassInners);
+
+ var i, l, j, m;
+
+ if (this.owner.interfaces) {
+ // interface name can be present, but interface is not
+ var resolvedInterfaces = [], resolvedInterface;
+ for (i = 0, l = this.interfacesNames.length; i < l; ++i) {
+ if (!this.owner.interfaces[i]) {
+ continue;
+ }
+ resolvedInterface = replaceContext({name: this.interfacesNames[i]});
+ resolvedInterfaces.push(resolvedInterface);
+ staticDefinitions += "$p.extendInterfaceMembers(" + className + ", " + resolvedInterface + ");\n";
+ }
+ metadata += className + ".$interfaces = [" + resolvedInterfaces.join(", ") + "];\n";
+ }
+ metadata += className + ".$isInterface = true;\n";
+ metadata += className + ".$methods = [\'" + this.methodsNames.join("\', \'") + "\'];\n";
+
+ sortByWeight(this.innerClasses);
+ for (i = 0, l = this.innerClasses.length; i < l; ++i) {
+ var innerClass = this.innerClasses[i];
+ if (innerClass.isStatic) {
+ staticDefinitions += className + "." + innerClass.name + " = " + innerClass + ";\n";
+ }
+ }
+
+ for (i = 0, l = this.fields.length; i < l; ++i) {
+ var field = this.fields[i];
+ if (field.isStatic) {
+ staticDefinitions += className + "." + field.definitions.join(";\n" + className + ".") + ";\n";
+ }
+ }
+
+ return "(function() {\n" +
+ "function " + className + "() { throw \'Unable to create the interface\'; }\n" +
+ staticDefinitions +
+ metadata +
+ "return " + className + ";\n" +
+ "})()";
+ };
+
+ transformInterfaceBody = function(body, name, baseInterfaces) {
+ var declarations = body.substring(1, body.length - 1);
+ declarations = extractClassesAndMethods(declarations);
+ declarations = extractConstructors(declarations, name);
+ var methodsNames = [], classes = [];
+ declarations = declarations.replace(/"([DE])(\d+)"/g, function(all, type, index) {
+ if(type === 'D') { methodsNames.push(index); }
+ else if(type === 'E') { classes.push(index); }
+ return "";
+ });
+ var fields = declarations.split(/;(?:\s*;)*/g);
+ var baseInterfaceNames;
+ var i, l;
+
+ if(baseInterfaces !== undef) {
+ baseInterfaceNames = baseInterfaces.replace(/^\s*extends\s+(.+?)\s*$/g, "$1").split(/\s*,\s*/g);
+ }
+
+ for(i = 0, l = methodsNames.length; i < l; ++i) {
+ var method = transformClassMethod(atoms[methodsNames[i]]);
+ methodsNames[i] = method.name;
+ }
+ for(i = 0, l = fields.length - 1; i < l; ++i) {
+ var field = trimSpaces(fields[i]);
+ fields[i] = transformClassField(field.middle);
+ }
+ var tail = fields.pop();
+ for(i = 0, l = classes.length; i < l; ++i) {
+ classes[i] = transformInnerClass(atoms[classes[i]]);
+ }
+
+ return new AstInterfaceBody(name, baseInterfaceNames, methodsNames, fields, classes, { tail: tail });
+ };
+
+ function AstClassBody(name, baseClassName, interfacesNames, functions, methods, fields, cstrs, innerClasses, misc) {
+ var i,l;
+ this.name = name;
+ this.baseClassName = baseClassName;
+ this.interfacesNames = interfacesNames;
+ this.functions = functions;
+ this.methods = methods;
+ this.fields = fields;
+ this.cstrs = cstrs;
+ this.innerClasses = innerClasses;
+ this.misc = misc;
+ for(i=0,l=fields.length; i<l; ++i) {
+ fields[i].owner = this;
+ }
+ }
+ AstClassBody.prototype.getMembers = function(classFields, classMethods, classInners) {
+ if(this.owner.base) {
+ this.owner.base.body.getMembers(classFields, classMethods, classInners);
+ }
+ var i, j, l, m;
+ for(i=0,l=this.fields.length;i<l;++i) {
+ var fieldNames = this.fields[i].getNames();
+ for(j=0,m=fieldNames.length;j<m;++j) {
+ classFields[fieldNames[j]] = this.fields[i];
+ }
+ }
+ for(i=0,l=this.methods.length;i<l;++i) {
+ var method = this.methods[i];
+ classMethods[method.name] = method;
+ }
+ for(i=0,l=this.innerClasses.length;i<l;++i) {
+ var innerClass = this.innerClasses[i];
+ classInners[innerClass.name] = innerClass;
+ }
+ };
+ AstClassBody.prototype.toString = function() {
+ function getScopeLevel(p) {
+ var i = 0;
+ while(p) {
+ ++i;
+ p=p.scope;
+ }
+ return i;
+ }
+
+ var scopeLevel = getScopeLevel(this.owner);
+
+ var selfId = "$this_" + scopeLevel;
+ var className = this.name;
+ var result = "var " + selfId + " = this;\n";
+ var staticDefinitions = "";
+ var metadata = "";
+
+ var thisClassFields = {}, thisClassMethods = {}, thisClassInners = {};
+ this.getMembers(thisClassFields, thisClassMethods, thisClassInners);
+
+ var oldContext = replaceContext;
+ replaceContext = function (subject) {
+ var name = subject.name;
+ if(name === "this") {
+ // returns "$this_N.$self" pointer instead of "this" in cases:
+ // "this()", "this.XXX()", "this", but not for "this.XXX"
+ return subject.callSign || !subject.member ? selfId + ".$self" : selfId;
+ }
+ if(thisClassFields.hasOwnProperty(name)) {
+ return thisClassFields[name].isStatic ? className + "." + name : selfId + "." + name;
+ }
+ if(thisClassInners.hasOwnProperty(name)) {
+ return selfId + "." + name;
+ }
+ if(thisClassMethods.hasOwnProperty(name)) {
+ return thisClassMethods[name].isStatic ? className + "." + name : selfId + ".$self." + name;
+ }
+ return oldContext(subject);
+ };
+
+ var resolvedBaseClassName;
+ if (this.baseClassName) {
+ resolvedBaseClassName = oldContext({name: this.baseClassName});
+ result += "var $super = { $upcast: " + selfId + " };\n";
+ result += "function $superCstr(){" + resolvedBaseClassName +
+ ".apply($super,arguments);if(!('$self' in $super)) $p.extendClassChain($super)}\n";
+ metadata += className + ".$base = " + resolvedBaseClassName + ";\n";
+ } else {
+ result += "function $superCstr(){$p.extendClassChain("+ selfId +")}\n";
+ }
+
+ if (this.owner.base) {
+ // base class name can be present, but class is not
+ staticDefinitions += "$p.extendStaticMembers(" + className + ", " + resolvedBaseClassName + ");\n";
+ }
+
+ var i, l, j, m;
+
+ if (this.owner.interfaces) {
+ // interface name can be present, but interface is not
+ var resolvedInterfaces = [], resolvedInterface;
+ for (i = 0, l = this.interfacesNames.length; i < l; ++i) {
+ if (!this.owner.interfaces[i]) {
+ continue;
+ }
+ resolvedInterface = oldContext({name: this.interfacesNames[i]});
+ resolvedInterfaces.push(resolvedInterface);
+ staticDefinitions += "$p.extendInterfaceMembers(" + className + ", " + resolvedInterface + ");\n";
+ }
+ metadata += className + ".$interfaces = [" + resolvedInterfaces.join(", ") + "];\n";
+ }
+
+ if (this.functions.length > 0) {
+ result += this.functions.join('\n') + '\n';
+ }
+
+ sortByWeight(this.innerClasses);
+ for (i = 0, l = this.innerClasses.length; i < l; ++i) {
+ var innerClass = this.innerClasses[i];
+ if (innerClass.isStatic) {
+ staticDefinitions += className + "." + innerClass.name + " = " + innerClass + ";\n";
+ result += selfId + "." + innerClass.name + " = " + className + "." + innerClass.name + ";\n";
+ } else {
+ result += selfId + "." + innerClass.name + " = " + innerClass + ";\n";
+ }
+ }
+
+ for (i = 0, l = this.fields.length; i < l; ++i) {
+ var field = this.fields[i];
+ if (field.isStatic) {
+ staticDefinitions += className + "." + field.definitions.join(";\n" + className + ".") + ";\n";
+ for (j = 0, m = field.definitions.length; j < m; ++j) {
+ var fieldName = field.definitions[j].name, staticName = className + "." + fieldName;
+ result += "$p.defineProperty(" + selfId + ", '" + fieldName + "', {" +
+ "get: function(){return " + staticName + "}, " +
+ "set: function(val){" + staticName + " = val}});\n";
+ }
+ } else {
+ result += selfId + "." + field.definitions.join(";\n" + selfId + ".") + ";\n";
+ }
+ }
+ var methodOverloads = {};
+ for (i = 0, l = this.methods.length; i < l; ++i) {
+ var method = this.methods[i];
+ var overload = methodOverloads[method.name];
+ var methodId = method.name + "$" + method.params.params.length;
+ var hasMethodArgs = !!method.params.methodArgsParam;
+ if (overload) {
+ ++overload;
+ methodId += "_" + overload;
+ } else {
+ overload = 1;
+ }
+ method.methodId = methodId;
+ methodOverloads[method.name] = overload;
+ if (method.isStatic) {
+ staticDefinitions += method;
+ staticDefinitions += "$p.addMethod(" + className + ", '" + method.name + "', " + methodId + ", " + hasMethodArgs + ");\n";
+ result += "$p.addMethod(" + selfId + ", '" + method.name + "', " + methodId + ", " + hasMethodArgs + ");\n";
+ } else {
+ result += method;
+ result += "$p.addMethod(" + selfId + ", '" + method.name + "', " + methodId + ", " + hasMethodArgs + ");\n";
+ }
+ }
+ result += trim(this.misc.tail);
+
+ if (this.cstrs.length > 0) {
+ result += this.cstrs.join('\n') + '\n';
+ }
+
+ result += "function $constr() {\n";
+ var cstrsIfs = [];
+ for (i = 0, l = this.cstrs.length; i < l; ++i) {
+ var paramsLength = this.cstrs[i].params.params.length;
+ var methodArgsPresent = !!this.cstrs[i].params.methodArgsParam;
+ cstrsIfs.push("if(arguments.length " + (methodArgsPresent ? ">=" : "===") +
+ " " + paramsLength + ") { " +
+ "$constr_" + paramsLength + ".apply(" + selfId + ", arguments); }");
+ }
+ if(cstrsIfs.length > 0) {
+ result += cstrsIfs.join(" else ") + " else ";
+ }
+ // ??? add check if length is 0, otherwise fail
+ result += "$superCstr();\n}\n";
+ result += "$constr.apply(null, arguments);\n";
+
+ replaceContext = oldContext;
+ return "(function() {\n" +
+ "function " + className + "() {\n" + result + "}\n" +
+ staticDefinitions +
+ metadata +
+ "return " + className + ";\n" +
+ "})()";
+ };
+
+ transformClassBody = function(body, name, baseName, interfaces) {
+ var declarations = body.substring(1, body.length - 1);
+ declarations = extractClassesAndMethods(declarations);
+ declarations = extractConstructors(declarations, name);
+ var methods = [], classes = [], cstrs = [], functions = [];
+ declarations = declarations.replace(/"([DEGH])(\d+)"/g, function(all, type, index) {
+ if(type === 'D') { methods.push(index); }
+ else if(type === 'E') { classes.push(index); }
+ else if(type === 'H') { functions.push(index); }
+ else { cstrs.push(index); }
+ return "";
+ });
+ var fields = declarations.replace(/^(?:\s*;)+/, "").split(/;(?:\s*;)*/g);
+ var baseClassName, interfacesNames;
+ var i;
+
+ if(baseName !== undef) {
+ baseClassName = baseName.replace(/^\s*extends\s+([A-Za-z_$][\w$]*\b(?:\s*\.\s*[A-Za-z_$][\w$]*\b)*)\s*$/g, "$1");
+ }
+
+ if(interfaces !== undef) {
+ interfacesNames = interfaces.replace(/^\s*implements\s+(.+?)\s*$/g, "$1").split(/\s*,\s*/g);
+ }
+
+ for(i = 0; i < functions.length; ++i) {
+ functions[i] = transformFunction(atoms[functions[i]]);
+ }
+ for(i = 0; i < methods.length; ++i) {
+ methods[i] = transformClassMethod(atoms[methods[i]]);
+ }
+ for(i = 0; i < fields.length - 1; ++i) {
+ var field = trimSpaces(fields[i]);
+ fields[i] = transformClassField(field.middle);
+ }
+ var tail = fields.pop();
+ for(i = 0; i < cstrs.length; ++i) {
+ cstrs[i] = transformConstructor(atoms[cstrs[i]]);
+ }
+ for(i = 0; i < classes.length; ++i) {
+ classes[i] = transformInnerClass(atoms[classes[i]]);
+ }
+
+ return new AstClassBody(name, baseClassName, interfacesNames, functions, methods, fields, cstrs,
+ classes, { tail: tail });
+ };
+
+ function AstInterface(name, body) {
+ this.name = name;
+ this.body = body;
+ body.owner = this;
+ }
+ AstInterface.prototype.toString = function() {
+ return "var " + this.name + " = " + this.body + ";\n" +
+ "$p." + this.name + " = " + this.name + ";\n";
+ };
+ function AstClass(name, body) {
+ this.name = name;
+ this.body = body;
+ body.owner = this;
+ }
+ AstClass.prototype.toString = function() {
+ return "var " + this.name + " = " + this.body + ";\n" +
+ "$p." + this.name + " = " + this.name + ";\n";
+ };
+
+ function transformGlobalClass(class_) {
+ var m = classesRegex.exec(class_); // 1 - attr, 2 - class|int, 3 - name, 4 - extends, 5 - implements, 6 - body
+ classesRegex.lastIndex = 0;
+ var body = atoms[getAtomIndex(m[6])];
+ var oldClassId = currentClassId, newClassId = generateClassId();
+ currentClassId = newClassId;
+ var globalClass;
+ if(m[2] === "interface") {
+ globalClass = new AstInterface(m[3], transformInterfaceBody(body, m[3], m[4]) );
+ } else {
+ globalClass = new AstClass(m[3], transformClassBody(body, m[3], m[4], m[5]) );
+ }
+ appendClass(globalClass, newClassId, oldClassId);
+ currentClassId = oldClassId;
+ return globalClass;
+ }
+
+ function AstMethod(name, params, body) {
+ this.name = name;
+ this.params = params;
+ this.body = body;
+ }
+ AstMethod.prototype.toString = function(){
+ var paramNames = appendToLookupTable({}, this.params.getNames());
+ var oldContext = replaceContext;
+ replaceContext = function (subject) {
+ return paramNames.hasOwnProperty(subject.name) ? subject.name : oldContext(subject);
+ };
+ var body = this.params.prependMethodArgs(this.body.toString());
+ var result = "function " + this.name + this.params + " " + body + "\n" +
+ "$p." + this.name + " = " + this.name + ";\n" +
+ this.name + " = " + this.name + ".bind($p);";
+// "$p." + this.name + " = " + this.name + ";";
+ replaceContext = oldContext;
+ return result;
+ };
+
+ function transformGlobalMethod(method) {
+ var m = methodsRegex.exec(method);
+ var result =
+ methodsRegex.lastIndex = 0;
+ return new AstMethod(m[3], transformParams(atoms[getAtomIndex(m[4])]),
+ transformStatementsBlock(atoms[getAtomIndex(m[6])]));
+ }
+
+ function preStatementsTransform(statements) {
+ var s = statements;
+ // turns multiple catch blocks into one, because we have no way to properly get into them anyway.
+ s = s.replace(/\b(catch\s*"B\d+"\s*"A\d+")(\s*catch\s*"B\d+"\s*"A\d+")+/g, "$1");
+ return s;
+ }
+
+ function AstForStatement(argument, misc) {
+ this.argument = argument;
+ this.misc = misc;
+ }
+ AstForStatement.prototype.toString = function() {
+ return this.misc.prefix + this.argument.toString();
+ };
+ function AstCatchStatement(argument, misc) {
+ this.argument = argument;
+ this.misc = misc;
+ }
+ AstCatchStatement.prototype.toString = function() {
+ return this.misc.prefix + this.argument.toString();
+ };
+ function AstPrefixStatement(name, argument, misc) {
+ this.name = name;
+ this.argument = argument;
+ this.misc = misc;
+ }
+ AstPrefixStatement.prototype.toString = function() {
+ var result = this.misc.prefix;
+ if(this.argument !== undef) {
+ result += this.argument.toString();
+ }
+ return result;
+ };
+ function AstSwitchCase(expr) {
+ this.expr = expr;
+ }
+ AstSwitchCase.prototype.toString = function() {
+ return "case " + this.expr + ":";
+ };
+ function AstLabel(label) {
+ this.label = label;
+ }
+ AstLabel.prototype.toString = function() {
+ return this.label;
+ };
+
+ transformStatements = function(statements, transformMethod, transformClass) {
+ var nextStatement = new RegExp(/\b(catch|for|if|switch|while|with)\s*"B(\d+)"|\b(do|else|finally|return|throw|try|break|continue)\b|("[ADEH](\d+)")|\b(case)\s+([^:]+):|\b([A-Za-z_$][\w$]*\s*:)|(;)/g);
+ var res = [];
+ statements = preStatementsTransform(statements);
+ var lastIndex = 0, m, space;
+ // m contains the matches from the nextStatement regexp, null if there are no matches.
+ // nextStatement.exec starts searching at nextStatement.lastIndex.
+ while((m = nextStatement.exec(statements)) !== null) {
+ if(m[1] !== undef) { // catch, for ...
+ var i = statements.lastIndexOf('"B', nextStatement.lastIndex);
+ var statementsPrefix = statements.substring(lastIndex, i);
+ if(m[1] === "for") {
+ res.push(new AstForStatement(transformForExpression(atoms[m[2]]),
+ { prefix: statementsPrefix }) );
+ } else if(m[1] === "catch") {
+ res.push(new AstCatchStatement(transformParams(atoms[m[2]]),
+ { prefix: statementsPrefix }) );
+ } else {
+ res.push(new AstPrefixStatement(m[1], transformExpression(atoms[m[2]]),
+ { prefix: statementsPrefix }) );
+ }
+ } else if(m[3] !== undef) { // do, else, ...
+ res.push(new AstPrefixStatement(m[3], undef,
+ { prefix: statements.substring(lastIndex, nextStatement.lastIndex) }) );
+ } else if(m[4] !== undef) { // block, class and methods
+ space = statements.substring(lastIndex, nextStatement.lastIndex - m[4].length);
+ if(trim(space).length !== 0) { continue; } // avoiding new type[] {} construct
+ res.push(space);
+ var kind = m[4].charAt(1), atomIndex = m[5];
+ if(kind === 'D') {
+ res.push(transformMethod(atoms[atomIndex]));
+ } else if(kind === 'E') {
+ res.push(transformClass(atoms[atomIndex]));
+ } else if(kind === 'H') {
+ res.push(transformFunction(atoms[atomIndex]));
+ } else {
+ res.push(transformStatementsBlock(atoms[atomIndex]));
+ }
+ } else if(m[6] !== undef) { // switch case
+ res.push(new AstSwitchCase(transformExpression(trim(m[7]))));
+ } else if(m[8] !== undef) { // label
+ space = statements.substring(lastIndex, nextStatement.lastIndex - m[8].length);
+ if(trim(space).length !== 0) { continue; } // avoiding ?: construct
+ res.push(new AstLabel(statements.substring(lastIndex, nextStatement.lastIndex)) );
+ } else { // semicolon
+ var statement = trimSpaces(statements.substring(lastIndex, nextStatement.lastIndex - 1));
+ res.push(statement.left);
+ res.push(transformStatement(statement.middle));
+ res.push(statement.right + ";");
+ }
+ lastIndex = nextStatement.lastIndex;
+ }
+ var statementsTail = trimSpaces(statements.substring(lastIndex));
+ res.push(statementsTail.left);
+ if(statementsTail.middle !== "") {
+ res.push(transformStatement(statementsTail.middle));
+ res.push(";" + statementsTail.right);
+ }
+ return res;
+ };
+
+ function getLocalNames(statements) {
+ var localNames = [];
+ for(var i=0,l=statements.length;i<l;++i) {
+ var statement = statements[i];
+ if(statement instanceof AstVar) {
+ localNames = localNames.concat(statement.getNames());
+ } else if(statement instanceof AstForStatement &&
+ statement.argument.initStatement instanceof AstVar) {
+ localNames = localNames.concat(statement.argument.initStatement.getNames());
+ } else if(statement instanceof AstInnerInterface || statement instanceof AstInnerClass ||
+ statement instanceof AstInterface || statement instanceof AstClass ||
+ statement instanceof AstMethod || statement instanceof AstFunction) {
+ localNames.push(statement.name);
+ }
+ }
+ return appendToLookupTable({}, localNames);
+ }
+
+ function AstStatementsBlock(statements) {
+ this.statements = statements;
+ }
+ AstStatementsBlock.prototype.toString = function() {
+ var localNames = getLocalNames(this.statements);
+ var oldContext = replaceContext;
+
+ // replacing context only when necessary
+ if(!isLookupTableEmpty(localNames)) {
+ replaceContext = function (subject) {
+ return localNames.hasOwnProperty(subject.name) ? subject.name : oldContext(subject);
+ };
+ }
+
+ var result = "{\n" + this.statements.join('') + "\n}";
+ replaceContext = oldContext;
+ return result;
+ };
+
+ transformStatementsBlock = function(block) {
+ var content = trimSpaces(block.substring(1, block.length - 1));
+ return new AstStatementsBlock(transformStatements(content.middle));
+ };
+
+ function AstRoot(statements) {
+ this.statements = statements;
+ }
+ AstRoot.prototype.toString = function() {
+ var classes = [], otherStatements = [], statement;
+ for (var i = 0, len = this.statements.length; i < len; ++i) {
+ statement = this.statements[i];
+ if (statement instanceof AstClass || statement instanceof AstInterface) {
+ classes.push(statement);
+ } else {
+ otherStatements.push(statement);
+ }
+ }
+ sortByWeight(classes);
+
+ var localNames = getLocalNames(this.statements);
+ replaceContext = function (subject) {
+ var name = subject.name;
+ if(localNames.hasOwnProperty(name)) {
+ return name;
+ }
+ if(globalMembers.hasOwnProperty(name) ||
+ PConstants.hasOwnProperty(name) ||
+ defaultScope.hasOwnProperty(name)) {
+ return "$p." + name;
+ }
+ return name;
+ };
+ var result = "// this code was autogenerated from PJS\n" +
+ "(function($p) {\n" +
+ classes.join('') + "\n" +
+ otherStatements.join('') + "\n})";
+ replaceContext = null;
+ return result;
+ };
+
+ transformMain = function() {
+ var statements = extractClassesAndMethods(atoms[0]);
+ statements = statements.replace(/\bimport\s+[^;]+;/g, "");
+ return new AstRoot( transformStatements(statements,
+ transformGlobalMethod, transformGlobalClass) );
+ };
+
+ function generateMetadata(ast) {
+ var globalScope = {};
+ var id, class_;
+ for(id in declaredClasses) {
+ if(declaredClasses.hasOwnProperty(id)) {
+ class_ = declaredClasses[id];
+ var scopeId = class_.scopeId, name = class_.name;
+ if(scopeId) {
+ var scope = declaredClasses[scopeId];
+ class_.scope = scope;
+ if(scope.inScope === undef) {
+ scope.inScope = {};
+ }
+ scope.inScope[name] = class_;
+ } else {
+ globalScope[name] = class_;
+ }
+ }
+ }
+
+ function findInScopes(class_, name) {
+ var parts = name.split('.');
+ var currentScope = class_.scope, found;
+ while(currentScope) {
+ if(currentScope.hasOwnProperty(parts[0])) {
+ found = currentScope[parts[0]]; break;
+ }
+ currentScope = currentScope.scope;
+ }
+ if(found === undef) {
+ found = globalScope[parts[0]];
+ }
+ for(var i=1,l=parts.length;i<l && found;++i) {
+ found = found.inScope[parts[i]];
+ }
+ return found;
+ }
+
+ for(id in declaredClasses) {
+ if(declaredClasses.hasOwnProperty(id)) {
+ class_ = declaredClasses[id];
+ var baseClassName = class_.body.baseClassName;
+ if(baseClassName) {
+ var parent = findInScopes(class_, baseClassName);
+ if (parent) {
+ class_.base = parent;
+ if (!parent.derived) {
+ parent.derived = [];
+ }
+ parent.derived.push(class_);
+ }
+ }
+ var interfacesNames = class_.body.interfacesNames,
+ interfaces = [], i, l;
+ if (interfacesNames && interfacesNames.length > 0) {
+ for (i = 0, l = interfacesNames.length; i < l; ++i) {
+ var interface_ = findInScopes(class_, interfacesNames[i]);
+ interfaces.push(interface_);
+ if (!interface_) {
+ continue;
+ }
+ if (!interface_.derived) {
+ interface_.derived = [];
+ }
+ interface_.derived.push(class_);
+ }
+ if (interfaces.length > 0) {
+ class_.interfaces = interfaces;
+ }
+ }
+ }
+ }
+ }
+
+ function setWeight(ast) {
+ var queue = [], tocheck = {};
+ var id, scopeId, class_;
+ // queue most inner and non-inherited
+ for (id in declaredClasses) {
+ if (declaredClasses.hasOwnProperty(id)) {
+ class_ = declaredClasses[id];
+ if (!class_.inScope && !class_.derived) {
+ queue.push(id);
+ class_.weight = 0;
+ } else {
+ var dependsOn = [];
+ if (class_.inScope) {
+ for (scopeId in class_.inScope) {
+ if (class_.inScope.hasOwnProperty(scopeId)) {
+ dependsOn.push(class_.inScope[scopeId]);
+ }
+ }
+ }
+ if (class_.derived) {
+ dependsOn = dependsOn.concat(class_.derived);
+ }
+ tocheck[id] = dependsOn;
+ }
+ }
+ }
+ function removeDependentAndCheck(targetId, from) {
+ var dependsOn = tocheck[targetId];
+ if (!dependsOn) {
+ return false; // no need to process
+ }
+ var i = dependsOn.indexOf(from);
+ if (i < 0) {
+ return false;
+ }
+ dependsOn.splice(i, 1);
+ if (dependsOn.length > 0) {
+ return false;
+ }
+ delete tocheck[targetId];
+ return true;
+ }
+ while (queue.length > 0) {
+ id = queue.shift();
+ class_ = declaredClasses[id];
+ if (class_.scopeId && removeDependentAndCheck(class_.scopeId, class_)) {
+ queue.push(class_.scopeId);
+ declaredClasses[class_.scopeId].weight = class_.weight + 1;
+ }
+ if (class_.base && removeDependentAndCheck(class_.base.classId, class_)) {
+ queue.push(class_.base.classId);
+ class_.base.weight = class_.weight + 1;
+ }
+ if (class_.interfaces) {
+ var i, l;
+ for (i = 0, l = class_.interfaces.length; i < l; ++i) {
+ if (!class_.interfaces[i] ||
+ !removeDependentAndCheck(class_.interfaces[i].classId, class_)) {
+ continue;
+ }
+ queue.push(class_.interfaces[i].classId);
+ class_.interfaces[i].weight = class_.weight + 1;
+ }
+ }
+ }
+ }
+
+ var transformed = transformMain();
+ generateMetadata(transformed);
+ setWeight(transformed);
+
+ var redendered = transformed.toString();
+
+ // remove empty extra lines with space
+ redendered = redendered.replace(/\s*\n(?:[\t ]*\n)+/g, "\n\n");
+
+ // convert character codes to characters
+ redendered = redendered.replace(/__x([0-9A-F]{4})/g, function(all, hexCode) {
+ return String.fromCharCode(parseInt(hexCode,16));
+ });
+
+ return injectStrings(redendered, strings);
+ }// Parser ends
+
+ function preprocessCode(aCode, sketch) {
+ // Parse out @pjs directive, if any.
+ var dm = new RegExp(/\/\*\s*@pjs\s+((?:[^\*]|\*+[^\*\/])*)\*\//g).exec(aCode);
+ if (dm && dm.length === 2) {
+ // masks contents of a JSON to be replaced later
+ // to protect the contents from further parsing
+ var jsonItems = [],
+ directives = dm.splice(1, 2)[0].replace(/\{([\s\S]*?)\}/g, (function() {
+ return function(all, item) {
+ jsonItems.push(item);
+ return "{" + (jsonItems.length-1) + "}";
+ };
+ }())).replace('\n', '').replace('\r', '').split(";");
+
+ // We'll L/RTrim, and also remove any surrounding double quotes (e.g., just take string contents)
+ var clean = function(s) {
+ return s.replace(/^\s*["']?/, '').replace(/["']?\s*$/, '');
+ };
+
+ for (var i = 0, dl = directives.length; i < dl; i++) {
+ var pair = directives[i].split('=');
+ if (pair && pair.length === 2) {
+ var key = clean(pair[0]),
+ value = clean(pair[1]),
+ list = [];
+ // A few directives require work beyond storying key/value pairings
+ if (key === "preload") {
+ list = value.split(',');
+ // All pre-loaded images will get put in imageCache, keyed on filename
+ for (var j = 0, jl = list.length; j < jl; j++) {
+ var imageName = clean(list[j]);
+ sketch.imageCache.add(imageName);
+ }
+ // fonts can be declared as a string containing a url,
+ // or a JSON object, containing a font name, and a url
+ } else if (key === "font") {
+ list = value.split(",");
+ for (var x = 0, xl = list.length; x < xl; x++) {
+ var fontName = clean(list[x]),
+ index = /^\{(\d*?)\}$/.exec(fontName);
+ // if index is not null, send JSON, otherwise, send string
+ PFont.preloading.add(index ? JSON.parse("{" + jsonItems[index[1]] + "}") : fontName);
+ }
+ } else if (key === "pauseOnBlur") {
+ sketch.options.pauseOnBlur = value === "true";
+ } else if (key === "globalKeyEvents") {
+ sketch.options.globalKeyEvents = value === "true";
+ } else if (key.substring(0, 6) === "param-") {
+ sketch.params[key.substring(6)] = value;
+ } else {
+ sketch.options[key] = value;
+ }
+ }
+ }
+ }
+ return aCode;
+ }
+
+ // Parse/compiles Processing (Java-like) syntax to JavaScript syntax
+ Processing.compile = function(pdeCode) {
+ var sketch = new Processing.Sketch();
+ var code = preprocessCode(pdeCode, sketch);
+ var compiledPde = parseProcessing(code);
+ sketch.sourceCode = compiledPde;
+ return sketch;
+ };
+
+ var PjsConsole = require("../Helpers/PjsConsole");
+ Processing.logger = new PjsConsole(document);
+
+ // done
+ return Processing;
+};
+
+},{"../Helpers/PjsConsole":5}],27:[function(require,module,exports){
+/**
+ * Processing.js object
+ */
+ module.exports = function(options, undef) {
+ var defaultScope = options.defaultScope,
+ extend = options.extend,
+ Browser = options.Browser,
+ ajax = Browser.ajax,
+ navigator = Browser.navigator,
+ window = Browser.window,
+ XMLHttpRequest = window.XMLHttpRequest,
+ document = Browser.document,
+ noop = options.noop,
+
+ PConstants = defaultScope.PConstants;
+ PFont = defaultScope.PFont,
+ PShapeSVG = defaultScope.PShapeSVG,
+ PVector = defaultScope.PVector,
+ Char = Character = defaultScope.Char,
+ ObjectIterator = defaultScope.ObjectIterator,
+ XMLElement = defaultScope.XMLElement,
+ XML = defaultScope.XML;
+
+ // fascinating "read only" jshint error if we don't start a new var block here.
+ var HTMLCanvasElement = window.HTMLCanvasElement,
+ HTMLImageElement = window.HTMLImageElement;
+
+ // window.localStorage cannot be accessed if a user is blocking cookies.
+ // In that case, we make it a temporary source cache object.
+ var localStorage;
+ try { localStorage = window.localStorage; } catch (e) { localStorage = {}; }
+
+ var isDOMPresent = ("document" in this) && !("fake" in this.document);
+
+ // document.head polyfill for the benefit of Firefox 3.6
+ if (!document.head) {
+ document.head = document.getElementsByTagName('head')[0];
+ }
+
+ var Float32Array = setupTypedArray("Float32Array", "WebGLFloatArray"),
+ Int32Array = setupTypedArray("Int32Array", "WebGLIntArray"),
+ Uint16Array = setupTypedArray("Uint16Array", "WebGLUnsignedShortArray"),
+ Uint8Array = setupTypedArray("Uint8Array", "WebGLUnsignedByteArray");
+
+ // Typed Arrays: fallback to WebGL arrays or Native JS arrays if unavailable
+ function setupTypedArray(name, fallback) {
+ // Check if TypedArray exists, and use if so.
+ if (name in window) {
+ return window[name];
+ }
+
+ // Check if WebGLArray exists
+ if (typeof window[fallback] === "function") {
+ return window[fallback];
+ }
+
+ // Use Native JS array
+ return function(obj) {
+ if (obj instanceof Array) {
+ return obj;
+ }
+ if (typeof obj === "number") {
+ var arr = [];
+ arr.length = obj;
+ return arr;
+ }
+ };
+ }
+
+ /* IE9+ quirks mode check - ticket #1606 */
+ if (document.documentMode >= 9 && !document.doctype) {
+ throw("The doctype directive is missing. The recommended doctype in Internet Explorer is the HTML5 doctype: <!DOCTYPE html>");
+ }
+
+ // Manage multiple Processing instances
+ var processingInstances = [];
+ var processingInstanceIds = {};
+
+ /**
+ * instance tracking - adding new instances
+ */
+ var addInstance = function(processing) {
+ if (processing.externals.canvas.id === undef || !processing.externals.canvas.id.length) {
+ processing.externals.canvas.id = "__processing" + processingInstances.length;
+ }
+ processingInstanceIds[processing.externals.canvas.id] = processingInstances.length;
+ processingInstances.push(processing);
+ };
+
+ /**
+ * instance tracking - removal
+ */
+ var removeInstance = function(id) {
+ processingInstances.splice(processingInstanceIds[id], 1);
+ delete processingInstanceIds[id];
+ };
+
+
+ /**
+ * The Processing object
+ */
+ var Processing = this.Processing = function(aCanvas, aCode, aFunctions) {
+
+ if (!(this instanceof Processing)) {
+ throw("called Processing constructor as if it were a function: missing 'new'.");
+ }
+
+ var curElement = {},
+ pgraphicsMode = (aCanvas === undef && aCode === undef);
+
+ if (pgraphicsMode) {
+ curElement = document.createElement("canvas");
+ } else {
+ // We'll take a canvas element or a string for a canvas element's id
+ curElement = typeof aCanvas === "string" ? document.getElementById(aCanvas) : aCanvas;
+ }
+
+ if (!('getContext' in curElement)) {
+ throw("called Processing constructor without passing canvas element reference or id.");
+ }
+
+ function unimplemented(s) {
+ Processing.debug('Unimplemented - ' + s);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ // JavaScript event binding and releasing
+ ////////////////////////////////////////////////////////////////////////////
+
+ var eventHandlers = [];
+
+ function attachEventHandler(elem, type, fn) {
+ if (elem.addEventListener) {
+ elem.addEventListener(type, fn, false);
+ } else {
+ elem.attachEvent("on" + type, fn);
+ }
+ eventHandlers.push({elem: elem, type: type, fn: fn});
+ }
+
+ function detachEventHandler(eventHandler) {
+ var elem = eventHandler.elem,
+ type = eventHandler.type,
+ fn = eventHandler.fn;
+ if (elem.removeEventListener) {
+ elem.removeEventListener(type, fn, false);
+ } else if (elem.detachEvent) {
+ elem.detachEvent("on" + type, fn);
+ }
+ }
+
+ function removeFirstArgument(args) {
+ return Array.prototype.slice.call(args, 1);
+ }
+
+ // When something new is added to "p." it must also be added to the "names" array.
+ // The names array contains the names of everything that is inside "p."
+ var p = this;
+
+ p.Char = p.Character = Char;
+
+ // add in the Processing API functions
+ extend.withCommonFunctions(p);
+ extend.withMath(p);
+ extend.withProxyFunctions(p, removeFirstArgument);
+ extend.withTouch(p, curElement, attachEventHandler, document, PConstants);
+
+ // custom functions and properties are added here
+ if(aFunctions) {
+ Object.keys(aFunctions).forEach(function(name) {
+ p[name] = aFunctions[name];
+ });
+ }
+
+ // PJS specific (non-p5) methods and properties to externalize
+ p.externals = {
+ canvas: curElement,
+ context: undef,
+ sketch: undef,
+ window: window
+ };
+
+ p.name = 'Processing.js Instance'; // Set Processing defaults / environment variables
+ p.use3DContext = false; // default '2d' canvas context
+
+ /**
+ * Confirms if a Processing program is "focused", meaning that it is
+ * active and will accept input from mouse or keyboard. This variable
+ * is "true" if it is focused and "false" if not. This variable is
+ * often used when you want to warn people they need to click on the
+ * browser before it will work.
+ */
+ p.focused = false;
+ p.breakShape = false;
+
+ // Glyph path storage for textFonts
+ p.glyphTable = {};
+
+ // Global vars for tracking mouse position
+ p.pmouseX = 0;
+ p.pmouseY = 0;
+ p.mouseX = 0;
+ p.mouseY = 0;
+ p.mouseButton = 0;
+ p.mouseScroll = 0;
+
+ // Undefined event handlers to be replaced by user when needed
+ p.mouseClicked = undef;
+ p.mouseDragged = undef;
+ p.mouseMoved = undef;
+ p.mousePressed = undef;
+ p.mouseReleased = undef;
+ p.mouseScrolled = undef;
+ p.mouseOver = undef;
+ p.mouseOut = undef;
+ p.touchStart = undef;
+ p.touchEnd = undef;
+ p.touchMove = undef;
+ p.touchCancel = undef;
+ p.key = undef;
+ p.keyCode = undef;
+ p.keyPressed = noop; // needed to remove function checks
+ p.keyReleased = noop;
+ p.keyTyped = noop;
+ p.draw = undef;
+ p.setup = undef;
+
+ // Remapped vars
+ p.__mousePressed = false;
+ p.__keyPressed = false;
+ p.__frameRate = 60;
+
+ // The current animation frame
+ p.frameCount = 0;
+
+ // The height/width of the canvas
+ p.width = 100;
+ p.height = 100;
+
+ // "Private" variables used to maintain state
+ var curContext,
+ curSketch,
+ drawing, // hold a Drawing2D or Drawing3D object
+ doFill = true,
+ fillStyle = [1.0, 1.0, 1.0, 1.0],
+ currentFillColor = 0xFFFFFFFF,
+ isFillDirty = true,
+ doStroke = true,
+ strokeStyle = [0.0, 0.0, 0.0, 1.0],
+ currentStrokeColor = 0xFF000000,
+ isStrokeDirty = true,
+ lineWidth = 1,
+ loopStarted = false,
+ renderSmooth = false,
+ doLoop = true,
+ looping = 0,
+ curRectMode = PConstants.CORNER,
+ curEllipseMode = PConstants.CENTER,
+ normalX = 0,
+ normalY = 0,
+ normalZ = 0,
+ normalMode = PConstants.NORMAL_MODE_AUTO,
+ curFrameRate = 60,
+ curMsPerFrame = 1000/curFrameRate,
+ curCursor = PConstants.ARROW,
+ oldCursor = curElement.style.cursor,
+ curShape = PConstants.POLYGON,
+ curShapeCount = 0,
+ curvePoints = [],
+ curTightness = 0,
+ curveDet = 20,
+ curveInited = false,
+ backgroundObj = -3355444, // rgb(204, 204, 204) is the default gray background colour
+ bezDetail = 20,
+ colorModeA = 255,
+ colorModeX = 255,
+ colorModeY = 255,
+ colorModeZ = 255,
+ pathOpen = false,
+ mouseDragging = false,
+ pmouseXLastFrame = 0,
+ pmouseYLastFrame = 0,
+ curColorMode = PConstants.RGB,
+ curTint = null,
+ curTint3d = null,
+ getLoaded = false,
+ start = Date.now(),
+ timeSinceLastFPS = start,
+ framesSinceLastFPS = 0,
+ textcanvas,
+ curveBasisMatrix,
+ curveToBezierMatrix,
+ curveDrawMatrix,
+ bezierDrawMatrix,
+ bezierBasisInverse,
+ bezierBasisMatrix,
+ curContextCache = { attributes: {}, locations: {} },
+ // Shaders
+ programObject3D,
+ programObject2D,
+ programObjectUnlitShape,
+ boxBuffer,
+ boxNormBuffer,
+ boxOutlineBuffer,
+ rectBuffer,
+ rectNormBuffer,
+ sphereBuffer,
+ lineBuffer,
+ fillBuffer,
+ fillColorBuffer,
+ strokeColorBuffer,
+ pointBuffer,
+ shapeTexVBO,
+ canTex, // texture for createGraphics
+ textTex, // texture for 3d tex
+ curTexture = {width:0,height:0},
+ curTextureMode = PConstants.IMAGE,
+ usingTexture = false,
+ textBuffer,
+ textureBuffer,
+ indexBuffer,
+ // Text alignment
+ horizontalTextAlignment = PConstants.LEFT,
+ verticalTextAlignment = PConstants.BASELINE,
+ textMode = PConstants.MODEL,
+ // Font state
+ curFontName = "Arial",
+ curTextSize = 12,
+ curTextAscent = 9,
+ curTextDescent = 2,
+ curTextLeading = 14,
+ curTextFont = PFont.get(curFontName, curTextSize),
+ // Pixels cache
+ originalContext,
+ proxyContext = null,
+ isContextReplaced = false,
+ setPixelsCached,
+ maxPixelsCached = 1000,
+ pressedKeysMap = [],
+ lastPressedKeyCode = null,
+ codedKeys = [ PConstants.SHIFT, PConstants.CONTROL, PConstants.ALT, PConstants.CAPSLK, PConstants.PGUP, PConstants.PGDN,
+ PConstants.END, PConstants.HOME, PConstants.LEFT, PConstants.UP, PConstants.RIGHT, PConstants.DOWN, PConstants.NUMLK,
+ PConstants.INSERT, PConstants.F1, PConstants.F2, PConstants.F3, PConstants.F4, PConstants.F5, PConstants.F6, PConstants.F7,
+ PConstants.F8, PConstants.F9, PConstants.F10, PConstants.F11, PConstants.F12, PConstants.META ];
+
+ // User can only have MAX_LIGHTS lights
+ var lightCount = 0;
+
+ //sphere stuff
+ var sphereDetailV = 0,
+ sphereDetailU = 0,
+ sphereX = [],
+ sphereY = [],
+ sphereZ = [],
+ sinLUT = new Float32Array(PConstants.SINCOS_LENGTH),
+ cosLUT = new Float32Array(PConstants.SINCOS_LENGTH),
+ sphereVerts,
+ sphereNorms;
+
+ // Camera defaults and settings
+ var cam,
+ cameraInv,
+ modelView,
+ modelViewInv,
+ userMatrixStack,
+ userReverseMatrixStack,
+ inverseCopy,
+ projection,
+ manipulatingCamera = false,
+ frustumMode = false,
+ cameraFOV = 60 * (Math.PI / 180),
+ cameraX = p.width / 2,
+ cameraY = p.height / 2,
+ cameraZ = cameraY / Math.tan(cameraFOV / 2),
+ cameraNear = cameraZ / 10,
+ cameraFar = cameraZ * 10,
+ cameraAspect = p.width / p.height;
+
+ var vertArray = [],
+ curveVertArray = [],
+ curveVertCount = 0,
+ isCurve = false,
+ isBezier = false,
+ firstVert = true;
+
+ //PShape stuff
+ var curShapeMode = PConstants.CORNER;
+
+ // Stores states for pushStyle() and popStyle().
+ var styleArray = [];
+
+ // The vertices for the box cannot be specified using a triangle strip since each
+ // side of the cube must have its own set of normals.
+ // Vertices are specified in a counter-clockwise order.
+ // Triangles are in this order: back, front, right, bottom, left, top.
+ var boxVerts = new Float32Array([
+ 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5,
+ 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5,
+ 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5,
+ -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5,
+ 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5]);
+
+ var boxOutlineVerts = new Float32Array([
+ 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5,
+ -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5,
+ 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5,
+ -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5,
+ -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5]);
+
+ var boxNorms = new Float32Array([
+ 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1,
+ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0,
+ 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0,
+ -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0,
+ 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]);
+
+ // These verts are used for the fill and stroke using TRIANGLE_FAN and LINE_LOOP.
+ var rectVerts = new Float32Array([0,0,0, 0,1,0, 1,1,0, 1,0,0]);
+
+ var rectNorms = new Float32Array([0,0,1, 0,0,1, 0,0,1, 0,0,1]);
+
+ // Shader for points and lines in begin/endShape.
+ var vertexShaderSrcUnlitShape =
+ "varying vec4 vFrontColor;" +
+
+ "attribute vec3 aVertex;" +
+ "attribute vec4 aColor;" +
+
+ "uniform mat4 uView;" +
+ "uniform mat4 uProjection;" +
+ "uniform float uPointSize;" +
+
+ "void main(void) {" +
+ " vFrontColor = aColor;" +
+ " gl_PointSize = uPointSize;" +
+ " gl_Position = uProjection * uView * vec4(aVertex, 1.0);" +
+ "}";
+
+ var fragmentShaderSrcUnlitShape =
+ "#ifdef GL_ES\n" +
+ "precision highp float;\n" +
+ "#endif\n" +
+
+ "varying vec4 vFrontColor;" +
+ "uniform bool uSmooth;" +
+
+ "void main(void){" +
+ " if(uSmooth == true){" +
+ " float dist = distance(gl_PointCoord, vec2(0.5));" +
+ " if(dist > 0.5){" +
+ " discard;" +
+ " }" +
+ " }" +
+ " gl_FragColor = vFrontColor;" +
+ "}";
+
+ // Shader for rect, text, box outlines, sphere outlines, point() and line().
+ var vertexShaderSrc2D =
+ "varying vec4 vFrontColor;" +
+
+ "attribute vec3 aVertex;" +
+ "attribute vec2 aTextureCoord;" +
+ "uniform vec4 uColor;" +
+
+ "uniform mat4 uModel;" +
+ "uniform mat4 uView;" +
+ "uniform mat4 uProjection;" +
+ "uniform float uPointSize;" +
+ "varying vec2 vTextureCoord;"+
+
+ "void main(void) {" +
+ " gl_PointSize = uPointSize;" +
+ " vFrontColor = uColor;" +
+ " gl_Position = uProjection * uView * uModel * vec4(aVertex, 1.0);" +
+ " vTextureCoord = aTextureCoord;" +
+ "}";
+
+ var fragmentShaderSrc2D =
+ "#ifdef GL_ES\n" +
+ "precision highp float;\n" +
+ "#endif\n" +
+
+ "varying vec4 vFrontColor;" +
+ "varying vec2 vTextureCoord;"+
+
+ "uniform sampler2D uSampler;"+
+ "uniform int uIsDrawingText;"+
+ "uniform bool uSmooth;" +
+
+ "void main(void){" +
+ // WebGL does not support POINT_SMOOTH, so we do it ourselves
+ " if(uSmooth == true){" +
+ " float dist = distance(gl_PointCoord, vec2(0.5));" +
+ " if(dist > 0.5){" +
+ " discard;" +
+ " }" +
+ " }" +
+
+ " if(uIsDrawingText == 1){" +
+ " float alpha = texture2D(uSampler, vTextureCoord).a;"+
+ " gl_FragColor = vec4(vFrontColor.rgb * alpha, alpha);"+
+ " }" +
+ " else{" +
+ " gl_FragColor = vFrontColor;" +
+ " }" +
+ "}";
+
+ var webglMaxTempsWorkaround = /Windows/.test(navigator.userAgent);
+
+ // Vertex shader for boxes and spheres.
+ var vertexShaderSrc3D =
+ "varying vec4 vFrontColor;" +
+
+ "attribute vec3 aVertex;" +
+ "attribute vec3 aNormal;" +
+ "attribute vec4 aColor;" +
+ "attribute vec2 aTexture;" +
+ "varying vec2 vTexture;" +
+
+ "uniform vec4 uColor;" +
+
+ "uniform bool uUsingMat;" +
+ "uniform vec3 uSpecular;" +
+ "uniform vec3 uMaterialEmissive;" +
+ "uniform vec3 uMaterialAmbient;" +
+ "uniform vec3 uMaterialSpecular;" +
+ "uniform float uShininess;" +
+
+ "uniform mat4 uModel;" +
+ "uniform mat4 uView;" +
+ "uniform mat4 uProjection;" +
+ "uniform mat4 uNormalTransform;" +
+
+ "uniform int uLightCount;" +
+ "uniform vec3 uFalloff;" +
+
+ // Careful changing the order of these fields. Some cards
+ // have issues with memory alignment.
+ "struct Light {" +
+ " int type;" +
+ " vec3 color;" +
+ " vec3 position;" +
+ " vec3 direction;" +
+ " float angle;" +
+ " vec3 halfVector;" +
+ " float concentration;" +
+ "};" +
+
+ // nVidia cards have issues with arrays of structures
+ // so instead we create 8 instances of Light.
+ "uniform Light uLights0;" +
+ "uniform Light uLights1;" +
+ "uniform Light uLights2;" +
+ "uniform Light uLights3;" +
+ "uniform Light uLights4;" +
+ "uniform Light uLights5;" +
+ "uniform Light uLights6;" +
+ "uniform Light uLights7;" +
+
+ // GLSL does not support switch.
+ "Light getLight(int index){" +
+ " if(index == 0) return uLights0;" +
+ " if(index == 1) return uLights1;" +
+ " if(index == 2) return uLights2;" +
+ " if(index == 3) return uLights3;" +
+ " if(index == 4) return uLights4;" +
+ " if(index == 5) return uLights5;" +
+ " if(index == 6) return uLights6;" +
+ // Do not use a conditional for the last return statement
+ // because some video cards will fail and complain that
+ // "not all paths return".
+ " return uLights7;" +
+ "}" +
+
+ "void AmbientLight( inout vec3 totalAmbient, in vec3 ecPos, in Light light ) {" +
+ // Get the vector from the light to the vertex and
+ // get the distance from the current vector to the light position.
+ " float d = length( light.position - ecPos );" +
+ " float attenuation = 1.0 / ( uFalloff[0] + ( uFalloff[1] * d ) + ( uFalloff[2] * d * d ));" +
+ " totalAmbient += light.color * attenuation;" +
+ "}" +
+
+ /*
+ col - accumulated color
+ spec - accumulated specular highlight
+ vertNormal - Normal of the vertex
+ ecPos - eye coordinate position
+ light - light structure
+ */
+ "void DirectionalLight( inout vec3 col, inout vec3 spec, in vec3 vertNormal, in vec3 ecPos, in Light light ) {" +
+ " float powerFactor = 0.0;" +
+ " float nDotVP = max(0.0, dot( vertNormal, normalize(-light.position) ));" +
+ " float nDotVH = max(0.0, dot( vertNormal, normalize(-light.position-normalize(ecPos) )));" +
+
+ " if( nDotVP != 0.0 ){" +
+ " powerFactor = pow( nDotVH, uShininess );" +
+ " }" +
+
+ " col += light.color * nDotVP;" +
+ " spec += uSpecular * powerFactor;" +
+ "}" +
+
+ /*
+ col - accumulated color
+ spec - accumulated specular highlight
+ vertNormal - Normal of the vertex
+ ecPos - eye coordinate position
+ light - light structure
+ */
+ "void PointLight( inout vec3 col, inout vec3 spec, in vec3 vertNormal, in vec3 ecPos, in Light light ) {" +
+ " float powerFactor;" +
+
+ // Get the vector from the light to the vertex.
+ " vec3 VP = light.position - ecPos;" +
+
+ // Get the distance from the current vector to the light position.
+ " float d = length( VP ); " +
+
+ // Normalize the light ray so it can be used in the dot product operation.
+ " VP = normalize( VP );" +
+
+ " float attenuation = 1.0 / ( uFalloff[0] + ( uFalloff[1] * d ) + ( uFalloff[2] * d * d ));" +
+
+ " float nDotVP = max( 0.0, dot( vertNormal, VP ));" +
+ " vec3 halfVector = normalize( VP - normalize(ecPos) );" +
+ " float nDotHV = max( 0.0, dot( vertNormal, halfVector ));" +
+
+ " if( nDotVP == 0.0 ) {" +
+ " powerFactor = 0.0;" +
+ " }" +
+ " else {" +
+ " powerFactor = pow( nDotHV, uShininess );" +
+ " }" +
+
+ " spec += uSpecular * powerFactor * attenuation;" +
+ " col += light.color * nDotVP * attenuation;" +
+ "}" +
+
+ /*
+ col - accumulated color
+ spec - accumulated specular highlight
+ vertNormal - Normal of the vertex
+ ecPos - eye coordinate position
+ light - light structure
+ */
+ "void SpotLight( inout vec3 col, inout vec3 spec, in vec3 vertNormal, in vec3 ecPos, in Light light ) {" +
+ " float spotAttenuation;" +
+ " float powerFactor = 0.0;" +
+
+ // Calculate the vector from the current vertex to the light.
+ " vec3 VP = light.position - ecPos;" +
+ " vec3 ldir = normalize( -light.direction );" +
+
+ // Get the distance from the spotlight and the vertex
+ " float d = length( VP );" +
+ " VP = normalize( VP );" +
+
+ " float attenuation = 1.0 / ( uFalloff[0] + ( uFalloff[1] * d ) + ( uFalloff[2] * d * d ) );" +
+
+ // Dot product of the vector from vertex to light and light direction.
+ " float spotDot = dot( VP, ldir );" +
+
+ // If the vertex falls inside the cone
+ (webglMaxTempsWorkaround ? // Windows reports max temps error if light.angle is used
+ " spotAttenuation = 1.0; " :
+ " if( spotDot > cos( light.angle ) ) {" +
+ " spotAttenuation = pow( spotDot, light.concentration );" +
+ " }" +
+ " else{" +
+ " spotAttenuation = 0.0;" +
+ " }" +
+ " attenuation *= spotAttenuation;" +
+ "") +
+
+ " float nDotVP = max( 0.0, dot( vertNormal, VP ) );" +
+ " vec3 halfVector = normalize( VP - normalize(ecPos) );" +
+ " float nDotHV = max( 0.0, dot( vertNormal, halfVector ) );" +
+
+ " if( nDotVP != 0.0 ) {" +
+ " powerFactor = pow( nDotHV, uShininess );" +
+ " }" +
+
+ " spec += uSpecular * powerFactor * attenuation;" +
+ " col += light.color * nDotVP * attenuation;" +
+ "}" +
+
+ "void main(void) {" +
+ " vec3 finalAmbient = vec3( 0.0 );" +
+ " vec3 finalDiffuse = vec3( 0.0 );" +
+ " vec3 finalSpecular = vec3( 0.0 );" +
+
+ " vec4 col = uColor;" +
+
+ " if ( uColor[0] == -1.0 ){" +
+ " col = aColor;" +
+ " }" +
+
+ // We use the sphere vertices as the normals when we create the sphere buffer.
+ // But this only works if the sphere vertices are unit length, so we
+ // have to normalize the normals here. Since this is only required for spheres
+ // we could consider placing this in a conditional later on.
+ " vec3 norm = normalize(vec3( uNormalTransform * vec4( aNormal, 0.0 ) ));" +
+
+ " vec4 ecPos4 = uView * uModel * vec4(aVertex, 1.0);" +
+ " vec3 ecPos = (vec3(ecPos4))/ecPos4.w;" +
+
+ // If there were no lights this draw call, just use the
+ // assigned fill color of the shape and the specular value.
+ " if( uLightCount == 0 ) {" +
+ " vFrontColor = col + vec4(uMaterialSpecular, 1.0);" +
+ " }" +
+ " else {" +
+ // WebGL forces us to iterate over a constant value
+ // so we can't iterate using lightCount.
+ " for( int i = 0; i < 8; i++ ) {" +
+ " Light l = getLight(i);" +
+
+ // We can stop iterating if we know we have gone past
+ // the number of lights which are actually on. This gives us a
+ // significant performance increase with high vertex counts.
+ " if( i >= uLightCount ){" +
+ " break;" +
+ " }" +
+
+ " if( l.type == 0 ) {" +
+ " AmbientLight( finalAmbient, ecPos, l );" +
+ " }" +
+ " else if( l.type == 1 ) {" +
+ " DirectionalLight( finalDiffuse, finalSpecular, norm, ecPos, l );" +
+ " }" +
+ " else if( l.type == 2 ) {" +
+ " PointLight( finalDiffuse, finalSpecular, norm, ecPos, l );" +
+ " }" +
+ " else {" +
+ " SpotLight( finalDiffuse, finalSpecular, norm, ecPos, l );" +
+ " }" +
+ " }" +
+
+ " if( uUsingMat == false ) {" +
+ " vFrontColor = vec4(" +
+ " vec3( col ) * finalAmbient +" +
+ " vec3( col ) * finalDiffuse +" +
+ " vec3( col ) * finalSpecular," +
+ " col[3] );" +
+ " }" +
+ " else{" +
+ " vFrontColor = vec4( " +
+ " uMaterialEmissive + " +
+ " (vec3(col) * uMaterialAmbient * finalAmbient ) + " +
+ " (vec3(col) * finalDiffuse) + " +
+ " (uMaterialSpecular * finalSpecular), " +
+ " col[3] );" +
+ " }" +
+ " }" +
+
+ " vTexture.xy = aTexture.xy;" +
+ " gl_Position = uProjection * uView * uModel * vec4( aVertex, 1.0 );" +
+ "}";
+
+ var fragmentShaderSrc3D =
+ "#ifdef GL_ES\n" +
+ "precision highp float;\n" +
+ "#endif\n" +
+
+ "varying vec4 vFrontColor;" +
+
+ "uniform sampler2D uSampler;" +
+ "uniform bool uUsingTexture;" +
+ "varying vec2 vTexture;" +
+
+ // In Processing, when a texture is used, the fill color is ignored
+ // vec4(1.0,1.0,1.0,0.5)
+ "void main(void){" +
+ " if( uUsingTexture ){" +
+ " gl_FragColor = vec4(texture2D(uSampler, vTexture.xy)) * vFrontColor;" +
+ " }"+
+ " else{" +
+ " gl_FragColor = vFrontColor;" +
+ " }" +
+ "}";
+
+ ////////////////////////////////////////////////////////////////////////////
+ // 3D Functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /*
+ * Sets a uniform variable in a program object to a particular
+ * value. Before calling this function, ensure the correct
+ * program object has been installed as part of the current
+ * rendering state by calling useProgram.
+ *
+ * On some systems, if the variable exists in the shader but isn't used,
+ * the compiler will optimize it out and this function will fail.
+ *
+ * @param {String} cacheId
+ * @param {WebGLProgram} programObj program object returned from
+ * createProgramObject
+ * @param {String} varName the name of the variable in the shader
+ * @param {float | Array} varValue either a scalar value or an Array
+ *
+ * @returns none
+ *
+ * @see uniformi
+ * @see uniformMatrix
+ */
+ function uniformf(cacheId, programObj, varName, varValue) {
+ var varLocation = curContextCache.locations[cacheId];
+ if(varLocation === undef) {
+ varLocation = curContext.getUniformLocation(programObj, varName);
+ curContextCache.locations[cacheId] = varLocation;
+ }
+ // the variable won't be found if it was optimized out.
+ if (varLocation !== null) {
+ if (varValue.length === 4) {
+ curContext.uniform4fv(varLocation, varValue);
+ } else if (varValue.length === 3) {
+ curContext.uniform3fv(varLocation, varValue);
+ } else if (varValue.length === 2) {
+ curContext.uniform2fv(varLocation, varValue);
+ } else {
+ curContext.uniform1f(varLocation, varValue);
+ }
+ }
+ }
+
+ /**
+ * Sets a uniform int or int array in a program object to a particular
+ * value. Before calling this function, ensure the correct
+ * program object has been installed as part of the current
+ * rendering state.
+ *
+ * On some systems, if the variable exists in the shader but isn't used,
+ * the compiler will optimize it out and this function will fail.
+ *
+ * @param {String} cacheId
+ * @param {WebGLProgram} programObj program object returned from
+ * createProgramObject
+ * @param {String} varName the name of the variable in the shader
+ * @param {int | Array} varValue either a scalar value or an Array
+ *
+ * @returns none
+ *
+ * @see uniformf
+ * @see uniformMatrix
+ */
+ function uniformi(cacheId, programObj, varName, varValue) {
+ var varLocation = curContextCache.locations[cacheId];
+ if(varLocation === undef) {
+ varLocation = curContext.getUniformLocation(programObj, varName);
+ curContextCache.locations[cacheId] = varLocation;
+ }
+ // the variable won't be found if it was optimized out.
+ if (varLocation !== null) {
+ if (varValue.length === 4) {
+ curContext.uniform4iv(varLocation, varValue);
+ } else if (varValue.length === 3) {
+ curContext.uniform3iv(varLocation, varValue);
+ } else if (varValue.length === 2) {
+ curContext.uniform2iv(varLocation, varValue);
+ } else {
+ curContext.uniform1i(varLocation, varValue);
+ }
+ }
+ }
+
+ /**
+ * Sets the value of a uniform matrix variable in a program
+ * object. Before calling this function, ensure the correct
+ * program object has been installed as part of the current
+ * rendering state.
+ *
+ * On some systems, if the variable exists in the shader but
+ * isn't used, the compiler will optimize it out and this
+ * function will fail.
+ *
+ * @param {String} cacheId
+ * @param {WebGLProgram} programObj program object returned from
+ * createProgramObject
+ * @param {String} varName the name of the variable in the shader
+ * @param {boolean} transpose must be false
+ * @param {Array} matrix an array of 4, 9 or 16 values
+ *
+ * @returns none
+ *
+ * @see uniformi
+ * @see uniformf
+ */
+ function uniformMatrix(cacheId, programObj, varName, transpose, matrix) {
+ var varLocation = curContextCache.locations[cacheId];
+ if(varLocation === undef) {
+ varLocation = curContext.getUniformLocation(programObj, varName);
+ curContextCache.locations[cacheId] = varLocation;
+ }
+ // The variable won't be found if it was optimized out.
+ if (varLocation !== -1) {
+ if (matrix.length === 16) {
+ curContext.uniformMatrix4fv(varLocation, transpose, matrix);
+ } else if (matrix.length === 9) {
+ curContext.uniformMatrix3fv(varLocation, transpose, matrix);
+ } else {
+ curContext.uniformMatrix2fv(varLocation, transpose, matrix);
+ }
+ }
+ }
+
+ /**
+ * Binds the VBO, sets the vertex attribute data for the program
+ * object and enables the attribute.
+ *
+ * On some systems, if the attribute exists in the shader but
+ * isn't used, the compiler will optimize it out and this
+ * function will fail.
+ *
+ * @param {String} cacheId
+ * @param {WebGLProgram} programObj program object returned from
+ * createProgramObject
+ * @param {String} varName the name of the variable in the shader
+ * @param {int} size the number of components per vertex attribute
+ * @param {WebGLBuffer} VBO Vertex Buffer Object
+ *
+ * @returns none
+ *
+ * @see disableVertexAttribPointer
+ */
+ function vertexAttribPointer(cacheId, programObj, varName, size, VBO) {
+ var varLocation = curContextCache.attributes[cacheId];
+ if(varLocation === undef) {
+ varLocation = curContext.getAttribLocation(programObj, varName);
+ curContextCache.attributes[cacheId] = varLocation;
+ }
+ if (varLocation !== -1) {
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, VBO);
+ curContext.vertexAttribPointer(varLocation, size, curContext.FLOAT, false, 0, 0);
+ curContext.enableVertexAttribArray(varLocation);
+ }
+ }
+
+ /**
+ * Disables a program object attribute from being sent to WebGL.
+ *
+ * @param {String} cacheId
+ * @param {WebGLProgram} programObj program object returned from
+ * createProgramObject
+ * @param {String} varName name of the attribute
+ *
+ * @returns none
+ *
+ * @see vertexAttribPointer
+ */
+ function disableVertexAttribPointer(cacheId, programObj, varName){
+ var varLocation = curContextCache.attributes[cacheId];
+ if(varLocation === undef) {
+ varLocation = curContext.getAttribLocation(programObj, varName);
+ curContextCache.attributes[cacheId] = varLocation;
+ }
+ if (varLocation !== -1) {
+ curContext.disableVertexAttribArray(varLocation);
+ }
+ }
+
+ /**
+ * Creates a WebGL program object.
+ *
+ * @param {String} vetexShaderSource
+ * @param {String} fragmentShaderSource
+ *
+ * @returns {WebGLProgram} A program object
+ */
+ var createProgramObject = function(curContext, vetexShaderSource, fragmentShaderSource) {
+ var vertexShaderObject = curContext.createShader(curContext.VERTEX_SHADER);
+ curContext.shaderSource(vertexShaderObject, vetexShaderSource);
+ curContext.compileShader(vertexShaderObject);
+ if (!curContext.getShaderParameter(vertexShaderObject, curContext.COMPILE_STATUS)) {
+ throw curContext.getShaderInfoLog(vertexShaderObject);
+ }
+
+ var fragmentShaderObject = curContext.createShader(curContext.FRAGMENT_SHADER);
+ curContext.shaderSource(fragmentShaderObject, fragmentShaderSource);
+ curContext.compileShader(fragmentShaderObject);
+ if (!curContext.getShaderParameter(fragmentShaderObject, curContext.COMPILE_STATUS)) {
+ throw curContext.getShaderInfoLog(fragmentShaderObject);
+ }
+
+ var programObject = curContext.createProgram();
+ curContext.attachShader(programObject, vertexShaderObject);
+ curContext.attachShader(programObject, fragmentShaderObject);
+ curContext.linkProgram(programObject);
+ if (!curContext.getProgramParameter(programObject, curContext.LINK_STATUS)) {
+ throw "Error linking shaders.";
+ }
+
+ return programObject;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // 2D/3D drawing handling
+ ////////////////////////////////////////////////////////////////////////////
+ var imageModeCorner = function(x, y, w, h, whAreSizes) {
+ return {
+ x: x,
+ y: y,
+ w: w,
+ h: h
+ };
+ };
+ var imageModeConvert = imageModeCorner;
+
+ var imageModeCorners = function(x, y, w, h, whAreSizes) {
+ return {
+ x: x,
+ y: y,
+ w: whAreSizes ? w : w - x,
+ h: whAreSizes ? h : h - y
+ };
+ };
+
+ var imageModeCenter = function(x, y, w, h, whAreSizes) {
+ return {
+ x: x - w / 2,
+ y: y - h / 2,
+ w: w,
+ h: h
+ };
+ };
+
+ // Objects for shared, 2D and 3D contexts
+ var DrawingShared = function(){};
+ var Drawing2D = function(){};
+ var Drawing3D = function(){};
+ var DrawingPre = function(){};
+
+ // Setup the prototype chain
+ Drawing2D.prototype = new DrawingShared();
+ Drawing2D.prototype.constructor = Drawing2D;
+ Drawing3D.prototype = new DrawingShared();
+ Drawing3D.prototype.constructor = Drawing3D;
+ DrawingPre.prototype = new DrawingShared();
+ DrawingPre.prototype.constructor = DrawingPre;
+
+ // A no-op function for when the user calls 3D functions from a 2D sketch
+ // We can change this to a throw or console.error() later if we want
+ DrawingShared.prototype.a3DOnlyFunction = noop;
+
+ /**
+ * The shape() function displays shapes to the screen.
+ * Processing currently works with SVG shapes only.
+ * The <b>shape</b> parameter specifies the shape to display and the <b>x</b>
+ * and <b>y</b> parameters define the location of the shape from its
+ * upper-left corner.
+ * The shape is displayed at its original size unless the <b>width</b>
+ * and <b>height</b> parameters specify a different size.
+ * The <b>shapeMode()</b> function changes the way the parameters work.
+ * A call to <b>shapeMode(CORNERS)</b>, for example, will change the width
+ * and height parameters to define the x and y values of the opposite corner
+ * of the shape.
+ * <br><br>
+ * Note complex shapes may draw awkwardly with P2D, P3D, and OPENGL. Those
+ * renderers do not yet support shapes that have holes or complicated breaks.
+ *
+ * @param {PShape} shape the shape to display
+ * @param {int|float} x x-coordinate of the shape
+ * @param {int|float} y y-coordinate of the shape
+ * @param {int|float} width width to display the shape
+ * @param {int|float} height height to display the shape
+ *
+ * @see PShape
+ * @see loadShape()
+ * @see shapeMode()
+ */
+ p.shape = function(shape, x, y, width, height) {
+ if (arguments.length >= 1 && arguments[0] !== null) {
+ if (shape.isVisible()) {
+ p.pushMatrix();
+ if (curShapeMode === PConstants.CENTER) {
+ if (arguments.length === 5) {
+ p.translate(x - width/2, y - height/2);
+ p.scale(width / shape.getWidth(), height / shape.getHeight());
+ } else if (arguments.length === 3) {
+ p.translate(x - shape.getWidth()/2, - shape.getHeight()/2);
+ } else {
+ p.translate(-shape.getWidth()/2, -shape.getHeight()/2);
+ }
+ } else if (curShapeMode === PConstants.CORNER) {
+ if (arguments.length === 5) {
+ p.translate(x, y);
+ p.scale(width / shape.getWidth(), height / shape.getHeight());
+ } else if (arguments.length === 3) {
+ p.translate(x, y);
+ }
+ } else if (curShapeMode === PConstants.CORNERS) {
+ if (arguments.length === 5) {
+ width -= x;
+ height -= y;
+ p.translate(x, y);
+ p.scale(width / shape.getWidth(), height / shape.getHeight());
+ } else if (arguments.length === 3) {
+ p.translate(x, y);
+ }
+ }
+ shape.draw(p);
+ if ((arguments.length === 1 && curShapeMode === PConstants.CENTER ) || arguments.length > 1) {
+ p.popMatrix();
+ }
+ }
+ }
+ };
+
+ /**
+ * The shapeMode() function modifies the location from which shapes draw.
+ * The default mode is <b>shapeMode(CORNER)</b>, which specifies the
+ * location to be the upper left corner of the shape and uses the third
+ * and fourth parameters of <b>shape()</b> to specify the width and height.
+ * The syntax <b>shapeMode(CORNERS)</b> uses the first and second parameters
+ * of <b>shape()</b> to set the location of one corner and uses the third
+ * and fourth parameters to set the opposite corner.
+ * The syntax <b>shapeMode(CENTER)</b> draws the shape from its center point
+ * and uses the third and forth parameters of <b>shape()</b> to specify the
+ * width and height.
+ * The parameter must be written in "ALL CAPS" because Processing syntax
+ * is case sensitive.
+ *
+ * @param {int} mode One of CORNER, CORNERS, CENTER
+ *
+ * @see shape()
+ * @see rectMode()
+ */
+ p.shapeMode = function (mode) {
+ curShapeMode = mode;
+ };
+
+ /**
+ * The loadShape() function loads vector shapes into a variable of type PShape. Currently, only SVG files may be loaded.
+ * In most cases, <b>loadShape()</b> should be used inside <b>setup()</b> because loading shapes inside <b>draw()</b> will reduce the speed of a sketch.
+ *
+ * @param {String} filename an SVG file
+ *
+ * @return {PShape} a object of type PShape or null
+ * @see PShape
+ * @see PApplet#shape()
+ * @see PApplet#shapeMode()
+ */
+ p.loadShape = function (filename) {
+ if (arguments.length === 1) {
+ if (filename.indexOf(".svg") > -1) {
+ return new PShapeSVG(null, filename);
+ }
+ }
+ return null;
+ };
+
+ /**
+ * Processing 2.0 function for loading XML files.
+ *
+ * @param {String} uri The uri for the xml file to load.
+ *
+ * @return {XML} An XML object representing the xml data.
+ */
+ p.loadXML = function(uri) {
+ return new XML(p, uri);
+ };
+
+ /**
+ * Processing 2.0 function for creating XML elements from string
+ *
+ * @param {String} xml the XML source code
+ *
+ * @return {XML} An XML object representation of the input XML markup.
+ */
+ p.parseXML = function(xmlstring) {
+ var element = new XML();
+ element.parse(xmlstring);
+ return element;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // 2D Matrix
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Helper function for printMatrix(). Finds the largest scalar
+ * in the matrix, then number of digits left of the decimal.
+ * Call from PMatrix2D and PMatrix3D's print() function.
+ */
+ var printMatrixHelper = function(elements) {
+ var big = 0;
+ for (var i = 0; i < elements.length; i++) {
+ if (i !== 0) {
+ big = Math.max(big, Math.abs(elements[i]));
+ } else {
+ big = Math.abs(elements[i]);
+ }
+ }
+
+ var digits = (big + "").indexOf(".");
+ if (digits === 0) {
+ digits = 1;
+ } else if (digits === -1) {
+ digits = (big + "").length;
+ }
+
+ return digits;
+ };
+ /**
+ * PMatrix2D is a 3x2 affine matrix implementation. The constructor accepts another PMatrix2D or a list of six float elements.
+ * If no parameters are provided the matrix is set to the identity matrix.
+ *
+ * @param {PMatrix2D} matrix the initial matrix to set to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fifth element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ var PMatrix2D = p.PMatrix2D = function() {
+ if (arguments.length === 0) {
+ this.reset();
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ this.set(arguments[0].array());
+ } else if (arguments.length === 6) {
+ this.set(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
+ }
+ };
+ /**
+ * PMatrix2D methods
+ */
+ PMatrix2D.prototype = {
+ /**
+ * @member PMatrix2D
+ * The set() function sets the matrix elements. The function accepts either another PMatrix2D, an array of elements, or a list of six floats.
+ *
+ * @param {PMatrix2D} matrix the matrix to set this matrix to
+ * @param {float[]} elements an array of elements to set this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ set: function() {
+ if (arguments.length === 6) {
+ var a = arguments;
+ this.set([a[0], a[1], a[2],
+ a[3], a[4], a[5]]);
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ this.elements = arguments[0].array();
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ this.elements = arguments[0].slice();
+ }
+ },
+ /**
+ * @member PMatrix2D
+ * The get() function returns a copy of this PMatrix2D.
+ *
+ * @return {PMatrix2D} a copy of this PMatrix2D
+ */
+ get: function() {
+ var outgoing = new PMatrix2D();
+ outgoing.set(this.elements);
+ return outgoing;
+ },
+ /**
+ * @member PMatrix2D
+ * The reset() function sets this PMatrix2D to the identity matrix.
+ */
+ reset: function() {
+ this.set([1, 0, 0, 0, 1, 0]);
+ },
+ /**
+ * @member PMatrix2D
+ * The array() function returns a copy of the element values.
+ * @addon
+ *
+ * @return {float[]} returns a copy of the element values
+ */
+ array: function array() {
+ return this.elements.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The translate() function translates this matrix by moving the current coordinates to the location specified by tx and ty.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ */
+ translate: function(tx, ty) {
+ this.elements[2] = tx * this.elements[0] + ty * this.elements[1] + this.elements[2];
+ this.elements[5] = tx * this.elements[3] + ty * this.elements[4] + this.elements[5];
+ },
+ /**
+ * @member PMatrix2D
+ * The invTranslate() function translates this matrix by moving the current coordinates to the negative location specified by tx and ty.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ */
+ invTranslate: function(tx, ty) {
+ this.translate(-tx, -ty);
+ },
+ /**
+ * @member PMatrix2D
+ * The transpose() function is not used in processingjs.
+ */
+ transpose: function() {
+ // Does nothing in Processing.
+ },
+ /**
+ * @member PMatrix2D
+ * The mult() function multiplied this matrix.
+ * If two array elements are passed in the function will multiply a two element vector against this matrix.
+ * If target is null or not length four, a new float array will be returned.
+ * The values for vec and target can be the same (though that's less efficient).
+ * If two PVectors are passed in the function multiply the x and y coordinates of a PVector against this matrix.
+ *
+ * @param {PVector} source, target the PVectors used to multiply this matrix
+ * @param {float[]} source, target the arrays used to multiply this matrix
+ *
+ * @return {PVector|float[]} returns a PVector or an array representing the new matrix
+ */
+ mult: function(source, target) {
+ var x, y;
+ if (source instanceof PVector) {
+ x = source.x;
+ y = source.y;
+ if (!target) {
+ target = new PVector();
+ }
+ } else if (source instanceof Array) {
+ x = source[0];
+ y = source[1];
+ if (!target) {
+ target = [];
+ }
+ }
+ if (target instanceof Array) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2];
+ target[1] = this.elements[3] * x + this.elements[4] * y + this.elements[5];
+ } else if (target instanceof PVector) {
+ target.x = this.elements[0] * x + this.elements[1] * y + this.elements[2];
+ target.y = this.elements[3] * x + this.elements[4] * y + this.elements[5];
+ target.z = 0;
+ }
+ return target;
+ },
+ /**
+ * @member PMatrix2D
+ * The multX() function calculates the x component of a vector from a transformation.
+ *
+ * @param {float} x the x component of the vector being transformed
+ * @param {float} y the y component of the vector being transformed
+ *
+ * @return {float} returnes the result of the calculation
+ */
+ multX: function(x, y) {
+ return (x * this.elements[0] + y * this.elements[1] + this.elements[2]);
+ },
+ /**
+ * @member PMatrix2D
+ * The multY() function calculates the y component of a vector from a transformation.
+ *
+ * @param {float} x the x component of the vector being transformed
+ * @param {float} y the y component of the vector being transformed
+ *
+ * @return {float} returnes the result of the calculation
+ */
+ multY: function(x, y) {
+ return (x * this.elements[3] + y * this.elements[4] + this.elements[5]);
+ },
+ /**
+ * @member PMatrix2D
+ * The skewX() function skews the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewX: function(angle) {
+ this.apply(1, 0, 1, angle, 0, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The skewY() function skews the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewY: function(angle) {
+ this.apply(1, 0, 1, 0, angle, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The shearX() function shears the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ shearX: function(angle) {
+ this.apply(1, 0, 1, Math.tan(angle) , 0, 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The shearY() function shears the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ shearY: function(angle) {
+ this.apply(1, 0, 1, 0, Math.tan(angle), 0);
+ },
+ /**
+ * @member PMatrix2D
+ * The determinant() function calvculates the determinant of this matrix.
+ *
+ * @return {float} the determinant of the matrix
+ */
+ determinant: function() {
+ return (this.elements[0] * this.elements[4] - this.elements[1] * this.elements[3]);
+ },
+ /**
+ * @member PMatrix2D
+ * The invert() function inverts this matrix
+ *
+ * @return {boolean} true if successful
+ */
+ invert: function() {
+ var d = this.determinant();
+ if (Math.abs( d ) > PConstants.MIN_INT) {
+ var old00 = this.elements[0];
+ var old01 = this.elements[1];
+ var old02 = this.elements[2];
+ var old10 = this.elements[3];
+ var old11 = this.elements[4];
+ var old12 = this.elements[5];
+ this.elements[0] = old11 / d;
+ this.elements[3] = -old10 / d;
+ this.elements[1] = -old01 / d;
+ this.elements[4] = old00 / d;
+ this.elements[2] = (old01 * old12 - old11 * old02) / d;
+ this.elements[5] = (old10 * old02 - old00 * old12) / d;
+ return true;
+ }
+ return false;
+ },
+ /**
+ * @member PMatrix2D
+ * The scale() function increases or decreases the size of a shape by expanding and contracting vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a two parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ */
+ scale: function(sx, sy) {
+ if (sx && !sy) {
+ sy = sx;
+ }
+ if (sx && sy) {
+ this.elements[0] *= sx;
+ this.elements[1] *= sy;
+ this.elements[3] *= sx;
+ this.elements[4] *= sy;
+ }
+ },
+ /**
+ * @member PMatrix2D
+ * The invScale() function decreases or increases the size of a shape by contracting and expanding vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a two parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ */
+ invScale: function(sx, sy) {
+ if (sx && !sy) {
+ sy = sx;
+ }
+ this.scale(1 / sx, 1 / sy);
+ },
+ /**
+ * @member PMatrix2D
+ * The apply() function multiplies the current matrix by the one specified through the parameters. Note that either a PMatrix2D or a list of floats can be passed in.
+ *
+ * @param {PMatrix2D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ apply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 6) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, this.elements[2],
+ 0, 0, this.elements[5]];
+ var e = 0;
+ for (var row = 0; row < 2; row++) {
+ for (var col = 0; col < 3; col++, e++) {
+ result[e] += this.elements[row * 3 + 0] * source[col + 0] +
+ this.elements[row * 3 + 1] * source[col + 3];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The preApply() function applies another matrix to the left of this one. Note that either a PMatrix2D or elements of a matrix can be passed in.
+ *
+ * @param {PMatrix2D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the third element of the matrix
+ * @param {float} m10 the fourth element of the matrix
+ * @param {float} m11 the fith element of the matrix
+ * @param {float} m12 the sixth element of the matrix
+ */
+ preApply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix2D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 6) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+ var result = [0, 0, source[2],
+ 0, 0, source[5]];
+ result[2] = source[2] + this.elements[2] * source[0] + this.elements[5] * source[1];
+ result[5] = source[5] + this.elements[2] * source[3] + this.elements[5] * source[4];
+ result[0] = this.elements[0] * source[0] + this.elements[3] * source[1];
+ result[3] = this.elements[0] * source[3] + this.elements[3] * source[4];
+ result[1] = this.elements[1] * source[0] + this.elements[4] * source[1];
+ result[4] = this.elements[1] * source[3] + this.elements[4] * source[4];
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix2D
+ * The rotate() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotate: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ var temp1 = this.elements[0];
+ var temp2 = this.elements[1];
+ this.elements[0] = c * temp1 + s * temp2;
+ this.elements[1] = -s * temp1 + c * temp2;
+ temp1 = this.elements[3];
+ temp2 = this.elements[4];
+ this.elements[3] = c * temp1 + s * temp2;
+ this.elements[4] = -s * temp1 + c * temp2;
+ },
+ /**
+ * @member PMatrix2D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateZ: function(angle) {
+ this.rotate(angle);
+ },
+ /**
+ * @member PMatrix2D
+ * The invRotateZ() function rotates the matrix in opposite direction.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ invRotateZ: function(angle) {
+ this.rotateZ(angle - Math.PI);
+ },
+ /**
+ * @member PMatrix2D
+ * The print() function prints out the elements of this matrix
+ */
+ print: function() {
+ var digits = printMatrixHelper(this.elements);
+ var output = "" + p.nfs(this.elements[0], digits, 4) + " " +
+ p.nfs(this.elements[1], digits, 4) + " " +
+ p.nfs(this.elements[2], digits, 4) + "\n" +
+ p.nfs(this.elements[3], digits, 4) + " " +
+ p.nfs(this.elements[4], digits, 4) + " " +
+ p.nfs(this.elements[5], digits, 4) + "\n\n";
+ p.println(output);
+ }
+ };
+
+ /**
+ * PMatrix3D is a 4x4 matrix implementation. The constructor accepts another PMatrix3D or a list of six or sixteen float elements.
+ * If no parameters are provided the matrix is set to the identity matrix.
+ */
+ var PMatrix3D = p.PMatrix3D = function() {
+ // When a matrix is created, it is set to an identity matrix
+ this.reset();
+ };
+ /**
+ * PMatrix3D methods
+ */
+ PMatrix3D.prototype = {
+ /**
+ * @member PMatrix2D
+ * The set() function sets the matrix elements. The function accepts either another PMatrix3D, an array of elements, or a list of six or sixteen floats.
+ *
+ * @param {PMatrix3D} matrix the initial matrix to set to
+ * @param {float[]} elements an array of elements to set this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ set: function() {
+ if (arguments.length === 16) {
+ this.elements = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ this.elements = arguments[0].array();
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ this.elements = arguments[0].slice();
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The get() function returns a copy of this PMatrix3D.
+ *
+ * @return {PMatrix3D} a copy of this PMatrix3D
+ */
+ get: function() {
+ var outgoing = new PMatrix3D();
+ outgoing.set(this.elements);
+ return outgoing;
+ },
+ /**
+ * @member PMatrix3D
+ * The reset() function sets this PMatrix3D to the identity matrix.
+ */
+ reset: function() {
+ this.elements = [1,0,0,0,
+ 0,1,0,0,
+ 0,0,1,0,
+ 0,0,0,1];
+ },
+ /**
+ * @member PMatrix3D
+ * The array() function returns a copy of the element values.
+ * @addon
+ *
+ * @return {float[]} returns a copy of the element values
+ */
+ array: function array() {
+ return this.elements.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The translate() function translates this matrix by moving the current coordinates to the location specified by tx, ty, and tz.
+ *
+ * @param {float} tx the x-axis coordinate to move to
+ * @param {float} ty the y-axis coordinate to move to
+ * @param {float} tz the z-axis coordinate to move to
+ */
+ translate: function(tx, ty, tz) {
+ if (tz === undef) {
+ tz = 0;
+ }
+
+ this.elements[3] += tx * this.elements[0] + ty * this.elements[1] + tz * this.elements[2];
+ this.elements[7] += tx * this.elements[4] + ty * this.elements[5] + tz * this.elements[6];
+ this.elements[11] += tx * this.elements[8] + ty * this.elements[9] + tz * this.elements[10];
+ this.elements[15] += tx * this.elements[12] + ty * this.elements[13] + tz * this.elements[14];
+ },
+ /**
+ * @member PMatrix3D
+ * The transpose() function transpose this matrix.
+ */
+ transpose: function() {
+ var temp = this.elements[4];
+ this.elements[4] = this.elements[1];
+ this.elements[1] = temp;
+
+ temp = this.elements[8];
+ this.elements[8] = this.elements[2];
+ this.elements[2] = temp;
+
+ temp = this.elements[6];
+ this.elements[6] = this.elements[9];
+ this.elements[9] = temp;
+
+ temp = this.elements[3];
+ this.elements[3] = this.elements[12];
+ this.elements[12] = temp;
+
+ temp = this.elements[7];
+ this.elements[7] = this.elements[13];
+ this.elements[13] = temp;
+
+ temp = this.elements[11];
+ this.elements[11] = this.elements[14];
+ this.elements[14] = temp;
+ },
+ /**
+ * @member PMatrix3D
+ * The mult() function multiplied this matrix.
+ * If two array elements are passed in the function will multiply a two element vector against this matrix.
+ * If target is null or not length four, a new float array will be returned.
+ * The values for vec and target can be the same (though that's less efficient).
+ * If two PVectors are passed in the function multiply the x and y coordinates of a PVector against this matrix.
+ *
+ * @param {PVector} source, target the PVectors used to multiply this matrix
+ * @param {float[]} source, target the arrays used to multiply this matrix
+ *
+ * @return {PVector|float[]} returns a PVector or an array representing the new matrix
+ */
+ mult: function(source, target) {
+ var x, y, z, w;
+ if (source instanceof PVector) {
+ x = source.x;
+ y = source.y;
+ z = source.z;
+ w = 1;
+ if (!target) {
+ target = new PVector();
+ }
+ } else if (source instanceof Array) {
+ x = source[0];
+ y = source[1];
+ z = source[2];
+ w = source[3] || 1;
+
+ if ( !target || (target.length !== 3 && target.length !== 4) ) {
+ target = [0, 0, 0];
+ }
+ }
+
+ if (target instanceof Array) {
+ if (target.length === 3) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ target[1] = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ target[2] = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ } else if (target.length === 4) {
+ target[0] = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3] * w;
+ target[1] = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7] * w;
+ target[2] = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11] * w;
+ target[3] = this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15] * w;
+ }
+ }
+ if (target instanceof PVector) {
+ target.x = this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ target.y = this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ target.z = this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ }
+ return target;
+ },
+ /**
+ * @member PMatrix3D
+ * The preApply() function applies another matrix to the left of this one. Note that either a PMatrix3D or elements of a matrix can be passed in.
+ *
+ * @param {PMatrix3D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ preApply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 16) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0];
+ var e = 0;
+ for (var row = 0; row < 4; row++) {
+ for (var col = 0; col < 4; col++, e++) {
+ result[e] += this.elements[col + 0] * source[row * 4 + 0] + this.elements[col + 4] *
+ source[row * 4 + 1] + this.elements[col + 8] * source[row * 4 + 2] +
+ this.elements[col + 12] * source[row * 4 + 3];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The apply() function multiplies the current matrix by the one specified through the parameters. Note that either a PMatrix3D or a list of floats can be passed in.
+ *
+ * @param {PMatrix3D} matrix the matrix to apply this matrix to
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ */
+ apply: function() {
+ var source;
+ if (arguments.length === 1 && arguments[0] instanceof PMatrix3D) {
+ source = arguments[0].array();
+ } else if (arguments.length === 16) {
+ source = Array.prototype.slice.call(arguments);
+ } else if (arguments.length === 1 && arguments[0] instanceof Array) {
+ source = arguments[0];
+ }
+
+ var result = [0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0];
+ var e = 0;
+ for (var row = 0; row < 4; row++) {
+ for (var col = 0; col < 4; col++, e++) {
+ result[e] += this.elements[row * 4 + 0] * source[col + 0] + this.elements[row * 4 + 1] *
+ source[col + 4] + this.elements[row * 4 + 2] * source[col + 8] +
+ this.elements[row * 4 + 3] * source[col + 12];
+ }
+ }
+ this.elements = result.slice();
+ },
+ /**
+ * @member PMatrix3D
+ * The rotate() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotate: function(angle, v0, v1, v2) {
+ if (arguments.length < 4) {
+ this.rotateZ(angle);
+ } else {
+ var v = new PVector(v0, v1, v2);
+ var m = v.mag();
+ if (m === 0) {
+ return;
+ } else if (m != 1) {
+ v.normalize();
+ v0 = v.x;
+ v1 = v.y;
+ v2 = v.z;
+ }
+ var c = p.cos(angle);
+ var s = p.sin(angle);
+ var t = 1.0 - c;
+
+ this.apply((t * v0 * v0) + c,
+ (t * v0 * v1) - (s * v2),
+ (t * v0 * v2) + (s * v1),
+ 0,
+ (t * v0 * v1) + (s * v2),
+ (t * v1 * v1) + c,
+ (t * v1 * v2) - (s * v0),
+ 0,
+ (t * v0 * v2) - (s * v1),
+ (t * v1 * v2) + (s * v0),
+ (t * v2 * v2) + c,
+ 0,
+ 0, 0, 0, 1);
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The invApply() function applies the inverted matrix to this matrix.
+ *
+ * @param {float} m00 the first element of the matrix
+ * @param {float} m01 the second element of the matrix
+ * @param {float} m02 the third element of the matrix
+ * @param {float} m03 the fourth element of the matrix
+ * @param {float} m10 the fifth element of the matrix
+ * @param {float} m11 the sixth element of the matrix
+ * @param {float} m12 the seventh element of the matrix
+ * @param {float} m13 the eight element of the matrix
+ * @param {float} m20 the nineth element of the matrix
+ * @param {float} m21 the tenth element of the matrix
+ * @param {float} m22 the eleventh element of the matrix
+ * @param {float} m23 the twelveth element of the matrix
+ * @param {float} m30 the thirteenth element of the matrix
+ * @param {float} m31 the fourtheenth element of the matrix
+ * @param {float} m32 the fivetheenth element of the matrix
+ * @param {float} m33 the sixteenth element of the matrix
+ *
+ * @return {boolean} returns true if the operation was successful.
+ */
+ invApply: function() {
+ if (inverseCopy === undef) {
+ inverseCopy = new PMatrix3D();
+ }
+ var a = arguments;
+ inverseCopy.set(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8],
+ a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
+
+ if (!inverseCopy.invert()) {
+ return false;
+ }
+ this.preApply(inverseCopy);
+ return true;
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateX: function(angle) {
+ var c = p.cos(angle);
+ var s = p.sin(angle);
+ this.apply([1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateY() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateY: function(angle) {
+ var c = p.cos(angle);
+ var s = p.sin(angle);
+ this.apply([c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The rotateZ() function rotates the matrix.
+ *
+ * @param {float} angle the angle of rotation in radiants
+ */
+ rotateZ: function(angle) {
+ var c = Math.cos(angle);
+ var s = Math.sin(angle);
+ this.apply([c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
+ },
+ /**
+ * @member PMatrix3D
+ * The scale() function increases or decreases the size of a matrix by expanding and contracting vertices. When only one parameter is specified scale will occur in all dimensions.
+ * This is equivalent to a three parameter call.
+ *
+ * @param {float} sx the amount to scale on the x-axis
+ * @param {float} sy the amount to scale on the y-axis
+ * @param {float} sz the amount to scale on the z-axis
+ */
+ scale: function(sx, sy, sz) {
+ if (sx && !sy && !sz) {
+ sy = sz = sx;
+ } else if (sx && sy && !sz) {
+ sz = 1;
+ }
+
+ if (sx && sy && sz) {
+ this.elements[0] *= sx;
+ this.elements[1] *= sy;
+ this.elements[2] *= sz;
+ this.elements[4] *= sx;
+ this.elements[5] *= sy;
+ this.elements[6] *= sz;
+ this.elements[8] *= sx;
+ this.elements[9] *= sy;
+ this.elements[10] *= sz;
+ this.elements[12] *= sx;
+ this.elements[13] *= sy;
+ this.elements[14] *= sz;
+ }
+ },
+ /**
+ * @member PMatrix3D
+ * The skewX() function skews the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewX: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, t, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The skewY() function skews the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of skew specified in radians
+ */
+ skewY: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, 0, 0, 0, t, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The shearX() function shears the matrix along the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of shear specified in radians
+ */
+ shearX: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, t, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ /**
+ * @member PMatrix3D
+ * The shearY() function shears the matrix along the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians with the <b>radians()</b> function.
+ *
+ * @param {float} angle angle of shear specified in radians
+ */
+ shearY: function(angle) {
+ var t = Math.tan(angle);
+ this.apply(1, 0, 0, 0, t, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
+ },
+ multX: function(x, y, z, w) {
+ if (!z) {
+ return this.elements[0] * x + this.elements[1] * y + this.elements[3];
+ }
+ if (!w) {
+ return this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3];
+ }
+ return this.elements[0] * x + this.elements[1] * y + this.elements[2] * z + this.elements[3] * w;
+ },
+ multY: function(x, y, z, w) {
+ if (!z) {
+ return this.elements[4] * x + this.elements[5] * y + this.elements[7];
+ }
+ if (!w) {
+ return this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7];
+ }
+ return this.elements[4] * x + this.elements[5] * y + this.elements[6] * z + this.elements[7] * w;
+ },
+ multZ: function(x, y, z, w) {
+ if (!w) {
+ return this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11];
+ }
+ return this.elements[8] * x + this.elements[9] * y + this.elements[10] * z + this.elements[11] * w;
+ },
+ multW: function(x, y, z, w) {
+ if (!w) {
+ return this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15];
+ }
+ return this.elements[12] * x + this.elements[13] * y + this.elements[14] * z + this.elements[15] * w;
+ },
+ /**
+ * @member PMatrix3D
+ * The invert() function inverts this matrix
+ *
+ * @return {boolean} true if successful
+ */
+ invert: function() {
+ var fA0 = this.elements[0] * this.elements[5] - this.elements[1] * this.elements[4];
+ var fA1 = this.elements[0] * this.elements[6] - this.elements[2] * this.elements[4];
+ var fA2 = this.elements[0] * this.elements[7] - this.elements[3] * this.elements[4];
+ var fA3 = this.elements[1] * this.elements[6] - this.elements[2] * this.elements[5];
+ var fA4 = this.elements[1] * this.elements[7] - this.elements[3] * this.elements[5];
+ var fA5 = this.elements[2] * this.elements[7] - this.elements[3] * this.elements[6];
+ var fB0 = this.elements[8] * this.elements[13] - this.elements[9] * this.elements[12];
+ var fB1 = this.elements[8] * this.elements[14] - this.elements[10] * this.elements[12];
+ var fB2 = this.elements[8] * this.elements[15] - this.elements[11] * this.elements[12];
+ var fB3 = this.elements[9] * this.elements[14] - this.elements[10] * this.elements[13];
+ var fB4 = this.elements[9] * this.elements[15] - this.elements[11] * this.elements[13];
+ var fB5 = this.elements[10] * this.elements[15] - this.elements[11] * this.elements[14];
+
+ // Determinant
+ var fDet = fA0 * fB5 - fA1 * fB4 + fA2 * fB3 + fA3 * fB2 - fA4 * fB1 + fA5 * fB0;
+
+ // Account for a very small value
+ // return false if not successful.
+ if (Math.abs(fDet) <= 1e-9) {
+ return false;
+ }
+
+ var kInv = [];
+ kInv[0] = +this.elements[5] * fB5 - this.elements[6] * fB4 + this.elements[7] * fB3;
+ kInv[4] = -this.elements[4] * fB5 + this.elements[6] * fB2 - this.elements[7] * fB1;
+ kInv[8] = +this.elements[4] * fB4 - this.elements[5] * fB2 + this.elements[7] * fB0;
+ kInv[12] = -this.elements[4] * fB3 + this.elements[5] * fB1 - this.elements[6] * fB0;
+ kInv[1] = -this.elements[1] * fB5 + this.elements[2] * fB4 - this.elements[3] * fB3;
+ kInv[5] = +this.elements[0] * fB5 - this.elements[2] * fB2 + this.elements[3] * fB1;
+ kInv[9] = -this.elements[0] * fB4 + this.elements[1] * fB2 - this.elements[3] * fB0;
+ kInv[13] = +this.elements[0] * fB3 - this.elements[1] * fB1 + this.elements[2] * fB0;
+ kInv[2] = +this.elements[13] * fA5 - this.elements[14] * fA4 + this.elements[15] * fA3;
+ kInv[6] = -this.elements[12] * fA5 + this.elements[14] * fA2 - this.elements[15] * fA1;
+ kInv[10] = +this.elements[12] * fA4 - this.elements[13] * fA2 + this.elements[15] * fA0;
+ kInv[14] = -this.elements[12] * fA3 + this.elements[13] * fA1 - this.elements[14] * fA0;
+ kInv[3] = -this.elements[9] * fA5 + this.elements[10] * fA4 - this.elements[11] * fA3;
+ kInv[7] = +this.elements[8] * fA5 - this.elements[10] * fA2 + this.elements[11] * fA1;
+ kInv[11] = -this.elements[8] * fA4 + this.elements[9] * fA2 - this.elements[11] * fA0;
+ kInv[15] = +this.elements[8] * fA3 - this.elements[9] * fA1 + this.elements[10] * fA0;
+
+ // Inverse using Determinant
+ var fInvDet = 1.0 / fDet;
+ kInv[0] *= fInvDet;
+ kInv[1] *= fInvDet;
+ kInv[2] *= fInvDet;
+ kInv[3] *= fInvDet;
+ kInv[4] *= fInvDet;
+ kInv[5] *= fInvDet;
+ kInv[6] *= fInvDet;
+ kInv[7] *= fInvDet;
+ kInv[8] *= fInvDet;
+ kInv[9] *= fInvDet;
+ kInv[10] *= fInvDet;
+ kInv[11] *= fInvDet;
+ kInv[12] *= fInvDet;
+ kInv[13] *= fInvDet;
+ kInv[14] *= fInvDet;
+ kInv[15] *= fInvDet;
+
+ this.elements = kInv.slice();
+ return true;
+ },
+ toString: function() {
+ var str = "";
+ for (var i = 0; i < 15; i++) {
+ str += this.elements[i] + ", ";
+ }
+ str += this.elements[15];
+ return str;
+ },
+ /**
+ * @member PMatrix3D
+ * The print() function prints out the elements of this matrix
+ */
+ print: function() {
+ var digits = printMatrixHelper(this.elements);
+
+ var output = "" + p.nfs(this.elements[0], digits, 4) + " " + p.nfs(this.elements[1], digits, 4) +
+ " " + p.nfs(this.elements[2], digits, 4) + " " + p.nfs(this.elements[3], digits, 4) +
+ "\n" + p.nfs(this.elements[4], digits, 4) + " " + p.nfs(this.elements[5], digits, 4) +
+ " " + p.nfs(this.elements[6], digits, 4) + " " + p.nfs(this.elements[7], digits, 4) +
+ "\n" + p.nfs(this.elements[8], digits, 4) + " " + p.nfs(this.elements[9], digits, 4) +
+ " " + p.nfs(this.elements[10], digits, 4) + " " + p.nfs(this.elements[11], digits, 4) +
+ "\n" + p.nfs(this.elements[12], digits, 4) + " " + p.nfs(this.elements[13], digits, 4) +
+ " " + p.nfs(this.elements[14], digits, 4) + " " + p.nfs(this.elements[15], digits, 4) + "\n\n";
+ p.println(output);
+ },
+ invTranslate: function(tx, ty, tz) {
+ this.preApply(1, 0, 0, -tx, 0, 1, 0, -ty, 0, 0, 1, -tz, 0, 0, 0, 1);
+ },
+ invRotateX: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1]);
+ },
+ invRotateY: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1]);
+ },
+ invRotateZ: function(angle) {
+ var c = Math.cos(-angle);
+ var s = Math.sin(-angle);
+ this.preApply([c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
+ },
+ invScale: function(x, y, z) {
+ this.preApply([1 / x, 0, 0, 0, 0, 1 / y, 0, 0, 0, 0, 1 / z, 0, 0, 0, 0, 1]);
+ }
+ };
+
+ /**
+ * @private
+ * The matrix stack stores the transformations and translations that occur within the space.
+ */
+ var PMatrixStack = p.PMatrixStack = function() {
+ this.matrixStack = [];
+ };
+
+ /**
+ * @member PMatrixStack
+ * load pushes the matrix given in the function into the stack
+ *
+ * @param {Object | Array} matrix the matrix to be pushed into the stack
+ */
+ PMatrixStack.prototype.load = function() {
+ var tmpMatrix = drawing.$newPMatrix();
+
+ if (arguments.length === 1) {
+ tmpMatrix.set(arguments[0]);
+ } else {
+ tmpMatrix.set(arguments);
+ }
+ this.matrixStack.push(tmpMatrix);
+ };
+
+ Drawing2D.prototype.$newPMatrix = function() {
+ return new PMatrix2D();
+ };
+
+ Drawing3D.prototype.$newPMatrix = function() {
+ return new PMatrix3D();
+ };
+
+ /**
+ * @member PMatrixStack
+ * push adds a duplicate of the top of the stack onto the stack - uses the peek function
+ */
+ PMatrixStack.prototype.push = function() {
+ this.matrixStack.push(this.peek());
+ };
+
+ /**
+ * @member PMatrixStack
+ * pop removes returns the matrix at the top of the stack
+ *
+ * @returns {Object} the matrix at the top of the stack
+ */
+ PMatrixStack.prototype.pop = function() {
+ return this.matrixStack.pop();
+ };
+
+ /**
+ * @member PMatrixStack
+ * peek returns but doesn't remove the matrix at the top of the stack
+ *
+ * @returns {Object} the matrix at the top of the stack
+ */
+ PMatrixStack.prototype.peek = function() {
+ var tmpMatrix = drawing.$newPMatrix();
+
+ tmpMatrix.set(this.matrixStack[this.matrixStack.length - 1]);
+ return tmpMatrix;
+ };
+
+ /**
+ * @member PMatrixStack
+ * this function multiplies the matrix at the top of the stack with the matrix given as a parameter
+ *
+ * @param {Object | Array} matrix the matrix to be multiplied into the stack
+ */
+ PMatrixStack.prototype.mult = function(matrix) {
+ this.matrixStack[this.matrixStack.length - 1].apply(matrix);
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Array handling
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * The split() function breaks a string into pieces using a character or string
+ * as the divider. The delim parameter specifies the character or characters that
+ * mark the boundaries between each piece. A String[] array is returned that contains
+ * each of the pieces.
+ * If the result is a set of numbers, you can convert the String[] array to to a float[]
+ * or int[] array using the datatype conversion functions int() and float() (see example above).
+ * The splitTokens() function works in a similar fashion, except that it splits using a range
+ * of characters instead of a specific character or sequence.
+ *
+ * @param {String} str the String to be split
+ * @param {String} delim the character or String used to separate the data
+ *
+ * @returns {string[]} The new string array
+ *
+ * @see splitTokens
+ * @see join
+ * @see trim
+ */
+ p.split = function(str, delim) {
+ return str.split(delim);
+ };
+
+ /**
+ * The splitTokens() function splits a String at one or many character "tokens." The tokens
+ * parameter specifies the character or characters to be used as a boundary.
+ * If no tokens character is specified, any whitespace character is used to split.
+ * Whitespace characters include tab (\t), line feed (\n), carriage return (\r), form
+ * feed (\f), and space. To convert a String to an array of integers or floats, use the
+ * datatype conversion functions int() and float() to convert the array of Strings.
+ *
+ * @param {String} str the String to be split
+ * @param {Char[]} tokens list of individual characters that will be used as separators
+ *
+ * @returns {string[]} The new string array
+ *
+ * @see split
+ * @see join
+ * @see trim
+ */
+ p.splitTokens = function(str, tokens) {
+ if (tokens === undef) {
+ return str.split(/\s+/g);
+ }
+
+ var chars = tokens.split(/()/g),
+ buffer = "",
+ len = str.length,
+ i, c,
+ tokenized = [];
+
+ for (i = 0; i < len; i++) {
+ c = str[i];
+ if (chars.indexOf(c) > -1) {
+ if (buffer !== "") {
+ tokenized.push(buffer);
+ }
+ buffer = "";
+ } else {
+ buffer += c;
+ }
+ }
+
+ if (buffer !== "") {
+ tokenized.push(buffer);
+ }
+
+ return tokenized;
+ };
+
+ /**
+ * Expands an array by one element and adds data to the new position. The datatype of
+ * the element parameter must be the same as the datatype of the array.
+ * When using an array of objects, the data returned from the function must be cast to
+ * the object array's data type. For example: SomeClass[] items = (SomeClass[])
+ * append(originalArray, element).
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array boolean[],
+ * byte[], char[], int[], float[], or String[], or an array of objects
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} element new data for the array
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see shorten
+ * @see expand
+ */
+ p.append = function(array, element) {
+ array[array.length] = element;
+ return array;
+ };
+
+ /**
+ * Concatenates two arrays. For example, concatenating the array { 1, 2, 3 } and the
+ * array { 4, 5, 6 } yields { 1, 2, 3, 4, 5, 6 }. Both parameters must be arrays of the
+ * same datatype.
+ * When using an array of objects, the data returned from the function must be cast to the
+ * object array's data type. For example: SomeClass[] items = (SomeClass[]) concat(array1, array2).
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array1 boolean[],
+ * byte[], char[], int[], float[], String[], or an array of objects
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array2 boolean[],
+ * byte[], char[], int[], float[], String[], or an array of objects
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see splice
+ */
+ p.concat = function(array1, array2) {
+ return array1.concat(array2);
+ };
+
+ /**
+ * Sorts an array of numbers from smallest to largest and puts an array of
+ * words in alphabetical order. The original array is not modified, a
+ * re-ordered array is returned. The count parameter states the number of
+ * elements to sort. For example if there are 12 elements in an array and
+ * if count is the value 5, only the first five elements on the array will
+ * be sorted. Alphabetical ordering is case insensitive.
+ *
+ * @param {String[] | int[] | float[]} array Array of elements to sort
+ * @param {int} numElem Number of elements to sort
+ *
+ * @returns {String[] | int[] | float[]} Array (same datatype as the input)
+ *
+ * @see reverse
+ */
+ p.sort = function(array, numElem) {
+ var ret = [];
+
+ // depending on the type used (int, float) or string
+ // we'll need to use a different compare function
+ if (array.length > 0) {
+ // copy since we need to return another array
+ var elemsToCopy = numElem > 0 ? numElem : array.length;
+ for (var i = 0; i < elemsToCopy; i++) {
+ ret.push(array[i]);
+ }
+ if (typeof array[0] === "string") {
+ ret.sort();
+ }
+ // int or float
+ else {
+ ret.sort(function(a, b) {
+ return a - b;
+ });
+ }
+
+ // copy on the rest of the elements that were not sorted in case the user
+ // only wanted a subset of an array to be sorted.
+ if (numElem > 0) {
+ for (var j = ret.length; j < array.length; j++) {
+ ret.push(array[j]);
+ }
+ }
+ }
+ return ret;
+ };
+
+ /**
+ * Inserts a value or array of values into an existing array. The first two parameters must
+ * be of the same datatype. The array parameter defines the array which will be modified
+ * and the second parameter defines the data which will be inserted. When using an array
+ * of objects, the data returned from the function must be cast to the object array's data
+ * type. For example: SomeClass[] items = (SomeClass[]) splice(array1, array2, index).
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array boolean[],
+ * byte[], char[], int[], float[], String[], or an array of objects
+ * @param {boolean|byte|char|int|float|String|boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects}
+ * value boolean, byte, char, int, float, String, boolean[], byte[], char[], int[],
+ * float[], String[], or other Object: value or an array of objects to be spliced in
+ * @param {int} index position in the array from which to insert data
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see contract
+ * @see subset
+ */
+ p.splice = function(array, value, index) {
+
+ // Trying to splice an empty array into "array" in P5 won't do
+ // anything, just return the original.
+ if(value.length === 0)
+ {
+ return array;
+ }
+
+ // If the second argument was an array, we'll need to iterate over all
+ // the "value" elements and add one by one because
+ // array.splice(index, 0, value);
+ // would create a multi-dimensional array which isn't what we want.
+ if(value instanceof Array) {
+ for(var i = 0, j = index; i < value.length; j++,i++) {
+ array.splice(j, 0, value[i]);
+ }
+ } else {
+ array.splice(index, 0, value);
+ }
+
+ return array;
+ };
+
+ /**
+ * Extracts an array of elements from an existing array. The array parameter defines the
+ * array from which the elements will be copied and the offset and length parameters determine
+ * which elements to extract. If no length is given, elements will be extracted from the offset
+ * to the end of the array. When specifying the offset remember the first array element is 0.
+ * This function does not change the source array.
+ * When using an array of objects, the data returned from the function must be cast to the
+ * object array's data type.
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array boolean[],
+ * byte[], char[], int[], float[], String[], or an array of objects
+ * @param {int} offset position to begin
+ * @param {int} length number of values to extract
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see splice
+ */
+ p.subset = function(array, offset, length) {
+ var end = (length !== undef) ? offset + length : array.length;
+ return array.slice(offset, end);
+ };
+
+ /**
+ * Combines an array of Strings into one String, each separated by the character(s) used for
+ * the separator parameter. To join arrays of ints or floats, it's necessary to first convert
+ * them to strings using nf() or nfs().
+ *
+ * @param {Array} array array of Strings
+ * @param {char|String} separator char or String to be placed between each item
+ *
+ * @returns {String} The combined string
+ *
+ * @see split
+ * @see trim
+ * @see nf
+ * @see nfs
+ */
+ p.join = function(array, seperator) {
+ return array.join(seperator);
+ };
+
+ /**
+ * Decreases an array by one element and returns the shortened array. When using an
+ * array of objects, the data returned from the function must be cast to the object array's
+ * data type. For example: SomeClass[] items = (SomeClass[]) shorten(originalArray).
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} array
+ * boolean[], byte[], char[], int[], float[], or String[], or an array of objects
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see append
+ * @see expand
+ */
+ p.shorten = function(ary) {
+ var newary = [];
+
+ // copy array into new array
+ var len = ary.length;
+ for (var i = 0; i < len; i++) {
+ newary[i] = ary[i];
+ }
+ newary.pop();
+
+ return newary;
+ };
+
+ /**
+ * Increases the size of an array. By default, this function doubles the size of the array,
+ * but the optional newSize parameter provides precise control over the increase in size.
+ * When using an array of objects, the data returned from the function must be cast to the
+ * object array's data type. For example: SomeClass[] items = (SomeClass[]) expand(originalArray).
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]|array of objects} ary
+ * boolean[], byte[], char[], int[], float[], String[], or an array of objects
+ * @param {int} newSize positive int: new size for the array
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see contract
+ */
+ p.expand = function(ary, targetSize) {
+ var temp = ary.slice(0),
+ newSize = targetSize || ary.length * 2;
+ temp.length = newSize;
+ return temp;
+ };
+
+ /**
+ * Copies an array (or part of an array) to another array. The src array is copied to the
+ * dst array, beginning at the position specified by srcPos and into the position specified
+ * by dstPos. The number of elements to copy is determined by length. The simplified version
+ * with two arguments copies an entire array to another of the same size. It is equivalent
+ * to "arrayCopy(src, 0, dst, 0, src.length)". This function is far more efficient for copying
+ * array data than iterating through a for and copying each element.
+ *
+ * @param {Array} src an array of any data type: the source array
+ * @param {Array} dest an array of any data type (as long as it's the same as src): the destination array
+ * @param {int} srcPos starting position in the source array
+ * @param {int} destPos starting position in the destination array
+ * @param {int} length number of array elements to be copied
+ *
+ * @returns none
+ */
+ p.arrayCopy = function() { // src, srcPos, dest, destPos, length) {
+ var src, srcPos = 0, dest, destPos = 0, length;
+
+ if (arguments.length === 2) {
+ // recall itself and copy src to dest from start index 0 to 0 of src.length
+ src = arguments[0];
+ dest = arguments[1];
+ length = src.length;
+ } else if (arguments.length === 3) {
+ // recall itself and copy src to dest from start index 0 to 0 of length
+ src = arguments[0];
+ dest = arguments[1];
+ length = arguments[2];
+ } else if (arguments.length === 5) {
+ src = arguments[0];
+ srcPos = arguments[1];
+ dest = arguments[2];
+ destPos = arguments[3];
+ length = arguments[4];
+ }
+
+ // copy src to dest from index srcPos to index destPos of length recursivly on objects
+ for (var i = srcPos, j = destPos; i < length + srcPos; i++, j++) {
+ if (dest[j] !== undef) {
+ dest[j] = src[i];
+ } else {
+ throw "array index out of bounds exception";
+ }
+ }
+ };
+
+ /**
+ * Reverses the order of an array.
+ *
+ * @param {boolean[]|byte[]|char[]|int[]|float[]|String[]} array
+ * boolean[], byte[], char[], int[], float[], or String[]
+ *
+ * @returns Array (the same datatype as the input)
+ *
+ * @see sort
+ */
+ p.reverse = function(array) {
+ return array.reverse();
+ };
+
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Color functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ // helper functions for internal blending modes
+ p.mix = function(a, b, f) {
+ return a + (((b - a) * f) >> 8);
+ };
+
+ p.peg = function(n) {
+ return (n < 0) ? 0 : ((n > 255) ? 255 : n);
+ };
+
+ // blending modes
+ /**
+ * These are internal blending modes used for BlendColor()
+ *
+ * @param {Color} c1 First Color to blend
+ * @param {Color} c2 Second Color to blend
+ *
+ * @returns {Color} The blended Color
+ *
+ * @see BlendColor
+ * @see Blend
+ */
+ p.modes = (function() {
+ var ALPHA_MASK = PConstants.ALPHA_MASK,
+ RED_MASK = PConstants.RED_MASK,
+ GREEN_MASK = PConstants.GREEN_MASK,
+ BLUE_MASK = PConstants.BLUE_MASK,
+ min = Math.min,
+ max = Math.max;
+
+ function applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb) {
+ var a = min(((c1 & 0xff000000) >>> 24) + f, 0xff) << 24;
+
+ var r = (ar + (((cr - ar) * f) >> 8));
+ r = ((r < 0) ? 0 : ((r > 255) ? 255 : r)) << 16;
+
+ var g = (ag + (((cg - ag) * f) >> 8));
+ g = ((g < 0) ? 0 : ((g > 255) ? 255 : g)) << 8;
+
+ var b = ab + (((cb - ab) * f) >> 8);
+ b = (b < 0) ? 0 : ((b > 255) ? 255 : b);
+
+ return (a | r | g | b);
+ }
+
+ return {
+ replace: function(c1, c2) {
+ return c2;
+ },
+ blend: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK),
+ ag = (c1 & GREEN_MASK),
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK),
+ bg = (c2 & GREEN_MASK),
+ bb = (c2 & BLUE_MASK);
+
+ return (min(((c1 & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
+ (ar + (((br - ar) * f) >> 8)) & RED_MASK |
+ (ag + (((bg - ag) * f) >> 8)) & GREEN_MASK |
+ (ab + (((bb - ab) * f) >> 8)) & BLUE_MASK);
+ },
+ add: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24;
+ return (min(((c1 & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
+ min(((c1 & RED_MASK) + ((c2 & RED_MASK) >> 8) * f), RED_MASK) & RED_MASK |
+ min(((c1 & GREEN_MASK) + ((c2 & GREEN_MASK) >> 8) * f), GREEN_MASK) & GREEN_MASK |
+ min((c1 & BLUE_MASK) + (((c2 & BLUE_MASK) * f) >> 8), BLUE_MASK));
+ },
+ subtract: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24;
+ return (min(((c1 & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
+ max(((c1 & RED_MASK) - ((c2 & RED_MASK) >> 8) * f), GREEN_MASK) & RED_MASK |
+ max(((c1 & GREEN_MASK) - ((c2 & GREEN_MASK) >> 8) * f), BLUE_MASK) & GREEN_MASK |
+ max((c1 & BLUE_MASK) - (((c2 & BLUE_MASK) * f) >> 8), 0));
+ },
+ lightest: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24;
+ return (min(((c1 & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
+ max(c1 & RED_MASK, ((c2 & RED_MASK) >> 8) * f) & RED_MASK |
+ max(c1 & GREEN_MASK, ((c2 & GREEN_MASK) >> 8) * f) & GREEN_MASK |
+ max(c1 & BLUE_MASK, ((c2 & BLUE_MASK) * f) >> 8));
+ },
+ darkest: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK),
+ ag = (c1 & GREEN_MASK),
+ ab = (c1 & BLUE_MASK),
+ br = min(c1 & RED_MASK, ((c2 & RED_MASK) >> 8) * f),
+ bg = min(c1 & GREEN_MASK, ((c2 & GREEN_MASK) >> 8) * f),
+ bb = min(c1 & BLUE_MASK, ((c2 & BLUE_MASK) * f) >> 8);
+
+ return (min(((c1 & ALPHA_MASK) >>> 24) + f, 0xff) << 24 |
+ (ar + (((br - ar) * f) >> 8)) & RED_MASK |
+ (ag + (((bg - ag) * f) >> 8)) & GREEN_MASK |
+ (ab + (((bb - ab) * f) >> 8)) & BLUE_MASK);
+ },
+ difference: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = (ar > br) ? (ar - br) : (br - ar),
+ cg = (ag > bg) ? (ag - bg) : (bg - ag),
+ cb = (ab > bb) ? (ab - bb) : (bb - ab);
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ exclusion: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = ar + br - ((ar * br) >> 7),
+ cg = ag + bg - ((ag * bg) >> 7),
+ cb = ab + bb - ((ab * bb) >> 7);
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ multiply: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = (ar * br) >> 8,
+ cg = (ag * bg) >> 8,
+ cb = (ab * bb) >> 8;
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ screen: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = 255 - (((255 - ar) * (255 - br)) >> 8),
+ cg = 255 - (((255 - ag) * (255 - bg)) >> 8),
+ cb = 255 - (((255 - ab) * (255 - bb)) >> 8);
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ hard_light: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = (br < 128) ? ((ar * br) >> 7) : (255 - (((255 - ar) * (255 - br)) >> 7)),
+ cg = (bg < 128) ? ((ag * bg) >> 7) : (255 - (((255 - ag) * (255 - bg)) >> 7)),
+ cb = (bb < 128) ? ((ab * bb) >> 7) : (255 - (((255 - ab) * (255 - bb)) >> 7));
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ soft_light: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = ((ar * br) >> 7) + ((ar * ar) >> 8) - ((ar * ar * br) >> 15),
+ cg = ((ag * bg) >> 7) + ((ag * ag) >> 8) - ((ag * ag * bg) >> 15),
+ cb = ((ab * bb) >> 7) + ((ab * ab) >> 8) - ((ab * ab * bb) >> 15);
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ overlay: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK),
+ cr = (ar < 128) ? ((ar * br) >> 7) : (255 - (((255 - ar) * (255 - br)) >> 7)),
+ cg = (ag < 128) ? ((ag * bg) >> 7) : (255 - (((255 - ag) * (255 - bg)) >> 7)),
+ cb = (ab < 128) ? ((ab * bb) >> 7) : (255 - (((255 - ab) * (255 - bb)) >> 7));
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ dodge: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK);
+
+ var cr = 255;
+ if (br !== 255) {
+ cr = (ar << 8) / (255 - br);
+ cr = (cr < 0) ? 0 : ((cr > 255) ? 255 : cr);
+ }
+
+ var cg = 255;
+ if (bg !== 255) {
+ cg = (ag << 8) / (255 - bg);
+ cg = (cg < 0) ? 0 : ((cg > 255) ? 255 : cg);
+ }
+
+ var cb = 255;
+ if (bb !== 255) {
+ cb = (ab << 8) / (255 - bb);
+ cb = (cb < 0) ? 0 : ((cb > 255) ? 255 : cb);
+ }
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ },
+ burn: function(c1, c2) {
+ var f = (c2 & ALPHA_MASK) >>> 24,
+ ar = (c1 & RED_MASK) >> 16,
+ ag = (c1 & GREEN_MASK) >> 8,
+ ab = (c1 & BLUE_MASK),
+ br = (c2 & RED_MASK) >> 16,
+ bg = (c2 & GREEN_MASK) >> 8,
+ bb = (c2 & BLUE_MASK);
+
+ var cr = 0;
+ if (br !== 0) {
+ cr = ((255 - ar) << 8) / br;
+ cr = 255 - ((cr < 0) ? 0 : ((cr > 255) ? 255 : cr));
+ }
+
+ var cg = 0;
+ if (bg !== 0) {
+ cg = ((255 - ag) << 8) / bg;
+ cg = 255 - ((cg < 0) ? 0 : ((cg > 255) ? 255 : cg));
+ }
+
+ var cb = 0;
+ if (bb !== 0) {
+ cb = ((255 - ab) << 8) / bb;
+ cb = 255 - ((cb < 0) ? 0 : ((cb > 255) ? 255 : cb));
+ }
+
+ return applyMode(c1, f, ar, ag, ab, br, bg, bb, cr, cg, cb);
+ }
+ };
+ }());
+
+ function color$4(aValue1, aValue2, aValue3, aValue4) {
+ var r, g, b, a;
+
+ if (curColorMode === PConstants.HSB) {
+ var rgb = p.color.toRGB(aValue1, aValue2, aValue3);
+ r = rgb[0];
+ g = rgb[1];
+ b = rgb[2];
+ } else {
+ r = Math.round(255 * (aValue1 / colorModeX));
+ g = Math.round(255 * (aValue2 / colorModeY));
+ b = Math.round(255 * (aValue3 / colorModeZ));
+ }
+
+ a = Math.round(255 * (aValue4 / colorModeA));
+
+ // Limit values less than 0 and greater than 255
+ r = (r < 0) ? 0 : r;
+ g = (g < 0) ? 0 : g;
+ b = (b < 0) ? 0 : b;
+ a = (a < 0) ? 0 : a;
+ r = (r > 255) ? 255 : r;
+ g = (g > 255) ? 255 : g;
+ b = (b > 255) ? 255 : b;
+ a = (a > 255) ? 255 : a;
+
+ // Create color int
+ return (a << 24) & PConstants.ALPHA_MASK | (r << 16) & PConstants.RED_MASK | (g << 8) & PConstants.GREEN_MASK | b & PConstants.BLUE_MASK;
+ }
+
+ function color$2(aValue1, aValue2) {
+ var a;
+
+ // Color int and alpha
+ if (aValue1 & PConstants.ALPHA_MASK) {
+ a = Math.round(255 * (aValue2 / colorModeA));
+ // Limit values less than 0 and greater than 255
+ a = (a > 255) ? 255 : a;
+ a = (a < 0) ? 0 : a;
+
+ return aValue1 - (aValue1 & PConstants.ALPHA_MASK) + ((a << 24) & PConstants.ALPHA_MASK);
+ }
+ // Grayscale and alpha
+ if (curColorMode === PConstants.RGB) {
+ return color$4(aValue1, aValue1, aValue1, aValue2);
+ }
+ if (curColorMode === PConstants.HSB) {
+ return color$4(0, 0, (aValue1 / colorModeX) * colorModeZ, aValue2);
+ }
+ }
+
+ function color$1(aValue1) {
+ // Grayscale
+ if (aValue1 <= colorModeX && aValue1 >= 0) {
+ if (curColorMode === PConstants.RGB) {
+ return color$4(aValue1, aValue1, aValue1, colorModeA);
+ }
+ if (curColorMode === PConstants.HSB) {
+ return color$4(0, 0, (aValue1 / colorModeX) * colorModeZ, colorModeA);
+ }
+ }
+ // Color int
+ if (aValue1) {
+ if (aValue1 > 2147483647) {
+ // Java Overflow
+ aValue1 -= 4294967296;
+ }
+ return aValue1;
+ }
+ }
+
+ /**
+ * Creates colors for storing in variables of the color datatype. The parameters are
+ * interpreted as RGB or HSB values depending on the current colorMode(). The default
+ * mode is RGB values from 0 to 255 and therefore, the function call color(255, 204, 0)
+ * will return a bright yellow color. More about how colors are stored can be found in
+ * the reference for the color datatype.
+ *
+ * @param {int|float} aValue1 red or hue or grey values relative to the current color range.
+ * Also can be color value in hexadecimal notation (i.e. #FFCC00 or 0xFFFFCC00)
+ * @param {int|float} aValue2 green or saturation values relative to the current color range
+ * @param {int|float} aValue3 blue or brightness values relative to the current color range
+ * @param {int|float} aValue4 relative to current color range. Represents alpha
+ *
+ * @returns {color} the color
+ *
+ * @see colorMode
+ */
+ p.color = function(aValue1, aValue2, aValue3, aValue4) {
+
+ // 4 arguments: (R, G, B, A) or (H, S, B, A)
+ if (aValue1 !== undef && aValue2 !== undef && aValue3 !== undef && aValue4 !== undef) {
+ return color$4(aValue1, aValue2, aValue3, aValue4);
+ }
+
+ // 3 arguments: (R, G, B) or (H, S, B)
+ if (aValue1 !== undef && aValue2 !== undef && aValue3 !== undef) {
+ return color$4(aValue1, aValue2, aValue3, colorModeA);
+ }
+
+ // 2 arguments: (Color, A) or (Grayscale, A)
+ if (aValue1 !== undef && aValue2 !== undef) {
+ return color$2(aValue1, aValue2);
+ }
+
+ // 1 argument: (Grayscale) or (Color)
+ if (typeof aValue1 === "number") {
+ return color$1(aValue1);
+ }
+
+ // Default
+ return color$4(colorModeX, colorModeY, colorModeZ, colorModeA);
+ };
+
+ // Ease of use function to extract the colour bits into a string
+ p.color.toString = function(colorInt) {
+ return "rgba(" + ((colorInt & PConstants.RED_MASK) >>> 16) + "," + ((colorInt & PConstants.GREEN_MASK) >>> 8) +
+ "," + ((colorInt & PConstants.BLUE_MASK)) + "," + ((colorInt & PConstants.ALPHA_MASK) >>> 24) / 255 + ")";
+ };
+
+ // Easy of use function to pack rgba values into a single bit-shifted color int.
+ p.color.toInt = function(r, g, b, a) {
+ return (a << 24) & PConstants.ALPHA_MASK | (r << 16) & PConstants.RED_MASK | (g << 8) & PConstants.GREEN_MASK | b & PConstants.BLUE_MASK;
+ };
+
+ // Creates a simple array in [R, G, B, A] format, [255, 255, 255, 255]
+ p.color.toArray = function(colorInt) {
+ return [(colorInt & PConstants.RED_MASK) >>> 16, (colorInt & PConstants.GREEN_MASK) >>> 8,
+ colorInt & PConstants.BLUE_MASK, (colorInt & PConstants.ALPHA_MASK) >>> 24];
+ };
+
+ // Creates a WebGL color array in [R, G, B, A] format. WebGL wants the color ranges between 0 and 1, [1, 1, 1, 1]
+ p.color.toGLArray = function(colorInt) {
+ return [((colorInt & PConstants.RED_MASK) >>> 16) / 255, ((colorInt & PConstants.GREEN_MASK) >>> 8) / 255,
+ (colorInt & PConstants.BLUE_MASK) / 255, ((colorInt & PConstants.ALPHA_MASK) >>> 24) / 255];
+ };
+
+ // HSB conversion function from Mootools, MIT Licensed
+ p.color.toRGB = function(h, s, b) {
+ // Limit values greater than range
+ h = (h > colorModeX) ? colorModeX : h;
+ s = (s > colorModeY) ? colorModeY : s;
+ b = (b > colorModeZ) ? colorModeZ : b;
+
+ h = (h / colorModeX) * 360;
+ s = (s / colorModeY) * 100;
+ b = (b / colorModeZ) * 100;
+
+ var br = Math.round(b / 100 * 255);
+
+ if (s === 0) { // Grayscale
+ return [br, br, br];
+ }
+ var hue = h % 360;
+ var f = hue % 60;
+ var p = Math.round((b * (100 - s)) / 10000 * 255);
+ var q = Math.round((b * (6000 - s * f)) / 600000 * 255);
+ var t = Math.round((b * (6000 - s * (60 - f))) / 600000 * 255);
+ switch (Math.floor(hue / 60)) {
+ case 0:
+ return [br, t, p];
+ case 1:
+ return [q, br, p];
+ case 2:
+ return [p, br, t];
+ case 3:
+ return [p, q, br];
+ case 4:
+ return [t, p, br];
+ case 5:
+ return [br, p, q];
+ }
+ };
+
+ function colorToHSB(colorInt) {
+ var red, green, blue;
+
+ red = ((colorInt & PConstants.RED_MASK) >>> 16) / 255;
+ green = ((colorInt & PConstants.GREEN_MASK) >>> 8) / 255;
+ blue = (colorInt & PConstants.BLUE_MASK) / 255;
+
+ var max = p.max(p.max(red,green), blue),
+ min = p.min(p.min(red,green), blue),
+ hue, saturation;
+
+ if (min === max) {
+ return [0, 0, max*colorModeZ];
+ }
+ saturation = (max - min) / max;
+
+ if (red === max) {
+ hue = (green - blue) / (max - min);
+ } else if (green === max) {
+ hue = 2 + ((blue - red) / (max - min));
+ } else {
+ hue = 4 + ((red - green) / (max - min));
+ }
+
+ hue /= 6;
+
+ if (hue < 0) {
+ hue += 1;
+ } else if (hue > 1) {
+ hue -= 1;
+ }
+ return [hue*colorModeX, saturation*colorModeY, max*colorModeZ];
+ }
+
+ /**
+ * Extracts the brightness value from a color.
+ *
+ * @param {color} colInt any value of the color datatype
+ *
+ * @returns {float} The brightness color value.
+ *
+ * @see red
+ * @see green
+ * @see blue
+ * @see hue
+ * @see saturation
+ */
+ p.brightness = function(colInt){
+ return colorToHSB(colInt)[2];
+ };
+
+ /**
+ * Extracts the saturation value from a color.
+ *
+ * @param {color} colInt any value of the color datatype
+ *
+ * @returns {float} The saturation color value.
+ *
+ * @see red
+ * @see green
+ * @see blue
+ * @see hue
+ * @see brightness
+ */
+ p.saturation = function(colInt){
+ return colorToHSB(colInt)[1];
+ };
+
+ /**
+ * Extracts the hue value from a color.
+ *
+ * @param {color} colInt any value of the color datatype
+ *
+ * @returns {float} The hue color value.
+ *
+ * @see red
+ * @see green
+ * @see blue
+ * @see saturation
+ * @see brightness
+ */
+ p.hue = function(colInt){
+ return colorToHSB(colInt)[0];
+ };
+
+ /**
+ * Extracts the red value from a color, scaled to match current colorMode().
+ * This value is always returned as a float so be careful not to assign it to an int value.
+ *
+ * @param {color} aColor any value of the color datatype
+ *
+ * @returns {float} The red color value.
+ *
+ * @see green
+ * @see blue
+ * @see alpha
+ * @see >> right shift
+ * @see hue
+ * @see saturation
+ * @see brightness
+ */
+ p.red = function(aColor) {
+ return ((aColor & PConstants.RED_MASK) >>> 16) / 255 * colorModeX;
+ };
+
+ /**
+ * Extracts the green value from a color, scaled to match current colorMode().
+ * This value is always returned as a float so be careful not to assign it to an int value.
+ *
+ * @param {color} aColor any value of the color datatype
+ *
+ * @returns {float} The green color value.
+ *
+ * @see red
+ * @see blue
+ * @see alpha
+ * @see >> right shift
+ * @see hue
+ * @see saturation
+ * @see brightness
+ */
+ p.green = function(aColor) {
+ return ((aColor & PConstants.GREEN_MASK) >>> 8) / 255 * colorModeY;
+ };
+
+ /**
+ * Extracts the blue value from a color, scaled to match current colorMode().
+ * This value is always returned as a float so be careful not to assign it to an int value.
+ *
+ * @param {color} aColor any value of the color datatype
+ *
+ * @returns {float} The blue color value.
+ *
+ * @see red
+ * @see green
+ * @see alpha
+ * @see >> right shift
+ * @see hue
+ * @see saturation
+ * @see brightness
+ */
+ p.blue = function(aColor) {
+ return (aColor & PConstants.BLUE_MASK) / 255 * colorModeZ;
+ };
+
+ /**
+ * Extracts the alpha value from a color, scaled to match current colorMode().
+ * This value is always returned as a float so be careful not to assign it to an int value.
+ *
+ * @param {color} aColor any value of the color datatype
+ *
+ * @returns {float} The alpha color value.
+ *
+ * @see red
+ * @see green
+ * @see blue
+ * @see >> right shift
+ * @see hue
+ * @see saturation
+ * @see brightness
+ */
+ p.alpha = function(aColor) {
+ return ((aColor & PConstants.ALPHA_MASK) >>> 24) / 255 * colorModeA;
+ };
+
+ /**
+ * Calculates a color or colors between two colors at a specific increment.
+ * The amt parameter is the amount to interpolate between the two values where 0.0
+ * equal to the first point, 0.1 is very near the first point, 0.5 is half-way in between, etc.
+ *
+ * @param {color} c1 interpolate from this color
+ * @param {color} c2 interpolate to this color
+ * @param {float} amt between 0.0 and 1.0
+ *
+ * @returns {float} The blended color.
+ *
+ * @see blendColor
+ * @see color
+ */
+ p.lerpColor = function(c1, c2, amt) {
+ var r, g, b, a, r1, g1, b1, a1, r2, g2, b2, a2;
+ var hsb1, hsb2, rgb, h, s;
+ var colorBits1 = p.color(c1);
+ var colorBits2 = p.color(c2);
+
+ if (curColorMode === PConstants.HSB) {
+ // Special processing for HSB mode.
+ // Get HSB and Alpha values for Color 1 and 2
+ hsb1 = colorToHSB(colorBits1);
+ a1 = ((colorBits1 & PConstants.ALPHA_MASK) >>> 24) / colorModeA;
+ hsb2 = colorToHSB(colorBits2);
+ a2 = ((colorBits2 & PConstants.ALPHA_MASK) >>> 24) / colorModeA;
+
+ // Return lerp value for each channel, for HSB components
+ h = p.lerp(hsb1[0], hsb2[0], amt);
+ s = p.lerp(hsb1[1], hsb2[1], amt);
+ b = p.lerp(hsb1[2], hsb2[2], amt);
+ rgb = p.color.toRGB(h, s, b);
+ // ... and for Alpha-range
+ a = (p.lerp(a1, a2, amt) * colorModeA + 0.5) | 0;
+
+ return (a << 24) & PConstants.ALPHA_MASK |
+ (rgb[0] << 16) & PConstants.RED_MASK |
+ (rgb[1] << 8) & PConstants.GREEN_MASK |
+ rgb[2] & PConstants.BLUE_MASK;
+ }
+
+ // Get RGBA values for Color 1 to floats
+ r1 = (colorBits1 & PConstants.RED_MASK) >>> 16;
+ g1 = (colorBits1 & PConstants.GREEN_MASK) >>> 8;
+ b1 = (colorBits1 & PConstants.BLUE_MASK);
+ a1 = ((colorBits1 & PConstants.ALPHA_MASK) >>> 24) / colorModeA;
+
+ // Get RGBA values for Color 2 to floats
+ r2 = (colorBits2 & PConstants.RED_MASK) >>> 16;
+ g2 = (colorBits2 & PConstants.GREEN_MASK) >>> 8;
+ b2 = (colorBits2 & PConstants.BLUE_MASK);
+ a2 = ((colorBits2 & PConstants.ALPHA_MASK) >>> 24) / colorModeA;
+
+ // Return lerp value for each channel, INT for color, Float for Alpha-range
+ r = (p.lerp(r1, r2, amt) + 0.5) | 0;
+ g = (p.lerp(g1, g2, amt) + 0.5) | 0;
+ b = (p.lerp(b1, b2, amt) + 0.5) | 0;
+ a = (p.lerp(a1, a2, amt) * colorModeA + 0.5) | 0;
+
+ return (a << 24) & PConstants.ALPHA_MASK |
+ (r << 16) & PConstants.RED_MASK |
+ (g << 8) & PConstants.GREEN_MASK |
+ b & PConstants.BLUE_MASK;
+ };
+
+ /**
+ * Changes the way Processing interprets color data. By default, fill(), stroke(), and background()
+ * colors are set by values between 0 and 255 using the RGB color model. It is possible to change the
+ * numerical range used for specifying colors and to switch color systems. For example, calling colorMode(RGB, 1.0)
+ * will specify that values are specified between 0 and 1. The limits for defining colors are altered by setting the
+ * parameters range1, range2, range3, and range 4.
+ *
+ * @param {MODE} mode Either RGB or HSB, corresponding to Red/Green/Blue and Hue/Saturation/Brightness
+ * @param {int|float} range range for all color elements
+ * @param {int|float} range1 range for the red or hue depending on the current color mode
+ * @param {int|float} range2 range for the green or saturation depending on the current color mode
+ * @param {int|float} range3 range for the blue or brightness depending on the current color mode
+ * @param {int|float} range4 range for the alpha
+ *
+ * @returns none
+ *
+ * @see background
+ * @see fill
+ * @see stroke
+ */
+ p.colorMode = function() { // mode, range1, range2, range3, range4
+ curColorMode = arguments[0];
+ if (arguments.length > 1) {
+ colorModeX = arguments[1];
+ colorModeY = arguments[2] || arguments[1];
+ colorModeZ = arguments[3] || arguments[1];
+ colorModeA = arguments[4] || arguments[1];
+ }
+ };
+
+ /**
+ * Blends two color values together based on the blending mode given as the MODE parameter.
+ * The possible modes are described in the reference for the blend() function.
+ *
+ * @param {color} c1 color: the first color to blend
+ * @param {color} c2 color: the second color to blend
+ * @param {MODE} MODE Either BLEND, ADD, SUBTRACT, DARKEST, LIGHTEST, DIFFERENCE, EXCLUSION, MULTIPLY,
+ * SCREEN, OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, or BURN
+ *
+ * @returns {float} The blended color.
+ *
+ * @see blend
+ * @see color
+ */
+ p.blendColor = function(c1, c2, mode) {
+ if (mode === PConstants.REPLACE) {
+ return p.modes.replace(c1, c2);
+ } else if (mode === PConstants.BLEND) {
+ return p.modes.blend(c1, c2);
+ } else if (mode === PConstants.ADD) {
+ return p.modes.add(c1, c2);
+ } else if (mode === PConstants.SUBTRACT) {
+ return p.modes.subtract(c1, c2);
+ } else if (mode === PConstants.LIGHTEST) {
+ return p.modes.lightest(c1, c2);
+ } else if (mode === PConstants.DARKEST) {
+ return p.modes.darkest(c1, c2);
+ } else if (mode === PConstants.DIFFERENCE) {
+ return p.modes.difference(c1, c2);
+ } else if (mode === PConstants.EXCLUSION) {
+ return p.modes.exclusion(c1, c2);
+ } else if (mode === PConstants.MULTIPLY) {
+ return p.modes.multiply(c1, c2);
+ } else if (mode === PConstants.SCREEN) {
+ return p.modes.screen(c1, c2);
+ } else if (mode === PConstants.HARD_LIGHT) {
+ return p.modes.hard_light(c1, c2);
+ } else if (mode === PConstants.SOFT_LIGHT) {
+ return p.modes.soft_light(c1, c2);
+ } else if (mode === PConstants.OVERLAY) {
+ return p.modes.overlay(c1, c2);
+ } else if (mode === PConstants.DODGE) {
+ return p.modes.dodge(c1, c2);
+ } else if (mode === PConstants.BURN) {
+ return p.modes.burn(c1, c2);
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Canvas-Matrix manipulation
+ ////////////////////////////////////////////////////////////////////////////
+
+ function saveContext() {
+ curContext.save();
+ }
+
+ function restoreContext() {
+ curContext.restore();
+ isStrokeDirty = true;
+ isFillDirty = true;
+ }
+
+ /**
+ * Prints the current matrix to the text window.
+ *
+ * @returns none
+ *
+ * @see pushMatrix
+ * @see popMatrix
+ * @see resetMatrix
+ * @see applyMatrix
+ */
+ p.printMatrix = function() {
+ modelView.print();
+ };
+
+ /**
+ * Specifies an amount to displace objects within the display window. The x parameter specifies left/right translation,
+ * the y parameter specifies up/down translation, and the z parameter specifies translations toward/away from the screen.
+ * Using this function with the z parameter requires using the P3D or OPENGL parameter in combination with size as shown
+ * in the above example. Transformations apply to everything that happens after and subsequent calls to the function
+ * accumulates the effect. For example, calling translate(50, 0) and then translate(20, 0) is the same as translate(70, 0).
+ * If translate() is called within draw(), the transformation is reset when the loop begins again.
+ * This function can be further controlled by the pushMatrix() and popMatrix().
+ *
+ * @param {int|float} x left/right translation
+ * @param {int|float} y up/down translation
+ * @param {int|float} z forward/back translation
+ *
+ * @returns none
+ *
+ * @see pushMatrix
+ * @see popMatrix
+ * @see scale
+ * @see rotate
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ */
+ Drawing2D.prototype.translate = function(x, y) {
+ modelView.translate(x, y);
+ modelViewInv.invTranslate(x, y);
+ curContext.translate(x, y);
+ };
+
+ Drawing3D.prototype.translate = function(x, y, z) {
+ modelView.translate(x, y, z);
+ modelViewInv.invTranslate(x, y, z);
+ };
+
+ /**
+ * Increases or decreases the size of a shape by expanding and contracting vertices. Objects always scale from their
+ * relative origin to the coordinate system. Scale values are specified as decimal percentages. For example, the
+ * function call scale(2.0) increases the dimension of a shape by 200%. Transformations apply to everything that
+ * happens after and subsequent calls to the function multiply the effect. For example, calling scale(2.0) and
+ * then scale(1.5) is the same as scale(3.0). If scale() is called within draw(), the transformation is reset when
+ * the loop begins again. Using this fuction with the z parameter requires passing P3D or OPENGL into the size()
+ * parameter as shown in the example above. This function can be further controlled by pushMatrix() and popMatrix().
+ *
+ * @param {int|float} size percentage to scale the object
+ * @param {int|float} x percentage to scale the object in the x-axis
+ * @param {int|float} y percentage to scale the object in the y-axis
+ * @param {int|float} z percentage to scale the object in the z-axis
+ *
+ * @returns none
+ *
+ * @see pushMatrix
+ * @see popMatrix
+ * @see translate
+ * @see rotate
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ */
+ Drawing2D.prototype.scale = function(x, y) {
+ modelView.scale(x, y);
+ modelViewInv.invScale(x, y);
+ curContext.scale(x, y || x);
+ };
+
+ Drawing3D.prototype.scale = function(x, y, z) {
+ modelView.scale(x, y, z);
+ modelViewInv.invScale(x, y, z);
+ };
+
+
+ /**
+ * helper function for applying a transfrom matrix to a 2D context.
+ */
+ Drawing2D.prototype.transform = function(pmatrix) {
+ var e = pmatrix.array();
+ curContext.transform(e[0],e[3],e[1],e[4],e[2],e[5]);
+ };
+
+ /**
+ * helper function for applying a transfrom matrix to a 3D context.
+ * not currently implemented.
+ */
+ Drawing3D.prototype.transformm = function(pmatrix3d) {
+ throw("p.transform is currently not supported in 3D mode");
+ };
+
+
+ /**
+ * Pushes the current transformation matrix onto the matrix stack. Understanding pushMatrix() and popMatrix()
+ * requires understanding the concept of a matrix stack. The pushMatrix() function saves the current coordinate
+ * system to the stack and popMatrix() restores the prior coordinate system. pushMatrix() and popMatrix() are
+ * used in conjuction with the other transformation methods and may be embedded to control the scope of
+ * the transformations.
+ *
+ * @returns none
+ *
+ * @see popMatrix
+ * @see translate
+ * @see rotate
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ */
+ Drawing2D.prototype.pushMatrix = function() {
+ userMatrixStack.load(modelView);
+ userReverseMatrixStack.load(modelViewInv);
+ saveContext();
+ };
+
+ Drawing3D.prototype.pushMatrix = function() {
+ userMatrixStack.load(modelView);
+ userReverseMatrixStack.load(modelViewInv);
+ };
+
+ /**
+ * Pops the current transformation matrix off the matrix stack. Understanding pushing and popping requires
+ * understanding the concept of a matrix stack. The pushMatrix() function saves the current coordinate system to
+ * the stack and popMatrix() restores the prior coordinate system. pushMatrix() and popMatrix() are used in
+ * conjuction with the other transformation methods and may be embedded to control the scope of the transformations.
+ *
+ * @returns none
+ *
+ * @see popMatrix
+ * @see pushMatrix
+ */
+ Drawing2D.prototype.popMatrix = function() {
+ modelView.set(userMatrixStack.pop());
+ modelViewInv.set(userReverseMatrixStack.pop());
+ restoreContext();
+ };
+
+ Drawing3D.prototype.popMatrix = function() {
+ modelView.set(userMatrixStack.pop());
+ modelViewInv.set(userReverseMatrixStack.pop());
+ };
+
+ /**
+ * Replaces the current matrix with the identity matrix. The equivalent function in OpenGL is glLoadIdentity().
+ *
+ * @returns none
+ *
+ * @see popMatrix
+ * @see pushMatrix
+ * @see applyMatrix
+ * @see printMatrix
+ */
+ Drawing2D.prototype.resetMatrix = function() {
+ modelView.reset();
+ modelViewInv.reset();
+ curContext.setTransform(1,0,0,1,0,0);
+ };
+
+ Drawing3D.prototype.resetMatrix = function() {
+ modelView.reset();
+ modelViewInv.reset();
+ };
+
+ /**
+ * Multiplies the current matrix by the one specified through the parameters. This is very slow because it will
+ * try to calculate the inverse of the transform, so avoid it whenever possible. The equivalent function
+ * in OpenGL is glMultMatrix().
+ *
+ * @param {int|float} n00-n15 numbers which define the 4x4 matrix to be multiplied
+ *
+ * @returns none
+ *
+ * @see popMatrix
+ * @see pushMatrix
+ * @see resetMatrix
+ * @see printMatrix
+ */
+ DrawingShared.prototype.applyMatrix = function() {
+ var a = arguments;
+ modelView.apply(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
+ modelViewInv.invApply(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
+ };
+
+ Drawing2D.prototype.applyMatrix = function() {
+ var a = arguments;
+ for (var cnt = a.length; cnt < 16; cnt++) {
+ a[cnt] = 0;
+ }
+ a[10] = a[15] = 1;
+ DrawingShared.prototype.applyMatrix.apply(this, a);
+ };
+
+ /**
+ * Rotates a shape around the x-axis the amount specified by the angle parameter. Angles should be
+ * specified in radians (values from 0 to PI*2) or converted to radians with the radians() function.
+ * Objects are always rotated around their relative position to the origin and positive numbers
+ * rotate objects in a counterclockwise direction. Transformations apply to everything that happens
+ * after and subsequent calls to the function accumulates the effect. For example, calling rotateX(PI/2)
+ * and then rotateX(PI/2) is the same as rotateX(PI). If rotateX() is called within the draw(), the
+ * transformation is reset when the loop begins again. This function requires passing P3D or OPENGL
+ * into the size() parameter as shown in the example above.
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateY
+ * @see rotateZ
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ */
+ p.rotateX = function(angleInRadians) {
+ modelView.rotateX(angleInRadians);
+ modelViewInv.invRotateX(angleInRadians);
+ };
+
+ /**
+ * Rotates a shape around the z-axis the amount specified by the angle parameter. Angles should be
+ * specified in radians (values from 0 to PI*2) or converted to radians with the radians() function.
+ * Objects are always rotated around their relative position to the origin and positive numbers
+ * rotate objects in a counterclockwise direction. Transformations apply to everything that happens
+ * after and subsequent calls to the function accumulates the effect. For example, calling rotateZ(PI/2)
+ * and then rotateZ(PI/2) is the same as rotateZ(PI). If rotateZ() is called within the draw(), the
+ * transformation is reset when the loop begins again. This function requires passing P3D or OPENGL
+ * into the size() parameter as shown in the example above.
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateX
+ * @see rotateY
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ */
+ Drawing2D.prototype.rotateZ = function() {
+ throw "rotateZ() is not supported in 2D mode. Use rotate(float) instead.";
+ };
+
+ Drawing3D.prototype.rotateZ = function(angleInRadians) {
+ modelView.rotateZ(angleInRadians);
+ modelViewInv.invRotateZ(angleInRadians);
+ };
+
+ /**
+ * Rotates a shape around the y-axis the amount specified by the angle parameter. Angles should be
+ * specified in radians (values from 0 to PI*2) or converted to radians with the radians() function.
+ * Objects are always rotated around their relative position to the origin and positive numbers
+ * rotate objects in a counterclockwise direction. Transformations apply to everything that happens
+ * after and subsequent calls to the function accumulates the effect. For example, calling rotateY(PI/2)
+ * and then rotateY(PI/2) is the same as rotateY(PI). If rotateY() is called within the draw(), the
+ * transformation is reset when the loop begins again. This function requires passing P3D or OPENGL
+ * into the size() parameter as shown in the example above.
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateX
+ * @see rotateZ
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ */
+ p.rotateY = function(angleInRadians) {
+ modelView.rotateY(angleInRadians);
+ modelViewInv.invRotateY(angleInRadians);
+ };
+
+ /**
+ * Rotates a shape the amount specified by the angle parameter. Angles should be specified in radians
+ * (values from 0 to TWO_PI) or converted to radians with the radians() function. Objects are always
+ * rotated around their relative position to the origin and positive numbers rotate objects in a
+ * clockwise direction. Transformations apply to everything that happens after and subsequent calls
+ * to the function accumulates the effect. For example, calling rotate(HALF_PI) and then rotate(HALF_PI)
+ * is the same as rotate(PI). All tranformations are reset when draw() begins again. Technically,
+ * rotate() multiplies the current transformation matrix by a rotation matrix. This function can be
+ * further controlled by the pushMatrix() and popMatrix().
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ */
+ Drawing2D.prototype.rotate = function(angleInRadians) {
+ modelView.rotateZ(angleInRadians);
+ modelViewInv.invRotateZ(angleInRadians);
+ curContext.rotate(angleInRadians);
+ };
+
+ Drawing3D.prototype.rotate = function(angleInRadians) {
+ if (arguments.length < 4) {
+ p.rotateZ(angleInRadians);
+ } else {
+ modelView.rotate(angleInRadians, arguments[1], arguments[2], arguments[3]);
+ modelViewInv.rotate((-angleInRadians), arguments[1], arguments[2], arguments[3]);
+ }
+ };
+
+ /**
+ * Shears a shape around the x-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to radians
+ * with the radians() function. Objects are always sheared around their relative position
+ * to the origin and positive numbers shear objects in a clockwise direction. Transformations
+ * apply to everything that happens after and subsequent calls to the function accumulates the
+ * effect. For example, calling shearX(PI/2) and then shearX(PI/2) is the same as shearX(PI)
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ */
+
+ Drawing2D.prototype.shearX = function(angleInRadians) {
+ modelView.shearX(angleInRadians);
+ curContext.transform(1,0,angleInRadians,1,0,0);
+ };
+
+ Drawing3D.prototype.shearX = function(angleInRadians) {
+ modelView.shearX(angleInRadians);
+ };
+
+ /**
+ * Shears a shape around the y-axis the amount specified by the angle parameter.
+ * Angles should be specified in radians (values from 0 to PI*2) or converted to
+ * radians with the radians() function. Objects are always sheared around their
+ * relative position to the origin and positive numbers shear objects in a
+ * clockwise direction. Transformations apply to everything that happens after
+ * and subsequent calls to the function accumulates the effect. For example,
+ * calling shearY(PI/2) and then shearY(PI/2) is the same as shearY(PI).
+ *
+ * @param {int|float} angleInRadians angle of rotation specified in radians
+ *
+ * @returns none
+ *
+ * @see rotateX
+ * @see rotateY
+ * @see rotateZ
+ * @see rotate
+ * @see translate
+ * @see scale
+ * @see popMatrix
+ * @see pushMatrix
+ * @see shearX
+ */
+
+ Drawing2D.prototype.shearY = function(angleInRadians) {
+ modelView.shearY(angleInRadians);
+ curContext.transform(1,angleInRadians,0,1,0,0);
+ };
+
+ Drawing3D.prototype.shearY = function(angleInRadians) {
+ modelView.shearY(angleInRadians);
+ };
+
+ /**
+ * The pushStyle() function saves the current style settings and popStyle() restores the prior settings.
+ * Note that these functions are always used together. They allow you to change the style settings and later
+ * return to what you had. When a new style is started with pushStyle(), it builds on the current style information.
+ * The pushStyle() and popStyle() functions can be embedded to provide more control (see the second example
+ * above for a demonstration.)
+ * The style information controlled by the following functions are included in the style: fill(), stroke(), tint(),
+ * strokeWeight(), strokeCap(), strokeJoin(), imageMode(), rectMode(), ellipseMode(), shapeMode(), colorMode(),
+ * textAlign(), textFont(), textMode(), textSize(), textLeading(), emissive(), specular(), shininess(), ambient()
+ *
+ * @returns none
+ *
+ * @see popStyle
+ */
+ p.pushStyle = function() {
+ // Save the canvas state.
+ saveContext();
+
+ p.pushMatrix();
+
+ var newState = {
+ 'doFill': doFill,
+ 'currentFillColor': currentFillColor,
+ 'doStroke': doStroke,
+ 'currentStrokeColor': currentStrokeColor,
+ 'curTint': curTint,
+ 'curRectMode': curRectMode,
+ 'curColorMode': curColorMode,
+ 'colorModeX': colorModeX,
+ 'colorModeZ': colorModeZ,
+ 'colorModeY': colorModeY,
+ 'colorModeA': colorModeA,
+ 'curTextFont': curTextFont,
+ 'horizontalTextAlignment': horizontalTextAlignment,
+ 'verticalTextAlignment': verticalTextAlignment,
+ 'textMode': textMode,
+ 'curFontName': curFontName,
+ 'curTextSize': curTextSize,
+ 'curTextAscent': curTextAscent,
+ 'curTextDescent': curTextDescent,
+ 'curTextLeading': curTextLeading
+ };
+
+ styleArray.push(newState);
+ };
+
+ /**
+ * The pushStyle() function saves the current style settings and popStyle() restores the prior settings; these
+ * functions are always used together. They allow you to change the style settings and later return to what you had.
+ * When a new style is started with pushStyle(), it builds on the current style information. The pushStyle() and
+ * popStyle() functions can be embedded to provide more control (see the second example above for a demonstration.)
+ *
+ * @returns none
+ *
+ * @see pushStyle
+ */
+ p.popStyle = function() {
+ var oldState = styleArray.pop();
+
+ if (oldState) {
+ restoreContext();
+
+ p.popMatrix();
+
+ doFill = oldState.doFill;
+ currentFillColor = oldState.currentFillColor;
+ doStroke = oldState.doStroke;
+ currentStrokeColor = oldState.currentStrokeColor;
+ curTint = oldState.curTint;
+ curRectMode = oldState.curRectMode;
+ curColorMode = oldState.curColorMode;
+ colorModeX = oldState.colorModeX;
+ colorModeZ = oldState.colorModeZ;
+ colorModeY = oldState.colorModeY;
+ colorModeA = oldState.colorModeA;
+ curTextFont = oldState.curTextFont;
+ curFontName = oldState.curFontName;
+ curTextSize = oldState.curTextSize;
+ horizontalTextAlignment = oldState.horizontalTextAlignment;
+ verticalTextAlignment = oldState.verticalTextAlignment;
+ textMode = oldState.textMode;
+ curTextAscent = oldState.curTextAscent;
+ curTextDescent = oldState.curTextDescent;
+ curTextLeading = oldState.curTextLeading;
+ } else {
+ throw "Too many popStyle() without enough pushStyle()";
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Time based functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Processing communicates with the clock on your computer.
+ * The year() function returns the current year as an integer (2003, 2004, 2005, etc).
+ *
+ * @returns {float} The current year.
+ *
+ * @see millis
+ * @see second
+ * @see minute
+ * @see hour
+ * @see day
+ * @see month
+ */
+ p.year = function() {
+ return new Date().getFullYear();
+ };
+ /**
+ * Processing communicates with the clock on your computer.
+ * The month() function returns the current month as a value from 1 - 12.
+ *
+ * @returns {float} The current month.
+ *
+ * @see millis
+ * @see second
+ * @see minute
+ * @see hour
+ * @see day
+ * @see year
+ */
+ p.month = function() {
+ return new Date().getMonth() + 1;
+ };
+ /**
+ * Processing communicates with the clock on your computer.
+ * The day() function returns the current day as a value from 1 - 31.
+ *
+ * @returns {float} The current day.
+ *
+ * @see millis
+ * @see second
+ * @see minute
+ * @see hour
+ * @see month
+ * @see year
+ */
+ p.day = function() {
+ return new Date().getDate();
+ };
+ /**
+ * Processing communicates with the clock on your computer.
+ * The hour() function returns the current hour as a value from 0 - 23.
+ *
+ * @returns {float} The current hour.
+ *
+ * @see millis
+ * @see second
+ * @see minute
+ * @see month
+ * @see day
+ * @see year
+ */
+ p.hour = function() {
+ return new Date().getHours();
+ };
+ /**
+ * Processing communicates with the clock on your computer.
+ * The minute() function returns the current minute as a value from 0 - 59.
+ *
+ * @returns {float} The current minute.
+ *
+ * @see millis
+ * @see second
+ * @see month
+ * @see hour
+ * @see day
+ * @see year
+ */
+ p.minute = function() {
+ return new Date().getMinutes();
+ };
+ /**
+ * Processing communicates with the clock on your computer.
+ * The second() function returns the current second as a value from 0 - 59.
+ *
+ * @returns {float} The current minute.
+ *
+ * @see millis
+ * @see month
+ * @see minute
+ * @see hour
+ * @see day
+ * @see year
+ */
+ p.second = function() {
+ return new Date().getSeconds();
+ };
+ /**
+ * Returns the number of milliseconds (thousandths of a second) since starting a sketch.
+ * This information is often used for timing animation sequences.
+ *
+ * @returns {long} The number of milliseconds since starting the sketch.
+ *
+ * @see month
+ * @see second
+ * @see minute
+ * @see hour
+ * @see day
+ * @see year
+ */
+ p.millis = function() {
+ return Date.now() - start;
+ };
+
+ /**
+ * Executes the code within draw() one time. This functions allows the program to update
+ * the display window only when necessary, for example when an event registered by
+ * mousePressed() or keyPressed() occurs.
+ * In structuring a program, it only makes sense to call redraw() within events such as
+ * mousePressed(). This is because redraw() does not run draw() immediately (it only sets
+ * a flag that indicates an update is needed).
+ * Calling redraw() within draw() has no effect because draw() is continuously called anyway.
+ *
+ * @returns none
+ *
+ * @see noLoop
+ * @see loop
+ */
+ function redrawHelper() {
+ var sec = (Date.now() - timeSinceLastFPS) / 1000;
+ framesSinceLastFPS++;
+ var fps = framesSinceLastFPS / sec;
+
+ // recalculate FPS every half second for better accuracy.
+ if (sec > 0.5) {
+ timeSinceLastFPS = Date.now();
+ framesSinceLastFPS = 0;
+ p.__frameRate = fps;
+ }
+
+ p.frameCount++;
+ }
+
+ Drawing2D.prototype.redraw = function() {
+ redrawHelper();
+
+ curContext.lineWidth = lineWidth;
+ var pmouseXLastEvent = p.pmouseX,
+ pmouseYLastEvent = p.pmouseY;
+ p.pmouseX = pmouseXLastFrame;
+ p.pmouseY = pmouseYLastFrame;
+
+ saveContext();
+ p.draw();
+ restoreContext();
+
+ pmouseXLastFrame = p.mouseX;
+ pmouseYLastFrame = p.mouseY;
+ p.pmouseX = pmouseXLastEvent;
+ p.pmouseY = pmouseYLastEvent;
+ };
+
+ Drawing3D.prototype.redraw = function() {
+ redrawHelper();
+
+ var pmouseXLastEvent = p.pmouseX,
+ pmouseYLastEvent = p.pmouseY;
+ p.pmouseX = pmouseXLastFrame;
+ p.pmouseY = pmouseYLastFrame;
+ // even if the color buffer isn't cleared with background(),
+ // the depth buffer needs to be cleared regardless.
+ curContext.clear(curContext.DEPTH_BUFFER_BIT);
+ curContextCache = { attributes: {}, locations: {} };
+ // Delete all the lighting states and the materials the
+ // user set in the last draw() call.
+ p.noLights();
+ p.lightFalloff(1, 0, 0);
+ p.shininess(1);
+ p.ambient(255, 255, 255);
+ p.specular(0, 0, 0);
+ p.emissive(0, 0, 0);
+ p.camera();
+ p.draw();
+
+ pmouseXLastFrame = p.mouseX;
+ pmouseYLastFrame = p.mouseY;
+ p.pmouseX = pmouseXLastEvent;
+ p.pmouseY = pmouseYLastEvent;
+ };
+
+ /**
+ * Stops Processing from continuously executing the code within draw(). If loop() is
+ * called, the code in draw() begin to run continuously again. If using noLoop() in
+ * setup(), it should be the last line inside the block.
+ * When noLoop() is used, it's not possible to manipulate or access the screen inside event
+ * handling functions such as mousePressed() or keyPressed(). Instead, use those functions
+ * to call redraw() or loop(), which will run draw(), which can update the screen properly.
+ * This means that when noLoop() has been called, no drawing can happen, and functions like
+ * saveFrame() or loadPixels() may not be used.
+ * Note that if the sketch is resized, redraw() will be called to update the sketch, even
+ * after noLoop() has been specified. Otherwise, the sketch would enter an odd state until
+ * loop() was called.
+ *
+ * @returns none
+ *
+ * @see redraw
+ * @see draw
+ * @see loop
+ */
+ p.noLoop = function() {
+ doLoop = false;
+ loopStarted = false;
+ clearInterval(looping);
+ curSketch.onPause();
+ };
+
+ /**
+ * Causes Processing to continuously execute the code within draw(). If noLoop() is called,
+ * the code in draw() stops executing.
+ *
+ * @returns none
+ *
+ * @see noLoop
+ */
+ p.loop = function() {
+ if (loopStarted) {
+ return;
+ }
+
+ timeSinceLastFPS = Date.now();
+ framesSinceLastFPS = 0;
+
+ looping = window.setInterval(function() {
+ try {
+ curSketch.onFrameStart();
+ p.redraw();
+ curSketch.onFrameEnd();
+ } catch(e_loop) {
+ window.clearInterval(looping);
+ throw e_loop;
+ }
+ }, curMsPerFrame);
+ doLoop = true;
+ loopStarted = true;
+ curSketch.onLoop();
+ };
+
+ /**
+ * Specifies the number of frames to be displayed every second. If the processor is not
+ * fast enough to maintain the specified rate, it will not be achieved. For example, the
+ * function call frameRate(30) will attempt to refresh 30 times a second. It is recommended
+ * to set the frame rate within setup(). The default rate is 60 frames per second.
+ *
+ * @param {int} aRate number of frames per second.
+ *
+ * @returns none
+ *
+ * @see delay
+ */
+ p.frameRate = function(aRate) {
+ curFrameRate = aRate;
+ curMsPerFrame = 1000 / curFrameRate;
+
+ // clear and reset interval
+ if (doLoop) {
+ p.noLoop();
+ p.loop();
+ }
+ };
+
+ /**
+ * Quits/stops/exits the program.
+ * Rather than terminating immediately, exit() will cause the sketch to exit after draw()
+ * has completed (or after setup() completes if called during the setup() method).
+ *
+ * @returns none
+ */
+ p.exit = function() {
+ // cleanup
+ window.clearInterval(looping);
+ removeInstance(p.externals.canvas.id);
+ delete(curElement.onmousedown);
+
+ // Step through the libraries to detach them
+ for (var lib in Processing.lib) {
+ if (Processing.lib.hasOwnProperty(lib)) {
+ if (Processing.lib[lib].hasOwnProperty("detach")) {
+ Processing.lib[lib].detach(p);
+ }
+ }
+ }
+
+ // clean up all event handling
+ var i = eventHandlers.length;
+ while (i--) {
+ detachEventHandler(eventHandlers[i]);
+ }
+ curSketch.onExit();
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // MISC functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sets the cursor to a predefined symbol, an image, or turns it on if already hidden.
+ * If you are trying to set an image as the cursor, it is recommended to make the size
+ * 16x16 or 32x32 pixels. It is not possible to load an image as the cursor if you are
+ * exporting your program for the Web. The values for parameters x and y must be less
+ * than the dimensions of the image.
+ *
+ * @param {MODE} MODE either ARROW, CROSS, HAND, MOVE, TEXT, WAIT
+ * @param {PImage} image any variable of type PImage
+ * @param {int} x the horizonal active spot of the cursor
+ * @param {int} y the vertical active spot of the cursor
+ *
+ * @returns none
+ *
+ * @see noCursor
+ */
+ p.cursor = function() {
+ if (arguments.length > 1 || (arguments.length === 1 && arguments[0] instanceof p.PImage)) {
+ var image = arguments[0],
+ x, y;
+ if (arguments.length >= 3) {
+ x = arguments[1];
+ y = arguments[2];
+ if (x < 0 || y < 0 || y >= image.height || x >= image.width) {
+ throw "x and y must be non-negative and less than the dimensions of the image";
+ }
+ } else {
+ x = image.width >>> 1;
+ y = image.height >>> 1;
+ }
+
+ // see https://developer.mozilla.org/en/Using_URL_values_for_the_cursor_property
+ var imageDataURL = image.toDataURL();
+ var style = "url(\"" + imageDataURL + "\") " + x + " " + y + ", default";
+ curCursor = curElement.style.cursor = style;
+ } else if (arguments.length === 1) {
+ var mode = arguments[0];
+ curCursor = curElement.style.cursor = mode;
+ } else {
+ curCursor = curElement.style.cursor = oldCursor;
+ }
+ };
+
+ /**
+ * Hides the cursor from view.
+ *
+ * @returns none
+ *
+ * @see cursor
+ */
+ p.noCursor = function() {
+ curCursor = curElement.style.cursor = PConstants.NOCURSOR;
+ };
+
+ /**
+ * Links to a webpage either in the same window or in a new window. The complete URL
+ * must be specified.
+ *
+ * @param {String} href complete url as a String in quotes
+ * @param {String} target name of the window to load the URL as a string in quotes
+ *
+ * @returns none
+ */
+ p.link = function(href, target) {
+ if (target !== undef) {
+ window.open(href, target);
+ } else {
+ window.location = href;
+ }
+ };
+
+ // PGraphics methods
+ // These functions exist only for compatibility with P5
+ p.beginDraw = noop;
+ p.endDraw = noop;
+
+ /**
+ * This function takes content from a canvas and turns it into an ImageData object to be used with a PImage
+ *
+ * @returns {ImageData} ImageData object to attach to a PImage (1D array of pixel data)
+ *
+ * @see PImage
+ */
+ Drawing2D.prototype.toImageData = function(x, y, w, h) {
+ x = x !== undef ? x : 0;
+ y = y !== undef ? y : 0;
+ w = w !== undef ? w : p.width;
+ h = h !== undef ? h : p.height;
+ return curContext.getImageData(x, y, w, h);
+ };
+
+ Drawing3D.prototype.toImageData = function(x, y, w, h) {
+ x = x !== undef ? x : 0;
+ y = y !== undef ? y : 0;
+ w = w !== undef ? w : p.width;
+ h = h !== undef ? h : p.height;
+ var c = document.createElement("canvas"),
+ ctx = c.getContext("2d"),
+ obj = ctx.createImageData(w, h),
+ uBuff = new Uint8Array(w * h * 4);
+ curContext.readPixels(x, y, w, h, curContext.RGBA, curContext.UNSIGNED_BYTE, uBuff);
+ for (var i=0, ul=uBuff.length, obj_data=obj.data; i < ul; i++) {
+ obj_data[i] = uBuff[(h - 1 - Math.floor(i / 4 / w)) * w * 4 + (i % (w * 4))];
+ }
+ return obj;
+ };
+
+ /**
+ * Displays message in the browser's status area. This is the text area in the lower
+ * left corner of the browser. The status() function will only work when the
+ * Processing program is running in a web browser.
+ *
+ * @param {String} text any valid String
+ *
+ * @returns none
+ */
+ p.status = function(text) {
+ window.status = text;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Binary Functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Converts a byte, char, int, or color to a String containing the equivalent binary
+ * notation. For example color(0, 102, 153, 255) will convert to the String
+ * "11111111000000000110011010011001". This function can help make your geeky debugging
+ * sessions much happier.
+ *
+ * @param {byte|char|int|color} num byte, char, int, color: value to convert
+ * @param {int} numBits number of digits to return
+ *
+ * @returns {String}
+ *
+ * @see unhex
+ * @see hex
+ * @see unbinary
+ */
+ p.binary = function(num, numBits) {
+ var bit;
+ if (numBits > 0) {
+ bit = numBits;
+ } else if(num instanceof Char) {
+ bit = 16;
+ num |= 0; // making it int
+ } else {
+ // autodetect, skipping zeros
+ bit = 32;
+ while (bit > 1 && !((num >>> (bit - 1)) & 1)) {
+ bit--;
+ }
+ }
+ var result = "";
+ while (bit > 0) {
+ result += ((num >>> (--bit)) & 1) ? "1" : "0";
+ }
+ return result;
+ };
+
+ /**
+ * Converts a String representation of a binary number to its equivalent integer value.
+ * For example, unbinary("00001000") will return 8.
+ *
+ * @param {String} binaryString String
+ *
+ * @returns {Int}
+ *
+ * @see hex
+ * @see binary
+ * @see unbinary
+ */
+ p.unbinary = function(binaryString) {
+ var i = binaryString.length - 1, mask = 1, result = 0;
+ while (i >= 0) {
+ var ch = binaryString[i--];
+ if (ch !== '0' && ch !== '1') {
+ throw "the value passed into unbinary was not an 8 bit binary number";
+ }
+ if (ch === '1') {
+ result += mask;
+ }
+ mask <<= 1;
+ }
+ return result;
+ };
+
+ var decimalToHex = function(d, padding) {
+ //if there is no padding value added, default padding to 8 else go into while statement.
+ padding = (padding === undef || padding === null) ? padding = 8 : padding;
+ if (d < 0) {
+ d = 0xFFFFFFFF + d + 1;
+ }
+ var hex = Number(d).toString(16).toUpperCase();
+ while (hex.length < padding) {
+ hex = "0" + hex;
+ }
+ if (hex.length >= padding) {
+ hex = hex.substring(hex.length - padding, hex.length);
+ }
+ return hex;
+ };
+
+ // note: since we cannot keep track of byte, int types by default the returned string is 8 chars long
+ // if no 2nd argument is passed. closest compromise we can use to match java implementation Feb 5 2010
+ // also the char parser has issues with chars that are not digits or letters IE: !@#$%^&*
+ /**
+ * Converts a byte, char, int, or color to a String containing the equivalent hexadecimal notation.
+ * For example color(0, 102, 153, 255) will convert to the String "FF006699". This function can help
+ * make your geeky debugging sessions much happier.
+ *
+ * @param {byte|char|int|Color} value the value to turn into a hex string
+ * @param {int} digits the number of digits to return
+ *
+ * @returns {String}
+ *
+ * @see unhex
+ * @see binary
+ * @see unbinary
+ */
+ p.hex = function(value, len) {
+ if (arguments.length === 1) {
+ if (value instanceof Char) {
+ len = 4;
+ } else { // int or byte, indistinguishable at the moment, default to 8
+ len = 8;
+ }
+ }
+ return decimalToHex(value, len);
+ };
+
+ function unhexScalar(hex) {
+ var value = parseInt("0x" + hex, 16);
+
+ // correct for int overflow java expectation
+ if (value > 2147483647) {
+ value -= 4294967296;
+ }
+ return value;
+ }
+
+ /**
+ * Converts a String representation of a hexadecimal number to its equivalent integer value.
+ *
+ * @param {String} hex the hex string to convert to an int
+ *
+ * @returns {int}
+ *
+ * @see hex
+ * @see binary
+ * @see unbinary
+ */
+ p.unhex = function(hex) {
+ if (hex instanceof Array) {
+ var arr = [];
+ for (var i = 0; i < hex.length; i++) {
+ arr.push(unhexScalar(hex[i]));
+ }
+ return arr;
+ }
+ return unhexScalar(hex);
+ };
+
+ // Load a file or URL into strings
+ /**
+ * Reads the contents of a file or url and creates a String array of its individual lines.
+ * The filename parameter can also be a URL to a file found online. If the file is not available or an error occurs,
+ * null will be returned and an error message will be printed to the console. The error message does not halt
+ * the program.
+ *
+ * @param {String} filename name of the file or url to load
+ *
+ * @returns {String[]}
+ *
+ * @see loadBytes
+ * @see saveStrings
+ * @see saveBytes
+ */
+ p.loadStrings = function(filename) {
+ if (localStorage[filename]) {
+ return localStorage[filename].split("\n");
+ }
+
+ var filecontent = ajax(filename);
+ if(typeof filecontent !== "string" || filecontent === "") {
+ return [];
+ }
+
+ // deal with the fact that Windows uses \r\n, Unix uses \n,
+ // Mac uses \r, and we actually expect \n
+ filecontent = filecontent.replace(/(\r\n?)/g,"\n").replace(/\n$/,"");
+
+ return filecontent.split("\n");
+ };
+
+ // Writes an array of strings to a file, one line per string
+ /**
+ * Writes an array of strings to a file, one line per string. This file is saved to the localStorage.
+ *
+ * @param {String} filename name of the file to save to localStorage
+ * @param {String[]} strings string array to be written
+ *
+ * @see loadBytes
+ * @see loadStrings
+ * @see saveBytes
+ */
+ p.saveStrings = function(filename, strings) {
+ localStorage[filename] = strings.join('\n');
+ };
+
+ /**
+ * Reads the contents of a file or url and places it in a byte array. If a file is specified, it must be located in the localStorage.
+ * The filename parameter can also be a URL to a file found online.
+ *
+ * @param {String} filename name of a file in the localStorage or a URL.
+ *
+ * @returns {byte[]}
+ *
+ * @see loadStrings
+ * @see saveStrings
+ * @see saveBytes
+ */
+ p.loadBytes = function(url) {
+ var string = ajax(url);
+ var ret = [];
+
+ for (var i = 0; i < string.length; i++) {
+ ret.push(string.charCodeAt(i));
+ }
+
+ return ret;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // String Functions
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * The matchAll() function is identical to match(), except that it returns an array of all matches in
+ * the specified String, rather than just the first.
+ *
+ * @param {String} aString the String to search inside
+ * @param {String} aRegExp the regexp to be used for matching
+ *
+ * @return {String[]} returns an array of matches
+ *
+ * @see #match
+ */
+ p.matchAll = function(aString, aRegExp) {
+ var results = [],
+ latest;
+ var regexp = new RegExp(aRegExp, "g");
+ while ((latest = regexp.exec(aString)) !== null) {
+ results.push(latest);
+ if (latest[0].length === 0) {
+ ++regexp.lastIndex;
+ }
+ }
+ return results.length > 0 ? results : null;
+ };
+ /**
+ * The match() function matches a string with a regular expression, and returns the match as an
+ * array. The first index is the matching expression, and array elements
+ * [1] and higher represent each of the groups (sequences found in parens).
+ *
+ * @param {String} str the String to be searched
+ * @param {String} regexp the regexp to be used for matching
+ *
+ * @return {String[]} an array of matching strings
+ */
+ p.match = function(str, regexp) {
+ return str.match(regexp);
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Other java specific functions
+ ////////////////////////////////////////////////////////////////////////////
+
+
+ var logBuffer = [];
+
+ /**
+ * The println() function writes to the console area of the Processing environment.
+ * Each call to this function creates a new line of output. Individual elements can be separated with quotes ("") and joined with the string concatenation operator (+).
+ *
+ * @param {String} message the string to write to the console
+ *
+ * @see #join
+ * @see #print
+ */
+ p.println = function() {
+ Processing.logger.println.apply(Processing.logger, arguments);
+ };
+ /**
+ * The print() function writes to the console area of the Processing environment.
+ *
+ * @param {String} message the string to write to the console
+ *
+ * @see #join
+ */
+ p.print = function() {
+ Processing.logger.print.apply(Processing.logger, arguments);
+ };
+
+ // Alphanumeric chars arguments automatically converted to numbers when
+ // passed in, and will come out as numbers.
+ p.str = function(val) {
+ if (val instanceof Array) {
+ var arr = [];
+ for (var i = 0; i < val.length; i++) {
+ arr.push(val[i].toString() + "");
+ }
+ return arr;
+ }
+ return (val.toString() + "");
+ };
+
+
+ // Conversion
+ function booleanScalar(val) {
+ if (typeof val === 'number') {
+ return val !== 0;
+ }
+ if (typeof val === 'boolean') {
+ return val;
+ }
+ if (typeof val === 'string') {
+ return val.toLowerCase() === 'true';
+ }
+ if (val instanceof Char) {
+ // 1, T or t
+ return val.code === 49 || val.code === 84 || val.code === 116;
+ }
+ }
+
+ /**
+ * Converts the passed parameter to the function to its boolean value.
+ * It will return an array of booleans if an array is passed in.
+ *
+ * @param {int, byte, string} val the parameter to be converted to boolean
+ * @param {int[], byte[], string[]} val the array to be converted to boolean[]
+ *
+ * @return {boolean|boolean[]} returns a boolean or an array of booleans
+ */
+ p.parseBoolean = function (val) {
+ if (val instanceof Array) {
+ var ret = [];
+ for (var i = 0; i < val.length; i++) {
+ ret.push(booleanScalar(val[i]));
+ }
+ return ret;
+ }
+ return booleanScalar(val);
+ };
+
+ /**
+ * Converts the passed parameter to the function to its byte value.
+ * A byte is a number between -128 and 127.
+ * It will return an array of bytes if an array is passed in.
+ *
+ * @param {int, char} what the parameter to be conveted to byte
+ * @param {int[], char[]} what the array to be converted to byte[]
+ *
+ * @return {byte|byte[]} returns a byte or an array of bytes
+ */
+ p.parseByte = function(what) {
+ if (what instanceof Array) {
+ var bytes = [];
+ for (var i = 0; i < what.length; i++) {
+ bytes.push((0 - (what[i] & 0x80)) | (what[i] & 0x7F));
+ }
+ return bytes;
+ }
+ return (0 - (what & 0x80)) | (what & 0x7F);
+ };
+
+ /**
+ * Converts the passed parameter to the function to its char value.
+ * It will return an array of chars if an array is passed in.
+ *
+ * @param {int, byte} key the parameter to be conveted to char
+ * @param {int[], byte[]} key the array to be converted to char[]
+ *
+ * @return {char|char[]} returns a char or an array of chars
+ */
+ p.parseChar = function(key) {
+ if (typeof key === "number") {
+ return new Char(String.fromCharCode(key & 0xFFFF));
+ }
+ if (key instanceof Array) {
+ var ret = [];
+ for (var i = 0; i < key.length; i++) {
+ ret.push(new Char(String.fromCharCode(key[i] & 0xFFFF)));
+ }
+ return ret;
+ }
+ throw "char() may receive only one argument of type int, byte, int[], or byte[].";
+ };
+
+ // Processing doc claims good argument types are: int, char, byte, boolean,
+ // String, int[], char[], byte[], boolean[], String[].
+ // floats should not work. However, floats with only zeroes right of the
+ // decimal will work because JS converts those to int.
+ function floatScalar(val) {
+ if (typeof val === 'number') {
+ return val;
+ }
+ if (typeof val === 'boolean') {
+ return val ? 1 : 0;
+ }
+ if (typeof val === 'string') {
+ return parseFloat(val);
+ }
+ if (val instanceof Char) {
+ return val.code;
+ }
+ }
+
+ /**
+ * Converts the passed parameter to the function to its float value.
+ * It will return an array of floats if an array is passed in.
+ *
+ * @param {int, char, boolean, string} val the parameter to be conveted to float
+ * @param {int[], char[], boolean[], string[]} val the array to be converted to float[]
+ *
+ * @return {float|float[]} returns a float or an array of floats
+ */
+ p.parseFloat = function(val) {
+ if (val instanceof Array) {
+ var ret = [];
+ for (var i = 0; i < val.length; i++) {
+ ret.push(floatScalar(val[i]));
+ }
+ return ret;
+ }
+ return floatScalar(val);
+ };
+
+ function intScalar(val, radix) {
+ if (typeof val === 'number') {
+ return val & 0xFFFFFFFF;
+ }
+ if (typeof val === 'boolean') {
+ return val ? 1 : 0;
+ }
+ if (typeof val === 'string') {
+ var number = parseInt(val, radix || 10); // Default to decimal radix.
+ return number & 0xFFFFFFFF;
+ }
+ if (val instanceof Char) {
+ return val.code;
+ }
+ }
+
+ /**
+ * Converts the passed parameter to the function to its int value.
+ * It will return an array of ints if an array is passed in.
+ *
+ * @param {string, char, boolean, float} val the parameter to be conveted to int
+ * @param {string[], char[], boolean[], float[]} val the array to be converted to int[]
+ * @param {int} radix optional the radix of the number (for js compatibility)
+ *
+ * @return {int|int[]} returns a int or an array of ints
+ */
+ p.parseInt = function(val, radix) {
+ if (val instanceof Array) {
+ var ret = [];
+ for (var i = 0; i < val.length; i++) {
+ if (typeof val[i] === 'string' && !/^\s*[+\-]?\d+\s*$/.test(val[i])) {
+ ret.push(0);
+ } else {
+ ret.push(intScalar(val[i], radix));
+ }
+ }
+ return ret;
+ }
+ return intScalar(val, radix);
+ };
+
+ p.__int_cast = function(val) {
+ return 0|val;
+ };
+
+ p.__instanceof = function(obj, type) {
+ if (typeof type !== "function") {
+ throw "Function is expected as type argument for instanceof operator";
+ }
+
+ if (typeof obj === "string") {
+ // special case for strings
+ return type === Object || type === String;
+ }
+
+ if (obj instanceof type) {
+ // fast check if obj is already of type instance
+ return true;
+ }
+
+ if (typeof obj !== "object" || obj === null) {
+ return false; // not an object or null
+ }
+
+ var objType = obj.constructor;
+ if (type.$isInterface) {
+ // expecting the interface
+ // queueing interfaces from type and its base classes
+ var interfaces = [];
+ while (objType) {
+ if (objType.$interfaces) {
+ interfaces = interfaces.concat(objType.$interfaces);
+ }
+ objType = objType.$base;
+ }
+ while (interfaces.length > 0) {
+ var i = interfaces.shift();
+ if (i === type) {
+ return true;
+ }
+ // wide search in base interfaces
+ if (i.$interfaces) {
+ interfaces = interfaces.concat(i.$interfaces);
+ }
+ }
+ return false;
+ }
+
+ while (objType.hasOwnProperty("$base")) {
+ objType = objType.$base;
+ if (objType === type) {
+ return true; // object was found
+ }
+ }
+
+ return false;
+ };
+
+ /**
+ * Defines the dimension of the display window in units of pixels. The size() function must
+ * be the first line in setup(). If size() is not called, the default size of the window is
+ * 100x100 pixels. The system variables width and height are set by the parameters passed to
+ * the size() function.
+ *
+ * @param {int} aWidth width of the display window in units of pixels
+ * @param {int} aHeight height of the display window in units of pixels
+ * @param {MODE} aMode Either P2D, P3D, JAVA2D, or OPENGL
+ *
+ * @see createGraphics
+ * @see screen
+ */
+ DrawingShared.prototype.size = function(aWidth, aHeight, aMode) {
+ if (doStroke) {
+ p.stroke(0);
+ }
+
+ if (doFill) {
+ p.fill(255);
+ }
+
+ // The default 2d context has already been created in the p.init() stage if
+ // a 3d context was not specified. This is so that a 2d context will be
+ // available if size() was not called.
+ var savedProperties = {
+ fillStyle: curContext.fillStyle,
+ strokeStyle: curContext.strokeStyle,
+ lineCap: curContext.lineCap,
+ lineJoin: curContext.lineJoin
+ };
+ // remove the style width and height properties to ensure that the canvas gets set to
+ // aWidth and aHeight coming in
+ if (curElement.style.length > 0 ) {
+ curElement.style.removeProperty("width");
+ curElement.style.removeProperty("height");
+ }
+
+ curElement.width = p.width = aWidth || 100;
+ curElement.height = p.height = aHeight || 100;
+
+ for (var prop in savedProperties) {
+ if (savedProperties.hasOwnProperty(prop)) {
+ curContext[prop] = savedProperties[prop];
+ }
+ }
+
+ // make sure to set the default font the first time round.
+ p.textFont(curTextFont);
+
+ // Set the background to whatever it was called last as if background() was called before size()
+ // If background() hasn't been called before, set background() to a light gray
+ p.background();
+
+ // set 5% for pixels to cache (or 1000)
+ maxPixelsCached = Math.max(1000, aWidth * aHeight * 0.05);
+
+ // Externalize the context
+ p.externals.context = curContext;
+
+ for (var i = 0; i < PConstants.SINCOS_LENGTH; i++) {
+ sinLUT[i] = p.sin(i * (PConstants.PI / 180) * 0.5);
+ cosLUT[i] = p.cos(i * (PConstants.PI / 180) * 0.5);
+ }
+ };
+
+ Drawing2D.prototype.size = function(aWidth, aHeight, aMode) {
+ if (curContext === undef) {
+ // size() was called without p.init() default context, i.e. p.createGraphics()
+ curContext = curElement.getContext("2d");
+ userMatrixStack = new PMatrixStack();
+ userReverseMatrixStack = new PMatrixStack();
+ modelView = new PMatrix2D();
+ modelViewInv = new PMatrix2D();
+ }
+
+ DrawingShared.prototype.size.apply(this, arguments);
+ };
+
+ Drawing3D.prototype.size = (function() {
+ var size3DCalled = false;
+
+ return function size(aWidth, aHeight, aMode) {
+ if (size3DCalled) {
+ throw "Multiple calls to size() for 3D renders are not allowed.";
+ }
+ size3DCalled = true;
+
+ function getGLContext(canvas) {
+ var ctxNames = ['experimental-webgl', 'webgl', 'webkit-3d'],
+ gl;
+
+ for (var i=0, l=ctxNames.length; i<l; i++) {
+ gl = canvas.getContext(ctxNames[i], {antialias: false, preserveDrawingBuffer: true});
+ if (gl) {
+ break;
+ }
+ }
+
+ return gl;
+ }
+
+ // Get the 3D rendering context.
+ try {
+ // If the HTML <canvas> dimensions differ from the
+ // dimensions specified in the size() call in the sketch, for
+ // 3D sketches, browsers will either not render or render the
+ // scene incorrectly. To fix this, we need to adjust the
+ // width and height attributes of the canvas.
+ curElement.width = p.width = aWidth || 100;
+ curElement.height = p.height = aHeight || 100;
+ curContext = getGLContext(curElement);
+ canTex = curContext.createTexture();
+ textTex = curContext.createTexture();
+ } catch(e_size) {
+ Processing.debug(e_size);
+ }
+
+ if (!curContext) {
+ throw "WebGL context is not supported on this browser.";
+ }
+
+ // Set defaults
+ curContext.viewport(0, 0, curElement.width, curElement.height);
+ curContext.enable(curContext.DEPTH_TEST);
+ curContext.enable(curContext.BLEND);
+ curContext.blendFunc(curContext.SRC_ALPHA, curContext.ONE_MINUS_SRC_ALPHA);
+
+ // Create the program objects to render 2D (points, lines) and
+ // 3D (spheres, boxes) shapes. Because 2D shapes are not lit,
+ // lighting calculations are ommitted from this program object.
+ programObject2D = createProgramObject(curContext, vertexShaderSrc2D, fragmentShaderSrc2D);
+
+ programObjectUnlitShape = createProgramObject(curContext, vertexShaderSrcUnlitShape, fragmentShaderSrcUnlitShape);
+
+ // Set the default point and line width for the 2D and unlit shapes.
+ p.strokeWeight(1);
+
+ // Now that the programs have been compiled, we can set the default
+ // states for the lights.
+ programObject3D = createProgramObject(curContext, vertexShaderSrc3D, fragmentShaderSrc3D);
+ curContext.useProgram(programObject3D);
+
+ // Assume we aren't using textures by default.
+ uniformi("usingTexture3d", programObject3D, "usingTexture", usingTexture);
+
+ // Set some defaults.
+ p.lightFalloff(1, 0, 0);
+ p.shininess(1);
+ p.ambient(255, 255, 255);
+ p.specular(0, 0, 0);
+ p.emissive(0, 0, 0);
+
+ // Create buffers for 3D primitives
+ boxBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, boxBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, boxVerts, curContext.STATIC_DRAW);
+
+ boxNormBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, boxNormBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, boxNorms, curContext.STATIC_DRAW);
+
+ boxOutlineBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, boxOutlineBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, boxOutlineVerts, curContext.STATIC_DRAW);
+
+ // used to draw the rectangle and the outline
+ rectBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, rectBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, rectVerts, curContext.STATIC_DRAW);
+
+ rectNormBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, rectNormBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, rectNorms, curContext.STATIC_DRAW);
+
+ // The sphere vertices are specified dynamically since the user
+ // can change the level of detail. Everytime the user does that
+ // using sphereDetail(), the new vertices are calculated.
+ sphereBuffer = curContext.createBuffer();
+
+ lineBuffer = curContext.createBuffer();
+
+ // Shape buffers
+ fillBuffer = curContext.createBuffer();
+ fillColorBuffer = curContext.createBuffer();
+ strokeColorBuffer = curContext.createBuffer();
+ shapeTexVBO = curContext.createBuffer();
+
+ pointBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, pointBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array([0, 0, 0]), curContext.STATIC_DRAW);
+
+ textBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, textBuffer );
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array([1,1,0,-1,1,0,-1,-1,0,1,-1,0]), curContext.STATIC_DRAW);
+
+ textureBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, textureBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array([0,0,1,0,1,1,0,1]), curContext.STATIC_DRAW);
+
+ indexBuffer = curContext.createBuffer();
+ curContext.bindBuffer(curContext.ELEMENT_ARRAY_BUFFER, indexBuffer);
+ curContext.bufferData(curContext.ELEMENT_ARRAY_BUFFER, new Uint16Array([0,1,2,2,3,0]), curContext.STATIC_DRAW);
+
+ cam = new PMatrix3D();
+ cameraInv = new PMatrix3D();
+ modelView = new PMatrix3D();
+ modelViewInv = new PMatrix3D();
+ projection = new PMatrix3D();
+ p.camera();
+ p.perspective();
+
+ userMatrixStack = new PMatrixStack();
+ userReverseMatrixStack = new PMatrixStack();
+ // used by both curve and bezier, so just init here
+ curveBasisMatrix = new PMatrix3D();
+ curveToBezierMatrix = new PMatrix3D();
+ curveDrawMatrix = new PMatrix3D();
+ bezierDrawMatrix = new PMatrix3D();
+ bezierBasisInverse = new PMatrix3D();
+ bezierBasisMatrix = new PMatrix3D();
+ bezierBasisMatrix.set(-1, 3, -3, 1, 3, -6, 3, 0, -3, 3, 0, 0, 1, 0, 0, 0);
+
+ DrawingShared.prototype.size.apply(this, arguments);
+ };
+ }());
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Lights
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Adds an ambient light. Ambient light doesn't come from a specific direction,
+ * the rays have light have bounced around so much that objects are evenly lit
+ * from all sides. Ambient lights are almost always used in combination with
+ * other types of lights. Lights need to be included in the <b>draw()</b> to
+ * remain persistent in a looping program. Placing them in the <b>setup()</b>
+ * of a looping program will cause them to only have an effect the first time
+ * through the loop. The effect of the parameters is determined by the current
+ * color mode.
+ *
+ * @param {int | float} r red or hue value
+ * @param {int | float} g green or hue value
+ * @param {int | float} b blue or hue value
+ *
+ * @param {int | float} x x position of light (used for falloff)
+ * @param {int | float} y y position of light (used for falloff)
+ * @param {int | float} z z position of light (used for falloff)
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see directionalLight
+ * @see pointLight
+ * @see spotLight
+ */
+ Drawing2D.prototype.ambientLight = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.ambientLight = function(r, g, b, x, y, z) {
+ if (lightCount === PConstants.MAX_LIGHTS) {
+ throw "can only create " + PConstants.MAX_LIGHTS + " lights";
+ }
+
+ var pos = new PVector(x, y, z);
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.mult(pos, pos);
+
+ // Instead of calling p.color, we do the calculations ourselves to
+ // reduce property lookups.
+ var col = color$4(r, g, b, 0);
+ var normalizedCol = [ ((col & PConstants.RED_MASK) >>> 16) / 255,
+ ((col & PConstants.GREEN_MASK) >>> 8) / 255,
+ (col & PConstants.BLUE_MASK) / 255 ];
+
+ curContext.useProgram(programObject3D);
+ uniformf("uLights.color.3d." + lightCount, programObject3D, "uLights" + lightCount + ".color", normalizedCol);
+ uniformf("uLights.position.3d." + lightCount, programObject3D, "uLights" + lightCount + ".position", pos.array());
+ uniformi("uLights.type.3d." + lightCount, programObject3D, "uLights" + lightCount + ".type", 0);
+ uniformi("uLightCount3d", programObject3D, "uLightCount", ++lightCount);
+ };
+
+ /**
+ * Adds a directional light. Directional light comes from one direction and
+ * is stronger when hitting a surface squarely and weaker if it hits at a
+ * gentle angle. After hitting a surface, a directional lights scatters in
+ * all directions. Lights need to be included in the <b>draw()</b> to remain
+ * persistent in a looping program. Placing them in the <b>setup()</b> of a
+ * looping program will cause them to only have an effect the first time
+ * through the loop. The affect of the <br>r</b>, <br>g</b>, and <br>b</b>
+ * parameters is determined by the current color mode. The <b>nx</b>,
+ * <b>ny</b>, and <b>nz</b> parameters specify the direction the light is
+ * facing. For example, setting <b>ny</b> to -1 will cause the geometry to be
+ * lit from below (the light is facing directly upward).
+ *
+ * @param {int | float} r red or hue value
+ * @param {int | float} g green or hue value
+ * @param {int | float} b blue or hue value
+ *
+ * @param {int | float} nx direction along the x axis
+ * @param {int | float} ny direction along the y axis
+ * @param {int | float} nz direction along the z axis
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see ambientLight
+ * @see pointLight
+ * @see spotLight
+ */
+ Drawing2D.prototype.directionalLight = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.directionalLight = function(r, g, b, nx, ny, nz) {
+ if (lightCount === PConstants.MAX_LIGHTS) {
+ throw "can only create " + PConstants.MAX_LIGHTS + " lights";
+ }
+
+ curContext.useProgram(programObject3D);
+
+ var mvm = new PMatrix3D();
+ mvm.scale(1, -1, 1);
+ mvm.apply(modelView.array());
+ mvm = mvm.array();
+
+ // We need to multiply the direction by the model view matrix, but
+ // the mult function checks the w component of the vector, if it isn't
+ // present, it uses 1, so we manually multiply.
+ var dir = [
+ mvm[0] * nx + mvm[4] * ny + mvm[8] * nz,
+ mvm[1] * nx + mvm[5] * ny + mvm[9] * nz,
+ mvm[2] * nx + mvm[6] * ny + mvm[10] * nz
+ ];
+
+ // Instead of calling p.color, we do the calculations ourselves to
+ // reduce property lookups.
+ var col = color$4(r, g, b, 0);
+ var normalizedCol = [ ((col & PConstants.RED_MASK) >>> 16) / 255,
+ ((col & PConstants.GREEN_MASK) >>> 8) / 255,
+ (col & PConstants.BLUE_MASK) / 255 ];
+
+ uniformf("uLights.color.3d." + lightCount, programObject3D, "uLights" + lightCount + ".color", normalizedCol);
+ uniformf("uLights.position.3d." + lightCount, programObject3D, "uLights" + lightCount + ".position", dir);
+ uniformi("uLights.type.3d." + lightCount, programObject3D, "uLights" + lightCount + ".type", 1);
+ uniformi("uLightCount3d", programObject3D, "uLightCount", ++lightCount);
+ };
+
+ /**
+ * Sets the falloff rates for point lights, spot lights, and ambient lights.
+ * The parameters are used to determine the falloff with the following equation:
+ *
+ * d = distance from light position to vertex position
+ * falloff = 1 / (CONSTANT + d * LINEAR + (d*d) * QUADRATIC)
+ *
+ * Like <b>fill()</b>, it affects only the elements which are created after it in the
+ * code. The default value if <b>LightFalloff(1.0, 0.0, 0.0)</b>. Thinking about an
+ * ambient light with a falloff can be tricky. It is used, for example, if you
+ * wanted a region of your scene to be lit ambiently one color and another region
+ * to be lit ambiently by another color, you would use an ambient light with location
+ * and falloff. You can think of it as a point light that doesn't care which direction
+ * a surface is facing.
+ *
+ * @param {int | float} constant constant value for determining falloff
+ * @param {int | float} linear linear value for determining falloff
+ * @param {int | float} quadratic quadratic value for determining falloff
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see ambientLight
+ * @see pointLight
+ * @see spotLight
+ * @see lightSpecular
+ */
+ Drawing2D.prototype.lightFalloff = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.lightFalloff = function(constant, linear, quadratic) {
+ curContext.useProgram(programObject3D);
+ uniformf("uFalloff3d", programObject3D, "uFalloff", [constant, linear, quadratic]);
+ };
+
+ /**
+ * Sets the specular color for lights. Like <b>fill()</b>, it affects only the
+ * elements which are created after it in the code. Specular refers to light
+ * which bounces off a surface in a perferred direction (rather than bouncing
+ * in all directions like a diffuse light) and is used for creating highlights.
+ * The specular quality of a light interacts with the specular material qualities
+ * set through the <b>specular()</b> and <b>shininess()</b> functions.
+ *
+ * @param {int | float} r red or hue value
+ * @param {int | float} g green or hue value
+ * @param {int | float} b blue or hue value
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see ambientLight
+ * @see pointLight
+ * @see spotLight
+ */
+ Drawing2D.prototype.lightSpecular = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.lightSpecular = function(r, g, b) {
+
+ // Instead of calling p.color, we do the calculations ourselves to
+ // reduce property lookups.
+ var col = color$4(r, g, b, 0);
+ var normalizedCol = [ ((col & PConstants.RED_MASK) >>> 16) / 255,
+ ((col & PConstants.GREEN_MASK) >>> 8) / 255,
+ (col & PConstants.BLUE_MASK) / 255 ];
+
+ curContext.useProgram(programObject3D);
+ uniformf("uSpecular3d", programObject3D, "uSpecular", normalizedCol);
+ };
+
+ /**
+ * Sets the default ambient light, directional light, falloff, and specular
+ * values. The defaults are ambientLight(128, 128, 128) and
+ * directionalLight(128, 128, 128, 0, 0, -1), lightFalloff(1, 0, 0), and
+ * lightSpecular(0, 0, 0). Lights need to be included in the draw() to remain
+ * persistent in a looping program. Placing them in the setup() of a looping
+ * program will cause them to only have an effect the first time through the
+ * loop.
+ *
+ * @returns none
+ *
+ * @see ambientLight
+ * @see directionalLight
+ * @see pointLight
+ * @see spotLight
+ * @see noLights
+ *
+ */
+ p.lights = function() {
+ p.ambientLight(128, 128, 128);
+ p.directionalLight(128, 128, 128, 0, 0, -1);
+ p.lightFalloff(1, 0, 0);
+ p.lightSpecular(0, 0, 0);
+ };
+
+ /**
+ * Adds a point light. Lights need to be included in the <b>draw()</b> to remain
+ * persistent in a looping program. Placing them in the <b>setup()</b> of a
+ * looping program will cause them to only have an effect the first time through
+ * the loop. The affect of the <b>r</b>, <b>g</b>, and <b>b</b> parameters
+ * is determined by the current color mode. The <b>x</b>, <b>y</b>, and <b>z</b>
+ * parameters set the position of the light.
+ *
+ * @param {int | float} r red or hue value
+ * @param {int | float} g green or hue value
+ * @param {int | float} b blue or hue value
+ * @param {int | float} x x coordinate of the light
+ * @param {int | float} y y coordinate of the light
+ * @param {int | float} z z coordinate of the light
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see directionalLight
+ * @see ambientLight
+ * @see spotLight
+ */
+ Drawing2D.prototype.pointLight = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.pointLight = function(r, g, b, x, y, z) {
+ if (lightCount === PConstants.MAX_LIGHTS) {
+ throw "can only create " + PConstants.MAX_LIGHTS + " lights";
+ }
+
+ // Place the point in view space once instead of once per vertex
+ // in the shader.
+ var pos = new PVector(x, y, z);
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.mult(pos, pos);
+
+ // Instead of calling p.color, we do the calculations ourselves to
+ // reduce property lookups.
+ var col = color$4(r, g, b, 0);
+ var normalizedCol = [ ((col & PConstants.RED_MASK) >>> 16) / 255,
+ ((col & PConstants.GREEN_MASK) >>> 8) / 255,
+ (col & PConstants.BLUE_MASK) / 255 ];
+
+ curContext.useProgram(programObject3D);
+ uniformf("uLights.color.3d." + lightCount, programObject3D, "uLights" + lightCount + ".color", normalizedCol);
+ uniformf("uLights.position.3d." + lightCount, programObject3D, "uLights" + lightCount + ".position", pos.array());
+ uniformi("uLights.type.3d." + lightCount, programObject3D, "uLights" + lightCount + ".type", 2);
+ uniformi("uLightCount3d", programObject3D, "uLightCount", ++lightCount);
+ };
+
+ /**
+ * Disable all lighting. Lighting is turned off by default and enabled with
+ * the lights() method. This function can be used to disable lighting so
+ * that 2D geometry (which does not require lighting) can be drawn after a
+ * set of lighted 3D geometry.
+ *
+ * @returns none
+ *
+ * @see lights
+ */
+ Drawing2D.prototype.noLights = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.noLights = function() {
+ lightCount = 0;
+ curContext.useProgram(programObject3D);
+ uniformi("uLightCount3d", programObject3D, "uLightCount", lightCount);
+ };
+
+ /**
+ * Adds a spot light. Lights need to be included in the <b>draw()</b> to
+ * remain persistent in a looping program. Placing them in the <b>setup()</b>
+ * of a looping program will cause them to only have an effect the first time
+ * through the loop. The affect of the <b>r</b>, <b>g</b>, and <b>b</b> parameters
+ * is determined by the current color mode. The <b>x</b>, <b>y</b>, and <b>z</b>
+ * parameters specify the position of the light and <b>nx</b>, <b>ny</b>, <b>nz</b>
+ * specify the direction or light. The angle parameter affects <b>angle</b> of the
+ * spotlight cone.
+ *
+ * @param {int | float} r red or hue value
+ * @param {int | float} g green or hue value
+ * @param {int | float} b blue or hue value
+ * @param {int | float} x coordinate of the light
+ * @param {int | float} y coordinate of the light
+ * @param {int | float} z coordinate of the light
+ * @param {int | float} nx direction along the x axis
+ * @param {int | float} ny direction along the y axis
+ * @param {int | float} nz direction along the z axis
+ * @param {float} angle angle of the spotlight cone
+ * @param {float} concentration exponent determining the center bias of the cone
+ *
+ * @returns none
+ *
+ * @see lights
+ * @see directionalLight
+ * @see ambientLight
+ * @see pointLight
+ */
+ Drawing2D.prototype.spotLight = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.spotLight = function(r, g, b, x, y, z, nx, ny, nz, angle, concentration) {
+ if (lightCount === PConstants.MAX_LIGHTS) {
+ throw "can only create " + PConstants.MAX_LIGHTS + " lights";
+ }
+
+ curContext.useProgram(programObject3D);
+
+ // multiply the position and direction by the model view matrix
+ // once per object rather than once per vertex.
+ var pos = new PVector(x, y, z);
+ var mvm = new PMatrix3D();
+ mvm.scale(1, -1, 1);
+ mvm.apply(modelView.array());
+ mvm.mult(pos, pos);
+
+ // Convert to array since we need to directly access the elements.
+ mvm = mvm.array();
+
+ // We need to multiply the direction by the model view matrix, but
+ // the mult function checks the w component of the vector, if it isn't
+ // present, it uses 1, so we use a very small value as a work around.
+ var dir = [
+ mvm[0] * nx + mvm[4] * ny + mvm[8] * nz,
+ mvm[1] * nx + mvm[5] * ny + mvm[9] * nz,
+ mvm[2] * nx + mvm[6] * ny + mvm[10] * nz
+ ];
+
+ // Instead of calling p.color, we do the calculations ourselves to
+ // reduce property lookups.
+ var col = color$4(r, g, b, 0);
+ var normalizedCol = [ ((col & PConstants.RED_MASK) >>> 16) / 255,
+ ((col & PConstants.GREEN_MASK) >>> 8) / 255,
+ (col & PConstants.BLUE_MASK) / 255 ];
+
+ uniformf("uLights.color.3d." + lightCount, programObject3D, "uLights" + lightCount + ".color", normalizedCol);
+ uniformf("uLights.position.3d." + lightCount, programObject3D, "uLights" + lightCount + ".position", pos.array());
+ uniformf("uLights.direction.3d." + lightCount, programObject3D, "uLights" + lightCount + ".direction", dir);
+ uniformf("uLights.concentration.3d." + lightCount, programObject3D, "uLights" + lightCount + ".concentration", concentration);
+ uniformf("uLights.angle.3d." + lightCount, programObject3D, "uLights" + lightCount + ".angle", angle);
+ uniformi("uLights.type.3d." + lightCount, programObject3D, "uLights" + lightCount + ".type", 3);
+ uniformi("uLightCount3d", programObject3D, "uLightCount", ++lightCount);
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Camera functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * The <b>beginCamera()</b> and <b>endCamera()</b> functions enable advanced customization of the camera space.
+ * The functions are useful if you want to more control over camera movement, however for most users, the <b>camera()</b>
+ * function will be sufficient.<br /><br />The camera functions will replace any transformations (such as <b>rotate()</b>
+ * or <b>translate()</b>) that occur before them in <b>draw()</b>, but they will not automatically replace the camera
+ * transform itself. For this reason, camera functions should be placed at the beginning of <b>draw()</b> (so that
+ * transformations happen afterwards), and the <b>camera()</b> function can be used after <b>beginCamera()</b> if
+ * you want to reset the camera before applying transformations.<br /><br />This function sets the matrix mode to the
+ * camera matrix so calls such as <b>translate()</b>, <b>rotate()</b>, applyMatrix() and resetMatrix() affect the camera.
+ * <b>beginCamera()</b> should always be used with a following <b>endCamera()</b> and pairs of <b>beginCamera()</b> and
+ * <b>endCamera()</b> cannot be nested.
+ *
+ * @see camera
+ * @see endCamera
+ * @see applyMatrix
+ * @see resetMatrix
+ * @see translate
+ * @see rotate
+ * @see scale
+ */
+ Drawing2D.prototype.beginCamera = function() {
+ throw ("beginCamera() is not available in 2D mode");
+ };
+
+ Drawing3D.prototype.beginCamera = function() {
+ if (manipulatingCamera) {
+ throw ("You cannot call beginCamera() again before calling endCamera()");
+ }
+ manipulatingCamera = true;
+ modelView = cameraInv;
+ modelViewInv = cam;
+ };
+
+ /**
+ * The <b>beginCamera()</b> and <b>endCamera()</b> functions enable advanced customization of the camera space.
+ * Please see the reference for <b>beginCamera()</b> for a description of how the functions are used.
+ *
+ * @see beginCamera
+ */
+ Drawing2D.prototype.endCamera = function() {
+ throw ("endCamera() is not available in 2D mode");
+ };
+
+ Drawing3D.prototype.endCamera = function() {
+ if (!manipulatingCamera) {
+ throw ("You cannot call endCamera() before calling beginCamera()");
+ }
+ modelView.set(cam);
+ modelViewInv.set(cameraInv);
+ manipulatingCamera = false;
+ };
+
+ /**
+ * Sets the position of the camera through setting the eye position, the center of the scene, and which axis is facing
+ * upward. Moving the eye position and the direction it is pointing (the center of the scene) allows the images to be
+ * seen from different angles. The version without any parameters sets the camera to the default position, pointing to
+ * the center of the display window with the Y axis as up. The default values are camera(width/2.0, height/2.0,
+ * (height/2.0) / tan(PI*60.0 / 360.0), width/2.0, height/2.0, 0, 0, 1, 0). This function is similar to gluLookAt()
+ * in OpenGL, but it first clears the current camera settings.
+ *
+ * @param {float} eyeX x-coordinate for the eye
+ * @param {float} eyeY y-coordinate for the eye
+ * @param {float} eyeZ z-coordinate for the eye
+ * @param {float} centerX x-coordinate for the center of the scene
+ * @param {float} centerY y-coordinate for the center of the scene
+ * @param {float} centerZ z-coordinate for the center of the scene
+ * @param {float} upX usually 0.0, 1.0, -1.0
+ * @param {float} upY usually 0.0, 1.0, -1.0
+ * @param {float} upZ usually 0.0, 1.0, -1.0
+ *
+ * @see beginCamera
+ * @see endCamera
+ * @see frustum
+ */
+ p.camera = function(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ) {
+ if (eyeX === undef) {
+ // Workaround if createGraphics is used.
+ cameraX = p.width / 2;
+ cameraY = p.height / 2;
+ cameraZ = cameraY / Math.tan(cameraFOV / 2);
+ eyeX = cameraX;
+ eyeY = cameraY;
+ eyeZ = cameraZ;
+ centerX = cameraX;
+ centerY = cameraY;
+ centerZ = 0;
+ upX = 0;
+ upY = 1;
+ upZ = 0;
+ }
+
+ var z = new PVector(eyeX - centerX, eyeY - centerY, eyeZ - centerZ);
+ var y = new PVector(upX, upY, upZ);
+ z.normalize();
+ var x = PVector.cross(y, z);
+ y = PVector.cross(z, x);
+ x.normalize();
+ y.normalize();
+
+ var xX = x.x,
+ xY = x.y,
+ xZ = x.z;
+
+ var yX = y.x,
+ yY = y.y,
+ yZ = y.z;
+
+ var zX = z.x,
+ zY = z.y,
+ zZ = z.z;
+
+ cam.set(xX, xY, xZ, 0, yX, yY, yZ, 0, zX, zY, zZ, 0, 0, 0, 0, 1);
+
+ cam.translate(-eyeX, -eyeY, -eyeZ);
+
+ cameraInv.reset();
+ cameraInv.invApply(xX, xY, xZ, 0, yX, yY, yZ, 0, zX, zY, zZ, 0, 0, 0, 0, 1);
+
+ cameraInv.translate(eyeX, eyeY, eyeZ);
+
+ modelView.set(cam);
+ modelViewInv.set(cameraInv);
+ };
+
+ /**
+ * Sets a perspective projection applying foreshortening, making distant objects appear smaller than closer ones. The
+ * parameters define a viewing volume with the shape of truncated pyramid. Objects near to the front of the volume appear
+ * their actual size, while farther objects appear smaller. This projection simulates the perspective of the world more
+ * accurately than orthographic projection. The version of perspective without parameters sets the default perspective and
+ * the version with four parameters allows the programmer to set the area precisely. The default values are:
+ * perspective(PI/3.0, width/height, cameraZ/10.0, cameraZ*10.0) where cameraZ is ((height/2.0) / tan(PI*60.0/360.0));
+ *
+ * @param {float} fov field-of-view angle (in radians) for vertical direction
+ * @param {float} aspect ratio of width to height
+ * @param {float} zNear z-position of nearest clipping plane
+ * @param {float} zFar z-positions of farthest clipping plane
+ */
+ p.perspective = function(fov, aspect, near, far) {
+ if (arguments.length === 0) {
+ //in case canvas is resized
+ cameraY = curElement.height / 2;
+ cameraZ = cameraY / Math.tan(cameraFOV / 2);
+ cameraNear = cameraZ / 10;
+ cameraFar = cameraZ * 10;
+ cameraAspect = p.width / p.height;
+ fov = cameraFOV;
+ aspect = cameraAspect;
+ near = cameraNear;
+ far = cameraFar;
+ }
+
+ var yMax, yMin, xMax, xMin;
+ yMax = near * Math.tan(fov / 2);
+ yMin = -yMax;
+ xMax = yMax * aspect;
+ xMin = yMin * aspect;
+ p.frustum(xMin, xMax, yMin, yMax, near, far);
+ };
+
+ /**
+ * Sets a perspective matrix defined through the parameters. Works like glFrustum, except it wipes out the current
+ * perspective matrix rather than muliplying itself with it.
+ *
+ * @param {float} left left coordinate of the clipping plane
+ * @param {float} right right coordinate of the clipping plane
+ * @param {float} bottom bottom coordinate of the clipping plane
+ * @param {float} top top coordinate of the clipping plane
+ * @param {float} near near coordinate of the clipping plane
+ * @param {float} far far coordinate of the clipping plane
+ *
+ * @see beginCamera
+ * @see camera
+ * @see endCamera
+ * @see perspective
+ */
+ Drawing2D.prototype.frustum = function() {
+ throw("Processing.js: frustum() is not supported in 2D mode");
+ };
+
+ Drawing3D.prototype.frustum = function(left, right, bottom, top, near, far) {
+ frustumMode = true;
+ projection = new PMatrix3D();
+ projection.set((2 * near) / (right - left), 0, (right + left) / (right - left),
+ 0, 0, (2 * near) / (top - bottom), (top + bottom) / (top - bottom),
+ 0, 0, 0, -(far + near) / (far - near), -(2 * far * near) / (far - near),
+ 0, 0, -1, 0);
+ var proj = new PMatrix3D();
+ proj.set(projection);
+ proj.transpose();
+ curContext.useProgram(programObject2D);
+ uniformMatrix("projection2d", programObject2D, "uProjection", false, proj.array());
+ curContext.useProgram(programObject3D);
+ uniformMatrix("projection3d", programObject3D, "uProjection", false, proj.array());
+ curContext.useProgram(programObjectUnlitShape);
+ uniformMatrix("uProjectionUS", programObjectUnlitShape, "uProjection", false, proj.array());
+ };
+
+ /**
+ * Sets an orthographic projection and defines a parallel clipping volume. All objects with the same dimension appear
+ * the same size, regardless of whether they are near or far from the camera. The parameters to this function specify
+ * the clipping volume where left and right are the minimum and maximum x values, top and bottom are the minimum and
+ * maximum y values, and near and far are the minimum and maximum z values. If no parameters are given, the default
+ * is used: ortho(0, width, 0, height, -10, 10).
+ *
+ * @param {float} left left plane of the clipping volume
+ * @param {float} right right plane of the clipping volume
+ * @param {float} bottom bottom plane of the clipping volume
+ * @param {float} top top plane of the clipping volume
+ * @param {float} near maximum distance from the origin to the viewer
+ * @param {float} far maximum distance from the origin away from the viewer
+ */
+ p.ortho = function(left, right, bottom, top, near, far) {
+ if (arguments.length === 0) {
+ left = 0;
+ right = p.width;
+ bottom = 0;
+ top = p.height;
+ near = -10;
+ far = 10;
+ }
+
+ var x = 2 / (right - left);
+ var y = 2 / (top - bottom);
+ var z = -2 / (far - near);
+
+ var tx = -(right + left) / (right - left);
+ var ty = -(top + bottom) / (top - bottom);
+ var tz = -(far + near) / (far - near);
+
+ projection = new PMatrix3D();
+ projection.set(x, 0, 0, tx, 0, y, 0, ty, 0, 0, z, tz, 0, 0, 0, 1);
+
+ var proj = new PMatrix3D();
+ proj.set(projection);
+ proj.transpose();
+ curContext.useProgram(programObject2D);
+ uniformMatrix("projection2d", programObject2D, "uProjection", false, proj.array());
+ curContext.useProgram(programObject3D);
+ uniformMatrix("projection3d", programObject3D, "uProjection", false, proj.array());
+ curContext.useProgram(programObjectUnlitShape);
+ uniformMatrix("uProjectionUS", programObjectUnlitShape, "uProjection", false, proj.array());
+ frustumMode = false;
+ };
+ /**
+ * The printProjection() prints the current projection matrix to the text window.
+ */
+ p.printProjection = function() {
+ projection.print();
+ };
+ /**
+ * The printCamera() function prints the current camera matrix.
+ */
+ p.printCamera = function() {
+ cam.print();
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Shapes
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * The box() function renders a box. A box is an extruded rectangle. A box with equal dimension on all sides is a cube.
+ * Calling this function with only one parameter will create a cube.
+ *
+ * @param {int|float} w dimension of the box in the x-dimension
+ * @param {int|float} h dimension of the box in the y-dimension
+ * @param {int|float} d dimension of the box in the z-dimension
+ */
+ Drawing2D.prototype.box = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.box = function(w, h, d) {
+ // user can uniformly scale the box by
+ // passing in only one argument.
+ if (!h || !d) {
+ h = d = w;
+ }
+
+ // Modeling transformation
+ var model = new PMatrix3D();
+ model.scale(w, h, d);
+
+ // Viewing transformation needs to have Y flipped
+ // becuase that's what Processing does.
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ if (doFill) {
+ curContext.useProgram(programObject3D);
+ uniformMatrix("model3d", programObject3D, "uModel", false, model.array());
+ uniformMatrix("view3d", programObject3D, "uView", false, view.array());
+ // Fix stitching problems. (lines get occluded by triangles
+ // since they share the same depth values). This is not entirely
+ // working, but it's a start for drawing the outline. So
+ // developers can start playing around with styles.
+ curContext.enable(curContext.POLYGON_OFFSET_FILL);
+ curContext.polygonOffset(1, 1);
+ uniformf("color3d", programObject3D, "uColor", fillStyle);
+
+ // Calculating the normal matrix can be expensive, so only
+ // do it if it's necessary.
+ if(lightCount > 0){
+ // Create the normal transformation matrix.
+ var v = new PMatrix3D();
+ v.set(view);
+
+ var m = new PMatrix3D();
+ m.set(model);
+
+ v.mult(m);
+
+ var normalMatrix = new PMatrix3D();
+ normalMatrix.set(v);
+ normalMatrix.invert();
+ normalMatrix.transpose();
+
+ uniformMatrix("uNormalTransform3d", programObject3D, "uNormalTransform", false, normalMatrix.array());
+ vertexAttribPointer("aNormal3d", programObject3D, "aNormal", 3, boxNormBuffer);
+ }
+ else{
+ disableVertexAttribPointer("aNormal3d", programObject3D, "aNormal");
+ }
+
+ vertexAttribPointer("aVertex3d", programObject3D, "aVertex", 3, boxBuffer);
+
+ // Turn off per vertex colors.
+ disableVertexAttribPointer("aColor3d", programObject3D, "aColor");
+ disableVertexAttribPointer("aTexture3d", programObject3D, "aTexture");
+
+ curContext.drawArrays(curContext.TRIANGLES, 0, boxVerts.length / 3);
+ curContext.disable(curContext.POLYGON_OFFSET_FILL);
+ }
+
+ // Draw the box outline.
+ if (lineWidth > 0 && doStroke) {
+ curContext.useProgram(programObject2D);
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, model.array());
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+ uniformf("uColor2d", programObject2D, "uColor", strokeStyle);
+ uniformi("uIsDrawingText2d", programObject2D, "uIsDrawingText", false);
+ vertexAttribPointer("vertex2d", programObject2D, "aVertex", 3, boxOutlineBuffer);
+ disableVertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord");
+ curContext.drawArrays(curContext.LINES, 0, boxOutlineVerts.length / 3);
+ }
+ };
+
+ /**
+ * The initSphere() function is a helper function used by <b>sphereDetail()</b>
+ * This function creates and stores sphere vertices every time the user changes sphere detail.
+ *
+ * @see #sphereDetail
+ */
+ var initSphere = function() {
+ var i;
+ sphereVerts = [];
+
+ for (i = 0; i < sphereDetailU; i++) {
+ sphereVerts.push(0);
+ sphereVerts.push(-1);
+ sphereVerts.push(0);
+ sphereVerts.push(sphereX[i]);
+ sphereVerts.push(sphereY[i]);
+ sphereVerts.push(sphereZ[i]);
+ }
+ sphereVerts.push(0);
+ sphereVerts.push(-1);
+ sphereVerts.push(0);
+ sphereVerts.push(sphereX[0]);
+ sphereVerts.push(sphereY[0]);
+ sphereVerts.push(sphereZ[0]);
+
+ var v1, v11, v2;
+
+ // middle rings
+ var voff = 0;
+ for (i = 2; i < sphereDetailV; i++) {
+ v1 = v11 = voff;
+ voff += sphereDetailU;
+ v2 = voff;
+ for (var j = 0; j < sphereDetailU; j++) {
+ sphereVerts.push(sphereX[v1]);
+ sphereVerts.push(sphereY[v1]);
+ sphereVerts.push(sphereZ[v1++]);
+ sphereVerts.push(sphereX[v2]);
+ sphereVerts.push(sphereY[v2]);
+ sphereVerts.push(sphereZ[v2++]);
+ }
+
+ // close each ring
+ v1 = v11;
+ v2 = voff;
+
+ sphereVerts.push(sphereX[v1]);
+ sphereVerts.push(sphereY[v1]);
+ sphereVerts.push(sphereZ[v1]);
+ sphereVerts.push(sphereX[v2]);
+ sphereVerts.push(sphereY[v2]);
+ sphereVerts.push(sphereZ[v2]);
+ }
+
+ // add the northern cap
+ for (i = 0; i < sphereDetailU; i++) {
+ v2 = voff + i;
+
+ sphereVerts.push(sphereX[v2]);
+ sphereVerts.push(sphereY[v2]);
+ sphereVerts.push(sphereZ[v2]);
+ sphereVerts.push(0);
+ sphereVerts.push(1);
+ sphereVerts.push(0);
+ }
+
+ sphereVerts.push(sphereX[voff]);
+ sphereVerts.push(sphereY[voff]);
+ sphereVerts.push(sphereZ[voff]);
+ sphereVerts.push(0);
+ sphereVerts.push(1);
+ sphereVerts.push(0);
+
+ //set the buffer data
+ curContext.bindBuffer(curContext.ARRAY_BUFFER, sphereBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(sphereVerts), curContext.STATIC_DRAW);
+ };
+
+ /**
+ * The sphereDetail() function controls the detail used to render a sphere by adjusting the number of
+ * vertices of the sphere mesh. The default resolution is 30, which creates
+ * a fairly detailed sphere definition with vertices every 360/30 = 12
+ * degrees. If you're going to render a great number of spheres per frame,
+ * it is advised to reduce the level of detail using this function.
+ * The setting stays active until <b>sphereDetail()</b> is called again with
+ * a new parameter and so should <i>not</i> be called prior to every
+ * <b>sphere()</b> statement, unless you wish to render spheres with
+ * different settings, e.g. using less detail for smaller spheres or ones
+ * further away from the camera. To control the detail of the horizontal
+ * and vertical resolution independently, use the version of the functions
+ * with two parameters. Calling this function with one parameter sets the number of segments
+ *(minimum of 3) used per full circle revolution. This is equivalent to calling the function with
+ * two identical values.
+ *
+ * @param {int} ures number of segments used horizontally (longitudinally) per full circle revolution
+ * @param {int} vres number of segments used vertically (latitudinally) from top to bottom
+ *
+ * @see #sphere()
+ */
+ p.sphereDetail = function(ures, vres) {
+ var i;
+
+ if (arguments.length === 1) {
+ ures = vres = arguments[0];
+ }
+
+ if (ures < 3) {
+ ures = 3;
+ } // force a minimum res
+ if (vres < 2) {
+ vres = 2;
+ } // force a minimum res
+ // if it hasn't changed do nothing
+ if ((ures === sphereDetailU) && (vres === sphereDetailV)) {
+ return;
+ }
+
+ var delta = PConstants.SINCOS_LENGTH / ures;
+ var cx = new Float32Array(ures);
+ var cz = new Float32Array(ures);
+ // calc unit circle in XZ plane
+ for (i = 0; i < ures; i++) {
+ cx[i] = cosLUT[((i * delta) % PConstants.SINCOS_LENGTH) | 0];
+ cz[i] = sinLUT[((i * delta) % PConstants.SINCOS_LENGTH) | 0];
+ }
+
+ // computing vertexlist
+ // vertexlist starts at south pole
+ var vertCount = ures * (vres - 1) + 2;
+ var currVert = 0;
+
+ // re-init arrays to store vertices
+ sphereX = new Float32Array(vertCount);
+ sphereY = new Float32Array(vertCount);
+ sphereZ = new Float32Array(vertCount);
+
+ var angle_step = (PConstants.SINCOS_LENGTH * 0.5) / vres;
+ var angle = angle_step;
+
+ // step along Y axis
+ for (i = 1; i < vres; i++) {
+ var curradius = sinLUT[(angle % PConstants.SINCOS_LENGTH) | 0];
+ var currY = -cosLUT[(angle % PConstants.SINCOS_LENGTH) | 0];
+ for (var j = 0; j < ures; j++) {
+ sphereX[currVert] = cx[j] * curradius;
+ sphereY[currVert] = currY;
+ sphereZ[currVert++] = cz[j] * curradius;
+ }
+ angle += angle_step;
+ }
+ sphereDetailU = ures;
+ sphereDetailV = vres;
+
+ // make the sphere verts and norms
+ initSphere();
+ };
+
+ /**
+ * The sphere() function draws a sphere with radius r centered at coordinate 0, 0, 0.
+ * A sphere is a hollow ball made from tessellated triangles.
+ *
+ * @param {int|float} r the radius of the sphere
+ */
+ Drawing2D.prototype.sphere = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.sphere = function() {
+ var sRad = arguments[0];
+
+ if ((sphereDetailU < 3) || (sphereDetailV < 2)) {
+ p.sphereDetail(30);
+ }
+
+ // Modeling transformation.
+ var model = new PMatrix3D();
+ model.scale(sRad, sRad, sRad);
+
+ // viewing transformation needs to have Y flipped
+ // becuase that's what Processing does.
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ if (doFill) {
+ // Calculating the normal matrix can be expensive, so only
+ // do it if it's necessary.
+ if(lightCount > 0){
+ // Create a normal transformation matrix.
+ var v = new PMatrix3D();
+ v.set(view);
+
+ var m = new PMatrix3D();
+ m.set(model);
+
+ v.mult(m);
+
+ var normalMatrix = new PMatrix3D();
+ normalMatrix.set(v);
+ normalMatrix.invert();
+ normalMatrix.transpose();
+
+ uniformMatrix("uNormalTransform3d", programObject3D, "uNormalTransform", false, normalMatrix.array());
+ vertexAttribPointer("aNormal3d", programObject3D, "aNormal", 3, sphereBuffer);
+ }
+ else{
+ disableVertexAttribPointer("aNormal3d", programObject3D, "aNormal");
+ }
+
+ curContext.useProgram(programObject3D);
+ disableVertexAttribPointer("aTexture3d", programObject3D, "aTexture");
+
+ uniformMatrix("uModel3d", programObject3D, "uModel", false, model.array());
+ uniformMatrix("uView3d", programObject3D, "uView", false, view.array());
+ vertexAttribPointer("aVertex3d", programObject3D, "aVertex", 3, sphereBuffer);
+
+ // Turn off per vertex colors.
+ disableVertexAttribPointer("aColor3d", programObject3D, "aColor");
+
+ // fix stitching problems. (lines get occluded by triangles
+ // since they share the same depth values). This is not entirely
+ // working, but it's a start for drawing the outline. So
+ // developers can start playing around with styles.
+ curContext.enable(curContext.POLYGON_OFFSET_FILL);
+ curContext.polygonOffset(1, 1);
+ uniformf("uColor3d", programObject3D, "uColor", fillStyle);
+ curContext.drawArrays(curContext.TRIANGLE_STRIP, 0, sphereVerts.length / 3);
+ curContext.disable(curContext.POLYGON_OFFSET_FILL);
+ }
+
+ // Draw the sphere outline.
+ if (lineWidth > 0 && doStroke) {
+ curContext.useProgram(programObject2D);
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, model.array());
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+ vertexAttribPointer("aVertex2d", programObject2D, "aVertex", 3, sphereBuffer);
+ disableVertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord");
+ uniformf("uColor2d", programObject2D, "uColor", strokeStyle);
+ uniformi("uIsDrawingText", programObject2D, "uIsDrawingText", false);
+ curContext.drawArrays(curContext.LINE_STRIP, 0, sphereVerts.length / 3);
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Coordinates
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Returns the three-dimensional X, Y, Z position in model space. This returns
+ * the X value for a given coordinate based on the current set of transformations
+ * (scale, rotate, translate, etc.) The X value can be used to place an object
+ * in space relative to the location of the original point once the transformations
+ * are no longer in use.<br />
+ * <br />
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see modelY
+ * @see modelZ
+ */
+ p.modelX = function(x, y, z) {
+ var mv = modelView.array();
+ var ci = cameraInv.array();
+
+ var ax = mv[0] * x + mv[1] * y + mv[2] * z + mv[3];
+ var ay = mv[4] * x + mv[5] * y + mv[6] * z + mv[7];
+ var az = mv[8] * x + mv[9] * y + mv[10] * z + mv[11];
+ var aw = mv[12] * x + mv[13] * y + mv[14] * z + mv[15];
+
+ var ox = ci[0] * ax + ci[1] * ay + ci[2] * az + ci[3] * aw;
+ var ow = ci[12] * ax + ci[13] * ay + ci[14] * az + ci[15] * aw;
+
+ return (ow !== 0) ? ox / ow : ox;
+ };
+
+ /**
+ * Returns the three-dimensional X, Y, Z position in model space. This returns
+ * the Y value for a given coordinate based on the current set of transformations
+ * (scale, rotate, translate, etc.) The Y value can be used to place an object in
+ * space relative to the location of the original point once the transformations
+ * are no longer in use.<br />
+ * <br />
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see modelX
+ * @see modelZ
+ */
+ p.modelY = function(x, y, z) {
+ var mv = modelView.array();
+ var ci = cameraInv.array();
+
+ var ax = mv[0] * x + mv[1] * y + mv[2] * z + mv[3];
+ var ay = mv[4] * x + mv[5] * y + mv[6] * z + mv[7];
+ var az = mv[8] * x + mv[9] * y + mv[10] * z + mv[11];
+ var aw = mv[12] * x + mv[13] * y + mv[14] * z + mv[15];
+
+ var oy = ci[4] * ax + ci[5] * ay + ci[6] * az + ci[7] * aw;
+ var ow = ci[12] * ax + ci[13] * ay + ci[14] * az + ci[15] * aw;
+
+ return (ow !== 0) ? oy / ow : oy;
+ };
+
+ /**
+ * Returns the three-dimensional X, Y, Z position in model space. This returns
+ * the Z value for a given coordinate based on the current set of transformations
+ * (scale, rotate, translate, etc.) The Z value can be used to place an object in
+ * space relative to the location of the original point once the transformations
+ * are no longer in use.
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see modelX
+ * @see modelY
+ */
+ p.modelZ = function(x, y, z) {
+ var mv = modelView.array();
+ var ci = cameraInv.array();
+
+ var ax = mv[0] * x + mv[1] * y + mv[2] * z + mv[3];
+ var ay = mv[4] * x + mv[5] * y + mv[6] * z + mv[7];
+ var az = mv[8] * x + mv[9] * y + mv[10] * z + mv[11];
+ var aw = mv[12] * x + mv[13] * y + mv[14] * z + mv[15];
+
+ var oz = ci[8] * ax + ci[9] * ay + ci[10] * az + ci[11] * aw;
+ var ow = ci[12] * ax + ci[13] * ay + ci[14] * az + ci[15] * aw;
+
+ return (ow !== 0) ? oz / ow : oz;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Material Properties
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Sets the ambient reflectance for shapes drawn to the screen. This is
+ * combined with the ambient light component of environment. The color
+ * components set through the parameters define the reflectance. For example in
+ * the default color mode, setting v1=255, v2=126, v3=0, would cause all the
+ * red light to reflect and half of the green light to reflect. Used in combination
+ * with <b>emissive()</b>, <b>specular()</b>, and <b>shininess()</b> in setting
+ * the materal properties of shapes.
+ *
+ * @param {int | float} gray
+ *
+ * @returns none
+ *
+ * @see emissive
+ * @see specular
+ * @see shininess
+ */
+ Drawing2D.prototype.ambient = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.ambient = function(v1, v2, v3) {
+ curContext.useProgram(programObject3D);
+ uniformi("uUsingMat3d", programObject3D, "uUsingMat", true);
+ var col = p.color(v1, v2, v3);
+ uniformf("uMaterialAmbient3d", programObject3D, "uMaterialAmbient", p.color.toGLArray(col).slice(0, 3));
+ };
+
+ /**
+ * Sets the emissive color of the material used for drawing shapes
+ * drawn to the screen. Used in combination with ambient(), specular(),
+ * and shininess() in setting the material properties of shapes.
+ *
+ * Can be called in the following ways:
+ *
+ * emissive(gray)
+ * @param {int | float} gray number specifying value between white and black
+ *
+ * emissive(color)
+ * @param {color} color any value of the color datatype
+ *
+ * emissive(v1, v2, v3)
+ * @param {int | float} v1 red or hue value
+ * @param {int | float} v2 green or saturation value
+ * @param {int | float} v3 blue or brightness value
+ *
+ * @returns none
+ *
+ * @see ambient
+ * @see specular
+ * @see shininess
+ */
+ Drawing2D.prototype.emissive = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.emissive = function(v1, v2, v3) {
+ curContext.useProgram(programObject3D);
+ uniformi("uUsingMat3d", programObject3D, "uUsingMat", true);
+ var col = p.color(v1, v2, v3);
+ uniformf("uMaterialEmissive3d", programObject3D, "uMaterialEmissive", p.color.toGLArray(col).slice(0, 3));
+ };
+
+ /**
+ * Sets the amount of gloss in the surface of shapes. Used in combination with
+ * <b>ambient()</b>, <b>specular()</b>, and <b>emissive()</b> in setting the
+ * material properties of shapes.
+ *
+ * @param {float} shine degree of shininess
+ *
+ * @returns none
+ */
+ Drawing2D.prototype.shininess = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.shininess = function(shine) {
+ curContext.useProgram(programObject3D);
+ uniformi("uUsingMat3d", programObject3D, "uUsingMat", true);
+ uniformf("uShininess3d", programObject3D, "uShininess", shine);
+ };
+
+ /**
+ * Sets the specular color of the materials used for shapes drawn to the screen,
+ * which sets the color of hightlights. Specular refers to light which bounces
+ * off a surface in a perferred direction (rather than bouncing in all directions
+ * like a diffuse light). Used in combination with emissive(), ambient(), and
+ * shininess() in setting the material properties of shapes.
+ *
+ * Can be called in the following ways:
+ *
+ * specular(gray)
+ * @param {int | float} gray number specifying value between white and black
+ *
+ * specular(gray, alpha)
+ * @param {int | float} gray number specifying value between white and black
+ * @param {int | float} alpha opacity
+ *
+ * specular(color)
+ * @param {color} color any value of the color datatype
+ *
+ * specular(v1, v2, v3)
+ * @param {int | float} v1 red or hue value
+ * @param {int | float} v2 green or saturation value
+ * @param {int | float} v3 blue or brightness value
+ *
+ * specular(v1, v2, v3, alpha)
+ * @param {int | float} v1 red or hue value
+ * @param {int | float} v2 green or saturation value
+ * @param {int | float} v3 blue or brightness value
+ * @param {int | float} alpha opacity
+ *
+ * @returns none
+ *
+ * @see ambient
+ * @see emissive
+ * @see shininess
+ */
+ Drawing2D.prototype.specular = DrawingShared.prototype.a3DOnlyFunction;
+
+ Drawing3D.prototype.specular = function(v1, v2, v3) {
+ curContext.useProgram(programObject3D);
+ uniformi("uUsingMat3d", programObject3D, "uUsingMat", true);
+ var col = p.color(v1, v2, v3);
+ uniformf("uMaterialSpecular3d", programObject3D, "uMaterialSpecular", p.color.toGLArray(col).slice(0, 3));
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Coordinates
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Takes a three-dimensional X, Y, Z position and returns the X value for
+ * where it will appear on a (two-dimensional) screen.
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z optional coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see screenY
+ * @see screenZ
+ */
+ p.screenX = function( x, y, z ) {
+ var mv = modelView.array();
+ if( mv.length === 16 )
+ {
+ var ax = mv[ 0]*x + mv[ 1]*y + mv[ 2]*z + mv[ 3];
+ var ay = mv[ 4]*x + mv[ 5]*y + mv[ 6]*z + mv[ 7];
+ var az = mv[ 8]*x + mv[ 9]*y + mv[10]*z + mv[11];
+ var aw = mv[12]*x + mv[13]*y + mv[14]*z + mv[15];
+
+ var pj = projection.array();
+
+ var ox = pj[ 0]*ax + pj[ 1]*ay + pj[ 2]*az + pj[ 3]*aw;
+ var ow = pj[12]*ax + pj[13]*ay + pj[14]*az + pj[15]*aw;
+
+ if ( ow !== 0 ){
+ ox /= ow;
+ }
+ return p.width * ( 1 + ox ) / 2.0;
+ }
+ // We assume that we're in 2D
+ return modelView.multX(x, y);
+ };
+
+ /**
+ * Takes a three-dimensional X, Y, Z position and returns the Y value for
+ * where it will appear on a (two-dimensional) screen.
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z optional coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see screenX
+ * @see screenZ
+ */
+ p.screenY = function screenY( x, y, z ) {
+ var mv = modelView.array();
+ if( mv.length === 16 ) {
+ var ax = mv[ 0]*x + mv[ 1]*y + mv[ 2]*z + mv[ 3];
+ var ay = mv[ 4]*x + mv[ 5]*y + mv[ 6]*z + mv[ 7];
+ var az = mv[ 8]*x + mv[ 9]*y + mv[10]*z + mv[11];
+ var aw = mv[12]*x + mv[13]*y + mv[14]*z + mv[15];
+
+ var pj = projection.array();
+
+ var oy = pj[ 4]*ax + pj[ 5]*ay + pj[ 6]*az + pj[ 7]*aw;
+ var ow = pj[12]*ax + pj[13]*ay + pj[14]*az + pj[15]*aw;
+
+ if ( ow !== 0 ){
+ oy /= ow;
+ }
+ return p.height * ( 1 + oy ) / 2.0;
+ }
+ // We assume that we're in 2D
+ return modelView.multY(x, y);
+ };
+
+ /**
+ * Takes a three-dimensional X, Y, Z position and returns the Z value for
+ * where it will appear on a (two-dimensional) screen.
+ *
+ * @param {int | float} x 3D x coordinate to be mapped
+ * @param {int | float} y 3D y coordinate to be mapped
+ * @param {int | float} z 3D z coordinate to be mapped
+ *
+ * @returns {float}
+ *
+ * @see screenX
+ * @see screenY
+ */
+ p.screenZ = function screenZ( x, y, z ) {
+ var mv = modelView.array();
+ if( mv.length !== 16 ) {
+ return 0;
+ }
+
+ var pj = projection.array();
+
+ var ax = mv[ 0]*x + mv[ 1]*y + mv[ 2]*z + mv[ 3];
+ var ay = mv[ 4]*x + mv[ 5]*y + mv[ 6]*z + mv[ 7];
+ var az = mv[ 8]*x + mv[ 9]*y + mv[10]*z + mv[11];
+ var aw = mv[12]*x + mv[13]*y + mv[14]*z + mv[15];
+
+ var oz = pj[ 8]*ax + pj[ 9]*ay + pj[10]*az + pj[11]*aw;
+ var ow = pj[12]*ax + pj[13]*ay + pj[14]*az + pj[15]*aw;
+
+ if ( ow !== 0 ) {
+ oz /= ow;
+ }
+ return ( oz + 1 ) / 2.0;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Style functions
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * The fill() function sets the color used to fill shapes. For example, if you run <b>fill(204, 102, 0)</b>, all subsequent shapes will be filled with orange.
+ * This color is either specified in terms of the RGB or HSB color depending on the current <b>colorMode()</b>
+ *(the default color space is RGB, with each value in the range from 0 to 255).
+ * <br><br>When using hexadecimal notation to specify a color, use "#" or "0x" before the values (e.g. #CCFFAA, 0xFFCCFFAA).
+ * The # syntax uses six digits to specify a color (the way colors are specified in HTML and CSS). When using the hexadecimal notation starting with "0x",
+ * the hexadecimal value must be specified with eight characters; the first two characters define the alpha component and the remainder the red, green, and blue components.
+ * <br><br>The value for the parameter "gray" must be less than or equal to the current maximum value as specified by <b>colorMode()</b>. The default maximum value is 255.
+ * <br><br>To change the color of an image (or a texture), use tint().
+ *
+ * @param {int|float} gray number specifying value between white and black
+ * @param {int|float} value1 red or hue value
+ * @param {int|float} value2 green or saturation value
+ * @param {int|float} value3 blue or brightness value
+ * @param {int|float} alpha opacity of the fill
+ * @param {Color} color any value of the color datatype
+ * @param {int} hex color value in hexadecimal notation (i.e. #FFCC00 or 0xFFFFCC00)
+ *
+ * @see #noFill()
+ * @see #stroke()
+ * @see #tint()
+ * @see #background()
+ * @see #colorMode()
+ */
+ DrawingShared.prototype.fill = function() {
+ var color = p.color.apply(this, arguments);
+ if(color === currentFillColor && doFill) {
+ return;
+ }
+ doFill = true;
+ currentFillColor = color;
+ };
+
+ Drawing2D.prototype.fill = function() {
+ DrawingShared.prototype.fill.apply(this, arguments);
+ isFillDirty = true;
+ };
+
+ Drawing3D.prototype.fill = function() {
+ DrawingShared.prototype.fill.apply(this, arguments);
+ fillStyle = p.color.toGLArray(currentFillColor);
+ };
+
+ function executeContextFill() {
+ if(doFill) {
+ if(isFillDirty) {
+ curContext.fillStyle = p.color.toString(currentFillColor);
+ isFillDirty = false;
+ }
+ curContext.fill();
+ }
+ }
+
+ /**
+ * The noFill() function disables filling geometry. If both <b>noStroke()</b> and <b>noFill()</b>
+ * are called, no shapes will be drawn to the screen.
+ *
+ * @see #fill()
+ *
+ */
+ p.noFill = function() {
+ doFill = false;
+ };
+
+ /**
+ * The stroke() function sets the color used to draw lines and borders around shapes. This color
+ * is either specified in terms of the RGB or HSB color depending on the
+ * current <b>colorMode()</b> (the default color space is RGB, with each
+ * value in the range from 0 to 255).
+ * <br><br>When using hexadecimal notation to specify a color, use "#" or
+ * "0x" before the values (e.g. #CCFFAA, 0xFFCCFFAA). The # syntax uses six
+ * digits to specify a color (the way colors are specified in HTML and CSS).
+ * When using the hexadecimal notation starting with "0x", the hexadecimal
+ * value must be specified with eight characters; the first two characters
+ * define the alpha component and the remainder the red, green, and blue
+ * components.
+ * <br><br>The value for the parameter "gray" must be less than or equal
+ * to the current maximum value as specified by <b>colorMode()</b>.
+ * The default maximum value is 255.
+ *
+ * @param {int|float} gray number specifying value between white and black
+ * @param {int|float} value1 red or hue value
+ * @param {int|float} value2 green or saturation value
+ * @param {int|float} value3 blue or brightness value
+ * @param {int|float} alpha opacity of the stroke
+ * @param {Color} color any value of the color datatype
+ * @param {int} hex color value in hexadecimal notation (i.e. #FFCC00 or 0xFFFFCC00)
+ *
+ * @see #fill()
+ * @see #noStroke()
+ * @see #tint()
+ * @see #background()
+ * @see #colorMode()
+ */
+ DrawingShared.prototype.stroke = function() {
+ var color = p.color.apply(this, arguments);
+ if(color === currentStrokeColor && doStroke) {
+ return;
+ }
+ doStroke = true;
+ currentStrokeColor = color;
+ };
+
+ Drawing2D.prototype.stroke = function() {
+ DrawingShared.prototype.stroke.apply(this, arguments);
+ isStrokeDirty = true;
+ };
+
+ Drawing3D.prototype.stroke = function() {
+ DrawingShared.prototype.stroke.apply(this, arguments);
+ strokeStyle = p.color.toGLArray(currentStrokeColor);
+ };
+
+ function executeContextStroke() {
+ if(doStroke) {
+ if(isStrokeDirty) {
+ curContext.strokeStyle = p.color.toString(currentStrokeColor);
+ isStrokeDirty = false;
+ }
+ curContext.stroke();
+ }
+ }
+
+ /**
+ * The noStroke() function disables drawing the stroke (outline). If both <b>noStroke()</b> and
+ * <b>noFill()</b> are called, no shapes will be drawn to the screen.
+ *
+ * @see #stroke()
+ */
+ p.noStroke = function() {
+ doStroke = false;
+ };
+
+ /**
+ * The strokeWeight() function sets the width of the stroke used for lines, points, and the border around shapes.
+ * All widths are set in units of pixels.
+ *
+ * @param {int|float} w the weight (in pixels) of the stroke
+ */
+ DrawingShared.prototype.strokeWeight = function(w) {
+ lineWidth = w;
+ };
+
+ Drawing2D.prototype.strokeWeight = function(w) {
+ DrawingShared.prototype.strokeWeight.apply(this, arguments);
+ curContext.lineWidth = w;
+ };
+
+ Drawing3D.prototype.strokeWeight = function(w) {
+ DrawingShared.prototype.strokeWeight.apply(this, arguments);
+
+ // Processing groups the weight of points and lines under this one function,
+ // but for WebGL, we need to set a uniform for points and call a function for line.
+
+ curContext.useProgram(programObject2D);
+ uniformf("pointSize2d", programObject2D, "uPointSize", w);
+
+ curContext.useProgram(programObjectUnlitShape);
+ uniformf("pointSizeUnlitShape", programObjectUnlitShape, "uPointSize", w);
+
+ curContext.lineWidth(w);
+ };
+
+ /**
+ * The strokeCap() function sets the style for rendering line endings. These ends are either squared, extended, or rounded and
+ * specified with the corresponding parameters SQUARE, PROJECT, and ROUND. The default cap is ROUND.
+ * This function is not available with the P2D, P3D, or OPENGL renderers
+ *
+ * @param {int} value Either SQUARE, PROJECT, or ROUND
+ */
+ p.strokeCap = function(value) {
+ drawing.$ensureContext().lineCap = value;
+ };
+
+ /**
+ * The strokeJoin() function sets the style of the joints which connect line segments.
+ * These joints are either mitered, beveled, or rounded and specified with the corresponding parameters MITER, BEVEL, and ROUND. The default joint is MITER.
+ * This function is not available with the P2D, P3D, or OPENGL renderers
+ *
+ * @param {int} value Either SQUARE, PROJECT, or ROUND
+ */
+ p.strokeJoin = function(value) {
+ drawing.$ensureContext().lineJoin = value;
+ };
+
+ /**
+ * The smooth() function draws all geometry with smooth (anti-aliased) edges. This will slow down the frame rate of the application,
+ * but will enhance the visual refinement. <br/><br/>
+ * Note that smooth() will also improve image quality of resized images, and noSmooth() will disable image (and font) smoothing altogether.
+ * When working with a 3D sketch, smooth will draw points as circles rather than squares.
+ *
+ * @see #noSmooth()
+ * @see #hint()
+ * @see #size()
+ */
+
+ Drawing2D.prototype.smooth = function() {
+ renderSmooth = true;
+ var style = curElement.style;
+ style.setProperty("image-rendering", "optimizeQuality", "important");
+ style.setProperty("-ms-interpolation-mode", "bicubic", "important");
+ if (curContext.hasOwnProperty("mozImageSmoothingEnabled")) {
+ curContext.mozImageSmoothingEnabled = true;
+ }
+ };
+
+ Drawing3D.prototype.smooth = function(){
+ renderSmooth = true;
+ };
+
+ /**
+ * The noSmooth() function draws all geometry with jagged (aliased) edges.
+ *
+ * @see #smooth()
+ */
+
+ Drawing2D.prototype.noSmooth = function() {
+ renderSmooth = false;
+ var style = curElement.style;
+ style.setProperty("image-rendering", "optimizeSpeed", "important");
+ style.setProperty("image-rendering", "-moz-crisp-edges", "important");
+ style.setProperty("image-rendering", "-webkit-optimize-contrast", "important");
+ style.setProperty("image-rendering", "optimize-contrast", "important");
+ style.setProperty("-ms-interpolation-mode", "nearest-neighbor", "important");
+ if (curContext.hasOwnProperty("mozImageSmoothingEnabled")) {
+ curContext.mozImageSmoothingEnabled = false;
+ }
+ };
+
+ Drawing3D.prototype.noSmooth = function(){
+ renderSmooth = false;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Vector drawing functions
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * The point() function draws a point, a coordinate in space at the dimension of one pixel.
+ * The first parameter is the horizontal value for the point, the second
+ * value is the vertical value for the point, and the optional third value
+ * is the depth value. Drawing this shape in 3D using the <b>z</b>
+ * parameter requires the P3D or OPENGL parameter in combination with
+ * size as shown in the above example.
+ *
+ * @param {int|float} x x-coordinate of the point
+ * @param {int|float} y y-coordinate of the point
+ * @param {int|float} z z-coordinate of the point
+ *
+ * @see #beginShape()
+ */
+ Drawing2D.prototype.point = function(x, y) {
+ if (!doStroke) {
+ return;
+ }
+ if (!renderSmooth) {
+ x = Math.round(x);
+ y = Math.round(y);
+ }
+ curContext.fillStyle = p.color.toString(currentStrokeColor);
+ isFillDirty = true;
+ // Draw a circle for any point larger than 1px
+ if (lineWidth > 1) {
+ curContext.beginPath();
+ curContext.arc(x, y, lineWidth / 2, 0, PConstants.TWO_PI, false);
+ curContext.fill();
+ } else {
+ curContext.fillRect(x, y, 1, 1);
+ }
+ };
+
+ Drawing3D.prototype.point = function(x, y, z) {
+ var model = new PMatrix3D();
+
+ // move point to position
+ model.translate(x, y, z || 0);
+ model.transpose();
+
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ curContext.useProgram(programObject2D);
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, model.array());
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+
+ if (lineWidth > 0 && doStroke) {
+ // this will be replaced with the new bit shifting color code
+ uniformf("uColor2d", programObject2D, "uColor", strokeStyle);
+ uniformi("uIsDrawingText2d", programObject2D, "uIsDrawingText", false);
+ uniformi("uSmooth2d", programObject2D, "uSmooth", renderSmooth);
+ vertexAttribPointer("aVertex2d", programObject2D, "aVertex", 3, pointBuffer);
+ disableVertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord");
+ curContext.drawArrays(curContext.POINTS, 0, 1);
+ }
+ };
+
+ /**
+ * Using the <b>beginShape()</b> and <b>endShape()</b> functions allow creating more complex forms.
+ * <b>beginShape()</b> begins recording vertices for a shape and <b>endShape()</b> stops recording.
+ * The value of the <b>MODE</b> parameter tells it which types of shapes to create from the provided vertices.
+ * With no mode specified, the shape can be any irregular polygon. After calling the <b>beginShape()</b> function,
+ * a series of <b>vertex()</b> commands must follow. To stop drawing the shape, call <b>endShape()</b>.
+ * The <b>vertex()</b> function with two parameters specifies a position in 2D and the <b>vertex()</b>
+ * function with three parameters specifies a position in 3D. Each shape will be outlined with the current
+ * stroke color and filled with the fill color.
+ *
+ * @param {int} MODE either POINTS, LINES, TRIANGLES, TRIANGLE_FAN, TRIANGLE_STRIP, QUADS, and QUAD_STRIP.
+ *
+ * @see endShape
+ * @see vertex
+ * @see curveVertex
+ * @see bezierVertex
+ */
+ p.beginShape = function(type) {
+ curShape = type;
+ curvePoints = [];
+ vertArray = [];
+ };
+
+ /**
+ * All shapes are constructed by connecting a series of vertices. <b>vertex()</b> is used to specify the vertex
+ * coordinates for points, lines, triangles, quads, and polygons and is used exclusively within the <b>beginShape()</b>
+ * and <b>endShape()</b> function. <br /><br />Drawing a vertex in 3D using the <b>z</b> parameter requires the P3D or
+ * OPENGL parameter in combination with size as shown in the above example.<br /><br />This function is also used to map a
+ * texture onto the geometry. The <b>texture()</b> function declares the texture to apply to the geometry and the <b>u</b>
+ * and <b>v</b> coordinates set define the mapping of this texture to the form. By default, the coordinates used for
+ * <b>u</b> and <b>v</b> are specified in relation to the image's size in pixels, but this relation can be changed with
+ * <b>textureMode()</b>.
+ *
+ * @param {int | float} x x-coordinate of the vertex
+ * @param {int | float} y y-coordinate of the vertex
+ * @param {boolean} moveto flag to indicate whether this is a new subpath
+ *
+ * @see beginShape
+ * @see endShape
+ * @see bezierVertex
+ * @see curveVertex
+ * @see texture
+ */
+
+ Drawing2D.prototype.vertex = function(x, y, moveTo) {
+ var vert = [];
+
+ if (firstVert) { firstVert = false; }
+ vert.isVert = true;
+
+ vert[0] = x;
+ vert[1] = y;
+ vert[2] = 0;
+ vert[3] = 0;
+ vert[4] = 0;
+
+ // fill and stroke color
+ vert[5] = currentFillColor;
+ vert[6] = currentStrokeColor;
+
+ vertArray.push(vert);
+ if (moveTo) {
+ vertArray[vertArray.length-1].moveTo = moveTo;
+ }
+ };
+
+ Drawing3D.prototype.vertex = function(x, y, z, u, v) {
+ var vert = [];
+
+ if (firstVert) { firstVert = false; }
+ vert.isVert = true;
+
+ if (v === undef && usingTexture) {
+ v = u;
+ u = z;
+ z = 0;
+ }
+
+ // Convert u and v to normalized coordinates
+ if (u !== undef && v !== undef) {
+ if (curTextureMode === PConstants.IMAGE) {
+ u /= curTexture.width;
+ v /= curTexture.height;
+ }
+ u = u > 1 ? 1 : u;
+ u = u < 0 ? 0 : u;
+ v = v > 1 ? 1 : v;
+ v = v < 0 ? 0 : v;
+ }
+
+ vert[0] = x;
+ vert[1] = y;
+ vert[2] = z || 0;
+ vert[3] = u || 0;
+ vert[4] = v || 0;
+
+ // fill rgba
+ vert[5] = fillStyle[0];
+ vert[6] = fillStyle[1];
+ vert[7] = fillStyle[2];
+ vert[8] = fillStyle[3];
+ // stroke rgba
+ vert[9] = strokeStyle[0];
+ vert[10] = strokeStyle[1];
+ vert[11] = strokeStyle[2];
+ vert[12] = strokeStyle[3];
+ //normals
+ vert[13] = normalX;
+ vert[14] = normalY;
+ vert[15] = normalZ;
+
+ vertArray.push(vert);
+ };
+
+ /**
+ * @private
+ * Renders 3D points created from calls to vertex and beginShape/endShape
+ *
+ * @param {Array} vArray an array of vertex coordinate
+ * @param {Array} cArray an array of colours used for the vertices
+ *
+ * @see beginShape
+ * @see endShape
+ * @see vertex
+ */
+ var point3D = function(vArray, cArray){
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ curContext.useProgram(programObjectUnlitShape);
+
+ uniformMatrix("uViewUS", programObjectUnlitShape, "uView", false, view.array());
+ uniformi("uSmoothUS", programObjectUnlitShape, "uSmooth", renderSmooth);
+
+ vertexAttribPointer("aVertexUS", programObjectUnlitShape, "aVertex", 3, pointBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(vArray), curContext.STREAM_DRAW);
+
+ vertexAttribPointer("aColorUS", programObjectUnlitShape, "aColor", 4, fillColorBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(cArray), curContext.STREAM_DRAW);
+
+ curContext.drawArrays(curContext.POINTS, 0, vArray.length/3);
+ };
+
+ /**
+ * @private
+ * Renders 3D lines created from calls to beginShape/vertex/endShape - based on the mode specified LINES, LINE_LOOP, etc.
+ *
+ * @param {Array} vArray an array of vertex coordinate
+ * @param {String} mode either LINES, LINE_LOOP, or LINE_STRIP
+ * @param {Array} cArray an array of colours used for the vertices
+ *
+ * @see beginShape
+ * @see endShape
+ * @see vertex
+ */
+ var line3D = function(vArray, mode, cArray){
+ var ctxMode;
+ if (mode === "LINES"){
+ ctxMode = curContext.LINES;
+ }
+ else if(mode === "LINE_LOOP"){
+ ctxMode = curContext.LINE_LOOP;
+ }
+ else{
+ ctxMode = curContext.LINE_STRIP;
+ }
+
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ curContext.useProgram(programObjectUnlitShape);
+ uniformMatrix("uViewUS", programObjectUnlitShape, "uView", false, view.array());
+ vertexAttribPointer("aVertexUS", programObjectUnlitShape, "aVertex", 3, lineBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(vArray), curContext.STREAM_DRAW);
+ vertexAttribPointer("aColorUS", programObjectUnlitShape, "aColor", 4, strokeColorBuffer);
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(cArray), curContext.STREAM_DRAW);
+ curContext.drawArrays(ctxMode, 0, vArray.length/3);
+ };
+
+ /**
+ * @private
+ * Render filled shapes created from calls to beginShape/vertex/endShape - based on the mode specified TRIANGLES, etc.
+ *
+ * @param {Array} vArray an array of vertex coordinate
+ * @param {String} mode either LINES, LINE_LOOP, or LINE_STRIP
+ * @param {Array} cArray an array of colours used for the vertices
+ * @param {Array} tArray an array of u,v coordinates for textures
+ *
+ * @see beginShape
+ * @see endShape
+ * @see vertex
+ */
+ var fill3D = function(vArray, mode, cArray, tArray){
+ var ctxMode;
+ if (mode === "TRIANGLES") {
+ ctxMode = curContext.TRIANGLES;
+ } else if(mode === "TRIANGLE_FAN") {
+ ctxMode = curContext.TRIANGLE_FAN;
+ } else {
+ ctxMode = curContext.TRIANGLE_STRIP;
+ }
+
+ var view = new PMatrix3D();
+ view.scale( 1, -1, 1 );
+ view.apply( modelView.array() );
+ view.transpose();
+
+ curContext.useProgram( programObject3D );
+ uniformMatrix( "model3d", programObject3D, "uModel", false, [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1] );
+ uniformMatrix( "view3d", programObject3D, "uView", false, view.array() );
+ curContext.enable( curContext.POLYGON_OFFSET_FILL );
+ curContext.polygonOffset( 1, 1 );
+ uniformf( "color3d", programObject3D, "uColor", [-1,0,0,0] );
+ vertexAttribPointer( "vertex3d", programObject3D, "aVertex", 3, fillBuffer );
+ curContext.bufferData( curContext.ARRAY_BUFFER, new Float32Array(vArray), curContext.STREAM_DRAW );
+
+ // if we are using a texture and a tint, then overwrite the
+ // contents of the color buffer with the current tint
+ if ( usingTexture && curTint !== null ){
+ curTint3d( cArray );
+ }
+
+ vertexAttribPointer( "aColor3d", programObject3D, "aColor", 4, fillColorBuffer );
+ curContext.bufferData( curContext.ARRAY_BUFFER, new Float32Array(cArray), curContext.STREAM_DRAW );
+
+ // No support for lights....yet
+ disableVertexAttribPointer( "aNormal3d", programObject3D, "aNormal" );
+
+ if ( usingTexture ) {
+ uniformi( "uUsingTexture3d", programObject3D, "uUsingTexture", usingTexture );
+ vertexAttribPointer( "aTexture3d", programObject3D, "aTexture", 2, shapeTexVBO );
+ curContext.bufferData( curContext.ARRAY_BUFFER, new Float32Array(tArray), curContext.STREAM_DRAW );
+ }
+
+ curContext.drawArrays( ctxMode, 0, vArray.length/3 );
+ curContext.disable( curContext.POLYGON_OFFSET_FILL );
+ };
+
+ /**
+ * this series of three operations is used a lot in Drawing2D.prototype.endShape
+ * and has been split off as its own function, to tighten the code and allow for
+ * fewer bugs.
+ */
+ function fillStrokeClose() {
+ executeContextFill();
+ executeContextStroke();
+ curContext.closePath();
+ }
+
+ /**
+ * The endShape() function is the companion to beginShape() and may only be called after beginShape().
+ * When endshape() is called, all of image data defined since the previous call to beginShape() is written
+ * into the image buffer.
+ *
+ * @param {int} MODE Use CLOSE to close the shape
+ *
+ * @see beginShape
+ */
+ Drawing2D.prototype.endShape = function(mode) {
+ // Duplicated in Drawing3D; too many variables used
+ if (vertArray.length === 0) { return; }
+
+ var closeShape = mode === PConstants.CLOSE;
+
+ // if the shape is closed, the first element is also the last element
+ if (closeShape) {
+ vertArray.push(vertArray[0]);
+ }
+
+ var lineVertArray = [];
+ var fillVertArray = [];
+ var colorVertArray = [];
+ var strokeVertArray = [];
+ var texVertArray = [];
+ var cachedVertArray;
+
+ firstVert = true;
+ var i, j, k;
+ var vertArrayLength = vertArray.length;
+
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // 5,6,7,8
+ // R,G,B,A - fill colour
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // 9,10,11,12
+ // R, G, B, A - stroke colour
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // texture u,v
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ texVertArray.push(cachedVertArray[3]);
+ texVertArray.push(cachedVertArray[4]);
+ }
+
+ // curveVertex
+ if ( isCurve && (curShape === PConstants.POLYGON || curShape === undef) ) {
+ if (vertArrayLength > 3) {
+ var b = [],
+ s = 1 - curTightness;
+ curContext.beginPath();
+ curContext.moveTo(vertArray[1][0], vertArray[1][1]);
+ /*
+ * Matrix to convert from Catmull-Rom to cubic Bezier
+ * where t = curTightness
+ * |0 1 0 0 |
+ * |(t-1)/6 1 (1-t)/6 0 |
+ * |0 (1-t)/6 1 (t-1)/6 |
+ * |0 0 0 0 |
+ */
+ for (i = 1; (i+2) < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ b[0] = [cachedVertArray[0], cachedVertArray[1]];
+ b[1] = [cachedVertArray[0] + (s * vertArray[i+1][0] - s * vertArray[i-1][0]) / 6,
+ cachedVertArray[1] + (s * vertArray[i+1][1] - s * vertArray[i-1][1]) / 6];
+ b[2] = [vertArray[i+1][0] + (s * vertArray[i][0] - s * vertArray[i+2][0]) / 6,
+ vertArray[i+1][1] + (s * vertArray[i][1] - s * vertArray[i+2][1]) / 6];
+ b[3] = [vertArray[i+1][0], vertArray[i+1][1]];
+ curContext.bezierCurveTo(b[1][0], b[1][1], b[2][0], b[2][1], b[3][0], b[3][1]);
+ }
+ fillStrokeClose();
+ }
+ }
+
+ // bezierVertex
+ else if ( isBezier && (curShape === PConstants.POLYGON || curShape === undef) ) {
+ curContext.beginPath();
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ if (vertArray[i].isVert) { //if it is a vertex move to the position
+ if (vertArray[i].moveTo) {
+ curContext.moveTo(cachedVertArray[0], cachedVertArray[1]);
+ } else {
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+ }
+ } else { //otherwise continue drawing bezier
+ curContext.bezierCurveTo(vertArray[i][0], vertArray[i][1], vertArray[i][2], vertArray[i][3], vertArray[i][4], vertArray[i][5]);
+ }
+ }
+ fillStrokeClose();
+ }
+
+ // render the vertices provided
+ else {
+ if (curShape === PConstants.POINTS) {
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ if (doStroke) {
+ p.stroke(cachedVertArray[6]);
+ }
+ p.point(cachedVertArray[0], cachedVertArray[1]);
+ }
+ } else if (curShape === PConstants.LINES) {
+ for (i = 0; (i + 1) < vertArrayLength; i+=2) {
+ cachedVertArray = vertArray[i];
+ if (doStroke) {
+ p.stroke(vertArray[i+1][6]);
+ }
+ p.line(cachedVertArray[0], cachedVertArray[1], vertArray[i+1][0], vertArray[i+1][1]);
+ }
+ } else if (curShape === PConstants.TRIANGLES) {
+ for (i = 0; (i + 2) < vertArrayLength; i+=3) {
+ cachedVertArray = vertArray[i];
+ curContext.beginPath();
+ curContext.moveTo(cachedVertArray[0], cachedVertArray[1]);
+ curContext.lineTo(vertArray[i+1][0], vertArray[i+1][1]);
+ curContext.lineTo(vertArray[i+2][0], vertArray[i+2][1]);
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+
+ if (doFill) {
+ p.fill(vertArray[i+2][5]);
+ executeContextFill();
+ }
+ if (doStroke) {
+ p.stroke(vertArray[i+2][6]);
+ executeContextStroke();
+ }
+
+ curContext.closePath();
+ }
+ } else if (curShape === PConstants.TRIANGLE_STRIP) {
+ for (i = 0; (i+1) < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ curContext.beginPath();
+ curContext.moveTo(vertArray[i+1][0], vertArray[i+1][1]);
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+
+ if (doStroke) {
+ p.stroke(vertArray[i+1][6]);
+ }
+ if (doFill) {
+ p.fill(vertArray[i+1][5]);
+ }
+
+ if (i + 2 < vertArrayLength) {
+ curContext.lineTo(vertArray[i+2][0], vertArray[i+2][1]);
+ if (doStroke) {
+ p.stroke(vertArray[i+2][6]);
+ }
+ if (doFill) {
+ p.fill(vertArray[i+2][5]);
+ }
+ }
+ fillStrokeClose();
+ }
+ } else if (curShape === PConstants.TRIANGLE_FAN) {
+ if (vertArrayLength > 2) {
+ curContext.beginPath();
+ curContext.moveTo(vertArray[0][0], vertArray[0][1]);
+ curContext.lineTo(vertArray[1][0], vertArray[1][1]);
+ curContext.lineTo(vertArray[2][0], vertArray[2][1]);
+
+ if (doFill) {
+ p.fill(vertArray[2][5]);
+ executeContextFill();
+ }
+ if (doStroke) {
+ p.stroke(vertArray[2][6]);
+ executeContextStroke();
+ }
+
+ curContext.closePath();
+ for (i = 3; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ curContext.beginPath();
+ curContext.moveTo(vertArray[0][0], vertArray[0][1]);
+ curContext.lineTo(vertArray[i-1][0], vertArray[i-1][1]);
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+
+ if (doFill) {
+ p.fill(cachedVertArray[5]);
+ executeContextFill();
+ }
+ if (doStroke) {
+ p.stroke(cachedVertArray[6]);
+ executeContextStroke();
+ }
+
+ curContext.closePath();
+ }
+ }
+ } else if (curShape === PConstants.QUADS) {
+ for (i = 0; (i + 3) < vertArrayLength; i+=4) {
+ cachedVertArray = vertArray[i];
+ curContext.beginPath();
+ curContext.moveTo(cachedVertArray[0], cachedVertArray[1]);
+ for (j = 1; j < 4; j++) {
+ curContext.lineTo(vertArray[i+j][0], vertArray[i+j][1]);
+ }
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+
+ if (doFill) {
+ p.fill(vertArray[i+3][5]);
+ executeContextFill();
+ }
+ if (doStroke) {
+ p.stroke(vertArray[i+3][6]);
+ executeContextStroke();
+ }
+
+ curContext.closePath();
+ }
+ } else if (curShape === PConstants.QUAD_STRIP) {
+ if (vertArrayLength > 3) {
+ for (i = 0; (i+1) < vertArrayLength; i+=2) {
+ cachedVertArray = vertArray[i];
+ curContext.beginPath();
+ if (i+3 < vertArrayLength) {
+ curContext.moveTo(vertArray[i+2][0], vertArray[i+2][1]);
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+ curContext.lineTo(vertArray[i+1][0], vertArray[i+1][1]);
+ curContext.lineTo(vertArray[i+3][0], vertArray[i+3][1]);
+
+ if (doFill) {
+ p.fill(vertArray[i+3][5]);
+ }
+ if (doStroke) {
+ p.stroke(vertArray[i+3][6]);
+ }
+ } else {
+ curContext.moveTo(cachedVertArray[0], cachedVertArray[1]);
+ curContext.lineTo(vertArray[i+1][0], vertArray[i+1][1]);
+ }
+ fillStrokeClose();
+ }
+ }
+ } else {
+ curContext.beginPath();
+ curContext.moveTo(vertArray[0][0], vertArray[0][1]);
+ for (i = 1; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ if (cachedVertArray.isVert) { //if it is a vertex move to the position
+ if (cachedVertArray.moveTo) {
+ curContext.moveTo(cachedVertArray[0], cachedVertArray[1]);
+ } else {
+ curContext.lineTo(cachedVertArray[0], cachedVertArray[1]);
+ }
+ }
+ }
+ fillStrokeClose();
+ }
+ }
+
+ // Reset some settings
+ isCurve = false;
+ isBezier = false;
+ curveVertArray = [];
+ curveVertCount = 0;
+
+ // If the shape is closed, the first element was added as last element.
+ // We must remove it again to prevent the list of vertices from growing
+ // over successive calls to endShape(CLOSE)
+ if (closeShape) {
+ vertArray.pop();
+ }
+ };
+
+ Drawing3D.prototype.endShape = function(mode) {
+ // Duplicated in Drawing3D; too many variables used
+ if (vertArray.length === 0) { return; }
+
+ var closeShape = mode === PConstants.CLOSE;
+ var lineVertArray = [];
+ var fillVertArray = [];
+ var colorVertArray = [];
+ var strokeVertArray = [];
+ var texVertArray = [];
+ var cachedVertArray;
+
+ firstVert = true;
+ var i, j, k;
+ var vertArrayLength = vertArray.length;
+
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // 5,6,7,8
+ // R,G,B,A - fill colour
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // 9,10,11,12
+ // R, G, B, A - stroke colour
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ // texture u,v
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ texVertArray.push(cachedVertArray[3]);
+ texVertArray.push(cachedVertArray[4]);
+ }
+
+ // if shape is closed, push the first point into the last point (including colours)
+ if (closeShape) {
+ fillVertArray.push(vertArray[0][0]);
+ fillVertArray.push(vertArray[0][1]);
+ fillVertArray.push(vertArray[0][2]);
+
+ for (i = 5; i < 9; i++) {
+ colorVertArray.push(vertArray[0][i]);
+ }
+
+ for (i = 9; i < 13; i++) {
+ strokeVertArray.push(vertArray[0][i]);
+ }
+
+ texVertArray.push(vertArray[0][3]);
+ texVertArray.push(vertArray[0][4]);
+ }
+ // End duplication
+
+ // curveVertex
+ if ( isCurve && (curShape === PConstants.POLYGON || curShape === undef) ) {
+ lineVertArray = fillVertArray;
+ if (doStroke) {
+ line3D(lineVertArray, null, strokeVertArray);
+ }
+ if (doFill) {
+ fill3D(fillVertArray, null, colorVertArray);
+ }
+ }
+ // bezierVertex
+ else if ( isBezier && (curShape === PConstants.POLYGON || curShape === undef) ) {
+ lineVertArray = fillVertArray;
+ lineVertArray.splice(lineVertArray.length - 3);
+ strokeVertArray.splice(strokeVertArray.length - 4);
+ if (doStroke) {
+ line3D(lineVertArray, null, strokeVertArray);
+ }
+ if (doFill) {
+ fill3D(fillVertArray, "TRIANGLES", colorVertArray);
+ }
+ }
+
+ // render the vertices provided
+ else {
+ if (curShape === PConstants.POINTS) { // if POINTS was the specified parameter in beginShape
+ for (i = 0; i < vertArrayLength; i++) { // loop through and push the point location information to the array
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(cachedVertArray[j]);
+ }
+ }
+ point3D(lineVertArray, strokeVertArray); // render function for points
+ } else if (curShape === PConstants.LINES) { // if LINES was the specified parameter in beginShape
+ for (i = 0; i < vertArrayLength; i++) { // loop through and push the point location information to the array
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(cachedVertArray[j]);
+ }
+ }
+ for (i = 0; i < vertArrayLength; i++) { // loop through and push the color information to the array
+ cachedVertArray = vertArray[i];
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(cachedVertArray[j]);
+ }
+ }
+ line3D(lineVertArray, "LINES", strokeVertArray); // render function for lines
+ } else if (curShape === PConstants.TRIANGLES) { // if TRIANGLES was the specified parameter in beginShape
+ if (vertArrayLength > 2) {
+ for (i = 0; (i+2) < vertArrayLength; i+=3) { // loop through the array per triangle
+ fillVertArray = [];
+ texVertArray = [];
+ lineVertArray = [];
+ colorVertArray = [];
+ strokeVertArray = [];
+ for (j = 0; j < 3; j++) {
+ for (k = 0; k < 3; k++) { // loop through and push
+ lineVertArray.push(vertArray[i+j][k]); // the line point location information
+ fillVertArray.push(vertArray[i+j][k]); // and fill point location information
+ }
+ }
+ for (j = 0; j < 3; j++) { // loop through and push the texture information
+ for (k = 3; k < 5; k++) {
+ texVertArray.push(vertArray[i+j][k]);
+ }
+ }
+ for (j = 0; j < 3; j++) {
+ for (k = 5; k < 9; k++) { // loop through and push
+ colorVertArray.push(vertArray[i+j][k]); // the colour information
+ strokeVertArray.push(vertArray[i+j][k+4]);// and the stroke information
+ }
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_LOOP", strokeVertArray ); // line render function
+ }
+ if (doFill || usingTexture) {
+ fill3D(fillVertArray, "TRIANGLES", colorVertArray, texVertArray); // fill shape render function
+ }
+ }
+ }
+ } else if (curShape === PConstants.TRIANGLE_STRIP) { // if TRIANGLE_STRIP was the specified parameter in beginShape
+ if (vertArrayLength > 2) {
+ for (i = 0; (i+2) < vertArrayLength; i++) {
+ lineVertArray = [];
+ fillVertArray = [];
+ strokeVertArray = [];
+ colorVertArray = [];
+ texVertArray = [];
+ for (j = 0; j < 3; j++) {
+ for (k = 0; k < 3; k++) {
+ lineVertArray.push(vertArray[i+j][k]);
+ fillVertArray.push(vertArray[i+j][k]);
+ }
+ }
+ for (j = 0; j < 3; j++) {
+ for (k = 3; k < 5; k++) {
+ texVertArray.push(vertArray[i+j][k]);
+ }
+ }
+ for (j = 0; j < 3; j++) {
+ for (k = 5; k < 9; k++) {
+ strokeVertArray.push(vertArray[i+j][k+4]);
+ colorVertArray.push(vertArray[i+j][k]);
+ }
+ }
+
+ if (doFill || usingTexture) {
+ fill3D(fillVertArray, "TRIANGLE_STRIP", colorVertArray, texVertArray);
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_LOOP", strokeVertArray);
+ }
+ }
+ }
+ } else if (curShape === PConstants.TRIANGLE_FAN) {
+ if (vertArrayLength > 2) {
+ for (i = 0; i < 3; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(cachedVertArray[j]);
+ }
+ }
+ for (i = 0; i < 3; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(cachedVertArray[j]);
+ }
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_LOOP", strokeVertArray);
+ }
+
+ for (i = 2; (i+1) < vertArrayLength; i++) {
+ lineVertArray = [];
+ strokeVertArray = [];
+ lineVertArray.push(vertArray[0][0]);
+ lineVertArray.push(vertArray[0][1]);
+ lineVertArray.push(vertArray[0][2]);
+
+ strokeVertArray.push(vertArray[0][9]);
+ strokeVertArray.push(vertArray[0][10]);
+ strokeVertArray.push(vertArray[0][11]);
+ strokeVertArray.push(vertArray[0][12]);
+
+ for (j = 0; j < 2; j++) {
+ for (k = 0; k < 3; k++) {
+ lineVertArray.push(vertArray[i+j][k]);
+ }
+ }
+ for (j = 0; j < 2; j++) {
+ for (k = 9; k < 13; k++) {
+ strokeVertArray.push(vertArray[i+j][k]);
+ }
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_STRIP",strokeVertArray);
+ }
+ }
+ if (doFill || usingTexture) {
+ fill3D(fillVertArray, "TRIANGLE_FAN", colorVertArray, texVertArray);
+ }
+ }
+ } else if (curShape === PConstants.QUADS) {
+ for (i = 0; (i + 3) < vertArrayLength; i+=4) {
+ lineVertArray = [];
+ for (j = 0; j < 4; j++) {
+ cachedVertArray = vertArray[i+j];
+ for (k = 0; k < 3; k++) {
+ lineVertArray.push(cachedVertArray[k]);
+ }
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_LOOP",strokeVertArray);
+ }
+
+ if (doFill) {
+ fillVertArray = [];
+ colorVertArray = [];
+ texVertArray = [];
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(vertArray[i][j]);
+ }
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(vertArray[i][j]);
+ }
+
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(vertArray[i+1][j]);
+ }
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(vertArray[i+1][j]);
+ }
+
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(vertArray[i+3][j]);
+ }
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(vertArray[i+3][j]);
+ }
+
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(vertArray[i+2][j]);
+ }
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(vertArray[i+2][j]);
+ }
+
+ if (usingTexture) {
+ texVertArray.push(vertArray[i+0][3]);
+ texVertArray.push(vertArray[i+0][4]);
+ texVertArray.push(vertArray[i+1][3]);
+ texVertArray.push(vertArray[i+1][4]);
+ texVertArray.push(vertArray[i+3][3]);
+ texVertArray.push(vertArray[i+3][4]);
+ texVertArray.push(vertArray[i+2][3]);
+ texVertArray.push(vertArray[i+2][4]);
+ }
+
+ fill3D(fillVertArray, "TRIANGLE_STRIP", colorVertArray, texVertArray);
+ }
+ }
+ } else if (curShape === PConstants.QUAD_STRIP) {
+ var tempArray = [];
+ if (vertArrayLength > 3) {
+ for (i = 0; i < 2; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ for (i = 0; i < 2; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(cachedVertArray[j]);
+ }
+ }
+
+ line3D(lineVertArray, "LINE_STRIP", strokeVertArray);
+ if (vertArrayLength > 4 && vertArrayLength % 2 > 0) {
+ tempArray = fillVertArray.splice(fillVertArray.length - 3);
+ vertArray.pop();
+ }
+ for (i = 0; (i+3) < vertArrayLength; i+=2) {
+ lineVertArray = [];
+ strokeVertArray = [];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(vertArray[i+1][j]);
+ }
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(vertArray[i+3][j]);
+ }
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(vertArray[i+2][j]);
+ }
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(vertArray[i+0][j]);
+ }
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(vertArray[i+1][j]);
+ }
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(vertArray[i+3][j]);
+ }
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(vertArray[i+2][j]);
+ }
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(vertArray[i+0][j]);
+ }
+ if (doStroke) {
+ line3D(lineVertArray, "LINE_STRIP", strokeVertArray);
+ }
+ }
+
+ if (doFill || usingTexture) {
+ fill3D(fillVertArray, "TRIANGLE_LIST", colorVertArray, texVertArray);
+ }
+ }
+ }
+ // If the user didn't specify a type (LINES, TRIANGLES, etc)
+ else {
+ // If only one vertex was specified, it must be a point
+ if (vertArrayLength === 1) {
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(vertArray[0][j]);
+ }
+ for (j = 9; j < 13; j++) {
+ strokeVertArray.push(vertArray[0][j]);
+ }
+ point3D(lineVertArray,strokeVertArray);
+ } else {
+ for (i = 0; i < vertArrayLength; i++) {
+ cachedVertArray = vertArray[i];
+ for (j = 0; j < 3; j++) {
+ lineVertArray.push(cachedVertArray[j]);
+ }
+ for (j = 5; j < 9; j++) {
+ strokeVertArray.push(cachedVertArray[j]);
+ }
+ }
+ if (doStroke && closeShape) {
+ line3D(lineVertArray, "LINE_LOOP", strokeVertArray);
+ } else if (doStroke && !closeShape) {
+ line3D(lineVertArray, "LINE_STRIP", strokeVertArray);
+ }
+
+ // fill is ignored if textures are used
+ if (doFill || usingTexture) {
+ fill3D(fillVertArray, "TRIANGLE_FAN", colorVertArray, texVertArray);
+ }
+ }
+ }
+ // everytime beginShape is followed by a call to
+ // texture(), texturing it turned back on. We do this to
+ // figure out if the shape should be textured or filled
+ // with a color.
+ usingTexture = false;
+ curContext.useProgram(programObject3D);
+ uniformi("usingTexture3d", programObject3D, "uUsingTexture", usingTexture);
+ }
+
+ // Reset some settings
+ isCurve = false;
+ isBezier = false;
+ curveVertArray = [];
+ curveVertCount = 0;
+ };
+
+ /**
+ * The function splineForward() setup forward-differencing matrix to be used for speedy
+ * curve rendering. It's based on using a specific number
+ * of curve segments and just doing incremental adds for each
+ * vertex of the segment, rather than running the mathematically
+ * expensive cubic equation. This function is used by both curveDetail and bezierDetail.
+ *
+ * @param {int} segments number of curve segments to use when drawing
+ * @param {PMatrix3D} matrix target object for the new matrix
+ */
+ var splineForward = function(segments, matrix) {
+ var f = 1.0 / segments;
+ var ff = f * f;
+ var fff = ff * f;
+
+ matrix.set(0, 0, 0, 1, fff, ff, f, 0, 6 * fff, 2 * ff, 0, 0, 6 * fff, 0, 0, 0);
+ };
+
+ /**
+ * The curveInit() function set the number of segments to use when drawing a Catmull-Rom
+ * curve, and setting the s parameter, which defines how tightly
+ * the curve fits to each vertex. Catmull-Rom curves are actually
+ * a subset of this curve type where the s is set to zero.
+ * This in an internal function used by curveDetail() and curveTightness().
+ */
+ var curveInit = function() {
+ // allocate only if/when used to save startup time
+ if (!curveDrawMatrix) {
+ curveBasisMatrix = new PMatrix3D();
+ curveDrawMatrix = new PMatrix3D();
+ curveInited = true;
+ }
+
+ var s = curTightness;
+ curveBasisMatrix.set((s - 1) / 2, (s + 3) / 2, (-3 - s) / 2, (1 - s) / 2,
+ (1 - s), (-5 - s) / 2, (s + 2), (s - 1) / 2,
+ (s - 1) / 2, 0, (1 - s) / 2, 0, 0, 1, 0, 0);
+
+ splineForward(curveDet, curveDrawMatrix);
+
+ if (!bezierBasisInverse) {
+ //bezierBasisInverse = bezierBasisMatrix.get();
+ //bezierBasisInverse.invert();
+ curveToBezierMatrix = new PMatrix3D();
+ }
+
+ // TODO only needed for PGraphicsJava2D? if so, move it there
+ // actually, it's generally useful for other renderers, so keep it
+ // or hide the implementation elsewhere.
+ curveToBezierMatrix.set(curveBasisMatrix);
+ curveToBezierMatrix.preApply(bezierBasisInverse);
+
+ // multiply the basis and forward diff matrices together
+ // saves much time since this needn't be done for each curve
+ curveDrawMatrix.apply(curveBasisMatrix);
+ };
+
+ /**
+ * Specifies vertex coordinates for Bezier curves. Each call to <b>bezierVertex()</b> defines the position of two control
+ * points and one anchor point of a Bezier curve, adding a new segment to a line or shape. The first time
+ * <b>bezierVertex()</b> is used within a <b>beginShape()</b> call, it must be prefaced with a call to <b>vertex()</b>
+ * to set the first anchor point. This function must be used between <b>beginShape()</b> and <b>endShape()</b> and only
+ * when there is no MODE parameter specified to <b>beginShape()</b>. Using the 3D version of requires rendering with P3D
+ * or OPENGL (see the Environment reference for more information). <br /> <br /> <b>NOTE: </b> Fill does not work properly yet.
+ *
+ * @param {float | int} cx1 The x-coordinate of 1st control point
+ * @param {float | int} cy1 The y-coordinate of 1st control point
+ * @param {float | int} cz1 The z-coordinate of 1st control point
+ * @param {float | int} cx2 The x-coordinate of 2nd control point
+ * @param {float | int} cy2 The y-coordinate of 2nd control point
+ * @param {float | int} cz2 The z-coordinate of 2nd control point
+ * @param {float | int} x The x-coordinate of the anchor point
+ * @param {float | int} y The y-coordinate of the anchor point
+ * @param {float | int} z The z-coordinate of the anchor point
+ *
+ * @see curveVertex
+ * @see vertex
+ * @see bezier
+ */
+ Drawing2D.prototype.bezierVertex = function() {
+ isBezier = true;
+ var vert = [];
+ if (firstVert) {
+ throw ("vertex() must be used at least once before calling bezierVertex()");
+ }
+
+ for (var i = 0; i < arguments.length; i++) {
+ vert[i] = arguments[i];
+ }
+ vertArray.push(vert);
+ vertArray[vertArray.length -1].isVert = false;
+ };
+
+ Drawing3D.prototype.bezierVertex = function() {
+ isBezier = true;
+ var vert = [];
+ if (firstVert) {
+ throw ("vertex() must be used at least once before calling bezierVertex()");
+ }
+
+ if (arguments.length === 9) {
+ if (bezierDrawMatrix === undef) {
+ bezierDrawMatrix = new PMatrix3D();
+ }
+ // setup matrix for forward differencing to speed up drawing
+ var lastPoint = vertArray.length - 1;
+ splineForward( bezDetail, bezierDrawMatrix );
+ bezierDrawMatrix.apply( bezierBasisMatrix );
+ var draw = bezierDrawMatrix.array();
+ var x1 = vertArray[lastPoint][0],
+ y1 = vertArray[lastPoint][1],
+ z1 = vertArray[lastPoint][2];
+ var xplot1 = draw[4] * x1 + draw[5] * arguments[0] + draw[6] * arguments[3] + draw[7] * arguments[6];
+ var xplot2 = draw[8] * x1 + draw[9] * arguments[0] + draw[10]* arguments[3] + draw[11]* arguments[6];
+ var xplot3 = draw[12]* x1 + draw[13]* arguments[0] + draw[14]* arguments[3] + draw[15]* arguments[6];
+
+ var yplot1 = draw[4] * y1 + draw[5] * arguments[1] + draw[6] * arguments[4] + draw[7] * arguments[7];
+ var yplot2 = draw[8] * y1 + draw[9] * arguments[1] + draw[10]* arguments[4] + draw[11]* arguments[7];
+ var yplot3 = draw[12]* y1 + draw[13]* arguments[1] + draw[14]* arguments[4] + draw[15]* arguments[7];
+
+ var zplot1 = draw[4] * z1 + draw[5] * arguments[2] + draw[6] * arguments[5] + draw[7] * arguments[8];
+ var zplot2 = draw[8] * z1 + draw[9] * arguments[2] + draw[10]* arguments[5] + draw[11]* arguments[8];
+ var zplot3 = draw[12]* z1 + draw[13]* arguments[2] + draw[14]* arguments[5] + draw[15]* arguments[8];
+ for (var j = 0; j < bezDetail; j++) {
+ x1 += xplot1; xplot1 += xplot2; xplot2 += xplot3;
+ y1 += yplot1; yplot1 += yplot2; yplot2 += yplot3;
+ z1 += zplot1; zplot1 += zplot2; zplot2 += zplot3;
+ p.vertex(x1, y1, z1);
+ }
+ p.vertex(arguments[6], arguments[7], arguments[8]);
+ }
+ };
+
+ /**
+ * Sets a texture to be applied to vertex points. The <b>texture()</b> function
+ * must be called between <b>beginShape()</b> and <b>endShape()</b> and before
+ * any calls to vertex().
+ *
+ * When textures are in use, the fill color is ignored. Instead, use tint() to
+ * specify the color of the texture as it is applied to the shape.
+ *
+ * @param {PImage} pimage the texture to apply
+ *
+ * @returns none
+ *
+ * @see textureMode
+ * @see beginShape
+ * @see endShape
+ * @see vertex
+ */
+ p.texture = function(pimage) {
+ var curContext = drawing.$ensureContext();
+
+ if (pimage.__texture) {
+ curContext.bindTexture(curContext.TEXTURE_2D, pimage.__texture);
+ } else if (pimage.localName === "canvas") {
+ curContext.bindTexture(curContext.TEXTURE_2D, canTex);
+ curContext.texImage2D(curContext.TEXTURE_2D, 0, curContext.RGBA, curContext.RGBA, curContext.UNSIGNED_BYTE, pimage);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MAG_FILTER, curContext.LINEAR);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MIN_FILTER, curContext.LINEAR);
+ curContext.generateMipmap(curContext.TEXTURE_2D);
+ curTexture.width = pimage.width;
+ curTexture.height = pimage.height;
+ } else {
+ var texture = curContext.createTexture(),
+ cvs = document.createElement('canvas'),
+ cvsTextureCtx = cvs.getContext('2d'),
+ pot;
+
+ // WebGL requires power of two textures
+ if (pimage.width & (pimage.width-1) === 0) {
+ cvs.width = pimage.width;
+ } else {
+ pot = 1;
+ while (pot < pimage.width) {
+ pot *= 2;
+ }
+ cvs.width = pot;
+ }
+
+ if (pimage.height & (pimage.height-1) === 0) {
+ cvs.height = pimage.height;
+ } else {
+ pot = 1;
+ while (pot < pimage.height) {
+ pot *= 2;
+ }
+ cvs.height = pot;
+ }
+
+ cvsTextureCtx.drawImage(pimage.sourceImg, 0, 0, pimage.width, pimage.height, 0, 0, cvs.width, cvs.height);
+
+ curContext.bindTexture(curContext.TEXTURE_2D, texture);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MIN_FILTER, curContext.LINEAR_MIPMAP_LINEAR);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MAG_FILTER, curContext.LINEAR);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_WRAP_T, curContext.CLAMP_TO_EDGE);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_WRAP_S, curContext.CLAMP_TO_EDGE);
+ curContext.texImage2D(curContext.TEXTURE_2D, 0, curContext.RGBA, curContext.RGBA, curContext.UNSIGNED_BYTE, cvs);
+ curContext.generateMipmap(curContext.TEXTURE_2D);
+
+ pimage.__texture = texture;
+ curTexture.width = pimage.width;
+ curTexture.height = pimage.height;
+ }
+
+ usingTexture = true;
+ curContext.useProgram(programObject3D);
+ uniformi("usingTexture3d", programObject3D, "uUsingTexture", usingTexture);
+ };
+
+ /**
+ * Sets the coordinate space for texture mapping. There are two options, IMAGE,
+ * which refers to the actual coordinates of the image, and NORMALIZED, which
+ * refers to a normalized space of values ranging from 0 to 1. The default mode
+ * is IMAGE. In IMAGE, if an image is 100 x 200 pixels, mapping the image onto
+ * the entire size of a quad would require the points (0,0) (0,100) (100,200) (0,200).
+ * The same mapping in NORMAL_SPACE is (0,0) (0,1) (1,1) (0,1).
+ *
+ * @param MODE either IMAGE or NORMALIZED
+ *
+ * @returns none
+ *
+ * @see texture
+ */
+ p.textureMode = function(mode){
+ curTextureMode = mode;
+ };
+ /**
+ * The curveVertexSegment() function handle emitting a specific segment of Catmull-Rom curve. Internal helper function used by <b>curveVertex()</b>.
+ */
+ var curveVertexSegment = function(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4) {
+ var x0 = x2;
+ var y0 = y2;
+ var z0 = z2;
+
+ var draw = curveDrawMatrix.array();
+
+ var xplot1 = draw[4] * x1 + draw[5] * x2 + draw[6] * x3 + draw[7] * x4;
+ var xplot2 = draw[8] * x1 + draw[9] * x2 + draw[10] * x3 + draw[11] * x4;
+ var xplot3 = draw[12] * x1 + draw[13] * x2 + draw[14] * x3 + draw[15] * x4;
+
+ var yplot1 = draw[4] * y1 + draw[5] * y2 + draw[6] * y3 + draw[7] * y4;
+ var yplot2 = draw[8] * y1 + draw[9] * y2 + draw[10] * y3 + draw[11] * y4;
+ var yplot3 = draw[12] * y1 + draw[13] * y2 + draw[14] * y3 + draw[15] * y4;
+
+ var zplot1 = draw[4] * z1 + draw[5] * z2 + draw[6] * z3 + draw[7] * z4;
+ var zplot2 = draw[8] * z1 + draw[9] * z2 + draw[10] * z3 + draw[11] * z4;
+ var zplot3 = draw[12] * z1 + draw[13] * z2 + draw[14] * z3 + draw[15] * z4;
+
+ p.vertex(x0, y0, z0);
+ for (var j = 0; j < curveDet; j++) {
+ x0 += xplot1; xplot1 += xplot2; xplot2 += xplot3;
+ y0 += yplot1; yplot1 += yplot2; yplot2 += yplot3;
+ z0 += zplot1; zplot1 += zplot2; zplot2 += zplot3;
+ p.vertex(x0, y0, z0);
+ }
+ };
+
+ /**
+ * Specifies vertex coordinates for curves. This function may only be used between <b>beginShape()</b> and
+ * <b>endShape()</b> and only when there is no MODE parameter specified to <b>beginShape()</b>. The first and last points
+ * in a series of <b>curveVertex()</b> lines will be used to guide the beginning and end of a the curve. A minimum of four
+ * points is required to draw a tiny curve between the second and third points. Adding a fifth point with
+ * <b>curveVertex()</b> will draw the curve between the second, third, and fourth points. The <b>curveVertex()</b> function
+ * is an implementation of Catmull-Rom splines. Using the 3D version of requires rendering with P3D or OPENGL (see the
+ * Environment reference for more information). <br /> <br /><b>NOTE: </b> Fill does not work properly yet.
+ *
+ * @param {float | int} x The x-coordinate of the vertex
+ * @param {float | int} y The y-coordinate of the vertex
+ * @param {float | int} z The z-coordinate of the vertex
+ *
+ * @see curve
+ * @see beginShape
+ * @see endShape
+ * @see vertex
+ * @see bezierVertex
+ */
+ Drawing2D.prototype.curveVertex = function(x, y) {
+ isCurve = true;
+
+ p.vertex(x, y);
+ };
+
+ Drawing3D.prototype.curveVertex = function(x, y, z) {
+ isCurve = true;
+
+ if (!curveInited) {
+ curveInit();
+ }
+ var vert = [];
+ vert[0] = x;
+ vert[1] = y;
+ vert[2] = z;
+ curveVertArray.push(vert);
+ curveVertCount++;
+
+ if (curveVertCount > 3) {
+ curveVertexSegment( curveVertArray[curveVertCount-4][0],
+ curveVertArray[curveVertCount-4][1],
+ curveVertArray[curveVertCount-4][2],
+ curveVertArray[curveVertCount-3][0],
+ curveVertArray[curveVertCount-3][1],
+ curveVertArray[curveVertCount-3][2],
+ curveVertArray[curveVertCount-2][0],
+ curveVertArray[curveVertCount-2][1],
+ curveVertArray[curveVertCount-2][2],
+ curveVertArray[curveVertCount-1][0],
+ curveVertArray[curveVertCount-1][1],
+ curveVertArray[curveVertCount-1][2] );
+ }
+ };
+
+ /**
+ * The curve() function draws a curved line on the screen. The first and second parameters
+ * specify the beginning control point and the last two parameters specify
+ * the ending control point. The middle parameters specify the start and
+ * stop of the curve. Longer curves can be created by putting a series of
+ * <b>curve()</b> functions together or using <b>curveVertex()</b>.
+ * An additional function called <b>curveTightness()</b> provides control
+ * for the visual quality of the curve. The <b>curve()</b> function is an
+ * implementation of Catmull-Rom splines. Using the 3D version of requires
+ * rendering with P3D or OPENGL (see the Environment reference for more
+ * information).
+ *
+ * @param {int|float} x1 coordinates for the beginning control point
+ * @param {int|float} y1 coordinates for the beginning control point
+ * @param {int|float} z1 coordinates for the beginning control point
+ * @param {int|float} x2 coordinates for the first point
+ * @param {int|float} y2 coordinates for the first point
+ * @param {int|float} z2 coordinates for the first point
+ * @param {int|float} x3 coordinates for the second point
+ * @param {int|float} y3 coordinates for the second point
+ * @param {int|float} z3 coordinates for the second point
+ * @param {int|float} x4 coordinates for the ending control point
+ * @param {int|float} y4 coordinates for the ending control point
+ * @param {int|float} z4 coordinates for the ending control point
+ *
+ * @see #curveVertex()
+ * @see #curveTightness()
+ * @see #bezier()
+ */
+ Drawing2D.prototype.curve = function(x1, y1, x2, y2, x3, y3, x4, y4) {
+ p.beginShape();
+ p.curveVertex(x1, y1);
+ p.curveVertex(x2, y2);
+ p.curveVertex(x3, y3);
+ p.curveVertex(x4, y4);
+ p.endShape();
+ };
+
+ Drawing3D.prototype.curve = function(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4) {
+ if (z4 !== undef) {
+ p.beginShape();
+ p.curveVertex(x1, y1, z1);
+ p.curveVertex(x2, y2, z2);
+ p.curveVertex(x3, y3, z3);
+ p.curveVertex(x4, y4, z4);
+ p.endShape();
+ return;
+ }
+ p.beginShape();
+ p.curveVertex(x1, y1);
+ p.curveVertex(z1, x2);
+ p.curveVertex(y2, z2);
+ p.curveVertex(x3, y3);
+ p.endShape();
+ };
+
+ /**
+ * The curveTightness() function modifies the quality of forms created with <b>curve()</b> and
+ * <b>curveVertex()</b>. The parameter <b>squishy</b> determines how the
+ * curve fits to the vertex points. The value 0.0 is the default value for
+ * <b>squishy</b> (this value defines the curves to be Catmull-Rom splines)
+ * and the value 1.0 connects all the points with straight lines.
+ * Values within the range -5.0 and 5.0 will deform the curves but
+ * will leave them recognizable and as values increase in magnitude,
+ * they will continue to deform.
+ *
+ * @param {float} tightness amount of deformation from the original vertices
+ *
+ * @see #curve()
+ * @see #curveVertex()
+ *
+ */
+ p.curveTightness = function(tightness) {
+ curTightness = tightness;
+ };
+
+ /**
+ * The curveDetail() function sets the resolution at which curves display. The default value is 20.
+ * This function is only useful when using the P3D or OPENGL renderer.
+ *
+ * @param {int} detail resolution of the curves
+ *
+ * @see curve()
+ * @see curveVertex()
+ * @see curveTightness()
+ */
+ p.curveDetail = function(detail) {
+ curveDet = detail;
+ curveInit();
+ };
+
+ /**
+ * Modifies the location from which rectangles draw. The default mode is rectMode(CORNER), which
+ * specifies the location to be the upper left corner of the shape and uses the third and fourth
+ * parameters of rect() to specify the width and height. The syntax rectMode(CORNERS) uses the
+ * first and second parameters of rect() to set the location of one corner and uses the third and
+ * fourth parameters to set the opposite corner. The syntax rectMode(CENTER) draws the image from
+ * its center point and uses the third and forth parameters of rect() to specify the image's width
+ * and height. The syntax rectMode(RADIUS) draws the image from its center point and uses the third
+ * and forth parameters of rect() to specify half of the image's width and height. The parameter must
+ * be written in ALL CAPS because Processing is a case sensitive language. Note: In version 125, the
+ * mode named CENTER_RADIUS was shortened to RADIUS.
+ *
+ * @param {MODE} MODE Either CORNER, CORNERS, CENTER, or RADIUS
+ *
+ * @see rect
+ */
+ p.rectMode = function(aRectMode) {
+ curRectMode = aRectMode;
+ };
+
+ /**
+ * Modifies the location from which images draw. The default mode is imageMode(CORNER), which specifies
+ * the location to be the upper left corner and uses the fourth and fifth parameters of image() to set
+ * the image's width and height. The syntax imageMode(CORNERS) uses the second and third parameters of
+ * image() to set the location of one corner of the image and uses the fourth and fifth parameters to
+ * set the opposite corner. Use imageMode(CENTER) to draw images centered at the given x and y position.
+ * The parameter to imageMode() must be written in ALL CAPS because Processing is a case sensitive language.
+ *
+ * @param {MODE} MODE Either CORNER, CORNERS, or CENTER
+ *
+ * @see loadImage
+ * @see PImage
+ * @see image
+ * @see background
+ */
+ p.imageMode = function(mode) {
+ switch (mode) {
+ case PConstants.CORNER:
+ imageModeConvert = imageModeCorner;
+ break;
+ case PConstants.CORNERS:
+ imageModeConvert = imageModeCorners;
+ break;
+ case PConstants.CENTER:
+ imageModeConvert = imageModeCenter;
+ break;
+ default:
+ throw "Invalid imageMode";
+ }
+ };
+
+ /**
+ * The origin of the ellipse is modified by the ellipseMode() function. The default configuration is
+ * ellipseMode(CENTER), which specifies the location of the ellipse as the center of the shape. The RADIUS
+ * mode is the same, but the width and height parameters to ellipse() specify the radius of the ellipse,
+ * rather than the diameter. The CORNER mode draws the shape from the upper-left corner of its bounding box.
+ * The CORNERS mode uses the four parameters to ellipse() to set two opposing corners of the ellipse's bounding
+ * box. The parameter must be written in "ALL CAPS" because Processing is a case sensitive language.
+ *
+ * @param {MODE} MODE Either CENTER, RADIUS, CORNER, or CORNERS.
+ *
+ * @see ellipse
+ */
+ p.ellipseMode = function(aEllipseMode) {
+ curEllipseMode = aEllipseMode;
+ };
+
+ /**
+ * The arc() function draws an arc in the display window.
+ * Arcs are drawn along the outer edge of an ellipse defined by the
+ * <b>x</b>, <b>y</b>, <b>width</b> and <b>height</b> parameters.
+ * The origin or the arc's ellipse may be changed with the
+ * <b>ellipseMode()</b> function.
+ * The <b>start</b> and <b>stop</b> parameters specify the angles
+ * at which to draw the arc.
+ *
+ * @param {float} a x-coordinate of the arc's ellipse
+ * @param {float} b y-coordinate of the arc's ellipse
+ * @param {float} c width of the arc's ellipse
+ * @param {float} d height of the arc's ellipse
+ * @param {float} start angle to start the arc, specified in radians
+ * @param {float} stop angle to stop the arc, specified in radians
+ * @param {enum} mode drawing mode (OPEN, CHORD, PIE)
+ *
+ * @see #ellipseMode()
+ * @see #ellipse()
+ */
+ p.arc = function(x, y, width, height, start, stop, mode) {
+ if (width <= 0 || stop < start) { return; }
+
+ if (curEllipseMode === PConstants.CORNERS) {
+ width = width - x;
+ height = height - y;
+ } else if (curEllipseMode === PConstants.RADIUS) {
+ x = x - width;
+ y = y - height;
+ width = width * 2;
+ height = height * 2;
+ } else if (curEllipseMode === PConstants.CENTER) {
+ x = x - width/2;
+ y = y - height/2;
+ }
+ // make sure that we're starting at a useful point
+ while (start < 0) {
+ start += PConstants.TWO_PI;
+ stop += PConstants.TWO_PI;
+ }
+ if (stop - start > PConstants.TWO_PI) {
+ // don't change start, it is visible in PIE mode
+ stop = start + PConstants.TWO_PI;
+ }
+ var hr = width / 2,
+ vr = height / 2,
+ centerX = x + hr,
+ centerY = y + vr,
+ step = 1/(hr+vr);
+
+ var drawSlice = (function(x, y, start, step, stop) {
+ return function(p, closed, i, a, e) {
+ i = 0;
+ a = start;
+ e = stop + step;
+ p.beginShape();
+ if(closed) { p.vertex(x-0.5, y-0.5); }
+ for (; a < e; i++, a = i*step + start) {
+ p.vertex(
+ (x + Math.cos(a) * hr)|0,
+ (y + Math.sin(a) * vr)|0
+ );
+ }
+
+ if (mode === PConstants.OPEN && doFill) {
+ p.vertex(centerX + Math.cos(start) * hr, centerY + Math.sin(start) * vr);
+ } else if (mode === PConstants.CHORD) {
+ p.vertex(centerX + Math.cos(start) * hr, centerY + Math.sin(start) * vr);
+ } else if (mode === PConstants.PIE) {
+ p.line(centerX + Math.cos(start) * hr, centerY + Math.sin(start) * vr, centerX, centerY);
+ p.line(centerX, centerY, centerX + Math.cos(stop) * hr, centerY + Math.sin(stop) * vr);
+ }
+
+ p.endShape(closed ? PConstants.CLOSE : undefined);
+ };
+ }(centerX+0.5, centerY+0.5, start, step, stop));
+
+ if (doFill) {
+ var savedStroke = doStroke;
+ doStroke = false;
+ drawSlice(p, true);
+ doStroke = savedStroke;
+ }
+
+ if (doStroke) {
+ var savedFill = doFill;
+ doFill = false;
+ drawSlice(p);
+ doFill = savedFill;
+ }
+ };
+
+ /**
+ * Draws a line (a direct path between two points) to the screen. The version of line() with four parameters
+ * draws the line in 2D. To color a line, use the stroke() function. A line cannot be filled, therefore the
+ * fill() method will not affect the color of a line. 2D lines are drawn with a width of one pixel by default,
+ * but this can be changed with the strokeWeight() function. The version with six parameters allows the line
+ * to be placed anywhere within XYZ space. Drawing this shape in 3D using the z parameter requires the P3D or
+ * OPENGL parameter in combination with size.
+ *
+ * @param {int|float} x1 x-coordinate of the first point
+ * @param {int|float} y1 y-coordinate of the first point
+ * @param {int|float} z1 z-coordinate of the first point
+ * @param {int|float} x2 x-coordinate of the second point
+ * @param {int|float} y2 y-coordinate of the second point
+ * @param {int|float} z2 z-coordinate of the second point
+ *
+ * @see strokeWeight
+ * @see strokeJoin
+ * @see strokeCap
+ * @see beginShape
+ */
+ Drawing2D.prototype.line = function(x1, y1, x2, y2) {
+ if (!doStroke) {
+ return;
+ }
+ if (!renderSmooth) {
+ x1 = Math.round(x1);
+ x2 = Math.round(x2);
+ y1 = Math.round(y1);
+ y2 = Math.round(y2);
+ }
+
+ // A line is only defined if it has different start and end coordinates.
+ // If they are the same, we call point instead.
+ if (x1 === x2 && y1 === y2) {
+ p.point(x1, y1);
+ return;
+ }
+
+ var swap = undef,
+ lineCap = undef,
+ drawCrisp = true,
+ currentModelView = modelView.array(),
+ identityMatrix = [1, 0, 0, 0, 1, 0];
+ // Test if any transformations have been applied to the sketch
+ for (var i = 0; i < 6 && drawCrisp; i++) {
+ drawCrisp = currentModelView[i] === identityMatrix[i];
+ }
+ /* Draw crisp lines if the line is vertical or horizontal with the following method
+ * If any transformations have been applied to the sketch, don't make the line crisp
+ * If the line is directed up or to the left, reverse it by swapping x1/x2 or y1/y2
+ * Make the line 1 pixel longer to work around cross-platform canvas implementations
+ * If the lineWidth is odd, translate the line by 0.5 in the perpendicular direction
+ * Even lineWidths do not need to be translated because the canvas will draw them on pixel boundaries
+ * Change the cap to butt-end to work around cross-platform canvas implementations
+ * Reverse the translate and lineCap canvas state changes after drawing the line
+ */
+ if (drawCrisp) {
+ if (x1 === x2) {
+ if (y1 > y2) {
+ swap = y1;
+ y1 = y2;
+ y2 = swap;
+ }
+ y2++;
+ if (lineWidth % 2 === 1) {
+ curContext.translate(0.5, 0.0);
+ }
+ } else if (y1 === y2) {
+ if (x1 > x2) {
+ swap = x1;
+ x1 = x2;
+ x2 = swap;
+ }
+ x2++;
+ if (lineWidth % 2 === 1) {
+ curContext.translate(0.0, 0.5);
+ }
+ }
+ if (lineWidth === 1) {
+ lineCap = curContext.lineCap;
+ curContext.lineCap = 'butt';
+ }
+ }
+ curContext.beginPath();
+ curContext.moveTo(x1 || 0, y1 || 0);
+ curContext.lineTo(x2 || 0, y2 || 0);
+ executeContextStroke();
+ if (drawCrisp) {
+ if (x1 === x2 && lineWidth % 2 === 1) {
+ curContext.translate(-0.5, 0.0);
+ } else if (y1 === y2 && lineWidth % 2 === 1) {
+ curContext.translate(0.0, -0.5);
+ }
+ if (lineWidth === 1) {
+ curContext.lineCap = lineCap;
+ }
+ }
+ };
+
+ Drawing3D.prototype.line = function(x1, y1, z1, x2, y2, z2) {
+ if (y2 === undef || z2 === undef) { // 2D line called in 3D context
+ z2 = 0;
+ y2 = x2;
+ x2 = z1;
+ z1 = 0;
+ }
+
+ // a line is only defined if it has different start and end coordinates.
+ // If they are the same, we call point instead.
+ if (x1===x2 && y1===y2 && z1===z2) {
+ p.point(x1,y1,z1);
+ return;
+ }
+
+ var lineVerts = [x1, y1, z1, x2, y2, z2];
+
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ if (lineWidth > 0 && doStroke) {
+ curContext.useProgram(programObject2D);
+
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+
+ uniformf("uColor2d", programObject2D, "uColor", strokeStyle);
+ uniformi("uIsDrawingText", programObject2D, "uIsDrawingText", false);
+
+ vertexAttribPointer("aVertex2d", programObject2D, "aVertex", 3, lineBuffer);
+ disableVertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord");
+
+ curContext.bufferData(curContext.ARRAY_BUFFER, new Float32Array(lineVerts), curContext.STREAM_DRAW);
+ curContext.drawArrays(curContext.LINES, 0, 2);
+ }
+ };
+
+ /**
+ * Draws a Bezier curve on the screen. These curves are defined by a series of anchor and control points. The first
+ * two parameters specify the first anchor point and the last two parameters specify the other anchor point. The
+ * middle parameters specify the control points which define the shape of the curve. Bezier curves were developed
+ * by French engineer Pierre Bezier. Using the 3D version of requires rendering with P3D or OPENGL (see the
+ * Environment reference for more information).
+ *
+ * @param {int | float} x1,y1,z1 coordinates for the first anchor point
+ * @param {int | float} cx1,cy1,cz1 coordinates for the first control point
+ * @param {int | float} cx2,cy2,cz2 coordinates for the second control point
+ * @param {int | float} x2,y2,z2 coordinates for the second anchor point
+ *
+ * @see bezierVertex
+ * @see curve
+ */
+ Drawing2D.prototype.bezier = function() {
+ if (arguments.length !== 8) {
+ throw("You must use 8 parameters for bezier() in 2D mode");
+ }
+
+ p.beginShape();
+ p.vertex( arguments[0], arguments[1] );
+ p.bezierVertex( arguments[2], arguments[3],
+ arguments[4], arguments[5],
+ arguments[6], arguments[7] );
+ p.endShape();
+ };
+
+ Drawing3D.prototype.bezier = function() {
+ if (arguments.length !== 12) {
+ throw("You must use 12 parameters for bezier() in 3D mode");
+ }
+
+ p.beginShape();
+ p.vertex( arguments[0], arguments[1], arguments[2] );
+ p.bezierVertex( arguments[3], arguments[4], arguments[5],
+ arguments[6], arguments[7], arguments[8],
+ arguments[9], arguments[10], arguments[11] );
+ p.endShape();
+ };
+
+ /**
+ * Sets the resolution at which Beziers display. The default value is 20. This function is only useful when using the P3D
+ * or OPENGL renderer as the default (JAVA2D) renderer does not use this information.
+ *
+ * @param {int} detail resolution of the curves
+ *
+ * @see curve
+ * @see curveVertex
+ * @see curveTightness
+ */
+ p.bezierDetail = function( detail ){
+ bezDetail = detail;
+ };
+
+ /**
+ * The bezierPoint() function evalutes quadratic bezier at point t for points a, b, c, d.
+ * The parameter t varies between 0 and 1. The a and d parameters are the
+ * on-curve points, b and c are the control points. To make a two-dimensional
+ * curve, call this function once with the x coordinates and a second time
+ * with the y coordinates to get the location of a bezier curve at t.
+ *
+ * @param {float} a coordinate of first point on the curve
+ * @param {float} b coordinate of first control point
+ * @param {float} c coordinate of second control point
+ * @param {float} d coordinate of second point on the curve
+ * @param {float} t value between 0 and 1
+ *
+ * @see #bezier()
+ * @see #bezierVertex()
+ * @see #curvePoint()
+ */
+ p.bezierPoint = function(a, b, c, d, t) {
+ return (1 - t) * (1 - t) * (1 - t) * a + 3 * (1 - t) * (1 - t) * t * b + 3 * (1 - t) * t * t * c + t * t * t * d;
+ };
+
+ /**
+ * The bezierTangent() function calculates the tangent of a point on a Bezier curve. There is a good
+ * definition of "tangent" at Wikipedia: <a href="http://en.wikipedia.org/wiki/Tangent" target="new">http://en.wikipedia.org/wiki/Tangent</a>
+ *
+ * @param {float} a coordinate of first point on the curve
+ * @param {float} b coordinate of first control point
+ * @param {float} c coordinate of second control point
+ * @param {float} d coordinate of second point on the curve
+ * @param {float} t value between 0 and 1
+ *
+ * @see #bezier()
+ * @see #bezierVertex()
+ * @see #curvePoint()
+ */
+ p.bezierTangent = function(a, b, c, d, t) {
+ return (3 * t * t * (-a + 3 * b - 3 * c + d) + 6 * t * (a - 2 * b + c) + 3 * (-a + b));
+ };
+
+ /**
+ * The curvePoint() function evalutes the Catmull-Rom curve at point t for points a, b, c, d. The
+ * parameter t varies between 0 and 1, a and d are points on the curve,
+ * and b and c are the control points. This can be done once with the x
+ * coordinates and a second time with the y coordinates to get the
+ * location of a curve at t.
+ *
+ * @param {int|float} a coordinate of first point on the curve
+ * @param {int|float} b coordinate of second point on the curve
+ * @param {int|float} c coordinate of third point on the curve
+ * @param {int|float} d coordinate of fourth point on the curve
+ * @param {float} t value between 0 and 1
+ *
+ * @see #curve()
+ * @see #curveVertex()
+ * @see #bezierPoint()
+ */
+ p.curvePoint = function(a, b, c, d, t) {
+ return 0.5 * ((2 * b) + (-a + c) * t + (2 * a - 5 * b + 4 * c - d) * t * t + (-a + 3 * b - 3 * c + d) * t * t * t);
+ };
+
+ /**
+ * The curveTangent() function calculates the tangent of a point on a Catmull-Rom curve.
+ * There is a good definition of "tangent" at Wikipedia: <a href="http://en.wikipedia.org/wiki/Tangent" target="new">http://en.wikipedia.org/wiki/Tangent</a>.
+ *
+ * @param {int|float} a coordinate of first point on the curve
+ * @param {int|float} b coordinate of first control point
+ * @param {int|float} c coordinate of second control point
+ * @param {int|float} d coordinate of second point on the curve
+ * @param {float} t value between 0 and 1
+ *
+ * @see #curve()
+ * @see #curveVertex()
+ * @see #curvePoint()
+ * @see #bezierTangent()
+ */
+ p.curveTangent = function(a, b, c, d, t) {
+ return 0.5 * ((-a + c) + 2 * (2 * a - 5 * b + 4 * c - d) * t + 3 * (-a + 3 * b - 3 * c + d) * t * t);
+ };
+
+ /**
+ * A triangle is a plane created by connecting three points. The first two arguments specify the first point,
+ * the middle two arguments specify the second point, and the last two arguments specify the third point.
+ *
+ * @param {int | float} x1 x-coordinate of the first point
+ * @param {int | float} y1 y-coordinate of the first point
+ * @param {int | float} x2 x-coordinate of the second point
+ * @param {int | float} y2 y-coordinate of the second point
+ * @param {int | float} x3 x-coordinate of the third point
+ * @param {int | float} y3 y-coordinate of the third point
+ */
+ p.triangle = function(x1, y1, x2, y2, x3, y3) {
+ p.beginShape(PConstants.TRIANGLES);
+ p.vertex(x1, y1, 0);
+ p.vertex(x2, y2, 0);
+ p.vertex(x3, y3, 0);
+ p.endShape();
+ };
+
+ /**
+ * A quad is a quadrilateral, a four sided polygon. It is similar to a rectangle, but the angles between its
+ * edges are not constrained to ninety degrees. The first pair of parameters (x1,y1) sets the first vertex
+ * and the subsequent pairs should proceed clockwise or counter-clockwise around the defined shape.
+ *
+ * @param {float | int} x1 x-coordinate of the first corner
+ * @param {float | int} y1 y-coordinate of the first corner
+ * @param {float | int} x2 x-coordinate of the second corner
+ * @param {float | int} y2 y-coordinate of the second corner
+ * @param {float | int} x3 x-coordinate of the third corner
+ * @param {float | int} y3 y-coordinate of the third corner
+ * @param {float | int} x4 x-coordinate of the fourth corner
+ * @param {float | int} y4 y-coordinate of the fourth corner
+ */
+ p.quad = function(x1, y1, x2, y2, x3, y3, x4, y4) {
+ p.beginShape(PConstants.QUADS);
+ p.vertex(x1, y1, 0);
+ p.vertex(x2, y2, 0);
+ p.vertex(x3, y3, 0);
+ p.vertex(x4, y4, 0);
+ p.endShape();
+ };
+
+ var roundedRect$2d = function(x, y, width, height, tl, tr, br, bl) {
+ if (bl === undef) {
+ tr = tl;
+ br = tl;
+ bl = tl;
+ }
+ var halfWidth = width / 2,
+ halfHeight = height / 2;
+ if (tl > halfWidth || tl > halfHeight) {
+ tl = Math.min(halfWidth, halfHeight);
+ }
+ if (tr > halfWidth || tr > halfHeight) {
+ tr = Math.min(halfWidth, halfHeight);
+ }
+ if (br > halfWidth || br > halfHeight) {
+ br = Math.min(halfWidth, halfHeight);
+ }
+ if (bl > halfWidth || bl > halfHeight) {
+ bl = Math.min(halfWidth, halfHeight);
+ }
+ // Translate the stroke by (0.5, 0.5) to draw a crisp border
+ if (!doFill || doStroke) {
+ curContext.translate(0.5, 0.5);
+ }
+ curContext.beginPath();
+ curContext.moveTo(x + tl, y);
+ curContext.lineTo(x + width - tr, y);
+ curContext.quadraticCurveTo(x + width, y, x + width, y + tr);
+ curContext.lineTo(x + width, y + height - br);
+ curContext.quadraticCurveTo(x + width, y + height, x + width - br, y + height);
+ curContext.lineTo(x + bl, y + height);
+ curContext.quadraticCurveTo(x, y + height, x, y + height - bl);
+ curContext.lineTo(x, y + tl);
+ curContext.quadraticCurveTo(x, y, x + tl, y);
+ if (!doFill || doStroke) {
+ curContext.translate(-0.5, -0.5);
+ }
+ executeContextFill();
+ executeContextStroke();
+ };
+
+ /**
+ * Draws a rectangle to the screen. A rectangle is a four-sided shape with every angle at ninety
+ * degrees. The first two parameters set the location, the third sets the width, and the fourth
+ * sets the height. The origin is changed with the rectMode() function.
+ *
+ * @param {int|float} x x-coordinate of the rectangle
+ * @param {int|float} y y-coordinate of the rectangle
+ * @param {int|float} width width of the rectangle
+ * @param {int|float} height height of the rectangle
+ *
+ * @see rectMode
+ * @see quad
+ */
+ Drawing2D.prototype.rect = function(x, y, width, height, tl, tr, br, bl) {
+ // width and height need to be defined, numerical values
+ if (width!=''+width && height!=''+height) {
+ return;
+ }
+
+ if (curRectMode === PConstants.CORNERS) {
+ width -= x;
+ height -= y;
+ } else if (curRectMode === PConstants.RADIUS) {
+ width *= 2;
+ height *= 2;
+ x -= width / 2;
+ y -= height / 2;
+ } else if (curRectMode === PConstants.CENTER) {
+ x -= width / 2;
+ y -= height / 2;
+ }
+
+ if (!renderSmooth) {
+ x = Math.round(x);
+ y = Math.round(y);
+ width = Math.round(width);
+ height = Math.round(height);
+ }
+ if (tl !== undef) {
+ roundedRect$2d(x, y, width, height, tl, tr, br, bl);
+ return;
+ }
+
+ // Translate the line by (0.5, 0.5) to draw a crisp rectangle border
+ if (doStroke && lineWidth % 2 === 1) {
+ curContext.translate(0.5, 0.5);
+ }
+ curContext.beginPath();
+ curContext.rect(x, y, width, height);
+ executeContextFill();
+ executeContextStroke();
+ if (doStroke && lineWidth % 2 === 1) {
+ curContext.translate(-0.5, -0.5);
+ }
+ };
+
+ Drawing3D.prototype.rect = function(x, y, width, height, tl, tr, br, bl) {
+ if (tl !== undef) {
+ throw "rect() with rounded corners is not supported in 3D mode";
+ }
+
+ if (curRectMode === PConstants.CORNERS) {
+ width -= x;
+ height -= y;
+ } else if (curRectMode === PConstants.RADIUS) {
+ width *= 2;
+ height *= 2;
+ x -= width / 2;
+ y -= height / 2;
+ } else if (curRectMode === PConstants.CENTER) {
+ x -= width / 2;
+ y -= height / 2;
+ }
+
+ // Modeling transformation
+ var model = new PMatrix3D();
+ model.translate(x, y, 0);
+ model.scale(width, height, 1);
+ model.transpose();
+
+ // viewing transformation needs to have Y flipped
+ // becuase that's what Processing does.
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ if (lineWidth > 0 && doStroke) {
+ curContext.useProgram(programObject2D);
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, model.array());
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+ uniformf("uColor2d", programObject2D, "uColor", strokeStyle);
+ uniformi("uIsDrawingText2d", programObject2D, "uIsDrawingText", false);
+ vertexAttribPointer("aVertex2d", programObject2D, "aVertex", 3, rectBuffer);
+ disableVertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord");
+ curContext.drawArrays(curContext.LINE_LOOP, 0, rectVerts.length / 3);
+ }
+
+ if (doFill) {
+ curContext.useProgram(programObject3D);
+ uniformMatrix("uModel3d", programObject3D, "uModel", false, model.array());
+ uniformMatrix("uView3d", programObject3D, "uView", false, view.array());
+
+ // fix stitching problems. (lines get occluded by triangles
+ // since they share the same depth values). This is not entirely
+ // working, but it's a start for drawing the outline. So
+ // developers can start playing around with styles.
+ curContext.enable(curContext.POLYGON_OFFSET_FILL);
+ curContext.polygonOffset(1, 1);
+
+ uniformf("color3d", programObject3D, "uColor", fillStyle);
+
+ if(lightCount > 0){
+ var v = new PMatrix3D();
+ v.set(view);
+
+ var m = new PMatrix3D();
+ m.set(model);
+
+ v.mult(m);
+
+ var normalMatrix = new PMatrix3D();
+ normalMatrix.set(v);
+ normalMatrix.invert();
+ normalMatrix.transpose();
+
+ uniformMatrix("uNormalTransform3d", programObject3D, "uNormalTransform", false, normalMatrix.array());
+ vertexAttribPointer("aNormal3d", programObject3D, "aNormal", 3, rectNormBuffer);
+ }
+ else{
+ disableVertexAttribPointer("normal3d", programObject3D, "aNormal");
+ }
+
+ vertexAttribPointer("vertex3d", programObject3D, "aVertex", 3, rectBuffer);
+
+ curContext.drawArrays(curContext.TRIANGLE_FAN, 0, rectVerts.length / 3);
+ curContext.disable(curContext.POLYGON_OFFSET_FILL);
+ }
+ };
+
+ /**
+ * Draws an ellipse (oval) in the display window. An ellipse with an equal <b>width</b> and <b>height</b> is a circle.
+ * The first two parameters set the location, the third sets the width, and the fourth sets the height. The origin may be
+ * changed with the <b>ellipseMode()</b> function.
+ *
+ * @param {float|int} x x-coordinate of the ellipse
+ * @param {float|int} y y-coordinate of the ellipse
+ * @param {float|int} width width of the ellipse
+ * @param {float|int} height height of the ellipse
+ *
+ * @see ellipseMode
+ */
+ Drawing2D.prototype.ellipse = function(x, y, width, height) {
+ x = x || 0;
+ y = y || 0;
+
+ if (width <= 0 && height <= 0) {
+ return;
+ }
+
+ if (curEllipseMode === PConstants.RADIUS) {
+ width *= 2;
+ height *= 2;
+ } else if (curEllipseMode === PConstants.CORNERS) {
+ width = width - x;
+ height = height - y;
+ x += width / 2;
+ y += height / 2;
+ } else if (curEllipseMode === PConstants.CORNER) {
+ x += width / 2;
+ y += height / 2;
+ }
+
+ // Shortcut for drawing a 2D circle
+ if (width === height) {
+ curContext.beginPath();
+ curContext.arc(x, y, width / 2, 0, PConstants.TWO_PI, false);
+ executeContextFill();
+ executeContextStroke();
+ } else {
+ var w = width / 2,
+ h = height / 2,
+ C = 0.5522847498307933,
+ c_x = C * w,
+ c_y = C * h;
+
+ p.beginShape();
+ p.vertex(x + w, y);
+ p.bezierVertex(x + w, y - c_y, x + c_x, y - h, x, y - h);
+ p.bezierVertex(x - c_x, y - h, x - w, y - c_y, x - w, y);
+ p.bezierVertex(x - w, y + c_y, x - c_x, y + h, x, y + h);
+ p.bezierVertex(x + c_x, y + h, x + w, y + c_y, x + w, y);
+ p.endShape();
+ }
+ };
+
+ Drawing3D.prototype.ellipse = function(x, y, width, height) {
+ x = x || 0;
+ y = y || 0;
+
+ if (width <= 0 && height <= 0) {
+ return;
+ }
+
+ if (curEllipseMode === PConstants.RADIUS) {
+ width *= 2;
+ height *= 2;
+ } else if (curEllipseMode === PConstants.CORNERS) {
+ width = width - x;
+ height = height - y;
+ x += width / 2;
+ y += height / 2;
+ } else if (curEllipseMode === PConstants.CORNER) {
+ x += width / 2;
+ y += height / 2;
+ }
+
+ var w = width / 2,
+ h = height / 2,
+ C = 0.5522847498307933,
+ c_x = C * w,
+ c_y = C * h;
+
+ p.beginShape();
+ p.vertex(x + w, y);
+ p.bezierVertex(x + w, y - c_y, 0, x + c_x, y - h, 0, x, y - h, 0);
+ p.bezierVertex(x - c_x, y - h, 0, x - w, y - c_y, 0, x - w, y, 0);
+ p.bezierVertex(x - w, y + c_y, 0, x - c_x, y + h, 0, x, y + h, 0);
+ p.bezierVertex(x + c_x, y + h, 0, x + w, y + c_y, 0, x + w, y, 0);
+ p.endShape();
+
+ if (doFill) {
+ //temporary workaround to not working fills for bezier -- will fix later
+ var xAv = 0, yAv = 0, i, j;
+ for (i = 0; i < vertArray.length; i++) {
+ xAv += vertArray[i][0];
+ yAv += vertArray[i][1];
+ }
+ xAv /= vertArray.length;
+ yAv /= vertArray.length;
+ var vert = [],
+ fillVertArray = [],
+ colorVertArray = [];
+ vert[0] = xAv;
+ vert[1] = yAv;
+ vert[2] = 0;
+ vert[3] = 0;
+ vert[4] = 0;
+ vert[5] = fillStyle[0];
+ vert[6] = fillStyle[1];
+ vert[7] = fillStyle[2];
+ vert[8] = fillStyle[3];
+ vert[9] = strokeStyle[0];
+ vert[10] = strokeStyle[1];
+ vert[11] = strokeStyle[2];
+ vert[12] = strokeStyle[3];
+ vert[13] = normalX;
+ vert[14] = normalY;
+ vert[15] = normalZ;
+ vertArray.unshift(vert);
+ for (i = 0; i < vertArray.length; i++) {
+ for (j = 0; j < 3; j++) {
+ fillVertArray.push(vertArray[i][j]);
+ }
+ for (j = 5; j < 9; j++) {
+ colorVertArray.push(vertArray[i][j]);
+ }
+ }
+ fill3D(fillVertArray, "TRIANGLE_FAN", colorVertArray);
+ }
+ };
+
+ /**
+ * Sets the current normal vector. This is for drawing three dimensional shapes and surfaces and
+ * specifies a vector perpendicular to the surface of the shape which determines how lighting affects
+ * it. Processing attempts to automatically assign normals to shapes, but since that's imperfect,
+ * this is a better option when you want more control. This function is identical to glNormal3f() in OpenGL.
+ *
+ * @param {float} nx x direction
+ * @param {float} ny y direction
+ * @param {float} nz z direction
+ *
+ * @see beginShape
+ * @see endShape
+ * @see lights
+ */
+ p.normal = function(nx, ny, nz) {
+ if (arguments.length !== 3 || !(typeof nx === "number" && typeof ny === "number" && typeof nz === "number")) {
+ throw "normal() requires three numeric arguments.";
+ }
+
+ normalX = nx;
+ normalY = ny;
+ normalZ = nz;
+
+ if (curShape !== 0) {
+ if (normalMode === PConstants.NORMAL_MODE_AUTO) {
+ normalMode = PConstants.NORMAL_MODE_SHAPE;
+ } else if (normalMode === PConstants.NORMAL_MODE_SHAPE) {
+ normalMode = PConstants.NORMAL_MODE_VERTEX;
+ }
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Raster drawing functions
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Saves an image from the display window. Images are saved in TIFF, TARGA, JPEG, and PNG format
+ * depending on the extension within the filename parameter. For example, "image.tif" will have
+ * a TIFF image and "image.png" will save a PNG image. If no extension is included in the filename,
+ * the image will save in TIFF format and .tif will be added to the name. These files are saved to
+ * the sketch's folder, which may be opened by selecting "Show sketch folder" from the "Sketch" menu.
+ * It is not possible to use save() while running the program in a web browser. All images saved
+ * from the main drawing window will be opaque. To save images without a background, use createGraphics().
+ *
+ * @param {String} filename any sequence of letters and numbers
+ *
+ * @see saveFrame
+ * @see createGraphics
+ */
+ p.save = function(file, img) {
+ // file is unused at the moment
+ // may implement this differently in later release
+ if (img !== undef) {
+ return window.open(img.toDataURL(),"_blank");
+ }
+ return window.open(p.externals.canvas.toDataURL(),"_blank");
+ };
+
+ var saveNumber = 0;
+
+ p.saveFrame = function(file) {
+ if(file === undef) {
+ // use default name template if parameter is not specified
+ file = "screen-####.png";
+ }
+ // Increment changeable part: screen-0000.png, screen-0001.png, ...
+ var frameFilename = file.replace(/#+/, function(all) {
+ var s = "" + (saveNumber++);
+ while(s.length < all.length) {
+ s = "0" + s;
+ }
+ return s;
+ });
+ p.save(frameFilename);
+ };
+
+ var utilityContext2d = document.createElement("canvas").getContext("2d");
+
+ var canvasDataCache = [undef, undef, undef]; // we need three for now
+
+ function getCanvasData(obj, w, h) {
+ var canvasData = canvasDataCache.shift();
+
+ if (canvasData === undef) {
+ canvasData = {};
+ canvasData.canvas = document.createElement("canvas");
+ canvasData.context = canvasData.canvas.getContext('2d');
+ }
+
+ canvasDataCache.push(canvasData);
+
+ var canvas = canvasData.canvas, context = canvasData.context,
+ width = w || obj.width, height = h || obj.height;
+
+ canvas.width = width;
+ canvas.height = height;
+
+ if (!obj) {
+ context.clearRect(0, 0, width, height);
+ } else if ("data" in obj) { // ImageData
+ context.putImageData(obj, 0, 0);
+ } else {
+ context.clearRect(0, 0, width, height);
+ context.drawImage(obj, 0, 0, width, height);
+ }
+ return canvasData;
+ }
+
+ /**
+ * Handle the sketch code for pixels[] and pixels.length
+ * parser code converts pixels[] to getPixels()
+ * or setPixels(), .length becomes getLength()
+ */
+ function buildPixelsObject(pImage) {
+ return {
+
+ getLength: (function(aImg) {
+ return function() {
+ if (aImg.isRemote) {
+ throw "Image is loaded remotely. Cannot get length.";
+ } else {
+ return aImg.imageData.data.length ? aImg.imageData.data.length/4 : 0;
+ }
+ };
+ }(pImage)),
+
+ getPixel: (function(aImg) {
+ return function(i) {
+ var offset = i*4,
+ data = aImg.imageData.data;
+
+ if (aImg.isRemote) {
+ throw "Image is loaded remotely. Cannot get pixels.";
+ }
+
+ return (data[offset+3] << 24) & PConstants.ALPHA_MASK |
+ (data[offset] << 16) & PConstants.RED_MASK |
+ (data[offset+1] << 8) & PConstants.GREEN_MASK |
+ data[offset+2] & PConstants.BLUE_MASK;
+ };
+ }(pImage)),
+
+ setPixel: (function(aImg) {
+ return function(i, c) {
+ var offset = i*4,
+ data = aImg.imageData.data;
+
+ if (aImg.isRemote) {
+ throw "Image is loaded remotely. Cannot set pixel.";
+ }
+
+ data[offset+0] = (c & PConstants.RED_MASK) >>> 16;
+ data[offset+1] = (c & PConstants.GREEN_MASK) >>> 8;
+ data[offset+2] = (c & PConstants.BLUE_MASK);
+ data[offset+3] = (c & PConstants.ALPHA_MASK) >>> 24;
+ aImg.__isDirty = true;
+ };
+ }(pImage)),
+
+ toArray: (function(aImg) {
+ return function() {
+ var arr = [],
+ data = aImg.imageData.data,
+ length = aImg.width * aImg.height;
+
+ if (aImg.isRemote) {
+ throw "Image is loaded remotely. Cannot get pixels.";
+ }
+
+ for (var i = 0, offset = 0; i < length; i++, offset += 4) {
+ arr.push( (data[offset+3] << 24) & PConstants.ALPHA_MASK |
+ (data[offset] << 16) & PConstants.RED_MASK |
+ (data[offset+1] << 8) & PConstants.GREEN_MASK |
+ data[offset+2] & PConstants.BLUE_MASK );
+ }
+ return arr;
+ };
+ }(pImage)),
+
+ set: (function(aImg) {
+ return function(arr) {
+ var offset,
+ data,
+ c;
+ if (this.isRemote) {
+ throw "Image is loaded remotely. Cannot set pixels.";
+ }
+
+ data = aImg.imageData.data;
+ for (var i = 0, aL = arr.length; i < aL; i++) {
+ c = arr[i];
+ offset = i*4;
+
+ data[offset+0] = (c & PConstants.RED_MASK) >>> 16;
+ data[offset+1] = (c & PConstants.GREEN_MASK) >>> 8;
+ data[offset+2] = (c & PConstants.BLUE_MASK);
+ data[offset+3] = (c & PConstants.ALPHA_MASK) >>> 24;
+ }
+ aImg.__isDirty = true;
+ };
+ }(pImage))
+
+ };
+ }
+
+ /**
+ * Datatype for storing images. Processing can display .gif, .jpg, .tga, and .png images. Images may be
+ * displayed in 2D and 3D space. Before an image is used, it must be loaded with the loadImage() function.
+ * The PImage object contains fields for the width and height of the image, as well as an array called
+ * pixels[] which contains the values for every pixel in the image. A group of methods, described below,
+ * allow easy access to the image's pixels and alpha channel and simplify the process of compositing.
+ * Before using the pixels[] array, be sure to use the loadPixels() method on the image to make sure that the
+ * pixel data is properly loaded. To create a new image, use the createImage() function (do not use new PImage()).
+ *
+ * @param {int} width image width
+ * @param {int} height image height
+ * @param {MODE} format Either RGB, ARGB, ALPHA (grayscale alpha channel)
+ *
+ * @returns {PImage}
+ *
+ * @see loadImage
+ * @see imageMode
+ * @see createImage
+ */
+ var PImage = function(aWidth, aHeight, aFormat) {
+
+ // Keep track of whether or not the cached imageData has been touched.
+ this.__isDirty = false;
+
+ if (aWidth instanceof HTMLImageElement) {
+ // convert an <img> to a PImage
+ this.fromHTMLImageData(aWidth);
+ } else if (aHeight || aFormat) {
+ this.width = aWidth || 1;
+ this.height = aHeight || 1;
+
+ // Stuff a canvas into sourceImg so image() calls can use drawImage like an <img>
+ var canvas = this.sourceImg = document.createElement("canvas");
+ canvas.width = this.width;
+ canvas.height = this.height;
+
+ var imageData = this.imageData = canvas.getContext('2d').createImageData(this.width, this.height);
+ this.format = (aFormat === PConstants.ARGB || aFormat === PConstants.ALPHA) ? aFormat : PConstants.RGB;
+ if (this.format === PConstants.RGB) {
+ // Set the alpha channel of an RGB image to opaque.
+ for (var i = 3, data = this.imageData.data, len = data.length; i < len; i += 4) {
+ data[i] = 255;
+ }
+ }
+
+ this.__isDirty = true;
+ this.updatePixels();
+ } else {
+ this.width = 0;
+ this.height = 0;
+ this.imageData = utilityContext2d.createImageData(1, 1);
+ this.format = PConstants.ARGB;
+ }
+
+ this.pixels = buildPixelsObject(this);
+ };
+ PImage.prototype = {
+
+ /**
+ * Temporary hack to deal with cross-Processing-instance created PImage. See
+ * tickets #1623 and #1644.
+ */
+ __isPImage: true,
+
+ /**
+ * @member PImage
+ * Updates the image with the data in its pixels[] array. Use in conjunction with loadPixels(). If
+ * you're only reading pixels from the array, there's no need to call updatePixels().
+ * Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the rule
+ * is that any time you want to manipulate the pixels[] array, you must first call loadPixels(), and
+ * after changes have been made, call updatePixels(). Even if the renderer may not seem to use this
+ * function in the current Processing release, this will always be subject to change.
+ * Currently, none of the renderers use the additional parameters to updatePixels().
+ */
+ updatePixels: function() {
+ var canvas = this.sourceImg;
+ if (canvas && canvas instanceof HTMLCanvasElement && this.__isDirty) {
+ canvas.getContext('2d').putImageData(this.imageData, 0, 0);
+ }
+ this.__isDirty = false;
+ },
+
+ fromHTMLImageData: function(htmlImg) {
+ // convert an <img> to a PImage
+ var canvasData = getCanvasData(htmlImg);
+ try {
+ var imageData = canvasData.context.getImageData(0, 0, htmlImg.width, htmlImg.height);
+ this.fromImageData(imageData);
+ } catch(e) {
+ if (htmlImg.width && htmlImg.height) {
+ this.isRemote = true;
+ this.width = htmlImg.width;
+ this.height = htmlImg.height;
+ }
+ }
+ this.sourceImg = htmlImg;
+ },
+
+ 'get': function(x, y, w, h) {
+ if (!arguments.length) {
+ return p.get(this);
+ }
+ if (arguments.length === 2) {
+ return p.get(x, y, this);
+ }
+ if (arguments.length === 4) {
+ return p.get(x, y, w, h, this);
+ }
+ },
+
+ /**
+ * @member PImage
+ * Changes the color of any pixel or writes an image directly into the image. The x and y parameter
+ * specify the pixel or the upper-left corner of the image. The color parameter specifies the color value.
+ * Setting the color of a single pixel with set(x, y) is easy, but not as fast as putting the data
+ * directly into pixels[]. The equivalent statement to "set(x, y, #000000)" using pixels[] is
+ * "pixels[y*width+x] = #000000". Processing requires calling loadPixels() to load the display window
+ * data into the pixels[] array before getting the values and calling updatePixels() to update the window.
+ *
+ * @param {int} x x-coordinate of the pixel or upper-left corner of the image
+ * @param {int} y y-coordinate of the pixel or upper-left corner of the image
+ * @param {color} color any value of the color datatype
+ *
+ * @see get
+ * @see pixels[]
+ * @see copy
+ */
+ 'set': function(x, y, c) {
+ p.set(x, y, c, this);
+ this.__isDirty = true;
+ },
+
+ /**
+ * @member PImage
+ * Blends a region of pixels into the image specified by the img parameter. These copies utilize full
+ * alpha channel support and a choice of the following modes to blend the colors of source pixels (A)
+ * with the ones of pixels in the destination image (B):
+ * BLEND - linear interpolation of colours: C = A*factor + B
+ * ADD - additive blending with white clip: C = min(A*factor + B, 255)
+ * SUBTRACT - subtractive blending with black clip: C = max(B - A*factor, 0)
+ * DARKEST - only the darkest colour succeeds: C = min(A*factor, B)
+ * LIGHTEST - only the lightest colour succeeds: C = max(A*factor, B)
+ * DIFFERENCE - subtract colors from underlying image.
+ * EXCLUSION - similar to DIFFERENCE, but less extreme.
+ * MULTIPLY - Multiply the colors, result will always be darker.
+ * SCREEN - Opposite multiply, uses inverse values of the colors.
+ * OVERLAY - A mix of MULTIPLY and SCREEN. Multiplies dark values, and screens light values.
+ * HARD_LIGHT - SCREEN when greater than 50% gray, MULTIPLY when lower.
+ * SOFT_LIGHT - Mix of DARKEST and LIGHTEST. Works like OVERLAY, but not as harsh.
+ * DODGE - Lightens light tones and increases contrast, ignores darks. Called "Color Dodge" in Illustrator and Photoshop.
+ * BURN - Darker areas are applied, increasing contrast, ignores lights. Called "Color Burn" in Illustrator and Photoshop.
+ * All modes use the alpha information (highest byte) of source image pixels as the blending factor.
+ * If the source and destination regions are different sizes, the image will be automatically resized to
+ * match the destination size. If the srcImg parameter is not used, the display window is used as the source image.
+ * This function ignores imageMode().
+ *
+ * @param {int} x X coordinate of the source's upper left corner
+ * @param {int} y Y coordinate of the source's upper left corner
+ * @param {int} width source image width
+ * @param {int} height source image height
+ * @param {int} dx X coordinate of the destinations's upper left corner
+ * @param {int} dy Y coordinate of the destinations's upper left corner
+ * @param {int} dwidth destination image width
+ * @param {int} dheight destination image height
+ * @param {PImage} srcImg an image variable referring to the source image
+ * @param {MODE} MODE Either BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, DIFFERENCE, EXCLUSION,
+ * MULTIPLY, SCREEN, OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, BURN
+ *
+ * @see alpha
+ * @see copy
+ */
+ blend: function(srcImg, x, y, width, height, dx, dy, dwidth, dheight, MODE) {
+ if (arguments.length === 9) {
+ p.blend(this, srcImg, x, y, width, height, dx, dy, dwidth, dheight, this);
+ } else if (arguments.length === 10) {
+ p.blend(srcImg, x, y, width, height, dx, dy, dwidth, dheight, MODE, this);
+ }
+ delete this.sourceImg;
+ },
+
+ /**
+ * @member PImage
+ * Copies a region of pixels from one image into another. If the source and destination regions
+ * aren't the same size, it will automatically resize source pixels to fit the specified target region.
+ * No alpha information is used in the process, however if the source image has an alpha channel set,
+ * it will be copied as well. This function ignores imageMode().
+ *
+ * @param {int} sx X coordinate of the source's upper left corner
+ * @param {int} sy Y coordinate of the source's upper left corner
+ * @param {int} swidth source image width
+ * @param {int} sheight source image height
+ * @param {int} dx X coordinate of the destinations's upper left corner
+ * @param {int} dy Y coordinate of the destinations's upper left corner
+ * @param {int} dwidth destination image width
+ * @param {int} dheight destination image height
+ * @param {PImage} srcImg an image variable referring to the source image
+ *
+ * @see alpha
+ * @see blend
+ */
+ copy: function(srcImg, sx, sy, swidth, sheight, dx, dy, dwidth, dheight) {
+ if (arguments.length === 8) {
+ p.blend(this, srcImg, sx, sy, swidth, sheight, dx, dy, dwidth, PConstants.REPLACE, this);
+ } else if (arguments.length === 9) {
+ p.blend(srcImg, sx, sy, swidth, sheight, dx, dy, dwidth, dheight, PConstants.REPLACE, this);
+ }
+ delete this.sourceImg;
+ },
+
+ /**
+ * @member PImage
+ * Filters an image as defined by one of the following modes:
+ * THRESHOLD - converts the image to black and white pixels depending if they are above or below
+ * the threshold defined by the level parameter. The level must be between 0.0 (black) and 1.0(white).
+ * If no level is specified, 0.5 is used.
+ * GRAY - converts any colors in the image to grayscale equivalents
+ * INVERT - sets each pixel to its inverse value
+ * POSTERIZE - limits each channel of the image to the number of colors specified as the level parameter
+ * BLUR - executes a Guassian blur with the level parameter specifying the extent of the blurring.
+ * If no level parameter is used, the blur is equivalent to Guassian blur of radius 1.
+ * OPAQUE - sets the alpha channel to entirely opaque.
+ * ERODE - reduces the light areas with the amount defined by the level parameter.
+ * DILATE - increases the light areas with the amount defined by the level parameter
+ *
+ * @param {MODE} MODE Either THRESHOLD, GRAY, INVERT, POSTERIZE, BLUR, OPAQUE, ERODE, or DILATE
+ * @param {int|float} param in the range from 0 to 1
+ */
+ filter: function(mode, param) {
+ if (arguments.length === 2) {
+ p.filter(mode, param, this);
+ } else if (arguments.length === 1) {
+ // no param specified, send null to show its invalid
+ p.filter(mode, null, this);
+ }
+ delete this.sourceImg;
+ },
+
+ /**
+ * @member PImage
+ * Saves the image into a file. Images are saved in TIFF, TARGA, JPEG, and PNG format depending on
+ * the extension within the filename parameter. For example, "image.tif" will have a TIFF image and
+ * "image.png" will save a PNG image. If no extension is included in the filename, the image will save
+ * in TIFF format and .tif will be added to the name. These files are saved to the sketch's folder,
+ * which may be opened by selecting "Show sketch folder" from the "Sketch" menu. It is not possible to
+ * use save() while running the program in a web browser.
+ * To save an image created within the code, rather than through loading, it's necessary to make the
+ * image with the createImage() function so it is aware of the location of the program and can therefore
+ * save the file to the right place. See the createImage() reference for more information.
+ *
+ * @param {String} filename a sequence of letters and numbers
+ */
+ save: function(file){
+ p.save(file,this);
+ },
+
+ /**
+ * @member PImage
+ * Resize the image to a new width and height. To make the image scale proportionally, use 0 as the
+ * value for the wide or high parameter.
+ *
+ * @param {int} wide the resized image width
+ * @param {int} high the resized image height
+ *
+ * @see get
+ */
+ resize: function(w, h) {
+ if (this.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot resize.";
+ }
+ if (this.width !== 0 || this.height !== 0) {
+ // make aspect ratio if w or h is 0
+ if (w === 0 && h !== 0) {
+ w = Math.floor(this.width / this.height * h);
+ } else if (h === 0 && w !== 0) {
+ h = Math.floor(this.height / this.width * w);
+ }
+ // put 'this.imageData' into a new canvas
+ var canvas = getCanvasData(this.imageData).canvas;
+ // pull imageData object out of canvas into ImageData object
+ var imageData = getCanvasData(canvas, w, h).context.getImageData(0, 0, w, h);
+ // set this as new pimage
+ this.fromImageData(imageData);
+ }
+ },
+
+ /**
+ * @member PImage
+ * Masks part of an image from displaying by loading another image and using it as an alpha channel.
+ * This mask image should only contain grayscale data, but only the blue color channel is used. The
+ * mask image needs to be the same size as the image to which it is applied.
+ * In addition to using a mask image, an integer array containing the alpha channel data can be
+ * specified directly. This method is useful for creating dynamically generated alpha masks. This
+ * array must be of the same length as the target image's pixels array and should contain only grayscale
+ * data of values between 0-255.
+ *
+ * @param {PImage} maskImg any PImage object used as the alpha channel for "img", needs to be same
+ * size as "img"
+ * @param {int[]} maskArray any array of Integer numbers used as the alpha channel, needs to be same
+ * length as the image's pixel array
+ */
+ mask: function(mask) {
+ var obj = this.toImageData(),
+ i,
+ size;
+
+ if (mask instanceof PImage || mask.__isPImage) {
+ if (mask.width === this.width && mask.height === this.height) {
+ mask = mask.toImageData();
+
+ for (i = 2, size = this.width * this.height * 4; i < size; i += 4) {
+ // using it as an alpha channel
+ obj.data[i + 1] = mask.data[i];
+ // but only the blue color channel
+ }
+ } else {
+ throw "mask must have the same dimensions as PImage.";
+ }
+ } else if (mask instanceof Array) {
+ if (this.width * this.height === mask.length) {
+ for (i = 0, size = mask.length; i < size; ++i) {
+ obj.data[i * 4 + 3] = mask[i];
+ }
+ } else {
+ throw "mask array must be the same length as PImage pixels array.";
+ }
+ }
+
+ this.fromImageData(obj);
+ },
+
+ // These are intentionally left blank for PImages, we work live with pixels and draw as necessary
+ /**
+ * @member PImage
+ * Loads the pixel data for the image into its pixels[] array. This function must always be called
+ * before reading from or writing to pixels[].
+ * Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the
+ * rule is that any time you want to manipulate the pixels[] array, you must first call loadPixels(),
+ * and after changes have been made, call updatePixels(). Even if the renderer may not seem to use
+ * this function in the current Processing release, this will always be subject to change.
+ */
+ loadPixels: noop,
+
+ toImageData: function() {
+ if (this.isRemote) {
+ return this.sourceImg;
+ }
+
+ if (!this.__isDirty) {
+ return this.imageData;
+ }
+
+ var canvasData = getCanvasData(this.sourceImg);
+ return canvasData.context.getImageData(0, 0, this.width, this.height);
+ },
+
+ toDataURL: function() {
+ if (this.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot create dataURI.";
+ }
+ var canvasData = getCanvasData(this.imageData);
+ return canvasData.canvas.toDataURL();
+ },
+
+ fromImageData: function(canvasImg) {
+ var w = canvasImg.width,
+ h = canvasImg.height,
+ canvas = document.createElement('canvas'),
+ ctx = canvas.getContext('2d');
+
+ this.width = canvas.width = w;
+ this.height = canvas.height = h;
+
+ ctx.putImageData(canvasImg, 0, 0);
+
+ // changed for 0.9
+ this.format = PConstants.ARGB;
+
+ this.imageData = canvasImg;
+ this.sourceImg = canvas;
+ }
+ };
+
+ p.PImage = PImage;
+
+ /**
+ * Creates a new PImage (the datatype for storing images). This provides a fresh buffer of pixels to play
+ * with. Set the size of the buffer with the width and height parameters. The format parameter defines how
+ * the pixels are stored. See the PImage reference for more information.
+ * Be sure to include all three parameters, specifying only the width and height (but no format) will
+ * produce a strange error.
+ * Advanced users please note that createImage() should be used instead of the syntax new PImage().
+ *
+ * @param {int} width image width
+ * @param {int} height image height
+ * @param {MODE} format Either RGB, ARGB, ALPHA (grayscale alpha channel)
+ *
+ * @returns {PImage}
+ *
+ * @see PImage
+ * @see PGraphics
+ */
+ p.createImage = function(w, h, mode) {
+ return new PImage(w,h,mode);
+ };
+
+ // Loads an image for display. Type is an extension. Callback is fired on load.
+ /**
+ * Loads an image into a variable of type PImage. Four types of images ( .gif, .jpg, .tga, .png) images may
+ * be loaded. To load correctly, images must be located in the data directory of the current sketch. In most
+ * cases, load all images in setup() to preload them at the start of the program. Loading images inside draw()
+ * will reduce the speed of a program.
+ * The filename parameter can also be a URL to a file found online. For security reasons, a Processing sketch
+ * found online can only download files from the same server from which it came. Getting around this restriction
+ * requires a signed applet.
+ * The extension parameter is used to determine the image type in cases where the image filename does not end
+ * with a proper extension. Specify the extension as the second parameter to loadImage(), as shown in the
+ * third example on this page.
+ * If an image is not loaded successfully, the null value is returned and an error message will be printed to
+ * the console. The error message does not halt the program, however the null value may cause a NullPointerException
+ * if your code does not check whether the value returned from loadImage() is null.
+ * Depending on the type of error, a PImage object may still be returned, but the width and height of the image
+ * will be set to -1. This happens if bad image data is returned or cannot be decoded properly. Sometimes this happens
+ * with image URLs that produce a 403 error or that redirect to a password prompt, because loadImage() will attempt
+ * to interpret the HTML as image data.
+ *
+ * @param {String} filename name of file to load, can be .gif, .jpg, .tga, or a handful of other image
+ * types depending on your platform.
+ * @param {String} extension the type of image to load, for example "png", "gif", "jpg"
+ *
+ * @returns {PImage}
+ *
+ * @see PImage
+ * @see image
+ * @see imageMode
+ * @see background
+ */
+ p.loadImage = function(file, type, callback) {
+ // if type is specified, we just ignore it
+
+ var pimg;
+ // if image is in the preloader cache return a new PImage
+ if (curSketch.imageCache.images[file]) {
+ pimg = new PImage(curSketch.imageCache.images[file]);
+ pimg.loaded = true;
+ return pimg;
+ }
+ // else async load it
+ pimg = new PImage();
+ var img = document.createElement('img');
+
+ pimg.sourceImg = img;
+
+ img.onload = (function(aImage, aPImage, aCallback) {
+ var image = aImage;
+ var pimg = aPImage;
+ var callback = aCallback;
+ return function() {
+ // change the <img> object into a PImage now that its loaded
+ pimg.fromHTMLImageData(image);
+ pimg.loaded = true;
+ if (callback) {
+ callback();
+ }
+ };
+ }(img, pimg, callback));
+
+ img.src = file; // needs to be called after the img.onload function is declared or it wont work in opera
+ return pimg;
+ };
+
+ // async loading of large images, same functionality as loadImage above
+ /**
+ * This function load images on a separate thread so that your sketch does not freeze while images load during
+ * setup(). While the image is loading, its width and height will be 0. If an error occurs while loading the image,
+ * its width and height will be set to -1. You'll know when the image has loaded properly because its width and
+ * height will be greater than 0. Asynchronous image loading (particularly when downloading from a server) can
+ * dramatically improve performance.
+ * The extension parameter is used to determine the image type in cases where the image filename does not end
+ * with a proper extension. Specify the extension as the second parameter to requestImage().
+ *
+ * @param {String} filename name of file to load, can be .gif, .jpg, .tga, or a handful of other image
+ * types depending on your platform.
+ * @param {String} extension the type of image to load, for example "png", "gif", "jpg"
+ *
+ * @returns {PImage}
+ *
+ * @see PImage
+ * @see loadImage
+ */
+ p.requestImage = p.loadImage;
+
+ function get$2(x,y) {
+ var data;
+ // return the color at x,y (int) of curContext
+ if (x >= p.width || x < 0 || y < 0 || y >= p.height) {
+ // x,y is outside image return transparent black
+ return 0;
+ }
+
+ // loadPixels() has been called
+ if (isContextReplaced) {
+ var offset = ((0|x) + p.width * (0|y)) * 4;
+ data = p.imageData.data;
+ return (data[offset + 3] << 24) & PConstants.ALPHA_MASK |
+ (data[offset] << 16) & PConstants.RED_MASK |
+ (data[offset + 1] << 8) & PConstants.GREEN_MASK |
+ data[offset + 2] & PConstants.BLUE_MASK;
+ }
+
+ // x,y is inside canvas space
+ data = p.toImageData(0|x, 0|y, 1, 1).data;
+ return (data[3] << 24) & PConstants.ALPHA_MASK |
+ (data[0] << 16) & PConstants.RED_MASK |
+ (data[1] << 8) & PConstants.GREEN_MASK |
+ data[2] & PConstants.BLUE_MASK;
+ }
+ function get$3(x,y,img) {
+ if (img.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot get x,y.";
+ }
+ // PImage.get(x,y) was called, return the color (int) at x,y of img
+ var offset = y * img.width * 4 + (x * 4),
+ data = img.imageData.data;
+ return (data[offset + 3] << 24) & PConstants.ALPHA_MASK |
+ (data[offset] << 16) & PConstants.RED_MASK |
+ (data[offset + 1] << 8) & PConstants.GREEN_MASK |
+ data[offset + 2] & PConstants.BLUE_MASK;
+ }
+ function get$4(x, y, w, h) {
+ // return a PImage of w and h from cood x,y of curContext
+ var c = new PImage(w, h, PConstants.ARGB);
+ c.fromImageData(p.toImageData(x, y, w, h));
+ return c;
+ }
+ function get$5(x, y, w, h, img) {
+ if (img.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot get x,y,w,h.";
+ }
+ // PImage.get(x,y,w,h) was called, return x,y,w,h PImage of img
+ // offset start point needs to be *4
+ var c = new PImage(w, h, PConstants.ARGB), cData = c.imageData.data,
+ imgWidth = img.width, imgHeight = img.height, imgData = img.imageData.data;
+ // Don't need to copy pixels from the image outside ranges.
+ var startRow = Math.max(0, -y), startColumn = Math.max(0, -x),
+ stopRow = Math.min(h, imgHeight - y), stopColumn = Math.min(w, imgWidth - x);
+ for (var i = startRow; i < stopRow; ++i) {
+ var sourceOffset = ((y + i) * imgWidth + (x + startColumn)) * 4;
+ var targetOffset = (i * w + startColumn) * 4;
+ for (var j = startColumn; j < stopColumn; ++j) {
+ cData[targetOffset++] = imgData[sourceOffset++];
+ cData[targetOffset++] = imgData[sourceOffset++];
+ cData[targetOffset++] = imgData[sourceOffset++];
+ cData[targetOffset++] = imgData[sourceOffset++];
+ }
+ }
+ c.__isDirty = true;
+ return c;
+ }
+
+ // Gets a single pixel or block of pixels from the current Canvas Context or a PImage
+ /**
+ * Reads the color of any pixel or grabs a section of an image. If no parameters are specified, the entire
+ * image is returned. Get the value of one pixel by specifying an x,y coordinate. Get a section of the display
+ * window by specifying an additional width and height parameter. If the pixel requested is outside of the image
+ * window, black is returned. The numbers returned are scaled according to the current color ranges, but only RGB
+ * values are returned by this function. For example, even though you may have drawn a shape with colorMode(HSB),
+ * the numbers returned will be in RGB.
+ * Getting the color of a single pixel with get(x, y) is easy, but not as fast as grabbing the data directly
+ * from pixels[]. The equivalent statement to "get(x, y)" using pixels[] is "pixels[y*width+x]". Processing
+ * requires calling loadPixels() to load the display window data into the pixels[] array before getting the values.
+ * This function ignores imageMode().
+ *
+ * @param {int} x x-coordinate of the pixel
+ * @param {int} y y-coordinate of the pixel
+ * @param {int} width width of pixel rectangle to get
+ * @param {int} height height of pixel rectangle to get
+ *
+ * @returns {Color|PImage}
+ *
+ * @see set
+ * @see pixels[]
+ * @see imageMode
+ */
+ p.get = function(x, y, w, h, img) {
+ // for 0 2 and 4 arguments use curContext, otherwise PImage.get was called
+ if (img !== undefined) {
+ return get$5(x, y, w, h, img);
+ }
+ if (h !== undefined) {
+ return get$4(x, y, w, h);
+ }
+ if (w !== undefined) {
+ return get$3(x, y, w);
+ }
+ if (y !== undefined) {
+ return get$2(x, y);
+ }
+ if (x !== undefined) {
+ // PImage.get() was called, return a new PImage
+ return get$5(0, 0, x.width, x.height, x);
+ }
+
+ return get$4(0, 0, p.width, p.height);
+ };
+
+ /**
+ * Creates and returns a new <b>PGraphics</b> object of the types P2D, P3D, and JAVA2D. Use this class if you need to draw
+ * into an off-screen graphics buffer. It's not possible to use <b>createGraphics()</b> with OPENGL, because it doesn't
+ * allow offscreen use. The DXF and PDF renderers require the filename parameter. <br /><br /> It's important to call
+ * any drawing commands between beginDraw() and endDraw() statements. This is also true for any commands that affect
+ * drawing, such as smooth() or colorMode().<br /><br /> Unlike the main drawing surface which is completely opaque,
+ * surfaces created with createGraphics() can have transparency. This makes it possible to draw into a graphics and
+ * maintain the alpha channel.
+ *
+ * @param {int} width width in pixels
+ * @param {int} height height in pixels
+ * @param {int} renderer Either P2D, P3D, JAVA2D, PDF, DXF
+ * @param {String} filename the name of the file (not supported yet)
+ */
+ p.createGraphics = function(w, h, render) {
+ var pg = new Processing();
+ pg.size(w, h, render);
+ pg.background(0,0);
+ return pg;
+ };
+
+ // pixels caching
+ function resetContext() {
+ if(isContextReplaced) {
+ curContext = originalContext;
+ isContextReplaced = false;
+
+ p.updatePixels();
+ }
+ }
+ function SetPixelContextWrapper() {
+ function wrapFunction(newContext, name) {
+ function wrapper() {
+ resetContext();
+ curContext[name].apply(curContext, arguments);
+ }
+ newContext[name] = wrapper;
+ }
+ function wrapProperty(newContext, name) {
+ function getter() {
+ resetContext();
+ return curContext[name];
+ }
+ function setter(value) {
+ resetContext();
+ curContext[name] = value;
+ }
+ p.defineProperty(newContext, name, { get: getter, set: setter });
+ }
+ for(var n in curContext) {
+ if(typeof curContext[n] === 'function') {
+ wrapFunction(this, n);
+ } else {
+ wrapProperty(this, n);
+ }
+ }
+ }
+ function replaceContext() {
+ if(isContextReplaced) {
+ return;
+ }
+ p.loadPixels();
+ if(proxyContext === null) {
+ originalContext = curContext;
+ proxyContext = new SetPixelContextWrapper();
+ }
+ isContextReplaced = true;
+ curContext = proxyContext;
+ setPixelsCached = 0;
+ }
+
+ function set$3(x, y, c) {
+ if (x < p.width && x >= 0 && y >= 0 && y < p.height) {
+ replaceContext();
+ p.pixels.setPixel((0|x)+p.width*(0|y), c);
+ if(++setPixelsCached > maxPixelsCached) {
+ resetContext();
+ }
+ }
+ }
+ function set$4(x, y, obj, img) {
+ if (img.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot set x,y.";
+ }
+ var c = p.color.toArray(obj);
+ var offset = y * img.width * 4 + (x*4);
+ var data = img.imageData.data;
+ data[offset] = c[0];
+ data[offset+1] = c[1];
+ data[offset+2] = c[2];
+ data[offset+3] = c[3];
+ }
+
+ // Paints a pixel array into the canvas
+ /**
+ * Changes the color of any pixel or writes an image directly into the display window. The x and y parameters
+ * specify the pixel to change and the color parameter specifies the color value. The color parameter is affected
+ * by the current color mode (the default is RGB values from 0 to 255). When setting an image, the x and y
+ * parameters define the coordinates for the upper-left corner of the image.
+ * Setting the color of a single pixel with set(x, y) is easy, but not as fast as putting the data directly
+ * into pixels[]. The equivalent statement to "set(x, y, #000000)" using pixels[] is "pixels[y*width+x] = #000000".
+ * You must call loadPixels() to load the display window data into the pixels[] array before setting the values
+ * and calling updatePixels() to update the window with any changes. This function ignores imageMode().
+ *
+ * @param {int} x x-coordinate of the pixel
+ * @param {int} y y-coordinate of the pixel
+ * @param {Color} obj any value of the color datatype
+ * @param {PImage} img any valid variable of type PImage
+ *
+ * @see get
+ * @see pixels[]
+ * @see imageMode
+ */
+ p.set = function(x, y, obj, img) {
+ var color, oldFill;
+ if (arguments.length === 3) {
+ // called p.set(), was it with a color or a img ?
+ if (typeof obj === "number") {
+ set$3(x, y, obj);
+ } else if (obj instanceof PImage || obj.__isPImage) {
+ p.image(obj, x, y);
+ }
+ } else if (arguments.length === 4) {
+ // PImage.set(x,y,c) was called, set coordinate x,y color to c of img
+ set$4(x, y, obj, img);
+ }
+ };
+ p.imageData = {};
+
+ // handle the sketch code for pixels[]
+ // parser code converts pixels[] to getPixels() or setPixels(),
+ // .length becomes getLength()
+ /**
+ * Array containing the values for all the pixels in the display window. These values are of the color datatype.
+ * This array is the size of the display window. For example, if the image is 100x100 pixels, there will be 10000
+ * values and if the window is 200x300 pixels, there will be 60000 values. The index value defines the position
+ * of a value within the array. For example, the statment color b = pixels[230] will set the variable b to be
+ * equal to the value at that location in the array.
+ * Before accessing this array, the data must loaded with the loadPixels() function. After the array data has
+ * been modified, the updatePixels() function must be run to update the changes.
+ *
+ * @param {int} index must not exceed the size of the array
+ *
+ * @see loadPixels
+ * @see updatePixels
+ * @see get
+ * @see set
+ * @see PImage
+ */
+ p.pixels = {
+ getLength: function() { return p.imageData.data.length ? p.imageData.data.length/4 : 0; },
+ getPixel: function(i) {
+ var offset = i*4, data = p.imageData.data;
+ return (data[offset+3] << 24) & 0xff000000 |
+ (data[offset+0] << 16) & 0x00ff0000 |
+ (data[offset+1] << 8) & 0x0000ff00 |
+ data[offset+2] & 0x000000ff;
+ },
+ setPixel: function(i,c) {
+ var offset = i*4, data = p.imageData.data;
+ data[offset+0] = (c & 0x00ff0000) >>> 16; // RED_MASK
+ data[offset+1] = (c & 0x0000ff00) >>> 8; // GREEN_MASK
+ data[offset+2] = (c & 0x000000ff); // BLUE_MASK
+ data[offset+3] = (c & 0xff000000) >>> 24; // ALPHA_MASK
+ },
+ toArray: function() {
+ var arr = [], length = p.imageData.width * p.imageData.height, data = p.imageData.data;
+ for (var i = 0, offset = 0; i < length; i++, offset += 4) {
+ arr.push((data[offset+3] << 24) & 0xff000000 |
+ (data[offset+0] << 16) & 0x00ff0000 |
+ (data[offset+1] << 8) & 0x0000ff00 |
+ data[offset+2] & 0x000000ff);
+ }
+ return arr;
+ },
+ set: function(arr) {
+ for (var i = 0, aL = arr.length; i < aL; i++) {
+ this.setPixel(i, arr[i]);
+ }
+ }
+ };
+
+ // Gets a 1-Dimensional pixel array from Canvas
+ /**
+ * Loads the pixel data for the display window into the pixels[] array. This function must always be called
+ * before reading from or writing to pixels[].
+ * Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the rule is that
+ * any time you want to manipulate the pixels[] array, you must first call loadPixels(), and after changes
+ * have been made, call updatePixels(). Even if the renderer may not seem to use this function in the current
+ * Processing release, this will always be subject to change.
+ *
+ * @see pixels[]
+ * @see updatePixels
+ */
+ p.loadPixels = function() {
+ p.imageData = drawing.$ensureContext().getImageData(0, 0, p.width, p.height);
+ };
+
+ // Draws a 1-Dimensional pixel array to Canvas
+ /**
+ * Updates the display window with the data in the pixels[] array. Use in conjunction with loadPixels(). If
+ * you're only reading pixels from the array, there's no need to call updatePixels() unless there are changes.
+ * Certain renderers may or may not seem to require loadPixels() or updatePixels(). However, the rule is that
+ * any time you want to manipulate the pixels[] array, you must first call loadPixels(), and after changes
+ * have been made, call updatePixels(). Even if the renderer may not seem to use this function in the current
+ * Processing release, this will always be subject to change.
+ * Currently, none of the renderers use the additional parameters to updatePixels(), however this may be
+ * implemented in the future.
+ *
+ * @see loadPixels
+ * @see pixels[]
+ */
+ p.updatePixels = function() {
+ if (p.imageData) {
+ drawing.$ensureContext().putImageData(p.imageData, 0, 0);
+ }
+ };
+
+ /**
+ * Set various hints and hacks for the renderer. This is used to handle obscure rendering features that cannot be
+ * implemented in a consistent manner across renderers. Many options will often graduate to standard features
+ * instead of hints over time.
+ * hint(ENABLE_OPENGL_4X_SMOOTH) - Enable 4x anti-aliasing for OpenGL. This can help force anti-aliasing if
+ * it has not been enabled by the user. On some graphics cards, this can also be set by the graphics driver's
+ * control panel, however not all cards make this available. This hint must be called immediately after the
+ * size() command because it resets the renderer, obliterating any settings and anything drawn (and like size(),
+ * re-running the code that came before it again).
+ * hint(DISABLE_OPENGL_2X_SMOOTH) - In Processing 1.0, Processing always enables 2x smoothing when the OpenGL
+ * renderer is used. This hint disables the default 2x smoothing and returns the smoothing behavior found in
+ * earlier releases, where smooth() and noSmooth() could be used to enable and disable smoothing, though the
+ * quality was inferior.
+ * hint(ENABLE_NATIVE_FONTS) - Use the native version fonts when they are installed, rather than the bitmapped
+ * version from a .vlw file. This is useful with the JAVA2D renderer setting, as it will improve font rendering
+ * speed. This is not enabled by default, because it can be misleading while testing because the type will look
+ * great on your machine (because you have the font installed) but lousy on others' machines if the identical
+ * font is unavailable. This option can only be set per-sketch, and must be called before any use of textFont().
+ * hint(DISABLE_DEPTH_TEST) - Disable the zbuffer, allowing you to draw on top of everything at will. When depth
+ * testing is disabled, items will be drawn to the screen sequentially, like a painting. This hint is most often
+ * used to draw in 3D, then draw in 2D on top of it (for instance, to draw GUI controls in 2D on top of a 3D
+ * interface). Starting in release 0149, this will also clear the depth buffer. Restore the default with
+ * hint(ENABLE_DEPTH_TEST), but note that with the depth buffer cleared, any 3D drawing that happens later in
+ * draw() will ignore existing shapes on the screen.
+ * hint(ENABLE_DEPTH_SORT) - Enable primitive z-sorting of triangles and lines in P3D and OPENGL. This can slow
+ * performance considerably, and the algorithm is not yet perfect. Restore the default with hint(DISABLE_DEPTH_SORT).
+ * hint(DISABLE_OPENGL_ERROR_REPORT) - Speeds up the OPENGL renderer setting by not checking for errors while
+ * running. Undo with hint(ENABLE_OPENGL_ERROR_REPORT).
+ * As of release 0149, unhint() has been removed in favor of adding additional ENABLE/DISABLE constants to reset
+ * the default behavior. This prevents the double negatives, and also reinforces which hints can be enabled or disabled.
+ *
+ * @param {MODE} item constant: name of the hint to be enabled or disabled
+ *
+ * @see PGraphics
+ * @see createGraphics
+ * @see size
+ */
+ p.hint = function(which) {
+ var curContext = drawing.$ensureContext();
+ if (which === PConstants.DISABLE_DEPTH_TEST) {
+ curContext.disable(curContext.DEPTH_TEST);
+ curContext.depthMask(false);
+ curContext.clear(curContext.DEPTH_BUFFER_BIT);
+ }
+ else if (which === PConstants.ENABLE_DEPTH_TEST) {
+ curContext.enable(curContext.DEPTH_TEST);
+ curContext.depthMask(true);
+ }
+ else if (which === PConstants.ENABLE_OPENGL_2X_SMOOTH ||
+ which === PConstants.ENABLE_OPENGL_4X_SMOOTH){
+ renderSmooth = true;
+ }
+ else if (which === PConstants.DISABLE_OPENGL_2X_SMOOTH){
+ renderSmooth = false;
+ }
+ };
+
+ /**
+ * The background() function sets the color used for the background of the Processing window.
+ * The default background is light gray. In the <b>draw()</b> function, the background color is used to clear the display window at the beginning of each frame.
+ * An image can also be used as the background for a sketch, however its width and height must be the same size as the sketch window.
+ * To resize an image 'b' to the size of the sketch window, use b.resize(width, height).
+ * Images used as background will ignore the current <b>tint()</b> setting.
+ * For the main drawing surface, the alpha value will be ignored. However,
+ * alpha can be used on PGraphics objects from <b>createGraphics()</b>. This is
+ * the only way to set all the pixels partially transparent, for instance.
+ * If the 'gray' parameter is passed in the function sets the background to a grayscale value, based on the
+ * current colorMode.
+ * <p>
+ * Note that background() should be called before any transformations occur,
+ * because some implementations may require the current transformation matrix
+ * to be identity before drawing.
+ *
+ * @param {int|float} gray specifies a value between white and black
+ * @param {int|float} value1 red or hue value (depending on the current color mode)
+ * @param {int|float} value2 green or saturation value (depending on the current color mode)
+ * @param {int|float} value3 blue or brightness value (depending on the current color mode)
+ * @param {int|float} alpha opacity of the background
+ * @param {Color} color any value of the color datatype
+ * @param {int} hex color value in hexadecimal notation (i.e. #FFCC00 or 0xFFFFCC00)
+ * @param {PImage} image an instance of a PImage to use as a background
+ *
+ * @see #stroke()
+ * @see #fill()
+ * @see #tint()
+ * @see #colorMode()
+ */
+ var backgroundHelper = function(arg1, arg2, arg3, arg4) {
+ var obj;
+
+ if (arg1 instanceof PImage || arg1.__isPImage) {
+ obj = arg1;
+
+ if (!obj.loaded) {
+ throw "Error using image in background(): PImage not loaded.";
+ }
+ if(obj.width !== p.width || obj.height !== p.height){
+ throw "Background image must be the same dimensions as the canvas.";
+ }
+ } else {
+ obj = p.color(arg1, arg2, arg3, arg4);
+ }
+
+ backgroundObj = obj;
+ };
+
+ Drawing2D.prototype.background = function(arg1, arg2, arg3, arg4) {
+ if (arg1 !== undef) {
+ backgroundHelper(arg1, arg2, arg3, arg4);
+ }
+
+ if (backgroundObj instanceof PImage || backgroundObj.__isPImage) {
+ saveContext();
+ curContext.setTransform(1, 0, 0, 1, 0, 0);
+ p.image(backgroundObj, 0, 0);
+ restoreContext();
+ } else {
+ saveContext();
+ curContext.setTransform(1, 0, 0, 1, 0, 0);
+
+ // If the background is transparent
+ if (p.alpha(backgroundObj) !== colorModeA) {
+ curContext.clearRect(0,0, p.width, p.height);
+ }
+ curContext.fillStyle = p.color.toString(backgroundObj);
+ curContext.fillRect(0, 0, p.width, p.height);
+ isFillDirty = true;
+ restoreContext();
+ }
+ };
+
+ Drawing3D.prototype.background = function(arg1, arg2, arg3, arg4) {
+ if (arguments.length > 0) {
+ backgroundHelper(arg1, arg2, arg3, arg4);
+ }
+
+ var c = p.color.toGLArray(backgroundObj);
+ curContext.clearColor(c[0], c[1], c[2], c[3]);
+ curContext.clear(curContext.COLOR_BUFFER_BIT | curContext.DEPTH_BUFFER_BIT);
+
+ // An image as a background in 3D is not implemented yet
+ };
+
+ // Draws an image to the Canvas
+ /**
+ * Displays images to the screen. The images must be in the sketch's "data" directory to load correctly. Select "Add
+ * file..." from the "Sketch" menu to add the image. Processing currently works with GIF, JPEG, and Targa images. The
+ * color of an image may be modified with the tint() function and if a GIF has transparency, it will maintain its
+ * transparency. The img parameter specifies the image to display and the x and y parameters define the location of
+ * the image from its upper-left corner. The image is displayed at its original size unless the width and height
+ * parameters specify a different size. The imageMode() function changes the way the parameters work. A call to
+ * imageMode(CORNERS) will change the width and height parameters to define the x and y values of the opposite
+ * corner of the image.
+ *
+ * @param {PImage} img the image to display
+ * @param {int|float} x x-coordinate of the image
+ * @param {int|float} y y-coordinate of the image
+ * @param {int|float} width width to display the image
+ * @param {int|float} height height to display the image
+ *
+ * @see loadImage
+ * @see PImage
+ * @see imageMode
+ * @see tint
+ * @see background
+ * @see alpha
+ */
+ Drawing2D.prototype.image = function(img, x, y, w, h) {
+ // Fix fractional positions
+ x = Math.round(x);
+ y = Math.round(y);
+
+ if (img.width > 0) {
+ var wid = w || img.width;
+ var hgt = h || img.height;
+
+ var bounds = imageModeConvert(x || 0, y || 0, w || img.width, h || img.height, arguments.length < 4);
+ var fastImage = !!img.sourceImg && curTint === null;
+ if (fastImage) {
+ var htmlElement = img.sourceImg;
+ if (img.__isDirty) {
+ img.updatePixels();
+ }
+ // Using HTML element's width and height in case if the image was resized.
+ curContext.drawImage(htmlElement, 0, 0,
+ htmlElement.width, htmlElement.height, bounds.x, bounds.y, bounds.w, bounds.h);
+ } else {
+ var obj = img.toImageData();
+
+ // Tint the image
+ if (curTint !== null) {
+ curTint(obj);
+ img.__isDirty = true;
+ }
+
+ curContext.drawImage(getCanvasData(obj).canvas, 0, 0,
+ img.width, img.height, bounds.x, bounds.y, bounds.w, bounds.h);
+ }
+ }
+ };
+
+ Drawing3D.prototype.image = function(img, x, y, w, h) {
+ if (img.width > 0) {
+ // Fix fractional positions
+ x = Math.round(x);
+ y = Math.round(y);
+ w = w || img.width;
+ h = h || img.height;
+
+ p.beginShape(p.QUADS);
+ p.texture(img);
+ p.vertex(x, y, 0, 0, 0);
+ p.vertex(x, y+h, 0, 0, h);
+ p.vertex(x+w, y+h, 0, w, h);
+ p.vertex(x+w, y, 0, w, 0);
+ p.endShape();
+ }
+ };
+
+ /**
+ * The tint() function sets the fill value for displaying images. Images can be tinted to
+ * specified colors or made transparent by setting the alpha.
+ * <br><br>To make an image transparent, but not change it's color,
+ * use white as the tint color and specify an alpha value. For instance,
+ * tint(255, 128) will make an image 50% transparent (unless
+ * <b>colorMode()</b> has been used).
+ *
+ * <br><br>When using hexadecimal notation to specify a color, use "#" or
+ * "0x" before the values (e.g. #CCFFAA, 0xFFCCFFAA). The # syntax uses six
+ * digits to specify a color (the way colors are specified in HTML and CSS).
+ * When using the hexadecimal notation starting with "0x", the hexadecimal
+ * value must be specified with eight characters; the first two characters
+ * define the alpha component and the remainder the red, green, and blue
+ * components.
+ * <br><br>The value for the parameter "gray" must be less than or equal
+ * to the current maximum value as specified by <b>colorMode()</b>.
+ * The default maximum value is 255.
+ * <br><br>The tint() method is also used to control the coloring of
+ * textures in 3D.
+ *
+ * @param {int|float} gray any valid number
+ * @param {int|float} alpha opacity of the image
+ * @param {int|float} value1 red or hue value
+ * @param {int|float} value2 green or saturation value
+ * @param {int|float} value3 blue or brightness value
+ * @param {int|float} color any value of the color datatype
+ * @param {int} hex color value in hexadecimal notation (i.e. #FFCC00 or 0xFFFFCC00)
+ *
+ * @see #noTint()
+ * @see #image()
+ */
+ p.tint = function(a1, a2, a3, a4) {
+ var tintColor = p.color(a1, a2, a3, a4);
+ var r = p.red(tintColor) / colorModeX;
+ var g = p.green(tintColor) / colorModeY;
+ var b = p.blue(tintColor) / colorModeZ;
+ var a = p.alpha(tintColor) / colorModeA;
+ curTint = function(obj) {
+ var data = obj.data,
+ length = 4 * obj.width * obj.height;
+ for (var i = 0; i < length;) {
+ data[i++] *= r;
+ data[i++] *= g;
+ data[i++] *= b;
+ data[i++] *= a;
+ }
+ };
+ // for overriding the color buffer when 3d rendering
+ curTint3d = function(data){
+ for (var i = 0; i < data.length;) {
+ data[i++] = r;
+ data[i++] = g;
+ data[i++] = b;
+ data[i++] = a;
+ }
+ };
+ };
+
+ /**
+ * The noTint() function removes the current fill value for displaying images and reverts to displaying images with their original hues.
+ *
+ * @see #tint()
+ * @see #image()
+ */
+ p.noTint = function() {
+ curTint = null;
+ curTint3d = null;
+ };
+
+ /**
+ * Copies a region of pixels from the display window to another area of the display window and copies a region of pixels from an
+ * image used as the srcImg parameter into the display window. If the source and destination regions aren't the same size, it will
+ * automatically resize the source pixels to fit the specified target region. No alpha information is used in the process, however
+ * if the source image has an alpha channel set, it will be copied as well. This function ignores imageMode().
+ *
+ * @param {int} x X coordinate of the source's upper left corner
+ * @param {int} y Y coordinate of the source's upper left corner
+ * @param {int} width source image width
+ * @param {int} height source image height
+ * @param {int} dx X coordinate of the destination's upper left corner
+ * @param {int} dy Y coordinate of the destination's upper left corner
+ * @param {int} dwidth destination image width
+ * @param {int} dheight destination image height
+ * @param {PImage} srcImg image variable referring to the source image
+ *
+ * @see blend
+ * @see get
+ */
+ p.copy = function(src, sx, sy, sw, sh, dx, dy, dw, dh) {
+ if (dh === undef) {
+ // shift everything, and introduce p
+ dh = dw;
+ dw = dy;
+ dy = dx;
+ dx = sh;
+ sh = sw;
+ sw = sy;
+ sy = sx;
+ sx = src;
+ src = p;
+ }
+ p.blend(src, sx, sy, sw, sh, dx, dy, dw, dh, PConstants.REPLACE);
+ };
+
+ /**
+ * Blends a region of pixels from one image into another (or in itself again) with full alpha channel support. There
+ * is a choice of the following modes to blend the source pixels (A) with the ones of pixels in the destination image (B):
+ * BLEND - linear interpolation of colours: C = A*factor + B
+ * ADD - additive blending with white clip: C = min(A*factor + B, 255)
+ * SUBTRACT - subtractive blending with black clip: C = max(B - A*factor, 0)
+ * DARKEST - only the darkest colour succeeds: C = min(A*factor, B)
+ * LIGHTEST - only the lightest colour succeeds: C = max(A*factor, B)
+ * DIFFERENCE - subtract colors from underlying image.
+ * EXCLUSION - similar to DIFFERENCE, but less extreme.
+ * MULTIPLY - Multiply the colors, result will always be darker.
+ * SCREEN - Opposite multiply, uses inverse values of the colors.
+ * OVERLAY - A mix of MULTIPLY and SCREEN. Multiplies dark values, and screens light values.
+ * HARD_LIGHT - SCREEN when greater than 50% gray, MULTIPLY when lower.
+ * SOFT_LIGHT - Mix of DARKEST and LIGHTEST. Works like OVERLAY, but not as harsh.
+ * DODGE - Lightens light tones and increases contrast, ignores darks. Called "Color Dodge" in Illustrator and Photoshop.
+ * BURN - Darker areas are applied, increasing contrast, ignores lights. Called "Color Burn" in Illustrator and Photoshop.
+ * All modes use the alpha information (highest byte) of source image pixels as the blending factor. If the source and
+ * destination regions are different sizes, the image will be automatically resized to match the destination size. If the
+ * srcImg parameter is not used, the display window is used as the source image. This function ignores imageMode().
+ *
+ * @param {int} x X coordinate of the source's upper left corner
+ * @param {int} y Y coordinate of the source's upper left corner
+ * @param {int} width source image width
+ * @param {int} height source image height
+ * @param {int} dx X coordinate of the destination's upper left corner
+ * @param {int} dy Y coordinate of the destination's upper left corner
+ * @param {int} dwidth destination image width
+ * @param {int} dheight destination image height
+ * @param {PImage} srcImg image variable referring to the source image
+ * @param {PImage} MODE Either BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, DIFFERENCE, EXCLUSION, MULTIPLY, SCREEN,
+ * OVERLAY, HARD_LIGHT, SOFT_LIGHT, DODGE, BURN
+ * @see filter
+ */
+ p.blend = function(src, sx, sy, sw, sh, dx, dy, dw, dh, mode, pimgdest) {
+ if (src.isRemote) {
+ throw "Image is loaded remotely. Cannot blend image.";
+ }
+
+ if (mode === undef) {
+ // shift everything, and introduce p
+ mode = dh;
+ dh = dw;
+ dw = dy;
+ dy = dx;
+ dx = sh;
+ sh = sw;
+ sw = sy;
+ sy = sx;
+ sx = src;
+ src = p;
+ }
+
+ var sx2 = sx + sw,
+ sy2 = sy + sh,
+ dx2 = dx + dw,
+ dy2 = dy + dh,
+ dest = pimgdest || p;
+
+ // check if pimgdest is there and pixels, if so this was a call from pimg.blend
+ if (pimgdest === undef || mode === undef) {
+ p.loadPixels();
+ }
+
+ src.loadPixels();
+
+ if (src === p && p.intersect(sx, sy, sx2, sy2, dx, dy, dx2, dy2)) {
+ p.blit_resize(p.get(sx, sy, sx2 - sx, sy2 - sy), 0, 0, sx2 - sx - 1, sy2 - sy - 1,
+ dest.imageData.data, dest.width, dest.height, dx, dy, dx2, dy2, mode);
+ } else {
+ p.blit_resize(src, sx, sy, sx2, sy2, dest.imageData.data, dest.width, dest.height, dx, dy, dx2, dy2, mode);
+ }
+
+ if (pimgdest === undef) {
+ p.updatePixels();
+ }
+ };
+
+ // helper function for filter()
+ var buildBlurKernel = function(r) {
+ var radius = p.floor(r * 3.5), i;
+ radius = (radius < 1) ? 1 : ((radius < 248) ? radius : 248);
+ if (p.shared.blurRadius !== radius) {
+ p.shared.blurRadius = radius;
+ p.shared.blurKernelSize = 1 + (p.shared.blurRadius<<1);
+ p.shared.blurKernel = new Float32Array(p.shared.blurKernelSize);
+ var sharedBlurKernal = p.shared.blurKernel;
+ var sharedBlurKernelSize = p.shared.blurKernelSize;
+ var sharedBlurRadius = p.shared.blurRadius;
+ // init blurKernel
+ for (i = 0; i < sharedBlurKernelSize; i++) {
+ sharedBlurKernal[i] = 0;
+ }
+ var radiusiSquared = (radius - 1) * (radius - 1);
+ for (i = 1; i < radius; i++) {
+ sharedBlurKernal[radius + i] = sharedBlurKernal[radius-i] = radiusiSquared;
+ }
+ sharedBlurKernal[radius] = radius * radius;
+ }
+ };
+
+ var blurARGB = function(r, aImg) {
+ var sum, cr, cg, cb, ca, c, m;
+ var read, ri, ym, ymi, bk0;
+ var wh = aImg.pixels.getLength();
+ var r2 = new Float32Array(wh);
+ var g2 = new Float32Array(wh);
+ var b2 = new Float32Array(wh);
+ var a2 = new Float32Array(wh);
+ var yi = 0;
+ var x, y, i, offset;
+
+ buildBlurKernel(r);
+
+ var aImgHeight = aImg.height;
+ var aImgWidth = aImg.width;
+ var sharedBlurKernelSize = p.shared.blurKernelSize;
+ var sharedBlurRadius = p.shared.blurRadius;
+ var sharedBlurKernal = p.shared.blurKernel;
+ var pix = aImg.imageData.data;
+
+ for (y = 0; y < aImgHeight; y++) {
+ for (x = 0; x < aImgWidth; x++) {
+ cb = cg = cr = ca = sum = 0;
+ read = x - sharedBlurRadius;
+ if (read<0) {
+ bk0 = -read;
+ read = 0;
+ } else {
+ if (read >= aImgWidth) {
+ break;
+ }
+ bk0=0;
+ }
+ for (i = bk0; i < sharedBlurKernelSize; i++) {
+ if (read >= aImgWidth) {
+ break;
+ }
+ offset = (read + yi) *4;
+ m = sharedBlurKernal[i];
+ ca += m * pix[offset + 3];
+ cr += m * pix[offset];
+ cg += m * pix[offset + 1];
+ cb += m * pix[offset + 2];
+ sum += m;
+ read++;
+ }
+ ri = yi + x;
+ a2[ri] = ca / sum;
+ r2[ri] = cr / sum;
+ g2[ri] = cg / sum;
+ b2[ri] = cb / sum;
+ }
+ yi += aImgWidth;
+ }
+
+ yi = 0;
+ ym = -sharedBlurRadius;
+ ymi = ym*aImgWidth;
+
+ for (y = 0; y < aImgHeight; y++) {
+ for (x = 0; x < aImgWidth; x++) {
+ cb = cg = cr = ca = sum = 0;
+ if (ym<0) {
+ bk0 = ri = -ym;
+ read = x;
+ } else {
+ if (ym >= aImgHeight) {
+ break;
+ }
+ bk0 = 0;
+ ri = ym;
+ read = x + ymi;
+ }
+ for (i = bk0; i < sharedBlurKernelSize; i++) {
+ if (ri >= aImgHeight) {
+ break;
+ }
+ m = sharedBlurKernal[i];
+ ca += m * a2[read];
+ cr += m * r2[read];
+ cg += m * g2[read];
+ cb += m * b2[read];
+ sum += m;
+ ri++;
+ read += aImgWidth;
+ }
+ offset = (x + yi) *4;
+ pix[offset] = cr / sum;
+ pix[offset + 1] = cg / sum;
+ pix[offset + 2] = cb / sum;
+ pix[offset + 3] = ca / sum;
+ }
+ yi += aImgWidth;
+ ymi += aImgWidth;
+ ym++;
+ }
+ };
+
+ // helper funtion for ERODE and DILATE modes of filter()
+ var dilate = function(isInverted, aImg) {
+ var currIdx = 0;
+ var maxIdx = aImg.pixels.getLength();
+ var out = new Int32Array(maxIdx);
+ var currRowIdx, maxRowIdx, colOrig, colOut, currLum;
+ var idxRight, idxLeft, idxUp, idxDown,
+ colRight, colLeft, colUp, colDown,
+ lumRight, lumLeft, lumUp, lumDown;
+
+ if (!isInverted) {
+ // erosion (grow light areas)
+ while (currIdx<maxIdx) {
+ currRowIdx = currIdx;
+ maxRowIdx = currIdx + aImg.width;
+ while (currIdx < maxRowIdx) {
+ colOrig = colOut = aImg.pixels.getPixel(currIdx);
+ idxLeft = currIdx - 1;
+ idxRight = currIdx + 1;
+ idxUp = currIdx - aImg.width;
+ idxDown = currIdx + aImg.width;
+ if (idxLeft < currRowIdx) {
+ idxLeft = currIdx;
+ }
+ if (idxRight >= maxRowIdx) {
+ idxRight = currIdx;
+ }
+ if (idxUp < 0) {
+ idxUp = 0;
+ }
+ if (idxDown >= maxIdx) {
+ idxDown = currIdx;
+ }
+ colUp = aImg.pixels.getPixel(idxUp);
+ colLeft = aImg.pixels.getPixel(idxLeft);
+ colDown = aImg.pixels.getPixel(idxDown);
+ colRight = aImg.pixels.getPixel(idxRight);
+
+ // compute luminance
+ currLum = 77*(colOrig>>16&0xff) + 151*(colOrig>>8&0xff) + 28*(colOrig&0xff);
+ lumLeft = 77*(colLeft>>16&0xff) + 151*(colLeft>>8&0xff) + 28*(colLeft&0xff);
+ lumRight = 77*(colRight>>16&0xff) + 151*(colRight>>8&0xff) + 28*(colRight&0xff);
+ lumUp = 77*(colUp>>16&0xff) + 151*(colUp>>8&0xff) + 28*(colUp&0xff);
+ lumDown = 77*(colDown>>16&0xff) + 151*(colDown>>8&0xff) + 28*(colDown&0xff);
+
+ if (lumLeft > currLum) {
+ colOut = colLeft;
+ currLum = lumLeft;
+ }
+ if (lumRight > currLum) {
+ colOut = colRight;
+ currLum = lumRight;
+ }
+ if (lumUp > currLum) {
+ colOut = colUp;
+ currLum = lumUp;
+ }
+ if (lumDown > currLum) {
+ colOut = colDown;
+ currLum = lumDown;
+ }
+ out[currIdx++] = colOut;
+ }
+ }
+ } else {
+ // dilate (grow dark areas)
+ while (currIdx < maxIdx) {
+ currRowIdx = currIdx;
+ maxRowIdx = currIdx + aImg.width;
+ while (currIdx < maxRowIdx) {
+ colOrig = colOut = aImg.pixels.getPixel(currIdx);
+ idxLeft = currIdx - 1;
+ idxRight = currIdx + 1;
+ idxUp = currIdx - aImg.width;
+ idxDown = currIdx + aImg.width;
+ if (idxLeft < currRowIdx) {
+ idxLeft = currIdx;
+ }
+ if (idxRight >= maxRowIdx) {
+ idxRight = currIdx;
+ }
+ if (idxUp < 0) {
+ idxUp = 0;
+ }
+ if (idxDown >= maxIdx) {
+ idxDown = currIdx;
+ }
+ colUp = aImg.pixels.getPixel(idxUp);
+ colLeft = aImg.pixels.getPixel(idxLeft);
+ colDown = aImg.pixels.getPixel(idxDown);
+ colRight = aImg.pixels.getPixel(idxRight);
+
+ // compute luminance
+ currLum = 77*(colOrig>>16&0xff) + 151*(colOrig>>8&0xff) + 28*(colOrig&0xff);
+ lumLeft = 77*(colLeft>>16&0xff) + 151*(colLeft>>8&0xff) + 28*(colLeft&0xff);
+ lumRight = 77*(colRight>>16&0xff) + 151*(colRight>>8&0xff) + 28*(colRight&0xff);
+ lumUp = 77*(colUp>>16&0xff) + 151*(colUp>>8&0xff) + 28*(colUp&0xff);
+ lumDown = 77*(colDown>>16&0xff) + 151*(colDown>>8&0xff) + 28*(colDown&0xff);
+
+ if (lumLeft < currLum) {
+ colOut = colLeft;
+ currLum = lumLeft;
+ }
+ if (lumRight < currLum) {
+ colOut = colRight;
+ currLum = lumRight;
+ }
+ if (lumUp < currLum) {
+ colOut = colUp;
+ currLum = lumUp;
+ }
+ if (lumDown < currLum) {
+ colOut = colDown;
+ currLum = lumDown;
+ }
+ out[currIdx++]=colOut;
+ }
+ }
+ }
+ aImg.pixels.set(out);
+ //p.arraycopy(out,0,pixels,0,maxIdx);
+ };
+
+ /**
+ * Filters the display window as defined by one of the following modes:
+ * THRESHOLD - converts the image to black and white pixels depending if they are above or below the threshold
+ * defined by the level parameter. The level must be between 0.0 (black) and 1.0(white). If no level is specified, 0.5 is used.
+ * GRAY - converts any colors in the image to grayscale equivalents
+ * INVERT - sets each pixel to its inverse value
+ * POSTERIZE - limits each channel of the image to the number of colors specified as the level parameter
+ * BLUR - executes a Guassian blur with the level parameter specifying the extent of the blurring. If no level parameter is
+ * used, the blur is equivalent to Guassian blur of radius 1.
+ * OPAQUE - sets the alpha channel to entirely opaque.
+ * ERODE - reduces the light areas with the amount defined by the level parameter.
+ * DILATE - increases the light areas with the amount defined by the level parameter.
+ *
+ * @param {MODE} MODE Either THRESHOLD, GRAY, INVERT, POSTERIZE, BLUR, OPAQUE, ERODE, or DILATE
+ * @param {int|float} level defines the quality of the filter
+ *
+ * @see blend
+ */
+ p.filter = function(kind, param, aImg){
+ var img, col, lum, i;
+
+ if (arguments.length === 3) {
+ aImg.loadPixels();
+ img = aImg;
+ } else {
+ p.loadPixels();
+ img = p;
+ }
+
+ if (param === undef) {
+ param = null;
+ }
+ if (img.isRemote) { // Remote images cannot access imageData
+ throw "Image is loaded remotely. Cannot filter image.";
+ }
+ // begin filter process
+ var imglen = img.pixels.getLength();
+ switch (kind) {
+ case PConstants.BLUR:
+ var radius = param || 1; // if no param specified, use 1 (default for p5)
+ blurARGB(radius, img);
+ break;
+
+ case PConstants.GRAY:
+ if (img.format === PConstants.ALPHA) { //trouble
+ // for an alpha image, convert it to an opaque grayscale
+ for (i = 0; i < imglen; i++) {
+ col = 255 - img.pixels.getPixel(i);
+ img.pixels.setPixel(i,(0xff000000 | (col << 16) | (col << 8) | col));
+ }
+ img.format = PConstants.RGB; //trouble
+ } else {
+ for (i = 0; i < imglen; i++) {
+ col = img.pixels.getPixel(i);
+ lum = (77*(col>>16&0xff) + 151*(col>>8&0xff) + 28*(col&0xff))>>8;
+ img.pixels.setPixel(i,((col & PConstants.ALPHA_MASK) | lum<<16 | lum<<8 | lum));
+ }
+ }
+ break;
+
+ case PConstants.INVERT:
+ for (i = 0; i < imglen; i++) {
+ img.pixels.setPixel(i, (img.pixels.getPixel(i) ^ 0xffffff));
+ }
+ break;
+
+ case PConstants.POSTERIZE:
+ if (param === null) {
+ throw "Use filter(POSTERIZE, int levels) instead of filter(POSTERIZE)";
+ }
+ var levels = p.floor(param);
+ if ((levels < 2) || (levels > 255)) {
+ throw "Levels must be between 2 and 255 for filter(POSTERIZE, levels)";
+ }
+ var levels1 = levels - 1;
+ for (i = 0; i < imglen; i++) {
+ var rlevel = (img.pixels.getPixel(i) >> 16) & 0xff;
+ var glevel = (img.pixels.getPixel(i) >> 8) & 0xff;
+ var blevel = img.pixels.getPixel(i) & 0xff;
+ rlevel = (((rlevel * levels) >> 8) * 255) / levels1;
+ glevel = (((glevel * levels) >> 8) * 255) / levels1;
+ blevel = (((blevel * levels) >> 8) * 255) / levels1;
+ img.pixels.setPixel(i, ((0xff000000 & img.pixels.getPixel(i)) | (rlevel << 16) | (glevel << 8) | blevel));
+ }
+ break;
+
+ case PConstants.OPAQUE:
+ for (i = 0; i < imglen; i++) {
+ img.pixels.setPixel(i, (img.pixels.getPixel(i) | 0xff000000));
+ }
+ img.format = PConstants.RGB; //trouble
+ break;
+
+ case PConstants.THRESHOLD:
+ if (param === null) {
+ param = 0.5;
+ }
+ if ((param < 0) || (param > 1)) {
+ throw "Level must be between 0 and 1 for filter(THRESHOLD, level)";
+ }
+ var thresh = p.floor(param * 255);
+ for (i = 0; i < imglen; i++) {
+ var max = p.max((img.pixels.getPixel(i) & PConstants.RED_MASK) >> 16, p.max((img.pixels.getPixel(i) & PConstants.GREEN_MASK) >> 8, (img.pixels.getPixel(i) & PConstants.BLUE_MASK)));
+ img.pixels.setPixel(i, ((img.pixels.getPixel(i) & PConstants.ALPHA_MASK) | ((max < thresh) ? 0x000000 : 0xffffff)));
+ }
+ break;
+
+ case PConstants.ERODE:
+ dilate(true, img);
+ break;
+
+ case PConstants.DILATE:
+ dilate(false, img);
+ break;
+ }
+ img.updatePixels();
+ };
+
+
+ // shared variables for blit_resize(), filter_new_scanline(), filter_bilinear(), filter()
+ // change this in the future to not be exposed to p
+ p.shared = {
+ fracU: 0,
+ ifU: 0,
+ fracV: 0,
+ ifV: 0,
+ u1: 0,
+ u2: 0,
+ v1: 0,
+ v2: 0,
+ sX: 0,
+ sY: 0,
+ iw: 0,
+ iw1: 0,
+ ih1: 0,
+ ul: 0,
+ ll: 0,
+ ur: 0,
+ lr: 0,
+ cUL: 0,
+ cLL: 0,
+ cUR: 0,
+ cLR: 0,
+ srcXOffset: 0,
+ srcYOffset: 0,
+ r: 0,
+ g: 0,
+ b: 0,
+ a: 0,
+ srcBuffer: null,
+ blurRadius: 0,
+ blurKernelSize: 0,
+ blurKernel: null
+ };
+
+ p.intersect = function(sx1, sy1, sx2, sy2, dx1, dy1, dx2, dy2) {
+ var sw = sx2 - sx1 + 1;
+ var sh = sy2 - sy1 + 1;
+ var dw = dx2 - dx1 + 1;
+ var dh = dy2 - dy1 + 1;
+ if (dx1 < sx1) {
+ dw += dx1 - sx1;
+ if (dw > sw) {
+ dw = sw;
+ }
+ } else {
+ var w = sw + sx1 - dx1;
+ if (dw > w) {
+ dw = w;
+ }
+ }
+ if (dy1 < sy1) {
+ dh += dy1 - sy1;
+ if (dh > sh) {
+ dh = sh;
+ }
+ } else {
+ var h = sh + sy1 - dy1;
+ if (dh > h) {
+ dh = h;
+ }
+ }
+ return ! (dw <= 0 || dh <= 0);
+ };
+
+ var blendFuncs = {};
+ blendFuncs[PConstants.BLEND] = p.modes.blend;
+ blendFuncs[PConstants.ADD] = p.modes.add;
+ blendFuncs[PConstants.SUBTRACT] = p.modes.subtract;
+ blendFuncs[PConstants.LIGHTEST] = p.modes.lightest;
+ blendFuncs[PConstants.DARKEST] = p.modes.darkest;
+ blendFuncs[PConstants.REPLACE] = p.modes.replace;
+ blendFuncs[PConstants.DIFFERENCE] = p.modes.difference;
+ blendFuncs[PConstants.EXCLUSION] = p.modes.exclusion;
+ blendFuncs[PConstants.MULTIPLY] = p.modes.multiply;
+ blendFuncs[PConstants.SCREEN] = p.modes.screen;
+ blendFuncs[PConstants.OVERLAY] = p.modes.overlay;
+ blendFuncs[PConstants.HARD_LIGHT] = p.modes.hard_light;
+ blendFuncs[PConstants.SOFT_LIGHT] = p.modes.soft_light;
+ blendFuncs[PConstants.DODGE] = p.modes.dodge;
+ blendFuncs[PConstants.BURN] = p.modes.burn;
+
+ p.blit_resize = function(img, srcX1, srcY1, srcX2, srcY2, destPixels,
+ screenW, screenH, destX1, destY1, destX2, destY2, mode) {
+ var x, y;
+ if (srcX1 < 0) {
+ srcX1 = 0;
+ }
+ if (srcY1 < 0) {
+ srcY1 = 0;
+ }
+ if (srcX2 >= img.width) {
+ srcX2 = img.width - 1;
+ }
+ if (srcY2 >= img.height) {
+ srcY2 = img.height - 1;
+ }
+ var srcW = srcX2 - srcX1;
+ var srcH = srcY2 - srcY1;
+ var destW = destX2 - destX1;
+ var destH = destY2 - destY1;
+
+ if (destW <= 0 || destH <= 0 || srcW <= 0 || srcH <= 0 || destX1 >= screenW ||
+ destY1 >= screenH || srcX1 >= img.width || srcY1 >= img.height) {
+ return;
+ }
+
+ var dx = Math.floor(srcW / destW * PConstants.PRECISIONF);
+ var dy = Math.floor(srcH / destH * PConstants.PRECISIONF);
+
+ var pshared = p.shared;
+
+ pshared.srcXOffset = Math.floor(destX1 < 0 ? -destX1 * dx : srcX1 * PConstants.PRECISIONF);
+ pshared.srcYOffset = Math.floor(destY1 < 0 ? -destY1 * dy : srcY1 * PConstants.PRECISIONF);
+ if (destX1 < 0) {
+ destW += destX1;
+ destX1 = 0;
+ }
+ if (destY1 < 0) {
+ destH += destY1;
+ destY1 = 0;
+ }
+ destW = Math.min(destW, screenW - destX1);
+ destH = Math.min(destH, screenH - destY1);
+
+ var destOffset = destY1 * screenW + destX1;
+ var destColor;
+
+ pshared.srcBuffer = img.imageData.data;
+ pshared.iw = img.width;
+ pshared.iw1 = img.width - 1;
+ pshared.ih1 = img.height - 1;
+
+ // cache for speed
+ var filterBilinear = p.filter_bilinear,
+ filterNewScanline = p.filter_new_scanline,
+ blendFunc = blendFuncs[mode],
+ blendedColor,
+ idx,
+ cULoffset,
+ cURoffset,
+ cLLoffset,
+ cLRoffset,
+ ALPHA_MASK = PConstants.ALPHA_MASK,
+ RED_MASK = PConstants.RED_MASK,
+ GREEN_MASK = PConstants.GREEN_MASK,
+ BLUE_MASK = PConstants.BLUE_MASK,
+ PREC_MAXVAL = PConstants.PREC_MAXVAL,
+ PRECISIONB = PConstants.PRECISIONB,
+ PREC_RED_SHIFT = PConstants.PREC_RED_SHIFT,
+ PREC_ALPHA_SHIFT = PConstants.PREC_ALPHA_SHIFT,
+ srcBuffer = pshared.srcBuffer,
+ min = Math.min;
+
+ for (y = 0; y < destH; y++) {
+
+ pshared.sX = pshared.srcXOffset;
+ pshared.fracV = pshared.srcYOffset & PREC_MAXVAL;
+ pshared.ifV = PREC_MAXVAL - pshared.fracV;
+ pshared.v1 = (pshared.srcYOffset >> PRECISIONB) * pshared.iw;
+ pshared.v2 = min((pshared.srcYOffset >> PRECISIONB) + 1, pshared.ih1) * pshared.iw;
+
+ for (x = 0; x < destW; x++) {
+ idx = (destOffset + x) * 4;
+
+ destColor = (destPixels[idx + 3] << 24) &
+ ALPHA_MASK | (destPixels[idx] << 16) &
+ RED_MASK | (destPixels[idx + 1] << 8) &
+ GREEN_MASK | destPixels[idx + 2] & BLUE_MASK;
+
+ pshared.fracU = pshared.sX & PREC_MAXVAL;
+ pshared.ifU = PREC_MAXVAL - pshared.fracU;
+ pshared.ul = (pshared.ifU * pshared.ifV) >> PRECISIONB;
+ pshared.ll = (pshared.ifU * pshared.fracV) >> PRECISIONB;
+ pshared.ur = (pshared.fracU * pshared.ifV) >> PRECISIONB;
+ pshared.lr = (pshared.fracU * pshared.fracV) >> PRECISIONB;
+ pshared.u1 = (pshared.sX >> PRECISIONB);
+ pshared.u2 = min(pshared.u1 + 1, pshared.iw1);
+
+ cULoffset = (pshared.v1 + pshared.u1) * 4;
+ cURoffset = (pshared.v1 + pshared.u2) * 4;
+ cLLoffset = (pshared.v2 + pshared.u1) * 4;
+ cLRoffset = (pshared.v2 + pshared.u2) * 4;
+
+ pshared.cUL = (srcBuffer[cULoffset + 3] << 24) &
+ ALPHA_MASK | (srcBuffer[cULoffset] << 16) &
+ RED_MASK | (srcBuffer[cULoffset + 1] << 8) &
+ GREEN_MASK | srcBuffer[cULoffset + 2] & BLUE_MASK;
+
+ pshared.cUR = (srcBuffer[cURoffset + 3] << 24) &
+ ALPHA_MASK | (srcBuffer[cURoffset] << 16) &
+ RED_MASK | (srcBuffer[cURoffset + 1] << 8) &
+ GREEN_MASK | srcBuffer[cURoffset + 2] & BLUE_MASK;
+
+ pshared.cLL = (srcBuffer[cLLoffset + 3] << 24) &
+ ALPHA_MASK | (srcBuffer[cLLoffset] << 16) &
+ RED_MASK | (srcBuffer[cLLoffset + 1] << 8) &
+ GREEN_MASK | srcBuffer[cLLoffset + 2] & BLUE_MASK;
+
+ pshared.cLR = (srcBuffer[cLRoffset + 3] << 24) &
+ ALPHA_MASK | (srcBuffer[cLRoffset] << 16) &
+ RED_MASK | (srcBuffer[cLRoffset + 1] << 8) &
+ GREEN_MASK | srcBuffer[cLRoffset + 2] & BLUE_MASK;
+
+ pshared.r = ((pshared.ul * ((pshared.cUL & RED_MASK) >> 16) +
+ pshared.ll * ((pshared.cLL & RED_MASK) >> 16) +
+ pshared.ur * ((pshared.cUR & RED_MASK) >> 16) +
+ pshared.lr * ((pshared.cLR & RED_MASK) >> 16)) << PREC_RED_SHIFT) & RED_MASK;
+ pshared.g = ((pshared.ul * (pshared.cUL & GREEN_MASK) +
+ pshared.ll * (pshared.cLL & GREEN_MASK) +
+ pshared.ur * (pshared.cUR & GREEN_MASK) +
+ pshared.lr * (pshared.cLR & GREEN_MASK)) >>> PRECISIONB) & GREEN_MASK;
+ pshared.b = (pshared.ul * (pshared.cUL & BLUE_MASK) +
+ pshared.ll * (pshared.cLL & BLUE_MASK) +
+ pshared.ur * (pshared.cUR & BLUE_MASK) +
+ pshared.lr * (pshared.cLR & BLUE_MASK)) >>> PRECISIONB;
+ pshared.a = ((pshared.ul * ((pshared.cUL & ALPHA_MASK) >>> 24) +
+ pshared.ll * ((pshared.cLL & ALPHA_MASK) >>> 24) +
+ pshared.ur * ((pshared.cUR & ALPHA_MASK) >>> 24) +
+ pshared.lr * ((pshared.cLR & ALPHA_MASK) >>> 24)) << PREC_ALPHA_SHIFT) & ALPHA_MASK;
+
+ blendedColor = blendFunc(destColor, (pshared.a | pshared.r | pshared.g | pshared.b));
+
+ destPixels[idx] = (blendedColor & RED_MASK) >>> 16;
+ destPixels[idx + 1] = (blendedColor & GREEN_MASK) >>> 8;
+ destPixels[idx + 2] = (blendedColor & BLUE_MASK);
+ destPixels[idx + 3] = (blendedColor & ALPHA_MASK) >>> 24;
+
+ pshared.sX += dx;
+ }
+ destOffset += screenW;
+ pshared.srcYOffset += dy;
+ }
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Font handling
+ ////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * loadFont() Loads a font into a variable of type PFont.
+ *
+ * @param {String} name filename of the font to load
+ * @param {int|float} size option font size (used internally)
+ *
+ * @returns {PFont} new PFont object
+ *
+ * @see #PFont
+ * @see #textFont
+ * @see #text
+ * @see #createFont
+ */
+ p.loadFont = function(name, size) {
+ if (name === undef) {
+ throw("font name required in loadFont.");
+ }
+ if (name.indexOf(".svg") === -1) {
+ if (size === undef) {
+ size = curTextFont.size;
+ }
+ return PFont.get(name, size);
+ }
+ // If the font is a glyph, calculate by SVG table
+ var font = p.loadGlyphs(name);
+
+ return {
+ name: name,
+ css: '12px sans-serif',
+ glyph: true,
+ units_per_em: font.units_per_em,
+ horiz_adv_x: 1 / font.units_per_em * font.horiz_adv_x,
+ ascent: font.ascent,
+ descent: font.descent,
+ width: function(str) {
+ var width = 0;
+ var len = str.length;
+ for (var i = 0; i < len; i++) {
+ try {
+ width += parseFloat(p.glyphLook(p.glyphTable[name], str[i]).horiz_adv_x);
+ }
+ catch(e) {
+ Processing.debug(e);
+ }
+ }
+ return width / p.glyphTable[name].units_per_em;
+ }
+ };
+ };
+
+ /**
+ * createFont() Loads a font into a variable of type PFont.
+ * Smooth and charset are ignored in Processing.js.
+ *
+ * @param {String} name filename of the font to load
+ * @param {int|float} size font size in pixels
+ * @param {boolean} smooth not used in Processing.js
+ * @param {char[]} charset not used in Processing.js
+ *
+ * @returns {PFont} new PFont object
+ *
+ * @see #PFont
+ * @see #textFont
+ * @see #text
+ * @see #loadFont
+ */
+ p.createFont = function(name, size) {
+ // because Processing.js only deals with real fonts,
+ // createFont is simply a wrapper for loadFont/2
+ return p.loadFont(name, size);
+ };
+
+ /**
+ * textFont() Sets the current font.
+ *
+ * @param {PFont} pfont the PFont to load as current text font
+ * @param {int|float} size optional font size in pixels
+ *
+ * @see #createFont
+ * @see #loadFont
+ * @see #PFont
+ * @see #text
+ */
+ p.textFont = function(pfont, size) {
+ if (size !== undef) {
+ // If we're using an SVG glyph font, don't load from cache
+ if (!pfont.glyph) {
+ pfont = PFont.get(pfont.name, size);
+ }
+ curTextSize = size;
+ }
+ curTextFont = pfont;
+ curFontName = curTextFont.name;
+ curTextAscent = curTextFont.ascent;
+ curTextDescent = curTextFont.descent;
+ curTextLeading = curTextFont.leading;
+ var curContext = drawing.$ensureContext();
+ curContext.font = curTextFont.css;
+ };
+
+ /**
+ * textSize() Sets the current font size in pixels.
+ *
+ * @param {int|float} size font size in pixels
+ *
+ * @see #textFont
+ * @see #loadFont
+ * @see #PFont
+ * @see #text
+ */
+ p.textSize = function(size) {
+ curTextFont = PFont.get(curFontName, size);
+ curTextSize = size;
+ // recache metrics
+ curTextAscent = curTextFont.ascent;
+ curTextDescent = curTextFont.descent;
+ curTextLeading = curTextFont.leading;
+ var curContext = drawing.$ensureContext();
+ curContext.font = curTextFont.css;
+ };
+
+ /**
+ * textAscent() returns the maximum height a character extends above the baseline of the
+ * current font at its current size, in pixels.
+ *
+ * @returns {float} height of the current font above the baseline, at its current size, in pixels
+ *
+ * @see #textDescent
+ */
+ p.textAscent = function() {
+ return curTextAscent;
+ };
+
+ /**
+ * textDescent() returns the maximum depth a character will protrude below the baseline of
+ * the current font at its current size, in pixels.
+ *
+ * @returns {float} depth of the current font below the baseline, at its current size, in pixels
+ *
+ * @see #textAscent
+ */
+ p.textDescent = function() {
+ return curTextDescent;
+ };
+
+ /**
+ * textLeading() Sets the current font's leading, which is the distance
+ * from baseline to baseline over consecutive lines, with additional vertical
+ * spacing taking into account. Usually this value is 1.2 or 1.25 times the
+ * textsize, but this value can be changed to effect vertically compressed
+ * or stretched text.
+ *
+ * @param {int|float} the desired baseline-to-baseline size in pixels
+ */
+ p.textLeading = function(leading) {
+ curTextLeading = leading;
+ };
+
+ /**
+ * textAlign() Sets the current alignment for drawing text.
+ *
+ * @param {int} ALIGN Horizontal alignment, either LEFT, CENTER, or RIGHT
+ * @param {int} YALIGN optional vertical alignment, either TOP, BOTTOM, CENTER, or BASELINE
+ *
+ * @see #loadFont
+ * @see #PFont
+ * @see #text
+ */
+ p.textAlign = function(xalign, yalign) {
+ horizontalTextAlignment = xalign;
+ verticalTextAlignment = yalign || PConstants.BASELINE;
+ };
+
+ /**
+ * toP5String converts things with arbitrary data type into
+ * string values, for text rendering.
+ *
+ * @param {any} any object that can be converted into a string
+ *
+ * @return {String} the string representation of the input
+ */
+ function toP5String(obj) {
+ if(obj instanceof String) {
+ return obj;
+ }
+ if(typeof obj === 'number') {
+ // check if an int
+ if(obj === (0 | obj)) {
+ return obj.toString();
+ }
+ return p.nf(obj, 0, 3);
+ }
+ if(obj === null || obj === undef) {
+ return "";
+ }
+ return obj.toString();
+ }
+
+ /**
+ * textWidth() Calculates and returns the width of any character or text string in pixels.
+ *
+ * @param {char|String} str char or String to be measured
+ *
+ * @return {float} width of char or String in pixels
+ *
+ * @see #loadFont
+ * @see #PFont
+ * @see #text
+ * @see #textFont
+ */
+ Drawing2D.prototype.textWidth = function(str) {
+ var lines = toP5String(str).split(/\r?\n/g), width = 0;
+ var i, linesCount = lines.length;
+
+ curContext.font = curTextFont.css;
+ for (i = 0; i < linesCount; ++i) {
+ width = Math.max(width, curTextFont.measureTextWidth(lines[i]));
+ }
+ return width | 0;
+ };
+
+ Drawing3D.prototype.textWidth = function(str) {
+ var lines = toP5String(str).split(/\r?\n/g), width = 0;
+ var i, linesCount = lines.length;
+ if (textcanvas === undef) {
+ textcanvas = document.createElement("canvas");
+ }
+
+ var textContext = textcanvas.getContext("2d");
+ textContext.font = curTextFont.css;
+
+ for (i = 0; i < linesCount; ++i) {
+ width = Math.max(width, textContext.measureText(lines[i]).width);
+ }
+ return width | 0;
+ };
+
+ // A lookup table for characters that can not be referenced by Object
+ p.glyphLook = function(font, chr) {
+ try {
+ switch (chr) {
+ case "1":
+ return font.one;
+ case "2":
+ return font.two;
+ case "3":
+ return font.three;
+ case "4":
+ return font.four;
+ case "5":
+ return font.five;
+ case "6":
+ return font.six;
+ case "7":
+ return font.seven;
+ case "8":
+ return font.eight;
+ case "9":
+ return font.nine;
+ case "0":
+ return font.zero;
+ case " ":
+ return font.space;
+ case "$":
+ return font.dollar;
+ case "!":
+ return font.exclam;
+ case '"':
+ return font.quotedbl;
+ case "#":
+ return font.numbersign;
+ case "%":
+ return font.percent;
+ case "&":
+ return font.ampersand;
+ case "'":
+ return font.quotesingle;
+ case "(":
+ return font.parenleft;
+ case ")":
+ return font.parenright;
+ case "*":
+ return font.asterisk;
+ case "+":
+ return font.plus;
+ case ",":
+ return font.comma;
+ case "-":
+ return font.hyphen;
+ case ".":
+ return font.period;
+ case "/":
+ return font.slash;
+ case "_":
+ return font.underscore;
+ case ":":
+ return font.colon;
+ case ";":
+ return font.semicolon;
+ case "<":
+ return font.less;
+ case "=":
+ return font.equal;
+ case ">":
+ return font.greater;
+ case "?":
+ return font.question;
+ case "@":
+ return font.at;
+ case "[":
+ return font.bracketleft;
+ case "\\":
+ return font.backslash;
+ case "]":
+ return font.bracketright;
+ case "^":
+ return font.asciicircum;
+ case "`":
+ return font.grave;
+ case "{":
+ return font.braceleft;
+ case "|":
+ return font.bar;
+ case "}":
+ return font.braceright;
+ case "~":
+ return font.asciitilde;
+ // If the character is not 'special', access it by object reference
+ default:
+ return font[chr];
+ }
+ } catch(e) {
+ Processing.debug(e);
+ }
+ };
+
+ // Print some text to the Canvas
+ Drawing2D.prototype.text$line = function(str, x, y, z, align) {
+ var textWidth = 0, xOffset = 0;
+ // If the font is a standard Canvas font...
+ if (!curTextFont.glyph) {
+ if (str && ("fillText" in curContext)) {
+ if (isFillDirty) {
+ curContext.fillStyle = p.color.toString(currentFillColor);
+ isFillDirty = false;
+ }
+
+ // horizontal offset/alignment
+ if(align === PConstants.RIGHT || align === PConstants.CENTER) {
+ textWidth = curTextFont.measureTextWidth(str);
+
+ if(align === PConstants.RIGHT) {
+ xOffset = -textWidth;
+ } else { // if(align === PConstants.CENTER)
+ xOffset = -textWidth/2;
+ }
+ }
+
+ curContext.fillText(str, x+xOffset, y);
+ }
+ } else {
+ // If the font is a Batik SVG font...
+ var font = p.glyphTable[curFontName];
+ saveContext();
+ curContext.translate(x, y + curTextSize);
+
+ // horizontal offset/alignment
+ if(align === PConstants.RIGHT || align === PConstants.CENTER) {
+ textWidth = font.width(str);
+
+ if(align === PConstants.RIGHT) {
+ xOffset = -textWidth;
+ } else { // if(align === PConstants.CENTER)
+ xOffset = -textWidth/2;
+ }
+ }
+
+ var upem = font.units_per_em,
+ newScale = 1 / upem * curTextSize;
+
+ curContext.scale(newScale, newScale);
+
+ for (var i=0, len=str.length; i < len; i++) {
+ // Test character against glyph table
+ try {
+ p.glyphLook(font, str[i]).draw();
+ } catch(e) {
+ Processing.debug(e);
+ }
+ }
+ restoreContext();
+ }
+ };
+
+ Drawing3D.prototype.text$line = function(str, x, y, z, align) {
+ // handle case for 3d text
+ if (textcanvas === undef) {
+ textcanvas = document.createElement("canvas");
+ }
+ var oldContext = curContext;
+ curContext = textcanvas.getContext("2d");
+ curContext.font = curTextFont.css;
+ var textWidth = curTextFont.measureTextWidth(str);
+ textcanvas.width = textWidth;
+ textcanvas.height = curTextSize;
+ curContext = textcanvas.getContext("2d"); // refreshes curContext
+ curContext.font = curTextFont.css;
+ curContext.textBaseline="top";
+
+ // paint on 2D canvas
+ Drawing2D.prototype.text$line(str,0,0,0,PConstants.LEFT);
+
+ // use it as a texture
+ var aspect = textcanvas.width/textcanvas.height;
+ curContext = oldContext;
+
+ curContext.bindTexture(curContext.TEXTURE_2D, textTex);
+ curContext.texImage2D(curContext.TEXTURE_2D, 0, curContext.RGBA, curContext.RGBA, curContext.UNSIGNED_BYTE, textcanvas);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MAG_FILTER, curContext.LINEAR);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_MIN_FILTER, curContext.LINEAR);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_WRAP_T, curContext.CLAMP_TO_EDGE);
+ curContext.texParameteri(curContext.TEXTURE_2D, curContext.TEXTURE_WRAP_S, curContext.CLAMP_TO_EDGE);
+ // If we don't have a power of two texture, we can't mipmap it.
+ // curContext.generateMipmap(curContext.TEXTURE_2D);
+
+ // horizontal offset/alignment
+ var xOffset = 0;
+ if (align === PConstants.RIGHT) {
+ xOffset = -textWidth;
+ } else if(align === PConstants.CENTER) {
+ xOffset = -textWidth/2;
+ }
+ var model = new PMatrix3D();
+ var scalefactor = curTextSize * 0.5;
+ model.translate(x+xOffset-scalefactor/2, y-scalefactor, z);
+ model.scale(-aspect*scalefactor, -scalefactor, scalefactor);
+ model.translate(-1, -1, -1);
+ model.transpose();
+
+ var view = new PMatrix3D();
+ view.scale(1, -1, 1);
+ view.apply(modelView.array());
+ view.transpose();
+
+ curContext.useProgram(programObject2D);
+ vertexAttribPointer("aVertex2d", programObject2D, "aVertex", 3, textBuffer);
+ vertexAttribPointer("aTextureCoord2d", programObject2D, "aTextureCoord", 2, textureBuffer);
+ uniformi("uSampler2d", programObject2D, "uSampler", [0]);
+
+ uniformi("uIsDrawingText2d", programObject2D, "uIsDrawingText", true);
+
+ uniformMatrix("uModel2d", programObject2D, "uModel", false, model.array());
+ uniformMatrix("uView2d", programObject2D, "uView", false, view.array());
+ uniformf("uColor2d", programObject2D, "uColor", fillStyle);
+ curContext.bindBuffer(curContext.ELEMENT_ARRAY_BUFFER, indexBuffer);
+ curContext.drawElements(curContext.TRIANGLES, 6, curContext.UNSIGNED_SHORT, 0);
+ };
+
+
+ /**
+ * unbounded text function (z is an optional argument)
+ */
+ function text$4(str, x, y, z) {
+ var lines, linesCount;
+ if(str.indexOf('\n') < 0) {
+ lines = [str];
+ linesCount = 1;
+ } else {
+ lines = str.split(/\r?\n/g);
+ linesCount = lines.length;
+ }
+ // handle text line-by-line
+
+ var yOffset = 0;
+ if(verticalTextAlignment === PConstants.TOP) {
+ yOffset = curTextAscent + curTextDescent;
+ } else if(verticalTextAlignment === PConstants.CENTER) {
+ yOffset = curTextAscent/2 - (linesCount-1)*curTextLeading/2;
+ } else if(verticalTextAlignment === PConstants.BOTTOM) {
+ yOffset = -(curTextDescent + (linesCount-1)*curTextLeading);
+ }
+
+ for(var i=0;i<linesCount;++i) {
+ var line = lines[i];
+ drawing.text$line(line, x, y + yOffset, z, horizontalTextAlignment);
+ yOffset += curTextLeading;
+ }
+ }
+
+
+ /**
+ * box-bounded text function (z is an optional argument)
+ */
+ function text$6(str, x, y, width, height, z) {
+ // 'fail' on 0-valued dimensions
+ if (str.length === 0 || width === 0 || height === 0) {
+ return;
+ }
+ // also 'fail' if the text height is larger than the bounding height
+ if(curTextSize > height) {
+ return;
+ }
+
+ var spaceMark = -1;
+ var start = 0;
+ var lineWidth = 0;
+ var drawCommands = [];
+
+ // run through text, character-by-character
+ for (var charPos=0, len=str.length; charPos < len; charPos++)
+ {
+ var currentChar = str[charPos];
+ var spaceChar = (currentChar === " ");
+ var letterWidth = curTextFont.measureTextWidth(currentChar);
+
+ // if we aren't looking at a newline, and the text still fits, keep processing
+ if (currentChar !== "\n" && (lineWidth + letterWidth <= width)) {
+ if (spaceChar) { spaceMark = charPos; }
+ lineWidth += letterWidth;
+ }
+
+ // if we're looking at a newline, or the text no longer fits, push the section that fit into the drawcommand list
+ else
+ {
+ if (spaceMark + 1 === start) {
+ if(charPos>0) {
+ // Whole line without spaces so far.
+ spaceMark = charPos;
+ } else {
+ // 'fail', because the line can't even fit the first character
+ return;
+ }
+ }
+
+ if (currentChar === "\n") {
+ drawCommands.push({text:str.substring(start, charPos), width: lineWidth});
+ start = charPos + 1;
+ } else {
+ // current is not a newline, which means the line doesn't fit in box. push text.
+ // In Processing 1.5.1, the space is also pushed, so we push up to spaceMark+1,
+ // rather than up to spaceMark, as was the case for Processing 1.5 and earlier.
+ drawCommands.push({text:str.substring(start, spaceMark+1), width: lineWidth});
+ start = spaceMark + 1;
+ }
+
+ // newline + return
+ lineWidth = 0;
+ charPos = start - 1;
+ }
+ }
+
+ // push the remaining text
+ if (start < len) {
+ drawCommands.push({text:str.substring(start), width: lineWidth});
+ }
+
+ // resolve horizontal alignment
+ var xOffset = 1,
+ yOffset = curTextAscent;
+ if (horizontalTextAlignment === PConstants.CENTER) {
+ xOffset = width/2;
+ } else if (horizontalTextAlignment === PConstants.RIGHT) {
+ xOffset = width;
+ }
+
+ // resolve vertical alignment
+ var linesCount = drawCommands.length,
+ visibleLines = Math.min(linesCount, Math.floor(height/curTextLeading));
+ if(verticalTextAlignment === PConstants.TOP) {
+ yOffset = curTextAscent + curTextDescent;
+ } else if(verticalTextAlignment === PConstants.CENTER) {
+ yOffset = (height/2) - curTextLeading * (visibleLines/2 - 1);
+ } else if(verticalTextAlignment === PConstants.BOTTOM) {
+ yOffset = curTextDescent + curTextLeading;
+ }
+
+ var command,
+ drawCommand,
+ leading;
+ for (command = 0; command < linesCount; command++) {
+ leading = command * curTextLeading;
+ // stop if not enough space for one more line draw
+ if (yOffset + leading > height - curTextDescent) {
+ break;
+ }
+ drawCommand = drawCommands[command];
+ drawing.text$line(drawCommand.text, x + xOffset, y + yOffset + leading, z, horizontalTextAlignment);
+ }
+ }
+
+ /**
+ * text() Draws text to the screen.
+ *
+ * @param {String|char|int|float} data the alphanumeric symbols to be displayed
+ * @param {int|float} x x-coordinate of text
+ * @param {int|float} y y-coordinate of text
+ * @param {int|float} z optional z-coordinate of text
+ * @param {String} stringdata optional letters to be displayed
+ * @param {int|float} width optional width of text box
+ * @param {int|float} height optional height of text box
+ *
+ * @see #textAlign
+ * @see #textMode
+ * @see #loadFont
+ * @see #PFont
+ * @see #textFont
+ */
+ p.text = function() {
+ if (textMode === PConstants.SHAPE) {
+ // TODO: requires beginRaw function
+ return;
+ }
+ if (arguments.length === 3) { // for text( str, x, y)
+ text$4(toP5String(arguments[0]), arguments[1], arguments[2], 0);
+ } else if (arguments.length === 4) { // for text( str, x, y, z)
+ text$4(toP5String(arguments[0]), arguments[1], arguments[2], arguments[3]);
+ } else if (arguments.length === 5) { // for text( str, x, y , width, height)
+ text$6(toP5String(arguments[0]), arguments[1], arguments[2], arguments[3], arguments[4], 0);
+ } else if (arguments.length === 6) { // for text( stringdata, x, y , width, height, z)
+ text$6(toP5String(arguments[0]), arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
+ }
+ };
+
+ /**
+ * Sets the way text draws to the screen. In the default configuration (the MODEL mode), it's possible to rotate,
+ * scale, and place letters in two and three dimensional space. <br /><br /> Changing to SCREEN mode draws letters
+ * directly to the front of the window and greatly increases rendering quality and speed when used with the P2D and
+ * P3D renderers. textMode(SCREEN) with OPENGL and JAVA2D (the default) renderers will generally be slower, though
+ * pixel accurate with P2D and P3D. With textMode(SCREEN), the letters draw at the actual size of the font (in pixels)
+ * and therefore calls to <b>textSize()</b> will not affect the size of the letters. To create a font at the size you
+ * desire, use the "Create font..." option in the Tools menu, or use the createFont() function. When using textMode(SCREEN),
+ * any z-coordinate passed to a text() command will be ignored, because your computer screen is...flat!
+ *
+ * @param {int} MODE Either MODEL, SCREEN or SHAPE (not yet supported)
+ *
+ * @see loadFont
+ * @see PFont
+ * @see text
+ * @see textFont
+ * @see createFont
+ */
+ p.textMode = function(mode){
+ textMode = mode;
+ };
+
+ // Load Batik SVG Fonts and parse to pre-def objects for quick rendering
+ p.loadGlyphs = function(url) {
+ var x, y, cx, cy, nx, ny, d, a, lastCom, lenC, horiz_adv_x, getXY = '[0-9\\-]+', path;
+
+ // Return arrays of SVG commands and coords
+ // get this to use p.matchAll() - will need to work around the lack of null return
+ var regex = function(needle, hay) {
+ var i = 0,
+ results = [],
+ latest, regexp = new RegExp(needle, "g");
+ latest = results[i] = regexp.exec(hay);
+ while (latest) {
+ i++;
+ latest = results[i] = regexp.exec(hay);
+ }
+ return results;
+ };
+
+ var buildPath = function(d) {
+ var c = regex("[A-Za-z][0-9\\- ]+|Z", d);
+ var beforePathDraw = function() {
+ saveContext();
+ return drawing.$ensureContext();
+ };
+ var afterPathDraw = function() {
+ executeContextFill();
+ executeContextStroke();
+ restoreContext();
+ };
+
+ // Begin storing path object
+ path = "return {draw:function(){var curContext=beforePathDraw();curContext.beginPath();";
+
+ x = 0;
+ y = 0;
+ cx = 0;
+ cy = 0;
+ nx = 0;
+ ny = 0;
+ d = 0;
+ a = 0;
+ lastCom = "";
+ lenC = c.length - 1;
+
+ // Loop through SVG commands translating to canvas eqivs functions in path object
+ for (var j = 0; j < lenC; j++) {
+ var com = c[j][0], xy = regex(getXY, com);
+
+ switch (com[0]) {
+ case "M":
+ //curContext.moveTo(x,-y);
+ x = parseFloat(xy[0][0]);
+ y = parseFloat(xy[1][0]);
+ path += "curContext.moveTo(" + x + "," + (-y) + ");";
+ break;
+
+ case "L":
+ //curContext.lineTo(x,-y);
+ x = parseFloat(xy[0][0]);
+ y = parseFloat(xy[1][0]);
+ path += "curContext.lineTo(" + x + "," + (-y) + ");";
+ break;
+
+ case "H":
+ //curContext.lineTo(x,-y)
+ x = parseFloat(xy[0][0]);
+ path += "curContext.lineTo(" + x + "," + (-y) + ");";
+ break;
+
+ case "V":
+ //curContext.lineTo(x,-y);
+ y = parseFloat(xy[0][0]);
+ path += "curContext.lineTo(" + x + "," + (-y) + ");";
+ break;
+
+ case "T":
+ //curContext.quadraticCurveTo(cx,-cy,nx,-ny);
+ nx = parseFloat(xy[0][0]);
+ ny = parseFloat(xy[1][0]);
+
+ if (lastCom === "Q" || lastCom === "T") {
+ d = Math.sqrt(Math.pow(x - cx, 2) + Math.pow(cy - y, 2));
+ a = Math.PI + Math.atan2(cx - x, cy - y);
+ cx = x + (Math.sin(a) * (d));
+ cy = y + (Math.cos(a) * (d));
+ } else {
+ cx = x;
+ cy = y;
+ }
+
+ path += "curContext.quadraticCurveTo(" + cx + "," + (-cy) + "," + nx + "," + (-ny) + ");";
+ x = nx;
+ y = ny;
+ break;
+
+ case "Q":
+ //curContext.quadraticCurveTo(cx,-cy,nx,-ny);
+ cx = parseFloat(xy[0][0]);
+ cy = parseFloat(xy[1][0]);
+ nx = parseFloat(xy[2][0]);
+ ny = parseFloat(xy[3][0]);
+ path += "curContext.quadraticCurveTo(" + cx + "," + (-cy) + "," + nx + "," + (-ny) + ");";
+ x = nx;
+ y = ny;
+ break;
+
+ case "Z":
+ //curContext.closePath();
+ path += "curContext.closePath();";
+ break;
+ }
+ lastCom = com[0];
+ }
+
+ path += "afterPathDraw();";
+ path += "curContext.translate(" + horiz_adv_x + ",0);";
+ path += "}}";
+
+ return ((new Function("beforePathDraw", "afterPathDraw", path))(beforePathDraw, afterPathDraw));
+ };
+
+ // Parse SVG font-file into block of Canvas commands
+ var parseSVGFont = function(svg) {
+ // Store font attributes
+ var font = svg.getElementsByTagName("font");
+ p.glyphTable[url].horiz_adv_x = font[0].getAttribute("horiz-adv-x");
+
+ var font_face = svg.getElementsByTagName("font-face")[0];
+ p.glyphTable[url].units_per_em = parseFloat(font_face.getAttribute("units-per-em"));
+ p.glyphTable[url].ascent = parseFloat(font_face.getAttribute("ascent"));
+ p.glyphTable[url].descent = parseFloat(font_face.getAttribute("descent"));
+
+ var glyph = svg.getElementsByTagName("glyph"),
+ len = glyph.length;
+
+ // Loop through each glyph in the SVG
+ for (var i = 0; i < len; i++) {
+ // Store attributes for this glyph
+ var unicode = glyph[i].getAttribute("unicode");
+ var name = glyph[i].getAttribute("glyph-name");
+ horiz_adv_x = glyph[i].getAttribute("horiz-adv-x");
+ if (horiz_adv_x === null) {
+ horiz_adv_x = p.glyphTable[url].horiz_adv_x;
+ }
+ d = glyph[i].getAttribute("d");
+ // Split path commands in glpyh
+ if (d !== undef) {
+ path = buildPath(d);
+ // Store glyph data to table object
+ p.glyphTable[url][name] = {
+ name: name,
+ unicode: unicode,
+ horiz_adv_x: horiz_adv_x,
+ draw: path.draw
+ };
+ }
+ } // finished adding glyphs to table
+ };
+
+ // Load and parse Batik SVG font as XML into a Processing Glyph object
+ var loadXML = function() {
+ var xmlDoc;
+
+ try {
+ xmlDoc = document.implementation.createDocument("", "", null);
+ }
+ catch(e_fx_op) {
+ Processing.debug(e_fx_op.message);
+ return;
+ }
+
+ try {
+ xmlDoc.async = false;
+ xmlDoc.load(url);
+ parseSVGFont(xmlDoc.getElementsByTagName("svg")[0]);
+ }
+ catch(e_sf_ch) {
+ // Google Chrome, Safari etc.
+ Processing.debug(e_sf_ch);
+ try {
+ var xmlhttp = new window.XMLHttpRequest();
+ xmlhttp.open("GET", url, false);
+ xmlhttp.send(null);
+ parseSVGFont(xmlhttp.responseXML.documentElement);
+ }
+ catch(e) {
+ Processing.debug(e_sf_ch);
+ }
+ }
+ };
+
+ // Create a new object in glyphTable to store this font
+ p.glyphTable[url] = {};
+
+ // Begin loading the Batik SVG font...
+ loadXML(url);
+
+ // Return the loaded font for attribute grabbing
+ return p.glyphTable[url];
+ };
+
+ /**
+ * Gets the sketch parameter value. The parameter can be defined as the canvas attribute with
+ * the "data-processing-" prefix or provided in the pjs directive (e.g. param-test="52").
+ * The function tries the canvas attributes, then the pjs directive content.
+ *
+ * @param {String} name The name of the param to read.
+ *
+ * @returns {String} The parameter value, or null if parameter is not defined.
+ */
+ p.param = function(name) {
+ // trying attribute that was specified in CANVAS
+ var attributeName = "data-processing-" + name;
+ if (curElement.hasAttribute(attributeName)) {
+ return curElement.getAttribute(attributeName);
+ }
+ // trying child PARAM elements of the CANVAS
+ for (var i = 0, len = curElement.childNodes.length; i < len; ++i) {
+ var item = curElement.childNodes.item(i);
+ if (item.nodeType !== 1 || item.tagName.toLowerCase() !== "param") {
+ continue;
+ }
+ if (item.getAttribute("name") === name) {
+ return item.getAttribute("value");
+ }
+ }
+ // fallback to default params
+ if (curSketch.params.hasOwnProperty(name)) {
+ return curSketch.params[name];
+ }
+ return null;
+ };
+
+ ////////////////////////////////////////////////////////////////////////////
+ // 2D/3D methods wiring utils
+ ////////////////////////////////////////////////////////////////////////////
+ function wireDimensionalFunctions(mode) {
+ // Drawing2D/Drawing3D
+ if (mode === '3D') {
+ drawing = new Drawing3D();
+ } else if (mode === '2D') {
+ drawing = new Drawing2D();
+ } else {
+ drawing = new DrawingPre();
+ }
+
+ // Wire up functions (Use DrawingPre properties names)
+ for (var i in DrawingPre.prototype) {
+ if (DrawingPre.prototype.hasOwnProperty(i) && i.indexOf("$") < 0) {
+ p[i] = drawing[i];
+ }
+ }
+
+ // Run initialization
+ drawing.$init();
+ }
+
+ function createDrawingPreFunction(name) {
+ return function() {
+ wireDimensionalFunctions("2D");
+ return drawing[name].apply(this, arguments);
+ };
+ }
+ DrawingPre.prototype.translate = createDrawingPreFunction("translate");
+ DrawingPre.prototype.transform = createDrawingPreFunction("transform");
+ DrawingPre.prototype.scale = createDrawingPreFunction("scale");
+ DrawingPre.prototype.pushMatrix = createDrawingPreFunction("pushMatrix");
+ DrawingPre.prototype.popMatrix = createDrawingPreFunction("popMatrix");
+ DrawingPre.prototype.resetMatrix = createDrawingPreFunction("resetMatrix");
+ DrawingPre.prototype.applyMatrix = createDrawingPreFunction("applyMatrix");
+ DrawingPre.prototype.rotate = createDrawingPreFunction("rotate");
+ DrawingPre.prototype.rotateZ = createDrawingPreFunction("rotateZ");
+ DrawingPre.prototype.shearX = createDrawingPreFunction("shearX");
+ DrawingPre.prototype.shearY = createDrawingPreFunction("shearY");
+ DrawingPre.prototype.redraw = createDrawingPreFunction("redraw");
+ DrawingPre.prototype.toImageData = createDrawingPreFunction("toImageData");
+ DrawingPre.prototype.ambientLight = createDrawingPreFunction("ambientLight");
+ DrawingPre.prototype.directionalLight = createDrawingPreFunction("directionalLight");
+ DrawingPre.prototype.lightFalloff = createDrawingPreFunction("lightFalloff");
+ DrawingPre.prototype.lightSpecular = createDrawingPreFunction("lightSpecular");
+ DrawingPre.prototype.pointLight = createDrawingPreFunction("pointLight");
+ DrawingPre.prototype.noLights = createDrawingPreFunction("noLights");
+ DrawingPre.prototype.spotLight = createDrawingPreFunction("spotLight");
+ DrawingPre.prototype.beginCamera = createDrawingPreFunction("beginCamera");
+ DrawingPre.prototype.endCamera = createDrawingPreFunction("endCamera");
+ DrawingPre.prototype.frustum = createDrawingPreFunction("frustum");
+ DrawingPre.prototype.box = createDrawingPreFunction("box");
+ DrawingPre.prototype.sphere = createDrawingPreFunction("sphere");
+ DrawingPre.prototype.ambient = createDrawingPreFunction("ambient");
+ DrawingPre.prototype.emissive = createDrawingPreFunction("emissive");
+ DrawingPre.prototype.shininess = createDrawingPreFunction("shininess");
+ DrawingPre.prototype.specular = createDrawingPreFunction("specular");
+ DrawingPre.prototype.fill = createDrawingPreFunction("fill");
+ DrawingPre.prototype.stroke = createDrawingPreFunction("stroke");
+ DrawingPre.prototype.strokeWeight = createDrawingPreFunction("strokeWeight");
+ DrawingPre.prototype.smooth = createDrawingPreFunction("smooth");
+ DrawingPre.prototype.noSmooth = createDrawingPreFunction("noSmooth");
+ DrawingPre.prototype.point = createDrawingPreFunction("point");
+ DrawingPre.prototype.vertex = createDrawingPreFunction("vertex");
+ DrawingPre.prototype.endShape = createDrawingPreFunction("endShape");
+ DrawingPre.prototype.bezierVertex = createDrawingPreFunction("bezierVertex");
+ DrawingPre.prototype.curveVertex = createDrawingPreFunction("curveVertex");
+ DrawingPre.prototype.curve = createDrawingPreFunction("curve");
+ DrawingPre.prototype.line = createDrawingPreFunction("line");
+ DrawingPre.prototype.bezier = createDrawingPreFunction("bezier");
+ DrawingPre.prototype.rect = createDrawingPreFunction("rect");
+ DrawingPre.prototype.ellipse = createDrawingPreFunction("ellipse");
+ DrawingPre.prototype.background = createDrawingPreFunction("background");
+ DrawingPre.prototype.image = createDrawingPreFunction("image");
+ DrawingPre.prototype.textWidth = createDrawingPreFunction("textWidth");
+ DrawingPre.prototype.text$line = createDrawingPreFunction("text$line");
+ DrawingPre.prototype.$ensureContext = createDrawingPreFunction("$ensureContext");
+ DrawingPre.prototype.$newPMatrix = createDrawingPreFunction("$newPMatrix");
+
+ DrawingPre.prototype.size = function(aWidth, aHeight, aMode) {
+ wireDimensionalFunctions(aMode === PConstants.WEBGL ? "3D" : "2D");
+ p.size(aWidth, aHeight, aMode);
+ };
+
+ DrawingPre.prototype.$init = noop;
+
+ Drawing2D.prototype.$init = function() {
+ // Setup default 2d canvas context.
+ // Moving this here removes the number of times we need to check the 3D variable
+ p.size(p.width, p.height);
+
+ curContext.lineCap = 'round';
+
+ // Set default stroke and fill color
+ p.noSmooth();
+ p.disableContextMenu();
+ };
+ Drawing3D.prototype.$init = function() {
+ // For ref/perf test compatibility until those are fixed
+ p.use3DContext = true;
+ p.disableContextMenu();
+ };
+
+ DrawingShared.prototype.$ensureContext = function() {
+ return curContext;
+ };
+
+ //////////////////////////////////////////////////////////////////////////
+ // Keyboard Events
+ //////////////////////////////////////////////////////////////////////////
+
+ // In order to catch key events in a canvas, it needs to be "specially focusable",
+ // by assigning it a tabindex. If no tabindex is specified on-page, set this to 0.
+ if (!curElement.getAttribute("tabindex")) {
+ curElement.setAttribute("tabindex", 0);
+ }
+
+ function getKeyCode(e) {
+ var code = e.which || e.keyCode;
+ switch (code) {
+ case 13: // ENTER
+ return 10;
+ case 91: // META L (Saf/Mac)
+ case 93: // META R (Saf/Mac)
+ case 224: // META (FF/Mac)
+ return 157;
+ case 57392: // CONTROL (Op/Mac)
+ return 17;
+ case 46: // DELETE
+ return 127;
+ case 45: // INSERT
+ return 155;
+ }
+ return code;
+ }
+
+ function getKeyChar(e) {
+ var c = e.which || e.keyCode;
+ var anyShiftPressed = e.shiftKey || e.ctrlKey || e.altKey || e.metaKey;
+ switch (c) {
+ case 13:
+ c = anyShiftPressed ? 13 : 10; // RETURN vs ENTER (Mac)
+ break;
+ case 8:
+ c = anyShiftPressed ? 127 : 8; // DELETE vs BACKSPACE (Mac)
+ break;
+ }
+ return new Char(c);
+ }
+
+ function suppressKeyEvent(e) {
+ if (typeof e.preventDefault === "function") {
+ e.preventDefault();
+ } else if (typeof e.stopPropagation === "function") {
+ e.stopPropagation();
+ }
+ return false;
+ }
+
+ function updateKeyPressed() {
+ var ch;
+ for (ch in pressedKeysMap) {
+ if (pressedKeysMap.hasOwnProperty(ch)) {
+ p.__keyPressed = true;
+ return;
+ }
+ }
+ p.__keyPressed = false;
+ }
+
+ function resetKeyPressed() {
+ p.__keyPressed = false;
+ pressedKeysMap = [];
+ lastPressedKeyCode = null;
+ }
+
+ function simulateKeyTyped(code, c) {
+ pressedKeysMap[code] = c;
+ lastPressedKeyCode = null;
+ p.key = c;
+ p.keyCode = code;
+ p.keyPressed();
+ p.keyCode = 0;
+ p.keyTyped();
+ updateKeyPressed();
+ }
+
+ function handleKeydown(e) {
+ var code = getKeyCode(e);
+ if (code === PConstants.DELETE) {
+ simulateKeyTyped(code, new Char(127));
+ return;
+ }
+ if (codedKeys.indexOf(code) < 0) {
+ lastPressedKeyCode = code;
+ return;
+ }
+ var c = new Char(PConstants.CODED);
+ p.key = c;
+ p.keyCode = code;
+ pressedKeysMap[code] = c;
+ p.keyPressed();
+ lastPressedKeyCode = null;
+ updateKeyPressed();
+ return suppressKeyEvent(e);
+ }
+
+ function handleKeypress(e) {
+ if (lastPressedKeyCode === null) {
+ return; // processed in handleKeydown
+ }
+ var code = lastPressedKeyCode, c = getKeyChar(e);
+ simulateKeyTyped(code, c);
+ return suppressKeyEvent(e);
+ }
+
+ function handleKeyup(e) {
+ var code = getKeyCode(e), c = pressedKeysMap[code];
+ if (c === undef) {
+ return; // no keyPressed event was generated.
+ }
+ p.key = c;
+ p.keyCode = code;
+ p.keyReleased();
+ delete pressedKeysMap[code];
+ updateKeyPressed();
+ }
+
+ // Send aCode Processing syntax to be converted to JavaScript
+ if (!pgraphicsMode) {
+ if (aCode instanceof Processing.Sketch) {
+ // Use sketch as is
+ curSketch = aCode;
+ } else if (typeof aCode === "function") {
+ // Wrap function with default sketch parameters
+ curSketch = new Processing.Sketch(aCode);
+ } else if (!aCode) {
+ // Empty sketch
+ curSketch = new Processing.Sketch(function (){});
+ } else {
+ //#if PARSER
+ // Compile the code
+ curSketch = Processing.compile(aCode);
+ //#else
+ // throw "PJS compile is not supported";
+ //#endif
+ }
+
+ // Expose internal field for diagnostics and testing
+ p.externals.sketch = curSketch;
+
+ wireDimensionalFunctions();
+
+ // the onfocus and onblur events are handled in two parts.
+ // 1) the p.focused property is handled per sketch
+ curElement.onfocus = function() {
+ p.focused = true;
+ };
+
+ curElement.onblur = function() {
+ p.focused = false;
+ if (!curSketch.options.globalKeyEvents) {
+ resetKeyPressed();
+ }
+ };
+
+ // 2) looping status is handled per page, based on the pauseOnBlur @pjs directive
+ if (curSketch.options.pauseOnBlur) {
+ attachEventHandler(window, 'focus', function() {
+ if (doLoop) {
+ p.loop();
+ }
+ });
+
+ attachEventHandler(window, 'blur', function() {
+ if (doLoop && loopStarted) {
+ p.noLoop();
+ doLoop = true; // make sure to keep this true after the noLoop call
+ }
+ resetKeyPressed();
+ });
+ }
+
+ // if keyboard events should be handled globally, the listeners should
+ // be bound to the document window, rather than to the current canvas
+ var keyTrigger = curSketch.options.globalKeyEvents ? window : curElement;
+ attachEventHandler(keyTrigger, "keydown", handleKeydown);
+ attachEventHandler(keyTrigger, "keypress", handleKeypress);
+ attachEventHandler(keyTrigger, "keyup", handleKeyup);
+
+ // Step through the libraries that were attached at doc load...
+ for (var i in Processing.lib) {
+ if (Processing.lib.hasOwnProperty(i)) {
+ if(Processing.lib[i].hasOwnProperty("attach")) {
+ // use attach function if present
+ Processing.lib[i].attach(p);
+ } else if(Processing.lib[i] instanceof Function) {
+ // Init the libraries in the context of this p_instance (legacy)
+ Processing.lib[i].call(this);
+ }
+ }
+ }
+
+ // sketch execute test interval, used to reschedule
+ // an execute when preloads have not yet finished.
+ var retryInterval = 100;
+
+ var executeSketch = function(processing) {
+ // Don't start until all specified images and fonts in the cache are preloaded
+ if (!(curSketch.imageCache.pending || PFont.preloading.pending(retryInterval))) {
+ // the opera preload cache can only be cleared once we start
+ if (window.opera) {
+ var link,
+ element,
+ operaCache=curSketch.imageCache.operaCache;
+ for (link in operaCache) {
+ if(operaCache.hasOwnProperty(link)) {
+ element = operaCache[link];
+ if (element !== null) {
+ document.body.removeChild(element);
+ }
+ delete(operaCache[link]);
+ }
+ }
+ }
+
+ curSketch.attach(processing, defaultScope);
+
+ // pass a reference to the p instance for this sketch.
+ curSketch.onLoad(processing);
+
+ // Run void setup()
+ if (processing.setup) {
+ processing.setup();
+ // if any transforms were performed in setup reset to identity matrix
+ // so draw loop is unpolluted
+ processing.resetMatrix();
+ curSketch.onSetup();
+ }
+
+ // some pixels can be cached, flushing
+ resetContext();
+
+ if (processing.draw) {
+ if (!doLoop) {
+ processing.redraw();
+ } else {
+ processing.loop();
+ }
+ }
+ } else {
+ window.setTimeout(function() { executeSketch(processing); }, retryInterval);
+ }
+ };
+
+ // Only store an instance of non-createGraphics instances.
+ addInstance(this);
+
+ // The parser adds custom methods to the processing context
+ // this renames p to processing so these methods will run
+ executeSketch(p);
+ } else {
+ // No executable sketch was specified
+ // or called via createGraphics
+ curSketch = new Processing.Sketch();
+
+ wireDimensionalFunctions();
+
+ // Hack to make PGraphics work again after splitting size()
+ p.size = function(w, h, render) {
+ if (render && render === PConstants.WEBGL) {
+ wireDimensionalFunctions('3D');
+ } else {
+ wireDimensionalFunctions('2D');
+ }
+
+ p.size(w, h, render);
+ };
+ }
+ };
+
+ // Place-holder for overridable debugging function
+ Processing.debug = (function() {
+ if ("console" in window) {
+ return function(msg) {
+ window.console.log('Processing.js: ' + msg);
+ };
+ }
+ return noop;
+ }());
+
+ // bind prototype
+ Processing.prototype = defaultScope;
+
+ /**
+ * instance store and lookup
+ */
+ Processing.instances = processingInstances;
+ Processing.getInstanceById = function(name) {
+ return processingInstances[processingInstanceIds[name]];
+ };
+
+ // Unsupported Processing File and I/O operations.
+ (function(Processing) {
+ var unsupportedP5 = ("open() createOutput() createInput() BufferedReader selectFolder() " +
+ "dataPath() createWriter() selectOutput() beginRecord() " +
+ "saveStream() endRecord() selectInput() saveBytes() createReader() " +
+ "beginRaw() endRaw() PrintWriter delay()").split(" "),
+ count = unsupportedP5.length,
+ prettyName,
+ p5Name;
+
+ function createUnsupportedFunc(n) {
+ return function() {
+ throw "Processing.js does not support " + n + ".";
+ };
+ }
+
+ while (count--) {
+ prettyName = unsupportedP5[count];
+ p5Name = prettyName.replace("()", "");
+ Processing[p5Name] = createUnsupportedFunc(prettyName);
+ }
+ }(defaultScope));
+
+ // we're done. Return our object.
+ return Processing;
+};
+
+},{}],28:[function(require,module,exports){
+// Base source files
+var source = {
+ virtEquals: require("./Helpers/virtEquals"),
+ virtHashCode: require("./Helpers/virtHashCode"),
+ ObjectIterator: require("./Helpers/ObjectIterator"),
+ PConstants: require("./Helpers/PConstants"),
+ ArrayList: require("./Objects/ArrayList"),
+ HashMap: require("./Objects/HashMap"),
+ PVector: require("./Objects/PVector"),
+ PFont: require("./Objects/PFont"),
+ Char: require("./Objects/Char"),
+ XMLAttribute: require("./Objects/XMLAttribute"),
+ XMLElement: require("./Objects/XMLElement"),
+ PMatrix2D: require("./Objects/PMatrix2D"),
+ PMatrix3D: require("./Objects/PMatrix3D"),
+ PShape: require("./Objects/PShape"),
+ colors: require("./Objects/webcolors"),
+ PShapeSVG: require("./Objects/PShapeSVG"),
+ CommonFunctions: require("./P5Functions/commonFunctions"),
+ defaultScope: require("./Helpers/defaultScope"),
+ Processing: require("./Processing"),
+ setupParser: require("./Parser/Parser"),
+ finalize: require("./Helpers/finalizeProcessing")
+};
+
+// Additional code that gets tacked onto "p" during
+// instantiation of a Processing sketch.
+source.extend = {
+ withMath: require("./P5Functions/Math.js"),
+ withProxyFunctions: require("./P5Functions/JavaProxyFunctions")(source.virtHashCode, source.virtEquals),
+ withTouch: require("./P5Functions/touchmouse"),
+ withCommonFunctions: source.CommonFunctions.withCommonFunctions
+};
+
+/**
+ * Processing.js building function
+ */
+module.exports = function buildProcessingJS(Browser, testHarness) {
+ var noop = function(){},
+ virtEquals = source.virtEquals,
+ virtHashCode = source.virtHashCode,
+ PConstants = source.PConstants,
+ CommonFunctions = source.CommonFunctions,
+ ObjectIterator = source.ObjectIterator,
+ Char = source.Char,
+ XMLAttribute = source.XMLAttribute(),
+
+ ArrayList = source.ArrayList({
+ virtHashCode: virtHashCode,
+ virtEquals: virtEquals
+ }),
+
+ HashMap = source.HashMap({
+ virtHashCode: virtHashCode,
+ virtEquals: virtEquals
+ }),
+
+ PVector = source.PVector({
+ PConstants: PConstants
+ }),
+
+ PFont = source.PFont({
+ Browser: Browser,
+ noop: noop
+ }),
+
+ XMLElement = source.XMLElement({
+ Browser: Browser,
+ XMLAttribute: XMLAttribute
+ }),
+
+ PMatrix2D = source.PMatrix2D({
+ p:CommonFunctions
+ }),
+
+ PMatrix3D = source.PMatrix3D({
+ p:CommonFunctions
+ }),
+
+ PShape = source.PShape({
+ PConstants: PConstants,
+ PMatrix2D: PMatrix2D,
+ PMatrix3D: PMatrix3D
+ }),
+
+ PShapeSVG = source.PShapeSVG({
+ CommonFunctions: CommonFunctions,
+ PConstants: PConstants,
+ PShape: PShape,
+ XMLElement: XMLElement,
+ colors: source.colors
+ }),
+
+ defaultScope = source.defaultScope({
+ ArrayList: ArrayList,
+ HashMap: HashMap,
+ PVector: PVector,
+ PFont: PFont,
+ PShapeSVG: PShapeSVG,
+ ObjectIterator: ObjectIterator,
+ PConstants: PConstants,
+ Char: Char,
+ XMLElement: XMLElement,
+ XML: XMLElement
+ }),
+
+ Processing = source.Processing({
+ defaultScope: defaultScope,
+ Browser: Browser,
+ extend: source.extend,
+ noop: noop
+ });
+
+ // set up the Processing syntax parser
+ Processing = source.setupParser(Processing, {
+ Browser: Browser,
+ aFunctions: testHarness,
+ defaultScope: defaultScope
+ });
+
+ // finalise the Processing object
+ Processing = source.finalize(Processing, {
+ version: require('../package.json').version,
+ isDomPresent: false || Browser.isDomPresent,
+ window: Browser.window,
+ document: Browser.document,
+ noop: noop
+ });
+
+ // done.
+ return Processing;
+};
+
+},{"../package.json":2,"./Helpers/ObjectIterator":3,"./Helpers/PConstants":4,"./Helpers/defaultScope":6,"./Helpers/finalizeProcessing":7,"./Helpers/virtEquals":8,"./Helpers/virtHashCode":9,"./Objects/ArrayList":10,"./Objects/Char":11,"./Objects/HashMap":12,"./Objects/PFont":13,"./Objects/PMatrix2D":14,"./Objects/PMatrix3D":15,"./Objects/PShape":16,"./Objects/PShapeSVG":17,"./Objects/PVector":18,"./Objects/XMLAttribute":19,"./Objects/XMLElement":20,"./Objects/webcolors":21,"./P5Functions/JavaProxyFunctions":22,"./P5Functions/Math.js":23,"./P5Functions/commonFunctions":24,"./P5Functions/touchmouse":25,"./Parser/Parser":26,"./Processing":27}]},{},[1]);
diff --git a/src/http/static/viz/2/quil/core.cljc b/src/http/static/viz/2/quil/core.cljc
new file mode 100644
index 0000000..dcdaa94
--- /dev/null
+++ b/src/http/static/viz/2/quil/core.cljc
@@ -0,0 +1,4993 @@
+(ns ^{:doc "Wrappers and extensions around the core Processing.org API."}
+ quil.core
+ #?(:clj
+ (:import [processing.core PApplet PImage PGraphics PFont PConstants PShape]
+ [processing.opengl PShader]
+ [java.awt.event KeyEvent]))
+ #?(:clj
+ (:require quil.sketch
+ [clojure.set]
+ [quil.helpers.docs :as docs]
+ [quil.util :as u]
+ [quil.applet :as ap])
+
+ :cljs
+ (:require clojure.string
+ org.processingjs.Processing
+ [quil.sketch :as ap :include-macros true]
+ [quil.util :as u :include-macros true])))
+
+(def ^{:dynamic true
+ :private true}
+ *graphics* nil)
+
+(def ^{:private true} no-fill-prop "no-fill-quil")
+
+(defn
+ ^{:requires-bindings true
+ :category "Environment"
+ :subcategory nil
+ :added "2.0"
+ :tag PGraphics}
+ current-graphics
+ "Graphics currently used for drawing. By default it is sketch graphics,
+ but if called inside with-graphics macro - graphics passed to the macro
+ is returned. This method should be used if you need to call some methods
+ that are not implemented by quil. Example:
+ (.beginDraw (current-graphics))."
+ []
+ (or *graphics*
+ #?(:clj (.-g (ap/current-applet))
+ :cljs (ap/current-applet))))
+
+;; -------------------- PConstants section -----------------------
+
+(u/generate-quil-constants #?(:clj :clj :cljs :cljs)
+ arc-modes (:open :chord :pie)
+ shape-modes (:points :lines :triangles :triangle-fan :triangle-strip :quads :quad-strip)
+ blend-modes (:blend :add :subtract :darkest :lightest :difference :exclusion :multiply
+ :screen :overlay :replace :hard-light :soft-light :dodge :burn)
+ color-modes (:rgb :hsb)
+ image-formats (:rgb :argb :alpha)
+ ellipse-modes (:center :radius :corner :corners)
+ hint-options (:enable-depth-test :disable-depth-test
+ :enable-depth-sort :disable-depth-sort
+ :enable-depth-mask :disable-depth-mask
+ :enable-opengl-errors :disable-opengl-errors
+ :enable-optimized-stroke :disable-optimized-stroke
+ :enable-stroke-perspective :disable-stroke-perspective
+ :enable-stroke-pure :disable-stroke-pure
+ :enable-texture-mipmaps :disable-texture-mipmaps)
+ image-modes (:corner :corners :center)
+ rect-modes (:corner :corners :center :radius)
+ p-shape-modes (:corner :corners :center)
+ stroke-cap-modes (:square :round :project :model)
+ stroke-join-modes (:miter :bevel :round)
+ horizontal-alignment-modes (:left :center :right)
+ vertical-alignment-modes (:top :bottom :center :baseline)
+ text-modes (:model :shape)
+ texture-modes (:image :normal)
+ texture-wrap-modes (:clamp :repeat)
+ filter-modes (:threshold :gray :invert :posterize :blur :opaque :erode :dilate)
+ cursor-modes (:arrow :cross :hand :move :text :wait))
+
+;;; Useful trig constants
+#?(:clj (def PI (float Math/PI))
+ :cljs (def PI (.-PI js/Math)))
+(def HALF-PI (/ PI (float 2.0)))
+(def THIRD-PI (/ PI (float 3.0)))
+(def QUARTER-PI (/ PI (float 4.0)))
+(def TWO-PI (* PI (float 2.0)))
+
+(def DEG-TO-RAD (/ PI (float 180.0)))
+(def RAD-TO-DEG (/ (float 180.0) PI))
+
+#?(:clj
+ (def ^{:private true}
+ KEY-CODES {KeyEvent/VK_UP :up
+ KeyEvent/VK_DOWN :down
+ KeyEvent/VK_LEFT :left
+ KeyEvent/VK_RIGHT :right
+ KeyEvent/VK_ALT :alt
+ KeyEvent/VK_CONTROL :control
+ KeyEvent/VK_SHIFT :shift
+ KeyEvent/VK_WINDOWS :command
+ KeyEvent/VK_META :command
+ KeyEvent/VK_F1 :f1
+ KeyEvent/VK_F2 :f2
+ KeyEvent/VK_F3 :f3
+ KeyEvent/VK_F4 :f4
+ KeyEvent/VK_F5 :f5
+ KeyEvent/VK_F6 :f6
+ KeyEvent/VK_F7 :f7
+ KeyEvent/VK_F8 :f8
+ KeyEvent/VK_F9 :f9
+ KeyEvent/VK_F10 :f10
+ KeyEvent/VK_F11 :f11
+ KeyEvent/VK_F12 :f12
+ KeyEvent/VK_F13 :f13
+ KeyEvent/VK_F14 :f14
+ KeyEvent/VK_F15 :f15
+ KeyEvent/VK_F16 :f16
+ KeyEvent/VK_F17 :f17
+ KeyEvent/VK_F18 :f18
+ KeyEvent/VK_F19 :f19
+ KeyEvent/VK_F20 :f20
+ KeyEvent/VK_F21 :f21
+ KeyEvent/VK_F22 :f22
+ KeyEvent/VK_F23 :f23
+ KeyEvent/VK_F24 :f24})
+
+ :cljs
+ (def ^{:private true}
+ KEY-CODES {38 :up
+ 40 :down
+ 37 :left
+ 39 :right
+ 18 :alt
+ 17 :control
+ 16 :shift
+ 157 :command
+ 112 :f1
+ 113 :f2
+ 114 :f3
+ 115 :f4
+ 116 :f5
+ 117 :f6
+ 118 :f7
+ 119 :f8
+ 120 :f9
+ 121 :f10
+ 122 :f11
+ 123 :f12}))
+
+;; ------------------ end PConstants section ---------------------
+
+#?(:cljs
+ (defn
+ ^{:require-bindings true
+ :category "Output"
+ :subcategory "Text area"
+ :added "1.0"}
+ prc-println
+ "Writes to the text area of the Processing environment's console.
+ This is often helpful for looking at the data a program is producing.
+ Each call to this function creates a new line of output.
+ Individual elements can be separated with quotes (\"\") and joined with the string concatenation operator (+).
+ Also writes the content of an array to the text area of the Processing environment.
+ This is often helpful for looking at the data a program is producing.
+ A new line is put between each element of the array. This function can only print 1D arrays,
+ but can test to see if the content are null or not null for 2+ dimensional arrays."
+ [msg]
+ (.println (ap/current-applet) msg)))
+
+#?(:cljs
+ (defn
+ ^{:require-bindings true
+ :category "Output"
+ :subcategory "Text area"
+ :added "1.0"}
+ prc-print
+ "Writes to the console area of the Processing environment.
+ This is often helpful for looking at the data a program is producing.
+ The companion function println() works like print(), but creates a new line of text for each call to the function.
+ Individual elements can be separated with quotes (\"\") and joined with the addition operator (+). "
+ [msg]
+ (.print (ap/current-applet) msg)))
+
+#?(:cljs
+ (defn
+ ^{:requires-bindings true
+ :processing-name "getSketchById()"
+ :category nil
+ :subcategory nil
+ :added "1.0"}
+ get-sketch-by-id
+ "Returns sketch object by id of canvas element of sketch."
+ [id]
+ (.getInstanceById js/Processing id)))
+
+(defmacro with-sketch [applet & body]
+ (when-not (u/clj-compilation?)
+ `(quil.sketch/with-sketch ~applet ~@body)))
+
+(defn
+ ^{:requires-bindings true
+ :category "State"
+ :subcategory nil
+ :added "1.0"}
+ state-atom
+ "Retrieve sketch-specific state-atom. All changes to the
+ atom will be reflected in the state.
+
+ (set-state! :foo 1)
+ (state :foo) ;=> 1
+ (swap! (state-atom) update-in [:foo] inc)
+ (state :foo) ;=> 2"
+ #?(:clj ([] (-> (ap/current-applet) meta :state))
+ :cljs ([] (. (ap/current-applet) -quil))))
+
+(defn
+ ^{:requires-bindings true
+ :category "State"
+ :subcategory nil
+ :added "1.0"}
+ state
+ "Retrieve sketch-specific state by key. Must initially call
+ set-state! to store state. If no parameter passed whole
+ state map is returned.
+
+ (set-state! :foo 1)
+ (state :foo) ;=> 1
+ (state) ;=> {:foo 1}"
+ ([] @(state-atom))
+
+ ([key] (let [state (state)]
+ (when-not (contains? state key)
+ (throw #?(:clj (Exception. (str "Unable to find state with key: " key))
+ :cljs (js/Error (str "Unable to find state with key: " key)))))
+ (get state key))))
+
+(defn
+ ^{:requires-bindings true
+ :category "State"
+ :subcategory nil
+ :added "1.0"}
+ set-state!
+ "Set sketch-specific state. May only be called once (ideally in the
+ setup fn). Subsequent calls have no effect.
+
+ Example:
+ (set-state! :foo 1 :bar (atom true) :baz (/ (width) 2))"
+ [& state-vals]
+ (let [state* (state-atom)]
+ (when-not @state*
+ (let [state-map (apply hash-map state-vals)]
+ (reset! state* state-map)))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name "abs()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ abs-int
+ "Calculates the absolute value (magnitude) of a number. The absolute
+ value of a number is always positive. Takes and returns an int."
+ [n]
+ (PApplet/abs (int n))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name "abs()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ abs-float
+ "Calculates the absolute value (magnitude) of a number. The absolute
+ value of a number is always positive. Takes and returns a float."
+ [n]
+ (PApplet/abs (float n))))
+
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "abs()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ abs
+ "Calculates the absolute value (magnitude) of a number. The
+ absolute value of a number is always positive. Dynamically casts to
+ an int or float appropriately"
+ [n]
+ #?(:clj
+ (if (u/int-like? n)
+ (abs-int n)
+ (abs-float n))
+ :cljs
+ (.abs (ap/current-applet) n)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "acos()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ acos
+ "The inverse of cos, returns the arc cosine of a value. This
+ function expects the values in the range of -1 to 1 and values are
+ returned in the range 0 to Math/PI (3.1415927)."
+ [n]
+ #?(:clj (PApplet/acos (float n))
+ :cljs (.acos (ap/current-applet) n)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "alpha()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ alpha
+ "Extracts the alpha value from a color."
+ [color]
+ (.alpha (current-graphics) (unchecked-int color)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ambient()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ ambient-float
+ "Sets the ambient reflectance for shapes drawn to the screen. This
+ is combined with the ambient light component of environment. The
+ color components set through the parameters define the
+ reflectance. For example in the default color mode, setting x=255,
+ y=126, z=0, would cause all the red light to reflect and half of the
+ green light to reflect. Used in combination with emissive, specular,
+ and shininess in setting the material properties of shapes."
+ ([gray] (.ambient (current-graphics) (float gray)))
+ ([x y z] (.ambient (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ambient()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ ambient-int
+ "Sets the ambient reflectance for shapes drawn to the screen. This
+ is combined with the ambient light component of environment. The rgb
+ color components set define the reflectance. Used in combination
+ with emissive, specular, and shininess in setting the material
+ properties of shapes."
+ [rgb]
+ (.ambient (current-graphics) (int rgb)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ambient()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ ambient
+ "Sets the ambient reflectance for shapes drawn to the screen. This
+ is combined with the ambient light component of environment. The
+ color components set through the parameters define the
+ reflectance. For example in the default color mode, setting x=255,
+ y=126, z=0, would cause all the red light to reflect and half of the
+ green light to reflect. Used in combination with emissive, specular,
+ and shininess in setting the material properties of shapes."
+ ([rgb]
+ #?(:clj (if (u/int-like? rgb) (ambient-int rgb) (ambient-float rgb))
+ :cljs (ambient-float rgb)))
+ ([x y z] (ambient-float x y z)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ambientLight()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ ambient-light
+ "Adds an ambient light. Ambient light doesn't come from a specific direction,
+ the rays have light have bounced around so much that objects are
+ evenly lit from all sides. Ambient lights are almost always used in
+ combination with other types of lights. Lights need to be included
+ in the draw to remain persistent in a looping program. Placing them
+ in the setup of a looping program will cause them to only have an
+ effect the first time through the loop. The effect of the
+ parameters is determined by the current color mode."
+ ([red green blue]
+ (.ambientLight (current-graphics) (float red) (float green) (float blue)))
+ ([red green blue x y z]
+ (.ambientLight (current-graphics) (float red) (float green) (float blue)
+ (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "applyMatrix()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ apply-matrix
+ "Multiplies the current matrix by the one specified through the
+ parameters. This is very slow because it will try to calculate the
+ inverse of the transform, so avoid it whenever possible. The
+ equivalent function in OpenGL is glMultMatrix()."
+ #?(:clj
+ ([n00 n01 n02 n10 n11 n12]
+ (.applyMatrix (current-graphics)
+ (float n00) (float n01) (float n02)
+ (float n10) (float n11) (float n12))))
+ ([n00 n01 n02 n03
+ n10 n11 n12 n13
+ n20 n21 n22 n23
+ n30 n31 n32 n33]
+ (.applyMatrix (current-graphics)
+ (float n00) (float n01) (float n02) (float n03)
+ (float n10) (float n11) (float n12) (float n13)
+ (float n20) (float n21) (float n22) (float n23)
+ (float n30) (float n31) (float n32) (float n33))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "arc()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ arc
+ "Draws an arc in the display window. Arcs are drawn along the outer
+ edge of an ellipse defined by the x, y, width and height
+ parameters. The origin or the arc's ellipse may be changed with the
+ ellipse-mode function. The start and stop parameters specify the
+ angles at which to draw the arc. The mode is either :open, :chord or :pie."
+ ([x y width height start stop]
+ (.arc (current-graphics) (float x) (float y) (float width) (float height)
+ (float start) (float stop)))
+
+ #?(:clj
+ ([x y width height start stop mode]
+ (let [arc-mode (u/resolve-constant-key mode arc-modes)]
+ (.arc (current-graphics) (float x) (float y) (float width) (float height)
+ (float start) (float stop) (int arc-mode))))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "asin()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ asin
+ "The inverse of sin, returns the arc sine of a value. This function
+ expects the values in the range of -1 to 1 and values are returned
+ in the range -PI/2 to PI/2."
+ [n]
+ #?(:clj (PApplet/asin (float n))
+ :cljs (.asin (ap/current-applet) n)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "atan()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ atan
+ "The inverse of tan, returns the arc tangent of a value. This
+ function expects the values in the range of -Infinity to
+ Infinity (exclusive) and values are returned in the range -PI/2 to
+ PI/2 ."
+ [n]
+ #?(:clj (PApplet/atan (float n))
+ :cljs (.atan (ap/current-applet) n)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "atan2()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ atan2
+ "Calculates the angle (in radians) from a specified point to the
+ coordinate origin as measured from the positive x-axis. Values are
+ returned as a float in the range from PI to -PI. The atan2 function
+ is most often used for orienting geometry to the position of the
+ cursor. Note: The y-coordinate of the point is the first parameter
+ and the x-coordinate is the second due to the structure of
+ calculating the tangent."
+ [y x]
+ #?(:clj (PApplet/atan2 (float y) (float x))
+ :cljs (.atan2 (ap/current-applet) y x)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "PFont.list()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ available-fonts
+ "A sequence of strings representing the fonts on this system
+ available for use.
+
+ Because of limitations in Java, not all fonts can be used and some
+ might work with one operating system and not others. When sharing a
+ sketch with other people or posting it on the web, you may need to
+ include a .ttf or .otf version of your font in the data directory of
+ the sketch because other people might not have the font installed on
+ their computer. Only fonts that can legally be distributed should be
+ included with a sketch."
+ []
+ #?(:clj (seq (PFont/list))
+ :cljs (seq (.list js/PFont))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "background()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ background-float
+ "Sets the color used for the background of the Processing
+ window. The default background is light gray. In the draw function,
+ the background color is used to clear the display window at the
+ beginning of each frame.
+
+ It is not possible to use transparency (alpha) in background colors
+ with the main drawing surface, however they will work properly with
+ create-graphics. Converts args to floats."
+ ([gray] (.background (current-graphics) (float gray)))
+ ([gray alpha] (.background (current-graphics) (float gray) (float alpha)))
+ ([r g b] (.background (current-graphics) (float r) (float g) (float b)))
+ ([r g b a] (.background (current-graphics) (float r) (float g) (float b) (float a))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "background()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ background-int
+ "Sets the color used for the background of the Processing
+ window. The default background is light gray. In the draw function,
+ the background color is used to clear the display window at the
+ beginning of each frame.
+
+ It is not possible to use transparency (alpha) in background colors
+ with the main drawing surface, however they will work properly with
+ create-graphics. Converts rgb to an int and alpha to a float."
+ ([rgb] (.background (current-graphics) (unchecked-int rgb)))
+ ([rgb alpha] (.background (current-graphics) (unchecked-int rgb) (float alpha))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "background()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ background
+ "Sets the color used for the background of the Processing
+ window. The default background is light gray. In the draw function,
+ the background color is used to clear the display window at the
+ beginning of each frame.
+
+ It is not possible to use transparency (alpha) in background colors
+ with the main drawing surface, however they will work properly with
+ create-graphics. Converts args to floats."
+ #?(:clj ([rgb] (if (u/int-like? rgb) (background-int rgb) (background-float rgb)))
+ :cljs ([rgb] (.background (current-graphics) rgb)))
+ #?(:clj ([rgb alpha] (if (u/int-like? rgb) (background-int rgb alpha) (background-float rgb alpha)))
+ :cljs ([rgb alpha] (.background (current-graphics) rgb alpha)))
+ ([r g b] (background-float r g b))
+ ([r g b a] (background-float r g b a)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "background()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ background-image
+ "Specify an image to be used as the background for a sketch. Its
+ width and height must be the same size as the sketch window. Images
+ used as background will ignore the current tint setting."
+ [^PImage img]
+ (.background (current-graphics) img))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "beginCamera()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ begin-camera
+ "Sets the matrix mode to the camera matrix so calls such as
+ translate, rotate, apply-matrix and reset-matrix affect the
+ camera. begin-camera should always be used with a following
+ end-camera and pairs of begin-camera and end-camera cannot be
+ nested.
+
+ For most situations the camera function will be sufficient."
+ []
+ (.beginCamera (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "beginContour()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "2.0"}
+ begin-contour
+ "Use the begin-contour and end-contour function to create negative
+ shapes within shapes. These functions can only be within a
+ begin-shape/end-shape pair and they only work with the :p2d and :p3d
+ renderers."
+ []
+ (.beginContour (current-graphics)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "beginRaw()"
+ :category "Output"
+ :subcategory "Files"
+ :added "1.0"}
+ begin-raw
+ "Enables the creation of vectors from 3D data. Requires
+ corresponding end-raw command. These commands will grab the shape
+ data just before it is rendered to the screen. At this stage, your
+ entire scene is nothing but a long list of individual lines and
+ triangles. This means that a shape created with sphere method will
+ be made up of hundreds of triangles, rather than a single object. Or
+ that a multi-segment line shape (such as a curve) will be rendered
+ as individual segments."
+ ([renderer filename]
+ (.beginRaw (ap/current-applet) (ap/resolve-renderer renderer) (u/absolute-path filename)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "beginShape()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ begin-shape
+ "Enables the creation of complex forms. begin-shape begins recording
+ vertices for a shape and end-shape stops recording. Use the mode
+ keyword to specify which shape create from the provided
+ vertices. With no mode specified, the shape can be any irregular
+ polygon.
+
+ The available mode keywords are :points, :lines, :triangles,
+ :triangle-fan, :triangle-strip,
+ :quads, :quad-strip.
+
+ After calling the begin-shape function, a series of vertex commands
+ must follow. To stop drawing the shape, call end-shape. The vertex
+ function with two parameters specifies a position in 2D and the
+ vertex function with three parameters specifies a position in
+ 3D. Each shape will be outlined with the current stroke color and
+ filled with the fill color.
+
+ Transformations such as translate, rotate, and scale do not work
+ within begin-shape. It is also not possible to use other shapes,
+ such as ellipse or rect within begin-shape."
+ ([] (.beginShape (current-graphics)))
+ ([mode]
+ (let [mode (u/resolve-constant-key mode shape-modes)]
+ (.beginShape (current-graphics) (int mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "bezier()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ bezier
+ "Draws a Bezier curve on the screen. These curves are defined by a
+ series of anchor and control points. The first two parameters
+ specify the first anchor point and the last two parameters specify
+ the other anchor point. The middle parameters specify the control
+ points which define the shape of the curve."
+ ([x1 y1 cx1 cy1 cx2 cy2 x2 y2]
+ (.bezier (current-graphics)
+ (float x1) (float y1)
+ (float cx1) (float cy1)
+ (float cx2) (float cy2)
+ (float x2) (float y2)))
+ ([x1 y1 z1 cx1 cy1 cz1 cx2 cy2 cz2 x2 y2 z2]
+ (.bezier (current-graphics)
+ (float x1) (float y1) (float z1)
+ (float cx1) (float cy1) (float cz1)
+ (float cx2) (float cy2) (float cz2)
+ (float x2) (float y2) (float z2))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "bezierDetail()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ bezier-detail
+ "Sets the resolution at which Beziers display. The default value is
+ 20. This function is only useful when using the :p3d or :opengl
+ renderer as the default (:java2d) renderer does not use this
+ information."
+ [detail]
+ (.bezierDetail (current-graphics) (int detail)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "bezierPoint()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ bezier-point
+ "Evaluates the Bezier at point t for points a, b, c, d. The
+ parameter t varies between 0 and 1, a and d are points on the curve,
+ and b and c are the control points. This can be done once with the x
+ coordinates and a second time with the y coordinates to get the
+ location of a bezier curve at t."
+ [a b c d t]
+ (.bezierPoint (current-graphics) (float a) (float b) (float c)
+ (float d) (float t)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "bezierTangent()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ bezier-tangent
+ "Calculates the tangent of a point on a Bezier curve.
+ (See http://en.wikipedia.org/wiki/Tangent)"
+ [a b c d t]
+ (.bezierTangent (current-graphics) (float a) (float b) (float c)
+ (float d) (float t)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "bezierVertex()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ bezier-vertex
+ "Specifies vertex coordinates for Bezier curves. Each call to
+ bezier-vertex defines the position of two control points and one
+ anchor point of a Bezier curve, adding a new segment to a line or
+ shape. The first time bezier-vertex is used within a begin-shape
+ call, it must be prefaced with a call to vertex to set the first
+ anchor point. This function must be used between begin-shape and
+ end-shape and only when there is no parameter specified to
+ begin-shape."
+ ([cx1 cy1 cx2 cy2 x y]
+ (.bezierVertex (current-graphics)
+ (float cx1) (float cy1)
+ (float cx2) (float cy2)
+ (float x) (float y)))
+ ([cx1 cy1 cz1 cx2 cy2 cz2 x y z]
+ (.bezierVertex (current-graphics)
+ (float cx1) (float cy1) (float cz1)
+ (float cx2) (float cy2) (float cz2)
+ (float x) (float y) (float z))))
+
+(defn
+ ^{:require-binding false
+ :processing-name "binary()"
+ :category "Data"
+ :subcategory "Conversion"
+ :added "1.0"}
+ binary
+ "Returns a string representing the binary value of an int, char or
+ byte. When converting an int to a string, it is possible to specify
+ the number of digits used."
+ ([val]
+ #?(:clj (PApplet/binary (int val))
+ :cljs (.binary (ap/current-applet) val)))
+ ([val num-digits]
+ #?(:clj (PApplet/binary (int val) (int num-digits))
+ :cljs (.binary (ap/current-applet) val num-digits))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "blend()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ blend
+ "Blends a region of pixels from one image into another with full alpha
+ channel support. If src is not specified it defaults to current-graphics.
+ If dest is not specified it defaults to current-graphics.
+
+ Note: blend-mode function is recommended to use instead of this one.
+
+ Available blend modes are:
+
+ :blend - linear interpolation of colours: C = A*factor + B
+ :add - additive blending with white clip:
+ C = min(A*factor + B, 255)
+ :subtract - subtractive blending with black clip:
+ C = max(B - A*factor, 0)
+ :darkest - only the darkest colour succeeds:
+ C = min(A*factor, B)
+ :lightest - only the lightest colour succeeds:
+ C = max(A*factor, B)
+ :difference - subtract colors from underlying image.
+ :exclusion - similar to :difference, but less extreme.
+ :multiply - Multiply the colors, result will always be darker.
+ :screen - Opposite multiply, uses inverse values of the colors.
+ :overlay - A mix of :multiply and :screen. Multiplies dark values
+ and screens light values.
+ :hard-light - :screen when greater than 50% gray, :multiply when
+ lower.
+ :soft-light - Mix of :darkest and :lightest. Works like :overlay,
+ but not as harsh.
+ :dodge - Lightens light tones and increases contrast, ignores
+ darks.
+ Called \"Color Dodge\" in Illustrator and Photoshop.
+ :burn - Darker areas are applied, increasing contrast, ignores
+ lights. Called \"Color Burn\" in Illustrator and
+ Photoshop."
+ ([x y width height dx dy dwidth dheight mode]
+ (blend (current-graphics) (current-graphics) x y width height dx dy dwidth dheight mode))
+ ([^PImage src-img x y width height dx dy dwidth dheight mode]
+ (blend src-img (current-graphics) x y width height dx dy dwidth dheight mode))
+ ([^PImage src-img ^PImage dest-img x y width height dx dy dwidth dheight mode]
+ (let [mode (u/resolve-constant-key mode blend-modes)]
+ (.blend dest-img src-img (int x) (int y) (int width) (int height)
+ (int dx) (int dy) (int dwidth) (int dheight) (int mode)))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "blendColor()"
+ :processing-link nil
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ blend-color
+ "Blends two color values together based on the blending mode given specified
+ with the mode keyword.
+
+ Available blend modes are:
+
+ :blend - linear interpolation of colours: C = A*factor + B
+ :add - additive blending with white clip:
+ C = min(A*factor + B, 255)
+ :subtract - subtractive blending with black clip:
+ C = max(B - A*factor, 0)
+ :darkest - only the darkest colour succeeds:
+ C = min(A*factor, B)
+ :lightest - only the lightest colour succeeds:
+ C = max(A*factor, B)
+ :difference - subtract colors from underlying image.
+ :exclusion - similar to :difference, but less extreme.
+ :multiply - Multiply the colors, result will always be darker.
+ :screen - Opposite multiply, uses inverse values of the colors.
+ :overlay - A mix of :multiply and :screen. Multiplies dark values
+ and screens light values.
+ :hard-light - :screen when greater than 50% gray, :multiply when
+ lower.
+ :soft-light - Mix of :darkest and :lightest. Works like :overlay,
+ but not as harsh.
+ :dodge - Lightens light tones and increases contrast, ignores
+ darks.
+ Called \"Color Dodge\" in Illustrator and Photoshop.
+ :burn - Darker areas are applied, increasing contrast, ignores
+ lights. Called \"Color Burn\" in Illustrator and
+ Photoshop."
+ [c1 c2 mode]
+ (let [mode (u/resolve-constant-key mode blend-modes)]
+ #?(:clj (PApplet/blendColor (unchecked-int c1) (unchecked-int c2) (int mode))
+ :cljs (.blendColor (current-graphics) c1 c2 mode))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "blendMode()"
+ :category "Image"
+ :subcategory "Rendering"
+ :added "2.0"}
+ blend-mode
+ "Blends the pixels in the display window according to the defined mode.
+ There is a choice of the following modes to blend the source pixels (A)
+ with the ones of pixels already in the display window (B):
+
+ :blend - linear interpolation of colours: C = A*factor + B
+ :add - additive blending with white clip:
+ C = min(A*factor + B, 255)
+ :subtract - subtractive blending with black clip:
+ C = max(B - A*factor, 0)
+ :darkest - only the darkest colour succeeds:
+ C = min(A*factor, B)
+ :lightest - only the lightest colour succeeds:
+ C = max(A*factor, B)
+ :exclusion - similar to :difference, but less extreme.
+ :multiply - Multiply the colors, result will always be darker.
+ :screen - Opposite multiply, uses inverse values of the colors.
+ :replace - the pixels entirely replace the others and don't utilize
+ alpha (transparency) values
+
+ Note: :hard-light, :soft-light, :dodge, :overlay, :dodge, :burn, :difference
+ modes are not supported by this function.
+
+ factor is alpha value of pixel being drawed"
+ ([mode]
+ (let [mode (u/resolve-constant-key mode blend-modes)]
+ (.blendMode (current-graphics) mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "blue()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ blue
+ "Extracts the blue value from a color, scaled to match current color-mode.
+ Returns a float."
+ [color]
+ (.blue (current-graphics) (unchecked-int color)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "box()"
+ :category "Shape"
+ :subcategory "3D Primitives"
+ :added "1.0"}
+ box
+ "Creates an extruded rectangle."
+ ([size] (.box (current-graphics) (float size)))
+ ([width height depth] (.box (current-graphics) (float width) (float height) (float depth))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "brightness()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ brightness
+ "Extracts the brightness value from a color. Returns a float."
+ [color]
+ (.brightness (current-graphics) (unchecked-int color)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "camera()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ camera
+ "Sets the position of the camera through setting the eye position,
+ the center of the scene, and which axis is facing upward. Moving the
+ eye position and the direction it is pointing (the center of the
+ scene) allows the images to be seen from different angles. The
+ version without any parameters sets the camera to the default
+ position, pointing to the center of the display window with the Y
+ axis as up. The default values are:
+
+ eyeX: (/ (width) 2.0)
+ eyeY: (/ (height) 2.0)
+ eyeZ: (/ (/ (height) 2.0) (tan (/ (* Math/PI 60.0) 360.0)))
+ centerX: (/ (width) 2.0)
+ centerY: (/ (height) 2.0)
+ centerZ: 0
+ upX: 0
+ upY: 1
+ upZ: 0
+
+ Similar imilar to gluLookAt() in OpenGL, but it first clears the
+ current camera settings."
+ ([] (.camera (current-graphics)))
+ ([eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ]
+ (.camera (current-graphics) (float eyeX) (float eyeY) (float eyeZ)
+ (float centerX) (float centerY) (float centerZ)
+ (float upX) (float upY) (float upZ))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "ceil()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ ceil
+ "Calculates the closest int value that is greater than or equal to
+ the value of the parameter. For example, (ceil 9.03) returns the
+ value 10."
+ [n]
+ #?(:clj (PApplet/ceil (float n))
+ :cljs (.ceil (ap/current-applet) n)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "clear()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "2.4.0"}
+ clear
+ "Clears the pixels within a buffer. This function only works on
+ graphics objects created with the (create-graphics) function meaning
+ that you should call it only inside (with-graphics) macro. Unlike
+ the main graphics context (the display window), pixels in additional
+ graphics areas created with (create-graphics) can be entirely or
+ partially transparent. This function clears everything in a graphics
+ object to make all of the pixels 100% transparent."
+ []
+ (.clear (current-graphics))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "clip()"
+ :category "Rendering"
+ :subcategory nil
+ :added "2.4.0"}
+ clip
+ "Limits the rendering to the boundaries of a rectangle defined by
+ the parameters. The boundaries are drawn based on the state of
+ the (image-mode) fuction, either :corner, :corners, or :center.
+ To disable use (no-clip)."
+ [x y w h]
+ (.clip (current-graphics) (float x) (float y) (float w) (float h))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "color()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ color
+ "Creates an integer representation of a color The parameters are
+ interpreted as RGB or HSB values depending on the current
+ color-mode. The default mode is RGB values from 0 to 255 and
+ therefore, the function call (color 255 204 0) will return a bright
+ yellow. Args are cast to floats.
+
+ r - red or hue value
+ g - green or saturation value
+ b - blue or brightness value
+ a - alpha value"
+ ([gray] (.color (current-graphics) (float gray)))
+ ([gray alpha] (.color (current-graphics) (float gray) (float alpha)))
+ ([r g b] (.color (current-graphics) (float r) (float g) (float b)))
+ ([r g b a] (.color (current-graphics) (float r) (float g) (float b) (float a))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "colorMode()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ color-mode
+ "Changes the way Processing interprets color data. Available modes
+ are :rgb and :hsb.By default, the parameters for fill, stroke,
+ background, and color are defined by values between 0 and 255 using
+ the :rgb color model. The color-mode fn is used to change the
+ numerical range used for specifying colors and to switch color
+ systems. For example, calling
+ (color-mode :rgb 1.0) will specify that values are specified between
+ 0 and 1. The limits for defining colors are altered by setting the
+ parameters range1, range2, range3, and range 4."
+ ([mode]
+ (let [mode (u/resolve-constant-key mode color-modes)]
+ (.colorMode (current-graphics) (int mode))))
+ ([mode max]
+ (let [mode (u/resolve-constant-key mode color-modes)]
+ (.colorMode (current-graphics) (int mode) (float max))))
+ ([mode max-x max-y max-z]
+ (let [mode (u/resolve-constant-key mode color-modes)]
+ (.colorMode (current-graphics) (int mode) (float max-x) (float max-y) (float max-z))))
+ ([mode max-x max-y max-z max-a]
+ (let [mode (u/resolve-constant-key mode color-modes)]
+ (.colorMode (current-graphics) (int mode) (float max-x) (float max-y) (float max-z) (float max-a)))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name "constrain()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ constrain-float
+ "Constrains a value to not exceed a maximum and minimum value. All
+ args are cast to floats."
+ [amt low high]
+ (PApplet/constrain (float amt) (float low) (float high))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name "constrain()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ constrain-int
+ "Constrains a value to not exceed a maximum and minimum value. All
+ args are cast to ints."
+ [amt low high]
+ (PApplet/constrain (int amt) (int low) (int high))))
+
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "constrain()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ constrain
+ "Constrains a value to not exceed a maximum and minimum value."
+ [amt low high]
+ #?(:clj
+ (if (u/int-like? amt)
+ (constrain-int amt low high)
+ (constrain-float amt low high))
+ :cljs (.constrain (ap/current-applet) amt low high)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "copy()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ copy
+ "Copies a region of pixels from the one image to another. If src-img
+ is not specified it defaults to current-graphics. If dest-img is not
+ specified - it defaults to current-graphics. If the source
+ and destination regions aren't the same size, it will automatically
+ resize the source pixels to fit the specified target region. No
+ alpha information is used in the process, however if the source
+ image has an alpha channel set, it will be copied as well. "
+ ([[sx sy swidth sheight] [dx dy dwidth dheight]]
+ (.copy (current-graphics)
+ (int sx) (int sy) (int swidth) (int sheight)
+ (int dx) (int dy) (int dwidth) (int dheight)))
+
+ ([^PImage src-img [sx sy swidth sheight] [dx dy dwidth dheight]]
+ (copy src-img (current-graphics) [sx sy swidth sheight] [dx dy dwidth dheight]))
+
+ ([^PImage src-img ^PImage dest-img [sx sy swidth sheight] [dx dy dwidth dheight]]
+ (.copy dest-img src-img (int sx) (int sy) (int swidth) (int sheight)
+ (int dx) (int dy) (int dwidth) (int dheight))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "cos()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ cos
+ "Calculates the cosine of an angle. This function expects the values
+ of the angle parameter to be provided in radians (values from 0 to
+ Math/PI*2). Values are returned in the range -1 to 1."
+ [angle]
+ #?(:clj (PApplet/cos (float angle))
+ :cljs (.cos (ap/current-applet) angle)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name nil
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ font-available?
+ "Returns true if font (specified as a string) is available on this
+ system, false otherwise"
+ [font-str]
+ (if (some #{font-str} (available-fonts))
+ true
+ false)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "createFont()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ create-font
+ "Dynamically converts a font to the format used by Processing (a
+ PFont) from either a font name that's installed on the computer, or
+ from a .ttf or .otf file inside the sketches 'data' folder. This
+ function is an advanced feature for precise control.
+
+ Use available-fonts to obtain the names for the fonts recognized by
+ the computer and are compatible with this function.
+
+ The size parameter states the font size you want to generate. The
+ smooth parameter specifies if the font should be antialiased or not,
+ and the charset parameter is an array of chars that specifies the
+ characters to generate.
+
+ This function creates a bitmapped version of a font It loads a font
+ by name, and converts it to a series of images based on the size of
+ the font. When possible, the text function will use a native font
+ rather than the bitmapped version created behind the scenes with
+ create-font. For instance, when using the default renderer
+ setting (JAVA2D), the actual native version of the font will be
+ employed by the sketch, improving drawing quality and
+ performance. With the :p2d, :p3d, and :opengl renderer settings, the
+ bitmapped version will be used. While this can drastically improve
+ speed and appearance, results are poor when exporting if the sketch
+ does not include the .otf or .ttf file, and the requested font is
+ not available on the machine running the sketch."
+ ([name size] (.createFont (ap/current-applet) (str name) (float size)))
+ ([name size smooth] (.createFont (ap/current-applet) (str name) (float size) smooth))
+ ([name size smooth ^chars charset]
+ (.createFont (ap/current-applet) (str name) (float size) smooth charset)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "createGraphics()"
+ :category "Image"
+ :subcategory "Rendering"
+ :added "1.0"}
+ create-graphics
+ "Creates and returns a new PGraphics object of the types :p2d, :p3d,
+ :java2d, :pdf. By default :java2d is used. Use this class if you
+ need to draw into an off-screen graphics buffer. It's not possible
+ to use create-graphics with the :opengl renderer, because it doesn't
+ allow offscreen use. The :pdf renderer requires the filename parameter.
+
+ Note: don't use create-graphics in draw in clojurescript, it leaks memory.
+ You should create graphic in setup and reuse it in draw instead of creating
+ a new one.
+
+ It's important to call any drawing commands between (.beginDraw graphics) and
+ (.endDraw graphics) statements or use with-graphics macro. This is also true
+ for any commands that affect drawing, such as smooth or color-mode.
+
+ If you're using :pdf renderer - don't forget to call (.dispose graphics)
+ as last command inside with-graphics macro, otherwise graphics won't be
+ saved.
+
+ Unlike the main drawing surface which is completely opaque, surfaces
+ created with create-graphics can have transparency. This makes it
+ possible to draw into a graphics and maintain the alpha channel. By
+ using save to write a PNG or TGA file, the transparency of the
+ graphics object will be honored."
+ ([w h]
+ (.createGraphics (ap/current-applet) (int w) (int h) #?(:cljs :p2d)))
+ ([w h renderer]
+ (.createGraphics (ap/current-applet) (int w) (int h) (ap/resolve-renderer renderer)))
+ ([w h renderer path]
+ (.createGraphics (ap/current-applet) (int w) (int h) (ap/resolve-renderer renderer)
+ #?(:clj (u/absolute-path path)
+ :cljs path))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "createImage()"
+ :category "Image"
+ :subcategory nil
+ :added "1.0"}
+ create-image
+ "Creates a new PImage (the datatype for storing images). This
+ provides a fresh buffer of pixels to play with. Set the size of the
+ buffer with the width and height parameters. The format parameter
+ defines how the pixels are stored. See the PImage reference for more
+ information.
+
+ Possible formats: :rgb, :argb, :alpha (grayscale alpha channel)
+
+ Prefer using create-image over initialising new PImage instances
+ directly."
+ [w h format]
+ (let [format (u/resolve-constant-key format image-formats)]
+ (.createImage (ap/current-applet) (int w) (int h) (int format))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "PGraphics.fillColor"
+ :processing-link "http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#fillColor"
+ :category "Color"
+ :subcategory "Creating & Reading"}
+ current-fill
+ "Return the current fill color."
+ []
+ (.-fillColor (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "PGraphics.strokeColor"
+ :processing-link "http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#strokeColor"
+ :category "Color"
+ :subcategory "Creating & Reading"}
+ current-stroke
+ "Return the current stroke color."
+ []
+ (.-strokeColor (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "cursor()"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ cursor
+ "Sets the cursor to a predefined symbol or makes it
+ visible if already hidden (after no-cursor was called).
+
+ Available modes: :arrow, :cross, :hand, :move, :text, :wait
+
+ See cursor-image for specifying a generic image as the cursor
+ symbol."
+ ([] (.cursor (ap/current-applet)))
+ ([cursor-mode]
+ (let [cursor-mode (u/resolve-constant-key cursor-mode cursor-modes)]
+ (.cursor (ap/current-applet)
+ #?(:clj (int cursor-mode)
+ :cljs (str cursor-mode))))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "cursor()"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ cursor-image
+ "Set the cursor to a predefined image. The horizontal and vertical
+ active spots of the cursor may be specified with hx and hy.
+ It is recommended to make the size 16x16 or 32x32 pixels."
+ ([^PImage img] (.cursor (ap/current-applet) img))
+ ([^PImage img hx hy] (.cursor (ap/current-applet) img (int hx) (int hy))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curve()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ curve
+ "Draws a curved line on the screen. The first and second parameters
+ specify the beginning control point and the last two parameters
+ specify the ending control point. The middle parameters specify the
+ start and stop of the curve. Longer curves can be created by putting
+ a series of curve fns together or using curve-vertex. An additional
+ fn called curve-tightness provides control for the visual quality of
+ the curve. The curve fn is an implementation of Catmull-Rom
+ splines."
+ ([x1 y1 x2 y2 x3 y3 x4 y4]
+ (.curve (current-graphics)
+ (float x1) (float y1)
+ (float x2) (float y2)
+ (float x3) (float y3)
+ (float x4) (float y4)))
+ ([x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4]
+ (.curve (current-graphics)
+ (float x1) (float y1) (float z1)
+ (float x2) (float y2) (float z2)
+ (float x3) (float y3) (float z3)
+ (float x4) (float y4) (float z4))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curveDetail()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ curve-detail
+ "Sets the resolution at which curves display. The default value is
+ 20. This function is only useful when using the :p3d or :opengl
+ renderer as the default (:java2d) renderer does not use this
+ information."
+ [detail]
+ (.curveDetail (current-graphics) (int detail)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curvePoint()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ curve-point
+ "Evalutes the curve at point t for points a, b, c, d. The parameter
+ t varies between 0 and 1, a and d are points on the curve, and b c
+ and are the control points. This can be done once with the x
+ coordinates and a second time with the y coordinates to get the
+ location of a curve at t."
+ [a b c d t]
+ (.curvePoint (current-graphics) (float a) (float b) (float c) (float d) (float t)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curveTangent()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ curve-tangent
+ "Calculates the tangent of a point on a curve.
+ See: http://en.wikipedia.org/wiki/Tangent"
+ [a b c d t]
+ (.curveTangent (current-graphics) (float a) (float b) (float c) (float d) (float t)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curveTightness()"
+ :category "Shape"
+ :subcategory "Curves"
+ :added "1.0"}
+ curve-tightness
+ "Modifies the quality of forms created with curve and
+ curve-vertex. The parameter squishy determines how the curve fits
+ to the vertex points. The value 0.0 is the default value for
+ squishy (this value defines the curves to be Catmull-Rom splines)
+ and the value 1.0 connects all the points with straight
+ lines. Values within the range -5.0 and 5.0 will deform the curves
+ but will leave them recognizable and as values increase in
+ magnitude, they will continue to deform."
+ [ti]
+ (.curveTightness (current-graphics) (float ti)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "curveVertex()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ curve-vertex
+ "Specifies vertex coordinates for curves. This function may only be
+ used between begin-shape and end-shape and only when there is no
+ mode keyword specified to begin-shape. The first and last points in a
+ series of curve-vertex lines will be used to guide the beginning and
+ end of a the curve. A minimum of four points is required to draw a
+ tiny curve between the second and third points. Adding a fifth point
+ with curve-vertex will draw the curve between the second, third, and
+ fourth points. The curve-vertex function is an implementation of
+ Catmull-Rom splines."
+ ([x y] (.curveVertex (current-graphics) (float x) (float y)))
+ ([x y z] (.curveVertex (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "day()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ day
+ "Get the current day of the month (1 through 31)."
+ []
+ #?(:clj (PApplet/day)
+ :cljs (.day (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "degrees()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ degrees
+ "Converts a radian measurement to its corresponding value in
+ degrees. Radians and degrees are two ways of measuring the same
+ thing. There are 360 degrees in a circle and (* 2 Math/PI) radians
+ in a circle. For example, (= 90° (/ Math/PI 2) 1.5707964). All
+ trigonometric methods in Processing require their parameters to be
+ specified in radians."
+ [radians]
+ #?(:clj (PApplet/degrees (float radians))
+ :cljs (.degrees (ap/current-applet) radians)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "delay()"
+ :processing-link nil
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ delay-frame
+ "Forces the program to stop running for a specified time. Delay
+ times are specified in thousandths of a second, therefore the
+ function call (delay 3000) will stop the program for three
+ seconds. Because the screen is updated only at the end of draw,
+ the program may appear to 'freeze', because the screen will not
+ update when the delay fn is used. This function has no affect
+ inside setup."
+ [freeze-ms]
+ (.delay (ap/current-applet) (int freeze-ms)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "directionalLight()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ directional-light
+ "Adds a directional light. Directional light comes from one
+ direction and is stronger when hitting a surface squarely and weaker
+ if it hits at a gentle angle. After hitting a surface, a
+ directional lights scatters in all directions. Lights need to be
+ included in the draw fn to remain persistent in a looping
+ program. Placing them in the setup fn of a looping program will cause
+ them to only have an effect the first time through the loop. The
+ affect of the r, g, and b parameters is determined by the current
+ color mode. The nx, ny, and nz parameters specify the direction the
+ light is facing. For example, setting ny to -1 will cause the
+ geometry to be lit from below (the light is facing directly upward)"
+ [r g b nx ny nz]
+ (.directionalLight (current-graphics) (float r) (float g) (float b)
+ (float nx) (float ny) (float nz)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "dist()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ dist
+ "Calculates the distance between two points"
+ ([x1 y1 x2 y2]
+ #?(:clj (PApplet/dist (float x1) (float y1) (float x2) (float y2))
+ :cljs (.dist (ap/current-applet) x1 y1 x2 y2)))
+ ([x1 y1 z1 x2 y2 z2]
+ #?(:clj (PApplet/dist (float x1) (float y1) (float z1) (float x2) (float y2) (float z2))
+ :cljs (.dist (ap/current-applet) x1 y1 z1 x2 y2 z2))))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Output"
+ :subcategory "Files"
+ :added "2.5"}
+ do-record
+ "Macro for drawing on graphics which saves result in the file at the end.
+ Similar to 'with-graphics' macro. do-record assumed to be used with :pdf
+ graphics. Example:
+
+ (q/do-record (q/create-graphics 200 200 :pdf \"output.pdf\")
+ (q/fill 250 0 0)
+ (q/ellipse 100 100 150 150))
+ "
+ [graphics & body]
+ `(let [gr# ~graphics]
+ (with-graphics gr#
+ ~@body)
+ (.dispose gr#)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ellipse()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ ellipse
+ "Draws an ellipse (oval) in the display window. An ellipse with an
+ equal width and height is a circle. The origin may be changed with
+ the ellipse-mode function"
+ [x y width height]
+ (.ellipse (current-graphics) (float x) (float y) (float width) (float height)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ellipseMode()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ ellipse-mode
+ "Modifies the origin of the ellispse according to the specified mode:
+
+ :center - specifies the location of the ellipse as
+ the center of the shape. (Default).
+ :radius - similar to center, but the width and height parameters to
+ ellipse specify the radius of the ellipse, rather than the
+ diameter.
+ :corner - draws the shape from the upper-left corner of its bounding
+ box.
+ :corners - uses the four parameters to ellipse to set two opposing
+ corners of the ellipse's bounding box."
+ [mode]
+ (let [mode (u/resolve-constant-key mode ellipse-modes)]
+ (.ellipseMode (current-graphics) (int mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "emissive()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ emissive-float
+ "Sets the emissive color of the material used for drawing shapes
+ drawn to the screen. Used in combination with ambient, specular, and
+ shininess in setting the material properties of shapes. Converts all
+ args to floats"
+ ([float-val] (.emissive (current-graphics) (float float-val)))
+ ([r g b] (.emissive (current-graphics) (float r) (float g) (float b))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "emissive()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ emissive-int
+ "Sets the emissive color of the material used for drawing shapes
+ drawn to the screen. Used in combination with ambient, specular, and
+ shininess in setting the material properties of shapes. Converts all
+ args to ints"
+ [int-val] (.emissive (current-graphics) (int int-val)))
+
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "emissive()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ emissive
+ "Sets the emissive color of the material used for drawing shapes
+ drawn to the screen. Used in combination with ambient, specular, and
+ shininess in setting the material properties of shapes.
+
+ If passed one arg - it is assumed to be an int (i.e. a color),
+ multiple args are converted to floats."
+ ([c]
+ #?(:clj (if (u/int-like? c) (emissive-int c) (emissive-float c))
+ :cljs (emissive-float c)))
+ ([r g b] (emissive-float r g b)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "endCamera()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ end-camera
+ "Unsets the matrix mode from the camera matrix. See begin-camera."
+ []
+ (.endCamera (current-graphics)))
+
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "endContour()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "2.0"}
+ end-contour
+ "Use the begin-contour and end-contour function to create negative
+ shapes within shapes. These functions can only be within a
+ begin-shape/end-shape pair and they only work with the :p2d and :p3d
+ renderers."
+ []
+ (.endContour (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "endRaw()"
+ :category "Output"
+ :subcategory "Files"
+ :added "1.0"}
+ end-raw
+ "Complement to begin-raw; they must always be used together. See
+ the begin-raw docstring for details."
+ []
+ (.endRaw (current-graphics)))
+
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "endShape()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ end-shape
+ "May only be called after begin-shape. When end-shape is called,
+ all of image data defined since the previous call to begin-shape is
+ written into the image buffer. The keyword :close may be passed to
+ close the shape (to connect the beginning and the end)."
+ ([] (.endShape (current-graphics)))
+ ([mode]
+ (when-not (= :close mode)
+ #?(:clj (throw (Exception. (str "Unknown mode value: " mode ". Expected :close")))
+ :cljs nil))
+ (.endShape (current-graphics)
+ #?(:clj PApplet/CLOSE
+ :cljs 2))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "exit()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ exit
+ "Quits/stops/exits the program. Rather than terminating
+ immediately, exit will cause the sketch to exit after draw has
+ completed (or after setup completes if called during the setup
+ method). "
+ []
+ (.exit (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "exp()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ exp
+ "Returns Euler's number e (2.71828...) raised to the power of the
+ value parameter."
+ [val]
+ #?(:clj (PApplet/exp (float val))
+ :cljs (.exp (ap/current-applet) val)))
+
+#?(:cljs
+ (defn- clear-no-fill-cljs
+ "Sets custom property on graphcs object indicating that it has
+ fill color."
+ [graphics]
+ (aset graphics no-fill-prop false)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "fill()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ fill-float
+ "Sets the color used to fill shapes. For example, (fill 204 102 0),
+ will specify that all subsequent shapes will be filled with orange."
+ ([gray]
+ (.fill (current-graphics) (float gray))
+ #?(:cljs (clear-no-fill-cljs (current-graphics))))
+ ([gray alpha]
+ (.fill (current-graphics) (float gray) (float alpha))
+ #?(:cljs (clear-no-fill-cljs (current-graphics))))
+ ([r g b]
+ (.fill (current-graphics) (float r) (float g) (float b))
+ #?(:cljs (clear-no-fill-cljs (current-graphics))))
+ ([r g b alpha]
+ (.fill (current-graphics) (float r) (float g) (float b) (float alpha))
+ #?(:cljs (clear-no-fill-cljs (current-graphics)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "fill()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ fill-int
+ "Sets the color used to fill shapes."
+ ([rgb]
+ (.fill (current-graphics) (unchecked-int rgb))
+ #?(:cljs (clear-no-fill-cljs (current-graphics))))
+ ([rgb alpha]
+ (.fill (current-graphics) (unchecked-int rgb) (float alpha))
+ #?(:cljs (clear-no-fill-cljs (current-graphics)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "fill()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ fill
+ "Sets the color used to fill shapes."
+ ([rgb]
+ #?(:clj (if (u/int-like? rgb) (fill-int rgb) (fill-float rgb))
+ :cljs (fill-float rgb)))
+
+ ([rgb alpha]
+ #?(:clj (if (u/int-like? rgb) (fill-int rgb alpha) (fill-float rgb alpha))
+ :cljs (fill-float rgb alpha)))
+
+ ([r g b] (fill-float r g b))
+ ([r g b a] (fill-float r g b a)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "displayDensity()"
+ :category "Environment"
+ :subcategory nil
+ :added "2.4.0"}
+ display-density
+ "This function returns the number 2 if the screen is a high-density
+ screen (called a Retina display on OS X or high-dpi on Windows and
+ Linux) and a 1 if not. This information is useful for a program to
+ adapt to run at double the pixel density on a screen that supports
+ it. Can be used in conjunction with (pixel-density)"
+ ([] (.displayDensity (ap/current-applet)))
+ ([display] (PApplet/displayDensity display))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "filter()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ display-filter
+ "Originally named filter in Processing Language.
+ Filters the display window with the specified mode and level.
+ Level defines the quality of the filter and mode may be one of the
+ following keywords:
+
+ :threshold - converts the image to black and white pixels depending
+ if they are above or below the threshold defined by
+ the level parameter. The level must be between
+ 0.0 (black) and 1.0 (white). If no level is specified,
+ 0.5 is used.
+ :gray - converts any colors in the image to grayscale
+ equivalents. Doesn't work with level.
+ :invert - sets each pixel to its inverse value. Doesn't work with
+ level.
+ :posterize - limits each channel of the image to the number of
+ colors specified as the level parameter. The parameter can
+ be set to values between 2 and 255, but results are most
+ noticeable in the lower ranges.
+ :blur - executes a Guassian blur with the level parameter
+ specifying the extent of the blurring. If no level
+ parameter is used, the blur is equivalent to Guassian
+ blur of radius 1.
+ :opaque - sets the alpha channel to entirely opaque. Doesn't work
+ with level.
+ :erode - reduces the light areas. Doesn't work with level.
+ :dilate - increases the light areas. Doesn't work with level."
+ ([mode]
+ (.filter (current-graphics)
+ (int (u/resolve-constant-key mode filter-modes))))
+
+ ([mode level]
+ (let [mode (u/resolve-constant-key mode filter-modes)]
+ (.filter (current-graphics) (int mode) (float level)))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "filter()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "2.0"}
+ filter-shader
+ "Originally named filter in Processing Language.
+ Filters the display window with given shader (only in :p2d and :p3d modes)."
+ [^PShader shader-obj] (.filter (current-graphics) shader-obj)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "floor()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "2.0"}
+ floor
+ "Calculates the closest int value that is less than or equal to the
+ value of the parameter. For example, (floor 9.03) returns the value 9."
+ [n]
+ #?(:clj (PApplet/floor (float n))
+ :cljs (.floor (ap/current-applet) n)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "focused"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ focused
+ "Returns a boolean value representing whether the applet has focus."
+ [] (.-focused (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "frameCount"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ frame-count
+ "The system variable frameCount contains the number of frames
+ displayed since the program started. Inside setup() the value is 0
+ and after the first iteration of draw it is 1, etc."
+ []
+ #?(:clj (.frameCount (ap/current-applet))
+ :cljs (.-frameCount (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "frameRate"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ current-frame-rate
+ "Returns the current framerate"
+ []
+ #?(:clj (.frameRate (ap/current-applet))
+ :cljs (.-__frameRate (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "frameRate()"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ frame-rate
+ "Specifies a new target framerate (number of frames to be displayed every
+ second). If the processor is not fast enough to maintain the
+ specified rate, it will not be achieved. For example, the function
+ call (frame-rate 30) will attempt to refresh 30 times a second. It
+ is recommended to set the frame rate within setup. The default rate
+ is 60 frames per second."
+ [new-rate]
+ (do
+ #?(:cljs (reset! (.-target-frame-rate (ap/current-applet)) new-rate))
+ (.frameRate (ap/current-applet) (float new-rate))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "frustum()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ frustum
+ "Sets a perspective matrix defined through the parameters. Works
+ like glFrustum, except it wipes out the current perspective matrix
+ rather than muliplying itself with it."
+ [left right bottom top near far]
+ (.frustum (current-graphics) (float left) (float right) (float bottom) (float top)
+ (float near) (float far)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "get()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ get-pixel
+ "Reads the color of any pixel or grabs a section of an image. If no
+ parameters are specified, a copy of entire image is returned. Get the
+ value of one pixel by specifying an x,y coordinate. Get a section of
+ the image by specifying an additional width and height parameter.
+ If the pixel requested is outside of the image window, black is returned.
+ The numbers returned are scaled according to the current color ranges,
+ but only RGB values are returned by this function. For example, even though
+ you may have drawn a shape with (color-mode :hsb), the numbers returned
+ will be in RGB.
+
+ Getting the color of a single pixel with (get x y) is easy, but not
+ as fast as grabbing the data directly using the pixels fn.
+
+ If no img specified - current-graphics is used."
+ ([] (get-pixel (current-graphics)))
+ ([^PImage img] (.get img))
+ ([x y] (get-pixel (current-graphics) x y))
+ ([^PImage img x y] (.get img (int x) (int y)))
+ ([x y w h] (get-pixel (current-graphics) x y w h))
+ ([^PImage img x y w h] (.get img (int x) (int y) (int w) (int h))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "green()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ green
+ "Extracts the green value from a color, scaled to match current
+ color-mode. This value is always returned as a float so be careful
+ not to assign it to an int value."
+ [col]
+ (.green (current-graphics) (unchecked-int col)))
+
+(defn
+ ^{:require-binding false
+ :processing-name "hex()"
+ :category "Data"
+ :subcategory "Conversion"}
+ hex
+ "Converts a byte, char, int, or color to a String containing the
+ equivalent hexadecimal notation. For example color(0, 102, 153) will
+ convert to the String \"FF006699\". This function can help make your
+ geeky debugging sessions much happier. "
+ ([val]
+ #?(:clj (PApplet/hex (int val))
+ :cljs (.hex (ap/current-applet) val)))
+ ([val num-digits]
+ #?(:clj (PApplet/hex (int val) (int num-digits))
+ :cljs (.hex (ap/current-applet) val num-digits))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "getHeight()"
+ :processing-link nil
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ height
+ "Height of the display window. The value of height is zero until
+ size is called."
+ []
+ (.-height (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "hint()"
+ :processing-link nil
+ :category "Rendering"
+ :subcategory nil
+ :added "1.0"}
+ hint
+ "Set various hints and hacks for the renderer. This is used to
+ handle obscure rendering features that cannot be implemented in a
+ consistent manner across renderers. Many options will often graduate
+ to standard features instead of hints over time.
+
+ Options:
+
+ :enable-native-fonts - Use the native version fonts when they are
+ installed, rather than the bitmapped version from a .vlw
+ file. This is useful with the default (or JAVA2D) renderer
+ setting, as it will improve font rendering speed. This is not
+ enabled by default, because it can be misleading while testing
+ because the type will look great on your machine (because you have
+ the font installed) but lousy on others' machines if the identical
+ font is unavailable. This option can only be set per-sketch, and
+ must be called before any use of text-font.
+
+ :disable-native-fonts - Disables native font support.
+
+ :disable-depth-test - Disable the zbuffer, allowing you to draw on
+ top of everything at will. When depth testing is disabled, items
+ will be drawn to the screen sequentially, like a painting. This
+ hint is most often used to draw in 3D, then draw in 2D on top of
+ it (for instance, to draw GUI controls in 2D on top of a 3D
+ interface). Starting in release 0149, this will also clear the
+ depth buffer. Restore the default with :enable-depth-test
+ but note that with the depth buffer cleared, any 3D drawing that
+ happens later in draw will ignore existing shapes on the screen.
+
+ :enable-depth-test - Enables the zbuffer.
+
+ :enable-depth-sort - Enable primitive z-sorting of triangles and
+ lines in :p3d and :opengl rendering modes. This can slow
+ performance considerably, and the algorithm is not yet perfect.
+
+ :disable-depth-sort - Disables hint :enable-depth-sort
+
+ :disable-opengl-errors - Speeds up the OPENGL renderer setting
+ by not checking for errors while running.
+
+ :enable-opengl-errors - Turns on OpenGL error checking
+
+ :enable-depth-mask
+ :disable-depth-mask
+
+ :enable-optimized-stroke
+ :disable-optimized-stroke
+ :enable-retina-pixels
+ :disable-retina-pixels
+ :enable-stroke-perspective
+ :disable-stroke-perspective
+ :enable-stroke-pure
+ :disable-stroke-pure
+ :enable-texture-mipmaps
+ :disable-texture-mipmaps
+"
+ [hint-type]
+ (let [hint-type (if (keyword? hint-type)
+ (get hint-options hint-type)
+ hint-type)]
+ (.hint (current-graphics) (int hint-type))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "hour()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ hour
+ "Returns the current hour as a value from 0 - 23."
+ []
+ #?(:clj (PApplet/hour)
+ :cljs (.hour (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "hue()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ hue
+ "Extracts the hue value from a color."
+ [col]
+ (.hue (current-graphics) (unchecked-int col)))
+
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "image()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ image
+ "Displays images to the screen. Processing currently works with GIF,
+ JPEG, and Targa images. The color of an image may be modified with
+ the tint function and if a GIF has transparency, it will maintain
+ its transparency. The img parameter specifies the image to display
+ and the x and y parameters define the location of the image from its
+ upper-left corner. The image is displayed at its original size
+ unless the width and height parameters specify a different size. The
+ image-mode fn changes the way the parameters work. A call to
+ (image-mode :corners) will change the width and height parameters to
+ define the x and y values of the opposite corner of the image.
+
+ Starting with release 0124, when using the default (JAVA2D)
+ renderer, smooth will also improve image quality of resized
+ images."
+ (#?(:clj [^PImage img x y]
+ :cljs [img x y])
+ (.image (current-graphics) img (float x) (float y)))
+
+ (#?(:clj [^PImage img x y c d]
+ :cljs [img x y c d])
+ (.image (current-graphics) img (float x) (float y) (float c) (float d))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "PImage.filter()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "2.0"}
+ image-filter
+ "Originally named filter in Processing Language.
+ Filters given image with the specified mode and level.
+ Level defines the quality of the filter and mode may be one of
+ the following keywords:
+
+ :threshold - converts the image to black and white pixels depending
+ if they are above or below the threshold defined by
+ the level parameter. The level must be between
+ 0.0 (black) and 1.0 (white). If no level is specified,
+ 0.5 is used.
+ :gray - converts any colors in the image to grayscale
+ equivalents. Doesn't work with level.
+ :invert - sets each pixel to its inverse value. Doesn't work with
+ level.
+ :posterize - limits each channel of the image to the number of
+ colors specified as the level parameter. The parameter can
+ be set to values between 2 and 255, but results are most
+ noticeable in the lower ranges.
+ :blur - executes a Guassian blur with the level parameter
+ specifying the extent of the blurring. If no level
+ parameter is used, the blur is equivalent to Guassian
+ blur of radius 1.
+ :opaque - sets the alpha channel to entirely opaque. Doesn't work
+ with level.
+ :erode - reduces the light areas. Doesn't work with level.
+ :dilate - increases the light areas. Doesn't work with level."
+ ([^PImage img mode]
+ (let [mode (u/resolve-constant-key mode filter-modes)]
+ (.filter img (int mode))))
+ ([^PImage img mode level]
+ (let [mode (u/resolve-constant-key mode filter-modes)]
+ (.filter img (int mode) (float level)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "imageMode()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ image-mode
+ "Modifies the location from which images draw. The default mode is :corner.
+ Available modes are:
+
+ :corner - specifies the location to be the upper left corner and
+ uses the fourth and fifth parameters of image to set the
+ image's width and height.
+
+ :corners - uses the second and third parameters of image to set the
+ location of one corner of the image and uses the fourth
+ and fifth parameters to set the opposite corner.
+
+ :center - draw images centered at the given x and y position."
+ [mode]
+ (let [mode (u/resolve-constant-key mode image-modes)]
+ (.imageMode (current-graphics) (int mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "keyCode"
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "1.0"}
+ key-code
+ "The variable keyCode is used to detect special keys such as the UP,
+ DOWN, LEFT, RIGHT arrow keys and ALT, CONTROL, SHIFT. When checking
+ for these keys, it's first necessary to check and see if the key is
+ coded. This is done with the conditional (= (key) CODED).
+
+ The keys included in the ASCII specification (BACKSPACE, TAB, ENTER,
+ RETURN, ESC, and DELETE) do not require checking to see if they key
+ is coded, and you should simply use the key variable instead of
+ key-code If you're making cross-platform projects, note that the
+ ENTER key is commonly used on PCs and Unix and the RETURN key is
+ used instead on Macintosh. Check for both ENTER and RETURN to make
+ sure your program will work for all platforms.
+
+ For users familiar with Java, the values for UP and DOWN are simply
+ shorter versions of Java's KeyEvent.VK_UP and
+ KeyEvent.VK_DOWN. Other keyCode values can be found in the Java
+ KeyEvent reference."
+ []
+ (.-keyCode (ap/current-applet)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "2.4.0"}
+ key-modifiers
+ "Set of key modifiers that were pressed when event happened.
+ Possible modifiers :ctrl, :alt, :shift, :meta. Not available in
+ ClojureScript."
+ []
+ (let [modifiers
+ (if-let [^processing.event.Event
+ event (-> (ap/current-applet) meta :key-event deref)]
+ [(if (.isAltDown event) :alt nil)
+ (if (.isShiftDown event) :shift nil)
+ (if (.isControlDown event) :control nil)
+ (if (.isMetaDown event) :meta nil)]
+ [])]
+ (set (remove nil? modifiers)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "keyPressed"
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "1.0"}
+ key-pressed?
+ "true if any key is currently pressed, false otherwise."
+ []
+ #?(:clj (.-keyPressed (ap/current-applet))
+ :cljs (.-__keyPressed (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "lightFalloff()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ light-falloff
+ "Sets the falloff rates for point lights, spot lights, and ambient
+ lights. The parameters are used to determine the falloff with the
+ following equation:
+
+ d = distance from light position to vertex position
+ falloff = 1 / (CONSTANT + d * LINEAR + (d*d) * QUADRATIC)
+
+ Like fill, it affects only the elements which are created after it
+ in the code. The default value is (light-falloff 1.0 0.0 0.0).
+ Thinking about an ambient light with a falloff can be tricky. It is
+ used, for example, if you wanted a region of your scene to be lit
+ ambiently one color and another region to be lit ambiently by
+ another color, you would use an ambient light with location and
+ falloff. You can think of it as a point light that doesn't care
+ which direction a surface is facing."
+ [constant linear quadratic]
+ (.lightFalloff (current-graphics) (float constant) (float linear) (float quadratic)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "lerpColor()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ lerp-color
+ "Calculates a color or colors between two color at a specific
+ increment. The amt parameter is the amount to interpolate between
+ the two values where 0.0 equal to the first point, 0.1 is very near
+ the first point, 0.5 is half-way in between, etc."
+ [c1 c2 amt]
+ (.lerpColor (current-graphics) (unchecked-int c1) (unchecked-int c2) (float amt)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "lerp()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ lerp
+ "Calculates a number between two numbers at a specific
+ increment. The amt parameter is the amount to interpolate between
+ the two values where 0.0 equal to the first point, 0.1 is very near
+ the first point, 0.5 is half-way in between, etc. The lerp function
+ is convenient for creating motion along a straight path and for
+ drawing dotted lines."
+ [start stop amt]
+ #?(:clj (PApplet/lerp (float start) (float stop) (float amt))
+ :cljs (.lerp (ap/current-applet) start stop amt)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "lights()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ lights
+ "Sets the default ambient light, directional light, falloff, and
+ specular values. The defaults are:
+
+ (ambient-light 128 128 128)
+ (directional-light 128 128 128 0 0 -1)
+ (light-falloff 1 0 0)
+ (light-specular 0 0 0).
+
+ Lights need to be included in the draw to remain persistent in a
+ looping program. Placing them in the setup of a looping program
+ will cause them to only have an effect the first time through the
+ loop."
+ []
+ (.lights (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "lightSpecular()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ light-specular
+ "Sets the specular color for lights. Like fill, it affects only the
+ elements which are created after it in the code. Specular refers to
+ light which bounces off a surface in a perferred direction (rather
+ than bouncing in all directions like a diffuse light) and is used
+ for creating highlights. The specular quality of a light interacts
+ with the specular material qualities set through the specular and
+ shininess functions."
+ [r g b]
+ (.lightSpecular (current-graphics) (float r) (float g) (float b)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "line()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ line
+ "Draws a line (a direct path between two points) to the screen. The
+ version of line with four parameters draws the line in 2D. To color
+ a line, use the stroke function. A line cannot be filled, therefore
+ the fill method will not affect the color of a line. 2D lines are
+ drawn with a width of one pixel by default, but this can be changed
+ with the stroke-weight function. The version with six parameters
+ allows the line to be placed anywhere within XYZ space. "
+ ([p1 p2] (apply line (concat p1 p2)))
+ ([x1 y1 x2 y2] (.line (current-graphics) (float x1) (float y1) (float x2) (float y2)))
+ ([x1 y1 z1 x2 y2 z2]
+ (.line (current-graphics) (float x1) (float y1) (float z1)
+ (float x2) (float y2) (float z2))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "loadFont()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ load-font
+ "Loads a font into a variable of type PFont. To load correctly,
+ fonts must be located in the data directory of the current sketch.
+ To create a font to use with Processing use the create-font fn.
+
+ Like load-image and other methods that load data, the load-font fn
+ should not be used inside draw, because it will slow down the sketch
+ considerably, as the font will be re-loaded from the disk (or
+ network) on each frame.
+
+ For most renderers, Processing displays fonts using the .vlw font
+ format, which uses images for each letter, rather than defining them
+ through vector data. When hint :enable-native-fonts is used with the
+ JAVA2D renderer, the native version of a font will be used if it is
+ installed on the user's machine.
+
+ Using create-font (instead of load-font) enables vector data to be
+ used with the JAVA2D (default) renderer setting. This can be helpful
+ when many font sizes are needed, or when using any renderer based on
+ JAVA2D, such as the PDF library."
+ [filename]
+ (.loadFont (ap/current-applet) (str filename)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "loadImage()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ load-image
+ "Loads an image into a variable of type PImage. Four types of
+ images ( .gif, .jpg, .tga, .png) images may be loaded. To load
+ correctly, images must be located in the data directory of the
+ current sketch. In most cases, load all images in setup to preload
+ them at the start of the program. Loading images inside draw will
+ reduce the speed of a program.
+
+ The filename parameter can also be a URL to a file found online.
+
+ If an image is not loaded successfully, the null value is returned
+ and an error message will be printed to the console. The error
+ message does not halt the program, however the null value may cause
+ a NullPointerException if your code does not check whether the value
+ returned from load-image is nil.
+
+ Depending on the type of error, a PImage object may still be
+ returned, but the width and height of the image will be set to
+ -1. This happens if bad image data is returned or cannot be decoded
+ properly. Sometimes this happens with image URLs that produce a 403
+ error or that redirect to a password prompt, because load-image
+ will attempt to interpret the HTML as image data."
+ [filename]
+ (.loadImage (ap/current-applet) (str filename)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "loadShader()"
+ :category "Rendering"
+ :subcategory "Shaders"
+ :added "2.0"}
+ load-shader
+ "Loads a shader into the PShader object. Shaders are compatible with the
+ P2D and P3D renderers, but not with the default renderer."
+ ([fragment-filename]
+ (.loadShader (current-graphics) fragment-filename))
+ ([fragment-filename vertex-filename]
+ (.loadShader (current-graphics) fragment-filename vertex-filename)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "loadShape()"
+ :category "Shape"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ load-shape
+ "Load a geometry from a file as a PShape."
+ [filename]
+ (.loadShape (ap/current-applet) filename))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "log()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ log
+ "Calculates the natural logarithm (the base-e logarithm) of a
+ number. This function expects the values greater than 0.0."
+ [val]
+ #?(:clj (PApplet/log (float val))
+ :cljs (.log (ap/current-applet) val)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "mag()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ mag
+ "Calculates the magnitude (or length) of a vector. A vector is a
+ direction in space commonly used in computer graphics and linear
+ algebra. Because it has no start position, the magnitude of a vector
+ can be thought of as the distance from coordinate (0,0) to its (x,y)
+ value. Therefore, mag is a shortcut for writing (dist 0 0 x y)."
+ ([a b]
+ #?(:clj (PApplet/mag (float a) (float b))
+ :cljs (.mag (ap/current-applet) a b)))
+ ([a b c]
+ #?(:clj (PApplet/mag (float a) (float b) (float c))
+ :cljs (.mag (ap/current-applet) a b c))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "map()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ map-range
+ "Re-maps a number from one range to another.
+
+ Numbers outside the range are not clamped to 0 and 1, because
+ out-of-range values are often intentional and useful."
+ [val low1 high1 low2 high2]
+ #?(:clj (PApplet/map (float val) (float low1) (float high1) (float low2) (float high2))
+ :cljs (.map (ap/current-applet) val low1 high1 low2 high2)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name "PImage.mask()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ mask-image
+ "Masks part of an image from displaying by loading another image and
+ using it as an alpha channel. This mask image should only contain
+ grayscale data, but only the blue color channel is used. The mask
+ image needs to be the same size as the image to which it is
+ applied.
+
+ If single argument function is used - masked image is sketch itself
+ or graphics if used inside with-graphics macro. If you're passing
+ graphics to this function - it works only with :p3d and :opengl renderers.
+
+ This method is useful for creating dynamically generated alpha
+ masks."
+ ([^PImage mask] (mask-image (current-graphics) mask))
+ ([^PImage img ^PImage mask] (.mask img mask))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "millis()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ millis
+ "Returns the number of milliseconds (thousandths of a second) since
+ starting the sketch. This information is often used for timing
+ animation sequences."
+ []
+ (.millis (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "minute()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ minute
+ "Returns the current minute as a value from 0 - 59"
+ []
+ #?(:clj (PApplet/minute)
+ :cljs (.minute (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "modelX()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ model-x
+ "Returns the three-dimensional x, y, z position in model space. This
+ returns the x value for a given coordinate based on the current set
+ of transformations (scale, rotate, translate, etc.) The x value can
+ be used to place an object in space relative to the location of the
+ original point once the transformations are no longer in use."
+ [x y z]
+ (.modelX (current-graphics) (float x) (float y) (float z)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "modelY()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ model-y
+ "Returns the three-dimensional x, y, z position in model space. This
+ returns the y value for a given coordinate based on the current set
+ of transformations (scale, rotate, translate, etc.) The y value can
+ be used to place an object in space relative to the location of the
+ original point once the transformations are no longer in use."
+ [x y z]
+ (.modelY (current-graphics) (float x) (float y) (float z)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "modelZ()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ model-z
+ "Returns the three-dimensional x, y, z position in model space. This
+ returns the z value for a given coordinate based on the current set
+ of transformations (scale, rotate, translate, etc.) The z value can
+ be used to place an object in space relative to the location of the
+ original point once the transformations are no longer in use."
+ [x y z]
+ (.modelZ (current-graphics) (float x) (float y) (float z)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "month()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ month
+ "Returns the current month as a value from 1 - 12."
+ []
+ #?(:clj (PApplet/month)
+ :cljs (.month (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "mouseButton"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ mouse-button
+ "The value of the system variable mouseButton is either :left, :right,
+ or :center depending on which button is pressed. nil if no button pressed"
+ []
+ (let [button-code (.-mouseButton (ap/current-applet))]
+ #?(:clj
+ (condp = button-code
+ PConstants/LEFT :left
+ PConstants/RIGHT :right
+ PConstants/CENTER :center
+ nil)
+
+ :cljs
+ (condp = button-code
+ 37 :left
+ 39 :right
+ 3 :center
+ nil))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "mousePressed"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ mouse-pressed?
+ "Variable storing if a mouse button is pressed. The value of the
+ system variable mousePressed is true if a mouse button is pressed
+ and false if a button is not pressed."
+ []
+ #?(:clj (.-mousePressed (ap/current-applet))
+ :cljs (.-__mousePressed (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "mouseX"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ mouse-x
+ "Current horizontal coordinate of the mouse."
+ []
+ (.-mouseX (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "mouseY"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ mouse-y
+ "Current vertical coordinate of the mouse."
+ []
+ (.-mouseY (ap/current-applet)))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "noClip()"
+ :category "Rendering"
+ :subcategory nil
+ :added "2.4.0"}
+ no-clip
+ "Disables the clipping previously started by the clip() function."
+ []
+ (.noClip (current-graphics))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noCursor()"
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ no-cursor
+ "Hides the cursor from view. Will not work when running the in full
+ screen (Present) mode."
+ []
+ (.noCursor (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noFill()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ no-fill
+ "Disables filling geometry. If both no-stroke and no-fill are called,
+ nothing will be drawn to the screen." []
+ (.noFill (current-graphics))
+ #?(:cljs (aset (current-graphics) no-fill-prop true)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "random2d()"
+ :category "Math"
+ :subcategory "Random"
+ :added "2.6"}
+ random-2d
+ "Returns a new 2D unit vector in a random direction" []
+ (let [theta (.random (ap/current-applet) TWO-PI)]
+ [(Math/cos theta) (Math/sin theta)]))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "random3d()"
+ :category "Math"
+ :subcategory "Random"
+ :added "2.6"}
+ random-3d
+ "Returns a new 3D unit vector in a random direction" []
+ (let [theta (.random (ap/current-applet) TWO-PI)
+ phi (.random (ap/current-applet) (- HALF-PI) HALF-PI)
+ vx (* (Math/cos theta) (Math/sin phi))
+ vy (* (Math/sin theta) (Math/sin phi))
+ vz (Math/cos phi)]
+ [vx vy vz]))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noise()"
+ :category "Math"
+ :subcategory "Random"
+ :added "1.0"}
+ noise
+ "Returns the Perlin noise value at specified coordinates. Perlin
+ noise is a random sequence generator producing a more natural
+ ordered, harmonic succession of numbers compared to the standard
+ random function. It was invented by Ken Perlin in the 1980s and
+ been used since in graphical applications to produce procedural
+ textures, natural motion, shapes, terrains etc.
+
+ The main difference to the random function is that Perlin noise is
+ defined in an infinite n-dimensional space where each pair of
+ coordinates corresponds to a fixed semi-random value (fixed only for
+ the lifespan of the program). The resulting value will always be
+ between 0.0 and 1.0. Processing can compute 1D, 2D and 3D noise,
+ depending on the number of coordinates given. The noise value can be
+ animated by moving through the noise space and the 2nd and 3rd
+ dimensions can also be interpreted as time.
+
+ The actual noise is structured similar to an audio signal, in
+ respect to the function's use of frequencies. Similar to the concept
+ of harmonics in physics, perlin noise is computed over several
+ octaves which are added together for the final result.
+
+ Another way to adjust the character of the resulting sequence is the
+ scale of the input coordinates. As the function works within an
+ infinite space the value of the coordinates doesn't matter as such,
+ only the distance between successive coordinates does (eg. when
+ using noise within a loop). As a general rule the smaller the
+ difference between coordinates, the smoother the resulting noise
+ sequence will be. Steps of 0.005-0.03 work best for most
+ applications, but this will differ depending on use."
+ ([x] (.noise (ap/current-applet) (float x)))
+ ([x y] (.noise (ap/current-applet) (float x) (float y)))
+ ([x y z] (.noise (ap/current-applet) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noiseDetail()"
+ :category "Math"
+ :subcategory "Random"
+ :added "1.0"}
+ noise-detail
+ "Adjusts the character and level of detail produced by the Perlin
+ noise function. Similar to harmonics in physics, noise is computed
+ over several octaves. Lower octaves contribute more to the output
+ signal and as such define the overal intensity of the noise, whereas
+ higher octaves create finer grained details in the noise
+ sequence. By default, noise is computed over 4 octaves with each
+ octave contributing exactly half than its predecessor, starting at
+ 50% strength for the 1st octave. This falloff amount can be changed
+ by adding an additional function parameter. Eg. a falloff factor of
+ 0.75 means each octave will now have 75% impact (25% less) of the
+ previous lower octave. Any value between 0.0 and 1.0 is valid,
+ however note that values greater than 0.5 might result in greater
+ than 1.0 values returned by noise.
+
+ By changing these parameters, the signal created by the noise
+ function can be adapted to fit very specific needs and
+ characteristics."
+ ([octaves] (.noiseDetail (ap/current-applet) (int octaves)))
+ ([octaves falloff] (.noiseDetail (ap/current-applet) (int octaves) (float falloff))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noiseSeed()"
+ :category "Math"
+ :subcategory "Random"
+ :added "1.0"}
+ noise-seed
+ "Sets the seed value for noise. By default, noise produces different
+ results each time the program is run. Set the value parameter to a
+ constant to return the same pseudo-random numbers each time the
+ software is run."
+ [val]
+ (.noiseSeed (ap/current-applet) (int val)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noLights()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ no-lights
+ "Disable all lighting. Lighting is turned off by default and enabled
+ with the lights fn. This function can be used to disable lighting so
+ that 2D geometry (which does not require lighting) can be drawn
+ after a set of lighted 3D geometry."
+ []
+ (.noLights (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noLoop()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ no-loop
+ "Stops Processing from continuously executing the code within
+ draw. If start-loop is called, the code in draw will begin to run
+ continuously again. If using no-loop in setup, it should be the last
+ line inside the block.
+
+ When no-loop is used, it's not possible to manipulate or access the
+ screen inside event handling functions such as mouse-pressed or
+ key-pressed. Instead, use those functions to call redraw or
+ loop which will run draw, which can update the screen
+ properly. This means that when no-loop has been called, no drawing
+ can happen, and functions like save-frame may not be used.
+
+ Note that if the sketch is resized, redraw will be called to
+ update the sketch, even after no-oop has been
+ specified. Otherwise, the sketch would enter an odd state until
+ loop was called."
+ []
+ (.noLoop (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "norm()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ norm
+ "Normalize a value to exist between 0 and 1 (inclusive)."
+ [val start stop]
+ #?(:clj (PApplet/norm (float val) (float start) (float stop))
+ :cljs (.norm (ap/current-applet) val start stop)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "normal()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ normal
+ "Sets the current normal vector. This is for drawing three
+ dimensional shapes and surfaces and specifies a vector perpendicular
+ to the surface of the shape which determines how lighting affects
+ it. Processing attempts to automatically assign normals to shapes,
+ but since that's imperfect, this is a better option when you want
+ more control. This function is identical to glNormal3f() in OpenGL."
+ [nx ny nz]
+ (.normal (current-graphics) (float nx) (float ny) (float nz)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noSmooth()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ no-smooth
+ "Draws all geometry with jagged (aliased) edges. Must be called inside
+ :settings handler."
+ [] (.noSmooth (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noStroke()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ no-stroke
+ "Disables drawing the stroke (outline). If both no-stroke and
+ no-fill are called, nothing will be drawn to the screen."
+ []
+ (.noStroke (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "noTint()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ no-tint
+ "Removes the current fill value for displaying images and reverts to
+ displaying images with their original hues."
+ []
+ (.noTint (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "ortho()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ ortho
+ "Sets an orthographic projection and defines a parallel clipping
+ volume. All objects with the same dimension appear the same size,
+ regardless of whether they are near or far from the camera. The
+ parameters to this function specify the clipping volume where left
+ and right are the minimum and maximum x values, top and bottom are
+ the minimum and maximum y values, and near and far are the minimum
+ and maximum z values. If no parameters are given, the default is
+ used: (ortho 0 width 0 height -10 10)"
+ ([] (.ortho (current-graphics)))
+ ([left right bottom top]
+ (.ortho (current-graphics) (float left) (float right) (float bottom) (float top)))
+ ([left right bottom top near far]
+ (.ortho (current-graphics) (float left) (float right) (float bottom) (float top) (float near) (float far))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "perspective()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ perspective
+ "Sets a perspective projection applying foreshortening, making
+ distant objects appear smaller than closer ones. The parameters
+ define a viewing volume with the shape of truncated pyramid. Objects
+ near to the front of the volume appear their actual size, while
+ farther objects appear smaller. This projection simulates the
+ perspective of the world more accurately than orthographic
+ projection. The version of perspective without parameters sets the
+ default perspective and the version with four parameters allows the
+ programmer to set the area precisely. The default values are:
+ perspective(PI/3.0, width/height, cameraZ/10.0, cameraZ*10.0) where
+ cameraZ is ((height/2.0) / tan(PI*60.0/360.0));"
+ ([] (.perspective (current-graphics)))
+ ([fovy aspect z-near z-far]
+ (.perspective (current-graphics) (float fovy) (float aspect)
+ (float z-near) (float z-far))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "pixelDensity()"
+ :category "Environment"
+ :subcategory nil
+ :added "2.4.0"}
+ pixel-density
+ "It makes it possible for Processing to render using all of the pixels
+ on high resolutions screens like Apple Retina displays and Windows
+ High-DPI displays. Possible values 1 or 2. Must be called only from
+ :settings handler. To get density of the current screen you can use
+ (display-density) function."
+ [density]
+ (.pixelDensity (ap/current-applet) density)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pixels[]"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ pixels
+ "Array containing the values for all the pixels in the display
+ window or image. This array is therefore the size of the display window. If
+ this array is modified, the update-pixels fn must be called to update
+ the changes. Calls .loadPixels before obtaining the pixel array."
+ ([] (pixels (current-graphics)))
+
+ #?(:clj
+ ([^PImage img]
+ (.loadPixels img)
+ (.-pixels img))
+
+ :cljs
+ ([img]
+ (.loadPixels img)
+ (let [pix-array (.toArray (.-pixels img))]
+ (set! (.-stored-pix-array img) pix-array)
+ pix-array))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pmouseX"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ pmouse-x
+ "Horizontal coordinate of the mouse in the previous frame"
+ []
+ (.-pmouseX (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pmouseY"
+ :category "Input"
+ :subcategory "Mouse"
+ :added "1.0"}
+ pmouse-y
+ "Vertical coordinate of the mouse in the previous frame"
+ []
+ (.-pmouseY (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "point()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ point
+ "Draws a point, a coordinate in space at the dimension of one
+ pixel. The first parameter is the horizontal value for the point,
+ the second value is the vertical value for the point, and the
+ optional third value is the depth value. Drawing this shape in 3D
+ using the z parameter requires the :P3D or :opengl renderer to be
+ used."
+ ([x y] (.point (current-graphics) (float x)(float y)))
+ ([x y z] (.point (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pointLight()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ point-light
+ "Adds a point light. Lights need to be included in the draw() to
+ remain persistent in a looping program. Placing them in the setup()
+ of a looping program will cause them to only have an effect the
+ first time through the loop. The affect of the r, g, and b
+ parameters is determined by the current color mode. The x, y, and z
+ parameters set the position of the light"
+ [r g b x y z]
+ (.pointLight (current-graphics) (float r) (float g) (float b) (float x) (float y) (float z)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "popMatrix()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ pop-matrix
+ "Pops the current transformation matrix off the matrix
+ stack. Understanding pushing and popping requires understanding the
+ concept of a matrix stack. The push-matrix fn saves the current
+ coordinate system to the stack and pop-matrix restores the prior
+ coordinate system. push-matrix and pop-matrix are used in conjuction
+ with the other transformation methods and may be embedded to control
+ the scope of the transformations."
+ []
+ (.popMatrix (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "popStyle()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ pop-style
+ "Restores the prior settings on the 'style stack'. Used in
+ conjunction with push-style. Together they allow you to change the
+ style settings and later return to what you had. When a new style is
+ started with push-style, it builds on the current style information.
+ The push-style and pop-style functions can be nested to provide more
+ control"
+ []
+ (.popStyle (current-graphics)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "pow()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ pow
+ "Facilitates exponential expressions. The pow() function is an
+ efficient way of multiplying numbers by themselves (or their
+ reciprocal) in large quantities. For example, (pow 3 5) is
+ equivalent to the expression (* 3 3 3 3 3) and (pow 3 -5) is
+ equivalent to (/ 1 (* 3 3 3 3 3))."
+ [num exponent]
+ #?(:clj (PApplet/pow (float num) (float exponent))
+ :cljs (.pow (ap/current-applet) num exponent)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "printCamera()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ print-camera
+ "Prints the current camera matrix to std out. Useful for debugging."
+ []
+ (.printCamera (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "printMatrix()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ print-matrix
+ "Prints the current matrix to std out. Useful for debugging."
+ []
+ (.printMatrix (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "printProjection()"
+ :category "Lights, Camera"
+ :subcategory "Camera"
+ :added "1.0"}
+ print-projection
+ "Prints the current projection matrix to std out. Useful for
+ debugging"
+ []
+ (.printProjection (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pushMatrix()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ push-matrix
+ "Pushes the current transformation matrix onto the matrix
+ stack. Understanding push-matrix and pop-matrix requires
+ understanding the concept of a matrix stack. The push-matrix
+ function saves the current coordinate system to the stack and
+ pop-matrix restores the prior coordinate system. push-matrix and
+ pop-matrix are used in conjuction with the other transformation
+ methods and may be embedded to control the scope of the
+ transformations."
+ []
+ (.pushMatrix (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "pushStyle()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ push-style
+ "Saves the current style settings onto a 'style stack'. Use with
+ pop-style which restores the prior settings. Note that these
+ functions are always used together. They allow you to change the
+ style settings and later return to what you had. When a new style is
+ started with push-style, it builds on the current style
+ information. The push-style and pop-style fns can be embedded to
+ provide more control.
+
+ The style information controlled by the following functions are
+ included in the style: fill, stroke, tint, stroke-weight,
+ stroke-cap, stroke-join, image-mode, rect-mode, ellipse-mode,
+ shape-mode, color-mode, text-align, text-font, text-mode, text-size,
+ text-leading, emissive, specular, shininess, and ambient"
+ []
+ (.pushStyle (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "quad()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ quad
+ "A quad is a quadrilateral, a four sided polygon. It is similar to a
+ rectangle, but the angles between its edges are not constrained to
+ be ninety degrees. The first pair of parameters (x1,y1) sets the
+ first vertex and the subsequent pairs should proceed clockwise or
+ counter-clockwise around the defined shape."
+ [x1 y1 x2 y2 x3 y3 x4 y4]
+ (.quad (current-graphics)
+ (float x1) (float y1)
+ (float x2) (float y2)
+ (float x3) (float y3)
+ (float x4) (float y4)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "quadraticVertex()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "2.0"}
+ quadratic-vertex
+ "Specifies vertex coordinates for quadratic Bezier curves. Each call to
+ quadratic-vertex defines the position of one control points and one
+ anchor point of a Bezier curve, adding a new segment to a line or shape.
+ The first time quadratic-vertex is used within a begin-shape call, it
+ must be prefaced with a call to vertex to set the first anchor point.
+ This function must be used between begin-shape and end-shape and only
+ when there is no MODE parameter specified to begin-shape. Using the 3D
+ version requires rendering with :p3d."
+ ([cx cy x3 y3]
+ (.quadraticVertex (current-graphics) (float cx) (float cy) (float x3) (float y3)))
+ ([cx cy cz x3 y3 z3]
+ (.quadraticVertex (current-graphics) (float cx) (float cy) (float cz) (float x3) (float y3) (float z3))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "radians()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ radians
+ "Converts a degree measurement to its corresponding value in
+ radians. Radians and degrees are two ways of measuring the same
+ thing. There are 360 degrees in a circle and 2*PI radians in a
+ circle. For example, 90° = PI/2 = 1.5707964. All trigonometric
+ methods in Processing require their parameters to be specified in
+ radians."
+ [degrees]
+ #?(:clj (PApplet/radians (float degrees))
+ :cljs (.radians (ap/current-applet) degrees)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "random()"
+ :category "Math"
+ :subcategory "Random"
+ :added "1.0"}
+ random
+ "Generates random numbers. Each time the random function is called,
+ it returns an unexpected value within the specified range. If one
+ parameter is passed to the function it will return a float between
+ zero and the value of the high parameter. The function call (random
+ 5) returns values between 0 and 5 (starting at zero, up to but not
+ including 5). If two parameters are passed, it will return a float
+ with a value between the parameters. The function call
+ (random -5 10.2) returns values starting at -5 up to (but not
+ including) 10.2."
+ ([max] (.random (ap/current-applet) (float max)))
+ ([min max] (.random (ap/current-applet) (float min) (float max))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "randomGaussian()"
+ :category "Math"
+ :subcategory "Random"
+ :added "2.0"}
+ random-gaussian
+ "Returns a float from a random series of numbers having a mean of 0 and
+ standard deviation of 1. Each time the randomGaussian() function is called,
+ it returns a number fitting a Gaussian, or normal, distribution.
+ There is theoretically no minimum or maximum value that randomGaussian()
+ might return. Rather, there is just a very low probability that values far
+ from the mean will be returned; and a higher probability that numbers near
+ the mean will be returned. ."
+ []
+ (.randomGaussian (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "randomSeed()"
+ :category "Math"
+ :subcategory "Random"
+ :added "1.0"}
+ random-seed
+ "Sets the seed value for random. By default, random produces
+ different results each time the program is run. Set the value
+ parameter to a constant to return the same pseudo-random numbers
+ each time the software is run."
+ [w]
+ (.randomSeed (ap/current-applet) (float w)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "key"
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "1.0"}
+ raw-key
+ "Contains the value of the most recent key on the keyboard that was
+ used (either pressed or released).
+
+ For non-ASCII keys, use the keyCode variable. The keys included in
+ the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and
+ DELETE) do not require checking to see if they key is coded, and you
+ should simply use the key variable instead of keyCode If you're
+ making cross-platform projects, note that the ENTER key is commonly
+ used on PCs and Unix and the RETURN key is used instead on
+ Macintosh. Check for both ENTER and RETURN to make sure your program
+ will work for all platforms."
+ []
+ (.-key (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rect()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ rect
+ "Draws a rectangle to the screen. A rectangle is a four-sided shape
+ with every angle at ninety degrees. By default, the first two
+ parameters set the location of the upper-left corner, the third
+ sets the width, and the fourth sets the height. These parameters
+ may be changed with rect-mode.
+
+ To draw a rounded rectangle, add a fifth parameter, which is used as
+ the radius value for all four corners. To use a different radius value
+ for each corner, include eight parameters."
+ ([x y width height]
+ (.rect (current-graphics) (float x) (float y) (float width) (float height)))
+ ([x y width height r]
+ (.rect (current-graphics) (float x) (float y) (float width) (float height) (float r)))
+ ([x y width height top-left-r top-right-r bottom-right-r bottom-left-r]
+ (.rect (current-graphics) (float x) (float y) (float width) (float height)
+ (float top-left-r) (float top-right-r) (float bottom-right-r) (float bottom-left-r))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rectMode()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ rect-mode
+ "Modifies the location from which rectangles draw. The default mode
+ is :corner. Available modes are:
+
+
+ :corner - Specifies the location to be the upper left corner of the
+ shape and uses the third and fourth parameters of rect to
+ specify the width and height.
+
+ :corners - Uses the first and second parameters of rect to set the
+ location of one corner and uses the third and fourth
+ parameters to set the opposite corner.
+
+ :center - Draws the image from its center point and uses the third
+ and forth parameters of rect to specify the image's width
+ and height.
+
+ :radius - Draws the image from its center point and uses the third
+ and forth parameters of rect() to specify half of the
+ image's width and height."
+
+ [mode]
+ (let [mode (u/resolve-constant-key mode rect-modes)]
+ (.rectMode (current-graphics) (int mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "red()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ red
+ "Extracts the red value from a color, scaled to match current color-mode."
+ [c]
+ (.red (current-graphics) (unchecked-int c)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "redraw()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ redraw
+ "Executes the code within the draw fn one time. This functions
+ allows the program to update the display window only when necessary,
+ for example when an event registered by mouse-pressed or
+ key-pressed occurs.
+
+ In structuring a program, it only makes sense to call redraw
+ within events such as mouse-pressed. This is because redraw does
+ not run draw immediately (it only sets a flag that indicates an
+ update is needed).
+
+ Calling redraw within draw has no effect because draw is
+ continuously called anyway."
+ []
+ (.redraw (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "requestImage()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ request-image
+ "This function load images on a separate thread so that your sketch
+ does not freeze while images load during setup. While the image is
+ loading, its width and height will be 0. If an error occurs while
+ loading the image, its width and height will be set to -1. You'll
+ know when the image has loaded properly because its width and height
+ will be greater than 0. Asynchronous image loading (particularly
+ when downloading from a server) can dramatically improve
+ performance."
+ [filename] (.requestImage (ap/current-applet) (str filename)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "resetMatrix()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ reset-matrix
+ "Replaces the current matrix with the identity matrix. The
+ equivalent function in OpenGL is glLoadIdentity()"
+ []
+ (.resetMatrix (current-graphics)))
+
+#?(:clj
+ (def ^{:private true}
+ shader-modes {:points PApplet/POINTS
+ :lines PApplet/LINES
+ :triangles PApplet/TRIANGLES}))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "resetShader()"
+ :category "Rendering"
+ :subcategory "Shaders"
+ :added "2.0"}
+ reset-shader
+ "Restores the default shaders. Code that runs after (reset-shader) will
+ not be affected by previously defined shaders. Optional 'kind' parameter -
+ type of shader, either :points, :lines, or :triangles"
+ ([] (.resetShader (current-graphics)))
+ ([kind]
+ (let [mode (u/resolve-constant-key kind shader-modes)]
+ (.resetShader (current-graphics) mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "resize()"
+ :category "Image"
+ :processing-link "http://processing.org/reference/PImage_resize_.html"
+ :added "2.1.0"}
+ resize
+ "Resize the image to a new width and height.
+ To make the image scale proportionally, use 0 as the value for the wide or
+ high parameter. For instance, to make the width of an image 150 pixels,
+ and change the height using the same proportion, use resize(150, 0).
+
+ Even though a PGraphics is technically a PImage, it is not possible
+ to rescale the image data found in a PGraphics.
+ (It's simply not possible to do this consistently across renderers:
+ technically infeasible with P3D, or what would it even do with PDF?)
+ If you want to resize PGraphics content, first get a copy of its image data
+ using the get() method, and call resize() on the PImage that is returned."
+ [^PImage img w h]
+ (.resize img w h))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rotate()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ rotate
+ "Rotates a shape the amount specified by the angle parameter. Angles
+ should be specified in radians (values from 0 to TWO-PI) or
+ converted to radians with the radians function.
+
+ Objects are always rotated around their relative position to the
+ origin and positive numbers rotate objects in a clockwise
+ direction. Transformations apply to everything that happens after
+ and subsequent calls to the function accumulates the effect. For
+ example, calling (rotate HALF-PI) and then (rotate HALF-PI) is the
+ same as (rotate PI). All tranformations are reset when draw begins
+ again.
+
+ Technically, rotate multiplies the current transformation matrix by
+ a rotation matrix. This function can be further controlled by the
+ push-matrix and pop-matrix."
+ ([angle] (.rotate (current-graphics) (float angle)))
+ ([angle vx vy vz] (.rotate (current-graphics) (float angle)
+ (float vx) (float vy) (float vz))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rotateX()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ rotate-x
+ "Rotates a shape around the x-axis the amount specified by the angle
+ parameter. Angles should be specified in radians (values from 0 to
+ (* PI 2)) or converted to radians with the radians function. Objects
+ are always rotated around their relative position to the origin and
+ positive numbers rotate objects in a counterclockwise
+ direction. Transformations apply to everything that happens after
+ and subsequent calls to the function accumulates the effect. For
+ example, calling (rotate-x HALF-PI) and then (rotate-x HALF-PI) is
+ the same as (rotate-x PI). If rotate-x is called within the draw fn,
+ the transformation is reset when the loop begins again. This
+ function requires either the :p3d or :opengl renderer."
+ [angle]
+ (.rotateX (current-graphics) (float angle)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rotateY()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ rotate-y
+ "Rotates a shape around the y-axis the amount specified by the angle
+ parameter. Angles should be specified in radians (values from 0
+ to (* PI 2)) or converted to radians with the radians function.
+ Objects are always rotated around their relative position to the
+ origin and positive numbers rotate objects in a counterclockwise
+ direction. Transformations apply to everything that happens after
+ and subsequent calls to the function accumulates the effect. For
+ example, calling (rotate-y HALF-PI) and then (rotate-y HALF-PI) is
+ the same as (rotate-y PI). If rotate-y is called within the draw fn,
+ the transformation is reset when the loop begins again. This
+ function requires either the :p3d or :opengl renderer."
+ [angle]
+ (.rotateY (current-graphics) (float angle)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "rotateZ()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ rotate-z
+ "Rotates a shape around the z-axis the amount specified by the angle
+ parameter. Angles should be specified in radians (values from 0
+ to (* PI 2)) or converted to radians with the radians function.
+ Objects are always rotated around their relative position to the
+ origin and positive numbers rotate objects in a counterclockwise
+ direction. Transformations apply to everything that happens after
+ and subsequent calls to the function accumulates the effect. For
+ example, calling (rotate-z HALF-PI) and then (rotate-z HALF-PI) is
+ the same as (rotate-z PI). If rotate-y is called within the draw fn,
+ the transformation is reset when the loop begins again. This
+ function requires either the :p3d or :opengl renderer."
+ [angle]
+ (.rotateZ (current-graphics) (float angle)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "round()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ round
+ "Calculates the integer closest to the value parameter. For example,
+ (round 9.2) returns the value 9."
+ [val]
+ #?(:clj (PApplet/round (float val))
+ :cljs (.round (ap/current-applet) val)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "saturation()"
+ :category "Color"
+ :subcategory "Creating & Reading"
+ :added "1.0"}
+ saturation
+ "Extracts the saturation value from a color."
+ [c]
+ (.saturation (current-graphics) (unchecked-int c)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "save()"
+ :category "Output"
+ :subcategory "Image"
+ :added "1.0"}
+ save
+ "Saves an image from the display window. Images are saved in TIFF,
+ TARGA, JPEG, and PNG format depending on the extension within the
+ filename parameter. For example, image.tif will have a TIFF image
+ and image.png will save a PNG image. If no extension is included in
+ the filename, the image will save in TIFF format and .tif will be
+ added to the name. All images saved from the main drawing window
+ will be opaque. To save images without a background, use
+ create-graphics."
+ [filename]
+ (.save (current-graphics) (str filename)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "saveFrame()"
+ :category "Output"
+ :subcategory "Image"
+ :added "1.0"}
+ save-frame
+ "Saves an image identical to the current display window as a
+ file. May be called multple times - each file saved will have a
+ unique name. Name and image formate may be modified by passing a
+ string parameter of the form \"foo-####.ext\" where foo- can be any
+ arbitrary string, #### will be replaced with the current frame id
+ and .ext is one of .tiff, .targa, .png, .jpeg or .jpg
+
+ Examples:
+ (save-frame)
+ (save-frame \"pretty-pic-####.jpg\")"
+ ([] (.saveFrame (ap/current-applet)))
+ ([name] (.saveFrame (ap/current-applet) (str name))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "scale()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ scale
+ "Increases or decreases the size of a shape by expanding and
+ contracting vertices. Objects always scale from their relative
+ origin to the coordinate system. Scale values are specified as
+ decimal percentages. For example, the function call (scale 2)
+ increases the dimension of a shape by 200%. Transformations apply to
+ everything that happens after and subsequent calls to the function
+ multiply the effect. For example, calling (scale 2) and then
+ (scale 1.5) is the same as (scale 3). If scale is called within
+ draw, the transformation is reset when the loop begins again. Using
+ this fuction with the z parameter requires specfying :p3d or :opengl
+ as the renderer. This function can be further controlled by
+ push-matrix and pop-matrix."
+ ([s] (.scale (current-graphics) (float s)))
+ ([sx sy] (.scale (current-graphics) (float sx) (float sy)))
+ ([sx sy sz] (.scale (current-graphics) (float sx) (float sy) (float sz))))
+
+#?(:clj
+ (defn- ^java.awt.Dimension current-screen
+ []
+ (let [default-toolkit (java.awt.Toolkit/getDefaultToolkit)]
+ (.getScreenSize default-toolkit))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name nil
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ screen-width
+ "Returns the width of the main screen in pixels."
+ []
+ (.width (current-screen))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name nil
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ screen-height
+ "Returns the height of the main screen in pixels."
+ []
+ (.height (current-screen))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "screenX()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ screen-x
+ "Takes a three-dimensional x, y, z position and returns the x value
+ for where it will appear on a (two-dimensional) screen, once
+ affected by translate, scale or any other transformations"
+ ([x y] (.screenX (current-graphics) (float x) (float y)))
+ ([x y z] (.screenX (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "screenY()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ screen-y
+ "Takes a three-dimensional x, y, z position and returns the y value
+ for where it will appear on a (two-dimensional) screen, once
+ affected by translate, scale or any other transformations"
+ ([x y] (.screenY (current-graphics) (float x) (float y)))
+ ([x y z] (.screenY (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "screenZ()"
+ :category "Lights, Camera"
+ :subcategory "Coordinates"
+ :added "1.0"}
+ screen-z
+ "Given an x, y, z coordinate, returns its z value.
+ This value can be used to determine if an x, y, z coordinate is in
+ front or in back of another (x, y, z) coordinate. The units are
+ based on how the zbuffer is set up, and don't relate to anything
+ 'real'. They're only useful for in comparison to another value
+ obtained from screen-z, or directly out of the zbuffer"
+ [x y z]
+ (.screenZ (current-graphics) (float x) (float y) (float z)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "second()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ seconds
+ "Returns the current second as a value from 0 - 59."
+ []
+ #?(:clj (PApplet/second)
+ :cljs (.second (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "set()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ set-pixel
+ "Changes the color of any pixel in the display window. The x and y
+ parameters specify the pixel to change and the color parameter
+ specifies the color value. The color parameter is affected by the
+ current color mode (the default is RGB values from 0 to 255).
+
+ Setting the color of a single pixel with (set x, y) is easy, but not
+ as fast as putting the data directly into pixels[].
+
+ This function ignores imageMode().
+
+ Due to what appears to be a bug in Apple's Java implementation, the
+ point() and set() methods are extremely slow in some circumstances
+ when used with the default renderer. Using :p2d or :p3d will fix the
+ problem. Grouping many calls to point or set-pixel together can also
+ help. (Bug 1094)"
+ ([x y c] (set-pixel (current-graphics) x y c))
+ ([^PImage img x y c]
+ (.set img (int x) (int y) (int c))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "set()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ set-image
+ "Writes an image directly into the display window. The x and y
+ parameters define the coordinates for the upper-left corner of the
+ image."
+ [x y ^PImage src]
+ (.set (current-graphics) (int x) (int y) src))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "shader()"
+ :category "Rendering"
+ :subcategory "Shaders"
+ :added "2.0"}
+ shader
+ "Applies the shader specified by the parameters. It's compatible with the :p2d
+ and :p3drenderers, but not with the default :java2d renderer. Optional 'kind'
+ parameter - type of shader, either :points, :lines, or :triangles"
+ ([shader] (.shader (current-graphics) shader))
+ ([shader kind]
+ (let [mode (u/resolve-constant-key kind shader-modes)]
+ (.shader (current-graphics) shader mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "shape()"
+ :category "Shape"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ shape
+ "Displays shapes to the screen. The shapes must have been loaded
+ with load-shape. Processing currently works with SVG shapes
+ only. The sh parameter specifies the shape to display and the x and
+ y parameters define the location of the shape from its upper-left
+ corner. The shape is displayed at its original size unless the width
+ and height parameters specify a different size. The shape-mode
+ fn changes the way the parameters work. A call to
+ (shape-mode :corners), for example, will change the width and height
+ parameters to define the x and y values of the opposite corner of
+ the shape.
+
+ Note complex shapes may draw awkwardly with the renderers :p2d, :p3d, and
+ :opengl. Those renderers do not yet support shapes that have holes
+ or complicated breaks."
+ ([^PShape sh] (.shape (current-graphics) sh))
+ ([^PShape sh x y] (.shape (current-graphics) sh (float x) (float y)))
+ ([^PShape sh x y width height] (.shape (current-graphics) sh (float x) (float y) (float width) (float height))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "shearX()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ shear-x
+ "Shears a shape around the x-axis the amount specified by the angle
+ parameter. Angles should be specified in radians (values from 0 to
+ PI*2) or converted to radians with the radians() function. Objects
+ are always sheared around their relative position to the origin and
+ positive numbers shear objects in a clockwise direction.
+ Transformations apply to everything that happens after and
+ subsequent calls to the function accumulates the effect. For
+ example, calling (shear-x (/ PI 2)) and then (shear-x (/ PI 2)) is
+ the same as (shear-x PI). If shear-x is called within the draw fn,
+ the transformation is reset when the loop begins again. This
+ function works in P2D or JAVA2D mode.
+
+ Technically, shear-x multiplies the current transformation matrix
+ by a rotation matrix. This function can be further controlled by the
+ push-matrix and pop-matrix fns."
+ [angle]
+ (.shearX (current-graphics) (float angle)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "shearY()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ shear-y
+ "Shears a shape around the y-axis the amount specified by the angle
+ parameter. Angles should be specified in radians (values from 0 to
+ PI*2) or converted to radians with the radians() function. Objects
+ are always sheared around their relative position to the origin and
+ positive numbers shear objects in a clockwise direction.
+ Transformations apply to everything that happens after and
+ subsequent calls to the function accumulates the effect. For
+ example, calling (shear-y (/ PI 2)) and then (shear-y (/ PI 2)) is
+ the same as (shear-y PI). If shear-y is called within the draw fn,
+ the transformation is reset when the loop begins again. This
+ function works in P2D or JAVA2D mode.
+
+ Technically, shear-y multiplies the current transformation matrix
+ by a rotation matrix. This function can be further controlled by the
+ push-matrix and pop-matrix fns."
+ [angle]
+ (.shearY (current-graphics) (float angle)))
+
+(defn ^{:requires-bindings true
+ :processing-name "shapeMode()"
+ :category "Shape"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ shape-mode
+ "Modifies the location from which shapes draw. Available modes are
+ :corner, :corners and :center. Default is :corner.
+
+ :corner - specifies the location to be the upper left corner of the
+ shape and uses the third and fourth parameters of shape
+ to specify the width and height.
+
+ :corners - uses the first and second parameters of shape to set
+ the location of one corner and uses the third and fourth
+ parameters to set the opposite corner.
+
+ :center - draws the shape from its center point and uses the third
+ and forth parameters of shape to specify the width and
+ height. "
+ [mode]
+ (let [mode (u/resolve-constant-key mode p-shape-modes)]
+ (.shapeMode (current-graphics) (int mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "shininess()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ shininess
+ "Sets the amount of gloss in the surface of shapes. Used in
+ combination with ambient, specular, and emissive in setting
+ the material properties of shapes."
+ [shine]
+ (.shininess (current-graphics) (float shine)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "sin()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ sin
+ "Calculates the sine of an angle. This function expects the values
+ of the angle parameter to be provided in radians (values from 0 to
+ 6.28). A float within the range -1 to 1 is returned."
+ [angle]
+ #?(:clj (PApplet/sin (float angle))
+ :cljs (.sin (ap/current-applet) angle)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "smooth()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ smooth
+ "Draws all geometry with smooth (anti-aliased) edges. This will slow
+ down the frame rate of the application, but will enhance the visual
+ refinement.
+
+ Must be called inside :settings handler.
+
+ The level parameter (int) increases the level of smoothness with the
+ P2D and P3D renderers. This is the level of over sampling applied to
+ the graphics buffer. The value '2' will double the rendering size
+ before scaling it down to the display size. This is called '2x
+ anti-aliasing.' The value 4 is used for 4x anti-aliasing and 8 is
+ specified for 8x anti-aliasing. If level is set to 0, it will disable
+ all smoothing; it's the equivalent of the function noSmooth().
+ The maximum anti-aliasing level is determined by the hardware of the
+ machine that is running the software.
+
+ Note that smooth will also improve image quality of resized images."
+ ([] (.smooth #?(:clj (ap/current-applet)
+ :cljs (current-graphics))))
+ ([level] (.smooth #?(:clj (ap/current-applet)
+ :cljs (current-graphics))
+ (int level))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "specular()"
+ :category "Lights, Camera"
+ :subcategory "Material Properties"
+ :added "1.0"}
+ specular
+ "Sets the specular color of the materials used for shapes drawn to
+ the screen, which sets the color of hightlights. Specular refers to
+ light which bounces off a surface in a perferred direction (rather
+ than bouncing in all directions like a diffuse light). Used in
+ combination with emissive, ambient, and shininess in setting
+ the material properties of shapes."
+ ([gray] (.specular (current-graphics) (float gray)))
+ ([x y z] (.specular (current-graphics) (float x) (float y) (float z))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "sphere()"
+ :category "Shape"
+ :subcategory "3D Primitives"
+ :added "1.0"}
+ sphere
+ "Generates a hollow ball made from tessellated triangles."
+ [radius] (.sphere (current-graphics) (float radius)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "sphereDetail()"
+ :category "Shape"
+ :subcategory "3D Primitives"
+ :added "1.0"}
+ sphere-detail
+ "Controls the detail used to render a sphere by adjusting the number
+ of vertices of the sphere mesh. The default resolution is 30, which
+ creates a fairly detailed sphere definition with vertices every
+ 360/30 = 12 degrees. If you're going to render a great number of
+ spheres per frame, it is advised to reduce the level of detail using
+ this function. The setting stays active until sphere-detail is
+ called again with a new parameter and so should not be called prior
+ to every sphere statement, unless you wish to render spheres with
+ different settings, e.g. using less detail for smaller spheres or
+ ones further away from the camera. To controla the detail of the
+ horizontal and vertical resolution independently, use the version of
+ the functions with two parameters."
+ ([res] (.sphereDetail (current-graphics) (int res)))
+ ([ures vres] (.sphereDetail (current-graphics) (int ures) (int vres))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "spotLight()"
+ :category "Lights, Camera"
+ :subcategory "Lights"
+ :added "1.0"}
+ spot-light
+ "Adds a spot light. Lights need to be included in the draw to
+ remain persistent in a looping program. Placing them in the setup
+ of a looping program will cause them to only have an effect the
+ first time through the loop. The affect of the r, g, and b
+ parameters is determined by the current color mode. The x, y, and z
+ parameters specify the position of the light and nx, ny, nz specify
+ the direction or light. The angle parameter affects angle of the
+ spotlight cone."
+ ([r g b x y z nx ny nz angle concentration]
+ (.spotLight (current-graphics) r g b x y z nx ny nz angle concentration))
+ ([[r g b] [x y z] [nx ny nz] angle concentration]
+ (.spotLight (current-graphics) r g b x y z nx ny nz angle concentration)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "sq()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ sq
+ "Squares a number (multiplies a number by itself). The result is
+ always a positive number, as multiplying two negative numbers always
+ yields a positive result. For example, -1 * -1 = 1."
+ [a]
+ #?(:clj (PApplet/sq (float a))
+ :cljs (.sq (ap/current-applet) a)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "sqrt()"
+ :category "Math"
+ :subcategory "Calculation"
+ :added "1.0"}
+ sqrt
+ "Calculates the square root of a number. The square root of a number
+ is always positive, even though there may be a valid negative
+ root. The square root s of number a is such that (= a (* s s)) . It
+ is the opposite of squaring."
+ [a]
+ #?(:clj (PApplet/sqrt (float a))
+ :cljs (.sqrt (ap/current-applet) a)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "loop()"
+ :category "Structure"
+ :subcategory nil
+ :added "1.0"}
+ start-loop
+ "Causes Processing to continuously execute the code within
+ draw. If no-loop is called, the code in draw stops executing."
+ []
+ (.loop (ap/current-applet)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "stroke()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ stroke-float
+ "Sets the color used to draw lines and borders around
+ shapes. Converts all args to floats"
+ ([gray] (.stroke (current-graphics) (float gray)))
+ ([gray alpha] (.stroke (current-graphics) (float gray) (float alpha)))
+ ([x y z] (.stroke (current-graphics) (float x) (float y) (float z)))
+ ([x y z a] (.stroke (current-graphics) (float x) (float y) (float z) (float a))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "stroke()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ stroke-int
+ "Sets the color used to draw lines and borders around
+ shapes. Converts rgb to int and alpha to a float."
+ ([rgb] (.stroke (current-graphics) (unchecked-int rgb)))
+ ([rgb alpha] (.stroke (current-graphics) (unchecked-int rgb) (float alpha))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "stroke()"
+ :category "Color"
+ :subcategory "Setting"
+ :added "1.0"}
+ stroke
+ "Sets the color used to draw lines and borders around shapes. This
+ color is either specified in terms of the RGB or HSB color depending
+ on the current color-mode (the default color space is RGB, with
+ each value in the range from 0 to 255)."
+ ([rgb]
+ #?(:clj (if (u/int-like? rgb) (stroke-int rgb) (stroke-float rgb))
+ :cljs (stroke-float rgb)))
+
+ ([rgb alpha]
+ #?(:clj (if (u/int-like? rgb) (stroke-int rgb alpha) (stroke-float rgb alpha))
+ :cljs (stroke-float rgb alpha)))
+
+ ([x y z] (stroke-float x y z))
+ ([x y z a] (stroke-float x y z a)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "strokeCap()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ stroke-cap
+ "Sets the style for rendering line endings. These ends are either
+ squared, extended, or rounded and specified with the corresponding
+ parameters :square, :project, and :round. The default cap is :round."
+ [cap-mode]
+ (let [cap-mode (u/resolve-constant-key cap-mode stroke-cap-modes)]
+ (.strokeCap (current-graphics)
+ #?(:clj (int cap-mode)
+ :cljs (str cap-mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "strokeJoin()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ stroke-join
+ "Sets the style of the joints which connect line
+ segments. These joints are either mitered, beveled, or rounded and
+ specified with the corresponding parameters :miter, :bevel, and
+ :round. The default joint is :miter.
+
+ This function is not available with the :p2d, :p3d, or :opengl
+ renderers."
+ [join-mode]
+ (let [join-mode (u/resolve-constant-key join-mode stroke-join-modes)]
+ (.strokeJoin (current-graphics)
+ #?(:clj (int join-mode)
+ :cljs (str join-mode)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "strokeWeight()"
+ :category "Shape"
+ :subcategory "Attributes"
+ :added "1.0"}
+ stroke-weight
+ "Sets the width of the stroke used for lines, points, and the border
+ around shapes. All widths are set in units of pixels. "
+ [weight]
+ (.strokeWeight (current-graphics) (float weight)))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "tan()"
+ :category "Math"
+ :subcategory "Trigonometry"
+ :added "1.0"}
+ tan
+ "Calculates the ratio of the sine and cosine of an angle. This
+ function expects the values of the angle parameter to be provided in
+ radians (values from 0 to PI*2). Values are returned in the range
+ infinity to -infinity."
+ [angle]
+ #?(:clj (PApplet/tan (float angle))
+ :cljs (.tan (ap/current-applet) angle)))
+
+(defn
+ ^{:requires-bindings true
+ :category "Environment"
+ :subcategory nil
+ :added "1.5.0"}
+ target-frame-rate
+ "Returns the target framerate specified with the fn frame-rate"
+ []
+ #?(:clj @(ap/target-frame-rate)
+ :cljs @(.-target-frame-rate (ap/current-applet))))
+
+(defn- no-fill?
+ "Returns whether fill is disabled for current graphics."
+ [^PGraphics graphics]
+ #?(:clj (not (.-fill graphics))
+ :cljs (true? (aget graphics no-fill-prop))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "text()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ text-char
+ "Draws a char to the screen in the specified position. See text fn
+ for more details."
+ ([c x y]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) (char c) (float x) (float y))))
+ ([c x y z]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) (char c) (float x) (float y) (float z)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "text()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ text-num
+ "Draws a number to the screen in the specified position. See text fn
+ for more details."
+ ([num x y]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) (float num) (float x) (float y))))
+ ([num x y z]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) (float num) (float x) (float y) (float z)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "text()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ text
+ "Draws text to the screen in the position specified by the x and y
+ parameters and the optional z parameter. A default font will be used
+ unless a font is set with the text-font fn. Change the color of the
+ text with the fill fn. The text displays in relation to the
+ text-align fn, which gives the option to draw to the left, right, and
+ center of the coordinates.
+
+ The x1, y1, x2 and y2 parameters define a
+ rectangular area to display within and may only be used with string
+ data. For text drawn inside a rectangle, the coordinates are
+ interpreted based on the current rect-mode setting."
+ ([^String s x y]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) s (float x) (float y))))
+ ([^String s x y z]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) s (float x) (float y) (float z))))
+ ([^String s x1 y1 x2 y2]
+ (when-not (no-fill? (current-graphics))
+ (.text (current-graphics) s (float x1) (float y1) (float x2) (float y2)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textAlign()"
+ :category "Typography"
+ :subcategory "Attributes"
+ :added "1.0"}
+ text-align
+ "Sets the current alignment for drawing text. Available modes are:
+
+ horizontal - :left, :center, and :right
+ vertical - :top, :bottom, :center, and :baseline
+
+ An optional second parameter specifies the vertical alignment
+ mode. :baseline is the default. The :top and :center parameters are
+ straightforward. The :bottom parameter offsets the line based on the
+ current text-descent. For multiple lines, the final line will be
+ aligned to the bottom, with the previous lines appearing above it.
+
+ When using text with width and height parameters, :baseline is
+ ignored, and treated as :top. (Otherwise, text would by default draw
+ outside the box, since :baseline is the default setting. :baseline is
+ not a useful drawing mode for text drawn in a rectangle.)
+
+ The vertical alignment is based on the value of text-ascent, which
+ many fonts do not specify correctly. It may be necessary to use a
+ hack and offset by a few pixels by hand so that the offset looks
+ correct. To do this as less of a hack, use some percentage of
+ text-ascent or text-descent so that the hack works even if you
+ change the size of the font."
+ ([align]
+ (let [align (u/resolve-constant-key align horizontal-alignment-modes)]
+ (.textAlign (current-graphics) (int align))))
+ ([align-x align-y]
+ (let [align-x (u/resolve-constant-key align-x horizontal-alignment-modes)
+ align-y (u/resolve-constant-key align-y vertical-alignment-modes)]
+ (.textAlign (current-graphics) (int align-x) (int align-y)))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textAscent()"
+ :category "Typography"
+ :subcategory "Metrics"
+ :added "1.0"}
+ text-ascent
+ "Returns the ascent of the current font at its current size. This
+ information is useful for determining the height of the font above
+ the baseline. For example, adding the text-ascent and text-descent
+ values will give you the total height of the line."
+ []
+ (.textAscent (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textDescent()"
+ :category "Typography"
+ :subcategory "Metrics"
+ :added "1.0"}
+ text-descent
+ "Returns descent of the current font at its current size. This
+ information is useful for determining the height of the font below
+ the baseline. For example, adding the text-ascent and text-descent
+ values will give you the total height of the line."
+ []
+ (.textDescent (current-graphics)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textFont()"
+ :category "Typography"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ text-font
+ "Sets the current font that will be drawn with the text
+ function. Fonts must be loaded with load-font before it can be
+ used. This font will be used in all subsequent calls to the text
+ function. If no size parameter is input, the font will appear at its
+ original size until it is changed with text-size.
+
+ Because fonts are usually bitmaped, you should create fonts at the
+ sizes that will be used most commonly. Using textFont without the
+ size parameter will result in the cleanest-looking text.
+
+ With the default (JAVA2D) and PDF renderers, it's also possible to
+ enable the use of native fonts via the command
+ (hint :enable-native-fonts). This will produce vector text in JAVA2D
+ sketches and PDF output in cases where the vector data is available:
+ when the font is still installed, or the font is created via the
+ create-font fn"
+ ([^PFont font] (.textFont (current-graphics) font))
+ ([^PFont font size] (.textFont (current-graphics) font (int size))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textLeading()"
+ :category "Typography"
+ :subcategory "Attributes"
+ :added "1.0"}
+ text-leading
+ "Sets the spacing between lines of text in units of pixels. This
+ setting will be used in all subsequent calls to the text function."
+ [leading]
+ (.textLeading (current-graphics) (float leading)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textMode()"
+ :category "Typography"
+ :subcategory "Attributes"
+ :added "1.0"}
+ text-mode
+ "Sets the way text draws to the screen - available modes
+ are :model and :shape
+
+ In the default configuration (the :model mode), it's possible to
+ rotate, scale, and place letters in two and three dimensional space.
+
+ The :shape mode draws text using the glyph outlines of individual
+ characters rather than as textures. This mode is only supported with
+ the PDF and OPENGL renderer settings. With the PDF renderer, you
+ must specify the :shape text-mode before any other drawing occurs.
+ If the outlines are not available, then :shape will be ignored and
+ :model will be used instead.
+
+ The :shape option in OPENGL mode can be combined with begin-raw to
+ write vector-accurate text to 2D and 3D output files, for instance
+ DXF or PDF. :shape is not currently optimized for OPENGL, so if
+ recording shape data, use :model until you're ready to capture the
+ geometry with begin-raw."
+ [mode]
+ (let [mode (u/resolve-constant-key mode text-modes)]
+ (.textMode (current-graphics) (int mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textSize()"
+ :category "Typography"
+ :subcategory "Attributes"
+ :added "1.0"}
+ text-size
+ "Sets the current font size. This size will be used in all
+ subsequent calls to the text fn. Font size is measured in
+ units of pixels."
+ [size]
+ (.textSize (current-graphics) (float size)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "texture()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ texture
+ "Sets a texture to be applied to vertex points. The texture fn must
+ be called between begin-shape and end-shape and before any calls to
+ vertex.
+
+ When textures are in use, the fill color is ignored. Instead, use
+ tint to specify the color of the texture as it is applied to the
+ shape."
+ #?(:clj [^PImage img]
+ :cljs [img])
+ (.texture (current-graphics) img))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textureMode()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ texture-mode
+ "Sets the coordinate space for texture mapping. There are two
+ options, :image and :normal.
+
+ :image refers to the actual coordinates of the image and :normal
+ refers to a normalized space of values ranging from 0 to 1. The
+ default mode is :image. In :image, if an image is 100 x 200 pixels,
+ mapping the image onto the entire size of a quad would require the
+ points (0,0) (0,100) (100,200) (0,200). The same mapping in
+ NORMAL_SPACE is (0,0) (0,1) (1,1) (0,1)."
+ [mode]
+ (let [mode (u/resolve-constant-key mode texture-modes)]
+ (.textureMode (current-graphics) (int mode))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings true
+ :processing-name "textureWrap()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "2.0"}
+ texture-wrap
+ "Defines if textures repeat or draw once within a texture map. The two
+ parameters are :clamp (the default behavior) and :repeat. This function
+ only works with the :p2d and :p3d renderers."
+ [mode]
+ (let [mode (u/resolve-constant-key mode texture-wrap-modes)]
+ (.textureWrap (current-graphics) mode))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "textWidth()"
+ :category "Typography"
+ :subcategory "Attributes"
+ :added "1.0"}
+ text-width
+ "Calculates and returns the width of any text string."
+ [^String data]
+ (.textWidth (current-graphics) data))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "tint()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ tint-float
+ "Sets the fill value for displaying images. Images can be tinted to
+ specified colors or made transparent by setting the alpha.
+
+ To make an image transparent, but not change it's color, use white
+ as the tint color and specify an alpha value. For instance,
+ tint(255, 128) will make an image 50% transparent (unless
+ colorMode() has been used).
+
+ The value for the parameter gray must be less than or equal to the
+ current maximum value as specified by colorMode(). The default
+ maximum value is 255.
+
+ Also used to control the coloring of textures in 3D."
+ ([gray] (.tint (current-graphics) (float gray)))
+ ([gray alpha] (.tint (current-graphics) (float gray) (float alpha)))
+ ([r g b] (.tint (current-graphics) (float r)(float g) (float b)))
+ ([r g b a] (.tint (current-graphics) (float g) (float g) (float b) (float a))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "tint()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ tint-int
+ "Sets the fill value for displaying images. Images can be tinted to
+ specified colors or made transparent by setting the alpha.
+
+ To make an image transparent, but not change it's color, use white
+ as the tint color and specify an alpha value. For instance,
+ tint(255, 128) will make an image 50% transparent (unless
+ colorMode() has been used).
+
+ The value for the parameter gray must be less than or equal to the
+ current maximum value as specified by colorMode(). The default
+ maximum value is 255.
+
+ Also used to control the coloring of textures in 3D."
+ ([rgb] (.tint (current-graphics) (unchecked-int rgb)))
+ ([rgb alpha] (.tint (current-graphics) (unchecked-int rgb) (float alpha))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "tint()"
+ :category "Image"
+ :subcategory "Loading & Displaying"
+ :added "1.0"}
+ tint
+ "Sets the fill value for displaying images. Images can be tinted to
+ specified colors or made transparent by setting the alpha.
+
+ To make an image transparent, but not change it's color, use white
+ as the tint color and specify an alpha value. For instance,
+ tint(255, 128) will make an image 50% transparent (unless
+ colorMode() has been used).
+
+ The value for the parameter gray must be less than or equal to the
+ current maximum value as specified by colorMode(). The default
+ maximum value is 255.
+
+ Also used to control the coloring of textures in 3D."
+ #?(:clj ([rgb] (if (u/int-like? rgb) (tint-int rgb) (tint-float rgb)))
+ :cljs ([rgb] (.tint (current-graphics) rgb)))
+ #?(:clj ([rgb alpha] (if (u/int-like? rgb) (tint-int rgb alpha) (tint-float rgb alpha)))
+ :cljs ([rgb alpha] (.tint (current-graphics) rgb alpha)))
+ ([r g b] (tint-float r g b))
+ ([r g b a] (tint-float r g b a)))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "translate()"
+ :category "Transform"
+ :subcategory nil
+ :added "1.0"}
+ translate
+ "Specifies an amount to displace objects within the display
+ window. The x parameter specifies left/right translation, the y
+ parameter specifies up/down translation, and the z parameter
+ specifies translations toward/away from the screen. Transformations
+ apply to everything that happens after and subsequent calls to the
+ function accumulates the effect. For example, calling (translate 50
+ 0) and then (translate 20, 0) is the same as (translate 70, 0). If
+ translate is called within draw, the transformation is reset when
+ the loop begins again. This function can be further controlled by
+ the push-matrix and pop-matrix."
+ ([v] (apply translate v))
+ ([tx ty] (.translate (current-graphics) (float tx) (float ty)))
+ ([tx ty tz] (.translate (current-graphics) (float tx) (float ty) (float tz))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "triangle()"
+ :category "Shape"
+ :subcategory "2D Primitives"
+ :added "1.0"}
+ triangle
+ "A triangle is a plane created by connecting three points. The first
+ two arguments specify the first point, the middle two arguments
+ specify the second point, and the last two arguments specify the
+ third point."
+ [x1 y1 x2 y2 x3 y3]
+ (.triangle (current-graphics)
+ (float x1) (float y1)
+ (float x2) (float y2)
+ (float x3) (float y3)))
+
+(defn
+ ^{:require-binding false
+ :processing-name "unbinary()"
+ :category "Data"
+ :subcategory "Conversion"
+ :added "1.0"}
+ unbinary
+ "Unpack a binary string to an integer. See binary for converting
+ integers to strings."
+ [str-val]
+ #?(:clj (PApplet/unbinary (str str-val))
+ :cljs (.unbinary (ap/current-applet) (str str-val))))
+
+(defn
+ ^{:require-binding false
+ :processing-name "hex()"
+ :category "Data"
+ :subcategory "Conversion"}
+ unhex
+ "Converts a String representation of a hexadecimal number to its
+ equivalent integer value."
+ [hex-str]
+ #?(:clj (PApplet/unhex (str hex-str))
+ :cljs (.unhex (ap/current-applet) (str hex-str))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "updatePixels()"
+ :category "Image"
+ :subcategory "Pixels"
+ :added "1.0"}
+ update-pixels
+ "Updates the display window or image with the data in the pixels array.
+ Use in conjunction with (pixels). If you're only reading pixels from
+ the array, there's no need to call update-pixels unless there are
+ changes.
+
+ Certain renderers may or may not seem to require pixels or
+ update-pixels. However, the rule is that any time you want to
+ manipulate the pixels array, you must first call pixels, and
+ after changes have been made, call update-pixels. Even if the
+ renderer may not seem to use this function in the current Processing
+ release, this will always be subject to change."
+ ([] (update-pixels (current-graphics)))
+ #?(:clj
+ ([^PImage img] (.updatePixels img))
+
+ :cljs
+ ([img]
+ (when-let [pix-array (.-stored-pix-array img)]
+ (.set (.-pixels img) pix-array)
+ (set! (.-stored-pix-array img) nil))
+ (.updatePixels img))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "vertex()"
+ :category "Shape"
+ :subcategory "Vertex"
+ :added "1.0"}
+ vertex
+ "All shapes are constructed by connecting a series of
+ vertices. vertex is used to specify the vertex coordinates for
+ points, lines, triangles, quads, and polygons and is used
+ exclusively within the begin-shape and end-shape fns.
+
+ Drawing a vertex in 3D using the z parameter requires the :p3d or
+ :opengl renderers to be used.
+
+ This function is also used to map a texture onto the geometry. The
+ texture fn declares the texture to apply to the geometry and the u
+ and v coordinates set define the mapping of this texture to the
+ form. By default, the coordinates used for u and v are specified in
+ relation to the image's size in pixels, but this relation can be
+ changed with texture-mode."
+ ([x y] (.vertex (current-graphics) (float x) (float y)))
+ ([x y z] (.vertex (current-graphics) (float x) (float y) (float z)))
+ ([x y u v] (.vertex (current-graphics) (float x) (float y) (float u) (float v)))
+ ([x y z u v]
+ (.vertex (current-graphics) (float x) (float y) (float z) (float u) (float v))))
+
+(defn
+ ^{:requires-bindings false
+ :processing-name "year()"
+ :category "Input"
+ :subcategory "Time & Date"
+ :added "1.0"}
+ year
+ "Returns the current year as an integer (2003, 2004, 2005, etc)."
+ []
+ #?(:clj (PApplet/year)
+ :cljs (.year (ap/current-applet))))
+
+(defn
+ ^{:requires-bindings true
+ :processing-name "getWidth()"
+ :processing-link nil
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ width
+ "Width of the display window. The value of width is zero until size is
+ called."
+ []
+ (.-width (ap/current-applet)))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Color"
+ :subcategory "Utility Macros"
+ :added "1.7"}
+ with-fill
+ "Temporarily set the fill color for the body of this macro.
+ The code outside of with-fill form will have the previous fill color set.
+
+ The fill color has to be in a vector!
+ Example: (with-fill [255] ...)
+ (with-fill [10 80 98] ...)"
+ [fill-args & body]
+ `(let [old-fill# (quil.core/current-fill)]
+ (apply quil.core/fill ~fill-args)
+ ~@body
+ (quil.core/fill old-fill#)))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Color"
+ :subcategory "Utility Macros"
+ :added "1.7"}
+ with-stroke
+ "Temporarily set the stroke color for the body of this macro.
+ The code outside of with-stroke form will have the previous stroke color set.
+
+ The stroke color has to be in a vector!
+ Example: (with-stroke [255] ...)
+ (with-stroke [10 80 98] ...)"
+ [stroke-args & body]
+ `(let [old-stroke# (quil.core/current-stroke)]
+ (apply quil.core/stroke ~stroke-args)
+ ~@body
+ (quil.core/stroke old-stroke#)))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Transform"
+ :subcategory "Utility Macros"
+ :added "1.0"}
+ with-translation
+ "Performs body with translation, restores current transformation on
+ exit."
+ [translation-vector & body]
+ `(let [tr# ~translation-vector]
+ (quil.core/push-matrix)
+ (try
+ (quil.core/translate tr#)
+ ~@body
+ (finally
+ (quil.core/pop-matrix)))))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Transform"
+ :subcategory "Utility Macros"
+ :added "1.0"}
+ with-rotation
+ "Performs body with rotation, restores current transformation on exit.
+ Accepts a vector [angle] or [angle x-axis y-axis z-axis].
+
+ Example:
+ (with-rotation [angle]
+ (vertex 1 2))"
+ [rotation & body]
+ `(let [tr# ~rotation]
+ (quil.core/push-matrix)
+ (try
+ (apply quil.core/rotate tr#)
+ ~@body
+ (finally
+ (quil.core/pop-matrix)))))
+
+(defmacro
+ ^{:requires-bindings true
+ :processing-name nil
+ :category "Rendering"
+ :added "1.7"}
+ with-graphics
+ "All subsequent calls of any drawing function will draw on given
+ graphics. 'with-graphics' cannot be nested (you can draw simultaneously
+ only on 1 graphics)"
+ [graphics & body]
+ `(let [gr# ~graphics]
+ (binding [quil.core/*graphics* gr#]
+ (.beginDraw gr#)
+ ~@body
+ (.endDraw gr#))))
+
+(defn ^{:requires-bindings false
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ sketch
+ "Create and start a new visualisation applet. Can be used to create
+ new sketches programmatically. See documentation for 'defsketch' for
+ list of available options."
+ [& opts]
+ #?(:clj (apply ap/applet opts)
+ :cljs (apply ap/sketch opts)))
+
+(defmacro ^{:requires-bindings false
+ :category "Environment"
+ :subcategory nil
+ :added "1.0"}
+ defsketch
+ "Define and start a sketch and bind it to a var with the symbol
+ app-name. If any of the options to the various callbacks are
+ symbols, it wraps them in a call to var to ensure they aren't
+ inlined and that redefinitions to the original fns are reflected in
+ the visualisation.
+
+ Available options:
+
+ :size - A vector of width and height for the sketch or :fullscreen.
+ Defaults to [500 300]. If you're using :fullscreen you may
+ want to enable present mode - :features [:present]
+
+ :renderer - Specifies the renderer type. One of :p2d, :p3d, :java2d,
+ :opengl, :pdf). Defaults to :java2d. :dxf renderer
+ can't be used as sketch renderer. Use begin-raw method
+ instead. In clojurescript only :p2d and :p3d renderers
+ are supported.
+
+ :output-file - Specifies an output file path. Only used in :pdf mode.
+ Not supported in clojurescript.
+
+ :title - A string which will be displayed at the top of
+ the sketch window. Not supported in clojurescript.
+
+ :features - A vector of keywords customizing sketch behaviour.
+ Supported features:
+
+ :keep-on-top - Sketch window will always be above other
+ windows. Note: some platforms might not
+ support always-on-top windows.
+ Not supported in clojurescript.
+
+ :exit-on-close - Shutdown JVM when sketch is closed.
+ Not supported in clojurescript.
+
+ :resizable - Makes sketch resizable.
+ Not supported in clojurescript.
+
+ :no-safe-fns - Do not catch and print exceptions thrown
+ inside functions provided to sketch (like
+ draw, mouse-click, key-pressed and
+ other). By default all exceptions thrown
+ inside these functions are catched. This
+ prevents sketch from breaking when bad
+ function was provided and allows you to
+ fix it and reload it on fly. You can
+ disable this behaviour by enabling
+ :no-safe-fns feature.
+ Not supported in clojurescript.
+
+ :present - Switch to present mode (fullscreen without
+ borders, OS panels). You may want to use
+ this feature together with :size :fullscreen.
+ Not supported in clojurescript.
+
+ :no-start - Disables autostart if sketch was created using
+ defsketch macro. To start sketch you have to
+ call function created defsketch.
+ Supported only in clojurescript.
+
+ :global-key-events - Allows a sketch to receive any
+ keyboard event sent to the page,
+ regardless of whether the canvas it is
+ loaded in has focus or not.
+ Supported only in clojurescript.
+
+ Usage example: :features [:keep-on-top :present]
+
+ :bgcolor - Sets background color for unused space in present mode.
+ Color is specified in hex format: #XXXXXX.
+ Example: :bgcolor \"#00FFFF\" (cyan background)
+ Not supported in clojurescript.
+
+ :display - Sets what display should be used by this sketch.
+ Displays are numbered starting from 0. Example: :display 1.
+ Not supported in clojurescript.
+
+ :setup - A function to be called once when setting the sketch up.
+
+ :draw - A function to be repeatedly called at most n times per
+ second where n is the target frame-rate set for
+ the visualisation.
+
+ :host - String id of canvas element or DOM element itself.
+ Specifies host for the sketch. Must be specified in sketch,
+ may be omitted in defsketch. If ommitted in defsketch,
+ :host is set to the name of the sketch. If element with
+ specified id is not found on the page and page is empty -
+ new canvas element will be created. Used in clojurescript.
+
+ :focus-gained - Called when the sketch gains focus.
+ Not supported in clojurescript.
+
+ :focus-lost - Called when the sketch loses focus.
+ Not supported in clojurescript.
+
+ :mouse-entered - Called when the mouse enters the sketch window.
+
+ :mouse-exited - Called when the mouse leaves the sketch window
+
+ :mouse-pressed - Called every time a mouse button is pressed.
+
+ :mouse-released - Called every time a mouse button is released.
+
+ :mouse-clicked - called once after a mouse button has been pressed
+ and then released.
+
+ :mouse-moved - Called every time the mouse moves and a button is
+ not pressed.
+
+ :mouse-dragged - Called every time the mouse moves and a button is
+ pressed.
+
+ :mouse-wheel - Called every time mouse wheel is rotated.
+ Takes 1 argument - wheel rotation, an int.
+ Negative values if the mouse wheel was rotated
+ up/away from the user, and positive values
+ if the mouse wheel was rotated down/ towards the user
+
+ :key-pressed - Called every time any key is pressed.
+
+ :key-released - Called every time any key is released.
+
+ :key-typed - Called once every time non-modifier keys are
+ pressed.
+
+ :on-close - Called once, when sketch is closed
+ Not supported in clojurescript.
+
+ :middleware - Vector of middleware to be applied to the sketch.
+ Middleware will be applied in the same order as in comp
+ function: [f g] will be applied as (f (g options)).
+
+ :settings - cousin of :setup. A function to be called once when
+ setting sketch up. Should be used only for (smooth) and
+ (no-smooth). Due to Processing limitations these functions
+ cannot be used neither in :setup nor in :draw."
+ [app-name & options]
+ #?(:clj
+ (if (u/clj-compilation?)
+ `(ap/defapplet ~app-name ~@options)
+ `(quil.sketch/defsketch ~app-name ~@options))
+ :cljs
+ `(quil.sketch$macros/defsketch ~app-name ~@options)))
+
+(defn ^{:requires-bindings false
+ :processing-name nil
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "1.6"}
+ key-coded?
+ "Returns true if char c is a 'coded' char i.e. it is necessary to
+ fetch the key-code as an integer and use that to determine the
+ specific key pressed. See key-keyword."
+ [c]
+ #?(:clj (= PConstants/CODED (int c))
+ ; See https://github.com/google/closure-compiler/issues/1676
+ :cljs (= 65535 (.charCodeAt (js/String c)))))
+
+(defn ^{:requires-bindings true
+ :processing-name nil
+ :category "Input"
+ :subcategory "Keyboard"
+ :added "1.6"}
+ key-as-keyword
+ "Returns a keyword representing the currently pressed key. Modifier
+ keys are represented as: :up, :down, :left, :right, :alt, :control,
+ :shift, :command, :f1-24"
+ []
+ (let [key-char (raw-key)
+ code (key-code)]
+ (if (key-coded? key-char)
+ (get KEY-CODES code :unknown-key)
+ ; Workaround for closure compiler incorrect string casts.
+ ; See https://github.com/google/closure-compiler/issues/1676
+ (keyword #?(:clj (str key-char)
+ :cljs (js/String key-char))))))
+
+#?(:clj
+ (defn
+ ^{:requires-bindings false
+ :processing-name nil
+ :category "Debugging"
+ :added "1.6"}
+ debug
+ "Prints msg and then sleeps the current thread for delay-ms. Useful
+ for debugging live running sketches. delay-ms defaults to 300. "
+ ([msg] (debug msg 300))
+ ([msg delay-ms]
+ (println msg)
+ (Thread/sleep delay-ms))))
+
+;;; doc utils
+
+#?(:clj
+ (def ^{:private true}
+ fn-metas
+ "Returns a seq of metadata maps for all fns related to the original
+ Processing API (but may not have a direct Processing API equivalent)."
+ (->> *ns* ns-publics vals (map meta))))
+
+#?(:clj
+ (defn show-cats
+ "Print out a list of all the categories and subcategories,
+ associated index nums and fn count (in parens)."
+ []
+ (doseq [[cat-idx cat] (docs/sorted-category-map fn-metas)]
+ (println cat-idx (:name cat))
+ (doseq [[subcat-idx subcat] (:subcategories cat)]
+ (println " " subcat-idx (:name subcat))))))
+
+#?(:clj
+ (defn show-fns
+ "If given a number, print all the functions within category or
+ subcategory specified by the category index (use show-cats to see a
+ list of index nums).
+
+ If given a string or a regular expression, print all the functions
+ whose name or category name contains that string.
+
+ If a category is specified, it will not print out the fns in any of
+ cat's subcategories."
+ [q]
+ (letfn [(list-category [cid c & {:keys [only]}]
+ (let [category-fns (:fns c)
+ display-fns (if (nil? only)
+ category-fns
+ (clojure.set/intersection
+ (set only) (set category-fns)))
+ names (sort (map str display-fns))]
+ (when-not (empty? names))
+ (println cid (:name c))
+ (docs/pprint-wrapped-lines names :fromcolumn 4)))
+ (show-fns-by-cat-idx [cat-idx]
+ (let [c (get (docs/all-category-map fn-metas) (str cat-idx))]
+ (list-category cat-idx c)))
+ (show-fns-by-name-regex [re]
+ (doseq [[cid c] (sort-by key (docs/all-category-map fn-metas))]
+ (let [in-cat-name? (re-find re (:name c))
+ matching-fns (filter #(re-find re (str %)) (:fns c))
+ in-fn-names? (not (empty? matching-fns))]
+ (cond
+ in-cat-name? (list-category cid c) ;; print an entire category
+ in-fn-names? (list-category cid c :only matching-fns)))))]
+ (cond
+ (string? q) (show-fns-by-name-regex (re-pattern (str "(?i)" q)))
+ (isa? (type q) java.util.regex.Pattern) (show-fns-by-name-regex q)
+ :else (show-fns-by-cat-idx q)))))
+
+#?(:clj
+ (defn show-meths
+ "Takes a string representing the start of a method name in the
+ original Processing API and prints out all matches alongside the
+ Processing-core equivalent."
+ [orig-name]
+ (let [res (docs/matching-processing-methods fn-metas orig-name)]
+ (u/print-definition-list res))))
diff --git a/src/http/static/viz/2/quil/core.cljc.cache.json b/src/http/static/viz/2/quil/core.cljc.cache.json
new file mode 100644
index 0000000..e2cfeb3
--- /dev/null
+++ b/src/http/static/viz/2/quil/core.cljc.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:externs",["^ ","~$Processing",["^ ","~$prototype",["^ ","~$PConstants",["^ "]],"~$getInstanceById",["^ "]],"~$Math",["^ ","~$PI",["^ "]],"~$Error",["^ "],"~$PFont",["^ ","~$list",["^ "]],"~$String",["^ "],"~$Object",["^ ","~$charCodeAt",["^ "]]],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$quil.core","~:imports",null,"~:requires",["^ ","~$clojure.string","^F","~$org.processingjs.Processing","^G","~$ap","~$quil.sketch","^I","^I","~$u","~$quil.util","^J","^J"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$rotate-x",["^ ","~:category","Transform","~:protocol-inline",null,"~:meta",["^ ","^O","Transform","~:added","1.0","~:subcategory",null,"~:file","/home/mediocregopher/src/viz/out/quil/core.cljc","~:end-column",11,"~:processing-name","rotateX()","~:column",3,"~:requires-bindings",true,"~:line",3464,"~:end-line",3464,"~:arglists",["~#list",["~$quote",["^10",[["~$angle"]]]]],"~:doc","Rotates a shape around the x-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n (* PI 2)) or converted to radians with the radians function. Objects\n are always rotated around their relative position to the origin and\n positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-x HALF-PI) and then (rotate-x HALF-PI) is\n the same as (rotate-x PI). If rotate-x is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."],"^R","1.0","^B","~$quil.core/rotate-x","^S",null,"^T","out/quil/core.cljc","^U",11,"^V","rotateX()","~:method-params",["^10",[["^12"]]],"~:protocol-impl",null,"~:arglists-meta",["^10",[null,null]],"^W",1,"~:variadic?",false,"^X",true,"^Y",3458,"~:ret-tag","~$any","^Z",3464,"~:max-fixed-arity",1,"~:fn-var",true,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Rotates a shape around the x-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n (* PI 2)) or converted to radians with the radians function. Objects\n are always rotated around their relative position to the origin and\n positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-x HALF-PI) and then (rotate-x HALF-PI) is\n the same as (rotate-x PI). If rotate-x is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."],"~$text-modes",["^ ","^B","~$quil.core/text-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",68,"^U",12,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",68,"^W",2,"^Z",68,"^U",12],"~:tag","~$cljs.core/IMap"],"~$print-projection",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Camera","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",19,"^V","printProjection()","^W",3,"^X",true,"^Y",3098,"^Z",3098,"^[",["^10",["^11",["^10",[[]]]]],"^13","Prints the current projection matrix to std out. Useful for\n debugging"],"^R","1.0","^B","~$quil.core/print-projection","^S","Camera","^T","out/quil/core.cljc","^U",19,"^V","printProjection()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3092,"^19","^1:","^Z",3098,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Prints the current projection matrix to std out. Useful for\n debugging"],"~$raw-key",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Keyboard","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","key","^W",3,"^X",true,"^Y",3257,"^Z",3257,"^[",["^10",["^11",["^10",[[]]]]],"^13","Contains the value of the most recent key on the keyboard that was\n used (either pressed or released).\n\n For non-ASCII keys, use the keyCode variable. The keys included in\n the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and\n DELETE) do not require checking to see if they key is coded, and you\n should simply use the key variable instead of keyCode If you're\n making cross-platform projects, note that the ENTER key is commonly\n used on PCs and Unix and the RETURN key is used instead on\n Macintosh. Check for both ENTER and RETURN to make sure your program\n will work for all platforms."],"^R","1.0","^B","~$quil.core/raw-key","^S","Keyboard","^T","out/quil/core.cljc","^U",10,"^V","key","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3251,"^19","^1:","^Z",3257,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Contains the value of the most recent key on the keyboard that was\n used (either pressed or released).\n\n For non-ASCII keys, use the keyCode variable. The keys included in\n the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and\n DELETE) do not require checking to see if they key is coded, and you\n should simply use the key variable instead of keyCode If you're\n making cross-platform projects, note that the ENTER key is commonly\n used on PCs and Unix and the RETURN key is used instead on\n Macintosh. Check for both ENTER and RETURN to make sure your program\n will work for all platforms."],"~$text-char",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"~:top-fn",["^ ","^18",false,"^1;",4,"^15",["^10",[["~$c","~$x","~$y"],["~$c","~$x","~$y","~$z"]]],"^[",["^10",[["~$c","~$x","~$y"],["~$c","~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","text()","^W",3,"^X",true,"^Y",4144,"^Z",4144,"^[",["^10",["^11",["^10",[["~$c","~$x","~$y"],["~$c","~$x","~$y","~$z"]]]]],"^13","Draws a char to the screen in the specified position. See text fn\n for more details."],"^R","1.0","^B","~$quil.core/text-char","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["~$c","~$x","~$y"],["~$c","~$x","~$y","~$z"]]],"^[",["^10",[["~$c","~$x","~$y"],["~$c","~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","text()","^15",["^10",[["~$c","~$x","~$y"],["~$c","~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4138,"^Z",4144,"^1;",4,"^1<",true,"^[",["^10",[["~$c","~$x","~$y"],["~$c","~$x","~$y","~$z"]]],"^13","Draws a char to the screen in the specified position. See text fn\n for more details."],"~$display-filter",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Pixels","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",17,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["~$mode"],["^1I","~$level"]]],"^[",["^10",[["^1I"],["^1I","^1J"]]],"^17",["^10",[null,null]]],"^V","filter()","^W",3,"^X",true,"^Y",1777,"^Z",1777,"^[",["^10",["^11",["^10",[["^1I"],["^1I","^1J"]]]]],"^13","Originally named filter in Processing Language.\n Filters the display window with the specified mode and level.\n Level defines the quality of the filter and mode may be one of the\n following keywords:\n\n :threshold - converts the image to black and white pixels depending\n if they are above or below the threshold defined by\n the level parameter. The level must be between\n 0.0 (black) and 1.0 (white). If no level is specified,\n 0.5 is used.\n :gray - converts any colors in the image to grayscale\n equivalents. Doesn't work with level.\n :invert - sets each pixel to its inverse value. Doesn't work with\n level.\n :posterize - limits each channel of the image to the number of\n colors specified as the level parameter. The parameter can\n be set to values between 2 and 255, but results are most\n noticeable in the lower ranges.\n :blur - executes a Guassian blur with the level parameter\n specifying the extent of the blurring. If no level\n parameter is used, the blur is equivalent to Guassian\n blur of radius 1.\n :opaque - sets the alpha channel to entirely opaque. Doesn't work\n with level.\n :erode - reduces the light areas. Doesn't work with level.\n :dilate - increases the light areas. Doesn't work with level."],"^R","1.0","^B","~$quil.core/display-filter","^S","Pixels","^T","out/quil/core.cljc","^U",17,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^1I"],["^1I","^1J"]]],"^[",["^10",[["^1I"],["^1I","^1J"]]],"^17",["^10",[null,null]]],"^V","filter()","^15",["^10",[["^1I"],["^1I","^1J"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1771,"^Z",1777,"^1;",2,"^1<",true,"^[",["^10",[["^1I"],["^1I","^1J"]]],"^13","Originally named filter in Processing Language.\n Filters the display window with the specified mode and level.\n Level defines the quality of the filter and mode may be one of the\n following keywords:\n\n :threshold - converts the image to black and white pixels depending\n if they are above or below the threshold defined by\n the level parameter. The level must be between\n 0.0 (black) and 1.0 (white). If no level is specified,\n 0.5 is used.\n :gray - converts any colors in the image to grayscale\n equivalents. Doesn't work with level.\n :invert - sets each pixel to its inverse value. Doesn't work with\n level.\n :posterize - limits each channel of the image to the number of\n colors specified as the level parameter. The parameter can\n be set to values between 2 and 255, but results are most\n noticeable in the lower ranges.\n :blur - executes a Guassian blur with the level parameter\n specifying the extent of the blurring. If no level\n parameter is used, the blur is equivalent to Guassian\n blur of radius 1.\n :opaque - sets the alpha channel to entirely opaque. Doesn't work\n with level.\n :erode - reduces the light areas. Doesn't work with level.\n :dilate - increases the light areas. Doesn't work with level."],"~$rotate-z",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^V","rotateZ()","^W",3,"^X",true,"^Y",3506,"^Z",3506,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Rotates a shape around the z-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0\n to (* PI 2)) or converted to radians with the radians function.\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-z HALF-PI) and then (rotate-z HALF-PI) is\n the same as (rotate-z PI). If rotate-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."],"^R","1.0","^B","~$quil.core/rotate-z","^S",null,"^T","out/quil/core.cljc","^U",11,"^V","rotateZ()","^15",["^10",[["^12"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3500,"^19","^1:","^Z",3506,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Rotates a shape around the z-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0\n to (* PI 2)) or converted to radians with the radians function.\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-z HALF-PI) and then (rotate-z HALF-PI) is\n the same as (rotate-z PI). If rotate-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."],"~$random-gaussian",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","2.0","^S","Random","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",18,"^V","randomGaussian()","^W",3,"^X",true,"^Y",3226,"^Z",3226,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns a float from a random series of numbers having a mean of 0 and\n standard deviation of 1. Each time the randomGaussian() function is called,\n it returns a number fitting a Gaussian, or normal, distribution.\n There is theoretically no minimum or maximum value that randomGaussian()\n might return. Rather, there is just a very low probability that values far\n from the mean will be returned; and a higher probability that numbers near\n the mean will be returned. ."],"^R","2.0","^B","~$quil.core/random-gaussian","^S","Random","^T","out/quil/core.cljc","^U",18,"^V","randomGaussian()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3220,"^19","^1:","^Z",3226,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns a float from a random series of numbers having a mean of 0 and\n standard deviation of 1. Each time the randomGaussian() function is called,\n it returns a number fitting a Gaussian, or normal, distribution.\n There is theoretically no minimum or maximum value that randomGaussian()\n might return. Rather, there is just a very low probability that values far\n from the mean will be returned; and a higher probability that numbers near\n the mean will be returned. ."],"~$blend",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Pixels","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",11,"^15",["^10",[["~$x","~$y","~$width","~$height","~$dx","~$dy","~$dwidth","~$dheight","^1I"],["~$src-img","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","~$dest-img","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"]]],"^[",["^10",[["~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","^1X","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"]]],"^17",["^10",[null,null,null]]],"^V","blend()","^W",3,"^X",true,"^Y",778,"^Z",778,"^[",["^10",["^11",["^10",[["~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","^1X","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"]]]]],"^13","Blends a region of pixels from one image into another with full alpha\n channel support. If src is not specified it defaults to current-graphics.\n If dest is not specified it defaults to current-graphics.\n\n Note: blend-mode function is recommended to use instead of this one.\n\n Available blend modes are:\n\n :blend - linear interpolation of colours: C = A*factor + B\n :add - additive blending with white clip:\n C = min(A*factor + B, 255)\n :subtract - subtractive blending with black clip:\n C = max(B - A*factor, 0)\n :darkest - only the darkest colour succeeds:\n C = min(A*factor, B)\n :lightest - only the lightest colour succeeds:\n C = max(A*factor, B)\n :difference - subtract colors from underlying image.\n :exclusion - similar to :difference, but less extreme.\n :multiply - Multiply the colors, result will always be darker.\n :screen - Opposite multiply, uses inverse values of the colors.\n :overlay - A mix of :multiply and :screen. Multiplies dark values\n and screens light values.\n :hard-light - :screen when greater than 50% gray, :multiply when\n lower.\n :soft-light - Mix of :darkest and :lightest. Works like :overlay,\n but not as harsh.\n :dodge - Lightens light tones and increases contrast, ignores\n darks.\n Called \"Color Dodge\" in Illustrator and Photoshop.\n :burn - Darker areas are applied, increasing contrast, ignores\n lights. Called \"Color Burn\" in Illustrator and\n Photoshop."],"^R","1.0","^B","~$quil.core/blend","^S","Pixels","^T","out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",11,"^15",["^10",[["~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","^1X","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"]]],"^[",["^10",[["~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","^1X","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"]]],"^17",["^10",[null,null,null]]],"^V","blend()","^15",["^10",[["~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","^1X","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",772,"^Z",778,"^1;",11,"^1<",true,"^[",["^10",[["~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"],["^1W","^1X","~$x","~$y","^1Q","^1R","^1S","^1T","^1U","^1V","^1I"]]],"^13","Blends a region of pixels from one image into another with full alpha\n channel support. If src is not specified it defaults to current-graphics.\n If dest is not specified it defaults to current-graphics.\n\n Note: blend-mode function is recommended to use instead of this one.\n\n Available blend modes are:\n\n :blend - linear interpolation of colours: C = A*factor + B\n :add - additive blending with white clip:\n C = min(A*factor + B, 255)\n :subtract - subtractive blending with black clip:\n C = max(B - A*factor, 0)\n :darkest - only the darkest colour succeeds:\n C = min(A*factor, B)\n :lightest - only the lightest colour succeeds:\n C = max(A*factor, B)\n :difference - subtract colors from underlying image.\n :exclusion - similar to :difference, but less extreme.\n :multiply - Multiply the colors, result will always be darker.\n :screen - Opposite multiply, uses inverse values of the colors.\n :overlay - A mix of :multiply and :screen. Multiplies dark values\n and screens light values.\n :hard-light - :screen when greater than 50% gray, :multiply when\n lower.\n :soft-light - Mix of :darkest and :lightest. Works like :overlay,\n but not as harsh.\n :dodge - Lightens light tones and increases contrast, ignores\n darks.\n Called \"Color Dodge\" in Illustrator and Photoshop.\n :burn - Darker areas are applied, increasing contrast, ignores\n lights. Called \"Color Burn\" in Illustrator and\n Photoshop."],"~$frame-count",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","frameCount","^W",3,"^X",true,"^Y",1853,"^Z",1853,"^[",["^10",["^11",["^10",[[]]]]],"^13","The system variable frameCount contains the number of frames\n displayed since the program started. Inside setup() the value is 0\n and after the first iteration of draw it is 1, etc."],"^R","1.0","^B","~$quil.core/frame-count","^S",null,"^T","out/quil/core.cljc","^U",14,"^V","frameCount","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1847,"^19","^1:","^Z",1853,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","The system variable frameCount contains the number of frames\n displayed since the program started. Inside setup() the value is 0\n and after the first iteration of draw it is 1, etc."],"~$with-graphics",["^ ","^O","Rendering","^P",null,"^Q",["^ ","^O","Rendering","^R","1.7","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["~$graphics","~$body"]]]],"^[",["^10",[["^21","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^W",3,"^X",true,"^Y",4709,"~:macro",true,"^Z",4709,"^[",["^10",["^11",["^10",[["^21","~$&","^22"]]]]],"^13","All subsequent calls of any drawing function will draw on given\n graphics. 'with-graphics' cannot be nested (you can draw simultaneously\n only on 1 graphics)"],"^R","1.7","^B","~$quil.core/with-graphics","^T","out/quil/core.cljc","^U",16,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["^21","^22"]]]],"^[",["^10",[["^21","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^15",["^10",[["^10",["^21","^22"]]]],"^16",null,"^17",["^10",[null]],"^W",1,"^18",true,"^X",true,"^Y",4704,"^23",true,"^19","^1:","^Z",4709,"^1;",1,"^1<",false,"^[",["^10",[["^21","~$&","^22"]]],"^13","All subsequent calls of any drawing function will draw on given\n graphics. 'with-graphics' cannot be nested (you can draw simultaneously\n only on 1 graphics)"],"~$model-y",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Coordinates","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","modelY()","^W",3,"^X",true,"^Y",2539,"^Z",2539,"^[",["^10",["^11",["^10",[["~$x","~$y","~$z"]]]]],"^13","Returns the three-dimensional x, y, z position in model space. This\n returns the y value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The y value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."],"^R","1.0","^B","~$quil.core/model-y","^S","Coordinates","^T","out/quil/core.cljc","^U",10,"^V","modelY()","^15",["^10",[["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2533,"^19","^1:","^Z",2539,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["~$x","~$y","~$z"]]]]],"^13","Returns the three-dimensional x, y, z position in model space. This\n returns the y value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The y value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."],"~$set-image",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Pixels","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","set()","^W",3,"^X",true,"^Y",3722,"^Z",3722,"^[",["^10",["^11",["^10",[["~$x","~$y","~$src"]]]]],"^13","Writes an image directly into the display window. The x and y\n parameters define the coordinates for the upper-left corner of the\n image."],"^R","1.0","^B","~$quil.core/set-image","^S","Pixels","^T","out/quil/core.cljc","^U",12,"^V","set()","^15",["^10",[["~$x","~$y","^28"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3716,"^19","^1:","^Z",3722,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["~$x","~$y","^28"]]]]],"^13","Writes an image directly into the display window. The x and y\n parameters define the coordinates for the upper-left corner of the\n image."],"~$shape-mode",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","shapeMode()","^W",3,"^X",true,"^Y",3825,"^Z",3825,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Modifies the location from which shapes draw. Available modes are\n :corner, :corners and :center. Default is :corner.\n\n :corner - specifies the location to be the upper left corner of the\n shape and uses the third and fourth parameters of shape\n to specify the width and height.\n\n :corners - uses the first and second parameters of shape to set\n the location of one corner and uses the third and fourth\n parameters to set the opposite corner.\n\n :center - draws the shape from its center point and uses the third\n and forth parameters of shape to specify the width and\n height. "],"^R","1.0","^B","~$quil.core/shape-mode","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",13,"^V","shapeMode()","^15",["^10",[["^1I"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3820,"^19","^1:","^Z",3825,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Modifies the location from which shapes draw. Available modes are\n :corner, :corners and :center. Default is :corner.\n\n :corner - specifies the location to be the upper left corner of the\n shape and uses the third and fourth parameters of shape\n to specify the width and height.\n\n :corners - uses the first and second parameters of shape to set\n the location of one corner and uses the third and fourth\n parameters to set the opposite corner.\n\n :center - draws the shape from its center point and uses the third\n and forth parameters of shape to specify the width and\n height. "],"~$cursor-image",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",17,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$img"],["^2=","~$hx","~$hy"]]],"^[",["^10",[["^2="],["^2=","^2>","^2?"]]],"^17",["^10",[null,null]]],"^V","cursor()","^W",5,"^X",true,"^Y",1307,"^Z",1307,"^[",["^10",["^11",["^10",[["^2="],["^2=","^2>","^2?"]]]]],"^13","Set the cursor to a predefined image. The horizontal and vertical\n active spots of the cursor may be specified with hx and hy.\n It is recommended to make the size 16x16 or 32x32 pixels."],"^R","1.0","^B","~$quil.core/cursor-image","^S",null,"^T","out/quil/core.cljc","^U",17,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^2="],["^2=","^2>","^2?"]]],"^[",["^10",[["^2="],["^2=","^2>","^2?"]]],"^17",["^10",[null,null]]],"^V","cursor()","^15",["^10",[["^2="],["^2=","^2>","^2?"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1301,"^Z",1307,"^1;",3,"^1<",true,"^[",["^10",[["^2="],["^2=","^2>","^2?"]]],"^13","Set the cursor to a predefined image. The horizontal and vertical\n active spots of the cursor may be specified with hx and hy.\n It is recommended to make the size 16x16 or 32x32 pixels."],"~$create-graphics",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Rendering","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",18,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["~$w","~$h"],["~$w","~$h","~$renderer"],["~$w","~$h","^2B","~$path"]]],"^[",["^10",[["~$w","~$h"],["~$w","~$h","^2B"],["~$w","~$h","^2B","^2C"]]],"^17",["^10",[null,null,null]]],"^V","createGraphics()","^W",3,"^X",true,"^Y",1204,"^Z",1204,"^[",["^10",["^11",["^10",[["~$w","~$h"],["~$w","~$h","^2B"],["~$w","~$h","^2B","^2C"]]]]],"^13","Creates and returns a new PGraphics object of the types :p2d, :p3d,\n :java2d, :pdf. By default :java2d is used. Use this class if you\n need to draw into an off-screen graphics buffer. It's not possible\n to use create-graphics with the :opengl renderer, because it doesn't\n allow offscreen use. The :pdf renderer requires the filename parameter.\n\n Note: don't use create-graphics in draw in clojurescript, it leaks memory.\n You should create graphic in setup and reuse it in draw instead of creating\n a new one.\n\n It's important to call any drawing commands between (.beginDraw graphics) and\n (.endDraw graphics) statements or use with-graphics macro. This is also true\n for any commands that affect drawing, such as smooth or color-mode.\n\n If you're using :pdf renderer - don't forget to call (.dispose graphics)\n as last command inside with-graphics macro, otherwise graphics won't be\n saved.\n\n Unlike the main drawing surface which is completely opaque, surfaces\n created with create-graphics can have transparency. This makes it\n possible to draw into a graphics and maintain the alpha channel. By\n using save to write a PNG or TGA file, the transparency of the\n graphics object will be honored."],"^R","1.0","^B","~$quil.core/create-graphics","^S","Rendering","^T","out/quil/core.cljc","^U",18,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["~$w","~$h"],["~$w","~$h","^2B"],["~$w","~$h","^2B","^2C"]]],"^[",["^10",[["~$w","~$h"],["~$w","~$h","^2B"],["~$w","~$h","^2B","^2C"]]],"^17",["^10",[null,null,null]]],"^V","createGraphics()","^15",["^10",[["~$w","~$h"],["~$w","~$h","^2B"],["~$w","~$h","^2B","^2C"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",1198,"^Z",1204,"^1;",4,"^1<",true,"^[",["^10",[["~$w","~$h"],["~$w","~$h","^2B"],["~$w","~$h","^2B","^2C"]]],"^13","Creates and returns a new PGraphics object of the types :p2d, :p3d,\n :java2d, :pdf. By default :java2d is used. Use this class if you\n need to draw into an off-screen graphics buffer. It's not possible\n to use create-graphics with the :opengl renderer, because it doesn't\n allow offscreen use. The :pdf renderer requires the filename parameter.\n\n Note: don't use create-graphics in draw in clojurescript, it leaks memory.\n You should create graphic in setup and reuse it in draw instead of creating\n a new one.\n\n It's important to call any drawing commands between (.beginDraw graphics) and\n (.endDraw graphics) statements or use with-graphics macro. This is also true\n for any commands that affect drawing, such as smooth or color-mode.\n\n If you're using :pdf renderer - don't forget to call (.dispose graphics)\n as last command inside with-graphics macro, otherwise graphics won't be\n saved.\n\n Unlike the main drawing surface which is completely opaque, surfaces\n created with create-graphics can have transparency. This makes it\n possible to draw into a graphics and maintain the alpha channel. By\n using save to write a PNG or TGA file, the transparency of the\n graphics object will be honored."],"~$update-pixels",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Pixels","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^2="]]],"^[",["^10",[[],["^2="]]],"^17",["^10",[null,null]]],"^V","updatePixels()","^W",3,"^X",true,"^Y",4551,"^Z",4551,"^[",["^10",["^11",["^10",[[],["^2="]]]]],"^13","Updates the display window or image with the data in the pixels array.\n Use in conjunction with (pixels). If you're only reading pixels from\n the array, there's no need to call update-pixels unless there are\n changes.\n\n Certain renderers may or may not seem to require pixels or\n update-pixels. However, the rule is that any time you want to\n manipulate the pixels array, you must first call pixels, and\n after changes have been made, call update-pixels. Even if the\n renderer may not seem to use this function in the current Processing\n release, this will always be subject to change."],"^R","1.0","^B","~$quil.core/update-pixels","^S","Pixels","^T","out/quil/core.cljc","^U",16,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^2="]]],"^[",["^10",[[],["^2="]]],"^17",["^10",[null,null]]],"^V","updatePixels()","^15",["^10",[[],["^2="]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4545,"^Z",4551,"^1;",1,"^1<",true,"^[",["^10",[[],["^2="]]],"^13","Updates the display window or image with the data in the pixels array.\n Use in conjunction with (pixels). If you're only reading pixels from\n the array, there's no need to call update-pixels unless there are\n changes.\n\n Certain renderers may or may not seem to require pixels or\n update-pixels. However, the rule is that any time you want to\n manipulate the pixels array, you must first call pixels, and\n after changes have been made, call update-pixels. Even if the\n renderer may not seem to use this function in the current Processing\n release, this will always be subject to change."],"~$text-size",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","textSize()","^W",3,"^X",true,"^Y",4336,"^Z",4336,"^[",["^10",["^11",["^10",[["~$size"]]]]],"^13","Sets the current font size. This size will be used in all\n subsequent calls to the text fn. Font size is measured in\n units of pixels."],"^R","1.0","^B","~$quil.core/text-size","^S","Attributes","^T","out/quil/core.cljc","^U",12,"^V","textSize()","^15",["^10",[["^2H"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4330,"^19","^1:","^Z",4336,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^2H"]]]]],"^13","Sets the current font size. This size will be used in all\n subsequent calls to the text fn. Font size is measured in\n units of pixels."],"~$pixels",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Pixels","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^2="]]],"^[",["^10",[[],["^2="]]],"^17",["^10",[null,null]]],"^V","pixels[]","^W",3,"^X",true,"^Y",2948,"^Z",2948,"^[",["^10",["^11",["^10",[[],["^2="]]]]],"^13","Array containing the values for all the pixels in the display\n window or image. This array is therefore the size of the display window. If\n this array is modified, the update-pixels fn must be called to update\n the changes. Calls .loadPixels before obtaining the pixel array."],"^R","1.0","^B","~$quil.core/pixels","^S","Pixels","^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^2="]]],"^[",["^10",[[],["^2="]]],"^17",["^10",[null,null]]],"^V","pixels[]","^15",["^10",[[],["^2="]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2942,"^Z",2948,"^1;",1,"^1<",true,"^[",["^10",[[],["^2="]]],"^13","Array containing the values for all the pixels in the display\n window or image. This array is therefore the size of the display window. If\n this array is modified, the update-pixels fn must be called to update\n the changes. Calls .loadPixels before obtaining the pixel array."],"~$stroke-float",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["~$gray"],["^2M","~$alpha"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^[",["^10",[["^2M"],["^2M","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","stroke()","^W",3,"^X",true,"^Y",4016,"^Z",4016,"^[",["^10",["^11",["^10",[["^2M"],["^2M","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]]]],"^13","Sets the color used to draw lines and borders around\n shapes. Converts all args to floats"],"^R","1.0","^B","~$quil.core/stroke-float","^S","Setting","^T","out/quil/core.cljc","^U",15,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^2M"],["^2M","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^[",["^10",[["^2M"],["^2M","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","stroke()","^15",["^10",[["^2M"],["^2M","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",4010,"^Z",4016,"^1;",4,"^1<",true,"^[",["^10",[["^2M"],["^2M","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^13","Sets the color used to draw lines and borders around\n shapes. Converts all args to floats"],"~$constrain",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","constrain()","^W",3,"^X",false,"^Y",1097,"^Z",1097,"^[",["^10",["^11",["^10",[["~$amt","~$low","~$high"]]]]],"^13","Constrains a value to not exceed a maximum and minimum value."],"^R","1.0","^B","~$quil.core/constrain","^S","Calculation","^T","out/quil/core.cljc","^U",12,"^V","constrain()","^15",["^10",[["^2Q","^2R","^2S"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",1091,"^19","^1:","^Z",1097,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["^2Q","^2R","^2S"]]]]],"^13","Constrains a value to not exceed a maximum and minimum value."],"~$screen-y",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Coordinates","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","screenY()","^W",3,"^X",true,"^Y",3655,"^Z",3655,"^[",["^10",["^11",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]]]],"^13","Takes a three-dimensional x, y, z position and returns the y value\n for where it will appear on a (two-dimensional) screen, once\n affected by translate, scale or any other transformations"],"^R","1.0","^B","~$quil.core/screen-y","^S","Coordinates","^T","out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","screenY()","^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3649,"^Z",3655,"^1;",3,"^1<",true,"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^13","Takes a three-dimensional x, y, z position and returns the y value\n for where it will appear on a (two-dimensional) screen, once\n affected by translate, scale or any other transformations"],"~$fill-float",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","^2N"]]],"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","^2N"]]],"^17",["^10",[null,null,null,null]]],"^V","fill()","^W",3,"^X",true,"^Y",1705,"^Z",1705,"^[",["^10",["^11",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","^2N"]]]]],"^13","Sets the color used to fill shapes. For example, (fill 204 102 0),\n will specify that all subsequent shapes will be filled with orange."],"^R","1.0","^B","~$quil.core/fill-float","^S","Setting","^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","^2N"]]],"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","^2N"]]],"^17",["^10",[null,null,null,null]]],"^V","fill()","^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","^2N"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",1699,"^Z",1705,"^1;",4,"^1<",true,"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","^2N"]]],"^13","Sets the color used to fill shapes. For example, (fill 204 102 0),\n will specify that all subsequent shapes will be filled with orange."],"~$rect",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","2D Primitives","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",8,"^15",["^10",[["~$x","~$y","^1Q","^1R"],["~$x","~$y","^1Q","^1R","~$r"],["~$x","~$y","^1Q","^1R","~$top-left-r","~$top-right-r","~$bottom-right-r","~$bottom-left-r"]]],"^[",["^10",[["~$x","~$y","^1Q","^1R"],["~$x","~$y","^1Q","^1R","~$r"],["~$x","~$y","^1Q","^1R","^2Z","^2[","^30","^31"]]],"^17",["^10",[null,null,null]]],"^V","rect()","^W",3,"^X",true,"^Y",3278,"^Z",3278,"^[",["^10",["^11",["^10",[["~$x","~$y","^1Q","^1R"],["~$x","~$y","^1Q","^1R","~$r"],["~$x","~$y","^1Q","^1R","^2Z","^2[","^30","^31"]]]]],"^13","Draws a rectangle to the screen. A rectangle is a four-sided shape\n with every angle at ninety degrees. By default, the first two\n parameters set the location of the upper-left corner, the third\n sets the width, and the fourth sets the height. These parameters\n may be changed with rect-mode.\n\n To draw a rounded rectangle, add a fifth parameter, which is used as\n the radius value for all four corners. To use a different radius value\n for each corner, include eight parameters."],"^R","1.0","^B","~$quil.core/rect","^S","2D Primitives","^T","out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",8,"^15",["^10",[["~$x","~$y","^1Q","^1R"],["~$x","~$y","^1Q","^1R","~$r"],["~$x","~$y","^1Q","^1R","^2Z","^2[","^30","^31"]]],"^[",["^10",[["~$x","~$y","^1Q","^1R"],["~$x","~$y","^1Q","^1R","~$r"],["~$x","~$y","^1Q","^1R","^2Z","^2[","^30","^31"]]],"^17",["^10",[null,null,null]]],"^V","rect()","^15",["^10",[["~$x","~$y","^1Q","^1R"],["~$x","~$y","^1Q","^1R","~$r"],["~$x","~$y","^1Q","^1R","^2Z","^2[","^30","^31"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",3272,"^Z",3278,"^1;",8,"^1<",true,"^[",["^10",[["~$x","~$y","^1Q","^1R"],["~$x","~$y","^1Q","^1R","~$r"],["~$x","~$y","^1Q","^1R","^2Z","^2[","^30","^31"]]],"^13","Draws a rectangle to the screen. A rectangle is a four-sided shape\n with every angle at ninety degrees. By default, the first two\n parameters set the location of the upper-left corner, the third\n sets the width, and the fourth sets the height. These parameters\n may be changed with rect-mode.\n\n To draw a rounded rectangle, add a fifth parameter, which is used as\n the radius value for all four corners. To use a different radius value\n for each corner, include eight parameters."],"~$log",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","log()","^W",3,"^X",false,"^Y",2429,"^Z",2429,"^[",["^10",["^11",["^10",[["~$val"]]]]],"^13","Calculates the natural logarithm (the base-e logarithm) of a\n number. This function expects the values greater than 0.0."],"^R","1.0","^B","~$quil.core/log","^S","Calculation","^T","out/quil/core.cljc","^U",6,"^V","log()","^15",["^10",[["^34"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",2423,"^19","^1:","^Z",2429,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^34"]]]]],"^13","Calculates the natural logarithm (the base-e logarithm) of a\n number. This function expects the values greater than 0.0."],"~$with-stroke",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.7","^S","Utility Macros","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["~$stroke-args","^22"]]]],"^[",["^10",[["^37","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^W",4,"^X",true,"^Y",4651,"^23",true,"^Z",4651,"^[",["^10",["^11",["^10",[["^37","~$&","^22"]]]]],"^13","Temporarily set the stroke color for the body of this macro.\n The code outside of with-stroke form will have the previous stroke color set.\n\n The stroke color has to be in a vector!\n Example: (with-stroke [255] ...)\n (with-stroke [10 80 98] ...)"],"^R","1.7","^B","~$quil.core/with-stroke","^S","Utility Macros","^T","out/quil/core.cljc","^U",15,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["^37","^22"]]]],"^[",["^10",[["^37","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^15",["^10",[["^10",["^37","^22"]]]],"^16",null,"^17",["^10",[null]],"^W",1,"^18",true,"^X",true,"^Y",4645,"^23",true,"^19","^1:","^Z",4651,"^1;",1,"^1<",false,"^[",["^10",[["^37","~$&","^22"]]],"^13","Temporarily set the stroke color for the body of this macro.\n The code outside of with-stroke form will have the previous stroke color set.\n\n The stroke color has to be in a vector!\n Example: (with-stroke [255] ...)\n (with-stroke [10 80 98] ...)"],"~$ambient-float",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Material Properties","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^[",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","ambient()","^W",3,"^X",true,"^Y",324,"^Z",324,"^[",["^10",["^11",["^10",[["^2M"],["~$x","~$y","~$z"]]]]],"^13","Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The\n color components set through the parameters define the\n reflectance. For example in the default color mode, setting x=255,\n y=126, z=0, would cause all the red light to reflect and half of the\n green light to reflect. Used in combination with emissive, specular,\n and shininess in setting the material properties of shapes."],"^R","1.0","^B","~$quil.core/ambient-float","^S","Material Properties","^T","out/quil/core.cljc","^U",16,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^[",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","ambient()","^15",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",318,"^Z",324,"^1;",3,"^1<",true,"^[",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^13","Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The\n color components set through the parameters define the\n reflectance. For example in the default color mode, setting x=255,\n y=126, z=0, would cause all the red light to reflect and half of the\n green light to reflect. Used in combination with emissive, specular,\n and shininess in setting the material properties of shapes."],"~$end-raw",["^ ","^O","Output","^P",null,"^Q",["^ ","^O","Output","^R","1.0","^S","Files","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","endRaw()","^W",3,"^X",true,"^Y",1638,"^Z",1638,"^[",["^10",["^11",["^10",[[]]]]],"^13","Complement to begin-raw; they must always be used together. See\n the begin-raw docstring for details."],"^R","1.0","^B","~$quil.core/end-raw","^S","Files","^T","out/quil/core.cljc","^U",10,"^V","endRaw()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1632,"^19","^1:","^Z",1638,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Complement to begin-raw; they must always be used together. See\n the begin-raw docstring for details."],"~$radians",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Trigonometry","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","radians()","^W",3,"^X",false,"^Y",3190,"^Z",3190,"^[",["^10",["^11",["^10",[["~$degrees"]]]]],"^13","Converts a degree measurement to its corresponding value in\n radians. Radians and degrees are two ways of measuring the same\n thing. There are 360 degrees in a circle and 2*PI radians in a\n circle. For example, 90° = PI/2 = 1.5707964. All trigonometric\n methods in Processing require their parameters to be specified in\n radians."],"^R","1.0","^B","~$quil.core/radians","^S","Trigonometry","^T","out/quil/core.cljc","^U",10,"^V","radians()","^15",["^10",[["^3>"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",3184,"^19","^1:","^Z",3190,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^3>"]]]]],"^13","Converts a degree measurement to its corresponding value in\n radians. Radians and degrees are two ways of measuring the same\n thing. There are 360 degrees in a circle and 2*PI radians in a\n circle. For example, 90° = PI/2 = 1.5707964. All trigonometric\n methods in Processing require their parameters to be specified in\n radians."],"^3>",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Trigonometry","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","degrees()","^W",3,"^X",false,"^Y",1438,"^Z",1438,"^[",["^10",["^11",["^10",[["^3="]]]]],"^13","Converts a radian measurement to its corresponding value in\n degrees. Radians and degrees are two ways of measuring the same\n thing. There are 360 degrees in a circle and (* 2 Math/PI) radians\n in a circle. For example, (= 90° (/ Math/PI 2) 1.5707964). All\n trigonometric methods in Processing require their parameters to be\n specified in radians."],"^R","1.0","^B","~$quil.core/degrees","^S","Trigonometry","^T","out/quil/core.cljc","^U",10,"^V","degrees()","^15",["^10",[["^3="]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",1432,"^19","^1:","^Z",1438,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^3="]]]]],"^13","Converts a radian measurement to its corresponding value in\n degrees. Radians and degrees are two ways of measuring the same\n thing. There are 360 degrees in a circle and (* 2 Math/PI) radians\n in a circle. For example, (= 90° (/ Math/PI 2) 1.5707964). All\n trigonometric methods in Processing require their parameters to be\n specified in radians."],"~$acos",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Trigonometry","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","acos()","^W",3,"^X",false,"^Y",299,"^Z",299,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","The inverse of cos, returns the arc cosine of a value. This\n function expects the values in the range of -1 to 1 and values are\n returned in the range 0 to Math/PI (3.1415927)."],"^R","1.0","^B","~$quil.core/acos","^S","Trigonometry","^T","out/quil/core.cljc","^U",7,"^V","acos()","^15",["^10",[["~$n"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",293,"^19","^1:","^Z",299,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","The inverse of cos, returns the arc cosine of a value. This\n function expects the values in the range of -1 to 1 and values are\n returned in the range 0 to Math/PI (3.1415927)."],"~$bezier-detail",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Curves","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^V","bezierDetail()","^W",3,"^X",true,"^Y",692,"^Z",692,"^[",["^10",["^11",["^10",[["~$detail"]]]]],"^13","Sets the resolution at which Beziers display. The default value is\n 20. This function is only useful when using the :p3d or :opengl\n renderer as the default (:java2d) renderer does not use this\n information."],"^R","1.0","^B","~$quil.core/bezier-detail","^S","Curves","^T","out/quil/core.cljc","^U",16,"^V","bezierDetail()","^15",["^10",[["^3D"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",686,"^19","^1:","^Z",692,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^3D"]]]]],"^13","Sets the resolution at which Beziers display. The default value is\n 20. This function is only useful when using the :p3d or :opengl\n renderer as the default (:java2d) renderer does not use this\n information."],"~$texture",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Vertex","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","texture()","^W",3,"^X",true,"^Y",4349,"^Z",4349,"^[",["^10",["^11",["^10",[["^2="]]]]],"^13","Sets a texture to be applied to vertex points. The texture fn must\n be called between begin-shape and end-shape and before any calls to\n vertex.\n\n When textures are in use, the fill color is ignored. Instead, use\n tint to specify the color of the texture as it is applied to the\n shape."],"^R","1.0","^B","~$quil.core/texture","^S","Vertex","^T","out/quil/core.cljc","^U",10,"^V","texture()","^15",["^10",[["^2="]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4343,"^19","^1:","^Z",4349,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^2="]]]]],"^13","Sets a texture to be applied to vertex points. The texture fn must\n be called between begin-shape and end-shape and before any calls to\n vertex.\n\n When textures are in use, the fill color is ignored. Instead, use\n tint to specify the color of the texture as it is applied to the\n shape."],"~$stroke-int",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["~$rgb"],["^3I","^2N"]]],"^[",["^10",[["^3I"],["^3I","^2N"]]],"^17",["^10",[null,null]]],"^V","stroke()","^W",3,"^X",true,"^Y",4030,"^Z",4030,"^[",["^10",["^11",["^10",[["^3I"],["^3I","^2N"]]]]],"^13","Sets the color used to draw lines and borders around\n shapes. Converts rgb to int and alpha to a float."],"^R","1.0","^B","~$quil.core/stroke-int","^S","Setting","^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^3I"],["^3I","^2N"]]],"^[",["^10",[["^3I"],["^3I","^2N"]]],"^17",["^10",[null,null]]],"^V","stroke()","^15",["^10",[["^3I"],["^3I","^2N"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4024,"^Z",4030,"^1;",2,"^1<",true,"^[",["^10",[["^3I"],["^3I","^2N"]]],"^13","Sets the color used to draw lines and borders around\n shapes. Converts rgb to int and alpha to a float."],"~$print-camera",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Camera","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","printCamera()","^W",3,"^X",true,"^Y",3076,"^Z",3076,"^[",["^10",["^11",["^10",[[]]]]],"^13","Prints the current camera matrix to std out. Useful for debugging."],"^R","1.0","^B","~$quil.core/print-camera","^S","Camera","^T","out/quil/core.cljc","^U",15,"^V","printCamera()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3070,"^19","^1:","^Z",3076,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Prints the current camera matrix to std out. Useful for debugging."],"~$floor",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","2.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^V","floor()","^W",3,"^X",false,"^Y",1830,"^Z",1830,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","Calculates the closest int value that is less than or equal to the\n value of the parameter. For example, (floor 9.03) returns the value 9."],"^R","2.0","^B","~$quil.core/floor","^S","Calculation","^T","out/quil/core.cljc","^U",8,"^V","floor()","^15",["^10",[["~$n"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",1824,"^19","^1:","^Z",1830,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","Calculates the closest int value that is less than or equal to the\n value of the parameter. For example, (floor 9.03) returns the value 9."],"~$atan2",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Trigonometry","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^V","atan2()","^W",3,"^X",false,"^Y",473,"^Z",473,"^[",["^10",["^11",["^10",[["~$y","~$x"]]]]],"^13","Calculates the angle (in radians) from a specified point to the\n coordinate origin as measured from the positive x-axis. Values are\n returned as a float in the range from PI to -PI. The atan2 function\n is most often used for orienting geometry to the position of the\n cursor. Note: The y-coordinate of the point is the first parameter\n and the x-coordinate is the second due to the structure of\n calculating the tangent."],"^R","1.0","^B","~$quil.core/atan2","^S","Trigonometry","^T","out/quil/core.cljc","^U",8,"^V","atan2()","^15",["^10",[["~$y","~$x"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",467,"^19","^1:","^Z",473,"^1;",2,"^1<",true,"^[",["^10",["^11",["^10",[["~$y","~$x"]]]]],"^13","Calculates the angle (in radians) from a specified point to the\n coordinate origin as measured from the positive x-axis. Values are\n returned as a float in the range from PI to -PI. The atan2 function\n is most often used for orienting geometry to the position of the\n cursor. Note: The y-coordinate of the point is the first parameter\n and the x-coordinate is the second due to the structure of\n calculating the tangent."],"~$millis",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Time & Date","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^V","millis()","^W",3,"^X",true,"^Y",2499,"^Z",2499,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the number of milliseconds (thousandths of a second) since\n starting the sketch. This information is often used for timing\n animation sequences."],"^R","1.0","^B","~$quil.core/millis","^S","Time & Date","^T","out/quil/core.cljc","^U",9,"^V","millis()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2493,"^19","^1:","^Z",2499,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the number of milliseconds (thousandths of a second) since\n starting the sketch. This information is often used for timing\n animation sequences."],"~$lerp-color",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","lerpColor()","^W",3,"^X",true,"^Y",2254,"^Z",2254,"^[",["^10",["^11",["^10",[["~$c1","~$c2","^2Q"]]]]],"^13","Calculates a color or colors between two color at a specific\n increment. The amt parameter is the amount to interpolate between\n the two values where 0.0 equal to the first point, 0.1 is very near\n the first point, 0.5 is half-way in between, etc."],"^R","1.0","^B","~$quil.core/lerp-color","^S","Creating & Reading","^T","out/quil/core.cljc","^U",13,"^V","lerpColor()","^15",["^10",[["^3T","^3U","^2Q"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2248,"^19","^1:","^Z",2254,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["^3T","^3U","^2Q"]]]]],"^13","Calculates a color or colors between two color at a specific\n increment. The amt parameter is the amount to interpolate between\n the two values where 0.0 equal to the first point, 0.1 is very near\n the first point, 0.5 is half-way in between, etc."],"~$image-modes",["^ ","^B","~$quil.core/image-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",61,"^U",13,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",61,"^W",2,"^Z",61,"^U",13],"^1?","^1@"],"~$no-fill-prop",["^ ","^B","~$quil.core/no-fill-prop","^T","out/quil/core.cljc","^Y",24,"^W",1,"^Z",24,"^U",35,"~:private",true,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",24,"^W",23,"^Z",24,"^U",35,"^3[",true],"^1?","~$string"],"~$color-mode",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[["^1I"],["^1I","~$max"],["^1I","~$max-x","~$max-y","~$max-z"],["^1I","^43","^44","^45","~$max-a"]]],"^[",["^10",[["^1I"],["^1I","^42"],["^1I","^43","^44","^45"],["^1I","^43","^44","^45","^46"]]],"^17",["^10",[null,null,null,null]]],"^V","colorMode()","^W",3,"^X",true,"^Y",1041,"^Z",1041,"^[",["^10",["^11",["^10",[["^1I"],["^1I","^42"],["^1I","^43","^44","^45"],["^1I","^43","^44","^45","^46"]]]]],"^13","Changes the way Processing interprets color data. Available modes\n are :rgb and :hsb.By default, the parameters for fill, stroke,\n background, and color are defined by values between 0 and 255 using\n the :rgb color model. The color-mode fn is used to change the\n numerical range used for specifying colors and to switch color\n systems. For example, calling\n (color-mode :rgb 1.0) will specify that values are specified between\n 0 and 1. The limits for defining colors are altered by setting the\n parameters range1, range2, range3, and range 4."],"^R","1.0","^B","~$quil.core/color-mode","^S","Creating & Reading","^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[["^1I"],["^1I","^42"],["^1I","^43","^44","^45"],["^1I","^43","^44","^45","^46"]]],"^[",["^10",[["^1I"],["^1I","^42"],["^1I","^43","^44","^45"],["^1I","^43","^44","^45","^46"]]],"^17",["^10",[null,null,null,null]]],"^V","colorMode()","^15",["^10",[["^1I"],["^1I","^42"],["^1I","^43","^44","^45"],["^1I","^43","^44","^45","^46"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",1035,"^Z",1041,"^1;",5,"^1<",true,"^[",["^10",[["^1I"],["^1I","^42"],["^1I","^43","^44","^45"],["^1I","^43","^44","^45","^46"]]],"^13","Changes the way Processing interprets color data. Available modes\n are :rgb and :hsb.By default, the parameters for fill, stroke,\n background, and color are defined by values between 0 and 255 using\n the :rgb color model. The color-mode fn is used to change the\n numerical range used for specifying colors and to switch color\n systems. For example, calling\n (color-mode :rgb 1.0) will specify that values are specified between\n 0 and 1. The limits for defining colors are altered by setting the\n parameters range1, range2, range3, and range 4."],"~$create-image",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","createImage()","^W",3,"^X",true,"^Y",1243,"^Z",1243,"^[",["^10",["^11",["^10",[["~$w","~$h","~$format"]]]]],"^13","Creates a new PImage (the datatype for storing images). This\n provides a fresh buffer of pixels to play with. Set the size of the\n buffer with the width and height parameters. The format parameter\n defines how the pixels are stored. See the PImage reference for more\n information.\n\n Possible formats: :rgb, :argb, :alpha (grayscale alpha channel)\n\n Prefer using create-image over initialising new PImage instances\n directly."],"^R","1.0","^B","~$quil.core/create-image","^S",null,"^T","out/quil/core.cljc","^U",15,"^V","createImage()","^15",["^10",[["~$w","~$h","^49"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1237,"^19","^1:","^Z",1243,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["~$w","~$h","^49"]]]]],"^13","Creates a new PImage (the datatype for storing images). This\n provides a fresh buffer of pixels to play with. Set the size of the\n buffer with the width and height parameters. The format parameter\n defines how the pixels are stored. See the PImage reference for more\n information.\n\n Possible formats: :rgb, :argb, :alpha (grayscale alpha channel)\n\n Prefer using create-image over initialising new PImage instances\n directly."],"~$sq",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",5,"^V","sq()","^W",3,"^X",false,"^Y",3975,"^Z",3975,"^[",["^10",["^11",["^10",[["~$a"]]]]],"^13","Squares a number (multiplies a number by itself). The result is\n always a positive number, as multiplying two negative numbers always\n yields a positive result. For example, -1 * -1 = 1."],"^R","1.0","^B","~$quil.core/sq","^S","Calculation","^T","out/quil/core.cljc","^U",5,"^V","sq()","^15",["^10",[["~$a"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",3969,"^19","^1:","^Z",3975,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$a"]]]]],"^13","Squares a number (multiplies a number by itself). The result is\n always a positive number, as multiplying two negative numbers always\n yields a positive result. For example, -1 * -1 = 1."],"^1R",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^V","getHeight()","^W",3,"~:processing-link",null,"^X",true,"^Y",1970,"^Z",1970,"^[",["^10",["^11",["^10",[[]]]]],"^13","Height of the display window. The value of height is zero until\n size is called."],"^R","1.0","^B","~$quil.core/height","^S",null,"^T","out/quil/core.cljc","^U",9,"^V","getHeight()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^4=",null,"^18",false,"^X",true,"^Y",1963,"^19","^1:","^Z",1970,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Height of the display window. The value of height is zero until\n size is called."],"~$no-loop",["^ ","^O","Structure","^P",null,"^Q",["^ ","^O","Structure","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","noLoop()","^W",3,"^X",true,"^Y",2799,"^Z",2799,"^[",["^10",["^11",["^10",[[]]]]],"^13","Stops Processing from continuously executing the code within\n draw. If start-loop is called, the code in draw will begin to run\n continuously again. If using no-loop in setup, it should be the last\n line inside the block.\n\n When no-loop is used, it's not possible to manipulate or access the\n screen inside event handling functions such as mouse-pressed or\n key-pressed. Instead, use those functions to call redraw or\n loop which will run draw, which can update the screen\n properly. This means that when no-loop has been called, no drawing\n can happen, and functions like save-frame may not be used.\n\n Note that if the sketch is resized, redraw will be called to\n update the sketch, even after no-oop has been\n specified. Otherwise, the sketch would enter an odd state until\n loop was called."],"^R","1.0","^B","~$quil.core/no-loop","^S",null,"^T","out/quil/core.cljc","^U",10,"^V","noLoop()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2793,"^19","^1:","^Z",2799,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Stops Processing from continuously executing the code within\n draw. If start-loop is called, the code in draw will begin to run\n continuously again. If using no-loop in setup, it should be the last\n line inside the block.\n\n When no-loop is used, it's not possible to manipulate or access the\n screen inside event handling functions such as mouse-pressed or\n key-pressed. Instead, use those functions to call redraw or\n loop which will run draw, which can update the screen\n properly. This means that when no-loop has been called, no drawing\n can happen, and functions like save-frame may not be used.\n\n Note that if the sketch is resized, redraw will be called to\n update the sketch, even after no-oop has been\n specified. Otherwise, the sketch would enter an odd state until\n loop was called."],"~$minute",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Time & Date","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^V","minute()","^W",3,"^X",false,"^Y",2512,"^Z",2512,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current minute as a value from 0 - 59"],"^R","1.0","^B","~$quil.core/minute","^S","Time & Date","^T","out/quil/core.cljc","^U",9,"^V","minute()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",2506,"^19","^1:","^Z",2512,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current minute as a value from 0 - 59"],"~$text",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[["~$s","~$x","~$y"],["~$s","~$x","~$y","~$z"],["~$s","~$x1","~$y1","~$x2","~$y2"]]],"^[",["^10",[["~$s","~$x","~$y"],["~$s","~$x","~$y","~$z"],["~$s","^4D","^4E","^4F","^4G"]]],"^17",["^10",[null,null,null]]],"^V","text()","^W",3,"^X",true,"^Y",4176,"^Z",4176,"^[",["^10",["^11",["^10",[["~$s","~$x","~$y"],["~$s","~$x","~$y","~$z"],["~$s","^4D","^4E","^4F","^4G"]]]]],"^13","Draws text to the screen in the position specified by the x and y\n parameters and the optional z parameter. A default font will be used\n unless a font is set with the text-font fn. Change the color of the\n text with the fill fn. The text displays in relation to the\n text-align fn, which gives the option to draw to the left, right, and\n center of the coordinates.\n\n The x1, y1, x2 and y2 parameters define a\n rectangular area to display within and may only be used with string\n data. For text drawn inside a rectangle, the coordinates are\n interpreted based on the current rect-mode setting."],"^R","1.0","^B","~$quil.core/text","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[["~$s","~$x","~$y"],["~$s","~$x","~$y","~$z"],["~$s","^4D","^4E","^4F","^4G"]]],"^[",["^10",[["~$s","~$x","~$y"],["~$s","~$x","~$y","~$z"],["~$s","^4D","^4E","^4F","^4G"]]],"^17",["^10",[null,null,null]]],"^V","text()","^15",["^10",[["~$s","~$x","~$y"],["~$s","~$x","~$y","~$z"],["~$s","^4D","^4E","^4F","^4G"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",4170,"^Z",4176,"^1;",5,"^1<",true,"^[",["^10",[["~$s","~$x","~$y"],["~$s","~$x","~$y","~$z"],["~$s","^4D","^4E","^4F","^4G"]]],"^13","Draws text to the screen in the position specified by the x and y\n parameters and the optional z parameter. A default font will be used\n unless a font is set with the text-font fn. Change the color of the\n text with the fill fn. The text displays in relation to the\n text-align fn, which gives the option to draw to the left, right, and\n center of the coordinates.\n\n The x1, y1, x2 and y2 parameters define a\n rectangular area to display within and may only be used with string\n data. For text drawn inside a rectangle, the coordinates are\n interpreted based on the current rect-mode setting."],"~$available-fonts",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",18,"^V","PFont.list()","^W",3,"^X",false,"^Y",491,"^Z",491,"^[",["^10",["^11",["^10",[[]]]]],"^13","A sequence of strings representing the fonts on this system\n available for use.\n\n Because of limitations in Java, not all fonts can be used and some\n might work with one operating system and not others. When sharing a\n sketch with other people or posting it on the web, you may need to\n include a .ttf or .otf version of your font in the data directory of\n the sketch because other people might not have the font installed on\n their computer. Only fonts that can legally be distributed should be\n included with a sketch."],"^R","1.0","^B","~$quil.core/available-fonts","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",18,"^V","PFont.list()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",485,"^19","~$seq","^Z",491,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","A sequence of strings representing the fonts on this system\n available for use.\n\n Because of limitations in Java, not all fonts can be used and some\n might work with one operating system and not others. When sharing a\n sketch with other people or posting it on the web, you may need to\n include a .ttf or .otf version of your font in the data directory of\n the sketch because other people might not have the font installed on\n their computer. Only fonts that can legally be distributed should be\n included with a sketch."],"~$rect-modes",["^ ","^B","~$quil.core/rect-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",62,"^U",12,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",62,"^W",2,"^Z",62,"^U",12],"^1?","^1@"],"~$THIRD-PI",["^ ","^B","~$quil.core/THIRD-PI","^T","out/quil/core.cljc","^Y",78,"^W",1,"^Z",78,"^U",14,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",78,"^W",6,"^Z",78,"^U",14],"^1?","~$number"],"~$binary",["^ ","^O","Data","^P",null,"^Q",["^ ","^O","Data","~:require-binding",false,"^R","1.0","^S","Conversion","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^34"],["^34","~$num-digits"]]],"^[",["^10",[["^34"],["^34","^4S"]]],"^17",["^10",[null,null]]],"^V","binary()","^W",3,"^Y",761,"^Z",761,"^[",["^10",["^11",["^10",[["^34"],["^34","^4S"]]]]],"^13","Returns a string representing the binary value of an int, char or\n byte. When converting an int to a string, it is possible to specify\n the number of digits used."],"^4R",false,"^R","1.0","^B","~$quil.core/binary","^S","Conversion","^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^34"],["^34","^4S"]]],"^[",["^10",[["^34"],["^34","^4S"]]],"^17",["^10",[null,null]]],"^V","binary()","^15",["^10",[["^34"],["^34","^4S"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^Y",755,"^Z",761,"^1;",2,"^1<",true,"^[",["^10",[["^34"],["^34","^4S"]]],"^13","Returns a string representing the binary value of an int, char or\n byte. When converting an int to a string, it is possible to specify\n the number of digits used."],"~$random-2d",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","2.6","^S","Random","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","random2d()","^W",3,"^X",true,"^Y",2678,"^Z",2678,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns a new 2D unit vector in a random direction"],"^R","2.6","^B","~$quil.core/random-2d","^S","Random","^T","out/quil/core.cljc","^U",12,"^V","random2d()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2672,"^19","~$cljs.core/IVector","^Z",2678,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns a new 2D unit vector in a random direction"],"~$pop-matrix",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","popMatrix()","^W",3,"^X",true,"^Y",3027,"^Z",3027,"^[",["^10",["^11",["^10",[[]]]]],"^13","Pops the current transformation matrix off the matrix\n stack. Understanding pushing and popping requires understanding the\n concept of a matrix stack. The push-matrix fn saves the current\n coordinate system to the stack and pop-matrix restores the prior\n coordinate system. push-matrix and pop-matrix are used in conjuction\n with the other transformation methods and may be embedded to control\n the scope of the transformations."],"^R","1.0","^B","~$quil.core/pop-matrix","^S",null,"^T","out/quil/core.cljc","^U",13,"^V","popMatrix()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3021,"^19","^1:","^Z",3027,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Pops the current transformation matrix off the matrix\n stack. Understanding pushing and popping requires understanding the\n concept of a matrix stack. The push-matrix fn saves the current\n coordinate system to the stack and pop-matrix restores the prior\n coordinate system. push-matrix and pop-matrix are used in conjuction\n with the other transformation methods and may be embedded to control\n the scope of the transformations."],"~$ceil",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","ceil()","^W",3,"^X",false,"^Y",972,"^Z",972,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","Calculates the closest int value that is greater than or equal to\n the value of the parameter. For example, (ceil 9.03) returns the\n value 10."],"^R","1.0","^B","~$quil.core/ceil","^S","Calculation","^T","out/quil/core.cljc","^U",7,"^V","ceil()","^15",["^10",[["~$n"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",966,"^19","^1:","^Z",972,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","Calculates the closest int value that is greater than or equal to\n the value of the parameter. For example, (ceil 9.03) returns the\n value 10."],"~$key-code",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Keyboard","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^V","keyCode","^W",3,"^X",true,"^Y",2168,"^Z",2168,"^[",["^10",["^11",["^10",[[]]]]],"^13","The variable keyCode is used to detect special keys such as the UP,\n DOWN, LEFT, RIGHT arrow keys and ALT, CONTROL, SHIFT. When checking\n for these keys, it's first necessary to check and see if the key is\n coded. This is done with the conditional (= (key) CODED).\n\n The keys included in the ASCII specification (BACKSPACE, TAB, ENTER,\n RETURN, ESC, and DELETE) do not require checking to see if they key\n is coded, and you should simply use the key variable instead of\n key-code If you're making cross-platform projects, note that the\n ENTER key is commonly used on PCs and Unix and the RETURN key is\n used instead on Macintosh. Check for both ENTER and RETURN to make\n sure your program will work for all platforms.\n\n For users familiar with Java, the values for UP and DOWN are simply\n shorter versions of Java's KeyEvent.VK_UP and\n KeyEvent.VK_DOWN. Other keyCode values can be found in the Java\n KeyEvent reference."],"^R","1.0","^B","~$quil.core/key-code","^S","Keyboard","^T","out/quil/core.cljc","^U",11,"^V","keyCode","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2162,"^19","^1:","^Z",2168,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","The variable keyCode is used to detect special keys such as the UP,\n DOWN, LEFT, RIGHT arrow keys and ALT, CONTROL, SHIFT. When checking\n for these keys, it's first necessary to check and see if the key is\n coded. This is done with the conditional (= (key) CODED).\n\n The keys included in the ASCII specification (BACKSPACE, TAB, ENTER,\n RETURN, ESC, and DELETE) do not require checking to see if they key\n is coded, and you should simply use the key variable instead of\n key-code If you're making cross-platform projects, note that the\n ENTER key is commonly used on PCs and Unix and the RETURN key is\n used instead on Macintosh. Check for both ENTER and RETURN to make\n sure your program will work for all platforms.\n\n For users familiar with Java, the values for UP and DOWN are simply\n shorter versions of Java's KeyEvent.VK_UP and\n KeyEvent.VK_DOWN. Other keyCode values can be found in the Java\n KeyEvent reference."],"~$sphere",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","3D Primitives","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^V","sphere()","^W",3,"^X",true,"^Y",3923,"^Z",3923,"^[",["^10",["^11",["^10",[["~$radius"]]]]],"^13","Generates a hollow ball made from tessellated triangles."],"^R","1.0","^B","~$quil.core/sphere","^S","3D Primitives","^T","out/quil/core.cljc","^U",9,"^V","sphere()","^15",["^10",[["^53"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3917,"^19","^1:","^Z",3923,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^53"]]]]],"^13","Generates a hollow ball made from tessellated triangles."],"~$request-image",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^V","requestImage()","^W",3,"^X",true,"^Y",3366,"^Z",3366,"^[",["^10",["^11",["^10",[["~$filename"]]]]],"^13","This function load images on a separate thread so that your sketch\n does not freeze while images load during setup. While the image is\n loading, its width and height will be 0. If an error occurs while\n loading the image, its width and height will be set to -1. You'll\n know when the image has loaded properly because its width and height\n will be greater than 0. Asynchronous image loading (particularly\n when downloading from a server) can dramatically improve\n performance."],"^R","1.0","^B","~$quil.core/request-image","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",16,"^V","requestImage()","^15",["^10",[["^56"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3360,"^19","^1:","^Z",3366,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^56"]]]]],"^13","This function load images on a separate thread so that your sketch\n does not freeze while images load during setup. While the image is\n loading, its width and height will be 0. If an error occurs while\n loading the image, its width and height will be set to -1. You'll\n know when the image has loaded properly because its width and height\n will be greater than 0. Asynchronous image loading (particularly\n when downloading from a server) can dramatically improve\n performance."],"~$hue",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","hue()","^W",3,"^X",true,"^Y",2064,"^Z",2064,"^[",["^10",["^11",["^10",[["~$col"]]]]],"^13","Extracts the hue value from a color."],"^R","1.0","^B","~$quil.core/hue","^S","Creating & Reading","^T","out/quil/core.cljc","^U",6,"^V","hue()","^15",["^10",[["^59"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2058,"^19","^1:","^Z",2064,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^59"]]]]],"^13","Extracts the hue value from a color."],"~$background-int",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",17,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^3I"],["^3I","^2N"]]],"^[",["^10",[["^3I"],["^3I","^2N"]]],"^17",["^10",[null,null]]],"^V","background()","^W",3,"^X",true,"^Y",532,"^Z",532,"^[",["^10",["^11",["^10",[["^3I"],["^3I","^2N"]]]]],"^13","Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts rgb to an int and alpha to a float."],"^R","1.0","^B","~$quil.core/background-int","^S","Setting","^T","out/quil/core.cljc","^U",17,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^3I"],["^3I","^2N"]]],"^[",["^10",[["^3I"],["^3I","^2N"]]],"^17",["^10",[null,null]]],"^V","background()","^15",["^10",[["^3I"],["^3I","^2N"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",526,"^Z",532,"^1;",2,"^1<",true,"^[",["^10",[["^3I"],["^3I","^2N"]]],"^13","Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts rgb to an int and alpha to a float."],"~$start-loop",["^ ","^O","Structure","^P",null,"^Q",["^ ","^O","Structure","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","loop()","^W",3,"^X",true,"^Y",4004,"^Z",4004,"^[",["^10",["^11",["^10",[[]]]]],"^13","Causes Processing to continuously execute the code within\n draw. If no-loop is called, the code in draw stops executing."],"^R","1.0","^B","~$quil.core/start-loop","^S",null,"^T","out/quil/core.cljc","^U",13,"^V","loop()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3998,"^19","^1:","^Z",4004,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Causes Processing to continuously execute the code within\n draw. If no-loop is called, the code in draw stops executing."],"~$no-fill?",["^ ","^P",null,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",4132,"^W",8,"^Z",4132,"^U",16,"^3[",true,"^[",["^10",["^11",["^10",[["^21"]]]]],"^13","Returns whether fill is disabled for current graphics."],"^3[",true,"^B","~$quil.core/no-fill?","^T","out/quil/core.cljc","^U",16,"^15",["^10",[["^21"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^Y",4132,"^19","~$boolean","^Z",4132,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^21"]]]]],"^13","Returns whether fill is disabled for current graphics."],"~$curve-vertex",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Vertex","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","curveVertex()","^W",3,"^X",true,"^Y",1407,"^Z",1407,"^[",["^10",["^11",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]]]],"^13","Specifies vertex coordinates for curves. This function may only be\n used between begin-shape and end-shape and only when there is no\n mode keyword specified to begin-shape. The first and last points in a\n series of curve-vertex lines will be used to guide the beginning and\n end of a the curve. A minimum of four points is required to draw a\n tiny curve between the second and third points. Adding a fifth point\n with curve-vertex will draw the curve between the second, third, and\n fourth points. The curve-vertex function is an implementation of\n Catmull-Rom splines."],"^R","1.0","^B","~$quil.core/curve-vertex","^S","Vertex","^T","out/quil/core.cljc","^U",15,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","curveVertex()","^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1401,"^Z",1407,"^1;",3,"^1<",true,"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^13","Specifies vertex coordinates for curves. This function may only be\n used between begin-shape and end-shape and only when there is no\n mode keyword specified to begin-shape. The first and last points in a\n series of curve-vertex lines will be used to guide the beginning and\n end of a the curve. A minimum of four points is required to draw a\n tiny curve between the second and third points. Adding a fifth point\n with curve-vertex will draw the curve between the second, third, and\n fourth points. The curve-vertex function is an implementation of\n Catmull-Rom splines."],"~$state-atom",["^ ","^O","State","^P",null,"^Q",["^ ","^O","State","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^W",3,"^X",true,"^Y",199,"^Z",199,"^[",["^10",["^11",["^10",[[]]]]],"^13","Retrieve sketch-specific state-atom. All changes to the\n atom will be reflected in the state.\n\n (set-state! :foo 1)\n (state :foo) ;=> 1\n (swap! (state-atom) update-in [:foo] inc)\n (state :foo) ;=> 2"],"^R","1.0","^B","~$quil.core/state-atom","^S",null,"^T","out/quil/core.cljc","^U",13,"^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",194,"^19","^1:","^Z",199,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Retrieve sketch-specific state-atom. All changes to the\n atom will be reflected in the state.\n\n (set-state! :foo 1)\n (state :foo) ;=> 1\n (swap! (state-atom) update-in [:foo] inc)\n (state :foo) ;=> 2"],"~$load-image",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","loadImage()","^W",3,"^X",true,"^Y",2373,"^Z",2373,"^[",["^10",["^11",["^10",[["^56"]]]]],"^13","Loads an image into a variable of type PImage. Four types of\n images ( .gif, .jpg, .tga, .png) images may be loaded. To load\n correctly, images must be located in the data directory of the\n current sketch. In most cases, load all images in setup to preload\n them at the start of the program. Loading images inside draw will\n reduce the speed of a program.\n\n The filename parameter can also be a URL to a file found online.\n\n If an image is not loaded successfully, the null value is returned\n and an error message will be printed to the console. The error\n message does not halt the program, however the null value may cause\n a NullPointerException if your code does not check whether the value\n returned from load-image is nil.\n\n Depending on the type of error, a PImage object may still be\n returned, but the width and height of the image will be set to\n -1. This happens if bad image data is returned or cannot be decoded\n properly. Sometimes this happens with image URLs that produce a 403\n error or that redirect to a password prompt, because load-image\n will attempt to interpret the HTML as image data."],"^R","1.0","^B","~$quil.core/load-image","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",13,"^V","loadImage()","^15",["^10",[["^56"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2367,"^19","^1:","^Z",2373,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^56"]]]]],"^13","Loads an image into a variable of type PImage. Four types of\n images ( .gif, .jpg, .tga, .png) images may be loaded. To load\n correctly, images must be located in the data directory of the\n current sketch. In most cases, load all images in setup to preload\n them at the start of the program. Loading images inside draw will\n reduce the speed of a program.\n\n The filename parameter can also be a URL to a file found online.\n\n If an image is not loaded successfully, the null value is returned\n and an error message will be printed to the console. The error\n message does not halt the program, however the null value may cause\n a NullPointerException if your code does not check whether the value\n returned from load-image is nil.\n\n Depending on the type of error, a PImage object may still be\n returned, but the width and height of the image will be set to\n -1. This happens if bad image data is returned or cannot be decoded\n properly. Sometimes this happens with image URLs that produce a 403\n error or that redirect to a password prompt, because load-image\n will attempt to interpret the HTML as image data."],"~$bezier",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Curves","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",12,"^15",["^10",[["^4D","^4E","~$cx1","~$cy1","~$cx2","~$cy2","^4F","^4G"],["^4D","^4E","~$z1","^5I","^5J","~$cz1","^5K","^5L","~$cz2","^4F","^4G","~$z2"]]],"^[",["^10",[["^4D","^4E","^5I","^5J","^5K","^5L","^4F","^4G"],["^4D","^4E","^5M","^5I","^5J","^5N","^5K","^5L","^5O","^4F","^4G","^5P"]]],"^17",["^10",[null,null]]],"^V","bezier()","^W",3,"^X",true,"^Y",667,"^Z",667,"^[",["^10",["^11",["^10",[["^4D","^4E","^5I","^5J","^5K","^5L","^4F","^4G"],["^4D","^4E","^5M","^5I","^5J","^5N","^5K","^5L","^5O","^4F","^4G","^5P"]]]]],"^13","Draws a Bezier curve on the screen. These curves are defined by a\n series of anchor and control points. The first two parameters\n specify the first anchor point and the last two parameters specify\n the other anchor point. The middle parameters specify the control\n points which define the shape of the curve."],"^R","1.0","^B","~$quil.core/bezier","^S","Curves","^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",12,"^15",["^10",[["^4D","^4E","^5I","^5J","^5K","^5L","^4F","^4G"],["^4D","^4E","^5M","^5I","^5J","^5N","^5K","^5L","^5O","^4F","^4G","^5P"]]],"^[",["^10",[["^4D","^4E","^5I","^5J","^5K","^5L","^4F","^4G"],["^4D","^4E","^5M","^5I","^5J","^5N","^5K","^5L","^5O","^4F","^4G","^5P"]]],"^17",["^10",[null,null]]],"^V","bezier()","^15",["^10",[["^4D","^4E","^5I","^5J","^5K","^5L","^4F","^4G"],["^4D","^4E","^5M","^5I","^5J","^5N","^5K","^5L","^5O","^4F","^4G","^5P"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",661,"^Z",667,"^1;",12,"^1<",true,"^[",["^10",[["^4D","^4E","^5I","^5J","^5K","^5L","^4F","^4G"],["^4D","^4E","^5M","^5I","^5J","^5N","^5K","^5L","^5O","^4F","^4G","^5P"]]],"^13","Draws a Bezier curve on the screen. These curves are defined by a\n series of anchor and control points. The first two parameters\n specify the first anchor point and the last two parameters specify\n the other anchor point. The middle parameters specify the control\n points which define the shape of the curve."],"~$smooth",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^1J"]]],"^[",["^10",[[],["^1J"]]],"^17",["^10",[null,null]]],"^V","smooth()","^W",3,"^X",true,"^Y",3877,"^Z",3877,"^[",["^10",["^11",["^10",[[],["^1J"]]]]],"^13","Draws all geometry with smooth (anti-aliased) edges. This will slow\n down the frame rate of the application, but will enhance the visual\n refinement.\n\n Must be called inside :settings handler.\n\n The level parameter (int) increases the level of smoothness with the\n P2D and P3D renderers. This is the level of over sampling applied to\n the graphics buffer. The value '2' will double the rendering size\n before scaling it down to the display size. This is called '2x\n anti-aliasing.' The value 4 is used for 4x anti-aliasing and 8 is\n specified for 8x anti-aliasing. If level is set to 0, it will disable\n all smoothing; it's the equivalent of the function noSmooth().\n The maximum anti-aliasing level is determined by the hardware of the\n machine that is running the software.\n\n Note that smooth will also improve image quality of resized images."],"^R","1.0","^B","~$quil.core/smooth","^S","Attributes","^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^1J"]]],"^[",["^10",[[],["^1J"]]],"^17",["^10",[null,null]]],"^V","smooth()","^15",["^10",[[],["^1J"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3871,"^Z",3877,"^1;",1,"^1<",true,"^[",["^10",[[],["^1J"]]],"^13","Draws all geometry with smooth (anti-aliased) edges. This will slow\n down the frame rate of the application, but will enhance the visual\n refinement.\n\n Must be called inside :settings handler.\n\n The level parameter (int) increases the level of smoothness with the\n P2D and P3D renderers. This is the level of over sampling applied to\n the graphics buffer. The value '2' will double the rendering size\n before scaling it down to the display size. This is called '2x\n anti-aliasing.' The value 4 is used for 4x anti-aliasing and 8 is\n specified for 8x anti-aliasing. If level is set to 0, it will disable\n all smoothing; it's the equivalent of the function noSmooth().\n The maximum anti-aliasing level is determined by the hardware of the\n machine that is running the software.\n\n Note that smooth will also improve image quality of resized images."],"~$filter-modes",["^ ","^B","~$quil.core/filter-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",71,"^U",14,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",71,"^W",2,"^Z",71,"^U",14],"^1?","^1@"],"~$shear-x",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","shearX()","^W",3,"^X",true,"^Y",3776,"^Z",3776,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Shears a shape around the x-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n PI*2) or converted to radians with the radians() function. Objects\n are always sheared around their relative position to the origin and\n positive numbers shear objects in a clockwise direction.\n Transformations apply to everything that happens after and\n subsequent calls to the function accumulates the effect. For\n example, calling (shear-x (/ PI 2)) and then (shear-x (/ PI 2)) is\n the same as (shear-x PI). If shear-x is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function works in P2D or JAVA2D mode.\n\n Technically, shear-x multiplies the current transformation matrix\n by a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix fns."],"^R","1.0","^B","~$quil.core/shear-x","^S",null,"^T","out/quil/core.cljc","^U",10,"^V","shearX()","^15",["^10",[["^12"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3770,"^19","^1:","^Z",3776,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Shears a shape around the x-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n PI*2) or converted to radians with the radians() function. Objects\n are always sheared around their relative position to the origin and\n positive numbers shear objects in a clockwise direction.\n Transformations apply to everything that happens after and\n subsequent calls to the function accumulates the effect. For\n example, calling (shear-x (/ PI 2)) and then (shear-x (/ PI 2)) is\n the same as (shear-x PI). If shear-x is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function works in P2D or JAVA2D mode.\n\n Technically, shear-x multiplies the current transformation matrix\n by a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix fns."],"~$stroke-weight",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^V","strokeWeight()","^W",3,"^X",true,"^Y",4100,"^Z",4100,"^[",["^10",["^11",["^10",[["~$weight"]]]]],"^13","Sets the width of the stroke used for lines, points, and the border\n around shapes. All widths are set in units of pixels. "],"^R","1.0","^B","~$quil.core/stroke-weight","^S","Attributes","^T","out/quil/core.cljc","^U",16,"^V","strokeWeight()","^15",["^10",[["^5Y"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4094,"^19","^1:","^Z",4100,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^5Y"]]]]],"^13","Sets the width of the stroke used for lines, points, and the border\n around shapes. All widths are set in units of pixels. "],"~$directional-light",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Lights","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",20,"^V","directionalLight()","^W",3,"^X",true,"^Y",1473,"^Z",1473,"^[",["^10",["^11",["^10",[["~$r","~$g","~$b","~$nx","~$ny","~$nz"]]]]],"^13","Adds a directional light. Directional light comes from one\n direction and is stronger when hitting a surface squarely and weaker\n if it hits at a gentle angle. After hitting a surface, a\n directional lights scatters in all directions. Lights need to be\n included in the draw fn to remain persistent in a looping\n program. Placing them in the setup fn of a looping program will cause\n them to only have an effect the first time through the loop. The\n affect of the r, g, and b parameters is determined by the current\n color mode. The nx, ny, and nz parameters specify the direction the\n light is facing. For example, setting ny to -1 will cause the\n geometry to be lit from below (the light is facing directly upward)"],"^R","1.0","^B","~$quil.core/directional-light","^S","Lights","^T","out/quil/core.cljc","^U",20,"^V","directionalLight()","^15",["^10",[["~$r","~$g","~$b","^60","^61","^62"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1467,"^19","^1:","^Z",1473,"^1;",6,"^1<",true,"^[",["^10",["^11",["^10",[["~$r","~$g","~$b","^60","^61","^62"]]]]],"^13","Adds a directional light. Directional light comes from one\n direction and is stronger when hitting a surface squarely and weaker\n if it hits at a gentle angle. After hitting a surface, a\n directional lights scatters in all directions. Lights need to be\n included in the draw fn to remain persistent in a looping\n program. Placing them in the setup fn of a looping program will cause\n them to only have an effect the first time through the loop. The\n affect of the r, g, and b parameters is determined by the current\n color mode. The nx, ny, and nz parameters specify the direction the\n light is facing. For example, setting ny to -1 will cause the\n geometry to be lit from below (the light is facing directly upward)"],"~$frame-rate",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","frameRate()","^W",3,"^X",true,"^Y",1879,"^Z",1879,"^[",["^10",["^11",["^10",[["~$new-rate"]]]]],"^13","Specifies a new target framerate (number of frames to be displayed every\n second). If the processor is not fast enough to maintain the\n specified rate, it will not be achieved. For example, the function\n call (frame-rate 30) will attempt to refresh 30 times a second. It\n is recommended to set the frame rate within setup. The default rate\n is 60 frames per second."],"^R","1.0","^B","~$quil.core/frame-rate","^S",null,"^T","out/quil/core.cljc","^U",13,"^V","frameRate()","^15",["^10",[["^65"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1873,"^19","^1:","^Z",1879,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^65"]]]]],"^13","Specifies a new target framerate (number of frames to be displayed every\n second). If the processor is not fast enough to maintain the\n specified rate, it will not be achieved. For example, the function\n call (frame-rate 30) will attempt to refresh 30 times a second. It\n is recommended to set the frame rate within setup. The default rate\n is 60 frames per second."],"~$hour",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Time & Date","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","hour()","^W",3,"^X",false,"^Y",2052,"^Z",2052,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current hour as a value from 0 - 23."],"^R","1.0","^B","~$quil.core/hour","^S","Time & Date","^T","out/quil/core.cljc","^U",7,"^V","hour()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",2046,"^19","^1:","^Z",2052,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current hour as a value from 0 - 23."],"~$fill-int",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^3I"],["^3I","^2N"]]],"^[",["^10",[["^3I"],["^3I","^2N"]]],"^17",["^10",[null,null]]],"^V","fill()","^W",3,"^X",true,"^Y",1727,"^Z",1727,"^[",["^10",["^11",["^10",[["^3I"],["^3I","^2N"]]]]],"^13","Sets the color used to fill shapes."],"^R","1.0","^B","~$quil.core/fill-int","^S","Setting","^T","out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^3I"],["^3I","^2N"]]],"^[",["^10",[["^3I"],["^3I","^2N"]]],"^17",["^10",[null,null]]],"^V","fill()","^15",["^10",[["^3I"],["^3I","^2N"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1721,"^Z",1727,"^1;",2,"^1<",true,"^[",["^10",[["^3I"],["^3I","^2N"]]],"^13","Sets the color used to fill shapes."],"~$atan",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Trigonometry","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","atan()","^W",3,"^X",false,"^Y",458,"^Z",458,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","The inverse of tan, returns the arc tangent of a value. This\n function expects the values in the range of -Infinity to\n Infinity (exclusive) and values are returned in the range -PI/2 to\n PI/2 ."],"^R","1.0","^B","~$quil.core/atan","^S","Trigonometry","^T","out/quil/core.cljc","^U",7,"^V","atan()","^15",["^10",[["~$n"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",452,"^19","^1:","^Z",458,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","The inverse of tan, returns the arc tangent of a value. This\n function expects the values in the range of -Infinity to\n Infinity (exclusive) and values are returned in the range -PI/2 to\n PI/2 ."],"~$stroke-join-modes",["^ ","^B","~$quil.core/stroke-join-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",65,"^U",19,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",65,"^W",2,"^Z",65,"^U",19],"^1?","^1@"],"~$rotate-y",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^V","rotateY()","^W",3,"^X",true,"^Y",3485,"^Z",3485,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Rotates a shape around the y-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0\n to (* PI 2)) or converted to radians with the radians function.\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-y HALF-PI) and then (rotate-y HALF-PI) is\n the same as (rotate-y PI). If rotate-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."],"^R","1.0","^B","~$quil.core/rotate-y","^S",null,"^T","out/quil/core.cljc","^U",11,"^V","rotateY()","^15",["^10",[["^12"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3479,"^19","^1:","^Z",3485,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Rotates a shape around the y-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0\n to (* PI 2)) or converted to radians with the radians function.\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a counterclockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate-y HALF-PI) and then (rotate-y HALF-PI) is\n the same as (rotate-y PI). If rotate-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function requires either the :p3d or :opengl renderer."],"~$day",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Time & Date","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","day()","^W",3,"^X",false,"^Y",1426,"^Z",1426,"^[",["^10",["^11",["^10",[[]]]]],"^13","Get the current day of the month (1 through 31)."],"^R","1.0","^B","~$quil.core/day","^S","Time & Date","^T","out/quil/core.cljc","^U",6,"^V","day()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",1420,"^19","^1:","^Z",1426,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Get the current day of the month (1 through 31)."],"~$point-light",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Lights","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","pointLight()","^W",3,"^X",true,"^Y",3011,"^Z",3011,"^[",["^10",["^11",["^10",[["~$r","~$g","~$b","~$x","~$y","~$z"]]]]],"^13","Adds a point light. Lights need to be included in the draw() to\n remain persistent in a looping program. Placing them in the setup()\n of a looping program will cause them to only have an effect the\n first time through the loop. The affect of the r, g, and b\n parameters is determined by the current color mode. The x, y, and z\n parameters set the position of the light"],"^R","1.0","^B","~$quil.core/point-light","^S","Lights","^T","out/quil/core.cljc","^U",14,"^V","pointLight()","^15",["^10",[["~$r","~$g","~$b","~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3005,"^19","^1:","^Z",3011,"^1;",6,"^1<",true,"^[",["^10",["^11",["^10",[["~$r","~$g","~$b","~$x","~$y","~$z"]]]]],"^13","Adds a point light. Lights need to be included in the draw() to\n remain persistent in a looping program. Placing them in the setup()\n of a looping program will cause them to only have an effect the\n first time through the loop. The affect of the r, g, and b\n parameters is determined by the current color mode. The x, y, and z\n parameters set the position of the light"],"~$pmouse-x",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Mouse","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^V","pmouseX","^W",3,"^X",true,"^Y",2973,"^Z",2973,"^[",["^10",["^11",["^10",[[]]]]],"^13","Horizontal coordinate of the mouse in the previous frame"],"^R","1.0","^B","~$quil.core/pmouse-x","^S","Mouse","^T","out/quil/core.cljc","^U",11,"^V","pmouseX","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2967,"^19","^1:","^Z",2973,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Horizontal coordinate of the mouse in the previous frame"],"~$get-sketch-by-id",["^ ","^O",null,"^P",null,"^Q",["^ ","^O",null,"^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",22,"^V","getSketchById()","^W",6,"^X",true,"^Y",185,"^Z",185,"^[",["^10",["^11",["^10",[["~$id"]]]]],"^13","Returns sketch object by id of canvas element of sketch."],"^R","1.0","^B","~$quil.core/get-sketch-by-id","^S",null,"^T","out/quil/core.cljc","^U",22,"^V","getSketchById()","^15",["^10",[["^6H"]]],"^16",null,"^17",["^10",[null,null]],"^W",4,"^18",false,"^X",true,"^Y",179,"^19","~$js","^Z",185,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^6H"]]]]],"^13","Returns sketch object by id of canvas element of sketch."],"~$stroke",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^3I"],["^3I","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^[",["^10",[["^3I"],["^3I","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","stroke()","^W",3,"^X",true,"^Y",4042,"^Z",4042,"^[",["^10",["^11",["^10",[["^3I"],["^3I","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]]]],"^13","Sets the color used to draw lines and borders around shapes. This\n color is either specified in terms of the RGB or HSB color depending\n on the current color-mode (the default color space is RGB, with\n each value in the range from 0 to 255)."],"^R","1.0","^B","~$quil.core/stroke","^S","Setting","^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^3I"],["^3I","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^[",["^10",[["^3I"],["^3I","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","stroke()","^15",["^10",[["^3I"],["^3I","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",4036,"^Z",4042,"^1;",4,"^1<",true,"^[",["^10",[["^3I"],["^3I","^2N"],["~$x","~$y","~$z"],["~$x","~$y","~$z","~$a"]]],"^13","Sets the color used to draw lines and borders around shapes. This\n color is either specified in terms of the RGB or HSB color depending\n on the current color-mode (the default color space is RGB, with\n each value in the range from 0 to 255)."],"~$mouse-pressed?",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Mouse","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",17,"^V","mousePressed","^W",3,"^X",true,"^Y",2606,"^Z",2606,"^[",["^10",["^11",["^10",[[]]]]],"^13","Variable storing if a mouse button is pressed. The value of the\n system variable mousePressed is true if a mouse button is pressed\n and false if a button is not pressed."],"^R","1.0","^B","~$quil.core/mouse-pressed?","^S","Mouse","^T","out/quil/core.cljc","^U",17,"^V","mousePressed","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2600,"^19","^1:","^Z",2606,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Variable storing if a mouse button is pressed. The value of the\n system variable mousePressed is true if a mouse button is pressed\n and false if a button is not pressed."],"~$key-pressed?",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Keyboard","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","keyPressed","^W",3,"^X",true,"^Y",2217,"^Z",2217,"^[",["^10",["^11",["^10",[[]]]]],"^13","true if any key is currently pressed, false otherwise."],"^R","1.0","^B","~$quil.core/key-pressed?","^S","Keyboard","^T","out/quil/core.cljc","^U",15,"^V","keyPressed","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2211,"^19","^1:","^Z",2217,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","true if any key is currently pressed, false otherwise."],"~$quadratic-vertex",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","2.0","^S","Vertex","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",19,"^1F",["^ ","^18",false,"^1;",6,"^15",["^10",[["~$cx","~$cy","~$x3","~$y3"],["^6R","^6S","~$cz","^6T","^6U","~$z3"]]],"^[",["^10",[["^6R","^6S","^6T","^6U"],["^6R","^6S","^6V","^6T","^6U","^6W"]]],"^17",["^10",[null,null]]],"^V","quadraticVertex()","^W",3,"^X",true,"^Y",3170,"^Z",3170,"^[",["^10",["^11",["^10",[["^6R","^6S","^6T","^6U"],["^6R","^6S","^6V","^6T","^6U","^6W"]]]]],"^13","Specifies vertex coordinates for quadratic Bezier curves. Each call to\n quadratic-vertex defines the position of one control points and one\n anchor point of a Bezier curve, adding a new segment to a line or shape.\n The first time quadratic-vertex is used within a begin-shape call, it\n must be prefaced with a call to vertex to set the first anchor point.\n This function must be used between begin-shape and end-shape and only\n when there is no MODE parameter specified to begin-shape. Using the 3D\n version requires rendering with :p3d."],"^R","2.0","^B","~$quil.core/quadratic-vertex","^S","Vertex","^T","out/quil/core.cljc","^U",19,"^1F",["^ ","^18",false,"^1;",6,"^15",["^10",[["^6R","^6S","^6T","^6U"],["^6R","^6S","^6V","^6T","^6U","^6W"]]],"^[",["^10",[["^6R","^6S","^6T","^6U"],["^6R","^6S","^6V","^6T","^6U","^6W"]]],"^17",["^10",[null,null]]],"^V","quadraticVertex()","^15",["^10",[["^6R","^6S","^6T","^6U"],["^6R","^6S","^6V","^6T","^6U","^6W"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3164,"^Z",3170,"^1;",6,"^1<",true,"^[",["^10",[["^6R","^6S","^6T","^6U"],["^6R","^6S","^6V","^6T","^6U","^6W"]]],"^13","Specifies vertex coordinates for quadratic Bezier curves. Each call to\n quadratic-vertex defines the position of one control points and one\n anchor point of a Bezier curve, adding a new segment to a line or shape.\n The first time quadratic-vertex is used within a begin-shape call, it\n must be prefaced with a call to vertex to set the first anchor point.\n This function must be used between begin-shape and end-shape and only\n when there is no MODE parameter specified to begin-shape. Using the 3D\n version requires rendering with :p3d."],"~$texture-wrap-modes",["^ ","^B","~$quil.core/texture-wrap-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",70,"^U",20,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",70,"^W",2,"^Z",70,"^U",20],"^1?","^1@"],"~$noise-seed",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Random","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","noiseSeed()","^W",3,"^X",true,"^Y",2771,"^Z",2771,"^[",["^10",["^11",["^10",[["^34"]]]]],"^13","Sets the seed value for noise. By default, noise produces different\n results each time the program is run. Set the value parameter to a\n constant to return the same pseudo-random numbers each time the\n software is run."],"^R","1.0","^B","~$quil.core/noise-seed","^S","Random","^T","out/quil/core.cljc","^U",13,"^V","noiseSeed()","^15",["^10",[["^34"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2765,"^19","^1:","^Z",2771,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^34"]]]]],"^13","Sets the seed value for noise. By default, noise produces different\n results each time the program is run. Set the value parameter to a\n constant to return the same pseudo-random numbers each time the\n software is run."],"~$apply-matrix",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","applyMatrix()","^W",3,"^X",true,"^Y",396,"^Z",396,"^[",["^10",["^11",["^10",[["~$n00","~$n01","~$n02","~$n03","~$n10","~$n11","~$n12","~$n13","~$n20","~$n21","~$n22","~$n23","~$n30","~$n31","~$n32","~$n33"]]]]],"^13","Multiplies the current matrix by the one specified through the\n parameters. This is very slow because it will try to calculate the\n inverse of the transform, so avoid it whenever possible. The\n equivalent function in OpenGL is glMultMatrix()."],"^R","1.0","^B","~$quil.core/apply-matrix","^S",null,"^T","out/quil/core.cljc","^U",15,"^V","applyMatrix()","^15",["^10",[["^72","^73","^74","^75","^76","^77","^78","^79","^7:","^7;","^7<","^7=","^7>","^7?","^7@","^7A"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",390,"^19","^1:","^Z",396,"^1;",16,"^1<",true,"^[",["^10",["^11",["^10",[["^72","^73","^74","^75","^76","^77","^78","^79","^7:","^7;","^7<","^7=","^7>","^7?","^7@","^7A"]]]]],"^13","Multiplies the current matrix by the one specified through the\n parameters. This is very slow because it will try to calculate the\n inverse of the transform, so avoid it whenever possible. The\n equivalent function in OpenGL is glMultMatrix()."],"~$copy",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Pixels","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[[["~$sx","~$sy","~$swidth","~$sheight"],["^1S","^1T","^1U","^1V"]],["^1W",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W","^1X",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]]]],"^[",["^10",[[["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W","^1X",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]]]],"^17",["^10",[null,null,null]]],"^V","copy()","^W",3,"^X",true,"^Y",1112,"^Z",1112,"^[",["^10",["^11",["^10",[[["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W","^1X",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]]]]]],"^13","Copies a region of pixels from the one image to another. If src-img\n is not specified it defaults to current-graphics. If dest-img is not\n specified - it defaults to current-graphics. If the source\n and destination regions aren't the same size, it will automatically\n resize the source pixels to fit the specified target region. No\n alpha information is used in the process, however if the source\n image has an alpha channel set, it will be copied as well. "],"^R","1.0","^B","~$quil.core/copy","^S","Pixels","^T","out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[[["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W","^1X",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]]]],"^[",["^10",[[["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W","^1X",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]]]],"^17",["^10",[null,null,null]]],"^V","copy()","^15",["^10",[[["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W","^1X",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",1106,"^Z",1112,"^1;",4,"^1<",true,"^[",["^10",[[["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]],["^1W","^1X",["^7D","^7E","^7F","^7G"],["^1S","^1T","^1U","^1V"]]]],"^13","Copies a region of pixels from the one image to another. If src-img\n is not specified it defaults to current-graphics. If dest-img is not\n specified - it defaults to current-graphics. If the source\n and destination regions aren't the same size, it will automatically\n resize the source pixels to fit the specified target region. No\n alpha information is used in the process, however if the source\n image has an alpha channel set, it will be copied as well. "],"~$random-3d",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","2.6","^S","Random","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","random3d()","^W",3,"^X",true,"^Y",2689,"^Z",2689,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns a new 3D unit vector in a random direction"],"^R","2.6","^B","~$quil.core/random-3d","^S","Random","^T","out/quil/core.cljc","^U",12,"^V","random3d()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2683,"^19","^4W","^Z",2689,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns a new 3D unit vector in a random direction"],"~$begin-shape",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Vertex","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^1I"]]],"^[",["^10",[[],["^1I"]]],"^17",["^10",[null,null]]],"^V","beginShape()","^W",3,"^X",true,"^Y",635,"^Z",635,"^[",["^10",["^11",["^10",[[],["^1I"]]]]],"^13","Enables the creation of complex forms. begin-shape begins recording\n vertices for a shape and end-shape stops recording. Use the mode\n keyword to specify which shape create from the provided\n vertices. With no mode specified, the shape can be any irregular\n polygon.\n\n The available mode keywords are :points, :lines, :triangles,\n :triangle-fan, :triangle-strip,\n :quads, :quad-strip.\n\n After calling the begin-shape function, a series of vertex commands\n must follow. To stop drawing the shape, call end-shape. The vertex\n function with two parameters specifies a position in 2D and the\n vertex function with three parameters specifies a position in\n 3D. Each shape will be outlined with the current stroke color and\n filled with the fill color.\n\n Transformations such as translate, rotate, and scale do not work\n within begin-shape. It is also not possible to use other shapes,\n such as ellipse or rect within begin-shape."],"^R","1.0","^B","~$quil.core/begin-shape","^S","Vertex","^T","out/quil/core.cljc","^U",14,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^1I"]]],"^[",["^10",[[],["^1I"]]],"^17",["^10",[null,null]]],"^V","beginShape()","^15",["^10",[[],["^1I"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",629,"^Z",635,"^1;",1,"^1<",true,"^[",["^10",[[],["^1I"]]],"^13","Enables the creation of complex forms. begin-shape begins recording\n vertices for a shape and end-shape stops recording. Use the mode\n keyword to specify which shape create from the provided\n vertices. With no mode specified, the shape can be any irregular\n polygon.\n\n The available mode keywords are :points, :lines, :triangles,\n :triangle-fan, :triangle-strip,\n :quads, :quad-strip.\n\n After calling the begin-shape function, a series of vertex commands\n must follow. To stop drawing the shape, call end-shape. The vertex\n function with two parameters specifies a position in 2D and the\n vertex function with three parameters specifies a position in\n 3D. Each shape will be outlined with the current stroke color and\n filled with the fill color.\n\n Transformations such as translate, rotate, and scale do not work\n within begin-shape. It is also not possible to use other shapes,\n such as ellipse or rect within begin-shape."],"~$set-state!",["^ ","^O","State","^P",null,"^Q",["^ ","^O","State","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",true,"^1;",0,"^15",[["^10",["~$state-vals"]]],"^[",["^10",[["~$&","^7N"]]],"^17",["^10",[null]]],"^W",3,"^X",true,"^Y",236,"^Z",236,"^[",["^10",["^11",["^10",[["~$&","^7N"]]]]],"^13","Set sketch-specific state. May only be called once (ideally in the\n setup fn). Subsequent calls have no effect.\n\n Example:\n (set-state! :foo 1 :bar (atom true) :baz (/ (width) 2))"],"^R","1.0","^B","~$quil.core/set-state!","^S",null,"^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",true,"^1;",0,"^15",[["^10",["^7N"]]],"^[",["^10",[["~$&","^7N"]]],"^17",["^10",[null]]],"^15",[["^10",["^7N"]]],"^16",null,"^17",["^10",[null]],"^W",1,"^18",true,"^X",true,"^Y",231,"^19","^1:","^Z",236,"^1;",0,"^1<",true,"^[",["^10",[["~$&","^7N"]]],"^13","Set sketch-specific state. May only be called once (ideally in the\n setup fn). Subsequent calls have no effect.\n\n Example:\n (set-state! :foo 1 :bar (atom true) :baz (/ (width) 2))"],"~$stroke-join",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","strokeJoin()","^W",3,"^X",true,"^Y",4080,"^Z",4080,"^[",["^10",["^11",["^10",[["~$join-mode"]]]]],"^13","Sets the style of the joints which connect line\n segments. These joints are either mitered, beveled, or rounded and\n specified with the corresponding parameters :miter, :bevel, and\n :round. The default joint is :miter.\n\n This function is not available with the :p2d, :p3d, or :opengl\n renderers."],"^R","1.0","^B","~$quil.core/stroke-join","^S","Attributes","^T","out/quil/core.cljc","^U",14,"^V","strokeJoin()","^15",["^10",[["^7Q"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4074,"^19","^1:","^Z",4080,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^7Q"]]]]],"^13","Sets the style of the joints which connect line\n segments. These joints are either mitered, beveled, or rounded and\n specified with the corresponding parameters :miter, :bevel, and\n :round. The default joint is :miter.\n\n This function is not available with the :p2d, :p3d, or :opengl\n renderers."],"~$cos",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Trigonometry","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","cos()","^W",3,"^X",false,"^Y",1138,"^Z",1138,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Calculates the cosine of an angle. This function expects the values\n of the angle parameter to be provided in radians (values from 0 to\n Math/PI*2). Values are returned in the range -1 to 1."],"^R","1.0","^B","~$quil.core/cos","^S","Trigonometry","^T","out/quil/core.cljc","^U",6,"^V","cos()","^15",["^10",[["^12"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",1132,"^19","^1:","^Z",1138,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Calculates the cosine of an angle. This function expects the values\n of the angle parameter to be provided in radians (values from 0 to\n Math/PI*2). Values are returned in the range -1 to 1."],"~$curve-tightness",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Curves","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",18,"^V","curveTightness()","^W",3,"^X",true,"^Y",1389,"^Z",1389,"^[",["^10",["^11",["^10",[["~$ti"]]]]],"^13","Modifies the quality of forms created with curve and\n curve-vertex. The parameter squishy determines how the curve fits\n to the vertex points. The value 0.0 is the default value for\n squishy (this value defines the curves to be Catmull-Rom splines)\n and the value 1.0 connects all the points with straight\n lines. Values within the range -5.0 and 5.0 will deform the curves\n but will leave them recognizable and as values increase in\n magnitude, they will continue to deform."],"^R","1.0","^B","~$quil.core/curve-tightness","^S","Curves","^T","out/quil/core.cljc","^U",18,"^V","curveTightness()","^15",["^10",[["^7V"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1383,"^19","^1:","^Z",1389,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^7V"]]]]],"^13","Modifies the quality of forms created with curve and\n curve-vertex. The parameter squishy determines how the curve fits\n to the vertex points. The value 0.0 is the default value for\n squishy (this value defines the curves to be Catmull-Rom splines)\n and the value 1.0 connects all the points with straight\n lines. Values within the range -5.0 and 5.0 will deform the curves\n but will leave them recognizable and as values increase in\n magnitude, they will continue to deform."],"~$tan",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Trigonometry","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","tan()","^W",3,"^X",false,"^Y",4112,"^Z",4112,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Calculates the ratio of the sine and cosine of an angle. This\n function expects the values of the angle parameter to be provided in\n radians (values from 0 to PI*2). Values are returned in the range\n infinity to -infinity."],"^R","1.0","^B","~$quil.core/tan","^S","Trigonometry","^T","out/quil/core.cljc","^U",6,"^V","tan()","^15",["^10",[["^12"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",4106,"^19","^1:","^Z",4112,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Calculates the ratio of the sine and cosine of an angle. This\n function expects the values of the angle parameter to be provided in\n radians (values from 0 to PI*2). Values are returned in the range\n infinity to -infinity."],"~$triangle",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","2D Primitives","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^V","triangle()","^W",3,"^X",true,"^Y",4509,"^Z",4509,"^[",["^10",["^11",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U"]]]]],"^13","A triangle is a plane created by connecting three points. The first\n two arguments specify the first point, the middle two arguments\n specify the second point, and the last two arguments specify the\n third point."],"^R","1.0","^B","~$quil.core/triangle","^S","2D Primitives","^T","out/quil/core.cljc","^U",11,"^V","triangle()","^15",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4503,"^19","^1:","^Z",4509,"^1;",6,"^1<",true,"^[",["^10",["^11",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U"]]]]],"^13","A triangle is a plane created by connecting three points. The first\n two arguments specify the first point, the middle two arguments\n specify the second point, and the last two arguments specify the\n third point."],"~$emissive",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Material Properties","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$c"],["~$r","~$g","~$b"]]],"^[",["^10",[["~$c"],["~$r","~$g","~$b"]]],"^17",["^10",[null,null]]],"^V","emissive()","^W",3,"^X",true,"^Y",1594,"^Z",1594,"^[",["^10",["^11",["^10",[["~$c"],["~$r","~$g","~$b"]]]]],"^13","Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes.\n\n If passed one arg - it is assumed to be an int (i.e. a color),\n multiple args are converted to floats."],"^R","1.0","^B","~$quil.core/emissive","^S","Material Properties","^T","out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$c"],["~$r","~$g","~$b"]]],"^[",["^10",[["~$c"],["~$r","~$g","~$b"]]],"^17",["^10",[null,null]]],"^V","emissive()","^15",["^10",[["~$c"],["~$r","~$g","~$b"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1588,"^Z",1594,"^1;",3,"^1<",true,"^[",["^10",[["~$c"],["~$r","~$g","~$b"]]],"^13","Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes.\n\n If passed one arg - it is assumed to be an int (i.e. a color),\n multiple args are converted to floats."],"~$clear-no-fill-cljs",["^ ","^P",null,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",1693,"^W",11,"^Z",1693,"^U",29,"^3[",true,"^[",["^10",["^11",["^10",[["^21"]]]]],"^13","Sets custom property on graphcs object indicating that it has\n fill color."],"^3[",true,"^B","~$quil.core/clear-no-fill-cljs","^T","out/quil/core.cljc","^U",29,"^15",["^10",[["^21"]]],"^16",null,"^17",["^10",[null,null]],"^W",4,"^18",false,"^Y",1693,"^19","^1:","^Z",1693,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^21"]]]]],"^13","Sets custom property on graphcs object indicating that it has\n fill color."],"~$sketch",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",true,"^1;",0,"^15",[["^10",["~$opts"]]],"^[",["^10",[["~$&","^85"]]],"^17",["^10",[null]]],"^W",3,"^X",false,"^Y",4724,"^Z",4724,"^[",["^10",["^11",["^10",[["~$&","^85"]]]]],"^13","Create and start a new visualisation applet. Can be used to create\n new sketches programmatically. See documentation for 'defsketch' for\n list of available options."],"^R","1.0","^B","~$quil.core/sketch","^S",null,"^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",true,"^1;",0,"^15",[["^10",["^85"]]],"^[",["^10",[["~$&","^85"]]],"^17",["^10",[null]]],"^15",[["^10",["^85"]]],"^16",null,"^17",["^10",[null]],"^W",1,"^18",true,"^X",false,"^Y",4720,"^19","^1:","^Z",4724,"^1;",0,"^1<",true,"^[",["^10",[["~$&","^85"]]],"^13","Create and start a new visualisation applet. Can be used to create\n new sketches programmatically. See documentation for 'defsketch' for\n list of available options."],"~$color",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","color()","^W",3,"^X",true,"^Y",1019,"^Z",1019,"^[",["^10",["^11",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]]]],"^13","Creates an integer representation of a color The parameters are\n interpreted as RGB or HSB values depending on the current\n color-mode. The default mode is RGB values from 0 to 255 and\n therefore, the function call (color 255 204 0) will return a bright\n yellow. Args are cast to floats.\n\n r - red or hue value\n g - green or saturation value\n b - blue or brightness value\n a - alpha value"],"^R","1.0","^B","~$quil.core/color","^S","Creating & Reading","^T","out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","color()","^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",1013,"^Z",1019,"^1;",4,"^1<",true,"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^13","Creates an integer representation of a color The parameters are\n interpreted as RGB or HSB values depending on the current\n color-mode. The default mode is RGB values from 0 to 255 and\n therefore, the function call (color 255 204 0) will return a bright\n yellow. Args are cast to floats.\n\n r - red or hue value\n g - green or saturation value\n b - blue or brightness value\n a - alpha value"],"~$arc",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","2D Primitives","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","arc()","^W",3,"^X",true,"^Y",422,"^Z",422,"^[",["^10",["^11",["^10",[["~$x","~$y","^1Q","^1R","~$start","~$stop"]]]]],"^13","Draws an arc in the display window. Arcs are drawn along the outer\n edge of an ellipse defined by the x, y, width and height\n parameters. The origin or the arc's ellipse may be changed with the\n ellipse-mode function. The start and stop parameters specify the\n angles at which to draw the arc. The mode is either :open, :chord or :pie."],"^R","1.0","^B","~$quil.core/arc","^S","2D Primitives","^T","out/quil/core.cljc","^U",6,"^V","arc()","^15",["^10",[["~$x","~$y","^1Q","^1R","^8:","^8;"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",416,"^19","^1:","^Z",422,"^1;",6,"^1<",true,"^[",["^10",["^11",["^10",[["~$x","~$y","^1Q","^1R","^8:","^8;"]]]]],"^13","Draws an arc in the display window. Arcs are drawn along the outer\n edge of an ellipse defined by the x, y, width and height\n parameters. The origin or the arc's ellipse may be changed with the\n ellipse-mode function. The start and stop parameters specify the\n angles at which to draw the arc. The mode is either :open, :chord or :pie."],"~$text-align",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["~$align"],["~$align-x","~$align-y"]]],"^[",["^10",[["^8>"],["^8?","^8@"]]],"^17",["^10",[null,null]]],"^V","textAlign()","^W",3,"^X",true,"^Y",4204,"^Z",4204,"^[",["^10",["^11",["^10",[["^8>"],["^8?","^8@"]]]]],"^13","Sets the current alignment for drawing text. Available modes are:\n\n horizontal - :left, :center, and :right\n vertical - :top, :bottom, :center, and :baseline\n\n An optional second parameter specifies the vertical alignment\n mode. :baseline is the default. The :top and :center parameters are\n straightforward. The :bottom parameter offsets the line based on the\n current text-descent. For multiple lines, the final line will be\n aligned to the bottom, with the previous lines appearing above it.\n\n When using text with width and height parameters, :baseline is\n ignored, and treated as :top. (Otherwise, text would by default draw\n outside the box, since :baseline is the default setting. :baseline is\n not a useful drawing mode for text drawn in a rectangle.)\n\n The vertical alignment is based on the value of text-ascent, which\n many fonts do not specify correctly. It may be necessary to use a\n hack and offset by a few pixels by hand so that the offset looks\n correct. To do this as less of a hack, use some percentage of\n text-ascent or text-descent so that the hack works even if you\n change the size of the font."],"^R","1.0","^B","~$quil.core/text-align","^S","Attributes","^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^8>"],["^8?","^8@"]]],"^[",["^10",[["^8>"],["^8?","^8@"]]],"^17",["^10",[null,null]]],"^V","textAlign()","^15",["^10",[["^8>"],["^8?","^8@"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4198,"^Z",4204,"^1;",2,"^1<",true,"^[",["^10",[["^8>"],["^8?","^8@"]]],"^13","Sets the current alignment for drawing text. Available modes are:\n\n horizontal - :left, :center, and :right\n vertical - :top, :bottom, :center, and :baseline\n\n An optional second parameter specifies the vertical alignment\n mode. :baseline is the default. The :top and :center parameters are\n straightforward. The :bottom parameter offsets the line based on the\n current text-descent. For multiple lines, the final line will be\n aligned to the bottom, with the previous lines appearing above it.\n\n When using text with width and height parameters, :baseline is\n ignored, and treated as :top. (Otherwise, text would by default draw\n outside the box, since :baseline is the default setting. :baseline is\n not a useful drawing mode for text drawn in a rectangle.)\n\n The vertical alignment is based on the value of text-ascent, which\n many fonts do not specify correctly. It may be necessary to use a\n hack and offset by a few pixels by hand so that the offset looks\n correct. To do this as less of a hack, use some percentage of\n text-ascent or text-descent so that the hack works even if you\n change the size of the font."],"~$text-width",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","textWidth()","^W",3,"^X",true,"^Y",4402,"^Z",4402,"^[",["^10",["^11",["^10",[["~$data"]]]]],"^13","Calculates and returns the width of any text string."],"^R","1.0","^B","~$quil.core/text-width","^S","Attributes","^T","out/quil/core.cljc","^U",13,"^V","textWidth()","^15",["^10",[["^8C"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4396,"^19","^1:","^Z",4402,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^8C"]]]]],"^13","Calculates and returns the width of any text string."],"~$mouse-x",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Mouse","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","mouseX","^W",3,"^X",true,"^Y",2620,"^Z",2620,"^[",["^10",["^11",["^10",[[]]]]],"^13","Current horizontal coordinate of the mouse."],"^R","1.0","^B","~$quil.core/mouse-x","^S","Mouse","^T","out/quil/core.cljc","^U",10,"^V","mouseX","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2614,"^19","^1:","^Z",2620,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Current horizontal coordinate of the mouse."],"~$TWO-PI",["^ ","^B","~$quil.core/TWO-PI","^T","out/quil/core.cljc","^Y",80,"^W",1,"^Z",80,"^U",12,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",80,"^W",6,"^Z",80,"^U",12],"^1?","^4P"],"~$mag",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$a","~$b"],["~$a","~$b","~$c"]]],"^[",["^10",[["~$a","~$b"],["~$a","~$b","~$c"]]],"^17",["^10",[null,null]]],"^V","mag()","^W",3,"^X",false,"^Y",2442,"^Z",2442,"^[",["^10",["^11",["^10",[["~$a","~$b"],["~$a","~$b","~$c"]]]]],"^13","Calculates the magnitude (or length) of a vector. A vector is a\n direction in space commonly used in computer graphics and linear\n algebra. Because it has no start position, the magnitude of a vector\n can be thought of as the distance from coordinate (0,0) to its (x,y)\n value. Therefore, mag is a shortcut for writing (dist 0 0 x y)."],"^R","1.0","^B","~$quil.core/mag","^S","Calculation","^T","out/quil/core.cljc","^U",6,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$a","~$b"],["~$a","~$b","~$c"]]],"^[",["^10",[["~$a","~$b"],["~$a","~$b","~$c"]]],"^17",["^10",[null,null]]],"^V","mag()","^15",["^10",[["~$a","~$b"],["~$a","~$b","~$c"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",2436,"^Z",2442,"^1;",3,"^1<",true,"^[",["^10",[["~$a","~$b"],["~$a","~$b","~$c"]]],"^13","Calculates the magnitude (or length) of a vector. A vector is a\n direction in space commonly used in computer graphics and linear\n algebra. Because it has no start position, the magnitude of a vector\n can be thought of as the distance from coordinate (0,0) to its (x,y)\n value. Therefore, mag is a shortcut for writing (dist 0 0 x y)."],"~$exit",["^ ","^O","Structure","^P",null,"^Q",["^ ","^O","Structure","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","exit()","^W",3,"^X",true,"^Y",1671,"^Z",1671,"^[",["^10",["^11",["^10",[[]]]]],"^13","Quits/stops/exits the program. Rather than terminating\n immediately, exit will cause the sketch to exit after draw has\n completed (or after setup completes if called during the setup\n method). "],"^R","1.0","^B","~$quil.core/exit","^S",null,"^T","out/quil/core.cljc","^U",7,"^V","exit()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1665,"^19","^1:","^Z",1671,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Quits/stops/exits the program. Rather than terminating\n immediately, exit will cause the sketch to exit after draw has\n completed (or after setup completes if called during the setup\n method). "],"~$map-range",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","map()","^W",3,"^X",false,"^Y",2461,"^Z",2461,"^[",["^10",["^11",["^10",[["^34","~$low1","~$high1","~$low2","~$high2"]]]]],"^13","Re-maps a number from one range to another.\n\n Numbers outside the range are not clamped to 0 and 1, because\n out-of-range values are often intentional and useful."],"^R","1.0","^B","~$quil.core/map-range","^S","Calculation","^T","out/quil/core.cljc","^U",12,"^V","map()","^15",["^10",[["^34","^8N","^8O","^8P","^8Q"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",2455,"^19","^1:","^Z",2461,"^1;",5,"^1<",true,"^[",["^10",["^11",["^10",[["^34","^8N","^8O","^8P","^8Q"]]]]],"^13","Re-maps a number from one range to another.\n\n Numbers outside the range are not clamped to 0 and 1, because\n out-of-range values are often intentional and useful."],"~$model-x",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Coordinates","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","modelX()","^W",3,"^X",true,"^Y",2524,"^Z",2524,"^[",["^10",["^11",["^10",[["~$x","~$y","~$z"]]]]],"^13","Returns the three-dimensional x, y, z position in model space. This\n returns the x value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The x value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."],"^R","1.0","^B","~$quil.core/model-x","^S","Coordinates","^T","out/quil/core.cljc","^U",10,"^V","modelX()","^15",["^10",[["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2518,"^19","^1:","^Z",2524,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["~$x","~$y","~$z"]]]]],"^13","Returns the three-dimensional x, y, z position in model space. This\n returns the x value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The x value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."],"~$sqrt",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","sqrt()","^W",3,"^X",false,"^Y",3989,"^Z",3989,"^[",["^10",["^11",["^10",[["~$a"]]]]],"^13","Calculates the square root of a number. The square root of a number\n is always positive, even though there may be a valid negative\n root. The square root s of number a is such that (= a (* s s)) . It\n is the opposite of squaring."],"^R","1.0","^B","~$quil.core/sqrt","^S","Calculation","^T","out/quil/core.cljc","^U",7,"^V","sqrt()","^15",["^10",[["~$a"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",3983,"^19","^1:","^Z",3989,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$a"]]]]],"^13","Calculates the square root of a number. The square root of a number\n is always positive, even though there may be a valid negative\n root. The square root s of number a is such that (= a (* s s)) . It\n is the opposite of squaring."],"~$saturation",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","saturation()","^W",3,"^X",true,"^Y",3540,"^Z",3540,"^[",["^10",["^11",["^10",[["~$c"]]]]],"^13","Extracts the saturation value from a color."],"^R","1.0","^B","~$quil.core/saturation","^S","Creating & Reading","^T","out/quil/core.cljc","^U",13,"^V","saturation()","^15",["^10",[["~$c"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3534,"^19","^1:","^Z",3540,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$c"]]]]],"^13","Extracts the saturation value from a color."],"~$prc-print",["^ ","^O","Output","^P",null,"^Q",["^ ","^O","Output","^R","1.0","^S","Text area","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^W",6,"~:require-bindings",true,"^Y",170,"^Z",170,"^[",["^10",["^11",["^10",[["~$msg"]]]]],"^13","Writes to the console area of the Processing environment.\n This is often helpful for looking at the data a program is producing.\n The companion function println() works like print(), but creates a new line of text for each call to the function.\n Individual elements can be separated with quotes (\"\") and joined with the addition operator (+). "],"^R","1.0","^B","~$quil.core/prc-print","^S","Text area","^T","out/quil/core.cljc","^U",15,"^15",["^10",[["^8["]]],"^16",null,"^17",["^10",[null,null]],"^W",4,"^18",false,"^8Z",true,"^Y",165,"^19","^1:","^Z",170,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^8["]]]]],"^13","Writes to the console area of the Processing environment.\n This is often helpful for looking at the data a program is producing.\n The companion function println() works like print(), but creates a new line of text for each call to the function.\n Individual elements can be separated with quotes (\"\") and joined with the addition operator (+). "],"~$text-font",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["~$font"],["^92","^2H"]]],"^[",["^10",[["^92"],["^92","^2H"]]],"^17",["^10",[null,null]]],"^V","textFont()","^W",3,"^X",true,"^Y",4269,"^Z",4269,"^[",["^10",["^11",["^10",[["^92"],["^92","^2H"]]]]],"^13","Sets the current font that will be drawn with the text\n function. Fonts must be loaded with load-font before it can be\n used. This font will be used in all subsequent calls to the text\n function. If no size parameter is input, the font will appear at its\n original size until it is changed with text-size.\n\n Because fonts are usually bitmaped, you should create fonts at the\n sizes that will be used most commonly. Using textFont without the\n size parameter will result in the cleanest-looking text.\n\n With the default (JAVA2D) and PDF renderers, it's also possible to\n enable the use of native fonts via the command\n (hint :enable-native-fonts). This will produce vector text in JAVA2D\n sketches and PDF output in cases where the vector data is available:\n when the font is still installed, or the font is created via the\n create-font fn"],"^R","1.0","^B","~$quil.core/text-font","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^92"],["^92","^2H"]]],"^[",["^10",[["^92"],["^92","^2H"]]],"^17",["^10",[null,null]]],"^V","textFont()","^15",["^10",[["^92"],["^92","^2H"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4263,"^Z",4269,"^1;",2,"^1<",true,"^[",["^10",[["^92"],["^92","^2H"]]],"^13","Sets the current font that will be drawn with the text\n function. Fonts must be loaded with load-font before it can be\n used. This font will be used in all subsequent calls to the text\n function. If no size parameter is input, the font will appear at its\n original size until it is changed with text-size.\n\n Because fonts are usually bitmaped, you should create fonts at the\n sizes that will be used most commonly. Using textFont without the\n size parameter will result in the cleanest-looking text.\n\n With the default (JAVA2D) and PDF renderers, it's also possible to\n enable the use of native fonts via the command\n (hint :enable-native-fonts). This will produce vector text in JAVA2D\n sketches and PDF output in cases where the vector data is available:\n when the font is still installed, or the font is created via the\n create-font fn"],"~$scale",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$s"],["^7D","^7E"],["^7D","^7E","~$sz"]]],"^[",["^10",[["~$s"],["^7D","^7E"],["^7D","^7E","^95"]]],"^17",["^10",[null,null,null]]],"^V","scale()","^W",3,"^X",true,"^Y",3589,"^Z",3589,"^[",["^10",["^11",["^10",[["~$s"],["^7D","^7E"],["^7D","^7E","^95"]]]]],"^13","Increases or decreases the size of a shape by expanding and\n contracting vertices. Objects always scale from their relative\n origin to the coordinate system. Scale values are specified as\n decimal percentages. For example, the function call (scale 2)\n increases the dimension of a shape by 200%. Transformations apply to\n everything that happens after and subsequent calls to the function\n multiply the effect. For example, calling (scale 2) and then\n (scale 1.5) is the same as (scale 3). If scale is called within\n draw, the transformation is reset when the loop begins again. Using\n this fuction with the z parameter requires specfying :p3d or :opengl\n as the renderer. This function can be further controlled by\n push-matrix and pop-matrix."],"^R","1.0","^B","~$quil.core/scale","^S",null,"^T","out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$s"],["^7D","^7E"],["^7D","^7E","^95"]]],"^[",["^10",[["~$s"],["^7D","^7E"],["^7D","^7E","^95"]]],"^17",["^10",[null,null,null]]],"^V","scale()","^15",["^10",[["~$s"],["^7D","^7E"],["^7D","^7E","^95"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",3583,"^Z",3589,"^1;",3,"^1<",true,"^[",["^10",[["~$s"],["^7D","^7E"],["^7D","^7E","^95"]]],"^13","Increases or decreases the size of a shape by expanding and\n contracting vertices. Objects always scale from their relative\n origin to the coordinate system. Scale values are specified as\n decimal percentages. For example, the function call (scale 2)\n increases the dimension of a shape by 200%. Transformations apply to\n everything that happens after and subsequent calls to the function\n multiply the effect. For example, calling (scale 2) and then\n (scale 1.5) is the same as (scale 3). If scale is called within\n draw, the transformation is reset when the loop begins again. Using\n this fuction with the z parameter requires specfying :p3d or :opengl\n as the renderer. This function can be further controlled by\n push-matrix and pop-matrix."],"~$defsketch",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["~$app-name","~$options"]]]],"^[",["^10",[["^98","~$&","^99"]]],"^17",["^10",[null]]],"^W",4,"^X",false,"^Y",4736,"^23",true,"^Z",4736,"^[",["^10",["^11",["^10",[["^98","~$&","^99"]]]]],"^13","Define and start a sketch and bind it to a var with the symbol\n app-name. If any of the options to the various callbacks are\n symbols, it wraps them in a call to var to ensure they aren't\n inlined and that redefinitions to the original fns are reflected in\n the visualisation.\n\n Available options:\n\n :size - A vector of width and height for the sketch or :fullscreen.\n Defaults to [500 300]. If you're using :fullscreen you may\n want to enable present mode - :features [:present]\n\n :renderer - Specifies the renderer type. One of :p2d, :p3d, :java2d,\n :opengl, :pdf). Defaults to :java2d. :dxf renderer\n can't be used as sketch renderer. Use begin-raw method\n instead. In clojurescript only :p2d and :p3d renderers\n are supported.\n\n :output-file - Specifies an output file path. Only used in :pdf mode.\n Not supported in clojurescript.\n\n :title - A string which will be displayed at the top of\n the sketch window. Not supported in clojurescript.\n\n :features - A vector of keywords customizing sketch behaviour.\n Supported features:\n\n :keep-on-top - Sketch window will always be above other\n windows. Note: some platforms might not\n support always-on-top windows.\n Not supported in clojurescript.\n\n :exit-on-close - Shutdown JVM when sketch is closed.\n Not supported in clojurescript.\n\n :resizable - Makes sketch resizable.\n Not supported in clojurescript.\n\n :no-safe-fns - Do not catch and print exceptions thrown\n inside functions provided to sketch (like\n draw, mouse-click, key-pressed and\n other). By default all exceptions thrown\n inside these functions are catched. This\n prevents sketch from breaking when bad\n function was provided and allows you to\n fix it and reload it on fly. You can\n disable this behaviour by enabling\n :no-safe-fns feature.\n Not supported in clojurescript.\n\n :present - Switch to present mode (fullscreen without\n borders, OS panels). You may want to use\n this feature together with :size :fullscreen.\n Not supported in clojurescript.\n\n :no-start - Disables autostart if sketch was created using\n defsketch macro. To start sketch you have to\n call function created defsketch.\n Supported only in clojurescript.\n\n :global-key-events - Allows a sketch to receive any\n keyboard event sent to the page,\n regardless of whether the canvas it is\n loaded in has focus or not.\n Supported only in clojurescript.\n\n Usage example: :features [:keep-on-top :present]\n\n :bgcolor - Sets background color for unused space in present mode.\n Color is specified in hex format: #XXXXXX.\n Example: :bgcolor \"#00FFFF\" (cyan background)\n Not supported in clojurescript.\n\n :display - Sets what display should be used by this sketch.\n Displays are numbered starting from 0. Example: :display 1.\n Not supported in clojurescript.\n\n :setup - A function to be called once when setting the sketch up.\n\n :draw - A function to be repeatedly called at most n times per\n second where n is the target frame-rate set for\n the visualisation.\n\n :host - String id of canvas element or DOM element itself.\n Specifies host for the sketch. Must be specified in sketch,\n may be omitted in defsketch. If ommitted in defsketch,\n :host is set to the name of the sketch. If element with\n specified id is not found on the page and page is empty -\n new canvas element will be created. Used in clojurescript.\n\n :focus-gained - Called when the sketch gains focus.\n Not supported in clojurescript.\n\n :focus-lost - Called when the sketch loses focus.\n Not supported in clojurescript.\n\n :mouse-entered - Called when the mouse enters the sketch window.\n\n :mouse-exited - Called when the mouse leaves the sketch window\n\n :mouse-pressed - Called every time a mouse button is pressed.\n\n :mouse-released - Called every time a mouse button is released.\n\n :mouse-clicked - called once after a mouse button has been pressed\n and then released.\n\n :mouse-moved - Called every time the mouse moves and a button is\n not pressed.\n\n :mouse-dragged - Called every time the mouse moves and a button is\n pressed.\n\n :mouse-wheel - Called every time mouse wheel is rotated.\n Takes 1 argument - wheel rotation, an int.\n Negative values if the mouse wheel was rotated\n up/away from the user, and positive values\n if the mouse wheel was rotated down/ towards the user\n\n :key-pressed - Called every time any key is pressed.\n\n :key-released - Called every time any key is released.\n\n :key-typed - Called once every time non-modifier keys are\n pressed.\n\n :on-close - Called once, when sketch is closed\n Not supported in clojurescript.\n\n :middleware - Vector of middleware to be applied to the sketch.\n Middleware will be applied in the same order as in comp\n function: [f g] will be applied as (f (g options)).\n\n :settings - cousin of :setup. A function to be called once when\n setting sketch up. Should be used only for (smooth) and\n (no-smooth). Due to Processing limitations these functions\n cannot be used neither in :setup nor in :draw."],"^R","1.0","^B","~$quil.core/defsketch","^S",null,"^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["^98","^99"]]]],"^[",["^10",[["^98","~$&","^99"]]],"^17",["^10",[null]]],"^15",["^10",[["^10",["^98","^99"]]]],"^16",null,"^17",["^10",[null]],"^W",1,"^18",true,"^X",false,"^Y",4732,"^23",true,"^19","^1:","^Z",4736,"^1;",1,"^1<",false,"^[",["^10",[["^98","~$&","^99"]]],"^13","Define and start a sketch and bind it to a var with the symbol\n app-name. If any of the options to the various callbacks are\n symbols, it wraps them in a call to var to ensure they aren't\n inlined and that redefinitions to the original fns are reflected in\n the visualisation.\n\n Available options:\n\n :size - A vector of width and height for the sketch or :fullscreen.\n Defaults to [500 300]. If you're using :fullscreen you may\n want to enable present mode - :features [:present]\n\n :renderer - Specifies the renderer type. One of :p2d, :p3d, :java2d,\n :opengl, :pdf). Defaults to :java2d. :dxf renderer\n can't be used as sketch renderer. Use begin-raw method\n instead. In clojurescript only :p2d and :p3d renderers\n are supported.\n\n :output-file - Specifies an output file path. Only used in :pdf mode.\n Not supported in clojurescript.\n\n :title - A string which will be displayed at the top of\n the sketch window. Not supported in clojurescript.\n\n :features - A vector of keywords customizing sketch behaviour.\n Supported features:\n\n :keep-on-top - Sketch window will always be above other\n windows. Note: some platforms might not\n support always-on-top windows.\n Not supported in clojurescript.\n\n :exit-on-close - Shutdown JVM when sketch is closed.\n Not supported in clojurescript.\n\n :resizable - Makes sketch resizable.\n Not supported in clojurescript.\n\n :no-safe-fns - Do not catch and print exceptions thrown\n inside functions provided to sketch (like\n draw, mouse-click, key-pressed and\n other). By default all exceptions thrown\n inside these functions are catched. This\n prevents sketch from breaking when bad\n function was provided and allows you to\n fix it and reload it on fly. You can\n disable this behaviour by enabling\n :no-safe-fns feature.\n Not supported in clojurescript.\n\n :present - Switch to present mode (fullscreen without\n borders, OS panels). You may want to use\n this feature together with :size :fullscreen.\n Not supported in clojurescript.\n\n :no-start - Disables autostart if sketch was created using\n defsketch macro. To start sketch you have to\n call function created defsketch.\n Supported only in clojurescript.\n\n :global-key-events - Allows a sketch to receive any\n keyboard event sent to the page,\n regardless of whether the canvas it is\n loaded in has focus or not.\n Supported only in clojurescript.\n\n Usage example: :features [:keep-on-top :present]\n\n :bgcolor - Sets background color for unused space in present mode.\n Color is specified in hex format: #XXXXXX.\n Example: :bgcolor \"#00FFFF\" (cyan background)\n Not supported in clojurescript.\n\n :display - Sets what display should be used by this sketch.\n Displays are numbered starting from 0. Example: :display 1.\n Not supported in clojurescript.\n\n :setup - A function to be called once when setting the sketch up.\n\n :draw - A function to be repeatedly called at most n times per\n second where n is the target frame-rate set for\n the visualisation.\n\n :host - String id of canvas element or DOM element itself.\n Specifies host for the sketch. Must be specified in sketch,\n may be omitted in defsketch. If ommitted in defsketch,\n :host is set to the name of the sketch. If element with\n specified id is not found on the page and page is empty -\n new canvas element will be created. Used in clojurescript.\n\n :focus-gained - Called when the sketch gains focus.\n Not supported in clojurescript.\n\n :focus-lost - Called when the sketch loses focus.\n Not supported in clojurescript.\n\n :mouse-entered - Called when the mouse enters the sketch window.\n\n :mouse-exited - Called when the mouse leaves the sketch window\n\n :mouse-pressed - Called every time a mouse button is pressed.\n\n :mouse-released - Called every time a mouse button is released.\n\n :mouse-clicked - called once after a mouse button has been pressed\n and then released.\n\n :mouse-moved - Called every time the mouse moves and a button is\n not pressed.\n\n :mouse-dragged - Called every time the mouse moves and a button is\n pressed.\n\n :mouse-wheel - Called every time mouse wheel is rotated.\n Takes 1 argument - wheel rotation, an int.\n Negative values if the mouse wheel was rotated\n up/away from the user, and positive values\n if the mouse wheel was rotated down/ towards the user\n\n :key-pressed - Called every time any key is pressed.\n\n :key-released - Called every time any key is released.\n\n :key-typed - Called once every time non-modifier keys are\n pressed.\n\n :on-close - Called once, when sketch is closed\n Not supported in clojurescript.\n\n :middleware - Vector of middleware to be applied to the sketch.\n Middleware will be applied in the same order as in comp\n function: [f g] will be applied as (f (g options)).\n\n :settings - cousin of :setup. A function to be called once when\n setting sketch up. Should be used only for (smooth) and\n (no-smooth). Due to Processing limitations these functions\n cannot be used neither in :setup nor in :draw."],"~$no-stroke",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","noStroke()","^W",3,"^X",true,"^Y",2864,"^Z",2864,"^[",["^10",["^11",["^10",[[]]]]],"^13","Disables drawing the stroke (outline). If both no-stroke and\n no-fill are called, nothing will be drawn to the screen."],"^R","1.0","^B","~$quil.core/no-stroke","^S","Setting","^T","out/quil/core.cljc","^U",12,"^V","noStroke()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2858,"^19","^1:","^Z",2864,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Disables drawing the stroke (outline). If both no-stroke and\n no-fill are called, nothing will be drawn to the screen."],"~$end-camera",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Camera","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","endCamera()","^W",3,"^X",true,"^Y",1612,"^Z",1612,"^[",["^10",["^11",["^10",[[]]]]],"^13","Unsets the matrix mode from the camera matrix. See begin-camera."],"^R","1.0","^B","~$quil.core/end-camera","^S","Camera","^T","out/quil/core.cljc","^U",13,"^V","endCamera()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1606,"^19","^1:","^Z",1612,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Unsets the matrix mode from the camera matrix. See begin-camera."],"~$random-seed",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Random","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","randomSeed()","^W",3,"^X",true,"^Y",3243,"^Z",3243,"^[",["^10",["^11",["^10",[["~$w"]]]]],"^13","Sets the seed value for random. By default, random produces\n different results each time the program is run. Set the value\n parameter to a constant to return the same pseudo-random numbers\n each time the software is run."],"^R","1.0","^B","~$quil.core/random-seed","^S","Random","^T","out/quil/core.cljc","^U",14,"^V","randomSeed()","^15",["^10",[["~$w"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3237,"^19","^1:","^Z",3243,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$w"]]]]],"^13","Sets the seed value for random. By default, random produces\n different results each time the program is run. Set the value\n parameter to a constant to return the same pseudo-random numbers\n each time the software is run."],"~$model-z",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Coordinates","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","modelZ()","^W",3,"^X",true,"^Y",2554,"^Z",2554,"^[",["^10",["^11",["^10",[["~$x","~$y","~$z"]]]]],"^13","Returns the three-dimensional x, y, z position in model space. This\n returns the z value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The z value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."],"^R","1.0","^B","~$quil.core/model-z","^S","Coordinates","^T","out/quil/core.cljc","^U",10,"^V","modelZ()","^15",["^10",[["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2548,"^19","^1:","^Z",2554,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["~$x","~$y","~$z"]]]]],"^13","Returns the three-dimensional x, y, z position in model space. This\n returns the z value for a given coordinate based on the current set\n of transformations (scale, rotate, translate, etc.) The z value can\n be used to place an object in space relative to the location of the\n original point once the transformations are no longer in use."],"~$light-specular",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Lights","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",17,"^V","lightSpecular()","^W",3,"^X",true,"^Y",2307,"^Z",2307,"^[",["^10",["^11",["^10",[["~$r","~$g","~$b"]]]]],"^13","Sets the specular color for lights. Like fill, it affects only the\n elements which are created after it in the code. Specular refers to\n light which bounces off a surface in a perferred direction (rather\n than bouncing in all directions like a diffuse light) and is used\n for creating highlights. The specular quality of a light interacts\n with the specular material qualities set through the specular and\n shininess functions."],"^R","1.0","^B","~$quil.core/light-specular","^S","Lights","^T","out/quil/core.cljc","^U",17,"^V","lightSpecular()","^15",["^10",[["~$r","~$g","~$b"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2301,"^19","^1:","^Z",2307,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["~$r","~$g","~$b"]]]]],"^13","Sets the specular color for lights. Like fill, it affects only the\n elements which are created after it in the code. Specular refers to\n light which bounces off a surface in a perferred direction (rather\n than bouncing in all directions like a diffuse light) and is used\n for creating highlights. The specular quality of a light interacts\n with the specular material qualities set through the specular and\n shininess functions."],"~$key-as-keyword",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.6","^S","Keyboard","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",17,"^V",null,"^W",3,"^X",true,"^Y",4901,"^Z",4901,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns a keyword representing the currently pressed key. Modifier\n keys are represented as: :up, :down, :left, :right, :alt, :control,\n :shift, :command, :f1-24"],"^R","1.6","^B","~$quil.core/key-as-keyword","^S","Keyboard","^T","out/quil/core.cljc","^U",17,"^V",null,"^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4896,"^19","^1:","^Z",4901,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns a keyword representing the currently pressed key. Modifier\n keys are represented as: :up, :down, :left, :right, :alt, :control,\n :shift, :command, :f1-24"],"~$dist",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",6,"^15",["^10",[["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^[",["^10",[["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^17",["^10",[null,null]]],"^V","dist()","^W",3,"^X",false,"^Y",1495,"^Z",1495,"^[",["^10",["^11",["^10",[["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]]]],"^13","Calculates the distance between two points"],"^R","1.0","^B","~$quil.core/dist","^S","Calculation","^T","out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",6,"^15",["^10",[["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^[",["^10",[["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^17",["^10",[null,null]]],"^V","dist()","^15",["^10",[["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",1489,"^Z",1495,"^1;",6,"^1<",true,"^[",["^10",[["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^13","Calculates the distance between two points"],"^8",["^ ","^B","~$quil.core/PI","^T","out/quil/core.cljc","^Y",76,"^W",10,"^Z",76,"^U",17,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",76,"^W",15,"^Z",76,"^U",17],"^1?","^6J"],"~$norm",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","norm()","^W",3,"^X",true,"^Y",2825,"^Z",2825,"^[",["^10",["^11",["^10",[["^34","^8:","^8;"]]]]],"^13","Normalize a value to exist between 0 and 1 (inclusive)."],"^R","1.0","^B","~$quil.core/norm","^S","Calculation","^T","out/quil/core.cljc","^U",7,"^V","norm()","^15",["^10",[["^34","^8:","^8;"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2819,"^19","^1:","^Z",2825,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["^34","^8:","^8;"]]]]],"^13","Normalize a value to exist between 0 and 1 (inclusive)."],"~$end-shape",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Vertex","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^1I"]]],"^[",["^10",[[],["^1I"]]],"^17",["^10",[null,null]]],"^V","endShape()","^W",3,"^X",true,"^Y",1651,"^Z",1651,"^[",["^10",["^11",["^10",[[],["^1I"]]]]],"^13","May only be called after begin-shape. When end-shape is called,\n all of image data defined since the previous call to begin-shape is\n written into the image buffer. The keyword :close may be passed to\n close the shape (to connect the beginning and the end)."],"^R","1.0","^B","~$quil.core/end-shape","^S","Vertex","^T","out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^1I"]]],"^[",["^10",[[],["^1I"]]],"^17",["^10",[null,null]]],"^V","endShape()","^15",["^10",[[],["^1I"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1645,"^Z",1651,"^1;",1,"^1<",true,"^[",["^10",[[],["^1I"]]],"^13","May only be called after begin-shape. When end-shape is called,\n all of image data defined since the previous call to begin-shape is\n written into the image buffer. The keyword :close may be passed to\n close the shape (to connect the beginning and the end)."],"~$fill",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","fill()","^W",3,"^X",true,"^Y",1742,"^Z",1742,"^[",["^10",["^11",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]]]],"^13","Sets the color used to fill shapes."],"^R","1.0","^B","~$quil.core/fill","^S","Setting","^T","out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","fill()","^15",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",1736,"^Z",1742,"^1;",4,"^1<",true,"^[",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^13","Sets the color used to fill shapes."],"~$with-translation",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S","Utility Macros","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",19,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["~$translation-vector","^22"]]]],"^[",["^10",[["^9Q","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^W",3,"^X",true,"^Y",4670,"^23",true,"^Z",4670,"^[",["^10",["^11",["^10",[["^9Q","~$&","^22"]]]]],"^13","Performs body with translation, restores current transformation on\n exit."],"^R","1.0","^B","~$quil.core/with-translation","^S","Utility Macros","^T","out/quil/core.cljc","^U",19,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["^9Q","^22"]]]],"^[",["^10",[["^9Q","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^15",["^10",[["^10",["^9Q","^22"]]]],"^16",null,"^17",["^10",[null]],"^W",1,"^18",true,"^X",true,"^Y",4664,"^23",true,"^19","^1:","^Z",4670,"^1;",1,"^1<",false,"^[",["^10",[["^9Q","~$&","^22"]]],"^13","Performs body with translation, restores current transformation on\n exit."],"~$reset-matrix",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","resetMatrix()","^W",3,"^X",true,"^Y",3383,"^Z",3383,"^[",["^10",["^11",["^10",[[]]]]],"^13","Replaces the current matrix with the identity matrix. The\n equivalent function in OpenGL is glLoadIdentity()"],"^R","1.0","^B","~$quil.core/reset-matrix","^S",null,"^T","out/quil/core.cljc","^U",15,"^V","resetMatrix()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3377,"^19","^1:","^Z",3383,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Replaces the current matrix with the identity matrix. The\n equivalent function in OpenGL is glLoadIdentity()"],"~$emissive-float",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Material Properties","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",17,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$float-val"],["~$r","~$g","~$b"]]],"^[",["^10",[["^9V"],["~$r","~$g","~$b"]]],"^17",["^10",[null,null]]],"^V","emissive()","^W",3,"^X",true,"^Y",1566,"^Z",1566,"^[",["^10",["^11",["^10",[["^9V"],["~$r","~$g","~$b"]]]]],"^13","Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes. Converts all\n args to floats"],"^R","1.0","^B","~$quil.core/emissive-float","^S","Material Properties","^T","out/quil/core.cljc","^U",17,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^9V"],["~$r","~$g","~$b"]]],"^[",["^10",[["^9V"],["~$r","~$g","~$b"]]],"^17",["^10",[null,null]]],"^V","emissive()","^15",["^10",[["^9V"],["~$r","~$g","~$b"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1560,"^Z",1566,"^1;",3,"^1<",true,"^[",["^10",[["^9V"],["~$r","~$g","~$b"]]],"^13","Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes. Converts all\n args to floats"],"~$shape-modes",["^ ","^B","~$quil.core/shape-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",47,"^U",13,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",47,"^W",2,"^Z",47,"^U",13],"^1?","^1@"],"~$green",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^V","green()","^W",3,"^X",true,"^Y",1939,"^Z",1939,"^[",["^10",["^11",["^10",[["^59"]]]]],"^13","Extracts the green value from a color, scaled to match current\n color-mode. This value is always returned as a float so be careful\n not to assign it to an int value."],"^R","1.0","^B","~$quil.core/green","^S","Creating & Reading","^T","out/quil/core.cljc","^U",8,"^V","green()","^15",["^10",[["^59"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1933,"^19","^1:","^Z",1939,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^59"]]]]],"^13","Extracts the green value from a color, scaled to match current\n color-mode. This value is always returned as a float so be careful\n not to assign it to an int value."],"~$HALF-PI",["^ ","^B","~$quil.core/HALF-PI","^T","out/quil/core.cljc","^Y",77,"^W",1,"^Z",77,"^U",13,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",77,"^W",6,"^Z",77,"^U",13],"^1?","^4P"],"~$begin-contour",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","2.0","^S","Vertex","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^V","beginContour()","^W",3,"^X",true,"^Y",602,"^Z",602,"^[",["^10",["^11",["^10",[[]]]]],"^13","Use the begin-contour and end-contour function to create negative\n shapes within shapes. These functions can only be within a\n begin-shape/end-shape pair and they only work with the :p2d and :p3d\n renderers."],"^R","2.0","^B","~$quil.core/begin-contour","^S","Vertex","^T","out/quil/core.cljc","^U",16,"^V","beginContour()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",596,"^19","^1:","^Z",602,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Use the begin-contour and end-contour function to create negative\n shapes within shapes. These functions can only be within a\n begin-shape/end-shape pair and they only work with the :p2d and :p3d\n renderers."],"~$DEG-TO-RAD",["^ ","^B","~$quil.core/DEG-TO-RAD","^T","out/quil/core.cljc","^Y",82,"^W",1,"^Z",82,"^U",16,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",82,"^W",6,"^Z",82,"^U",16],"^1?","^4P"],"~$pow",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","pow()","^W",3,"^X",false,"^Y",3060,"^Z",3060,"^[",["^10",["^11",["^10",[["~$num","~$exponent"]]]]],"^13","Facilitates exponential expressions. The pow() function is an\n efficient way of multiplying numbers by themselves (or their\n reciprocal) in large quantities. For example, (pow 3 5) is\n equivalent to the expression (* 3 3 3 3 3) and (pow 3 -5) is\n equivalent to (/ 1 (* 3 3 3 3 3))."],"^R","1.0","^B","~$quil.core/pow","^S","Calculation","^T","out/quil/core.cljc","^U",6,"^V","pow()","^15",["^10",[["^:7","^:8"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",3054,"^19","^1:","^Z",3060,"^1;",2,"^1<",true,"^[",["^10",["^11",["^10",[["^:7","^:8"]]]]],"^13","Facilitates exponential expressions. The pow() function is an\n efficient way of multiplying numbers by themselves (or their\n reciprocal) in large quantities. For example, (pow 3 5) is\n equivalent to the expression (* 3 3 3 3 3) and (pow 3 -5) is\n equivalent to (/ 1 (* 3 3 3 3 3))."],"~$box",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","3D Primitives","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^2H"],["^1Q","^1R","~$depth"]]],"^[",["^10",[["^2H"],["^1Q","^1R","^:;"]]],"^17",["^10",[null,null]]],"^V","box()","^W",3,"^X",true,"^Y",917,"^Z",917,"^[",["^10",["^11",["^10",[["^2H"],["^1Q","^1R","^:;"]]]]],"^13","Creates an extruded rectangle."],"^R","1.0","^B","~$quil.core/box","^S","3D Primitives","^T","out/quil/core.cljc","^U",6,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^2H"],["^1Q","^1R","^:;"]]],"^[",["^10",[["^2H"],["^1Q","^1R","^:;"]]],"^17",["^10",[null,null]]],"^V","box()","^15",["^10",[["^2H"],["^1Q","^1R","^:;"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",911,"^Z",917,"^1;",3,"^1<",true,"^[",["^10",[["^2H"],["^1Q","^1R","^:;"]]],"^13","Creates an extruded rectangle."],"~$exp",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","exp()","^W",3,"^X",false,"^Y",1685,"^Z",1685,"^[",["^10",["^11",["^10",[["^34"]]]]],"^13","Returns Euler's number e (2.71828...) raised to the power of the\n value parameter."],"^R","1.0","^B","~$quil.core/exp","^S","Calculation","^T","out/quil/core.cljc","^U",6,"^V","exp()","^15",["^10",[["^34"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",1679,"^19","^1:","^Z",1685,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^34"]]]]],"^13","Returns Euler's number e (2.71828...) raised to the power of the\n value parameter."],"~$with-sketch",["^ ","^P",null,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",190,"^W",11,"^Z",190,"^U",22,"^23",true,"^[",["^10",["^11",["^10",[["~$applet","~$&","^22"]]]]],"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["^:@","^22"]]]],"^[",["^10",[["^:@","~$&","^22"]]],"^17",["^10",[null]]]],"^B","~$quil.core/with-sketch","^T","out/quil/core.cljc","^U",22,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["^:@","^22"]]]],"^[",["^10",[["^:@","~$&","^22"]]],"^17",["^10",[null]]],"^15",["^10",[["^10",["^:@","^22"]]]],"^16",null,"^17",["^10",[null]],"^W",1,"^18",true,"^Y",190,"^23",true,"^19","^1:","^Z",190,"^1;",1,"^1<",false,"^[",["^10",[["^:@","~$&","^22"]]]],"~$text-ascent",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Metrics","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","textAscent()","^W",3,"^X",true,"^Y",4241,"^Z",4241,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the ascent of the current font at its current size. This\n information is useful for determining the height of the font above\n the baseline. For example, adding the text-ascent and text-descent\n values will give you the total height of the line."],"^R","1.0","^B","~$quil.core/text-ascent","^S","Metrics","^T","out/quil/core.cljc","^U",14,"^V","textAscent()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4235,"^19","^1:","^Z",4241,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the ascent of the current font at its current size. This\n information is useful for determining the height of the font above\n the baseline. For example, adding the text-ascent and text-descent\n values will give you the total height of the line."],"~$tint-int",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^3I"],["^3I","^2N"]]],"^[",["^10",[["^3I"],["^3I","^2N"]]],"^17",["^10",[null,null]]],"^V","tint()","^W",3,"^X",true,"^Y",4438,"^Z",4438,"^[",["^10",["^11",["^10",[["^3I"],["^3I","^2N"]]]]],"^13","Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."],"^R","1.0","^B","~$quil.core/tint-int","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^3I"],["^3I","^2N"]]],"^[",["^10",[["^3I"],["^3I","^2N"]]],"^17",["^10",[null,null]]],"^V","tint()","^15",["^10",[["^3I"],["^3I","^2N"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4432,"^Z",4438,"^1;",2,"^1<",true,"^[",["^10",[["^3I"],["^3I","^2N"]]],"^13","Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."],"~$shininess",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Material Properties","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","shininess()","^W",3,"^X",true,"^Y",3850,"^Z",3850,"^[",["^10",["^11",["^10",[["~$shine"]]]]],"^13","Sets the amount of gloss in the surface of shapes. Used in\n combination with ambient, specular, and emissive in setting\n the material properties of shapes."],"^R","1.0","^B","~$quil.core/shininess","^S","Material Properties","^T","out/quil/core.cljc","^U",12,"^V","shininess()","^15",["^10",[["^:G"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3844,"^19","^1:","^Z",3850,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^:G"]]]]],"^13","Sets the amount of gloss in the surface of shapes. Used in\n combination with ambient, specular, and emissive in setting\n the material properties of shapes."],"~$rect-mode",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","rectMode()","^W",3,"^X",true,"^Y",3302,"^Z",3302,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Modifies the location from which rectangles draw. The default mode\n is :corner. Available modes are:\n\n\n :corner - Specifies the location to be the upper left corner of the\n shape and uses the third and fourth parameters of rect to\n specify the width and height.\n\n :corners - Uses the first and second parameters of rect to set the\n location of one corner and uses the third and fourth\n parameters to set the opposite corner.\n\n :center - Draws the image from its center point and uses the third\n and forth parameters of rect to specify the image's width\n and height.\n\n :radius - Draws the image from its center point and uses the third\n and forth parameters of rect() to specify half of the\n image's width and height."],"^R","1.0","^B","~$quil.core/rect-mode","^S","Attributes","^T","out/quil/core.cljc","^U",12,"^V","rectMode()","^15",["^10",[["^1I"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3296,"^19","^1:","^Z",3302,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Modifies the location from which rectangles draw. The default mode\n is :corner. Available modes are:\n\n\n :corner - Specifies the location to be the upper left corner of the\n shape and uses the third and fourth parameters of rect to\n specify the width and height.\n\n :corners - Uses the first and second parameters of rect to set the\n location of one corner and uses the third and fourth\n parameters to set the opposite corner.\n\n :center - Draws the image from its center point and uses the third\n and forth parameters of rect to specify the image's width\n and height.\n\n :radius - Draws the image from its center point and uses the third\n and forth parameters of rect() to specify half of the\n image's width and height."],"~$ellipse-mode",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","ellipseMode()","^W",3,"^X",true,"^Y",1544,"^Z",1544,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Modifies the origin of the ellispse according to the specified mode:\n\n :center - specifies the location of the ellipse as\n the center of the shape. (Default).\n :radius - similar to center, but the width and height parameters to\n ellipse specify the radius of the ellipse, rather than the\n diameter.\n :corner - draws the shape from the upper-left corner of its bounding\n box.\n :corners - uses the four parameters to ellipse to set two opposing\n corners of the ellipse's bounding box."],"^R","1.0","^B","~$quil.core/ellipse-mode","^S","Attributes","^T","out/quil/core.cljc","^U",15,"^V","ellipseMode()","^15",["^10",[["^1I"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1538,"^19","^1:","^Z",1544,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Modifies the origin of the ellispse according to the specified mode:\n\n :center - specifies the location of the ellipse as\n the center of the shape. (Default).\n :radius - similar to center, but the width and height parameters to\n ellipse specify the radius of the ellipse, rather than the\n diameter.\n :corner - draws the shape from the upper-left corner of its bounding\n box.\n :corners - uses the four parameters to ellipse to set two opposing\n corners of the ellipse's bounding box."],"~$month",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Time & Date","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^V","month()","^W",3,"^X",false,"^Y",2569,"^Z",2569,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current month as a value from 1 - 12."],"^R","1.0","^B","~$quil.core/month","^S","Time & Date","^T","out/quil/core.cljc","^U",8,"^V","month()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",2563,"^19","^1:","^Z",2569,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current month as a value from 1 - 12."],"~$texture-modes",["^ ","^B","~$quil.core/texture-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",69,"^U",15,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",69,"^W",2,"^Z",69,"^U",15],"^1?","^1@"],"~$tint-float",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","tint()","^W",3,"^X",true,"^Y",4413,"^Z",4413,"^[",["^10",["^11",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]]]],"^13","Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."],"^R","1.0","^B","~$quil.core/tint-float","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","tint()","^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",4407,"^Z",4413,"^1;",4,"^1<",true,"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^13","Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."],"^1Q",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^V","getWidth()","^W",3,"^4=",null,"^X",true,"^Y",4620,"^Z",4620,"^[",["^10",["^11",["^10",[[]]]]],"^13","Width of the display window. The value of width is zero until size is\n called."],"^R","1.0","^B","~$quil.core/width","^S",null,"^T","out/quil/core.cljc","^U",8,"^V","getWidth()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^4=",null,"^18",false,"^X",true,"^Y",4613,"^19","^1:","^Z",4620,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Width of the display window. The value of width is zero until size is\n called."],"~$background",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","background()","^W",3,"^X",true,"^Y",550,"^Z",550,"^[",["^10",["^11",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]]]],"^13","Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts args to floats."],"^R","1.0","^B","~$quil.core/background","^S","Setting","^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","background()","^15",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",544,"^Z",550,"^1;",4,"^1<",true,"^[",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^13","Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts args to floats."],"~$ortho",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Camera","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",6,"^15",["^10",[[],["~$left","~$right","~$bottom","~$top"],["^:W","^:X","^:Y","^:Z","~$near","~$far"]]],"^[",["^10",[[],["^:W","^:X","^:Y","^:Z"],["^:W","^:X","^:Y","^:Z","^:[","^;0"]]],"^17",["^10",[null,null,null]]],"^V","ortho()","^W",3,"^X",true,"^Y",2888,"^Z",2888,"^[",["^10",["^11",["^10",[[],["^:W","^:X","^:Y","^:Z"],["^:W","^:X","^:Y","^:Z","^:[","^;0"]]]]],"^13","Sets an orthographic projection and defines a parallel clipping\n volume. All objects with the same dimension appear the same size,\n regardless of whether they are near or far from the camera. The\n parameters to this function specify the clipping volume where left\n and right are the minimum and maximum x values, top and bottom are\n the minimum and maximum y values, and near and far are the minimum\n and maximum z values. If no parameters are given, the default is\n used: (ortho 0 width 0 height -10 10)"],"^R","1.0","^B","~$quil.core/ortho","^S","Camera","^T","out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",6,"^15",["^10",[[],["^:W","^:X","^:Y","^:Z"],["^:W","^:X","^:Y","^:Z","^:[","^;0"]]],"^[",["^10",[[],["^:W","^:X","^:Y","^:Z"],["^:W","^:X","^:Y","^:Z","^:[","^;0"]]],"^17",["^10",[null,null,null]]],"^V","ortho()","^15",["^10",[[],["^:W","^:X","^:Y","^:Z"],["^:W","^:X","^:Y","^:Z","^:[","^;0"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",2882,"^Z",2888,"^1;",6,"^1<",true,"^[",["^10",[[],["^:W","^:X","^:Y","^:Z"],["^:W","^:X","^:Y","^:Z","^:[","^;0"]]],"^13","Sets an orthographic projection and defines a parallel clipping\n volume. All objects with the same dimension appear the same size,\n regardless of whether they are near or far from the camera. The\n parameters to this function specify the clipping volume where left\n and right are the minimum and maximum x values, top and bottom are\n the minimum and maximum y values, and near and far are the minimum\n and maximum z values. If no parameters are given, the default is\n used: (ortho 0 width 0 height -10 10)"],"~$hint-options",["^ ","^B","~$quil.core/hint-options","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",53,"^U",14,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",53,"^W",2,"^Z",53,"^U",14],"^1?","^1@"],"~$prc-println",["^ ","^O","Output","^P",null,"^Q",["^ ","^O","Output","^R","1.0","^S","Text area","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",17,"^W",6,"^8Z",true,"^Y",152,"^Z",152,"^[",["^10",["^11",["^10",[["^8["]]]]],"^13","Writes to the text area of the Processing environment's console.\n This is often helpful for looking at the data a program is producing.\n Each call to this function creates a new line of output.\n Individual elements can be separated with quotes (\"\") and joined with the string concatenation operator (+).\n Also writes the content of an array to the text area of the Processing environment.\n This is often helpful for looking at the data a program is producing.\n A new line is put between each element of the array. This function can only print 1D arrays,\n but can test to see if the content are null or not null for 2+ dimensional arrays."],"^R","1.0","^B","~$quil.core/prc-println","^S","Text area","^T","out/quil/core.cljc","^U",17,"^15",["^10",[["^8["]]],"^16",null,"^17",["^10",[null,null]],"^W",4,"^18",false,"^8Z",true,"^Y",147,"^19","^1:","^Z",152,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^8["]]]]],"^13","Writes to the text area of the Processing environment's console.\n This is often helpful for looking at the data a program is producing.\n Each call to this function creates a new line of output.\n Individual elements can be separated with quotes (\"\") and joined with the string concatenation operator (+).\n Also writes the content of an array to the text area of the Processing environment.\n This is often helpful for looking at the data a program is producing.\n A new line is put between each element of the array. This function can only print 1D arrays,\n but can test to see if the content are null or not null for 2+ dimensional arrays."],"~$brightness",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","brightness()","^W",3,"^X",true,"^Y",928,"^Z",928,"^[",["^10",["^11",["^10",[["^87"]]]]],"^13","Extracts the brightness value from a color. Returns a float."],"^R","1.0","^B","~$quil.core/brightness","^S","Creating & Reading","^T","out/quil/core.cljc","^U",13,"^V","brightness()","^15",["^10",[["^87"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",922,"^19","^1:","^Z",928,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^87"]]]]],"^13","Extracts the brightness value from a color. Returns a float."],"~$arc-modes",["^ ","^B","~$quil.core/arc-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",46,"^U",11,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",46,"^W",2,"^Z",46,"^U",11],"^1?","^1@"],"~$specular",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Material Properties","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^[",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","specular()","^W",3,"^X",true,"^Y",3907,"^Z",3907,"^[",["^10",["^11",["^10",[["^2M"],["~$x","~$y","~$z"]]]]],"^13","Sets the specular color of the materials used for shapes drawn to\n the screen, which sets the color of hightlights. Specular refers to\n light which bounces off a surface in a perferred direction (rather\n than bouncing in all directions like a diffuse light). Used in\n combination with emissive, ambient, and shininess in setting\n the material properties of shapes."],"^R","1.0","^B","~$quil.core/specular","^S","Material Properties","^T","out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^[",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","specular()","^15",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3901,"^Z",3907,"^1;",3,"^1<",true,"^[",["^10",[["^2M"],["~$x","~$y","~$z"]]],"^13","Sets the specular color of the materials used for shapes drawn to\n the screen, which sets the color of hightlights. Specular refers to\n light which bounces off a surface in a perferred direction (rather\n than bouncing in all directions like a diffuse light). Used in\n combination with emissive, ambient, and shininess in setting\n the material properties of shapes."],"~$save-frame",["^ ","^O","Output","^P",null,"^Q",["^ ","^O","Output","^R","1.0","^S","Image","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["~$name"]]],"^[",["^10",[[],["^;="]]],"^17",["^10",[null,null]]],"^V","saveFrame()","^W",3,"^X",true,"^Y",3569,"^Z",3569,"^[",["^10",["^11",["^10",[[],["^;="]]]]],"^13","Saves an image identical to the current display window as a\n file. May be called multple times - each file saved will have a\n unique name. Name and image formate may be modified by passing a\n string parameter of the form \"foo-####.ext\" where foo- can be any\n arbitrary string, #### will be replaced with the current frame id\n and .ext is one of .tiff, .targa, .png, .jpeg or .jpg\n\n Examples:\n (save-frame)\n (save-frame \"pretty-pic-####.jpg\")"],"^R","1.0","^B","~$quil.core/save-frame","^S","Image","^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^;="]]],"^[",["^10",[[],["^;="]]],"^17",["^10",[null,null]]],"^V","saveFrame()","^15",["^10",[[],["^;="]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3563,"^Z",3569,"^1;",1,"^1<",true,"^[",["^10",[[],["^;="]]],"^13","Saves an image identical to the current display window as a\n file. May be called multple times - each file saved will have a\n unique name. Name and image formate may be modified by passing a\n string parameter of the form \"foo-####.ext\" where foo- can be any\n arbitrary string, #### will be replaced with the current frame id\n and .ext is one of .tiff, .targa, .png, .jpeg or .jpg\n\n Examples:\n (save-frame)\n (save-frame \"pretty-pic-####.jpg\")"],"~$cursor",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["~$cursor-mode"]]],"^[",["^10",[[],["^;@"]]],"^17",["^10",[null,null]]],"^V","cursor()","^W",3,"^X",true,"^Y",1286,"^Z",1286,"^[",["^10",["^11",["^10",[[],["^;@"]]]]],"^13","Sets the cursor to a predefined symbol or makes it\n visible if already hidden (after no-cursor was called).\n\n Available modes: :arrow, :cross, :hand, :move, :text, :wait\n\n See cursor-image for specifying a generic image as the cursor\n symbol."],"^R","1.0","^B","~$quil.core/cursor","^S",null,"^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^;@"]]],"^[",["^10",[[],["^;@"]]],"^17",["^10",[null,null]]],"^V","cursor()","^15",["^10",[[],["^;@"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1280,"^Z",1286,"^1;",1,"^1<",true,"^[",["^10",[[],["^;@"]]],"^13","Sets the cursor to a predefined symbol or makes it\n visible if already hidden (after no-cursor was called).\n\n Available modes: :arrow, :cross, :hand, :move, :text, :wait\n\n See cursor-image for specifying a generic image as the cursor\n symbol."],"~$noise",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Random","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$x"],["~$x","~$y"],["~$x","~$y","~$z"]]],"^[",["^10",[["~$x"],["~$x","~$y"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null,null]]],"^V","noise()","^W",3,"^X",true,"^Y",2704,"^Z",2704,"^[",["^10",["^11",["^10",[["~$x"],["~$x","~$y"],["~$x","~$y","~$z"]]]]],"^13","Returns the Perlin noise value at specified coordinates. Perlin\n noise is a random sequence generator producing a more natural\n ordered, harmonic succession of numbers compared to the standard\n random function. It was invented by Ken Perlin in the 1980s and\n been used since in graphical applications to produce procedural\n textures, natural motion, shapes, terrains etc.\n\n The main difference to the random function is that Perlin noise is\n defined in an infinite n-dimensional space where each pair of\n coordinates corresponds to a fixed semi-random value (fixed only for\n the lifespan of the program). The resulting value will always be\n between 0.0 and 1.0. Processing can compute 1D, 2D and 3D noise,\n depending on the number of coordinates given. The noise value can be\n animated by moving through the noise space and the 2nd and 3rd\n dimensions can also be interpreted as time.\n\n The actual noise is structured similar to an audio signal, in\n respect to the function's use of frequencies. Similar to the concept\n of harmonics in physics, perlin noise is computed over several\n octaves which are added together for the final result.\n\n Another way to adjust the character of the resulting sequence is the\n scale of the input coordinates. As the function works within an\n infinite space the value of the coordinates doesn't matter as such,\n only the distance between successive coordinates does (eg. when\n using noise within a loop). As a general rule the smaller the\n difference between coordinates, the smoother the resulting noise\n sequence will be. Steps of 0.005-0.03 work best for most\n applications, but this will differ depending on use."],"^R","1.0","^B","~$quil.core/noise","^S","Random","^T","out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$x"],["~$x","~$y"],["~$x","~$y","~$z"]]],"^[",["^10",[["~$x"],["~$x","~$y"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null,null]]],"^V","noise()","^15",["^10",[["~$x"],["~$x","~$y"],["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",2698,"^Z",2704,"^1;",3,"^1<",true,"^[",["^10",[["~$x"],["~$x","~$y"],["~$x","~$y","~$z"]]],"^13","Returns the Perlin noise value at specified coordinates. Perlin\n noise is a random sequence generator producing a more natural\n ordered, harmonic succession of numbers compared to the standard\n random function. It was invented by Ken Perlin in the 1980s and\n been used since in graphical applications to produce procedural\n textures, natural motion, shapes, terrains etc.\n\n The main difference to the random function is that Perlin noise is\n defined in an infinite n-dimensional space where each pair of\n coordinates corresponds to a fixed semi-random value (fixed only for\n the lifespan of the program). The resulting value will always be\n between 0.0 and 1.0. Processing can compute 1D, 2D and 3D noise,\n depending on the number of coordinates given. The noise value can be\n animated by moving through the noise space and the 2nd and 3rd\n dimensions can also be interpreted as time.\n\n The actual noise is structured similar to an audio signal, in\n respect to the function's use of frequencies. Similar to the concept\n of harmonics in physics, perlin noise is computed over several\n octaves which are added together for the final result.\n\n Another way to adjust the character of the resulting sequence is the\n scale of the input coordinates. As the function works within an\n infinite space the value of the coordinates doesn't matter as such,\n only the distance between successive coordinates does (eg. when\n using noise within a loop). As a general rule the smaller the\n difference between coordinates, the smoother the resulting noise\n sequence will be. Steps of 0.005-0.03 work best for most\n applications, but this will differ depending on use."],"~$push-style",["^ ","^O","Structure","^P",null,"^Q",["^ ","^O","Structure","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","pushStyle()","^W",3,"^X",true,"^Y",3128,"^Z",3128,"^[",["^10",["^11",["^10",[[]]]]],"^13","Saves the current style settings onto a 'style stack'. Use with\n pop-style which restores the prior settings. Note that these\n functions are always used together. They allow you to change the\n style settings and later return to what you had. When a new style is\n started with push-style, it builds on the current style\n information. The push-style and pop-style fns can be embedded to\n provide more control.\n\n The style information controlled by the following functions are\n included in the style: fill, stroke, tint, stroke-weight,\n stroke-cap, stroke-join, image-mode, rect-mode, ellipse-mode,\n shape-mode, color-mode, text-align, text-font, text-mode, text-size,\n text-leading, emissive, specular, shininess, and ambient"],"^R","1.0","^B","~$quil.core/push-style","^S",null,"^T","out/quil/core.cljc","^U",13,"^V","pushStyle()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3122,"^19","^1:","^Z",3128,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Saves the current style settings onto a 'style stack'. Use with\n pop-style which restores the prior settings. Note that these\n functions are always used together. They allow you to change the\n style settings and later return to what you had. When a new style is\n started with push-style, it builds on the current style\n information. The push-style and pop-style fns can be embedded to\n provide more control.\n\n The style information controlled by the following functions are\n included in the style: fill, stroke, tint, stroke-weight,\n stroke-cap, stroke-join, image-mode, rect-mode, ellipse-mode,\n shape-mode, color-mode, text-align, text-font, text-mode, text-size,\n text-leading, emissive, specular, shininess, and ambient"],"~$bezier-vertex",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Vertex","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^1F",["^ ","^18",false,"^1;",9,"^15",["^10",[["^5I","^5J","^5K","^5L","~$x","~$y"],["^5I","^5J","^5N","^5K","^5L","^5O","~$x","~$y","~$z"]]],"^[",["^10",[["^5I","^5J","^5K","^5L","~$x","~$y"],["^5I","^5J","^5N","^5K","^5L","^5O","~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","bezierVertex()","^W",3,"^X",true,"^Y",735,"^Z",735,"^[",["^10",["^11",["^10",[["^5I","^5J","^5K","^5L","~$x","~$y"],["^5I","^5J","^5N","^5K","^5L","^5O","~$x","~$y","~$z"]]]]],"^13","Specifies vertex coordinates for Bezier curves. Each call to\n bezier-vertex defines the position of two control points and one\n anchor point of a Bezier curve, adding a new segment to a line or\n shape. The first time bezier-vertex is used within a begin-shape\n call, it must be prefaced with a call to vertex to set the first\n anchor point. This function must be used between begin-shape and\n end-shape and only when there is no parameter specified to\n begin-shape."],"^R","1.0","^B","~$quil.core/bezier-vertex","^S","Vertex","^T","out/quil/core.cljc","^U",16,"^1F",["^ ","^18",false,"^1;",9,"^15",["^10",[["^5I","^5J","^5K","^5L","~$x","~$y"],["^5I","^5J","^5N","^5K","^5L","^5O","~$x","~$y","~$z"]]],"^[",["^10",[["^5I","^5J","^5K","^5L","~$x","~$y"],["^5I","^5J","^5N","^5K","^5L","^5O","~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","bezierVertex()","^15",["^10",[["^5I","^5J","^5K","^5L","~$x","~$y"],["^5I","^5J","^5N","^5K","^5L","^5O","~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",729,"^Z",735,"^1;",9,"^1<",true,"^[",["^10",[["^5I","^5J","^5K","^5L","~$x","~$y"],["^5I","^5J","^5N","^5K","^5L","^5O","~$x","~$y","~$z"]]],"^13","Specifies vertex coordinates for Bezier curves. Each call to\n bezier-vertex defines the position of two control points and one\n anchor point of a Bezier curve, adding a new segment to a line or\n shape. The first time bezier-vertex is used within a begin-shape\n call, it must be prefaced with a call to vertex to set the first\n anchor point. This function must be used between begin-shape and\n end-shape and only when there is no parameter specified to\n begin-shape."],"~$light-falloff",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Lights","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^V","lightFalloff()","^W",3,"^X",true,"^Y",2229,"^Z",2229,"^[",["^10",["^11",["^10",[["~$constant","~$linear","~$quadratic"]]]]],"^13","Sets the falloff rates for point lights, spot lights, and ambient\n lights. The parameters are used to determine the falloff with the\n following equation:\n\n d = distance from light position to vertex position\n falloff = 1 / (CONSTANT + d * LINEAR + (d*d) * QUADRATIC)\n\n Like fill, it affects only the elements which are created after it\n in the code. The default value is (light-falloff 1.0 0.0 0.0).\n Thinking about an ambient light with a falloff can be tricky. It is\n used, for example, if you wanted a region of your scene to be lit\n ambiently one color and another region to be lit ambiently by\n another color, you would use an ambient light with location and\n falloff. You can think of it as a point light that doesn't care\n which direction a surface is facing."],"^R","1.0","^B","~$quil.core/light-falloff","^S","Lights","^T","out/quil/core.cljc","^U",16,"^V","lightFalloff()","^15",["^10",[["^;I","^;J","^;K"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2223,"^19","^1:","^Z",2229,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["^;I","^;J","^;K"]]]]],"^13","Sets the falloff rates for point lights, spot lights, and ambient\n lights. The parameters are used to determine the falloff with the\n following equation:\n\n d = distance from light position to vertex position\n falloff = 1 / (CONSTANT + d * LINEAR + (d*d) * QUADRATIC)\n\n Like fill, it affects only the elements which are created after it\n in the code. The default value is (light-falloff 1.0 0.0 0.0).\n Thinking about an ambient light with a falloff can be tricky. It is\n used, for example, if you wanted a region of your scene to be lit\n ambiently one color and another region to be lit ambiently by\n another color, you would use an ambient light with location and\n falloff. You can think of it as a point light that doesn't care\n which direction a surface is facing."],"~$noise-detail",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Random","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["~$octaves"],["^;N","~$falloff"]]],"^[",["^10",[["^;N"],["^;N","^;O"]]],"^17",["^10",[null,null]]],"^V","noiseDetail()","^W",3,"^X",true,"^Y",2744,"^Z",2744,"^[",["^10",["^11",["^10",[["^;N"],["^;N","^;O"]]]]],"^13","Adjusts the character and level of detail produced by the Perlin\n noise function. Similar to harmonics in physics, noise is computed\n over several octaves. Lower octaves contribute more to the output\n signal and as such define the overal intensity of the noise, whereas\n higher octaves create finer grained details in the noise\n sequence. By default, noise is computed over 4 octaves with each\n octave contributing exactly half than its predecessor, starting at\n 50% strength for the 1st octave. This falloff amount can be changed\n by adding an additional function parameter. Eg. a falloff factor of\n 0.75 means each octave will now have 75% impact (25% less) of the\n previous lower octave. Any value between 0.0 and 1.0 is valid,\n however note that values greater than 0.5 might result in greater\n than 1.0 values returned by noise.\n\n By changing these parameters, the signal created by the noise\n function can be adapted to fit very specific needs and\n characteristics."],"^R","1.0","^B","~$quil.core/noise-detail","^S","Random","^T","out/quil/core.cljc","^U",15,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^;N"],["^;N","^;O"]]],"^[",["^10",[["^;N"],["^;N","^;O"]]],"^17",["^10",[null,null]]],"^V","noiseDetail()","^15",["^10",[["^;N"],["^;N","^;O"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2738,"^Z",2744,"^1;",2,"^1<",true,"^[",["^10",[["^;N"],["^;N","^;O"]]],"^13","Adjusts the character and level of detail produced by the Perlin\n noise function. Similar to harmonics in physics, noise is computed\n over several octaves. Lower octaves contribute more to the output\n signal and as such define the overal intensity of the noise, whereas\n higher octaves create finer grained details in the noise\n sequence. By default, noise is computed over 4 octaves with each\n octave contributing exactly half than its predecessor, starting at\n 50% strength for the 1st octave. This falloff amount can be changed\n by adding an additional function parameter. Eg. a falloff factor of\n 0.75 means each octave will now have 75% impact (25% less) of the\n previous lower octave. Any value between 0.0 and 1.0 is valid,\n however note that values greater than 0.5 might result in greater\n than 1.0 values returned by noise.\n\n By changing these parameters, the signal created by the noise\n function can be adapted to fit very specific needs and\n characteristics."],"~$save",["^ ","^O","Output","^P",null,"^Q",["^ ","^O","Output","^R","1.0","^S","Image","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","save()","^W",3,"^X",true,"^Y",3551,"^Z",3551,"^[",["^10",["^11",["^10",[["^56"]]]]],"^13","Saves an image from the display window. Images are saved in TIFF,\n TARGA, JPEG, and PNG format depending on the extension within the\n filename parameter. For example, image.tif will have a TIFF image\n and image.png will save a PNG image. If no extension is included in\n the filename, the image will save in TIFF format and .tif will be\n added to the name. All images saved from the main drawing window\n will be opaque. To save images without a background, use\n create-graphics."],"^R","1.0","^B","~$quil.core/save","^S","Image","^T","out/quil/core.cljc","^U",7,"^V","save()","^15",["^10",[["^56"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3545,"^19","^1:","^Z",3551,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^56"]]]]],"^13","Saves an image from the display window. Images are saved in TIFF,\n TARGA, JPEG, and PNG format depending on the extension within the\n filename parameter. For example, image.tif will have a TIFF image\n and image.png will save a PNG image. If no extension is included in\n the filename, the image will save in TIFF format and .tif will be\n added to the name. All images saved from the main drawing window\n will be opaque. To save images without a background, use\n create-graphics."],"~$curve-point",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Curves","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","curvePoint()","^W",3,"^X",true,"^Y",1362,"^Z",1362,"^[",["^10",["^11",["^10",[["~$a","~$b","~$c","~$d","~$t"]]]]],"^13","Evalutes the curve at point t for points a, b, c, d. The parameter\n t varies between 0 and 1, a and d are points on the curve, and b c\n and are the control points. This can be done once with the x\n coordinates and a second time with the y coordinates to get the\n location of a curve at t."],"^R","1.0","^B","~$quil.core/curve-point","^S","Curves","^T","out/quil/core.cljc","^U",14,"^V","curvePoint()","^15",["^10",[["~$a","~$b","~$c","~$d","~$t"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1356,"^19","^1:","^Z",1362,"^1;",5,"^1<",true,"^[",["^10",["^11",["^10",[["~$a","~$b","~$c","~$d","~$t"]]]]],"^13","Evalutes the curve at point t for points a, b, c, d. The parameter\n t varies between 0 and 1, a and d are points on the curve, and b c\n and are the control points. This can be done once with the x\n coordinates and a second time with the y coordinates to get the\n location of a curve at t."],"~$state",["^ ","^O","State","^P",null,"^Q",["^ ","^O","State","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["~$key"]]],"^[",["^10",[[],["^;V"]]],"^17",["^10",[null,null]]],"^W",3,"^X",true,"^Y",215,"^Z",215,"^[",["^10",["^11",["^10",[[],["^;V"]]]]],"^13","Retrieve sketch-specific state by key. Must initially call\n set-state! to store state. If no parameter passed whole\n state map is returned.\n\n (set-state! :foo 1)\n (state :foo) ;=> 1\n (state) ;=> {:foo 1}"],"^R","1.0","^B","~$quil.core/state","^S",null,"^T","out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",1,"^15",["^10",[[],["^;V"]]],"^[",["^10",[[],["^;V"]]],"^17",["^10",[null,null]]],"^15",["^10",[[],["^;V"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",210,"^Z",215,"^1;",1,"^1<",true,"^[",["^10",[[],["^;V"]]],"^13","Retrieve sketch-specific state by key. Must initially call\n set-state! to store state. If no parameter passed whole\n state map is returned.\n\n (set-state! :foo 1)\n (state :foo) ;=> 1\n (state) ;=> {:foo 1}"],"~$load-shader",["^ ","^O","Rendering","^P",null,"^Q",["^ ","^O","Rendering","^R","2.0","^S","Shaders","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["~$fragment-filename"],["^;Y","~$vertex-filename"]]],"^[",["^10",[["^;Y"],["^;Y","^;Z"]]],"^17",["^10",[null,null]]],"^V","loadShader()","^W",3,"^X",true,"^Y",2404,"^Z",2404,"^[",["^10",["^11",["^10",[["^;Y"],["^;Y","^;Z"]]]]],"^13","Loads a shader into the PShader object. Shaders are compatible with the\n P2D and P3D renderers, but not with the default renderer."],"^R","2.0","^B","~$quil.core/load-shader","^S","Shaders","^T","out/quil/core.cljc","^U",14,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^;Y"],["^;Y","^;Z"]]],"^[",["^10",[["^;Y"],["^;Y","^;Z"]]],"^17",["^10",[null,null]]],"^V","loadShader()","^15",["^10",[["^;Y"],["^;Y","^;Z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2398,"^Z",2404,"^1;",2,"^1<",true,"^[",["^10",[["^;Y"],["^;Y","^;Z"]]],"^13","Loads a shader into the PShader object. Shaders are compatible with the\n P2D and P3D renderers, but not with the default renderer."],"~$resize",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","2.1.0","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^V","resize()","^W",3,"^4=","http://processing.org/reference/PImage_resize_.html","^X",true,"^Y",3417,"^Z",3417,"^[",["^10",["^11",["^10",[["^2=","~$w","~$h"]]]]],"^13","Resize the image to a new width and height.\n To make the image scale proportionally, use 0 as the value for the wide or\n high parameter. For instance, to make the width of an image 150 pixels,\n and change the height using the same proportion, use resize(150, 0).\n\n Even though a PGraphics is technically a PImage, it is not possible\n to rescale the image data found in a PGraphics.\n (It's simply not possible to do this consistently across renderers:\n technically infeasible with P3D, or what would it even do with PDF?)\n If you want to resize PGraphics content, first get a copy of its image data\n using the get() method, and call resize() on the PImage that is returned."],"^R","2.1.0","^B","~$quil.core/resize","^T","out/quil/core.cljc","^U",9,"^V","resize()","^15",["^10",[["^2=","~$w","~$h"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^4=","http://processing.org/reference/PImage_resize_.html","^18",false,"^X",true,"^Y",3411,"^19","^1:","^Z",3417,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["^2=","~$w","~$h"]]]]],"^13","Resize the image to a new width and height.\n To make the image scale proportionally, use 0 as the value for the wide or\n high parameter. For instance, to make the width of an image 150 pixels,\n and change the height using the same proportion, use resize(150, 0).\n\n Even though a PGraphics is technically a PImage, it is not possible\n to rescale the image data found in a PGraphics.\n (It's simply not possible to do this consistently across renderers:\n technically infeasible with P3D, or what would it even do with PDF?)\n If you want to resize PGraphics content, first get a copy of its image data\n using the get() method, and call resize() on the PImage that is returned."],"~$normal",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Lights","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^V","normal()","^W",3,"^X",true,"^Y",2837,"^Z",2837,"^[",["^10",["^11",["^10",[["^60","^61","^62"]]]]],"^13","Sets the current normal vector. This is for drawing three\n dimensional shapes and surfaces and specifies a vector perpendicular\n to the surface of the shape which determines how lighting affects\n it. Processing attempts to automatically assign normals to shapes,\n but since that's imperfect, this is a better option when you want\n more control. This function is identical to glNormal3f() in OpenGL."],"^R","1.0","^B","~$quil.core/normal","^S","Lights","^T","out/quil/core.cljc","^U",9,"^V","normal()","^15",["^10",[["^60","^61","^62"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2831,"^19","^1:","^Z",2837,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["^60","^61","^62"]]]]],"^13","Sets the current normal vector. This is for drawing three\n dimensional shapes and surfaces and specifies a vector perpendicular\n to the surface of the shape which determines how lighting affects\n it. Processing attempts to automatically assign normals to shapes,\n but since that's imperfect, this is a better option when you want\n more control. This function is identical to glNormal3f() in OpenGL."],"~$perspective",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Camera","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[[],["~$fovy","~$aspect","~$z-near","~$z-far"]]],"^[",["^10",[[],["^<5","^<6","^<7","^<8"]]],"^17",["^10",[null,null]]],"^V","perspective()","^W",3,"^X",true,"^Y",2909,"^Z",2909,"^[",["^10",["^11",["^10",[[],["^<5","^<6","^<7","^<8"]]]]],"^13","Sets a perspective projection applying foreshortening, making\n distant objects appear smaller than closer ones. The parameters\n define a viewing volume with the shape of truncated pyramid. Objects\n near to the front of the volume appear their actual size, while\n farther objects appear smaller. This projection simulates the\n perspective of the world more accurately than orthographic\n projection. The version of perspective without parameters sets the\n default perspective and the version with four parameters allows the\n programmer to set the area precisely. The default values are:\n perspective(PI/3.0, width/height, cameraZ/10.0, cameraZ*10.0) where\n cameraZ is ((height/2.0) / tan(PI*60.0/360.0));"],"^R","1.0","^B","~$quil.core/perspective","^S","Camera","^T","out/quil/core.cljc","^U",14,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[[],["^<5","^<6","^<7","^<8"]]],"^[",["^10",[[],["^<5","^<6","^<7","^<8"]]],"^17",["^10",[null,null]]],"^V","perspective()","^15",["^10",[[],["^<5","^<6","^<7","^<8"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2903,"^Z",2909,"^1;",4,"^1<",true,"^[",["^10",[[],["^<5","^<6","^<7","^<8"]]],"^13","Sets a perspective projection applying foreshortening, making\n distant objects appear smaller than closer ones. The parameters\n define a viewing volume with the shape of truncated pyramid. Objects\n near to the front of the volume appear their actual size, while\n farther objects appear smaller. This projection simulates the\n perspective of the world more accurately than orthographic\n projection. The version of perspective without parameters sets the\n default perspective and the version with four parameters allows the\n programmer to set the area precisely. The default values are:\n perspective(PI/3.0, width/height, cameraZ/10.0, cameraZ*10.0) where\n cameraZ is ((height/2.0) / tan(PI*60.0/360.0));"],"~$seconds",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Time & Date","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","second()","^W",3,"^X",false,"^Y",3684,"^Z",3684,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current second as a value from 0 - 59."],"^R","1.0","^B","~$quil.core/seconds","^S","Time & Date","^T","out/quil/core.cljc","^U",10,"^V","second()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",3678,"^19","^1:","^Z",3684,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current second as a value from 0 - 59."],"~$hint",["^ ","^O","Rendering","^P",null,"^Q",["^ ","^O","Rendering","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","hint()","^W",3,"^4=",null,"^X",true,"^Y",1983,"^Z",1983,"^[",["^10",["^11",["^10",[["~$hint-type"]]]]],"^13","Set various hints and hacks for the renderer. This is used to\n handle obscure rendering features that cannot be implemented in a\n consistent manner across renderers. Many options will often graduate\n to standard features instead of hints over time.\n\n Options:\n\n :enable-native-fonts - Use the native version fonts when they are\n installed, rather than the bitmapped version from a .vlw\n file. This is useful with the default (or JAVA2D) renderer\n setting, as it will improve font rendering speed. This is not\n enabled by default, because it can be misleading while testing\n because the type will look great on your machine (because you have\n the font installed) but lousy on others' machines if the identical\n font is unavailable. This option can only be set per-sketch, and\n must be called before any use of text-font.\n\n :disable-native-fonts - Disables native font support.\n\n :disable-depth-test - Disable the zbuffer, allowing you to draw on\n top of everything at will. When depth testing is disabled, items\n will be drawn to the screen sequentially, like a painting. This\n hint is most often used to draw in 3D, then draw in 2D on top of\n it (for instance, to draw GUI controls in 2D on top of a 3D\n interface). Starting in release 0149, this will also clear the\n depth buffer. Restore the default with :enable-depth-test\n but note that with the depth buffer cleared, any 3D drawing that\n happens later in draw will ignore existing shapes on the screen.\n\n :enable-depth-test - Enables the zbuffer.\n\n :enable-depth-sort - Enable primitive z-sorting of triangles and\n lines in :p3d and :opengl rendering modes. This can slow\n performance considerably, and the algorithm is not yet perfect.\n\n :disable-depth-sort - Disables hint :enable-depth-sort\n\n :disable-opengl-errors - Speeds up the OPENGL renderer setting\n by not checking for errors while running.\n\n :enable-opengl-errors - Turns on OpenGL error checking\n\n :enable-depth-mask\n :disable-depth-mask\n\n :enable-optimized-stroke\n :disable-optimized-stroke\n :enable-retina-pixels\n :disable-retina-pixels\n :enable-stroke-perspective\n :disable-stroke-perspective\n :enable-stroke-pure\n :disable-stroke-pure\n :enable-texture-mipmaps\n :disable-texture-mipmaps\n"],"^R","1.0","^B","~$quil.core/hint","^S",null,"^T","out/quil/core.cljc","^U",7,"^V","hint()","^15",["^10",[["^<="]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^4=",null,"^18",false,"^X",true,"^Y",1976,"^19","^1:","^Z",1983,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^<="]]]]],"^13","Set various hints and hacks for the renderer. This is used to\n handle obscure rendering features that cannot be implemented in a\n consistent manner across renderers. Many options will often graduate\n to standard features instead of hints over time.\n\n Options:\n\n :enable-native-fonts - Use the native version fonts when they are\n installed, rather than the bitmapped version from a .vlw\n file. This is useful with the default (or JAVA2D) renderer\n setting, as it will improve font rendering speed. This is not\n enabled by default, because it can be misleading while testing\n because the type will look great on your machine (because you have\n the font installed) but lousy on others' machines if the identical\n font is unavailable. This option can only be set per-sketch, and\n must be called before any use of text-font.\n\n :disable-native-fonts - Disables native font support.\n\n :disable-depth-test - Disable the zbuffer, allowing you to draw on\n top of everything at will. When depth testing is disabled, items\n will be drawn to the screen sequentially, like a painting. This\n hint is most often used to draw in 3D, then draw in 2D on top of\n it (for instance, to draw GUI controls in 2D on top of a 3D\n interface). Starting in release 0149, this will also clear the\n depth buffer. Restore the default with :enable-depth-test\n but note that with the depth buffer cleared, any 3D drawing that\n happens later in draw will ignore existing shapes on the screen.\n\n :enable-depth-test - Enables the zbuffer.\n\n :enable-depth-sort - Enable primitive z-sorting of triangles and\n lines in :p3d and :opengl rendering modes. This can slow\n performance considerably, and the algorithm is not yet perfect.\n\n :disable-depth-sort - Disables hint :enable-depth-sort\n\n :disable-opengl-errors - Speeds up the OPENGL renderer setting\n by not checking for errors while running.\n\n :enable-opengl-errors - Turns on OpenGL error checking\n\n :enable-depth-mask\n :disable-depth-mask\n\n :enable-optimized-stroke\n :disable-optimized-stroke\n :enable-retina-pixels\n :disable-retina-pixels\n :enable-stroke-perspective\n :disable-stroke-perspective\n :enable-stroke-pure\n :disable-stroke-pure\n :enable-texture-mipmaps\n :disable-texture-mipmaps\n"],"~$sphere-detail",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","3D Primitives","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["~$res"],["~$ures","~$vres"]]],"^[",["^10",[["^<@"],["^<A","^<B"]]],"^17",["^10",[null,null]]],"^V","sphereDetail()","^W",3,"^X",true,"^Y",3933,"^Z",3933,"^[",["^10",["^11",["^10",[["^<@"],["^<A","^<B"]]]]],"^13","Controls the detail used to render a sphere by adjusting the number\n of vertices of the sphere mesh. The default resolution is 30, which\n creates a fairly detailed sphere definition with vertices every\n 360/30 = 12 degrees. If you're going to render a great number of\n spheres per frame, it is advised to reduce the level of detail using\n this function. The setting stays active until sphere-detail is\n called again with a new parameter and so should not be called prior\n to every sphere statement, unless you wish to render spheres with\n different settings, e.g. using less detail for smaller spheres or\n ones further away from the camera. To controla the detail of the\n horizontal and vertical resolution independently, use the version of\n the functions with two parameters."],"^R","1.0","^B","~$quil.core/sphere-detail","^S","3D Primitives","^T","out/quil/core.cljc","^U",16,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^<@"],["^<A","^<B"]]],"^[",["^10",[["^<@"],["^<A","^<B"]]],"^17",["^10",[null,null]]],"^V","sphereDetail()","^15",["^10",[["^<@"],["^<A","^<B"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3927,"^Z",3933,"^1;",2,"^1<",true,"^[",["^10",[["^<@"],["^<A","^<B"]]],"^13","Controls the detail used to render a sphere by adjusting the number\n of vertices of the sphere mesh. The default resolution is 30, which\n creates a fairly detailed sphere definition with vertices every\n 360/30 = 12 degrees. If you're going to render a great number of\n spheres per frame, it is advised to reduce the level of detail using\n this function. The setting stays active until sphere-detail is\n called again with a new parameter and so should not be called prior\n to every sphere statement, unless you wish to render spheres with\n different settings, e.g. using less detail for smaller spheres or\n ones further away from the camera. To controla the detail of the\n horizontal and vertical resolution independently, use the version of\n the functions with two parameters."],"~$vertex",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Vertex","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"],["~$x","~$y","~$u","~$v"],["~$x","~$y","~$z","~$u","~$v"]]],"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"],["~$x","~$y","~$u","~$v"],["~$x","~$y","~$z","~$u","~$v"]]],"^17",["^10",[null,null,null,null]]],"^V","vertex()","^W",3,"^X",true,"^Y",4580,"^Z",4580,"^[",["^10",["^11",["^10",[["~$x","~$y"],["~$x","~$y","~$z"],["~$x","~$y","~$u","~$v"],["~$x","~$y","~$z","~$u","~$v"]]]]],"^13","All shapes are constructed by connecting a series of\n vertices. vertex is used to specify the vertex coordinates for\n points, lines, triangles, quads, and polygons and is used\n exclusively within the begin-shape and end-shape fns.\n\n Drawing a vertex in 3D using the z parameter requires the :p3d or\n :opengl renderers to be used.\n\n This function is also used to map a texture onto the geometry. The\n texture fn declares the texture to apply to the geometry and the u\n and v coordinates set define the mapping of this texture to the\n form. By default, the coordinates used for u and v are specified in\n relation to the image's size in pixels, but this relation can be\n changed with texture-mode."],"^R","1.0","^B","~$quil.core/vertex","^S","Vertex","^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"],["~$x","~$y","~$u","~$v"],["~$x","~$y","~$z","~$u","~$v"]]],"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"],["~$x","~$y","~$u","~$v"],["~$x","~$y","~$z","~$u","~$v"]]],"^17",["^10",[null,null,null,null]]],"^V","vertex()","^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"],["~$x","~$y","~$u","~$v"],["~$x","~$y","~$z","~$u","~$v"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",4574,"^Z",4580,"^1;",5,"^1<",true,"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"],["~$x","~$y","~$u","~$v"],["~$x","~$y","~$z","~$u","~$v"]]],"^13","All shapes are constructed by connecting a series of\n vertices. vertex is used to specify the vertex coordinates for\n points, lines, triangles, quads, and polygons and is used\n exclusively within the begin-shape and end-shape fns.\n\n Drawing a vertex in 3D using the z parameter requires the :p3d or\n :opengl renderers to be used.\n\n This function is also used to map a texture onto the geometry. The\n texture fn declares the texture to apply to the geometry and the u\n and v coordinates set define the mapping of this texture to the\n form. By default, the coordinates used for u and v are specified in\n relation to the image's size in pixels, but this relation can be\n changed with texture-mode."],"~$delay-frame",["^ ","^O","Structure","^P",null,"^Q",["^ ","^O","Structure","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","delay()","^W",3,"^4=",null,"^X",true,"^Y",1456,"^Z",1456,"^[",["^10",["^11",["^10",[["~$freeze-ms"]]]]],"^13","Forces the program to stop running for a specified time. Delay\n times are specified in thousandths of a second, therefore the\n function call (delay 3000) will stop the program for three\n seconds. Because the screen is updated only at the end of draw,\n the program may appear to 'freeze', because the screen will not\n update when the delay fn is used. This function has no affect\n inside setup."],"^R","1.0","^B","~$quil.core/delay-frame","^S",null,"^T","out/quil/core.cljc","^U",14,"^V","delay()","^15",["^10",[["^<G"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^4=",null,"^18",false,"^X",true,"^Y",1449,"^19","^1:","^Z",1456,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^<G"]]]]],"^13","Forces the program to stop running for a specified time. Delay\n times are specified in thousandths of a second, therefore the\n function call (delay 3000) will stop the program for three\n seconds. Because the screen is updated only at the end of draw,\n the program may appear to 'freeze', because the screen will not\n update when the delay fn is used. This function has no affect\n inside setup."],"~$horizontal-alignment-modes",["^ ","^B","~$quil.core/horizontal-alignment-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",66,"^U",28,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",66,"^W",2,"^Z",66,"^U",28],"^1?","^1@"],"~$spot-light",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Lights","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",11,"^15",["^10",[["~$r","~$g","~$b","~$x","~$y","~$z","^60","^61","^62","^12","~$concentration"],[["~$r","~$g","~$b"],["~$x","~$y","~$z"],["^60","^61","^62"],"^12","^<L"]]],"^[",["^10",[["~$r","~$g","~$b","~$x","~$y","~$z","^60","^61","^62","^12","^<L"],[["~$r","~$g","~$b"],["~$x","~$y","~$z"],["^60","^61","^62"],"^12","^<L"]]],"^17",["^10",[null,null]]],"^V","spotLight()","^W",3,"^X",true,"^Y",3955,"^Z",3955,"^[",["^10",["^11",["^10",[["~$r","~$g","~$b","~$x","~$y","~$z","^60","^61","^62","^12","^<L"],[["~$r","~$g","~$b"],["~$x","~$y","~$z"],["^60","^61","^62"],"^12","^<L"]]]]],"^13","Adds a spot light. Lights need to be included in the draw to\n remain persistent in a looping program. Placing them in the setup\n of a looping program will cause them to only have an effect the\n first time through the loop. The affect of the r, g, and b\n parameters is determined by the current color mode. The x, y, and z\n parameters specify the position of the light and nx, ny, nz specify\n the direction or light. The angle parameter affects angle of the\n spotlight cone."],"^R","1.0","^B","~$quil.core/spot-light","^S","Lights","^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",false,"^1;",11,"^15",["^10",[["~$r","~$g","~$b","~$x","~$y","~$z","^60","^61","^62","^12","^<L"],[["~$r","~$g","~$b"],["~$x","~$y","~$z"],["^60","^61","^62"],"^12","^<L"]]],"^[",["^10",[["~$r","~$g","~$b","~$x","~$y","~$z","^60","^61","^62","^12","^<L"],[["~$r","~$g","~$b"],["~$x","~$y","~$z"],["^60","^61","^62"],"^12","^<L"]]],"^17",["^10",[null,null]]],"^V","spotLight()","^15",["^10",[["~$r","~$g","~$b","~$x","~$y","~$z","^60","^61","^62","^12","^<L"],[["~$r","~$g","~$b"],["~$x","~$y","~$z"],["^60","^61","^62"],"^12","^<L"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3949,"^Z",3955,"^1;",11,"^1<",true,"^[",["^10",[["~$r","~$g","~$b","~$x","~$y","~$z","^60","^61","^62","^12","^<L"],[["~$r","~$g","~$b"],["~$x","~$y","~$z"],["^60","^61","^62"],"^12","^<L"]]],"^13","Adds a spot light. Lights need to be included in the draw to\n remain persistent in a looping program. Placing them in the setup\n of a looping program will cause them to only have an effect the\n first time through the loop. The affect of the r, g, and b\n parameters is determined by the current color mode. The x, y, and z\n parameters specify the position of the light and nx, ny, nz specify\n the direction or light. The angle parameter affects angle of the\n spotlight cone."],"~$target-frame-rate",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.5.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",20,"^W",3,"^X",true,"^Y",4126,"^Z",4126,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the target framerate specified with the fn frame-rate"],"^R","1.5.0","^B","~$quil.core/target-frame-rate","^S",null,"^T","out/quil/core.cljc","^U",20,"^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4121,"^19","^1:","^Z",4126,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the target framerate specified with the fn frame-rate"],"~$tint",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","tint()","^W",3,"^X",true,"^Y",4461,"^Z",4461,"^[",["^10",["^11",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]]]],"^13","Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."],"^R","1.0","^B","~$quil.core/tint","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","tint()","^15",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",4455,"^Z",4461,"^1;",4,"^1<",true,"^[",["^10",[["^3I"],["^3I","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^13","Sets the fill value for displaying images. Images can be tinted to\n specified colors or made transparent by setting the alpha.\n\n To make an image transparent, but not change it's color, use white\n as the tint color and specify an alpha value. For instance,\n tint(255, 128) will make an image 50% transparent (unless\n colorMode() has been used).\n\n The value for the parameter gray must be less than or equal to the\n current maximum value as specified by colorMode(). The default\n maximum value is 255.\n\n Also used to control the coloring of textures in 3D."],"~$bezier-tangent",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Curves","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",17,"^V","bezierTangent()","^W",3,"^X",true,"^Y",722,"^Z",722,"^[",["^10",["^11",["^10",[["~$a","~$b","~$c","~$d","~$t"]]]]],"^13","Calculates the tangent of a point on a Bezier curve.\n (See http://en.wikipedia.org/wiki/Tangent)"],"^R","1.0","^B","~$quil.core/bezier-tangent","^S","Curves","^T","out/quil/core.cljc","^U",17,"^V","bezierTangent()","^15",["^10",[["~$a","~$b","~$c","~$d","~$t"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",716,"^19","^1:","^Z",722,"^1;",5,"^1<",true,"^[",["^10",["^11",["^10",[["~$a","~$b","~$c","~$d","~$t"]]]]],"^13","Calculates the tangent of a point on a Bezier curve.\n (See http://en.wikipedia.org/wiki/Tangent)"],"~$asin",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Trigonometry","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","asin()","^W",3,"^X",false,"^Y",444,"^Z",444,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","The inverse of sin, returns the arc sine of a value. This function\n expects the values in the range of -1 to 1 and values are returned\n in the range -PI/2 to PI/2."],"^R","1.0","^B","~$quil.core/asin","^S","Trigonometry","^T","out/quil/core.cljc","^U",7,"^V","asin()","^15",["^10",[["~$n"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",438,"^19","^1:","^Z",444,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","The inverse of sin, returns the arc sine of a value. This function\n expects the values in the range of -1 to 1 and values are returned\n in the range -PI/2 to PI/2."],"~$lerp",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","lerp()","^W",3,"^X",false,"^Y",2268,"^Z",2268,"^[",["^10",["^11",["^10",[["^8:","^8;","^2Q"]]]]],"^13","Calculates a number between two numbers at a specific\n increment. The amt parameter is the amount to interpolate between\n the two values where 0.0 equal to the first point, 0.1 is very near\n the first point, 0.5 is half-way in between, etc. The lerp function\n is convenient for creating motion along a straight path and for\n drawing dotted lines."],"^R","1.0","^B","~$quil.core/lerp","^S","Calculation","^T","out/quil/core.cljc","^U",7,"^V","lerp()","^15",["^10",[["^8:","^8;","^2Q"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",2262,"^19","^1:","^Z",2268,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["^8:","^8;","^2Q"]]]]],"^13","Calculates a number between two numbers at a specific\n increment. The amt parameter is the amount to interpolate between\n the two values where 0.0 equal to the first point, 0.1 is very near\n the first point, 0.5 is half-way in between, etc. The lerp function\n is convenient for creating motion along a straight path and for\n drawing dotted lines."],"~$unhex",["^ ","^O","Data","^P",null,"^Q",["^ ","^O","Data","^4R",false,"^S","Conversion","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^V","hex()","^W",3,"^Y",4538,"^Z",4538,"^[",["^10",["^11",["^10",[["~$hex-str"]]]]],"^13","Converts a String representation of a hexadecimal number to its\n equivalent integer value."],"^4R",false,"^B","~$quil.core/unhex","^S","Conversion","^T","out/quil/core.cljc","^U",8,"^V","hex()","^15",["^10",[["^<Y"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^Y",4533,"^19","^1:","^Z",4538,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^<Y"]]]]],"^13","Converts a String representation of a hexadecimal number to its\n equivalent integer value."],"~$begin-camera",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Camera","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","beginCamera()","^W",3,"^X",true,"^Y",585,"^Z",585,"^[",["^10",["^11",["^10",[[]]]]],"^13","Sets the matrix mode to the camera matrix so calls such as\n translate, rotate, apply-matrix and reset-matrix affect the\n camera. begin-camera should always be used with a following\n end-camera and pairs of begin-camera and end-camera cannot be\n nested.\n\n For most situations the camera function will be sufficient."],"^R","1.0","^B","~$quil.core/begin-camera","^S","Camera","^T","out/quil/core.cljc","^U",15,"^V","beginCamera()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",579,"^19","^1:","^Z",585,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Sets the matrix mode to the camera matrix so calls such as\n translate, rotate, apply-matrix and reset-matrix affect the\n camera. begin-camera should always be used with a following\n end-camera and pairs of begin-camera and end-camera cannot be\n nested.\n\n For most situations the camera function will be sufficient."],"~$text-num",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^:7","~$x","~$y"],["^:7","~$x","~$y","~$z"]]],"^[",["^10",[["^:7","~$x","~$y"],["^:7","~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","text()","^W",3,"^X",true,"^Y",4160,"^Z",4160,"^[",["^10",["^11",["^10",[["^:7","~$x","~$y"],["^:7","~$x","~$y","~$z"]]]]],"^13","Draws a number to the screen in the specified position. See text fn\n for more details."],"^R","1.0","^B","~$quil.core/text-num","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^:7","~$x","~$y"],["^:7","~$x","~$y","~$z"]]],"^[",["^10",[["^:7","~$x","~$y"],["^:7","~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","text()","^15",["^10",[["^:7","~$x","~$y"],["^:7","~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4154,"^Z",4160,"^1;",4,"^1<",true,"^[",["^10",[["^:7","~$x","~$y"],["^:7","~$x","~$y","~$z"]]],"^13","Draws a number to the screen in the specified position. See text fn\n for more details."],"~$round",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^V","round()","^W",3,"^X",false,"^Y",3527,"^Z",3527,"^[",["^10",["^11",["^10",[["^34"]]]]],"^13","Calculates the integer closest to the value parameter. For example,\n (round 9.2) returns the value 9."],"^R","1.0","^B","~$quil.core/round","^S","Calculation","^T","out/quil/core.cljc","^U",8,"^V","round()","^15",["^10",[["^34"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",3521,"^19","^1:","^Z",3527,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^34"]]]]],"^13","Calculates the integer closest to the value parameter. For example,\n (round 9.2) returns the value 9."],"~$background-image",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",19,"^V","background()","^W",3,"^X",true,"^Y",572,"^Z",572,"^[",["^10",["^11",["^10",[["^2="]]]]],"^13","Specify an image to be used as the background for a sketch. Its\n width and height must be the same size as the sketch window. Images\n used as background will ignore the current tint setting."],"^R","1.0","^B","~$quil.core/background-image","^S","Setting","^T","out/quil/core.cljc","^U",19,"^V","background()","^15",["^10",[["^2="]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",566,"^19","^1:","^Z",572,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^2="]]]]],"^13","Specify an image to be used as the background for a sketch. Its\n width and height must be the same size as the sketch window. Images\n used as background will ignore the current tint setting."],"~$load-shape",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","loadShape()","^W",3,"^X",true,"^Y",2418,"^Z",2418,"^[",["^10",["^11",["^10",[["^56"]]]]],"^13","Load a geometry from a file as a PShape."],"^R","1.0","^B","~$quil.core/load-shape","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",13,"^V","loadShape()","^15",["^10",[["^56"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2412,"^19","^1:","^Z",2418,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^56"]]]]],"^13","Load a geometry from a file as a PShape."],"~$vertical-alignment-modes",["^ ","^B","~$quil.core/vertical-alignment-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",67,"^U",26,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",67,"^W",2,"^Z",67,"^U",26],"^1?","^1@"],"~$blend-color",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","blendColor()","^W",3,"^4=",null,"^X",false,"^Y",828,"^Z",828,"^[",["^10",["^11",["^10",[["^3T","^3U","^1I"]]]]],"^13","Blends two color values together based on the blending mode given specified\n with the mode keyword.\n\n Available blend modes are:\n\n :blend - linear interpolation of colours: C = A*factor + B\n :add - additive blending with white clip:\n C = min(A*factor + B, 255)\n :subtract - subtractive blending with black clip:\n C = max(B - A*factor, 0)\n :darkest - only the darkest colour succeeds:\n C = min(A*factor, B)\n :lightest - only the lightest colour succeeds:\n C = max(A*factor, B)\n :difference - subtract colors from underlying image.\n :exclusion - similar to :difference, but less extreme.\n :multiply - Multiply the colors, result will always be darker.\n :screen - Opposite multiply, uses inverse values of the colors.\n :overlay - A mix of :multiply and :screen. Multiplies dark values\n and screens light values.\n :hard-light - :screen when greater than 50% gray, :multiply when\n lower.\n :soft-light - Mix of :darkest and :lightest. Works like :overlay,\n but not as harsh.\n :dodge - Lightens light tones and increases contrast, ignores\n darks.\n Called \"Color Dodge\" in Illustrator and Photoshop.\n :burn - Darker areas are applied, increasing contrast, ignores\n lights. Called \"Color Burn\" in Illustrator and\n Photoshop."],"^R","1.0","^B","~$quil.core/blend-color","^S","Creating & Reading","^T","out/quil/core.cljc","^U",14,"^V","blendColor()","^15",["^10",[["^3T","^3U","^1I"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^4=",null,"^18",false,"^X",false,"^Y",821,"^19","^1:","^Z",828,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["^3T","^3U","^1I"]]]]],"^13","Blends two color values together based on the blending mode given specified\n with the mode keyword.\n\n Available blend modes are:\n\n :blend - linear interpolation of colours: C = A*factor + B\n :add - additive blending with white clip:\n C = min(A*factor + B, 255)\n :subtract - subtractive blending with black clip:\n C = max(B - A*factor, 0)\n :darkest - only the darkest colour succeeds:\n C = min(A*factor, B)\n :lightest - only the lightest colour succeeds:\n C = max(A*factor, B)\n :difference - subtract colors from underlying image.\n :exclusion - similar to :difference, but less extreme.\n :multiply - Multiply the colors, result will always be darker.\n :screen - Opposite multiply, uses inverse values of the colors.\n :overlay - A mix of :multiply and :screen. Multiplies dark values\n and screens light values.\n :hard-light - :screen when greater than 50% gray, :multiply when\n lower.\n :soft-light - Mix of :darkest and :lightest. Works like :overlay,\n but not as harsh.\n :dodge - Lightens light tones and increases contrast, ignores\n darks.\n Called \"Color Dodge\" in Illustrator and Photoshop.\n :burn - Darker areas are applied, increasing contrast, ignores\n lights. Called \"Color Burn\" in Illustrator and\n Photoshop."],"~$QUARTER-PI",["^ ","^B","~$quil.core/QUARTER-PI","^T","out/quil/core.cljc","^Y",79,"^W",1,"^Z",79,"^U",16,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",79,"^W",6,"^Z",79,"^U",16],"^1?","^4P"],"~$stroke-cap",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","strokeCap()","^W",3,"^X",true,"^Y",4064,"^Z",4064,"^[",["^10",["^11",["^10",[["~$cap-mode"]]]]],"^13","Sets the style for rendering line endings. These ends are either\n squared, extended, or rounded and specified with the corresponding\n parameters :square, :project, and :round. The default cap is :round."],"^R","1.0","^B","~$quil.core/stroke-cap","^S","Attributes","^T","out/quil/core.cljc","^U",13,"^V","strokeCap()","^15",["^10",[["^=@"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4058,"^19","^1:","^Z",4064,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^=@"]]]]],"^13","Sets the style for rendering line endings. These ends are either\n squared, extended, or rounded and specified with the corresponding\n parameters :square, :project, and :round. The default cap is :round."],"~$blend-modes",["^ ","^B","~$quil.core/blend-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",48,"^U",13,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",48,"^W",2,"^Z",48,"^U",13],"^1?","^1@"],"~$no-fill",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","noFill()","^W",3,"^X",true,"^Y",2666,"^Z",2666,"^[",["^10",["^11",["^10",[[]]]]],"^13","Disables filling geometry. If both no-stroke and no-fill are called,\n nothing will be drawn to the screen."],"^R","1.0","^B","~$quil.core/no-fill","^S","Setting","^T","out/quil/core.cljc","^U",10,"^V","noFill()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2660,"^19","^1:","^Z",2666,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Disables filling geometry. If both no-stroke and no-fill are called,\n nothing will be drawn to the screen."],"~$year",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Time & Date","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","year()","^W",3,"^X",false,"^Y",4607,"^Z",4607,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current year as an integer (2003, 2004, 2005, etc)."],"^R","1.0","^B","~$quil.core/year","^S","Time & Date","^T","out/quil/core.cljc","^U",7,"^V","year()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",4601,"^19","^1:","^Z",4607,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current year as an integer (2003, 2004, 2005, etc)."],"~$key-coded?",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.6","^S","Keyboard","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V",null,"^W",3,"^X",false,"^Y",4887,"^Z",4887,"^[",["^10",["^11",["^10",[["~$c"]]]]],"^13","Returns true if char c is a 'coded' char i.e. it is necessary to\n fetch the key-code as an integer and use that to determine the\n specific key pressed. See key-keyword."],"^R","1.6","^B","~$quil.core/key-coded?","^S","Keyboard","^T","out/quil/core.cljc","^U",13,"^V",null,"^15",["^10",[["~$c"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",4882,"^19","^5A","^Z",4887,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$c"]]]]],"^13","Returns true if char c is a 'coded' char i.e. it is necessary to\n fetch the key-code as an integer and use that to determine the\n specific key pressed. See key-keyword."],"~$curve-tangent",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Curves","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^V","curveTangent()","^W",3,"^X",true,"^Y",1377,"^Z",1377,"^[",["^10",["^11",["^10",[["~$a","~$b","~$c","~$d","~$t"]]]]],"^13","Calculates the tangent of a point on a curve.\n See: http://en.wikipedia.org/wiki/Tangent"],"^R","1.0","^B","~$quil.core/curve-tangent","^S","Curves","^T","out/quil/core.cljc","^U",16,"^V","curveTangent()","^15",["^10",[["~$a","~$b","~$c","~$d","~$t"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1371,"^19","^1:","^Z",1377,"^1;",5,"^1<",true,"^[",["^10",["^11",["^10",[["~$a","~$b","~$c","~$d","~$t"]]]]],"^13","Calculates the tangent of a point on a curve.\n See: http://en.wikipedia.org/wiki/Tangent"],"~$ellipse-modes",["^ ","^B","~$quil.core/ellipse-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",52,"^U",15,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",52,"^W",2,"^Z",52,"^U",15],"^1?","^1@"],"~$pmouse-y",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Mouse","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^V","pmouseY","^W",3,"^X",true,"^Y",2984,"^Z",2984,"^[",["^10",["^11",["^10",[[]]]]],"^13","Vertical coordinate of the mouse in the previous frame"],"^R","1.0","^B","~$quil.core/pmouse-y","^S","Mouse","^T","out/quil/core.cljc","^U",11,"^V","pmouseY","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2978,"^19","^1:","^Z",2984,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Vertical coordinate of the mouse in the previous frame"],"~$hex",["^ ","^O","Data","^P",null,"^Q",["^ ","^O","Data","^4R",false,"^S","Conversion","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^34"],["^34","^4S"]]],"^[",["^10",[["^34"],["^34","^4S"]]],"^17",["^10",[null,null]]],"^V","hex()","^W",3,"^Y",1951,"^Z",1951,"^[",["^10",["^11",["^10",[["^34"],["^34","^4S"]]]]],"^13","Converts a byte, char, int, or color to a String containing the\n equivalent hexadecimal notation. For example color(0, 102, 153) will\n convert to the String \"FF006699\". This function can help make your\n geeky debugging sessions much happier. "],"^4R",false,"^B","~$quil.core/hex","^S","Conversion","^T","out/quil/core.cljc","^U",6,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^34"],["^34","^4S"]]],"^[",["^10",[["^34"],["^34","^4S"]]],"^17",["^10",[null,null]]],"^V","hex()","^15",["^10",[["^34"],["^34","^4S"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^Y",1946,"^Z",1951,"^1;",2,"^1<",true,"^[",["^10",[["^34"],["^34","^4S"]]],"^13","Converts a byte, char, int, or color to a String containing the\n equivalent hexadecimal notation. For example color(0, 102, 153) will\n convert to the String \"FF006699\". This function can help make your\n geeky debugging sessions much happier. "],"~$with-fill",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.7","^S","Utility Macros","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["~$fill-args","^22"]]]],"^[",["^10",[["^=S","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^W",4,"^X",true,"^Y",4632,"^23",true,"^Z",4632,"^[",["^10",["^11",["^10",[["^=S","~$&","^22"]]]]],"^13","Temporarily set the fill color for the body of this macro.\n The code outside of with-fill form will have the previous fill color set.\n\n The fill color has to be in a vector!\n Example: (with-fill [255] ...)\n (with-fill [10 80 98] ...)"],"^R","1.7","^B","~$quil.core/with-fill","^S","Utility Macros","^T","out/quil/core.cljc","^U",13,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["^=S","^22"]]]],"^[",["^10",[["^=S","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^15",["^10",[["^10",["^=S","^22"]]]],"^16",null,"^17",["^10",[null]],"^W",1,"^18",true,"^X",true,"^Y",4626,"^23",true,"^19","^1:","^Z",4632,"^1;",1,"^1<",false,"^[",["^10",[["^=S","~$&","^22"]]],"^13","Temporarily set the fill color for the body of this macro.\n The code outside of with-fill form will have the previous fill color set.\n\n The fill color has to be in a vector!\n Example: (with-fill [255] ...)\n (with-fill [10 80 98] ...)"],"~$no-cursor",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","noCursor()","^W",3,"^X",true,"^Y",2654,"^Z",2654,"^[",["^10",["^11",["^10",[[]]]]],"^13","Hides the cursor from view. Will not work when running the in full\n screen (Present) mode."],"^R","1.0","^B","~$quil.core/no-cursor","^S",null,"^T","out/quil/core.cljc","^U",12,"^V","noCursor()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2648,"^19","^1:","^Z",2654,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Hides the cursor from view. Will not work when running the in full\n screen (Present) mode."],"~$create-font",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^;=","^2H"],["^;=","^2H","^5R"],["^;=","^2H","^5R","~$charset"]]],"^[",["^10",[["^;=","^2H"],["^;=","^2H","^5R"],["^;=","^2H","^5R","^=X"]]],"^17",["^10",[null,null,null]]],"^V","createFont()","^W",3,"^X",true,"^Y",1167,"^Z",1167,"^[",["^10",["^11",["^10",[["^;=","^2H"],["^;=","^2H","^5R"],["^;=","^2H","^5R","^=X"]]]]],"^13","Dynamically converts a font to the format used by Processing (a\n PFont) from either a font name that's installed on the computer, or\n from a .ttf or .otf file inside the sketches 'data' folder. This\n function is an advanced feature for precise control.\n\n Use available-fonts to obtain the names for the fonts recognized by\n the computer and are compatible with this function.\n\n The size parameter states the font size you want to generate. The\n smooth parameter specifies if the font should be antialiased or not,\n and the charset parameter is an array of chars that specifies the\n characters to generate.\n\n This function creates a bitmapped version of a font It loads a font\n by name, and converts it to a series of images based on the size of\n the font. When possible, the text function will use a native font\n rather than the bitmapped version created behind the scenes with\n create-font. For instance, when using the default renderer\n setting (JAVA2D), the actual native version of the font will be\n employed by the sketch, improving drawing quality and\n performance. With the :p2d, :p3d, and :opengl renderer settings, the\n bitmapped version will be used. While this can drastically improve\n speed and appearance, results are poor when exporting if the sketch\n does not include the .otf or .ttf file, and the requested font is\n not available on the machine running the sketch."],"^R","1.0","^B","~$quil.core/create-font","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",14,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^;=","^2H"],["^;=","^2H","^5R"],["^;=","^2H","^5R","^=X"]]],"^[",["^10",[["^;=","^2H"],["^;=","^2H","^5R"],["^;=","^2H","^5R","^=X"]]],"^17",["^10",[null,null,null]]],"^V","createFont()","^15",["^10",[["^;=","^2H"],["^;=","^2H","^5R"],["^;=","^2H","^5R","^=X"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",1161,"^Z",1167,"^1;",4,"^1<",true,"^[",["^10",[["^;=","^2H"],["^;=","^2H","^5R"],["^;=","^2H","^5R","^=X"]]],"^13","Dynamically converts a font to the format used by Processing (a\n PFont) from either a font name that's installed on the computer, or\n from a .ttf or .otf file inside the sketches 'data' folder. This\n function is an advanced feature for precise control.\n\n Use available-fonts to obtain the names for the fonts recognized by\n the computer and are compatible with this function.\n\n The size parameter states the font size you want to generate. The\n smooth parameter specifies if the font should be antialiased or not,\n and the charset parameter is an array of chars that specifies the\n characters to generate.\n\n This function creates a bitmapped version of a font It loads a font\n by name, and converts it to a series of images based on the size of\n the font. When possible, the text function will use a native font\n rather than the bitmapped version created behind the scenes with\n create-font. For instance, when using the default renderer\n setting (JAVA2D), the actual native version of the font will be\n employed by the sketch, improving drawing quality and\n performance. With the :p2d, :p3d, and :opengl renderer settings, the\n bitmapped version will be used. While this can drastically improve\n speed and appearance, results are poor when exporting if the sketch\n does not include the .otf or .ttf file, and the requested font is\n not available on the machine running the sketch."],"~$current-graphics",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","2.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",19,"^W",3,"^X",true,"^Y",32,"^Z",32,"^1?","~$PGraphics","^[",["^10",["^11",["^10",[[]]]]],"^13","Graphics currently used for drawing. By default it is sketch graphics,\n but if called inside with-graphics macro - graphics passed to the macro\n is returned. This method should be used if you need to call some methods\n that are not implemented by quil. Example:\n (.beginDraw (current-graphics))."],"^R","2.0","^B","~$quil.core/current-graphics","^S",null,"^T","out/quil/core.cljc","^U",19,"^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",26,"^19","^=[","^Z",32,"^1;",0,"^1?","^=[","^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Graphics currently used for drawing. By default it is sketch graphics,\n but if called inside with-graphics macro - graphics passed to the macro\n is returned. This method should be used if you need to call some methods\n that are not implemented by quil. Example:\n (.beginDraw (current-graphics))."],"~$abs",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Calculation","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","abs()","^W",3,"^X",false,"^Y",281,"^Z",281,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","Calculates the absolute value (magnitude) of a number. The\n absolute value of a number is always positive. Dynamically casts to\n an int or float appropriately"],"^R","1.0","^B","~$quil.core/abs","^S","Calculation","^T","out/quil/core.cljc","^U",6,"^V","abs()","^15",["^10",[["~$n"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",275,"^19","^1:","^Z",281,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$n"]]]]],"^13","Calculates the absolute value (magnitude) of a number. The\n absolute value of a number is always positive. Dynamically casts to\n an int or float appropriately"],"~$pop-style",["^ ","^O","Structure","^P",null,"^Q",["^ ","^O","Structure","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","popStyle()","^W",3,"^X",true,"^Y",3044,"^Z",3044,"^[",["^10",["^11",["^10",[[]]]]],"^13","Restores the prior settings on the 'style stack'. Used in\n conjunction with push-style. Together they allow you to change the\n style settings and later return to what you had. When a new style is\n started with push-style, it builds on the current style information.\n The push-style and pop-style functions can be nested to provide more\n control"],"^R","1.0","^B","~$quil.core/pop-style","^S",null,"^T","out/quil/core.cljc","^U",12,"^V","popStyle()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3038,"^19","^1:","^Z",3044,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Restores the prior settings on the 'style stack'. Used in\n conjunction with push-style. Together they allow you to change the\n style settings and later return to what you had. When a new style is\n started with push-style, it builds on the current style information.\n The push-style and pop-style functions can be nested to provide more\n control"],"~$focused",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","focused","^W",3,"^X",true,"^Y",1843,"^Z",1843,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns a boolean value representing whether the applet has focus."],"^R","1.0","^B","~$quil.core/focused","^S",null,"^T","out/quil/core.cljc","^U",10,"^V","focused","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1837,"^19","^1:","^Z",1843,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns a boolean value representing whether the applet has focus."],"~$background-float",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Setting","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",19,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","background()","^W",3,"^X",true,"^Y",512,"^Z",512,"^[",["^10",["^11",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]]]],"^13","Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts args to floats."],"^R","1.0","^B","~$quil.core/background-float","^S","Setting","^T","out/quil/core.cljc","^U",19,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^17",["^10",[null,null,null,null]]],"^V","background()","^15",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^16",null,"^17",["^10",[null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",506,"^Z",512,"^1;",4,"^1<",true,"^[",["^10",[["^2M"],["^2M","^2N"],["~$r","~$g","~$b"],["~$r","~$g","~$b","~$a"]]],"^13","Sets the color used for the background of the Processing\n window. The default background is light gray. In the draw function,\n the background color is used to clear the display window at the\n beginning of each frame.\n\n It is not possible to use transparency (alpha) in background colors\n with the main drawing surface, however they will work properly with\n create-graphics. Converts args to floats."],"~$text-mode",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","textMode()","^W",3,"^X",true,"^Y",4307,"^Z",4307,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Sets the way text draws to the screen - available modes\n are :model and :shape\n\n In the default configuration (the :model mode), it's possible to\n rotate, scale, and place letters in two and three dimensional space.\n\n The :shape mode draws text using the glyph outlines of individual\n characters rather than as textures. This mode is only supported with\n the PDF and OPENGL renderer settings. With the PDF renderer, you\n must specify the :shape text-mode before any other drawing occurs.\n If the outlines are not available, then :shape will be ignored and\n :model will be used instead.\n\n The :shape option in OPENGL mode can be combined with begin-raw to\n write vector-accurate text to 2D and 3D output files, for instance\n DXF or PDF. :shape is not currently optimized for OPENGL, so if\n recording shape data, use :model until you're ready to capture the\n geometry with begin-raw."],"^R","1.0","^B","~$quil.core/text-mode","^S","Attributes","^T","out/quil/core.cljc","^U",12,"^V","textMode()","^15",["^10",[["^1I"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4301,"^19","^1:","^Z",4307,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Sets the way text draws to the screen - available modes\n are :model and :shape\n\n In the default configuration (the :model mode), it's possible to\n rotate, scale, and place letters in two and three dimensional space.\n\n The :shape mode draws text using the glyph outlines of individual\n characters rather than as textures. This mode is only supported with\n the PDF and OPENGL renderer settings. With the PDF renderer, you\n must specify the :shape text-mode before any other drawing occurs.\n If the outlines are not available, then :shape will be ignored and\n :model will be used instead.\n\n The :shape option in OPENGL mode can be combined with begin-raw to\n write vector-accurate text to 2D and 3D output files, for instance\n DXF or PDF. :shape is not currently optimized for OPENGL, so if\n recording shape data, use :model until you're ready to capture the\n geometry with begin-raw."],"~$image-mode",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",13,"^V","imageMode()","^W",3,"^X",true,"^Y",2145,"^Z",2145,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Modifies the location from which images draw. The default mode is :corner.\n Available modes are:\n\n :corner - specifies the location to be the upper left corner and\n uses the fourth and fifth parameters of image to set the\n image's width and height.\n\n :corners - uses the second and third parameters of image to set the\n location of one corner of the image and uses the fourth\n and fifth parameters to set the opposite corner.\n\n :center - draw images centered at the given x and y position."],"^R","1.0","^B","~$quil.core/image-mode","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",13,"^V","imageMode()","^15",["^10",[["^1I"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2139,"^19","^1:","^Z",2145,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Modifies the location from which images draw. The default mode is :corner.\n Available modes are:\n\n :corner - specifies the location to be the upper left corner and\n uses the fourth and fifth parameters of image to set the\n image's width and height.\n\n :corners - uses the second and third parameters of image to set the\n location of one corner of the image and uses the fourth\n and fifth parameters to set the opposite corner.\n\n :center - draw images centered at the given x and y position."],"~$line",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","2D Primitives","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",6,"^15",["^10",[["~$p1","~$p2"],["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^[",["^10",[["^>>","^>?"],["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^17",["^10",[null,null,null]]],"^V","line()","^W",3,"^X",true,"^Y",2324,"^Z",2324,"^[",["^10",["^11",["^10",[["^>>","^>?"],["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]]]],"^13","Draws a line (a direct path between two points) to the screen. The\n version of line with four parameters draws the line in 2D. To color\n a line, use the stroke function. A line cannot be filled, therefore\n the fill method will not affect the color of a line. 2D lines are\n drawn with a width of one pixel by default, but this can be changed\n with the stroke-weight function. The version with six parameters\n allows the line to be placed anywhere within XYZ space. "],"^R","1.0","^B","~$quil.core/line","^S","2D Primitives","^T","out/quil/core.cljc","^U",7,"^1F",["^ ","^18",false,"^1;",6,"^15",["^10",[["^>>","^>?"],["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^[",["^10",[["^>>","^>?"],["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^17",["^10",[null,null,null]]],"^V","line()","^15",["^10",[["^>>","^>?"],["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",2318,"^Z",2324,"^1;",6,"^1<",true,"^[",["^10",[["^>>","^>?"],["^4D","^4E","^4F","^4G"],["^4D","^4E","^5M","^4F","^4G","^5P"]]],"^13","Draws a line (a direct path between two points) to the screen. The\n version of line with four parameters draws the line in 2D. To color\n a line, use the stroke function. A line cannot be filled, therefore\n the fill method will not affect the color of a line. 2D lines are\n drawn with a width of one pixel by default, but this can be changed\n with the stroke-weight function. The version with six parameters\n allows the line to be placed anywhere within XYZ space. "],"~$do-record",["^ ","^O","Output","^P",null,"^Q",["^ ","^O","Output","^R","2.5","^S","Files","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["^21","^22"]]]],"^[",["^10",[["^21","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^W",3,"^X",true,"^Y",1510,"^23",true,"^Z",1510,"^[",["^10",["^11",["^10",[["^21","~$&","^22"]]]]],"^13","Macro for drawing on graphics which saves result in the file at the end.\n Similar to 'with-graphics' macro. do-record assumed to be used with :pdf\n graphics. Example:\n\n (q/do-record (q/create-graphics 200 200 :pdf \"output.pdf\")\n (q/fill 250 0 0)\n (q/ellipse 100 100 150 150))\n "],"^R","2.5","^B","~$quil.core/do-record","^S","Files","^T","out/quil/core.cljc","^U",12,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["^21","^22"]]]],"^[",["^10",[["^21","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^15",["^10",[["^10",["^21","^22"]]]],"^16",null,"^17",["^10",[null]],"^W",1,"^18",true,"^X",true,"^Y",1504,"^23",true,"^19","^1:","^Z",1510,"^1;",1,"^1<",false,"^[",["^10",[["^21","~$&","^22"]]],"^13","Macro for drawing on graphics which saves result in the file at the end.\n Similar to 'with-graphics' macro. do-record assumed to be used with :pdf\n graphics. Example:\n\n (q/do-record (q/create-graphics 200 200 :pdf \"output.pdf\")\n (q/fill 250 0 0)\n (q/ellipse 100 100 150 150))\n "],"~$red",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","red()","^W",3,"^X",true,"^Y",3333,"^Z",3333,"^[",["^10",["^11",["^10",[["~$c"]]]]],"^13","Extracts the red value from a color, scaled to match current color-mode."],"^R","1.0","^B","~$quil.core/red","^S","Creating & Reading","^T","out/quil/core.cljc","^U",6,"^V","red()","^15",["^10",[["~$c"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3327,"^19","^1:","^Z",3333,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["~$c"]]]]],"^13","Extracts the red value from a color, scaled to match current color-mode."],"~$current-fill",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","PGraphics.fillColor","^W",3,"^4=","http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#fillColor","^X",true,"^Y",1264,"^Z",1264,"^[",["^10",["^11",["^10",[[]]]]],"^13","Return the current fill color."],"^B","~$quil.core/current-fill","^S","Creating & Reading","^T","out/quil/core.cljc","^U",15,"^V","PGraphics.fillColor","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^4=","http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#fillColor","^18",false,"^X",true,"^Y",1258,"^19","^1:","^Z",1264,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Return the current fill color."],"~$color-modes",["^ ","^B","~$quil.core/color-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",50,"^U",13,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",50,"^W",2,"^Z",50,"^U",13],"^1?","^1@"],"~$blue",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","blue()","^W",3,"^X",true,"^Y",905,"^Z",905,"^[",["^10",["^11",["^10",[["^87"]]]]],"^13","Extracts the blue value from a color, scaled to match current color-mode.\n Returns a float."],"^R","1.0","^B","~$quil.core/blue","^S","Creating & Reading","^T","out/quil/core.cljc","^U",7,"^V","blue()","^15",["^10",[["^87"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",899,"^19","^1:","^Z",905,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^87"]]]]],"^13","Extracts the blue value from a color, scaled to match current color-mode.\n Returns a float."],"~$frustum",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Camera","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","frustum()","^W",3,"^X",true,"^Y",1897,"^Z",1897,"^[",["^10",["^11",["^10",[["^:W","^:X","^:Y","^:Z","^:[","^;0"]]]]],"^13","Sets a perspective matrix defined through the parameters. Works\n like glFrustum, except it wipes out the current perspective matrix\n rather than muliplying itself with it."],"^R","1.0","^B","~$quil.core/frustum","^S","Camera","^T","out/quil/core.cljc","^U",10,"^V","frustum()","^15",["^10",[["^:W","^:X","^:Y","^:Z","^:[","^;0"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1891,"^19","^1:","^Z",1897,"^1;",6,"^1<",true,"^[",["^10",["^11",["^10",[["^:W","^:X","^:Y","^:Z","^:[","^;0"]]]]],"^13","Sets a perspective matrix defined through the parameters. Works\n like glFrustum, except it wipes out the current perspective matrix\n rather than muliplying itself with it."],"~$with-rotation",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S","Utility Macros","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["~$rotation","^22"]]]],"^[",["^10",[["^>N","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^W",3,"^X",true,"^Y",4688,"^23",true,"^Z",4688,"^[",["^10",["^11",["^10",[["^>N","~$&","^22"]]]]],"^13","Performs body with rotation, restores current transformation on exit.\n Accepts a vector [angle] or [angle x-axis y-axis z-axis].\n\n Example:\n (with-rotation [angle]\n (vertex 1 2))"],"^R","1.0","^B","~$quil.core/with-rotation","^S","Utility Macros","^T","out/quil/core.cljc","^U",16,"^1F",["^ ","^18",true,"^1;",1,"^15",["^10",[["^10",["^>N","^22"]]]],"^[",["^10",[["^>N","~$&","^22"]]],"^17",["^10",[null]]],"^V",null,"^15",["^10",[["^10",["^>N","^22"]]]],"^16",null,"^17",["^10",[null]],"^W",1,"^18",true,"^X",true,"^Y",4682,"^23",true,"^19","^1:","^Z",4688,"^1;",1,"^1<",false,"^[",["^10",[["^>N","~$&","^22"]]],"^13","Performs body with rotation, restores current transformation on exit.\n Accepts a vector [angle] or [angle x-axis y-axis z-axis].\n\n Example:\n (with-rotation [angle]\n (vertex 1 2))"],"~$print-matrix",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","printMatrix()","^W",3,"^X",true,"^Y",3087,"^Z",3087,"^[",["^10",["^11",["^10",[[]]]]],"^13","Prints the current matrix to std out. Useful for debugging."],"^R","1.0","^B","~$quil.core/print-matrix","^S",null,"^T","out/quil/core.cljc","^U",15,"^V","printMatrix()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3081,"^19","^1:","^Z",3087,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Prints the current matrix to std out. Useful for debugging."],"~$ambient-light",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Lights","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",16,"^1F",["^ ","^18",false,"^1;",6,"^15",["^10",[["^>C","^9Z","^>I"],["^>C","^9Z","^>I","~$x","~$y","~$z"]]],"^[",["^10",[["^>C","^9Z","^>I"],["^>C","^9Z","^>I","~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","ambientLight()","^W",3,"^X",true,"^Y",375,"^Z",375,"^[",["^10",["^11",["^10",[["^>C","^9Z","^>I"],["^>C","^9Z","^>I","~$x","~$y","~$z"]]]]],"^13","Adds an ambient light. Ambient light doesn't come from a specific direction,\n the rays have light have bounced around so much that objects are\n evenly lit from all sides. Ambient lights are almost always used in\n combination with other types of lights. Lights need to be included\n in the draw to remain persistent in a looping program. Placing them\n in the setup of a looping program will cause them to only have an\n effect the first time through the loop. The effect of the\n parameters is determined by the current color mode."],"^R","1.0","^B","~$quil.core/ambient-light","^S","Lights","^T","out/quil/core.cljc","^U",16,"^1F",["^ ","^18",false,"^1;",6,"^15",["^10",[["^>C","^9Z","^>I"],["^>C","^9Z","^>I","~$x","~$y","~$z"]]],"^[",["^10",[["^>C","^9Z","^>I"],["^>C","^9Z","^>I","~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","ambientLight()","^15",["^10",[["^>C","^9Z","^>I"],["^>C","^9Z","^>I","~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",369,"^Z",375,"^1;",6,"^1<",true,"^[",["^10",[["^>C","^9Z","^>I"],["^>C","^9Z","^>I","~$x","~$y","~$z"]]],"^13","Adds an ambient light. Ambient light doesn't come from a specific direction,\n the rays have light have bounced around so much that objects are\n evenly lit from all sides. Ambient lights are almost always used in\n combination with other types of lights. Lights need to be included\n in the draw to remain persistent in a looping program. Placing them\n in the setup of a looping program will cause them to only have an\n effect the first time through the loop. The effect of the\n parameters is determined by the current color mode."],"~$bezier-point",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Curves","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","bezierPoint()","^W",3,"^X",true,"^Y",706,"^Z",706,"^[",["^10",["^11",["^10",[["~$a","~$b","~$c","~$d","~$t"]]]]],"^13","Evaluates the Bezier at point t for points a, b, c, d. The\n parameter t varies between 0 and 1, a and d are points on the curve,\n and b and c are the control points. This can be done once with the x\n coordinates and a second time with the y coordinates to get the\n location of a bezier curve at t."],"^R","1.0","^B","~$quil.core/bezier-point","^S","Curves","^T","out/quil/core.cljc","^U",15,"^V","bezierPoint()","^15",["^10",[["~$a","~$b","~$c","~$d","~$t"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",700,"^19","^1:","^Z",706,"^1;",5,"^1<",true,"^[",["^10",["^11",["^10",[["~$a","~$b","~$c","~$d","~$t"]]]]],"^13","Evaluates the Bezier at point t for points a, b, c, d. The\n parameter t varies between 0 and 1, a and d are points on the curve,\n and b and c are the control points. This can be done once with the x\n coordinates and a second time with the y coordinates to get the\n location of a bezier curve at t."],"~$stroke-cap-modes",["^ ","^B","~$quil.core/stroke-cap-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",64,"^U",18,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",64,"^W",2,"^Z",64,"^U",18],"^1?","^1@"],"~$quad",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","2D Primitives","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",7,"^V","quad()","^W",3,"^X",true,"^Y",3151,"^Z",3151,"^[",["^10",["^11",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U","~$x4","~$y4"]]]]],"^13","A quad is a quadrilateral, a four sided polygon. It is similar to a\n rectangle, but the angles between its edges are not constrained to\n be ninety degrees. The first pair of parameters (x1,y1) sets the\n first vertex and the subsequent pairs should proceed clockwise or\n counter-clockwise around the defined shape."],"^R","1.0","^B","~$quil.core/quad","^S","2D Primitives","^T","out/quil/core.cljc","^U",7,"^V","quad()","^15",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U","^>Y","^>Z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3145,"^19","^1:","^Z",3151,"^1;",8,"^1<",true,"^[",["^10",["^11",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U","^>Y","^>Z"]]]]],"^13","A quad is a quadrilateral, a four sided polygon. It is similar to a\n rectangle, but the angles between its edges are not constrained to\n be ninety degrees. The first pair of parameters (x1,y1) sets the\n first vertex and the subsequent pairs should proceed clockwise or\n counter-clockwise around the defined shape."],"~$screen-x",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Coordinates","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","screenX()","^W",3,"^X",true,"^Y",3642,"^Z",3642,"^[",["^10",["^11",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]]]],"^13","Takes a three-dimensional x, y, z position and returns the x value\n for where it will appear on a (two-dimensional) screen, once\n affected by translate, scale or any other transformations"],"^R","1.0","^B","~$quil.core/screen-x","^S","Coordinates","^T","out/quil/core.cljc","^U",11,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","screenX()","^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3636,"^Z",3642,"^1;",3,"^1<",true,"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^13","Takes a three-dimensional x, y, z position and returns the x value\n for where it will appear on a (two-dimensional) screen, once\n affected by translate, scale or any other transformations"],"~$lights",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Lights","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^V","lights()","^W",3,"^X",true,"^Y",2285,"^Z",2285,"^[",["^10",["^11",["^10",[[]]]]],"^13","Sets the default ambient light, directional light, falloff, and\n specular values. The defaults are:\n\n (ambient-light 128 128 128)\n (directional-light 128 128 128 0 0 -1)\n (light-falloff 1 0 0)\n (light-specular 0 0 0).\n\n Lights need to be included in the draw to remain persistent in a\n looping program. Placing them in the setup of a looping program\n will cause them to only have an effect the first time through the\n loop."],"^R","1.0","^B","~$quil.core/lights","^S","Lights","^T","out/quil/core.cljc","^U",9,"^V","lights()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2279,"^19","^1:","^Z",2285,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Sets the default ambient light, directional light, falloff, and\n specular values. The defaults are:\n\n (ambient-light 128 128 128)\n (directional-light 128 128 128 0 0 -1)\n (light-falloff 1 0 0)\n (light-specular 0 0 0).\n\n Lights need to be included in the draw to remain persistent in a\n looping program. Placing them in the setup of a looping program\n will cause them to only have an effect the first time through the\n loop."],"~$*graphics*",["^ ","^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",22,"^W",3,"^Z",22,"^U",13,"~:dynamic",true,"^3[",true],"^3[",true,"^B","~$quil.core/*graphics*","^T","out/quil/core.cljc","^U",13,"^W",1,"^?5",true,"^Y",20,"^Z",22,"^1?","~$clj-nil"],"~$KEY-CODES",["^ ","^B","~$quil.core/KEY-CODES","^T","out/quil/core.cljc","^Y",122,"^W",4,"^Z",123,"^U",15,"^3[",true,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",123,"^W",6,"^Z",123,"^U",15,"^3[",true],"^1?","^1@"],"~$curve-detail",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Curves","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","curveDetail()","^W",3,"^X",true,"^Y",1348,"^Z",1348,"^[",["^10",["^11",["^10",[["^3D"]]]]],"^13","Sets the resolution at which curves display. The default value is\n 20. This function is only useful when using the :p3d or :opengl\n renderer as the default (:java2d) renderer does not use this\n information."],"^R","1.0","^B","~$quil.core/curve-detail","^S","Curves","^T","out/quil/core.cljc","^U",15,"^V","curveDetail()","^15",["^10",[["^3D"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1342,"^19","^1:","^Z",1348,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^3D"]]]]],"^13","Sets the resolution at which curves display. The default value is\n 20. This function is only useful when using the :p3d or :opengl\n renderer as the default (:java2d) renderer does not use this\n information."],"~$current-frame-rate",["^ ","^O","Environment","^P",null,"^Q",["^ ","^O","Environment","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",21,"^V","frameRate","^W",3,"^X",true,"^Y",1867,"^Z",1867,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current framerate"],"^R","1.0","^B","~$quil.core/current-frame-rate","^S",null,"^T","out/quil/core.cljc","^U",21,"^V","frameRate","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1861,"^19","^1:","^Z",1867,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns the current framerate"],"~$end-contour",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","2.0","^S","Vertex","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","endContour()","^W",3,"^X",true,"^Y",1624,"^Z",1624,"^[",["^10",["^11",["^10",[[]]]]],"^13","Use the begin-contour and end-contour function to create negative\n shapes within shapes. These functions can only be within a\n begin-shape/end-shape pair and they only work with the :p2d and :p3d\n renderers."],"^R","2.0","^B","~$quil.core/end-contour","^S","Vertex","^T","out/quil/core.cljc","^U",14,"^V","endContour()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1618,"^19","^1:","^Z",1624,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Use the begin-contour and end-contour function to create negative\n shapes within shapes. These functions can only be within a\n begin-shape/end-shape pair and they only work with the :p2d and :p3d\n renderers."],"~$sin",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Trigonometry","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",6,"^V","sin()","^W",3,"^X",false,"^Y",3863,"^Z",3863,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Calculates the sine of an angle. This function expects the values\n of the angle parameter to be provided in radians (values from 0 to\n 6.28). A float within the range -1 to 1 is returned."],"^R","1.0","^B","~$quil.core/sin","^S","Trigonometry","^T","out/quil/core.cljc","^U",6,"^V","sin()","^15",["^10",[["^12"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",false,"^Y",3857,"^19","^1:","^Z",3863,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Calculates the sine of an angle. This function expects the values\n of the angle parameter to be provided in radians (values from 0 to\n 6.28). A float within the range -1 to 1 is returned."],"~$current-stroke",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",17,"^V","PGraphics.strokeColor","^W",3,"^4=","http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#strokeColor","^X",true,"^Y",1275,"^Z",1275,"^[",["^10",["^11",["^10",[[]]]]],"^13","Return the current stroke color."],"^B","~$quil.core/current-stroke","^S","Creating & Reading","^T","out/quil/core.cljc","^U",17,"^V","PGraphics.strokeColor","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^4=","http://processing.github.io/processing-javadocs/core/processing/core/PGraphics.html#strokeColor","^18",false,"^X",true,"^Y",1269,"^19","^1:","^Z",1275,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Return the current stroke color."],"~$curve",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Curves","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",12,"^15",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U","^>Y","^>Z"],["^4D","^4E","^5M","^4F","^4G","^5P","^6T","^6U","^6W","^>Y","^>Z","~$z4"]]],"^[",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U","^>Y","^>Z"],["^4D","^4E","^5M","^4F","^4G","^5P","^6T","^6U","^6W","^>Y","^>Z","^?E"]]],"^17",["^10",[null,null]]],"^V","curve()","^W",3,"^X",true,"^Y",1320,"^Z",1320,"^[",["^10",["^11",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U","^>Y","^>Z"],["^4D","^4E","^5M","^4F","^4G","^5P","^6T","^6U","^6W","^>Y","^>Z","^?E"]]]]],"^13","Draws a curved line on the screen. The first and second parameters\n specify the beginning control point and the last two parameters\n specify the ending control point. The middle parameters specify the\n start and stop of the curve. Longer curves can be created by putting\n a series of curve fns together or using curve-vertex. An additional\n fn called curve-tightness provides control for the visual quality of\n the curve. The curve fn is an implementation of Catmull-Rom\n splines."],"^R","1.0","^B","~$quil.core/curve","^S","Curves","^T","out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",12,"^15",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U","^>Y","^>Z"],["^4D","^4E","^5M","^4F","^4G","^5P","^6T","^6U","^6W","^>Y","^>Z","^?E"]]],"^[",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U","^>Y","^>Z"],["^4D","^4E","^5M","^4F","^4G","^5P","^6T","^6U","^6W","^>Y","^>Z","^?E"]]],"^17",["^10",[null,null]]],"^V","curve()","^15",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U","^>Y","^>Z"],["^4D","^4E","^5M","^4F","^4G","^5P","^6T","^6U","^6W","^>Y","^>Z","^?E"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1314,"^Z",1320,"^1;",12,"^1<",true,"^[",["^10",[["^4D","^4E","^4F","^4G","^6T","^6U","^>Y","^>Z"],["^4D","^4E","^5M","^4F","^4G","^5P","^6T","^6U","^6W","^>Y","^>Z","^?E"]]],"^13","Draws a curved line on the screen. The first and second parameters\n specify the beginning control point and the last two parameters\n specify the ending control point. The middle parameters specify the\n start and stop of the curve. Longer curves can be created by putting\n a series of curve fns together or using curve-vertex. An additional\n fn called curve-tightness provides control for the visual quality of\n the curve. The curve fn is an implementation of Catmull-Rom\n splines."],"~$shape",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[["~$sh"],["^?H","~$x","~$y"],["^?H","~$x","~$y","^1Q","^1R"]]],"^[",["^10",[["^?H"],["^?H","~$x","~$y"],["^?H","~$x","~$y","^1Q","^1R"]]],"^17",["^10",[null,null,null]]],"^V","shape()","^W",3,"^X",true,"^Y",3751,"^Z",3751,"^[",["^10",["^11",["^10",[["^?H"],["^?H","~$x","~$y"],["^?H","~$x","~$y","^1Q","^1R"]]]]],"^13","Displays shapes to the screen. The shapes must have been loaded\n with load-shape. Processing currently works with SVG shapes\n only. The sh parameter specifies the shape to display and the x and\n y parameters define the location of the shape from its upper-left\n corner. The shape is displayed at its original size unless the width\n and height parameters specify a different size. The shape-mode\n fn changes the way the parameters work. A call to\n (shape-mode :corners), for example, will change the width and height\n parameters to define the x and y values of the opposite corner of\n the shape.\n\n Note complex shapes may draw awkwardly with the renderers :p2d, :p3d, and\n :opengl. Those renderers do not yet support shapes that have holes\n or complicated breaks."],"^R","1.0","^B","~$quil.core/shape","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[["^?H"],["^?H","~$x","~$y"],["^?H","~$x","~$y","^1Q","^1R"]]],"^[",["^10",[["^?H"],["^?H","~$x","~$y"],["^?H","~$x","~$y","^1Q","^1R"]]],"^17",["^10",[null,null,null]]],"^V","shape()","^15",["^10",[["^?H"],["^?H","~$x","~$y"],["^?H","~$x","~$y","^1Q","^1R"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",3745,"^Z",3751,"^1;",5,"^1<",true,"^[",["^10",[["^?H"],["^?H","~$x","~$y"],["^?H","~$x","~$y","^1Q","^1R"]]],"^13","Displays shapes to the screen. The shapes must have been loaded\n with load-shape. Processing currently works with SVG shapes\n only. The sh parameter specifies the shape to display and the x and\n y parameters define the location of the shape from its upper-left\n corner. The shape is displayed at its original size unless the width\n and height parameters specify a different size. The shape-mode\n fn changes the way the parameters work. A call to\n (shape-mode :corners), for example, will change the width and height\n parameters to define the x and y values of the opposite corner of\n the shape.\n\n Note complex shapes may draw awkwardly with the renderers :p2d, :p3d, and\n :opengl. Those renderers do not yet support shapes that have holes\n or complicated breaks."],"~$image-formats",["^ ","^B","~$quil.core/image-formats","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",51,"^U",15,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",51,"^W",2,"^Z",51,"^U",15],"^1?","^1@"],"~$text-descent",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Metrics","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","textDescent()","^W",3,"^X",true,"^Y",4255,"^Z",4255,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns descent of the current font at its current size. This\n information is useful for determining the height of the font below\n the baseline. For example, adding the text-ascent and text-descent\n values will give you the total height of the line."],"^R","1.0","^B","~$quil.core/text-descent","^S","Metrics","^T","out/quil/core.cljc","^U",15,"^V","textDescent()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4249,"^19","^1:","^Z",4255,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Returns descent of the current font at its current size. This\n information is useful for determining the height of the font below\n the baseline. For example, adding the text-ascent and text-descent\n values will give you the total height of the line."],"~$screen-z",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Coordinates","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^V","screenZ()","^W",3,"^X",true,"^Y",3668,"^Z",3668,"^[",["^10",["^11",["^10",[["~$x","~$y","~$z"]]]]],"^13","Given an x, y, z coordinate, returns its z value.\n This value can be used to determine if an x, y, z coordinate is in\n front or in back of another (x, y, z) coordinate. The units are\n based on how the zbuffer is set up, and don't relate to anything\n 'real'. They're only useful for in comparison to another value\n obtained from screen-z, or directly out of the zbuffer"],"^R","1.0","^B","~$quil.core/screen-z","^S","Coordinates","^T","out/quil/core.cljc","^U",11,"^V","screenZ()","^15",["^10",[["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3662,"^19","^1:","^Z",3668,"^1;",3,"^1<",true,"^[",["^10",["^11",["^10",[["~$x","~$y","~$z"]]]]],"^13","Given an x, y, z coordinate, returns its z value.\n This value can be used to determine if an x, y, z coordinate is in\n front or in back of another (x, y, z) coordinate. The units are\n based on how the zbuffer is set up, and don't relate to anything\n 'real'. They're only useful for in comparison to another value\n obtained from screen-z, or directly out of the zbuffer"],"~$ambient-int",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Material Properties","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","ambient()","^W",3,"^X",true,"^Y",341,"^Z",341,"^[",["^10",["^11",["^10",[["^3I"]]]]],"^13","Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The rgb\n color components set define the reflectance. Used in combination\n with emissive, specular, and shininess in setting the material\n properties of shapes."],"^R","1.0","^B","~$quil.core/ambient-int","^S","Material Properties","^T","out/quil/core.cljc","^U",14,"^V","ambient()","^15",["^10",[["^3I"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",335,"^19","^1:","^Z",341,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^3I"]]]]],"^13","Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The rgb\n color components set define the reflectance. Used in combination\n with emissive, specular, and shininess in setting the material\n properties of shapes."],"~$ellipse",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","2D Primitives","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","ellipse()","^W",3,"^X",true,"^Y",1531,"^Z",1531,"^[",["^10",["^11",["^10",[["~$x","~$y","^1Q","^1R"]]]]],"^13","Draws an ellipse (oval) in the display window. An ellipse with an\n equal width and height is a circle. The origin may be changed with\n the ellipse-mode function"],"^R","1.0","^B","~$quil.core/ellipse","^S","2D Primitives","^T","out/quil/core.cljc","^U",10,"^V","ellipse()","^15",["^10",[["~$x","~$y","^1Q","^1R"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1525,"^19","^1:","^Z",1531,"^1;",4,"^1<",true,"^[",["^10",["^11",["^10",[["~$x","~$y","^1Q","^1R"]]]]],"^13","Draws an ellipse (oval) in the display window. An ellipse with an\n equal width and height is a circle. The origin may be changed with\n the ellipse-mode function"],"~$text-leading",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","textLeading()","^W",3,"^X",true,"^Y",4295,"^Z",4295,"^[",["^10",["^11",["^10",[["~$leading"]]]]],"^13","Sets the spacing between lines of text in units of pixels. This\n setting will be used in all subsequent calls to the text function."],"^R","1.0","^B","~$quil.core/text-leading","^S","Attributes","^T","out/quil/core.cljc","^U",15,"^V","textLeading()","^15",["^10",[["^?U"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4289,"^19","^1:","^Z",4295,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^?U"]]]]],"^13","Sets the spacing between lines of text in units of pixels. This\n setting will be used in all subsequent calls to the text function."],"~$image-filter",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","2.0","^S","Pixels","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^2=","^1I"],["^2=","^1I","^1J"]]],"^[",["^10",[["^2=","^1I"],["^2=","^1I","^1J"]]],"^17",["^10",[null,null]]],"^V","PImage.filter()","^W",3,"^X",true,"^Y",2105,"^Z",2105,"^[",["^10",["^11",["^10",[["^2=","^1I"],["^2=","^1I","^1J"]]]]],"^13","Originally named filter in Processing Language.\n Filters given image with the specified mode and level.\n Level defines the quality of the filter and mode may be one of\n the following keywords:\n\n :threshold - converts the image to black and white pixels depending\n if they are above or below the threshold defined by\n the level parameter. The level must be between\n 0.0 (black) and 1.0 (white). If no level is specified,\n 0.5 is used.\n :gray - converts any colors in the image to grayscale\n equivalents. Doesn't work with level.\n :invert - sets each pixel to its inverse value. Doesn't work with\n level.\n :posterize - limits each channel of the image to the number of\n colors specified as the level parameter. The parameter can\n be set to values between 2 and 255, but results are most\n noticeable in the lower ranges.\n :blur - executes a Guassian blur with the level parameter\n specifying the extent of the blurring. If no level\n parameter is used, the blur is equivalent to Guassian\n blur of radius 1.\n :opaque - sets the alpha channel to entirely opaque. Doesn't work\n with level.\n :erode - reduces the light areas. Doesn't work with level.\n :dilate - increases the light areas. Doesn't work with level."],"^R","2.0","^B","~$quil.core/image-filter","^S","Pixels","^T","out/quil/core.cljc","^U",15,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^2=","^1I"],["^2=","^1I","^1J"]]],"^[",["^10",[["^2=","^1I"],["^2=","^1I","^1J"]]],"^17",["^10",[null,null]]],"^V","PImage.filter()","^15",["^10",[["^2=","^1I"],["^2=","^1I","^1J"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2099,"^Z",2105,"^1;",3,"^1<",true,"^[",["^10",[["^2=","^1I"],["^2=","^1I","^1J"]]],"^13","Originally named filter in Processing Language.\n Filters given image with the specified mode and level.\n Level defines the quality of the filter and mode may be one of\n the following keywords:\n\n :threshold - converts the image to black and white pixels depending\n if they are above or below the threshold defined by\n the level parameter. The level must be between\n 0.0 (black) and 1.0 (white). If no level is specified,\n 0.5 is used.\n :gray - converts any colors in the image to grayscale\n equivalents. Doesn't work with level.\n :invert - sets each pixel to its inverse value. Doesn't work with\n level.\n :posterize - limits each channel of the image to the number of\n colors specified as the level parameter. The parameter can\n be set to values between 2 and 255, but results are most\n noticeable in the lower ranges.\n :blur - executes a Guassian blur with the level parameter\n specifying the extent of the blurring. If no level\n parameter is used, the blur is equivalent to Guassian\n blur of radius 1.\n :opaque - sets the alpha channel to entirely opaque. Doesn't work\n with level.\n :erode - reduces the light areas. Doesn't work with level.\n :dilate - increases the light areas. Doesn't work with level."],"~$random",["^ ","^O","Math","^P",null,"^Q",["^ ","^O","Math","^R","1.0","^S","Random","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^42"],["~$min","^42"]]],"^[",["^10",[["^42"],["^?Z","^42"]]],"^17",["^10",[null,null]]],"^V","random()","^W",3,"^X",true,"^Y",3207,"^Z",3207,"^[",["^10",["^11",["^10",[["^42"],["^?Z","^42"]]]]],"^13","Generates random numbers. Each time the random function is called,\n it returns an unexpected value within the specified range. If one\n parameter is passed to the function it will return a float between\n zero and the value of the high parameter. The function call (random\n 5) returns values between 0 and 5 (starting at zero, up to but not\n including 5). If two parameters are passed, it will return a float\n with a value between the parameters. The function call\n (random -5 10.2) returns values starting at -5 up to (but not\n including) 10.2."],"^R","1.0","^B","~$quil.core/random","^S","Random","^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",2,"^15",["^10",[["^42"],["^?Z","^42"]]],"^[",["^10",[["^42"],["^?Z","^42"]]],"^17",["^10",[null,null]]],"^V","random()","^15",["^10",[["^42"],["^?Z","^42"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3201,"^Z",3207,"^1;",2,"^1<",true,"^[",["^10",[["^42"],["^?Z","^42"]]],"^13","Generates random numbers. Each time the random function is called,\n it returns an unexpected value within the specified range. If one\n parameter is passed to the function it will return a float between\n zero and the value of the high parameter. The function call (random\n 5) returns values between 0 and 5 (starting at zero, up to but not\n including 5). If two parameters are passed, it will return a float\n with a value between the parameters. The function call\n (random -5 10.2) returns values starting at -5 up to (but not\n including) 10.2."],"~$texture-mode",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Vertex","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","textureMode()","^W",3,"^X",true,"^Y",4367,"^Z",4367,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Sets the coordinate space for texture mapping. There are two\n options, :image and :normal.\n\n :image refers to the actual coordinates of the image and :normal\n refers to a normalized space of values ranging from 0 to 1. The\n default mode is :image. In :image, if an image is 100 x 200 pixels,\n mapping the image onto the entire size of a quad would require the\n points (0,0) (0,100) (100,200) (0,200). The same mapping in\n NORMAL_SPACE is (0,0) (0,1) (1,1) (0,1)."],"^R","1.0","^B","~$quil.core/texture-mode","^S","Vertex","^T","out/quil/core.cljc","^U",15,"^V","textureMode()","^15",["^10",[["^1I"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",4361,"^19","^1:","^Z",4367,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^1I"]]]]],"^13","Sets the coordinate space for texture mapping. There are two\n options, :image and :normal.\n\n :image refers to the actual coordinates of the image and :normal\n refers to a normalized space of values ranging from 0 to 1. The\n default mode is :image. In :image, if an image is 100 x 200 pixels,\n mapping the image onto the entire size of a quad would require the\n points (0,0) (0,100) (100,200) (0,200). The same mapping in\n NORMAL_SPACE is (0,0) (0,1) (1,1) (0,1)."],"~$redraw",["^ ","^O","Structure","^P",null,"^Q",["^ ","^O","Structure","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^V","redraw()","^W",3,"^X",true,"^Y",3344,"^Z",3344,"^[",["^10",["^11",["^10",[[]]]]],"^13","Executes the code within the draw fn one time. This functions\n allows the program to update the display window only when necessary,\n for example when an event registered by mouse-pressed or\n key-pressed occurs.\n\n In structuring a program, it only makes sense to call redraw\n within events such as mouse-pressed. This is because redraw does\n not run draw immediately (it only sets a flag that indicates an\n update is needed).\n\n Calling redraw within draw has no effect because draw is\n continuously called anyway."],"^R","1.0","^B","~$quil.core/redraw","^S",null,"^T","out/quil/core.cljc","^U",9,"^V","redraw()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3338,"^19","^1:","^Z",3344,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Executes the code within the draw fn one time. This functions\n allows the program to update the display window only when necessary,\n for example when an event registered by mouse-pressed or\n key-pressed occurs.\n\n In structuring a program, it only makes sense to call redraw\n within events such as mouse-pressed. This is because redraw does\n not run draw immediately (it only sets a flag that indicates an\n update is needed).\n\n Calling redraw within draw has no effect because draw is\n continuously called anyway."],"~$RAD-TO-DEG",["^ ","^B","~$quil.core/RAD-TO-DEG","^T","out/quil/core.cljc","^Y",83,"^W",1,"^Z",83,"^U",16,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",83,"^W",6,"^Z",83,"^U",16],"^1?","^4P"],"~$get-pixel",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Pixels","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[[],["^2="],["~$x","~$y"],["^2=","~$x","~$y"],["~$x","~$y","~$w","~$h"],["^2=","~$x","~$y","~$w","~$h"]]],"^[",["^10",[[],["^2="],["~$x","~$y"],["^2=","~$x","~$y"],["~$x","~$y","~$w","~$h"],["^2=","~$x","~$y","~$w","~$h"]]],"^17",["^10",[null,null,null,null,null,null]]],"^V","get()","^W",3,"^X",true,"^Y",1911,"^Z",1911,"^[",["^10",["^11",["^10",[[],["^2="],["~$x","~$y"],["^2=","~$x","~$y"],["~$x","~$y","~$w","~$h"],["^2=","~$x","~$y","~$w","~$h"]]]]],"^13","Reads the color of any pixel or grabs a section of an image. If no\n parameters are specified, a copy of entire image is returned. Get the\n value of one pixel by specifying an x,y coordinate. Get a section of\n the image by specifying an additional width and height parameter.\n If the pixel requested is outside of the image window, black is returned.\n The numbers returned are scaled according to the current color ranges,\n but only RGB values are returned by this function. For example, even though\n you may have drawn a shape with (color-mode :hsb), the numbers returned\n will be in RGB.\n\n Getting the color of a single pixel with (get x y) is easy, but not\n as fast as grabbing the data directly using the pixels fn.\n\n If no img specified - current-graphics is used."],"^R","1.0","^B","~$quil.core/get-pixel","^S","Pixels","^T","out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[[],["^2="],["~$x","~$y"],["^2=","~$x","~$y"],["~$x","~$y","~$w","~$h"],["^2=","~$x","~$y","~$w","~$h"]]],"^[",["^10",[[],["^2="],["~$x","~$y"],["^2=","~$x","~$y"],["~$x","~$y","~$w","~$h"],["^2=","~$x","~$y","~$w","~$h"]]],"^17",["^10",[null,null,null,null,null,null]]],"^V","get()","^15",["^10",[[],["^2="],["~$x","~$y"],["^2=","~$x","~$y"],["~$x","~$y","~$w","~$h"],["^2=","~$x","~$y","~$w","~$h"]]],"^16",null,"^17",["^10",[null,null,null,null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",1905,"^Z",1911,"^1;",5,"^1<",true,"^[",["^10",[[],["^2="],["~$x","~$y"],["^2=","~$x","~$y"],["~$x","~$y","~$w","~$h"],["^2=","~$x","~$y","~$w","~$h"]]],"^13","Reads the color of any pixel or grabs a section of an image. If no\n parameters are specified, a copy of entire image is returned. Get the\n value of one pixel by specifying an x,y coordinate. Get a section of\n the image by specifying an additional width and height parameter.\n If the pixel requested is outside of the image window, black is returned.\n The numbers returned are scaled according to the current color ranges,\n but only RGB values are returned by this function. For example, even though\n you may have drawn a shape with (color-mode :hsb), the numbers returned\n will be in RGB.\n\n Getting the color of a single pixel with (get x y) is easy, but not\n as fast as grabbing the data directly using the pixels fn.\n\n If no img specified - current-graphics is used."],"~$rotate",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^12"],["^12","~$vx","~$vy","~$vz"]]],"^[",["^10",[["^12"],["^12","^@9","^@:","^@;"]]],"^17",["^10",[null,null]]],"^V","rotate()","^W",3,"^X",true,"^Y",3438,"^Z",3438,"^[",["^10",["^11",["^10",[["^12"],["^12","^@9","^@:","^@;"]]]]],"^13","Rotates a shape the amount specified by the angle parameter. Angles\n should be specified in radians (values from 0 to TWO-PI) or\n converted to radians with the radians function.\n\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a clockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate HALF-PI) and then (rotate HALF-PI) is the\n same as (rotate PI). All tranformations are reset when draw begins\n again.\n\n Technically, rotate multiplies the current transformation matrix by\n a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix."],"^R","1.0","^B","~$quil.core/rotate","^S",null,"^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["^12"],["^12","^@9","^@:","^@;"]]],"^[",["^10",[["^12"],["^12","^@9","^@:","^@;"]]],"^17",["^10",[null,null]]],"^V","rotate()","^15",["^10",[["^12"],["^12","^@9","^@:","^@;"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3432,"^Z",3438,"^1;",4,"^1<",true,"^[",["^10",[["^12"],["^12","^@9","^@:","^@;"]]],"^13","Rotates a shape the amount specified by the angle parameter. Angles\n should be specified in radians (values from 0 to TWO-PI) or\n converted to radians with the radians function.\n\n Objects are always rotated around their relative position to the\n origin and positive numbers rotate objects in a clockwise\n direction. Transformations apply to everything that happens after\n and subsequent calls to the function accumulates the effect. For\n example, calling (rotate HALF-PI) and then (rotate HALF-PI) is the\n same as (rotate PI). All tranformations are reset when draw begins\n again.\n\n Technically, rotate multiplies the current transformation matrix by\n a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix."],"~$set-pixel",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Pixels","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["~$x","~$y","~$c"],["^2=","~$x","~$y","~$c"]]],"^[",["^10",[["~$x","~$y","~$c"],["^2=","~$x","~$y","~$c"]]],"^17",["^10",[null,null]]],"^V","set()","^W",3,"^X",true,"^Y",3696,"^Z",3696,"^[",["^10",["^11",["^10",[["~$x","~$y","~$c"],["^2=","~$x","~$y","~$c"]]]]],"^13","Changes the color of any pixel in the display window. The x and y\n parameters specify the pixel to change and the color parameter\n specifies the color value. The color parameter is affected by the\n current color mode (the default is RGB values from 0 to 255).\n\n Setting the color of a single pixel with (set x, y) is easy, but not\n as fast as putting the data directly into pixels[].\n\n This function ignores imageMode().\n\n Due to what appears to be a bug in Apple's Java implementation, the\n point() and set() methods are extremely slow in some circumstances\n when used with the default renderer. Using :p2d or :p3d will fix the\n problem. Grouping many calls to point or set-pixel together can also\n help. (Bug 1094)"],"^R","1.0","^B","~$quil.core/set-pixel","^S","Pixels","^T","out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",4,"^15",["^10",[["~$x","~$y","~$c"],["^2=","~$x","~$y","~$c"]]],"^[",["^10",[["~$x","~$y","~$c"],["^2=","~$x","~$y","~$c"]]],"^17",["^10",[null,null]]],"^V","set()","^15",["^10",[["~$x","~$y","~$c"],["^2=","~$x","~$y","~$c"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3690,"^Z",3696,"^1;",4,"^1<",true,"^[",["^10",[["~$x","~$y","~$c"],["^2=","~$x","~$y","~$c"]]],"^13","Changes the color of any pixel in the display window. The x and y\n parameters specify the pixel to change and the color parameter\n specifies the color value. The color parameter is affected by the\n current color mode (the default is RGB values from 0 to 255).\n\n Setting the color of a single pixel with (set x, y) is easy, but not\n as fast as putting the data directly into pixels[].\n\n This function ignores imageMode().\n\n Due to what appears to be a bug in Apple's Java implementation, the\n point() and set() methods are extremely slow in some circumstances\n when used with the default renderer. Using :p2d or :p3d will fix the\n problem. Grouping many calls to point or set-pixel together can also\n help. (Bug 1094)"],"~$push-matrix",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",14,"^V","pushMatrix()","^W",3,"^X",true,"^Y",3110,"^Z",3110,"^[",["^10",["^11",["^10",[[]]]]],"^13","Pushes the current transformation matrix onto the matrix\n stack. Understanding push-matrix and pop-matrix requires\n understanding the concept of a matrix stack. The push-matrix\n function saves the current coordinate system to the stack and\n pop-matrix restores the prior coordinate system. push-matrix and\n pop-matrix are used in conjuction with the other transformation\n methods and may be embedded to control the scope of the\n transformations."],"^R","1.0","^B","~$quil.core/push-matrix","^S",null,"^T","out/quil/core.cljc","^U",14,"^V","pushMatrix()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3104,"^19","^1:","^Z",3110,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Pushes the current transformation matrix onto the matrix\n stack. Understanding push-matrix and pop-matrix requires\n understanding the concept of a matrix stack. The push-matrix\n function saves the current coordinate system to the stack and\n pop-matrix restores the prior coordinate system. push-matrix and\n pop-matrix are used in conjuction with the other transformation\n methods and may be embedded to control the scope of the\n transformations."],"~$no-smooth",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","Attributes","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","noSmooth()","^W",3,"^X",true,"^Y",2853,"^Z",2853,"^[",["^10",["^11",["^10",[[]]]]],"^13","Draws all geometry with jagged (aliased) edges. Must be called inside\n :settings handler."],"^R","1.0","^B","~$quil.core/no-smooth","^S","Attributes","^T","out/quil/core.cljc","^U",12,"^V","noSmooth()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2847,"^19","^1:","^Z",2853,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Draws all geometry with jagged (aliased) edges. Must be called inside\n :settings handler."],"^2N",["^ ","^O","Color","^P",null,"^Q",["^ ","^O","Color","^R","1.0","^S","Creating & Reading","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^V","alpha()","^W",3,"^X",true,"^Y",313,"^Z",313,"^[",["^10",["^11",["^10",[["^87"]]]]],"^13","Extracts the alpha value from a color."],"^R","1.0","^B","~$quil.core/alpha","^S","Creating & Reading","^T","out/quil/core.cljc","^U",8,"^V","alpha()","^15",["^10",[["^87"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",307,"^19","^1:","^Z",313,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^87"]]]]],"^13","Extracts the alpha value from a color."],"~$camera",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Camera","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",9,"^15",["^10",[[],["~$eyeX","~$eyeY","~$eyeZ","~$centerX","~$centerY","~$centerZ","~$upX","~$upY","~$upZ"]]],"^[",["^10",[[],["^@E","^@F","^@G","^@H","^@I","^@J","^@K","^@L","^@M"]]],"^17",["^10",[null,null]]],"^V","camera()","^W",3,"^X",true,"^Y",939,"^Z",939,"^[",["^10",["^11",["^10",[[],["^@E","^@F","^@G","^@H","^@I","^@J","^@K","^@L","^@M"]]]]],"^13","Sets the position of the camera through setting the eye position,\n the center of the scene, and which axis is facing upward. Moving the\n eye position and the direction it is pointing (the center of the\n scene) allows the images to be seen from different angles. The\n version without any parameters sets the camera to the default\n position, pointing to the center of the display window with the Y\n axis as up. The default values are:\n\n eyeX: (/ (width) 2.0)\n eyeY: (/ (height) 2.0)\n eyeZ: (/ (/ (height) 2.0) (tan (/ (* Math/PI 60.0) 360.0)))\n centerX: (/ (width) 2.0)\n centerY: (/ (height) 2.0)\n centerZ: 0\n upX: 0\n upY: 1\n upZ: 0\n\n Similar imilar to gluLookAt() in OpenGL, but it first clears the\n current camera settings."],"^R","1.0","^B","~$quil.core/camera","^S","Camera","^T","out/quil/core.cljc","^U",9,"^1F",["^ ","^18",false,"^1;",9,"^15",["^10",[[],["^@E","^@F","^@G","^@H","^@I","^@J","^@K","^@L","^@M"]]],"^[",["^10",[[],["^@E","^@F","^@G","^@H","^@I","^@J","^@K","^@L","^@M"]]],"^17",["^10",[null,null]]],"^V","camera()","^15",["^10",[[],["^@E","^@F","^@G","^@H","^@I","^@J","^@K","^@L","^@M"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",933,"^Z",939,"^1;",9,"^1<",true,"^[",["^10",[[],["^@E","^@F","^@G","^@H","^@I","^@J","^@K","^@L","^@M"]]],"^13","Sets the position of the camera through setting the eye position,\n the center of the scene, and which axis is facing upward. Moving the\n eye position and the direction it is pointing (the center of the\n scene) allows the images to be seen from different angles. The\n version without any parameters sets the camera to the default\n position, pointing to the center of the display window with the Y\n axis as up. The default values are:\n\n eyeX: (/ (width) 2.0)\n eyeY: (/ (height) 2.0)\n eyeZ: (/ (/ (height) 2.0) (tan (/ (* Math/PI 60.0) 360.0)))\n centerX: (/ (width) 2.0)\n centerY: (/ (height) 2.0)\n centerZ: 0\n upX: 0\n upY: 1\n upZ: 0\n\n Similar imilar to gluLookAt() in OpenGL, but it first clears the\n current camera settings."],"~$translate",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$v"],["~$tx","~$ty"],["^@P","^@Q","~$tz"]]],"^[",["^10",[["~$v"],["^@P","^@Q"],["^@P","^@Q","^@R"]]],"^17",["^10",[null,null,null]]],"^V","translate()","^W",3,"^X",true,"^Y",4488,"^Z",4488,"^[",["^10",["^11",["^10",[["~$v"],["^@P","^@Q"],["^@P","^@Q","^@R"]]]]],"^13","Specifies an amount to displace objects within the display\n window. The x parameter specifies left/right translation, the y\n parameter specifies up/down translation, and the z parameter\n specifies translations toward/away from the screen. Transformations\n apply to everything that happens after and subsequent calls to the\n function accumulates the effect. For example, calling (translate 50\n 0) and then (translate 20, 0) is the same as (translate 70, 0). If\n translate is called within draw, the transformation is reset when\n the loop begins again. This function can be further controlled by\n the push-matrix and pop-matrix."],"^R","1.0","^B","~$quil.core/translate","^S",null,"^T","out/quil/core.cljc","^U",12,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$v"],["^@P","^@Q"],["^@P","^@Q","^@R"]]],"^[",["^10",[["~$v"],["^@P","^@Q"],["^@P","^@Q","^@R"]]],"^17",["^10",[null,null,null]]],"^V","translate()","^15",["^10",[["~$v"],["^@P","^@Q"],["^@P","^@Q","^@R"]]],"^16",null,"^17",["^10",[null,null,null]],"^W",1,"^18",false,"^X",true,"^Y",4482,"^Z",4488,"^1;",3,"^1<",true,"^[",["^10",[["~$v"],["^@P","^@Q"],["^@P","^@Q","^@R"]]],"^13","Specifies an amount to displace objects within the display\n window. The x parameter specifies left/right translation, the y\n parameter specifies up/down translation, and the z parameter\n specifies translations toward/away from the screen. Transformations\n apply to everything that happens after and subsequent calls to the\n function accumulates the effect. For example, calling (translate 50\n 0) and then (translate 20, 0) is the same as (translate 70, 0). If\n translate is called within draw, the transformation is reset when\n the loop begins again. This function can be further controlled by\n the push-matrix and pop-matrix."],"~$load-font",["^ ","^O","Typography","^P",null,"^Q",["^ ","^O","Typography","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","loadFont()","^W",3,"^X",true,"^Y",2344,"^Z",2344,"^[",["^10",["^11",["^10",[["^56"]]]]],"^13","Loads a font into a variable of type PFont. To load correctly,\n fonts must be located in the data directory of the current sketch.\n To create a font to use with Processing use the create-font fn.\n\n Like load-image and other methods that load data, the load-font fn\n should not be used inside draw, because it will slow down the sketch\n considerably, as the font will be re-loaded from the disk (or\n network) on each frame.\n\n For most renderers, Processing displays fonts using the .vlw font\n format, which uses images for each letter, rather than defining them\n through vector data. When hint :enable-native-fonts is used with the\n JAVA2D renderer, the native version of a font will be used if it is\n installed on the user's machine.\n\n Using create-font (instead of load-font) enables vector data to be\n used with the JAVA2D (default) renderer setting. This can be helpful\n when many font sizes are needed, or when using any renderer based on\n JAVA2D, such as the PDF library."],"^R","1.0","^B","~$quil.core/load-font","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",12,"^V","loadFont()","^15",["^10",[["^56"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2338,"^19","^1:","^Z",2344,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^56"]]]]],"^13","Loads a font into a variable of type PFont. To load correctly,\n fonts must be located in the data directory of the current sketch.\n To create a font to use with Processing use the create-font fn.\n\n Like load-image and other methods that load data, the load-font fn\n should not be used inside draw, because it will slow down the sketch\n considerably, as the font will be re-loaded from the disk (or\n network) on each frame.\n\n For most renderers, Processing displays fonts using the .vlw font\n format, which uses images for each letter, rather than defining them\n through vector data. When hint :enable-native-fonts is used with the\n JAVA2D renderer, the native version of a font will be used if it is\n installed on the user's machine.\n\n Using create-font (instead of load-font) enables vector data to be\n used with the JAVA2D (default) renderer setting. This can be helpful\n when many font sizes are needed, or when using any renderer based on\n JAVA2D, such as the PDF library."],"~$ambient",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Material Properties","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^3I"],["~$x","~$y","~$z"]]],"^[",["^10",[["^3I"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","ambient()","^W",3,"^X",true,"^Y",356,"^Z",356,"^[",["^10",["^11",["^10",[["^3I"],["~$x","~$y","~$z"]]]]],"^13","Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The\n color components set through the parameters define the\n reflectance. For example in the default color mode, setting x=255,\n y=126, z=0, would cause all the red light to reflect and half of the\n green light to reflect. Used in combination with emissive, specular,\n and shininess in setting the material properties of shapes."],"^R","1.0","^B","~$quil.core/ambient","^S","Material Properties","^T","out/quil/core.cljc","^U",10,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["^3I"],["~$x","~$y","~$z"]]],"^[",["^10",[["^3I"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","ambient()","^15",["^10",[["^3I"],["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",350,"^Z",356,"^1;",3,"^1<",true,"^[",["^10",[["^3I"],["~$x","~$y","~$z"]]],"^13","Sets the ambient reflectance for shapes drawn to the screen. This\n is combined with the ambient light component of environment. The\n color components set through the parameters define the\n reflectance. For example in the default color mode, setting x=255,\n y=126, z=0, would cause all the red light to reflect and half of the\n green light to reflect. Used in combination with emissive, specular,\n and shininess in setting the material properties of shapes."],"~$shear-y",["^ ","^O","Transform","^P",null,"^Q",["^ ","^O","Transform","^R","1.0","^S",null,"^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","shearY()","^W",3,"^X",true,"^Y",3801,"^Z",3801,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Shears a shape around the y-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n PI*2) or converted to radians with the radians() function. Objects\n are always sheared around their relative position to the origin and\n positive numbers shear objects in a clockwise direction.\n Transformations apply to everything that happens after and\n subsequent calls to the function accumulates the effect. For\n example, calling (shear-y (/ PI 2)) and then (shear-y (/ PI 2)) is\n the same as (shear-y PI). If shear-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function works in P2D or JAVA2D mode.\n\n Technically, shear-y multiplies the current transformation matrix\n by a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix fns."],"^R","1.0","^B","~$quil.core/shear-y","^S",null,"^T","out/quil/core.cljc","^U",10,"^V","shearY()","^15",["^10",[["^12"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",3795,"^19","^1:","^Z",3801,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^12"]]]]],"^13","Shears a shape around the y-axis the amount specified by the angle\n parameter. Angles should be specified in radians (values from 0 to\n PI*2) or converted to radians with the radians() function. Objects\n are always sheared around their relative position to the origin and\n positive numbers shear objects in a clockwise direction.\n Transformations apply to everything that happens after and\n subsequent calls to the function accumulates the effect. For\n example, calling (shear-y (/ PI 2)) and then (shear-y (/ PI 2)) is\n the same as (shear-y PI). If shear-y is called within the draw fn,\n the transformation is reset when the loop begins again. This\n function works in P2D or JAVA2D mode.\n\n Technically, shear-y multiplies the current transformation matrix\n by a rotation matrix. This function can be further controlled by the\n push-matrix and pop-matrix fns."],"~$cursor-modes",["^ ","^B","~$quil.core/cursor-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",72,"^U",14,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",72,"^W",2,"^Z",72,"^U",14],"^1?","^1@"],"~$mouse-y",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Mouse","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","mouseY","^W",3,"^X",true,"^Y",2631,"^Z",2631,"^[",["^10",["^11",["^10",[[]]]]],"^13","Current vertical coordinate of the mouse."],"^R","1.0","^B","~$quil.core/mouse-y","^S","Mouse","^T","out/quil/core.cljc","^U",10,"^V","mouseY","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2625,"^19","^1:","^Z",2631,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Current vertical coordinate of the mouse."],"~$mouse-button",["^ ","^O","Input","^P",null,"^Q",["^ ","^O","Input","^R","1.0","^S","Mouse","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","mouseButton","^W",3,"^X",true,"^Y",2581,"^Z",2581,"^[",["^10",["^11",["^10",[[]]]]],"^13","The value of the system variable mouseButton is either :left, :right,\n or :center depending on which button is pressed. nil if no button pressed"],"^R","1.0","^B","~$quil.core/mouse-button","^S","Mouse","^T","out/quil/core.cljc","^U",15,"^V","mouseButton","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2575,"^19",["^A",["~$cljs.core/Keyword","^?7"]],"^Z",2581,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","The value of the system variable mouseButton is either :left, :right,\n or :center depending on which button is pressed. nil if no button pressed"],"~$p-shape-modes",["^ ","^B","~$quil.core/p-shape-modes","^T","out/quil/core.cljc","^Y",45,"^W",1,"^Z",63,"^U",15,"^Q",["^ ","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^Y",63,"^W",2,"^Z",63,"^U",15],"^1?","^1@"],"~$image",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[["^2=","~$x","~$y"],["^2=","~$x","~$y","~$c","~$d"]]],"^[",["^10",[["^2=","~$x","~$y"],["^2=","~$x","~$y","~$c","~$d"]]],"^17",["^10",[null,null]]],"^V","image()","^W",3,"^X",true,"^Y",2076,"^Z",2076,"^[",["^10",["^11",["^10",[["^2=","~$x","~$y"],["^2=","~$x","~$y","~$c","~$d"]]]]],"^13","Displays images to the screen. Processing currently works with GIF,\n JPEG, and Targa images. The color of an image may be modified with\n the tint function and if a GIF has transparency, it will maintain\n its transparency. The img parameter specifies the image to display\n and the x and y parameters define the location of the image from its\n upper-left corner. The image is displayed at its original size\n unless the width and height parameters specify a different size. The\n image-mode fn changes the way the parameters work. A call to\n (image-mode :corners) will change the width and height parameters to\n define the x and y values of the opposite corner of the image.\n\n Starting with release 0124, when using the default (JAVA2D)\n renderer, smooth will also improve image quality of resized\n images."],"^R","1.0","^B","~$quil.core/image","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",5,"^15",["^10",[["^2=","~$x","~$y"],["^2=","~$x","~$y","~$c","~$d"]]],"^[",["^10",[["^2=","~$x","~$y"],["^2=","~$x","~$y","~$c","~$d"]]],"^17",["^10",[null,null]]],"^V","image()","^15",["^10",[["^2=","~$x","~$y"],["^2=","~$x","~$y","~$c","~$d"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2070,"^Z",2076,"^1;",5,"^1<",true,"^[",["^10",[["^2=","~$x","~$y"],["^2=","~$x","~$y","~$c","~$d"]]],"^13","Displays images to the screen. Processing currently works with GIF,\n JPEG, and Targa images. The color of an image may be modified with\n the tint function and if a GIF has transparency, it will maintain\n its transparency. The img parameter specifies the image to display\n and the x and y parameters define the location of the image from its\n upper-left corner. The image is displayed at its original size\n unless the width and height parameters specify a different size. The\n image-mode fn changes the way the parameters work. A call to\n (image-mode :corners) will change the width and height parameters to\n define the x and y values of the opposite corner of the image.\n\n Starting with release 0124, when using the default (JAVA2D)\n renderer, smooth will also improve image quality of resized\n images."],"~$unbinary",["^ ","^O","Data","^P",null,"^Q",["^ ","^O","Data","^4R",false,"^R","1.0","^S","Conversion","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",11,"^V","unbinary()","^W",3,"^Y",4526,"^Z",4526,"^[",["^10",["^11",["^10",[["~$str-val"]]]]],"^13","Unpack a binary string to an integer. See binary for converting\n integers to strings."],"^4R",false,"^R","1.0","^B","~$quil.core/unbinary","^S","Conversion","^T","out/quil/core.cljc","^U",11,"^V","unbinary()","^15",["^10",[["^A:"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^Y",4520,"^19","^1:","^Z",4526,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^A:"]]]]],"^13","Unpack a binary string to an integer. See binary for converting\n integers to strings."],"~$no-tint",["^ ","^O","Image","^P",null,"^Q",["^ ","^O","Image","^R","1.0","^S","Loading & Displaying","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",10,"^V","noTint()","^W",3,"^X",true,"^Y",2876,"^Z",2876,"^[",["^10",["^11",["^10",[[]]]]],"^13","Removes the current fill value for displaying images and reverts to\n displaying images with their original hues."],"^R","1.0","^B","~$quil.core/no-tint","^S","Loading & Displaying","^T","out/quil/core.cljc","^U",10,"^V","noTint()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2870,"^19","^1:","^Z",2876,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Removes the current fill value for displaying images and reverts to\n displaying images with their original hues."],"~$no-lights",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Lights","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",12,"^V","noLights()","^W",3,"^X",true,"^Y",2785,"^Z",2785,"^[",["^10",["^11",["^10",[[]]]]],"^13","Disable all lighting. Lighting is turned off by default and enabled\n with the lights fn. This function can be used to disable lighting so\n that 2D geometry (which does not require lighting) can be drawn\n after a set of lighted 3D geometry."],"^R","1.0","^B","~$quil.core/no-lights","^S","Lights","^T","out/quil/core.cljc","^U",12,"^V","noLights()","^15",["^10",[[]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2779,"^19","^1:","^Z",2785,"^1;",0,"^1<",true,"^[",["^10",["^11",["^10",[[]]]]],"^13","Disable all lighting. Lighting is turned off by default and enabled\n with the lights fn. This function can be used to disable lighting so\n that 2D geometry (which does not require lighting) can be drawn\n after a set of lighted 3D geometry."],"~$emissive-int",["^ ","^O","Lights, Camera","^P",null,"^Q",["^ ","^O","Lights, Camera","^R","1.0","^S","Material Properties","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",15,"^V","emissive()","^W",3,"^X",true,"^Y",1580,"^Z",1580,"^[",["^10",["^11",["^10",[["~$int-val"]]]]],"^13","Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes. Converts all\n args to ints"],"^R","1.0","^B","~$quil.core/emissive-int","^S","Material Properties","^T","out/quil/core.cljc","^U",15,"^V","emissive()","^15",["^10",[["^AA"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",1574,"^19","^1:","^Z",1580,"^1;",1,"^1<",true,"^[",["^10",["^11",["^10",[["^AA"]]]]],"^13","Sets the emissive color of the material used for drawing shapes\n drawn to the screen. Used in combination with ambient, specular, and\n shininess in setting the material properties of shapes. Converts all\n args to ints"],"~$point",["^ ","^O","Shape","^P",null,"^Q",["^ ","^O","Shape","^R","1.0","^S","2D Primitives","^T","/home/mediocregopher/src/viz/out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","point()","^W",3,"^X",true,"^Y",2995,"^Z",2995,"^[",["^10",["^11",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]]]],"^13","Draws a point, a coordinate in space at the dimension of one\n pixel. The first parameter is the horizontal value for the point,\n the second value is the vertical value for the point, and the\n optional third value is the depth value. Drawing this shape in 3D\n using the z parameter requires the :P3D or :opengl renderer to be\n used."],"^R","1.0","^B","~$quil.core/point","^S","2D Primitives","^T","out/quil/core.cljc","^U",8,"^1F",["^ ","^18",false,"^1;",3,"^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^17",["^10",[null,null]]],"^V","point()","^15",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^16",null,"^17",["^10",[null,null]],"^W",1,"^18",false,"^X",true,"^Y",2989,"^Z",2995,"^1;",3,"^1<",true,"^[",["^10",[["~$x","~$y"],["~$x","~$y","~$z"]]],"^13","Draws a point, a coordinate in space at the dimension of one\n pixel. The first parameter is the horizontal value for the point,\n the second value is the vertical value for the point, and the\n optional third value is the depth value. Drawing this shape in 3D\n using the z parameter requires the :P3D or :opengl renderer to be\n used."]],"~:cljs.spec/registry-ref",[],"~:require-macros",["^ ","^H","^I","^I","^I","~$u","^J","^J","^J"],"~:cljs.analyzer/constants",["^ ","~:seen",["^A",["~:shift","~$.endDraw","~:open","~:baseline","~:disable-stroke-perspective","~$old-stroke__1569__auto__","~:hsb","~:quads","~:arrow","~:dilate","^>F","~$try","^?6","~:quad-strip","~:down","~:disable-depth-mask","~$cljs.core/binding","~:burn","~$gr__1596__auto__","~:posterize","~$quil.sketch/with-sketch","~:f8","^@S","~:screen","~:enable-depth-test","~:gray","~:enable-depth-sort","~:f1","~:corner","~:disable-texture-mipmaps","~:darkest","~:f10","~:dodge","~:bottom","~:bevel","~:disable-stroke-pure","~:replace","~:alt","~$tr__1578__auto__","~:top","~$cljs.core/apply","~:disable-depth-test","~$finally","~:pie","^4Y","~:enable-stroke-perspective","~:chord","~:rgb","~$.dispose","~:lines","~:argb","~:move","~:f5","~:command","^6L","~:miter","~:points","~:hand","~:close","~:radius","~:normal","~:threshold","~:up","~:center","~:round","~:disable-optimized-stroke","~$tr__1587__auto__","~$cljs.core/let","~:corners","~:f11","~:opaque","~:overlay","~:enable-opengl-errors","~:enable-stroke-pure","~:blur","~:project","~:triangle-fan","~:f3","~:enable-depth-mask","~:f2","~:control","~:difference","^@@","~$gr__1390__auto__","~:square","~:enable-optimized-stroke","~:p2d","~:shape","~:f12","~:exclusion","^9O","~:disable-opengl-errors","~:unknown-key","~:alpha","~:wait","~:right","^?C","~:repeat","~:hard-light","~$quil.sketch$macros/defsketch","~:image","~:multiply","~:lightest","^@<","~:f7","~$old-fill__1560__auto__","~:blend","~:disable-depth-sort","~:f9","~:erode","~:add","~:soft-light","^24","~:subtract","~:clamp","~:f6","~:f4","~:triangle-strip","~:cross","~:triangles","~$.beginDraw","~:left","~:invert","~:text","~:enable-texture-mipmaps","~:model"]],"~:order",["^AK","^BG","^BE","^BP","^BJ","^D2","^C8","^D0","^AP","^AT","^AX","^B1","^B8","^B:","^B>","^C3","^C=","^CD","^CK","^CN","^CO","^CR","^CV","^CW","^CX","^BH","^AO","^BK","^CG","^BW","^BS","^B6","^C0","^AM","^AV","^B2","^B4","^B7","^B=","^BC","^BF","^BY","^C4","^C5","^C:","^C@","^CE","^CS","^D7","^C?","^BX","^C7","^D8","^BO","^B<","^D4","^CI","^BA","^B;","^AL","^CB","^CM","^BT","^CY","^CJ","^BU","^B3","^D5","^AZ","^C6","^C2","^CU","^AR","^AQ","^D1","^BQ","^BL","^D6","^CH","^B9","^BN","^B0","^BM","^C;","^AU","^CZ","^CP","^C1","^C<","^C[","^B5","^CC","^AI","^CT","^BV","^B?","^C9","^A[","^CA","^B[","^C>","^24","^BI","^BR","^CQ","^>F","^BB","^9O","^AN","^?C","^6L","^B@","^@@","^AS","^@S","^BD","^4Y","^BZ","^@<","^AY","^AW","^?6","^D3","^AJ","^CL","^CF"]],"^13","Wrappers and extensions around the core Processing.org API."] \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/core.js b/src/http/static/viz/2/quil/core.js
new file mode 100644
index 0000000..d4a2954
--- /dev/null
+++ b/src/http/static/viz/2/quil/core.js
@@ -0,0 +1,5543 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('quil.core');
+goog.require('cljs.core');
+goog.require('clojure.string');
+goog.require('org.processingjs.Processing');
+goog.require('quil.sketch');
+goog.require('quil.util');
+quil.core._STAR_graphics_STAR_ = null;
+quil.core.no_fill_prop = "no-fill-quil";
+/**
+ * Graphics currently used for drawing. By default it is sketch graphics,
+ * but if called inside with-graphics macro - graphics passed to the macro
+ * is returned. This method should be used if you need to call some methods
+ * that are not implemented by quil. Example:
+ * (.beginDraw (current-graphics)).
+ */
+quil.core.current_graphics = (function quil$core$current_graphics(){
+var or__4047__auto__ = quil.core._STAR_graphics_STAR_;
+if(cljs.core.truth_(or__4047__auto__)){
+return or__4047__auto__;
+} else {
+return quil.sketch.current_applet.call(null);
+}
+});
+quil.core.arc_modes = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"open","open",-1763596448),(Processing.prototype.PConstants["OPEN"]),new cljs.core.Keyword(null,"chord","chord",-696248342),(Processing.prototype.PConstants["CHORD"]),new cljs.core.Keyword(null,"pie","pie",1530441672),(Processing.prototype.PConstants["PIE"])], null);
+
+quil.core.shape_modes = new cljs.core.PersistentArrayMap(null, 7, [new cljs.core.Keyword(null,"points","points",-1486596883),(Processing.prototype.PConstants["POINTS"]),new cljs.core.Keyword(null,"lines","lines",-700165781),(Processing.prototype.PConstants["LINES"]),new cljs.core.Keyword(null,"triangles","triangles",-1525417058),(Processing.prototype.PConstants["TRIANGLES"]),new cljs.core.Keyword(null,"triangle-fan","triangle-fan",1743150739),(Processing.prototype.PConstants["TRIANGLE_FAN"]),new cljs.core.Keyword(null,"triangle-strip","triangle-strip",221845500),(Processing.prototype.PConstants["TRIANGLE_STRIP"]),new cljs.core.Keyword(null,"quads","quads",1347497505),(Processing.prototype.PConstants["QUADS"]),new cljs.core.Keyword(null,"quad-strip","quad-strip",-1297270686),(Processing.prototype.PConstants["QUAD_STRIP"])], null);
+
+quil.core.blend_modes = cljs.core.PersistentHashMap.fromArrays([new cljs.core.Keyword(null,"burn","burn",-458179293),new cljs.core.Keyword(null,"screen","screen",1990059748),new cljs.core.Keyword(null,"darkest","darkest",68197253),new cljs.core.Keyword(null,"dodge","dodge",-1556666427),new cljs.core.Keyword(null,"replace","replace",-786587770),new cljs.core.Keyword(null,"overlay","overlay",-139131598),new cljs.core.Keyword(null,"difference","difference",1916101396),new cljs.core.Keyword(null,"exclusion","exclusion",531897910),new cljs.core.Keyword(null,"hard-light","hard-light",-37591145),new cljs.core.Keyword(null,"multiply","multiply",-1036907048),new cljs.core.Keyword(null,"lightest","lightest",-2043115912),new cljs.core.Keyword(null,"blend","blend",249565561),new cljs.core.Keyword(null,"add","add",235287739),new cljs.core.Keyword(null,"soft-light","soft-light",513207899),new cljs.core.Keyword(null,"subtract","subtract",2136988635)],[(Processing.prototype.PConstants["BURN"]),(Processing.prototype.PConstants["SCREEN"]),(Processing.prototype.PConstants["DARKEST"]),(Processing.prototype.PConstants["DODGE"]),(Processing.prototype.PConstants["REPLACE"]),(Processing.prototype.PConstants["OVERLAY"]),(Processing.prototype.PConstants["DIFFERENCE"]),(Processing.prototype.PConstants["EXCLUSION"]),(Processing.prototype.PConstants["HARD_LIGHT"]),(Processing.prototype.PConstants["MULTIPLY"]),(Processing.prototype.PConstants["LIGHTEST"]),(Processing.prototype.PConstants["BLEND"]),(Processing.prototype.PConstants["ADD"]),(Processing.prototype.PConstants["SOFT_LIGHT"]),(Processing.prototype.PConstants["SUBTRACT"])]);
+
+quil.core.color_modes = new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"rgb","rgb",1432123467),(Processing.prototype.PConstants["RGB"]),new cljs.core.Keyword(null,"hsb","hsb",-753472031),(Processing.prototype.PConstants["HSB"])], null);
+
+quil.core.image_formats = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"rgb","rgb",1432123467),(Processing.prototype.PConstants["RGB"]),new cljs.core.Keyword(null,"argb","argb",633844107),(Processing.prototype.PConstants["ARGB"]),new cljs.core.Keyword(null,"alpha","alpha",-1574982441),(Processing.prototype.PConstants["ALPHA"])], null);
+
+quil.core.ellipse_modes = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"]),new cljs.core.Keyword(null,"radius","radius",-2073122258),(Processing.prototype.PConstants["RADIUS"]),new cljs.core.Keyword(null,"corner","corner",1296717125),(Processing.prototype.PConstants["CORNER"]),new cljs.core.Keyword(null,"corners","corners",-137817903),(Processing.prototype.PConstants["CORNERS"])], null);
+
+quil.core.hint_options = cljs.core.PersistentHashMap.fromArrays([new cljs.core.Keyword(null,"disable-stroke-perspective","disable-stroke-perspective",479198433),new cljs.core.Keyword(null,"disable-depth-mask","disable-depth-mask",3298562),new cljs.core.Keyword(null,"enable-depth-test","enable-depth-test",1519326084),new cljs.core.Keyword(null,"enable-depth-sort","enable-depth-sort",-383089627),new cljs.core.Keyword(null,"disable-texture-mipmaps","disable-texture-mipmaps",1697917541),new cljs.core.Keyword(null,"disable-stroke-pure","disable-stroke-pure",735493926),new cljs.core.Keyword(null,"disable-depth-test","disable-depth-test",284606407),new cljs.core.Keyword(null,"enable-stroke-perspective","enable-stroke-perspective",-259923319),new cljs.core.Keyword(null,"disable-optimized-stroke","disable-optimized-stroke",74038544),new cljs.core.Keyword(null,"enable-opengl-errors","enable-opengl-errors",89998962),new cljs.core.Keyword(null,"enable-stroke-pure","enable-stroke-pure",881345587),new cljs.core.Keyword(null,"enable-depth-mask","enable-depth-mask",872785875),new cljs.core.Keyword(null,"enable-optimized-stroke","enable-optimized-stroke",1537575253),new cljs.core.Keyword(null,"disable-opengl-errors","disable-opengl-errors",506822839),new cljs.core.Keyword(null,"disable-depth-sort","disable-depth-sort",-1568352839),new cljs.core.Keyword(null,"enable-texture-mipmaps","enable-texture-mipmaps",1241892671)],[(Processing.prototype.PConstants["DISABLE_STROKE_PERSPECTIVE"]),(Processing.prototype.PConstants["DISABLE_DEPTH_MASK"]),(Processing.prototype.PConstants["ENABLE_DEPTH_TEST"]),(Processing.prototype.PConstants["ENABLE_DEPTH_SORT"]),(Processing.prototype.PConstants["DISABLE_TEXTURE_MIPMAPS"]),(Processing.prototype.PConstants["DISABLE_STROKE_PURE"]),(Processing.prototype.PConstants["DISABLE_DEPTH_TEST"]),(Processing.prototype.PConstants["ENABLE_STROKE_PERSPECTIVE"]),(Processing.prototype.PConstants["DISABLE_OPTIMIZED_STROKE"]),(Processing.prototype.PConstants["ENABLE_OPENGL_ERRORS"]),(Processing.prototype.PConstants["ENABLE_STROKE_PURE"]),(Processing.prototype.PConstants["ENABLE_DEPTH_MASK"]),(Processing.prototype.PConstants["ENABLE_OPTIMIZED_STROKE"]),(Processing.prototype.PConstants["DISABLE_OPENGL_ERRORS"]),(Processing.prototype.PConstants["DISABLE_DEPTH_SORT"]),(Processing.prototype.PConstants["ENABLE_TEXTURE_MIPMAPS"])]);
+
+quil.core.image_modes = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"corner","corner",1296717125),(Processing.prototype.PConstants["CORNER"]),new cljs.core.Keyword(null,"corners","corners",-137817903),(Processing.prototype.PConstants["CORNERS"]),new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"])], null);
+
+quil.core.rect_modes = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"corner","corner",1296717125),(Processing.prototype.PConstants["CORNER"]),new cljs.core.Keyword(null,"corners","corners",-137817903),(Processing.prototype.PConstants["CORNERS"]),new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"]),new cljs.core.Keyword(null,"radius","radius",-2073122258),(Processing.prototype.PConstants["RADIUS"])], null);
+
+quil.core.p_shape_modes = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"corner","corner",1296717125),(Processing.prototype.PConstants["CORNER"]),new cljs.core.Keyword(null,"corners","corners",-137817903),(Processing.prototype.PConstants["CORNERS"]),new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"])], null);
+
+quil.core.stroke_cap_modes = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"square","square",812434677),(Processing.prototype.PConstants["SQUARE"]),new cljs.core.Keyword(null,"round","round",2009433328),(Processing.prototype.PConstants["ROUND"]),new cljs.core.Keyword(null,"project","project",1124394579),(Processing.prototype.PConstants["PROJECT"]),new cljs.core.Keyword(null,"model","model",331153215),(Processing.prototype.PConstants["MODEL"])], null);
+
+quil.core.stroke_join_modes = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"miter","miter",327727052),(Processing.prototype.PConstants["MITER"]),new cljs.core.Keyword(null,"bevel","bevel",2090515654),(Processing.prototype.PConstants["BEVEL"]),new cljs.core.Keyword(null,"round","round",2009433328),(Processing.prototype.PConstants["ROUND"])], null);
+
+quil.core.horizontal_alignment_modes = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"left","left",-399115937),(Processing.prototype.PConstants["LEFT"]),new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"]),new cljs.core.Keyword(null,"right","right",-452581833),(Processing.prototype.PConstants["RIGHT"])], null);
+
+quil.core.vertical_alignment_modes = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"top","top",-1856271961),(Processing.prototype.PConstants["TOP"]),new cljs.core.Keyword(null,"bottom","bottom",-1550509018),(Processing.prototype.PConstants["BOTTOM"]),new cljs.core.Keyword(null,"center","center",-748944368),(Processing.prototype.PConstants["CENTER"]),new cljs.core.Keyword(null,"baseline","baseline",1151033280),(Processing.prototype.PConstants["BASELINE"])], null);
+
+quil.core.text_modes = new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"model","model",331153215),(Processing.prototype.PConstants["MODEL"]),new cljs.core.Keyword(null,"shape","shape",1190694006),(Processing.prototype.PConstants["SHAPE"])], null);
+
+quil.core.texture_modes = new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"image","image",-58725096),(Processing.prototype.PConstants["IMAGE"]),new cljs.core.Keyword(null,"normal","normal",-1519123858),(Processing.prototype.PConstants["NORMAL"])], null);
+
+quil.core.texture_wrap_modes = new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"clamp","clamp",1803814940),(Processing.prototype.PConstants["CLAMP"]),new cljs.core.Keyword(null,"repeat","repeat",832692087),(Processing.prototype.PConstants["REPEAT"])], null);
+
+quil.core.filter_modes = new cljs.core.PersistentArrayMap(null, 8, [new cljs.core.Keyword(null,"threshold","threshold",204221583),(Processing.prototype.PConstants["THRESHOLD"]),new cljs.core.Keyword(null,"gray","gray",1013268388),(Processing.prototype.PConstants["GRAY"]),new cljs.core.Keyword(null,"invert","invert",1553577503),(Processing.prototype.PConstants["INVERT"]),new cljs.core.Keyword(null,"posterize","posterize",-148251901),(Processing.prototype.PConstants["POSTERIZE"]),new cljs.core.Keyword(null,"blur","blur",-453500461),(Processing.prototype.PConstants["BLUR"]),new cljs.core.Keyword(null,"opaque","opaque",-1243552654),(Processing.prototype.PConstants["OPAQUE"]),new cljs.core.Keyword(null,"erode","erode",1539530618),(Processing.prototype.PConstants["ERODE"]),new cljs.core.Keyword(null,"dilate","dilate",1504745153),(Processing.prototype.PConstants["DILATE"])], null);
+
+quil.core.cursor_modes = new cljs.core.PersistentArrayMap(null, 6, [new cljs.core.Keyword(null,"arrow","arrow",1071351425),(Processing.prototype.PConstants["ARROW"]),new cljs.core.Keyword(null,"cross","cross",194557789),(Processing.prototype.PConstants["CROSS"]),new cljs.core.Keyword(null,"hand","hand",791601933),(Processing.prototype.PConstants["HAND"]),new cljs.core.Keyword(null,"move","move",-2110884309),(Processing.prototype.PConstants["MOVE"]),new cljs.core.Keyword(null,"text","text",-1790561697),(Processing.prototype.PConstants["TEXT"]),new cljs.core.Keyword(null,"wait","wait",-260664777),(Processing.prototype.PConstants["WAIT"])], null);
+quil.core.PI = Math.PI;
+quil.core.HALF_PI = (quil.core.PI / 2.0);
+quil.core.THIRD_PI = (quil.core.PI / 3.0);
+quil.core.QUARTER_PI = (quil.core.PI / 4.0);
+quil.core.TWO_PI = (quil.core.PI * 2.0);
+quil.core.DEG_TO_RAD = (quil.core.PI / 180.0);
+quil.core.RAD_TO_DEG = (180.0 / quil.core.PI);
+quil.core.KEY_CODES = cljs.core.PersistentHashMap.fromArrays([(121),(39),(157),(119),(116),(113),(40),(117),(118),(122),(17),(115),(112),(123),(16),(120),(38),(18),(114),(37)],[new cljs.core.Keyword(null,"f10","f10",627525541),new cljs.core.Keyword(null,"right","right",-452581833),new cljs.core.Keyword(null,"command","command",-894540724),new cljs.core.Keyword(null,"f8","f8",-2141475484),new cljs.core.Keyword(null,"f5","f5",1587057387),new cljs.core.Keyword(null,"f2","f2",396168596),new cljs.core.Keyword(null,"down","down",1565245570),new cljs.core.Keyword(null,"f6","f6",2103080604),new cljs.core.Keyword(null,"f7","f7",356150168),new cljs.core.Keyword(null,"f11","f11",-1417398799),new cljs.core.Keyword(null,"control","control",1892578036),new cljs.core.Keyword(null,"f4","f4",990968764),new cljs.core.Keyword(null,"f1","f1",1714532389),new cljs.core.Keyword(null,"f12","f12",853352790),new cljs.core.Keyword(null,"shift","shift",997140064),new cljs.core.Keyword(null,"f9","f9",704633338),new cljs.core.Keyword(null,"up","up",-269712113),new cljs.core.Keyword(null,"alt","alt",-3214426),new cljs.core.Keyword(null,"f3","f3",1954829043),new cljs.core.Keyword(null,"left","left",-399115937)]);
+/**
+ * Writes to the text area of the Processing environment's console.
+ * This is often helpful for looking at the data a program is producing.
+ * Each call to this function creates a new line of output.
+ * Individual elements can be separated with quotes ("") and joined with the string concatenation operator (+).
+ * Also writes the content of an array to the text area of the Processing environment.
+ * This is often helpful for looking at the data a program is producing.
+ * A new line is put between each element of the array. This function can only print 1D arrays,
+ * but can test to see if the content are null or not null for 2+ dimensional arrays.
+ */
+quil.core.prc_println = (function quil$core$prc_println(msg){
+return quil.sketch.current_applet.call(null).println(msg);
+});
+/**
+ * Writes to the console area of the Processing environment.
+ * This is often helpful for looking at the data a program is producing.
+ * The companion function println() works like print(), but creates a new line of text for each call to the function.
+ * Individual elements can be separated with quotes ("") and joined with the addition operator (+).
+ */
+quil.core.prc_print = (function quil$core$prc_print(msg){
+return quil.sketch.current_applet.call(null).print(msg);
+});
+/**
+ * Returns sketch object by id of canvas element of sketch.
+ */
+quil.core.get_sketch_by_id = (function quil$core$get_sketch_by_id(id){
+return Processing.getInstanceById(id);
+});
+var ret__4684__auto___1286 = (function (){
+quil.core.with_sketch = (function quil$core$with_sketch(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1287 = arguments.length;
+var i__4642__auto___1288 = (0);
+while(true){
+if((i__4642__auto___1288 < len__4641__auto___1287)){
+args__4647__auto__.push((arguments[i__4642__auto___1288]));
+
+var G__1289 = (i__4642__auto___1288 + (1));
+i__4642__auto___1288 = G__1289;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((3) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((3)),(0),null)):null);
+return quil.core.with_sketch.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__4648__auto__);
+});
+
+quil.core.with_sketch.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,applet,body){
+if(quil.util.clj_compilation_QMARK_.call(null)){
+return null;
+} else {
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.sketch","with-sketch","quil.sketch/with-sketch",-634067708,null),null,(1),null)),(new cljs.core.List(null,applet,null,(1),null)),body)));
+}
+});
+
+quil.core.with_sketch.cljs$lang$maxFixedArity = (3);
+
+/** @this {Function} */
+quil.core.with_sketch.cljs$lang$applyTo = (function (seq1282){
+var G__1283 = cljs.core.first.call(null,seq1282);
+var seq1282__$1 = cljs.core.next.call(null,seq1282);
+var G__1284 = cljs.core.first.call(null,seq1282__$1);
+var seq1282__$2 = cljs.core.next.call(null,seq1282__$1);
+var G__1285 = cljs.core.first.call(null,seq1282__$2);
+var seq1282__$3 = cljs.core.next.call(null,seq1282__$2);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__1283,G__1284,G__1285,seq1282__$3);
+});
+
+return null;
+})()
+;
+quil.core.with_sketch.cljs$lang$macro = true;
+
+/**
+ * Retrieve sketch-specific state-atom. All changes to the
+ * atom will be reflected in the state.
+ *
+ * (set-state! :foo 1)
+ * (state :foo) ;=> 1
+ * (swap! (state-atom) update-in [:foo] inc)
+ * (state :foo) ;=> 2
+ */
+quil.core.state_atom = (function quil$core$state_atom(){
+return quil.sketch.current_applet.call(null).quil;
+});
+/**
+ * Retrieve sketch-specific state by key. Must initially call
+ * set-state! to store state. If no parameter passed whole
+ * state map is returned.
+ *
+ * (set-state! :foo 1)
+ * (state :foo) ;=> 1
+ * (state) ;=> {:foo 1}
+ */
+quil.core.state = (function quil$core$state(var_args){
+var G__1291 = arguments.length;
+switch (G__1291) {
+case 0:
+return quil.core.state.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.state.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.state.cljs$core$IFn$_invoke$arity$0 = (function (){
+return cljs.core.deref.call(null,quil.core.state_atom.call(null));
+});
+
+quil.core.state.cljs$core$IFn$_invoke$arity$1 = (function (key){
+var state = quil.core.state.call(null);
+if(cljs.core.contains_QMARK_.call(null,state,key)){
+} else {
+throw Error(["Unable to find state with key: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(key)].join(''));
+}
+
+return cljs.core.get.call(null,state,key);
+});
+
+quil.core.state.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Set sketch-specific state. May only be called once (ideally in the
+ * setup fn). Subsequent calls have no effect.
+ *
+ * Example:
+ * (set-state! :foo 1 :bar (atom true) :baz (/ (width) 2))
+ */
+quil.core.set_state_BANG_ = (function quil$core$set_state_BANG_(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1294 = arguments.length;
+var i__4642__auto___1295 = (0);
+while(true){
+if((i__4642__auto___1295 < len__4641__auto___1294)){
+args__4647__auto__.push((arguments[i__4642__auto___1295]));
+
+var G__1296 = (i__4642__auto___1295 + (1));
+i__4642__auto___1295 = G__1296;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((0) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((0)),(0),null)):null);
+return quil.core.set_state_BANG_.cljs$core$IFn$_invoke$arity$variadic(argseq__4648__auto__);
+});
+
+quil.core.set_state_BANG_.cljs$core$IFn$_invoke$arity$variadic = (function (state_vals){
+var state_STAR_ = quil.core.state_atom.call(null);
+if(cljs.core.truth_(cljs.core.deref.call(null,state_STAR_))){
+return null;
+} else {
+var state_map = cljs.core.apply.call(null,cljs.core.hash_map,state_vals);
+return cljs.core.reset_BANG_.call(null,state_STAR_,state_map);
+}
+});
+
+quil.core.set_state_BANG_.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+quil.core.set_state_BANG_.cljs$lang$applyTo = (function (seq1293){
+var self__4629__auto__ = this;
+return self__4629__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq1293));
+});
+
+/**
+ * Calculates the absolute value (magnitude) of a number. The
+ * absolute value of a number is always positive. Dynamically casts to
+ * an int or float appropriately
+ */
+quil.core.abs = (function quil$core$abs(n){
+return quil.sketch.current_applet.call(null).abs(n);
+});
+/**
+ * The inverse of cos, returns the arc cosine of a value. This
+ * function expects the values in the range of -1 to 1 and values are
+ * returned in the range 0 to Math/PI (3.1415927).
+ */
+quil.core.acos = (function quil$core$acos(n){
+return quil.sketch.current_applet.call(null).acos(n);
+});
+/**
+ * Extracts the alpha value from a color.
+ */
+quil.core.alpha = (function quil$core$alpha(color){
+return quil.core.current_graphics.call(null).alpha(cljs.core.unchecked_int.call(null,color));
+});
+/**
+ * Sets the ambient reflectance for shapes drawn to the screen. This
+ * is combined with the ambient light component of environment. The
+ * color components set through the parameters define the
+ * reflectance. For example in the default color mode, setting x=255,
+ * y=126, z=0, would cause all the red light to reflect and half of the
+ * green light to reflect. Used in combination with emissive, specular,
+ * and shininess in setting the material properties of shapes.
+ */
+quil.core.ambient_float = (function quil$core$ambient_float(var_args){
+var G__1298 = arguments.length;
+switch (G__1298) {
+case 1:
+return quil.core.ambient_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.ambient_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.ambient_float.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).ambient(gray);
+});
+
+quil.core.ambient_float.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).ambient(x,y,z);
+});
+
+quil.core.ambient_float.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Sets the ambient reflectance for shapes drawn to the screen. This
+ * is combined with the ambient light component of environment. The rgb
+ * color components set define the reflectance. Used in combination
+ * with emissive, specular, and shininess in setting the material
+ * properties of shapes.
+ */
+quil.core.ambient_int = (function quil$core$ambient_int(rgb){
+return quil.core.current_graphics.call(null).ambient((rgb | (0)));
+});
+/**
+ * Sets the ambient reflectance for shapes drawn to the screen. This
+ * is combined with the ambient light component of environment. The
+ * color components set through the parameters define the
+ * reflectance. For example in the default color mode, setting x=255,
+ * y=126, z=0, would cause all the red light to reflect and half of the
+ * green light to reflect. Used in combination with emissive, specular,
+ * and shininess in setting the material properties of shapes.
+ */
+quil.core.ambient = (function quil$core$ambient(var_args){
+var G__1301 = arguments.length;
+switch (G__1301) {
+case 1:
+return quil.core.ambient.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.ambient.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.ambient.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.ambient_float.call(null,rgb);
+});
+
+quil.core.ambient.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.ambient_float.call(null,x,y,z);
+});
+
+quil.core.ambient.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Adds an ambient light. Ambient light doesn't come from a specific direction,
+ * the rays have light have bounced around so much that objects are
+ * evenly lit from all sides. Ambient lights are almost always used in
+ * combination with other types of lights. Lights need to be included
+ * in the draw to remain persistent in a looping program. Placing them
+ * in the setup of a looping program will cause them to only have an
+ * effect the first time through the loop. The effect of the
+ * parameters is determined by the current color mode.
+ */
+quil.core.ambient_light = (function quil$core$ambient_light(var_args){
+var G__1304 = arguments.length;
+switch (G__1304) {
+case 3:
+return quil.core.ambient_light.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 6:
+return quil.core.ambient_light.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.ambient_light.cljs$core$IFn$_invoke$arity$3 = (function (red,green,blue){
+return quil.core.current_graphics.call(null).ambientLight(red,green,blue);
+});
+
+quil.core.ambient_light.cljs$core$IFn$_invoke$arity$6 = (function (red,green,blue,x,y,z){
+return quil.core.current_graphics.call(null).ambientLight(red,green,blue,x,y,z);
+});
+
+quil.core.ambient_light.cljs$lang$maxFixedArity = 6;
+
+/**
+ * Multiplies the current matrix by the one specified through the
+ * parameters. This is very slow because it will try to calculate the
+ * inverse of the transform, so avoid it whenever possible. The
+ * equivalent function in OpenGL is glMultMatrix().
+ */
+quil.core.apply_matrix = (function quil$core$apply_matrix(n00,n01,n02,n03,n10,n11,n12,n13,n20,n21,n22,n23,n30,n31,n32,n33){
+return quil.core.current_graphics.call(null).applyMatrix(n00,n01,n02,n03,n10,n11,n12,n13,n20,n21,n22,n23,n30,n31,n32,n33);
+});
+/**
+ * Draws an arc in the display window. Arcs are drawn along the outer
+ * edge of an ellipse defined by the x, y, width and height
+ * parameters. The origin or the arc's ellipse may be changed with the
+ * ellipse-mode function. The start and stop parameters specify the
+ * angles at which to draw the arc. The mode is either :open, :chord or :pie.
+ */
+quil.core.arc = (function quil$core$arc(x,y,width,height,start,stop){
+return quil.core.current_graphics.call(null).arc(x,y,width,height,start,stop);
+});
+/**
+ * The inverse of sin, returns the arc sine of a value. This function
+ * expects the values in the range of -1 to 1 and values are returned
+ * in the range -PI/2 to PI/2.
+ */
+quil.core.asin = (function quil$core$asin(n){
+return quil.sketch.current_applet.call(null).asin(n);
+});
+/**
+ * The inverse of tan, returns the arc tangent of a value. This
+ * function expects the values in the range of -Infinity to
+ * Infinity (exclusive) and values are returned in the range -PI/2 to
+ * PI/2 .
+ */
+quil.core.atan = (function quil$core$atan(n){
+return quil.sketch.current_applet.call(null).atan(n);
+});
+/**
+ * Calculates the angle (in radians) from a specified point to the
+ * coordinate origin as measured from the positive x-axis. Values are
+ * returned as a float in the range from PI to -PI. The atan2 function
+ * is most often used for orienting geometry to the position of the
+ * cursor. Note: The y-coordinate of the point is the first parameter
+ * and the x-coordinate is the second due to the structure of
+ * calculating the tangent.
+ */
+quil.core.atan2 = (function quil$core$atan2(y,x){
+return quil.sketch.current_applet.call(null).atan2(y,x);
+});
+/**
+ * A sequence of strings representing the fonts on this system
+ * available for use.
+ *
+ * Because of limitations in Java, not all fonts can be used and some
+ * might work with one operating system and not others. When sharing a
+ * sketch with other people or posting it on the web, you may need to
+ * include a .ttf or .otf version of your font in the data directory of
+ * the sketch because other people might not have the font installed on
+ * their computer. Only fonts that can legally be distributed should be
+ * included with a sketch.
+ */
+quil.core.available_fonts = (function quil$core$available_fonts(){
+return cljs.core.seq.call(null,PFont.list());
+});
+/**
+ * Sets the color used for the background of the Processing
+ * window. The default background is light gray. In the draw function,
+ * the background color is used to clear the display window at the
+ * beginning of each frame.
+ *
+ * It is not possible to use transparency (alpha) in background colors
+ * with the main drawing surface, however they will work properly with
+ * create-graphics. Converts args to floats.
+ */
+quil.core.background_float = (function quil$core$background_float(var_args){
+var G__1307 = arguments.length;
+switch (G__1307) {
+case 1:
+return quil.core.background_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.background_float.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.background_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.background_float.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.background_float.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).background(gray);
+});
+
+quil.core.background_float.cljs$core$IFn$_invoke$arity$2 = (function (gray,alpha){
+return quil.core.current_graphics.call(null).background(gray,alpha);
+});
+
+quil.core.background_float.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.current_graphics.call(null).background(r,g,b);
+});
+
+quil.core.background_float.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.current_graphics.call(null).background(r,g,b,a);
+});
+
+quil.core.background_float.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Sets the color used for the background of the Processing
+ * window. The default background is light gray. In the draw function,
+ * the background color is used to clear the display window at the
+ * beginning of each frame.
+ *
+ * It is not possible to use transparency (alpha) in background colors
+ * with the main drawing surface, however they will work properly with
+ * create-graphics. Converts rgb to an int and alpha to a float.
+ */
+quil.core.background_int = (function quil$core$background_int(var_args){
+var G__1310 = arguments.length;
+switch (G__1310) {
+case 1:
+return quil.core.background_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.background_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.background_int.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.current_graphics.call(null).background(cljs.core.unchecked_int.call(null,rgb));
+});
+
+quil.core.background_int.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.current_graphics.call(null).background(cljs.core.unchecked_int.call(null,rgb),alpha);
+});
+
+quil.core.background_int.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the color used for the background of the Processing
+ * window. The default background is light gray. In the draw function,
+ * the background color is used to clear the display window at the
+ * beginning of each frame.
+ *
+ * It is not possible to use transparency (alpha) in background colors
+ * with the main drawing surface, however they will work properly with
+ * create-graphics. Converts args to floats.
+ */
+quil.core.background = (function quil$core$background(var_args){
+var G__1313 = arguments.length;
+switch (G__1313) {
+case 1:
+return quil.core.background.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.background.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.background.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.background.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.background.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.current_graphics.call(null).background(rgb);
+});
+
+quil.core.background.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.current_graphics.call(null).background(rgb,alpha);
+});
+
+quil.core.background.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.background_float.call(null,r,g,b);
+});
+
+quil.core.background.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.background_float.call(null,r,g,b,a);
+});
+
+quil.core.background.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Specify an image to be used as the background for a sketch. Its
+ * width and height must be the same size as the sketch window. Images
+ * used as background will ignore the current tint setting.
+ */
+quil.core.background_image = (function quil$core$background_image(img){
+return quil.core.current_graphics.call(null).background(img);
+});
+/**
+ * Sets the matrix mode to the camera matrix so calls such as
+ * translate, rotate, apply-matrix and reset-matrix affect the
+ * camera. begin-camera should always be used with a following
+ * end-camera and pairs of begin-camera and end-camera cannot be
+ * nested.
+ *
+ * For most situations the camera function will be sufficient.
+ */
+quil.core.begin_camera = (function quil$core$begin_camera(){
+return quil.core.current_graphics.call(null).beginCamera();
+});
+/**
+ * Use the begin-contour and end-contour function to create negative
+ * shapes within shapes. These functions can only be within a
+ * begin-shape/end-shape pair and they only work with the :p2d and :p3d
+ * renderers.
+ */
+quil.core.begin_contour = (function quil$core$begin_contour(){
+return quil.core.current_graphics.call(null).beginContour();
+});
+/**
+ * Enables the creation of complex forms. begin-shape begins recording
+ * vertices for a shape and end-shape stops recording. Use the mode
+ * keyword to specify which shape create from the provided
+ * vertices. With no mode specified, the shape can be any irregular
+ * polygon.
+ *
+ * The available mode keywords are :points, :lines, :triangles,
+ * :triangle-fan, :triangle-strip,
+ * :quads, :quad-strip.
+ *
+ * After calling the begin-shape function, a series of vertex commands
+ * must follow. To stop drawing the shape, call end-shape. The vertex
+ * function with two parameters specifies a position in 2D and the
+ * vertex function with three parameters specifies a position in
+ * 3D. Each shape will be outlined with the current stroke color and
+ * filled with the fill color.
+ *
+ * Transformations such as translate, rotate, and scale do not work
+ * within begin-shape. It is also not possible to use other shapes,
+ * such as ellipse or rect within begin-shape.
+ */
+quil.core.begin_shape = (function quil$core$begin_shape(var_args){
+var G__1316 = arguments.length;
+switch (G__1316) {
+case 0:
+return quil.core.begin_shape.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.begin_shape.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.begin_shape.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).beginShape();
+});
+
+quil.core.begin_shape.cljs$core$IFn$_invoke$arity$1 = (function (mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.shape_modes);
+return quil.core.current_graphics.call(null).beginShape((mode__$1 | (0)));
+});
+
+quil.core.begin_shape.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Draws a Bezier curve on the screen. These curves are defined by a
+ * series of anchor and control points. The first two parameters
+ * specify the first anchor point and the last two parameters specify
+ * the other anchor point. The middle parameters specify the control
+ * points which define the shape of the curve.
+ */
+quil.core.bezier = (function quil$core$bezier(var_args){
+var G__1319 = arguments.length;
+switch (G__1319) {
+case 8:
+return quil.core.bezier.cljs$core$IFn$_invoke$arity$8((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]));
+
+break;
+case 12:
+return quil.core.bezier.cljs$core$IFn$_invoke$arity$12((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.bezier.cljs$core$IFn$_invoke$arity$8 = (function (x1,y1,cx1,cy1,cx2,cy2,x2,y2){
+return quil.core.current_graphics.call(null).bezier(x1,y1,cx1,cy1,cx2,cy2,x2,y2);
+});
+
+quil.core.bezier.cljs$core$IFn$_invoke$arity$12 = (function (x1,y1,z1,cx1,cy1,cz1,cx2,cy2,cz2,x2,y2,z2){
+return quil.core.current_graphics.call(null).bezier(x1,y1,z1,cx1,cy1,cz1,cx2,cy2,cz2,x2,y2,z2);
+});
+
+quil.core.bezier.cljs$lang$maxFixedArity = 12;
+
+/**
+ * Sets the resolution at which Beziers display. The default value is
+ * 20. This function is only useful when using the :p3d or :opengl
+ * renderer as the default (:java2d) renderer does not use this
+ * information.
+ */
+quil.core.bezier_detail = (function quil$core$bezier_detail(detail){
+return quil.core.current_graphics.call(null).bezierDetail((detail | (0)));
+});
+/**
+ * Evaluates the Bezier at point t for points a, b, c, d. The
+ * parameter t varies between 0 and 1, a and d are points on the curve,
+ * and b and c are the control points. This can be done once with the x
+ * coordinates and a second time with the y coordinates to get the
+ * location of a bezier curve at t.
+ */
+quil.core.bezier_point = (function quil$core$bezier_point(a,b,c,d,t){
+return quil.core.current_graphics.call(null).bezierPoint(a,b,c,d,t);
+});
+/**
+ * Calculates the tangent of a point on a Bezier curve.
+ * (See http://en.wikipedia.org/wiki/Tangent)
+ */
+quil.core.bezier_tangent = (function quil$core$bezier_tangent(a,b,c,d,t){
+return quil.core.current_graphics.call(null).bezierTangent(a,b,c,d,t);
+});
+/**
+ * Specifies vertex coordinates for Bezier curves. Each call to
+ * bezier-vertex defines the position of two control points and one
+ * anchor point of a Bezier curve, adding a new segment to a line or
+ * shape. The first time bezier-vertex is used within a begin-shape
+ * call, it must be prefaced with a call to vertex to set the first
+ * anchor point. This function must be used between begin-shape and
+ * end-shape and only when there is no parameter specified to
+ * begin-shape.
+ */
+quil.core.bezier_vertex = (function quil$core$bezier_vertex(var_args){
+var G__1322 = arguments.length;
+switch (G__1322) {
+case 6:
+return quil.core.bezier_vertex.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+case 9:
+return quil.core.bezier_vertex.cljs$core$IFn$_invoke$arity$9((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.bezier_vertex.cljs$core$IFn$_invoke$arity$6 = (function (cx1,cy1,cx2,cy2,x,y){
+return quil.core.current_graphics.call(null).bezierVertex(cx1,cy1,cx2,cy2,x,y);
+});
+
+quil.core.bezier_vertex.cljs$core$IFn$_invoke$arity$9 = (function (cx1,cy1,cz1,cx2,cy2,cz2,x,y,z){
+return quil.core.current_graphics.call(null).bezierVertex(cx1,cy1,cz1,cx2,cy2,cz2,x,y,z);
+});
+
+quil.core.bezier_vertex.cljs$lang$maxFixedArity = 9;
+
+/**
+ * Returns a string representing the binary value of an int, char or
+ * byte. When converting an int to a string, it is possible to specify
+ * the number of digits used.
+ */
+quil.core.binary = (function quil$core$binary(var_args){
+var G__1325 = arguments.length;
+switch (G__1325) {
+case 1:
+return quil.core.binary.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.binary.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.binary.cljs$core$IFn$_invoke$arity$1 = (function (val){
+return quil.sketch.current_applet.call(null).binary(val);
+});
+
+quil.core.binary.cljs$core$IFn$_invoke$arity$2 = (function (val,num_digits){
+return quil.sketch.current_applet.call(null).binary(val,num_digits);
+});
+
+quil.core.binary.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Blends a region of pixels from one image into another with full alpha
+ * channel support. If src is not specified it defaults to current-graphics.
+ * If dest is not specified it defaults to current-graphics.
+ *
+ * Note: blend-mode function is recommended to use instead of this one.
+ *
+ * Available blend modes are:
+ *
+ * :blend - linear interpolation of colours: C = A*factor + B
+ * :add - additive blending with white clip:
+ * C = min(A*factor + B, 255)
+ * :subtract - subtractive blending with black clip:
+ * C = max(B - A*factor, 0)
+ * :darkest - only the darkest colour succeeds:
+ * C = min(A*factor, B)
+ * :lightest - only the lightest colour succeeds:
+ * C = max(A*factor, B)
+ * :difference - subtract colors from underlying image.
+ * :exclusion - similar to :difference, but less extreme.
+ * :multiply - Multiply the colors, result will always be darker.
+ * :screen - Opposite multiply, uses inverse values of the colors.
+ * :overlay - A mix of :multiply and :screen. Multiplies dark values
+ * and screens light values.
+ * :hard-light - :screen when greater than 50% gray, :multiply when
+ * lower.
+ * :soft-light - Mix of :darkest and :lightest. Works like :overlay,
+ * but not as harsh.
+ * :dodge - Lightens light tones and increases contrast, ignores
+ * darks.
+ * Called "Color Dodge" in Illustrator and Photoshop.
+ * :burn - Darker areas are applied, increasing contrast, ignores
+ * lights. Called "Color Burn" in Illustrator and
+ * Photoshop.
+ */
+quil.core.blend = (function quil$core$blend(var_args){
+var G__1328 = arguments.length;
+switch (G__1328) {
+case 9:
+return quil.core.blend.cljs$core$IFn$_invoke$arity$9((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]));
+
+break;
+case 10:
+return quil.core.blend.cljs$core$IFn$_invoke$arity$10((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]));
+
+break;
+case 11:
+return quil.core.blend.cljs$core$IFn$_invoke$arity$11((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.blend.cljs$core$IFn$_invoke$arity$9 = (function (x,y,width,height,dx,dy,dwidth,dheight,mode){
+return quil.core.blend.call(null,quil.core.current_graphics.call(null),quil.core.current_graphics.call(null),x,y,width,height,dx,dy,dwidth,dheight,mode);
+});
+
+quil.core.blend.cljs$core$IFn$_invoke$arity$10 = (function (src_img,x,y,width,height,dx,dy,dwidth,dheight,mode){
+return quil.core.blend.call(null,src_img,quil.core.current_graphics.call(null),x,y,width,height,dx,dy,dwidth,dheight,mode);
+});
+
+quil.core.blend.cljs$core$IFn$_invoke$arity$11 = (function (src_img,dest_img,x,y,width,height,dx,dy,dwidth,dheight,mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.blend_modes);
+return dest_img.blend(src_img,(x | (0)),(y | (0)),(width | (0)),(height | (0)),(dx | (0)),(dy | (0)),(dwidth | (0)),(dheight | (0)),(mode__$1 | (0)));
+});
+
+quil.core.blend.cljs$lang$maxFixedArity = 11;
+
+/**
+ * Blends two color values together based on the blending mode given specified
+ * with the mode keyword.
+ *
+ * Available blend modes are:
+ *
+ * :blend - linear interpolation of colours: C = A*factor + B
+ * :add - additive blending with white clip:
+ * C = min(A*factor + B, 255)
+ * :subtract - subtractive blending with black clip:
+ * C = max(B - A*factor, 0)
+ * :darkest - only the darkest colour succeeds:
+ * C = min(A*factor, B)
+ * :lightest - only the lightest colour succeeds:
+ * C = max(A*factor, B)
+ * :difference - subtract colors from underlying image.
+ * :exclusion - similar to :difference, but less extreme.
+ * :multiply - Multiply the colors, result will always be darker.
+ * :screen - Opposite multiply, uses inverse values of the colors.
+ * :overlay - A mix of :multiply and :screen. Multiplies dark values
+ * and screens light values.
+ * :hard-light - :screen when greater than 50% gray, :multiply when
+ * lower.
+ * :soft-light - Mix of :darkest and :lightest. Works like :overlay,
+ * but not as harsh.
+ * :dodge - Lightens light tones and increases contrast, ignores
+ * darks.
+ * Called "Color Dodge" in Illustrator and Photoshop.
+ * :burn - Darker areas are applied, increasing contrast, ignores
+ * lights. Called "Color Burn" in Illustrator and
+ * Photoshop.
+ */
+quil.core.blend_color = (function quil$core$blend_color(c1,c2,mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.blend_modes);
+return quil.core.current_graphics.call(null).blendColor(c1,c2,mode__$1);
+});
+/**
+ * Extracts the blue value from a color, scaled to match current color-mode.
+ * Returns a float.
+ */
+quil.core.blue = (function quil$core$blue(color){
+return quil.core.current_graphics.call(null).blue(cljs.core.unchecked_int.call(null,color));
+});
+/**
+ * Creates an extruded rectangle.
+ */
+quil.core.box = (function quil$core$box(var_args){
+var G__1331 = arguments.length;
+switch (G__1331) {
+case 1:
+return quil.core.box.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.box.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.box.cljs$core$IFn$_invoke$arity$1 = (function (size){
+return quil.core.current_graphics.call(null).box(size);
+});
+
+quil.core.box.cljs$core$IFn$_invoke$arity$3 = (function (width,height,depth){
+return quil.core.current_graphics.call(null).box(width,height,depth);
+});
+
+quil.core.box.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Extracts the brightness value from a color. Returns a float.
+ */
+quil.core.brightness = (function quil$core$brightness(color){
+return quil.core.current_graphics.call(null).brightness(cljs.core.unchecked_int.call(null,color));
+});
+/**
+ * Sets the position of the camera through setting the eye position,
+ * the center of the scene, and which axis is facing upward. Moving the
+ * eye position and the direction it is pointing (the center of the
+ * scene) allows the images to be seen from different angles. The
+ * version without any parameters sets the camera to the default
+ * position, pointing to the center of the display window with the Y
+ * axis as up. The default values are:
+ *
+ * eyeX: (/ (width) 2.0)
+ * eyeY: (/ (height) 2.0)
+ * eyeZ: (/ (/ (height) 2.0) (tan (/ (* Math/PI 60.0) 360.0)))
+ * centerX: (/ (width) 2.0)
+ * centerY: (/ (height) 2.0)
+ * centerZ: 0
+ * upX: 0
+ * upY: 1
+ * upZ: 0
+ *
+ * Similar imilar to gluLookAt() in OpenGL, but it first clears the
+ * current camera settings.
+ */
+quil.core.camera = (function quil$core$camera(var_args){
+var G__1334 = arguments.length;
+switch (G__1334) {
+case 0:
+return quil.core.camera.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 9:
+return quil.core.camera.cljs$core$IFn$_invoke$arity$9((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.camera.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).camera();
+});
+
+quil.core.camera.cljs$core$IFn$_invoke$arity$9 = (function (eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ){
+return quil.core.current_graphics.call(null).camera(eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ);
+});
+
+quil.core.camera.cljs$lang$maxFixedArity = 9;
+
+/**
+ * Calculates the closest int value that is greater than or equal to
+ * the value of the parameter. For example, (ceil 9.03) returns the
+ * value 10.
+ */
+quil.core.ceil = (function quil$core$ceil(n){
+return quil.sketch.current_applet.call(null).ceil(n);
+});
+/**
+ * Creates an integer representation of a color The parameters are
+ * interpreted as RGB or HSB values depending on the current
+ * color-mode. The default mode is RGB values from 0 to 255 and
+ * therefore, the function call (color 255 204 0) will return a bright
+ * yellow. Args are cast to floats.
+ *
+ * r - red or hue value
+ * g - green or saturation value
+ * b - blue or brightness value
+ * a - alpha value
+ */
+quil.core.color = (function quil$core$color(var_args){
+var G__1337 = arguments.length;
+switch (G__1337) {
+case 1:
+return quil.core.color.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.color.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.color.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.color.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.color.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).color(gray);
+});
+
+quil.core.color.cljs$core$IFn$_invoke$arity$2 = (function (gray,alpha){
+return quil.core.current_graphics.call(null).color(gray,alpha);
+});
+
+quil.core.color.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.current_graphics.call(null).color(r,g,b);
+});
+
+quil.core.color.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.current_graphics.call(null).color(r,g,b,a);
+});
+
+quil.core.color.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Changes the way Processing interprets color data. Available modes
+ * are :rgb and :hsb.By default, the parameters for fill, stroke,
+ * background, and color are defined by values between 0 and 255 using
+ * the :rgb color model. The color-mode fn is used to change the
+ * numerical range used for specifying colors and to switch color
+ * systems. For example, calling
+ * (color-mode :rgb 1.0) will specify that values are specified between
+ * 0 and 1. The limits for defining colors are altered by setting the
+ * parameters range1, range2, range3, and range 4.
+ */
+quil.core.color_mode = (function quil$core$color_mode(var_args){
+var G__1340 = arguments.length;
+switch (G__1340) {
+case 1:
+return quil.core.color_mode.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.color_mode.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 4:
+return quil.core.color_mode.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return quil.core.color_mode.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.color_mode.cljs$core$IFn$_invoke$arity$1 = (function (mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.color_modes);
+return quil.core.current_graphics.call(null).colorMode((mode__$1 | (0)));
+});
+
+quil.core.color_mode.cljs$core$IFn$_invoke$arity$2 = (function (mode,max){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.color_modes);
+return quil.core.current_graphics.call(null).colorMode((mode__$1 | (0)),max);
+});
+
+quil.core.color_mode.cljs$core$IFn$_invoke$arity$4 = (function (mode,max_x,max_y,max_z){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.color_modes);
+return quil.core.current_graphics.call(null).colorMode((mode__$1 | (0)),max_x,max_y,max_z);
+});
+
+quil.core.color_mode.cljs$core$IFn$_invoke$arity$5 = (function (mode,max_x,max_y,max_z,max_a){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.color_modes);
+return quil.core.current_graphics.call(null).colorMode((mode__$1 | (0)),max_x,max_y,max_z,max_a);
+});
+
+quil.core.color_mode.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Constrains a value to not exceed a maximum and minimum value.
+ */
+quil.core.constrain = (function quil$core$constrain(amt,low,high){
+return quil.sketch.current_applet.call(null).constrain(amt,low,high);
+});
+/**
+ * Copies a region of pixels from the one image to another. If src-img
+ * is not specified it defaults to current-graphics. If dest-img is not
+ * specified - it defaults to current-graphics. If the source
+ * and destination regions aren't the same size, it will automatically
+ * resize the source pixels to fit the specified target region. No
+ * alpha information is used in the process, however if the source
+ * image has an alpha channel set, it will be copied as well.
+ */
+quil.core.copy = (function quil$core$copy(var_args){
+var G__1343 = arguments.length;
+switch (G__1343) {
+case 2:
+return quil.core.copy.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.copy.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.copy.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.copy.cljs$core$IFn$_invoke$arity$2 = (function (p__1344,p__1345){
+var vec__1346 = p__1344;
+var sx = cljs.core.nth.call(null,vec__1346,(0),null);
+var sy = cljs.core.nth.call(null,vec__1346,(1),null);
+var swidth = cljs.core.nth.call(null,vec__1346,(2),null);
+var sheight = cljs.core.nth.call(null,vec__1346,(3),null);
+var vec__1349 = p__1345;
+var dx = cljs.core.nth.call(null,vec__1349,(0),null);
+var dy = cljs.core.nth.call(null,vec__1349,(1),null);
+var dwidth = cljs.core.nth.call(null,vec__1349,(2),null);
+var dheight = cljs.core.nth.call(null,vec__1349,(3),null);
+return quil.core.current_graphics.call(null).copy((sx | (0)),(sy | (0)),(swidth | (0)),(sheight | (0)),(dx | (0)),(dy | (0)),(dwidth | (0)),(dheight | (0)));
+});
+
+quil.core.copy.cljs$core$IFn$_invoke$arity$3 = (function (src_img,p__1352,p__1353){
+var vec__1354 = p__1352;
+var sx = cljs.core.nth.call(null,vec__1354,(0),null);
+var sy = cljs.core.nth.call(null,vec__1354,(1),null);
+var swidth = cljs.core.nth.call(null,vec__1354,(2),null);
+var sheight = cljs.core.nth.call(null,vec__1354,(3),null);
+var vec__1357 = p__1353;
+var dx = cljs.core.nth.call(null,vec__1357,(0),null);
+var dy = cljs.core.nth.call(null,vec__1357,(1),null);
+var dwidth = cljs.core.nth.call(null,vec__1357,(2),null);
+var dheight = cljs.core.nth.call(null,vec__1357,(3),null);
+return quil.core.copy.call(null,src_img,quil.core.current_graphics.call(null),new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [sx,sy,swidth,sheight], null),new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [dx,dy,dwidth,dheight], null));
+});
+
+quil.core.copy.cljs$core$IFn$_invoke$arity$4 = (function (src_img,dest_img,p__1360,p__1361){
+var vec__1362 = p__1360;
+var sx = cljs.core.nth.call(null,vec__1362,(0),null);
+var sy = cljs.core.nth.call(null,vec__1362,(1),null);
+var swidth = cljs.core.nth.call(null,vec__1362,(2),null);
+var sheight = cljs.core.nth.call(null,vec__1362,(3),null);
+var vec__1365 = p__1361;
+var dx = cljs.core.nth.call(null,vec__1365,(0),null);
+var dy = cljs.core.nth.call(null,vec__1365,(1),null);
+var dwidth = cljs.core.nth.call(null,vec__1365,(2),null);
+var dheight = cljs.core.nth.call(null,vec__1365,(3),null);
+return dest_img.copy(src_img,(sx | (0)),(sy | (0)),(swidth | (0)),(sheight | (0)),(dx | (0)),(dy | (0)),(dwidth | (0)),(dheight | (0)));
+});
+
+quil.core.copy.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Calculates the cosine of an angle. This function expects the values
+ * of the angle parameter to be provided in radians (values from 0 to
+ * Math/PI*2). Values are returned in the range -1 to 1.
+ */
+quil.core.cos = (function quil$core$cos(angle){
+return quil.sketch.current_applet.call(null).cos(angle);
+});
+/**
+ * Dynamically converts a font to the format used by Processing (a
+ * PFont) from either a font name that's installed on the computer, or
+ * from a .ttf or .otf file inside the sketches 'data' folder. This
+ * function is an advanced feature for precise control.
+ *
+ * Use available-fonts to obtain the names for the fonts recognized by
+ * the computer and are compatible with this function.
+ *
+ * The size parameter states the font size you want to generate. The
+ * smooth parameter specifies if the font should be antialiased or not,
+ * and the charset parameter is an array of chars that specifies the
+ * characters to generate.
+ *
+ * This function creates a bitmapped version of a font It loads a font
+ * by name, and converts it to a series of images based on the size of
+ * the font. When possible, the text function will use a native font
+ * rather than the bitmapped version created behind the scenes with
+ * create-font. For instance, when using the default renderer
+ * setting (JAVA2D), the actual native version of the font will be
+ * employed by the sketch, improving drawing quality and
+ * performance. With the :p2d, :p3d, and :opengl renderer settings, the
+ * bitmapped version will be used. While this can drastically improve
+ * speed and appearance, results are poor when exporting if the sketch
+ * does not include the .otf or .ttf file, and the requested font is
+ * not available on the machine running the sketch.
+ */
+quil.core.create_font = (function quil$core$create_font(var_args){
+var G__1370 = arguments.length;
+switch (G__1370) {
+case 2:
+return quil.core.create_font.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.create_font.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.create_font.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.create_font.cljs$core$IFn$_invoke$arity$2 = (function (name,size){
+return quil.sketch.current_applet.call(null).createFont(cljs.core.str.cljs$core$IFn$_invoke$arity$1(name),size);
+});
+
+quil.core.create_font.cljs$core$IFn$_invoke$arity$3 = (function (name,size,smooth){
+return quil.sketch.current_applet.call(null).createFont(cljs.core.str.cljs$core$IFn$_invoke$arity$1(name),size,smooth);
+});
+
+quil.core.create_font.cljs$core$IFn$_invoke$arity$4 = (function (name,size,smooth,charset){
+return quil.sketch.current_applet.call(null).createFont(cljs.core.str.cljs$core$IFn$_invoke$arity$1(name),size,smooth,charset);
+});
+
+quil.core.create_font.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Creates and returns a new PGraphics object of the types :p2d, :p3d,
+ * :java2d, :pdf. By default :java2d is used. Use this class if you
+ * need to draw into an off-screen graphics buffer. It's not possible
+ * to use create-graphics with the :opengl renderer, because it doesn't
+ * allow offscreen use. The :pdf renderer requires the filename parameter.
+ *
+ * Note: don't use create-graphics in draw in clojurescript, it leaks memory.
+ * You should create graphic in setup and reuse it in draw instead of creating
+ * a new one.
+ *
+ * It's important to call any drawing commands between (.beginDraw graphics) and
+ * (.endDraw graphics) statements or use with-graphics macro. This is also true
+ * for any commands that affect drawing, such as smooth or color-mode.
+ *
+ * If you're using :pdf renderer - don't forget to call (.dispose graphics)
+ * as last command inside with-graphics macro, otherwise graphics won't be
+ * saved.
+ *
+ * Unlike the main drawing surface which is completely opaque, surfaces
+ * created with create-graphics can have transparency. This makes it
+ * possible to draw into a graphics and maintain the alpha channel. By
+ * using save to write a PNG or TGA file, the transparency of the
+ * graphics object will be honored.
+ */
+quil.core.create_graphics = (function quil$core$create_graphics(var_args){
+var G__1373 = arguments.length;
+switch (G__1373) {
+case 2:
+return quil.core.create_graphics.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.create_graphics.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.create_graphics.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.create_graphics.cljs$core$IFn$_invoke$arity$2 = (function (w,h){
+return quil.sketch.current_applet.call(null).createGraphics((w | (0)),(h | (0)),new cljs.core.Keyword(null,"p2d","p2d",-2106175755));
+});
+
+quil.core.create_graphics.cljs$core$IFn$_invoke$arity$3 = (function (w,h,renderer){
+return quil.sketch.current_applet.call(null).createGraphics((w | (0)),(h | (0)),quil.sketch.resolve_renderer.call(null,renderer));
+});
+
+quil.core.create_graphics.cljs$core$IFn$_invoke$arity$4 = (function (w,h,renderer,path){
+return quil.sketch.current_applet.call(null).createGraphics((w | (0)),(h | (0)),quil.sketch.resolve_renderer.call(null,renderer),path);
+});
+
+quil.core.create_graphics.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Creates a new PImage (the datatype for storing images). This
+ * provides a fresh buffer of pixels to play with. Set the size of the
+ * buffer with the width and height parameters. The format parameter
+ * defines how the pixels are stored. See the PImage reference for more
+ * information.
+ *
+ * Possible formats: :rgb, :argb, :alpha (grayscale alpha channel)
+ *
+ * Prefer using create-image over initialising new PImage instances
+ * directly.
+ */
+quil.core.create_image = (function quil$core$create_image(w,h,format){
+var format__$1 = quil.util.resolve_constant_key.call(null,format,quil.core.image_formats);
+return quil.sketch.current_applet.call(null).createImage((w | (0)),(h | (0)),(format__$1 | (0)));
+});
+/**
+ * Return the current fill color.
+ */
+quil.core.current_fill = (function quil$core$current_fill(){
+return quil.core.current_graphics.call(null).fillColor;
+});
+/**
+ * Return the current stroke color.
+ */
+quil.core.current_stroke = (function quil$core$current_stroke(){
+return quil.core.current_graphics.call(null).strokeColor;
+});
+/**
+ * Sets the cursor to a predefined symbol or makes it
+ * visible if already hidden (after no-cursor was called).
+ *
+ * Available modes: :arrow, :cross, :hand, :move, :text, :wait
+ *
+ * See cursor-image for specifying a generic image as the cursor
+ * symbol.
+ */
+quil.core.cursor = (function quil$core$cursor(var_args){
+var G__1376 = arguments.length;
+switch (G__1376) {
+case 0:
+return quil.core.cursor.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.cursor.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.cursor.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.sketch.current_applet.call(null).cursor();
+});
+
+quil.core.cursor.cljs$core$IFn$_invoke$arity$1 = (function (cursor_mode){
+var cursor_mode__$1 = quil.util.resolve_constant_key.call(null,cursor_mode,quil.core.cursor_modes);
+return quil.sketch.current_applet.call(null).cursor(cljs.core.str.cljs$core$IFn$_invoke$arity$1(cursor_mode__$1));
+});
+
+quil.core.cursor.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Set the cursor to a predefined image. The horizontal and vertical
+ * active spots of the cursor may be specified with hx and hy.
+ * It is recommended to make the size 16x16 or 32x32 pixels.
+ */
+quil.core.cursor_image = (function quil$core$cursor_image(var_args){
+var G__1379 = arguments.length;
+switch (G__1379) {
+case 1:
+return quil.core.cursor_image.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.cursor_image.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.cursor_image.cljs$core$IFn$_invoke$arity$1 = (function (img){
+return quil.sketch.current_applet.call(null).cursor(img);
+});
+
+quil.core.cursor_image.cljs$core$IFn$_invoke$arity$3 = (function (img,hx,hy){
+return quil.sketch.current_applet.call(null).cursor(img,(hx | (0)),(hy | (0)));
+});
+
+quil.core.cursor_image.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Draws a curved line on the screen. The first and second parameters
+ * specify the beginning control point and the last two parameters
+ * specify the ending control point. The middle parameters specify the
+ * start and stop of the curve. Longer curves can be created by putting
+ * a series of curve fns together or using curve-vertex. An additional
+ * fn called curve-tightness provides control for the visual quality of
+ * the curve. The curve fn is an implementation of Catmull-Rom
+ * splines.
+ */
+quil.core.curve = (function quil$core$curve(var_args){
+var G__1382 = arguments.length;
+switch (G__1382) {
+case 8:
+return quil.core.curve.cljs$core$IFn$_invoke$arity$8((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]));
+
+break;
+case 12:
+return quil.core.curve.cljs$core$IFn$_invoke$arity$12((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]),(arguments[(11)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.curve.cljs$core$IFn$_invoke$arity$8 = (function (x1,y1,x2,y2,x3,y3,x4,y4){
+return quil.core.current_graphics.call(null).curve(x1,y1,x2,y2,x3,y3,x4,y4);
+});
+
+quil.core.curve.cljs$core$IFn$_invoke$arity$12 = (function (x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4){
+return quil.core.current_graphics.call(null).curve(x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4);
+});
+
+quil.core.curve.cljs$lang$maxFixedArity = 12;
+
+/**
+ * Sets the resolution at which curves display. The default value is
+ * 20. This function is only useful when using the :p3d or :opengl
+ * renderer as the default (:java2d) renderer does not use this
+ * information.
+ */
+quil.core.curve_detail = (function quil$core$curve_detail(detail){
+return quil.core.current_graphics.call(null).curveDetail((detail | (0)));
+});
+/**
+ * Evalutes the curve at point t for points a, b, c, d. The parameter
+ * t varies between 0 and 1, a and d are points on the curve, and b c
+ * and are the control points. This can be done once with the x
+ * coordinates and a second time with the y coordinates to get the
+ * location of a curve at t.
+ */
+quil.core.curve_point = (function quil$core$curve_point(a,b,c,d,t){
+return quil.core.current_graphics.call(null).curvePoint(a,b,c,d,t);
+});
+/**
+ * Calculates the tangent of a point on a curve.
+ * See: http://en.wikipedia.org/wiki/Tangent
+ */
+quil.core.curve_tangent = (function quil$core$curve_tangent(a,b,c,d,t){
+return quil.core.current_graphics.call(null).curveTangent(a,b,c,d,t);
+});
+/**
+ * Modifies the quality of forms created with curve and
+ * curve-vertex. The parameter squishy determines how the curve fits
+ * to the vertex points. The value 0.0 is the default value for
+ * squishy (this value defines the curves to be Catmull-Rom splines)
+ * and the value 1.0 connects all the points with straight
+ * lines. Values within the range -5.0 and 5.0 will deform the curves
+ * but will leave them recognizable and as values increase in
+ * magnitude, they will continue to deform.
+ */
+quil.core.curve_tightness = (function quil$core$curve_tightness(ti){
+return quil.core.current_graphics.call(null).curveTightness(ti);
+});
+/**
+ * Specifies vertex coordinates for curves. This function may only be
+ * used between begin-shape and end-shape and only when there is no
+ * mode keyword specified to begin-shape. The first and last points in a
+ * series of curve-vertex lines will be used to guide the beginning and
+ * end of a the curve. A minimum of four points is required to draw a
+ * tiny curve between the second and third points. Adding a fifth point
+ * with curve-vertex will draw the curve between the second, third, and
+ * fourth points. The curve-vertex function is an implementation of
+ * Catmull-Rom splines.
+ */
+quil.core.curve_vertex = (function quil$core$curve_vertex(var_args){
+var G__1385 = arguments.length;
+switch (G__1385) {
+case 2:
+return quil.core.curve_vertex.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.curve_vertex.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.curve_vertex.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.current_graphics.call(null).curveVertex(x,y);
+});
+
+quil.core.curve_vertex.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).curveVertex(x,y,z);
+});
+
+quil.core.curve_vertex.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Get the current day of the month (1 through 31).
+ */
+quil.core.day = (function quil$core$day(){
+return quil.sketch.current_applet.call(null).day();
+});
+/**
+ * Converts a radian measurement to its corresponding value in
+ * degrees. Radians and degrees are two ways of measuring the same
+ * thing. There are 360 degrees in a circle and (* 2 Math/PI) radians
+ * in a circle. For example, (= 90° (/ Math/PI 2) 1.5707964). All
+ * trigonometric methods in Processing require their parameters to be
+ * specified in radians.
+ */
+quil.core.degrees = (function quil$core$degrees(radians){
+return quil.sketch.current_applet.call(null).degrees(radians);
+});
+/**
+ * Forces the program to stop running for a specified time. Delay
+ * times are specified in thousandths of a second, therefore the
+ * function call (delay 3000) will stop the program for three
+ * seconds. Because the screen is updated only at the end of draw,
+ * the program may appear to 'freeze', because the screen will not
+ * update when the delay fn is used. This function has no affect
+ * inside setup.
+ */
+quil.core.delay_frame = (function quil$core$delay_frame(freeze_ms){
+return quil.sketch.current_applet.call(null).delay((freeze_ms | (0)));
+});
+/**
+ * Adds a directional light. Directional light comes from one
+ * direction and is stronger when hitting a surface squarely and weaker
+ * if it hits at a gentle angle. After hitting a surface, a
+ * directional lights scatters in all directions. Lights need to be
+ * included in the draw fn to remain persistent in a looping
+ * program. Placing them in the setup fn of a looping program will cause
+ * them to only have an effect the first time through the loop. The
+ * affect of the r, g, and b parameters is determined by the current
+ * color mode. The nx, ny, and nz parameters specify the direction the
+ * light is facing. For example, setting ny to -1 will cause the
+ * geometry to be lit from below (the light is facing directly upward)
+ */
+quil.core.directional_light = (function quil$core$directional_light(r,g,b,nx,ny,nz){
+return quil.core.current_graphics.call(null).directionalLight(r,g,b,nx,ny,nz);
+});
+/**
+ * Calculates the distance between two points
+ */
+quil.core.dist = (function quil$core$dist(var_args){
+var G__1388 = arguments.length;
+switch (G__1388) {
+case 4:
+return quil.core.dist.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 6:
+return quil.core.dist.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.dist.cljs$core$IFn$_invoke$arity$4 = (function (x1,y1,x2,y2){
+return quil.sketch.current_applet.call(null).dist(x1,y1,x2,y2);
+});
+
+quil.core.dist.cljs$core$IFn$_invoke$arity$6 = (function (x1,y1,z1,x2,y2,z2){
+return quil.sketch.current_applet.call(null).dist(x1,y1,z1,x2,y2,z2);
+});
+
+quil.core.dist.cljs$lang$maxFixedArity = 6;
+
+var ret__4684__auto___1395 = (function (){
+/**
+ * Macro for drawing on graphics which saves result in the file at the end.
+ * Similar to 'with-graphics' macro. do-record assumed to be used with :pdf
+ * graphics. Example:
+ *
+ * (q/do-record (q/create-graphics 200 200 :pdf "output.pdf")
+ * (q/fill 250 0 0)
+ * (q/ellipse 100 100 150 150))
+ *
+ */
+quil.core.do_record = (function quil$core$do_record(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1396 = arguments.length;
+var i__4642__auto___1397 = (0);
+while(true){
+if((i__4642__auto___1397 < len__4641__auto___1396)){
+args__4647__auto__.push((arguments[i__4642__auto___1397]));
+
+var G__1398 = (i__4642__auto___1397 + (1));
+i__4642__auto___1397 = G__1398;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((3) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((3)),(0),null)):null);
+return quil.core.do_record.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__4648__auto__);
+});
+
+quil.core.do_record.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,graphics,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null),null,(1),null)),(new cljs.core.List(null,cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"gr__1390__auto__","gr__1390__auto__",907895732,null),null,(1),null)),(new cljs.core.List(null,graphics,null,(1),null)))))),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","with-graphics","quil.core/with-graphics",481277883,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol(null,"gr__1390__auto__","gr__1390__auto__",907895732,null),null,(1),null)),body))),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,".dispose",".dispose",-1697594101,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol(null,"gr__1390__auto__","gr__1390__auto__",907895732,null),null,(1),null))))),null,(1),null)))));
+});
+
+quil.core.do_record.cljs$lang$maxFixedArity = (3);
+
+/** @this {Function} */
+quil.core.do_record.cljs$lang$applyTo = (function (seq1391){
+var G__1392 = cljs.core.first.call(null,seq1391);
+var seq1391__$1 = cljs.core.next.call(null,seq1391);
+var G__1393 = cljs.core.first.call(null,seq1391__$1);
+var seq1391__$2 = cljs.core.next.call(null,seq1391__$1);
+var G__1394 = cljs.core.first.call(null,seq1391__$2);
+var seq1391__$3 = cljs.core.next.call(null,seq1391__$2);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__1392,G__1393,G__1394,seq1391__$3);
+});
+
+return null;
+})()
+;
+quil.core.do_record.cljs$lang$macro = true;
+
+/**
+ * Draws an ellipse (oval) in the display window. An ellipse with an
+ * equal width and height is a circle. The origin may be changed with
+ * the ellipse-mode function
+ */
+quil.core.ellipse = (function quil$core$ellipse(x,y,width,height){
+return quil.core.current_graphics.call(null).ellipse(x,y,width,height);
+});
+/**
+ * Modifies the origin of the ellispse according to the specified mode:
+ *
+ * :center - specifies the location of the ellipse as
+ * the center of the shape. (Default).
+ * :radius - similar to center, but the width and height parameters to
+ * ellipse specify the radius of the ellipse, rather than the
+ * diameter.
+ * :corner - draws the shape from the upper-left corner of its bounding
+ * box.
+ * :corners - uses the four parameters to ellipse to set two opposing
+ * corners of the ellipse's bounding box.
+ */
+quil.core.ellipse_mode = (function quil$core$ellipse_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.ellipse_modes);
+return quil.core.current_graphics.call(null).ellipseMode((mode__$1 | (0)));
+});
+/**
+ * Sets the emissive color of the material used for drawing shapes
+ * drawn to the screen. Used in combination with ambient, specular, and
+ * shininess in setting the material properties of shapes. Converts all
+ * args to floats
+ */
+quil.core.emissive_float = (function quil$core$emissive_float(var_args){
+var G__1400 = arguments.length;
+switch (G__1400) {
+case 1:
+return quil.core.emissive_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.emissive_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.emissive_float.cljs$core$IFn$_invoke$arity$1 = (function (float_val){
+return quil.core.current_graphics.call(null).emissive(float_val);
+});
+
+quil.core.emissive_float.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.current_graphics.call(null).emissive(r,g,b);
+});
+
+quil.core.emissive_float.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Sets the emissive color of the material used for drawing shapes
+ * drawn to the screen. Used in combination with ambient, specular, and
+ * shininess in setting the material properties of shapes. Converts all
+ * args to ints
+ */
+quil.core.emissive_int = (function quil$core$emissive_int(int_val){
+return quil.core.current_graphics.call(null).emissive((int_val | (0)));
+});
+/**
+ * Sets the emissive color of the material used for drawing shapes
+ * drawn to the screen. Used in combination with ambient, specular, and
+ * shininess in setting the material properties of shapes.
+ *
+ * If passed one arg - it is assumed to be an int (i.e. a color),
+ * multiple args are converted to floats.
+ */
+quil.core.emissive = (function quil$core$emissive(var_args){
+var G__1403 = arguments.length;
+switch (G__1403) {
+case 1:
+return quil.core.emissive.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.emissive.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.emissive.cljs$core$IFn$_invoke$arity$1 = (function (c){
+return quil.core.emissive_float.call(null,c);
+});
+
+quil.core.emissive.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.emissive_float.call(null,r,g,b);
+});
+
+quil.core.emissive.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Unsets the matrix mode from the camera matrix. See begin-camera.
+ */
+quil.core.end_camera = (function quil$core$end_camera(){
+return quil.core.current_graphics.call(null).endCamera();
+});
+/**
+ * Use the begin-contour and end-contour function to create negative
+ * shapes within shapes. These functions can only be within a
+ * begin-shape/end-shape pair and they only work with the :p2d and :p3d
+ * renderers.
+ */
+quil.core.end_contour = (function quil$core$end_contour(){
+return quil.core.current_graphics.call(null).endContour();
+});
+/**
+ * Complement to begin-raw; they must always be used together. See
+ * the begin-raw docstring for details.
+ */
+quil.core.end_raw = (function quil$core$end_raw(){
+return quil.core.current_graphics.call(null).endRaw();
+});
+/**
+ * May only be called after begin-shape. When end-shape is called,
+ * all of image data defined since the previous call to begin-shape is
+ * written into the image buffer. The keyword :close may be passed to
+ * close the shape (to connect the beginning and the end).
+ */
+quil.core.end_shape = (function quil$core$end_shape(var_args){
+var G__1406 = arguments.length;
+switch (G__1406) {
+case 0:
+return quil.core.end_shape.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.end_shape.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.end_shape.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).endShape();
+});
+
+quil.core.end_shape.cljs$core$IFn$_invoke$arity$1 = (function (mode){
+if(cljs.core._EQ_.call(null,new cljs.core.Keyword(null,"close","close",1835149582),mode)){
+} else {
+}
+
+return quil.core.current_graphics.call(null).endShape((2));
+});
+
+quil.core.end_shape.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Quits/stops/exits the program. Rather than terminating
+ * immediately, exit will cause the sketch to exit after draw has
+ * completed (or after setup completes if called during the setup
+ * method).
+ */
+quil.core.exit = (function quil$core$exit(){
+return quil.sketch.current_applet.call(null).exit();
+});
+/**
+ * Returns Euler's number e (2.71828...) raised to the power of the
+ * value parameter.
+ */
+quil.core.exp = (function quil$core$exp(val){
+return quil.sketch.current_applet.call(null).exp(val);
+});
+/**
+ * Sets custom property on graphcs object indicating that it has
+ * fill color.
+ */
+quil.core.clear_no_fill_cljs = (function quil$core$clear_no_fill_cljs(graphics){
+return (graphics[quil.core.no_fill_prop] = false);
+});
+/**
+ * Sets the color used to fill shapes. For example, (fill 204 102 0),
+ * will specify that all subsequent shapes will be filled with orange.
+ */
+quil.core.fill_float = (function quil$core$fill_float(var_args){
+var G__1409 = arguments.length;
+switch (G__1409) {
+case 1:
+return quil.core.fill_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.fill_float.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.fill_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.fill_float.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.fill_float.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+quil.core.current_graphics.call(null).fill(gray);
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_float.cljs$core$IFn$_invoke$arity$2 = (function (gray,alpha){
+quil.core.current_graphics.call(null).fill(gray,alpha);
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_float.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+quil.core.current_graphics.call(null).fill(r,g,b);
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_float.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,alpha){
+quil.core.current_graphics.call(null).fill(r,g,b,alpha);
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_float.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Sets the color used to fill shapes.
+ */
+quil.core.fill_int = (function quil$core$fill_int(var_args){
+var G__1412 = arguments.length;
+switch (G__1412) {
+case 1:
+return quil.core.fill_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.fill_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.fill_int.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+quil.core.current_graphics.call(null).fill(cljs.core.unchecked_int.call(null,rgb));
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_int.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+quil.core.current_graphics.call(null).fill(cljs.core.unchecked_int.call(null,rgb),alpha);
+
+return quil.core.clear_no_fill_cljs.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.fill_int.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the color used to fill shapes.
+ */
+quil.core.fill = (function quil$core$fill(var_args){
+var G__1415 = arguments.length;
+switch (G__1415) {
+case 1:
+return quil.core.fill.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.fill.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.fill.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.fill.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.fill.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.fill_float.call(null,rgb);
+});
+
+quil.core.fill.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.fill_float.call(null,rgb,alpha);
+});
+
+quil.core.fill.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.fill_float.call(null,r,g,b);
+});
+
+quil.core.fill.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.fill_float.call(null,r,g,b,a);
+});
+
+quil.core.fill.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Originally named filter in Processing Language.
+ * Filters the display window with the specified mode and level.
+ * Level defines the quality of the filter and mode may be one of the
+ * following keywords:
+ *
+ * :threshold - converts the image to black and white pixels depending
+ * if they are above or below the threshold defined by
+ * the level parameter. The level must be between
+ * 0.0 (black) and 1.0 (white). If no level is specified,
+ * 0.5 is used.
+ * :gray - converts any colors in the image to grayscale
+ * equivalents. Doesn't work with level.
+ * :invert - sets each pixel to its inverse value. Doesn't work with
+ * level.
+ * :posterize - limits each channel of the image to the number of
+ * colors specified as the level parameter. The parameter can
+ * be set to values between 2 and 255, but results are most
+ * noticeable in the lower ranges.
+ * :blur - executes a Guassian blur with the level parameter
+ * specifying the extent of the blurring. If no level
+ * parameter is used, the blur is equivalent to Guassian
+ * blur of radius 1.
+ * :opaque - sets the alpha channel to entirely opaque. Doesn't work
+ * with level.
+ * :erode - reduces the light areas. Doesn't work with level.
+ * :dilate - increases the light areas. Doesn't work with level.
+ */
+quil.core.display_filter = (function quil$core$display_filter(var_args){
+var G__1418 = arguments.length;
+switch (G__1418) {
+case 1:
+return quil.core.display_filter.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.display_filter.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.display_filter.cljs$core$IFn$_invoke$arity$1 = (function (mode){
+return quil.core.current_graphics.call(null).filter((quil.util.resolve_constant_key.call(null,mode,quil.core.filter_modes) | (0)));
+});
+
+quil.core.display_filter.cljs$core$IFn$_invoke$arity$2 = (function (mode,level){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.filter_modes);
+return quil.core.current_graphics.call(null).filter((mode__$1 | (0)),level);
+});
+
+quil.core.display_filter.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Calculates the closest int value that is less than or equal to the
+ * value of the parameter. For example, (floor 9.03) returns the value 9.
+ */
+quil.core.floor = (function quil$core$floor(n){
+return quil.sketch.current_applet.call(null).floor(n);
+});
+/**
+ * Returns a boolean value representing whether the applet has focus.
+ */
+quil.core.focused = (function quil$core$focused(){
+return quil.sketch.current_applet.call(null).focused;
+});
+/**
+ * The system variable frameCount contains the number of frames
+ * displayed since the program started. Inside setup() the value is 0
+ * and after the first iteration of draw it is 1, etc.
+ */
+quil.core.frame_count = (function quil$core$frame_count(){
+return quil.sketch.current_applet.call(null).frameCount;
+});
+/**
+ * Returns the current framerate
+ */
+quil.core.current_frame_rate = (function quil$core$current_frame_rate(){
+return quil.sketch.current_applet.call(null).__frameRate;
+});
+/**
+ * Specifies a new target framerate (number of frames to be displayed every
+ * second). If the processor is not fast enough to maintain the
+ * specified rate, it will not be achieved. For example, the function
+ * call (frame-rate 30) will attempt to refresh 30 times a second. It
+ * is recommended to set the frame rate within setup. The default rate
+ * is 60 frames per second.
+ */
+quil.core.frame_rate = (function quil$core$frame_rate(new_rate){
+cljs.core.reset_BANG_.call(null,quil.sketch.current_applet.call(null).target_frame_rate,new_rate);
+
+return quil.sketch.current_applet.call(null).frameRate(new_rate);
+});
+/**
+ * Sets a perspective matrix defined through the parameters. Works
+ * like glFrustum, except it wipes out the current perspective matrix
+ * rather than muliplying itself with it.
+ */
+quil.core.frustum = (function quil$core$frustum(left,right,bottom,top,near,far){
+return quil.core.current_graphics.call(null).frustum(left,right,bottom,top,near,far);
+});
+/**
+ * Reads the color of any pixel or grabs a section of an image. If no
+ * parameters are specified, a copy of entire image is returned. Get the
+ * value of one pixel by specifying an x,y coordinate. Get a section of
+ * the image by specifying an additional width and height parameter.
+ * If the pixel requested is outside of the image window, black is returned.
+ * The numbers returned are scaled according to the current color ranges,
+ * but only RGB values are returned by this function. For example, even though
+ * you may have drawn a shape with (color-mode :hsb), the numbers returned
+ * will be in RGB.
+ *
+ * Getting the color of a single pixel with (get x y) is easy, but not
+ * as fast as grabbing the data directly using the pixels fn.
+ *
+ * If no img specified - current-graphics is used.
+ */
+quil.core.get_pixel = (function quil$core$get_pixel(var_args){
+var G__1421 = arguments.length;
+switch (G__1421) {
+case 0:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return quil.core.get_pixel.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.get_pixel.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$1 = (function (img){
+return img.get();
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.get_pixel.call(null,quil.core.current_graphics.call(null),x,y);
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$3 = (function (img,x,y){
+return img.get((x | (0)),(y | (0)));
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$4 = (function (x,y,w,h){
+return quil.core.get_pixel.call(null,quil.core.current_graphics.call(null),x,y,w,h);
+});
+
+quil.core.get_pixel.cljs$core$IFn$_invoke$arity$5 = (function (img,x,y,w,h){
+return img.get((x | (0)),(y | (0)),(w | (0)),(h | (0)));
+});
+
+quil.core.get_pixel.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Extracts the green value from a color, scaled to match current
+ * color-mode. This value is always returned as a float so be careful
+ * not to assign it to an int value.
+ */
+quil.core.green = (function quil$core$green(col){
+return quil.core.current_graphics.call(null).green(cljs.core.unchecked_int.call(null,col));
+});
+/**
+ * Converts a byte, char, int, or color to a String containing the
+ * equivalent hexadecimal notation. For example color(0, 102, 153) will
+ * convert to the String "FF006699". This function can help make your
+ * geeky debugging sessions much happier.
+ */
+quil.core.hex = (function quil$core$hex(var_args){
+var G__1424 = arguments.length;
+switch (G__1424) {
+case 1:
+return quil.core.hex.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.hex.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.hex.cljs$core$IFn$_invoke$arity$1 = (function (val){
+return quil.sketch.current_applet.call(null).hex(val);
+});
+
+quil.core.hex.cljs$core$IFn$_invoke$arity$2 = (function (val,num_digits){
+return quil.sketch.current_applet.call(null).hex(val,num_digits);
+});
+
+quil.core.hex.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Height of the display window. The value of height is zero until
+ * size is called.
+ */
+quil.core.height = (function quil$core$height(){
+return quil.sketch.current_applet.call(null).height;
+});
+/**
+ * Set various hints and hacks for the renderer. This is used to
+ * handle obscure rendering features that cannot be implemented in a
+ * consistent manner across renderers. Many options will often graduate
+ * to standard features instead of hints over time.
+ *
+ * Options:
+ *
+ * :enable-native-fonts - Use the native version fonts when they are
+ * installed, rather than the bitmapped version from a .vlw
+ * file. This is useful with the default (or JAVA2D) renderer
+ * setting, as it will improve font rendering speed. This is not
+ * enabled by default, because it can be misleading while testing
+ * because the type will look great on your machine (because you have
+ * the font installed) but lousy on others' machines if the identical
+ * font is unavailable. This option can only be set per-sketch, and
+ * must be called before any use of text-font.
+ *
+ * :disable-native-fonts - Disables native font support.
+ *
+ * :disable-depth-test - Disable the zbuffer, allowing you to draw on
+ * top of everything at will. When depth testing is disabled, items
+ * will be drawn to the screen sequentially, like a painting. This
+ * hint is most often used to draw in 3D, then draw in 2D on top of
+ * it (for instance, to draw GUI controls in 2D on top of a 3D
+ * interface). Starting in release 0149, this will also clear the
+ * depth buffer. Restore the default with :enable-depth-test
+ * but note that with the depth buffer cleared, any 3D drawing that
+ * happens later in draw will ignore existing shapes on the screen.
+ *
+ * :enable-depth-test - Enables the zbuffer.
+ *
+ * :enable-depth-sort - Enable primitive z-sorting of triangles and
+ * lines in :p3d and :opengl rendering modes. This can slow
+ * performance considerably, and the algorithm is not yet perfect.
+ *
+ * :disable-depth-sort - Disables hint :enable-depth-sort
+ *
+ * :disable-opengl-errors - Speeds up the OPENGL renderer setting
+ * by not checking for errors while running.
+ *
+ * :enable-opengl-errors - Turns on OpenGL error checking
+ *
+ * :enable-depth-mask
+ * :disable-depth-mask
+ *
+ * :enable-optimized-stroke
+ * :disable-optimized-stroke
+ * :enable-retina-pixels
+ * :disable-retina-pixels
+ * :enable-stroke-perspective
+ * :disable-stroke-perspective
+ * :enable-stroke-pure
+ * :disable-stroke-pure
+ * :enable-texture-mipmaps
+ * :disable-texture-mipmaps
+ */
+quil.core.hint = (function quil$core$hint(hint_type){
+var hint_type__$1 = (((hint_type instanceof cljs.core.Keyword))?cljs.core.get.call(null,quil.core.hint_options,hint_type):hint_type);
+return quil.core.current_graphics.call(null).hint((hint_type__$1 | (0)));
+});
+/**
+ * Returns the current hour as a value from 0 - 23.
+ */
+quil.core.hour = (function quil$core$hour(){
+return quil.sketch.current_applet.call(null).hour();
+});
+/**
+ * Extracts the hue value from a color.
+ */
+quil.core.hue = (function quil$core$hue(col){
+return quil.core.current_graphics.call(null).hue(cljs.core.unchecked_int.call(null,col));
+});
+/**
+ * Displays images to the screen. Processing currently works with GIF,
+ * JPEG, and Targa images. The color of an image may be modified with
+ * the tint function and if a GIF has transparency, it will maintain
+ * its transparency. The img parameter specifies the image to display
+ * and the x and y parameters define the location of the image from its
+ * upper-left corner. The image is displayed at its original size
+ * unless the width and height parameters specify a different size. The
+ * image-mode fn changes the way the parameters work. A call to
+ * (image-mode :corners) will change the width and height parameters to
+ * define the x and y values of the opposite corner of the image.
+ *
+ * Starting with release 0124, when using the default (JAVA2D)
+ * renderer, smooth will also improve image quality of resized
+ * images.
+ */
+quil.core.image = (function quil$core$image(var_args){
+var G__1427 = arguments.length;
+switch (G__1427) {
+case 3:
+return quil.core.image.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 5:
+return quil.core.image.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.image.cljs$core$IFn$_invoke$arity$3 = (function (img,x,y){
+return quil.core.current_graphics.call(null).image(img,x,y);
+});
+
+quil.core.image.cljs$core$IFn$_invoke$arity$5 = (function (img,x,y,c,d){
+return quil.core.current_graphics.call(null).image(img,x,y,c,d);
+});
+
+quil.core.image.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Originally named filter in Processing Language.
+ * Filters given image with the specified mode and level.
+ * Level defines the quality of the filter and mode may be one of
+ * the following keywords:
+ *
+ * :threshold - converts the image to black and white pixels depending
+ * if they are above or below the threshold defined by
+ * the level parameter. The level must be between
+ * 0.0 (black) and 1.0 (white). If no level is specified,
+ * 0.5 is used.
+ * :gray - converts any colors in the image to grayscale
+ * equivalents. Doesn't work with level.
+ * :invert - sets each pixel to its inverse value. Doesn't work with
+ * level.
+ * :posterize - limits each channel of the image to the number of
+ * colors specified as the level parameter. The parameter can
+ * be set to values between 2 and 255, but results are most
+ * noticeable in the lower ranges.
+ * :blur - executes a Guassian blur with the level parameter
+ * specifying the extent of the blurring. If no level
+ * parameter is used, the blur is equivalent to Guassian
+ * blur of radius 1.
+ * :opaque - sets the alpha channel to entirely opaque. Doesn't work
+ * with level.
+ * :erode - reduces the light areas. Doesn't work with level.
+ * :dilate - increases the light areas. Doesn't work with level.
+ */
+quil.core.image_filter = (function quil$core$image_filter(var_args){
+var G__1430 = arguments.length;
+switch (G__1430) {
+case 2:
+return quil.core.image_filter.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.image_filter.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.image_filter.cljs$core$IFn$_invoke$arity$2 = (function (img,mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.filter_modes);
+return img.filter((mode__$1 | (0)));
+});
+
+quil.core.image_filter.cljs$core$IFn$_invoke$arity$3 = (function (img,mode,level){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.filter_modes);
+return img.filter((mode__$1 | (0)),level);
+});
+
+quil.core.image_filter.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Modifies the location from which images draw. The default mode is :corner.
+ * Available modes are:
+ *
+ * :corner - specifies the location to be the upper left corner and
+ * uses the fourth and fifth parameters of image to set the
+ * image's width and height.
+ *
+ * :corners - uses the second and third parameters of image to set the
+ * location of one corner of the image and uses the fourth
+ * and fifth parameters to set the opposite corner.
+ *
+ * :center - draw images centered at the given x and y position.
+ */
+quil.core.image_mode = (function quil$core$image_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.image_modes);
+return quil.core.current_graphics.call(null).imageMode((mode__$1 | (0)));
+});
+/**
+ * The variable keyCode is used to detect special keys such as the UP,
+ * DOWN, LEFT, RIGHT arrow keys and ALT, CONTROL, SHIFT. When checking
+ * for these keys, it's first necessary to check and see if the key is
+ * coded. This is done with the conditional (= (key) CODED).
+ *
+ * The keys included in the ASCII specification (BACKSPACE, TAB, ENTER,
+ * RETURN, ESC, and DELETE) do not require checking to see if they key
+ * is coded, and you should simply use the key variable instead of
+ * key-code If you're making cross-platform projects, note that the
+ * ENTER key is commonly used on PCs and Unix and the RETURN key is
+ * used instead on Macintosh. Check for both ENTER and RETURN to make
+ * sure your program will work for all platforms.
+ *
+ * For users familiar with Java, the values for UP and DOWN are simply
+ * shorter versions of Java's KeyEvent.VK_UP and
+ * KeyEvent.VK_DOWN. Other keyCode values can be found in the Java
+ * KeyEvent reference.
+ */
+quil.core.key_code = (function quil$core$key_code(){
+return quil.sketch.current_applet.call(null).keyCode;
+});
+/**
+ * true if any key is currently pressed, false otherwise.
+ */
+quil.core.key_pressed_QMARK_ = (function quil$core$key_pressed_QMARK_(){
+return quil.sketch.current_applet.call(null).__keyPressed;
+});
+/**
+ * Sets the falloff rates for point lights, spot lights, and ambient
+ * lights. The parameters are used to determine the falloff with the
+ * following equation:
+ *
+ * d = distance from light position to vertex position
+ * falloff = 1 / (CONSTANT + d * LINEAR + (d*d) * QUADRATIC)
+ *
+ * Like fill, it affects only the elements which are created after it
+ * in the code. The default value is (light-falloff 1.0 0.0 0.0).
+ * Thinking about an ambient light with a falloff can be tricky. It is
+ * used, for example, if you wanted a region of your scene to be lit
+ * ambiently one color and another region to be lit ambiently by
+ * another color, you would use an ambient light with location and
+ * falloff. You can think of it as a point light that doesn't care
+ * which direction a surface is facing.
+ */
+quil.core.light_falloff = (function quil$core$light_falloff(constant,linear,quadratic){
+return quil.core.current_graphics.call(null).lightFalloff(constant,linear,quadratic);
+});
+/**
+ * Calculates a color or colors between two color at a specific
+ * increment. The amt parameter is the amount to interpolate between
+ * the two values where 0.0 equal to the first point, 0.1 is very near
+ * the first point, 0.5 is half-way in between, etc.
+ */
+quil.core.lerp_color = (function quil$core$lerp_color(c1,c2,amt){
+return quil.core.current_graphics.call(null).lerpColor(cljs.core.unchecked_int.call(null,c1),cljs.core.unchecked_int.call(null,c2),amt);
+});
+/**
+ * Calculates a number between two numbers at a specific
+ * increment. The amt parameter is the amount to interpolate between
+ * the two values where 0.0 equal to the first point, 0.1 is very near
+ * the first point, 0.5 is half-way in between, etc. The lerp function
+ * is convenient for creating motion along a straight path and for
+ * drawing dotted lines.
+ */
+quil.core.lerp = (function quil$core$lerp(start,stop,amt){
+return quil.sketch.current_applet.call(null).lerp(start,stop,amt);
+});
+/**
+ * Sets the default ambient light, directional light, falloff, and
+ * specular values. The defaults are:
+ *
+ * (ambient-light 128 128 128)
+ * (directional-light 128 128 128 0 0 -1)
+ * (light-falloff 1 0 0)
+ * (light-specular 0 0 0).
+ *
+ * Lights need to be included in the draw to remain persistent in a
+ * looping program. Placing them in the setup of a looping program
+ * will cause them to only have an effect the first time through the
+ * loop.
+ */
+quil.core.lights = (function quil$core$lights(){
+return quil.core.current_graphics.call(null).lights();
+});
+/**
+ * Sets the specular color for lights. Like fill, it affects only the
+ * elements which are created after it in the code. Specular refers to
+ * light which bounces off a surface in a perferred direction (rather
+ * than bouncing in all directions like a diffuse light) and is used
+ * for creating highlights. The specular quality of a light interacts
+ * with the specular material qualities set through the specular and
+ * shininess functions.
+ */
+quil.core.light_specular = (function quil$core$light_specular(r,g,b){
+return quil.core.current_graphics.call(null).lightSpecular(r,g,b);
+});
+/**
+ * Draws a line (a direct path between two points) to the screen. The
+ * version of line with four parameters draws the line in 2D. To color
+ * a line, use the stroke function. A line cannot be filled, therefore
+ * the fill method will not affect the color of a line. 2D lines are
+ * drawn with a width of one pixel by default, but this can be changed
+ * with the stroke-weight function. The version with six parameters
+ * allows the line to be placed anywhere within XYZ space.
+ */
+quil.core.line = (function quil$core$line(var_args){
+var G__1433 = arguments.length;
+switch (G__1433) {
+case 2:
+return quil.core.line.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 4:
+return quil.core.line.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 6:
+return quil.core.line.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.line.cljs$core$IFn$_invoke$arity$2 = (function (p1,p2){
+return cljs.core.apply.call(null,quil.core.line,cljs.core.concat.call(null,p1,p2));
+});
+
+quil.core.line.cljs$core$IFn$_invoke$arity$4 = (function (x1,y1,x2,y2){
+return quil.core.current_graphics.call(null).line(x1,y1,x2,y2);
+});
+
+quil.core.line.cljs$core$IFn$_invoke$arity$6 = (function (x1,y1,z1,x2,y2,z2){
+return quil.core.current_graphics.call(null).line(x1,y1,z1,x2,y2,z2);
+});
+
+quil.core.line.cljs$lang$maxFixedArity = 6;
+
+/**
+ * Loads a font into a variable of type PFont. To load correctly,
+ * fonts must be located in the data directory of the current sketch.
+ * To create a font to use with Processing use the create-font fn.
+ *
+ * Like load-image and other methods that load data, the load-font fn
+ * should not be used inside draw, because it will slow down the sketch
+ * considerably, as the font will be re-loaded from the disk (or
+ * network) on each frame.
+ *
+ * For most renderers, Processing displays fonts using the .vlw font
+ * format, which uses images for each letter, rather than defining them
+ * through vector data. When hint :enable-native-fonts is used with the
+ * JAVA2D renderer, the native version of a font will be used if it is
+ * installed on the user's machine.
+ *
+ * Using create-font (instead of load-font) enables vector data to be
+ * used with the JAVA2D (default) renderer setting. This can be helpful
+ * when many font sizes are needed, or when using any renderer based on
+ * JAVA2D, such as the PDF library.
+ */
+quil.core.load_font = (function quil$core$load_font(filename){
+return quil.sketch.current_applet.call(null).loadFont(cljs.core.str.cljs$core$IFn$_invoke$arity$1(filename));
+});
+/**
+ * Loads an image into a variable of type PImage. Four types of
+ * images ( .gif, .jpg, .tga, .png) images may be loaded. To load
+ * correctly, images must be located in the data directory of the
+ * current sketch. In most cases, load all images in setup to preload
+ * them at the start of the program. Loading images inside draw will
+ * reduce the speed of a program.
+ *
+ * The filename parameter can also be a URL to a file found online.
+ *
+ * If an image is not loaded successfully, the null value is returned
+ * and an error message will be printed to the console. The error
+ * message does not halt the program, however the null value may cause
+ * a NullPointerException if your code does not check whether the value
+ * returned from load-image is nil.
+ *
+ * Depending on the type of error, a PImage object may still be
+ * returned, but the width and height of the image will be set to
+ * -1. This happens if bad image data is returned or cannot be decoded
+ * properly. Sometimes this happens with image URLs that produce a 403
+ * error or that redirect to a password prompt, because load-image
+ * will attempt to interpret the HTML as image data.
+ */
+quil.core.load_image = (function quil$core$load_image(filename){
+return quil.sketch.current_applet.call(null).loadImage(cljs.core.str.cljs$core$IFn$_invoke$arity$1(filename));
+});
+/**
+ * Loads a shader into the PShader object. Shaders are compatible with the
+ * P2D and P3D renderers, but not with the default renderer.
+ */
+quil.core.load_shader = (function quil$core$load_shader(var_args){
+var G__1436 = arguments.length;
+switch (G__1436) {
+case 1:
+return quil.core.load_shader.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.load_shader.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.load_shader.cljs$core$IFn$_invoke$arity$1 = (function (fragment_filename){
+return quil.core.current_graphics.call(null).loadShader(fragment_filename);
+});
+
+quil.core.load_shader.cljs$core$IFn$_invoke$arity$2 = (function (fragment_filename,vertex_filename){
+return quil.core.current_graphics.call(null).loadShader(fragment_filename,vertex_filename);
+});
+
+quil.core.load_shader.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Load a geometry from a file as a PShape.
+ */
+quil.core.load_shape = (function quil$core$load_shape(filename){
+return quil.sketch.current_applet.call(null).loadShape(filename);
+});
+/**
+ * Calculates the natural logarithm (the base-e logarithm) of a
+ * number. This function expects the values greater than 0.0.
+ */
+quil.core.log = (function quil$core$log(val){
+return quil.sketch.current_applet.call(null).log(val);
+});
+/**
+ * Calculates the magnitude (or length) of a vector. A vector is a
+ * direction in space commonly used in computer graphics and linear
+ * algebra. Because it has no start position, the magnitude of a vector
+ * can be thought of as the distance from coordinate (0,0) to its (x,y)
+ * value. Therefore, mag is a shortcut for writing (dist 0 0 x y).
+ */
+quil.core.mag = (function quil$core$mag(var_args){
+var G__1439 = arguments.length;
+switch (G__1439) {
+case 2:
+return quil.core.mag.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.mag.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.mag.cljs$core$IFn$_invoke$arity$2 = (function (a,b){
+return quil.sketch.current_applet.call(null).mag(a,b);
+});
+
+quil.core.mag.cljs$core$IFn$_invoke$arity$3 = (function (a,b,c){
+return quil.sketch.current_applet.call(null).mag(a,b,c);
+});
+
+quil.core.mag.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Re-maps a number from one range to another.
+ *
+ * Numbers outside the range are not clamped to 0 and 1, because
+ * out-of-range values are often intentional and useful.
+ */
+quil.core.map_range = (function quil$core$map_range(val,low1,high1,low2,high2){
+return quil.sketch.current_applet.call(null).map(val,low1,high1,low2,high2);
+});
+/**
+ * Returns the number of milliseconds (thousandths of a second) since
+ * starting the sketch. This information is often used for timing
+ * animation sequences.
+ */
+quil.core.millis = (function quil$core$millis(){
+return quil.sketch.current_applet.call(null).millis();
+});
+/**
+ * Returns the current minute as a value from 0 - 59
+ */
+quil.core.minute = (function quil$core$minute(){
+return quil.sketch.current_applet.call(null).minute();
+});
+/**
+ * Returns the three-dimensional x, y, z position in model space. This
+ * returns the x value for a given coordinate based on the current set
+ * of transformations (scale, rotate, translate, etc.) The x value can
+ * be used to place an object in space relative to the location of the
+ * original point once the transformations are no longer in use.
+ */
+quil.core.model_x = (function quil$core$model_x(x,y,z){
+return quil.core.current_graphics.call(null).modelX(x,y,z);
+});
+/**
+ * Returns the three-dimensional x, y, z position in model space. This
+ * returns the y value for a given coordinate based on the current set
+ * of transformations (scale, rotate, translate, etc.) The y value can
+ * be used to place an object in space relative to the location of the
+ * original point once the transformations are no longer in use.
+ */
+quil.core.model_y = (function quil$core$model_y(x,y,z){
+return quil.core.current_graphics.call(null).modelY(x,y,z);
+});
+/**
+ * Returns the three-dimensional x, y, z position in model space. This
+ * returns the z value for a given coordinate based on the current set
+ * of transformations (scale, rotate, translate, etc.) The z value can
+ * be used to place an object in space relative to the location of the
+ * original point once the transformations are no longer in use.
+ */
+quil.core.model_z = (function quil$core$model_z(x,y,z){
+return quil.core.current_graphics.call(null).modelZ(x,y,z);
+});
+/**
+ * Returns the current month as a value from 1 - 12.
+ */
+quil.core.month = (function quil$core$month(){
+return quil.sketch.current_applet.call(null).month();
+});
+/**
+ * The value of the system variable mouseButton is either :left, :right,
+ * or :center depending on which button is pressed. nil if no button pressed
+ */
+quil.core.mouse_button = (function quil$core$mouse_button(){
+var button_code = quil.sketch.current_applet.call(null).mouseButton;
+var pred__1441 = cljs.core._EQ_;
+var expr__1442 = button_code;
+if(cljs.core.truth_(pred__1441.call(null,(37),expr__1442))){
+return new cljs.core.Keyword(null,"left","left",-399115937);
+} else {
+if(cljs.core.truth_(pred__1441.call(null,(39),expr__1442))){
+return new cljs.core.Keyword(null,"right","right",-452581833);
+} else {
+if(cljs.core.truth_(pred__1441.call(null,(3),expr__1442))){
+return new cljs.core.Keyword(null,"center","center",-748944368);
+} else {
+return null;
+}
+}
+}
+});
+/**
+ * Variable storing if a mouse button is pressed. The value of the
+ * system variable mousePressed is true if a mouse button is pressed
+ * and false if a button is not pressed.
+ */
+quil.core.mouse_pressed_QMARK_ = (function quil$core$mouse_pressed_QMARK_(){
+return quil.sketch.current_applet.call(null).__mousePressed;
+});
+/**
+ * Current horizontal coordinate of the mouse.
+ */
+quil.core.mouse_x = (function quil$core$mouse_x(){
+return quil.sketch.current_applet.call(null).mouseX;
+});
+/**
+ * Current vertical coordinate of the mouse.
+ */
+quil.core.mouse_y = (function quil$core$mouse_y(){
+return quil.sketch.current_applet.call(null).mouseY;
+});
+/**
+ * Hides the cursor from view. Will not work when running the in full
+ * screen (Present) mode.
+ */
+quil.core.no_cursor = (function quil$core$no_cursor(){
+return quil.sketch.current_applet.call(null).noCursor();
+});
+/**
+ * Disables filling geometry. If both no-stroke and no-fill are called,
+ * nothing will be drawn to the screen.
+ */
+quil.core.no_fill = (function quil$core$no_fill(){
+quil.core.current_graphics.call(null).noFill();
+
+return (quil.core.current_graphics.call(null)[quil.core.no_fill_prop] = true);
+});
+/**
+ * Returns a new 2D unit vector in a random direction
+ */
+quil.core.random_2d = (function quil$core$random_2d(){
+var theta = quil.sketch.current_applet.call(null).random(quil.core.TWO_PI);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [Math.cos(theta),Math.sin(theta)], null);
+});
+/**
+ * Returns a new 3D unit vector in a random direction
+ */
+quil.core.random_3d = (function quil$core$random_3d(){
+var theta = quil.sketch.current_applet.call(null).random(quil.core.TWO_PI);
+var phi = quil.sketch.current_applet.call(null).random((- quil.core.HALF_PI),quil.core.HALF_PI);
+var vx = (Math.cos(theta) * Math.sin(phi));
+var vy = (Math.sin(theta) * Math.sin(phi));
+var vz = Math.cos(phi);
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [vx,vy,vz], null);
+});
+/**
+ * Returns the Perlin noise value at specified coordinates. Perlin
+ * noise is a random sequence generator producing a more natural
+ * ordered, harmonic succession of numbers compared to the standard
+ * random function. It was invented by Ken Perlin in the 1980s and
+ * been used since in graphical applications to produce procedural
+ * textures, natural motion, shapes, terrains etc.
+ *
+ * The main difference to the random function is that Perlin noise is
+ * defined in an infinite n-dimensional space where each pair of
+ * coordinates corresponds to a fixed semi-random value (fixed only for
+ * the lifespan of the program). The resulting value will always be
+ * between 0.0 and 1.0. Processing can compute 1D, 2D and 3D noise,
+ * depending on the number of coordinates given. The noise value can be
+ * animated by moving through the noise space and the 2nd and 3rd
+ * dimensions can also be interpreted as time.
+ *
+ * The actual noise is structured similar to an audio signal, in
+ * respect to the function's use of frequencies. Similar to the concept
+ * of harmonics in physics, perlin noise is computed over several
+ * octaves which are added together for the final result.
+ *
+ * Another way to adjust the character of the resulting sequence is the
+ * scale of the input coordinates. As the function works within an
+ * infinite space the value of the coordinates doesn't matter as such,
+ * only the distance between successive coordinates does (eg. when
+ * using noise within a loop). As a general rule the smaller the
+ * difference between coordinates, the smoother the resulting noise
+ * sequence will be. Steps of 0.005-0.03 work best for most
+ * applications, but this will differ depending on use.
+ */
+quil.core.noise = (function quil$core$noise(var_args){
+var G__1445 = arguments.length;
+switch (G__1445) {
+case 1:
+return quil.core.noise.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.noise.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.noise.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.noise.cljs$core$IFn$_invoke$arity$1 = (function (x){
+return quil.sketch.current_applet.call(null).noise(x);
+});
+
+quil.core.noise.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.sketch.current_applet.call(null).noise(x,y);
+});
+
+quil.core.noise.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.sketch.current_applet.call(null).noise(x,y,z);
+});
+
+quil.core.noise.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Adjusts the character and level of detail produced by the Perlin
+ * noise function. Similar to harmonics in physics, noise is computed
+ * over several octaves. Lower octaves contribute more to the output
+ * signal and as such define the overal intensity of the noise, whereas
+ * higher octaves create finer grained details in the noise
+ * sequence. By default, noise is computed over 4 octaves with each
+ * octave contributing exactly half than its predecessor, starting at
+ * 50% strength for the 1st octave. This falloff amount can be changed
+ * by adding an additional function parameter. Eg. a falloff factor of
+ * 0.75 means each octave will now have 75% impact (25% less) of the
+ * previous lower octave. Any value between 0.0 and 1.0 is valid,
+ * however note that values greater than 0.5 might result in greater
+ * than 1.0 values returned by noise.
+ *
+ * By changing these parameters, the signal created by the noise
+ * function can be adapted to fit very specific needs and
+ * characteristics.
+ */
+quil.core.noise_detail = (function quil$core$noise_detail(var_args){
+var G__1448 = arguments.length;
+switch (G__1448) {
+case 1:
+return quil.core.noise_detail.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.noise_detail.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.noise_detail.cljs$core$IFn$_invoke$arity$1 = (function (octaves){
+return quil.sketch.current_applet.call(null).noiseDetail((octaves | (0)));
+});
+
+quil.core.noise_detail.cljs$core$IFn$_invoke$arity$2 = (function (octaves,falloff){
+return quil.sketch.current_applet.call(null).noiseDetail((octaves | (0)),falloff);
+});
+
+quil.core.noise_detail.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the seed value for noise. By default, noise produces different
+ * results each time the program is run. Set the value parameter to a
+ * constant to return the same pseudo-random numbers each time the
+ * software is run.
+ */
+quil.core.noise_seed = (function quil$core$noise_seed(val){
+return quil.sketch.current_applet.call(null).noiseSeed((val | (0)));
+});
+/**
+ * Disable all lighting. Lighting is turned off by default and enabled
+ * with the lights fn. This function can be used to disable lighting so
+ * that 2D geometry (which does not require lighting) can be drawn
+ * after a set of lighted 3D geometry.
+ */
+quil.core.no_lights = (function quil$core$no_lights(){
+return quil.core.current_graphics.call(null).noLights();
+});
+/**
+ * Stops Processing from continuously executing the code within
+ * draw. If start-loop is called, the code in draw will begin to run
+ * continuously again. If using no-loop in setup, it should be the last
+ * line inside the block.
+ *
+ * When no-loop is used, it's not possible to manipulate or access the
+ * screen inside event handling functions such as mouse-pressed or
+ * key-pressed. Instead, use those functions to call redraw or
+ * loop which will run draw, which can update the screen
+ * properly. This means that when no-loop has been called, no drawing
+ * can happen, and functions like save-frame may not be used.
+ *
+ * Note that if the sketch is resized, redraw will be called to
+ * update the sketch, even after no-oop has been
+ * specified. Otherwise, the sketch would enter an odd state until
+ * loop was called.
+ */
+quil.core.no_loop = (function quil$core$no_loop(){
+return quil.sketch.current_applet.call(null).noLoop();
+});
+/**
+ * Normalize a value to exist between 0 and 1 (inclusive).
+ */
+quil.core.norm = (function quil$core$norm(val,start,stop){
+return quil.sketch.current_applet.call(null).norm(val,start,stop);
+});
+/**
+ * Sets the current normal vector. This is for drawing three
+ * dimensional shapes and surfaces and specifies a vector perpendicular
+ * to the surface of the shape which determines how lighting affects
+ * it. Processing attempts to automatically assign normals to shapes,
+ * but since that's imperfect, this is a better option when you want
+ * more control. This function is identical to glNormal3f() in OpenGL.
+ */
+quil.core.normal = (function quil$core$normal(nx,ny,nz){
+return quil.core.current_graphics.call(null).normal(nx,ny,nz);
+});
+/**
+ * Draws all geometry with jagged (aliased) edges. Must be called inside
+ * :settings handler.
+ */
+quil.core.no_smooth = (function quil$core$no_smooth(){
+return quil.core.current_graphics.call(null).noSmooth();
+});
+/**
+ * Disables drawing the stroke (outline). If both no-stroke and
+ * no-fill are called, nothing will be drawn to the screen.
+ */
+quil.core.no_stroke = (function quil$core$no_stroke(){
+return quil.core.current_graphics.call(null).noStroke();
+});
+/**
+ * Removes the current fill value for displaying images and reverts to
+ * displaying images with their original hues.
+ */
+quil.core.no_tint = (function quil$core$no_tint(){
+return quil.core.current_graphics.call(null).noTint();
+});
+/**
+ * Sets an orthographic projection and defines a parallel clipping
+ * volume. All objects with the same dimension appear the same size,
+ * regardless of whether they are near or far from the camera. The
+ * parameters to this function specify the clipping volume where left
+ * and right are the minimum and maximum x values, top and bottom are
+ * the minimum and maximum y values, and near and far are the minimum
+ * and maximum z values. If no parameters are given, the default is
+ * used: (ortho 0 width 0 height -10 10)
+ */
+quil.core.ortho = (function quil$core$ortho(var_args){
+var G__1451 = arguments.length;
+switch (G__1451) {
+case 0:
+return quil.core.ortho.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 4:
+return quil.core.ortho.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 6:
+return quil.core.ortho.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.ortho.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).ortho();
+});
+
+quil.core.ortho.cljs$core$IFn$_invoke$arity$4 = (function (left,right,bottom,top){
+return quil.core.current_graphics.call(null).ortho(left,right,bottom,top);
+});
+
+quil.core.ortho.cljs$core$IFn$_invoke$arity$6 = (function (left,right,bottom,top,near,far){
+return quil.core.current_graphics.call(null).ortho(left,right,bottom,top,near,far);
+});
+
+quil.core.ortho.cljs$lang$maxFixedArity = 6;
+
+/**
+ * Sets a perspective projection applying foreshortening, making
+ * distant objects appear smaller than closer ones. The parameters
+ * define a viewing volume with the shape of truncated pyramid. Objects
+ * near to the front of the volume appear their actual size, while
+ * farther objects appear smaller. This projection simulates the
+ * perspective of the world more accurately than orthographic
+ * projection. The version of perspective without parameters sets the
+ * default perspective and the version with four parameters allows the
+ * programmer to set the area precisely. The default values are:
+ * perspective(PI/3.0, width/height, cameraZ/10.0, cameraZ*10.0) where
+ * cameraZ is ((height/2.0) / tan(PI*60.0/360.0));
+ */
+quil.core.perspective = (function quil$core$perspective(var_args){
+var G__1454 = arguments.length;
+switch (G__1454) {
+case 0:
+return quil.core.perspective.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 4:
+return quil.core.perspective.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.perspective.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).perspective();
+});
+
+quil.core.perspective.cljs$core$IFn$_invoke$arity$4 = (function (fovy,aspect,z_near,z_far){
+return quil.core.current_graphics.call(null).perspective(fovy,aspect,z_near,z_far);
+});
+
+quil.core.perspective.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Array containing the values for all the pixels in the display
+ * window or image. This array is therefore the size of the display window. If
+ * this array is modified, the update-pixels fn must be called to update
+ * the changes. Calls .loadPixels before obtaining the pixel array.
+ */
+quil.core.pixels = (function quil$core$pixels(var_args){
+var G__1457 = arguments.length;
+switch (G__1457) {
+case 0:
+return quil.core.pixels.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.pixels.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.pixels.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.pixels.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.pixels.cljs$core$IFn$_invoke$arity$1 = (function (img){
+img.loadPixels();
+
+var pix_array = img.pixels.toArray();
+img.stored_pix_array = pix_array;
+
+return pix_array;
+});
+
+quil.core.pixels.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Horizontal coordinate of the mouse in the previous frame
+ */
+quil.core.pmouse_x = (function quil$core$pmouse_x(){
+return quil.sketch.current_applet.call(null).pmouseX;
+});
+/**
+ * Vertical coordinate of the mouse in the previous frame
+ */
+quil.core.pmouse_y = (function quil$core$pmouse_y(){
+return quil.sketch.current_applet.call(null).pmouseY;
+});
+/**
+ * Draws a point, a coordinate in space at the dimension of one
+ * pixel. The first parameter is the horizontal value for the point,
+ * the second value is the vertical value for the point, and the
+ * optional third value is the depth value. Drawing this shape in 3D
+ * using the z parameter requires the :P3D or :opengl renderer to be
+ * used.
+ */
+quil.core.point = (function quil$core$point(var_args){
+var G__1460 = arguments.length;
+switch (G__1460) {
+case 2:
+return quil.core.point.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.point.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.point.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.current_graphics.call(null).point(x,y);
+});
+
+quil.core.point.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).point(x,y,z);
+});
+
+quil.core.point.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Adds a point light. Lights need to be included in the draw() to
+ * remain persistent in a looping program. Placing them in the setup()
+ * of a looping program will cause them to only have an effect the
+ * first time through the loop. The affect of the r, g, and b
+ * parameters is determined by the current color mode. The x, y, and z
+ * parameters set the position of the light
+ */
+quil.core.point_light = (function quil$core$point_light(r,g,b,x,y,z){
+return quil.core.current_graphics.call(null).pointLight(r,g,b,x,y,z);
+});
+/**
+ * Pops the current transformation matrix off the matrix
+ * stack. Understanding pushing and popping requires understanding the
+ * concept of a matrix stack. The push-matrix fn saves the current
+ * coordinate system to the stack and pop-matrix restores the prior
+ * coordinate system. push-matrix and pop-matrix are used in conjuction
+ * with the other transformation methods and may be embedded to control
+ * the scope of the transformations.
+ */
+quil.core.pop_matrix = (function quil$core$pop_matrix(){
+return quil.core.current_graphics.call(null).popMatrix();
+});
+/**
+ * Restores the prior settings on the 'style stack'. Used in
+ * conjunction with push-style. Together they allow you to change the
+ * style settings and later return to what you had. When a new style is
+ * started with push-style, it builds on the current style information.
+ * The push-style and pop-style functions can be nested to provide more
+ * control
+ */
+quil.core.pop_style = (function quil$core$pop_style(){
+return quil.core.current_graphics.call(null).popStyle();
+});
+/**
+ * Facilitates exponential expressions. The pow() function is an
+ * efficient way of multiplying numbers by themselves (or their
+ * reciprocal) in large quantities. For example, (pow 3 5) is
+ * equivalent to the expression (* 3 3 3 3 3) and (pow 3 -5) is
+ * equivalent to (/ 1 (* 3 3 3 3 3)).
+ */
+quil.core.pow = (function quil$core$pow(num,exponent){
+return quil.sketch.current_applet.call(null).pow(num,exponent);
+});
+/**
+ * Prints the current camera matrix to std out. Useful for debugging.
+ */
+quil.core.print_camera = (function quil$core$print_camera(){
+return quil.core.current_graphics.call(null).printCamera();
+});
+/**
+ * Prints the current matrix to std out. Useful for debugging.
+ */
+quil.core.print_matrix = (function quil$core$print_matrix(){
+return quil.core.current_graphics.call(null).printMatrix();
+});
+/**
+ * Prints the current projection matrix to std out. Useful for
+ * debugging
+ */
+quil.core.print_projection = (function quil$core$print_projection(){
+return quil.core.current_graphics.call(null).printProjection();
+});
+/**
+ * Pushes the current transformation matrix onto the matrix
+ * stack. Understanding push-matrix and pop-matrix requires
+ * understanding the concept of a matrix stack. The push-matrix
+ * function saves the current coordinate system to the stack and
+ * pop-matrix restores the prior coordinate system. push-matrix and
+ * pop-matrix are used in conjuction with the other transformation
+ * methods and may be embedded to control the scope of the
+ * transformations.
+ */
+quil.core.push_matrix = (function quil$core$push_matrix(){
+return quil.core.current_graphics.call(null).pushMatrix();
+});
+/**
+ * Saves the current style settings onto a 'style stack'. Use with
+ * pop-style which restores the prior settings. Note that these
+ * functions are always used together. They allow you to change the
+ * style settings and later return to what you had. When a new style is
+ * started with push-style, it builds on the current style
+ * information. The push-style and pop-style fns can be embedded to
+ * provide more control.
+ *
+ * The style information controlled by the following functions are
+ * included in the style: fill, stroke, tint, stroke-weight,
+ * stroke-cap, stroke-join, image-mode, rect-mode, ellipse-mode,
+ * shape-mode, color-mode, text-align, text-font, text-mode, text-size,
+ * text-leading, emissive, specular, shininess, and ambient
+ */
+quil.core.push_style = (function quil$core$push_style(){
+return quil.core.current_graphics.call(null).pushStyle();
+});
+/**
+ * A quad is a quadrilateral, a four sided polygon. It is similar to a
+ * rectangle, but the angles between its edges are not constrained to
+ * be ninety degrees. The first pair of parameters (x1,y1) sets the
+ * first vertex and the subsequent pairs should proceed clockwise or
+ * counter-clockwise around the defined shape.
+ */
+quil.core.quad = (function quil$core$quad(x1,y1,x2,y2,x3,y3,x4,y4){
+return quil.core.current_graphics.call(null).quad(x1,y1,x2,y2,x3,y3,x4,y4);
+});
+/**
+ * Specifies vertex coordinates for quadratic Bezier curves. Each call to
+ * quadratic-vertex defines the position of one control points and one
+ * anchor point of a Bezier curve, adding a new segment to a line or shape.
+ * The first time quadratic-vertex is used within a begin-shape call, it
+ * must be prefaced with a call to vertex to set the first anchor point.
+ * This function must be used between begin-shape and end-shape and only
+ * when there is no MODE parameter specified to begin-shape. Using the 3D
+ * version requires rendering with :p3d.
+ */
+quil.core.quadratic_vertex = (function quil$core$quadratic_vertex(var_args){
+var G__1463 = arguments.length;
+switch (G__1463) {
+case 4:
+return quil.core.quadratic_vertex.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 6:
+return quil.core.quadratic_vertex.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.quadratic_vertex.cljs$core$IFn$_invoke$arity$4 = (function (cx,cy,x3,y3){
+return quil.core.current_graphics.call(null).quadraticVertex(cx,cy,x3,y3);
+});
+
+quil.core.quadratic_vertex.cljs$core$IFn$_invoke$arity$6 = (function (cx,cy,cz,x3,y3,z3){
+return quil.core.current_graphics.call(null).quadraticVertex(cx,cy,cz,x3,y3,z3);
+});
+
+quil.core.quadratic_vertex.cljs$lang$maxFixedArity = 6;
+
+/**
+ * Converts a degree measurement to its corresponding value in
+ * radians. Radians and degrees are two ways of measuring the same
+ * thing. There are 360 degrees in a circle and 2*PI radians in a
+ * circle. For example, 90° = PI/2 = 1.5707964. All trigonometric
+ * methods in Processing require their parameters to be specified in
+ * radians.
+ */
+quil.core.radians = (function quil$core$radians(degrees){
+return quil.sketch.current_applet.call(null).radians(degrees);
+});
+/**
+ * Generates random numbers. Each time the random function is called,
+ * it returns an unexpected value within the specified range. If one
+ * parameter is passed to the function it will return a float between
+ * zero and the value of the high parameter. The function call (random
+ * 5) returns values between 0 and 5 (starting at zero, up to but not
+ * including 5). If two parameters are passed, it will return a float
+ * with a value between the parameters. The function call
+ * (random -5 10.2) returns values starting at -5 up to (but not
+ * including) 10.2.
+ */
+quil.core.random = (function quil$core$random(var_args){
+var G__1466 = arguments.length;
+switch (G__1466) {
+case 1:
+return quil.core.random.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.random.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.random.cljs$core$IFn$_invoke$arity$1 = (function (max){
+return quil.sketch.current_applet.call(null).random(max);
+});
+
+quil.core.random.cljs$core$IFn$_invoke$arity$2 = (function (min,max){
+return quil.sketch.current_applet.call(null).random(min,max);
+});
+
+quil.core.random.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns a float from a random series of numbers having a mean of 0 and
+ * standard deviation of 1. Each time the randomGaussian() function is called,
+ * it returns a number fitting a Gaussian, or normal, distribution.
+ * There is theoretically no minimum or maximum value that randomGaussian()
+ * might return. Rather, there is just a very low probability that values far
+ * from the mean will be returned; and a higher probability that numbers near
+ * the mean will be returned. .
+ */
+quil.core.random_gaussian = (function quil$core$random_gaussian(){
+return quil.sketch.current_applet.call(null).randomGaussian();
+});
+/**
+ * Sets the seed value for random. By default, random produces
+ * different results each time the program is run. Set the value
+ * parameter to a constant to return the same pseudo-random numbers
+ * each time the software is run.
+ */
+quil.core.random_seed = (function quil$core$random_seed(w){
+return quil.sketch.current_applet.call(null).randomSeed(w);
+});
+/**
+ * Contains the value of the most recent key on the keyboard that was
+ * used (either pressed or released).
+ *
+ * For non-ASCII keys, use the keyCode variable. The keys included in
+ * the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and
+ * DELETE) do not require checking to see if they key is coded, and you
+ * should simply use the key variable instead of keyCode If you're
+ * making cross-platform projects, note that the ENTER key is commonly
+ * used on PCs and Unix and the RETURN key is used instead on
+ * Macintosh. Check for both ENTER and RETURN to make sure your program
+ * will work for all platforms.
+ */
+quil.core.raw_key = (function quil$core$raw_key(){
+return quil.sketch.current_applet.call(null).key;
+});
+/**
+ * Draws a rectangle to the screen. A rectangle is a four-sided shape
+ * with every angle at ninety degrees. By default, the first two
+ * parameters set the location of the upper-left corner, the third
+ * sets the width, and the fourth sets the height. These parameters
+ * may be changed with rect-mode.
+ *
+ * To draw a rounded rectangle, add a fifth parameter, which is used as
+ * the radius value for all four corners. To use a different radius value
+ * for each corner, include eight parameters.
+ */
+quil.core.rect = (function quil$core$rect(var_args){
+var G__1469 = arguments.length;
+switch (G__1469) {
+case 4:
+return quil.core.rect.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return quil.core.rect.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+case 8:
+return quil.core.rect.cljs$core$IFn$_invoke$arity$8((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.rect.cljs$core$IFn$_invoke$arity$4 = (function (x,y,width,height){
+return quil.core.current_graphics.call(null).rect(x,y,width,height);
+});
+
+quil.core.rect.cljs$core$IFn$_invoke$arity$5 = (function (x,y,width,height,r){
+return quil.core.current_graphics.call(null).rect(x,y,width,height,r);
+});
+
+quil.core.rect.cljs$core$IFn$_invoke$arity$8 = (function (x,y,width,height,top_left_r,top_right_r,bottom_right_r,bottom_left_r){
+return quil.core.current_graphics.call(null).rect(x,y,width,height,top_left_r,top_right_r,bottom_right_r,bottom_left_r);
+});
+
+quil.core.rect.cljs$lang$maxFixedArity = 8;
+
+/**
+ * Modifies the location from which rectangles draw. The default mode
+ * is :corner. Available modes are:
+ *
+ *
+ * :corner - Specifies the location to be the upper left corner of the
+ * shape and uses the third and fourth parameters of rect to
+ * specify the width and height.
+ *
+ * :corners - Uses the first and second parameters of rect to set the
+ * location of one corner and uses the third and fourth
+ * parameters to set the opposite corner.
+ *
+ * :center - Draws the image from its center point and uses the third
+ * and forth parameters of rect to specify the image's width
+ * and height.
+ *
+ * :radius - Draws the image from its center point and uses the third
+ * and forth parameters of rect() to specify half of the
+ * image's width and height.
+ */
+quil.core.rect_mode = (function quil$core$rect_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.rect_modes);
+return quil.core.current_graphics.call(null).rectMode((mode__$1 | (0)));
+});
+/**
+ * Extracts the red value from a color, scaled to match current color-mode.
+ */
+quil.core.red = (function quil$core$red(c){
+return quil.core.current_graphics.call(null).red(cljs.core.unchecked_int.call(null,c));
+});
+/**
+ * Executes the code within the draw fn one time. This functions
+ * allows the program to update the display window only when necessary,
+ * for example when an event registered by mouse-pressed or
+ * key-pressed occurs.
+ *
+ * In structuring a program, it only makes sense to call redraw
+ * within events such as mouse-pressed. This is because redraw does
+ * not run draw immediately (it only sets a flag that indicates an
+ * update is needed).
+ *
+ * Calling redraw within draw has no effect because draw is
+ * continuously called anyway.
+ */
+quil.core.redraw = (function quil$core$redraw(){
+return quil.sketch.current_applet.call(null).redraw();
+});
+/**
+ * This function load images on a separate thread so that your sketch
+ * does not freeze while images load during setup. While the image is
+ * loading, its width and height will be 0. If an error occurs while
+ * loading the image, its width and height will be set to -1. You'll
+ * know when the image has loaded properly because its width and height
+ * will be greater than 0. Asynchronous image loading (particularly
+ * when downloading from a server) can dramatically improve
+ * performance.
+ */
+quil.core.request_image = (function quil$core$request_image(filename){
+return quil.sketch.current_applet.call(null).requestImage(cljs.core.str.cljs$core$IFn$_invoke$arity$1(filename));
+});
+/**
+ * Replaces the current matrix with the identity matrix. The
+ * equivalent function in OpenGL is glLoadIdentity()
+ */
+quil.core.reset_matrix = (function quil$core$reset_matrix(){
+return quil.core.current_graphics.call(null).resetMatrix();
+});
+/**
+ * Resize the image to a new width and height.
+ * To make the image scale proportionally, use 0 as the value for the wide or
+ * high parameter. For instance, to make the width of an image 150 pixels,
+ * and change the height using the same proportion, use resize(150, 0).
+ *
+ * Even though a PGraphics is technically a PImage, it is not possible
+ * to rescale the image data found in a PGraphics.
+ * (It's simply not possible to do this consistently across renderers:
+ * technically infeasible with P3D, or what would it even do with PDF?)
+ * If you want to resize PGraphics content, first get a copy of its image data
+ * using the get() method, and call resize() on the PImage that is returned.
+ */
+quil.core.resize = (function quil$core$resize(img,w,h){
+return img.resize(w,h);
+});
+/**
+ * Rotates a shape the amount specified by the angle parameter. Angles
+ * should be specified in radians (values from 0 to TWO-PI) or
+ * converted to radians with the radians function.
+ *
+ * Objects are always rotated around their relative position to the
+ * origin and positive numbers rotate objects in a clockwise
+ * direction. Transformations apply to everything that happens after
+ * and subsequent calls to the function accumulates the effect. For
+ * example, calling (rotate HALF-PI) and then (rotate HALF-PI) is the
+ * same as (rotate PI). All tranformations are reset when draw begins
+ * again.
+ *
+ * Technically, rotate multiplies the current transformation matrix by
+ * a rotation matrix. This function can be further controlled by the
+ * push-matrix and pop-matrix.
+ */
+quil.core.rotate = (function quil$core$rotate(var_args){
+var G__1472 = arguments.length;
+switch (G__1472) {
+case 1:
+return quil.core.rotate.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 4:
+return quil.core.rotate.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.rotate.cljs$core$IFn$_invoke$arity$1 = (function (angle){
+return quil.core.current_graphics.call(null).rotate(angle);
+});
+
+quil.core.rotate.cljs$core$IFn$_invoke$arity$4 = (function (angle,vx,vy,vz){
+return quil.core.current_graphics.call(null).rotate(angle,vx,vy,vz);
+});
+
+quil.core.rotate.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Rotates a shape around the x-axis the amount specified by the angle
+ * parameter. Angles should be specified in radians (values from 0 to
+ * (* PI 2)) or converted to radians with the radians function. Objects
+ * are always rotated around their relative position to the origin and
+ * positive numbers rotate objects in a counterclockwise
+ * direction. Transformations apply to everything that happens after
+ * and subsequent calls to the function accumulates the effect. For
+ * example, calling (rotate-x HALF-PI) and then (rotate-x HALF-PI) is
+ * the same as (rotate-x PI). If rotate-x is called within the draw fn,
+ * the transformation is reset when the loop begins again. This
+ * function requires either the :p3d or :opengl renderer.
+ */
+quil.core.rotate_x = (function quil$core$rotate_x(angle){
+return quil.core.current_graphics.call(null).rotateX(angle);
+});
+/**
+ * Rotates a shape around the y-axis the amount specified by the angle
+ * parameter. Angles should be specified in radians (values from 0
+ * to (* PI 2)) or converted to radians with the radians function.
+ * Objects are always rotated around their relative position to the
+ * origin and positive numbers rotate objects in a counterclockwise
+ * direction. Transformations apply to everything that happens after
+ * and subsequent calls to the function accumulates the effect. For
+ * example, calling (rotate-y HALF-PI) and then (rotate-y HALF-PI) is
+ * the same as (rotate-y PI). If rotate-y is called within the draw fn,
+ * the transformation is reset when the loop begins again. This
+ * function requires either the :p3d or :opengl renderer.
+ */
+quil.core.rotate_y = (function quil$core$rotate_y(angle){
+return quil.core.current_graphics.call(null).rotateY(angle);
+});
+/**
+ * Rotates a shape around the z-axis the amount specified by the angle
+ * parameter. Angles should be specified in radians (values from 0
+ * to (* PI 2)) or converted to radians with the radians function.
+ * Objects are always rotated around their relative position to the
+ * origin and positive numbers rotate objects in a counterclockwise
+ * direction. Transformations apply to everything that happens after
+ * and subsequent calls to the function accumulates the effect. For
+ * example, calling (rotate-z HALF-PI) and then (rotate-z HALF-PI) is
+ * the same as (rotate-z PI). If rotate-y is called within the draw fn,
+ * the transformation is reset when the loop begins again. This
+ * function requires either the :p3d or :opengl renderer.
+ */
+quil.core.rotate_z = (function quil$core$rotate_z(angle){
+return quil.core.current_graphics.call(null).rotateZ(angle);
+});
+/**
+ * Calculates the integer closest to the value parameter. For example,
+ * (round 9.2) returns the value 9.
+ */
+quil.core.round = (function quil$core$round(val){
+return quil.sketch.current_applet.call(null).round(val);
+});
+/**
+ * Extracts the saturation value from a color.
+ */
+quil.core.saturation = (function quil$core$saturation(c){
+return quil.core.current_graphics.call(null).saturation(cljs.core.unchecked_int.call(null,c));
+});
+/**
+ * Saves an image from the display window. Images are saved in TIFF,
+ * TARGA, JPEG, and PNG format depending on the extension within the
+ * filename parameter. For example, image.tif will have a TIFF image
+ * and image.png will save a PNG image. If no extension is included in
+ * the filename, the image will save in TIFF format and .tif will be
+ * added to the name. All images saved from the main drawing window
+ * will be opaque. To save images without a background, use
+ * create-graphics.
+ */
+quil.core.save = (function quil$core$save(filename){
+return quil.core.current_graphics.call(null).save(cljs.core.str.cljs$core$IFn$_invoke$arity$1(filename));
+});
+/**
+ * Saves an image identical to the current display window as a
+ * file. May be called multple times - each file saved will have a
+ * unique name. Name and image formate may be modified by passing a
+ * string parameter of the form "foo-####.ext" where foo- can be any
+ * arbitrary string, #### will be replaced with the current frame id
+ * and .ext is one of .tiff, .targa, .png, .jpeg or .jpg
+ *
+ * Examples:
+ * (save-frame)
+ * (save-frame "pretty-pic-####.jpg")
+ */
+quil.core.save_frame = (function quil$core$save_frame(var_args){
+var G__1475 = arguments.length;
+switch (G__1475) {
+case 0:
+return quil.core.save_frame.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.save_frame.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.save_frame.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.sketch.current_applet.call(null).saveFrame();
+});
+
+quil.core.save_frame.cljs$core$IFn$_invoke$arity$1 = (function (name){
+return quil.sketch.current_applet.call(null).saveFrame(cljs.core.str.cljs$core$IFn$_invoke$arity$1(name));
+});
+
+quil.core.save_frame.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Increases or decreases the size of a shape by expanding and
+ * contracting vertices. Objects always scale from their relative
+ * origin to the coordinate system. Scale values are specified as
+ * decimal percentages. For example, the function call (scale 2)
+ * increases the dimension of a shape by 200%. Transformations apply to
+ * everything that happens after and subsequent calls to the function
+ * multiply the effect. For example, calling (scale 2) and then
+ * (scale 1.5) is the same as (scale 3). If scale is called within
+ * draw, the transformation is reset when the loop begins again. Using
+ * this fuction with the z parameter requires specfying :p3d or :opengl
+ * as the renderer. This function can be further controlled by
+ * push-matrix and pop-matrix.
+ */
+quil.core.scale = (function quil$core$scale(var_args){
+var G__1478 = arguments.length;
+switch (G__1478) {
+case 1:
+return quil.core.scale.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.scale.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.scale.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.scale.cljs$core$IFn$_invoke$arity$1 = (function (s){
+return quil.core.current_graphics.call(null).scale(s);
+});
+
+quil.core.scale.cljs$core$IFn$_invoke$arity$2 = (function (sx,sy){
+return quil.core.current_graphics.call(null).scale(sx,sy);
+});
+
+quil.core.scale.cljs$core$IFn$_invoke$arity$3 = (function (sx,sy,sz){
+return quil.core.current_graphics.call(null).scale(sx,sy,sz);
+});
+
+quil.core.scale.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Takes a three-dimensional x, y, z position and returns the x value
+ * for where it will appear on a (two-dimensional) screen, once
+ * affected by translate, scale or any other transformations
+ */
+quil.core.screen_x = (function quil$core$screen_x(var_args){
+var G__1481 = arguments.length;
+switch (G__1481) {
+case 2:
+return quil.core.screen_x.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.screen_x.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.screen_x.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.current_graphics.call(null).screenX(x,y);
+});
+
+quil.core.screen_x.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).screenX(x,y,z);
+});
+
+quil.core.screen_x.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Takes a three-dimensional x, y, z position and returns the y value
+ * for where it will appear on a (two-dimensional) screen, once
+ * affected by translate, scale or any other transformations
+ */
+quil.core.screen_y = (function quil$core$screen_y(var_args){
+var G__1484 = arguments.length;
+switch (G__1484) {
+case 2:
+return quil.core.screen_y.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.screen_y.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.screen_y.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.current_graphics.call(null).screenY(x,y);
+});
+
+quil.core.screen_y.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).screenY(x,y,z);
+});
+
+quil.core.screen_y.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Given an x, y, z coordinate, returns its z value.
+ * This value can be used to determine if an x, y, z coordinate is in
+ * front or in back of another (x, y, z) coordinate. The units are
+ * based on how the zbuffer is set up, and don't relate to anything
+ * 'real'. They're only useful for in comparison to another value
+ * obtained from screen-z, or directly out of the zbuffer
+ */
+quil.core.screen_z = (function quil$core$screen_z(x,y,z){
+return quil.core.current_graphics.call(null).screenZ(x,y,z);
+});
+/**
+ * Returns the current second as a value from 0 - 59.
+ */
+quil.core.seconds = (function quil$core$seconds(){
+return quil.sketch.current_applet.call(null).second();
+});
+/**
+ * Changes the color of any pixel in the display window. The x and y
+ * parameters specify the pixel to change and the color parameter
+ * specifies the color value. The color parameter is affected by the
+ * current color mode (the default is RGB values from 0 to 255).
+ *
+ * Setting the color of a single pixel with (set x, y) is easy, but not
+ * as fast as putting the data directly into pixels[].
+ *
+ * This function ignores imageMode().
+ *
+ * Due to what appears to be a bug in Apple's Java implementation, the
+ * point() and set() methods are extremely slow in some circumstances
+ * when used with the default renderer. Using :p2d or :p3d will fix the
+ * problem. Grouping many calls to point or set-pixel together can also
+ * help. (Bug 1094)
+ */
+quil.core.set_pixel = (function quil$core$set_pixel(var_args){
+var G__1487 = arguments.length;
+switch (G__1487) {
+case 3:
+return quil.core.set_pixel.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.set_pixel.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.set_pixel.cljs$core$IFn$_invoke$arity$3 = (function (x,y,c){
+return quil.core.set_pixel.call(null,quil.core.current_graphics.call(null),x,y,c);
+});
+
+quil.core.set_pixel.cljs$core$IFn$_invoke$arity$4 = (function (img,x,y,c){
+return img.set((x | (0)),(y | (0)),(c | (0)));
+});
+
+quil.core.set_pixel.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Writes an image directly into the display window. The x and y
+ * parameters define the coordinates for the upper-left corner of the
+ * image.
+ */
+quil.core.set_image = (function quil$core$set_image(x,y,src){
+return quil.core.current_graphics.call(null).set((x | (0)),(y | (0)),src);
+});
+/**
+ * Displays shapes to the screen. The shapes must have been loaded
+ * with load-shape. Processing currently works with SVG shapes
+ * only. The sh parameter specifies the shape to display and the x and
+ * y parameters define the location of the shape from its upper-left
+ * corner. The shape is displayed at its original size unless the width
+ * and height parameters specify a different size. The shape-mode
+ * fn changes the way the parameters work. A call to
+ * (shape-mode :corners), for example, will change the width and height
+ * parameters to define the x and y values of the opposite corner of
+ * the shape.
+ *
+ * Note complex shapes may draw awkwardly with the renderers :p2d, :p3d, and
+ * :opengl. Those renderers do not yet support shapes that have holes
+ * or complicated breaks.
+ */
+quil.core.shape = (function quil$core$shape(var_args){
+var G__1490 = arguments.length;
+switch (G__1490) {
+case 1:
+return quil.core.shape.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.shape.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 5:
+return quil.core.shape.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.shape.cljs$core$IFn$_invoke$arity$1 = (function (sh){
+return quil.core.current_graphics.call(null).shape(sh);
+});
+
+quil.core.shape.cljs$core$IFn$_invoke$arity$3 = (function (sh,x,y){
+return quil.core.current_graphics.call(null).shape(sh,x,y);
+});
+
+quil.core.shape.cljs$core$IFn$_invoke$arity$5 = (function (sh,x,y,width,height){
+return quil.core.current_graphics.call(null).shape(sh,x,y,width,height);
+});
+
+quil.core.shape.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Shears a shape around the x-axis the amount specified by the angle
+ * parameter. Angles should be specified in radians (values from 0 to
+ * PI*2) or converted to radians with the radians() function. Objects
+ * are always sheared around their relative position to the origin and
+ * positive numbers shear objects in a clockwise direction.
+ * Transformations apply to everything that happens after and
+ * subsequent calls to the function accumulates the effect. For
+ * example, calling (shear-x (/ PI 2)) and then (shear-x (/ PI 2)) is
+ * the same as (shear-x PI). If shear-x is called within the draw fn,
+ * the transformation is reset when the loop begins again. This
+ * function works in P2D or JAVA2D mode.
+ *
+ * Technically, shear-x multiplies the current transformation matrix
+ * by a rotation matrix. This function can be further controlled by the
+ * push-matrix and pop-matrix fns.
+ */
+quil.core.shear_x = (function quil$core$shear_x(angle){
+return quil.core.current_graphics.call(null).shearX(angle);
+});
+/**
+ * Shears a shape around the y-axis the amount specified by the angle
+ * parameter. Angles should be specified in radians (values from 0 to
+ * PI*2) or converted to radians with the radians() function. Objects
+ * are always sheared around their relative position to the origin and
+ * positive numbers shear objects in a clockwise direction.
+ * Transformations apply to everything that happens after and
+ * subsequent calls to the function accumulates the effect. For
+ * example, calling (shear-y (/ PI 2)) and then (shear-y (/ PI 2)) is
+ * the same as (shear-y PI). If shear-y is called within the draw fn,
+ * the transformation is reset when the loop begins again. This
+ * function works in P2D or JAVA2D mode.
+ *
+ * Technically, shear-y multiplies the current transformation matrix
+ * by a rotation matrix. This function can be further controlled by the
+ * push-matrix and pop-matrix fns.
+ */
+quil.core.shear_y = (function quil$core$shear_y(angle){
+return quil.core.current_graphics.call(null).shearY(angle);
+});
+/**
+ * Modifies the location from which shapes draw. Available modes are
+ * :corner, :corners and :center. Default is :corner.
+ *
+ * :corner - specifies the location to be the upper left corner of the
+ * shape and uses the third and fourth parameters of shape
+ * to specify the width and height.
+ *
+ * :corners - uses the first and second parameters of shape to set
+ * the location of one corner and uses the third and fourth
+ * parameters to set the opposite corner.
+ *
+ * :center - draws the shape from its center point and uses the third
+ * and forth parameters of shape to specify the width and
+ * height.
+ */
+quil.core.shape_mode = (function quil$core$shape_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.p_shape_modes);
+return quil.core.current_graphics.call(null).shapeMode((mode__$1 | (0)));
+});
+/**
+ * Sets the amount of gloss in the surface of shapes. Used in
+ * combination with ambient, specular, and emissive in setting
+ * the material properties of shapes.
+ */
+quil.core.shininess = (function quil$core$shininess(shine){
+return quil.core.current_graphics.call(null).shininess(shine);
+});
+/**
+ * Calculates the sine of an angle. This function expects the values
+ * of the angle parameter to be provided in radians (values from 0 to
+ * 6.28). A float within the range -1 to 1 is returned.
+ */
+quil.core.sin = (function quil$core$sin(angle){
+return quil.sketch.current_applet.call(null).sin(angle);
+});
+/**
+ * Draws all geometry with smooth (anti-aliased) edges. This will slow
+ * down the frame rate of the application, but will enhance the visual
+ * refinement.
+ *
+ * Must be called inside :settings handler.
+ *
+ * The level parameter (int) increases the level of smoothness with the
+ * P2D and P3D renderers. This is the level of over sampling applied to
+ * the graphics buffer. The value '2' will double the rendering size
+ * before scaling it down to the display size. This is called '2x
+ * anti-aliasing.' The value 4 is used for 4x anti-aliasing and 8 is
+ * specified for 8x anti-aliasing. If level is set to 0, it will disable
+ * all smoothing; it's the equivalent of the function noSmooth().
+ * The maximum anti-aliasing level is determined by the hardware of the
+ * machine that is running the software.
+ *
+ * Note that smooth will also improve image quality of resized images.
+ */
+quil.core.smooth = (function quil$core$smooth(var_args){
+var G__1493 = arguments.length;
+switch (G__1493) {
+case 0:
+return quil.core.smooth.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.smooth.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.smooth.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.current_graphics.call(null).smooth();
+});
+
+quil.core.smooth.cljs$core$IFn$_invoke$arity$1 = (function (level){
+return quil.core.current_graphics.call(null).smooth((level | (0)));
+});
+
+quil.core.smooth.cljs$lang$maxFixedArity = 1;
+
+/**
+ * Sets the specular color of the materials used for shapes drawn to
+ * the screen, which sets the color of hightlights. Specular refers to
+ * light which bounces off a surface in a perferred direction (rather
+ * than bouncing in all directions like a diffuse light). Used in
+ * combination with emissive, ambient, and shininess in setting
+ * the material properties of shapes.
+ */
+quil.core.specular = (function quil$core$specular(var_args){
+var G__1496 = arguments.length;
+switch (G__1496) {
+case 1:
+return quil.core.specular.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 3:
+return quil.core.specular.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.specular.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).specular(gray);
+});
+
+quil.core.specular.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).specular(x,y,z);
+});
+
+quil.core.specular.cljs$lang$maxFixedArity = 3;
+
+/**
+ * Generates a hollow ball made from tessellated triangles.
+ */
+quil.core.sphere = (function quil$core$sphere(radius){
+return quil.core.current_graphics.call(null).sphere(radius);
+});
+/**
+ * Controls the detail used to render a sphere by adjusting the number
+ * of vertices of the sphere mesh. The default resolution is 30, which
+ * creates a fairly detailed sphere definition with vertices every
+ * 360/30 = 12 degrees. If you're going to render a great number of
+ * spheres per frame, it is advised to reduce the level of detail using
+ * this function. The setting stays active until sphere-detail is
+ * called again with a new parameter and so should not be called prior
+ * to every sphere statement, unless you wish to render spheres with
+ * different settings, e.g. using less detail for smaller spheres or
+ * ones further away from the camera. To controla the detail of the
+ * horizontal and vertical resolution independently, use the version of
+ * the functions with two parameters.
+ */
+quil.core.sphere_detail = (function quil$core$sphere_detail(var_args){
+var G__1499 = arguments.length;
+switch (G__1499) {
+case 1:
+return quil.core.sphere_detail.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.sphere_detail.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.sphere_detail.cljs$core$IFn$_invoke$arity$1 = (function (res){
+return quil.core.current_graphics.call(null).sphereDetail((res | (0)));
+});
+
+quil.core.sphere_detail.cljs$core$IFn$_invoke$arity$2 = (function (ures,vres){
+return quil.core.current_graphics.call(null).sphereDetail((ures | (0)),(vres | (0)));
+});
+
+quil.core.sphere_detail.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Adds a spot light. Lights need to be included in the draw to
+ * remain persistent in a looping program. Placing them in the setup
+ * of a looping program will cause them to only have an effect the
+ * first time through the loop. The affect of the r, g, and b
+ * parameters is determined by the current color mode. The x, y, and z
+ * parameters specify the position of the light and nx, ny, nz specify
+ * the direction or light. The angle parameter affects angle of the
+ * spotlight cone.
+ */
+quil.core.spot_light = (function quil$core$spot_light(var_args){
+var G__1502 = arguments.length;
+switch (G__1502) {
+case 11:
+return quil.core.spot_light.cljs$core$IFn$_invoke$arity$11((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]),(arguments[(6)]),(arguments[(7)]),(arguments[(8)]),(arguments[(9)]),(arguments[(10)]));
+
+break;
+case 5:
+return quil.core.spot_light.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.spot_light.cljs$core$IFn$_invoke$arity$11 = (function (r,g,b,x,y,z,nx,ny,nz,angle,concentration){
+return quil.core.current_graphics.call(null).spotLight(r,g,b,x,y,z,nx,ny,nz,angle,concentration);
+});
+
+quil.core.spot_light.cljs$core$IFn$_invoke$arity$5 = (function (p__1503,p__1504,p__1505,angle,concentration){
+var vec__1506 = p__1503;
+var r = cljs.core.nth.call(null,vec__1506,(0),null);
+var g = cljs.core.nth.call(null,vec__1506,(1),null);
+var b = cljs.core.nth.call(null,vec__1506,(2),null);
+var vec__1509 = p__1504;
+var x = cljs.core.nth.call(null,vec__1509,(0),null);
+var y = cljs.core.nth.call(null,vec__1509,(1),null);
+var z = cljs.core.nth.call(null,vec__1509,(2),null);
+var vec__1512 = p__1505;
+var nx = cljs.core.nth.call(null,vec__1512,(0),null);
+var ny = cljs.core.nth.call(null,vec__1512,(1),null);
+var nz = cljs.core.nth.call(null,vec__1512,(2),null);
+return quil.core.current_graphics.call(null).spotLight(r,g,b,x,y,z,nx,ny,nz,angle,concentration);
+});
+
+quil.core.spot_light.cljs$lang$maxFixedArity = 11;
+
+/**
+ * Squares a number (multiplies a number by itself). The result is
+ * always a positive number, as multiplying two negative numbers always
+ * yields a positive result. For example, -1 * -1 = 1.
+ */
+quil.core.sq = (function quil$core$sq(a){
+return quil.sketch.current_applet.call(null).sq(a);
+});
+/**
+ * Calculates the square root of a number. The square root of a number
+ * is always positive, even though there may be a valid negative
+ * root. The square root s of number a is such that (= a (* s s)) . It
+ * is the opposite of squaring.
+ */
+quil.core.sqrt = (function quil$core$sqrt(a){
+return quil.sketch.current_applet.call(null).sqrt(a);
+});
+/**
+ * Causes Processing to continuously execute the code within
+ * draw. If no-loop is called, the code in draw stops executing.
+ */
+quil.core.start_loop = (function quil$core$start_loop(){
+return quil.sketch.current_applet.call(null).loop();
+});
+/**
+ * Sets the color used to draw lines and borders around
+ * shapes. Converts all args to floats
+ */
+quil.core.stroke_float = (function quil$core$stroke_float(var_args){
+var G__1517 = arguments.length;
+switch (G__1517) {
+case 1:
+return quil.core.stroke_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.stroke_float.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.stroke_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.stroke_float.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.stroke_float.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).stroke(gray);
+});
+
+quil.core.stroke_float.cljs$core$IFn$_invoke$arity$2 = (function (gray,alpha){
+return quil.core.current_graphics.call(null).stroke(gray,alpha);
+});
+
+quil.core.stroke_float.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).stroke(x,y,z);
+});
+
+quil.core.stroke_float.cljs$core$IFn$_invoke$arity$4 = (function (x,y,z,a){
+return quil.core.current_graphics.call(null).stroke(x,y,z,a);
+});
+
+quil.core.stroke_float.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Sets the color used to draw lines and borders around
+ * shapes. Converts rgb to int and alpha to a float.
+ */
+quil.core.stroke_int = (function quil$core$stroke_int(var_args){
+var G__1520 = arguments.length;
+switch (G__1520) {
+case 1:
+return quil.core.stroke_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.stroke_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.stroke_int.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.current_graphics.call(null).stroke(cljs.core.unchecked_int.call(null,rgb));
+});
+
+quil.core.stroke_int.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.current_graphics.call(null).stroke(cljs.core.unchecked_int.call(null,rgb),alpha);
+});
+
+quil.core.stroke_int.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the color used to draw lines and borders around shapes. This
+ * color is either specified in terms of the RGB or HSB color depending
+ * on the current color-mode (the default color space is RGB, with
+ * each value in the range from 0 to 255).
+ */
+quil.core.stroke = (function quil$core$stroke(var_args){
+var G__1523 = arguments.length;
+switch (G__1523) {
+case 1:
+return quil.core.stroke.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.stroke.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.stroke.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.stroke.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.stroke.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.stroke_float.call(null,rgb);
+});
+
+quil.core.stroke.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.stroke_float.call(null,rgb,alpha);
+});
+
+quil.core.stroke.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.stroke_float.call(null,x,y,z);
+});
+
+quil.core.stroke.cljs$core$IFn$_invoke$arity$4 = (function (x,y,z,a){
+return quil.core.stroke_float.call(null,x,y,z,a);
+});
+
+quil.core.stroke.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Sets the style for rendering line endings. These ends are either
+ * squared, extended, or rounded and specified with the corresponding
+ * parameters :square, :project, and :round. The default cap is :round.
+ */
+quil.core.stroke_cap = (function quil$core$stroke_cap(cap_mode){
+var cap_mode__$1 = quil.util.resolve_constant_key.call(null,cap_mode,quil.core.stroke_cap_modes);
+return quil.core.current_graphics.call(null).strokeCap(cljs.core.str.cljs$core$IFn$_invoke$arity$1(cap_mode__$1));
+});
+/**
+ * Sets the style of the joints which connect line
+ * segments. These joints are either mitered, beveled, or rounded and
+ * specified with the corresponding parameters :miter, :bevel, and
+ * :round. The default joint is :miter.
+ *
+ * This function is not available with the :p2d, :p3d, or :opengl
+ * renderers.
+ */
+quil.core.stroke_join = (function quil$core$stroke_join(join_mode){
+var join_mode__$1 = quil.util.resolve_constant_key.call(null,join_mode,quil.core.stroke_join_modes);
+return quil.core.current_graphics.call(null).strokeJoin(cljs.core.str.cljs$core$IFn$_invoke$arity$1(join_mode__$1));
+});
+/**
+ * Sets the width of the stroke used for lines, points, and the border
+ * around shapes. All widths are set in units of pixels.
+ */
+quil.core.stroke_weight = (function quil$core$stroke_weight(weight){
+return quil.core.current_graphics.call(null).strokeWeight(weight);
+});
+/**
+ * Calculates the ratio of the sine and cosine of an angle. This
+ * function expects the values of the angle parameter to be provided in
+ * radians (values from 0 to PI*2). Values are returned in the range
+ * infinity to -infinity.
+ */
+quil.core.tan = (function quil$core$tan(angle){
+return quil.sketch.current_applet.call(null).tan(angle);
+});
+/**
+ * Returns the target framerate specified with the fn frame-rate
+ */
+quil.core.target_frame_rate = (function quil$core$target_frame_rate(){
+return cljs.core.deref.call(null,quil.sketch.current_applet.call(null).target_frame_rate);
+});
+/**
+ * Returns whether fill is disabled for current graphics.
+ */
+quil.core.no_fill_QMARK_ = (function quil$core$no_fill_QMARK_(graphics){
+return (graphics[quil.core.no_fill_prop]) === true;
+});
+/**
+ * Draws a char to the screen in the specified position. See text fn
+ * for more details.
+ */
+quil.core.text_char = (function quil$core$text_char(var_args){
+var G__1526 = arguments.length;
+switch (G__1526) {
+case 3:
+return quil.core.text_char.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.text_char.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.text_char.cljs$core$IFn$_invoke$arity$3 = (function (c,x,y){
+if(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(cljs.core.char$.call(null,c),x,y);
+}
+});
+
+quil.core.text_char.cljs$core$IFn$_invoke$arity$4 = (function (c,x,y,z){
+if(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(cljs.core.char$.call(null,c),x,y,z);
+}
+});
+
+quil.core.text_char.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Draws a number to the screen in the specified position. See text fn
+ * for more details.
+ */
+quil.core.text_num = (function quil$core$text_num(var_args){
+var G__1529 = arguments.length;
+switch (G__1529) {
+case 3:
+return quil.core.text_num.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.text_num.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.text_num.cljs$core$IFn$_invoke$arity$3 = (function (num,x,y){
+if(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(num,x,y);
+}
+});
+
+quil.core.text_num.cljs$core$IFn$_invoke$arity$4 = (function (num,x,y,z){
+if(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(num,x,y,z);
+}
+});
+
+quil.core.text_num.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Draws text to the screen in the position specified by the x and y
+ * parameters and the optional z parameter. A default font will be used
+ * unless a font is set with the text-font fn. Change the color of the
+ * text with the fill fn. The text displays in relation to the
+ * text-align fn, which gives the option to draw to the left, right, and
+ * center of the coordinates.
+ *
+ * The x1, y1, x2 and y2 parameters define a
+ * rectangular area to display within and may only be used with string
+ * data. For text drawn inside a rectangle, the coordinates are
+ * interpreted based on the current rect-mode setting.
+ */
+quil.core.text = (function quil$core$text(var_args){
+var G__1532 = arguments.length;
+switch (G__1532) {
+case 3:
+return quil.core.text.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.text.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return quil.core.text.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.text.cljs$core$IFn$_invoke$arity$3 = (function (s,x,y){
+if(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(s,x,y);
+}
+});
+
+quil.core.text.cljs$core$IFn$_invoke$arity$4 = (function (s,x,y,z){
+if(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(s,x,y,z);
+}
+});
+
+quil.core.text.cljs$core$IFn$_invoke$arity$5 = (function (s,x1,y1,x2,y2){
+if(quil.core.no_fill_QMARK_.call(null,quil.core.current_graphics.call(null))){
+return null;
+} else {
+return quil.core.current_graphics.call(null).text(s,x1,y1,x2,y2);
+}
+});
+
+quil.core.text.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Sets the current alignment for drawing text. Available modes are:
+ *
+ * horizontal - :left, :center, and :right
+ * vertical - :top, :bottom, :center, and :baseline
+ *
+ * An optional second parameter specifies the vertical alignment
+ * mode. :baseline is the default. The :top and :center parameters are
+ * straightforward. The :bottom parameter offsets the line based on the
+ * current text-descent. For multiple lines, the final line will be
+ * aligned to the bottom, with the previous lines appearing above it.
+ *
+ * When using text with width and height parameters, :baseline is
+ * ignored, and treated as :top. (Otherwise, text would by default draw
+ * outside the box, since :baseline is the default setting. :baseline is
+ * not a useful drawing mode for text drawn in a rectangle.)
+ *
+ * The vertical alignment is based on the value of text-ascent, which
+ * many fonts do not specify correctly. It may be necessary to use a
+ * hack and offset by a few pixels by hand so that the offset looks
+ * correct. To do this as less of a hack, use some percentage of
+ * text-ascent or text-descent so that the hack works even if you
+ * change the size of the font.
+ */
+quil.core.text_align = (function quil$core$text_align(var_args){
+var G__1535 = arguments.length;
+switch (G__1535) {
+case 1:
+return quil.core.text_align.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.text_align.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.text_align.cljs$core$IFn$_invoke$arity$1 = (function (align){
+var align__$1 = quil.util.resolve_constant_key.call(null,align,quil.core.horizontal_alignment_modes);
+return quil.core.current_graphics.call(null).textAlign((align__$1 | (0)));
+});
+
+quil.core.text_align.cljs$core$IFn$_invoke$arity$2 = (function (align_x,align_y){
+var align_x__$1 = quil.util.resolve_constant_key.call(null,align_x,quil.core.horizontal_alignment_modes);
+var align_y__$1 = quil.util.resolve_constant_key.call(null,align_y,quil.core.vertical_alignment_modes);
+return quil.core.current_graphics.call(null).textAlign((align_x__$1 | (0)),(align_y__$1 | (0)));
+});
+
+quil.core.text_align.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Returns the ascent of the current font at its current size. This
+ * information is useful for determining the height of the font above
+ * the baseline. For example, adding the text-ascent and text-descent
+ * values will give you the total height of the line.
+ */
+quil.core.text_ascent = (function quil$core$text_ascent(){
+return quil.core.current_graphics.call(null).textAscent();
+});
+/**
+ * Returns descent of the current font at its current size. This
+ * information is useful for determining the height of the font below
+ * the baseline. For example, adding the text-ascent and text-descent
+ * values will give you the total height of the line.
+ */
+quil.core.text_descent = (function quil$core$text_descent(){
+return quil.core.current_graphics.call(null).textDescent();
+});
+/**
+ * Sets the current font that will be drawn with the text
+ * function. Fonts must be loaded with load-font before it can be
+ * used. This font will be used in all subsequent calls to the text
+ * function. If no size parameter is input, the font will appear at its
+ * original size until it is changed with text-size.
+ *
+ * Because fonts are usually bitmaped, you should create fonts at the
+ * sizes that will be used most commonly. Using textFont without the
+ * size parameter will result in the cleanest-looking text.
+ *
+ * With the default (JAVA2D) and PDF renderers, it's also possible to
+ * enable the use of native fonts via the command
+ * (hint :enable-native-fonts). This will produce vector text in JAVA2D
+ * sketches and PDF output in cases where the vector data is available:
+ * when the font is still installed, or the font is created via the
+ * create-font fn
+ */
+quil.core.text_font = (function quil$core$text_font(var_args){
+var G__1538 = arguments.length;
+switch (G__1538) {
+case 1:
+return quil.core.text_font.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.text_font.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.text_font.cljs$core$IFn$_invoke$arity$1 = (function (font){
+return quil.core.current_graphics.call(null).textFont(font);
+});
+
+quil.core.text_font.cljs$core$IFn$_invoke$arity$2 = (function (font,size){
+return quil.core.current_graphics.call(null).textFont(font,(size | (0)));
+});
+
+quil.core.text_font.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the spacing between lines of text in units of pixels. This
+ * setting will be used in all subsequent calls to the text function.
+ */
+quil.core.text_leading = (function quil$core$text_leading(leading){
+return quil.core.current_graphics.call(null).textLeading(leading);
+});
+/**
+ * Sets the way text draws to the screen - available modes
+ * are :model and :shape
+ *
+ * In the default configuration (the :model mode), it's possible to
+ * rotate, scale, and place letters in two and three dimensional space.
+ *
+ * The :shape mode draws text using the glyph outlines of individual
+ * characters rather than as textures. This mode is only supported with
+ * the PDF and OPENGL renderer settings. With the PDF renderer, you
+ * must specify the :shape text-mode before any other drawing occurs.
+ * If the outlines are not available, then :shape will be ignored and
+ * :model will be used instead.
+ *
+ * The :shape option in OPENGL mode can be combined with begin-raw to
+ * write vector-accurate text to 2D and 3D output files, for instance
+ * DXF or PDF. :shape is not currently optimized for OPENGL, so if
+ * recording shape data, use :model until you're ready to capture the
+ * geometry with begin-raw.
+ */
+quil.core.text_mode = (function quil$core$text_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.text_modes);
+return quil.core.current_graphics.call(null).textMode((mode__$1 | (0)));
+});
+/**
+ * Sets the current font size. This size will be used in all
+ * subsequent calls to the text fn. Font size is measured in
+ * units of pixels.
+ */
+quil.core.text_size = (function quil$core$text_size(size){
+return quil.core.current_graphics.call(null).textSize(size);
+});
+/**
+ * Sets a texture to be applied to vertex points. The texture fn must
+ * be called between begin-shape and end-shape and before any calls to
+ * vertex.
+ *
+ * When textures are in use, the fill color is ignored. Instead, use
+ * tint to specify the color of the texture as it is applied to the
+ * shape.
+ */
+quil.core.texture = (function quil$core$texture(img){
+return quil.core.current_graphics.call(null).texture(img);
+});
+/**
+ * Sets the coordinate space for texture mapping. There are two
+ * options, :image and :normal.
+ *
+ * :image refers to the actual coordinates of the image and :normal
+ * refers to a normalized space of values ranging from 0 to 1. The
+ * default mode is :image. In :image, if an image is 100 x 200 pixels,
+ * mapping the image onto the entire size of a quad would require the
+ * points (0,0) (0,100) (100,200) (0,200). The same mapping in
+ * NORMAL_SPACE is (0,0) (0,1) (1,1) (0,1).
+ */
+quil.core.texture_mode = (function quil$core$texture_mode(mode){
+var mode__$1 = quil.util.resolve_constant_key.call(null,mode,quil.core.texture_modes);
+return quil.core.current_graphics.call(null).textureMode((mode__$1 | (0)));
+});
+/**
+ * Calculates and returns the width of any text string.
+ */
+quil.core.text_width = (function quil$core$text_width(data){
+return quil.core.current_graphics.call(null).textWidth(data);
+});
+/**
+ * Sets the fill value for displaying images. Images can be tinted to
+ * specified colors or made transparent by setting the alpha.
+ *
+ * To make an image transparent, but not change it's color, use white
+ * as the tint color and specify an alpha value. For instance,
+ * tint(255, 128) will make an image 50% transparent (unless
+ * colorMode() has been used).
+ *
+ * The value for the parameter gray must be less than or equal to the
+ * current maximum value as specified by colorMode(). The default
+ * maximum value is 255.
+ *
+ * Also used to control the coloring of textures in 3D.
+ */
+quil.core.tint_float = (function quil$core$tint_float(var_args){
+var G__1541 = arguments.length;
+switch (G__1541) {
+case 1:
+return quil.core.tint_float.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.tint_float.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.tint_float.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.tint_float.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.tint_float.cljs$core$IFn$_invoke$arity$1 = (function (gray){
+return quil.core.current_graphics.call(null).tint(gray);
+});
+
+quil.core.tint_float.cljs$core$IFn$_invoke$arity$2 = (function (gray,alpha){
+return quil.core.current_graphics.call(null).tint(gray,alpha);
+});
+
+quil.core.tint_float.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.current_graphics.call(null).tint(r,g,b);
+});
+
+quil.core.tint_float.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.current_graphics.call(null).tint(g,g,b,a);
+});
+
+quil.core.tint_float.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Sets the fill value for displaying images. Images can be tinted to
+ * specified colors or made transparent by setting the alpha.
+ *
+ * To make an image transparent, but not change it's color, use white
+ * as the tint color and specify an alpha value. For instance,
+ * tint(255, 128) will make an image 50% transparent (unless
+ * colorMode() has been used).
+ *
+ * The value for the parameter gray must be less than or equal to the
+ * current maximum value as specified by colorMode(). The default
+ * maximum value is 255.
+ *
+ * Also used to control the coloring of textures in 3D.
+ */
+quil.core.tint_int = (function quil$core$tint_int(var_args){
+var G__1544 = arguments.length;
+switch (G__1544) {
+case 1:
+return quil.core.tint_int.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.tint_int.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.tint_int.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.current_graphics.call(null).tint(cljs.core.unchecked_int.call(null,rgb));
+});
+
+quil.core.tint_int.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.current_graphics.call(null).tint(cljs.core.unchecked_int.call(null,rgb),alpha);
+});
+
+quil.core.tint_int.cljs$lang$maxFixedArity = 2;
+
+/**
+ * Sets the fill value for displaying images. Images can be tinted to
+ * specified colors or made transparent by setting the alpha.
+ *
+ * To make an image transparent, but not change it's color, use white
+ * as the tint color and specify an alpha value. For instance,
+ * tint(255, 128) will make an image 50% transparent (unless
+ * colorMode() has been used).
+ *
+ * The value for the parameter gray must be less than or equal to the
+ * current maximum value as specified by colorMode(). The default
+ * maximum value is 255.
+ *
+ * Also used to control the coloring of textures in 3D.
+ */
+quil.core.tint = (function quil$core$tint(var_args){
+var G__1547 = arguments.length;
+switch (G__1547) {
+case 1:
+return quil.core.tint.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.tint.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.tint.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.tint.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.tint.cljs$core$IFn$_invoke$arity$1 = (function (rgb){
+return quil.core.current_graphics.call(null).tint(rgb);
+});
+
+quil.core.tint.cljs$core$IFn$_invoke$arity$2 = (function (rgb,alpha){
+return quil.core.current_graphics.call(null).tint(rgb,alpha);
+});
+
+quil.core.tint.cljs$core$IFn$_invoke$arity$3 = (function (r,g,b){
+return quil.core.tint_float.call(null,r,g,b);
+});
+
+quil.core.tint.cljs$core$IFn$_invoke$arity$4 = (function (r,g,b,a){
+return quil.core.tint_float.call(null,r,g,b,a);
+});
+
+quil.core.tint.cljs$lang$maxFixedArity = 4;
+
+/**
+ * Specifies an amount to displace objects within the display
+ * window. The x parameter specifies left/right translation, the y
+ * parameter specifies up/down translation, and the z parameter
+ * specifies translations toward/away from the screen. Transformations
+ * apply to everything that happens after and subsequent calls to the
+ * function accumulates the effect. For example, calling (translate 50
+ * 0) and then (translate 20, 0) is the same as (translate 70, 0). If
+ * translate is called within draw, the transformation is reset when
+ * the loop begins again. This function can be further controlled by
+ * the push-matrix and pop-matrix.
+ */
+quil.core.translate = (function quil$core$translate(var_args){
+var G__1550 = arguments.length;
+switch (G__1550) {
+case 1:
+return quil.core.translate.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.core.translate.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.translate.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.translate.cljs$core$IFn$_invoke$arity$1 = (function (v){
+return cljs.core.apply.call(null,quil.core.translate,v);
+});
+
+quil.core.translate.cljs$core$IFn$_invoke$arity$2 = (function (tx,ty){
+return quil.core.current_graphics.call(null).translate(tx,ty);
+});
+
+quil.core.translate.cljs$core$IFn$_invoke$arity$3 = (function (tx,ty,tz){
+return quil.core.current_graphics.call(null).translate(tx,ty,tz);
+});
+
+quil.core.translate.cljs$lang$maxFixedArity = 3;
+
+/**
+ * A triangle is a plane created by connecting three points. The first
+ * two arguments specify the first point, the middle two arguments
+ * specify the second point, and the last two arguments specify the
+ * third point.
+ */
+quil.core.triangle = (function quil$core$triangle(x1,y1,x2,y2,x3,y3){
+return quil.core.current_graphics.call(null).triangle(x1,y1,x2,y2,x3,y3);
+});
+/**
+ * Unpack a binary string to an integer. See binary for converting
+ * integers to strings.
+ */
+quil.core.unbinary = (function quil$core$unbinary(str_val){
+return quil.sketch.current_applet.call(null).unbinary(cljs.core.str.cljs$core$IFn$_invoke$arity$1(str_val));
+});
+/**
+ * Converts a String representation of a hexadecimal number to its
+ * equivalent integer value.
+ */
+quil.core.unhex = (function quil$core$unhex(hex_str){
+return quil.sketch.current_applet.call(null).unhex(cljs.core.str.cljs$core$IFn$_invoke$arity$1(hex_str));
+});
+/**
+ * Updates the display window or image with the data in the pixels array.
+ * Use in conjunction with (pixels). If you're only reading pixels from
+ * the array, there's no need to call update-pixels unless there are
+ * changes.
+ *
+ * Certain renderers may or may not seem to require pixels or
+ * update-pixels. However, the rule is that any time you want to
+ * manipulate the pixels array, you must first call pixels, and
+ * after changes have been made, call update-pixels. Even if the
+ * renderer may not seem to use this function in the current Processing
+ * release, this will always be subject to change.
+ */
+quil.core.update_pixels = (function quil$core$update_pixels(var_args){
+var G__1553 = arguments.length;
+switch (G__1553) {
+case 0:
+return quil.core.update_pixels.cljs$core$IFn$_invoke$arity$0();
+
+break;
+case 1:
+return quil.core.update_pixels.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.update_pixels.cljs$core$IFn$_invoke$arity$0 = (function (){
+return quil.core.update_pixels.call(null,quil.core.current_graphics.call(null));
+});
+
+quil.core.update_pixels.cljs$core$IFn$_invoke$arity$1 = (function (img){
+var temp__4657__auto___1555 = img.stored_pix_array;
+if(cljs.core.truth_(temp__4657__auto___1555)){
+var pix_array_1556 = temp__4657__auto___1555;
+img.pixels.set(pix_array_1556);
+
+img.stored_pix_array = null;
+} else {
+}
+
+return img.updatePixels();
+});
+
+quil.core.update_pixels.cljs$lang$maxFixedArity = 1;
+
+/**
+ * All shapes are constructed by connecting a series of
+ * vertices. vertex is used to specify the vertex coordinates for
+ * points, lines, triangles, quads, and polygons and is used
+ * exclusively within the begin-shape and end-shape fns.
+ *
+ * Drawing a vertex in 3D using the z parameter requires the :p3d or
+ * :opengl renderers to be used.
+ *
+ * This function is also used to map a texture onto the geometry. The
+ * texture fn declares the texture to apply to the geometry and the u
+ * and v coordinates set define the mapping of this texture to the
+ * form. By default, the coordinates used for u and v are specified in
+ * relation to the image's size in pixels, but this relation can be
+ * changed with texture-mode.
+ */
+quil.core.vertex = (function quil$core$vertex(var_args){
+var G__1558 = arguments.length;
+switch (G__1558) {
+case 2:
+return quil.core.vertex.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.core.vertex.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+case 4:
+return quil.core.vertex.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
+
+break;
+case 5:
+return quil.core.vertex.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.core.vertex.cljs$core$IFn$_invoke$arity$2 = (function (x,y){
+return quil.core.current_graphics.call(null).vertex(x,y);
+});
+
+quil.core.vertex.cljs$core$IFn$_invoke$arity$3 = (function (x,y,z){
+return quil.core.current_graphics.call(null).vertex(x,y,z);
+});
+
+quil.core.vertex.cljs$core$IFn$_invoke$arity$4 = (function (x,y,u,v){
+return quil.core.current_graphics.call(null).vertex(x,y,u,v);
+});
+
+quil.core.vertex.cljs$core$IFn$_invoke$arity$5 = (function (x,y,z,u,v){
+return quil.core.current_graphics.call(null).vertex(x,y,z,u,v);
+});
+
+quil.core.vertex.cljs$lang$maxFixedArity = 5;
+
+/**
+ * Returns the current year as an integer (2003, 2004, 2005, etc).
+ */
+quil.core.year = (function quil$core$year(){
+return quil.sketch.current_applet.call(null).year();
+});
+/**
+ * Width of the display window. The value of width is zero until size is
+ * called.
+ */
+quil.core.width = (function quil$core$width(){
+return quil.sketch.current_applet.call(null).width;
+});
+var ret__4684__auto___1565 = (function (){
+/**
+ * Temporarily set the fill color for the body of this macro.
+ * The code outside of with-fill form will have the previous fill color set.
+ *
+ * The fill color has to be in a vector!
+ * Example: (with-fill [255] ...)
+ * (with-fill [10 80 98] ...)
+ */
+quil.core.with_fill = (function quil$core$with_fill(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1566 = arguments.length;
+var i__4642__auto___1567 = (0);
+while(true){
+if((i__4642__auto___1567 < len__4641__auto___1566)){
+args__4647__auto__.push((arguments[i__4642__auto___1567]));
+
+var G__1568 = (i__4642__auto___1567 + (1));
+i__4642__auto___1567 = G__1568;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((3) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((3)),(0),null)):null);
+return quil.core.with_fill.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__4648__auto__);
+});
+
+quil.core.with_fill.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,fill_args,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null),null,(1),null)),(new cljs.core.List(null,cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"old-fill__1560__auto__","old-fill__1560__auto__",-175135463,null),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","current-fill","quil.core/current-fill",269663137,null),null,(1),null))))),null,(1),null)))))),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","apply","cljs.core/apply",1757277831,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol("quil.core","fill","quil.core/fill",814613078,null),null,(1),null)),(new cljs.core.List(null,fill_args,null,(1),null))))),null,(1),null)),body,(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","fill","quil.core/fill",814613078,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol(null,"old-fill__1560__auto__","old-fill__1560__auto__",-175135463,null),null,(1),null))))),null,(1),null)))));
+});
+
+quil.core.with_fill.cljs$lang$maxFixedArity = (3);
+
+/** @this {Function} */
+quil.core.with_fill.cljs$lang$applyTo = (function (seq1561){
+var G__1562 = cljs.core.first.call(null,seq1561);
+var seq1561__$1 = cljs.core.next.call(null,seq1561);
+var G__1563 = cljs.core.first.call(null,seq1561__$1);
+var seq1561__$2 = cljs.core.next.call(null,seq1561__$1);
+var G__1564 = cljs.core.first.call(null,seq1561__$2);
+var seq1561__$3 = cljs.core.next.call(null,seq1561__$2);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__1562,G__1563,G__1564,seq1561__$3);
+});
+
+return null;
+})()
+;
+quil.core.with_fill.cljs$lang$macro = true;
+
+var ret__4684__auto___1574 = (function (){
+/**
+ * Temporarily set the stroke color for the body of this macro.
+ * The code outside of with-stroke form will have the previous stroke color set.
+ *
+ * The stroke color has to be in a vector!
+ * Example: (with-stroke [255] ...)
+ * (with-stroke [10 80 98] ...)
+ */
+quil.core.with_stroke = (function quil$core$with_stroke(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1575 = arguments.length;
+var i__4642__auto___1576 = (0);
+while(true){
+if((i__4642__auto___1576 < len__4641__auto___1575)){
+args__4647__auto__.push((arguments[i__4642__auto___1576]));
+
+var G__1577 = (i__4642__auto___1576 + (1));
+i__4642__auto___1576 = G__1577;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((3) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((3)),(0),null)):null);
+return quil.core.with_stroke.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__4648__auto__);
+});
+
+quil.core.with_stroke.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,stroke_args,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null),null,(1),null)),(new cljs.core.List(null,cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"old-stroke__1569__auto__","old-stroke__1569__auto__",-1825235711,null),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","current-stroke","quil.core/current-stroke",-1148124489,null),null,(1),null))))),null,(1),null)))))),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","apply","cljs.core/apply",1757277831,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol("quil.core","stroke","quil.core/stroke",577473004,null),null,(1),null)),(new cljs.core.List(null,stroke_args,null,(1),null))))),null,(1),null)),body,(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","stroke","quil.core/stroke",577473004,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol(null,"old-stroke__1569__auto__","old-stroke__1569__auto__",-1825235711,null),null,(1),null))))),null,(1),null)))));
+});
+
+quil.core.with_stroke.cljs$lang$maxFixedArity = (3);
+
+/** @this {Function} */
+quil.core.with_stroke.cljs$lang$applyTo = (function (seq1570){
+var G__1571 = cljs.core.first.call(null,seq1570);
+var seq1570__$1 = cljs.core.next.call(null,seq1570);
+var G__1572 = cljs.core.first.call(null,seq1570__$1);
+var seq1570__$2 = cljs.core.next.call(null,seq1570__$1);
+var G__1573 = cljs.core.first.call(null,seq1570__$2);
+var seq1570__$3 = cljs.core.next.call(null,seq1570__$2);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__1571,G__1572,G__1573,seq1570__$3);
+});
+
+return null;
+})()
+;
+quil.core.with_stroke.cljs$lang$macro = true;
+
+var ret__4684__auto___1583 = (function (){
+/**
+ * Performs body with translation, restores current transformation on
+ * exit.
+ */
+quil.core.with_translation = (function quil$core$with_translation(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1584 = arguments.length;
+var i__4642__auto___1585 = (0);
+while(true){
+if((i__4642__auto___1585 < len__4641__auto___1584)){
+args__4647__auto__.push((arguments[i__4642__auto___1585]));
+
+var G__1586 = (i__4642__auto___1585 + (1));
+i__4642__auto___1585 = G__1586;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((3) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((3)),(0),null)):null);
+return quil.core.with_translation.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__4648__auto__);
+});
+
+quil.core.with_translation.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,translation_vector,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null),null,(1),null)),(new cljs.core.List(null,cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"tr__1578__auto__","tr__1578__auto__",-613961657,null),null,(1),null)),(new cljs.core.List(null,translation_vector,null,(1),null)))))),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","push-matrix","quil.core/push-matrix",1356326676,null),null,(1),null))))),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"try","try",-1273693247,null),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","translate","quil.core/translate",150889028,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol(null,"tr__1578__auto__","tr__1578__auto__",-613961657,null),null,(1),null))))),null,(1),null)),body,(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"finally","finally",-1065347064,null),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","pop-matrix","quil.core/pop-matrix",310892617,null),null,(1),null))))),null,(1),null))))),null,(1),null))))),null,(1),null)))));
+});
+
+quil.core.with_translation.cljs$lang$maxFixedArity = (3);
+
+/** @this {Function} */
+quil.core.with_translation.cljs$lang$applyTo = (function (seq1579){
+var G__1580 = cljs.core.first.call(null,seq1579);
+var seq1579__$1 = cljs.core.next.call(null,seq1579);
+var G__1581 = cljs.core.first.call(null,seq1579__$1);
+var seq1579__$2 = cljs.core.next.call(null,seq1579__$1);
+var G__1582 = cljs.core.first.call(null,seq1579__$2);
+var seq1579__$3 = cljs.core.next.call(null,seq1579__$2);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__1580,G__1581,G__1582,seq1579__$3);
+});
+
+return null;
+})()
+;
+quil.core.with_translation.cljs$lang$macro = true;
+
+var ret__4684__auto___1592 = (function (){
+/**
+ * Performs body with rotation, restores current transformation on exit.
+ * Accepts a vector [angle] or [angle x-axis y-axis z-axis].
+ *
+ * Example:
+ * (with-rotation [angle]
+ * (vertex 1 2))
+ */
+quil.core.with_rotation = (function quil$core$with_rotation(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1593 = arguments.length;
+var i__4642__auto___1594 = (0);
+while(true){
+if((i__4642__auto___1594 < len__4641__auto___1593)){
+args__4647__auto__.push((arguments[i__4642__auto___1594]));
+
+var G__1595 = (i__4642__auto___1594 + (1));
+i__4642__auto___1594 = G__1595;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((3) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((3)),(0),null)):null);
+return quil.core.with_rotation.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__4648__auto__);
+});
+
+quil.core.with_rotation.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,rotation,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null),null,(1),null)),(new cljs.core.List(null,cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"tr__1587__auto__","tr__1587__auto__",-1418251344,null),null,(1),null)),(new cljs.core.List(null,rotation,null,(1),null)))))),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","push-matrix","quil.core/push-matrix",1356326676,null),null,(1),null))))),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"try","try",-1273693247,null),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","apply","cljs.core/apply",1757277831,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol("quil.core","rotate","quil.core/rotate",-1944995048,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol(null,"tr__1587__auto__","tr__1587__auto__",-1418251344,null),null,(1),null))))),null,(1),null)),body,(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"finally","finally",-1065347064,null),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","pop-matrix","quil.core/pop-matrix",310892617,null),null,(1),null))))),null,(1),null))))),null,(1),null))))),null,(1),null)))));
+});
+
+quil.core.with_rotation.cljs$lang$maxFixedArity = (3);
+
+/** @this {Function} */
+quil.core.with_rotation.cljs$lang$applyTo = (function (seq1588){
+var G__1589 = cljs.core.first.call(null,seq1588);
+var seq1588__$1 = cljs.core.next.call(null,seq1588);
+var G__1590 = cljs.core.first.call(null,seq1588__$1);
+var seq1588__$2 = cljs.core.next.call(null,seq1588__$1);
+var G__1591 = cljs.core.first.call(null,seq1588__$2);
+var seq1588__$3 = cljs.core.next.call(null,seq1588__$2);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__1589,G__1590,G__1591,seq1588__$3);
+});
+
+return null;
+})()
+;
+quil.core.with_rotation.cljs$lang$macro = true;
+
+var ret__4684__auto___1601 = (function (){
+/**
+ * All subsequent calls of any drawing function will draw on given
+ * graphics. 'with-graphics' cannot be nested (you can draw simultaneously
+ * only on 1 graphics)
+ */
+quil.core.with_graphics = (function quil$core$with_graphics(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1602 = arguments.length;
+var i__4642__auto___1603 = (0);
+while(true){
+if((i__4642__auto___1603 < len__4641__auto___1602)){
+args__4647__auto__.push((arguments[i__4642__auto___1603]));
+
+var G__1604 = (i__4642__auto___1603 + (1));
+i__4642__auto___1603 = G__1604;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((3) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((3)),(0),null)):null);
+return quil.core.with_graphics.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__4648__auto__);
+});
+
+quil.core.with_graphics.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,graphics,body){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","let","cljs.core/let",-308701135,null),null,(1),null)),(new cljs.core.List(null,cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"gr__1596__auto__","gr__1596__auto__",-1397057021,null),null,(1),null)),(new cljs.core.List(null,graphics,null,(1),null)))))),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","binding","cljs.core/binding",2050379843,null),null,(1),null)),(new cljs.core.List(null,cljs.core.vec.call(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.core","*graphics*","quil.core/*graphics*",-1088142302,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol(null,"gr__1596__auto__","gr__1596__auto__",-1397057021,null),null,(1),null)))))),null,(1),null)),(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,".beginDraw",".beginDraw",1110767550,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol(null,"gr__1596__auto__","gr__1596__auto__",-1397057021,null),null,(1),null))))),null,(1),null)),body,(new cljs.core.List(null,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,".endDraw",".endDraw",795589408,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol(null,"gr__1596__auto__","gr__1596__auto__",-1397057021,null),null,(1),null))))),null,(1),null))))),null,(1),null)))));
+});
+
+quil.core.with_graphics.cljs$lang$maxFixedArity = (3);
+
+/** @this {Function} */
+quil.core.with_graphics.cljs$lang$applyTo = (function (seq1597){
+var G__1598 = cljs.core.first.call(null,seq1597);
+var seq1597__$1 = cljs.core.next.call(null,seq1597);
+var G__1599 = cljs.core.first.call(null,seq1597__$1);
+var seq1597__$2 = cljs.core.next.call(null,seq1597__$1);
+var G__1600 = cljs.core.first.call(null,seq1597__$2);
+var seq1597__$3 = cljs.core.next.call(null,seq1597__$2);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__1598,G__1599,G__1600,seq1597__$3);
+});
+
+return null;
+})()
+;
+quil.core.with_graphics.cljs$lang$macro = true;
+
+/**
+ * Create and start a new visualisation applet. Can be used to create
+ * new sketches programmatically. See documentation for 'defsketch' for
+ * list of available options.
+ */
+quil.core.sketch = (function quil$core$sketch(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1606 = arguments.length;
+var i__4642__auto___1607 = (0);
+while(true){
+if((i__4642__auto___1607 < len__4641__auto___1606)){
+args__4647__auto__.push((arguments[i__4642__auto___1607]));
+
+var G__1608 = (i__4642__auto___1607 + (1));
+i__4642__auto___1607 = G__1608;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((0) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((0)),(0),null)):null);
+return quil.core.sketch.cljs$core$IFn$_invoke$arity$variadic(argseq__4648__auto__);
+});
+
+quil.core.sketch.cljs$core$IFn$_invoke$arity$variadic = (function (opts){
+return cljs.core.apply.call(null,quil.sketch.sketch,opts);
+});
+
+quil.core.sketch.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+quil.core.sketch.cljs$lang$applyTo = (function (seq1605){
+var self__4629__auto__ = this;
+return self__4629__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq1605));
+});
+
+var ret__4684__auto___1613 = (function (){
+/**
+ * Define and start a sketch and bind it to a var with the symbol
+ * app-name. If any of the options to the various callbacks are
+ * symbols, it wraps them in a call to var to ensure they aren't
+ * inlined and that redefinitions to the original fns are reflected in
+ * the visualisation.
+ *
+ * Available options:
+ *
+ * :size - A vector of width and height for the sketch or :fullscreen.
+ * Defaults to [500 300]. If you're using :fullscreen you may
+ * want to enable present mode - :features [:present]
+ *
+ * :renderer - Specifies the renderer type. One of :p2d, :p3d, :java2d,
+ * :opengl, :pdf). Defaults to :java2d. :dxf renderer
+ * can't be used as sketch renderer. Use begin-raw method
+ * instead. In clojurescript only :p2d and :p3d renderers
+ * are supported.
+ *
+ * :output-file - Specifies an output file path. Only used in :pdf mode.
+ * Not supported in clojurescript.
+ *
+ * :title - A string which will be displayed at the top of
+ * the sketch window. Not supported in clojurescript.
+ *
+ * :features - A vector of keywords customizing sketch behaviour.
+ * Supported features:
+ *
+ * :keep-on-top - Sketch window will always be above other
+ * windows. Note: some platforms might not
+ * support always-on-top windows.
+ * Not supported in clojurescript.
+ *
+ * :exit-on-close - Shutdown JVM when sketch is closed.
+ * Not supported in clojurescript.
+ *
+ * :resizable - Makes sketch resizable.
+ * Not supported in clojurescript.
+ *
+ * :no-safe-fns - Do not catch and print exceptions thrown
+ * inside functions provided to sketch (like
+ * draw, mouse-click, key-pressed and
+ * other). By default all exceptions thrown
+ * inside these functions are catched. This
+ * prevents sketch from breaking when bad
+ * function was provided and allows you to
+ * fix it and reload it on fly. You can
+ * disable this behaviour by enabling
+ * :no-safe-fns feature.
+ * Not supported in clojurescript.
+ *
+ * :present - Switch to present mode (fullscreen without
+ * borders, OS panels). You may want to use
+ * this feature together with :size :fullscreen.
+ * Not supported in clojurescript.
+ *
+ * :no-start - Disables autostart if sketch was created using
+ * defsketch macro. To start sketch you have to
+ * call function created defsketch.
+ * Supported only in clojurescript.
+ *
+ * :global-key-events - Allows a sketch to receive any
+ * keyboard event sent to the page,
+ * regardless of whether the canvas it is
+ * loaded in has focus or not.
+ * Supported only in clojurescript.
+ *
+ * Usage example: :features [:keep-on-top :present]
+ *
+ * :bgcolor - Sets background color for unused space in present mode.
+ * Color is specified in hex format: #XXXXXX.
+ * Example: :bgcolor "#00FFFF" (cyan background)
+ * Not supported in clojurescript.
+ *
+ * :display - Sets what display should be used by this sketch.
+ * Displays are numbered starting from 0. Example: :display 1.
+ * Not supported in clojurescript.
+ *
+ * :setup - A function to be called once when setting the sketch up.
+ *
+ * :draw - A function to be repeatedly called at most n times per
+ * second where n is the target frame-rate set for
+ * the visualisation.
+ *
+ * :host - String id of canvas element or DOM element itself.
+ * Specifies host for the sketch. Must be specified in sketch,
+ * may be omitted in defsketch. If ommitted in defsketch,
+ * :host is set to the name of the sketch. If element with
+ * specified id is not found on the page and page is empty -
+ * new canvas element will be created. Used in clojurescript.
+ *
+ * :focus-gained - Called when the sketch gains focus.
+ * Not supported in clojurescript.
+ *
+ * :focus-lost - Called when the sketch loses focus.
+ * Not supported in clojurescript.
+ *
+ * :mouse-entered - Called when the mouse enters the sketch window.
+ *
+ * :mouse-exited - Called when the mouse leaves the sketch window
+ *
+ * :mouse-pressed - Called every time a mouse button is pressed.
+ *
+ * :mouse-released - Called every time a mouse button is released.
+ *
+ * :mouse-clicked - called once after a mouse button has been pressed
+ * and then released.
+ *
+ * :mouse-moved - Called every time the mouse moves and a button is
+ * not pressed.
+ *
+ * :mouse-dragged - Called every time the mouse moves and a button is
+ * pressed.
+ *
+ * :mouse-wheel - Called every time mouse wheel is rotated.
+ * Takes 1 argument - wheel rotation, an int.
+ * Negative values if the mouse wheel was rotated
+ * up/away from the user, and positive values
+ * if the mouse wheel was rotated down/ towards the user
+ *
+ * :key-pressed - Called every time any key is pressed.
+ *
+ * :key-released - Called every time any key is released.
+ *
+ * :key-typed - Called once every time non-modifier keys are
+ * pressed.
+ *
+ * :on-close - Called once, when sketch is closed
+ * Not supported in clojurescript.
+ *
+ * :middleware - Vector of middleware to be applied to the sketch.
+ * Middleware will be applied in the same order as in comp
+ * function: [f g] will be applied as (f (g options)).
+ *
+ * :settings - cousin of :setup. A function to be called once when
+ * setting sketch up. Should be used only for (smooth) and
+ * (no-smooth). Due to Processing limitations these functions
+ * cannot be used neither in :setup nor in :draw.
+ */
+quil.core.defsketch = (function quil$core$defsketch(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1614 = arguments.length;
+var i__4642__auto___1615 = (0);
+while(true){
+if((i__4642__auto___1615 < len__4641__auto___1614)){
+args__4647__auto__.push((arguments[i__4642__auto___1615]));
+
+var G__1616 = (i__4642__auto___1615 + (1));
+i__4642__auto___1615 = G__1616;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((3) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((3)),(0),null)):null);
+return quil.core.defsketch.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__4648__auto__);
+});
+
+quil.core.defsketch.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,app_name,options){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("quil.sketch$macros","defsketch","quil.sketch$macros/defsketch",2065609719,null),null,(1),null)),(new cljs.core.List(null,app_name,null,(1),null)),options)));
+});
+
+quil.core.defsketch.cljs$lang$maxFixedArity = (3);
+
+/** @this {Function} */
+quil.core.defsketch.cljs$lang$applyTo = (function (seq1609){
+var G__1610 = cljs.core.first.call(null,seq1609);
+var seq1609__$1 = cljs.core.next.call(null,seq1609);
+var G__1611 = cljs.core.first.call(null,seq1609__$1);
+var seq1609__$2 = cljs.core.next.call(null,seq1609__$1);
+var G__1612 = cljs.core.first.call(null,seq1609__$2);
+var seq1609__$3 = cljs.core.next.call(null,seq1609__$2);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__1610,G__1611,G__1612,seq1609__$3);
+});
+
+return null;
+})()
+;
+quil.core.defsketch.cljs$lang$macro = true;
+
+/**
+ * Returns true if char c is a 'coded' char i.e. it is necessary to
+ * fetch the key-code as an integer and use that to determine the
+ * specific key pressed. See key-keyword.
+ */
+quil.core.key_coded_QMARK_ = (function quil$core$key_coded_QMARK_(c){
+return cljs.core._EQ_.call(null,(65535),String(c).charCodeAt());
+});
+/**
+ * Returns a keyword representing the currently pressed key. Modifier
+ * keys are represented as: :up, :down, :left, :right, :alt, :control,
+ * :shift, :command, :f1-24
+ */
+quil.core.key_as_keyword = (function quil$core$key_as_keyword(){
+var key_char = quil.core.raw_key.call(null);
+var code = quil.core.key_code.call(null);
+if(quil.core.key_coded_QMARK_.call(null,key_char)){
+return cljs.core.get.call(null,quil.core.KEY_CODES,code,new cljs.core.Keyword(null,"unknown-key","unknown-key",255305911));
+} else {
+return cljs.core.keyword.call(null,String(key_char));
+}
+});
+
+//# sourceMappingURL=core.js.map
diff --git a/src/http/static/viz/2/quil/core.js.map b/src/http/static/viz/2/quil/core.js.map
new file mode 100644
index 0000000..55fa54e
--- /dev/null
+++ b/src/http/static/viz/2/quil/core.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/core.js","sources":["core.cljc"],"lineCount":5543,"mappings":"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\/B,AAAAH,wBAAAG,UAAA,IAAA,\/CAckC;cAdlC,AAAAH,wBAAAG,UAAA,IAAA,hDAcyC;AAdzC,AAeG,OAAO,AAAC3N,2CACD,MAAA,LAAKoO,UAAI,MAAA,LAAKC,UAAI,UAAA,TAAKC,cAAQ,WAAA,VAAKC,eACpC,MAAA,LAAK1D,UAAI,MAAA,LAAKC,UAAI,UAAA,TAAKC,cAAQ,WAAA,VAAKC;;;AAjB9C,AAAA,+CAAA,mBAAA,QAAA,1EAMEsC,0DAaU;AAnBZ,AAAA,IAAA,YAAAM;SAAA,AAAAJ,wBAAAK,UAAA,IAAA,3CAmBqB;SAnBrB,AAAAL,wBAAAK,UAAA,IAAA,3CAmBwB;aAnBxB,AAAAL,wBAAAK,UAAA,IAAA,\/CAmB2B;cAnB3B,AAAAL,wBAAAK,UAAA,IAAA,hDAmBkC;IAnBlC,YAAAC;SAAA,AAAAN,wBAAAO,UAAA,IAAA,3CAmB4C;SAnB5C,AAAAP,wBAAAO,UAAA,IAAA,3CAmB+C;aAnB\/C,AAAAP,wBAAAO,UAAA,IAAA,\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\/O,0BAAAiP;IAAA,cAAA,AAAA\/O,yBAAA+O;IAAA,UAAA,AAAAjP,0BAAAiP;IAAA,cAAA,AAAA\/O,yBAAA+O;IAAA,UAAA,AAAAjP,0BAAAiP;IAAA,cAAA,AAAA\/O,yBAAA+O;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAA9O,wDAAA+O,QAAAC,QAAAC,QAAAH;;;AAAA;;;AAAA,AAAA,AAAA,sCAAA,tCAMEF;;AANFxO,AAqBA;;;;;oBAAA,pBAME+O,gDAIC,EAAE,EAAE,MAAM;AAVb,AAWE,OAAU,AAAClS,8CAAyBsF,EAAUC,EAAU6B,MAAcC;;AAExE;;;;;;;;;;;;;yBAAA,zBAME8K,0DAYC;AAlBH,AAmBE,IAAM,WAAK,AAACrJ,yCAAuBC,KAAKtI;AAAxC,AACE,OAAc,AAACT,kDAAkB,YAAA,XAAK+I;;AAE1C,AAAA;;;;;;2BAAA,mCAAA,9DAMEsJ;AANF,AAAA,IAAA,UAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,uDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,uDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAvO,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,yDAAA,zDAMEuO,oEAKE;AAXJ,AAWe,OAAW,AAACrS,+CAAyBsS;;;AAXpD,AAAA,yDAAA,zDAMED,oEAME,EAAE,EAAE;AAZR,AAYW,OAAW,AAACrS,+CAAyBgI,EAAUC,EAAUC;;;AAZpE,AAAA,mDAAA,nDAMEmK;;AANF,AAcA;;;;;;yBAAA,zBAMEE,0DAKC;AAXH,AAWY,OAAW,AAACvS,+CAAkB,WAAA,VAAKwS;;AAG\/C,AAAA;;;;;;;;qBAAA,6BAAA,lDAMEE;AANF,AAAA,IAAA,UAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,iDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,iDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAA5O,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,mDAAA,nDAME4O,8DAOE;AAbJ,AAeY,OAACL,mCAAepI;;;AAf5B,AAAA,mDAAA,nDAMEyI,8DAUE,EAAE,EAAE;AAhBR,AAgBW,OAACL,mCAAerK,EAAEC,EAAEC;;;AAhB\/B,AAAA,6CAAA,7CAMEwK;;AANF,AAkBA;;;uBAAA,vBAMEC;AANF,AASE,OAAY,AAAC3S;;AAGf;;;;;;wBAAA,xBAME4S;AANF,AAYE,OAAa,AAAC5S;;AAEhB;;;;oBAAA,pBAME6S;AANF,AAUE,OAAS,AAAC7S;;AAGZ,AAAA;;;;;;sBAAA,8BAAA,pDAME+S;AANF,AAAA,IAAA,UAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC;;;KAAA;AAAA,OAAAA,kDAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAjP,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,oDAAA,pDAMEiP;AANF,AAWM,OAAW,AAAC\/S;;;AAXlB,AAAA,oDAAA,pDAME+S,+DAME;AAZJ,AAaG,GAAU,yBAAA,zBAACC,gFAASjK;AAApB;AAAA,AAAA;;AAGA,sDAAA,\/CAAW,AAAC\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\/C,AAAA,+CAAA,\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\/C,MAAM8R;;;AAhB\/D,AAAA,qDAAA,WAAA,QAAA,QAAA,hFAMEP,wFAW6B,MAAM;AAjBrC,AAAA,IAAA,YAAAC;QAAA,AAAAzS,wBAAA0S,UAAA,IAAA,1CAiBK;QAjBL,AAAA1S,wBAAA0S,UAAA,IAAA,1CAiBO;QAjBP,AAAA1S,wBAAA0S,UAAA,IAAA,1CAiBS;IAjBT,YAAAC;QAAA,AAAA3S,wBAAA4S,UAAA,IAAA,1CAiBa;QAjBb,AAAA5S,wBAAA4S,UAAA,IAAA,1CAiBe;QAjBf,AAAA5S,wBAAA4S,UAAA,IAAA,1CAiBiB;IAjBjB,YAAAC;SAAA,AAAA7S,wBAAA8S,UAAA,IAAA,3CAiBqB;SAjBrB,AAAA9S,wBAAA8S,UAAA,IAAA,3CAiBwB;SAjBxB,AAAA9S,wBAAA8S,UAAA,IAAA,3CAiB2B;AAjB3B,AAkBK,OAAY,AAACtgB,gDAAkBgI,EAAEC,EAAEC,EAAE5C,EAAEC,EAAEC,EAAE8L,GAAGC,GAAGC,GAAG\/C,MAAM8R;;;AAlB\/D,AAAA,+CAAA,\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\/iB,8CAAkByI;;AAE\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","names":["quil.core\/*graphics*","quil.core\/no-fill-prop","quil.core\/current-graphics","or__4047__auto__","quil.sketch\/current-applet","js\/Processing.prototype.PConstants","quil.core\/arc-modes","quil.core\/shape-modes","quil.core\/blend-modes","quil.core\/color-modes","quil.core\/image-formats","quil.core\/ellipse-modes","quil.core\/hint-options","quil.core\/image-modes","quil.core\/rect-modes","quil.core\/p-shape-modes","quil.core\/stroke-cap-modes","quil.core\/stroke-join-modes","quil.core\/horizontal-alignment-modes","quil.core\/vertical-alignment-modes","quil.core\/text-modes","quil.core\/texture-modes","quil.core\/texture-wrap-modes","quil.core\/filter-modes","quil.core\/cursor-modes","quil.core\/PI","js\/Math","quil.core\/HALF-PI","quil.core\/THIRD-PI","quil.core\/QUARTER-PI","quil.core\/TWO-PI","quil.core\/DEG-TO-RAD","quil.core\/RAD-TO-DEG","quil.core\/KEY-CODES","quil.core\/prc-println","msg","quil.core\/prc-print","quil.core\/get-sketch-by-id","js\/Processing","id","i__4642__auto__","len__4641__auto__","args__4647__auto__","cljs.core\/IndexedSeq","quil.core\/with-sketch","argseq__4648__auto__","cljs.core\/first","seq1282","cljs.core\/next","self__4628__auto__","G__1283","G__1284","G__1285","ret__4684__auto__","cljs.core\/sequence","cljs.core\/seq","cljs.core\/concat","cljs.core\/List","quil.util\/clj-compilation?","applet","body","quil.core\/state-atom","G__1291","quil.core\/state","js\/Error","cljs.core\/deref","cljs.core\/contains?","state","key","cljs.core\/get","quil.core\/set-state!","self__4629__auto__","seq1293","state*","cljs.core\/apply","cljs.core\/hash-map","state-vals","cljs.core\/reset!","state-map","quil.core\/abs","n","quil.core\/acos","quil.core\/alpha","cljs.core\/unchecked-int","color","G__1298","quil.core\/ambient-float","gray","x","y","z","quil.core\/ambient-int","rgb","G__1301","quil.core\/ambient","G__1304","quil.core\/ambient-light","red","green","blue","quil.core\/apply-matrix","n00","n01","n02","n03","n10","n11","n12","n13","n20","n21","n22","n23","n30","n31","n32","n33","quil.core\/arc","width","height","start","stop","quil.core\/asin","quil.core\/atan","quil.core\/atan2","quil.core\/available-fonts","js\/PFont","G__1307","quil.core\/background-float","alpha","r","g","b","a","G__1310","quil.core\/background-int","G__1313","quil.core\/background","quil.core\/background-image","img","quil.core\/begin-camera","quil.core\/begin-contour","G__1316","quil.core\/begin-shape","quil.util\/resolve-constant-key","mode","G__1319","quil.core\/bezier","x1","y1","cx1","cy1","cx2","cy2","x2","y2","z1","cz1","cz2","z2","quil.core\/bezier-detail","detail","quil.core\/bezier-point","c","d","t","quil.core\/bezier-tangent","G__1322","quil.core\/bezier-vertex","G__1325","quil.core\/binary","val","num-digits","G__1328","quil.core\/blend","dx","dy","dwidth","dheight","src-img","dest-img","quil.core\/blend-color","c1","c2","quil.core\/blue","G__1331","quil.core\/box","size","depth","quil.core\/brightness","G__1334","quil.core\/camera","eyeX","eyeY","eyeZ","centerX","centerY","centerZ","upX","upY","upZ","quil.core\/ceil","G__1337","quil.core\/color","G__1340","quil.core\/color-mode","max","max-x","max-y","max-z","max-a","quil.core\/constrain","amt","low","high","G__1343","quil.core\/copy","p__1344","cljs.core\/nth","vec__1346","p__1345","vec__1349","p__1352","vec__1354","p__1353","vec__1357","p__1360","vec__1362","p__1361","vec__1365","sx","sy","swidth","sheight","quil.core\/cos","angle","G__1370","quil.core\/create-font","name","smooth","charset","G__1373","quil.core\/create-graphics","w","h","quil.sketch\/resolve-renderer","renderer","path","quil.core\/create-image","format","quil.core\/current-fill","quil.core\/current-stroke","G__1376","quil.core\/cursor","cursor-mode","G__1379","quil.core\/cursor-image","hx","hy","G__1382","quil.core\/curve","x3","y3","x4","y4","z3","z4","quil.core\/curve-detail","quil.core\/curve-point","quil.core\/curve-tangent","quil.core\/curve-tightness","ti","G__1385","quil.core\/curve-vertex","quil.core\/day","quil.core\/degrees","radians","quil.core\/delay-frame","freeze-ms","quil.core\/directional-light","nx","ny","nz","G__1388","quil.core\/dist","quil.core\/do-record","cljs.core\/vec","seq1391","G__1392","G__1393","G__1394","graphics","quil.core\/ellipse","quil.core\/ellipse-mode","G__1400","quil.core\/emissive-float","float-val","quil.core\/emissive-int","int-val","G__1403","quil.core\/emissive","quil.core\/end-camera","quil.core\/end-contour","quil.core\/end-raw","G__1406","quil.core\/end-shape","cljs.core\/=","quil.core\/exit","quil.core\/exp","quil.core\/clear-no-fill-cljs","G__1409","quil.core\/fill-float","G__1412","quil.core\/fill-int","G__1415","quil.core\/fill","G__1418","quil.core\/display-filter","level","quil.core\/floor","quil.core\/focused","quil.core\/frame-count","quil.core\/current-frame-rate","quil.core\/frame-rate","new-rate","quil.core\/frustum","left","right","bottom","top","near","far","G__1421","quil.core\/get-pixel","quil.core\/green","col","G__1424","quil.core\/hex","quil.core\/height","quil.core\/hint","cljs.core\/Keyword","hint-type","quil.core\/hour","quil.core\/hue","G__1427","quil.core\/image","G__1430","quil.core\/image-filter","quil.core\/image-mode","quil.core\/key-code","quil.core\/key-pressed?","quil.core\/light-falloff","constant","linear","quadratic","quil.core\/lerp-color","quil.core\/lerp","quil.core\/lights","quil.core\/light-specular","G__1433","quil.core\/line","p1","p2","quil.core\/load-font","filename","quil.core\/load-image","G__1436","quil.core\/load-shader","fragment-filename","vertex-filename","quil.core\/load-shape","quil.core\/log","G__1439","quil.core\/mag","quil.core\/map-range","low1","high1","low2","high2","quil.core\/millis","quil.core\/minute","quil.core\/model-x","quil.core\/model-y","quil.core\/model-z","quil.core\/month","quil.core\/mouse-button","pred__1441","expr__1442","button-code","quil.core\/mouse-pressed?","quil.core\/mouse-x","quil.core\/mouse-y","quil.core\/no-cursor","quil.core\/no-fill","quil.core\/random-2d","Math\/cos","theta","Math\/sin","quil.core\/random-3d","phi","vx","vy","vz","G__1445","quil.core\/noise","G__1448","quil.core\/noise-detail","octaves","falloff","quil.core\/noise-seed","quil.core\/no-lights","quil.core\/no-loop","quil.core\/norm","quil.core\/normal","quil.core\/no-smooth","quil.core\/no-stroke","quil.core\/no-tint","G__1451","quil.core\/ortho","G__1454","quil.core\/perspective","fovy","aspect","z-near","z-far","G__1457","quil.core\/pixels","pix-array","quil.core\/pmouse-x","quil.core\/pmouse-y","G__1460","quil.core\/point","quil.core\/point-light","quil.core\/pop-matrix","quil.core\/pop-style","quil.core\/pow","num","exponent","quil.core\/print-camera","quil.core\/print-matrix","quil.core\/print-projection","quil.core\/push-matrix","quil.core\/push-style","quil.core\/quad","G__1463","quil.core\/quadratic-vertex","cx","cy","cz","quil.core\/radians","degrees","G__1466","quil.core\/random","min","quil.core\/random-gaussian","quil.core\/random-seed","quil.core\/raw-key","G__1469","quil.core\/rect","top-left-r","top-right-r","bottom-right-r","bottom-left-r","quil.core\/rect-mode","quil.core\/red","quil.core\/redraw","quil.core\/request-image","quil.core\/reset-matrix","quil.core\/resize","G__1472","quil.core\/rotate","quil.core\/rotate-x","quil.core\/rotate-y","quil.core\/rotate-z","quil.core\/round","quil.core\/saturation","quil.core\/save","G__1475","quil.core\/save-frame","G__1478","quil.core\/scale","s","sz","G__1481","quil.core\/screen-x","G__1484","quil.core\/screen-y","quil.core\/screen-z","quil.core\/seconds","G__1487","quil.core\/set-pixel","quil.core\/set-image","src","G__1490","quil.core\/shape","sh","quil.core\/shear-x","quil.core\/shear-y","quil.core\/shape-mode","quil.core\/shininess","shine","quil.core\/sin","G__1493","quil.core\/smooth","G__1496","quil.core\/specular","quil.core\/sphere","radius","G__1499","quil.core\/sphere-detail","res","ures","vres","G__1502","quil.core\/spot-light","p__1503","vec__1506","p__1504","vec__1509","p__1505","vec__1512","concentration","quil.core\/sq","quil.core\/sqrt","quil.core\/start-loop","G__1517","quil.core\/stroke-float","G__1520","quil.core\/stroke-int","G__1523","quil.core\/stroke","quil.core\/stroke-cap","cap-mode","quil.core\/stroke-join","join-mode","quil.core\/stroke-weight","weight","quil.core\/tan","quil.core\/target-frame-rate","quil.core\/no-fill?","G__1526","quil.core\/text-char","cljs.core\/char","G__1529","quil.core\/text-num","G__1532","quil.core\/text","G__1535","quil.core\/text-align","align","align-x","align-y","quil.core\/text-ascent","quil.core\/text-descent","G__1538","quil.core\/text-font","font","quil.core\/text-leading","leading","quil.core\/text-mode","quil.core\/text-size","quil.core\/texture","quil.core\/texture-mode","quil.core\/text-width","data","G__1541","quil.core\/tint-float","G__1544","quil.core\/tint-int","G__1547","quil.core\/tint","G__1550","quil.core\/translate","v","tx","ty","tz","quil.core\/triangle","quil.core\/unbinary","str-val","quil.core\/unhex","hex-str","G__1553","quil.core\/update-pixels","temp__4657__auto__","G__1558","quil.core\/vertex","u","quil.core\/year","quil.core\/width","quil.core\/with-fill","seq1561","G__1562","G__1563","G__1564","fill-args","quil.core\/with-stroke","seq1570","G__1571","G__1572","G__1573","stroke-args","quil.core\/with-translation","seq1579","G__1580","G__1581","G__1582","translation-vector","quil.core\/with-rotation","seq1588","G__1589","G__1590","G__1591","rotation","quil.core\/with-graphics","seq1597","G__1598","G__1599","G__1600","quil.core\/sketch","seq1605","quil.sketch\/sketch","opts","quil.core\/defsketch","seq1609","G__1610","G__1611","G__1612","app-name","options","quil.core\/key-coded?","js\/String","quil.core\/key-as-keyword","key-char","code","cljs.core\/keyword"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/middleware.cljc b/src/http/static/viz/2/quil/middleware.cljc
new file mode 100644
index 0000000..a8f5672
--- /dev/null
+++ b/src/http/static/viz/2/quil/middleware.cljc
@@ -0,0 +1,144 @@
+(ns ^{:doc "Quil middleware."}
+ quil.middleware
+ (:require [quil.middlewares.fun-mode :as fun-mode]
+ #?(:clj [quil.middlewares.pause-on-error :as pause-on-error])
+ [quil.middlewares.navigation-3d :as navigation-3d]
+ [quil.middlewares.navigation-2d :as navigation-2d]
+ ))
+
+(defn ^{:requires-bindings false
+ :category "Middleware"
+ :subcategory nil
+ :ns "quil.middleware"
+ :added "2.1.0"}
+ fun-mode
+ "Introduces function mode. Adds 'update' function which takes current
+ state and returns new state. Makes all other functions (setup, draw,
+ mouse-click, etc) state-aware. See wiki for more details."
+ [options]
+ (fun-mode/fun-mode options))
+
+#?(:clj
+(defn ^{:requires-bindings false
+ :category "Middleware"
+ :subcategory nil
+ :ns "quil.middleware"
+ :added "2.2.0"}
+ pause-on-error
+ "Pauses sketch if any of user-provided handlers throws error.
+ It allows to fix the error on the fly and continue sketch.
+ May be good alternative to default '500ms pause if exception'
+ behaviour."
+ [options]
+ (pause-on-error/pause-on-error options)))
+
+(defn ^{:requires-bindings false
+ :category "Middleware"
+ :subcategory nil
+ :ns "quil.middleware"
+ :added "2.2.0"}
+ navigation-3d
+ "Enables navigation in 3D space. Similar to how it is done in
+ shooters: WASD navigation, space is go up, drag mouse to look around.
+ This middleware requires fun-mode.
+
+
+ Navigation
+
+ * Drag mouse to look around. You can change settings to bind
+ mouse-moved instead of mouse-dragged to look around. See
+ customization info below.
+
+ * Keyboard:
+ * w - go forward
+ * s - go backward
+ * a - strafe left
+ * d - strafe right
+ * space - go up
+ * z - go down, can't bind to ctrl, limitation of Processing
+
+
+ Customization
+
+ You can customize this middleware by providing map as
+ :navigation-3d option in defsketch/sketch. Map can have following
+ optional keys:
+
+ :position - vector of 3 numbers, initial camera position. Default
+ is the same as in 'camera' function.
+
+ :straight - vector of 3 numbers, direction you'll be looking at.
+ Default is [0 0 -1] (looking down).
+
+ :up - vector of 3 numbers, 'up' direction. Default is [0 1 0].
+
+ :pixels-in-360 - number, mouse sensitivity. Defines how many pixels
+ you need to move/drag you mouse to rotate 360 degrees.
+ The less the number the more sensitive is mouse.
+ Default is 1000.
+
+ :step-size - number, number of pixels you move on each key event (wasd).
+ Default is 20.
+
+ :rotate-on - keyword, either :mouse-dragged or :mouse-moved. Specifies
+ on which mouse event camera should rotate. Default is
+ :mouse-dragged.
+
+
+ Accessing position information from sketch
+
+ navigation-3d uses fun-mode under the hood so all position-related
+ information is stored in the state map. It means that you can access in
+ draw/update/any handler and modify it if you need to. Position
+ information is a map which is stored under :navigation-3d key in the
+ state map. Position consists of 3 values: :position, :straight and :up.
+ See \"Customization\" section above for more details.
+
+ Usage example:
+
+ (q/defsketch my-sketch
+ ...
+ :middleware [m/fun-mode m/navigation-3d])
+
+ See wiki article for more(?) details:
+ https://github.com/quil/quil/wiki/Navigation-3D"
+ [options]
+ (navigation-3d/navigation-3d options))
+
+(defn ^{:requires-bindings false
+ :category "Middleware"
+ :subcategory nil
+ :ns "quil.middleware"
+ :added "2.2.6"}
+ navigation-2d
+ "Enables navigation over 2D sketch. Drag mouse to change the center of the
+ sketch and mouse wheel controls zoom. This middleware requires fun-mode.
+
+ Customization
+
+ You can customize this middleware by providing map as
+ :navigation-2d option in defsketch/sketch. Map can have following
+ optional keys:
+
+ :position - vector of 2 numbers, x and y - center of the screen.
+ Default is width/2, height/2.
+
+ :zoom - number indicating current zoom level. Default is 1.
+
+ Accessing position information from sketch
+
+ navigation-2d uses fun-mode under the hood so all position-related
+ information is stored in the state map. It means that you can access in
+ draw/update/any handler and modify it if you need to. Position
+ information is a map which is stored under :navigation-2d key in the
+ state map. Position consists of 2 values: :position and :zoom.
+ See \"Customization\" section above for more details.
+
+ Usage example:
+
+ (q/defsketch my-sketch
+ ...
+ :middleware [m/fun-mode m/navigation-2d])
+"
+ [options]
+ (navigation-2d/navigation-2d options))
diff --git a/src/http/static/viz/2/quil/middleware.cljc.cache.json b/src/http/static/viz/2/quil/middleware.cljc.cache.json
new file mode 100644
index 0000000..ac5c7df
--- /dev/null
+++ b/src/http/static/viz/2/quil/middleware.cljc.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$quil.middleware","~:imports",null,"~:requires",["^ ","~$fun-mode","~$quil.middlewares.fun-mode","^:","^:","~$navigation-3d","~$quil.middlewares.navigation-3d","^<","^<","~$navigation-2d","~$quil.middlewares.navigation-2d","^>","^>"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","^9",["^ ","~:category","Middleware","~:protocol-inline",null,"~:meta",["^ ","^B","Middleware","~:added","2.1.0","~:ns","quil.middleware","~:subcategory",null,"~:file","/home/mediocregopher/src/viz/out/quil/middleware.cljc","~:end-column",11,"~:column",3,"~:requires-bindings",false,"~:line",14,"~:end-line",14,"~:arglists",["~#list",["~$quote",["^O",[["~$options"]]]]],"~:doc","Introduces function mode. Adds 'update' function which takes current\n state and returns new state. Makes all other functions (setup, draw,\n mouse-click, etc) state-aware. See wiki for more details."],"^E","2.1.0","^F","quil.middleware","^5","~$quil.middleware/fun-mode","^G",null,"^H","out/quil/middleware.cljc","^I",11,"~:method-params",["^O",[["^Q"]]],"~:protocol-impl",null,"~:arglists-meta",["^O",[null,null]],"^J",1,"~:variadic?",false,"^K",false,"^L",9,"~:ret-tag",["^4",[null,"~$any"]],"^M",14,"~:max-fixed-arity",1,"~:fn-var",true,"^N",["^O",["^P",["^O",[["^Q"]]]]],"^R","Introduces function mode. Adds 'update' function which takes current\n state and returns new state. Makes all other functions (setup, draw,\n mouse-click, etc) state-aware. See wiki for more details."],"^;",["^ ","^B","Middleware","^C",null,"^D",["^ ","^B","Middleware","^E","2.2.0","^F","quil.middleware","^G",null,"^H","/home/mediocregopher/src/viz/out/quil/middleware.cljc","^I",16,"^J",3,"^K",false,"^L",40,"^M",40,"^N",["^O",["^P",["^O",[["^Q"]]]]],"^R","Enables navigation in 3D space. Similar to how it is done in\n shooters: WASD navigation, space is go up, drag mouse to look around.\n This middleware requires fun-mode.\n\n\n Navigation\n\n * Drag mouse to look around. You can change settings to bind\n mouse-moved instead of mouse-dragged to look around. See\n customization info below.\n\n * Keyboard:\n * w - go forward\n * s - go backward\n * a - strafe left\n * d - strafe right\n * space - go up\n * z - go down, can't bind to ctrl, limitation of Processing\n\n\n Customization\n\n You can customize this middleware by providing map as\n :navigation-3d option in defsketch/sketch. Map can have following\n optional keys:\n\n :position - vector of 3 numbers, initial camera position. Default\n is the same as in 'camera' function.\n\n :straight - vector of 3 numbers, direction you'll be looking at.\n Default is [0 0 -1] (looking down).\n\n :up - vector of 3 numbers, 'up' direction. Default is [0 1 0].\n\n :pixels-in-360 - number, mouse sensitivity. Defines how many pixels\n you need to move/drag you mouse to rotate 360 degrees.\n The less the number the more sensitive is mouse.\n Default is 1000.\n\n :step-size - number, number of pixels you move on each key event (wasd).\n Default is 20.\n\n :rotate-on - keyword, either :mouse-dragged or :mouse-moved. Specifies\n on which mouse event camera should rotate. Default is\n :mouse-dragged.\n\n\n Accessing position information from sketch\n\n navigation-3d uses fun-mode under the hood so all position-related\n information is stored in the state map. It means that you can access in\n draw/update/any handler and modify it if you need to. Position\n information is a map which is stored under :navigation-3d key in the\n state map. Position consists of 3 values: :position, :straight and :up.\n See \"Customization\" section above for more details.\n\n Usage example:\n\n (q/defsketch my-sketch\n ...\n :middleware [m/fun-mode m/navigation-3d])\n\n See wiki article for more(?) details:\n https://github.com/quil/quil/wiki/Navigation-3D"],"^E","2.2.0","^F","quil.middleware","^5","~$quil.middleware/navigation-3d","^G",null,"^H","out/quil/middleware.cljc","^I",16,"^T",["^O",[["^Q"]]],"^U",null,"^V",["^O",[null,null]],"^J",1,"^W",false,"^K",false,"^L",35,"^X","^Y","^M",40,"^Z",1,"^[",true,"^N",["^O",["^P",["^O",[["^Q"]]]]],"^R","Enables navigation in 3D space. Similar to how it is done in\n shooters: WASD navigation, space is go up, drag mouse to look around.\n This middleware requires fun-mode.\n\n\n Navigation\n\n * Drag mouse to look around. You can change settings to bind\n mouse-moved instead of mouse-dragged to look around. See\n customization info below.\n\n * Keyboard:\n * w - go forward\n * s - go backward\n * a - strafe left\n * d - strafe right\n * space - go up\n * z - go down, can't bind to ctrl, limitation of Processing\n\n\n Customization\n\n You can customize this middleware by providing map as\n :navigation-3d option in defsketch/sketch. Map can have following\n optional keys:\n\n :position - vector of 3 numbers, initial camera position. Default\n is the same as in 'camera' function.\n\n :straight - vector of 3 numbers, direction you'll be looking at.\n Default is [0 0 -1] (looking down).\n\n :up - vector of 3 numbers, 'up' direction. Default is [0 1 0].\n\n :pixels-in-360 - number, mouse sensitivity. Defines how many pixels\n you need to move/drag you mouse to rotate 360 degrees.\n The less the number the more sensitive is mouse.\n Default is 1000.\n\n :step-size - number, number of pixels you move on each key event (wasd).\n Default is 20.\n\n :rotate-on - keyword, either :mouse-dragged or :mouse-moved. Specifies\n on which mouse event camera should rotate. Default is\n :mouse-dragged.\n\n\n Accessing position information from sketch\n\n navigation-3d uses fun-mode under the hood so all position-related\n information is stored in the state map. It means that you can access in\n draw/update/any handler and modify it if you need to. Position\n information is a map which is stored under :navigation-3d key in the\n state map. Position consists of 3 values: :position, :straight and :up.\n See \"Customization\" section above for more details.\n\n Usage example:\n\n (q/defsketch my-sketch\n ...\n :middleware [m/fun-mode m/navigation-3d])\n\n See wiki article for more(?) details:\n https://github.com/quil/quil/wiki/Navigation-3D"],"^=",["^ ","^B","Middleware","^C",null,"^D",["^ ","^B","Middleware","^E","2.2.6","^F","quil.middleware","^G",null,"^H","/home/mediocregopher/src/viz/out/quil/middleware.cljc","^I",16,"^J",3,"^K",false,"^L",113,"^M",113,"^N",["^O",["^P",["^O",[["^Q"]]]]],"^R","Enables navigation over 2D sketch. Drag mouse to change the center of the\n sketch and mouse wheel controls zoom. This middleware requires fun-mode.\n\n Customization\n\n You can customize this middleware by providing map as\n :navigation-2d option in defsketch/sketch. Map can have following\n optional keys:\n\n :position - vector of 2 numbers, x and y - center of the screen.\n Default is width/2, height/2.\n\n :zoom - number indicating current zoom level. Default is 1.\n\n Accessing position information from sketch\n\n navigation-2d uses fun-mode under the hood so all position-related\n information is stored in the state map. It means that you can access in\n draw/update/any handler and modify it if you need to. Position\n information is a map which is stored under :navigation-2d key in the\n state map. Position consists of 2 values: :position and :zoom.\n See \"Customization\" section above for more details.\n\n Usage example:\n\n (q/defsketch my-sketch\n ...\n :middleware [m/fun-mode m/navigation-2d])\n"],"^E","2.2.6","^F","quil.middleware","^5","~$quil.middleware/navigation-2d","^G",null,"^H","out/quil/middleware.cljc","^I",16,"^T",["^O",[["^Q"]]],"^U",null,"^V",["^O",[null,null]],"^J",1,"^W",false,"^K",false,"^L",108,"^X","^Y","^M",113,"^Z",1,"^[",true,"^N",["^O",["^P",["^O",[["^Q"]]]]],"^R","Enables navigation over 2D sketch. Drag mouse to change the center of the\n sketch and mouse wheel controls zoom. This middleware requires fun-mode.\n\n Customization\n\n You can customize this middleware by providing map as\n :navigation-2d option in defsketch/sketch. Map can have following\n optional keys:\n\n :position - vector of 2 numbers, x and y - center of the screen.\n Default is width/2, height/2.\n\n :zoom - number indicating current zoom level. Default is 1.\n\n Accessing position information from sketch\n\n navigation-2d uses fun-mode under the hood so all position-related\n information is stored in the state map. It means that you can access in\n draw/update/any handler and modify it if you need to. Position\n information is a map which is stored under :navigation-2d key in the\n state map. Position consists of 2 values: :position and :zoom.\n See \"Customization\" section above for more details.\n\n Usage example:\n\n (q/defsketch my-sketch\n ...\n :middleware [m/fun-mode m/navigation-2d])\n"]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"^R","Quil middleware."] \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/middleware.js b/src/http/static/viz/2/quil/middleware.js
new file mode 100644
index 0000000..fcac0f6
--- /dev/null
+++ b/src/http/static/viz/2/quil/middleware.js
@@ -0,0 +1,118 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('quil.middleware');
+goog.require('cljs.core');
+goog.require('quil.middlewares.fun_mode');
+goog.require('quil.middlewares.navigation_3d');
+goog.require('quil.middlewares.navigation_2d');
+/**
+ * Introduces function mode. Adds 'update' function which takes current
+ * state and returns new state. Makes all other functions (setup, draw,
+ * mouse-click, etc) state-aware. See wiki for more details.
+ */
+quil.middleware.fun_mode = (function quil$middleware$fun_mode(options){
+return quil.middlewares.fun_mode.fun_mode.call(null,options);
+});
+/**
+ * Enables navigation in 3D space. Similar to how it is done in
+ * shooters: WASD navigation, space is go up, drag mouse to look around.
+ * This middleware requires fun-mode.
+ *
+ *
+ * Navigation
+ *
+ * * Drag mouse to look around. You can change settings to bind
+ * mouse-moved instead of mouse-dragged to look around. See
+ * customization info below.
+ *
+ * * Keyboard:
+ * * w - go forward
+ * * s - go backward
+ * * a - strafe left
+ * * d - strafe right
+ * * space - go up
+ * * z - go down, can't bind to ctrl, limitation of Processing
+ *
+ *
+ * Customization
+ *
+ * You can customize this middleware by providing map as
+ * :navigation-3d option in defsketch/sketch. Map can have following
+ * optional keys:
+ *
+ * :position - vector of 3 numbers, initial camera position. Default
+ * is the same as in 'camera' function.
+ *
+ * :straight - vector of 3 numbers, direction you'll be looking at.
+ * Default is [0 0 -1] (looking down).
+ *
+ * :up - vector of 3 numbers, 'up' direction. Default is [0 1 0].
+ *
+ * :pixels-in-360 - number, mouse sensitivity. Defines how many pixels
+ * you need to move/drag you mouse to rotate 360 degrees.
+ * The less the number the more sensitive is mouse.
+ * Default is 1000.
+ *
+ * :step-size - number, number of pixels you move on each key event (wasd).
+ * Default is 20.
+ *
+ * :rotate-on - keyword, either :mouse-dragged or :mouse-moved. Specifies
+ * on which mouse event camera should rotate. Default is
+ * :mouse-dragged.
+ *
+ *
+ * Accessing position information from sketch
+ *
+ * navigation-3d uses fun-mode under the hood so all position-related
+ * information is stored in the state map. It means that you can access in
+ * draw/update/any handler and modify it if you need to. Position
+ * information is a map which is stored under :navigation-3d key in the
+ * state map. Position consists of 3 values: :position, :straight and :up.
+ * See "Customization" section above for more details.
+ *
+ * Usage example:
+ *
+ * (q/defsketch my-sketch
+ * ...
+ * :middleware [m/fun-mode m/navigation-3d])
+ *
+ * See wiki article for more(?) details:
+ * https://github.com/quil/quil/wiki/Navigation-3D
+ */
+quil.middleware.navigation_3d = (function quil$middleware$navigation_3d(options){
+return quil.middlewares.navigation_3d.navigation_3d.call(null,options);
+});
+/**
+ * Enables navigation over 2D sketch. Drag mouse to change the center of the
+ * sketch and mouse wheel controls zoom. This middleware requires fun-mode.
+ *
+ * Customization
+ *
+ * You can customize this middleware by providing map as
+ * :navigation-2d option in defsketch/sketch. Map can have following
+ * optional keys:
+ *
+ * :position - vector of 2 numbers, x and y - center of the screen.
+ * Default is width/2, height/2.
+ *
+ * :zoom - number indicating current zoom level. Default is 1.
+ *
+ * Accessing position information from sketch
+ *
+ * navigation-2d uses fun-mode under the hood so all position-related
+ * information is stored in the state map. It means that you can access in
+ * draw/update/any handler and modify it if you need to. Position
+ * information is a map which is stored under :navigation-2d key in the
+ * state map. Position consists of 2 values: :position and :zoom.
+ * See "Customization" section above for more details.
+ *
+ * Usage example:
+ *
+ * (q/defsketch my-sketch
+ * ...
+ * :middleware [m/fun-mode m/navigation-2d])
+ */
+quil.middleware.navigation_2d = (function quil$middleware$navigation_2d(options){
+return quil.middlewares.navigation_2d.navigation_2d.call(null,options);
+});
+
+//# sourceMappingURL=middleware.js.map
diff --git a/src/http/static/viz/2/quil/middleware.js.map b/src/http/static/viz/2/quil/middleware.js.map
new file mode 100644
index 0000000..63af250
--- /dev/null
+++ b/src/http/static/viz/2/quil/middleware.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middleware.js","sources":["middleware.cljc"],"lineCount":118,"mappings":";AAAA;;;;;AAQA;;;;;2BAAA,3BAKEA,8DAIC;AATH,AAUE,OAACC,6CAAkBC;;AAgBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAAA,hCAKEC,wEAiEC;AAtEH,AAuEE,OAACC,uDAA4BF;;AAE\/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAAA,hCAKEG,wEA8BC;AAnCH,AAoCE,OAACC,uDAA4BJ","names":["quil.middleware\/fun-mode","quil.middlewares.fun-mode\/fun-mode","options","quil.middleware\/navigation-3d","quil.middlewares.navigation-3d\/navigation-3d","quil.middleware\/navigation-2d","quil.middlewares.navigation-2d\/navigation-2d"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/middlewares/deprecated_options.cljc b/src/http/static/viz/2/quil/middlewares/deprecated_options.cljc
new file mode 100644
index 0000000..6ed40d2
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/deprecated_options.cljc
@@ -0,0 +1,26 @@
+(ns quil.middlewares.deprecated-options)
+
+(def ^:private deprecated
+ {:decor ["2.0" "Try :features [:present] for similar effect"]
+ :target ["2.0" "Use :features [:keep-on-top] instead."]
+ :safe-draw-fn ["2.0" "Use :features [:no-safe-fns] instead."]})
+
+(defn- check-features-vector [features]
+ (let [features (set features)]
+ (when (features :no-safe-draw)
+ (println "Feature :no-safe-draw was renamed to :no-safe-fns in Quil 2.1."
+ "Use :feature [:no-safe-fns] now."))
+ (disj features :no-safe-draw)))
+
+(defn deprecated-options
+ "Checks if options map contains deprected options and removes them.
+ Prints messages how to fix deprecated functions."
+ [options]
+ (let [options (update-in options [:features] check-features-vector)]
+ (->> (for [[name value] options]
+ (if-let [[version message] (deprecated name)]
+ (do (println name "option was removed in Quil" version "." message)
+ nil)
+ [name value]))
+ (remove nil?)
+ (into {}))))
diff --git a/src/http/static/viz/2/quil/middlewares/deprecated_options.cljc.cache.json b/src/http/static/viz/2/quil/middlewares/deprecated_options.cljc.cache.json
new file mode 100644
index 0000000..b0ba153
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/deprecated_options.cljc.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$quil.middlewares.deprecated-options","~:imports",null,"~:requires",null,"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$deprecated",["^ ","^5","~$quil.middlewares.deprecated-options/deprecated","~:file","out/quil/middlewares/deprecated_options.cljc","~:line",3,"~:column",1,"~:end-line",3,"~:end-column",26,"~:private",true,"~:meta",["^ ","^>","/home/mediocregopher/src/viz/out/quil/middlewares/deprecated_options.cljc","^?",3,"^@",16,"^A",3,"^B",26,"^C",true],"~:tag","~$cljs.core/IMap"],"~$check-features-vector",["^ ","~:protocol-inline",null,"^D",["^ ","^>","/home/mediocregopher/src/viz/out/quil/middlewares/deprecated_options.cljc","^?",8,"^@",8,"^A",8,"^B",29,"^C",true,"~:arglists",["~#list",["~$quote",["^J",[["~$features"]]]]]],"^C",true,"^5","~$quil.middlewares.deprecated-options/check-features-vector","^>","out/quil/middlewares/deprecated_options.cljc","^B",29,"~:method-params",["^J",[["^L"]]],"~:protocol-impl",null,"~:arglists-meta",["^J",[null,null]],"^@",1,"~:variadic?",false,"^?",8,"~:ret-tag","~$any","^A",8,"~:max-fixed-arity",1,"~:fn-var",true,"^I",["^J",["^K",["^J",[["^L"]]]]]],"~$deprecated-options",["^ ","^H",null,"^D",["^ ","^>","/home/mediocregopher/src/viz/out/quil/middlewares/deprecated_options.cljc","^?",15,"^@",7,"^A",15,"^B",25,"^I",["^J",["^K",["^J",[["~$options"]]]]],"~:doc","Checks if options map contains deprected options and removes them.\n Prints messages how to fix deprecated functions."],"^5","~$quil.middlewares.deprecated-options/deprecated-options","^>","out/quil/middlewares/deprecated_options.cljc","^B",25,"^N",["^J",[["^W"]]],"^O",null,"^P",["^J",[null,null]],"^@",1,"^Q",false,"^?",15,"^R","^S","^A",15,"^T",1,"^U",true,"^I",["^J",["^K",["^J",[["^W"]]]]],"^X","Checks if options map contains deprected options and removes them.\n Prints messages how to fix deprecated functions."]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:cljs.analyzer/constants",["^ ","~:seen",["^4",["~:features","~:decor","~:safe-draw-fn","~:no-safe-draw","~:target"]],"~:order",["^13","^16","^14","^15","^12"]],"^X",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/middlewares/deprecated_options.js b/src/http/static/viz/2/quil/middlewares/deprecated_options.js
new file mode 100644
index 0000000..e80614c
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/deprecated_options.js
@@ -0,0 +1,95 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('quil.middlewares.deprecated_options');
+goog.require('cljs.core');
+quil.middlewares.deprecated_options.deprecated = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"decor","decor",-1730969431),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["2.0","Try :features [:present] for similar effect"], null),new cljs.core.Keyword(null,"target","target",253001721),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["2.0","Use :features [:keep-on-top] instead."], null),new cljs.core.Keyword(null,"safe-draw-fn","safe-draw-fn",1454900202),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["2.0","Use :features [:no-safe-fns] instead."], null)], null);
+quil.middlewares.deprecated_options.check_features_vector = (function quil$middlewares$deprecated_options$check_features_vector(features){
+var features__$1 = cljs.core.set.call(null,features);
+if(cljs.core.truth_(features__$1.call(null,new cljs.core.Keyword(null,"no-safe-draw","no-safe-draw",-1157778157)))){
+cljs.core.println.call(null,"Feature :no-safe-draw was renamed to :no-safe-fns in Quil 2.1.","Use :feature [:no-safe-fns] now.");
+} else {
+}
+
+return cljs.core.disj.call(null,features__$1,new cljs.core.Keyword(null,"no-safe-draw","no-safe-draw",-1157778157));
+});
+/**
+ * Checks if options map contains deprected options and removes them.
+ * Prints messages how to fix deprecated functions.
+ */
+quil.middlewares.deprecated_options.deprecated_options = (function quil$middlewares$deprecated_options$deprecated_options(options){
+var options__$1 = cljs.core.update_in.call(null,options,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"features","features",-1146962336)], null),quil.middlewares.deprecated_options.check_features_vector);
+return cljs.core.into.call(null,cljs.core.PersistentArrayMap.EMPTY,cljs.core.remove.call(null,cljs.core.nil_QMARK_,(function (){var iter__4434__auto__ = ((function (options__$1){
+return (function quil$middlewares$deprecated_options$deprecated_options_$_iter__1106(s__1107){
+return (new cljs.core.LazySeq(null,((function (options__$1){
+return (function (){
+var s__1107__$1 = s__1107;
+while(true){
+var temp__4657__auto__ = cljs.core.seq.call(null,s__1107__$1);
+if(temp__4657__auto__){
+var s__1107__$2 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_.call(null,s__1107__$2)){
+var c__4432__auto__ = cljs.core.chunk_first.call(null,s__1107__$2);
+var size__4433__auto__ = cljs.core.count.call(null,c__4432__auto__);
+var b__1109 = cljs.core.chunk_buffer.call(null,size__4433__auto__);
+if((function (){var i__1108 = (0);
+while(true){
+if((i__1108 < size__4433__auto__)){
+var vec__1110 = cljs.core._nth.call(null,c__4432__auto__,i__1108);
+var name = cljs.core.nth.call(null,vec__1110,(0),null);
+var value = cljs.core.nth.call(null,vec__1110,(1),null);
+cljs.core.chunk_append.call(null,b__1109,(function (){var temp__4655__auto__ = quil.middlewares.deprecated_options.deprecated.call(null,name);
+if(cljs.core.truth_(temp__4655__auto__)){
+var vec__1113 = temp__4655__auto__;
+var version = cljs.core.nth.call(null,vec__1113,(0),null);
+var message = cljs.core.nth.call(null,vec__1113,(1),null);
+cljs.core.println.call(null,name,"option was removed in Quil",version,".",message);
+
+return null;
+} else {
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [name,value], null);
+}
+})());
+
+var G__1122 = (i__1108 + (1));
+i__1108 = G__1122;
+continue;
+} else {
+return true;
+}
+break;
+}
+})()){
+return cljs.core.chunk_cons.call(null,cljs.core.chunk.call(null,b__1109),quil$middlewares$deprecated_options$deprecated_options_$_iter__1106.call(null,cljs.core.chunk_rest.call(null,s__1107__$2)));
+} else {
+return cljs.core.chunk_cons.call(null,cljs.core.chunk.call(null,b__1109),null);
+}
+} else {
+var vec__1116 = cljs.core.first.call(null,s__1107__$2);
+var name = cljs.core.nth.call(null,vec__1116,(0),null);
+var value = cljs.core.nth.call(null,vec__1116,(1),null);
+return cljs.core.cons.call(null,(function (){var temp__4655__auto__ = quil.middlewares.deprecated_options.deprecated.call(null,name);
+if(cljs.core.truth_(temp__4655__auto__)){
+var vec__1119 = temp__4655__auto__;
+var version = cljs.core.nth.call(null,vec__1119,(0),null);
+var message = cljs.core.nth.call(null,vec__1119,(1),null);
+cljs.core.println.call(null,name,"option was removed in Quil",version,".",message);
+
+return null;
+} else {
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [name,value], null);
+}
+})(),quil$middlewares$deprecated_options$deprecated_options_$_iter__1106.call(null,cljs.core.rest.call(null,s__1107__$2)));
+}
+} else {
+return null;
+}
+break;
+}
+});})(options__$1))
+,null,null));
+});})(options__$1))
+;
+return iter__4434__auto__.call(null,options__$1);
+})()));
+});
+
+//# sourceMappingURL=deprecated_options.js.map
diff --git a/src/http/static/viz/2/quil/middlewares/deprecated_options.js.map b/src/http/static/viz/2/quil/middlewares/deprecated_options.js.map
new file mode 100644
index 0000000..fdcedf9
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/deprecated_options.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/deprecated_options.js","sources":["deprecated_options.cljc"],"lineCount":95,"mappings":";AAAA;;AAEA,iDAAA,2CAAA,wDAAA,mFAAA,MAAA,sDAAA,wDAAA,mFAAA,MAAA,gDAAA,qEAAA,mFAAA,MAAA,loBAAeA;AAKf,4DAAA,5DAAOC,gIAAuB;AAA9B,AACE,IAAM,eAAS,AAACC,wBAAIC;AAApB,AACE,oBAAM,uBAAA,vBAACA;AAAP,AACE,4BAAA,iEAAA,7FAACC;;AADH;;AAGA,6CAAA,tCAACC,yBAAKF;;AAEV;;;;yDAAA,zDAAMG,0HAGH;AAHH,AAIE,IAAM,cAAQ,sCAAA,mFAAA,zHAACC,8BAAUC,iKAAoBP;AAA7C,mHACO,iBAAA,qBAAA,tFAKA,AAACuC,2BAAOC,9FACR,gCAAA,zBAACC;qFAND;AAAA,AAAA,YAAAjC,kBAAA,KAAA;;AAAA,AAAA,IAAA,cAAAC;;AAAA,AAAA,IAAA,qBAAA,AAAAC,wBAAAD;AAAA,AAAA,GAAAE;AAAA,AAAA,IAAA,cAAAA;AAAA,AAAA,GAAA,AAAAC,uCAAAH;AAAA,IAAA,kBA61E0C,AAAAiC,gCAAAjC;IA71E1C,qBAAA,AAAAI,0BAAAC;IAAA,UAAA,AAAAC,iCAAAC;AAAA,AAAA,GAAA,AAAA,iBAAA,UAAA;;AAAA,AAAA,GAAA,CAAAC,UAAAD;AAAA,IAAA,YAAA,AAAAE,yBAAAJ,gBAAAG;WAAA,AAAAE,wBAAAC,UAAA,IAAA,7CAAO;YAAP,AAAAD,wBAAAC,UAAA,IAAA,9CAAY;AAAZ,AAAA,AAAA,AAAAC,iCAAAC,QACE,iBAAA,qBAA2B,AAACvB,yDAAWoC;AAAvC,AAAA,oBAAAH;AAAA,IAAA,YAAAA;cAAA,AAAAb,wBAAAc,UAAA,IAAA,hDAAU;cAAV,AAAAd,wBAAAc,UAAA,IAAA,hDAAkB;AAAlB,AACE,AAAI,iCAAA,qCAAA,tEAAC9B,4BAAQgC,kCAAkCC,YAAYC;;AAA3D;;AADF,0FAGGF,KAAKG;;;;AAJV,cAAA,CAAArB,UAAA;;;;AAAA;;;;;AAAA,OAAAM,+BAAA,AAAAC,0BAAAF,SAAA,AAAAG,8EAAA,AAAAC,+BAAAjB;;AAAA,OAAAc,+BAAA,AAAAC,0BAAAF,SAAA;;;AAAA,IAAA,YAAA,AAAAK,0BAAAlB;WAAA,AAAAU,wBAAAS,UAAA,IAAA,7CAAO;YAAP,AAAAT,wBAAAS,UAAA,IAAA,9CAAY;AAAZ,AAAA,OAAAC,yBACE,iBAAA,qBAA2B,AAAC9B,yDAAWoC;AAAvC,AAAA,oBAAAH;AAAA,IAAA,YAAAA;cAAA,AAAAb,wBAAAe,UAAA,IAAA,hDAAU;cAAV,AAAAf,wBAAAe,UAAA,IAAA,hDAAkB;AAAlB,AACE,AAAI,iCAAA,qCAAA,tEAAC\/B,4BAAQgC,kCAAkCC,YAAYC;;AAA3D;;AADF,0FAGGF,KAAKG;;KAJV,AAAAb,8EAAA,AAAAK,yBAAArB;;;AAAA;;;;;CAAA,KAAA;;;AAAA,AAAA,OAAAsB,6BAAmBxB","names":["quil.middlewares.deprecated-options\/deprecated","quil.middlewares.deprecated-options\/check-features-vector","cljs.core\/set","features","cljs.core\/println","cljs.core\/disj","quil.middlewares.deprecated-options\/deprecated-options","cljs.core\/update-in","options","cljs.core\/LazySeq","s__1107","cljs.core\/seq","temp__4657__auto__","cljs.core\/chunked-seq?","cljs.core\/count","c__4432__auto__","cljs.core\/chunk-buffer","size__4433__auto__","i__1108","cljs.core\/-nth","cljs.core\/nth","vec__1110","cljs.core\/chunk-append","b__1109","cljs.core\/chunk-cons","cljs.core\/chunk","iter__1106","cljs.core\/chunk-rest","cljs.core\/first","vec__1116","cljs.core\/cons","cljs.core\/rest","iter__4434__auto__","temp__4655__auto__","vec__1113","vec__1119","name","version","message","value","cljs.core\/remove","cljs.core\/nil?","cljs.core\/into","cljs.core\/chunk-first"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/middlewares/fun_mode.cljc b/src/http/static/viz/2/quil/middlewares/fun_mode.cljc
new file mode 100644
index 0000000..14330c7
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/fun_mode.cljc
@@ -0,0 +1,78 @@
+(ns quil.middlewares.fun-mode
+ (:require [quil.core :as q]))
+
+(defn- wrap-setup [options]
+ (let [setup (:setup options (fn [] nil))]
+ (assoc options
+ :setup #(reset! (q/state-atom) (setup)))))
+
+(defn- wrap-draw-update [options]
+ (let [draw (:draw options (fn [_]))
+ update (:update options identity)
+ quil-draw #(-> (q/state-atom)
+ (swap! (if (= (q/frame-count) 1)
+ identity
+ update))
+ (draw))]
+ (-> options
+ (dissoc :update)
+ (assoc :draw quil-draw))))
+
+(defn- mouse-event []
+ {:x (q/mouse-x)
+ :y (q/mouse-y)})
+
+(defn- mouse-event-full []
+ {:x (q/mouse-x)
+ :y (q/mouse-y)
+ :button (q/mouse-button)})
+
+(defn- key-event []
+ {:key (q/key-as-keyword)
+ :key-code (q/key-code)
+ :raw-key (q/raw-key)
+ #?@(:clj [:modifiers (q/key-modifiers)])})
+
+(defn- wrap-handler
+ ([options handler-key]
+ (wrap-handler options handler-key nil))
+ ([options handler-key event-fn]
+ (if-let [handler (options handler-key)]
+ (assoc options handler-key
+ (if event-fn
+ #(swap! (q/state-atom) handler (event-fn))
+ #(swap! (q/state-atom) handler)))
+ options)))
+
+(defn- wrap-handlers [options & handlers]
+ (reduce (fn [options handler]
+ (if (keyword? handler)
+ (wrap-handler options handler)
+ (apply wrap-handler options handler)))
+ options handlers))
+
+(defn- wrap-mouse-wheel [options]
+ (if-let [handler (:mouse-wheel options)]
+ (assoc options :mouse-wheel
+ (fn [rotation]
+ (swap! (q/state-atom) handler rotation)))
+ options))
+
+(defn fun-mode
+ "Introduces function mode making all handlers (setup, draw, mouse-click, etc)
+ state-aware. Adds support for 'update' function."
+ [options]
+ (-> options
+ wrap-setup
+ wrap-draw-update
+ (wrap-handlers :focus-gained :focus-lost [:mouse-entered mouse-event]
+ [:mouse-exited mouse-event] [:mouse-pressed mouse-event-full]
+ [:mouse-released mouse-event] [:mouse-clicked mouse-event-full]
+ [:mouse-moved (fn [] {:x (q/mouse-x) :y (q/mouse-y)
+ :p-x (q/pmouse-x) :p-y (q/pmouse-y)})]
+ [:mouse-dragged (fn [] {:x (q/mouse-x) :y (q/mouse-y)
+ :p-x (q/pmouse-x) :p-y (q/pmouse-y)
+ :button (q/mouse-button)})]
+ [:key-pressed key-event] :key-released [:key-typed key-event]
+ :on-close)
+ wrap-mouse-wheel))
diff --git a/src/http/static/viz/2/quil/middlewares/fun_mode.cljc.cache.json b/src/http/static/viz/2/quil/middlewares/fun_mode.cljc.cache.json
new file mode 100644
index 0000000..26e797e
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/fun_mode.cljc.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:externs",["^ ","~$Error",["^ "]],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$quil.middlewares.fun-mode","~:imports",null,"~:requires",["^ ","~$q","~$quil.core","^;","^;"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$wrap-setup",["^ ","~:protocol-inline",null,"~:meta",["^ ","~:file","/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc","~:line",4,"~:column",8,"~:end-line",4,"~:end-column",18,"~:private",true,"~:arglists",["~#list",["~$quote",["^I",[["~$options"]]]]]],"^G",true,"^7","~$quil.middlewares.fun-mode/wrap-setup","^B","out/quil/middlewares/fun_mode.cljc","^F",18,"~:method-params",["^I",[["^K"]]],"~:protocol-impl",null,"~:arglists-meta",["^I",[null,null]],"^D",1,"~:variadic?",false,"^C",4,"~:ret-tag","~$any","^E",4,"~:max-fixed-arity",1,"~:fn-var",true,"^H",["^I",["^J",["^I",[["^K"]]]]]],"~$wrap-draw-update",["^ ","^@",null,"^A",["^ ","^B","/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc","^C",9,"^D",8,"^E",9,"^F",24,"^G",true,"^H",["^I",["^J",["^I",[["^K"]]]]]],"^G",true,"^7","~$quil.middlewares.fun-mode/wrap-draw-update","^B","out/quil/middlewares/fun_mode.cljc","^F",24,"^M",["^I",[["^K"]]],"^N",null,"^O",["^I",[null,null]],"^D",1,"^P",false,"^C",9,"^Q","^R","^E",9,"^S",1,"^T",true,"^H",["^I",["^J",["^I",[["^K"]]]]]],"~$mouse-event",["^ ","^@",null,"^A",["^ ","^B","/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc","^C",21,"^D",8,"^E",21,"^F",19,"^G",true,"^H",["^I",["^J",["^I",[[]]]]]],"^G",true,"^7","~$quil.middlewares.fun-mode/mouse-event","^B","out/quil/middlewares/fun_mode.cljc","^F",19,"^M",["^I",[[]]],"^N",null,"^O",["^I",[null,null]],"^D",1,"^P",false,"^C",21,"^Q","~$cljs.core/IMap","^E",21,"^S",0,"^T",true,"^H",["^I",["^J",["^I",[[]]]]]],"~$mouse-event-full",["^ ","^@",null,"^A",["^ ","^B","/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc","^C",25,"^D",8,"^E",25,"^F",24,"^G",true,"^H",["^I",["^J",["^I",[[]]]]]],"^G",true,"^7","~$quil.middlewares.fun-mode/mouse-event-full","^B","out/quil/middlewares/fun_mode.cljc","^F",24,"^M",["^I",[[]]],"^N",null,"^O",["^I",[null,null]],"^D",1,"^P",false,"^C",25,"^Q","^Y","^E",25,"^S",0,"^T",true,"^H",["^I",["^J",["^I",[[]]]]]],"~$key-event",["^ ","^@",null,"^A",["^ ","^B","/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc","^C",30,"^D",8,"^E",30,"^F",17,"^G",true,"^H",["^I",["^J",["^I",[[]]]]]],"^G",true,"^7","~$quil.middlewares.fun-mode/key-event","^B","out/quil/middlewares/fun_mode.cljc","^F",17,"^M",["^I",[[]]],"^N",null,"^O",["^I",[null,null]],"^D",1,"^P",false,"^C",30,"^Q","^Y","^E",30,"^S",0,"^T",true,"^H",["^I",["^J",["^I",[[]]]]]],"~$wrap-handler",["^ ","^@",null,"^A",["^ ","^B","/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc","^C",36,"^D",8,"^E",36,"^F",20,"^G",true,"^H",["^I",["^J",["^I",[["^K","~$handler-key"],["^K","^13","~$event-fn"]]]]],"~:top-fn",["^ ","^P",false,"^S",3,"^M",["^I",[["^K","^13"],["^K","^13","^14"]]],"^H",["^I",[["^K","^13"],["^K","^13","^14"]]],"^O",["^I",[null,null]]]],"^G",true,"^7","~$quil.middlewares.fun-mode/wrap-handler","^B","out/quil/middlewares/fun_mode.cljc","^F",20,"^15",["^ ","^P",false,"^S",3,"^M",["^I",[["^K","^13"],["^K","^13","^14"]]],"^H",["^I",[["^K","^13"],["^K","^13","^14"]]],"^O",["^I",[null,null]]],"^M",["^I",[["^K","^13"],["^K","^13","^14"]]],"^N",null,"^O",["^I",[null,null]],"^D",1,"^P",false,"^C",36,"^E",36,"^S",3,"^T",true,"^H",["^I",[["^K","^13"],["^K","^13","^14"]]]],"~$wrap-handlers",["^ ","^@",null,"^A",["^ ","^B","/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc","^C",47,"^D",8,"^E",47,"^F",21,"^G",true,"^H",["^I",["^J",["^I",[["^K","~$&","~$handlers"]]]]],"^15",["^ ","^P",true,"^S",1,"^M",[["^I",["^K","^18"]]],"^H",["^I",[["^K","~$&","^18"]]],"^O",["^I",[null]]]],"^G",true,"^7","~$quil.middlewares.fun-mode/wrap-handlers","^B","out/quil/middlewares/fun_mode.cljc","^F",21,"^15",["^ ","^P",true,"^S",1,"^M",[["^I",["^K","^18"]]],"^H",["^I",[["^K","~$&","^18"]]],"^O",["^I",[null]]],"^M",[["^I",["^K","^18"]]],"^N",null,"^O",["^I",[null]],"^D",1,"^P",true,"^C",47,"^Q","^R","^E",47,"^S",1,"^T",true,"^H",["^I",[["^K","~$&","^18"]]]],"~$wrap-mouse-wheel",["^ ","^@",null,"^A",["^ ","^B","/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc","^C",54,"^D",8,"^E",54,"^F",24,"^G",true,"^H",["^I",["^J",["^I",[["^K"]]]]]],"^G",true,"^7","~$quil.middlewares.fun-mode/wrap-mouse-wheel","^B","out/quil/middlewares/fun_mode.cljc","^F",24,"^M",["^I",[["^K"]]],"^N",null,"^O",["^I",[null,null]],"^D",1,"^P",false,"^C",54,"^Q",["^6",[null,"^R"]],"^E",54,"^S",1,"^T",true,"^H",["^I",["^J",["^I",[["^K"]]]]]],"~$fun-mode",["^ ","^@",null,"^A",["^ ","^B","/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc","^C",61,"^D",7,"^E",61,"^F",15,"^H",["^I",["^J",["^I",[["^K"]]]]],"~:doc","Introduces function mode making all handlers (setup, draw, mouse-click, etc)\n state-aware. Adds support for 'update' function."],"^7","~$quil.middlewares.fun-mode/fun-mode","^B","out/quil/middlewares/fun_mode.cljc","^F",15,"^M",["^I",[["^K"]]],"^N",null,"^O",["^I",[null,null]],"^D",1,"^P",false,"^C",61,"^Q",["^6",[null,"^R"]],"^E",61,"^S",1,"^T",true,"^H",["^I",["^J",["^I",[["^K"]]]]],"^1=","Introduces function mode making all handlers (setup, draw, mouse-click, etc)\n state-aware. Adds support for 'update' function."]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:cljs.analyzer/constants",["^ ","~:seen",["^6",["~:y","~:key-code","~:p-y","~:key-typed","~:mouse-clicked","~:mouse-released","~:mouse-exited","~:key","~:on-close","~:button","~:mouse-wheel","~:mouse-moved","~:update","~:setup","~:mouse-pressed","~:focus-gained","~:mouse-entered","~:focus-lost","~:key-pressed","~:key-released","~:p-x","~:x","~:raw-key","~:draw","~:mouse-dragged"]],"~:order",["^1O","^1X","^1N","~:x","~:y","^1K","^1I","^1C","^1W","^1L","^1Q","^1S","^1R","^1H","^1P","^1G","^1F","^1M","^1V","^1D","^1Y","^1T","^1U","^1E","^1J"]],"^1=",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/middlewares/fun_mode.js b/src/http/static/viz/2/quil/middlewares/fun_mode.js
new file mode 100644
index 0000000..5eabdf8
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/fun_mode.js
@@ -0,0 +1,142 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('quil.middlewares.fun_mode');
+goog.require('cljs.core');
+goog.require('quil.core');
+quil.middlewares.fun_mode.wrap_setup = (function quil$middlewares$fun_mode$wrap_setup(options){
+var setup = new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$2(options,(function (){
+return null;
+}));
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"setup","setup",1987730512),((function (setup){
+return (function (){
+return cljs.core.reset_BANG_.call(null,quil.core.state_atom.call(null),setup.call(null));
+});})(setup))
+);
+});
+quil.middlewares.fun_mode.wrap_draw_update = (function quil$middlewares$fun_mode$wrap_draw_update(options){
+var draw = new cljs.core.Keyword(null,"draw","draw",1358331674).cljs$core$IFn$_invoke$arity$2(options,(function (_){
+return null;
+}));
+var update = new cljs.core.Keyword(null,"update","update",1045576396).cljs$core$IFn$_invoke$arity$2(options,cljs.core.identity);
+var quil_draw = ((function (draw,update){
+return (function (){
+return draw.call(null,cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),((cljs.core._EQ_.call(null,quil.core.frame_count.call(null),(1)))?cljs.core.identity:update)));
+});})(draw,update))
+;
+return cljs.core.assoc.call(null,cljs.core.dissoc.call(null,options,new cljs.core.Keyword(null,"update","update",1045576396)),new cljs.core.Keyword(null,"draw","draw",1358331674),quil_draw);
+});
+quil.middlewares.fun_mode.mouse_event = (function quil$middlewares$fun_mode$mouse_event(){
+return new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null)], null);
+});
+quil.middlewares.fun_mode.mouse_event_full = (function quil$middlewares$fun_mode$mouse_event_full(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null),new cljs.core.Keyword(null,"button","button",1456579943),quil.core.mouse_button.call(null)], null);
+});
+quil.middlewares.fun_mode.key_event = (function quil$middlewares$fun_mode$key_event(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"key","key",-1516042587),quil.core.key_as_keyword.call(null),new cljs.core.Keyword(null,"key-code","key-code",-1732114304),quil.core.key_code.call(null),new cljs.core.Keyword(null,"raw-key","raw-key",-162482279),quil.core.raw_key.call(null)], null);
+});
+quil.middlewares.fun_mode.wrap_handler = (function quil$middlewares$fun_mode$wrap_handler(var_args){
+var G__2134 = arguments.length;
+switch (G__2134) {
+case 2:
+return quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$2 = (function (options,handler_key){
+return quil.middlewares.fun_mode.wrap_handler.call(null,options,handler_key,null);
+});
+
+quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$3 = (function (options,handler_key,event_fn){
+var temp__4655__auto__ = options.call(null,handler_key);
+if(cljs.core.truth_(temp__4655__auto__)){
+var handler = temp__4655__auto__;
+return cljs.core.assoc.call(null,options,handler_key,(cljs.core.truth_(event_fn)?((function (handler,temp__4655__auto__){
+return (function (){
+return cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),handler,event_fn.call(null));
+});})(handler,temp__4655__auto__))
+:((function (handler,temp__4655__auto__){
+return (function (){
+return cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),handler);
+});})(handler,temp__4655__auto__))
+));
+} else {
+return options;
+}
+});
+
+quil.middlewares.fun_mode.wrap_handler.cljs$lang$maxFixedArity = 3;
+
+quil.middlewares.fun_mode.wrap_handlers = (function quil$middlewares$fun_mode$wrap_handlers(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___2138 = arguments.length;
+var i__4642__auto___2139 = (0);
+while(true){
+if((i__4642__auto___2139 < len__4641__auto___2138)){
+args__4647__auto__.push((arguments[i__4642__auto___2139]));
+
+var G__2140 = (i__4642__auto___2139 + (1));
+i__4642__auto___2139 = G__2140;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((1) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((1)),(0),null)):null);
+return quil.middlewares.fun_mode.wrap_handlers.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__4648__auto__);
+});
+
+quil.middlewares.fun_mode.wrap_handlers.cljs$core$IFn$_invoke$arity$variadic = (function (options,handlers){
+return cljs.core.reduce.call(null,(function (options__$1,handler){
+if((handler instanceof cljs.core.Keyword)){
+return quil.middlewares.fun_mode.wrap_handler.call(null,options__$1,handler);
+} else {
+return cljs.core.apply.call(null,quil.middlewares.fun_mode.wrap_handler,options__$1,handler);
+}
+}),options,handlers);
+});
+
+quil.middlewares.fun_mode.wrap_handlers.cljs$lang$maxFixedArity = (1);
+
+/** @this {Function} */
+quil.middlewares.fun_mode.wrap_handlers.cljs$lang$applyTo = (function (seq2136){
+var G__2137 = cljs.core.first.call(null,seq2136);
+var seq2136__$1 = cljs.core.next.call(null,seq2136);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__2137,seq2136__$1);
+});
+
+quil.middlewares.fun_mode.wrap_mouse_wheel = (function quil$middlewares$fun_mode$wrap_mouse_wheel(options){
+var temp__4655__auto__ = new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439).cljs$core$IFn$_invoke$arity$1(options);
+if(cljs.core.truth_(temp__4655__auto__)){
+var handler = temp__4655__auto__;
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439),((function (handler,temp__4655__auto__){
+return (function (rotation){
+return cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),handler,rotation);
+});})(handler,temp__4655__auto__))
+);
+} else {
+return options;
+}
+});
+/**
+ * Introduces function mode making all handlers (setup, draw, mouse-click, etc)
+ * state-aware. Adds support for 'update' function.
+ */
+quil.middlewares.fun_mode.fun_mode = (function quil$middlewares$fun_mode$fun_mode(options){
+return quil.middlewares.fun_mode.wrap_mouse_wheel.call(null,quil.middlewares.fun_mode.wrap_handlers.call(null,quil.middlewares.fun_mode.wrap_draw_update.call(null,quil.middlewares.fun_mode.wrap_setup.call(null,options)),new cljs.core.Keyword(null,"focus-gained","focus-gained",-857086384),new cljs.core.Keyword(null,"focus-lost","focus-lost",-554849613),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-entered","mouse-entered",811350322),quil.middlewares.fun_mode.mouse_event], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-exited","mouse-exited",-483205244),quil.middlewares.fun_mode.mouse_event], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-pressed","mouse-pressed",736955536),quil.middlewares.fun_mode.mouse_event_full], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-released","mouse-released",-664480061),quil.middlewares.fun_mode.mouse_event], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-clicked","mouse-clicked",-199339421),quil.middlewares.fun_mode.mouse_event_full], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-moved","mouse-moved",-1918152310),(function (){
+return new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null),new cljs.core.Keyword(null,"p-x","p-x",-1721211211),quil.core.pmouse_x.call(null),new cljs.core.Keyword(null,"p-y","p-y",-530704830),quil.core.pmouse_y.call(null)], null);
+})], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441),(function (){
+return new cljs.core.PersistentArrayMap(null, 5, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null),new cljs.core.Keyword(null,"p-x","p-x",-1721211211),quil.core.pmouse_x.call(null),new cljs.core.Keyword(null,"p-y","p-y",-530704830),quil.core.pmouse_y.call(null),new cljs.core.Keyword(null,"button","button",1456579943),quil.core.mouse_button.call(null)], null);
+})], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364),quil.middlewares.fun_mode.key_event], null),new cljs.core.Keyword(null,"key-released","key-released",215919828),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"key-typed","key-typed",-876037597),quil.middlewares.fun_mode.key_event], null),new cljs.core.Keyword(null,"on-close","on-close",-761178394)));
+});
+
+//# sourceMappingURL=fun_mode.js.map
diff --git a/src/http/static/viz/2/quil/middlewares/fun_mode.js.map b/src/http/static/viz/2/quil/middlewares/fun_mode.js.map
new file mode 100644
index 0000000..459ff6e
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/fun_mode.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/fun_mode.js","sources":["fun_mode.cljc"],"lineCount":142,"mappings":"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\/C,\/CACAD,rDACAM,lDACA,kDAAA,qDAAA,yDAAA,qEAAA,iEAAA,mFAAA,oHAAA,mFAAA,mHAAA,mFAAA,yHAAA,mFAAA,uHAAA,mFAAA,0HAAA,mFAAA,z2CAAC6B,+bAAwDpB,sMAC3BA,uMAA6BG,+MAC3BH,wMAA6BG,0MAChC,l+CAO7B4B;AAP6B,AAAA,kDAAA,4EAAA,6EAAA,kFAAA,5LAAW,AAAC9B,6EAAc,AAACC,iFACd,AAACgC,iFAAiB,AAACC;WAJ7D,mFAAA,wEAK+B;AAAA,AAAA,kDAAA,4EAAA,6EAAA,kFAAA,iFAAA,7QAAW,AAAClC,6EAAc,AAACC,iFACd,AAACgC,iFAAiB,AAACC,uFAChB,AAAC\/B;WAPhD,mFAAA,+GAAA,oEAAA,mFAAA,2GAAA,9SAQ6BC,kQAAqCA","names":["quil.middlewares.fun-mode\/wrap-setup","options","cljs.core\/assoc","cljs.core\/reset!","quil.core\/state-atom","setup","quil.middlewares.fun-mode\/wrap-draw-update","cljs.core\/identity","cljs.core\/swap!","cljs.core\/=","quil.core\/frame-count","update","draw","cljs.core\/dissoc","quil-draw","quil.middlewares.fun-mode\/mouse-event","quil.core\/mouse-x","quil.core\/mouse-y","quil.middlewares.fun-mode\/mouse-event-full","quil.core\/mouse-button","quil.middlewares.fun-mode\/key-event","quil.core\/key-as-keyword","quil.core\/key-code","quil.core\/raw-key","G__2134","quil.middlewares.fun-mode\/wrap-handler","js\/Error","handler-key","temp__4655__auto__","event-fn","handler","i__4642__auto__","len__4641__auto__","args__4647__auto__","cljs.core\/IndexedSeq","quil.middlewares.fun-mode\/wrap-handlers","argseq__4648__auto__","cljs.core\/first","seq2136","cljs.core\/next","self__4628__auto__","G__2137","cljs.core\/reduce","cljs.core\/Keyword","cljs.core\/apply","handlers","quil.middlewares.fun-mode\/wrap-mouse-wheel","rotation","quil.middlewares.fun-mode\/fun-mode","quil.core\/pmouse-x","quil.core\/pmouse-y"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/middlewares/navigation_2d.cljc b/src/http/static/viz/2/quil/middlewares/navigation_2d.cljc
new file mode 100644
index 0000000..cd03710
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/navigation_2d.cljc
@@ -0,0 +1,89 @@
+(ns quil.middlewares.navigation-2d
+ (:require [quil.core :as q :include-macros true]))
+
+(def ^:private missing-navigation-key-error
+ (str "state map is missing :navigation-2d key. "
+ "Did you accidentally removed it from the state in "
+ ":update or any other handler?"))
+
+(defn- assert-state-has-navigation
+ "Asserts that state map contains :navigation-2d object."
+ [state]
+ (when-not (:navigation-2d state)
+ (throw #?(:clj (RuntimeException. missing-navigation-key-error)
+ :cljs (js/Error. missing-navigation-key-error)))))
+
+(defn- default-position
+ "Default position configuration: zoom is neutral and central point is
+ width/2, height/2."
+ []
+ {:position [(/ (q/width) 2.0)
+ (/ (q/height) 2.0)]
+ :zoom 1})
+
+(defn- setup-2d-nav
+ "Custom 'setup' function which creates initial position
+ configuration and puts it to the state map."
+ [user-setup user-settings]
+ (let [initial-state (-> user-settings
+ (select-keys [:position :zoom])
+ (->> (merge (default-position))))]
+ (update-in (user-setup) [:navigation-2d]
+ #(merge initial-state %))))
+
+(defn- mouse-dragged
+ "Changes center of the sketch depending on the last mouse move. Takes
+ zoom into account as well."
+ [state event]
+ (assert-state-has-navigation state)
+ (let [dx (- (:p-x event) (:x event))
+ dy (- (:p-y event) (:y event))
+ zoom (-> state :navigation-2d :zoom)]
+ (-> state
+ (update-in [:navigation-2d :position 0] + (/ dx zoom))
+ (update-in [:navigation-2d :position 1] + (/ dy zoom)))))
+
+(defn- mouse-wheel
+ "Changes zoom settings based on scroll."
+ [state event]
+ (assert-state-has-navigation state)
+ (update-in state [:navigation-2d :zoom] * (+ 1 (* -0.1 event))))
+
+(defn- draw
+ "Calls user draw function with necessary all transformations (position
+ and zoom) applied."
+ [user-draw state]
+ (assert-state-has-navigation state)
+ (q/push-matrix)
+ (let [nav-2d (:navigation-2d state)
+ zoom (:zoom nav-2d)
+ pos (:position nav-2d)]
+ (q/scale zoom)
+ (q/with-translation [(- (/ (q/width) 2 zoom) (first pos))
+ (- (/ (q/height) 2 zoom) (second pos))]
+ (user-draw state)))
+ (q/pop-matrix))
+
+(defn navigation-2d
+ "Enables navigation over 2D sketch. Dragging mouse will move center of the
+ skecth and mouse wheel controls zoom."
+ [options]
+ (let [; 2d-navigation related user settings
+ user-settings (:navigation-2d options)
+
+ ; user-provided handlers which will be overridden
+ ; by 3d-navigation
+ user-draw (:draw options (fn [state]))
+ user-mouse-dragged (:mouse-dragged options (fn [state _] state))
+ user-mouse-wheel (:mouse-wheel options (fn [state _] state))
+ setup (:setup options (fn [] {}))]
+ (assoc options
+
+ :setup (partial setup-2d-nav setup user-settings)
+
+ :draw (partial draw user-draw)
+
+ :mouse-dragged (fn [state event]
+ (user-mouse-dragged (mouse-dragged state event) event))
+ :mouse-wheel (fn [state event]
+ (user-mouse-wheel (mouse-wheel state event) event)))))
diff --git a/src/http/static/viz/2/quil/middlewares/navigation_2d.cljc.cache.json b/src/http/static/viz/2/quil/middlewares/navigation_2d.cljc.cache.json
new file mode 100644
index 0000000..664f7ef
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/navigation_2d.cljc.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:externs",["^ ","~$Error",["^ "]],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$quil.middlewares.navigation-2d","~:imports",null,"~:requires",["^ ","~$q","~$quil.core","^;","^;"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$missing-navigation-key-error",["^ ","^7","~$quil.middlewares.navigation-2d/missing-navigation-key-error","~:file","out/quil/middlewares/navigation_2d.cljc","~:line",4,"~:column",1,"~:end-line",4,"~:end-column",44,"~:private",true,"~:meta",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc","^B",4,"^C",16,"^D",4,"^E",44,"^F",true],"~:tag","~$any"],"~$assert-state-has-navigation",["^ ","~:protocol-inline",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc","^B",9,"^C",8,"^D",9,"^E",35,"^F",true,"~:arglists",["~#list",["~$quote",["^M",[["~$state"]]]]],"~:doc","Asserts that state map contains :navigation-2d object."],"^F",true,"^7","~$quil.middlewares.navigation-2d/assert-state-has-navigation","^A","out/quil/middlewares/navigation_2d.cljc","^E",35,"~:method-params",["^M",[["^O"]]],"~:protocol-impl",null,"~:arglists-meta",["^M",[null,null]],"^C",1,"~:variadic?",false,"^B",9,"~:ret-tag","~$clj-nil","^D",9,"~:max-fixed-arity",1,"~:fn-var",true,"^L",["^M",["^N",["^M",[["^O"]]]]],"^P","Asserts that state map contains :navigation-2d object."],"~$default-position",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc","^B",16,"^C",8,"^D",16,"^E",24,"^F",true,"^L",["^M",["^N",["^M",[[]]]]],"^P","Default position configuration: zoom is neutral and central point is\n width/2, height/2."],"^F",true,"^7","~$quil.middlewares.navigation-2d/default-position","^A","out/quil/middlewares/navigation_2d.cljc","^E",24,"^R",["^M",[[]]],"^S",null,"^T",["^M",[null,null]],"^C",1,"^U",false,"^B",16,"^V","~$cljs.core/IMap","^D",16,"^X",0,"^Y",true,"^L",["^M",["^N",["^M",[[]]]]],"^P","Default position configuration: zoom is neutral and central point is\n width/2, height/2."],"~$setup-2d-nav",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc","^B",24,"^C",8,"^D",24,"^E",20,"^F",true,"^L",["^M",["^N",["^M",[["~$user-setup","~$user-settings"]]]]],"^P","Custom 'setup' function which creates initial position\n configuration and puts it to the state map."],"^F",true,"^7","~$quil.middlewares.navigation-2d/setup-2d-nav","^A","out/quil/middlewares/navigation_2d.cljc","^E",20,"^R",["^M",[["^12","^13"]]],"^S",null,"^T",["^M",[null,null]],"^C",1,"^U",false,"^B",24,"^V","^I","^D",24,"^X",2,"^Y",true,"^L",["^M",["^N",["^M",[["^12","^13"]]]]],"^P","Custom 'setup' function which creates initial position\n configuration and puts it to the state map."],"~$mouse-dragged",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc","^B",34,"^C",8,"^D",34,"^E",21,"^F",true,"^L",["^M",["^N",["^M",[["^O","~$event"]]]]],"^P","Changes center of the sketch depending on the last mouse move. Takes\n zoom into account as well."],"^F",true,"^7","~$quil.middlewares.navigation-2d/mouse-dragged","^A","out/quil/middlewares/navigation_2d.cljc","^E",21,"^R",["^M",[["^O","^16"]]],"^S",null,"^T",["^M",[null,null]],"^C",1,"^U",false,"^B",34,"^V","^I","^D",34,"^X",2,"^Y",true,"^L",["^M",["^N",["^M",[["^O","^16"]]]]],"^P","Changes center of the sketch depending on the last mouse move. Takes\n zoom into account as well."],"~$mouse-wheel",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc","^B",46,"^C",8,"^D",46,"^E",19,"^F",true,"^L",["^M",["^N",["^M",[["^O","^16"]]]]],"^P","Changes zoom settings based on scroll."],"^F",true,"^7","~$quil.middlewares.navigation-2d/mouse-wheel","^A","out/quil/middlewares/navigation_2d.cljc","^E",19,"^R",["^M",[["^O","^16"]]],"^S",null,"^T",["^M",[null,null]],"^C",1,"^U",false,"^B",46,"^V","^I","^D",46,"^X",2,"^Y",true,"^L",["^M",["^N",["^M",[["^O","^16"]]]]],"^P","Changes zoom settings based on scroll."],"~$draw",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc","^B",52,"^C",8,"^D",52,"^E",12,"^F",true,"^L",["^M",["^N",["^M",[["~$user-draw","^O"]]]]],"^P","Calls user draw function with necessary all transformations (position\n and zoom) applied."],"^F",true,"^7","~$quil.middlewares.navigation-2d/draw","^A","out/quil/middlewares/navigation_2d.cljc","^E",12,"^R",["^M",[["^1;","^O"]]],"^S",null,"^T",["^M",[null,null]],"^C",1,"^U",false,"^B",52,"^V","^I","^D",52,"^X",2,"^Y",true,"^L",["^M",["^N",["^M",[["^1;","^O"]]]]],"^P","Calls user draw function with necessary all transformations (position\n and zoom) applied."],"~$navigation-2d",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc","^B",67,"^C",7,"^D",67,"^E",20,"^L",["^M",["^N",["^M",[["~$options"]]]]],"^P","Enables navigation over 2D sketch. Dragging mouse will move center of the\n skecth and mouse wheel controls zoom."],"^7","~$quil.middlewares.navigation-2d/navigation-2d","^A","out/quil/middlewares/navigation_2d.cljc","^E",20,"^R",["^M",[["^1>"]]],"^S",null,"^T",["^M",[null,null]],"^C",1,"^U",false,"^B",67,"^V","^I","^D",67,"^X",1,"^Y",true,"^L",["^M",["^N",["^M",[["^1>"]]]]],"^P","Enables navigation over 2D sketch. Dragging mouse will move center of the\n skecth and mouse wheel controls zoom."]],"~:cljs.spec/registry-ref",[],"~:require-macros",["^ ","~$q","^;","^;","^;"],"~:cljs.analyzer/constants",["^ ","~:seen",["^6",["~:y","~:p-y","~:zoom","~:mouse-wheel","~:setup","~:p-x","~:position","~:x","~:draw","~:navigation-2d","~:mouse-dragged"]],"~:order",["^1K","^1I","^1E","^1H","~:x","^1D","~:y","^1J","^1L","^1F","^1G"]],"^P",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/middlewares/navigation_2d.js b/src/http/static/viz/2/quil/middlewares/navigation_2d.js
new file mode 100644
index 0000000..9403a91
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/navigation_2d.js
@@ -0,0 +1,116 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('quil.middlewares.navigation_2d');
+goog.require('cljs.core');
+goog.require('quil.core');
+quil.middlewares.navigation_2d.missing_navigation_key_error = ["state map is missing :navigation-2d key. ","Did you accidentally removed it from the state in ",":update or any other handler?"].join('');
+/**
+ * Asserts that state map contains :navigation-2d object.
+ */
+quil.middlewares.navigation_2d.assert_state_has_navigation = (function quil$middlewares$navigation_2d$assert_state_has_navigation(state){
+if(cljs.core.truth_(new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(state))){
+return null;
+} else {
+throw (new Error(quil.middlewares.navigation_2d.missing_navigation_key_error));
+}
+});
+/**
+ * Default position configuration: zoom is neutral and central point is
+ * width/2, height/2.
+ */
+quil.middlewares.navigation_2d.default_position = (function quil$middlewares$navigation_2d$default_position(){
+return new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"position","position",-2011731912),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(quil.core.width.call(null) / 2.0),(quil.core.height.call(null) / 2.0)], null),new cljs.core.Keyword(null,"zoom","zoom",-1827487038),(1)], null);
+});
+/**
+ * Custom 'setup' function which creates initial position
+ * configuration and puts it to the state map.
+ */
+quil.middlewares.navigation_2d.setup_2d_nav = (function quil$middlewares$navigation_2d$setup_2d_nav(user_setup,user_settings){
+var initial_state = cljs.core.merge.call(null,quil.middlewares.navigation_2d.default_position.call(null),cljs.core.select_keys.call(null,user_settings,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"position","position",-2011731912),new cljs.core.Keyword(null,"zoom","zoom",-1827487038)], null)));
+return cljs.core.update_in.call(null,user_setup.call(null),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611)], null),((function (initial_state){
+return (function (p1__2126_SHARP_){
+return cljs.core.merge.call(null,initial_state,p1__2126_SHARP_);
+});})(initial_state))
+);
+});
+/**
+ * Changes center of the sketch depending on the last mouse move. Takes
+ * zoom into account as well.
+ */
+quil.middlewares.navigation_2d.mouse_dragged = (function quil$middlewares$navigation_2d$mouse_dragged(state,event){
+quil.middlewares.navigation_2d.assert_state_has_navigation.call(null,state);
+
+var dx = (new cljs.core.Keyword(null,"p-x","p-x",-1721211211).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"x","x",2099068185).cljs$core$IFn$_invoke$arity$1(event));
+var dy = (new cljs.core.Keyword(null,"p-y","p-y",-530704830).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"y","y",-1757859776).cljs$core$IFn$_invoke$arity$1(event));
+var zoom = new cljs.core.Keyword(null,"zoom","zoom",-1827487038).cljs$core$IFn$_invoke$arity$1(new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(state));
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611),new cljs.core.Keyword(null,"position","position",-2011731912),(0)], null),cljs.core._PLUS_,(dx / zoom)),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611),new cljs.core.Keyword(null,"position","position",-2011731912),(1)], null),cljs.core._PLUS_,(dy / zoom));
+});
+/**
+ * Changes zoom settings based on scroll.
+ */
+quil.middlewares.navigation_2d.mouse_wheel = (function quil$middlewares$navigation_2d$mouse_wheel(state,event){
+quil.middlewares.navigation_2d.assert_state_has_navigation.call(null,state);
+
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611),new cljs.core.Keyword(null,"zoom","zoom",-1827487038)], null),cljs.core._STAR_,((1) + (-0.1 * event)));
+});
+/**
+ * Calls user draw function with necessary all transformations (position
+ * and zoom) applied.
+ */
+quil.middlewares.navigation_2d.draw = (function quil$middlewares$navigation_2d$draw(user_draw,state){
+quil.middlewares.navigation_2d.assert_state_has_navigation.call(null,state);
+
+quil.core.push_matrix.call(null);
+
+var nav_2d_2127 = new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(state);
+var zoom_2128 = new cljs.core.Keyword(null,"zoom","zoom",-1827487038).cljs$core$IFn$_invoke$arity$1(nav_2d_2127);
+var pos_2129 = new cljs.core.Keyword(null,"position","position",-2011731912).cljs$core$IFn$_invoke$arity$1(nav_2d_2127);
+quil.core.scale.call(null,zoom_2128);
+
+var tr__2049__auto___2130 = new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(((quil.core.width.call(null) / (2)) / zoom_2128) - cljs.core.first.call(null,pos_2129)),(((quil.core.height.call(null) / (2)) / zoom_2128) - cljs.core.second.call(null,pos_2129))], null);
+quil.core.push_matrix.call(null);
+
+try{quil.core.translate.call(null,tr__2049__auto___2130);
+
+user_draw.call(null,state);
+}finally {quil.core.pop_matrix.call(null);
+}
+return quil.core.pop_matrix.call(null);
+});
+/**
+ * Enables navigation over 2D sketch. Dragging mouse will move center of the
+ * skecth and mouse wheel controls zoom.
+ */
+quil.middlewares.navigation_2d.navigation_2d = (function quil$middlewares$navigation_2d$navigation_2d(options){
+var user_settings = new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(options);
+var user_draw = new cljs.core.Keyword(null,"draw","draw",1358331674).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings){
+return (function (state){
+return null;
+});})(user_settings))
+);
+var user_mouse_dragged = new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,user_draw){
+return (function (state,_){
+return state;
+});})(user_settings,user_draw))
+);
+var user_mouse_wheel = new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,user_draw,user_mouse_dragged){
+return (function (state,_){
+return state;
+});})(user_settings,user_draw,user_mouse_dragged))
+);
+var setup = new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,user_draw,user_mouse_dragged,user_mouse_wheel){
+return (function (){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(user_settings,user_draw,user_mouse_dragged,user_mouse_wheel))
+);
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"setup","setup",1987730512),cljs.core.partial.call(null,quil.middlewares.navigation_2d.setup_2d_nav,setup,user_settings),new cljs.core.Keyword(null,"draw","draw",1358331674),cljs.core.partial.call(null,quil.middlewares.navigation_2d.draw,user_draw),new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441),((function (user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup){
+return (function (state,event){
+return user_mouse_dragged.call(null,quil.middlewares.navigation_2d.mouse_dragged.call(null,state,event),event);
+});})(user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup))
+,new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439),((function (user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup){
+return (function (state,event){
+return user_mouse_wheel.call(null,quil.middlewares.navigation_2d.mouse_wheel.call(null,state,event),event);
+});})(user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup))
+);
+});
+
+//# sourceMappingURL=navigation_2d.js.map
diff --git a/src/http/static/viz/2/quil/middlewares/navigation_2d.js.map b/src/http/static/viz/2/quil/middlewares/navigation_2d.js.map
new file mode 100644
index 0000000..34afb3c
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/navigation_2d.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/navigation_2d.js","sources":["navigation_2d.cljc"],"lineCount":116,"mappings":";AAAA;;;AAGA,AAAeA,8DACb,CAAA,4CAAA,qDAAA;AAIF;;;6DAAA,7DAAOC,kIAEJ;AAFH,AAGE,oBAAU,AAAA,sGAAgBC;AAA1B;;AAAA,AACE,MACgB,KAAAC,MAAWH;;;AAE\/B;;;;kDAAA,lDAAOI;AAAP,AAAA,kDAAA,8DAAA,kKAAA,sDAAA,rIAIc,8BAAA,7BAAG,AAACC,kCACJ,+BAAA,9BAAG,AAACC;;AAGlB;;;;8CAAA,9CAAOC,oGAGJ,WAAW;AAHd,AAIE,IAAM,qIAAkBC,hCACA,8CAAA,mFAAA,8DAAA,\/LAACC,rFACI,AAACC,0BAAM,AAACN;AAFrC,AAGE,2DAAA,mFAAA,gFAAA,vNAACO,8BAAU,AAACC;kBAAZ;AAAA,AACY,+CAAAC,xCAACH,0BAAMI;;;;AAEvB;;;;+CAAA,\/CAAOC,sGAGJ,MAAM;AAHT,AAIE,AAACd,qEAA4BC;;AAC7B,IAAM,KAAG,CAAG,AAAA,kFAAMc,SAAO,AAAA,6EAAIA;IACvB,KAAG,CAAG,AAAA,iFAAMA,SAAO,AAAA,8EAAIA;IACvB,OAAK,AAAA,oFAAA,AAAA,sGAAId;AAFf,mEAGKA,9BACA,oCAAA,mFAAA,wEAAA,8DAAA,7PAACS,yQAAuCM,iBAAE,CAAGC,KAAGC,rUAChD,4UAAA,mFAAA,wEAAA,8DAAA,9hBAACR,0iBAAuCM,iBAAE,CAAGG,KAAGD;;AAEvD;;;6CAAA,7CAAOE,kGAEJ,MAAM;AAFT,AAGE,AAACpB,qEAA4BC;;AAC7B,2CAAA,mFAAA,wEAAA,\/LAACS,8BAAUT,+NAA6BoB,iBAAE,CAAA,MAAK,CAAA,OAAQN;;AAEzD;;;;sCAAA,tCAAOO,oFAGJ,UAAU;AAHb,AAIE,AAACtB,qEAA4BC;;AAC7B,AAACsB;;AACD,IAAM,cAAO,AAAA,sGAAgBtB;IACvB,YAAK,AAAA,oFAAOuB;IACZ,WAAI,AAAA,4FAAWA;AAFrB,AAGE,AAACC,0BAAQP;;AACT,IAAA,wBAAA,mFAAqB,CAAG,CAAA,8BAAA,7BAAG,AAACd,oCAAWc,aAAM,AAACW,0BAAMC,WAC\/B,CAAG,CAAA,+BAAA,9BAAG,AAACzB,qCAAYa,aAAM,AAACa,2BAAOD;AADtD,AAAA,AAAAP;;AAAA,IAAA,AAAA,AAAAG,8BAAAC;;AAEE,AAACK,oBAAU\/B;UAFb,AAAA,AAAA2B;;AAGF,OAACA;;AAEH;;;;+CAAA,\/CAAMK,sGAGH;AAHH,AAIE,IACM,gBAAc,AAAA,sGAAgBC;IAI9B,YAAU,AAAA,mFAAOA,QAAQ;kBAAK;AAAL,AAAA;;;IACzB,qBAAmB,AAAA,sGAAgBA,QAAQ;kBAAK,MAAM;AAAX,AAAcjC;;;IACzD,mBAAiB,AAAA,iGAAciC,QAAQ;kBAAK,MAAM;AAAX,AAAcjC;;;IACrD,QAAM,AAAA,qFAAQiC,QAAQ;;AAAA,AAAA;;;AAR5B,AASE,yCAAA,oJAAA,gIAAA,tTAACC,0BAAMD,+DAEE,AAACE,4BAAQ9B,4CAAa+B,MAAM9B,oEAE7B,AAAC6B,4BAAQd,oCAAKU,mFAEL;kBAAK,MAAM;AAAX,AACE,OAACM,6BAAmB,AAACxB,uDAAcb,MAAMc,OAAOA;;CAPnE,mEAQe;kBAAK,MAAM;AAAX,AACE,OAACwB,2BAAiB,AAACnB,qDAAYnB,MAAMc,OAAOA","names":["quil.middlewares.navigation-2d\/missing-navigation-key-error","quil.middlewares.navigation-2d\/assert-state-has-navigation","state","js\/Error","quil.middlewares.navigation-2d\/default-position","quil.core\/width","quil.core\/height","quil.middlewares.navigation-2d\/setup-2d-nav","user-settings","cljs.core\/select-keys","cljs.core\/merge","cljs.core\/update-in","user-setup","p1__2126#","initial-state","quil.middlewares.navigation-2d\/mouse-dragged","event","cljs.core\/+","dx","zoom","dy","quil.middlewares.navigation-2d\/mouse-wheel","cljs.core\/*","quil.middlewares.navigation-2d\/draw","quil.core\/push-matrix","nav-2d","quil.core\/scale","quil.core\/translate","tr__2049__auto__","quil.core\/pop-matrix","cljs.core\/first","pos","cljs.core\/second","user-draw","quil.middlewares.navigation-2d\/navigation-2d","options","cljs.core\/assoc","cljs.core\/partial","setup","user-mouse-dragged","user-mouse-wheel"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/middlewares/navigation_3d.cljc b/src/http/static/viz/2/quil/middlewares/navigation_3d.cljc
new file mode 100644
index 0000000..3471cfd
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/navigation_3d.cljc
@@ -0,0 +1,188 @@
+(ns quil.middlewares.navigation-3d
+ (:require [quil.core :as q]))
+
+(def ^:private missing-navigation-key-error
+ (str "state map is missing :navigation-3d key. "
+ "Did you accidentally removed it from the state in "
+ ":update or any other handler?"))
+
+(defn- assert-state-has-navigation
+ "Asserts that state map contains :navigation-2d object."
+ [state]
+ (when-not (:navigation-3d state)
+ (throw #?(:clj (RuntimeException. missing-navigation-key-error)
+ :cljs (js/Error. missing-navigation-key-error)))))
+
+(defn- default-position
+ "Default position configuration. Check default configuration in
+ 'camera' function."
+ []
+ {:position [(/ (q/width) 2.0)
+ (/ (q/height) 2.0)
+ (/ (q/height) 2.0 (q/tan (/ (* q/PI 60.0) 360.0)))]
+ :straight [0 0 -1]
+ :up [0 1 0]})
+
+(defn- rotate-by-axis-and-angle
+ "Rotates vector v by angle with axis.
+ Formula is taken from wiki:
+ http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle"
+ [v axis angle]
+ (let [[a-x a-y a-z] axis
+ [x y z] v
+ cs (q/cos angle)
+ -cs (- 1 cs)
+ sn (q/sin angle)
+ ; Matrix is
+ ; [a b c]
+ ; [d e f]
+ ; [g h i]
+ a (+ cs (* a-x a-x -cs))
+ b (- (* a-x a-y -cs)
+ (* a-z sn))
+ c (+ (* a-x a-z -cs)
+ (* a-y sn))
+ d (+ (* a-x a-y -cs)
+ (* a-z sn))
+ e (+ cs (* a-y a-y -cs))
+ f (- (* a-y a-z -cs)
+ (* a-x sn))
+ g (- (* a-x a-z -cs)
+ (* a-y sn))
+ h (+ (* a-y a-z -cs)
+ (* a-x sn))
+ i (+ cs (* a-z a-z -cs))]
+ [(+ (* a x) (* b y) (* c z))
+ (+ (* d x) (* e y) (* f z))
+ (+ (* g x) (* h y) (* i z))]))
+
+(defn- rotate-lr
+ "Rotates nav-3d configuration left-right. angle positive - rotate right,
+ negative - left."
+ [nav-3d angle]
+ (update-in nav-3d [:straight] rotate-by-axis-and-angle (:up nav-3d) angle))
+
+(defn- cross-product
+ "Vector cross-product: http://en.wikipedia.org/wiki/Cross_product"
+ [[u1 u2 u3] [v1 v2 v3]]
+ [(- (* u2 v3) (* u3 v2))
+ (- (* u3 v1) (* u1 v3))
+ (- (* u1 v2) (* u2 v1))])
+
+(defn- v-mult
+ "Multiply vector v by scalar mult."
+ [v mult]
+ (mapv #(* % mult) v))
+
+(defn- v-plus
+ "Sum of 2 vectors."
+ [v1 v2]
+ (mapv + v1 v2))
+
+(defn- v-opposite
+ "Returns vector opposite to vector v."
+ [v]
+ (v-mult v -1))
+
+(defn- v-normalize
+ "Normalize vector, returning vector
+ which has same direction but with norm equals to 1."
+ [v]
+ (let [norm (->> (map q/sq v)
+ (apply +)
+ (q/sqrt))]
+ (v-mult v (/ norm))))
+
+(defn- rotate-ud
+ "Rotates nav-3d configuration up-down."
+ [nav-3d angle]
+ (let [axis (cross-product (:straight nav-3d) (:up nav-3d))
+ rotate #(rotate-by-axis-and-angle % axis angle)]
+ (-> nav-3d
+ (update-in [:straight] rotate)
+ (update-in [:up] rotate))))
+
+(defn- rotate
+ "Mouse handler function which rotates nav-3d configuration.
+ It uses mouse from event object and pixels-in-360 to calculate
+ angles to rotate."
+ [state event pixels-in-360]
+ (assert-state-has-navigation state)
+ (if (= 0 (:p-x event) (:p-y event))
+ state
+ (let [dx (- (:p-x event) (:x event))
+ dy (- (:y event) (:p-y event))
+ angle-lr (q/map-range dx 0 pixels-in-360 0 q/TWO-PI)
+ angle-ud (q/map-range dy 0 pixels-in-360 0 q/TWO-PI)]
+ (update-in state [:navigation-3d]
+ #(-> %
+ (rotate-lr angle-lr)
+ (rotate-ud angle-ud))))))
+
+(def ^:private space (keyword " "))
+
+(defn- move
+ "Keyboard handler function which moves nav-3d configuration.
+ It uses keyboard key from event object to determing in which
+ direction to move."
+ [state event step-size]
+ (assert-state-has-navigation state)
+ (let [{:keys [up straight]} (:navigation-3d state)]
+ (if-let [dir (condp = (:key event)
+ :w straight
+ :s (v-opposite straight)
+ space (v-opposite up)
+ :z up
+ :d (cross-product straight up)
+ :a (cross-product up straight)
+ nil)]
+ (update-in state [:navigation-3d :position]
+ #(v-plus % (v-mult dir step-size)))
+ state)))
+
+(defn- setup-3d-nav
+ "Custom 'setup' function which creates initial position
+ configuration and puts it to the state map."
+ [user-setup user-settings]
+ (let [initial-state (-> user-settings
+ (select-keys [:straight :up :position])
+ (->> (merge (default-position)))
+ (update-in [:straight] v-normalize)
+ (update-in [:up] v-normalize))]
+ (update-in (user-setup) [:navigation-3d]
+ #(merge initial-state %))))
+
+(defn navigation-3d
+ "Enables navigation in 3D space. Similar to how it is done in
+ shooters: WASD navigation, space is go up, z is go down,
+ drag mouse to look around."
+ [options]
+ (let [; 3d-navigation related user settings
+ user-settings (:navigation-3d options)
+ pixels-in-360 (:pixels-in-360 user-settings 1000)
+ step-size (:step-size user-settings 20)
+ rotate-on (:rotate-on user-settings :mouse-dragged)
+
+ ; user-provided handlers which will be overridden
+ ; by 3d-navigation
+ draw (:draw options (fn [state]))
+ key-pressed (:key-pressed options (fn [state _] state))
+ rotate-on-fn (rotate-on options (fn [state _] state))
+ setup (:setup options (fn [] {}))]
+ (assoc options
+
+ :setup (partial setup-3d-nav setup user-settings)
+
+ :draw (fn [state]
+ (assert-state-has-navigation state)
+ (let [{[c-x c-y c-z] :straight
+ [u-x u-y u-z] :up
+ [p-x p-y p-z] :position} (:navigation-3d state)]
+ (q/camera p-x p-y p-z (+ p-x c-x) (+ p-y c-y) (+ p-z c-z) u-x u-y u-z))
+ (draw state))
+
+ :key-pressed (fn [state event]
+ (key-pressed (move state event step-size) event))
+
+ rotate-on (fn [state event]
+ (rotate-on-fn (rotate state event pixels-in-360) event)) )))
diff --git a/src/http/static/viz/2/quil/middlewares/navigation_3d.cljc.cache.json b/src/http/static/viz/2/quil/middlewares/navigation_3d.cljc.cache.json
new file mode 100644
index 0000000..2edb582
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/navigation_3d.cljc.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:externs",["^ ","~$Error",["^ "]],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$quil.middlewares.navigation-3d","~:imports",null,"~:requires",["^ ","~$q","~$quil.core","^;","^;"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$missing-navigation-key-error",["^ ","^7","~$quil.middlewares.navigation-3d/missing-navigation-key-error","~:file","out/quil/middlewares/navigation_3d.cljc","~:line",4,"~:column",1,"~:end-line",4,"~:end-column",44,"~:private",true,"~:meta",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",4,"^C",16,"^D",4,"^E",44,"^F",true],"~:tag","~$any"],"~$v-normalize",["^ ","~:protocol-inline",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",87,"^C",8,"^D",87,"^E",19,"^F",true,"~:arglists",["~#list",["~$quote",["^M",[["~$v"]]]]],"~:doc","Normalize vector, returning vector\n which has same direction but with norm equals to 1."],"^F",true,"^7","~$quil.middlewares.navigation-3d/v-normalize","^A","out/quil/middlewares/navigation_3d.cljc","^E",19,"~:method-params",["^M",[["~$v"]]],"~:protocol-impl",null,"~:arglists-meta",["^M",[null,null]],"^C",1,"~:variadic?",false,"^B",87,"~:ret-tag","^I","^D",87,"~:max-fixed-arity",1,"~:fn-var",true,"^L",["^M",["^N",["^M",[["~$v"]]]]],"^O","Normalize vector, returning vector\n which has same direction but with norm equals to 1."],"~$v-opposite",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",82,"^C",8,"^D",82,"^E",18,"^F",true,"^L",["^M",["^N",["^M",[["~$v"]]]]],"^O","Returns vector opposite to vector v."],"^F",true,"^7","~$quil.middlewares.navigation-3d/v-opposite","^A","out/quil/middlewares/navigation_3d.cljc","^E",18,"^Q",["^M",[["~$v"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",82,"^U","^I","^D",82,"^V",1,"^W",true,"^L",["^M",["^N",["^M",[["~$v"]]]]],"^O","Returns vector opposite to vector v."],"~$v-plus",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",77,"^C",8,"^D",77,"^E",14,"^F",true,"^L",["^M",["^N",["^M",[["~$v1","~$v2"]]]]],"^O","Sum of 2 vectors."],"^F",true,"^7","~$quil.middlewares.navigation-3d/v-plus","^A","out/quil/middlewares/navigation_3d.cljc","^E",14,"^Q",["^M",[["^[","^10"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",77,"^U","^I","^D",77,"^V",2,"^W",true,"^L",["^M",["^N",["^M",[["^[","^10"]]]]],"^O","Sum of 2 vectors."],"~$v-mult",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",72,"^C",8,"^D",72,"^E",14,"^F",true,"^L",["^M",["^N",["^M",[["~$v","~$mult"]]]]],"^O","Multiply vector v by scalar mult."],"^F",true,"^7","~$quil.middlewares.navigation-3d/v-mult","^A","out/quil/middlewares/navigation_3d.cljc","^E",14,"^Q",["^M",[["~$v","^13"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",72,"^U","^I","^D",72,"^V",2,"^W",true,"^L",["^M",["^N",["^M",[["~$v","^13"]]]]],"^O","Multiply vector v by scalar mult."],"~$space",["^ ","^7","~$quil.middlewares.navigation-3d/space","^A","out/quil/middlewares/navigation_3d.cljc","^B",122,"^C",1,"^D",122,"^E",21,"^F",true,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",122,"^C",16,"^D",122,"^E",21,"^F",true],"^H","^I"],"~$setup-3d-nav",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",143,"^C",8,"^D",143,"^E",20,"^F",true,"^L",["^M",["^N",["^M",[["~$user-setup","~$user-settings"]]]]],"^O","Custom 'setup' function which creates initial position\n configuration and puts it to the state map."],"^F",true,"^7","~$quil.middlewares.navigation-3d/setup-3d-nav","^A","out/quil/middlewares/navigation_3d.cljc","^E",20,"^Q",["^M",[["^18","^19"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",143,"^U","^I","^D",143,"^V",2,"^W",true,"^L",["^M",["^N",["^M",[["^18","^19"]]]]],"^O","Custom 'setup' function which creates initial position\n configuration and puts it to the state map."],"~$move",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",124,"^C",8,"^D",124,"^E",12,"^F",true,"^L",["^M",["^N",["^M",[["~$state","~$event","~$step-size"]]]]],"^O","Keyboard handler function which moves nav-3d configuration.\n It uses keyboard key from event object to determing in which\n direction to move."],"^F",true,"^7","~$quil.middlewares.navigation-3d/move","^A","out/quil/middlewares/navigation_3d.cljc","^E",12,"^Q",["^M",[["^1<","^1=","^1>"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",124,"^U",["^6",[null,"^I"]],"^D",124,"^V",3,"^W",true,"^L",["^M",["^N",["^M",[["^1<","^1=","^1>"]]]]],"^O","Keyboard handler function which moves nav-3d configuration.\n It uses keyboard key from event object to determing in which\n direction to move."],"~$rotate-lr",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",59,"^C",8,"^D",59,"^E",17,"^F",true,"^L",["^M",["^N",["^M",[["~$nav-3d","~$angle"]]]]],"^O","Rotates nav-3d configuration left-right. angle positive - rotate right,\n negative - left."],"^F",true,"^7","~$quil.middlewares.navigation-3d/rotate-lr","^A","out/quil/middlewares/navigation_3d.cljc","^E",17,"^Q",["^M",[["^1A","^1B"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",59,"^U","^I","^D",59,"^V",2,"^W",true,"^L",["^M",["^N",["^M",[["^1A","^1B"]]]]],"^O","Rotates nav-3d configuration left-right. angle positive - rotate right,\n negative - left."],"~$cross-product",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",65,"^C",8,"^D",65,"^E",21,"^F",true,"^L",["^M",["^N",["^M",[[["~$u1","~$u2","~$u3"],["^[","^10","~$v3"]]]]]],"^O","Vector cross-product: http://en.wikipedia.org/wiki/Cross_product"],"^F",true,"^7","~$quil.middlewares.navigation-3d/cross-product","^A","out/quil/middlewares/navigation_3d.cljc","^E",21,"^Q",["^M",[["~$p__1626","~$p__1627"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",65,"^U","~$cljs.core/IVector","^D",65,"^V",2,"^W",true,"^L",["^M",["^N",["^M",[[["^1E","^1F","^1G"],["^[","^10","^1H"]]]]]],"^O","Vector cross-product: http://en.wikipedia.org/wiki/Cross_product"],"~$rotate-by-axis-and-angle",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",26,"^C",8,"^D",26,"^E",32,"^F",true,"^L",["^M",["^N",["^M",[["~$v","~$axis","^1B"]]]]],"^O","Rotates vector v by angle with axis.\n Formula is taken from wiki:\n http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle"],"^F",true,"^7","~$quil.middlewares.navigation-3d/rotate-by-axis-and-angle","^A","out/quil/middlewares/navigation_3d.cljc","^E",32,"^Q",["^M",[["~$v","^1N","^1B"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",26,"^U","^1L","^D",26,"^V",3,"^W",true,"^L",["^M",["^N",["^M",[["~$v","^1N","^1B"]]]]],"^O","Rotates vector v by angle with axis.\n Formula is taken from wiki:\n http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle"],"~$assert-state-has-navigation",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",9,"^C",8,"^D",9,"^E",35,"^F",true,"^L",["^M",["^N",["^M",[["^1<"]]]]],"^O","Asserts that state map contains :navigation-2d object."],"^F",true,"^7","~$quil.middlewares.navigation-3d/assert-state-has-navigation","^A","out/quil/middlewares/navigation_3d.cljc","^E",35,"^Q",["^M",[["^1<"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",9,"^U","~$clj-nil","^D",9,"^V",1,"^W",true,"^L",["^M",["^N",["^M",[["^1<"]]]]],"^O","Asserts that state map contains :navigation-2d object."],"~$navigation-3d",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",155,"^C",7,"^D",155,"^E",20,"^L",["^M",["^N",["^M",[["~$options"]]]]],"^O","Enables navigation in 3D space. Similar to how it is done in\n shooters: WASD navigation, space is go up, z is go down,\n drag mouse to look around."],"^7","~$quil.middlewares.navigation-3d/navigation-3d","^A","out/quil/middlewares/navigation_3d.cljc","^E",20,"^Q",["^M",[["^1T"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",155,"^U","^I","^D",155,"^V",1,"^W",true,"^L",["^M",["^N",["^M",[["^1T"]]]]],"^O","Enables navigation in 3D space. Similar to how it is done in\n shooters: WASD navigation, space is go up, z is go down,\n drag mouse to look around."],"~$default-position",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",16,"^C",8,"^D",16,"^E",24,"^F",true,"^L",["^M",["^N",["^M",[[]]]]],"^O","Default position configuration. Check default configuration in\n 'camera' function."],"^F",true,"^7","~$quil.middlewares.navigation-3d/default-position","^A","out/quil/middlewares/navigation_3d.cljc","^E",24,"^Q",["^M",[[]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",16,"^U","~$cljs.core/IMap","^D",16,"^V",0,"^W",true,"^L",["^M",["^N",["^M",[[]]]]],"^O","Default position configuration. Check default configuration in\n 'camera' function."],"~$rotate",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",105,"^C",8,"^D",105,"^E",14,"^F",true,"^L",["^M",["^N",["^M",[["^1<","^1=","~$pixels-in-360"]]]]],"^O","Mouse handler function which rotates nav-3d configuration.\n It uses mouse from event object and pixels-in-360 to calculate\n angles to rotate."],"^F",true,"^7","~$quil.middlewares.navigation-3d/rotate","^A","out/quil/middlewares/navigation_3d.cljc","^E",14,"^Q",["^M",[["^1<","^1=","^1Z"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",105,"^U",["^6",[null,"^I"]],"^D",105,"^V",3,"^W",true,"^L",["^M",["^N",["^M",[["^1<","^1=","^1Z"]]]]],"^O","Mouse handler function which rotates nav-3d configuration.\n It uses mouse from event object and pixels-in-360 to calculate\n angles to rotate."],"~$rotate-ud",["^ ","^K",null,"^G",["^ ","^A","/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc","^B",96,"^C",8,"^D",96,"^E",17,"^F",true,"^L",["^M",["^N",["^M",[["^1A","^1B"]]]]],"^O","Rotates nav-3d configuration up-down."],"^F",true,"^7","~$quil.middlewares.navigation-3d/rotate-ud","^A","out/quil/middlewares/navigation_3d.cljc","^E",17,"^Q",["^M",[["^1A","^1B"]]],"^R",null,"^S",["^M",[null,null]],"^C",1,"^T",false,"^B",96,"^U","^I","^D",96,"^V",2,"^W",true,"^L",["^M",["^N",["^M",[["^1A","^1B"]]]]],"^O","Rotates nav-3d configuration up-down."]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:cljs.analyzer/constants",["^ ","~:seen",["^6",["~:y","~:pixels-in-360","~:p-y","~:step-size","~:key","~:w","~:s","~:rotate-on","~:up","~:setup","~:z","~:straight","~:key-pressed","~:p-x","~:navigation-3d","~:position","~:d","~:x","~:draw","~:a","~:mouse-dragged"]],"~:order",["^2@","^2A","^2=","^2;","^2?","^27","~:x","~:y","^29","~:w","~:s","~:z","~:d","~:a","^26","^28","^2:","^2C","^2B","^2>","^2<"]],"^O",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/middlewares/navigation_3d.js b/src/http/static/viz/2/quil/middlewares/navigation_3d.js
new file mode 100644
index 0000000..d80d58a
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/navigation_3d.js
@@ -0,0 +1,261 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('quil.middlewares.navigation_3d');
+goog.require('cljs.core');
+goog.require('quil.core');
+quil.middlewares.navigation_3d.missing_navigation_key_error = ["state map is missing :navigation-3d key. ","Did you accidentally removed it from the state in ",":update or any other handler?"].join('');
+/**
+ * Asserts that state map contains :navigation-2d object.
+ */
+quil.middlewares.navigation_3d.assert_state_has_navigation = (function quil$middlewares$navigation_3d$assert_state_has_navigation(state){
+if(cljs.core.truth_(new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(state))){
+return null;
+} else {
+throw (new Error(quil.middlewares.navigation_3d.missing_navigation_key_error));
+}
+});
+/**
+ * Default position configuration. Check default configuration in
+ * 'camera' function.
+ */
+quil.middlewares.navigation_3d.default_position = (function quil$middlewares$navigation_3d$default_position(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"position","position",-2011731912),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(quil.core.width.call(null) / 2.0),(quil.core.height.call(null) / 2.0),((quil.core.height.call(null) / 2.0) / quil.core.tan.call(null,((quil.core.PI * 60.0) / 360.0)))], null),new cljs.core.Keyword(null,"straight","straight",-1252567854),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(0),(-1)], null),new cljs.core.Keyword(null,"up","up",-269712113),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1),(0)], null)], null);
+});
+/**
+ * Rotates vector v by angle with axis.
+ * Formula is taken from wiki:
+ * http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle
+ */
+quil.middlewares.navigation_3d.rotate_by_axis_and_angle = (function quil$middlewares$navigation_3d$rotate_by_axis_and_angle(v,axis,angle){
+var vec__1620 = axis;
+var a_x = cljs.core.nth.call(null,vec__1620,(0),null);
+var a_y = cljs.core.nth.call(null,vec__1620,(1),null);
+var a_z = cljs.core.nth.call(null,vec__1620,(2),null);
+var vec__1623 = v;
+var x = cljs.core.nth.call(null,vec__1623,(0),null);
+var y = cljs.core.nth.call(null,vec__1623,(1),null);
+var z = cljs.core.nth.call(null,vec__1623,(2),null);
+var cs = quil.core.cos.call(null,angle);
+var _cs = ((1) - cs);
+var sn = quil.core.sin.call(null,angle);
+var a = (cs + ((a_x * a_x) * _cs));
+var b = (((a_x * a_y) * _cs) - (a_z * sn));
+var c = (((a_x * a_z) * _cs) + (a_y * sn));
+var d = (((a_x * a_y) * _cs) + (a_z * sn));
+var e = (cs + ((a_y * a_y) * _cs));
+var f = (((a_y * a_z) * _cs) - (a_x * sn));
+var g = (((a_x * a_z) * _cs) - (a_y * sn));
+var h = (((a_y * a_z) * _cs) + (a_x * sn));
+var i = (cs + ((a_z * a_z) * _cs));
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(((a * x) + (b * y)) + (c * z)),(((d * x) + (e * y)) + (f * z)),(((g * x) + (h * y)) + (i * z))], null);
+});
+/**
+ * Rotates nav-3d configuration left-right. angle positive - rotate right,
+ * negative - left.
+ */
+quil.middlewares.navigation_3d.rotate_lr = (function quil$middlewares$navigation_3d$rotate_lr(nav_3d,angle){
+return cljs.core.update_in.call(null,nav_3d,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854)], null),quil.middlewares.navigation_3d.rotate_by_axis_and_angle,new cljs.core.Keyword(null,"up","up",-269712113).cljs$core$IFn$_invoke$arity$1(nav_3d),angle);
+});
+/**
+ * Vector cross-product: http://en.wikipedia.org/wiki/Cross_product
+ */
+quil.middlewares.navigation_3d.cross_product = (function quil$middlewares$navigation_3d$cross_product(p__1626,p__1627){
+var vec__1628 = p__1626;
+var u1 = cljs.core.nth.call(null,vec__1628,(0),null);
+var u2 = cljs.core.nth.call(null,vec__1628,(1),null);
+var u3 = cljs.core.nth.call(null,vec__1628,(2),null);
+var vec__1631 = p__1627;
+var v1 = cljs.core.nth.call(null,vec__1631,(0),null);
+var v2 = cljs.core.nth.call(null,vec__1631,(1),null);
+var v3 = cljs.core.nth.call(null,vec__1631,(2),null);
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [((u2 * v3) - (u3 * v2)),((u3 * v1) - (u1 * v3)),((u1 * v2) - (u2 * v1))], null);
+});
+/**
+ * Multiply vector v by scalar mult.
+ */
+quil.middlewares.navigation_3d.v_mult = (function quil$middlewares$navigation_3d$v_mult(v,mult){
+return cljs.core.mapv.call(null,(function (p1__1634_SHARP_){
+return (p1__1634_SHARP_ * mult);
+}),v);
+});
+/**
+ * Sum of 2 vectors.
+ */
+quil.middlewares.navigation_3d.v_plus = (function quil$middlewares$navigation_3d$v_plus(v1,v2){
+return cljs.core.mapv.call(null,cljs.core._PLUS_,v1,v2);
+});
+/**
+ * Returns vector opposite to vector v.
+ */
+quil.middlewares.navigation_3d.v_opposite = (function quil$middlewares$navigation_3d$v_opposite(v){
+return quil.middlewares.navigation_3d.v_mult.call(null,v,(-1));
+});
+/**
+ * Normalize vector, returning vector
+ * which has same direction but with norm equals to 1.
+ */
+quil.middlewares.navigation_3d.v_normalize = (function quil$middlewares$navigation_3d$v_normalize(v){
+var norm = quil.core.sqrt.call(null,cljs.core.apply.call(null,cljs.core._PLUS_,cljs.core.map.call(null,quil.core.sq,v)));
+return quil.middlewares.navigation_3d.v_mult.call(null,v,((1) / norm));
+});
+/**
+ * Rotates nav-3d configuration up-down.
+ */
+quil.middlewares.navigation_3d.rotate_ud = (function quil$middlewares$navigation_3d$rotate_ud(nav_3d,angle){
+var axis = quil.middlewares.navigation_3d.cross_product.call(null,new cljs.core.Keyword(null,"straight","straight",-1252567854).cljs$core$IFn$_invoke$arity$1(nav_3d),new cljs.core.Keyword(null,"up","up",-269712113).cljs$core$IFn$_invoke$arity$1(nav_3d));
+var rotate = ((function (axis){
+return (function (p1__1635_SHARP_){
+return quil.middlewares.navigation_3d.rotate_by_axis_and_angle.call(null,p1__1635_SHARP_,axis,angle);
+});})(axis))
+;
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,nav_3d,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854)], null),rotate),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"up","up",-269712113)], null),rotate);
+});
+/**
+ * Mouse handler function which rotates nav-3d configuration.
+ * It uses mouse from event object and pixels-in-360 to calculate
+ * angles to rotate.
+ */
+quil.middlewares.navigation_3d.rotate = (function quil$middlewares$navigation_3d$rotate(state,event,pixels_in_360){
+quil.middlewares.navigation_3d.assert_state_has_navigation.call(null,state);
+
+if(cljs.core._EQ_.call(null,(0),new cljs.core.Keyword(null,"p-x","p-x",-1721211211).cljs$core$IFn$_invoke$arity$1(event),new cljs.core.Keyword(null,"p-y","p-y",-530704830).cljs$core$IFn$_invoke$arity$1(event))){
+return state;
+} else {
+var dx = (new cljs.core.Keyword(null,"p-x","p-x",-1721211211).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"x","x",2099068185).cljs$core$IFn$_invoke$arity$1(event));
+var dy = (new cljs.core.Keyword(null,"y","y",-1757859776).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"p-y","p-y",-530704830).cljs$core$IFn$_invoke$arity$1(event));
+var angle_lr = quil.core.map_range.call(null,dx,(0),pixels_in_360,(0),quil.core.TWO_PI);
+var angle_ud = quil.core.map_range.call(null,dy,(0),pixels_in_360,(0),quil.core.TWO_PI);
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301)], null),((function (dx,dy,angle_lr,angle_ud){
+return (function (p1__1636_SHARP_){
+return quil.middlewares.navigation_3d.rotate_ud.call(null,quil.middlewares.navigation_3d.rotate_lr.call(null,p1__1636_SHARP_,angle_lr),angle_ud);
+});})(dx,dy,angle_lr,angle_ud))
+);
+}
+});
+quil.middlewares.navigation_3d.space = cljs.core.keyword.call(null," ");
+/**
+ * Keyboard handler function which moves nav-3d configuration.
+ * It uses keyboard key from event object to determing in which
+ * direction to move.
+ */
+quil.middlewares.navigation_3d.move = (function quil$middlewares$navigation_3d$move(state,event,step_size){
+quil.middlewares.navigation_3d.assert_state_has_navigation.call(null,state);
+
+var map__1638 = new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(state);
+var map__1638__$1 = (((((!((map__1638 == null))))?(((((map__1638.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__1638.cljs$core$ISeq$))))?true:false):false))?cljs.core.apply.call(null,cljs.core.hash_map,map__1638):map__1638);
+var up = cljs.core.get.call(null,map__1638__$1,new cljs.core.Keyword(null,"up","up",-269712113));
+var straight = cljs.core.get.call(null,map__1638__$1,new cljs.core.Keyword(null,"straight","straight",-1252567854));
+var temp__4655__auto__ = (function (){var pred__1640 = cljs.core._EQ_;
+var expr__1641 = new cljs.core.Keyword(null,"key","key",-1516042587).cljs$core$IFn$_invoke$arity$1(event);
+if(cljs.core.truth_(pred__1640.call(null,new cljs.core.Keyword(null,"w","w",354169001),expr__1641))){
+return straight;
+} else {
+if(cljs.core.truth_(pred__1640.call(null,new cljs.core.Keyword(null,"s","s",1705939918),expr__1641))){
+return quil.middlewares.navigation_3d.v_opposite.call(null,straight);
+} else {
+if(cljs.core.truth_(pred__1640.call(null,quil.middlewares.navigation_3d.space,expr__1641))){
+return quil.middlewares.navigation_3d.v_opposite.call(null,up);
+} else {
+if(cljs.core.truth_(pred__1640.call(null,new cljs.core.Keyword(null,"z","z",-789527183),expr__1641))){
+return up;
+} else {
+if(cljs.core.truth_(pred__1640.call(null,new cljs.core.Keyword(null,"d","d",1972142424),expr__1641))){
+return quil.middlewares.navigation_3d.cross_product.call(null,straight,up);
+} else {
+if(cljs.core.truth_(pred__1640.call(null,new cljs.core.Keyword(null,"a","a",-2123407586),expr__1641))){
+return quil.middlewares.navigation_3d.cross_product.call(null,up,straight);
+} else {
+return null;
+}
+}
+}
+}
+}
+}
+})();
+if(cljs.core.truth_(temp__4655__auto__)){
+var dir = temp__4655__auto__;
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301),new cljs.core.Keyword(null,"position","position",-2011731912)], null),((function (dir,temp__4655__auto__,map__1638,map__1638__$1,up,straight){
+return (function (p1__1637_SHARP_){
+return quil.middlewares.navigation_3d.v_plus.call(null,p1__1637_SHARP_,quil.middlewares.navigation_3d.v_mult.call(null,dir,step_size));
+});})(dir,temp__4655__auto__,map__1638,map__1638__$1,up,straight))
+);
+} else {
+return state;
+}
+});
+/**
+ * Custom 'setup' function which creates initial position
+ * configuration and puts it to the state map.
+ */
+quil.middlewares.navigation_3d.setup_3d_nav = (function quil$middlewares$navigation_3d$setup_3d_nav(user_setup,user_settings){
+var initial_state = cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.merge.call(null,quil.middlewares.navigation_3d.default_position.call(null),cljs.core.select_keys.call(null,user_settings,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854),new cljs.core.Keyword(null,"up","up",-269712113),new cljs.core.Keyword(null,"position","position",-2011731912)], null))),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854)], null),quil.middlewares.navigation_3d.v_normalize),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"up","up",-269712113)], null),quil.middlewares.navigation_3d.v_normalize);
+return cljs.core.update_in.call(null,user_setup.call(null),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301)], null),((function (initial_state){
+return (function (p1__1643_SHARP_){
+return cljs.core.merge.call(null,initial_state,p1__1643_SHARP_);
+});})(initial_state))
+);
+});
+/**
+ * Enables navigation in 3D space. Similar to how it is done in
+ * shooters: WASD navigation, space is go up, z is go down,
+ * drag mouse to look around.
+ */
+quil.middlewares.navigation_3d.navigation_3d = (function quil$middlewares$navigation_3d$navigation_3d(options){
+var user_settings = new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(options);
+var pixels_in_360 = new cljs.core.Keyword(null,"pixels-in-360","pixels-in-360",1789567298).cljs$core$IFn$_invoke$arity$2(user_settings,(1000));
+var step_size = new cljs.core.Keyword(null,"step-size","step-size",1545609922).cljs$core$IFn$_invoke$arity$2(user_settings,(20));
+var rotate_on = new cljs.core.Keyword(null,"rotate-on","rotate-on",-1282225937).cljs$core$IFn$_invoke$arity$2(user_settings,new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441));
+var draw = new cljs.core.Keyword(null,"draw","draw",1358331674).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,pixels_in_360,step_size,rotate_on){
+return (function (state){
+return null;
+});})(user_settings,pixels_in_360,step_size,rotate_on))
+);
+var key_pressed = new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,pixels_in_360,step_size,rotate_on,draw){
+return (function (state,_){
+return state;
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw))
+);
+var rotate_on_fn = rotate_on.call(null,options,((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed){
+return (function (state,_){
+return state;
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed))
+);
+var setup = new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn){
+return (function (){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn))
+);
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"setup","setup",1987730512),cljs.core.partial.call(null,quil.middlewares.navigation_3d.setup_3d_nav,setup,user_settings),new cljs.core.Keyword(null,"draw","draw",1358331674),((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup){
+return (function (state){
+quil.middlewares.navigation_3d.assert_state_has_navigation.call(null,state);
+
+var map__1644_1655 = new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(state);
+var map__1644_1656__$1 = (((((!((map__1644_1655 == null))))?(((((map__1644_1655.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__1644_1655.cljs$core$ISeq$))))?true:false):false))?cljs.core.apply.call(null,cljs.core.hash_map,map__1644_1655):map__1644_1655);
+var vec__1645_1657 = cljs.core.get.call(null,map__1644_1656__$1,new cljs.core.Keyword(null,"straight","straight",-1252567854));
+var c_x_1658 = cljs.core.nth.call(null,vec__1645_1657,(0),null);
+var c_y_1659 = cljs.core.nth.call(null,vec__1645_1657,(1),null);
+var c_z_1660 = cljs.core.nth.call(null,vec__1645_1657,(2),null);
+var vec__1648_1661 = cljs.core.get.call(null,map__1644_1656__$1,new cljs.core.Keyword(null,"up","up",-269712113));
+var u_x_1662 = cljs.core.nth.call(null,vec__1648_1661,(0),null);
+var u_y_1663 = cljs.core.nth.call(null,vec__1648_1661,(1),null);
+var u_z_1664 = cljs.core.nth.call(null,vec__1648_1661,(2),null);
+var vec__1651_1665 = cljs.core.get.call(null,map__1644_1656__$1,new cljs.core.Keyword(null,"position","position",-2011731912));
+var p_x_1666 = cljs.core.nth.call(null,vec__1651_1665,(0),null);
+var p_y_1667 = cljs.core.nth.call(null,vec__1651_1665,(1),null);
+var p_z_1668 = cljs.core.nth.call(null,vec__1651_1665,(2),null);
+quil.core.camera.call(null,p_x_1666,p_y_1667,p_z_1668,(p_x_1666 + c_x_1658),(p_y_1667 + c_y_1659),(p_z_1668 + c_z_1660),u_x_1662,u_y_1663,u_z_1664);
+
+return draw.call(null,state);
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup))
+,new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364),((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup){
+return (function (state,event){
+return key_pressed.call(null,quil.middlewares.navigation_3d.move.call(null,state,event,step_size),event);
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup))
+,rotate_on,((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup){
+return (function (state,event){
+return rotate_on_fn.call(null,quil.middlewares.navigation_3d.rotate.call(null,state,event,pixels_in_360),event);
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup))
+);
+});
+
+//# sourceMappingURL=navigation_3d.js.map
diff --git a/src/http/static/viz/2/quil/middlewares/navigation_3d.js.map b/src/http/static/viz/2/quil/middlewares/navigation_3d.js.map
new file mode 100644
index 0000000..6668288
--- /dev/null
+++ b/src/http/static/viz/2/quil/middlewares/navigation_3d.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/navigation_3d.js","sources":["navigation_3d.cljc"],"lineCount":261,"mappings":"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","names":["quil.middlewares.navigation-3d\/missing-navigation-key-error","quil.middlewares.navigation-3d\/assert-state-has-navigation","state","js\/Error","quil.middlewares.navigation-3d\/default-position","quil.core\/width","quil.core\/height","quil.core\/tan","quil.core\/PI","quil.middlewares.navigation-3d\/rotate-by-axis-and-angle","cljs.core\/nth","vec__1620","vec__1623","axis","v","quil.core\/cos","angle","cs","quil.core\/sin","a-x","-cs","a-y","a-z","sn","a","x","b","y","c","z","d","e","f","g","h","i","quil.middlewares.navigation-3d\/rotate-lr","cljs.core\/update-in","nav-3d","p__1626","vec__1628","p__1627","vec__1631","quil.middlewares.navigation-3d\/cross-product","u2","v3","u3","v2","v1","u1","quil.middlewares.navigation-3d\/v-mult","cljs.core\/mapv","p1__1634#","mult","quil.middlewares.navigation-3d\/v-plus","cljs.core\/+","quil.middlewares.navigation-3d\/v-opposite","quil.middlewares.navigation-3d\/v-normalize","cljs.core\/map","quil.core\/sq","cljs.core\/apply","quil.core\/sqrt","norm","quil.middlewares.navigation-3d\/rotate-ud","p1__1635#","rotate","quil.middlewares.navigation-3d\/rotate","cljs.core\/=","event","quil.core\/map-range","dx","pixels-in-360","quil.core\/TWO-PI","dy","p1__1636#","angle-lr","angle-ud","quil.middlewares.navigation-3d\/space","cljs.core\/keyword","quil.middlewares.navigation-3d\/move","map__1638","cljs.core\/PROTOCOL_SENTINEL","cljs.core\/hash-map","cljs.core\/get","temp__4655__auto__","pred__1640","expr__1641","straight","up","p1__1637#","dir","step-size","quil.middlewares.navigation-3d\/setup-3d-nav","user-settings","cljs.core\/select-keys","cljs.core\/merge","user-setup","p1__1643#","initial-state","quil.middlewares.navigation-3d\/navigation-3d","options","rotate-on","cljs.core\/assoc","cljs.core\/partial","setup","map__1644","vec__1645","vec__1648","vec__1651","quil.core\/camera","p-x","p-y","p-z","c-x","c-y","c-z","u-x","u-y","u-z","draw","key-pressed","rotate-on-fn"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/sketch.cljs b/src/http/static/viz/2/quil/sketch.cljs
new file mode 100644
index 0000000..4e48038
--- /dev/null
+++ b/src/http/static/viz/2/quil/sketch.cljs
@@ -0,0 +1,128 @@
+(ns quil.sketch
+ (:require [quil.util :as u :include-macros true]
+ [quil.middlewares.deprecated-options :as do]
+ [goog.dom :as dom]
+ [goog.events :as events]
+ [goog.events.EventType :as EventType])
+ (:require-macros [quil.sketch]))
+
+(def ^:dynamic
+ *applet* nil)
+
+(defn current-applet [] *applet*)
+
+(u/generate-quil-constants :cljs
+ rendering-modes (:java2d :p2d :p3d :opengl))
+
+(defn resolve-renderer [mode]
+ (u/resolve-constant-key mode rendering-modes))
+
+(defn size
+ ([width height]
+ (.size (current-applet) (int width) (int height)))
+
+ ([width height mode]
+ (.size (current-applet) (int width) (int height) (u/resolve-constant-key mode rendering-modes))))
+
+(defn- bind-handlers [prc opts]
+ (doseq [[processing-name quil-name] {:setup :setup
+ :draw :draw
+
+ :keyPressed :key-pressed
+ :keyReleased :key-released
+ :keyTyped :key-typed
+
+ :mouseClicked :mouse-clicked
+ :mouseDragged :mouse-dragged
+ :mouseMoved :mouse-moved
+ :mousePressed :mouse-pressed
+ :mouseReleased :mouse-released
+ :mouseOut :mouse-exited
+ :mouseOver :mouse-entered
+ :mouseScrolled :mouse-wheel}]
+ (when-let [handler (opts quil-name)]
+ (aset prc (name processing-name)
+ (fn []
+ (quil.sketch/with-sketch prc
+ (handler)))))))
+
+(defn make-sketch [options]
+ (let [opts (->> (:middleware options [])
+ (cons do/deprecated-options)
+ (apply comp)
+ (#(% options))
+ (merge {:size [500 300]}))
+
+ sketch-size (or (:size opts) [200 200])
+ renderer (:renderer opts)
+ features (set (:features opts))
+
+ setup (fn []
+ (->> (if renderer [renderer] [])
+ (concat sketch-size)
+ (apply size))
+ (when (:settings opts) ((:settings opts)))
+ (when (:setup opts) ((:setup opts))))
+ mouse-wheel (when (:mouse-wheel opts)
+ ;; -1 need for compability with Clojure version
+ #((:mouse-wheel opts) (* -1 (.-mouseScroll *applet*))))
+
+ opts (assoc opts
+ :setup setup
+ :mouse-wheel mouse-wheel)
+ attach-function (fn [prc]
+ (bind-handlers prc opts)
+ (set! (.-quil prc) (atom nil))
+ (set! (.-target-frame-rate prc) (atom 60)))
+ sketch (js/Processing.Sketch. attach-function)]
+ (when (contains? features :global-key-events)
+ (aset (aget sketch "options") "globalKeyEvents" true))
+ sketch))
+
+(defn destroy-previous-sketch [host-elem]
+ (when-let [proc-obj (.-processing-obj host-elem)]
+ (.exit proc-obj)))
+
+(defn sketch [& opts]
+ (let [opts-map (apply hash-map opts)
+ host-elem (dom/getElement (:host opts-map))
+ renderer (or (:renderer opts-map) :p2d)]
+ (if host-elem
+ (do
+ (if (.-processing-context host-elem)
+ (when-not (= renderer (.-processing-context host-elem))
+ (.warn js/console "WARNING: Using different context on one canvas!"))
+ (set! (.-processing-context host-elem) renderer))
+ (destroy-previous-sketch host-elem)
+ (set! (.-processing-obj host-elem)
+ (js/Processing. host-elem (make-sketch opts-map))))
+ (.error js/console "ERROR: Cannot create sketch. :host is not specified."))))
+
+(def sketch-init-list (atom (list )))
+
+(defn empty-body? []
+ (let [child (.-childNodes (.-body js/document))]
+ ; seems hacky, we should come up with better way of
+ ; checking whether body is empty or not
+ (<= (.-length child) 1)))
+
+(defn add-canvas [canvas-id]
+ (let [canvas (.createElement js/document "canvas")]
+ (.setAttribute canvas "id" canvas-id)
+ (.appendChild (.-body js/document) canvas)))
+
+(defn init-sketches []
+ (let [add-elem? (empty-body?)]
+ (doseq [sk @sketch-init-list]
+ (when add-elem?
+ (add-canvas (:host-id sk)))
+ ((:fn sk))))
+ (reset! sketch-init-list []))
+
+(defn add-sketch-to-init-list [sk]
+ (swap! sketch-init-list conj sk)
+ ; if page already loaded immediately init sketch we just added
+ (when (= (.-readyState js/document) "complete")
+ (init-sketches)))
+
+(events/listenOnce js/window EventType/LOAD init-sketches)
diff --git a/src/http/static/viz/2/quil/sketch.cljs.cache.json b/src/http/static/viz/2/quil/sketch.cljs.cache.json
new file mode 100644
index 0000000..5544f56
--- /dev/null
+++ b/src/http/static/viz/2/quil/sketch.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:externs",["^ ","~$Processing",["^ ","~$prototype",["^ ","~$PConstants",["^ "]],"~$Sketch",["^ "]],"~$Error",["^ "],"~$console",["^ ","~$warn",["^ "],"~$error",["^ "]],"~$document",["^ ","~$body",["^ ","~$childNodes",["^ ","~$length",["^ "]],"~$appendChild",["^ "]],"~$createElement",["^ "],"~$readyState",["^ "]],"~$Object",["^ ","~$setAttribute",["^ "]],"~$window",["^ "]],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$quil.sketch","~:imports",null,"~:requires",["^ ","~$goog.dom","^L","~$dom","^L","~$u","~$quil.util","~$EventType","~$goog.events.EventType","~$quil.middlewares.deprecated-options","^Q","~$do","^Q","^P","^P","~$events","~$goog.events","^T","^T","^N","^N"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$current-applet",["^ ","~:protocol-inline",null,"~:meta",["^ ","~:file","/home/mediocregopher/src/viz/out/quil/sketch.cljs","~:line",12,"~:column",7,"~:end-line",12,"~:end-column",21,"~:arglists",["~#list",["~$quote",["^15",[[]]]]]],"^H","~$quil.sketch/current-applet","^[","out/quil/sketch.cljs","^13",21,"~:method-params",["^15",[[]]],"~:protocol-impl",null,"~:arglists-meta",["^15",[null,null]],"^11",1,"~:variadic?",false,"^10",12,"~:ret-tag","~$clj-nil","^12",12,"~:max-fixed-arity",0,"~:fn-var",true,"^14",["^15",["^16",["^15",[[]]]]]],"~$make-sketch",["^ ","^Y",null,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",49,"^11",7,"^12",49,"^13",18,"^14",["^15",["^16",["^15",[["~$options"]]]]]],"^H","~$quil.sketch/make-sketch","^[","out/quil/sketch.cljs","^13",18,"^18",["^15",[["^1A"]]],"^19",null,"^1:",["^15",[null,null]],"^11",1,"^1;",false,"^10",49,"^1<","~$js/Processing.Sketch","^12",49,"^1>",1,"^1?",true,"^14",["^15",["^16",["^15",[["^1A"]]]]]],"~$sketch",["^ ","^Y",null,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",86,"^11",7,"^12",86,"^13",13,"^14",["^15",["^16",["^15",[["~$&","~$opts"]]]]],"~:top-fn",["^ ","^1;",true,"^1>",0,"^18",[["^15",["^1E"]]],"^14",["^15",[["~$&","^1E"]]],"^1:",["^15",[null]]]],"^H","~$quil.sketch/sketch","^[","out/quil/sketch.cljs","^13",13,"^1F",["^ ","^1;",true,"^1>",0,"^18",[["^15",["^1E"]]],"^14",["^15",[["~$&","^1E"]]],"^1:",["^15",[null]]],"^18",[["^15",["^1E"]]],"^19",null,"^1:",["^15",[null]],"^11",1,"^1;",true,"^10",86,"^1<","~$any","^12",86,"^1>",0,"^1?",true,"^14",["^15",[["~$&","^1E"]]]],"~$bind-handlers",["^ ","^Y",null,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",27,"^11",8,"^12",27,"^13",21,"~:private",true,"^14",["^15",["^16",["^15",[["~$prc","^1E"]]]]]],"^1J",true,"^H","~$quil.sketch/bind-handlers","^[","out/quil/sketch.cljs","^13",21,"^18",["^15",[["^1K","^1E"]]],"^19",null,"^1:",["^15",[null,null]],"^11",1,"^1;",false,"^10",27,"^1<","^1=","^12",27,"^1>",2,"^1?",true,"^14",["^15",["^16",["^15",[["^1K","^1E"]]]]]],"~$empty-body?",["^ ","^Y",null,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",103,"^11",7,"^12",103,"^13",18,"^14",["^15",["^16",["^15",[[]]]]]],"^H","~$quil.sketch/empty-body?","^[","out/quil/sketch.cljs","^13",18,"^18",["^15",[[]]],"^19",null,"^1:",["^15",[null,null]],"^11",1,"^1;",false,"^10",103,"^1<","~$boolean","^12",103,"^1>",0,"^1?",true,"^14",["^15",["^16",["^15",[[]]]]]],"~$rendering-modes",["^ ","^H","~$quil.sketch/rendering-modes","^[","out/quil/sketch.cljs","^10",14,"^11",1,"^12",15,"^13",18,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",15,"^11",3,"^12",15,"^13",18],"~:tag","~$cljs.core/IMap"],"~$size",["^ ","^Y",null,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",20,"^11",7,"^12",20,"^13",11,"^14",["^15",["^16",["^15",[["~$width","~$height"],["^1U","^1V","~$mode"]]]]],"^1F",["^ ","^1;",false,"^1>",3,"^18",["^15",[["^1U","^1V"],["^1U","^1V","^1W"]]],"^14",["^15",[["^1U","^1V"],["^1U","^1V","^1W"]]],"^1:",["^15",[null,null]]]],"^H","~$quil.sketch/size","^[","out/quil/sketch.cljs","^13",11,"^1F",["^ ","^1;",false,"^1>",3,"^18",["^15",[["^1U","^1V"],["^1U","^1V","^1W"]]],"^14",["^15",[["^1U","^1V"],["^1U","^1V","^1W"]]],"^1:",["^15",[null,null]]],"^18",["^15",[["^1U","^1V"],["^1U","^1V","^1W"]]],"^19",null,"^1:",["^15",[null,null]],"^11",1,"^1;",false,"^10",20,"^12",20,"^1>",3,"^1?",true,"^14",["^15",[["^1U","^1V"],["^1U","^1V","^1W"]]]],"~$add-sketch-to-init-list",["^ ","^Y",null,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",122,"^11",7,"^12",122,"^13",30,"^14",["^15",["^16",["^15",[["~$sk"]]]]]],"^H","~$quil.sketch/add-sketch-to-init-list","^[","out/quil/sketch.cljs","^13",30,"^18",["^15",[["^1Z"]]],"^19",null,"^1:",["^15",[null,null]],"^11",1,"^1;",false,"^10",122,"^1<",["^G",[null,"^1H","^1="]],"^12",122,"^1>",1,"^1?",true,"^14",["^15",["^16",["^15",[["^1Z"]]]]]],"~$sketch-init-list",["^ ","^H","~$quil.sketch/sketch-init-list","^[","out/quil/sketch.cljs","^10",101,"^11",1,"^12",101,"^13",22,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",101,"^11",6,"^12",101,"^13",22],"^1R","^1H"],"~$init-sketches",["^ ","^Y",null,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",114,"^11",7,"^12",114,"^13",20,"^14",["^15",["^16",["^15",[[]]]]]],"^H","~$quil.sketch/init-sketches","^[","out/quil/sketch.cljs","^13",20,"^18",["^15",[[]]],"^19",null,"^1:",["^15",[null,null]],"^11",1,"^1;",false,"^10",114,"^1<",["^G",[null,"^1H"]],"^12",114,"^1>",0,"^1?",true,"^14",["^15",["^16",["^15",[[]]]]]],"~$destroy-previous-sketch",["^ ","^Y",null,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",82,"^11",7,"^12",82,"^13",30,"^14",["^15",["^16",["^15",[["~$host-elem"]]]]]],"^H","~$quil.sketch/destroy-previous-sketch","^[","out/quil/sketch.cljs","^13",30,"^18",["^15",[["^25"]]],"^19",null,"^1:",["^15",[null,null]],"^11",1,"^1;",false,"^10",82,"^1<",["^G",["^1H","^1="]],"^12",82,"^1>",1,"^1?",true,"^14",["^15",["^16",["^15",[["^25"]]]]]],"~$resolve-renderer",["^ ","^Y",null,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",17,"^11",7,"^12",17,"^13",23,"^14",["^15",["^16",["^15",[["^1W"]]]]]],"^H","~$quil.sketch/resolve-renderer","^[","out/quil/sketch.cljs","^13",23,"^18",["^15",[["^1W"]]],"^19",null,"^1:",["^15",[null,null]],"^11",1,"^1;",false,"^10",17,"^1<",["^G",[null,"^1H"]],"^12",17,"^1>",1,"^1?",true,"^14",["^15",["^16",["^15",[["^1W"]]]]]],"~$*applet*",["^ ","^H","~$quil.sketch/*applet*","^[","out/quil/sketch.cljs","^10",9,"^11",1,"^12",10,"^13",11,"~:dynamic",true,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",10,"^11",3,"^12",10,"^13",11,"^2;",true],"^1R","^1="],"~$add-canvas",["^ ","^Y",null,"^Z",["^ ","^[","/home/mediocregopher/src/viz/out/quil/sketch.cljs","^10",109,"^11",7,"^12",109,"^13",17,"^14",["^15",["^16",["^15",[["~$canvas-id"]]]]]],"^H","~$quil.sketch/add-canvas","^[","out/quil/sketch.cljs","^13",17,"^18",["^15",[["^2="]]],"^19",null,"^1:",["^15",[null,null]],"^11",1,"^1;",false,"^10",109,"^1<","~$js","^12",109,"^1>",1,"^1?",true,"^14",["^15",["^16",["^15",[["^2="]]]]]]],"~:cljs.spec/registry-ref",[],"~:require-macros",["^ ","^I","^I","~$u","^N","^N","^N"],"~:cljs.analyzer/constants",["^ ","~:seen",["^G",["~:features","~:key-typed","~:mouse-clicked","~:mouse-released","~:fn","~:mouse-exited","~:java2d","~:mouse-wheel","~:keyPressed","~:opengl","~:mouse-moved","~:mouseOut","~:settings","~:mouseScrolled","~:mouseDragged","~:renderer","~:size","~:setup","~:mouse-pressed","~:middleware","~:global-key-events","~:host","~:mouse-entered","~:key-pressed","~:key-released","~:keyReleased","~:mouseClicked","~:p2d","~:mouseReleased","~:mousePressed","~:mouseMoved","~:mouseOver","~:host-id","~:keyTyped","~:draw","~:p3d","~:mouse-dragged"]],"~:order",["^2J","^33","^3;","^2M","^2L","^2O","^2Q","^2R","^2U","^31","^32","^34","^35","^36","^37","^39","^3:","^2[","^2I","^2K","^3<","^30","^2F","^2G","^2V","^2N","^2Z","^2E","^2T","^2W","^2S","^2D","^2P","^2X","^2Y","^38","^2H"]],"~:doc",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/sketch.js b/src/http/static/viz/2/quil/sketch.js
new file mode 100644
index 0000000..b394075
--- /dev/null
+++ b/src/http/static/viz/2/quil/sketch.js
@@ -0,0 +1,341 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('quil.sketch');
+goog.require('cljs.core');
+goog.require('quil.util');
+goog.require('quil.middlewares.deprecated_options');
+goog.require('goog.dom');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+quil.sketch._STAR_applet_STAR_ = null;
+quil.sketch.current_applet = (function quil$sketch$current_applet(){
+return quil.sketch._STAR_applet_STAR_;
+});
+quil.sketch.rendering_modes = new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"java2d","java2d",166099237),(Processing.prototype.PConstants["JAVA2D"]),new cljs.core.Keyword(null,"p2d","p2d",-2106175755),(Processing.prototype.PConstants["P2D"]),new cljs.core.Keyword(null,"p3d","p3d",-850380194),(Processing.prototype.PConstants["P3D"]),new cljs.core.Keyword(null,"opengl","opengl",-614998103),(Processing.prototype.PConstants["OPENGL"])], null);
+quil.sketch.resolve_renderer = (function quil$sketch$resolve_renderer(mode){
+return quil.util.resolve_constant_key.call(null,mode,quil.sketch.rendering_modes);
+});
+quil.sketch.size = (function quil$sketch$size(var_args){
+var G__1217 = arguments.length;
+switch (G__1217) {
+case 2:
+return quil.sketch.size.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.sketch.size.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.sketch.size.cljs$core$IFn$_invoke$arity$2 = (function (width,height){
+return quil.sketch.current_applet.call(null).size((width | (0)),(height | (0)));
+});
+
+quil.sketch.size.cljs$core$IFn$_invoke$arity$3 = (function (width,height,mode){
+return quil.sketch.current_applet.call(null).size((width | (0)),(height | (0)),quil.util.resolve_constant_key.call(null,mode,quil.sketch.rendering_modes));
+});
+
+quil.sketch.size.cljs$lang$maxFixedArity = 3;
+
+quil.sketch.bind_handlers = (function quil$sketch$bind_handlers(prc,opts){
+var seq__1219 = cljs.core.seq.call(null,cljs.core.PersistentHashMap.fromArrays([new cljs.core.Keyword(null,"keyPressed","keyPressed",1791025256),new cljs.core.Keyword(null,"mouseOut","mouseOut",-386669045),new cljs.core.Keyword(null,"mouseScrolled","mouseScrolled",31878252),new cljs.core.Keyword(null,"mouseDragged","mouseDragged",129975181),new cljs.core.Keyword(null,"setup","setup",1987730512),new cljs.core.Keyword(null,"keyReleased","keyReleased",541714964),new cljs.core.Keyword(null,"mouseClicked","mouseClicked",1764302965),new cljs.core.Keyword(null,"mouseReleased","mouseReleased",1116234838),new cljs.core.Keyword(null,"mousePressed","mousePressed",1776186454),new cljs.core.Keyword(null,"mouseMoved","mouseMoved",-1936954058),new cljs.core.Keyword(null,"mouseOver","mouseOver",-1334461930),new cljs.core.Keyword(null,"keyTyped","keyTyped",1437329399),new cljs.core.Keyword(null,"draw","draw",1358331674)],[new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364),new cljs.core.Keyword(null,"mouse-exited","mouse-exited",-483205244),new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439),new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441),new cljs.core.Keyword(null,"setup","setup",1987730512),new cljs.core.Keyword(null,"key-released","key-released",215919828),new cljs.core.Keyword(null,"mouse-clicked","mouse-clicked",-199339421),new cljs.core.Keyword(null,"mouse-released","mouse-released",-664480061),new cljs.core.Keyword(null,"mouse-pressed","mouse-pressed",736955536),new cljs.core.Keyword(null,"mouse-moved","mouse-moved",-1918152310),new cljs.core.Keyword(null,"mouse-entered","mouse-entered",811350322),new cljs.core.Keyword(null,"key-typed","key-typed",-876037597),new cljs.core.Keyword(null,"draw","draw",1358331674)]));
+var chunk__1220 = null;
+var count__1221 = (0);
+var i__1222 = (0);
+while(true){
+if((i__1222 < count__1221)){
+var vec__1223 = cljs.core._nth.call(null,chunk__1220,i__1222);
+var processing_name = cljs.core.nth.call(null,vec__1223,(0),null);
+var quil_name = cljs.core.nth.call(null,vec__1223,(1),null);
+var temp__4657__auto___1233 = opts.call(null,quil_name);
+if(cljs.core.truth_(temp__4657__auto___1233)){
+var handler_1234 = temp__4657__auto___1233;
+(prc[cljs.core.name.call(null,processing_name)] = ((function (seq__1219,chunk__1220,count__1221,i__1222,handler_1234,temp__4657__auto___1233,vec__1223,processing_name,quil_name){
+return (function (){
+var _STAR_applet_STAR__orig_val__1226 = quil.sketch._STAR_applet_STAR_;
+var _STAR_applet_STAR__temp_val__1227 = prc;
+quil.sketch._STAR_applet_STAR_ = _STAR_applet_STAR__temp_val__1227;
+
+try{return handler_1234.call(null);
+}finally {quil.sketch._STAR_applet_STAR_ = _STAR_applet_STAR__orig_val__1226;
+}});})(seq__1219,chunk__1220,count__1221,i__1222,handler_1234,temp__4657__auto___1233,vec__1223,processing_name,quil_name))
+);
+} else {
+}
+
+
+var G__1235 = seq__1219;
+var G__1236 = chunk__1220;
+var G__1237 = count__1221;
+var G__1238 = (i__1222 + (1));
+seq__1219 = G__1235;
+chunk__1220 = G__1236;
+count__1221 = G__1237;
+i__1222 = G__1238;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq.call(null,seq__1219);
+if(temp__4657__auto__){
+var seq__1219__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__1219__$1)){
+var c__4461__auto__ = cljs.core.chunk_first.call(null,seq__1219__$1);
+var G__1239 = cljs.core.chunk_rest.call(null,seq__1219__$1);
+var G__1240 = c__4461__auto__;
+var G__1241 = cljs.core.count.call(null,c__4461__auto__);
+var G__1242 = (0);
+seq__1219 = G__1239;
+chunk__1220 = G__1240;
+count__1221 = G__1241;
+i__1222 = G__1242;
+continue;
+} else {
+var vec__1228 = cljs.core.first.call(null,seq__1219__$1);
+var processing_name = cljs.core.nth.call(null,vec__1228,(0),null);
+var quil_name = cljs.core.nth.call(null,vec__1228,(1),null);
+var temp__4657__auto___1243__$1 = opts.call(null,quil_name);
+if(cljs.core.truth_(temp__4657__auto___1243__$1)){
+var handler_1244 = temp__4657__auto___1243__$1;
+(prc[cljs.core.name.call(null,processing_name)] = ((function (seq__1219,chunk__1220,count__1221,i__1222,handler_1244,temp__4657__auto___1243__$1,vec__1228,processing_name,quil_name,seq__1219__$1,temp__4657__auto__){
+return (function (){
+var _STAR_applet_STAR__orig_val__1231 = quil.sketch._STAR_applet_STAR_;
+var _STAR_applet_STAR__temp_val__1232 = prc;
+quil.sketch._STAR_applet_STAR_ = _STAR_applet_STAR__temp_val__1232;
+
+try{return handler_1244.call(null);
+}finally {quil.sketch._STAR_applet_STAR_ = _STAR_applet_STAR__orig_val__1231;
+}});})(seq__1219,chunk__1220,count__1221,i__1222,handler_1244,temp__4657__auto___1243__$1,vec__1228,processing_name,quil_name,seq__1219__$1,temp__4657__auto__))
+);
+} else {
+}
+
+
+var G__1245 = cljs.core.next.call(null,seq__1219__$1);
+var G__1246 = null;
+var G__1247 = (0);
+var G__1248 = (0);
+seq__1219 = G__1245;
+chunk__1220 = G__1246;
+count__1221 = G__1247;
+i__1222 = G__1248;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+});
+quil.sketch.make_sketch = (function quil$sketch$make_sketch(options){
+var opts = cljs.core.merge.call(null,new cljs.core.PersistentArrayMap(null, 1, [new cljs.core.Keyword(null,"size","size",1098693007),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(500),(300)], null)], null),(function (p1__1249_SHARP_){
+return p1__1249_SHARP_.call(null,options);
+}).call(null,cljs.core.apply.call(null,cljs.core.comp,cljs.core.cons.call(null,quil.middlewares.deprecated_options.deprecated_options,new cljs.core.Keyword(null,"middleware","middleware",1462115504).cljs$core$IFn$_invoke$arity$2(options,cljs.core.PersistentVector.EMPTY)))));
+var sketch_size = (function (){var or__4047__auto__ = new cljs.core.Keyword(null,"size","size",1098693007).cljs$core$IFn$_invoke$arity$1(opts);
+if(cljs.core.truth_(or__4047__auto__)){
+return or__4047__auto__;
+} else {
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(200),(200)], null);
+}
+})();
+var renderer = new cljs.core.Keyword(null,"renderer","renderer",336841071).cljs$core$IFn$_invoke$arity$1(opts);
+var features = cljs.core.set.call(null,new cljs.core.Keyword(null,"features","features",-1146962336).cljs$core$IFn$_invoke$arity$1(opts));
+var setup = ((function (opts,sketch_size,renderer,features){
+return (function (){
+cljs.core.apply.call(null,quil.sketch.size,cljs.core.concat.call(null,sketch_size,(cljs.core.truth_(renderer)?new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [renderer], null):cljs.core.PersistentVector.EMPTY)));
+
+if(cljs.core.truth_(new cljs.core.Keyword(null,"settings","settings",1556144875).cljs$core$IFn$_invoke$arity$1(opts))){
+new cljs.core.Keyword(null,"settings","settings",1556144875).cljs$core$IFn$_invoke$arity$1(opts).call(null);
+} else {
+}
+
+if(cljs.core.truth_(new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$1(opts))){
+return new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$1(opts).call(null);
+} else {
+return null;
+}
+});})(opts,sketch_size,renderer,features))
+;
+var mouse_wheel = (cljs.core.truth_(new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439).cljs$core$IFn$_invoke$arity$1(opts))?((function (opts,sketch_size,renderer,features,setup){
+return (function (){
+return new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439).cljs$core$IFn$_invoke$arity$1(opts).call(null,((-1) * quil.sketch._STAR_applet_STAR_.mouseScroll));
+});})(opts,sketch_size,renderer,features,setup))
+:null);
+var opts__$1 = cljs.core.assoc.call(null,opts,new cljs.core.Keyword(null,"setup","setup",1987730512),setup,new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439),mouse_wheel);
+var attach_function = ((function (opts,sketch_size,renderer,features,setup,mouse_wheel,opts__$1){
+return (function (prc){
+quil.sketch.bind_handlers.call(null,prc,opts__$1);
+
+prc.quil = cljs.core.atom.call(null,null);
+
+return prc.target_frame_rate = cljs.core.atom.call(null,(60));
+});})(opts,sketch_size,renderer,features,setup,mouse_wheel,opts__$1))
+;
+var sketch = (new Processing.Sketch(attach_function));
+if(cljs.core.contains_QMARK_.call(null,features,new cljs.core.Keyword(null,"global-key-events","global-key-events",335064944))){
+((sketch["options"])["globalKeyEvents"] = true);
+} else {
+}
+
+return sketch;
+});
+quil.sketch.destroy_previous_sketch = (function quil$sketch$destroy_previous_sketch(host_elem){
+var temp__4657__auto__ = host_elem.processing_obj;
+if(cljs.core.truth_(temp__4657__auto__)){
+var proc_obj = temp__4657__auto__;
+return proc_obj.exit();
+} else {
+return null;
+}
+});
+quil.sketch.sketch = (function quil$sketch$sketch(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1251 = arguments.length;
+var i__4642__auto___1252 = (0);
+while(true){
+if((i__4642__auto___1252 < len__4641__auto___1251)){
+args__4647__auto__.push((arguments[i__4642__auto___1252]));
+
+var G__1253 = (i__4642__auto___1252 + (1));
+i__4642__auto___1252 = G__1253;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((0) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((0)),(0),null)):null);
+return quil.sketch.sketch.cljs$core$IFn$_invoke$arity$variadic(argseq__4648__auto__);
+});
+
+quil.sketch.sketch.cljs$core$IFn$_invoke$arity$variadic = (function (opts){
+var opts_map = cljs.core.apply.call(null,cljs.core.hash_map,opts);
+var host_elem = goog.dom.getElement(new cljs.core.Keyword(null,"host","host",-1558485167).cljs$core$IFn$_invoke$arity$1(opts_map));
+var renderer = (function (){var or__4047__auto__ = new cljs.core.Keyword(null,"renderer","renderer",336841071).cljs$core$IFn$_invoke$arity$1(opts_map);
+if(cljs.core.truth_(or__4047__auto__)){
+return or__4047__auto__;
+} else {
+return new cljs.core.Keyword(null,"p2d","p2d",-2106175755);
+}
+})();
+if(cljs.core.truth_(host_elem)){
+if(cljs.core.truth_(host_elem.processing_context)){
+if(cljs.core._EQ_.call(null,renderer,host_elem.processing_context)){
+} else {
+console.warn("WARNING: Using different context on one canvas!");
+}
+} else {
+host_elem.processing_context = renderer;
+}
+
+quil.sketch.destroy_previous_sketch.call(null,host_elem);
+
+return host_elem.processing_obj = (new Processing(host_elem,quil.sketch.make_sketch.call(null,opts_map)));
+} else {
+return console.error("ERROR: Cannot create sketch. :host is not specified.");
+}
+});
+
+quil.sketch.sketch.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+quil.sketch.sketch.cljs$lang$applyTo = (function (seq1250){
+var self__4629__auto__ = this;
+return self__4629__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq1250));
+});
+
+quil.sketch.sketch_init_list = cljs.core.atom.call(null,cljs.core.List.EMPTY);
+quil.sketch.empty_body_QMARK_ = (function quil$sketch$empty_body_QMARK_(){
+var child = document.body.childNodes;
+return (child.length <= (1));
+});
+quil.sketch.add_canvas = (function quil$sketch$add_canvas(canvas_id){
+var canvas = document.createElement("canvas");
+canvas.setAttribute("id",canvas_id);
+
+return document.body.appendChild(canvas);
+});
+quil.sketch.init_sketches = (function quil$sketch$init_sketches(){
+var add_elem_QMARK__1258 = quil.sketch.empty_body_QMARK_.call(null);
+var seq__1254_1259 = cljs.core.seq.call(null,cljs.core.deref.call(null,quil.sketch.sketch_init_list));
+var chunk__1255_1260 = null;
+var count__1256_1261 = (0);
+var i__1257_1262 = (0);
+while(true){
+if((i__1257_1262 < count__1256_1261)){
+var sk_1263 = cljs.core._nth.call(null,chunk__1255_1260,i__1257_1262);
+if(add_elem_QMARK__1258){
+quil.sketch.add_canvas.call(null,new cljs.core.Keyword(null,"host-id","host-id",742376279).cljs$core$IFn$_invoke$arity$1(sk_1263));
+} else {
+}
+
+new cljs.core.Keyword(null,"fn","fn",-1175266204).cljs$core$IFn$_invoke$arity$1(sk_1263).call(null);
+
+
+var G__1264 = seq__1254_1259;
+var G__1265 = chunk__1255_1260;
+var G__1266 = count__1256_1261;
+var G__1267 = (i__1257_1262 + (1));
+seq__1254_1259 = G__1264;
+chunk__1255_1260 = G__1265;
+count__1256_1261 = G__1266;
+i__1257_1262 = G__1267;
+continue;
+} else {
+var temp__4657__auto___1268 = cljs.core.seq.call(null,seq__1254_1259);
+if(temp__4657__auto___1268){
+var seq__1254_1269__$1 = temp__4657__auto___1268;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__1254_1269__$1)){
+var c__4461__auto___1270 = cljs.core.chunk_first.call(null,seq__1254_1269__$1);
+var G__1271 = cljs.core.chunk_rest.call(null,seq__1254_1269__$1);
+var G__1272 = c__4461__auto___1270;
+var G__1273 = cljs.core.count.call(null,c__4461__auto___1270);
+var G__1274 = (0);
+seq__1254_1259 = G__1271;
+chunk__1255_1260 = G__1272;
+count__1256_1261 = G__1273;
+i__1257_1262 = G__1274;
+continue;
+} else {
+var sk_1275 = cljs.core.first.call(null,seq__1254_1269__$1);
+if(add_elem_QMARK__1258){
+quil.sketch.add_canvas.call(null,new cljs.core.Keyword(null,"host-id","host-id",742376279).cljs$core$IFn$_invoke$arity$1(sk_1275));
+} else {
+}
+
+new cljs.core.Keyword(null,"fn","fn",-1175266204).cljs$core$IFn$_invoke$arity$1(sk_1275).call(null);
+
+
+var G__1276 = cljs.core.next.call(null,seq__1254_1269__$1);
+var G__1277 = null;
+var G__1278 = (0);
+var G__1279 = (0);
+seq__1254_1259 = G__1276;
+chunk__1255_1260 = G__1277;
+count__1256_1261 = G__1278;
+i__1257_1262 = G__1279;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+return cljs.core.reset_BANG_.call(null,quil.sketch.sketch_init_list,cljs.core.PersistentVector.EMPTY);
+});
+quil.sketch.add_sketch_to_init_list = (function quil$sketch$add_sketch_to_init_list(sk){
+cljs.core.swap_BANG_.call(null,quil.sketch.sketch_init_list,cljs.core.conj,sk);
+
+if(cljs.core._EQ_.call(null,document.readyState,"complete")){
+return quil.sketch.init_sketches.call(null);
+} else {
+return null;
+}
+});
+goog.events.listenOnce(window,goog.events.EventType.LOAD,quil.sketch.init_sketches);
+
+//# sourceMappingURL=sketch.js.map
diff --git a/src/http/static/viz/2/quil/sketch.js.map b/src/http/static/viz/2/quil/sketch.js.map
new file mode 100644
index 0000000..b9bbeec
--- /dev/null
+++ b/src/http/static/viz/2/quil/sketch.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/sketch.js","sources":["sketch.cljs"],"lineCount":341,"mappings":"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","names":["quil.sketch\/*applet*","quil.sketch\/current-applet","js\/Processing.prototype.PConstants","quil.sketch\/rendering-modes","quil.sketch\/resolve-renderer","quil.util\/resolve-constant-key","mode","G__1217","quil.sketch\/size","js\/Error","width","height","quil.sketch\/bind-handlers","cljs.core\/seq","i__1222","count__1221","cljs.core\/-nth","chunk__1220","cljs.core\/nth","vec__1223","seq__1219","temp__4657__auto__","cljs.core\/chunked-seq?","cljs.core\/chunk-first","cljs.core\/chunk-rest","c__4461__auto__","cljs.core\/count","cljs.core\/first","vec__1228","cljs.core\/next","opts","quil-name","prc","cljs.core\/name","processing-name","*applet*-temp-val__1227","*applet*-orig-val__1226","*applet*-temp-val__1232","*applet*-orig-val__1231","handler","quil.sketch\/make-sketch","options","cljs.core\/cons","quil.middlewares.deprecated-options\/deprecated-options","cljs.core\/apply","cljs.core\/comp","p1__1249#","cljs.core\/merge","or__4047__auto__","cljs.core\/set","renderer","cljs.core\/concat","sketch-size","cljs.core\/assoc","setup","mouse-wheel","cljs.core\/atom","js\/Processing.Sketch","attach-function","cljs.core\/contains?","features","sketch","quil.sketch\/destroy-previous-sketch","host-elem","proc-obj","i__4642__auto__","len__4641__auto__","args__4647__auto__","cljs.core\/IndexedSeq","quil.sketch\/sketch","argseq__4648__auto__","self__4629__auto__","seq1250","cljs.core\/hash-map","goog.dom\/getElement","opts-map","cljs.core\/=","js\/console","js\/Processing","quil.sketch\/sketch-init-list","quil.sketch\/empty-body?","js\/document","child","quil.sketch\/add-canvas","canvas","canvas-id","quil.sketch\/init-sketches","cljs.core\/deref","i__1257","count__1256","chunk__1255","seq__1254","add-elem?","sk","cljs.core\/reset!","quil.sketch\/add-sketch-to-init-list","cljs.core\/swap!","cljs.core\/conj","goog.events\/listenOnce","js\/window","goog.events.EventType\/LOAD","cljs.core\/List"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/util.cljc b/src/http/static/viz/2/quil/util.cljc
new file mode 100644
index 0000000..3cd0739
--- /dev/null
+++ b/src/http/static/viz/2/quil/util.cljc
@@ -0,0 +1,109 @@
+(ns ^{:doc "Utility fns"}
+ quil.util
+ (:require [clojure.string :as cstr]))
+
+(defn no-fn
+ "Function that does nothing."
+ [])
+
+#?(:clj
+ (defn callable? [value]
+ (or (fn? value)
+ (var? value))))
+
+#?(:clj
+ (defn absolute-path [path]
+ (-> (str path)
+ (java.io.File.)
+ (.getAbsolutePath))))
+
+#?(:clj
+ (defn int-like?
+ [val]
+ (let [t (type val)]
+ (or (= java.lang.Long t)
+ (= java.lang.Integer t)))))
+
+(defn resolve-constant-key
+ "Returns the val associated with key in mappings or key directly if it
+ is one of the vals in mappings. Otherwise throws an exception."
+ [key mappings]
+ (cond
+ (get mappings key) (get mappings key)
+ (some #{key} (vals mappings)) key
+
+ :else (throw (#?(:clj Exception.
+ :cljs js/Error.)
+ (str "Expecting a keyword, got: " key ". Expected one of: " (vec (sort (keys mappings))))))))
+
+(defn- length-of-longest-key
+ "Returns the length of the longest key of map m. Assumes m's keys are strings
+ and returns 0 if map is empty:
+ (length-of-longest-key {\"foo\" 1 \"barr\" 2 \"bazzz\" 3}) ;=> 5
+ (length-of-longest-key {}) ;=> 0"
+ [m]
+ (or (last (sort (map #(.length %) (keys m))))
+ 0))
+
+(defn- gen-padding
+ "Generates a padding string starting concatting s with len times pad:
+ (gen-padding \"\" 5 \"b\") ;=> \"bbbbb\"
+ May be called without starting string s in which case it defaults to the
+ empty string and also without pad in which case it defaults to a single space"
+ ([len] (gen-padding "" len " "))
+ ([len pad] (gen-padding "" len pad))
+ ([s len pad]
+ (if (> len 0)
+ (gen-padding (str s pad) (dec len) pad)
+ s)))
+
+(defn print-definition-list
+ [definitions]
+ (let [longest-key (length-of-longest-key definitions)]
+ (dorun
+ (map (fn [[k v]]
+ (let [len (.length k)
+ diff (- longest-key len)
+ pad (gen-padding diff)]
+ (println k pad "- " v)))
+ definitions))))
+
+(defn clj-compilation? []
+ #?(:clj
+ (not
+ (boolean
+ (when-let [n (find-ns 'cljs.analyzer)]
+ (when-let [v (ns-resolve n '*cljs-file*)]
+ @v))))
+ :cljs false))
+
+
+(defn prepare-quil-name [const-keyword]
+ (cstr/replace
+ (cstr/upper-case (name const-keyword))
+ #"-" "_"))
+
+(defn prepare-quil-clj-constants [constants]
+ (into {}
+ (map
+ #(vector % (symbol (str "PConstants/" (prepare-quil-name %))))
+ constants)))
+
+(defn prepare-quil-cljs-constants [constants]
+ (into {}
+ (map
+ #(vector % `(aget js/Processing.prototype.PConstants ~(prepare-quil-name %)))
+ constants)))
+
+(defn make-quil-constant-map [target const-map-name const-map]
+ `(def ^{:private true}
+ ~const-map-name
+ ~(if (= target :clj)
+ (prepare-quil-clj-constants const-map)
+ (prepare-quil-cljs-constants const-map))))
+
+(defmacro generate-quil-constants [target & opts]
+ `(do
+ ~@(map
+ #(make-quil-constant-map target (first %) (second %))
+ (partition 2 opts))))
diff --git a/src/http/static/viz/2/quil/util.cljc.cache.json b/src/http/static/viz/2/quil/util.cljc.cache.json
new file mode 100644
index 0000000..ffc87ae
--- /dev/null
+++ b/src/http/static/viz/2/quil/util.cljc.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:externs",["^ ","~$Error",["^ "],"~$Processing",["^ ","~$prototype",["^ ","~$PConstants",["^ "]]]],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$quil.util","~:imports",null,"~:requires",["^ ","~$cstr","~$clojure.string","^?","^?"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$clj-compilation?",["^ ","~:protocol-inline",null,"~:meta",["^ ","~:file","/home/mediocregopher/src/viz/out/quil/util.cljc","~:line",71,"~:column",7,"~:end-line",71,"~:end-column",23,"~:arglists",["~#list",["~$quote",["^L",[[]]]]]],"^:","~$quil.util/clj-compilation?","^F","out/quil/util.cljc","^J",23,"~:method-params",["^L",[[]]],"~:protocol-impl",null,"~:arglists-meta",["^L",[null,null]],"^H",1,"~:variadic?",false,"^G",71,"~:ret-tag","~$boolean","^I",71,"~:max-fixed-arity",0,"~:fn-var",true,"^K",["^L",["^M",["^L",[[]]]]]],"~$make-quil-constant-map",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/out/quil/util.cljc","^G",98,"^H",7,"^I",98,"^J",29,"^K",["^L",["^M",["^L",[["~$target","~$const-map-name","~$const-map"]]]]]],"^:","~$quil.util/make-quil-constant-map","^F","out/quil/util.cljc","^J",29,"^O",["^L",[["^X","^Y","^Z"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",98,"^S","~$any","^I",98,"^U",3,"^V",true,"^K",["^L",["^M",["^L",[["^X","^Y","^Z"]]]]]],"~$print-definition-list",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/out/quil/util.cljc","^G",60,"^H",7,"^I",60,"^J",28,"^K",["^L",["^M",["^L",[["~$definitions"]]]]]],"^:","~$quil.util/print-definition-list","^F","out/quil/util.cljc","^J",28,"^O",["^L",[["^12"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",60,"^S","^10","^I",60,"^U",1,"^V",true,"^K",["^L",["^M",["^L",[["^12"]]]]]],"~$generate-quil-constants",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/out/quil/util.cljc","^G",105,"^H",11,"^I",105,"^J",34,"~:macro",true,"^K",["^L",["^M",["^L",[["^X","~$&","~$opts"]]]]],"~:top-fn",["^ ","^R",true,"^U",1,"^O",["^L",[["^L",["^X","^16"]]]],"^K",["^L",[["^X","~$&","^16"]]],"^Q",["^L",[null]]]],"^:","~$quil.util/generate-quil-constants","^F","out/quil/util.cljc","^J",34,"^17",["^ ","^R",true,"^U",1,"^O",["^L",[["^L",["^X","^16"]]]],"^K",["^L",[["^X","~$&","^16"]]],"^Q",["^L",[null]]],"^O",["^L",[["^L",["^X","^16"]]]],"^P",null,"^Q",["^L",[null]],"^H",1,"^R",true,"^G",105,"^15",true,"^S","^10","^I",105,"^U",1,"^V",false,"^K",["^L",[["^X","~$&","^16"]]]],"~$resolve-constant-key",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/out/quil/util.cljc","^G",27,"^H",7,"^I",27,"^J",27,"^K",["^L",["^M",["^L",[["~$key","~$mappings"]]]]],"~:doc","Returns the val associated with key in mappings or key directly if it\n is one of the vals in mappings. Otherwise throws an exception."],"^:","~$quil.util/resolve-constant-key","^F","out/quil/util.cljc","^J",27,"^O",["^L",[["^1:","^1;"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",27,"^S",["^9",[null,"^10"]],"^I",27,"^U",2,"^V",true,"^K",["^L",["^M",["^L",[["^1:","^1;"]]]]],"^1<","Returns the val associated with key in mappings or key directly if it\n is one of the vals in mappings. Otherwise throws an exception."],"~$no-fn",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/out/quil/util.cljc","^G",5,"^H",7,"^I",5,"^J",12,"^K",["^L",["^M",["^L",[[]]]]],"^1<","Function that does nothing."],"^:","~$quil.util/no-fn","^F","out/quil/util.cljc","^J",12,"^O",["^L",[[]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",5,"^S","~$clj-nil","^I",5,"^U",0,"^V",true,"^K",["^L",["^M",["^L",[[]]]]],"^1<","Function that does nothing."],"~$prepare-quil-clj-constants",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/out/quil/util.cljc","^G",86,"^H",7,"^I",86,"^J",33,"^K",["^L",["^M",["^L",[["~$constants"]]]]]],"^:","~$quil.util/prepare-quil-clj-constants","^F","out/quil/util.cljc","^J",33,"^O",["^L",[["^1B"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",86,"^S","^10","^I",86,"^U",1,"^V",true,"^K",["^L",["^M",["^L",[["^1B"]]]]]],"~$prepare-quil-cljs-constants",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/out/quil/util.cljc","^G",92,"^H",7,"^I",92,"^J",34,"^K",["^L",["^M",["^L",[["^1B"]]]]]],"^:","~$quil.util/prepare-quil-cljs-constants","^F","out/quil/util.cljc","^J",34,"^O",["^L",[["^1B"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",92,"^S","^10","^I",92,"^U",1,"^V",true,"^K",["^L",["^M",["^L",[["^1B"]]]]]],"~$length-of-longest-key",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/out/quil/util.cljc","^G",39,"^H",8,"^I",39,"^J",29,"~:private",true,"^K",["^L",["^M",["^L",[["~$m"]]]]],"^1<","Returns the length of the longest key of map m. Assumes m's keys are strings\n and returns 0 if map is empty:\n (length-of-longest-key {\"foo\" 1 \"barr\" 2 \"bazzz\" 3}) ;=> 5\n (length-of-longest-key {}) ;=> 0"],"^1G",true,"^:","~$quil.util/length-of-longest-key","^F","out/quil/util.cljc","^J",29,"^O",["^L",[["~$m"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",39,"^S",["^9",["^10","~$number","^1@"]],"^I",39,"^U",1,"^V",true,"^K",["^L",["^M",["^L",[["~$m"]]]]],"^1<","Returns the length of the longest key of map m. Assumes m's keys are strings\n and returns 0 if map is empty:\n (length-of-longest-key {\"foo\" 1 \"barr\" 2 \"bazzz\" 3}) ;=> 5\n (length-of-longest-key {}) ;=> 0"],"~$gen-padding",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/out/quil/util.cljc","^G",48,"^H",8,"^I",48,"^J",19,"^1G",true,"^K",["^L",["^M",["^L",[["~$len"],["^1K","~$pad"],["~$s","^1K","^1L"]]]]],"^1<","Generates a padding string starting concatting s with len times pad:\n (gen-padding \"\" 5 \"b\") ;=> \"bbbbb\"\n May be called without starting string s in which case it defaults to the\n empty string and also without pad in which case it defaults to a single space","^17",["^ ","^R",false,"^U",3,"^O",["^L",[["^1K"],["^1K","^1L"],["~$s","^1K","^1L"]]],"^K",["^L",[["^1K"],["^1K","^1L"],["~$s","^1K","^1L"]]],"^Q",["^L",[null,null,null]]]],"^1G",true,"^:","~$quil.util/gen-padding","^F","out/quil/util.cljc","^J",19,"^17",["^ ","^R",false,"^U",3,"^O",["^L",[["^1K"],["^1K","^1L"],["~$s","^1K","^1L"]]],"^K",["^L",[["^1K"],["^1K","^1L"],["~$s","^1K","^1L"]]],"^Q",["^L",[null,null,null]]],"^O",["^L",[["^1K"],["^1K","^1L"],["~$s","^1K","^1L"]]],"^P",null,"^Q",["^L",[null,null,null]],"^H",1,"^R",false,"^G",48,"^I",48,"^U",3,"^V",true,"^K",["^L",[["^1K"],["^1K","^1L"],["~$s","^1K","^1L"]]],"^1<","Generates a padding string starting concatting s with len times pad:\n (gen-padding \"\" 5 \"b\") ;=> \"bbbbb\"\n May be called without starting string s in which case it defaults to the\n empty string and also without pad in which case it defaults to a single space"],"~$prepare-quil-name",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/out/quil/util.cljc","^G",81,"^H",7,"^I",81,"^J",24,"^K",["^L",["^M",["^L",[["~$const-keyword"]]]]]],"^:","~$quil.util/prepare-quil-name","^F","out/quil/util.cljc","^J",24,"^O",["^L",[["^1O"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",81,"^S","^10","^I",81,"^U",1,"^V",true,"^K",["^L",["^M",["^L",[["^1O"]]]]]]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:cljs.analyzer/constants",["^ ","~:seen",["^9",["~:else","~$do","~$js/Processing.prototype.PConstants","~:clj","~$cljs.core/aget","~$def"]],"~:order",["^1U","^1Y","^1W","^1Z","^1X","^1V"]],"^1<","Utility fns"] \ No newline at end of file
diff --git a/src/http/static/viz/2/quil/util.js b/src/http/static/viz/2/quil/util.js
new file mode 100644
index 0000000..f0e8bc9
--- /dev/null
+++ b/src/http/static/viz/2/quil/util.js
@@ -0,0 +1,168 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('quil.util');
+goog.require('cljs.core');
+goog.require('clojure.string');
+/**
+ * Function that does nothing.
+ */
+quil.util.no_fn = (function quil$util$no_fn(){
+return null;
+});
+/**
+ * Returns the val associated with key in mappings or key directly if it
+ * is one of the vals in mappings. Otherwise throws an exception.
+ */
+quil.util.resolve_constant_key = (function quil$util$resolve_constant_key(key,mappings){
+if(cljs.core.truth_(cljs.core.get.call(null,mappings,key))){
+return cljs.core.get.call(null,mappings,key);
+} else {
+if(cljs.core.truth_(cljs.core.some.call(null,cljs.core.PersistentHashSet.createAsIfByAssoc([key]),cljs.core.vals.call(null,mappings)))){
+return key;
+} else {
+throw (new Error(["Expecting a keyword, got: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(key),". Expected one of: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(cljs.core.vec.call(null,cljs.core.sort.call(null,cljs.core.keys.call(null,mappings))))].join('')));
+
+}
+}
+});
+/**
+ * Returns the length of the longest key of map m. Assumes m's keys are strings
+ * and returns 0 if map is empty:
+ * (length-of-longest-key {"foo" 1 "barr" 2 "bazzz" 3}) ;=> 5
+ * (length-of-longest-key {}) ;=> 0
+ */
+quil.util.length_of_longest_key = (function quil$util$length_of_longest_key(m){
+var or__4047__auto__ = cljs.core.last.call(null,cljs.core.sort.call(null,cljs.core.map.call(null,(function (p1__1156_SHARP_){
+return p1__1156_SHARP_.length();
+}),cljs.core.keys.call(null,m))));
+if(cljs.core.truth_(or__4047__auto__)){
+return or__4047__auto__;
+} else {
+return (0);
+}
+});
+/**
+ * Generates a padding string starting concatting s with len times pad:
+ * (gen-padding "" 5 "b") ;=> "bbbbb"
+ * May be called without starting string s in which case it defaults to the
+ * empty string and also without pad in which case it defaults to a single space
+ */
+quil.util.gen_padding = (function quil$util$gen_padding(var_args){
+var G__1158 = arguments.length;
+switch (G__1158) {
+case 1:
+return quil.util.gen_padding.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
+
+break;
+case 2:
+return quil.util.gen_padding.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.util.gen_padding.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
+
+}
+});
+
+quil.util.gen_padding.cljs$core$IFn$_invoke$arity$1 = (function (len){
+return quil.util.gen_padding.call(null,"",len," ");
+});
+
+quil.util.gen_padding.cljs$core$IFn$_invoke$arity$2 = (function (len,pad){
+return quil.util.gen_padding.call(null,"",len,pad);
+});
+
+quil.util.gen_padding.cljs$core$IFn$_invoke$arity$3 = (function (s,len,pad){
+if((len > (0))){
+return quil.util.gen_padding.call(null,[cljs.core.str.cljs$core$IFn$_invoke$arity$1(s),cljs.core.str.cljs$core$IFn$_invoke$arity$1(pad)].join(''),(len - (1)),pad);
+} else {
+return s;
+}
+});
+
+quil.util.gen_padding.cljs$lang$maxFixedArity = 3;
+
+quil.util.print_definition_list = (function quil$util$print_definition_list(definitions){
+var longest_key = quil.util.length_of_longest_key.call(null,definitions);
+return cljs.core.dorun.call(null,cljs.core.map.call(null,((function (longest_key){
+return (function (p__1160){
+var vec__1161 = p__1160;
+var k = cljs.core.nth.call(null,vec__1161,(0),null);
+var v = cljs.core.nth.call(null,vec__1161,(1),null);
+var len = k.length();
+var diff = (longest_key - len);
+var pad = quil.util.gen_padding.call(null,diff);
+return cljs.core.println.call(null,k,pad,"- ",v);
+});})(longest_key))
+,definitions));
+});
+quil.util.clj_compilation_QMARK_ = (function quil$util$clj_compilation_QMARK_(){
+return false;
+});
+quil.util.prepare_quil_name = (function quil$util$prepare_quil_name(const_keyword){
+return clojure.string.replace.call(null,clojure.string.upper_case.call(null,cljs.core.name.call(null,const_keyword)),/-/,"_");
+});
+quil.util.prepare_quil_clj_constants = (function quil$util$prepare_quil_clj_constants(constants){
+return cljs.core.into.call(null,cljs.core.PersistentArrayMap.EMPTY,cljs.core.map.call(null,(function (p1__1164_SHARP_){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[p1__1164_SHARP_,cljs.core.symbol.call(null,["PConstants/",cljs.core.str.cljs$core$IFn$_invoke$arity$1(quil.util.prepare_quil_name.call(null,p1__1164_SHARP_))].join(''))],null));
+}),constants));
+});
+quil.util.prepare_quil_cljs_constants = (function quil$util$prepare_quil_cljs_constants(constants){
+return cljs.core.into.call(null,cljs.core.PersistentArrayMap.EMPTY,cljs.core.map.call(null,(function (p1__1165_SHARP_){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[p1__1165_SHARP_,cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol("cljs.core","aget","cljs.core/aget",6345791,null),null,(1),null)),(new cljs.core.List(null,new cljs.core.Symbol("js","Processing.prototype.PConstants","js/Processing.prototype.PConstants",2034048972,null),null,(1),null)),(new cljs.core.List(null,quil.util.prepare_quil_name.call(null,p1__1165_SHARP_),null,(1),null)))))],null));
+}),constants));
+});
+quil.util.make_quil_constant_map = (function quil$util$make_quil_constant_map(target,const_map_name,const_map){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"def","def",597100991,null),null,(1),null)),(new cljs.core.List(null,const_map_name,null,(1),null)),(new cljs.core.List(null,((cljs.core._EQ_.call(null,target,new cljs.core.Keyword(null,"clj","clj",-660495428)))?quil.util.prepare_quil_clj_constants.call(null,const_map):quil.util.prepare_quil_cljs_constants.call(null,const_map)),null,(1),null)))));
+});
+var ret__4684__auto___1171 = (function (){
+quil.util.generate_quil_constants = (function quil$util$generate_quil_constants(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___1172 = arguments.length;
+var i__4642__auto___1173 = (0);
+while(true){
+if((i__4642__auto___1173 < len__4641__auto___1172)){
+args__4647__auto__.push((arguments[i__4642__auto___1173]));
+
+var G__1174 = (i__4642__auto___1173 + (1));
+i__4642__auto___1173 = G__1174;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((3) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((3)),(0),null)):null);
+return quil.util.generate_quil_constants.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),argseq__4648__auto__);
+});
+
+quil.util.generate_quil_constants.cljs$core$IFn$_invoke$arity$variadic = (function (_AMPERSAND_form,_AMPERSAND_env,target,opts){
+return cljs.core.sequence.call(null,cljs.core.seq.call(null,cljs.core.concat.call(null,(new cljs.core.List(null,new cljs.core.Symbol(null,"do","do",1686842252,null),null,(1),null)),cljs.core.map.call(null,(function (p1__1166_SHARP_){
+return quil.util.make_quil_constant_map.call(null,target,cljs.core.first.call(null,p1__1166_SHARP_),cljs.core.second.call(null,p1__1166_SHARP_));
+}),cljs.core.partition.call(null,(2),opts)))));
+});
+
+quil.util.generate_quil_constants.cljs$lang$maxFixedArity = (3);
+
+/** @this {Function} */
+quil.util.generate_quil_constants.cljs$lang$applyTo = (function (seq1167){
+var G__1168 = cljs.core.first.call(null,seq1167);
+var seq1167__$1 = cljs.core.next.call(null,seq1167);
+var G__1169 = cljs.core.first.call(null,seq1167__$1);
+var seq1167__$2 = cljs.core.next.call(null,seq1167__$1);
+var G__1170 = cljs.core.first.call(null,seq1167__$2);
+var seq1167__$3 = cljs.core.next.call(null,seq1167__$2);
+var self__4628__auto__ = this;
+return self__4628__auto__.cljs$core$IFn$_invoke$arity$variadic(G__1168,G__1169,G__1170,seq1167__$3);
+});
+
+return null;
+})()
+;
+quil.util.generate_quil_constants.cljs$lang$macro = true;
+
+
+//# sourceMappingURL=util.js.map
diff --git a/src/http/static/viz/2/quil/util.js.map b/src/http/static/viz/2/quil/util.js.map
new file mode 100644
index 0000000..b78bac5
--- /dev/null
+++ b/src/http/static/viz/2/quil/util.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/util.js","sources":["util.cljc"],"lineCount":168,"mappings":";AAAA;;;AAIA;;;kBAAA,lBAAMA;AAAN,AAAA;;AAsBA;;;;iCAAA,jCAAMC,0EAGH,IAAI;AAHP,AAIE,oBACE,AAACC,wBAAIC,SAASC;AAAgB,OAACF,wBAAIC,SAASC;;AAD9C,oBAEE,yBAAA,zBAACC,wEAAOD,MAAK,AAACE,yBAAKH;AAAWC;;AAFhC,AAIgC,MAAO,KAAAG,MAEC,CAAA,8EAAA,LAAkCH,uEAA0B,AAACI,wBAAI,AAACC,yBAAK,AAACC,yBAAKP;;;;;AAEvH;;;;;;kCAAA,lCAAOQ,4EAKJ;AALH,AAME,IAAA,mBAAI,AAACE,yBAAK,AAACJ,yBAAK,wBAAA,WAAA,nCAACK;AAAD,AAAM,OAAAC;GAAY,AAACL,yBAAKM;AAAxC,AAAA,oBAAAJ;AAAAA;;AAAA;;;AAGF,AAAA;;;;;;wBAAA,gCAAA,xDAAOM;AAAP,AAAA,IAAA,UAAA,AAAA;AAAA,AAAA,QAAAD;KAAA;AAAA,OAAAC,oDAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,oDAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,oDAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAX,MAAA,CAAA,8DAAA,AAAA;;;;;AAAA,AAAA,sDAAA,tDAAOW,iEAKH;AALJ,AAKS,uCAAA,OAAA,vCAACA,mCAAeC;;;AALzB,AAAA,sDAAA,tDAAOD,iEAMH,IAAI;AANR,AAMa,uCAAA,hCAACA,mCAAeC,IAAIC;;;AANjC,AAAA,sDAAA,tDAAOF,iEAOH,EAAE,IAAI;AAPV,AAQK,GAAI,OAAA,NAAGC;AACL,OAACD,gCAAY,6CAAKG,+CAAED,eAAK,OAAA,NAAKD,WAAKC;;AACnCC;;;;AAVP,AAAA,gDAAA,hDAAOH;;AAAP,AAYA,kCAAA,lCAAMI,4EACH;AADH,AAEE,IAAM,cAAY,AAACX,0CAAsBY;AAAzC,AACE,OAACC,0BACA,AAACV,wBAAI;kBAAA;AAAA,AAAA,IAAA,YAAAW;QAAA,AAAAC,wBAAAC,UAAA,IAAA,1CAAM;QAAN,AAAAD,wBAAAC,UAAA,IAAA,1CAAQ;AAAR,AACE,IAAM,MAAI,AAASC;IACb,OAAK,CAAGC,cAAYV;IACpB,MAAI,AAACD,gCAAYY;AAFvB,AAGE,yCAAA,lCAACC,4BAAQH,EAAER,SAASY;;CACxBT;;AAEV,mCAAA,nCAAMU;AAAN,AAAA;;AAUA,8BAAA,9BAAMC,oEAAmB;AAAzB,AACE,qHAAA,IAAA,lHAACC,iCACA,AAACC,oCAAgB,AAACC,yBAAKC;;AAG1B,uCAAA,vCAAMC,sFAA4B;AAAlC,AACE,gCAAA,zBAACC,4DACK,wBAAA,WAAA,nCAAC1B;AAAD,AACE,YAAA2B,2BAAA,KAAA,EAAA,IAAA,AAAAA,sCAAA,CAAAC,0KAAA,1JAAU,AAACC,2BAAO,CAAA,0DAAmB,sCAAAD,tCAACR;GACvCU;;AAET,wCAAA,xCAAMC,wFAA6B;AAAnC,AACE,gCAAA,zBAACL,4DACK,wBAAA,WAAA,nCAAC1B;AAAD,AACE,YAAA2B,2BAAA,KAAA,EAAA,IAAA,AAAAA,sCAAA,CAAAK,gBAAA,AAAAC,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,KAAAC,eAAA,KAAA,AAAA,uEAAA,KAAA,IAAA,OAAA,KAAAA,eAAA,KAAA,AAAA,kHAAA,KAAA,IAAA,OAAA,KAAAA,eAAA,4DAAA,KAAA,IAAA,WAAA,3EAAqD,sCAAAJ,tCAACZ;GACvDU;;AAET,mCAAA,nCAAMO,8EAAwB,OAAO,eAAe;AAApD,AAAA,OAAAJ,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,KAAAC,eAAA,KAAA,AAAA,sDAAA,KAAA,IAAA,OAAA,KAAAA,eAAA,oBAAA,KAAA,IAAA,OAAA,KAAAA,eAAA,kNAAA,KAAA,IAAA,9QAEME,wDACA,EAAI,gCAAA,hCAACC,yBAAEC,4DACL,AAACf,+CAA2BgB,WAC5B,AAACV,gDAA4BU;;AAErC,IAAA,yBAAA;AAAA,oCAAA,4CAAA,hFAAUK;AAAV,AAAA,IAAA,qBAAA;AAAA,AAAA,IAAA,yBAAA,AAAA;AAAA,AAAA,IAAA,uBAAA;;AAAA,AAAA,GAAA,CAAAJ,uBAAAC;AAAA,AAAA,AAAAC,wBAAA,CAAA,UAAAF;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA,uBAAA,EAAA,CAAA,MAAA,AAAAE,4BAAA,AAAA,KAAAC,qBAAA,AAAAD,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAE,uEAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAAC;;;AAAA,AAAA,AAAA,AAAAD,yEAAA,WAAA,gBAAA,eAAmC,OAAS;AAA5C,AAAA,OAAAb,6BAAA,AAAAC,wBAAA,AAAAC,2BAAA,KAAAC,eAAA,KAAA,AAAA,qDAAA,KAAA,IAAA,OAEO,wBAAA,WAAA,nCAACpC;AAAD,AACE,OAACqC,2CAAuBG,OAAO,0BAAAgB,1BAACR,2CAAS,2BAAAQ,3BAACC;GAC3C,8BAAA,9BAACC,kCAAYC;;;AAJrB,AAAA,AAAAb,4DAAA;;AAAA;AAAA,AAAA,AAAAA,sDAAA,WAAA;AAAA,AAAA,IAAA,UAAA,AAAAE,0BAAAC;IAAA,cAAA,AAAAC,yBAAAD;IAAA,UAAA,AAAAD,0BAAAC;IAAA,cAAA,AAAAC,yBAAAD;IAAA,UAAA,AAAAD,0BAAAC;IAAA,cAAA,AAAAC,yBAAAD;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAAE,wDAAAC,QAAAC,QAAAC,QAAAL;;;AAAA;;;AAAA,AAAA,AAAA,oDAAA,pDAAUH;;AAAVS","names":["quil.util\/no-fn","quil.util\/resolve-constant-key","cljs.core\/get","mappings","key","cljs.core\/some","cljs.core\/vals","js\/Error","cljs.core\/vec","cljs.core\/sort","cljs.core\/keys","quil.util\/length-of-longest-key","or__4047__auto__","cljs.core\/last","cljs.core\/map","p1__1156#","m","G__1158","quil.util\/gen-padding","len","pad","s","quil.util\/print-definition-list","definitions","cljs.core\/dorun","p__1160","cljs.core\/nth","vec__1161","k","longest-key","diff","cljs.core\/println","v","quil.util\/clj-compilation?","quil.util\/prepare-quil-name","clojure.string\/replace","clojure.string\/upper-case","cljs.core\/name","const-keyword","quil.util\/prepare-quil-clj-constants","cljs.core\/into","cljs.core\/PersistentVector","p1__1164#","cljs.core\/symbol","constants","quil.util\/prepare-quil-cljs-constants","p1__1165#","cljs.core\/sequence","cljs.core\/seq","cljs.core\/concat","cljs.core\/List","quil.util\/make-quil-constant-map","const-map-name","cljs.core\/=","target","const-map","i__4642__auto__","len__4641__auto__","args__4647__auto__","cljs.core\/IndexedSeq","quil.util\/generate-quil-constants","argseq__4648__auto__","cljs.core\/first","seq1167","cljs.core\/next","self__4628__auto__","G__1168","G__1169","G__1170","ret__4684__auto__","p1__1166#","cljs.core\/second","cljs.core\/partition","opts"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/core.cljs b/src/http/static/viz/2/viz/core.cljs
new file mode 100644
index 0000000..caeb386
--- /dev/null
+++ b/src/http/static/viz/2/viz/core.cljs
@@ -0,0 +1,264 @@
+(ns viz.core
+ (:require [quil.core :as q]
+ [quil.middleware :as m]
+ [viz.forest :as forest]
+ [viz.grid :as grid]
+ [viz.ghost :as ghost]
+ [viz.dial :as dial]
+ [goog.string :as gstring]
+ [goog.string.format]
+ ))
+
+(defn- debug [& args]
+ (.log js/console (clojure.string/join " " (map str args))))
+(defn- observe [v] (debug v) v)
+
+(defn- positive [n] (if (> 0 n) (- n) n))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; initialization
+
+(defn- window-partial [k]
+ (int (aget js/document "documentElement" k)))
+
+(def window-size
+ (let [w (int (min 1024 (window-partial "clientWidth")))]
+ [w (int (min (* w 0.75) (window-partial "clientHeight")))]))
+
+(def window-half-size (apply vector (map #(float (/ %1 2)) window-size)))
+
+(defn- set-grid-size [state]
+ (let [h (int (* (window-size 1)
+ (float (/ (:grid-width state) (window-size 0)))))]
+ (assoc state :grid-size [(:grid-width state) h])))
+
+(defn- add-ghost [state ghost-def]
+ (let [[forest id] (forest/add-node (:forest state) (:start-pos ghost-def))
+ ghost (-> (ghost/new-ghost)
+ (ghost/add-active-node id)
+ (assoc :ghost-def ghost-def))
+ ]
+ (assoc state
+ :forest forest
+ :ghosts (cons ghost (:ghosts state)))))
+
+(defn- new-state []
+ (-> {:frame-rate 15
+ :color-cycle-period 8
+ :tail-length 7
+ :frame 0
+ :grid-width 45 ; from the center
+ :forest (forest/new-forest grid/isometric)
+ }
+ (set-grid-size)
+ (add-ghost {:start-pos [-10 -10]
+ :color-fn (fn [state]
+ (let [frames-per-color-cycle
+ (* (:color-cycle-period state) (:frame-rate state))]
+ (q/color
+ (/ (mod (:frame state) frames-per-color-cycle)
+ frames-per-color-cycle)
+ 1 1)))
+ })
+ ))
+
+(defn setup []
+ (q/color-mode :hsb 1 1 1)
+ (new-state))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; scaling and unit conversion related
+
+(defn- curr-second [state]
+ (float (/ (:frame state) (:frame-rate state))))
+
+(defn- scale [grid-size xy]
+ (map-indexed #(* %2 (float (/ (window-half-size %1)
+ (grid-size %1)))) xy))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; poss-fn
+
+(def bounds-buffer 1)
+
+(defn- in-bounds? [grid-size pos]
+ (let [[w h] (apply vector (map #(- % bounds-buffer) grid-size))]
+ (every?
+ #(and (>= (% 1) (- (% 0))) (<= (% 1) (% 0)))
+ (map vector [w h] pos))))
+
+(defn- dist-from-sqr [pos1 pos2]
+ (reduce + (map #(* % %) (map - pos1 pos2))))
+
+(defn- dist-from [pos1 pos2]
+ (q/sqrt (dist-from-sqr pos1 pos2)))
+
+(defn take-adj-poss [grid-width pos adj-poss]
+ (let [dist-from-center (dist-from [0 0] pos)
+ width grid-width
+ dist-ratio (/ (- width dist-from-center) width)
+ ]
+ (take
+ (int (* (q/map-range (rand) 0 1 0.75 1)
+ dist-ratio
+ (count adj-poss)))
+ adj-poss)))
+
+(defn- mk-poss-fn [state]
+ (let [grid-size (:grid-size state)]
+ (fn [pos adj-poss]
+ (->> adj-poss
+ (filter #(in-bounds? grid-size %))
+ (sort-by #(dist-from-sqr % [0 0]))
+ (take-adj-poss (grid-size 0) pos)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; update
+
+(defn- update-ghost-forest [state update-fn]
+ (let [[ghosts forest]
+ (reduce (fn [[ghosts forest] ghost]
+ (let [[ghost forest] (update-fn ghost forest)]
+ [(cons ghost ghosts) forest]))
+ [nil (:forest state)]
+ (:ghosts state))]
+ (assoc state :ghosts (reverse ghosts) :forest forest)))
+
+(defn- ghost-incr [state poss-fn]
+ (update-ghost-forest state #(ghost/incr %1 %2 poss-fn)))
+
+(defn rm-nodes [state node-ids]
+ (update-ghost-forest state (fn [ghost forest]
+ [(reduce ghost/rm-active-node ghost node-ids)
+ (reduce forest/remove-node forest node-ids)])))
+
+(defn- maybe-remove-roots [state]
+ (if (>= (:tail-length state) (:frame state))
+ state
+ (rm-nodes state (map :id (forest/roots (:forest state))))))
+
+(defn- ghost-set-color [state]
+ (update-ghost-forest state (fn [ghost forest]
+ (let [color ((get-in ghost [:ghost-def :color-fn]) state)]
+ [(assoc ghost :color color) forest]))))
+
+(defn update-state [state]
+ (let [poss-fn (mk-poss-fn state)]
+ (-> state
+ (ghost-set-color)
+ (ghost-incr poss-fn)
+ (maybe-remove-roots)
+ (update-in [:frame] inc)
+ )))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; draw
+
+(defn- draw-ellipse [pos size scale-fn] ; size is [w h]
+ (let [scaled-pos (scale-fn pos)
+ scaled-size (map int (scale-fn size))]
+ (apply q/ellipse (concat scaled-pos scaled-size))))
+
+(defn- in-line? [& nodes]
+ (apply = (map #(apply map - %1)
+ (partition 2 1 (map :pos nodes)))))
+
+(defn- draw-node [node active? scale-fn]
+ (let [pos (:pos node)
+ stroke (get-in node [:meta :color])
+ fill (if active? stroke 0xFFFFFFFF)
+ ]
+ (q/stroke stroke)
+ (q/fill fill)
+ (draw-ellipse pos [0.30 0.30] scale-fn)))
+
+(defn- draw-line [node parent scale-fn]
+ (let [node-color (get-in node [:meta :color])
+ parent-color (get-in node [:meta :color])
+ color (q/lerp-color node-color parent-color 0.5)
+ ]
+ (q/stroke color)
+ (q/stroke-weight 1)
+ (apply q/line (map scale-fn (map :pos (list parent node))))))
+
+(defn- draw-lines [forest parent node scale-fn]
+ "Draws the lines of all children leading from the node, recursively"
+ (let [children (map #(forest/get-node forest %) (:child-ids node))]
+
+ (if-not parent
+ (doseq [child children] (draw-lines forest node child scale-fn))
+ (let [in-line-child (some #(if (in-line? parent node %) %) children)
+ ]
+ (doseq [child children]
+ (if (and in-line-child (= in-line-child child))
+ (draw-lines forest parent child scale-fn)
+ (draw-lines forest node child scale-fn)))
+ (when-not in-line-child
+ (draw-line node parent scale-fn))
+ ))
+
+ ; we also take the opportunity to draw the leaves
+ (when (empty? children)
+ (draw-node node false scale-fn))
+ ))
+
+(defn draw-dial [state dial posL posR]
+ (let [dial-norm (q/norm (:val dial) (:min dial) (:max dial))
+ dial-pos (map #(q/lerp %1 %2 dial-norm) posL posR)]
+ (q/stroke 0xFF000000)
+ (q/stroke-weight 1)
+ (q/fill 0xFF000000)
+ (apply q/line (concat posL posR))
+ (apply q/ellipse (concat dial-pos [5 5]))
+ ))
+
+(defn draw-state [state]
+ ; Clear the sketch by filling it with light-grey color.
+ (q/background 0xFFFFFFFF)
+ (q/with-translation window-half-size
+
+ (let [grid-size (:grid-size state)
+ scale-fn #(scale grid-size %)
+ ghost (:ghost state)
+ forest (:forest state)
+ roots (forest/roots forest)
+ ]
+
+ (doseq [root roots]
+ (draw-lines forest nil root scale-fn))
+
+ (doseq [ghost (:ghosts state)]
+ (doseq [active-node (map #(forest/get-node forest %)
+ (:active-node-ids ghost))]
+ (draw-node active-node true scale-fn)))
+
+ ))
+
+ ;(draw-dial state (:dial state) [30 30] [100 30])
+
+ ;(q/text (clojure.string/join
+ ; "\n"
+ ; (list
+ ; (gstring/format "frame:%d" (:frame state))
+ ; (gstring/format "second:%f" (curr-second state))
+ ; (gstring/format "spawn-chance:%d" (spawn-chance state))))
+ ; 30 30)
+ )
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; def
+
+(q/defsketch viz
+ :title ""
+ :host "viz"
+ :size window-size
+ ; setup function called only once, during sketch initialization.
+ :setup setup
+ ; update-state is called on each iteration before draw-state.
+ :update update-state
+ :draw draw-state
+ :features [:keep-on-top]
+ ; This sketch uses functional-mode middleware.
+ ; Check quil wiki for more info about middlewares and particularly
+ ; fun-mode.
+ :middleware [m/fun-mode])
diff --git a/src/http/static/viz/2/viz/core.cljs.cache.json b/src/http/static/viz/2/viz/core.cljs.cache.json
new file mode 100644
index 0000000..ade1293
--- /dev/null
+++ b/src/http/static/viz/2/viz/core.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:externs",["^ ","~$console",["^ ","~$log",["^ "]],"~$document",["^ "]],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$viz.core","~:imports",null,"~:requires",["^ ","~$gstring","~$goog.string","^>","^>","~$q","~$quil.core","~$viz.forest","^@","~$grid","~$viz.grid","~$m","~$quil.middleware","^?","^?","^C","^C","~$goog.string.format","^D","~$viz.ghost","^E","~$forest","^@","^B","^B","~$ghost","^E","~$viz.dial","^H","~$dial","^H"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$rm-nodes",["^ ","~:protocol-inline",null,"~:meta",["^ ","~:file","/home/mediocregopher/src/viz/src/viz/core.cljs","~:line",130,"~:column",7,"~:end-line",130,"~:end-column",15,"~:arglists",["~#list",["~$quote",["^V",[["~$state","~$node-ids"]]]]]],"^9","~$viz.core/rm-nodes","^P","src/viz/core.cljs","^T",15,"~:method-params",["^V",[["^X","^Y"]]],"~:protocol-impl",null,"~:arglists-meta",["^V",[null,null]],"^R",1,"~:variadic?",false,"^Q",130,"~:ret-tag","~$any","^S",130,"~:max-fixed-arity",2,"~:fn-var",true,"^U",["^V",["^W",["^V",[["^X","^Y"]]]]]],"~$maybe-remove-roots",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",135,"^R",8,"^S",135,"^T",26,"~:private",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"^18",true,"^9","~$viz.core/maybe-remove-roots","^P","src/viz/core.cljs","^T",26,"^[",["^V",[["^X"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",135,"^13",["^8",[null,"^14"]],"^S",135,"^15",1,"^16",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"~$draw-node",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",166,"^R",8,"^S",166,"^T",17,"^18",true,"^U",["^V",["^W",["^V",[["~$node","~$active?","~$scale-fn"]]]]]],"^18",true,"^9","~$viz.core/draw-node","^P","src/viz/core.cljs","^T",17,"^[",["^V",[["^1;","^1<","^1="]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",166,"^13","^14","^S",166,"^15",3,"^16",true,"^U",["^V",["^W",["^V",[["^1;","^1<","^1="]]]]]],"~$draw-state",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",215,"^R",7,"^S",215,"^T",17,"^U",["^V",["^W",["^V",[["^X"]]]]]],"^9","~$viz.core/draw-state","^P","src/viz/core.cljs","^T",17,"^[",["^V",[["^X"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",215,"^S",215,"^15",1,"^16",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"~$viz",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",251,"^R",14,"^S",251,"^T",17,"~:export",true,"^U",["^V",["^W",["^V",[[]]]]]],"^9","~$viz.core/viz","^P","src/viz/core.cljs","^T",17,"^[",["^V",[[]]],"^10",null,"^1B",true,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",251,"^13","^14","^S",251,"^15",0,"^16",true,"^U",["^V",["^W",["^V",[[]]]]]],"~$update-state",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",145,"^R",7,"^S",145,"^T",19,"^U",["^V",["^W",["^V",[["^X"]]]]]],"^9","~$viz.core/update-state","^P","src/viz/core.cljs","^T",19,"^[",["^V",[["^X"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",145,"^13","^14","^S",145,"^15",1,"^16",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"~$draw-ellipse",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",157,"^R",8,"^S",157,"^T",20,"^18",true,"^U",["^V",["^W",["^V",[["~$pos","~$size","^1="]]]]]],"^18",true,"^9","~$viz.core/draw-ellipse","^P","src/viz/core.cljs","^T",20,"^[",["^V",[["^1G","^1H","^1="]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",157,"^13","^14","^S",157,"^15",3,"^16",true,"^U",["^V",["^W",["^V",[["^1G","^1H","^1="]]]]]],"~$window-partial",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",21,"^R",8,"^S",21,"^T",22,"^18",true,"^U",["^V",["^W",["^V",[["~$k"]]]]]],"^18",true,"^9","~$viz.core/window-partial","^P","src/viz/core.cljs","^T",22,"^[",["^V",[["~$k"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",21,"^13","~$number","^S",21,"^15",1,"^16",true,"^U",["^V",["^W",["^V",[["~$k"]]]]]],"~$mk-poss-fn",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",107,"^R",8,"^S",107,"^T",18,"^18",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"^18",true,"^9","~$viz.core/mk-poss-fn","^P","src/viz/core.cljs","^T",18,"^[",["^V",[["^X"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",107,"^13","~$function","^S",107,"^15",1,"^16",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"~$update-ghost-forest",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",118,"^R",8,"^S",118,"^T",27,"^18",true,"^U",["^V",["^W",["^V",[["^X","~$update-fn"]]]]]],"^18",true,"^9","~$viz.core/update-ghost-forest","^P","src/viz/core.cljs","^T",27,"^[",["^V",[["^X","^1Q"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",118,"^13","^14","^S",118,"^15",2,"^16",true,"^U",["^V",["^W",["^V",[["^X","^1Q"]]]]]],"~$new-state",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",45,"^R",8,"^S",45,"^T",17,"^18",true,"^U",["^V",["^W",["^V",[[]]]]]],"^18",true,"^9","~$viz.core/new-state","^P","src/viz/core.cljs","^T",17,"^[",["^V",[[]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",45,"^13","^14","^S",45,"^15",0,"^16",true,"^U",["^V",["^W",["^V",[[]]]]]],"~$dist-from",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",93,"^R",8,"^S",93,"^T",17,"^18",true,"^U",["^V",["^W",["^V",[["~$pos1","~$pos2"]]]]]],"^18",true,"^9","~$viz.core/dist-from","^P","src/viz/core.cljs","^T",17,"^[",["^V",[["^1V","^1W"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",93,"^13","^14","^S",93,"^15",2,"^16",true,"^U",["^V",["^W",["^V",[["^1V","^1W"]]]]]],"~$observe",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",14,"^R",8,"^S",14,"^T",15,"^18",true,"^U",["^V",["^W",["^V",[["~$v"]]]]]],"^18",true,"^9","~$viz.core/observe","^P","src/viz/core.cljs","^T",15,"^[",["^V",[["~$v"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",14,"^S",14,"^15",1,"^16",true,"^U",["^V",["^W",["^V",[["~$v"]]]]]],"~$window-half-size",["^ ","^9","~$viz.core/window-half-size","^P","src/viz/core.cljs","^Q",28,"^R",1,"^S",28,"^T",22,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",28,"^R",6,"^S",28,"^T",22],"~:tag","^14"],"~$window-size",["^ ","^9","~$viz.core/window-size","^P","src/viz/core.cljs","^Q",24,"^R",1,"^S",24,"^T",17,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",24,"^R",6,"^S",24,"^T",17],"^21","~$cljs.core/IVector"],"~$scale",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",75,"^R",8,"^S",75,"^T",13,"^18",true,"^U",["^V",["^W",["^V",[["~$grid-size","~$xy"]]]]]],"^18",true,"^9","~$viz.core/scale","^P","src/viz/core.cljs","^T",13,"^[",["^V",[["^26","^27"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",75,"^13","^14","^S",75,"^15",2,"^16",true,"^U",["^V",["^W",["^V",[["^26","^27"]]]]]],"~$in-line?",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",162,"^R",8,"^S",162,"^T",16,"^18",true,"^U",["^V",["^W",["^V",[["~$&","~$nodes"]]]]],"~:top-fn",["^ ","^12",true,"^15",0,"^[",[["^V",["^2:"]]],"^U",["^V",[["~$&","^2:"]]],"^11",["^V",[null]]]],"^18",true,"^9","~$viz.core/in-line?","^P","src/viz/core.cljs","^T",16,"^2;",["^ ","^12",true,"^15",0,"^[",[["^V",["^2:"]]],"^U",["^V",[["~$&","^2:"]]],"^11",["^V",[null]]],"^[",[["^V",["^2:"]]],"^10",null,"^11",["^V",[null]],"^R",1,"^12",true,"^Q",162,"^13","^14","^S",162,"^15",0,"^16",true,"^U",["^V",[["~$&","^2:"]]]],"~$take-adj-poss",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",96,"^R",7,"^S",96,"^T",20,"^U",["^V",["^W",["^V",[["~$grid-width","^1G","~$adj-poss"]]]]]],"^9","~$viz.core/take-adj-poss","^P","src/viz/core.cljs","^T",20,"^[",["^V",[["^2>","^1G","^2?"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",96,"^13","^14","^S",96,"^15",3,"^16",true,"^U",["^V",["^W",["^V",[["^2>","^1G","^2?"]]]]]],"~$positive",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",16,"^R",8,"^S",16,"^T",16,"^18",true,"^U",["^V",["^W",["^V",[["~$n"]]]]]],"^18",true,"^9","~$viz.core/positive","^P","src/viz/core.cljs","^T",16,"^[",["^V",[["~$n"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",16,"^13",["^8",[null,"^1L"]],"^S",16,"^15",1,"^16",true,"^U",["^V",["^W",["^V",[["~$n"]]]]]],"~$debug",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",12,"^R",8,"^S",12,"^T",13,"^18",true,"^U",["^V",["^W",["^V",[["~$&","~$args"]]]]],"^2;",["^ ","^12",true,"^15",0,"^[",[["^V",["^2D"]]],"^U",["^V",[["~$&","^2D"]]],"^11",["^V",[null]]]],"^18",true,"^9","~$viz.core/debug","^P","src/viz/core.cljs","^T",13,"^2;",["^ ","^12",true,"^15",0,"^[",[["^V",["^2D"]]],"^U",["^V",[["~$&","^2D"]]],"^11",["^V",[null]]],"^[",[["^V",["^2D"]]],"^10",null,"^11",["^V",[null]],"^R",1,"^12",true,"^Q",12,"^13","^14","^S",12,"^15",0,"^16",true,"^U",["^V",[["~$&","^2D"]]]],"~$add-ghost",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",35,"^R",8,"^S",35,"^T",17,"^18",true,"^U",["^V",["^W",["^V",[["^X","~$ghost-def"]]]]]],"^18",true,"^9","~$viz.core/add-ghost","^P","src/viz/core.cljs","^T",17,"^[",["^V",[["^X","^2G"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",35,"^13","^14","^S",35,"^15",2,"^16",true,"^U",["^V",["^W",["^V",[["^X","^2G"]]]]]],"~$dist-from-sqr",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",90,"^R",8,"^S",90,"^T",21,"^18",true,"^U",["^V",["^W",["^V",[["^1V","^1W"]]]]]],"^18",true,"^9","~$viz.core/dist-from-sqr","^P","src/viz/core.cljs","^T",21,"^[",["^V",[["^1V","^1W"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",90,"^13","^14","^S",90,"^15",2,"^16",true,"^U",["^V",["^W",["^V",[["^1V","^1W"]]]]]],"~$setup",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",65,"^R",7,"^S",65,"^T",12,"^U",["^V",["^W",["^V",[[]]]]]],"^9","~$viz.core/setup","^P","src/viz/core.cljs","^T",12,"^[",["^V",[[]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",65,"^13","^14","^S",65,"^15",0,"^16",true,"^U",["^V",["^W",["^V",[[]]]]]],"~$set-grid-size",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",30,"^R",8,"^S",30,"^T",21,"^18",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"^18",true,"^9","~$viz.core/set-grid-size","^P","src/viz/core.cljs","^T",21,"^[",["^V",[["^X"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",30,"^13","^14","^S",30,"^15",1,"^16",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"~$draw-dial",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",205,"^R",7,"^S",205,"^T",16,"^U",["^V",["^W",["^V",[["^X","^I","~$posL","~$posR"]]]]]],"^9","~$viz.core/draw-dial","^P","src/viz/core.cljs","^T",16,"^[",["^V",[["^X","^I","^2P","^2Q"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",205,"^13","^14","^S",205,"^15",4,"^16",true,"^U",["^V",["^W",["^V",[["^X","^I","^2P","^2Q"]]]]]],"~$in-bounds?",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",84,"^R",8,"^S",84,"^T",18,"^18",true,"^U",["^V",["^W",["^V",[["^26","^1G"]]]]]],"^18",true,"^9","~$viz.core/in-bounds?","^P","src/viz/core.cljs","^T",18,"^[",["^V",[["^26","^1G"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",84,"^13","~$boolean","^S",84,"^15",2,"^16",true,"^U",["^V",["^W",["^V",[["^26","^1G"]]]]]],"~$draw-lines",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",184,"^R",8,"^S",184,"^T",18,"^18",true,"^U",["^V",["^W",["^V",[["^F","~$parent","^1;","^1="]]]]]],"^18",true,"^9","~$viz.core/draw-lines","^P","src/viz/core.cljs","^T",18,"^[",["^V",[["^F","^2W","^1;","^1="]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",184,"^13",["^8",["^14","~$clj-nil"]],"^S",184,"^15",4,"^16",true,"^U",["^V",["^W",["^V",[["^F","^2W","^1;","^1="]]]]]],"~$ghost-incr",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",127,"^R",8,"^S",127,"^T",18,"^18",true,"^U",["^V",["^W",["^V",[["^X","~$poss-fn"]]]]]],"^18",true,"^9","~$viz.core/ghost-incr","^P","src/viz/core.cljs","^T",18,"^[",["^V",[["^X","^2["]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",127,"^13","^14","^S",127,"^15",2,"^16",true,"^U",["^V",["^W",["^V",[["^X","^2["]]]]]],"~$draw-line",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",175,"^R",8,"^S",175,"^T",17,"^18",true,"^U",["^V",["^W",["^V",[["^1;","^2W","^1="]]]]]],"^18",true,"^9","~$viz.core/draw-line","^P","src/viz/core.cljs","^T",17,"^[",["^V",[["^1;","^2W","^1="]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",175,"^13","^14","^S",175,"^15",3,"^16",true,"^U",["^V",["^W",["^V",[["^1;","^2W","^1="]]]]]],"~$ghost-set-color",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",140,"^R",8,"^S",140,"^T",23,"^18",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"^18",true,"^9","~$viz.core/ghost-set-color","^P","src/viz/core.cljs","^T",23,"^[",["^V",[["^X"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",140,"^13","^14","^S",140,"^15",1,"^16",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"~$bounds-buffer",["^ ","^9","~$viz.core/bounds-buffer","^P","src/viz/core.cljs","^Q",82,"^R",1,"^S",82,"^T",19,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",82,"^R",6,"^S",82,"^T",19],"^21","^1L"],"~$curr-second",["^ ","^N",null,"^O",["^ ","^P","/home/mediocregopher/src/viz/src/viz/core.cljs","^Q",72,"^R",8,"^S",72,"^T",19,"^18",true,"^U",["^V",["^W",["^V",[["^X"]]]]]],"^18",true,"^9","~$viz.core/curr-second","^P","src/viz/core.cljs","^T",19,"^[",["^V",[["^X"]]],"^10",null,"^11",["^V",[null,null]],"^R",1,"^12",false,"^Q",72,"^13","^1L","^S",72,"^15",1,"^16",true,"^U",["^V",["^W",["^V",[["^X"]]]]]]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:cljs.analyzer/constants",["^ ","~:seen",["^8",["~:features","~:active-node-ids","~:hsb","~:min","~:grid-width","~:frame-rate","~:color-cycle-period","~:fn","^O","~:frame","~:color","~:ghost-def","~:pos","~:val","~:update","~:size","~:title","~:tail-length","~:setup","~:middleware","~:grid-size","~:host","~:forest","~:max","~:id","~:keep-on-top","~:host-id","~:no-start","~:ghost","~:color-fn","~:draw","~:child-ids","~:ghosts","~:start-pos"]],"~:order",["^3A","^3P","^3R","^41","^3G","^40","^3B","^3C","^3M","^3E","^3Y","^3?","^3T","^3F","^3H","^O","^3[","^3I","^3@","^3S","^3X","^3>","^3Q","^3=","^3U","^3J","^3K","^3L","^3N","^3O","^3Z","^3W","^3D","^3V"]],"~:doc",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/core.js b/src/http/static/viz/2/viz/core.js
new file mode 100644
index 0000000..a14b2fd
--- /dev/null
+++ b/src/http/static/viz/2/viz/core.js
@@ -0,0 +1,753 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('viz.core');
+goog.require('cljs.core');
+goog.require('quil.core');
+goog.require('quil.middleware');
+goog.require('viz.forest');
+goog.require('viz.grid');
+goog.require('viz.ghost');
+goog.require('viz.dial');
+goog.require('goog.string');
+goog.require('goog.string.format');
+viz.core.debug = (function viz$core$debug(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___25578 = arguments.length;
+var i__4642__auto___25579 = (0);
+while(true){
+if((i__4642__auto___25579 < len__4641__auto___25578)){
+args__4647__auto__.push((arguments[i__4642__auto___25579]));
+
+var G__25580 = (i__4642__auto___25579 + (1));
+i__4642__auto___25579 = G__25580;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((0) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((0)),(0),null)):null);
+return viz.core.debug.cljs$core$IFn$_invoke$arity$variadic(argseq__4648__auto__);
+});
+
+viz.core.debug.cljs$core$IFn$_invoke$arity$variadic = (function (args){
+return console.log(clojure.string.join.call(null," ",cljs.core.map.call(null,cljs.core.str,args)));
+});
+
+viz.core.debug.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+viz.core.debug.cljs$lang$applyTo = (function (seq25577){
+var self__4629__auto__ = this;
+return self__4629__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq25577));
+});
+
+viz.core.observe = (function viz$core$observe(v){
+viz.core.debug.call(null,v);
+
+return v;
+});
+viz.core.positive = (function viz$core$positive(n){
+if(((0) > n)){
+return (- n);
+} else {
+return n;
+}
+});
+viz.core.window_partial = (function viz$core$window_partial(k){
+return ((document["documentElement"][k]) | (0));
+});
+viz.core.window_size = (function (){var w = ((function (){var x__4138__auto__ = (1024);
+var y__4139__auto__ = viz.core.window_partial.call(null,"clientWidth");
+return ((x__4138__auto__ < y__4139__auto__) ? x__4138__auto__ : y__4139__auto__);
+})() | (0));
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [w,((function (){var x__4138__auto__ = (w * 0.75);
+var y__4139__auto__ = viz.core.window_partial.call(null,"clientHeight");
+return ((x__4138__auto__ < y__4139__auto__) ? x__4138__auto__ : y__4139__auto__);
+})() | (0))], null);
+})();
+viz.core.window_half_size = cljs.core.apply.call(null,cljs.core.vector,cljs.core.map.call(null,(function (p1__25581_SHARP_){
+return (p1__25581_SHARP_ / (2));
+}),viz.core.window_size));
+viz.core.set_grid_size = (function viz$core$set_grid_size(state){
+var h = ((viz.core.window_size.call(null,(1)) * (new cljs.core.Keyword(null,"grid-width","grid-width",837583106).cljs$core$IFn$_invoke$arity$1(state) / viz.core.window_size.call(null,(0)))) | (0));
+return cljs.core.assoc.call(null,state,new cljs.core.Keyword(null,"grid-size","grid-size",2138480144),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"grid-width","grid-width",837583106).cljs$core$IFn$_invoke$arity$1(state),h], null));
+});
+viz.core.add_ghost = (function viz$core$add_ghost(state,ghost_def){
+var vec__25582 = viz.forest.add_node.call(null,new cljs.core.Keyword(null,"forest","forest",278860306).cljs$core$IFn$_invoke$arity$1(state),new cljs.core.Keyword(null,"start-pos","start-pos",668789086).cljs$core$IFn$_invoke$arity$1(ghost_def));
+var forest = cljs.core.nth.call(null,vec__25582,(0),null);
+var id = cljs.core.nth.call(null,vec__25582,(1),null);
+var ghost = cljs.core.assoc.call(null,viz.ghost.add_active_node.call(null,viz.ghost.new_ghost.call(null),id),new cljs.core.Keyword(null,"ghost-def","ghost-def",1211539367),ghost_def);
+return cljs.core.assoc.call(null,state,new cljs.core.Keyword(null,"forest","forest",278860306),forest,new cljs.core.Keyword(null,"ghosts","ghosts",665819293),cljs.core.cons.call(null,ghost,new cljs.core.Keyword(null,"ghosts","ghosts",665819293).cljs$core$IFn$_invoke$arity$1(state)));
+});
+viz.core.new_state = (function viz$core$new_state(){
+return viz.core.add_ghost.call(null,viz.core.set_grid_size.call(null,new cljs.core.PersistentArrayMap(null, 6, [new cljs.core.Keyword(null,"frame-rate","frame-rate",-994918942),(15),new cljs.core.Keyword(null,"color-cycle-period","color-cycle-period",1656886882),(8),new cljs.core.Keyword(null,"tail-length","tail-length",-2007115089),(7),new cljs.core.Keyword(null,"frame","frame",-1711082588),(0),new cljs.core.Keyword(null,"grid-width","grid-width",837583106),(45),new cljs.core.Keyword(null,"forest","forest",278860306),viz.forest.new_forest.call(null,viz.grid.isometric)], null)),new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"start-pos","start-pos",668789086),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(-10),(-10)], null),new cljs.core.Keyword(null,"color-fn","color-fn",1518098073),(function (state){
+var frames_per_color_cycle = (new cljs.core.Keyword(null,"color-cycle-period","color-cycle-period",1656886882).cljs$core$IFn$_invoke$arity$1(state) * new cljs.core.Keyword(null,"frame-rate","frame-rate",-994918942).cljs$core$IFn$_invoke$arity$1(state));
+return quil.core.color.call(null,(cljs.core.mod.call(null,new cljs.core.Keyword(null,"frame","frame",-1711082588).cljs$core$IFn$_invoke$arity$1(state),frames_per_color_cycle) / frames_per_color_cycle),(1),(1));
+})], null));
+});
+viz.core.setup = (function viz$core$setup(){
+quil.core.color_mode.call(null,new cljs.core.Keyword(null,"hsb","hsb",-753472031),(1),(1),(1));
+
+return viz.core.new_state.call(null);
+});
+viz.core.curr_second = (function viz$core$curr_second(state){
+return (new cljs.core.Keyword(null,"frame","frame",-1711082588).cljs$core$IFn$_invoke$arity$1(state) / new cljs.core.Keyword(null,"frame-rate","frame-rate",-994918942).cljs$core$IFn$_invoke$arity$1(state));
+});
+viz.core.scale = (function viz$core$scale(grid_size,xy){
+return cljs.core.map_indexed.call(null,(function (p1__25586_SHARP_,p2__25585_SHARP_){
+return (p2__25585_SHARP_ * (viz.core.window_half_size.call(null,p1__25586_SHARP_) / grid_size.call(null,p1__25586_SHARP_)));
+}),xy);
+});
+viz.core.bounds_buffer = (1);
+viz.core.in_bounds_QMARK_ = (function viz$core$in_bounds_QMARK_(grid_size,pos){
+var vec__25589 = cljs.core.apply.call(null,cljs.core.vector,cljs.core.map.call(null,(function (p1__25587_SHARP_){
+return (p1__25587_SHARP_ - viz.core.bounds_buffer);
+}),grid_size));
+var w = cljs.core.nth.call(null,vec__25589,(0),null);
+var h = cljs.core.nth.call(null,vec__25589,(1),null);
+return cljs.core.every_QMARK_.call(null,((function (vec__25589,w,h){
+return (function (p1__25588_SHARP_){
+return (((p1__25588_SHARP_.call(null,(1)) >= (- p1__25588_SHARP_.call(null,(0))))) && ((p1__25588_SHARP_.call(null,(1)) <= p1__25588_SHARP_.call(null,(0)))));
+});})(vec__25589,w,h))
+,cljs.core.map.call(null,cljs.core.vector,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [w,h], null),pos));
+});
+viz.core.dist_from_sqr = (function viz$core$dist_from_sqr(pos1,pos2){
+return cljs.core.reduce.call(null,cljs.core._PLUS_,cljs.core.map.call(null,(function (p1__25592_SHARP_){
+return (p1__25592_SHARP_ * p1__25592_SHARP_);
+}),cljs.core.map.call(null,cljs.core._,pos1,pos2)));
+});
+viz.core.dist_from = (function viz$core$dist_from(pos1,pos2){
+return quil.core.sqrt.call(null,viz.core.dist_from_sqr.call(null,pos1,pos2));
+});
+viz.core.take_adj_poss = (function viz$core$take_adj_poss(grid_width,pos,adj_poss){
+var dist_from_center = viz.core.dist_from.call(null,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(0)], null),pos);
+var width = grid_width;
+var dist_ratio = ((width - dist_from_center) / width);
+return cljs.core.take.call(null,(((quil.core.map_range.call(null,cljs.core.rand.call(null),(0),(1),0.75,(1)) * dist_ratio) * cljs.core.count.call(null,adj_poss)) | (0)),adj_poss);
+});
+viz.core.mk_poss_fn = (function viz$core$mk_poss_fn(state){
+var grid_size = new cljs.core.Keyword(null,"grid-size","grid-size",2138480144).cljs$core$IFn$_invoke$arity$1(state);
+return ((function (grid_size){
+return (function (pos,adj_poss){
+return viz.core.take_adj_poss.call(null,grid_size.call(null,(0)),pos,cljs.core.sort_by.call(null,((function (grid_size){
+return (function (p1__25594_SHARP_){
+return viz.core.dist_from_sqr.call(null,p1__25594_SHARP_,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(0)], null));
+});})(grid_size))
+,cljs.core.filter.call(null,((function (grid_size){
+return (function (p1__25593_SHARP_){
+return viz.core.in_bounds_QMARK_.call(null,grid_size,p1__25593_SHARP_);
+});})(grid_size))
+,adj_poss)));
+});
+;})(grid_size))
+});
+viz.core.update_ghost_forest = (function viz$core$update_ghost_forest(state,update_fn){
+var vec__25595 = cljs.core.reduce.call(null,(function (p__25598,ghost){
+var vec__25599 = p__25598;
+var ghosts = cljs.core.nth.call(null,vec__25599,(0),null);
+var forest = cljs.core.nth.call(null,vec__25599,(1),null);
+var vec__25602 = update_fn.call(null,ghost,forest);
+var ghost__$1 = cljs.core.nth.call(null,vec__25602,(0),null);
+var forest__$1 = cljs.core.nth.call(null,vec__25602,(1),null);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.cons.call(null,ghost__$1,ghosts),forest__$1], null);
+}),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [null,new cljs.core.Keyword(null,"forest","forest",278860306).cljs$core$IFn$_invoke$arity$1(state)], null),new cljs.core.Keyword(null,"ghosts","ghosts",665819293).cljs$core$IFn$_invoke$arity$1(state));
+var ghosts = cljs.core.nth.call(null,vec__25595,(0),null);
+var forest = cljs.core.nth.call(null,vec__25595,(1),null);
+return cljs.core.assoc.call(null,state,new cljs.core.Keyword(null,"ghosts","ghosts",665819293),cljs.core.reverse.call(null,ghosts),new cljs.core.Keyword(null,"forest","forest",278860306),forest);
+});
+viz.core.ghost_incr = (function viz$core$ghost_incr(state,poss_fn){
+return viz.core.update_ghost_forest.call(null,state,(function (p1__25605_SHARP_,p2__25606_SHARP_){
+return viz.ghost.incr.call(null,p1__25605_SHARP_,p2__25606_SHARP_,poss_fn);
+}));
+});
+viz.core.rm_nodes = (function viz$core$rm_nodes(state,node_ids){
+return viz.core.update_ghost_forest.call(null,state,(function (ghost,forest){
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.reduce.call(null,viz.ghost.rm_active_node,ghost,node_ids),cljs.core.reduce.call(null,viz.forest.remove_node,forest,node_ids)], null);
+}));
+});
+viz.core.maybe_remove_roots = (function viz$core$maybe_remove_roots(state){
+if((new cljs.core.Keyword(null,"tail-length","tail-length",-2007115089).cljs$core$IFn$_invoke$arity$1(state) >= new cljs.core.Keyword(null,"frame","frame",-1711082588).cljs$core$IFn$_invoke$arity$1(state))){
+return state;
+} else {
+return viz.core.rm_nodes.call(null,state,cljs.core.map.call(null,new cljs.core.Keyword(null,"id","id",-1388402092),viz.forest.roots.call(null,new cljs.core.Keyword(null,"forest","forest",278860306).cljs$core$IFn$_invoke$arity$1(state))));
+}
+});
+viz.core.ghost_set_color = (function viz$core$ghost_set_color(state){
+return viz.core.update_ghost_forest.call(null,state,(function (ghost,forest){
+var color = cljs.core.get_in.call(null,ghost,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"ghost-def","ghost-def",1211539367),new cljs.core.Keyword(null,"color-fn","color-fn",1518098073)], null)).call(null,state);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.assoc.call(null,ghost,new cljs.core.Keyword(null,"color","color",1011675173),color),forest], null);
+}));
+});
+viz.core.update_state = (function viz$core$update_state(state){
+var poss_fn = viz.core.mk_poss_fn.call(null,state);
+return cljs.core.update_in.call(null,viz.core.maybe_remove_roots.call(null,viz.core.ghost_incr.call(null,viz.core.ghost_set_color.call(null,state),poss_fn)),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"frame","frame",-1711082588)], null),cljs.core.inc);
+});
+viz.core.draw_ellipse = (function viz$core$draw_ellipse(pos,size,scale_fn){
+var scaled_pos = scale_fn.call(null,pos);
+var scaled_size = cljs.core.map.call(null,cljs.core.int$,scale_fn.call(null,size));
+return cljs.core.apply.call(null,quil.core.ellipse,cljs.core.concat.call(null,scaled_pos,scaled_size));
+});
+viz.core.in_line_QMARK_ = (function viz$core$in_line_QMARK_(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___25609 = arguments.length;
+var i__4642__auto___25610 = (0);
+while(true){
+if((i__4642__auto___25610 < len__4641__auto___25609)){
+args__4647__auto__.push((arguments[i__4642__auto___25610]));
+
+var G__25611 = (i__4642__auto___25610 + (1));
+i__4642__auto___25610 = G__25611;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((0) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((0)),(0),null)):null);
+return viz.core.in_line_QMARK_.cljs$core$IFn$_invoke$arity$variadic(argseq__4648__auto__);
+});
+
+viz.core.in_line_QMARK_.cljs$core$IFn$_invoke$arity$variadic = (function (nodes){
+return cljs.core.apply.call(null,cljs.core._EQ_,cljs.core.map.call(null,(function (p1__25607_SHARP_){
+return cljs.core.apply.call(null,cljs.core.map,cljs.core._,p1__25607_SHARP_);
+}),cljs.core.partition.call(null,(2),(1),cljs.core.map.call(null,new cljs.core.Keyword(null,"pos","pos",-864607220),nodes))));
+});
+
+viz.core.in_line_QMARK_.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+viz.core.in_line_QMARK_.cljs$lang$applyTo = (function (seq25608){
+var self__4629__auto__ = this;
+return self__4629__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq25608));
+});
+
+viz.core.draw_node = (function viz$core$draw_node(node,active_QMARK_,scale_fn){
+var pos = new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(node);
+var stroke = cljs.core.get_in.call(null,node,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"meta","meta",1499536964),new cljs.core.Keyword(null,"color","color",1011675173)], null));
+var fill = (cljs.core.truth_(active_QMARK_)?stroke:(4294967295));
+quil.core.stroke.call(null,stroke);
+
+quil.core.fill.call(null,fill);
+
+return viz.core.draw_ellipse.call(null,pos,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [0.3,0.3], null),scale_fn);
+});
+viz.core.draw_line = (function viz$core$draw_line(node,parent,scale_fn){
+var node_color = cljs.core.get_in.call(null,node,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"meta","meta",1499536964),new cljs.core.Keyword(null,"color","color",1011675173)], null));
+var parent_color = cljs.core.get_in.call(null,node,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"meta","meta",1499536964),new cljs.core.Keyword(null,"color","color",1011675173)], null));
+var color = quil.core.lerp_color.call(null,node_color,parent_color,0.5);
+quil.core.stroke.call(null,color);
+
+quil.core.stroke_weight.call(null,(1));
+
+return cljs.core.apply.call(null,quil.core.line,cljs.core.map.call(null,scale_fn,cljs.core.map.call(null,new cljs.core.Keyword(null,"pos","pos",-864607220),(new cljs.core.List(null,parent,(new cljs.core.List(null,node,null,(1),null)),(2),null)))));
+});
+viz.core.draw_lines = (function viz$core$draw_lines(forest,parent,node,scale_fn){
+
+var children = cljs.core.map.call(null,(function (p1__25612_SHARP_){
+return viz.forest.get_node.call(null,forest,p1__25612_SHARP_);
+}),new cljs.core.Keyword(null,"child-ids","child-ids",-604525861).cljs$core$IFn$_invoke$arity$1(node));
+if(cljs.core.not.call(null,parent)){
+var seq__25614_25622 = cljs.core.seq.call(null,children);
+var chunk__25615_25623 = null;
+var count__25616_25624 = (0);
+var i__25617_25625 = (0);
+while(true){
+if((i__25617_25625 < count__25616_25624)){
+var child_25626 = cljs.core._nth.call(null,chunk__25615_25623,i__25617_25625);
+viz.core.draw_lines.call(null,forest,node,child_25626,scale_fn);
+
+
+var G__25627 = seq__25614_25622;
+var G__25628 = chunk__25615_25623;
+var G__25629 = count__25616_25624;
+var G__25630 = (i__25617_25625 + (1));
+seq__25614_25622 = G__25627;
+chunk__25615_25623 = G__25628;
+count__25616_25624 = G__25629;
+i__25617_25625 = G__25630;
+continue;
+} else {
+var temp__4657__auto___25631 = cljs.core.seq.call(null,seq__25614_25622);
+if(temp__4657__auto___25631){
+var seq__25614_25632__$1 = temp__4657__auto___25631;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__25614_25632__$1)){
+var c__4461__auto___25633 = cljs.core.chunk_first.call(null,seq__25614_25632__$1);
+var G__25634 = cljs.core.chunk_rest.call(null,seq__25614_25632__$1);
+var G__25635 = c__4461__auto___25633;
+var G__25636 = cljs.core.count.call(null,c__4461__auto___25633);
+var G__25637 = (0);
+seq__25614_25622 = G__25634;
+chunk__25615_25623 = G__25635;
+count__25616_25624 = G__25636;
+i__25617_25625 = G__25637;
+continue;
+} else {
+var child_25638 = cljs.core.first.call(null,seq__25614_25632__$1);
+viz.core.draw_lines.call(null,forest,node,child_25638,scale_fn);
+
+
+var G__25639 = cljs.core.next.call(null,seq__25614_25632__$1);
+var G__25640 = null;
+var G__25641 = (0);
+var G__25642 = (0);
+seq__25614_25622 = G__25639;
+chunk__25615_25623 = G__25640;
+count__25616_25624 = G__25641;
+i__25617_25625 = G__25642;
+continue;
+}
+} else {
+}
+}
+break;
+}
+} else {
+var in_line_child_25643 = cljs.core.some.call(null,((function (children){
+return (function (p1__25613_SHARP_){
+if(cljs.core.truth_(viz.core.in_line_QMARK_.call(null,parent,node,p1__25613_SHARP_))){
+return p1__25613_SHARP_;
+} else {
+return null;
+}
+});})(children))
+,children);
+var seq__25618_25644 = cljs.core.seq.call(null,children);
+var chunk__25619_25645 = null;
+var count__25620_25646 = (0);
+var i__25621_25647 = (0);
+while(true){
+if((i__25621_25647 < count__25620_25646)){
+var child_25648 = cljs.core._nth.call(null,chunk__25619_25645,i__25621_25647);
+if(cljs.core.truth_((function (){var and__4036__auto__ = in_line_child_25643;
+if(cljs.core.truth_(and__4036__auto__)){
+return cljs.core._EQ_.call(null,in_line_child_25643,child_25648);
+} else {
+return and__4036__auto__;
+}
+})())){
+viz.core.draw_lines.call(null,forest,parent,child_25648,scale_fn);
+} else {
+viz.core.draw_lines.call(null,forest,node,child_25648,scale_fn);
+}
+
+
+var G__25649 = seq__25618_25644;
+var G__25650 = chunk__25619_25645;
+var G__25651 = count__25620_25646;
+var G__25652 = (i__25621_25647 + (1));
+seq__25618_25644 = G__25649;
+chunk__25619_25645 = G__25650;
+count__25620_25646 = G__25651;
+i__25621_25647 = G__25652;
+continue;
+} else {
+var temp__4657__auto___25653 = cljs.core.seq.call(null,seq__25618_25644);
+if(temp__4657__auto___25653){
+var seq__25618_25654__$1 = temp__4657__auto___25653;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__25618_25654__$1)){
+var c__4461__auto___25655 = cljs.core.chunk_first.call(null,seq__25618_25654__$1);
+var G__25656 = cljs.core.chunk_rest.call(null,seq__25618_25654__$1);
+var G__25657 = c__4461__auto___25655;
+var G__25658 = cljs.core.count.call(null,c__4461__auto___25655);
+var G__25659 = (0);
+seq__25618_25644 = G__25656;
+chunk__25619_25645 = G__25657;
+count__25620_25646 = G__25658;
+i__25621_25647 = G__25659;
+continue;
+} else {
+var child_25660 = cljs.core.first.call(null,seq__25618_25654__$1);
+if(cljs.core.truth_((function (){var and__4036__auto__ = in_line_child_25643;
+if(cljs.core.truth_(and__4036__auto__)){
+return cljs.core._EQ_.call(null,in_line_child_25643,child_25660);
+} else {
+return and__4036__auto__;
+}
+})())){
+viz.core.draw_lines.call(null,forest,parent,child_25660,scale_fn);
+} else {
+viz.core.draw_lines.call(null,forest,node,child_25660,scale_fn);
+}
+
+
+var G__25661 = cljs.core.next.call(null,seq__25618_25654__$1);
+var G__25662 = null;
+var G__25663 = (0);
+var G__25664 = (0);
+seq__25618_25644 = G__25661;
+chunk__25619_25645 = G__25662;
+count__25620_25646 = G__25663;
+i__25621_25647 = G__25664;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+if(cljs.core.truth_(in_line_child_25643)){
+} else {
+viz.core.draw_line.call(null,node,parent,scale_fn);
+}
+}
+
+if(cljs.core.empty_QMARK_.call(null,children)){
+return viz.core.draw_node.call(null,node,false,scale_fn);
+} else {
+return null;
+}
+});
+viz.core.draw_dial = (function viz$core$draw_dial(state,dial,posL,posR){
+var dial_norm = quil.core.norm.call(null,new cljs.core.Keyword(null,"val","val",128701612).cljs$core$IFn$_invoke$arity$1(dial),new cljs.core.Keyword(null,"min","min",444991522).cljs$core$IFn$_invoke$arity$1(dial),new cljs.core.Keyword(null,"max","max",61366548).cljs$core$IFn$_invoke$arity$1(dial));
+var dial_pos = cljs.core.map.call(null,((function (dial_norm){
+return (function (p1__25665_SHARP_,p2__25666_SHARP_){
+return quil.core.lerp.call(null,p1__25665_SHARP_,p2__25666_SHARP_,dial_norm);
+});})(dial_norm))
+,posL,posR);
+quil.core.stroke.call(null,(4278190080));
+
+quil.core.stroke_weight.call(null,(1));
+
+quil.core.fill.call(null,(4278190080));
+
+cljs.core.apply.call(null,quil.core.line,cljs.core.concat.call(null,posL,posR));
+
+return cljs.core.apply.call(null,quil.core.ellipse,cljs.core.concat.call(null,dial_pos,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(5),(5)], null)));
+});
+viz.core.draw_state = (function viz$core$draw_state(state){
+quil.core.background.call(null,(4294967295));
+
+var tr__1504__auto__ = viz.core.window_half_size;
+quil.core.push_matrix.call(null);
+
+try{quil.core.translate.call(null,tr__1504__auto__);
+
+var grid_size = new cljs.core.Keyword(null,"grid-size","grid-size",2138480144).cljs$core$IFn$_invoke$arity$1(state);
+var scale_fn = ((function (grid_size,tr__1504__auto__){
+return (function (p1__25667_SHARP_){
+return viz.core.scale.call(null,grid_size,p1__25667_SHARP_);
+});})(grid_size,tr__1504__auto__))
+;
+var ghost = new cljs.core.Keyword(null,"ghost","ghost",-1531157576).cljs$core$IFn$_invoke$arity$1(state);
+var forest = new cljs.core.Keyword(null,"forest","forest",278860306).cljs$core$IFn$_invoke$arity$1(state);
+var roots = viz.forest.roots.call(null,forest);
+var seq__25669_25685 = cljs.core.seq.call(null,roots);
+var chunk__25670_25686 = null;
+var count__25671_25687 = (0);
+var i__25672_25688 = (0);
+while(true){
+if((i__25672_25688 < count__25671_25687)){
+var root_25689 = cljs.core._nth.call(null,chunk__25670_25686,i__25672_25688);
+viz.core.draw_lines.call(null,forest,null,root_25689,scale_fn);
+
+
+var G__25690 = seq__25669_25685;
+var G__25691 = chunk__25670_25686;
+var G__25692 = count__25671_25687;
+var G__25693 = (i__25672_25688 + (1));
+seq__25669_25685 = G__25690;
+chunk__25670_25686 = G__25691;
+count__25671_25687 = G__25692;
+i__25672_25688 = G__25693;
+continue;
+} else {
+var temp__4657__auto___25694 = cljs.core.seq.call(null,seq__25669_25685);
+if(temp__4657__auto___25694){
+var seq__25669_25695__$1 = temp__4657__auto___25694;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__25669_25695__$1)){
+var c__4461__auto___25696 = cljs.core.chunk_first.call(null,seq__25669_25695__$1);
+var G__25697 = cljs.core.chunk_rest.call(null,seq__25669_25695__$1);
+var G__25698 = c__4461__auto___25696;
+var G__25699 = cljs.core.count.call(null,c__4461__auto___25696);
+var G__25700 = (0);
+seq__25669_25685 = G__25697;
+chunk__25670_25686 = G__25698;
+count__25671_25687 = G__25699;
+i__25672_25688 = G__25700;
+continue;
+} else {
+var root_25701 = cljs.core.first.call(null,seq__25669_25695__$1);
+viz.core.draw_lines.call(null,forest,null,root_25701,scale_fn);
+
+
+var G__25702 = cljs.core.next.call(null,seq__25669_25695__$1);
+var G__25703 = null;
+var G__25704 = (0);
+var G__25705 = (0);
+seq__25669_25685 = G__25702;
+chunk__25670_25686 = G__25703;
+count__25671_25687 = G__25704;
+i__25672_25688 = G__25705;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+var seq__25673 = cljs.core.seq.call(null,new cljs.core.Keyword(null,"ghosts","ghosts",665819293).cljs$core$IFn$_invoke$arity$1(state));
+var chunk__25674 = null;
+var count__25675 = (0);
+var i__25676 = (0);
+while(true){
+if((i__25676 < count__25675)){
+var ghost__$1 = cljs.core._nth.call(null,chunk__25674,i__25676);
+var seq__25677_25706 = cljs.core.seq.call(null,cljs.core.map.call(null,((function (seq__25673,chunk__25674,count__25675,i__25676,ghost__$1,grid_size,scale_fn,ghost,forest,roots,tr__1504__auto__){
+return (function (p1__25668_SHARP_){
+return viz.forest.get_node.call(null,forest,p1__25668_SHARP_);
+});})(seq__25673,chunk__25674,count__25675,i__25676,ghost__$1,grid_size,scale_fn,ghost,forest,roots,tr__1504__auto__))
+,new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751).cljs$core$IFn$_invoke$arity$1(ghost__$1)));
+var chunk__25678_25707 = null;
+var count__25679_25708 = (0);
+var i__25680_25709 = (0);
+while(true){
+if((i__25680_25709 < count__25679_25708)){
+var active_node_25710 = cljs.core._nth.call(null,chunk__25678_25707,i__25680_25709);
+viz.core.draw_node.call(null,active_node_25710,true,scale_fn);
+
+
+var G__25711 = seq__25677_25706;
+var G__25712 = chunk__25678_25707;
+var G__25713 = count__25679_25708;
+var G__25714 = (i__25680_25709 + (1));
+seq__25677_25706 = G__25711;
+chunk__25678_25707 = G__25712;
+count__25679_25708 = G__25713;
+i__25680_25709 = G__25714;
+continue;
+} else {
+var temp__4657__auto___25715 = cljs.core.seq.call(null,seq__25677_25706);
+if(temp__4657__auto___25715){
+var seq__25677_25716__$1 = temp__4657__auto___25715;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__25677_25716__$1)){
+var c__4461__auto___25717 = cljs.core.chunk_first.call(null,seq__25677_25716__$1);
+var G__25718 = cljs.core.chunk_rest.call(null,seq__25677_25716__$1);
+var G__25719 = c__4461__auto___25717;
+var G__25720 = cljs.core.count.call(null,c__4461__auto___25717);
+var G__25721 = (0);
+seq__25677_25706 = G__25718;
+chunk__25678_25707 = G__25719;
+count__25679_25708 = G__25720;
+i__25680_25709 = G__25721;
+continue;
+} else {
+var active_node_25722 = cljs.core.first.call(null,seq__25677_25716__$1);
+viz.core.draw_node.call(null,active_node_25722,true,scale_fn);
+
+
+var G__25723 = cljs.core.next.call(null,seq__25677_25716__$1);
+var G__25724 = null;
+var G__25725 = (0);
+var G__25726 = (0);
+seq__25677_25706 = G__25723;
+chunk__25678_25707 = G__25724;
+count__25679_25708 = G__25725;
+i__25680_25709 = G__25726;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+
+var G__25727 = seq__25673;
+var G__25728 = chunk__25674;
+var G__25729 = count__25675;
+var G__25730 = (i__25676 + (1));
+seq__25673 = G__25727;
+chunk__25674 = G__25728;
+count__25675 = G__25729;
+i__25676 = G__25730;
+continue;
+} else {
+var temp__4657__auto__ = cljs.core.seq.call(null,seq__25673);
+if(temp__4657__auto__){
+var seq__25673__$1 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__25673__$1)){
+var c__4461__auto__ = cljs.core.chunk_first.call(null,seq__25673__$1);
+var G__25731 = cljs.core.chunk_rest.call(null,seq__25673__$1);
+var G__25732 = c__4461__auto__;
+var G__25733 = cljs.core.count.call(null,c__4461__auto__);
+var G__25734 = (0);
+seq__25673 = G__25731;
+chunk__25674 = G__25732;
+count__25675 = G__25733;
+i__25676 = G__25734;
+continue;
+} else {
+var ghost__$1 = cljs.core.first.call(null,seq__25673__$1);
+var seq__25681_25735 = cljs.core.seq.call(null,cljs.core.map.call(null,((function (seq__25673,chunk__25674,count__25675,i__25676,ghost__$1,seq__25673__$1,temp__4657__auto__,grid_size,scale_fn,ghost,forest,roots,tr__1504__auto__){
+return (function (p1__25668_SHARP_){
+return viz.forest.get_node.call(null,forest,p1__25668_SHARP_);
+});})(seq__25673,chunk__25674,count__25675,i__25676,ghost__$1,seq__25673__$1,temp__4657__auto__,grid_size,scale_fn,ghost,forest,roots,tr__1504__auto__))
+,new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751).cljs$core$IFn$_invoke$arity$1(ghost__$1)));
+var chunk__25682_25736 = null;
+var count__25683_25737 = (0);
+var i__25684_25738 = (0);
+while(true){
+if((i__25684_25738 < count__25683_25737)){
+var active_node_25739 = cljs.core._nth.call(null,chunk__25682_25736,i__25684_25738);
+viz.core.draw_node.call(null,active_node_25739,true,scale_fn);
+
+
+var G__25740 = seq__25681_25735;
+var G__25741 = chunk__25682_25736;
+var G__25742 = count__25683_25737;
+var G__25743 = (i__25684_25738 + (1));
+seq__25681_25735 = G__25740;
+chunk__25682_25736 = G__25741;
+count__25683_25737 = G__25742;
+i__25684_25738 = G__25743;
+continue;
+} else {
+var temp__4657__auto___25744__$1 = cljs.core.seq.call(null,seq__25681_25735);
+if(temp__4657__auto___25744__$1){
+var seq__25681_25745__$1 = temp__4657__auto___25744__$1;
+if(cljs.core.chunked_seq_QMARK_.call(null,seq__25681_25745__$1)){
+var c__4461__auto___25746 = cljs.core.chunk_first.call(null,seq__25681_25745__$1);
+var G__25747 = cljs.core.chunk_rest.call(null,seq__25681_25745__$1);
+var G__25748 = c__4461__auto___25746;
+var G__25749 = cljs.core.count.call(null,c__4461__auto___25746);
+var G__25750 = (0);
+seq__25681_25735 = G__25747;
+chunk__25682_25736 = G__25748;
+count__25683_25737 = G__25749;
+i__25684_25738 = G__25750;
+continue;
+} else {
+var active_node_25751 = cljs.core.first.call(null,seq__25681_25745__$1);
+viz.core.draw_node.call(null,active_node_25751,true,scale_fn);
+
+
+var G__25752 = cljs.core.next.call(null,seq__25681_25745__$1);
+var G__25753 = null;
+var G__25754 = (0);
+var G__25755 = (0);
+seq__25681_25735 = G__25752;
+chunk__25682_25736 = G__25753;
+count__25683_25737 = G__25754;
+i__25684_25738 = G__25755;
+continue;
+}
+} else {
+}
+}
+break;
+}
+
+
+var G__25756 = cljs.core.next.call(null,seq__25673__$1);
+var G__25757 = null;
+var G__25758 = (0);
+var G__25759 = (0);
+seq__25673 = G__25756;
+chunk__25674 = G__25757;
+count__25675 = G__25758;
+i__25676 = G__25759;
+continue;
+}
+} else {
+return null;
+}
+}
+break;
+}
+}finally {quil.core.pop_matrix.call(null);
+}});
+viz.core.viz = (function viz$core$viz(){
+return quil.sketch.sketch.call(null,new cljs.core.Keyword(null,"host","host",-1558485167),"viz",new cljs.core.Keyword(null,"features","features",-1146962336),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"keep-on-top","keep-on-top",-970284267)], null),new cljs.core.Keyword(null,"update","update",1045576396),((cljs.core.fn_QMARK_.call(null,viz.core.update_state))?(function() {
+var G__25760__delegate = function (args){
+return cljs.core.apply.call(null,viz.core.update_state,args);
+};
+var G__25760 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__25761__i = 0, G__25761__a = new Array(arguments.length - 0);
+while (G__25761__i < G__25761__a.length) {G__25761__a[G__25761__i] = arguments[G__25761__i + 0]; ++G__25761__i;}
+ args = new cljs.core.IndexedSeq(G__25761__a,0,null);
+}
+return G__25760__delegate.call(this,args);};
+G__25760.cljs$lang$maxFixedArity = 0;
+G__25760.cljs$lang$applyTo = (function (arglist__25762){
+var args = cljs.core.seq(arglist__25762);
+return G__25760__delegate(args);
+});
+G__25760.cljs$core$IFn$_invoke$arity$variadic = G__25760__delegate;
+return G__25760;
+})()
+:viz.core.update_state),new cljs.core.Keyword(null,"size","size",1098693007),((cljs.core.fn_QMARK_.call(null,viz.core.window_size))?(function() {
+var G__25763__delegate = function (args){
+return cljs.core.apply.call(null,viz.core.window_size,args);
+};
+var G__25763 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__25764__i = 0, G__25764__a = new Array(arguments.length - 0);
+while (G__25764__i < G__25764__a.length) {G__25764__a[G__25764__i] = arguments[G__25764__i + 0]; ++G__25764__i;}
+ args = new cljs.core.IndexedSeq(G__25764__a,0,null);
+}
+return G__25763__delegate.call(this,args);};
+G__25763.cljs$lang$maxFixedArity = 0;
+G__25763.cljs$lang$applyTo = (function (arglist__25765){
+var args = cljs.core.seq(arglist__25765);
+return G__25763__delegate(args);
+});
+G__25763.cljs$core$IFn$_invoke$arity$variadic = G__25763__delegate;
+return G__25763;
+})()
+:viz.core.window_size),new cljs.core.Keyword(null,"title","title",636505583),"",new cljs.core.Keyword(null,"setup","setup",1987730512),((cljs.core.fn_QMARK_.call(null,viz.core.setup))?(function() {
+var G__25766__delegate = function (args){
+return cljs.core.apply.call(null,viz.core.setup,args);
+};
+var G__25766 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__25767__i = 0, G__25767__a = new Array(arguments.length - 0);
+while (G__25767__i < G__25767__a.length) {G__25767__a[G__25767__i] = arguments[G__25767__i + 0]; ++G__25767__i;}
+ args = new cljs.core.IndexedSeq(G__25767__a,0,null);
+}
+return G__25766__delegate.call(this,args);};
+G__25766.cljs$lang$maxFixedArity = 0;
+G__25766.cljs$lang$applyTo = (function (arglist__25768){
+var args = cljs.core.seq(arglist__25768);
+return G__25766__delegate(args);
+});
+G__25766.cljs$core$IFn$_invoke$arity$variadic = G__25766__delegate;
+return G__25766;
+})()
+:viz.core.setup),new cljs.core.Keyword(null,"middleware","middleware",1462115504),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [quil.middleware.fun_mode], null),new cljs.core.Keyword(null,"draw","draw",1358331674),((cljs.core.fn_QMARK_.call(null,viz.core.draw_state))?(function() {
+var G__25769__delegate = function (args){
+return cljs.core.apply.call(null,viz.core.draw_state,args);
+};
+var G__25769 = function (var_args){
+var args = null;
+if (arguments.length > 0) {
+var G__25770__i = 0, G__25770__a = new Array(arguments.length - 0);
+while (G__25770__i < G__25770__a.length) {G__25770__a[G__25770__i] = arguments[G__25770__i + 0]; ++G__25770__i;}
+ args = new cljs.core.IndexedSeq(G__25770__a,0,null);
+}
+return G__25769__delegate.call(this,args);};
+G__25769.cljs$lang$maxFixedArity = 0;
+G__25769.cljs$lang$applyTo = (function (arglist__25771){
+var args = cljs.core.seq(arglist__25771);
+return G__25769__delegate(args);
+});
+G__25769.cljs$core$IFn$_invoke$arity$variadic = G__25769__delegate;
+return G__25769;
+})()
+:viz.core.draw_state));
+});
+goog.exportSymbol('viz.core.viz', viz.core.viz);
+
+if(cljs.core.truth_(cljs.core.some.call(null,(function (p1__1117__1118__auto__){
+return cljs.core._EQ_.call(null,new cljs.core.Keyword(null,"no-start","no-start",1381488856),p1__1117__1118__auto__);
+}),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"keep-on-top","keep-on-top",-970284267)], null)))){
+} else {
+quil.sketch.add_sketch_to_init_list.call(null,new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"fn","fn",-1175266204),viz.core.viz,new cljs.core.Keyword(null,"host-id","host-id",742376279),"viz"], null));
+}
+
+//# sourceMappingURL=core.js.map
diff --git a/src/http/static/viz/2/viz/core.js.map b/src/http/static/viz/2/viz/core.js.map
new file mode 100644
index 0000000..1bee43b
--- /dev/null
+++ b/src/http/static/viz/2/viz/core.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/viz\/core.js","sources":["core.cljs"],"lineCount":753,"mappings":";AAAA;;;;;;;;;;AAWA,AAAA,iBAAA,yBAAA,1CAAOI;AAAP,AAAA,IAAA,qBAAA;AAAA,AAAA,IAAA,0BAAA,AAAA;AAAA,AAAA,IAAA,wBAAA;;AAAA,AAAA,GAAA,CAAAJ,wBAAAC;AAAA,AAAA,AAAAC,wBAAA,CAAA,UAAAF;;AAAA,eAAA,CAAAA,wBAAA;;;;AAAA;;;;AAAA,IAAA,uBAAA,EAAA,CAAA,MAAA,AAAAE,4BAAA,AAAA,KAAAC,qBAAA,AAAAD,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAE,oDAAAC;;;AAAA,AAAA,AAAA,AAAAD,sDAAA,WAAgB;AAAhB,AACE,OAAMK,YAAW,8BAAA,9BAACC,kCAAwB,AAACC,wBAAIC,cAAIC;;;AADrD,AAAA,AAAAT,yCAAA;;AAAA;AAAA,AAAA,AAAAA,mCAAA,WAAA;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAAE,wDAAA,AAAAC,wBAAAC;;;AAAA,AAEA,mBAAA,nBAAOM,8CAAS;AAAhB,AAAmB,AAACV,yBAAMW;;AAAGA;;AAE7B,oBAAA,pBAAOC,gDAAU;AAAjB,AAAoB,GAAI,CAAA,MAAKC;AAAG,UAAGA;;AAAGA;;;AAKtC,0BAAA,1BAAOC,4DAAgB;AAAvB,AACE,2CAAA,nCAAK,UAAA,TAAMC,4BAA8BC;;AAE3C,AAAKC,uBACH,iBAAM,IAAE,CAAK,iBAAA,kBAAA;IAAA,kBAAU,kCAAA,lCAACH;AAAX,AAAA,SAAAI,kBAAAC,mBAAAD,kBAAAC;OAAL;AAAR,AAAA,0FACGC,EAAE,CAAK,iBAAA,kBAAK,KAAA,JAAGA;IAAR,kBAAgB,kCAAA,lCAACN;AAAjB,AAAA,SAAAI,kBAAAC,mBAAAD,kBAAAC;OAAL;;AAEP,AAAKE,4BAAiB,AAACC,0BAAMC,iBAAO,wBAAA,WAAA,nCAAChB;AAAD,AAAa,QAAAiB,mBAAA;GAAUP;AAE3D,yBAAA,zBAAOQ,0DAAe;AAAtB,AACE,IAAM,IAAE,wLAAA,vLAAK,CAAG,+BAAA,\/BAACR,sCACM,CAAG,AAAA,8FAAaS,SAAO,+BAAA,\/BAACT;AAD\/C,AAEE,uCAAA,+DAAA,\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","names":["i__4642__auto__","len__4641__auto__","args__4647__auto__","cljs.core\/IndexedSeq","viz.core\/debug","argseq__4648__auto__","self__4629__auto__","cljs.core\/seq","seq25577","js\/console","clojure.string\/join","cljs.core\/map","cljs.core\/str","args","viz.core\/observe","v","viz.core\/positive","n","viz.core\/window-partial","js\/document","k","viz.core\/window-size","x__4138__auto__","y__4139__auto__","w","viz.core\/window-half-size","cljs.core\/apply","cljs.core\/vector","p1__25581#","viz.core\/set-grid-size","state","cljs.core\/assoc","h","viz.core\/add-ghost","cljs.core\/nth","vec__25582","viz.forest\/add-node","ghost-def","viz.ghost\/new-ghost","viz.ghost\/add-active-node","id","forest","cljs.core\/cons","ghost","viz.core\/new-state","viz.forest\/new-forest","viz.grid\/isometric","quil.core\/color","cljs.core\/mod","frames-per-color-cycle","viz.core\/setup","quil.core\/color-mode","viz.core\/curr-second","viz.core\/scale","cljs.core\/map-indexed","p2__25585#","p1__25586#","grid-size","xy","viz.core\/bounds-buffer","viz.core\/in-bounds?","vec__25589","p1__25587#","cljs.core\/every?","p1__25588#","pos","viz.core\/dist-from-sqr","cljs.core\/reduce","cljs.core\/+","p1__25592#","cljs.core\/-","pos1","pos2","viz.core\/dist-from","quil.core\/sqrt","viz.core\/take-adj-poss","grid-width","width","dist-from-center","cljs.core\/take","quil.core\/map-range","cljs.core\/rand","dist-ratio","cljs.core\/count","adj-poss","viz.core\/mk-poss-fn","cljs.core\/filter","p1__25593#","cljs.core\/sort-by","p1__25594#","viz.core\/update-ghost-forest","vec__25595","p__25598","vec__25599","vec__25602","update-fn","ghosts","cljs.core\/reverse","viz.core\/ghost-incr","p1__25605#","p2__25606#","viz.ghost\/incr","poss-fn","viz.core\/rm-nodes","viz.ghost\/rm-active-node","node-ids","viz.forest\/remove-node","viz.core\/maybe-remove-roots","viz.forest\/roots","viz.core\/ghost-set-color","cljs.core\/get-in","color","viz.core\/update-state","cljs.core\/update-in","cljs.core\/inc","viz.core\/draw-ellipse","scale-fn","cljs.core\/int","size","quil.core\/ellipse","cljs.core\/concat","scaled-pos","scaled-size","viz.core\/in-line?","seq25608","cljs.core\/=","p1__25607#","cljs.core\/partition","nodes","viz.core\/draw-node","node","active?","stroke","quil.core\/stroke","quil.core\/fill","fill","viz.core\/draw-line","quil.core\/lerp-color","node-color","parent-color","quil.core\/stroke-weight","quil.core\/line","cljs.core\/List","parent","viz.core\/draw-lines","p1__25612#","viz.forest\/get-node","cljs.core\/not","i__25617","count__25616","cljs.core\/-nth","chunk__25615","seq__25614","temp__4657__auto__","cljs.core\/chunked-seq?","cljs.core\/chunk-first","cljs.core\/chunk-rest","c__4461__auto__","cljs.core\/first","cljs.core\/next","children","child","cljs.core\/some","p1__25613#","i__25621","count__25620","chunk__25619","seq__25618","and__4036__auto__","in-line-child","cljs.core\/empty?","viz.core\/draw-dial","quil.core\/norm","dial","p1__25665#","p2__25666#","quil.core\/lerp","dial-norm","posL","posR","dial-pos","viz.core\/draw-state","quil.core\/background","quil.core\/push-matrix","quil.core\/translate","tr__1504__auto__","quil.core\/pop-matrix","p1__25667#","i__25672","count__25671","chunk__25670","seq__25669","roots","root","i__25676","count__25675","chunk__25674","seq__25673","i__25680","count__25679","chunk__25678","seq__25677","i__25684","count__25683","chunk__25682","seq__25681","p1__25668#","active-node","quil.sketch\/sketch","cljs.core\/fn?","p1__1117__1118__auto__","quil.sketch\/add-sketch-to-init-list","viz.core\/viz","quil.middleware\/fun-mode"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/debug.cljs b/src/http/static/viz/2/viz/debug.cljs
new file mode 100644
index 0000000..9de3071
--- /dev/null
+++ b/src/http/static/viz/2/viz/debug.cljs
@@ -0,0 +1,4 @@
+(ns viz.debug)
+
+(defn- log [& args]
+ (.log js/console (clojure.string/join " " (map str args))))
diff --git a/src/http/static/viz/2/viz/debug.cljs.cache.json b/src/http/static/viz/2/viz/debug.cljs.cache.json
new file mode 100644
index 0000000..e2f0a33
--- /dev/null
+++ b/src/http/static/viz/2/viz/debug.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:externs",["^ ","~$console",["^ ","~$log",["^ "]]],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$viz.debug","~:imports",null,"~:requires",null,"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","^4",["^ ","~:protocol-inline",null,"~:meta",["^ ","~:file","/home/mediocregopher/src/viz/src/viz/debug.cljs","~:line",3,"~:column",8,"~:end-line",3,"~:end-column",11,"~:private",true,"~:arglists",["~#list",["~$quote",["^H",[["~$&","~$args"]]]]],"~:top-fn",["^ ","~:variadic?",true,"~:max-fixed-arity",0,"~:method-params",[["^H",["^J"]]],"^G",["^H",[["~$&","^J"]]],"~:arglists-meta",["^H",[null]]]],"^F",true,"^8","~$viz.debug/log","^A","src/viz/debug.cljs","^E",11,"^K",["^ ","^L",true,"^M",0,"^N",[["^H",["^J"]]],"^G",["^H",[["~$&","^J"]]],"^O",["^H",[null]]],"^N",[["^H",["^J"]]],"~:protocol-impl",null,"^O",["^H",[null]],"^C",1,"^L",true,"^B",3,"~:ret-tag","~$any","^D",3,"^M",0,"~:fn-var",true,"^G",["^H",[["~$&","^J"]]]]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:doc",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/debug.js b/src/http/static/viz/2/viz/debug.js
new file mode 100644
index 0000000..81683f9
--- /dev/null
+++ b/src/http/static/viz/2/viz/debug.js
@@ -0,0 +1,37 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('viz.debug');
+goog.require('cljs.core');
+viz.debug.log = (function viz$debug$log(var_args){
+var args__4647__auto__ = [];
+var len__4641__auto___2514 = arguments.length;
+var i__4642__auto___2515 = (0);
+while(true){
+if((i__4642__auto___2515 < len__4641__auto___2514)){
+args__4647__auto__.push((arguments[i__4642__auto___2515]));
+
+var G__2516 = (i__4642__auto___2515 + (1));
+i__4642__auto___2515 = G__2516;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__4648__auto__ = ((((0) < args__4647__auto__.length))?(new cljs.core.IndexedSeq(args__4647__auto__.slice((0)),(0),null)):null);
+return viz.debug.log.cljs$core$IFn$_invoke$arity$variadic(argseq__4648__auto__);
+});
+
+viz.debug.log.cljs$core$IFn$_invoke$arity$variadic = (function (args){
+return console.log(clojure.string.join.call(null," ",cljs.core.map.call(null,cljs.core.str,args)));
+});
+
+viz.debug.log.cljs$lang$maxFixedArity = (0);
+
+/** @this {Function} */
+viz.debug.log.cljs$lang$applyTo = (function (seq2513){
+var self__4629__auto__ = this;
+return self__4629__auto__.cljs$core$IFn$_invoke$arity$variadic(cljs.core.seq.call(null,seq2513));
+});
+
+
+//# sourceMappingURL=debug.js.map
diff --git a/src/http/static/viz/2/viz/debug.js.map b/src/http/static/viz/2/viz/debug.js.map
new file mode 100644
index 0000000..fb46f64
--- /dev/null
+++ b/src/http/static/viz/2/viz/debug.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/viz\/debug.js","sources":["debug.cljs"],"lineCount":37,"mappings":";AAAA;;AAEA,AAAA,gBAAA,wBAAA,xCAAOI;AAAP,AAAA,IAAA,qBAAA;AAAA,AAAA,IAAA,yBAAA,AAAA;AAAA,AAAA,IAAA,uBAAA;;AAAA,AAAA,GAAA,CAAAJ,uBAAAC;AAAA,AAAA,AAAAC,wBAAA,CAAA,UAAAF;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAA,uBAAA,EAAA,CAAA,MAAA,AAAAE,4BAAA,AAAA,KAAAC,qBAAA,AAAAD,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAE,mDAAAC;;;AAAA,AAAA,AAAA,AAAAD,qDAAA,WAAc;AAAd,AACE,OAAMK,YAAW,8BAAA,9BAACC,kCAAwB,AAACC,wBAAIC,cAAIC;;;AADrD,AAAA,AAAAT,wCAAA;;AAAA;AAAA,AAAA,AAAAA,kCAAA,WAAA;AAAA,AAAA,IAAA,qBAAA;AAAA,AAAA,OAAAE,wDAAA,AAAAC,wBAAAC;;;AAAA","names":["i__4642__auto__","len__4641__auto__","args__4647__auto__","cljs.core\/IndexedSeq","viz.debug\/log","argseq__4648__auto__","self__4629__auto__","cljs.core\/seq","seq2513","js\/console","clojure.string\/join","cljs.core\/map","cljs.core\/str","args"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/dial.cljs b/src/http/static/viz/2/viz/dial.cljs
new file mode 100644
index 0000000..46656e5
--- /dev/null
+++ b/src/http/static/viz/2/viz/dial.cljs
@@ -0,0 +1,42 @@
+(ns viz.dial
+ (:require [quil.core :as q]))
+
+(defn new-dial []
+ {:val 0
+ :min -1
+ :max 1
+ })
+
+(defn- scale [v old-min old-max new-min new-max]
+ (+ new-min (* (- new-max new-min)
+ (/ (- v old-min) (- old-max old-min)))))
+
+(defn scaled [dial min max]
+ (let [new-val (scale (:val dial) (:min dial) (:max dial) min max)]
+ (assoc dial :min min :max max :val new-val)))
+
+(defn floored [dial at]
+ (if (< (:val dial) at)
+ (assoc dial :val at)
+ dial))
+
+(defn invert [dial]
+ (assoc dial :val (* -1 (:val dial))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; plot is a sequence of [t val], where t is a normalized time value between 0
+; and 1, and val is the value the plot should become at that point.
+(defn new-plot [frame-rate period-seconds plot]
+ {:frame-rate frame-rate
+ :period period-seconds
+ :plot plot})
+
+(defn by-plot [dial plot curr-frame]
+ (let [dial-t (/ (mod (/ curr-frame (:frame-rate plot)) (:period plot)) (:period plot))
+ ]
+ (assoc dial :val
+ (reduce
+ (fn [curr-v [t v]] (if (<= t dial-t) v (reduced curr-v)))
+ 0 (:plot plot)))
+ ))
diff --git a/src/http/static/viz/2/viz/dial.cljs.cache.json b/src/http/static/viz/2/viz/dial.cljs.cache.json
new file mode 100644
index 0000000..da9fe18
--- /dev/null
+++ b/src/http/static/viz/2/viz/dial.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$viz.dial","~:imports",null,"~:requires",["^ ","~$q","~$quil.core","^9","^9"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$new-dial",["^ ","~:protocol-inline",null,"~:meta",["^ ","~:file","/home/mediocregopher/src/viz/src/viz/dial.cljs","~:line",4,"~:column",7,"~:end-line",4,"~:end-column",15,"~:arglists",["~#list",["~$quote",["^F",[[]]]]]],"^5","~$viz.dial/new-dial","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^D",15,"~:method-params",["^F",[[]]],"~:protocol-impl",null,"~:arglists-meta",["^F",[null,null]],"^B",1,"~:variadic?",false,"^A",4,"~:ret-tag","~$cljs.core/IMap","^C",4,"~:max-fixed-arity",0,"~:fn-var",true,"^E",["^F",["^G",["^F",[[]]]]]],"~$scale",["^ ","^>",null,"^?",["^ ","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^A",10,"^B",8,"^C",10,"^D",13,"~:private",true,"^E",["^F",["^G",["^F",[["~$v","~$old-min","~$old-max","~$new-min","~$new-max"]]]]]],"^R",true,"^5","~$viz.dial/scale","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^D",13,"^I",["^F",[["~$v","^S","^T","^U","^V"]]],"^J",null,"^K",["^F",[null,null]],"^B",1,"^L",false,"^A",10,"^M","~$number","^C",10,"^O",5,"^P",true,"^E",["^F",["^G",["^F",[["~$v","^S","^T","^U","^V"]]]]]],"~$scaled",["^ ","^>",null,"^?",["^ ","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^A",14,"^B",7,"^C",14,"^D",13,"^E",["^F",["^G",["^F",[["~$dial","~$min","~$max"]]]]]],"^5","~$viz.dial/scaled","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^D",13,"^I",["^F",[["^Z","^[","^10"]]],"^J",null,"^K",["^F",[null,null]],"^B",1,"^L",false,"^A",14,"^M","~$any","^C",14,"^O",3,"^P",true,"^E",["^F",["^G",["^F",[["^Z","^[","^10"]]]]]],"~$floored",["^ ","^>",null,"^?",["^ ","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^A",18,"^B",7,"^C",18,"^D",14,"^E",["^F",["^G",["^F",[["^Z","~$at"]]]]]],"^5","~$viz.dial/floored","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^D",14,"^I",["^F",[["^Z","^14"]]],"^J",null,"^K",["^F",[null,null]],"^B",1,"^L",false,"^A",18,"^M",["^4",[null,"^12"]],"^C",18,"^O",2,"^P",true,"^E",["^F",["^G",["^F",[["^Z","^14"]]]]]],"~$invert",["^ ","^>",null,"^?",["^ ","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^A",23,"^B",7,"^C",23,"^D",13,"^E",["^F",["^G",["^F",[["^Z"]]]]]],"^5","~$viz.dial/invert","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^D",13,"^I",["^F",[["^Z"]]],"^J",null,"^K",["^F",[null,null]],"^B",1,"^L",false,"^A",23,"^M","^12","^C",23,"^O",1,"^P",true,"^E",["^F",["^G",["^F",[["^Z"]]]]]],"~$new-plot",["^ ","^>",null,"^?",["^ ","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^A",30,"^B",7,"^C",30,"^D",15,"^E",["^F",["^G",["^F",[["~$frame-rate","~$period-seconds","~$plot"]]]]]],"^5","~$viz.dial/new-plot","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^D",15,"^I",["^F",[["^19","^1:","^1;"]]],"^J",null,"^K",["^F",[null,null]],"^B",1,"^L",false,"^A",30,"^M","^N","^C",30,"^O",3,"^P",true,"^E",["^F",["^G",["^F",[["^19","^1:","^1;"]]]]]],"~$by-plot",["^ ","^>",null,"^?",["^ ","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^A",35,"^B",7,"^C",35,"^D",14,"^E",["^F",["^G",["^F",[["^Z","^1;","~$curr-frame"]]]]]],"^5","~$viz.dial/by-plot","^@","/home/mediocregopher/src/viz/src/viz/dial.cljs","^D",14,"^I",["^F",[["^Z","^1;","^1>"]]],"^J",null,"^K",["^F",[null,null]],"^B",1,"^L",false,"^A",35,"^M","^12","^C",35,"^O",3,"^P",true,"^E",["^F",["^G",["^F",[["^Z","^1;","^1>"]]]]]]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:cljs.analyzer/constants",["^ ","~:seen",["^4",["~:plot","~:min","~:frame-rate","~:val","~:max","~:period"]],"~:order",["^1G","^1E","^1H","^1F","^1I","^1D"]],"~:doc",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/dial.js b/src/http/static/viz/2/viz/dial.js
new file mode 100644
index 0000000..3eb17f2
--- /dev/null
+++ b/src/http/static/viz/2/viz/dial.js
@@ -0,0 +1,44 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('viz.dial');
+goog.require('cljs.core');
+goog.require('quil.core');
+viz.dial.new_dial = (function viz$dial$new_dial(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"val","val",128701612),(0),new cljs.core.Keyword(null,"min","min",444991522),(-1),new cljs.core.Keyword(null,"max","max",61366548),(1)], null);
+});
+viz.dial.scale = (function viz$dial$scale(v,old_min,old_max,new_min,new_max){
+return (new_min + ((new_max - new_min) * ((v - old_min) / (old_max - old_min))));
+});
+viz.dial.scaled = (function viz$dial$scaled(dial,min,max){
+var new_val = viz.dial.scale.call(null,new cljs.core.Keyword(null,"val","val",128701612).cljs$core$IFn$_invoke$arity$1(dial),new cljs.core.Keyword(null,"min","min",444991522).cljs$core$IFn$_invoke$arity$1(dial),new cljs.core.Keyword(null,"max","max",61366548).cljs$core$IFn$_invoke$arity$1(dial),min,max);
+return cljs.core.assoc.call(null,dial,new cljs.core.Keyword(null,"min","min",444991522),min,new cljs.core.Keyword(null,"max","max",61366548),max,new cljs.core.Keyword(null,"val","val",128701612),new_val);
+});
+viz.dial.floored = (function viz$dial$floored(dial,at){
+if((new cljs.core.Keyword(null,"val","val",128701612).cljs$core$IFn$_invoke$arity$1(dial) < at)){
+return cljs.core.assoc.call(null,dial,new cljs.core.Keyword(null,"val","val",128701612),at);
+} else {
+return dial;
+}
+});
+viz.dial.invert = (function viz$dial$invert(dial){
+return cljs.core.assoc.call(null,dial,new cljs.core.Keyword(null,"val","val",128701612),((-1) * new cljs.core.Keyword(null,"val","val",128701612).cljs$core$IFn$_invoke$arity$1(dial)));
+});
+viz.dial.new_plot = (function viz$dial$new_plot(frame_rate,period_seconds,plot){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"frame-rate","frame-rate",-994918942),frame_rate,new cljs.core.Keyword(null,"period","period",-352129191),period_seconds,new cljs.core.Keyword(null,"plot","plot",2086832225),plot], null);
+});
+viz.dial.by_plot = (function viz$dial$by_plot(dial,plot,curr_frame){
+var dial_t = (cljs.core.mod.call(null,(curr_frame / new cljs.core.Keyword(null,"frame-rate","frame-rate",-994918942).cljs$core$IFn$_invoke$arity$1(plot)),new cljs.core.Keyword(null,"period","period",-352129191).cljs$core$IFn$_invoke$arity$1(plot)) / new cljs.core.Keyword(null,"period","period",-352129191).cljs$core$IFn$_invoke$arity$1(plot));
+return cljs.core.assoc.call(null,dial,new cljs.core.Keyword(null,"val","val",128701612),cljs.core.reduce.call(null,((function (dial_t){
+return (function (curr_v,p__10882){
+var vec__10883 = p__10882;
+var t = cljs.core.nth.call(null,vec__10883,(0),null);
+var v = cljs.core.nth.call(null,vec__10883,(1),null);
+if((t <= dial_t)){
+return v;
+} else {
+return cljs.core.reduced.call(null,curr_v);
+}
+});})(dial_t))
+,(0),new cljs.core.Keyword(null,"plot","plot",2086832225).cljs$core$IFn$_invoke$arity$1(plot)));
+});
+
+//# sourceMappingURL=dial.js.map
diff --git a/src/http/static/viz/2/viz/dial.js.map b/src/http/static/viz/2/viz/dial.js.map
new file mode 100644
index 0000000..213c641
--- /dev/null
+++ b/src/http/static/viz/2/viz/dial.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/viz\/dial.js","sources":["dial.cljs"],"lineCount":44,"mappings":";AAAA;;;AAGA,oBAAA,pBAAMA;AAAN,AAAA,kDAAA,kDAAA,IAAA,kDAAA,KAAA,iDAAA;;AAMA,iBAAA,jBAAOC,0CAAO,EAAE,QAAQ,QAAQ,QAAQ;AAAxC,AACE,QAAGC,UAAQ,CAAG,CAAGC,UAAQD,WACX,CAAG,CAAGE,IAAEC,WAAS,CAAGC,UAAQD;;AAE5C,kBAAA,lBAAME,4CAAQ,KAAK,IAAI;AAAvB,AACE,IAAM,UAAQ,AAACN,yBAAM,AAAA,gFAAMO,MAAM,AAAA,gFAAMA,MAAM,AAAA,+EAAMA,MAAMC,IAAIC;AAA7D,AACE,sCAAA,sDAAA,qDAAA,1IAACC,0BAAMH,uDAAUC,qDAASC,sDAASE;;AAEvC,mBAAA,nBAAMC,8CAAS,KAAK;AAApB,AACE,GAAI,CAAG,AAAA,gFAAML,QAAMM;AACjB,sCAAA,\/BAACH,0BAAMH,uDAAUM;;AACjBN;;;AAEJ,kBAAA,lBAAMO,4CAAQ;AAAd,AACE,sCAAA,\/BAACJ,0BAAMH,uDAAU,CAAA,OAAM,AAAA,gFAAMA;;AAM\/B,oBAAA,pBAAMQ,gDAAU,WAAW,eAAe;AAA1C,AAAA,kDAAA,4EAAA,wEAAA,nFACeC,oEACJC,oEACFC;;AAET,mBAAA,nBAAMC,8CAAS,KAAK,KAAK;AAAzB,AACE,IAAM,SAAO,CAAG,AAACC,wBAAI,CAAGC,aAAW,AAAA,+FAAaH,OAAO,AAAA,uFAASA,SAAO,AAAA,uFAASA;AAAhF,AAEE,sCAAA,\/BAACR,0BAAMH,uDACA,AAACe,2BACC;yBAAA,PAAK;AAAL,AAAA,IAAA,aAAAC;QAAA,AAAAC,wBAAAC,WAAA,IAAA,3CAAa;QAAb,AAAAD,wBAAAC,WAAA,IAAA,3CAAe;AAAf,AAAmB,GAAI,CAAIC,KAAEC;AAAQxB;;AAAE,OAACyB,4BAAQC;;;CADlD,IAEI,AAAA,mFAAOX","names":["viz.dial\/new-dial","viz.dial\/scale","new-min","new-max","v","old-min","old-max","viz.dial\/scaled","dial","min","max","cljs.core\/assoc","new-val","viz.dial\/floored","at","viz.dial\/invert","viz.dial\/new-plot","frame-rate","period-seconds","plot","viz.dial\/by-plot","cljs.core\/mod","curr-frame","cljs.core\/reduce","p__10882","cljs.core\/nth","vec__10883","t","dial-t","cljs.core\/reduced","curr-v"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/forest.cljs b/src/http/static/viz/2/viz/forest.cljs
new file mode 100644
index 0000000..ee6a2fb
--- /dev/null
+++ b/src/http/static/viz/2/viz/forest.cljs
@@ -0,0 +1,107 @@
+(ns viz.forest
+ (:require [viz.grid :as grid])
+ )
+
+(defn new-forest [grid-def]
+ {:grid (grid/new-grid grid-def)
+ :nodes {}
+ :roots #{}
+ :leaves #{}
+ :next-id 0})
+
+(defn- new-id [forest]
+ (let [id (:next-id forest)]
+ [(assoc forest :next-id (inc id))
+ id]))
+
+(defn- unset-parent [forest id parent-id]
+ (-> forest
+ (update-in [:nodes id] dissoc :parent-id :parent-pos)
+ (update-in [:nodes parent-id :child-ids] disj id)
+ (update-in [:roots] conj id)
+ (update-in [:leaves] conj parent-id)
+ ))
+
+(defn- set-parent [forest id parent-id]
+ (let [parent-pos (get-in forest [:nodes parent-id :pos])
+ prev-parent-id (get-in forest [:nodes id :parent-id])
+ ]
+ (-> forest
+ (assoc-in [:nodes id :parent-id] parent-id)
+ (assoc-in [:nodes id :parent-pos] parent-pos)
+ (update-in [:nodes parent-id :child-ids] #(if %1 (conj %1 id) #{id}))
+ (update-in [:roots] disj id)
+ (update-in [:leaves] disj parent-id)
+ ;; If there was a previous parent of the child, unset that shit
+ (#(if prev-parent-id (unset-parent %1 id prev-parent-id) %1))
+ )))
+
+(defn node-at-pos? [forest pos]
+ (boolean (some #(= pos (:pos %)) (vals (:nodes forest)))))
+
+(defn empty-adjacent-points [forest pos]
+ (grid/empty-adjacent-points (:grid forest) pos))
+
+(defn add-node [forest pos]
+ (let [[forest id] (new-id forest)
+ forest (-> forest
+ (update-in [:grid] grid/add-point pos)
+ (assoc-in [:nodes id] {:id id :pos pos})
+ (update-in [:roots] conj id)
+ (update-in [:leaves] conj id)
+ )
+ ]
+ [forest id]))
+
+(defn remove-node [forest id]
+ (let [node (get-in forest [:nodes id])
+ child-ids (:child-ids node)
+ parent-id (:parent-id node)]
+ (-> forest
+ (update-in [:grid] grid/rm-point (:pos node))
+ ;; unset this node's parent, if it has one
+ (#(if parent-id (unset-parent %1 id parent-id) %1))
+ ;; unset this node's children, if it has any
+ ((fn [forest] (reduce #(unset-parent %1 %2 id) forest child-ids)))
+ ;; remove from all top-level sets
+ (update-in [:nodes] dissoc id)
+ (update-in [:roots] disj id)
+ (update-in [:leaves] disj id)
+ )))
+
+(defn update-node-meta [forest id f]
+ (update-in forest [:nodes id :meta] f))
+
+(defn get-node-meta [forest id]
+ (get-in forest [:nodes id :meta]))
+
+(defn get-node [forest id]
+ (get-in forest [:nodes id]))
+
+(defn spawn-child [forest parent-id pos]
+ (let [[forest id] (add-node forest pos)
+ forest (-> forest
+ (set-parent id parent-id)
+ )
+ ]
+ [forest id]))
+
+(defn roots [forest] (-> forest :nodes (select-keys (:roots forest)) (vals)))
+(defn root? [node] (not (boolean (:parent-id node))))
+
+(defn leaves [forest] (-> forest :nodes (select-keys (:leaves forest)) (vals)))
+(defn leaf? [node] (empty? (:child-ids node)))
+
+(defn lines [forest]
+ (->> forest
+ (:nodes)
+ (vals)
+ (remove #(empty? (:parent-pos %)))
+ (map #(vector (:pos %) (:parent-pos %)))
+ ))
+
+;(let [forest (new-forest grid/isometric)
+; [forest id0] (add-node forest [0 0])
+; forest (update-node-meta forest id0 #(assoc % :color :red))
+; ]
+; (print (get-node-meta forest id0)))
diff --git a/src/http/static/viz/2/viz/forest.cljs.cache.json b/src/http/static/viz/2/viz/forest.cljs.cache.json
new file mode 100644
index 0000000..e45e9f2
--- /dev/null
+++ b/src/http/static/viz/2/viz/forest.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$viz.forest","~:imports",null,"~:requires",["^ ","~$grid","~$viz.grid","^:","^:"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$get-node-meta",["^ ","~:protocol-inline",null,"~:meta",["^ ","~:file","/home/mediocregopher/src/viz/src/viz/forest.cljs","~:line",75,"~:column",7,"~:end-line",75,"~:end-column",20,"~:arglists",["~#list",["~$quote",["^G",[["~$forest","~$id"]]]]]],"^5","~$viz.forest/get-node-meta","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",20,"~:method-params",["^G",[["^I","^J"]]],"~:protocol-impl",null,"~:arglists-meta",["^G",[null,null]],"^C",1,"~:variadic?",false,"^B",75,"~:ret-tag","~$any","^D",75,"~:max-fixed-arity",2,"~:fn-var",true,"^F",["^G",["^H",["^G",[["^I","^J"]]]]]],"~$get-node",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",78,"^C",7,"^D",78,"^E",15,"^F",["^G",["^H",["^G",[["^I","^J"]]]]]],"^5","~$viz.forest/get-node","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",15,"^L",["^G",[["^I","^J"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",78,"^P","^Q","^D",78,"^R",2,"^S",true,"^F",["^G",["^H",["^G",[["^I","^J"]]]]]],"~$add-node",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",45,"^C",7,"^D",45,"^E",15,"^F",["^G",["^H",["^G",[["^I","~$pos"]]]]]],"^5","~$viz.forest/add-node","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",15,"^L",["^G",[["^I","^W"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",45,"^P","~$cljs.core/IVector","^D",45,"^R",2,"^S",true,"^F",["^G",["^H",["^G",[["^I","^W"]]]]]],"~$set-parent",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",25,"^C",8,"^D",25,"^E",18,"~:private",true,"^F",["^G",["^H",["^G",[["^I","^J","~$parent-id"]]]]]],"^[",true,"^5","~$viz.forest/set-parent","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",18,"^L",["^G",[["^I","^J","^10"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",25,"^P",["^4",[null,"^Q"]],"^D",25,"^R",3,"^S",true,"^F",["^G",["^H",["^G",[["^I","^J","^10"]]]]]],"~$new-id",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",12,"^C",8,"^D",12,"^E",14,"^[",true,"^F",["^G",["^H",["^G",[["^I"]]]]]],"^[",true,"^5","~$viz.forest/new-id","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",14,"^L",["^G",[["^I"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",12,"^P","^Y","^D",12,"^R",1,"^S",true,"^F",["^G",["^H",["^G",[["^I"]]]]]],"~$root?",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",90,"^C",7,"^D",90,"^E",12,"^F",["^G",["^H",["^G",[["~$node"]]]]]],"^5","~$viz.forest/root?","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",12,"^L",["^G",[["^15"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",90,"^P","~$boolean","^D",90,"^R",1,"^S",true,"^F",["^G",["^H",["^G",[["^15"]]]]]],"~$empty-adjacent-points",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",42,"^C",7,"^D",42,"^E",28,"^F",["^G",["^H",["^G",[["^I","^W"]]]]]],"^5","~$viz.forest/empty-adjacent-points","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",28,"^L",["^G",[["^I","^W"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",42,"^P","^Q","^D",42,"^R",2,"^S",true,"^F",["^G",["^H",["^G",[["^I","^W"]]]]]],"~$new-forest",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",5,"^C",7,"^D",5,"^E",17,"^F",["^G",["^H",["^G",[["~$grid-def"]]]]]],"^5","~$viz.forest/new-forest","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",17,"^L",["^G",[["^1;"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",5,"^P","~$cljs.core/IMap","^D",5,"^R",1,"^S",true,"^F",["^G",["^H",["^G",[["^1;"]]]]]],"~$remove-node",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",56,"^C",7,"^D",56,"^E",18,"^F",["^G",["^H",["^G",[["^I","^J"]]]]]],"^5","~$viz.forest/remove-node","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",18,"^L",["^G",[["^I","^J"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",56,"^P","^Q","^D",56,"^R",2,"^S",true,"^F",["^G",["^H",["^G",[["^I","^J"]]]]]],"~$spawn-child",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",81,"^C",7,"^D",81,"^E",18,"^F",["^G",["^H",["^G",[["^I","^10","^W"]]]]]],"^5","~$viz.forest/spawn-child","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",18,"^L",["^G",[["^I","^10","^W"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",81,"^P","^Y","^D",81,"^R",3,"^S",true,"^F",["^G",["^H",["^G",[["^I","^10","^W"]]]]]],"~$lines",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",95,"^C",7,"^D",95,"^E",12,"^F",["^G",["^H",["^G",[["^I"]]]]]],"^5","~$viz.forest/lines","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",12,"^L",["^G",[["^I"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",95,"^P","^Q","^D",95,"^R",1,"^S",true,"^F",["^G",["^H",["^G",[["^I"]]]]]],"~$unset-parent",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",17,"^C",8,"^D",17,"^E",20,"^[",true,"^F",["^G",["^H",["^G",[["^I","^J","^10"]]]]]],"^[",true,"^5","~$viz.forest/unset-parent","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",20,"^L",["^G",[["^I","^J","^10"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",17,"^P","^Q","^D",17,"^R",3,"^S",true,"^F",["^G",["^H",["^G",[["^I","^J","^10"]]]]]],"~$roots",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",89,"^C",7,"^D",89,"^E",12,"^F",["^G",["^H",["^G",[["^I"]]]]]],"^5","~$viz.forest/roots","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",12,"^L",["^G",[["^I"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",89,"^P",["^4",["~$cljs.core/ValSeq","~$clj-nil"]],"^D",89,"^R",1,"^S",true,"^F",["^G",["^H",["^G",[["^I"]]]]]],"~$leaves",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",92,"^C",7,"^D",92,"^E",13,"^F",["^G",["^H",["^G",[["^I"]]]]]],"^5","~$viz.forest/leaves","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",13,"^L",["^G",[["^I"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",92,"^P",["^4",["^1H","^1I"]],"^D",92,"^R",1,"^S",true,"^F",["^G",["^H",["^G",[["^I"]]]]]],"~$update-node-meta",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",72,"^C",7,"^D",72,"^E",23,"^F",["^G",["^H",["^G",[["^I","^J","~$f"]]]]]],"^5","~$viz.forest/update-node-meta","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",23,"^L",["^G",[["^I","^J","~$f"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",72,"^P","^Q","^D",72,"^R",3,"^S",true,"^F",["^G",["^H",["^G",[["^I","^J","~$f"]]]]]],"~$leaf?",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",93,"^C",7,"^D",93,"^E",12,"^F",["^G",["^H",["^G",[["^15"]]]]]],"^5","~$viz.forest/leaf?","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",12,"^L",["^G",[["^15"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",93,"^P","^17","^D",93,"^R",1,"^S",true,"^F",["^G",["^H",["^G",[["^15"]]]]]],"~$node-at-pos?",["^ ","^?",null,"^@",["^ ","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^B",39,"^C",7,"^D",39,"^E",19,"^F",["^G",["^H",["^G",[["^I","^W"]]]]]],"^5","~$viz.forest/node-at-pos?","^A","/home/mediocregopher/src/viz/src/viz/forest.cljs","^E",19,"^L",["^G",[["^I","^W"]]],"^M",null,"^N",["^G",[null,null]],"^C",1,"^O",false,"^B",39,"^P","^17","^D",39,"^R",2,"^S",true,"^F",["^G",["^H",["^G",[["^I","^W"]]]]]]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:cljs.analyzer/constants",["^ ","~:seen",["^4",["^@","~:next-id","~:grid","~:parent-pos","~:pos","~:roots","~:leaves","~:nodes","~:id","~:parent-id","~:child-ids"]],"~:order",["^1W","^20","^1Z","^1[","^1V","^22","^1X","^23","^1Y","^21","^@"]],"~:doc",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/forest.js b/src/http/static/viz/2/viz/forest.js
new file mode 100644
index 0000000..4481c7d
--- /dev/null
+++ b/src/http/static/viz/2/viz/forest.js
@@ -0,0 +1,109 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('viz.forest');
+goog.require('cljs.core');
+goog.require('viz.grid');
+viz.forest.new_forest = (function viz$forest$new_forest(grid_def){
+return new cljs.core.PersistentArrayMap(null, 5, [new cljs.core.Keyword(null,"grid","grid",402978600),viz.grid.new_grid.call(null,grid_def),new cljs.core.Keyword(null,"nodes","nodes",-2099585805),cljs.core.PersistentArrayMap.EMPTY,new cljs.core.Keyword(null,"roots","roots",-1088919250),cljs.core.PersistentHashSet.EMPTY,new cljs.core.Keyword(null,"leaves","leaves",-2143630574),cljs.core.PersistentHashSet.EMPTY,new cljs.core.Keyword(null,"next-id","next-id",-224240762),(0)], null);
+});
+viz.forest.new_id = (function viz$forest$new_id(forest){
+var id = new cljs.core.Keyword(null,"next-id","next-id",-224240762).cljs$core$IFn$_invoke$arity$1(forest);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.assoc.call(null,forest,new cljs.core.Keyword(null,"next-id","next-id",-224240762),(id + (1))),id], null);
+});
+viz.forest.unset_parent = (function viz$forest$unset_parent(forest,id,parent_id){
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,forest,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id], null),cljs.core.dissoc,new cljs.core.Keyword(null,"parent-id","parent-id",-1400729131),new cljs.core.Keyword(null,"parent-pos","parent-pos",-282368566)),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),parent_id,new cljs.core.Keyword(null,"child-ids","child-ids",-604525861)], null),cljs.core.disj,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"roots","roots",-1088919250)], null),cljs.core.conj,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"leaves","leaves",-2143630574)], null),cljs.core.conj,parent_id);
+});
+viz.forest.set_parent = (function viz$forest$set_parent(forest,id,parent_id){
+var parent_pos = cljs.core.get_in.call(null,forest,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),parent_id,new cljs.core.Keyword(null,"pos","pos",-864607220)], null));
+var prev_parent_id = cljs.core.get_in.call(null,forest,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id,new cljs.core.Keyword(null,"parent-id","parent-id",-1400729131)], null));
+return ((function (parent_pos,prev_parent_id){
+return (function (p1__10848_SHARP_){
+if(cljs.core.truth_(prev_parent_id)){
+return viz.forest.unset_parent.call(null,p1__10848_SHARP_,id,prev_parent_id);
+} else {
+return p1__10848_SHARP_;
+}
+});})(parent_pos,prev_parent_id))
+.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.assoc_in.call(null,cljs.core.assoc_in.call(null,forest,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id,new cljs.core.Keyword(null,"parent-id","parent-id",-1400729131)], null),parent_id),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id,new cljs.core.Keyword(null,"parent-pos","parent-pos",-282368566)], null),parent_pos),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),parent_id,new cljs.core.Keyword(null,"child-ids","child-ids",-604525861)], null),((function (parent_pos,prev_parent_id){
+return (function (p1__10847_SHARP_){
+if(cljs.core.truth_(p1__10847_SHARP_)){
+return cljs.core.conj.call(null,p1__10847_SHARP_,id);
+} else {
+return cljs.core.PersistentHashSet.createAsIfByAssoc([id]);
+}
+});})(parent_pos,prev_parent_id))
+),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"roots","roots",-1088919250)], null),cljs.core.disj,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"leaves","leaves",-2143630574)], null),cljs.core.disj,parent_id));
+});
+viz.forest.node_at_pos_QMARK_ = (function viz$forest$node_at_pos_QMARK_(forest,pos){
+return cljs.core.boolean$.call(null,cljs.core.some.call(null,(function (p1__10849_SHARP_){
+return cljs.core._EQ_.call(null,pos,new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(p1__10849_SHARP_));
+}),cljs.core.vals.call(null,new cljs.core.Keyword(null,"nodes","nodes",-2099585805).cljs$core$IFn$_invoke$arity$1(forest))));
+});
+viz.forest.empty_adjacent_points = (function viz$forest$empty_adjacent_points(forest,pos){
+return viz.grid.empty_adjacent_points.call(null,new cljs.core.Keyword(null,"grid","grid",402978600).cljs$core$IFn$_invoke$arity$1(forest),pos);
+});
+viz.forest.add_node = (function viz$forest$add_node(forest,pos){
+var vec__10850 = viz.forest.new_id.call(null,forest);
+var forest__$1 = cljs.core.nth.call(null,vec__10850,(0),null);
+var id = cljs.core.nth.call(null,vec__10850,(1),null);
+var forest__$2 = cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.assoc_in.call(null,cljs.core.update_in.call(null,forest__$1,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"grid","grid",402978600)], null),viz.grid.add_point,pos),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id], null),new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"id","id",-1388402092),id,new cljs.core.Keyword(null,"pos","pos",-864607220),pos], null)),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"roots","roots",-1088919250)], null),cljs.core.conj,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"leaves","leaves",-2143630574)], null),cljs.core.conj,id);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [forest__$2,id], null);
+});
+viz.forest.remove_node = (function viz$forest$remove_node(forest,id){
+var node = cljs.core.get_in.call(null,forest,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id], null));
+var child_ids = new cljs.core.Keyword(null,"child-ids","child-ids",-604525861).cljs$core$IFn$_invoke$arity$1(node);
+var parent_id = new cljs.core.Keyword(null,"parent-id","parent-id",-1400729131).cljs$core$IFn$_invoke$arity$1(node);
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.update_in.call(null,((function (node,child_ids,parent_id){
+return (function (forest__$1){
+return cljs.core.reduce.call(null,((function (node,child_ids,parent_id){
+return (function (p1__10854_SHARP_,p2__10855_SHARP_){
+return viz.forest.unset_parent.call(null,p1__10854_SHARP_,p2__10855_SHARP_,id);
+});})(node,child_ids,parent_id))
+,forest__$1,child_ids);
+});})(node,child_ids,parent_id))
+.call(null,((function (node,child_ids,parent_id){
+return (function (p1__10853_SHARP_){
+if(cljs.core.truth_(parent_id)){
+return viz.forest.unset_parent.call(null,p1__10853_SHARP_,id,parent_id);
+} else {
+return p1__10853_SHARP_;
+}
+});})(node,child_ids,parent_id))
+.call(null,cljs.core.update_in.call(null,forest,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"grid","grid",402978600)], null),viz.grid.rm_point,new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(node)))),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805)], null),cljs.core.dissoc,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"roots","roots",-1088919250)], null),cljs.core.disj,id),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"leaves","leaves",-2143630574)], null),cljs.core.disj,id);
+});
+viz.forest.update_node_meta = (function viz$forest$update_node_meta(forest,id,f){
+return cljs.core.update_in.call(null,forest,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id,new cljs.core.Keyword(null,"meta","meta",1499536964)], null),f);
+});
+viz.forest.get_node_meta = (function viz$forest$get_node_meta(forest,id){
+return cljs.core.get_in.call(null,forest,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id,new cljs.core.Keyword(null,"meta","meta",1499536964)], null));
+});
+viz.forest.get_node = (function viz$forest$get_node(forest,id){
+return cljs.core.get_in.call(null,forest,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"nodes","nodes",-2099585805),id], null));
+});
+viz.forest.spawn_child = (function viz$forest$spawn_child(forest,parent_id,pos){
+var vec__10856 = viz.forest.add_node.call(null,forest,pos);
+var forest__$1 = cljs.core.nth.call(null,vec__10856,(0),null);
+var id = cljs.core.nth.call(null,vec__10856,(1),null);
+var forest__$2 = viz.forest.set_parent.call(null,forest__$1,id,parent_id);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [forest__$2,id], null);
+});
+viz.forest.roots = (function viz$forest$roots(forest){
+return cljs.core.vals.call(null,cljs.core.select_keys.call(null,new cljs.core.Keyword(null,"nodes","nodes",-2099585805).cljs$core$IFn$_invoke$arity$1(forest),new cljs.core.Keyword(null,"roots","roots",-1088919250).cljs$core$IFn$_invoke$arity$1(forest)));
+});
+viz.forest.root_QMARK_ = (function viz$forest$root_QMARK_(node){
+return (!(cljs.core.boolean$.call(null,new cljs.core.Keyword(null,"parent-id","parent-id",-1400729131).cljs$core$IFn$_invoke$arity$1(node))));
+});
+viz.forest.leaves = (function viz$forest$leaves(forest){
+return cljs.core.vals.call(null,cljs.core.select_keys.call(null,new cljs.core.Keyword(null,"nodes","nodes",-2099585805).cljs$core$IFn$_invoke$arity$1(forest),new cljs.core.Keyword(null,"leaves","leaves",-2143630574).cljs$core$IFn$_invoke$arity$1(forest)));
+});
+viz.forest.leaf_QMARK_ = (function viz$forest$leaf_QMARK_(node){
+return cljs.core.empty_QMARK_.call(null,new cljs.core.Keyword(null,"child-ids","child-ids",-604525861).cljs$core$IFn$_invoke$arity$1(node));
+});
+viz.forest.lines = (function viz$forest$lines(forest){
+return cljs.core.map.call(null,(function (p1__10860_SHARP_){
+return (new cljs.core.PersistentVector(null,2,(5),cljs.core.PersistentVector.EMPTY_NODE,[new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(p1__10860_SHARP_),new cljs.core.Keyword(null,"parent-pos","parent-pos",-282368566).cljs$core$IFn$_invoke$arity$1(p1__10860_SHARP_)],null));
+}),cljs.core.remove.call(null,(function (p1__10859_SHARP_){
+return cljs.core.empty_QMARK_.call(null,new cljs.core.Keyword(null,"parent-pos","parent-pos",-282368566).cljs$core$IFn$_invoke$arity$1(p1__10859_SHARP_));
+}),cljs.core.vals.call(null,new cljs.core.Keyword(null,"nodes","nodes",-2099585805).cljs$core$IFn$_invoke$arity$1(forest))));
+});
+
+//# sourceMappingURL=forest.js.map
diff --git a/src/http/static/viz/2/viz/forest.js.map b/src/http/static/viz/2/viz/forest.js.map
new file mode 100644
index 0000000..5d1245b
--- /dev/null
+++ b/src/http/static/viz/2/viz/forest.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/viz\/forest.js","sources":["forest.cljs"],"lineCount":109,"mappings":"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","names":["viz.forest\/new-forest","viz.grid\/new-grid","grid-def","viz.forest\/new-id","forest","cljs.core\/assoc","id","viz.forest\/unset-parent","cljs.core\/update-in","cljs.core\/dissoc","parent-id","cljs.core\/disj","cljs.core\/conj","viz.forest\/set-parent","cljs.core\/get-in","cljs.core\/assoc-in","parent-pos","p1__10847#","p1__10848#","prev-parent-id","viz.forest\/node-at-pos?","cljs.core\/boolean","cljs.core\/some","cljs.core\/=","pos","p1__10849#","cljs.core\/vals","viz.forest\/empty-adjacent-points","viz.grid\/empty-adjacent-points","viz.forest\/add-node","cljs.core\/nth","vec__10850","viz.grid\/add-point","viz.forest\/remove-node","node","viz.grid\/rm-point","p1__10853#","cljs.core\/reduce","p1__10854#","p2__10855#","child-ids","viz.forest\/update-node-meta","f","viz.forest\/get-node-meta","viz.forest\/get-node","viz.forest\/spawn-child","vec__10856","viz.forest\/roots","cljs.core\/select-keys","viz.forest\/root?","viz.forest\/leaves","viz.forest\/leaf?","cljs.core\/empty?","viz.forest\/lines","cljs.core\/remove","p1__10859#","cljs.core\/map","cljs.core\/PersistentVector","p1__10860#"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/ghost.cljs b/src/http/static/viz/2/viz/ghost.cljs
new file mode 100644
index 0000000..d468479
--- /dev/null
+++ b/src/http/static/viz/2/viz/ghost.cljs
@@ -0,0 +1,49 @@
+(ns viz.ghost
+ (:require [quil.core :as q]
+ [quil.middleware :as m]
+ [viz.forest :as forest]
+ [viz.grid :as grid]
+ clojure.set))
+
+(defn new-ghost []
+ {:active-node-ids #{}
+ :color 0xFF000000
+ })
+
+(defn add-active-node [ghost id]
+ (update-in ghost [:active-node-ids] conj id))
+
+(defn rm-active-node [ghost id]
+ (update-in ghost [:active-node-ids] disj id))
+
+(defn- gen-new-poss [forest poss-fn id]
+ "generates new positions branching from the given node"
+ (let [pos (:pos (forest/get-node forest id))
+ adj-poss (forest/empty-adjacent-points forest pos)
+ new-poss (poss-fn pos adj-poss)]
+ new-poss))
+
+(defn- spawn-children [forest poss-fn id]
+ (reduce (fn [[forest new-ids] pos]
+ (let [[forest new-id] (forest/spawn-child forest id pos)]
+ [forest (conj new-ids new-id)]))
+ [forest #{}]
+ (gen-new-poss forest poss-fn id)))
+
+(defn- spawn-children-multi [forest poss-fn ids]
+ (reduce (fn [[forest new-ids] id]
+ (let [[forest this-new-ids] (spawn-children forest poss-fn id)]
+ [forest (clojure.set/union new-ids this-new-ids)]))
+ [forest #{}]
+ ids))
+
+(defn incr [ghost forest poss-fn]
+ (let [[forest new-ids] (spawn-children-multi forest poss-fn (:active-node-ids ghost))]
+ [(assoc ghost :active-node-ids new-ids)
+ (reduce (fn [forest id]
+ (forest/update-node-meta forest id
+ (fn [m] (assoc m :color (:color ghost)))))
+ forest new-ids)]))
+
+(defn- eg-poss-fn [pos adj-poss]
+ (take 2 (random-sample 0.6 adj-poss)))
diff --git a/src/http/static/viz/2/viz/ghost.cljs.cache.json b/src/http/static/viz/2/viz/ghost.cljs.cache.json
new file mode 100644
index 0000000..15e7065
--- /dev/null
+++ b/src/http/static/viz/2/viz/ghost.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$viz.ghost","~:imports",null,"~:requires",["^ ","~$q","~$quil.core","^9","^9","~$m","~$quil.middleware","^:","^:","~$forest","~$viz.forest","^<","^<","~$grid","~$viz.grid","^>","^>","~$clojure.set","^?"],"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$new-ghost",["^ ","~:protocol-inline",null,"~:meta",["^ ","~:file","/home/mediocregopher/src/viz/src/viz/ghost.cljs","~:line",8,"~:column",7,"~:end-line",8,"~:end-column",16,"~:arglists",["~#list",["~$quote",["^L",[[]]]]]],"^5","~$viz.ghost/new-ghost","^F","src/viz/ghost.cljs","^J",16,"~:method-params",["^L",[[]]],"~:protocol-impl",null,"~:arglists-meta",["^L",[null,null]],"^H",1,"~:variadic?",false,"^G",8,"~:ret-tag","~$cljs.core/IMap","^I",8,"~:max-fixed-arity",0,"~:fn-var",true,"^K",["^L",["^M",["^L",[[]]]]]],"~$add-active-node",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/src/viz/ghost.cljs","^G",13,"^H",7,"^I",13,"^J",22,"^K",["^L",["^M",["^L",[["~$ghost","~$id"]]]]]],"^5","~$viz.ghost/add-active-node","^F","src/viz/ghost.cljs","^J",22,"^O",["^L",[["^X","^Y"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",13,"^S","~$any","^I",13,"^U",2,"^V",true,"^K",["^L",["^M",["^L",[["^X","^Y"]]]]]],"~$rm-active-node",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/src/viz/ghost.cljs","^G",16,"^H",7,"^I",16,"^J",21,"^K",["^L",["^M",["^L",[["^X","^Y"]]]]]],"^5","~$viz.ghost/rm-active-node","^F","src/viz/ghost.cljs","^J",21,"^O",["^L",[["^X","^Y"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",16,"^S","^[","^I",16,"^U",2,"^V",true,"^K",["^L",["^M",["^L",[["^X","^Y"]]]]]],"~$gen-new-poss",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/src/viz/ghost.cljs","^G",19,"^H",8,"^I",19,"^J",20,"~:private",true,"^K",["^L",["^M",["^L",[["^;","~$poss-fn","^Y"]]]]]],"^13",true,"^5","~$viz.ghost/gen-new-poss","^F","src/viz/ghost.cljs","^J",20,"^O",["^L",[["^;","^14","^Y"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",19,"^S","^[","^I",19,"^U",3,"^V",true,"^K",["^L",["^M",["^L",[["^;","^14","^Y"]]]]]],"~$spawn-children",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/src/viz/ghost.cljs","^G",26,"^H",8,"^I",26,"^J",22,"^13",true,"^K",["^L",["^M",["^L",[["^;","^14","^Y"]]]]]],"^13",true,"^5","~$viz.ghost/spawn-children","^F","src/viz/ghost.cljs","^J",22,"^O",["^L",[["^;","^14","^Y"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",26,"^S","^[","^I",26,"^U",3,"^V",true,"^K",["^L",["^M",["^L",[["^;","^14","^Y"]]]]]],"~$spawn-children-multi",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/src/viz/ghost.cljs","^G",33,"^H",8,"^I",33,"^J",28,"^13",true,"^K",["^L",["^M",["^L",[["^;","^14","~$ids"]]]]]],"^13",true,"^5","~$viz.ghost/spawn-children-multi","^F","src/viz/ghost.cljs","^J",28,"^O",["^L",[["^;","^14","^19"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",33,"^S","^[","^I",33,"^U",3,"^V",true,"^K",["^L",["^M",["^L",[["^;","^14","^19"]]]]]],"~$incr",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/src/viz/ghost.cljs","^G",40,"^H",7,"^I",40,"^J",11,"^K",["^L",["^M",["^L",[["^X","^;","^14"]]]]]],"^5","~$viz.ghost/incr","^F","src/viz/ghost.cljs","^J",11,"^O",["^L",[["^X","^;","^14"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",40,"^S","~$cljs.core/IVector","^I",40,"^U",3,"^V",true,"^K",["^L",["^M",["^L",[["^X","^;","^14"]]]]]],"~$eg-poss-fn",["^ ","^D",null,"^E",["^ ","^F","/home/mediocregopher/src/viz/src/viz/ghost.cljs","^G",48,"^H",8,"^I",48,"^J",18,"^13",true,"^K",["^L",["^M",["^L",[["~$pos","~$adj-poss"]]]]]],"^13",true,"^5","~$viz.ghost/eg-poss-fn","^F","src/viz/ghost.cljs","^J",18,"^O",["^L",[["^1?","^1@"]]],"^P",null,"^Q",["^L",[null,null]],"^H",1,"^R",false,"^G",48,"^S","^[","^I",48,"^U",2,"^V",true,"^K",["^L",["^M",["^L",[["^1?","^1@"]]]]]]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:cljs.analyzer/constants",["^ ","~:seen",["^4",["~:active-node-ids","~:color","~:pos"]],"~:order",["^1F","^1G","^1H"]],"~:doc",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/ghost.js b/src/http/static/viz/2/viz/ghost.js
new file mode 100644
index 0000000..d2106e1
--- /dev/null
+++ b/src/http/static/viz/2/viz/ghost.js
@@ -0,0 +1,65 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('viz.ghost');
+goog.require('cljs.core');
+goog.require('quil.core');
+goog.require('quil.middleware');
+goog.require('viz.forest');
+goog.require('viz.grid');
+goog.require('clojure.set');
+viz.ghost.new_ghost = (function viz$ghost$new_ghost(){
+return new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751),cljs.core.PersistentHashSet.EMPTY,new cljs.core.Keyword(null,"color","color",1011675173),(4278190080)], null);
+});
+viz.ghost.add_active_node = (function viz$ghost$add_active_node(ghost,id){
+return cljs.core.update_in.call(null,ghost,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751)], null),cljs.core.conj,id);
+});
+viz.ghost.rm_active_node = (function viz$ghost$rm_active_node(ghost,id){
+return cljs.core.update_in.call(null,ghost,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751)], null),cljs.core.disj,id);
+});
+viz.ghost.gen_new_poss = (function viz$ghost$gen_new_poss(forest,poss_fn,id){
+
+var pos = new cljs.core.Keyword(null,"pos","pos",-864607220).cljs$core$IFn$_invoke$arity$1(viz.forest.get_node.call(null,forest,id));
+var adj_poss = viz.forest.empty_adjacent_points.call(null,forest,pos);
+var new_poss = poss_fn.call(null,pos,adj_poss);
+return new_poss;
+});
+viz.ghost.spawn_children = (function viz$ghost$spawn_children(forest,poss_fn,id){
+return cljs.core.reduce.call(null,(function (p__10863,pos){
+var vec__10864 = p__10863;
+var forest__$1 = cljs.core.nth.call(null,vec__10864,(0),null);
+var new_ids = cljs.core.nth.call(null,vec__10864,(1),null);
+var vec__10867 = viz.forest.spawn_child.call(null,forest__$1,id,pos);
+var forest__$2 = cljs.core.nth.call(null,vec__10867,(0),null);
+var new_id = cljs.core.nth.call(null,vec__10867,(1),null);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [forest__$2,cljs.core.conj.call(null,new_ids,new_id)], null);
+}),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [forest,cljs.core.PersistentHashSet.EMPTY], null),viz.ghost.gen_new_poss.call(null,forest,poss_fn,id));
+});
+viz.ghost.spawn_children_multi = (function viz$ghost$spawn_children_multi(forest,poss_fn,ids){
+return cljs.core.reduce.call(null,(function (p__10870,id){
+var vec__10871 = p__10870;
+var forest__$1 = cljs.core.nth.call(null,vec__10871,(0),null);
+var new_ids = cljs.core.nth.call(null,vec__10871,(1),null);
+var vec__10874 = viz.ghost.spawn_children.call(null,forest__$1,poss_fn,id);
+var forest__$2 = cljs.core.nth.call(null,vec__10874,(0),null);
+var this_new_ids = cljs.core.nth.call(null,vec__10874,(1),null);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [forest__$2,clojure.set.union.call(null,new_ids,this_new_ids)], null);
+}),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [forest,cljs.core.PersistentHashSet.EMPTY], null),ids);
+});
+viz.ghost.incr = (function viz$ghost$incr(ghost,forest,poss_fn){
+var vec__10877 = viz.ghost.spawn_children_multi.call(null,forest,poss_fn,new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751).cljs$core$IFn$_invoke$arity$1(ghost));
+var forest__$1 = cljs.core.nth.call(null,vec__10877,(0),null);
+var new_ids = cljs.core.nth.call(null,vec__10877,(1),null);
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [cljs.core.assoc.call(null,ghost,new cljs.core.Keyword(null,"active-node-ids","active-node-ids",-398210751),new_ids),cljs.core.reduce.call(null,((function (vec__10877,forest__$1,new_ids){
+return (function (forest__$2,id){
+return viz.forest.update_node_meta.call(null,forest__$2,id,((function (vec__10877,forest__$1,new_ids){
+return (function (m){
+return cljs.core.assoc.call(null,m,new cljs.core.Keyword(null,"color","color",1011675173),new cljs.core.Keyword(null,"color","color",1011675173).cljs$core$IFn$_invoke$arity$1(ghost));
+});})(vec__10877,forest__$1,new_ids))
+);
+});})(vec__10877,forest__$1,new_ids))
+,forest__$1,new_ids)], null);
+});
+viz.ghost.eg_poss_fn = (function viz$ghost$eg_poss_fn(pos,adj_poss){
+return cljs.core.take.call(null,(2),cljs.core.random_sample.call(null,0.6,adj_poss));
+});
+
+//# sourceMappingURL=ghost.js.map
diff --git a/src/http/static/viz/2/viz/ghost.js.map b/src/http/static/viz/2/viz/ghost.js.map
new file mode 100644
index 0000000..a2b7533
--- /dev/null
+++ b/src/http/static/viz/2/viz/ghost.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/viz\/ghost.js","sources":["ghost.cljs"],"lineCount":65,"mappings":";AAAA;;;;;;;AAOA,sBAAA,tBAAMA;AAAN,AAAA,kDAAA,2EAAA,kCAAA,uDAAA;;AAKA,4BAAA,5BAAMC,gEAAiB,MAAM;AAA7B,AACE,2CAAA,mFAAA,vHAACC,8BAAUC,4KAAyBC,eAAKC;;AAE3C,2BAAA,3BAAMC,8DAAgB,MAAM;AAA5B,AACE,2CAAA,mFAAA,vHAACJ,8BAAUC,4KAAyBI,eAAKF;;AAE3C,yBAAA,zBAAOG,0DAAc,OAAO,QAAQ;AAApC,AAAA;AAEE,IAAM,MAAI,AAAA,iFAAM,AAACC,8BAAgBC,OAAOL;IAClC,WAAS,AAACM,2CAA6BD,OAAOE;IAC9C,WAAS,AAACC,kBAAQD,IAAIE;AAF5B,AAGEC;;AAEJ,2BAAA,3BAAOC,8DAAgB,OAAO,QAAQ;AAAtC,AACE,OAACC,2BAAO,WAAA,SAAsB;AAAtB,AAAA,IAAA,aAAAC;iBAAA,AAAAC,wBAAAC,WAAA,IAAA,pDAAM;cAAN,AAAAD,wBAAAC,WAAA,IAAA,jDAAa;AAAb,AACE,IAAA,aAAsB,AAACE,iCAAmBZ,WAAOL,GAAGO;iBAApD,AAAAO,wBAAAE,WAAA,IAAA,pDAAO;aAAP,AAAAF,wBAAAE,WAAA,IAAA,hDAAc;AAAd,AAAA,0FACGX,WAAO,AAACN,yBAAKmB,QAAQC;GAFlC,0FAAA,PAGSd,iDACD,AAACF,iCAAaE,OAAOG,QAAQR;;AAEvC,iCAAA,jCAAOoB,0EAAsB,OAAO,QAAQ;AAA5C,AACE,OAACR,2BAAO,WAAA,SAAsB;AAAtB,AAAA,IAAA,aAAAS;iBAAA,AAAAP,wBAAAQ,WAAA,IAAA,pDAAM;cAAN,AAAAR,wBAAAQ,WAAA,IAAA,jDAAa;AAAb,AACE,IAAA,aAA4B,AAACX,mCAAeN,WAAOG,QAAQR;iBAA3D,AAAAc,wBAAAS,WAAA,IAAA,pDAAO;mBAAP,AAAAT,wBAAAS,WAAA,IAAA,tDAAc;AAAd,AAAA,0FACGlB,WAAO,AAACmB,4BAAkBN,QAAQO;GAF\/C,0FAAA,PAGSpB,iDACDqB;;AAEV,iBAAA,jBAAMC,0CAAM,MAAM,OAAO;AAAzB,AACE,IAAA,aAAuB,AAACP,yCAAqBf,OAAOG,QAAQ,AAAA,yGAAkBV;iBAA9E,AAAAgB,wBAAAc,WAAA,IAAA,pDAAO;cAAP,AAAAd,wBAAAc,WAAA,IAAA,jDAAc;AAAd,AAAA,0FACG,gCAAA,hCAACC,0BAAM\/B,iFAAuBoB,SAC9B,AAACN,2BAAO;kBAAK,WAAO;AAAZ,AACE,OAACkB,sCAAwBzB,WAAOL,GAC7B;kBAAK;AAAL,AAAQ,mCAAA,5BAAC6B,0BAAME,yDAAS,AAAA,qFAAQjC;;;;CACrCO,WAAOa;;AAEpB,uBAAA,vBAAOc,sDAAY,IAAI;AAAvB,AACE,gCAAA,zBAACC,6BAAO,kCAAA,lCAACC,sCAAkBzB","names":["viz.ghost\/new-ghost","viz.ghost\/add-active-node","cljs.core\/update-in","ghost","cljs.core\/conj","id","viz.ghost\/rm-active-node","cljs.core\/disj","viz.ghost\/gen-new-poss","viz.forest\/get-node","forest","viz.forest\/empty-adjacent-points","pos","poss-fn","adj-poss","new-poss","viz.ghost\/spawn-children","cljs.core\/reduce","p__10863","cljs.core\/nth","vec__10864","vec__10867","viz.forest\/spawn-child","new-ids","new-id","viz.ghost\/spawn-children-multi","p__10870","vec__10871","vec__10874","clojure.set\/union","this-new-ids","ids","viz.ghost\/incr","vec__10877","cljs.core\/assoc","viz.forest\/update-node-meta","m","viz.ghost\/eg-poss-fn","cljs.core\/take","cljs.core\/random-sample"]} \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/grid.cljs b/src/http/static/viz/2/viz/grid.cljs
new file mode 100644
index 0000000..6e31443
--- /dev/null
+++ b/src/http/static/viz/2/viz/grid.cljs
@@ -0,0 +1,63 @@
+(ns viz.grid)
+
+;; grid set of points relative to a common origin
+
+(def euclidean [ [0 -1]
+ [-1 0] , [1 0]
+ [0 1] ])
+
+(def isometric [[-1 -1] [0 -2] [1 -1]
+ ,
+ [-1 1] [0 2] [1 1]])
+
+(def hexagonal [ [0 -1]
+ ,
+ [-1 1] [1 1]])
+
+(defn new-grid [grid-def]
+ { :grid-def grid-def
+ :points #{} })
+
+(defn add-point [grid point]
+ (update-in grid [:points] conj point))
+
+(def my-grid (-> (new-grid euclidean)
+ (add-point [0 1])))
+
+;; TODO this could be useful, but it's not needed now, as long as all points we
+;; use are generated from adjacent-points
+;;(defn valid-point? [grid point]
+;; (letfn [(ordered-dim-points [dim order]
+;; (->> (:grid-def grid)
+;; (map #(%1 dim))
+;; (sort (if (= order :asc) < > ))
+;; (filter (if (= order :asc) #(> %1 0) #(< %1 0)))
+;; ))
+;; (closest-in-dim [dim-i dim-jj]
+;; (reduce (fn [curr dim-j]
+;; (let [next (+ curr dim-j)]
+;; (reduce #(if (= ;; TODO wat
+;; (if (> 0 dim-i)
+;; (min dim-i next)
+;; (max dim-i next))))
+;; 0 dim-jj))
+;;
+;; ]
+;; (closest-in-dim 4 [1])))
+;; ;;(ordered-dim 1 :asc)))
+;;
+;;(valid-point? my-grid [0 1])
+
+(defn rm-point [grid point]
+ (update-in grid [:points] disj point))
+
+(defn adjacent-points [grid point]
+ (map #(map + %1 point) (:grid-def grid)))
+
+(defn empty-adjacent-points [grid point]
+ (remove (:points grid) (adjacent-points grid point)))
+
+(-> (new-grid isometric)
+ (add-point [0 0])
+ (add-point [0 1])
+ (empty-adjacent-points [0 1]))
diff --git a/src/http/static/viz/2/viz/grid.cljs.cache.json b/src/http/static/viz/2/viz/grid.cljs.cache.json
new file mode 100644
index 0000000..fcc5225
--- /dev/null
+++ b/src/http/static/viz/2/viz/grid.cljs.cache.json
@@ -0,0 +1 @@
+["^ ","~:rename-macros",["^ "],"~:renames",["^ "],"~:use-macros",["^ "],"~:excludes",["~#set",[]],"~:name","~$viz.grid","~:imports",null,"~:requires",null,"~:cljs.spec/speced-vars",[],"~:uses",null,"~:defs",["^ ","~$euclidean",["^ ","^5","~$viz.grid/euclidean","~:file","src/viz/grid.cljs","~:line",5,"~:column",1,"~:end-line",5,"~:end-column",15,"~:meta",["^ ","^>","/home/mediocregopher/src/viz/src/viz/grid.cljs","^?",5,"^@",6,"^A",5,"^B",15],"~:tag","~$cljs.core/IVector"],"~$isometric",["^ ","^5","~$viz.grid/isometric","^>","src/viz/grid.cljs","^?",9,"^@",1,"^A",9,"^B",15,"^C",["^ ","^>","/home/mediocregopher/src/viz/src/viz/grid.cljs","^?",9,"^@",6,"^A",9,"^B",15],"^D","^E"],"~$hexagonal",["^ ","^5","~$viz.grid/hexagonal","^>","src/viz/grid.cljs","^?",13,"^@",1,"^A",13,"^B",15,"^C",["^ ","^>","/home/mediocregopher/src/viz/src/viz/grid.cljs","^?",13,"^@",6,"^A",13,"^B",15],"^D","^E"],"~$new-grid",["^ ","~:protocol-inline",null,"^C",["^ ","^>","/home/mediocregopher/src/viz/src/viz/grid.cljs","^?",17,"^@",7,"^A",17,"^B",15,"~:arglists",["~#list",["~$quote",["^M",[["~$grid-def"]]]]]],"^5","~$viz.grid/new-grid","^>","src/viz/grid.cljs","^B",15,"~:method-params",["^M",[["^O"]]],"~:protocol-impl",null,"~:arglists-meta",["^M",[null,null]],"^@",1,"~:variadic?",false,"^?",17,"~:ret-tag","~$cljs.core/IMap","^A",17,"~:max-fixed-arity",1,"~:fn-var",true,"^L",["^M",["^N",["^M",[["^O"]]]]]],"~$add-point",["^ ","^K",null,"^C",["^ ","^>","/home/mediocregopher/src/viz/src/viz/grid.cljs","^?",21,"^@",7,"^A",21,"^B",16,"^L",["^M",["^N",["^M",[["~$grid","~$point"]]]]]],"^5","~$viz.grid/add-point","^>","src/viz/grid.cljs","^B",16,"^Q",["^M",[["^Z","^["]]],"^R",null,"^S",["^M",[null,null]],"^@",1,"^T",false,"^?",21,"^U","~$any","^A",21,"^W",2,"^X",true,"^L",["^M",["^N",["^M",[["^Z","^["]]]]]],"~$my-grid",["^ ","^5","~$viz.grid/my-grid","^>","src/viz/grid.cljs","^?",24,"^@",1,"^A",24,"^B",13,"^C",["^ ","^>","/home/mediocregopher/src/viz/src/viz/grid.cljs","^?",24,"^@",6,"^A",24,"^B",13],"^D","^11"],"~$rm-point",["^ ","^K",null,"^C",["^ ","^>","/home/mediocregopher/src/viz/src/viz/grid.cljs","^?",51,"^@",7,"^A",51,"^B",15,"^L",["^M",["^N",["^M",[["^Z","^["]]]]]],"^5","~$viz.grid/rm-point","^>","src/viz/grid.cljs","^B",15,"^Q",["^M",[["^Z","^["]]],"^R",null,"^S",["^M",[null,null]],"^@",1,"^T",false,"^?",51,"^U","^11","^A",51,"^W",2,"^X",true,"^L",["^M",["^N",["^M",[["^Z","^["]]]]]],"~$adjacent-points",["^ ","^K",null,"^C",["^ ","^>","/home/mediocregopher/src/viz/src/viz/grid.cljs","^?",54,"^@",7,"^A",54,"^B",22,"^L",["^M",["^N",["^M",[["^Z","^["]]]]]],"^5","~$viz.grid/adjacent-points","^>","src/viz/grid.cljs","^B",22,"^Q",["^M",[["^Z","^["]]],"^R",null,"^S",["^M",[null,null]],"^@",1,"^T",false,"^?",54,"^U","^11","^A",54,"^W",2,"^X",true,"^L",["^M",["^N",["^M",[["^Z","^["]]]]]],"~$empty-adjacent-points",["^ ","^K",null,"^C",["^ ","^>","/home/mediocregopher/src/viz/src/viz/grid.cljs","^?",57,"^@",7,"^A",57,"^B",28,"^L",["^M",["^N",["^M",[["^Z","^["]]]]]],"^5","~$viz.grid/empty-adjacent-points","^>","src/viz/grid.cljs","^B",28,"^Q",["^M",[["^Z","^["]]],"^R",null,"^S",["^M",[null,null]],"^@",1,"^T",false,"^?",57,"^U","^11","^A",57,"^W",2,"^X",true,"^L",["^M",["^N",["^M",[["^Z","^["]]]]]]],"~:cljs.spec/registry-ref",[],"~:require-macros",null,"~:cljs.analyzer/constants",["^ ","~:seen",["^4",["~:grid-def","~:points"]],"~:order",["^1>","^1?"]],"~:doc",null] \ No newline at end of file
diff --git a/src/http/static/viz/2/viz/grid.js b/src/http/static/viz/2/viz/grid.js
new file mode 100644
index 0000000..891193e
--- /dev/null
+++ b/src/http/static/viz/2/viz/grid.js
@@ -0,0 +1,27 @@
+// Compiled by ClojureScript 1.10.439 {}
+goog.provide('viz.grid');
+goog.require('cljs.core');
+viz.grid.euclidean = new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(-1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(-1),(0)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(1),(0)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1)], null)], null);
+viz.grid.isometric = new cljs.core.PersistentVector(null, 6, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(-1),(-1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(-2)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(1),(-1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(-1),(1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(2)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(1),(1)], null)], null);
+viz.grid.hexagonal = new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(-1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(-1),(1)], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(1),(1)], null)], null);
+viz.grid.new_grid = (function viz$grid$new_grid(grid_def){
+return new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"grid-def","grid-def",-392588768),grid_def,new cljs.core.Keyword(null,"points","points",-1486596883),cljs.core.PersistentHashSet.EMPTY], null);
+});
+viz.grid.add_point = (function viz$grid$add_point(grid,point){
+return cljs.core.update_in.call(null,grid,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"points","points",-1486596883)], null),cljs.core.conj,point);
+});
+viz.grid.my_grid = viz.grid.add_point.call(null,viz.grid.new_grid.call(null,viz.grid.euclidean),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1)], null));
+viz.grid.rm_point = (function viz$grid$rm_point(grid,point){
+return cljs.core.update_in.call(null,grid,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"points","points",-1486596883)], null),cljs.core.disj,point);
+});
+viz.grid.adjacent_points = (function viz$grid$adjacent_points(grid,point){
+return cljs.core.map.call(null,(function (p1__10844_SHARP_){
+return cljs.core.map.call(null,cljs.core._PLUS_,p1__10844_SHARP_,point);
+}),new cljs.core.Keyword(null,"grid-def","grid-def",-392588768).cljs$core$IFn$_invoke$arity$1(grid));
+});
+viz.grid.empty_adjacent_points = (function viz$grid$empty_adjacent_points(grid,point){
+return cljs.core.remove.call(null,new cljs.core.Keyword(null,"points","points",-1486596883).cljs$core$IFn$_invoke$arity$1(grid),viz.grid.adjacent_points.call(null,grid,point));
+});
+viz.grid.empty_adjacent_points.call(null,viz.grid.add_point.call(null,viz.grid.add_point.call(null,viz.grid.new_grid.call(null,viz.grid.isometric),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(0)], null)),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1)], null)),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1)], null));
+
+//# sourceMappingURL=grid.js.map
diff --git a/src/http/static/viz/2/viz/grid.js.map b/src/http/static/viz/2/viz/grid.js.map
new file mode 100644
index 0000000..1964511
--- /dev/null
+++ b/src/http/static/viz/2/viz/grid.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/viz\/grid.js","sources":["grid.cljs"],"lineCount":27,"mappings":";AAAA;;AAIA,qBAAA,mFAAA,mFAAA,IAAA,aAAA,mFAAA,KAAA,YAAA,mFAAA,IAAA,YAAA,mFAAA,IAAA,1eAAKA;AAIL,qBAAA,mFAAA,mFAAA,KAAA,aAAA,mFAAA,IAAA,aAAA,mFAAA,IAAA,aAAA,mFAAA,KAAA,YAAA,mFAAA,IAAA,YAAA,mFAAA,IAAA,nrBAAKC;AAIL,qBAAA,mFAAA,mFAAA,IAAA,aAAA,mFAAA,KAAA,YAAA,mFAAA,IAAA,vYAAKC;AAIL,oBAAA,pBAAMC,gDAAU;AAAhB,AAAA,kDAAA,sEAAA,0DAAA,nEACcC;;AAGd,qBAAA,rBAAMC,kDAAW,KAAK;AAAtB,AACE,0CAAA,mFAAA,tHAACC,8BAAUC,0JAAeC,eAAKC;;AAEjC,AAAKC,gDAAY,AAACP,4BAASH,zDACV,6EAAA,mFAAA,IAAA,pKAACK;AA0BlB,oBAAA,pBAAMM,gDAAU,KAAK;AAArB,AACE,0CAAA,mFAAA,tHAACL,8BAAUC,0JAAeK,eAAKH;;AAEjC,2BAAA,3BAAMI,8DAAiB,KAAK;AAA5B,AACE,+BAAA,WAAA,nCAACC;AAAD,AAAM,gDAAAC,zCAACD,wBAAIE,kCAAKP;GAAO,AAAA,2FAAWF;;AAEpC,iCAAA,jCAAMU,0EAAuB,KAAK;AAAlC,AACE,OAACC,2BAAO,AAAA,wFAASX,MAAM,AAACM,mCAAgBN,KAAKE;;mGAE3C,AAACN,4BAASF,zDACV,6EAAA,mFAAA,IAAA,pKAACI,7BACD,8MAAA,mFAAA,IAAA,rSAACA,zCACD,2VAAA,mFAAA,IAAA,lbAACY","names":["viz.grid\/euclidean","viz.grid\/isometric","viz.grid\/hexagonal","viz.grid\/new-grid","grid-def","viz.grid\/add-point","cljs.core\/update-in","grid","cljs.core\/conj","point","viz.grid\/my-grid","viz.grid\/rm-point","cljs.core\/disj","viz.grid\/adjacent-points","cljs.core\/map","p1__10844#","cljs.core\/+","viz.grid\/empty-adjacent-points","cljs.core\/remove"]} \ No newline at end of file